@alphacharts/drawings 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/dist/index.js +707 -667
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/plugin.d.ts +6 -0
- package/dist/types/shapes.d.ts +10 -0
- package/dist/types/types.d.ts +5 -0
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["__defProp","__exportAll","target","name","all","no_symbols","Emitter","set","type","fn","e","geometry_exports","arcPoints","arrowHead","circumcircle","clipLine","controlThrough","dist","distToPolyline","distToSegment","ellipsePoints","intersect","pointInPolygon","quadPoints","x2","x1","y2","y1","dx","dy","l2","px","py","t","t0","t1","clip","p","q","r","m","W","H","lo","extA","hi","extB","out","c","rot","s","n","a","x","rx","y","ry","cx","cy","a1","a0","i","u","p0","p1","through","d","b","a2","b2","c2","inside","pts","j","xi","yi","xj","yj","best","last","close","b1","size","DrawingStore","id","at","ids","clone","v","AddCommand","RemoveCommand","entries","PatchCommand","label","before","after","ReorderCommand","BatchCommand","cmds","History","store","max","dashPattern","w","alphaCache","withAlpha","key","color","rgba","parseColor","fontCache","font","sz","style","f","textBox","pad","nLines","measure","lines","l","h","widths","widthEntries","cachedWidth","byText","text","ctx","offPane","x0","y0","drawShapes","boost","opts","curStroke","curFill","curWidth","curDash","stroke","dk","fill","shapes","seg","line","outlines","shapeDistance","o","shapeInRect","checkName","TemplateStore","prefix","tool","raw","k","cur","next","on","DEFAULT_STYLE","SCHEMA_VERSION","DRAG_SLOP","TOLERANCE","WEAK_MAGNET_PX","DUPLICATE_BARS","DrawingsPlugin","options","api","source","ms","mode","def","spec","dflt","anchors","fromView","view","patch","snap","cmd","how","dropped","top","pane","ref","dt","dp","bar","adds","made","src","tools","state","gone","err","iv","list","hp","tol","bx","sel","cr","hit","clickOnly","movers","s0","mod","ArrayBarSource","data","older","time","ti","tp","from","to","A","pxs","prop","levelsProp","poly","flat","shade","head","ang","extension","aIsLeft","lerp","mid","fillOf","alpha","fmtTime","fmtDuration","dPrice","sign","barsText","bars","measureLines","pct","tail","ratio","den","num","ratioText","FIB_COLORS","fibColor","FIB_RETRACEMENT","FIB_BASIC","needDistinctTimes","finiteAnchors","BOX","content","fallback","screenPoint","fx","fy","textTool","anchoredText","noteShapes","note","anchoredNote","callout","boxAt","comment","priceLabel","priceNote","signpost","flagMark","arrow","arrowMarker","L","ux","uy","nx","ny","hl","along","across","markShape","dirUp","arrowMarkUp","arrowMarkDown","annotationTools","lineY","span","parallelChannel","p2","off","xa","xb","base","b0","m0","m1","regression","mx","my","sxy","sxx","slope","intercept","ss","regressionOf","closes","regressionTrendChannel","tFirst","tLast","reg","dev","u0","u1","l0","l1","flatTopBottom","disjointChannel","p3","forkGeometry","cc","forkTool","g","ahead","far","fo","pitchfork","schiffPitchfork","modifiedSchiffPitchfork","insidePitchfork","pitchfan","levels","rays","channelTools","MAX_REPEATS","MIN_PERIOD_PX","period","cyclicLines","first","timeCycles","dir","sineY","sineLine","cycleTools","fibRetracementPrice","fibExtensionPrice","FIB_SEQUENCE","PHI","lvl","fibRetracement","xl","xr","lv","ys","fibExtension","pa","pb","pc","fibChannel","fibTimeZone","unit","FIB_FAN","fibSpeedFan","colour","e1","e2","fibTrendTime","fibCircles","fibSpiral","r0","th0","maxR","thMax","th","FIB_ARCS","fibSpeedArcs","fibWedge","delta","fibTools","FILL","inner","textValue","rectangle","rotatedRectCorners","len","rotatedRectangle","ellipse","circle","triangle","arcThrough","norm","dEnd","dMid","arc","curve","doubleCurve","m2","polyline","path","ps","brush","highlighter","figureTools","BOX_LEVELS","gannBoxPrice","gannFanPrice","GANN_RATIOS","grid","xs","gannBox","yAt","ya","yb","DIV8","squareShapes","gannSquare","fixedCorner","side","gannSquareFixed","gannFan","ends","gannTools","twoPoint","trendLine","ray","extendedLine","infoLine","horizontalLine","crisp","horizontalRay","verticalLine","crossLine","lineTools","col","priceText","timeText","dateRange","priceRange","dateAndPriceRange","measureTools","mv","xabcdRatios","cypherRatios","abcdRatios","driveRatios","pointLabels","names","prev","high","dashed","ratioLabel","xabcd","dd","cypher","abcd","trianglePattern","apex","threeDrives","rs","headAndShoulders","ls","n1","n2","waveLabel","degree","elliott","deg","elliottImpulse","elliottCorrection","elliottTriangle","elliottDoubleCombo","elliottTripleCombo","patternTools","positionStats","entry","stop","risk","reward","qty","lot","budget","lots","statsOf","money","positionTool","long","end","st","good","bad","signed","tgtDelta","stopDelta","tgt","stp","ctr","longPosition","shortPosition","forecast","projectionTarget","projection","UP","DOWN","barShapes","cl","candle","bot","needSource","sourceBars","patternBars","shift","price","barsPattern","copy","seeded","seed","ghostBars","history","rnd","start","count","open","ghostFeed","positionTools","anchoredVwap","times","values","pv","startIndex","vwapCache","cachedVwap","series","anchoredVwapTool","tL","tR","lower","i0","i1","step","volumeProfile","rows","low","rowHeight","volumes","r1","barSpan","poc","rangeBars","volumeProfileTool","vp","left","right","maxW","maxV","yTop","yBot","volumeTools","allTools"],"sources":["../src/emitter.ts","../src/geometry.ts","../src/history.ts","../src/shapes.ts","../src/templates.ts","../src/types.ts","../src/plugin.ts","../src/source.ts","../src/tools/util.ts","../src/tools/annotations.ts","../src/tools/channels.ts","../src/tools/cycles.ts","../src/tools/fib.ts","../src/tools/figures.ts","../src/tools/gann.ts","../src/tools/lines.ts","../src/tools/measure.ts","../src/tools/patterns.ts","../src/tools/position.ts","../src/tools/volume.ts","../src/tools/all.ts"],"sourcesContent":["// Minimal typed event emitter.\n\nexport 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.map.get(type)?.delete(fn as (e: never) => void);\n }\n\n emit<K extends keyof E>(type: K, e: E[K]): void {\n const set = this.map.get(type);\n if (set) for (const fn of [...set]) (fn as (e: E[K]) => void)(e);\n }\n}\n","// Planar geometry for tools and hit-testing, in CSS px. Pure functions.\n\nexport interface Pt {\n x: number;\n y: number;\n}\n\nexport function dist(x1: number, y1: number, x2: number, y2: number): number {\n return Math.hypot(x2 - x1, y2 - y1);\n}\n\n/** Distance from (px, py) to the segment (x1,y1)-(x2,y2). */\nexport function distToSegment(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const l2 = dx * dx + dy * dy;\n if (l2 === 0) return dist(px, py, x1, y1);\n let t = ((px - x1) * dx + (py - y1) * dy) / l2;\n t = Math.max(0, Math.min(1, t));\n return dist(px, py, x1 + t * dx, y1 + t * dy);\n}\n\n/**\n * The part of the line through a→b to draw inside [-m, W+m]×[-m, H+m]:\n * the segment itself, plus the ray beyond a (extA) and/or beyond b (extB).\n * Null when nothing of it is inside.\n */\nexport function clipLine(\n x1: number, y1: number, x2: number, y2: number,\n extA: boolean, extB: boolean, W: number, H: number, m = 2,\n): [number, number, number, number] | null {\n const dx = x2 - x1, dy = y2 - y1;\n if (dx === 0 && dy === 0) return null;\n let t0 = -Infinity, t1 = Infinity;\n const clip = (p: number, q: number): boolean => {\n if (p === 0) return q >= 0;\n const r = q / p;\n if (p < 0) {\n if (r > t1) return false;\n if (r > t0) t0 = r;\n } else {\n if (r < t0) return false;\n if (r < t1) t1 = r;\n }\n return true;\n };\n if (!clip(-dx, x1 + m) || !clip(dx, W + m - x1) || !clip(-dy, y1 + m) || !clip(dy, H + m - y1)) return null;\n const lo = extA ? t0 : Math.max(t0, 0);\n const hi = extB ? t1 : Math.min(t1, 1);\n if (lo > hi) return null;\n return [x1 + lo * dx, y1 + lo * dy, x1 + hi * dx, y1 + hi * dy];\n}\n\n/** Flat [x0,y0,x1,y1,…] points of an ellipse (rotated by rot), n segments. */\nexport function ellipsePoints(cx: number, cy: number, rx: number, ry: number, rot: number, n = 72): number[] {\n const out: number[] = [];\n const c = Math.cos(rot), s = Math.sin(rot);\n for (let i = 0; i < n; i++) {\n const a = (i / n) * Math.PI * 2;\n const x = rx * Math.cos(a), y = ry * Math.sin(a);\n out.push(cx + x * c - y * s, cy + x * s + y * c);\n }\n return out;\n}\n\n/** Flat points along a circular arc from angle a0 to a1 (radians, y down). */\nexport function arcPoints(cx: number, cy: number, r: number, a0: number, a1: number): number[] {\n const n = Math.max(6, Math.min(180, Math.ceil((Math.abs(a1 - a0) * r) / 4)));\n const out: number[] = [];\n for (let i = 0; i <= n; i++) {\n const a = a0 + ((a1 - a0) * i) / n;\n out.push(cx + r * Math.cos(a), cy + r * Math.sin(a));\n }\n return out;\n}\n\n/** Quadratic Bézier points p0, control c, p1. */\nexport function quadPoints(p0: Pt, c: Pt, p1: Pt, n = 48): number[] {\n const out: number[] = [];\n for (let i = 0; i <= n; i++) {\n const t = i / n, u = 1 - t;\n out.push(u * u * p0.x + 2 * u * t * c.x + t * t * p1.x, u * u * p0.y + 2 * u * t * c.y + t * t * p1.y);\n }\n return out;\n}\n\n/** The quadratic control point that makes the curve p0→p1 pass through `through` at t = 0.5. */\nexport function controlThrough(p0: Pt, through: Pt, p1: Pt): Pt {\n return { x: 2 * through.x - (p0.x + p1.x) / 2, y: 2 * through.y - (p0.y + p1.y) / 2 };\n}\n\n/** Circle through three points, or null when they are collinear. */\nexport function circumcircle(a: Pt, b: Pt, c: Pt): { cx: number; cy: number; r: number } | null {\n const d = 2 * (a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y));\n if (Math.abs(d) < 1e-9) return null;\n const a2 = a.x * a.x + a.y * a.y, b2 = b.x * b.x + b.y * b.y, c2 = c.x * c.x + c.y * c.y;\n const cx = (a2 * (b.y - c.y) + b2 * (c.y - a.y) + c2 * (a.y - b.y)) / d;\n const cy = (a2 * (c.x - b.x) + b2 * (a.x - c.x) + c2 * (b.x - a.x)) / d;\n return { cx, cy, r: dist(cx, cy, a.x, a.y) };\n}\n\nexport function pointInPolygon(px: number, py: number, pts: readonly number[]): boolean {\n let inside = false;\n const n = pts.length / 2;\n for (let i = 0, j = n - 1; i < n; j = i++) {\n const xi = pts[2 * i]!, yi = pts[2 * i + 1]!, xj = pts[2 * j]!, yj = pts[2 * j + 1]!;\n if (yi > py !== yj > py && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi) inside = !inside;\n }\n return inside;\n}\n\n/** Distance from a point to a polyline (flat xy), optionally closed. */\nexport function distToPolyline(px: number, py: number, pts: readonly number[], close: boolean): number {\n const n = pts.length / 2;\n if (n === 0) return Infinity;\n if (n === 1) return dist(px, py, pts[0]!, pts[1]!);\n let best = Infinity;\n const last = close ? n : n - 1;\n for (let i = 0; i < last; i++) {\n const j = (i + 1) % n;\n best = Math.min(best, distToSegment(px, py, pts[2 * i]!, pts[2 * i + 1]!, pts[2 * j]!, pts[2 * j + 1]!));\n }\n return best;\n}\n\n/** Intersection of lines a1→a2 and b1→b2, or null when parallel. */\nexport function intersect(a1: Pt, a2: Pt, b1: Pt, b2: Pt): Pt | null {\n const d = (a2.x - a1.x) * (b2.y - b1.y) - (a2.y - a1.y) * (b2.x - b1.x);\n if (Math.abs(d) < 1e-12) return null;\n const t = ((b1.x - a1.x) * (b2.y - b1.y) - (b1.y - a1.y) * (b2.x - b1.x)) / d;\n return { x: a1.x + t * (a2.x - a1.x), y: a1.y + t * (a2.y - a1.y) };\n}\n\n/** Filled arrow head at (x2,y2) for a line coming from (x1,y1): flat polygon. */\nexport function arrowHead(x1: number, y1: number, x2: number, y2: number, size: number): number[] {\n const a = Math.atan2(y2 - y1, x2 - x1);\n const s = 0.45;\n return [x2, y2, x2 - size * Math.cos(a - s), y2 - size * Math.sin(a - s), x2 - size * Math.cos(a + s), y2 - size * Math.sin(a + s)];\n}\n","// The drawing store and the undo/redo command stack.\n//\n// Every mutation of the store is a Command that carries what it needs for an\n// exact inverse: Add remembers the index, Remove the drawings and their\n// indices, Patch the full before/after snapshots, Reorder both orders.\n// Undoing every command returns the store to a state that serializes\n// identically to the initial one (property-tested with seeded random runs).\n\nimport type { Drawing } from \"./types.js\";\n\nexport class DrawingStore {\n private items: Drawing[] = [];\n private index = new Map<string, Drawing>();\n\n /** Back to front: later = on top. */\n get list(): readonly Drawing[] {\n return this.items;\n }\n\n get(id: string): Drawing | undefined {\n return this.index.get(id);\n }\n\n require(id: string): Drawing {\n const d = this.index.get(id);\n if (!d) throw new Error(`drawings: no drawing with id \"${id}\"`);\n return d;\n }\n\n insert(d: Drawing, at: number): void {\n if (this.index.has(d.id)) throw new Error(`drawings: duplicate drawing id \"${d.id}\"`);\n if (!Number.isInteger(at) || at < 0 || at > this.items.length) throw new RangeError(`drawings: insert index ${at} outside 0..${this.items.length}`);\n this.items.splice(at, 0, d);\n this.index.set(d.id, d);\n }\n\n remove(id: string): number {\n const i = this.items.findIndex((x) => x.id === id);\n if (i < 0) throw new Error(`drawings: no drawing with id \"${id}\"`);\n this.items.splice(i, 1);\n this.index.delete(id);\n return i;\n }\n\n /** Replace the drawing with the same id, in place in the order. */\n replace(d: Drawing): void {\n const i = this.items.findIndex((x) => x.id === d.id);\n if (i < 0) throw new Error(`drawings: no drawing with id \"${d.id}\"`);\n this.items[i] = d;\n this.index.set(d.id, d);\n }\n\n setOrder(ids: readonly string[]): void {\n if (ids.length !== this.items.length || new Set(ids).size !== ids.length) throw new Error(\"drawings: setOrder needs every id exactly once\");\n this.items = ids.map((id) => this.require(id));\n }\n\n clear(): void {\n this.items = [];\n this.index.clear();\n }\n\n snapshot(): string {\n return JSON.stringify(this.items);\n }\n}\n\nexport const clone = <T>(v: T): T => structuredClone(v);\n\nexport interface Command {\n readonly label: string;\n /** Ids of drawings the command touches (for events). */\n readonly ids: readonly string[];\n apply(s: DrawingStore): void;\n revert(s: DrawingStore): void;\n}\n\nexport class AddCommand implements Command {\n readonly label = \"add\";\n readonly ids: readonly string[];\n constructor(private readonly d: Drawing, private readonly at: number) {\n this.ids = [d.id];\n }\n apply(s: DrawingStore): void {\n s.insert(clone(this.d), this.at);\n }\n revert(s: DrawingStore): void {\n s.remove(this.d.id);\n }\n}\n\nexport class RemoveCommand implements Command {\n readonly label = \"remove\";\n readonly ids: readonly string[];\n /** Ascending by index. */\n private readonly entries: Array<{ d: Drawing; at: number }>;\n constructor(entries: Array<{ d: Drawing; at: number }>) {\n this.entries = [...entries].sort((a, b) => a.at - b.at).map((e) => ({ d: clone(e.d), at: e.at }));\n this.ids = this.entries.map((e) => e.d.id);\n }\n apply(s: DrawingStore): void {\n for (const e of this.entries) s.remove(e.d.id);\n }\n revert(s: DrawingStore): void {\n for (const e of this.entries) s.insert(clone(e.d), e.at);\n }\n}\n\nexport class PatchCommand implements Command {\n readonly ids: readonly string[];\n constructor(readonly label: string, private readonly before: Drawing[], private readonly after: Drawing[]) {\n if (before.length !== after.length || before.some((b, i) => b.id !== after[i]!.id)) throw new Error(\"drawings: PatchCommand needs matching before/after drawings\");\n this.ids = before.map((b) => b.id);\n this.before = before.map(clone);\n this.after = after.map(clone);\n }\n apply(s: DrawingStore): void {\n for (const d of this.after) s.replace(clone(d));\n }\n revert(s: DrawingStore): void {\n for (const d of this.before) s.replace(clone(d));\n }\n}\n\nexport class ReorderCommand implements Command {\n readonly label = \"reorder\";\n readonly ids: readonly string[];\n constructor(private readonly before: string[], private readonly after: string[]) {\n this.ids = after;\n }\n apply(s: DrawingStore): void {\n s.setOrder(this.after);\n }\n revert(s: DrawingStore): void {\n s.setOrder(this.before);\n }\n}\n\nexport class BatchCommand implements Command {\n readonly ids: readonly string[];\n constructor(readonly label: string, private readonly cmds: Command[]) {\n this.ids = cmds.flatMap((c) => c.ids);\n }\n apply(s: DrawingStore): void {\n for (const c of this.cmds) c.apply(s);\n }\n revert(s: DrawingStore): void {\n for (let i = this.cmds.length - 1; i >= 0; i--) this.cmds[i]!.revert(s);\n }\n}\n\nexport class History {\n private undoStack: Command[] = [];\n private redoStack: Command[] = [];\n\n constructor(private readonly store: DrawingStore, private readonly max = 500) {}\n\n get canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n get canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n /** Apply a new command and make it undoable; clears redo. */\n run(c: Command): void {\n c.apply(this.store);\n this.undoStack.push(c);\n if (this.undoStack.length > this.max) this.undoStack.shift();\n this.redoStack = [];\n }\n\n /** Record a command whose effect is already in the store (a finished drag). */\n record(c: Command): void {\n this.undoStack.push(c);\n if (this.undoStack.length > this.max) this.undoStack.shift();\n this.redoStack = [];\n }\n\n undo(): Command | undefined {\n const c = this.undoStack.pop();\n if (!c) return undefined;\n c.revert(this.store);\n this.redoStack.push(c);\n return c;\n }\n\n redo(): Command | undefined {\n const c = this.redoStack.pop();\n if (!c) return undefined;\n c.apply(this.store);\n this.undoStack.push(c);\n return c;\n }\n\n clear(): void {\n this.undoStack = [];\n this.redoStack = [];\n }\n}\n","// Drawing and hit-testing shapes. Both are generic over Shape, so a tool is\n// only a function from a drawing to shapes.\n//\n// Hit-testing is in pane CSS px. Strokes hit within `tol`; filled shapes hit\n// inside; text hits its (padded) box. Ellipses and arcs are tested as\n// polylines, so the test and the picture can differ by a sub-pixel.\n\nimport { parseColor, rgba } from \"@alphacharts/core\";\nimport { arcPoints, clipLine, distToPolyline, distToSegment, ellipsePoints, pointInPolygon } from \"./geometry.js\";\nimport type { Dash, DrawingStyle, Shape } from \"./types.js\";\n\nexport function dashPattern(d: Dash, w: number): number[] {\n return d === \"solid\" ? [] : d === \"dashed\" ? [4 * w, 3 * w] : [w, 2 * w];\n}\n\n/** Tools call withAlpha for every shape on every frame; the colours repeat. */\nconst alphaCache = new Map<string, string>();\n\n/** `color` with its alpha replaced by `a` (0..1), as an rgba() string. */\nexport function withAlpha(color: string, a: number): string {\n const key = `${color}|${a}`;\n let out = alphaCache.get(key);\n if (out === undefined) {\n if (alphaCache.size > 2048) alphaCache.clear();\n const c = rgba(parseColor(color));\n out = `rgba(${Math.round(c[0]! * 255)},${Math.round(c[1]! * 255)},${Math.round(c[2]! * 255)},${a})`;\n alphaCache.set(key, out);\n }\n return out;\n}\n\nconst fontCache = new Map<string, string>();\n\nexport function font(style: DrawingStyle, size?: number): string {\n const sz = size ?? style.fontSize;\n const key = `${style.italic ? \"i\" : \"\"}${style.bold ? \"b\" : \"\"}${sz}`;\n let f = fontCache.get(key);\n if (f === undefined) {\n if (fontCache.size > 512) fontCache.clear();\n f = `${style.italic ? \"italic \" : \"\"}${style.bold ? \"bold \" : \"\"}${sz}px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif`;\n fontCache.set(key, f);\n }\n return f;\n}\n\nexport interface TextBox {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/** Text box of a text shape; `measure` returns the text width in px. */\nexport function textBox(s: Extract<Shape, { k: \"text\" }>, style: DrawingStyle, measure: (text: string, font: string) => number): TextBox {\n const size = s.size ?? style.fontSize;\n const pad = s.pad ?? (s.bg || s.border ? 4 : 0);\n const f = font(style, size);\n let w: number, nLines: number;\n if (s.text.indexOf(\"\\n\") < 0) {\n w = measure(s.text, f) + 2 * pad;\n nLines = 1;\n } else {\n const lines = s.text.split(\"\\n\");\n w = Math.max(...lines.map((l) => measure(l, f))) + 2 * pad;\n nLines = lines.length;\n }\n const h = nLines * size * 1.25 + 2 * pad;\n const x = s.align === \"right\" ? s.x - w : s.align === \"center\" ? s.x - w / 2 : s.x;\n const y = s.base === \"bottom\" ? s.y - h : s.base === \"middle\" ? s.y - h / 2 : s.y;\n return { x, y, w, h };\n}\n\n/** Text widths by font, then text: measuring is the dearest part of drawing a label. */\nconst widths = new Map<string, Map<string, number>>();\nlet widthEntries = 0;\n\nfunction cachedWidth(ctx: CanvasRenderingContext2D, text: string, f: string): number {\n let byText = widths.get(f);\n if (!byText) widths.set(f, (byText = new Map()));\n let w = byText.get(text);\n if (w === undefined) {\n if (widthEntries > 4096) {\n widths.clear();\n widthEntries = 0;\n widths.set(f, (byText = new Map()));\n }\n ctx.font = f;\n byText.set(text, (w = ctx.measureText(text).width));\n widthEntries++;\n }\n return w;\n}\n\n/** True when the box [x0,x1]×[y0,y1] misses the pane [0,W]×[0,H] by more than `m`: nothing of it can show. */\nfunction offPane(x0: number, y0: number, x1: number, y1: number, W: number, H: number, m: number): boolean {\n return x1 < -m || x0 > W + m || y1 < -m || y0 > H + m;\n}\n\nexport function drawShapes(\n ctx: CanvasRenderingContext2D, shapes: readonly Shape[], style: DrawingStyle, W: number, H: number,\n opts: { widthBoost?: number } = {},\n): void {\n const boost = opts.widthBoost ?? 0;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n // Only touch a context property when it changes: each assignment is a call into the browser.\n let curStroke: string | undefined, curFill: string | undefined, curWidth = -1, curDash: string | undefined;\n const stroke = (s: Shape): boolean => {\n const w = (s.width ?? style.width) + boost;\n if (w <= 0) return false;\n const c = s.color ?? style.color;\n if (c !== curStroke) ctx.strokeStyle = curStroke = c;\n if (w !== curWidth) ctx.lineWidth = curWidth = w;\n const d = s.dash ?? style.dash;\n const dk = d === \"solid\" ? \"\" : `${d}${w}`;\n if (dk !== curDash) {\n ctx.setLineDash(dashPattern(d, w));\n curDash = dk;\n }\n return true;\n };\n const fill = (c: string): void => {\n if (c !== curFill) ctx.fillStyle = curFill = c;\n };\n for (const s of shapes) {\n // Anything wholly outside the (clipped) pane is not drawn: panned-away drawings cost no canvas calls.\n const m = (s.width ?? style.width) + boost + 2;\n switch (s.k) {\n case \"line\": {\n const seg = clipLine(s.x1, s.y1, s.x2, s.y2, s.extA ?? false, s.extB ?? false, W, H);\n if (!seg || !stroke(s)) break;\n ctx.beginPath();\n ctx.moveTo(seg[0], seg[1]);\n ctx.lineTo(seg[2], seg[3]);\n ctx.stroke();\n break;\n }\n case \"poly\": {\n const n = s.pts.length / 2;\n if (n < 2) break;\n let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n for (let i = 0; i < s.pts.length; i += 2) {\n const x = s.pts[i]!, y = s.pts[i + 1]!;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n if (offPane(x0, y0, x1, y1, W, H, m)) break;\n ctx.beginPath();\n ctx.moveTo(s.pts[0]!, s.pts[1]!);\n for (let i = 1; i < n; i++) ctx.lineTo(s.pts[2 * i]!, s.pts[2 * i + 1]!);\n if (s.close) ctx.closePath();\n if (s.fill) {\n fill(s.fill);\n ctx.fill();\n }\n if (stroke(s)) ctx.stroke();\n break;\n }\n case \"ellipse\": {\n const r = Math.max(Math.abs(s.rx), Math.abs(s.ry));\n if (offPane(s.cx - r, s.cy - r, s.cx + r, s.cy + r, W, H, m)) break;\n ctx.beginPath();\n ctx.ellipse(s.cx, s.cy, Math.max(0, s.rx), Math.max(0, s.ry), s.rot ?? 0, 0, Math.PI * 2);\n if (s.fill) {\n fill(s.fill);\n ctx.fill();\n }\n if (stroke(s)) ctx.stroke();\n break;\n }\n case \"arc\": {\n if (offPane(s.cx - Math.abs(s.r), s.cy - Math.abs(s.r), s.cx + Math.abs(s.r), s.cy + Math.abs(s.r), W, H, m)) break;\n ctx.beginPath();\n if (s.fill) ctx.moveTo(s.cx, s.cy);\n ctx.arc(s.cx, s.cy, Math.max(0, s.r), s.a0, s.a1, s.a1 < s.a0);\n if (s.fill) {\n ctx.closePath();\n fill(s.fill);\n ctx.fill();\n }\n if (stroke(s)) ctx.stroke();\n break;\n }\n case \"text\": {\n const size = s.size ?? style.fontSize;\n const b = textBox(s, style, (t, f) => cachedWidth(ctx, t, f));\n if (offPane(b.x, b.y, b.x + b.w, b.y + b.h, W, H, 2)) break;\n ctx.font = font(style, size);\n if (s.bg) {\n fill(s.bg);\n ctx.fillRect(b.x, b.y, b.w, b.h);\n }\n if (s.border) {\n ctx.strokeStyle = curStroke = s.border;\n ctx.lineWidth = curWidth = 1;\n ctx.setLineDash([]);\n curDash = \"\";\n ctx.strokeRect(b.x + 0.5, b.y + 0.5, b.w - 1, b.h - 1);\n }\n fill(s.textColor ?? style.textColor);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n const pad = s.pad ?? (s.bg || s.border ? 4 : 0);\n if (s.text.indexOf(\"\\n\") < 0) ctx.fillText(s.text, b.x + pad, b.y + pad + size * 0.125);\n else s.text.split(\"\\n\").forEach((line, i) => ctx.fillText(line, b.x + pad, b.y + pad + i * size * 1.25 + size * 0.125));\n break;\n }\n }\n }\n ctx.setLineDash([]);\n}\n\n/** Flat polylines (and fill flags) a shape is tested as. */\nfunction outlines(s: Shape, W: number, H: number): Array<{ pts: number[]; close: boolean; fill: boolean }> {\n switch (s.k) {\n case \"line\": {\n const seg = clipLine(s.x1, s.y1, s.x2, s.y2, s.extA ?? false, s.extB ?? false, W, H, 1e6);\n return seg ? [{ pts: [...seg], close: false, fill: false }] : [];\n }\n case \"poly\":\n return [{ pts: s.pts, close: s.close ?? false, fill: !!s.fill }];\n case \"ellipse\":\n return [{ pts: ellipsePoints(s.cx, s.cy, s.rx, s.ry, s.rot ?? 0), close: true, fill: !!s.fill }];\n case \"arc\": {\n const pts = arcPoints(s.cx, s.cy, s.r, s.a0, s.a1);\n return [{ pts: s.fill ? [s.cx, s.cy, ...pts] : pts, close: !!s.fill, fill: !!s.fill }];\n }\n case \"text\":\n return [];\n }\n}\n\n/**\n * Distance 0 when (x, y) is inside a filled shape or a text box, else the\n * distance to the nearest stroke; Infinity when the shape is not hittable.\n */\nexport function shapeDistance(\n s: Shape, x: number, y: number, W: number, H: number, style: DrawingStyle, measure: (t: string, f: string) => number,\n): number {\n if (s.hit === false) return Infinity;\n if (s.k === \"text\") {\n const b = textBox(s, style, measure);\n const dx = Math.max(b.x - x, 0, x - (b.x + b.w)), dy = Math.max(b.y - y, 0, y - (b.y + b.h));\n return Math.hypot(dx, dy);\n }\n if (s.k === \"line\") {\n const seg = clipLine(s.x1, s.y1, s.x2, s.y2, s.extA ?? false, s.extB ?? false, W, H, 1e6);\n return seg ? distToSegment(x, y, seg[0], seg[1], seg[2], seg[3]) : Infinity;\n }\n let best = Infinity;\n for (const o of outlines(s, W, H)) {\n if (o.fill && o.close && pointInPolygon(x, y, o.pts)) return 0;\n const stroked = (s.width ?? 1) > 0;\n if (stroked || !o.fill) best = Math.min(best, distToPolyline(x, y, o.pts, o.close));\n }\n return best;\n}\n\n/** True when any outline vertex (or a text box corner) of the shape lies in the rectangle. */\nexport function shapeInRect(s: Shape, x0: number, y0: number, x1: number, y1: number, W: number, H: number): boolean {\n const lo = (a: number, b: number) => Math.min(a, b), hi = (a: number, b: number) => Math.max(a, b);\n const inside = (x: number, y: number) => x >= lo(x0, x1) && x <= hi(x0, x1) && y >= lo(y0, y1) && y <= hi(y0, y1);\n if (s.hit === false) return false;\n if (s.k === \"text\") return inside(s.x, s.y);\n if (s.k === \"line\" && (inside(s.x1, s.y1) || inside(s.x2, s.y2))) return true;\n for (const o of outlines(s, W, H)) {\n for (let i = 0; i < o.pts.length; i += 2) if (inside(o.pts[i]!, o.pts[i + 1]!)) return true;\n }\n return false;\n}\n","// Style templates and favourite tools, kept in a LayoutStore from core\n// (MemoryStore, LocalStorageStore, or a server-backed one).\n//\n// Keys: \"<prefix>template/<tool>/<name>\" and \"<prefix>favourites\".\n\nimport type { LayoutStore } from \"@alphacharts/core\";\nimport type { Drawing, DrawingStyle } from \"./types.js\";\n\nexport interface DrawingTemplate {\n version: 1;\n tool: string;\n name: string;\n style: DrawingStyle;\n props: Record<string, unknown>;\n}\n\nfunction checkName(name: string): void {\n if (!name || name.includes(\"/\")) throw new RangeError(`template name must be non-empty and contain no \"/\", got \"${name}\"`);\n}\n\nexport class TemplateStore {\n constructor(private readonly store: LayoutStore, private readonly prefix = \"drawings/\") {}\n\n private key(tool: string, name: string): string {\n checkName(tool);\n checkName(name);\n return `${this.prefix}template/${tool}/${name}`;\n }\n\n /** Save a drawing's style and props as a template for its tool. */\n async save(name: string, d: Drawing): Promise<void> {\n const t: DrawingTemplate = { version: 1, tool: d.tool, name, style: { ...d.style }, props: structuredClone(d.props) };\n await this.store.save(this.key(d.tool, name), t);\n }\n\n async load(tool: string, name: string): Promise<DrawingTemplate> {\n const raw = (await this.store.load(this.key(tool, name))) as DrawingTemplate | undefined;\n if (!raw) throw new Error(`drawings: no template \"${name}\" for tool \"${tool}\"`);\n if (raw.version !== 1 || raw.tool !== tool) throw new Error(`drawings: template \"${name}\" is not a version 1 template of \"${tool}\"`);\n return raw;\n }\n\n async list(tool?: string): Promise<Array<{ tool: string; name: string }>> {\n const p = `${this.prefix}template/`;\n const out: Array<{ tool: string; name: string }> = [];\n for (const k of await this.store.keys()) {\n if (!k.startsWith(p)) continue;\n const [t, n] = k.slice(p.length).split(\"/\");\n if (t && n && (tool === undefined || t === tool)) out.push({ tool: t, name: n });\n }\n return out;\n }\n\n async remove(tool: string, name: string): Promise<void> {\n await this.store.remove(this.key(tool, name));\n }\n\n async favourites(): Promise<string[]> {\n const raw = await this.store.load(`${this.prefix}favourites`);\n if (raw === undefined) return [];\n if (!Array.isArray(raw) || raw.some((x) => typeof x !== \"string\")) throw new TypeError(\"drawings: stored favourites are not a list of tool ids\");\n return raw as string[];\n }\n\n async setFavourite(tool: string, on: boolean): Promise<string[]> {\n const cur = await this.favourites();\n const next = on ? (cur.includes(tool) ? cur : [...cur, tool]) : cur.filter((t) => t !== tool);\n await this.store.save(`${this.prefix}favourites`, next);\n return next;\n }\n}\n","// Drawing model and the tool-definition API.\n//\n// A drawing is plain JSON: a tool id, anchors (time + price, never a timeline\n// index), a style and tool-specific props. A tool is a pure function from a\n// drawing to pixel-space shapes; drawing, hit-testing, selection boxes and\n// serialization are generic over shapes, so adding a tool never touches the\n// interaction code.\n//\n// Anchors are exact inputs. Every number a tool prints (Δ price, %, Fib\n// level price, risk/reward, quantity) is arithmetic on the anchors and goes\n// through the chart's price formatter; nothing is estimated or defaulted.\n\nimport type { BarSource } from \"./source.js\";\n\nexport interface Anchor {\n /** UTC ms. Not required to be a bar time: it may sit between bars or past the last bar. */\n time: number;\n price: number;\n}\n\nexport type Dash = \"solid\" | \"dashed\" | \"dotted\";\n\nexport interface DrawingStyle {\n color: string;\n /** CSS px. */\n width: number;\n dash: Dash;\n /** CSS colour with alpha, or null for no fill. */\n fill: string | null;\n textColor: string;\n /** CSS px. */\n fontSize: number;\n bold: boolean;\n italic: boolean;\n text: string;\n extendLeft: boolean;\n extendRight: boolean;\n}\n\nexport interface Drawing {\n id: string;\n tool: string;\n pane: number;\n anchors: Anchor[];\n style: DrawingStyle;\n /** Tool-specific, JSON-safe (levels, account size, seeds …). */\n props: Record<string, unknown>;\n locked: boolean;\n hidden: boolean;\n /** Chart intervals (bar length in ms) the drawing shows on; null = all. */\n intervals: number[] | null;\n}\n\n// ---- shapes (pixel space) ------------------------------------------------------\n\nexport interface Stroke {\n color?: string;\n width?: number;\n dash?: Dash;\n /** false: drawn but not hit-testable (decorations, fills). Default true. */\n hit?: boolean;\n}\n\nexport type Shape =\n | (Stroke & { k: \"line\"; x1: number; y1: number; x2: number; y2: number; extA?: boolean; extB?: boolean })\n | (Stroke & { k: \"poly\"; pts: number[]; close?: boolean; fill?: string | null; round?: boolean })\n | (Stroke & { k: \"ellipse\"; cx: number; cy: number; rx: number; ry: number; rot?: number; fill?: string | null })\n | (Stroke & { k: \"arc\"; cx: number; cy: number; r: number; a0: number; a1: number; fill?: string | null })\n | (Stroke & {\n k: \"text\";\n x: number;\n y: number;\n text: string;\n align?: \"left\" | \"center\" | \"right\";\n base?: \"top\" | \"middle\" | \"bottom\";\n /** Text colour (default: the drawing's text colour). */\n textColor?: string;\n size?: number;\n bg?: string | null;\n /** Border of the background box. */\n border?: string | null;\n pad?: number;\n });\n\n// ---- tool context --------------------------------------------------------------\n\nexport interface ToolCtx {\n /** Pane size in CSS px. */\n readonly W: number;\n readonly H: number;\n readonly dpr: number;\n X(time: number): number;\n Y(price: number): number;\n T(x: number): number;\n P(y: number): number;\n /** The series' price formatter. */\n fmt(price: number): string;\n /** Bars of the main series, for tools that read them (and bar counts). */\n readonly source: BarSource | null;\n /** Current chart interval in ms, if known. */\n readonly interval: number | null;\n}\n\nexport type Gesture =\n /** Press, drag, release: anchors 0 and 1 (a click then a click works too). Further anchors by click. */\n | \"drag\"\n /** One click per anchor. */\n | \"clicks\"\n /** One click. */\n | \"single\"\n /** Press-drag-release collecting points. */\n | \"freehand\";\n\nexport interface ToolDef {\n readonly id: string;\n readonly label: string;\n readonly family: string;\n readonly gesture: Gesture;\n /** Anchors (the minimum for variable tools). 0 for screen-anchored tools. */\n readonly anchors: number;\n /** Any number of anchors ≥ `anchors`: finish with double-click or Enter. */\n readonly variable?: boolean;\n /** Positioned by props.fx / props.fy (fractions of the pane), not by time and price. */\n readonly screen?: boolean;\n /** Reads bars: the plugin must have a BarSource. */\n readonly needsSource?: boolean;\n /** No handles (brush strokes: moving the whole stroke only). */\n readonly noHandles?: boolean;\n defaults(): { style?: Partial<DrawingStyle>; props?: Record<string, unknown> };\n shapes(d: Drawing, c: ToolCtx): Shape[];\n /** Throw (with context) when anchors or props are not valid for the tool. */\n validate?(d: Drawing): void;\n /** Called after anchor `i` was set by an edit; enforce invariants. */\n constrain?(d: Drawing, i: number): void;\n /** Fill props that depend on the view when the drawing is created (may throw). */\n onCreate?(d: Drawing, c: ToolCtx): void;\n /** Pixel positions of the edit handles, when they differ from the anchors. */\n handlePoints?(d: Drawing, c: ToolCtx): Array<{ x: number; y: number }>;\n}\n\nexport const DEFAULT_STYLE: DrawingStyle = {\n color: \"#2962ff\",\n width: 1.5,\n dash: \"solid\",\n fill: null,\n textColor: \"#d1d4dc\",\n fontSize: 12,\n bold: false,\n italic: false,\n text: \"\",\n extendLeft: false,\n extendRight: false,\n};\n\nexport const SCHEMA_VERSION = 1;\n\nexport interface DrawingsState {\n version: typeof SCHEMA_VERSION;\n drawings: Drawing[];\n}\n","// DrawingsPlugin: one chart plugin that owns every drawing on a chart.\n//\n// - State is a DrawingStore (ordered back to front) plus a command History;\n// every change, API or pointer, goes through a Command with an exact inverse.\n// - Tools are plain ToolDefs passed in by the integrator, so unused tools stay\n// out of the bundle.\n// - Drawing, hit-testing, box selection and edit handles are generic over the\n// pixel Shapes a tool returns.\n// - Interaction: a tool is \"armed\" with setTool(); otherwise a press on a\n// drawing selects/moves it, a press on a handle edits it, and a press on\n// empty space is left to the chart (pan) unless Shift starts a box select.\n// While the plugin consumes a press the chart does not pan.\n// - A tool that throws (bad props, missing bars) is reported through\n// onError once per distinct message and skipped; the rest keep drawing.\n\nimport type { ChartPlugin, LayoutStore, PluginApi, PluginPaneView, PluginPointer } from \"@alphacharts/core\";\nimport { Emitter } from \"./emitter.js\";\nimport { dist } from \"./geometry.js\";\nimport { AddCommand, BatchCommand, clone, DrawingStore, History, PatchCommand, RemoveCommand, ReorderCommand, type Command } from \"./history.js\";\nimport { drawShapes, shapeDistance, shapeInRect } from \"./shapes.js\";\nimport type { BarSource } from \"./source.js\";\nimport { TemplateStore } from \"./templates.js\";\nimport { DEFAULT_STYLE, SCHEMA_VERSION, type Anchor, type Drawing, type DrawingStyle, type DrawingsState, type Shape, type ToolCtx, type ToolDef } from \"./types.js\";\n\nexport type MagnetMode = \"off\" | \"weak\" | \"strong\";\n\nexport interface DrawingsOptions {\n tools: readonly ToolDef[];\n /** Plugin id (key in layout JSON). Default \"drawings\". */\n id?: string;\n /** Bars of the main series: needed by bar-reading tools, bar counts and the magnet. */\n source?: BarSource;\n /** Current chart interval in ms (for per-interval visibility); default: the source's. */\n interval?: number;\n magnet?: MagnetMode;\n /** Stay in the tool after a drawing is finished. */\n continuous?: boolean;\n /** Templates and favourites storage. */\n store?: LayoutStore;\n /** A tool failed to draw or a gesture produced an invalid drawing. Default: console.error. */\n onError?: (error: Error, drawing: Drawing | null) => void;\n}\n\nexport interface DrawingsEvents {\n created: Drawing;\n changed: Drawing;\n removed: Drawing;\n selected: string[];\n tool: string | null;\n history: { canUndo: boolean; canRedo: boolean };\n}\n\nexport interface NewDrawing {\n tool: string;\n anchors?: Anchor[];\n pane?: number;\n id?: string;\n style?: Partial<DrawingStyle>;\n props?: Record<string, unknown>;\n locked?: boolean;\n hidden?: boolean;\n intervals?: number[] | null;\n}\n\nexport type DrawingPatch = Partial<Pick<Drawing, \"anchors\" | \"locked\" | \"hidden\" | \"intervals\">> & {\n style?: Partial<DrawingStyle>;\n props?: Record<string, unknown>;\n};\n\n/** Pixels the pointer must travel before a press-release counts as a drag. */\nexport const DRAG_SLOP = 4;\n/** Hit tolerance in CSS px by pointer type. */\nexport const TOLERANCE: Record<string, number> = { mouse: 5, pen: 8, touch: 14 };\n/** Weak magnet radius in CSS px. */\nexport const WEAK_MAGNET_PX = 16;\n/** Duplicate offsets a copy by this many bars in time (never in price). */\nexport const DUPLICATE_BARS = 5;\n\ntype Drag =\n | { kind: \"move\"; pane: number; start: { x: number; y: number }; before: Drawing[]; startAnchors: Map<string, Anchor[]>; startScreen: Map<string, { fx: number; fy: number }>; moved: boolean; clickOnly: { id: string; shift: boolean } | null }\n | { kind: \"handle\"; pane: number; id: string; index: number; before: Drawing; moved: boolean }\n | { kind: \"box\"; pane: number; x0: number; y0: number; x1: number; y1: number };\n\ninterface Creating {\n def: ToolDef;\n pane: number;\n anchors: Anchor[];\n /** Pointer position (snapped) for the rubber-band anchor. */\n pointer: Anchor | null;\n /** The press that began the drawing has not been released yet. */\n fresh: boolean;\n downPx: { x: number; y: number };\n lastPx: { x: number; y: number };\n screenPos: { fx: number; fy: number } | null;\n}\n\nexport class DrawingsPlugin implements ChartPlugin {\n readonly id: string;\n readonly events = new Emitter<DrawingsEvents>();\n private loading = false;\n /**\n * True while `fromJSON` emits its `removed` / `created` events: they describe\n * a layout being loaded, not something the user drew or deleted, so a listener\n * that mirrors drawings elsewhere (a sync between charts) must not act on them.\n */\n get restoring(): boolean {\n return this.loading;\n }\n readonly templates: TemplateStore | null;\n\n private api: PluginApi | null = null;\n private readonly tools = new Map<string, ToolDef>();\n private readonly store = new DrawingStore();\n private readonly history = new History(this.store);\n private readonly selected = new Set<string>();\n private hover: string | null = null;\n private tool: string | null = null;\n private creating: Creating | null = null;\n private drag: Drag | null = null;\n private clipboard: Drawing[] = [];\n private nextId = 1;\n private last: { pane: number; x: number; y: number; time: number; price: number; pointerType: string } | null = null;\n private source: BarSource | null;\n private intervalMs: number | null;\n private magnetMode: MagnetMode;\n private readonly continuous: boolean;\n private readonly onError: (e: Error, d: Drawing | null) => void;\n private readonly reported = new Set<string>();\n private measureCanvas: CanvasRenderingContext2D | null | undefined;\n\n constructor(private readonly options: DrawingsOptions) {\n this.id = options.id ?? \"drawings\";\n for (const t of options.tools) {\n if (this.tools.has(t.id)) throw new Error(`drawings: tool \"${t.id}\" registered twice`);\n this.tools.set(t.id, t);\n }\n this.source = options.source ?? null;\n this.intervalMs = options.interval ?? null;\n this.magnetMode = options.magnet ?? \"off\";\n this.continuous = options.continuous ?? false;\n this.templates = options.store ? new TemplateStore(options.store) : null;\n this.onError = options.onError ?? ((e, d) => console.error(`alphacharts drawings${d ? ` (${d.tool} ${d.id})` : \"\"}:`, e));\n }\n\n // ---- plugin lifecycle ---------------------------------------------------------\n\n install(api: PluginApi): void {\n this.api = api;\n }\n\n uninstall(): void {\n this.api = null;\n this.creating = null;\n this.drag = null;\n }\n\n dataChanged(): void {\n this.api?.requestRender();\n }\n\n viewChanged(): void {\n // The overlay redraws with the view; nothing is cached in pixels.\n }\n\n // ---- configuration ------------------------------------------------------------\n\n toolDef(id: string): ToolDef {\n const t = this.tools.get(id);\n if (!t) throw new Error(`drawings: unknown tool \"${id}\" (registered: ${[...this.tools.keys()].join(\", \") || \"none\"})`);\n return t;\n }\n\n toolIds(): string[] {\n return [...this.tools.keys()];\n }\n\n setSource(source: BarSource | null): void {\n this.source = source;\n this.render();\n }\n\n /** Current chart interval in ms; drawings with `intervals` show only when it is listed. */\n setInterval(ms: number | null): void {\n if (ms !== null && !(ms > 0)) throw new RangeError(`drawings: interval must be positive, got ${ms}`);\n this.intervalMs = ms;\n this.render();\n }\n\n setMagnet(mode: MagnetMode): void {\n this.magnetMode = mode;\n }\n\n magnet(): MagnetMode {\n return this.magnetMode;\n }\n\n // ---- reading state ------------------------------------------------------------\n\n list(): Drawing[] {\n return this.store.list.map(clone);\n }\n\n get(id: string): Drawing | undefined {\n const d = this.store.get(id);\n return d ? clone(d) : undefined;\n }\n\n selection(): string[] {\n return [...this.selected];\n }\n\n activeTool(): string | null {\n return this.tool;\n }\n\n get canUndo(): boolean {\n return this.history.canUndo;\n }\n\n get canRedo(): boolean {\n return this.history.canRedo;\n }\n\n // ---- mutation (every path is a Command) ------------------------------------\n\n private newId(): string {\n let id: string;\n do id = `d${this.nextId++}`;\n while (this.store.get(id));\n return id;\n }\n\n private build(spec: NewDrawing, anchors: Anchor[], fromView: PluginPaneView | null): Drawing {\n const def = this.toolDef(spec.tool);\n const dflt = def.defaults();\n const d: Drawing = {\n id: spec.id ?? this.newId(),\n tool: spec.tool,\n pane: spec.pane ?? 0,\n anchors: anchors.map((a) => ({ time: a.time, price: a.price })),\n style: { ...DEFAULT_STYLE, ...dflt.style, ...spec.style },\n props: { ...clone(dflt.props ?? {}), ...clone(spec.props ?? {}) },\n locked: spec.locked ?? false,\n hidden: spec.hidden ?? false,\n intervals: spec.intervals ?? null,\n };\n if (def.onCreate && fromView) def.onCreate(d, this.ctxFor(fromView));\n return d;\n }\n\n /** Throws with context unless `d` is a valid drawing of a registered tool. */\n validate(d: Drawing): void {\n const def = this.toolDef(d.tool);\n if (typeof d.id !== \"string\" || !d.id) throw new TypeError(\"drawings: a drawing needs a string id\");\n if (!Number.isInteger(d.pane) || d.pane < 0) throw new RangeError(`drawings: ${d.tool} \"${d.id}\" has invalid pane ${d.pane}`);\n if (!Array.isArray(d.anchors)) throw new TypeError(`drawings: ${d.tool} \"${d.id}\" anchors must be an array`);\n if (def.variable ? d.anchors.length < def.anchors : d.anchors.length !== def.anchors) {\n throw new RangeError(`drawings: ${d.tool} \"${d.id}\" needs ${def.variable ? \"at least \" : \"\"}${def.anchors} anchors, got ${d.anchors.length}`);\n }\n d.anchors.forEach((a, i) => {\n if (typeof a?.time !== \"number\" || typeof a?.price !== \"number\" || !Number.isFinite(a.time) || !Number.isFinite(a.price)) {\n throw new TypeError(`drawings: ${d.tool} \"${d.id}\" anchor ${i} must be {time, price} with finite numbers`);\n }\n });\n for (const k of Object.keys(DEFAULT_STYLE) as Array<keyof DrawingStyle>) {\n if (typeof d.style?.[k] !== typeof DEFAULT_STYLE[k] && !(k === \"fill\" && (d.style?.fill === null || typeof d.style?.fill === \"string\"))) {\n throw new TypeError(`drawings: ${d.tool} \"${d.id}\" style.${k} has the wrong type`);\n }\n }\n if (d.intervals !== null && (!Array.isArray(d.intervals) || d.intervals.some((x) => !(x > 0)))) throw new TypeError(`drawings: ${d.tool} \"${d.id}\" intervals must be null or positive numbers`);\n if (def.needsSource && !this.source) throw new Error(`drawings: ${d.tool} needs a BarSource; pass \\`source\\` to DrawingsPlugin`);\n if (def.screen) {\n if (typeof d.props.fx !== \"number\" || typeof d.props.fy !== \"number\") throw new TypeError(`drawings: ${d.tool} \"${d.id}\" needs numeric props fx and fy`);\n }\n def.validate?.(d);\n }\n\n /** Create a drawing; returns a copy. Throws when invalid. */\n add(spec: NewDrawing): Drawing {\n const view = this.api && (spec.pane ?? 0) < this.api.paneCount ? this.api.paneView(spec.pane ?? 0) : null;\n const d = this.build(spec, spec.anchors ?? [], view);\n if (this.store.get(d.id)) throw new Error(`drawings: id \"${d.id}\" is already used`);\n this.validate(d);\n this.exec(new AddCommand(d, this.store.list.length));\n return clone(d);\n }\n\n /** Change a drawing (programmatic: locks do not apply). */\n update(id: string, patch: DrawingPatch): Drawing {\n const before = clone(this.store.require(id));\n const after = this.applyPatch(before, patch);\n this.validate(after);\n this.exec(new PatchCommand(\"update\", [before], [after]));\n return clone(after);\n }\n\n private applyPatch(d: Drawing, patch: DrawingPatch): Drawing {\n const out = clone(d);\n if (patch.anchors) out.anchors = patch.anchors.map((a) => ({ time: a.time, price: a.price }));\n if (patch.style) out.style = { ...out.style, ...patch.style };\n if (patch.props) out.props = { ...out.props, ...clone(patch.props) };\n if (patch.locked !== undefined) out.locked = patch.locked;\n if (patch.hidden !== undefined) out.hidden = patch.hidden;\n if (patch.intervals !== undefined) out.intervals = patch.intervals;\n return out;\n }\n\n /** Update several drawings as one undo step. */\n updateMany(ids: readonly string[], patch: DrawingPatch): void {\n const before = ids.map((i) => clone(this.store.require(i)));\n const after = before.map((b) => this.applyPatch(b, patch));\n after.forEach((a) => this.validate(a));\n this.exec(new PatchCommand(\"update\", before, after));\n }\n\n remove(ids: readonly string[]): void {\n if (ids.length === 0) return;\n const entries = ids.map((id) => ({ d: this.store.require(id), at: this.store.list.indexOf(this.store.require(id)) }));\n this.exec(new RemoveCommand(entries));\n }\n\n clear(): void {\n this.remove(this.store.list.map((d) => d.id));\n }\n\n private exec(cmd: Command, how: \"run\" | \"undo\" | \"redo\" = \"run\"): void {\n // A drag holds snapshots of the state it started from: abandon it before the state changes under it.\n if (this.drag) this.cancelDrag();\n const snap = (ids: readonly string[]) => new Map(ids.map((i) => [i, this.store.get(i) ? JSON.stringify(this.store.get(i)) : undefined] as const));\n const before = snap(cmd.ids);\n if (how === \"run\") this.history.run(cmd);\n else if (how === \"undo\") this.history.undo();\n else this.history.redo();\n const after = snap(cmd.ids);\n for (const id of cmd.ids) {\n const b = before.get(id), a = after.get(id);\n if (b === undefined && a !== undefined) this.events.emit(\"created\", JSON.parse(a) as Drawing);\n else if (b !== undefined && a === undefined) this.events.emit(\"removed\", JSON.parse(b) as Drawing);\n else if (a !== undefined && a !== b) this.events.emit(\"changed\", JSON.parse(a) as Drawing);\n }\n this.afterMutation();\n }\n\n private afterMutation(): void {\n let dropped = false;\n for (const id of [...this.selected]) if (!this.store.get(id)) (this.selected.delete(id), (dropped = true));\n if (this.hover && !this.store.get(this.hover)) this.hover = null;\n if (dropped) this.events.emit(\"selected\", this.selection());\n this.events.emit(\"history\", { canUndo: this.history.canUndo, canRedo: this.history.canRedo });\n this.render();\n }\n\n undo(): boolean {\n const top = this.peekUndo();\n if (!top) return false;\n this.exec(top, \"undo\");\n return true;\n }\n\n redo(): boolean {\n const top = this.peekRedo();\n if (!top) return false;\n this.exec(top, \"redo\");\n return true;\n }\n\n // History does not expose its stacks; wrap to learn the command before applying it.\n private peekUndo(): Command | undefined {\n return (this.history as unknown as { undoStack: Command[] }).undoStack.at(-1);\n }\n private peekRedo(): Command | undefined {\n return (this.history as unknown as { redoStack: Command[] }).redoStack.at(-1);\n }\n\n // ---- selection ------------------------------------------------------------------\n\n select(ids: readonly string[]): void {\n for (const id of ids) this.store.require(id);\n const same = ids.length === this.selected.size && ids.every((i) => this.selected.has(i));\n if (same) return;\n this.selected.clear();\n for (const id of ids) this.selected.add(id);\n this.events.emit(\"selected\", this.selection());\n this.render();\n }\n\n selectAll(): void {\n this.select(this.store.list.filter((d) => !d.hidden).map((d) => d.id));\n }\n\n setTool(id: string | null): void {\n if (id !== null) this.toolDef(id);\n this.creating = null;\n if (this.tool === id) return;\n this.tool = id;\n if (id !== null) this.select([]);\n this.events.emit(\"tool\", id);\n this.render();\n }\n\n /** The anchor (time, price) under a pane pixel: for creating drawings from code at screen positions. */\n anchorAt(pane: number, x: number, y: number): Anchor {\n if (!this.api) throw new Error(\"drawings: the plugin is not installed on a chart\");\n const v = this.api.paneView(pane);\n return { time: v.xToTime(x), price: v.yToPrice(y) };\n }\n\n /** Pane pixel of an anchor. */\n pixelOf(pane: number, a: Anchor): { x: number; y: number } {\n if (!this.api) throw new Error(\"drawings: the plugin is not installed on a chart\");\n const v = this.api.paneView(pane);\n return { x: v.timeToX(a.time), y: v.priceToY(a.price) };\n }\n\n // ---- order, clipboard -----------------------------------------------------------\n\n private reorder(ids: readonly string[], f: (order: string[], sel: Set<string>) => string[]): void {\n const before = this.store.list.map((d) => d.id);\n const after = f([...before], new Set(ids));\n if (after.every((id, i) => id === before[i])) return;\n this.exec(new ReorderCommand(before, after));\n }\n\n bringToFront(ids: readonly string[] = this.selection()): void {\n this.reorder(ids, (o, s) => [...o.filter((i) => !s.has(i)), ...o.filter((i) => s.has(i))]);\n }\n\n sendToBack(ids: readonly string[] = this.selection()): void {\n this.reorder(ids, (o, s) => [...o.filter((i) => s.has(i)), ...o.filter((i) => !s.has(i))]);\n }\n\n /** Move each selected drawing one step up past the nearest unselected one. */\n bringForward(ids: readonly string[] = this.selection()): void {\n this.reorder(ids, (o, s) => {\n for (let i = o.length - 2; i >= 0; i--) if (s.has(o[i]!) && !s.has(o[i + 1]!)) [o[i], o[i + 1]] = [o[i + 1]!, o[i]!];\n return o;\n });\n }\n\n sendBackward(ids: readonly string[] = this.selection()): void {\n this.reorder(ids, (o, s) => {\n for (let i = 1; i < o.length; i++) if (s.has(o[i]!) && !s.has(o[i - 1]!)) [o[i], o[i - 1]] = [o[i - 1]!, o[i]!];\n return o;\n });\n }\n\n /** Copy the selection (or `ids`) to the plugin's clipboard; returns the copies. */\n copy(ids: readonly string[] = this.selection()): Drawing[] {\n this.clipboard = ids.map((i) => clone(this.store.require(i)));\n return clone(this.clipboard);\n }\n\n /**\n * Paste the clipboard as new drawings (one undo step) and select them. With\n * `at`, the first copy's first anchor lands there and the others keep their\n * offsets; without, the copies sit exactly on the originals.\n */\n paste(at?: { time: number; price: number }): Drawing[] {\n if (this.clipboard.length === 0) return [];\n const ref = this.clipboard.find((d) => d.anchors.length > 0)?.anchors[0];\n const dt = at && ref ? at.time - ref.time : 0, dp = at && ref ? at.price - ref.price : 0;\n return this.pasteShifted(dt, dp);\n }\n\n /** Copy + paste the selection shifted by DUPLICATE_BARS bars in time (price unchanged). */\n duplicate(): Drawing[] {\n if (this.selected.size === 0) return [];\n const bar = this.barMs();\n this.copy();\n return this.pasteShifted(DUPLICATE_BARS * bar, 0);\n }\n\n private barMs(): number {\n const v = this.intervalMs ?? (this.source && this.source.length > 1 ? this.source.interval : null);\n if (v === null) throw new Error(\"drawings: the bar interval is unknown; pass `interval` or a `source` with two bars\");\n return v;\n }\n\n private pasteShifted(dt: number, dp: number): Drawing[] {\n const adds: Command[] = [];\n const made: Drawing[] = [];\n let at = this.store.list.length;\n for (const src of this.clipboard) {\n const d = clone(src);\n d.id = this.newId();\n d.locked = false;\n d.anchors = d.anchors.map((a) => ({ time: a.time + dt, price: a.price + dp }));\n this.validate(d);\n adds.push(new AddCommand(d, at++));\n made.push(d);\n }\n this.exec(new BatchCommand(\"paste\", adds));\n this.select(made.map((d) => d.id));\n return clone(made);\n }\n\n // ---- templates -------------------------------------------------------------------\n\n /** Save a drawing's style as a named template for its tool. */\n async saveTemplate(id: string, name: string): Promise<void> {\n if (!this.templates) throw new Error(\"drawings: pass `store` to DrawingsPlugin to keep templates\");\n await this.templates.save(name, this.store.require(id));\n }\n\n /** Apply a saved template's style and props to drawings of that tool (one undo step). */\n async applyTemplate(ids: readonly string[], name: string): Promise<void> {\n if (!this.templates) throw new Error(\"drawings: pass `store` to DrawingsPlugin to keep templates\");\n const tools = new Set(ids.map((i) => this.store.require(i).tool));\n if (tools.size !== 1) throw new Error(\"drawings: a template applies to drawings of one tool\");\n const t = await this.templates.load([...tools][0]!, name);\n this.updateMany(ids, { style: t.style, props: t.props });\n }\n\n // ---- persistence -----------------------------------------------------------------\n\n toJSON(): DrawingsState {\n return { version: SCHEMA_VERSION, drawings: this.list() };\n }\n\n /** Throws what `fromJSON(state)` would, changing nothing (the core's `restoreState` calls it before it replaces anything). */\n validateState(state: unknown): void {\n this.parseState(state);\n }\n\n private parseState(state: unknown): Drawing[] {\n if (typeof state !== \"object\" || state === null) throw new TypeError(\"drawings: saved state must be an object\");\n const s = state as Partial<DrawingsState>;\n if (typeof s.version !== \"number\" || !Number.isInteger(s.version) || s.version < 1) throw new TypeError(`drawings: invalid saved version ${String(s.version)}`);\n if (s.version > SCHEMA_VERSION) throw new RangeError(`drawings: saved version ${s.version} is newer than this library understands (${SCHEMA_VERSION})`);\n if (!Array.isArray(s.drawings)) throw new TypeError(\"drawings: saved state has no drawings array\");\n const ids = new Set<string>();\n const next = s.drawings.map((raw) => {\n const d = clone(raw as Drawing);\n this.validate(d);\n if (ids.has(d.id)) throw new Error(`drawings: saved state repeats id \"${d.id}\"`);\n ids.add(d.id);\n return d;\n });\n return next;\n }\n\n fromJSON(state: unknown): void {\n const next = this.parseState(state);\n const gone = this.store.list.map(clone);\n this.store.clear();\n next.forEach((d, i) => this.store.insert(d, i));\n for (const d of next) {\n const n = /^d(\\d+)$/.exec(d.id);\n if (n) this.nextId = Math.max(this.nextId, Number(n[1]) + 1);\n }\n this.history.clear();\n this.selected.clear();\n this.creating = null;\n this.drag = null;\n this.hover = null;\n this.loading = true;\n try {\n gone.forEach((d) => this.events.emit(\"removed\", d));\n next.forEach((d) => this.events.emit(\"created\", clone(d)));\n } finally {\n this.loading = false;\n }\n this.events.emit(\"selected\", []);\n this.events.emit(\"history\", { canUndo: false, canRedo: false });\n this.render();\n }\n\n // ---- geometry helpers ---------------------------------------------------------------\n\n private render(): void {\n this.api?.requestRender();\n }\n\n private report(e: unknown, d: Drawing | null): void {\n const err = e instanceof Error ? e : new Error(String(e));\n const key = `${d?.id ?? \"\"}:${err.message}`;\n if (this.reported.has(key)) return;\n this.reported.add(key);\n this.onError(err, d ? clone(d) : null);\n }\n\n private measure = (t: string, f: string): number => {\n if (this.measureCanvas === undefined) {\n this.measureCanvas = typeof document !== \"undefined\" ? document.createElement(\"canvas\").getContext(\"2d\") : null;\n }\n const c = this.measureCanvas;\n if (!c) return t.length * parseFloat(f.match(/(\\d+(?:\\.\\d+)?)px/)?.[1] ?? \"12\") * 0.6;\n c.font = f;\n return c.measureText(t).width;\n };\n\n private sourceInterval(): number | null {\n return this.intervalMs ?? (this.source && this.source.length > 1 ? this.source.interval : null);\n }\n\n private ctxFor(v: PluginPaneView): ToolCtx {\n return {\n W: v.width, H: v.height, dpr: v.dpr,\n X: (t) => v.timeToX(t), Y: (p) => v.priceToY(p), T: (x) => v.xToTime(x), P: (y) => v.yToPrice(y),\n fmt: (p) => v.formatPrice(p),\n source: this.source,\n interval: this.sourceInterval(),\n };\n }\n\n private visible(d: Drawing): boolean {\n if (d.hidden) return false;\n if (d.intervals === null) return true;\n const iv = this.intervalMs;\n if (iv === null) {\n this.report(new Error(\"the chart interval is unknown (call setInterval); drawings limited to intervals are shown on every interval\"), d);\n return true;\n }\n return d.intervals.includes(iv);\n }\n\n private shapesOf(d: Drawing, c: ToolCtx): Shape[] {\n try {\n return this.toolDef(d.tool).shapes(d, c);\n } catch (e) {\n this.report(e, d);\n return [];\n }\n }\n\n private handlePoints(d: Drawing, c: ToolCtx): Array<{ x: number; y: number }> {\n const def = this.toolDef(d.tool);\n if (def.noHandles || d.locked) return [];\n if (def.screen) return [{ x: (d.props.fx as number) * c.W, y: (d.props.fy as number) * c.H }];\n try {\n return def.handlePoints ? def.handlePoints(d, c) : d.anchors.map((a) => ({ x: c.X(a.time), y: c.Y(a.price) }));\n } catch (e) {\n this.report(e, d);\n return [];\n }\n }\n\n private tolerance(type?: string): number {\n return TOLERANCE[type ?? this.last?.pointerType ?? \"mouse\"] ?? TOLERANCE.mouse!;\n }\n\n /**\n * What is under a pane point: a handle of a selected drawing first (topmost\n * selected wins), else the topmost visible drawing within `tol` px.\n */\n hitTest(pane: number, x: number, y: number, tol = this.tolerance()): { id: string; handle: number | null } | null {\n if (!this.api) throw new Error(\"drawings: the plugin is not installed on a chart\");\n const view = this.api.paneView(pane);\n const c = this.ctxFor(view);\n const list = this.store.list;\n for (let i = list.length - 1; i >= 0; i--) {\n const d = list[i]!;\n if (d.pane !== pane || !this.selected.has(d.id) || d.locked) continue;\n const hp = this.handlePoints(d, c);\n for (let h = 0; h < hp.length; h++) if (dist(x, y, hp[h]!.x, hp[h]!.y) <= tol + 3) return { id: d.id, handle: h };\n }\n for (let i = list.length - 1; i >= 0; i--) {\n const d = list[i]!;\n if (d.pane !== pane || !this.visible(d)) continue;\n for (const s of this.shapesOf(d, c)) {\n if (shapeDistance(s, x, y, c.W, c.H, d.style, this.measure) <= tol) return { id: d.id, handle: null };\n }\n }\n return null;\n }\n\n /** Snap a pointer position to the nearest bar's O/H/L/C according to the magnet mode. */\n snap(e: Pick<PluginPointer, \"pane\" | \"x\" | \"y\" | \"time\" | \"price\">): Anchor {\n const raw = { time: e.time, price: e.price };\n if (this.magnetMode === \"off\" || !this.source || this.source.length === 0 || e.pane !== 0 || !this.api) return raw;\n const v = this.api.paneView(0);\n const bar = this.source.nearest(e.time);\n if (!bar) return raw;\n const bx = v.timeToX(bar.time);\n let best: { price: number; d: number } | null = null;\n for (const p of [bar.open, bar.high, bar.low, bar.close]) {\n const d = Math.abs(v.priceToY(p) - e.y);\n if (!best || d < best.d) best = { price: p, d };\n }\n if (!best) return raw;\n if (this.magnetMode === \"weak\" && (best.d > WEAK_MAGNET_PX || Math.abs(bx - e.x) > WEAK_MAGNET_PX)) return raw;\n return { time: bar.time, price: best.price };\n }\n\n // ---- drawing ------------------------------------------------------------------------\n\n drawPane(ctx: CanvasRenderingContext2D, view: PluginPaneView): void {\n const c = this.ctxFor(view);\n for (const d of this.store.list) {\n if (d.pane !== view.pane || !this.visible(d)) continue;\n const sel = this.selected.has(d.id);\n drawShapes(ctx, this.shapesOf(d, c), d.style, c.W, c.H, { widthBoost: sel || d.id === this.hover ? 0.5 : 0 });\n }\n for (const d of this.store.list) {\n if (d.pane !== view.pane || !this.selected.has(d.id) || !this.visible(d)) continue;\n for (const p of this.handlePoints(d, c)) {\n ctx.beginPath();\n ctx.arc(p.x, p.y, 4, 0, Math.PI * 2);\n ctx.fillStyle = \"#ffffff\";\n ctx.fill();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = d.style.color;\n ctx.stroke();\n }\n }\n const cr = this.creating;\n if (cr && cr.pane === view.pane) {\n const d = this.previewDrawing(cr);\n if (d) {\n ctx.save();\n drawShapes(ctx, this.shapesOf(d, c), d.style, c.W, c.H);\n ctx.restore();\n for (const a of cr.anchors) {\n ctx.beginPath();\n ctx.arc(c.X(a.time), c.Y(a.price), 3.5, 0, Math.PI * 2);\n ctx.fillStyle = d.style.color;\n ctx.fill();\n }\n }\n }\n const b = this.drag;\n if (b?.kind === \"box\" && b.pane === view.pane) {\n ctx.save();\n ctx.strokeStyle = \"#2962ff\";\n ctx.fillStyle = \"rgba(41,98,255,0.12)\";\n ctx.lineWidth = 1;\n ctx.setLineDash([4, 3]);\n ctx.fillRect(Math.min(b.x0, b.x1), Math.min(b.y0, b.y1), Math.abs(b.x1 - b.x0), Math.abs(b.y1 - b.y0));\n ctx.strokeRect(Math.min(b.x0, b.x1) + 0.5, Math.min(b.y0, b.y1) + 0.5, Math.abs(b.x1 - b.x0), Math.abs(b.y1 - b.y0));\n ctx.restore();\n }\n }\n\n /** The drawing being created, with the rubber-band anchor filling the rest. */\n private previewDrawing(cr: Creating): Drawing | null {\n const def = cr.def;\n const anchors = [...cr.anchors];\n if (def.screen) {\n if (!cr.screenPos) return null;\n } else {\n const p = cr.pointer ?? anchors[anchors.length - 1];\n if (!p) return null;\n if (def.gesture === \"freehand\") {\n if (anchors.length < 2) return null;\n } else if (def.variable) {\n anchors.push(p);\n if (anchors.length < def.anchors) while (anchors.length < def.anchors) anchors.push(p);\n } else {\n while (anchors.length < def.anchors) anchors.push(p);\n }\n }\n const d = this.build({ tool: def.id, pane: cr.pane, id: \"__preview__\", ...(cr.screenPos ? { props: cr.screenPos } : {}) }, anchors, null);\n this.constrainAll(d);\n return d;\n }\n\n private constrainAll(d: Drawing): void {\n const def = this.toolDef(d.tool);\n if (def.constrain) for (let i = 0; i < d.anchors.length; i++) def.constrain(d, i);\n }\n\n // ---- pointer -------------------------------------------------------------------------\n\n pointer(e: PluginPointer): boolean {\n this.last = { pane: e.pane, x: e.x, y: e.y, time: e.time, price: e.price, pointerType: e.pointerType };\n switch (e.type) {\n case \"down\": return this.onDown(e);\n case \"move\": return this.onMove(e);\n case \"up\": return this.onUp(e);\n case \"click\": return this.onClick(e);\n case \"dblclick\": return this.onDouble(e);\n case \"leave\":\n if (this.hover) {\n this.hover = null;\n this.render();\n }\n return false;\n }\n }\n\n private onDown(e: PluginPointer): boolean {\n if (this.creating) return true;\n if (this.tool) return this.beginCreate(e);\n const hit = this.hitTest(e.pane, e.x, e.y, this.tolerance(e.pointerType));\n if (!hit) {\n if (e.shiftKey) {\n this.drag = { kind: \"box\", pane: e.pane, x0: e.x, y0: e.y, x1: e.x, y1: e.y };\n return true;\n }\n return false;\n }\n const d = this.store.require(hit.id);\n if (hit.handle !== null) {\n this.drag = { kind: \"handle\", pane: e.pane, id: d.id, index: hit.handle, before: clone(d), moved: false };\n return true;\n }\n let clickOnly: { id: string; shift: boolean } | null = null;\n if (e.shiftKey) {\n if (this.selected.has(d.id)) clickOnly = { id: d.id, shift: true };\n else this.select([...this.selected, d.id]);\n } else if (!this.selected.has(d.id)) this.select([d.id]);\n else if (this.selected.size > 1) clickOnly = { id: d.id, shift: false };\n const movers = [...this.selected].map((id) => this.store.require(id)).filter((m) => !m.locked && m.pane === e.pane);\n this.drag = {\n kind: \"move\", pane: e.pane, start: { x: e.x, y: e.y }, before: movers.map(clone),\n startAnchors: new Map(movers.map((m) => [m.id, clone(m.anchors)])),\n startScreen: new Map(movers.filter((m) => this.toolDef(m.tool).screen).map((m) => [m.id, { fx: m.props.fx as number, fy: m.props.fy as number }])),\n moved: false, clickOnly,\n };\n return true;\n }\n\n private beginCreate(e: PluginPointer): boolean {\n const def = this.toolDef(this.tool!);\n const a = this.snap(e);\n const view = this.api!.paneView(e.pane);\n this.creating = {\n def, pane: e.pane, anchors: def.screen ? [] : [a], pointer: a, fresh: true,\n downPx: { x: e.x, y: e.y }, lastPx: { x: e.x, y: e.y },\n screenPos: def.screen ? { fx: e.x / view.width, fy: e.y / view.height } : null,\n };\n this.render();\n return true;\n }\n\n private onMove(e: PluginPointer): boolean {\n const cr = this.creating;\n if (cr) {\n if (e.pane !== cr.pane) return true;\n cr.pointer = this.snap(e);\n if (cr.screenPos) cr.screenPos = { fx: e.x / this.api!.paneView(cr.pane).width, fy: e.y / this.api!.paneView(cr.pane).height };\n if (cr.def.gesture === \"freehand\" && cr.fresh && (e.buttons & 1)) {\n if (dist(e.x, e.y, cr.lastPx.x, cr.lastPx.y) >= 3) {\n cr.anchors.push(cr.pointer);\n cr.lastPx = { x: e.x, y: e.y };\n }\n }\n this.render();\n return true;\n }\n const d = this.drag;\n if (d) {\n if (d.kind === \"box\") {\n d.x1 = e.x;\n d.y1 = e.y;\n } else if (d.kind === \"move\") this.dragMove(d, e);\n else this.dragHandle(d, e);\n this.render();\n return true;\n }\n if (this.tool) return false;\n const hit = this.hitTest(e.pane, e.x, e.y, this.tolerance(e.pointerType));\n const id = hit?.id ?? null;\n if (id !== this.hover) {\n this.hover = id;\n this.render();\n }\n return false;\n }\n\n private dragMove(d: Extract<Drag, { kind: \"move\" }>, e: PluginPointer): void {\n const dx = e.x - d.start.x, dy = e.y - d.start.y;\n if (!d.moved && Math.hypot(dx, dy) < DRAG_SLOP) return;\n d.moved = true;\n const v = this.api!.paneView(d.pane);\n for (const b of d.before) {\n const cur = this.store.require(b.id);\n const def = this.toolDef(b.tool);\n if (def.screen) {\n const s0 = d.startScreen.get(b.id)!;\n cur.props.fx = s0.fx + dx / v.width;\n cur.props.fy = s0.fy + dy / v.height;\n continue;\n }\n const a0 = d.startAnchors.get(b.id)!;\n // Move in pixels so the shape keeps its on-screen form across non-trading gaps.\n cur.anchors = a0.map((a) => ({ time: v.xToTime(v.timeToX(a.time) + dx), price: v.yToPrice(v.priceToY(a.price) + dy) }));\n }\n }\n\n private dragHandle(d: Extract<Drag, { kind: \"handle\" }>, e: PluginPointer): void {\n const cur = this.store.require(d.id);\n const def = this.toolDef(cur.tool);\n if (def.screen) return;\n d.moved = true;\n const a = this.snap(e);\n cur.anchors[d.index] = { time: a.time, price: a.price };\n def.constrain?.(cur, d.index);\n }\n\n private onUp(e: PluginPointer): boolean {\n const cr = this.creating;\n if (cr) return this.upCreate(cr, e);\n const d = this.drag;\n if (!d) return false;\n this.drag = null;\n if (d.kind === \"box\") {\n this.finishBox(d);\n return true;\n }\n if (d.kind === \"handle\") {\n const cur = this.store.require(d.id);\n if (d.moved && JSON.stringify(cur) !== JSON.stringify(d.before)) {\n try {\n this.validate(cur);\n } catch (err) {\n Object.assign(cur, d.before);\n this.report(err, cur);\n this.render();\n return true;\n }\n this.history.record(new PatchCommand(\"edit\", [d.before], [clone(cur)]));\n this.events.emit(\"changed\", clone(cur));\n this.events.emit(\"history\", { canUndo: true, canRedo: false });\n }\n this.render();\n return true;\n }\n if (d.moved) {\n const after = d.before.map((b) => clone(this.store.require(b.id)));\n this.history.record(new PatchCommand(\"move\", d.before, after));\n after.forEach((a) => this.events.emit(\"changed\", a));\n this.events.emit(\"history\", { canUndo: true, canRedo: false });\n } else if (d.clickOnly) {\n if (d.clickOnly.shift) this.select([...this.selected].filter((i) => i !== d.clickOnly!.id));\n else this.select([d.clickOnly.id]);\n }\n this.render();\n return true;\n }\n\n private finishBox(b: Extract<Drag, { kind: \"box\" }>): void {\n const view = this.api!.paneView(b.pane);\n const c = this.ctxFor(view);\n const ids: string[] = [];\n for (const d of this.store.list) {\n if (d.pane !== b.pane || !this.visible(d)) continue;\n if (this.shapesOf(d, c).some((s) => shapeInRect(s, b.x0, b.y0, b.x1, b.y1, c.W, c.H))) ids.push(d.id);\n }\n this.select(ids);\n }\n\n /** Select every visible drawing of a pane with a point inside the rectangle (CSS px). */\n selectInRect(pane: number, x0: number, y0: number, x1: number, y1: number): string[] {\n if (!this.api) throw new Error(\"drawings: the plugin is not installed on a chart\");\n this.finishBox({ kind: \"box\", pane, x0, y0, x1, y1 });\n return this.selection();\n }\n\n private upCreate(cr: Creating, e: PluginPointer): boolean {\n if (e.pane !== cr.pane) return true;\n const a = this.snap(e);\n cr.pointer = a;\n const def = cr.def;\n if (def.gesture === \"single\") {\n this.commit(cr);\n return true;\n }\n if (def.gesture === \"freehand\") {\n if (cr.anchors.length >= 2) this.commit(cr);\n else this.cancelCreate();\n return true;\n }\n if (cr.fresh) {\n cr.fresh = false;\n if (dist(cr.downPx.x, cr.downPx.y, e.x, e.y) > DRAG_SLOP) cr.anchors.push(a);\n } else {\n cr.anchors.push(a);\n }\n if (!def.variable && cr.anchors.length >= def.anchors) this.commit(cr);\n else this.render();\n return true;\n }\n\n private onClick(_e: PluginPointer): boolean {\n if (this.creating || this.tool) return true;\n // A click that no drawing took (the press was not consumed): clear the selection.\n if (this.selected.size > 0) this.select([]);\n return false;\n }\n\n private onDouble(_e: PluginPointer): boolean {\n const cr = this.creating;\n if (!cr || !cr.def.variable) return false;\n // The two clicks of a double click each placed an anchor on the same spot.\n const n = cr.anchors.length;\n if (n >= 2) {\n const p = cr.anchors[n - 1]!, q = cr.anchors[n - 2]!;\n const v = this.api!.paneView(cr.pane);\n if (dist(v.timeToX(p.time), v.priceToY(p.price), v.timeToX(q.time), v.priceToY(q.price)) <= DRAG_SLOP) cr.anchors.pop();\n }\n this.finishVariable(cr);\n return true;\n }\n\n private finishVariable(cr: Creating): void {\n if (cr.anchors.length >= cr.def.anchors) this.commit(cr);\n else this.cancelCreate();\n }\n\n cancelCreate(): void {\n this.creating = null;\n this.render();\n }\n\n private commit(cr: Creating): void {\n this.creating = null;\n const def = cr.def;\n let anchors = cr.anchors;\n if (def.gesture === \"single\" && !def.screen) anchors = [cr.pointer ?? anchors[0]!];\n try {\n const view = this.api!.paneView(cr.pane);\n const d = this.build({ tool: def.id, pane: cr.pane, ...(cr.screenPos ? { props: cr.screenPos } : {}) }, anchors, view);\n this.constrainAll(d);\n this.validate(d);\n this.exec(new AddCommand(d, this.store.list.length));\n if (!this.continuous) {\n this.tool = null;\n this.events.emit(\"tool\", null);\n }\n this.select([d.id]);\n } catch (err) {\n this.report(err, null);\n this.render();\n }\n }\n\n cursor(pane: number, x: number, y: number): string | null {\n if (this.tool || this.creating) return \"crosshair\";\n if (this.drag) return this.drag.kind === \"move\" ? \"move\" : \"pointer\";\n if (!this.api) return null;\n const hit = this.hitTest(pane, x, y);\n if (!hit) return null;\n return hit.handle !== null ? \"pointer\" : this.store.require(hit.id).locked ? \"default\" : \"move\";\n }\n\n // ---- keyboard -------------------------------------------------------------------------\n\n key(e: KeyboardEvent): boolean {\n const mod = e.metaKey || e.ctrlKey;\n const k = e.key;\n if (k === \"Escape\") {\n if (this.drag) {\n this.cancelDrag();\n return true;\n }\n if (this.creating) {\n this.cancelCreate();\n return true;\n }\n if (this.tool) {\n this.setTool(null);\n return true;\n }\n if (this.selected.size) {\n this.select([]);\n return true;\n }\n return false;\n }\n if (k === \"Enter\" && this.creating?.def.variable) {\n this.finishVariable(this.creating);\n return true;\n }\n if (k === \"Delete\" || k === \"Backspace\") {\n const ids = [...this.selected].filter((id) => !this.store.require(id).locked);\n if (ids.length === 0) return false;\n this.remove(ids);\n return true;\n }\n if (mod && (k === \"z\" || k === \"Z\")) return e.shiftKey ? this.redo() : this.undo();\n if (mod && (k === \"y\" || k === \"Y\")) return this.redo();\n if (mod && (k === \"c\" || k === \"C\")) {\n if (this.selected.size === 0) return false;\n this.copy();\n return true;\n }\n if (mod && (k === \"v\" || k === \"V\")) {\n if (this.clipboard.length === 0) return false;\n this.paste(this.last ? { time: this.last.time, price: this.last.price } : undefined);\n return true;\n }\n if (mod && (k === \"d\" || k === \"D\")) {\n if (this.selected.size === 0) return false;\n this.duplicate();\n return true;\n }\n return false;\n }\n\n private cancelDrag(): void {\n const d = this.drag;\n this.drag = null;\n if (!d || d.kind === \"box\") return this.render();\n if (d.kind === \"handle\") Object.assign(this.store.require(d.id), clone(d.before));\n else for (const b of d.before) Object.assign(this.store.require(b.id), clone(b));\n this.render();\n }\n}\n","// The bars drawings read: anchored VWAP, volume profile, bar counts, magnet\n// snapping, bars pattern. The chart core has no public range iteration over\n// series data, so the integrator, who owns the data, hands the plugin a\n// BarSource. ArrayBarSource is one over columnar Float64Arrays that mirrors\n// Series.setData / update / prepend.\n\nexport interface Bar {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n}\n\nexport interface BarSource {\n /** Bumps on every mutation: caches key on it. */\n readonly version: number;\n readonly length: number;\n /** Bar at array position i (0 = oldest). Throws when out of range. */\n at(i: number): Bar;\n /** Bar whose time is nearest to `time`, or undefined when empty. */\n nearest(time: number): Bar | undefined;\n /** Fractional position of `time` in the bar sequence: integer at a bar, linear between bars, extrapolated by the median interval outside. */\n logical(time: number): number;\n /** Inverse of logical(). */\n timeAtLogical(l: number): number;\n /** Index range [lo, hi) of bars with from <= time <= to. */\n range(from: number, to: number): [number, number];\n /** Median bar interval in ms. */\n readonly interval: number;\n}\n\nexport interface ColumnarBars {\n time: ArrayLike<number>;\n open: ArrayLike<number>;\n high: ArrayLike<number>;\n low: ArrayLike<number>;\n close: ArrayLike<number>;\n volume?: ArrayLike<number> | undefined;\n}\n\nexport class ArrayBarSource implements BarSource {\n private t: number[] = [];\n private o: number[] = [];\n private h: number[] = [];\n private l: number[] = [];\n private c: number[] = [];\n private v: number[] = [];\n private ver = 0;\n private cachedInterval = 0;\n\n constructor(data?: ColumnarBars) {\n if (data) this.setData(data);\n }\n\n get version(): number {\n return this.ver;\n }\n\n get length(): number {\n return this.t.length;\n }\n\n setData(d: ColumnarBars): void {\n const n = d.time.length;\n for (const k of [\"open\", \"high\", \"low\", \"close\"] as const) {\n if (d[k].length !== n) throw new RangeError(`ArrayBarSource: ${k} has ${d[k].length} rows, time has ${n}`);\n }\n if (d.volume && d.volume.length !== n) throw new RangeError(`ArrayBarSource: volume has ${d.volume.length} rows, time has ${n}`);\n for (let i = 1; i < n; i++) if (!(d.time[i]! > d.time[i - 1]!)) throw new RangeError(`ArrayBarSource: times must be strictly increasing (row ${i})`);\n this.t = Array.from(d.time);\n this.o = Array.from(d.open);\n this.h = Array.from(d.high);\n this.l = Array.from(d.low);\n this.c = Array.from(d.close);\n this.v = d.volume ? Array.from(d.volume) : new Array<number>(n).fill(0);\n this.touch();\n }\n\n /** Same time replaces the last bar; a later time appends. */\n update(b: Bar): void {\n const n = this.t.length;\n if (n > 0 && b.time < this.t[n - 1]!) throw new RangeError(`ArrayBarSource.update: time ${b.time} is before the last bar`);\n if (n > 0 && b.time === this.t[n - 1]) {\n this.o[n - 1] = b.open; this.h[n - 1] = b.high; this.l[n - 1] = b.low; this.c[n - 1] = b.close; this.v[n - 1] = b.volume;\n } else {\n this.t.push(b.time); this.o.push(b.open); this.h.push(b.high); this.l.push(b.low); this.c.push(b.close); this.v.push(b.volume);\n }\n this.touch();\n }\n\n /** Older history, all earlier than the first bar. */\n prepend(d: ColumnarBars): void {\n const n = d.time.length;\n if (n === 0) return;\n if (this.t.length && !(d.time[n - 1]! < this.t[0]!)) throw new RangeError(\"ArrayBarSource.prepend: bars must all be earlier than the first bar\");\n const older = new ArrayBarSource(d);\n this.t = [...older.t, ...this.t];\n this.o = [...older.o, ...this.o];\n this.h = [...older.h, ...this.h];\n this.l = [...older.l, ...this.l];\n this.c = [...older.c, ...this.c];\n this.v = [...older.v, ...this.v];\n this.touch();\n }\n\n private touch(): void {\n this.ver++;\n this.cachedInterval = 0;\n }\n\n at(i: number): Bar {\n if (!(i >= 0 && i < this.t.length) || !Number.isInteger(i)) throw new RangeError(`ArrayBarSource.at: index ${i} outside 0..${this.t.length - 1}`);\n return { time: this.t[i]!, open: this.o[i]!, high: this.h[i]!, low: this.l[i]!, close: this.c[i]!, volume: this.v[i]! };\n }\n\n /** First index with time >= t. */\n private lower(t: number): number {\n let lo = 0, hi = this.t.length;\n while (lo < hi) {\n const m = (lo + hi) >> 1;\n if (this.t[m]! < t) lo = m + 1;\n else hi = m;\n }\n return lo;\n }\n\n nearest(time: number): Bar | undefined {\n const n = this.t.length;\n if (n === 0) return undefined;\n const i = this.lower(time);\n if (i === 0) return this.at(0);\n if (i === n) return this.at(n - 1);\n return time - this.t[i - 1]! <= this.t[i]! - time ? this.at(i - 1) : this.at(i);\n }\n\n get interval(): number {\n if (this.cachedInterval > 0) return this.cachedInterval;\n const n = this.t.length;\n if (n < 2) throw new RangeError(\"ArrayBarSource.interval: needs at least two bars\");\n const d: number[] = [];\n for (let i = n - 1; i > 0 && d.length < 15; i--) d.push(this.t[i]! - this.t[i - 1]!);\n d.sort((a, b) => a - b);\n return (this.cachedInterval = d[d.length >> 1]!);\n }\n\n logical(time: number): number {\n const n = this.t.length;\n if (n === 0) throw new RangeError(\"ArrayBarSource.logical: no bars\");\n if (n === 1) return 0;\n if (time <= this.t[0]!) return (time - this.t[0]!) / this.interval;\n if (time >= this.t[n - 1]!) return n - 1 + (time - this.t[n - 1]!) / this.interval;\n const i = this.lower(time);\n const ti = this.t[i]!;\n if (ti === time) return i;\n const tp = this.t[i - 1]!;\n return i - 1 + (time - tp) / (ti - tp);\n }\n\n timeAtLogical(l: number): number {\n const n = this.t.length;\n if (n === 0) throw new RangeError(\"ArrayBarSource.timeAtLogical: no bars\");\n if (l <= 0) return this.t[0]! + l * this.interval;\n if (l >= n - 1) return this.t[n - 1]! + (l - (n - 1)) * this.interval;\n const i = Math.floor(l);\n return this.t[i]! + (l - i) * (this.t[i + 1]! - this.t[i]!);\n }\n\n range(from: number, to: number): [number, number] {\n const lo = this.lower(from);\n let hi = this.lower(to);\n if (hi < this.t.length && this.t[hi] === to) hi++;\n return [lo, Math.max(lo, hi)];\n }\n}\n","// Helpers shared by tool modules: anchor access, shape constructors, the\n// arithmetic behind every number a tool prints.\n\nimport type { Pt } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { BarSource } from \"../source.js\";\nimport type { Anchor, Drawing, DrawingStyle, Shape, Stroke, ToolCtx, ToolDef } from \"../types.js\";\n\n/** Anchor i of a drawing; a missing one is a bug in the caller, not a default. */\nexport function A(d: Drawing, i: number): Anchor {\n const a = d.anchors[i];\n if (!a) throw new Error(`drawings: ${d.tool} \"${d.id}\" has no anchor ${i} (has ${d.anchors.length})`);\n return a;\n}\n\nexport const px = (c: ToolCtx, a: Anchor): Pt => ({ x: c.X(a.time), y: c.Y(a.price) });\nexport const pxs = (c: ToolCtx, d: Drawing): Pt[] => d.anchors.map((a) => px(c, a));\n\nexport function prop<T>(d: Drawing, key: string): T {\n if (!(key in d.props)) throw new Error(`drawings: ${d.tool} \"${d.id}\" is missing prop \"${key}\"`);\n return d.props[key] as T;\n}\n\nexport function numProp(d: Drawing, key: string): number {\n const v = prop<unknown>(d, key);\n if (typeof v !== \"number\" || !Number.isFinite(v)) throw new TypeError(`drawings: ${d.tool} \"${d.id}\" prop \"${key}\" must be a finite number, got ${String(v)}`);\n return v;\n}\n\nexport function levelsProp(d: Drawing): number[] {\n const v = prop<unknown>(d, \"levels\");\n if (!Array.isArray(v) || v.some((x) => typeof x !== \"number\" || !Number.isFinite(x))) throw new TypeError(`drawings: ${d.tool} \"${d.id}\" prop \"levels\" must be an array of finite numbers`);\n return v as number[];\n}\n\n// ---- shapes -------------------------------------------------------------------\n\nexport function line(a: Pt, b: Pt, o: Stroke & { extA?: boolean; extB?: boolean } = {}): Shape {\n return { k: \"line\", x1: a.x, y1: a.y, x2: b.x, y2: b.y, ...o };\n}\n\nexport function poly(pts: readonly Pt[], o: Stroke & { close?: boolean; fill?: string | null } = {}): Shape {\n const flat: number[] = [];\n for (const p of pts) flat.push(p.x, p.y);\n return { k: \"poly\", pts: flat, ...o };\n}\n\n/** A filled polygon with no outline and no hit-test (bands, shading). */\nexport function shade(pts: readonly Pt[], fill: string): Shape {\n return poly(pts, { close: true, fill, width: 0, hit: false });\n}\n\nexport function text(x: number, y: number, t: string, o: Omit<Extract<Shape, { k: \"text\" }>, \"k\" | \"x\" | \"y\" | \"text\"> = {}): Shape {\n return { k: \"text\", x, y, text: t, ...o };\n}\n\n/** Filled arrow head at b for a shaft from a (hit-test off: the shaft carries the hit). */\nexport function head(a: Pt, b: Pt, size: number, color: string): Shape {\n const ang = Math.atan2(b.y - a.y, b.x - a.x), s = 0.45;\n return poly(\n [b, { x: b.x - size * Math.cos(ang - s), y: b.y - size * Math.sin(ang - s) }, { x: b.x - size * Math.cos(ang + s), y: b.y - size * Math.sin(ang + s) }],\n { close: true, fill: color, color, width: 0, hit: false },\n );\n}\n\n/** extendLeft/extendRight are in time terms: map them to the ends of the segment a→b (a may be the later one). */\nexport function extension(style: DrawingStyle, a: Pt, b: Pt): { extA: boolean; extB: boolean } {\n const aIsLeft = a.x <= b.x;\n return { extA: aIsLeft ? style.extendLeft : style.extendRight, extB: aIsLeft ? style.extendRight : style.extendLeft };\n}\n\nexport const lerp = (a: Pt, b: Pt, t: number): Pt => ({ x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t });\nexport const mid = (a: Pt, b: Pt): Pt => lerp(a, b, 0.5);\n\nexport function fillOf(style: DrawingStyle, alpha = 0.15): string {\n return style.fill ?? withAlpha(style.color, alpha);\n}\n\n// ---- readouts -----------------------------------------------------------------\n\nexport function fmtTime(t: number): string {\n if (!Number.isFinite(t)) throw new RangeError(`fmtTime: ${t}`);\n return new Date(t).toISOString().slice(0, 16).replace(\"T\", \" \");\n}\n\n/** Whole days/hours/minutes (seconds under a minute) of a duration in ms. */\nexport function fmtDuration(ms: number): string {\n const s = Math.round(Math.abs(ms) / 1000);\n if (s < 60) return `${s}s`;\n const d = Math.floor(s / 86400), h = Math.floor((s % 86400) / 3600), m = Math.floor((s % 3600) / 60);\n return [d ? `${d}d` : \"\", h ? `${h}h` : \"\", m ? `${m}m` : \"\"].filter(Boolean).join(\" \");\n}\n\nexport interface Measure {\n dPrice: number;\n /** Δ/|from|·100, or null when the start price is 0. */\n pct: number | null;\n /** Bars from a0 to a1 (fractional between bars), or null without a bar source. */\n bars: number | null;\n dTime: number;\n}\n\nexport function measure(a0: Anchor, a1: Anchor, source: BarSource | null): Measure {\n const dPrice = a1.price - a0.price;\n return {\n dPrice,\n pct: a0.price === 0 ? null : (dPrice / Math.abs(a0.price)) * 100,\n bars: source && source.length > 0 ? source.logical(a1.time) - source.logical(a0.time) : null,\n dTime: a1.time - a0.time,\n };\n}\n\nconst sign = (v: number) => (v < 0 ? \"-\" : v > 0 ? \"+\" : \"\");\n\nexport function barsText(bars: number): string {\n const r = Math.round(bars);\n return Math.abs(bars - r) < 1e-9 ? `${r}` : bars.toFixed(1);\n}\n\n/** \"+12.50 (+0.05%)\", then \"34 bars, 2h 5m\" when known. */\nexport function measureLines(m: Measure, c: ToolCtx): string[] {\n const pct = m.pct === null ? \"\" : ` (${sign(m.pct)}${Math.abs(m.pct).toFixed(2)}%)`;\n const out = [`${sign(m.dPrice)}${c.fmt(Math.abs(m.dPrice))}${pct}`];\n const tail = [m.bars === null ? \"\" : `${barsText(m.bars)} bars`, fmtDuration(m.dTime)].filter(Boolean).join(\", \");\n out.push(tail);\n return out;\n}\n\n/** Ratio b/a of two price moves, or null when a is 0. */\nexport function ratio(num: number, den: number): number | null {\n return den === 0 ? null : num / den;\n}\n\nexport function ratioText(r: number | null): string {\n return r === null ? \"n/a\" : (Math.round(r * 1000) / 1000).toString();\n}\n\nexport const FIB_COLORS: Record<string, string> = {\n \"0\": \"#787b86\", \"0.236\": \"#f23645\", \"0.382\": \"#ff9800\", \"0.5\": \"#4caf50\", \"0.618\": \"#089981\", \"0.786\": \"#00bcd4\",\n \"1\": \"#787b86\", \"1.272\": \"#9c27b0\", \"1.618\": \"#2962ff\", \"2\": \"#e91e63\", \"2.618\": \"#f23645\", \"3.618\": \"#9c27b0\", \"4.236\": \"#e91e63\",\n};\nexport const fibColor = (r: number): string => FIB_COLORS[String(r)] ?? \"#787b86\";\n\nexport const FIB_RETRACEMENT = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1, 1.618, 2.618, 3.618, 4.236];\nexport const FIB_BASIC = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1];\n\n/** Tool factory: fills the optional members so definitions stay short. */\nexport function tool(t: ToolDef): ToolDef {\n return t;\n}\n\nexport const lineDefaults = (style: Partial<DrawingStyle> = {}, props: Record<string, unknown> = {}) => () => ({ style, props });\n\nexport function needDistinctTimes(d: Drawing, i: number, j: number): void {\n if (A(d, i).time === A(d, j).time) throw new RangeError(`drawings: ${d.tool} \"${d.id}\" needs anchors ${i} and ${j} at different times`);\n}\n\n/** Validate every anchor is finite. */\nexport function finiteAnchors(d: Drawing): void {\n d.anchors.forEach((a, i) => {\n if (!Number.isFinite(a.time) || !Number.isFinite(a.price)) throw new TypeError(`drawings: ${d.tool} \"${d.id}\" anchor ${i} is not finite (${a.time}, ${a.price})`);\n });\n}\n","// Annotations: text, anchored text, note, anchored note, callout, comment,\n// price label, price note, signpost, flag mark, arrow, arrow marker, arrow\n// mark up, arrow mark down.\n//\n// \"Anchored\" text and notes are positioned on the pane (props.fx / props.fy,\n// fractions of its size) and stay put while the chart pans; every other tool\n// here is fixed to time + price.\n\nimport type { Pt } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { Drawing, Shape, ToolCtx, ToolDef } from \"../types.js\";\nimport { A, finiteAnchors, head, line, poly, px, pxs, text, tool } from \"./util.js\";\n\nconst BOX = { border: null, pad: 5 } as const;\n\nfunction content(d: Drawing, fallback: string): string {\n return d.style.text || fallback;\n}\n\nfunction screenPoint(d: Drawing, c: ToolCtx): Pt {\n const fx = d.props.fx, fy = d.props.fy;\n if (typeof fx !== \"number\" || typeof fy !== \"number\" || !Number.isFinite(fx) || !Number.isFinite(fy)) throw new TypeError(`drawings: ${d.tool} \"${d.id}\" needs numeric props fx and fy`);\n return { x: fx * c.W, y: fy * c.H };\n}\n\nexport const textTool = tool({\n id: \"text\", label: \"Text\", family: \"annotations\", gesture: \"single\", anchors: 1,\n defaults: () => ({ style: { text: \"Text\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n return [text(p.x, p.y, content(d, \"Text\"), { align: \"left\", base: \"middle\", textColor: d.style.color })];\n },\n});\n\nexport const anchoredText = tool({\n id: \"anchoredText\", label: \"Anchored text\", family: \"annotations\", gesture: \"single\", anchors: 0, screen: true,\n defaults: () => ({ style: { text: \"Text\" }, props: { fx: 0.5, fy: 0.5 } }),\n shapes(d, c) {\n const p = screenPoint(d, c);\n return [text(p.x, p.y, content(d, \"Text\"), { align: \"left\", base: \"middle\", textColor: d.style.color })];\n },\n});\n\nfunction noteShapes(d: Drawing, p: Pt): Shape[] {\n return [\n line(p, { x: p.x + 14, y: p.y - 14 }, { width: 1 }),\n { k: \"ellipse\", cx: p.x, cy: p.y, rx: 3, ry: 3, fill: d.style.color, width: 1 },\n text(p.x + 14, p.y - 14, content(d, \"Note\"), { align: \"left\", base: \"bottom\", bg: withAlpha(d.style.color, 0.9), textColor: \"#ffffff\", ...BOX }),\n ];\n}\n\nexport const note = tool({\n id: \"note\", label: \"Note\", family: \"annotations\", gesture: \"single\", anchors: 1,\n defaults: () => ({ style: { text: \"Note\" } }),\n validate: finiteAnchors,\n shapes: (d, c) => noteShapes(d, px(c, A(d, 0))),\n});\n\nexport const anchoredNote = tool({\n id: \"anchoredNote\", label: \"Anchored note\", family: \"annotations\", gesture: \"single\", anchors: 0, screen: true,\n defaults: () => ({ style: { text: \"Note\" }, props: { fx: 0.5, fy: 0.5 } }),\n shapes: (d, c) => noteShapes(d, screenPoint(d, c)),\n});\n\nexport const callout = tool({\n id: \"callout\", label: \"Callout\", family: \"annotations\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { text: \"Callout\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [target, boxAt] = pxs(c, d) as [Pt, Pt];\n return [\n line(boxAt, target, { width: 1 }),\n { k: \"ellipse\", cx: target.x, cy: target.y, rx: 3, ry: 3, fill: d.style.color, width: 1 },\n text(boxAt.x, boxAt.y, content(d, \"Callout\"), { align: \"center\", base: \"middle\", bg: withAlpha(d.style.color, 0.9), textColor: \"#ffffff\", ...BOX }),\n ];\n },\n});\n\nexport const comment = tool({\n id: \"comment\", label: \"Comment\", family: \"annotations\", gesture: \"single\", anchors: 1,\n defaults: () => ({ style: { text: \"Comment\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n return [\n poly([p, { x: p.x - 6, y: p.y - 14 }, { x: p.x + 6, y: p.y - 14 }], { close: true, fill: withAlpha(d.style.color, 0.9), width: 0, hit: false }),\n text(p.x, p.y - 14, content(d, \"Comment\"), { align: \"center\", base: \"bottom\", bg: withAlpha(d.style.color, 0.9), textColor: \"#ffffff\", ...BOX }),\n ];\n },\n});\n\nexport const priceLabel = tool({\n id: \"priceLabel\", label: \"Price label\", family: \"annotations\", gesture: \"single\", anchors: 1,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n const label = `${d.style.text ? d.style.text + \" \" : \"\"}${c.fmt(A(d, 0).price)}`;\n return [\n poly([p, { x: p.x + 8, y: p.y - 9 }, { x: p.x + 8, y: p.y + 9 }], { close: true, fill: d.style.color, width: 0, hit: false }),\n text(p.x + 8, p.y, label, { align: \"left\", base: \"middle\", bg: d.style.color, textColor: \"#ffffff\", ...BOX }),\n ];\n },\n});\n\nexport const priceNote = tool({\n id: \"priceNote\", label: \"Price note\", family: \"annotations\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const a = px(c, A(d, 0)), b = px(c, A(d, 1));\n const label = `${d.style.text ? d.style.text + \" \" : \"\"}${c.fmt(A(d, 0).price)}`;\n return [\n line(a, { x: b.x, y: a.y }, { dash: \"dashed\", width: 1 }),\n line({ x: b.x, y: a.y }, b, { width: 1 }),\n { k: \"ellipse\", cx: a.x, cy: a.y, rx: 3, ry: 3, fill: d.style.color, width: 1 },\n text(b.x, b.y, label, { align: \"center\", base: \"middle\", bg: d.style.color, textColor: \"#ffffff\", ...BOX }),\n ];\n },\n});\n\nexport const signpost = tool({\n id: \"signpost\", label: \"Signpost\", family: \"annotations\", gesture: \"single\", anchors: 1,\n defaults: () => ({ style: { text: \"Sign\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n const top = { x: p.x, y: p.y - 44 };\n return [\n line(p, top),\n { k: \"ellipse\", cx: p.x, cy: p.y, rx: 3, ry: 3, fill: d.style.color, width: 1 },\n text(top.x, top.y, content(d, \"Sign\"), { align: \"left\", base: \"bottom\", bg: d.style.color, textColor: \"#ffffff\", ...BOX }),\n ];\n },\n});\n\nexport const flagMark = tool({\n id: \"flagMark\", label: \"Flag mark\", family: \"annotations\", gesture: \"single\", anchors: 1,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n return [\n line(p, { x: p.x, y: p.y - 28 }),\n poly([{ x: p.x, y: p.y - 28 }, { x: p.x + 16, y: p.y - 22 }, { x: p.x, y: p.y - 16 }], { close: true, fill: d.style.color }),\n ];\n },\n});\n\nexport const arrow = tool({\n id: \"arrow\", label: \"Arrow\", family: \"annotations\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b] = pxs(c, d) as [Pt, Pt];\n return [line(a, b), head(a, b, 6 + d.style.width * 2, d.style.color)];\n },\n});\n\nexport const arrowMarker = tool({\n id: \"arrowMarker\", label: \"Arrow marker\", family: \"annotations\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { fill: \"#2962ff\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b] = pxs(c, d) as [Pt, Pt];\n const L = Math.hypot(b.x - a.x, b.y - a.y);\n if (L === 0) return [line(a, b)];\n const ux = (b.x - a.x) / L, uy = (b.y - a.y) / L, nx = -uy, ny = ux;\n const hl = Math.min(L * 0.45, 20), sw = 4, hw = 10;\n const at = (along: number, across: number): Pt => ({ x: a.x + ux * along + nx * across, y: a.y + uy * along + ny * across });\n return [poly([at(0, sw), at(L - hl, sw), at(L - hl, hw), at(L, 0), at(L - hl, -hw), at(L - hl, -sw), at(0, -sw)], { close: true, fill: d.style.fill ?? d.style.color })];\n },\n});\n\nfunction markShape(d: Drawing, p: Pt, dirUp: boolean): Shape[] {\n const s = dirUp ? 1 : -1; // tip is the anchor; the body extends away from the tip\n const pts: Pt[] = [\n p, { x: p.x - 9, y: p.y + s * 11 }, { x: p.x - 4, y: p.y + s * 11 }, { x: p.x - 4, y: p.y + s * 28 },\n { x: p.x + 4, y: p.y + s * 28 }, { x: p.x + 4, y: p.y + s * 11 }, { x: p.x + 9, y: p.y + s * 11 },\n ];\n return [poly(pts, { close: true, fill: d.style.color, width: 1 })];\n}\n\nexport const arrowMarkUp = tool({\n id: \"arrowMarkUp\", label: \"Arrow mark up\", family: \"annotations\", gesture: \"single\", anchors: 1,\n defaults: () => ({ style: { color: \"#26a69a\" } }),\n validate: finiteAnchors,\n shapes: (d, c) => markShape(d, px(c, A(d, 0)), true),\n});\n\nexport const arrowMarkDown = tool({\n id: \"arrowMarkDown\", label: \"Arrow mark down\", family: \"annotations\", gesture: \"single\", anchors: 1,\n defaults: () => ({ style: { color: \"#ef5350\" } }),\n validate: finiteAnchors,\n shapes: (d, c) => markShape(d, px(c, A(d, 0)), false),\n});\n\nexport const annotationTools: ToolDef[] = [\n textTool, anchoredText, note, anchoredNote, callout, comment, priceLabel, priceNote, signpost, flagMark, arrow, arrowMarker, arrowMarkUp, arrowMarkDown,\n];\n","// Channels and pitchforks: parallel channel, regression trend channel,\n// flat top/bottom, disjoint channel; pitchfork (standard, Schiff, modified\n// Schiff, inside) and pitchfan.\n\nimport type { Pt } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { BarSource } from \"../source.js\";\nimport type { Drawing, Shape, ToolCtx, ToolDef } from \"../types.js\";\nimport { A, FIB_BASIC, fibColor, fillOf, finiteAnchors, lerp, line, mid, needDistinctTimes, px, pxs, shade, text, tool } from \"./util.js\";\n\n/** y of the line through p0, p1 at x. */\nconst lineY = (p0: Pt, p1: Pt, x: number): number => p0.y + ((p1.y - p0.y) * (x - p0.x)) / (p1.x - p0.x);\n\n/** x range a channel is drawn over: its anchors, or the whole pane when extended. */\nfunction span(d: Drawing, p0: Pt, p1: Pt, c: ToolCtx): [number, number] {\n const lo = Math.min(p0.x, p1.x), hi = Math.max(p0.x, p1.x);\n return [d.style.extendLeft ? -10 : lo, d.style.extendRight ? c.W + 10 : hi];\n}\n\nexport const parallelChannel = tool({\n id: \"parallelChannel\", label: \"Parallel channel\", family: \"channels\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({ style: { fill: null }, props: { midline: true } }),\n validate(d) {\n finiteAnchors(d);\n needDistinctTimes(d, 0, 1);\n },\n shapes(d, c) {\n const [p0, p1, p2] = pxs(c, d) as [Pt, Pt, Pt];\n const off = p2.y - lineY(p0, p1, p2.x);\n const [xa, xb] = span(d, p0, p1, c);\n const base = (o: number): [Pt, Pt] => [{ x: xa, y: lineY(p0, p1, xa) + o }, { x: xb, y: lineY(p0, p1, xb) + o }];\n const [a0, a1] = base(0), [b0, b1] = base(off);\n const out: Shape[] = [shade([a0, a1, b1, b0], fillOf(d.style, 0.12)), line(a0, a1), line(b0, b1)];\n if (d.props.midline !== false) {\n const [m0, m1] = base(off / 2);\n out.push(line(m0, m1, { dash: \"dashed\", width: Math.max(1, d.style.width * 0.66) }));\n }\n return out;\n },\n});\n\nexport interface Regression {\n slope: number;\n intercept: number;\n /** Population standard deviation of the residuals. */\n sigma: number;\n n: number;\n}\n\n/** Ordinary least squares of y on x = 0..n-1. */\nexport function regression(y: readonly number[]): Regression {\n const n = y.length;\n if (n < 2) throw new RangeError(`regression: needs at least 2 values, got ${n}`);\n const mx = (n - 1) / 2;\n let my = 0;\n for (const v of y) my += v;\n my /= n;\n let sxy = 0, sxx = 0;\n for (let i = 0; i < n; i++) {\n sxy += (i - mx) * (y[i]! - my);\n sxx += (i - mx) * (i - mx);\n }\n const slope = sxy / sxx;\n const intercept = my - slope * mx;\n let ss = 0;\n for (let i = 0; i < n; i++) {\n const r = y[i]! - (intercept + slope * i);\n ss += r * r;\n }\n return { slope, intercept, sigma: Math.sqrt(ss / n), n };\n}\n\nexport function regressionOf(source: BarSource, t0: number, t1: number): { reg: Regression; lo: number; hi: number } {\n const [lo, hi] = source.range(Math.min(t0, t1), Math.max(t0, t1));\n if (hi - lo < 2) throw new RangeError(`regression channel: only ${hi - lo} bar(s) between the anchors`);\n const closes: number[] = [];\n for (let i = lo; i < hi; i++) closes.push(source.at(i).close);\n return { reg: regression(closes), lo, hi };\n}\n\nexport const regressionTrendChannel = tool({\n id: \"regressionTrendChannel\", label: \"Regression trend channel\", family: \"channels\", gesture: \"drag\", anchors: 2, needsSource: true,\n defaults: () => ({ props: { deviations: 2 } }),\n validate(d) {\n finiteAnchors(d);\n needDistinctTimes(d, 0, 1);\n const k = d.props.deviations;\n if (typeof k !== \"number\" || !(k > 0)) throw new RangeError(`drawings: regressionTrendChannel \"${d.id}\" prop \"deviations\" must be > 0`);\n },\n shapes(d, c) {\n if (!c.source) throw new Error(\"regressionTrendChannel needs a BarSource\");\n const { reg, lo, hi } = regressionOf(c.source, A(d, 0).time, A(d, 1).time);\n const k = d.props.deviations as number;\n const tFirst = c.source.at(lo).time, tLast = c.source.at(hi - 1).time;\n const at = (i: number, dev: number) => ({ x: 0, y: c.Y(reg.intercept + reg.slope * i + dev * reg.sigma) });\n const xa = c.X(tFirst), xb = c.X(tLast);\n const seg = (dev: number): [Pt, Pt] => [{ x: xa, y: at(0, dev).y }, { x: xb, y: at(hi - lo - 1, dev).y }];\n const [u0, u1] = seg(k), [m0, m1] = seg(0), [l0, l1] = seg(-k);\n return [\n shade([u0, u1, l1, l0], fillOf(d.style, 0.1)),\n line(u0, u1), line(l0, l1),\n line(m0, m1, { dash: \"dashed\" }),\n ];\n },\n});\n\nexport const flatTopBottom = tool({\n id: \"flatTopBottom\", label: \"Flat top/bottom\", family: \"channels\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({}),\n validate(d) {\n finiteAnchors(d);\n needDistinctTimes(d, 0, 1);\n },\n shapes(d, c) {\n const [p0, p1, p2] = pxs(c, d) as [Pt, Pt, Pt];\n const y = p2.y;\n return [shade([p0, p1, { x: p1.x, y }, { x: p0.x, y }], fillOf(d.style, 0.12)), line(p0, p1), line({ x: p0.x, y }, { x: p1.x, y })];\n },\n});\n\nexport const disjointChannel = tool({\n id: \"disjointChannel\", label: \"Disjoint channel\", family: \"channels\", gesture: \"clicks\", anchors: 4,\n defaults: () => ({}),\n validate(d) {\n finiteAnchors(d);\n needDistinctTimes(d, 0, 1);\n },\n shapes(d, c) {\n const [p0, p1, p2, p3] = pxs(c, d) as [Pt, Pt, Pt, Pt];\n return [shade([p0, p1, p3, p2], fillOf(d.style, 0.12)), line(p0, p1), line(p2, p3)];\n },\n});\n\n// ---- pitchforks ---------------------------------------------------------------\n\nexport type ForkVariant = \"standard\" | \"schiff\" | \"modifiedSchiff\" | \"inside\";\n\n/**\n * Where the median line starts and the points the two outer tines pass\n * through. The median always runs to the midpoint M of B and C; tines are\n * parallel to it.\n * - standard: from A; tines through B and C.\n * - schiff: from (A.x, midpoint price of A and B).\n * - modifiedSchiff: from the midpoint of A and B.\n * - inside: from A; tines through the midpoints of A–B and A–C.\n */\nexport function forkGeometry(v: ForkVariant, a: Pt, b: Pt, cc: Pt): { origin: Pt; m: Pt; t1: Pt; t2: Pt } {\n const m = mid(b, cc);\n switch (v) {\n case \"standard\": return { origin: a, m, t1: b, t2: cc };\n case \"schiff\": return { origin: { x: a.x, y: (a.y + b.y) / 2 }, m, t1: b, t2: cc };\n case \"modifiedSchiff\": return { origin: mid(a, b), m, t1: b, t2: cc };\n case \"inside\": return { origin: a, m, t1: mid(a, b), t2: mid(a, cc) };\n }\n}\n\nfunction forkTool(id: string, label: string, v: ForkVariant): ToolDef {\n return tool({\n id, label, family: \"pitchforks\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b, cc] = pxs(c, d) as [Pt, Pt, Pt];\n const g = forkGeometry(v, a, b, cc);\n const u = { x: g.m.x - g.origin.x, y: g.m.y - g.origin.y };\n if (u.x === 0 && u.y === 0) throw new RangeError(`drawings: ${id} \"${d.id}\" has a zero-length median`);\n const ahead = (p: Pt): Pt => ({ x: p.x + u.x, y: p.y + u.y });\n // Bands out to the pane edge along the median direction.\n const far = (p: Pt): Pt => {\n const k = u.x > 0 ? (c.W + 50 - p.x) / u.x : u.x < 0 ? (-50 - p.x) / u.x : 1e4;\n return { x: p.x + u.x * k, y: p.y + u.y * k };\n };\n const fo = far(g.origin);\n return [\n shade([g.origin, g.t1, far(g.t1), fo], withAlpha(d.style.color, 0.08)),\n shade([g.origin, g.t2, far(g.t2), fo], withAlpha(d.style.color, 0.08)),\n line(g.origin, ahead(g.origin), { extB: true }),\n line(g.t1, ahead(g.t1), { extB: true }),\n line(g.t2, ahead(g.t2), { extB: true }),\n line(b, cc, { dash: \"dashed\", width: 1 }),\n line(a, b, { dash: \"dotted\", width: 1, hit: false }),\n ];\n },\n });\n}\n\nexport const pitchfork = forkTool(\"pitchfork\", \"Pitchfork\", \"standard\");\nexport const schiffPitchfork = forkTool(\"schiffPitchfork\", \"Schiff pitchfork\", \"schiff\");\nexport const modifiedSchiffPitchfork = forkTool(\"modifiedSchiffPitchfork\", \"Modified Schiff pitchfork\", \"modifiedSchiff\");\nexport const insidePitchfork = forkTool(\"insidePitchfork\", \"Inside pitchfork\", \"inside\");\n\nexport const pitchfan = tool({\n id: \"pitchfan\", label: \"Pitchfan\", family: \"pitchforks\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({ props: { levels: FIB_BASIC } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b, cc] = pxs(c, d) as [Pt, Pt, Pt];\n const levels = d.props.levels as number[];\n const out: Shape[] = [line(b, cc, { dash: \"dashed\", width: 1 })];\n const rays = levels.map((r) => {\n const p = lerp(b, cc, r);\n return { r, p };\n });\n for (let i = 0; i + 1 < rays.length; i++) {\n const u = rays[i]!.p, v = rays[i + 1]!.p;\n const far = (p: Pt): Pt => {\n const dx = p.x - a.x, dy = p.y - a.y;\n const k = dx > 0 ? (c.W + 50 - a.x) / dx : dx < 0 ? (-50 - a.x) / dx : 1e4;\n return { x: a.x + dx * k, y: a.y + dy * k };\n };\n out.push(shade([a, far(u), far(v)], withAlpha(fibColor(rays[i]!.r), 0.07)));\n }\n for (const { r, p } of rays) out.push(line(a, p, { extB: true, color: fibColor(r), width: r === 0.5 ? d.style.width : 1 }), text(p.x, p.y, String(r), { textColor: fibColor(r), size: 10, hit: false }));\n return out;\n },\n});\n\nexport const channelTools: ToolDef[] = [parallelChannel, regressionTrendChannel, flatTopBottom, disjointChannel, pitchfork, schiffPitchfork, modifiedSchiffPitchfork, insidePitchfork, pitchfan];\n","// Cycle tools: cyclic lines, time cycles, sine line.\n//\n// Periods are measured in x, which is linear in the bar index, so a\n// non-trading gap does not stretch a cycle.\n\nimport type { Pt } from \"../geometry.js\";\nimport type { Shape, ToolDef } from \"../types.js\";\nimport { finiteAnchors, line, needDistinctTimes, pxs, tool } from \"./util.js\";\n\n/** Most lines/arcs one cycle tool draws; a period this dense is not drawn. */\nconst MAX_REPEATS = 600;\nconst MIN_PERIOD_PX = 2;\n\nfunction period(p0: Pt, p1: Pt): number {\n const w = Math.abs(p1.x - p0.x);\n return w;\n}\n\nexport const cyclicLines = tool({\n id: \"cyclicLines\", label: \"Cyclic lines\", family: \"cycles\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: (d) => { finiteAnchors(d); needDistinctTimes(d, 0, 1); },\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const w = period(p0, p1);\n if (w < MIN_PERIOD_PX) return [line(p0, p1)];\n const first = Math.ceil((-50 - p0.x) / w), last = Math.floor((c.W + 50 - p0.x) / w);\n const out: Shape[] = [];\n for (let k = first; k <= last && out.length < MAX_REPEATS; k++) {\n const x = p0.x + k * w;\n out.push(line({ x, y: 0 }, { x, y: c.H }, { extA: true, extB: true }));\n }\n return out;\n },\n});\n\nexport const timeCycles = tool({\n id: \"timeCycles\", label: \"Time cycles\", family: \"cycles\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { fill: \"rgba(41,98,255,0.1)\" } }),\n validate: (d) => { finiteAnchors(d); needDistinctTimes(d, 0, 1); },\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const w = period(p0, p1);\n if (w < MIN_PERIOD_PX) return [line(p0, p1)];\n const out: Shape[] = [];\n // Half-ellipses of width one period and height half a period, repeating to the right of the first anchor.\n const dir = p1.x >= p0.x ? 1 : -1;\n for (let k = 0; k < MAX_REPEATS; k++) {\n const x0 = p0.x + dir * k * w;\n if (dir > 0 ? x0 > c.W + 50 : x0 < -50) break;\n out.push({ k: \"arc\", cx: x0 + (dir * w) / 2, cy: p0.y, r: w / 2, a0: Math.PI, a1: 2 * Math.PI, fill: d.style.fill });\n }\n return out;\n },\n});\n\n/** y of the sine through two consecutive extrema (x0,y0) and (x1,y1) at x. */\nexport function sineY(x0: number, y0: number, x1: number, y1: number, x: number): number {\n const m = (y0 + y1) / 2;\n return m + (y0 - m) * Math.cos((Math.PI * (x - x0)) / (x1 - x0));\n}\n\nexport const sineLine = tool({\n id: \"sineLine\", label: \"Sine line\", family: \"cycles\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: (d) => { finiteAnchors(d); needDistinctTimes(d, 0, 1); },\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n if (Math.abs(p1.x - p0.x) < MIN_PERIOD_PX) return [line(p0, p1)];\n const pts: number[] = [];\n for (let x = -4; x <= c.W + 4; x += 2) pts.push(x, sineY(p0.x, p0.y, p1.x, p1.y, x));\n return [{ k: \"poly\", pts }];\n },\n});\n\nexport const cycleTools: ToolDef[] = [cyclicLines, timeCycles, sineLine];\n","// Fibonacci tools: retracement, trend-based extension, channel, time zone,\n// speed resistance fan, trend-based time, circles, spiral, speed resistance\n// arcs, wedge.\n//\n// Level prices are exact arithmetic on the anchors (see the *Price helpers);\n// the screen position is the price scale's mapping of that price. Spacing in\n// time (time zones, trend-based time) is done in x, which is linear in the\n// bar index, so a weekend gap does not stretch a zone.\n\nimport type { Pt } from \"../geometry.js\";\nimport { dist } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { Anchor, Drawing, Shape, ToolDef } from \"../types.js\";\nimport { A, FIB_BASIC, FIB_RETRACEMENT, fibColor, fillOf, finiteAnchors, levelsProp, line, needDistinctTimes, px, pxs, shade, text, tool } from \"./util.js\";\n\n/** Retracement: level 0 is a1, level 1 is a0. */\nexport const fibRetracementPrice = (a0: Anchor, a1: Anchor, r: number): number => a1.price + (a0.price - a1.price) * r;\n\n/** Trend-based extension: level 0 is c, 1 projects the full a→b move from c. */\nexport const fibExtensionPrice = (a: Anchor, b: Anchor, c: Anchor, r: number): number => c.price + (b.price - a.price) * r;\n\nexport const FIB_SEQUENCE = [0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89];\nconst PHI = (1 + Math.sqrt(5)) / 2;\n\nconst lvl = (levels: number[]) => ({ props: { levels } });\n\nexport const fibRetracement = tool({\n id: \"fibRetracement\", label: \"Fib retracement\", family: \"fibonacci\", gesture: \"drag\", anchors: 2,\n defaults: () => lvl(FIB_RETRACEMENT),\n validate: (d) => { finiteAnchors(d); levelsProp(d); },\n shapes(d, c) {\n const a0 = A(d, 0), a1 = A(d, 1);\n const p0 = px(c, a0), p1 = px(c, a1);\n const xl = Math.min(p0.x, p1.x), xr = d.style.extendRight ? c.W + 10 : Math.max(p0.x, p1.x);\n const out: Shape[] = [line(p0, p1, { dash: \"dashed\", width: 1, color: \"#787b86\" })];\n const lv = levelsProp(d);\n const ys = lv.map((r) => c.Y(fibRetracementPrice(a0, a1, r)));\n for (let i = 0; i + 1 < lv.length; i++) out.push(shade([{ x: xl, y: ys[i]! }, { x: xr, y: ys[i]! }, { x: xr, y: ys[i + 1]! }, { x: xl, y: ys[i + 1]! }], withAlpha(fibColor(lv[i + 1]!), 0.07)));\n lv.forEach((r, i) => {\n const y = ys[i]!;\n out.push(line({ x: xl, y }, { x: xr, y }, { color: fibColor(r), width: 1 }));\n out.push(text(xl - 4, y, `${r} (${c.fmt(fibRetracementPrice(a0, a1, r))})`, { align: \"right\", base: \"middle\", textColor: fibColor(r), size: 10, hit: false }));\n });\n return out;\n },\n});\n\nexport const fibExtension = tool({\n id: \"fibExtension\", label: \"Trend-based Fib extension\", family: \"fibonacci\", gesture: \"clicks\", anchors: 3,\n defaults: () => lvl([0, 0.236, 0.382, 0.5, 0.618, 0.786, 1, 1.272, 1.618, 2, 2.618, 3.618, 4.236]),\n validate: (d) => { finiteAnchors(d); levelsProp(d); },\n shapes(d, c) {\n const [a, b, cc] = [A(d, 0), A(d, 1), A(d, 2)];\n const [pa, pb, pc] = [px(c, a), px(c, b), px(c, cc)];\n const xl = pc.x, xr = d.style.extendRight ? c.W + 10 : Math.max(pc.x, pb.x) + 40;\n const out: Shape[] = [line(pa, pb, { dash: \"dashed\", width: 1, color: \"#787b86\" }), line(pb, pc, { dash: \"dashed\", width: 1, color: \"#787b86\" })];\n const lv = levelsProp(d);\n const ys = lv.map((r) => c.Y(fibExtensionPrice(a, b, cc, r)));\n for (let i = 0; i + 1 < lv.length; i++) out.push(shade([{ x: xl, y: ys[i]! }, { x: xr, y: ys[i]! }, { x: xr, y: ys[i + 1]! }, { x: xl, y: ys[i + 1]! }], withAlpha(fibColor(lv[i + 1]!), 0.07)));\n lv.forEach((r, i) => {\n const y = ys[i]!;\n out.push(line({ x: xl, y }, { x: xr, y }, { color: fibColor(r), width: 1 }));\n out.push(text(xl - 4, y, `${r} (${c.fmt(fibExtensionPrice(a, b, cc, r))})`, { align: \"right\", base: \"middle\", textColor: fibColor(r), size: 10, hit: false }));\n });\n return out;\n },\n});\n\nexport const fibChannel = tool({\n id: \"fibChannel\", label: \"Fib channel\", family: \"fibonacci\", gesture: \"clicks\", anchors: 3,\n defaults: () => lvl([0, 0.236, 0.382, 0.5, 0.618, 0.786, 1, 1.618, 2.618]),\n validate(d) {\n finiteAnchors(d);\n levelsProp(d);\n needDistinctTimes(d, 0, 1);\n },\n shapes(d, c) {\n const [p0, p1, p2] = pxs(c, d) as [Pt, Pt, Pt];\n const base = p0.y + ((p1.y - p0.y) * (p2.x - p0.x)) / (p1.x - p0.x);\n const off = p2.y - base;\n const lv = levelsProp(d);\n const at = (r: number): [Pt, Pt] => [{ x: p0.x, y: p0.y + r * off }, { x: p1.x, y: p1.y + r * off }];\n const out: Shape[] = [];\n for (let i = 0; i + 1 < lv.length; i++) {\n const [a0, a1] = at(lv[i]!), [b0, b1] = at(lv[i + 1]!);\n out.push(shade([a0, a1, b1, b0], withAlpha(fibColor(lv[i + 1]!), 0.07)));\n }\n for (const r of lv) {\n const [a0, a1] = at(r);\n out.push(line(a0, a1, { extB: d.style.extendRight, extA: d.style.extendLeft, color: fibColor(r), width: 1 }), text(a1.x + 4, a1.y, String(r), { base: \"middle\", textColor: fibColor(r), size: 10, hit: false }));\n }\n return out;\n },\n});\n\nexport const fibTimeZone = tool({\n id: \"fibTimeZone\", label: \"Fib time zone\", family: \"fibonacci\", gesture: \"drag\", anchors: 2,\n defaults: () => lvl(FIB_SEQUENCE),\n validate(d) {\n finiteAnchors(d);\n levelsProp(d);\n needDistinctTimes(d, 0, 1);\n },\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const unit = p1.x - p0.x;\n const out: Shape[] = [];\n for (const n of levelsProp(d)) {\n const x = p0.x + n * unit;\n if (x < -50 || x > c.W + 50) continue;\n out.push(line({ x, y: 0 }, { x, y: c.H }, { extA: true, extB: true, color: n === 0 || n === 1 ? \"#787b86\" : \"#2962ff\", width: 1 }), text(x + 3, 3, String(n), { base: \"top\", size: 10, textColor: \"#787b86\", hit: false }));\n }\n out.push(line(p0, p1, { dash: \"dashed\", width: 1 }));\n return out;\n },\n});\n\nexport const FIB_FAN = [0.25, 0.382, 0.5, 0.618, 0.75, 1];\nexport const fibSpeedFan = tool({\n id: \"fibSpeedFan\", label: \"Fib speed resistance fan\", family: \"fibonacci\", gesture: \"drag\", anchors: 2,\n defaults: () => lvl(FIB_FAN),\n validate(d) {\n finiteAnchors(d);\n levelsProp(d);\n needDistinctTimes(d, 0, 1);\n if (A(d, 0).price === A(d, 1).price) throw new RangeError(`drawings: fibSpeedFan \"${d.id}\" needs anchors at different prices`);\n },\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const out: Shape[] = [\n shade([p0, { x: p1.x, y: p0.y }, p1, { x: p0.x, y: p1.y }], withAlpha(d.style.color, 0.05)),\n line(p0, { x: p1.x, y: p0.y }, { dash: \"dashed\", width: 1, hit: false }), line({ x: p1.x, y: p0.y }, p1, { dash: \"dashed\", width: 1, hit: false }),\n line(p1, { x: p0.x, y: p1.y }, { dash: \"dashed\", width: 1, hit: false }), line({ x: p0.x, y: p1.y }, p0, { dash: \"dashed\", width: 1, hit: false }),\n ];\n for (const r of levelsProp(d)) {\n const colour = fibColor(r === 0.25 ? 0.5 : r);\n const e1 = { x: p1.x, y: p0.y + r * (p1.y - p0.y) }, e2 = { x: p0.x + r * (p1.x - p0.x), y: p1.y };\n out.push(line(p0, e1, { extB: true, color: colour, width: 1 }), line(p0, e2, { extB: true, color: colour, width: 1 }), text(e1.x + 3, e1.y, String(r), { base: \"middle\", size: 10, textColor: colour, hit: false }));\n }\n return out;\n },\n});\n\nexport const fibTrendTime = tool({\n id: \"fibTrendTime\", label: \"Trend-based Fib time\", family: \"fibonacci\", gesture: \"clicks\", anchors: 3,\n defaults: () => lvl([0, 0.382, 0.5, 0.618, 1, 1.382, 1.618, 2, 2.382, 2.618, 3, 4.236]),\n validate(d) {\n finiteAnchors(d);\n levelsProp(d);\n needDistinctTimes(d, 0, 1);\n },\n shapes(d, c) {\n const [pa, pb, pc] = pxs(c, d) as [Pt, Pt, Pt];\n const unit = pb.x - pa.x;\n const out: Shape[] = [line(pa, pb, { dash: \"dashed\", width: 1, color: \"#787b86\" })];\n for (const r of levelsProp(d)) {\n const x = pc.x + r * unit;\n if (x < -50 || x > c.W + 50) continue;\n out.push(line({ x, y: 0 }, { x, y: c.H }, { extA: true, extB: true, color: fibColor(r), width: 1 }), text(x + 3, 3, String(r), { base: \"top\", size: 10, textColor: fibColor(r), hit: false }));\n }\n return out;\n },\n});\n\nexport const fibCircles = tool({\n id: \"fibCircles\", label: \"Fib circles\", family: \"fibonacci\", gesture: \"drag\", anchors: 2,\n defaults: () => lvl([0.236, 0.382, 0.5, 0.618, 0.786, 1, 1.618, 2.618]),\n validate(d) {\n finiteAnchors(d);\n levelsProp(d);\n },\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const base = dist(p0.x, p0.y, p1.x, p1.y);\n const out: Shape[] = [line(p0, p1, { dash: \"dashed\", width: 1, color: \"#787b86\" })];\n for (const r of levelsProp(d)) {\n out.push({ k: \"ellipse\", cx: p0.x, cy: p0.y, rx: base * r, ry: base * r, color: fibColor(r), width: 1 }, text(p0.x + base * r, p0.y, String(r), { size: 10, base: \"bottom\", textColor: fibColor(r), hit: false }));\n }\n return out;\n },\n});\n\nexport const fibSpiral = tool({\n id: \"fibSpiral\", label: \"Fib spiral\", family: \"fibonacci\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ props: { clockwise: false } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const r0 = dist(p0.x, p0.y, p1.x, p1.y);\n if (r0 === 0) return [line(p0, p1)];\n const th0 = Math.atan2(p1.y - p0.y, p1.x - p0.x);\n const dir = d.props.clockwise === true ? 1 : -1;\n // r(θ) = r0·φ^(2θ/π): the golden spiral, growing by φ every quarter turn.\n const maxR = 2 * Math.hypot(c.W, c.H);\n const thMax = Math.min(8 * Math.PI, (Math.log(maxR / r0) * Math.PI) / (2 * Math.log(PHI)));\n const pts: Pt[] = [];\n for (let th = -3 * Math.PI; th <= thMax; th += 0.08) {\n const r = r0 * Math.pow(PHI, (2 * th) / Math.PI);\n pts.push({ x: p0.x + r * Math.cos(th0 + dir * th), y: p0.y + r * Math.sin(th0 + dir * th) });\n }\n return [line(p0, p1, { dash: \"dashed\", width: 1 }), { k: \"poly\", pts: pts.flatMap((p) => [p.x, p.y]) }];\n },\n});\n\nexport const FIB_ARCS = [0.382, 0.5, 0.618, 1, 1.382, 1.618];\nexport const fibSpeedArcs = tool({\n id: \"fibSpeedArcs\", label: \"Fib speed resistance arcs\", family: \"fibonacci\", gesture: \"drag\", anchors: 2,\n defaults: () => lvl(FIB_ARCS),\n validate: (d) => { finiteAnchors(d); levelsProp(d); },\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const base = dist(p0.x, p0.y, p1.x, p1.y);\n const th = Math.atan2(p1.y - p0.y, p1.x - p0.x);\n const out: Shape[] = [line(p0, p1, { dash: \"dashed\", width: 1, color: \"#787b86\" })];\n for (const r of levelsProp(d)) {\n out.push({ k: \"arc\", cx: p1.x, cy: p1.y, r: base * r, a0: th - Math.PI / 2, a1: th + Math.PI / 2, color: fibColor(r), width: 1 });\n out.push(text(p1.x + base * r * Math.cos(th), p1.y + base * r * Math.sin(th), String(r), { size: 10, base: \"middle\", textColor: fibColor(r), hit: false }));\n }\n return out;\n },\n});\n\nexport const fibWedge = tool({\n id: \"fibWedge\", label: \"Fib wedge\", family: \"fibonacci\", gesture: \"clicks\", anchors: 3,\n defaults: () => lvl([0.236, 0.382, 0.5, 0.618, 0.786, 1, 1.618]),\n validate: (d) => { finiteAnchors(d); levelsProp(d); },\n shapes(d, c) {\n const [p0, p1, p2] = pxs(c, d) as [Pt, Pt, Pt];\n const base = dist(p0.x, p0.y, p1.x, p1.y);\n const t1 = Math.atan2(p1.y - p0.y, p1.x - p0.x), t2 = Math.atan2(p2.y - p0.y, p2.x - p0.x);\n // Sweep the shorter way from arm 1 to arm 2.\n const delta = ((((t2 - t1 + Math.PI) % (2 * Math.PI)) + 2 * Math.PI) % (2 * Math.PI)) - Math.PI;\n const out: Shape[] = [line(p0, p1, { extB: true }), line(p0, p2, { extB: true })];\n for (const r of levelsProp(d)) out.push({ k: \"arc\", cx: p0.x, cy: p0.y, r: base * r, a0: t1, a1: t1 + delta, color: fibColor(r), width: 1 });\n return out;\n },\n});\n\nexport const fibTools: ToolDef[] = [fibRetracement, fibExtension, fibChannel, fibTimeZone, fibSpeedFan, fibTrendTime, fibCircles, fibSpiral, fibSpeedArcs, fibWedge];\nexport { FIB_BASIC, fillOf };\nexport type { Drawing };\n","// Figures: rectangle, rotated rectangle, ellipse, circle, triangle, arc,\n// curve, double curve, polyline, path, brush, highlighter.\n\nimport { circumcircle, controlThrough, dist, quadPoints, type Pt } from \"../geometry.js\";\nimport type { Shape, ToolDef } from \"../types.js\";\nimport { A, finiteAnchors, head, line, mid, needDistinctTimes, poly, px, pxs, text, tool } from \"./util.js\";\n\nconst FILL = \"rgba(41,98,255,0.15)\";\n\n/** Style text centred in a box when the drawing has any. */\nfunction inner(textValue: string, p: Pt): Shape[] {\n return textValue ? [text(p.x, p.y, textValue, { align: \"center\", base: \"middle\", hit: false })] : [];\n}\n\nexport const rectangle = tool({\n id: \"rectangle\", label: \"Rectangle\", family: \"shapes\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { fill: FILL } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n return [poly([p0, { x: p1.x, y: p0.y }, p1, { x: p0.x, y: p1.y }], { close: true, fill: d.style.fill }), ...inner(d.style.text, mid(p0, p1))];\n },\n});\n\n/** Corners of the rectangle with edge a→b and perpendicular extent through c. */\nexport function rotatedRectCorners(a: Pt, b: Pt, c: Pt): [Pt, Pt, Pt, Pt] {\n const dx = b.x - a.x, dy = b.y - a.y;\n const len = Math.hypot(dx, dy);\n if (len === 0) throw new RangeError(\"rotated rectangle: its first two anchors coincide\");\n const nx = -dy / len, ny = dx / len;\n const w = (c.x - a.x) * nx + (c.y - a.y) * ny;\n return [a, b, { x: b.x + nx * w, y: b.y + ny * w }, { x: a.x + nx * w, y: a.y + ny * w }];\n}\n\nexport const rotatedRectangle = tool({\n id: \"rotatedRectangle\", label: \"Rotated rectangle\", family: \"shapes\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({ style: { fill: FILL } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b, cc] = pxs(c, d) as [Pt, Pt, Pt];\n const q = rotatedRectCorners(a, b, cc);\n return [poly(q, { close: true, fill: d.style.fill }), ...inner(d.style.text, mid(q[0], q[2]))];\n },\n});\n\nexport const ellipse = tool({\n id: \"ellipse\", label: \"Ellipse\", family: \"shapes\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { fill: FILL } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const m = mid(p0, p1);\n return [{ k: \"ellipse\", cx: m.x, cy: m.y, rx: Math.abs(p1.x - p0.x) / 2, ry: Math.abs(p1.y - p0.y) / 2, fill: d.style.fill }, ...inner(d.style.text, m)];\n },\n});\n\nexport const circle = tool({\n id: \"circle\", label: \"Circle\", family: \"shapes\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { fill: FILL } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const r = dist(p0.x, p0.y, p1.x, p1.y);\n return [{ k: \"ellipse\", cx: p0.x, cy: p0.y, rx: r, ry: r, fill: d.style.fill }, line(p0, p1, { dash: \"dotted\", width: 1, hit: false }), ...inner(d.style.text, p0)];\n },\n});\n\nexport const triangle = tool({\n id: \"triangle\", label: \"Triangle\", family: \"shapes\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({ style: { fill: FILL } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const ps = pxs(c, d);\n return [poly(ps, { close: true, fill: d.style.fill })];\n },\n});\n\n/** Arc from a to b through m on their circumcircle: [cx, cy, r, from, to] in radians, or null when collinear. */\nexport function arcThrough(a: Pt, b: Pt, m: Pt): { cx: number; cy: number; r: number; a0: number; a1: number } | null {\n const cc = circumcircle(a, b, m);\n if (!cc) return null;\n const ang = (p: Pt) => Math.atan2(p.y - cc.cy, p.x - cc.cx);\n const norm = (x: number) => ((x % (2 * Math.PI)) + 2 * Math.PI) % (2 * Math.PI);\n const t0 = ang(a);\n const dEnd = norm(ang(b) - t0), dMid = norm(ang(m) - t0);\n // Increasing angle reaches m before b; otherwise sweep the other way round.\n return { ...cc, a0: t0, a1: dMid < dEnd ? t0 + dEnd : t0 - (2 * Math.PI - dEnd) };\n}\n\nexport const arc = tool({\n id: \"arc\", label: \"Arc\", family: \"shapes\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b, m] = pxs(c, d) as [Pt, Pt, Pt];\n const g = arcThrough(a, b, m);\n return g ? [{ k: \"arc\", cx: g.cx, cy: g.cy, r: g.r, a0: g.a0, a1: g.a1, fill: d.style.fill }] : [line(a, b)];\n },\n});\n\nexport const curve = tool({\n id: \"curve\", label: \"Curve\", family: \"shapes\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b, m] = pxs(c, d) as [Pt, Pt, Pt];\n return [{ k: \"poly\", pts: quadPoints(a, controlThrough(a, m, b), b) }];\n },\n});\n\nexport const doubleCurve = tool({\n id: \"doubleCurve\", label: \"Double curve\", family: \"shapes\", gesture: \"clicks\", anchors: 4,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n // Two quadratics joined at the midpoint of start and end; each passes through its bend anchor.\n const [a, b, m1, m2] = pxs(c, d) as [Pt, Pt, Pt, Pt];\n const j = mid(a, b);\n return [{ k: \"poly\", pts: [...quadPoints(a, controlThrough(a, m1, j), j), ...quadPoints(j, controlThrough(j, m2, b), b)] }];\n },\n});\n\nexport const polyline = tool({\n id: \"polyline\", label: \"Polyline\", family: \"shapes\", gesture: \"clicks\", anchors: 2, variable: true,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const ps = pxs(c, d);\n return [poly(ps, { close: d.style.fill !== null, fill: d.style.fill })];\n },\n});\n\nexport const path = tool({\n id: \"path\", label: \"Path\", family: \"shapes\", gesture: \"clicks\", anchors: 2, variable: true,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const ps = pxs(c, d);\n return [poly(ps), head(ps[ps.length - 2]!, ps[ps.length - 1]!, 6 + d.style.width * 2, d.style.color)];\n },\n});\n\nexport const brush = tool({\n id: \"brush\", label: \"Brush\", family: \"shapes\", gesture: \"freehand\", anchors: 2, variable: true, noHandles: true,\n defaults: () => ({ style: { width: 2 } }),\n validate: finiteAnchors,\n shapes: (d, c) => [poly(pxs(c, d))],\n});\n\nexport const highlighter = tool({\n id: \"highlighter\", label: \"Highlighter\", family: \"shapes\", gesture: \"freehand\", anchors: 2, variable: true, noHandles: true,\n defaults: () => ({ style: { width: 14, color: \"rgba(255,235,59,0.4)\" } }),\n validate: finiteAnchors,\n shapes: (d, c) => [poly(pxs(c, d))],\n});\n\nexport const figureTools: ToolDef[] = [rectangle, rotatedRectangle, ellipse, circle, triangle, arc, curve, doubleCurve, polyline, path, brush, highlighter];\nexport { A, needDistinctTimes, px };\n","// Gann tools: box, square fixed, square, fan.\n\nimport type { Pt } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { Anchor, Shape, ToolCtx, ToolDef } from \"../types.js\";\nimport { A, finiteAnchors, fmtTime, levelsProp, line, needDistinctTimes, px, pxs, shade, text, tool } from \"./util.js\";\n\nconst BOX_LEVELS = [0, 0.25, 0.382, 0.5, 0.618, 0.75, 1];\n\n/** Price at fraction r of the way from a0 to a1. */\nexport const gannBoxPrice = (a0: Anchor, a1: Anchor, r: number): number => a0.price + (a1.price - a0.price) * r;\n\n/** Gann fan: the line through a0 whose slope is num/den times the 1×1 slope (a0→a1); its price at a1's time. */\nexport const gannFanPrice = (a0: Anchor, a1: Anchor, num: number, den: number): number => a0.price + ((a1.price - a0.price) * num) / den;\n\nexport const GANN_RATIOS: ReadonlyArray<readonly [number, number]> = [[8, 1], [4, 1], [3, 1], [2, 1], [1, 1], [1, 2], [1, 3], [1, 4], [1, 8]];\n\nfunction grid(p0: Pt, p1: Pt, xs: number[], ys: number[], color: string): Shape[] {\n const out: Shape[] = [];\n for (const r of xs) out.push(line({ x: p0.x + r * (p1.x - p0.x), y: p0.y }, { x: p0.x + r * (p1.x - p0.x), y: p1.y }, { width: 1, color: withAlpha(color, 0.7) }));\n for (const r of ys) out.push(line({ x: p0.x, y: p0.y + r * (p1.y - p0.y) }, { x: p1.x, y: p0.y + r * (p1.y - p0.y) }, { width: 1, color: withAlpha(color, 0.7) }));\n return out;\n}\n\nexport const gannBox = tool({\n id: \"gannBox\", label: \"Gann box\", family: \"gann\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ props: { levels: BOX_LEVELS } }),\n validate: (d) => { finiteAnchors(d); needDistinctTimes(d, 0, 1); levelsProp(d); },\n shapes(d, c) {\n const a0 = A(d, 0), a1 = A(d, 1);\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const lv = levelsProp(d);\n // Horizontal lines sit at the scale's position of the labelled price, so label and line agree on any scale.\n const yAt = (r: number) => c.Y(gannBoxPrice(a0, a1, r));\n const out: Shape[] = [];\n for (let i = 0; i + 1 < lv.length; i += 2) {\n const ya = yAt(lv[i]!), yb = yAt(lv[i + 1]!);\n out.push(shade([{ x: p0.x, y: ya }, { x: p1.x, y: ya }, { x: p1.x, y: yb }, { x: p0.x, y: yb }], withAlpha(d.style.color, 0.06)));\n }\n out.push(...grid(p0, p1, lv, [], d.style.color));\n for (const r of lv) out.push(line({ x: p0.x, y: yAt(r) }, { x: p1.x, y: yAt(r) }, { width: 1, color: withAlpha(d.style.color, 0.7) }));\n out.push(line(p0, p1), line({ x: p0.x, y: p1.y }, { x: p1.x, y: p0.y }));\n out.push(line(p0, { x: p1.x, y: p0.y }), line({ x: p1.x, y: p0.y }, p1), line(p1, { x: p0.x, y: p1.y }), line({ x: p0.x, y: p1.y }, p0));\n for (const r of lv) {\n out.push(text(Math.min(p0.x, p1.x) - 4, yAt(r), c.fmt(gannBoxPrice(a0, a1, r)), { align: \"right\", base: \"middle\", size: 10, textColor: d.style.color, hit: false }));\n const x = p0.x + r * (p1.x - p0.x);\n out.push(text(x, Math.min(p0.y, p1.y) - 4, fmtTime(c.T(x)), { align: \"center\", base: \"bottom\", size: 9, textColor: d.style.color, hit: false }));\n }\n return out;\n },\n});\n\nconst DIV8 = [0, 1 / 8, 2 / 8, 3 / 8, 4 / 8, 5 / 8, 6 / 8, 7 / 8, 1];\n\nfunction squareShapes(p0: Pt, p1: Pt, color: string): Shape[] {\n const out = grid(p0, p1, DIV8, DIV8, color);\n const m = { x: (p0.x + p1.x) / 2, y: (p0.y + p1.y) / 2 };\n out.push(line(p0, p1, { extB: true }), line({ x: p0.x, y: p1.y }, { x: p1.x, y: p0.y }, { extB: true }));\n out.push(line({ x: m.x, y: p0.y }, { x: p1.x, y: m.y }, { width: 1 }), line({ x: p1.x, y: m.y }, { x: m.x, y: p1.y }, { width: 1 }), line({ x: m.x, y: p1.y }, { x: p0.x, y: m.y }, { width: 1 }), line({ x: p0.x, y: m.y }, { x: m.x, y: p0.y }, { width: 1 }));\n return out;\n}\n\nexport const gannSquare = tool({\n id: \"gannSquare\", label: \"Gann square\", family: \"gann\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: (d) => { finiteAnchors(d); needDistinctTimes(d, 0, 1); },\n shapes: (d, c) => {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n return squareShapes(p0, p1, d.style.color);\n },\n});\n\n/** The second corner of a fixed (screen-square) Gann square: same width and height in px. */\nfunction fixedCorner(d: { anchors: Anchor[] }, c: ToolCtx): Pt {\n const p0 = px(c, d.anchors[0]!), p1 = px(c, d.anchors[1]!);\n const side = Math.abs(p1.x - p0.x);\n return { x: p1.x, y: p0.y + (p1.y >= p0.y ? side : -side) };\n}\n\nexport const gannSquareFixed = tool({\n id: \"gannSquareFixed\", label: \"Gann square fixed\", family: \"gann\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: (d) => { finiteAnchors(d); needDistinctTimes(d, 0, 1); },\n handlePoints: (d, c) => [px(c, A(d, 0)), fixedCorner(d, c)],\n shapes: (d, c) => squareShapes(px(c, A(d, 0)), fixedCorner(d, c), d.style.color),\n});\n\nexport const gannFan = tool({\n id: \"gannFan\", label: \"Gann fan\", family: \"gann\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate(d) {\n finiteAnchors(d);\n needDistinctTimes(d, 0, 1);\n if (A(d, 0).price === A(d, 1).price) throw new RangeError(`drawings: gannFan \"${d.id}\" needs anchors at different prices (its 1×1 line would be flat)`);\n },\n shapes(d, c) {\n const a0 = A(d, 0), a1 = A(d, 1);\n const p0 = px(c, a0), x1 = c.X(a1.time);\n const out: Shape[] = [];\n const ends = GANN_RATIOS.map(([n, m]) => ({ n, m, e: { x: x1, y: c.Y(gannFanPrice(a0, a1, n, m)) } }));\n for (let i = 0; i + 1 < ends.length; i++) {\n const far = (e: Pt): Pt => {\n const dx = e.x - p0.x, dy = e.y - p0.y;\n const k = dx !== 0 ? (c.W + 50 - p0.x) / dx : 1e4;\n return { x: p0.x + dx * k, y: p0.y + dy * k };\n };\n if (x1 > p0.x) out.push(shade([p0, far(ends[i]!.e), far(ends[i + 1]!.e)], withAlpha(d.style.color, i % 2 ? 0.04 : 0.09)));\n }\n for (const { n, m, e } of ends) {\n out.push(line(p0, e, { extB: true, extA: false, width: n === m ? d.style.width : 1 }), text(e.x + 3, e.y, `${n}x${m}`, { base: \"middle\", size: 10, textColor: d.style.color, hit: false }));\n }\n return out;\n },\n});\n\nexport const gannTools: ToolDef[] = [gannBox, gannSquareFixed, gannSquare, gannFan];\n","// Line tools: trend line, ray, info line, extended line, horizontal line,\n// horizontal ray, vertical line, cross line.\n\nimport { crisp } from \"@alphacharts/core\";\nimport type { ToolDef } from \"../types.js\";\nimport { A, extension, finiteAnchors, fmtTime, line, measure, measureLines, needDistinctTimes, px, text, tool } from \"./util.js\";\n\nconst twoPoint = (d: Parameters<NonNullable<ToolDef[\"validate\"]>>[0]) => {\n finiteAnchors(d);\n};\n\nexport const trendLine = tool({\n id: \"trendLine\", label: \"Trend line\", family: \"lines\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: twoPoint,\n shapes: (d, c) => {\n const a = px(c, A(d, 0)), b = px(c, A(d, 1));\n return [line(a, b, extension(d.style, a, b))];\n },\n});\n\nexport const ray = tool({\n id: \"ray\", label: \"Ray\", family: \"lines\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { extendRight: true } }),\n validate: twoPoint,\n shapes: (d, c) => [line(px(c, A(d, 0)), px(c, A(d, 1)), { extA: false, extB: true })],\n});\n\nexport const extendedLine = tool({\n id: \"extendedLine\", label: \"Extended line\", family: \"lines\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { extendLeft: true, extendRight: true } }),\n validate: twoPoint,\n shapes: (d, c) => [line(px(c, A(d, 0)), px(c, A(d, 1)), { extA: true, extB: true })],\n});\n\nexport const infoLine = tool({\n id: \"infoLine\", label: \"Info line\", family: \"lines\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: twoPoint,\n shapes(d, c) {\n const a = A(d, 0), b = A(d, 1);\n const p = px(c, a), q = px(c, b);\n const m = measure(a, b, c.source);\n return [\n line(p, q, extension(d.style, p, q)),\n text((p.x + q.x) / 2, (p.y + q.y) / 2 - 8, [...measureLines(m, c), `${fmtTime(a.time)} → ${fmtTime(b.time)}`].join(\"\\n\"), {\n align: \"center\", base: \"bottom\", bg: d.style.color, border: null, textColor: \"#ffffff\", pad: 4,\n }),\n ];\n },\n});\n\nexport const horizontalLine = tool({\n id: \"horizontalLine\", label: \"Horizontal line\", family: \"lines\", gesture: \"single\", anchors: 1,\n defaults: () => ({}),\n validate: twoPoint,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n const y = crisp(p.y, c.dpr, d.style.width);\n return [\n line({ x: 0, y }, { x: c.W, y }, { extA: true, extB: true }),\n text(c.W - 6, y - 2, c.fmt(A(d, 0).price), { align: \"right\", base: \"bottom\", textColor: d.style.color, hit: false }),\n ];\n },\n});\n\nexport const horizontalRay = tool({\n id: \"horizontalRay\", label: \"Horizontal ray\", family: \"lines\", gesture: \"single\", anchors: 1,\n defaults: () => ({}),\n validate: twoPoint,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n const y = crisp(p.y, c.dpr, d.style.width);\n return [line({ x: p.x, y }, { x: p.x + 1, y }, { extB: true }), text(c.W - 6, y - 2, c.fmt(A(d, 0).price), { align: \"right\", base: \"bottom\", textColor: d.style.color, hit: false })];\n },\n});\n\nexport const verticalLine = tool({\n id: \"verticalLine\", label: \"Vertical line\", family: \"lines\", gesture: \"single\", anchors: 1,\n defaults: () => ({}),\n validate: twoPoint,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n const x = crisp(p.x, c.dpr, d.style.width);\n return [line({ x, y: 0 }, { x, y: c.H }, { extA: true, extB: true }), text(x + 4, 4, fmtTime(A(d, 0).time), { base: \"top\", textColor: d.style.color, hit: false })];\n },\n});\n\nexport const crossLine = tool({\n id: \"crossLine\", label: \"Cross line\", family: \"lines\", gesture: \"single\", anchors: 1,\n defaults: () => ({}),\n validate: twoPoint,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n const x = crisp(p.x, c.dpr, d.style.width), y = crisp(p.y, c.dpr, d.style.width);\n return [line({ x: 0, y }, { x: c.W, y }, { extA: true, extB: true }), line({ x, y: 0 }, { x, y: c.H }, { extA: true, extB: true })];\n },\n});\n\nexport const lineTools: ToolDef[] = [trendLine, ray, infoLine, extendedLine, horizontalLine, horizontalRay, verticalLine, crossLine];\nexport { needDistinctTimes };\n","// Measure tools: date range, price range, date & price range.\n//\n// The numbers are `measure()` of the two anchors: Δ price, Δ/|from|·100 %,\n// bars between the anchors' positions in the bar sequence (only when the\n// plugin has a BarSource) and the time difference.\n\nimport type { Pt } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { Drawing, ToolCtx, ToolDef } from \"../types.js\";\nimport { A, finiteAnchors, line, measure, measureLines, poly, pxs, text, tool, head, barsText, fmtDuration } from \"./util.js\";\n\nfunction colour(d: Drawing, dPrice: number): string {\n return dPrice < 0 ? \"#ef5350\" : d.style.color;\n}\n\nconst label = (x: number, y: number, t: string, col: string) =>\n text(x, y, t, { align: \"center\", base: \"middle\", bg: withAlpha(col, 0.9), textColor: \"#ffffff\", pad: 4, hit: false });\n\nfunction priceText(d: Drawing, c: ToolCtx): string {\n const m = measure(A(d, 0), A(d, 1), c.source);\n const sign = m.dPrice < 0 ? \"-\" : m.dPrice > 0 ? \"+\" : \"\";\n return `${sign}${c.fmt(Math.abs(m.dPrice))}${m.pct === null ? \"\" : ` (${sign}${Math.abs(m.pct).toFixed(2)}%)`}`;\n}\n\nfunction timeText(d: Drawing, c: ToolCtx): string {\n const m = measure(A(d, 0), A(d, 1), c.source);\n return [m.bars === null ? \"\" : `${barsText(m.bars)} bars`, fmtDuration(m.dTime)].filter(Boolean).join(\", \");\n}\n\nexport const dateRange = tool({\n id: \"dateRange\", label: \"Date range\", family: \"measure\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const y = (p0.y + p1.y) / 2;\n const col = d.style.color;\n return [\n poly([{ x: p0.x, y: 0 }, { x: p1.x, y: 0 }, { x: p1.x, y: c.H }, { x: p0.x, y: c.H }], { close: true, fill: withAlpha(col, 0.1), width: 0 }),\n line({ x: p0.x, y: 0 }, { x: p0.x, y: c.H }, { width: 1, color: col }), line({ x: p1.x, y: 0 }, { x: p1.x, y: c.H }, { width: 1, color: col }),\n line({ x: p0.x, y }, { x: p1.x, y }, { width: 1, color: col }), head({ x: p0.x, y }, { x: p1.x, y }, 8, col),\n label((p0.x + p1.x) / 2, y - 14, timeText(d, c), col),\n ];\n },\n});\n\nexport const priceRange = tool({\n id: \"priceRange\", label: \"Price range\", family: \"measure\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const x = (p0.x + p1.x) / 2;\n const col = colour(d, A(d, 1).price - A(d, 0).price);\n return [\n poly([{ x: 0, y: p0.y }, { x: c.W, y: p0.y }, { x: c.W, y: p1.y }, { x: 0, y: p1.y }], { close: true, fill: withAlpha(col, 0.1), width: 0 }),\n line({ x: 0, y: p0.y }, { x: c.W, y: p0.y }, { width: 1, color: col, extA: true, extB: true }), line({ x: 0, y: p1.y }, { x: c.W, y: p1.y }, { width: 1, color: col, extA: true, extB: true }),\n line({ x, y: p0.y }, { x, y: p1.y }, { width: 1, color: col }), head({ x, y: p0.y }, { x, y: p1.y }, 8, col),\n label(x, (p0.y + p1.y) / 2, priceText(d, c), col),\n ];\n },\n});\n\nexport const dateAndPriceRange = tool({\n id: \"dateAndPriceRange\", label: \"Date and price range\", family: \"measure\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const col = colour(d, A(d, 1).price - A(d, 0).price);\n const cx = (p0.x + p1.x) / 2, cy = (p0.y + p1.y) / 2;\n return [\n poly([p0, { x: p1.x, y: p0.y }, p1, { x: p0.x, y: p1.y }], { close: true, fill: withAlpha(col, 0.12), color: col, width: 1 }),\n line({ x: cx, y: p0.y }, { x: cx, y: p1.y }, { width: 1, color: col, hit: false }), head({ x: cx, y: p0.y }, { x: cx, y: p1.y }, 8, col),\n line({ x: p0.x, y: cy }, { x: p1.x, y: cy }, { width: 1, color: col, hit: false }), head({ x: p0.x, y: cy }, { x: p1.x, y: cy }, 8, col),\n label(cx, Math.min(p0.y, p1.y) - 14, `${priceText(d, c)}\\n${timeText(d, c)}`, col),\n ];\n },\n});\n\nexport const measureTools: ToolDef[] = [dateRange, priceRange, dateAndPriceRange];\nexport { measureLines };\n","// Pattern tools: XABCD, cypher, ABCD, triangle pattern, three drives, head\n// and shoulders, and the Elliott family (impulse, correction, triangle,\n// double combo, triple combo).\n//\n// Ratios are |move| / |move| of exact anchor prices (see the *Ratios\n// helpers); a ratio over a zero move is printed as \"n/a\", never as 0.\n\nimport { intersect, type Pt } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { Anchor, Drawing, Shape, ToolDef } from \"../types.js\";\nimport { A, finiteAnchors, line, mid, poly, pxs, ratio, ratioText, shade, text, tool } from \"./util.js\";\n\nconst mv = (a: Anchor, b: Anchor) => Math.abs(b.price - a.price);\n\nexport function xabcdRatios(x: Anchor, a: Anchor, b: Anchor, c: Anchor, d: Anchor) {\n return { abXa: ratio(mv(a, b), mv(x, a)), bcAb: ratio(mv(b, c), mv(a, b)), cdBc: ratio(mv(c, d), mv(b, c)), adXa: ratio(mv(a, d), mv(x, a)) };\n}\n\nexport function cypherRatios(x: Anchor, a: Anchor, b: Anchor, c: Anchor, d: Anchor) {\n return { abXa: ratio(mv(a, b), mv(x, a)), xcXa: ratio(mv(x, c), mv(x, a)), cdXc: ratio(mv(c, d), mv(x, c)) };\n}\n\nexport function abcdRatios(a: Anchor, b: Anchor, c: Anchor, d: Anchor) {\n return { bcAb: ratio(mv(b, c), mv(a, b)), cdBc: ratio(mv(c, d), mv(b, c)) };\n}\n\nexport function driveRatios(pts: readonly Anchor[]) {\n if (pts.length !== 7) throw new RangeError(`three drives needs 7 anchors, got ${pts.length}`);\n const p = pts as readonly [Anchor, Anchor, Anchor, Anchor, Anchor, Anchor, Anchor];\n return [ratio(mv(p[1], p[2]), mv(p[0], p[1])), ratio(mv(p[2], p[3]), mv(p[1], p[2])), ratio(mv(p[3], p[4]), mv(p[2], p[3])), ratio(mv(p[4], p[5]), mv(p[3], p[4])), ratio(mv(p[5], p[6]), mv(p[4], p[5]))];\n}\n\n/** Labels at the anchors, above a local high and below a local low. */\nfunction pointLabels(ps: readonly Pt[], names: readonly string[], color: string): Shape[] {\n const out: Shape[] = [];\n ps.forEach((p, i) => {\n const name = names[i];\n if (!name) return;\n const prev = ps[i - 1], next = ps[i + 1];\n const high = (!prev || p.y <= prev.y) && (!next || p.y <= next.y);\n out.push(text(p.x, p.y + (high ? -6 : 6), name, { align: \"center\", base: high ? \"bottom\" : \"top\", textColor: color, hit: false }));\n });\n return out;\n}\n\nconst dashed = { dash: \"dashed\" as const, width: 1, hit: false };\nconst ratioLabel = (a: Pt, b: Pt, r: number | null, color: string): Shape => {\n const m = mid(a, b);\n return text(m.x, m.y, ratioText(r), { align: \"center\", base: \"middle\", bg: withAlpha(color, 0.85), textColor: \"#ffffff\", pad: 2, size: 10, hit: false });\n};\n\nexport const xabcd = tool({\n id: \"xabcd\", label: \"XABCD pattern\", family: \"patterns\", gesture: \"clicks\", anchors: 5,\n defaults: () => ({ style: { fill: \"rgba(41,98,255,0.12)\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [x, a, b, cc, dd] = pxs(c, d) as [Pt, Pt, Pt, Pt, Pt];\n const r = xabcdRatios(A(d, 0), A(d, 1), A(d, 2), A(d, 3), A(d, 4));\n const col = d.style.color;\n return [\n shade([x, a, b], d.style.fill ?? withAlpha(col, 0.12)), shade([b, cc, dd], d.style.fill ?? withAlpha(col, 0.12)),\n poly([x, a, b, cc, dd]),\n line(x, b, dashed), line(a, cc, dashed), line(b, dd, dashed), line(x, dd, dashed),\n ratioLabel(x, b, r.abXa, col), ratioLabel(a, cc, r.bcAb, col), ratioLabel(b, dd, r.cdBc, col), ratioLabel(x, dd, r.adXa, col),\n ...pointLabels([x, a, b, cc, dd], [\"X\", \"A\", \"B\", \"C\", \"D\"], col),\n ];\n },\n});\n\nexport const cypher = tool({\n id: \"cypher\", label: \"Cypher pattern\", family: \"patterns\", gesture: \"clicks\", anchors: 5,\n defaults: () => ({ style: { fill: \"rgba(156,39,176,0.12)\", color: \"#9c27b0\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [x, a, b, cc, dd] = pxs(c, d) as [Pt, Pt, Pt, Pt, Pt];\n const r = cypherRatios(A(d, 0), A(d, 1), A(d, 2), A(d, 3), A(d, 4));\n const col = d.style.color;\n return [\n shade([x, a, b], d.style.fill ?? withAlpha(col, 0.12)), shade([b, cc, dd], d.style.fill ?? withAlpha(col, 0.12)),\n poly([x, a, b, cc, dd]),\n line(x, b, dashed), line(a, cc, dashed), line(x, cc, dashed), line(b, dd, dashed),\n ratioLabel(x, b, r.abXa, col), ratioLabel(x, cc, r.xcXa, col), ratioLabel(b, dd, r.cdXc, col),\n ...pointLabels([x, a, b, cc, dd], [\"X\", \"A\", \"B\", \"C\", \"D\"], col),\n ];\n },\n});\n\nexport const abcd = tool({\n id: \"abcd\", label: \"ABCD pattern\", family: \"patterns\", gesture: \"clicks\", anchors: 4,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b, cc, dd] = pxs(c, d) as [Pt, Pt, Pt, Pt];\n const r = abcdRatios(A(d, 0), A(d, 1), A(d, 2), A(d, 3));\n const col = d.style.color;\n return [poly([a, b, cc, dd]), line(a, cc, dashed), line(b, dd, dashed), ratioLabel(a, cc, r.bcAb, col), ratioLabel(b, dd, r.cdBc, col), ...pointLabels([a, b, cc, dd], [\"A\", \"B\", \"C\", \"D\"], col)];\n },\n});\n\nexport const trianglePattern = tool({\n id: \"trianglePattern\", label: \"Triangle pattern\", family: \"patterns\", gesture: \"clicks\", anchors: 4,\n defaults: () => ({ style: { fill: \"rgba(41,98,255,0.1)\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b, cc, dd] = pxs(c, d) as [Pt, Pt, Pt, Pt];\n const col = d.style.color;\n const out: Shape[] = [poly([a, b, cc, dd]), line(a, cc, { extB: true, dash: \"dashed\", width: 1 }), line(b, dd, { extB: true, dash: \"dashed\", width: 1 })];\n // Apex: where the two trendlines meet, when they converge.\n const apex = intersect(a, cc, b, dd);\n if (apex && apex.x > Math.max(cc.x, dd.x)) out.unshift(shade([a, b, apex], d.style.fill ?? withAlpha(col, 0.1)));\n return [...out, ...pointLabels([a, b, cc, dd], [\"A\", \"B\", \"C\", \"D\"], col)];\n },\n});\n\nexport const threeDrives = tool({\n id: \"threeDrives\", label: \"Three drives pattern\", family: \"patterns\", gesture: \"clicks\", anchors: 7,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const ps = pxs(c, d);\n const col = d.style.color;\n const rs = driveRatios(d.anchors);\n const out: Shape[] = [poly(ps)];\n rs.forEach((r, i) => out.push(ratioLabel(ps[i + 1]!, ps[i + 2]!, r, col)));\n return [...out, ...pointLabels(ps, [\"0\", \"1\", \"A\", \"2\", \"B\", \"3\", \"C\"], col)];\n },\n});\n\nexport const headAndShoulders = tool({\n id: \"headAndShoulders\", label: \"Head and shoulders\", family: \"patterns\", gesture: \"clicks\", anchors: 7,\n defaults: () => ({ style: { fill: \"rgba(239,83,80,0.12)\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const ps = pxs(c, d);\n const [, ls, n1, head, n2, rs] = ps as [Pt, Pt, Pt, Pt, Pt, Pt, Pt];\n const col = d.style.color;\n return [\n shade([n1, ls, head], d.style.fill ?? withAlpha(col, 0.12)),\n shade([n1, head, n2], d.style.fill ?? withAlpha(col, 0.12)),\n shade([n2, head, rs], d.style.fill ?? withAlpha(col, 0.12)),\n poly(ps),\n line(n1, n2, { extB: true, dash: \"dashed\", width: 1 }),\n text(n2.x + 6, n2.y, \"Neckline\", { base: \"top\", size: 10, textColor: col, hit: false }),\n ...pointLabels(ps, [\"\", \"Left shoulder\", \"\", \"Head\", \"\", \"Right shoulder\", \"\"], col),\n ];\n },\n});\n\n// ---- Elliott ---------------------------------------------------------------------\n\nexport type Degree = \"minuette\" | \"minor\" | \"intermediate\" | \"primary\";\n\n/** Wave label for a degree: minuette ((1)), minor 1, intermediate (1), primary [1]. */\nexport function waveLabel(degree: Degree, n: string): string {\n switch (degree) {\n case \"minuette\": return `((${n}))`;\n case \"minor\": return n;\n case \"intermediate\": return `(${n})`;\n case \"primary\": return `[${n}]`;\n }\n}\n\nfunction elliott(id: string, label: string, names: string[]): ToolDef {\n return tool({\n id, label, family: \"elliott\", gesture: \"clicks\", anchors: names.length,\n defaults: () => ({ props: { degree: \"intermediate\" } }),\n validate(d: Drawing) {\n finiteAnchors(d);\n if (![\"minuette\", \"minor\", \"intermediate\", \"primary\"].includes(d.props.degree as string)) throw new RangeError(`drawings: ${id} \"${d.id}\" prop \"degree\" must be minuette, minor, intermediate or primary`);\n },\n shapes(d, c) {\n const ps = pxs(c, d);\n const deg = d.props.degree as Degree;\n return [poly(ps), ...pointLabels(ps, names.map((n) => (n ? waveLabel(deg, n) : \"\")), d.style.color)];\n },\n });\n}\n\nexport const elliottImpulse = elliott(\"elliottImpulse\", \"Elliott impulse wave\", [\"\", \"1\", \"2\", \"3\", \"4\", \"5\"]);\nexport const elliottCorrection = elliott(\"elliottCorrection\", \"Elliott correction wave\", [\"\", \"A\", \"B\", \"C\"]);\nexport const elliottTriangle = elliott(\"elliottTriangle\", \"Elliott triangle wave\", [\"\", \"A\", \"B\", \"C\", \"D\", \"E\"]);\nexport const elliottDoubleCombo = elliott(\"elliottDoubleCombo\", \"Elliott double combo wave\", [\"\", \"W\", \"X\", \"Y\"]);\nexport const elliottTripleCombo = elliott(\"elliottTripleCombo\", \"Elliott triple combo wave\", [\"\", \"W\", \"X\", \"Y\", \"X\", \"Z\"]);\n\nexport const patternTools: ToolDef[] = [\n xabcd, cypher, abcd, trianglePattern, threeDrives, headAndShoulders,\n elliottImpulse, elliottCorrection, elliottTriangle, elliottDoubleCombo, elliottTripleCombo,\n];\n","// Position and projection tools: long position, short position, forecast,\n// projection, bars pattern, ghost feed.\n//\n// Long/short anchors: [entry (time, price), target (end time, price), stop\n// (end time, price)]. Risk, reward, R:R and quantity are exact arithmetic on\n// those prices and on the props (accountSize, riskPercent, lotSize); a\n// quantity is shown only when an account size was given.\n\nimport type { Pt } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { Bar } from \"../source.js\";\nimport type { Anchor, Drawing, Shape, ToolCtx, ToolDef } from \"../types.js\";\nimport { A, finiteAnchors, line, measure, measureLines, poly, px, pxs, shade, text, tool } from \"./util.js\";\n\nexport type Side = \"long\" | \"short\";\n\nexport interface PositionInputs {\n accountSize?: number | null;\n /** Percent of the account risked between entry and stop. */\n riskPercent?: number | undefined;\n lotSize?: number | undefined;\n}\n\nexport interface PositionStats {\n /** Price distance entry→stop and entry→target (both ≥ 0). */\n risk: number;\n reward: number;\n /** reward / risk, or null when risk is 0. */\n rr: number | null;\n riskPct: number;\n rewardPct: number;\n /** Units to trade so that a stop-out loses at most accountSize·riskPercent/100; null without an account size or with 0 risk. */\n qty: number | null;\n /** qty × reward and qty × risk. */\n profit: number | null;\n loss: number | null;\n}\n\n/** Relative tolerance on the budget check (float noise only). */\nconst FLOOR_EPS = 1e-12;\n\nexport function positionStats(side: Side, entry: number, target: number, stop: number, o: PositionInputs = {}): PositionStats {\n const ok = side === \"long\" ? target >= entry && entry >= stop : target <= entry && entry <= stop;\n if (!ok) throw new RangeError(`position: a ${side} needs ${side === \"long\" ? \"target ≥ entry ≥ stop\" : \"target ≤ entry ≤ stop\"}, got target ${target}, entry ${entry}, stop ${stop}`);\n const risk = Math.abs(entry - stop), reward = Math.abs(target - entry);\n let qty: number | null = null;\n if (entry === 0) throw new RangeError(\"position: entry price 0 has no percent risk\");\n if (o.accountSize !== undefined && o.accountSize !== null && risk > 0) {\n const lot = o.lotSize, pct = o.riskPercent;\n if (lot === undefined || pct === undefined) throw new RangeError(\"position: riskPercent and lotSize are required with accountSize\");\n if (!(o.accountSize > 0) || !(lot > 0) || !Number.isInteger(lot) || !(pct > 0)) throw new RangeError(`position: accountSize and riskPercent must be positive and lotSize a positive whole number, got ${o.accountSize}, ${pct}, ${lot}`);\n const budget = (o.accountSize * pct) / 100;\n let lots = Math.floor(budget / risk / lot);\n // Float noise can leave an exact quotient just under the integer (0.3 / 0.1): take the next lot only if it fits within the budget to 1e-12 relative.\n if ((lots + 1) * lot * risk <= budget * (1 + FLOOR_EPS)) lots += 1;\n qty = lots * lot;\n }\n return {\n risk, reward, rr: risk === 0 ? null : reward / risk,\n riskPct: (risk / Math.abs(entry)) * 100,\n rewardPct: (reward / Math.abs(entry)) * 100,\n qty, profit: qty === null ? null : qty * reward, loss: qty === null ? null : qty * risk,\n };\n}\n\nconst num = (v: unknown, name: string, d: Drawing): number | null => {\n if (v === null || v === undefined) return null;\n if (typeof v !== \"number\" || !Number.isFinite(v)) throw new TypeError(`drawings: ${d.tool} \"${d.id}\" prop \"${name}\" must be a finite number or null`);\n return v;\n};\n\nexport function statsOf(side: Side, d: Drawing): PositionStats {\n return positionStats(side, A(d, 0).price, A(d, 1).price, A(d, 2).price, {\n accountSize: num(d.props.accountSize, \"accountSize\", d),\n riskPercent: num(d.props.riskPercent, \"riskPercent\", d) ?? undefined,\n lotSize: num(d.props.lotSize, \"lotSize\", d) ?? undefined,\n });\n}\n\nconst money = (v: number) => v.toFixed(2);\n\nfunction positionTool(side: Side): ToolDef {\n const long = side === \"long\";\n return tool({\n id: long ? \"longPosition\" : \"shortPosition\", label: long ? \"Long position\" : \"Short position\", family: \"position\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({ props: { accountSize: null, riskPercent: 1, lotSize: 1 } }),\n validate(d) {\n finiteAnchors(d);\n statsOf(side, d);\n },\n constrain(d, i) {\n const [e, t, s] = [A(d, 0), A(d, 1), A(d, 2)];\n // The target and stop share the end time, and stay on their own side of the entry.\n if (i === 1 || i === 2) {\n const end = i === 1 ? t.time : s.time;\n t.time = end;\n s.time = end;\n }\n if (long) {\n if (t.price < e.price) t.price = e.price;\n if (s.price > e.price) s.price = e.price;\n } else {\n if (t.price > e.price) t.price = e.price;\n if (s.price < e.price) s.price = e.price;\n }\n },\n shapes(d, c) {\n const st = statsOf(side, d);\n const [e, t, s] = pxs(c, d) as [Pt, Pt, Pt];\n const xl = Math.min(e.x, t.x), xr = Math.max(e.x, t.x);\n const good = \"#26a69a\", bad = \"#ef5350\";\n const out: Shape[] = [\n // Hittable: the whole box selects the position, as on a trading platform.\n poly([{ x: xl, y: e.y }, { x: xr, y: e.y }, { x: xr, y: t.y }, { x: xl, y: t.y }], { close: true, fill: withAlpha(good, 0.2), width: 0 }),\n poly([{ x: xl, y: e.y }, { x: xr, y: e.y }, { x: xr, y: s.y }, { x: xl, y: s.y }], { close: true, fill: withAlpha(bad, 0.2), width: 0 }),\n line({ x: xl, y: e.y }, { x: xr, y: e.y }, { color: d.style.color }),\n line({ x: xl, y: t.y }, { x: xr, y: t.y }, { color: good }),\n line({ x: xl, y: s.y }, { x: xr, y: s.y }, { color: bad }),\n ];\n const signed = (v: number) => `${v < 0 ? \"-\" : v > 0 ? \"+\" : \"\"}${c.fmt(Math.abs(v))}`;\n const tgtDelta = A(d, 1).price - A(d, 0).price, stopDelta = A(d, 2).price - A(d, 0).price;\n const tgt = [`Target ${c.fmt(A(d, 1).price)} (${signed(tgtDelta)}, ${st.rewardPct.toFixed(2)}%)`];\n if (st.profit !== null) tgt.push(`P&L ${money(st.profit)}`);\n const stp = [`Stop ${c.fmt(A(d, 2).price)} (${signed(stopDelta)}, ${st.riskPct.toFixed(2)}%)`];\n if (st.loss !== null) stp.push(`P&L -${money(st.loss)}`);\n const ctr = (xl + xr) / 2;\n out.push(text(ctr, (e.y + t.y) / 2, tgt.join(\"\\n\"), { align: \"center\", base: \"middle\", textColor: good, hit: false }));\n out.push(text(ctr, (e.y + s.y) / 2, stp.join(\"\\n\"), { align: \"center\", base: \"middle\", textColor: bad, hit: false }));\n const mid = [`Entry ${c.fmt(A(d, 0).price)}`, st.rr === null ? \"R:R n/a\" : `R:R ${st.rr.toFixed(2)}`];\n if (st.qty !== null) mid.push(`Qty ${st.qty}`);\n out.push(text(ctr, e.y, mid.join(\" \"), { align: \"center\", base: \"middle\", bg: withAlpha(d.style.color, 0.9), textColor: \"#ffffff\", pad: 3, hit: false }));\n return out;\n },\n });\n}\n\nexport const longPosition = positionTool(\"long\");\nexport const shortPosition = positionTool(\"short\");\n\nexport const forecast = tool({\n id: \"forecast\", label: \"Forecast\", family: \"position\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { fill: \"rgba(41,98,255,0.15)\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a0, a1] = [A(d, 0), A(d, 1)];\n const [p, q] = [px(c, a0), px(c, a1)];\n const m = measure(a0, a1, c.source);\n return [\n shade([p, { x: q.x, y: p.y }, q], d.style.fill ?? withAlpha(d.style.color, 0.15)),\n line(p, { x: q.x, y: p.y }, { dash: \"dotted\", width: 1, hit: false }),\n line({ x: q.x, y: p.y }, q, { dash: \"dotted\", width: 1, hit: false }),\n line(p, q, { dash: \"dashed\" }),\n { k: \"ellipse\", cx: q.x, cy: q.y, rx: 4, ry: 4, fill: d.style.color, width: 1 },\n text(q.x + 8, q.y, measureLines(m, c).join(\"\\n\"), { align: \"left\", base: \"middle\", bg: d.style.color, textColor: \"#ffffff\", pad: 4, hit: false }),\n ];\n },\n});\n\n/** The end of the projected move: same Δprice as a0→a1, started at a2. */\nexport function projectionTarget(a0: Anchor, a1: Anchor, a2: Anchor): number {\n return a2.price + (a1.price - a0.price);\n}\n\nexport const projection = tool({\n id: \"projection\", label: \"Projection\", family: \"position\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a0, a1, a2] = [A(d, 0), A(d, 1), A(d, 2)];\n const [p0, p1, p2] = pxs(c, d) as [Pt, Pt, Pt];\n const end: Pt = { x: p2.x + (p1.x - p0.x), y: c.Y(projectionTarget(a0, a1, a2)) };\n return [\n line(p0, p1), line(p2, end, { dash: \"dashed\" }),\n line(p0, p2, { dash: \"dotted\", width: 1, hit: false }), line(p1, end, { dash: \"dotted\", width: 1, hit: false }),\n { k: \"ellipse\", cx: end.x, cy: end.y, rx: 3, ry: 3, fill: d.style.color, width: 1 },\n text(end.x + 6, end.y, c.fmt(projectionTarget(a0, a1, a2)), { align: \"left\", base: \"middle\", textColor: d.style.color, hit: false }),\n ];\n },\n});\n\n// ---- bar overlays ---------------------------------------------------------------\n\nconst UP = \"#26a69a\", DOWN = \"#ef5350\";\n\nfunction barShapes(x: number, w: number, o: number, h: number, l: number, cl: number, candle: boolean): Shape[] {\n const col = cl >= o ? UP : DOWN;\n if (candle) {\n const top = Math.min(o, cl), bot = Math.max(o, cl);\n return [\n line({ x, y: h }, { x, y: l }, { color: col, width: 1, }),\n poly([{ x: x - w, y: top }, { x: x + w, y: top }, { x: x + w, y: Math.max(bot, top + 1) }, { x: x - w, y: Math.max(bot, top + 1) }], { close: true, fill: col, color: col, width: 1 }),\n ];\n }\n return [\n line({ x, y: h }, { x, y: l }, { color: col, width: 1 }),\n line({ x: x - w, y: o }, { x, y: o }, { color: col, width: 1 }),\n line({ x, y: cl }, { x: x + w, y: cl }, { color: col, width: 1 }),\n ];\n}\n\nfunction needSource(c: ToolCtx, name: string) {\n if (!c.source) throw new Error(`${name} needs a BarSource`);\n return c.source;\n}\n\nfunction sourceBars(c: ToolCtx, d: Drawing, name: string): { src: NonNullable<ToolCtx[\"source\"]>; lo: number; hi: number } {\n const src = needSource(c, name);\n const t0 = A(d, 0).time, t1 = A(d, 1).time;\n const [lo, hi] = src.range(Math.min(t0, t1), Math.max(t0, t1));\n if (hi <= lo) throw new RangeError(`${name} \"${d.id}\": no bars between the first two anchors`);\n return { src, lo, hi };\n}\n\n/** Bars of [lo, hi) shifted so that the first bar's close sits at `price`; times keep their offsets from the first bar. */\nexport function patternBars(bars: readonly Bar[], price: number): Array<{ offsetMs: number; open: number; high: number; low: number; close: number }> {\n const first = bars[0];\n if (!first) throw new RangeError(\"patternBars: no bars\");\n const shift = price - first.close;\n return bars.map((b) => ({ offsetMs: b.time - first.time, open: b.open + shift, high: b.high + shift, low: b.low + shift, close: b.close + shift }));\n}\n\nexport const barsPattern = tool({\n id: \"barsPattern\", label: \"Bars pattern\", family: \"position\", gesture: \"clicks\", anchors: 3, needsSource: true,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const { src, lo, hi } = sourceBars(c, d, \"barsPattern\");\n const bars: Bar[] = [];\n for (let i = lo; i < hi; i++) bars.push(src.at(i));\n const copy = patternBars(bars, A(d, 2).price);\n const x0 = c.X(bars[0]!.time), at = c.X(A(d, 2).time);\n const w = Math.max(1, (bars.length > 1 ? Math.abs(c.X(bars[1]!.time) - x0) : 6) * 0.35);\n const out: Shape[] = [];\n const xa = c.X(A(d, 0).time), xb = c.X(A(d, 1).time);\n out.push(line({ x: xa, y: 0 }, { x: xa, y: c.H }, { dash: \"dotted\", width: 1, extA: true, extB: true }), line({ x: xb, y: 0 }, { x: xb, y: c.H }, { dash: \"dotted\", width: 1, extA: true, extB: true }));\n for (let i = 0; i < copy.length; i++) {\n const b = copy[i]!;\n const x = at + (c.X(bars[i]!.time) - x0);\n out.push(...barShapes(x, w, c.Y(b.open), c.Y(b.high), c.Y(b.low), c.Y(b.close), false));\n }\n return out;\n },\n});\n\n/** mulberry32: a small seeded PRNG so a ghost feed redraws identically. */\nexport function seeded(seed: number): () => number {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) >>> 0;\n let t = a;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/**\n * `count` synthetic bars: each is a randomly drawn bar of `history` with its\n * open-relative high/low/close added to the previous synthetic close,\n * starting from `start`. Deterministic for a seed.\n */\nexport function ghostBars(history: readonly Bar[], start: number, count: number, seed: number): Array<{ open: number; high: number; low: number; close: number }> {\n if (history.length === 0) throw new RangeError(\"ghostBars: no history to sample\");\n const rnd = seeded(seed);\n const out: Array<{ open: number; high: number; low: number; close: number }> = [];\n let prev = start;\n for (let i = 0; i < count; i++) {\n const b = history[Math.floor(rnd() * history.length)]!;\n const open = prev;\n const close = open + (b.close - b.open);\n out.push({ open, high: open + (b.high - b.open), low: open + (b.low - b.open), close });\n prev = close;\n }\n return out;\n}\n\nexport const ghostFeed = tool({\n id: \"ghostFeed\", label: \"Ghost feed (resampled bars)\", family: \"position\", gesture: \"clicks\", anchors: 3, needsSource: true,\n defaults: () => ({ props: { seed: 1, count: 30 } }),\n validate(d) {\n finiteAnchors(d);\n const n = d.props.count, s = d.props.seed;\n if (typeof n !== \"number\" || !Number.isInteger(n) || n < 1 || n > 5000) throw new RangeError(`drawings: ghostFeed \"${d.id}\" prop \"count\" must be an integer in 1..5000`);\n if (typeof s !== \"number\" || !Number.isInteger(s)) throw new RangeError(`drawings: ghostFeed \"${d.id}\" prop \"seed\" must be an integer`);\n },\n shapes(d, c) {\n const { src, lo, hi } = sourceBars(c, d, \"ghostFeed\");\n const history: Bar[] = [];\n for (let i = lo; i < hi; i++) history.push(src.at(i));\n const bars = ghostBars(history, A(d, 2).price, d.props.count as number, d.props.seed as number);\n const t0 = A(d, 2).time;\n const w = Math.max(1, Math.abs(c.X(t0 + src.interval) - c.X(t0)) * 0.35);\n const out: Shape[] = [];\n bars.forEach((b, i) => out.push(...barShapes(c.X(t0 + i * src.interval), w, c.Y(b.open), c.Y(b.high), c.Y(b.low), c.Y(b.close), true)));\n const p = px(c, A(d, 2));\n out.push(text(p.x, p.y - 6, \"ghost feed\", { base: \"bottom\", size: 10, textColor: d.style.color, hit: false }));\n return out;\n },\n});\n\nexport const positionTools: ToolDef[] = [longPosition, shortPosition, forecast, projection, barsPattern, ghostFeed];\n","// Tools computed from bars: anchored VWAP and fixed-range volume profile.\n\nimport type { Pt } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { BarSource } from \"../source.js\";\nimport type { Drawing, Shape, ToolDef } from \"../types.js\";\nimport { A, finiteAnchors, line, needDistinctTimes, poly, px, text, tool } from \"./util.js\";\n\nexport interface VwapSeries {\n times: Float64Array;\n values: Float64Array;\n}\n\n/**\n * VWAP from bar `start` to the last bar: Σ(typical·volume) / Σ(volume), typical\n * = (high + low + close) / 3. Bars before the first with volume have no value (NaN).\n */\nexport function anchoredVwap(src: BarSource, start: number): VwapSeries {\n if (!Number.isInteger(start) || start < 0 || start >= src.length) throw new RangeError(`anchoredVwap: start ${start} outside 0..${src.length - 1}`);\n const n = src.length - start;\n const times = new Float64Array(n), values = new Float64Array(n);\n let pv = 0, v = 0;\n for (let i = 0; i < n; i++) {\n const b = src.at(start + i);\n pv += ((b.high + b.low + b.close) / 3) * b.volume;\n v += b.volume;\n times[i] = b.time;\n values[i] = v === 0 ? Number.NaN : pv / v;\n }\n return { times, values };\n}\n\n/** Index of the bar the anchor sits on: the last bar at or before its time (the first bar if it is earlier than all). */\nexport function startIndex(src: BarSource, time: number): number | null {\n if (src.length === 0) return null;\n const [lo, hi] = src.range(time, time);\n if (hi > lo) return lo;\n if (lo >= src.length) return null; // anchored after the last bar: nothing to average yet\n return Math.max(0, lo - 1);\n}\n\nconst vwapCache = new WeakMap<BarSource, Map<number, { version: number; series: VwapSeries }>>();\n\nfunction cachedVwap(src: BarSource, start: number): VwapSeries {\n let m = vwapCache.get(src);\n if (!m) vwapCache.set(src, (m = new Map()));\n const hit = m.get(start);\n if (hit && hit.version === src.version) return hit.series;\n const series = anchoredVwap(src, start);\n if (m.size > 64) m.clear();\n m.set(start, { version: src.version, series });\n return series;\n}\n\nexport const anchoredVwapTool = tool({\n id: \"anchoredVwap\", label: \"Anchored VWAP\", family: \"volume\", gesture: \"single\", anchors: 1, needsSource: true,\n defaults: () => ({ style: { color: \"#ff9800\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n if (!c.source) throw new Error(\"anchoredVwap needs a BarSource\");\n const p = px(c, A(d, 0));\n const out: Shape[] = [{ k: \"ellipse\", cx: p.x, cy: p.y, rx: 4, ry: 4, fill: d.style.color, width: 1 }];\n const start = startIndex(c.source, A(d, 0).time);\n if (start === null) return out;\n const s = cachedVwap(c.source, start);\n const tL = c.T(-2), tR = c.T(c.W + 2);\n // Visible slice by binary search over the (sorted) bar times.\n const lower = (t: number) => {\n let lo = 0, hi = s.times.length;\n while (lo < hi) {\n const m = (lo + hi) >> 1;\n if (s.times[m]! < t) lo = m + 1;\n else hi = m;\n }\n return lo;\n };\n const i0 = Math.max(0, lower(tL) - 1), i1 = Math.min(s.times.length, lower(tR) + 1);\n // One point per pixel column at most.\n const step = Math.max(1, Math.floor((i1 - i0) / (c.W + 4)));\n const pts: number[] = [];\n for (let i = i0; i < i1; i += step) if (!Number.isNaN(s.values[i]!)) pts.push(c.X(s.times[i]!), c.Y(s.values[i]!));\n if (pts.length >= 4) out.push({ k: \"poly\", pts });\n return out;\n },\n});\n\nexport interface VolumeProfile {\n low: number;\n high: number;\n rowHeight: number;\n volumes: number[];\n poc: number;\n}\n\n/**\n * Bar-level volume profile of bars [lo, hi): a bar's volume is spread over\n * the rows its [low, high] range overlaps, in proportion to the overlap\n * (all of it in one row when low = high). This approximates real traded-at-\n * price volume, which a bar series does not contain. The row volumes sum to\n * the bars' total volume.\n */\nexport function volumeProfile(src: BarSource, lo: number, hi: number, rows: number): VolumeProfile {\n if (!Number.isInteger(rows) || rows < 1) throw new RangeError(`volumeProfile: rows must be a positive integer, got ${rows}`);\n if (hi <= lo) throw new RangeError(\"volumeProfile: no bars in the range\");\n let low = Infinity, high = -Infinity;\n for (let i = lo; i < hi; i++) {\n const b = src.at(i);\n if (b.low < low) low = b.low;\n if (b.high > high) high = b.high;\n }\n const span = high - low;\n const rowHeight = span / rows;\n const volumes = new Array<number>(rows).fill(0);\n for (let i = lo; i < hi; i++) {\n const b = src.at(i);\n if (span === 0 || b.high === b.low) {\n const r = span === 0 ? 0 : Math.min(rows - 1, Math.floor((b.low - low) / rowHeight));\n volumes[r]! += b.volume;\n continue;\n }\n const r0 = Math.min(rows - 1, Math.floor((b.low - low) / rowHeight)), r1 = Math.min(rows - 1, Math.floor((b.high - low) / rowHeight));\n const barSpan = b.high - b.low;\n for (let r = r0; r <= r1; r++) {\n const top = Math.min(b.high, low + (r + 1) * rowHeight), bot = Math.max(b.low, low + r * rowHeight);\n if (top > bot) volumes[r]! += (b.volume * (top - bot)) / barSpan;\n }\n }\n let poc = 0;\n volumes.forEach((v, r) => {\n if (v > volumes[poc]!) poc = r;\n });\n return { low, high, rowHeight, volumes, poc };\n}\n\nfunction rangeBars(d: Drawing, src: BarSource): [number, number] {\n const [lo, hi] = src.range(Math.min(A(d, 0).time, A(d, 1).time), Math.max(A(d, 0).time, A(d, 1).time));\n if (hi <= lo) throw new RangeError(`drawings: volumeProfile \"${d.id}\" has no bars between its anchors`);\n return [lo, hi];\n}\n\nexport const volumeProfileTool = tool({\n id: \"volumeProfile\", label: \"Fixed range volume profile (bar-level approximation)\", family: \"volume\", gesture: \"drag\", anchors: 2, needsSource: true,\n defaults: () => ({ props: { rows: 24 } }),\n validate(d) {\n finiteAnchors(d);\n needDistinctTimes(d, 0, 1);\n const r = d.props.rows;\n if (typeof r !== \"number\" || !Number.isInteger(r) || r < 1 || r > 500) throw new RangeError(`drawings: volumeProfile \"${d.id}\" prop \"rows\" must be an integer in 1..500`);\n },\n shapes(d, c) {\n if (!c.source) throw new Error(\"volumeProfile needs a BarSource\");\n const [lo, hi] = rangeBars(d, c.source);\n const rows = d.props.rows as number;\n const vp = volumeProfile(c.source, lo, hi, rows);\n const xa = c.X(A(d, 0).time), xb = c.X(A(d, 1).time);\n const left = Math.min(xa, xb), right = Math.max(xa, xb);\n const maxW = (right - left) * 0.6;\n const maxV = vp.volumes[vp.poc]!;\n const out: Shape[] = [line({ x: left, y: 0 }, { x: left, y: c.H }, { dash: \"dotted\", width: 1, extA: true, extB: true }), line({ x: right, y: 0 }, { x: right, y: c.H }, { dash: \"dotted\", width: 1, extA: true, extB: true })];\n vp.volumes.forEach((v, r) => {\n if (v === 0 || maxV === 0) return;\n const yTop = c.Y(vp.low + (r + 1) * vp.rowHeight), yBot = c.Y(vp.low + r * vp.rowHeight);\n const w = (v / maxV) * maxW;\n const pts: Pt[] = [{ x: left, y: yTop }, { x: left + w, y: yTop }, { x: left + w, y: yBot }, { x: left, y: yBot }];\n out.push(poly(pts, { close: true, fill: withAlpha(r === vp.poc ? \"#ff9800\" : d.style.color, r === vp.poc ? 0.6 : 0.35), width: 0 }));\n });\n out.push(text(left + 4, 4, \"Volume profile (bar-level approximation)\", { base: \"top\", size: 10, textColor: d.style.color, hit: false }));\n return out;\n },\n});\n\nexport const volumeTools: ToolDef[] = [anchoredVwapTool, volumeProfileTool];\n","// Every built-in tool. Import named tools from their modules instead to keep\n// the rest out of a bundle.\n\nimport type { ToolDef } from \"../types.js\";\nimport { annotationTools } from \"./annotations.js\";\nimport { channelTools } from \"./channels.js\";\nimport { cycleTools } from \"./cycles.js\";\nimport { fibTools } from \"./fib.js\";\nimport { figureTools } from \"./figures.js\";\nimport { gannTools } from \"./gann.js\";\nimport { lineTools } from \"./lines.js\";\nimport { measureTools } from \"./measure.js\";\nimport { patternTools } from \"./patterns.js\";\nimport { positionTools } from \"./position.js\";\nimport { volumeTools } from \"./volume.js\";\n\nexport const allTools: readonly ToolDef[] = [\n ...lineTools, ...channelTools, ...fibTools, ...gannTools, ...figureTools, ...annotationTools,\n ...positionTools, ...measureTools, ...patternTools, ...cycleTools, ...volumeTools,\n];\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["__defProp","__exportAll","target","name","all","no_symbols","Emitter","set","type","fn","e","geometry_exports","arcPoints","arrowHead","circumcircle","clipLine","controlThrough","dist","distToPolyline","distToSegment","ellipsePoints","intersect","pointInPolygon","quadPoints","x2","x1","y2","y1","dx","dy","l2","px","py","t","t0","t1","clip","p","q","r","m","W","H","lo","extA","hi","extB","out","c","rot","s","n","a","x","rx","y","ry","cx","cy","a1","a0","i","u","p0","p1","through","d","b","a2","b2","c2","inside","pts","j","xi","yi","xj","yj","best","last","close","b1","size","DrawingStore","id","at","ids","clone","v","AddCommand","RemoveCommand","entries","PatchCommand","label","before","after","ReorderCommand","BatchCommand","cmds","History","store","max","dashPattern","w","alphaCache","withAlpha","key","color","rgba","parseColor","fontCache","font","sz","style","f","textBox","pad","nLines","measure","lines","l","h","declutter","placed","boxes","items","it","z","again","guard","o","widths","widthEntries","cachedWidth","byText","text","ctx","offPane","x0","y0","drawShapes","boost","opts","curStroke","curFill","curWidth","curDash","stroke","dk","fill","shapes","seg","line","outlines","shapeDistance","shapeInRect","checkName","TemplateStore","prefix","tool","raw","k","cur","next","on","DEFAULT_STYLE","SCHEMA_VERSION","DRAG_SLOP","TOLERANCE","WEAK_MAGNET_PX","DUPLICATE_BARS","DrawingsPlugin","options","api","source","ms","mode","def","spec","dflt","anchors","fromView","view","patch","snap","cmd","how","dropped","top","pane","ref","dt","dp","bar","adds","made","src","tools","state","gone","err","iv","list","hp","tol","bx","frame","labels","sel","cr","hit","clickOnly","movers","s0","mod","ArrayBarSource","data","older","time","ti","tp","from","to","A","pxs","prop","levelsProp","poly","flat","shade","head","ang","extension","aIsLeft","lerp","mid","fillOf","alpha","fmtTime","fmtDuration","dPrice","sign","barsText","bars","measureLines","pct","tail","ratio","den","num","ratioText","FIB_COLORS","fibColor","FIB_RETRACEMENT","FIB_BASIC","needDistinctTimes","finiteAnchors","BOX","content","fallback","screenPoint","fx","fy","textTool","anchoredText","noteShapes","note","anchoredNote","callout","boxAt","comment","priceLabel","priceNote","signpost","flagMark","arrow","arrowMarker","L","ux","uy","nx","ny","hl","along","across","markShape","dirUp","arrowMarkUp","arrowMarkDown","annotationTools","lineY","span","parallelChannel","p2","off","xa","xb","base","b0","m0","m1","regression","mx","my","sxy","sxx","slope","intercept","ss","regressionOf","closes","regressionTrendChannel","tFirst","tLast","reg","dev","u0","u1","l0","l1","flatTopBottom","disjointChannel","p3","forkGeometry","cc","forkTool","g","ahead","far","fo","pitchfork","schiffPitchfork","modifiedSchiffPitchfork","insidePitchfork","pitchfan","levels","rays","channelTools","MAX_REPEATS","MIN_PERIOD_PX","period","cyclicLines","first","timeCycles","dir","sineY","sineLine","cycleTools","fibRetracementPrice","fibExtensionPrice","FIB_SEQUENCE","PHI","lvl","fibRetracement","xl","xr","lv","ys","fibExtension","pa","pb","pc","fibChannel","fibTimeZone","unit","FIB_FAN","fibSpeedFan","colour","e1","e2","fibTrendTime","fibCircles","fibSpiral","r0","th0","maxR","thMax","th","FIB_ARCS","fibSpeedArcs","fibWedge","delta","fibTools","FILL","inner","textValue","rectangle","rotatedRectCorners","len","rotatedRectangle","ellipse","circle","triangle","arcThrough","norm","dEnd","dMid","arc","curve","doubleCurve","m2","polyline","path","ps","brush","highlighter","figureTools","BOX_LEVELS","gannBoxPrice","gannFanPrice","GANN_RATIOS","grid","xs","gannBox","yAt","ya","yb","DIV8","squareShapes","gannSquare","fixedCorner","side","gannSquareFixed","gannFan","ends","gannTools","twoPoint","trendLine","ray","extendedLine","infoLine","horizontalLine","crisp","RAY_LABEL_ROOM","horizontalRay","verticalLine","crossLine","lineTools","col","priceText","timeText","dateRange","priceRange","dateAndPriceRange","measureTools","mv","xabcdRatios","cypherRatios","abcdRatios","driveRatios","pointLabels","names","prev","high","dashed","ratioLabel","xabcd","dd","cypher","abcd","trianglePattern","apex","threeDrives","rs","headAndShoulders","ls","n1","n2","waveLabel","degree","elliott","deg","elliottImpulse","elliottCorrection","elliottTriangle","elliottDoubleCombo","elliottTripleCombo","patternTools","positionStats","entry","stop","risk","reward","qty","lot","budget","lots","statsOf","money","positionTool","long","end","st","good","bad","signed","tgtDelta","stopDelta","tgt","stp","ctr","longPosition","shortPosition","forecast","projectionTarget","projection","UP","DOWN","barShapes","cl","candle","bot","needSource","sourceBars","patternBars","shift","price","barsPattern","copy","seeded","seed","ghostBars","history","rnd","start","count","open","ghostFeed","positionTools","anchoredVwap","times","values","pv","startIndex","vwapCache","cachedVwap","series","anchoredVwapTool","tL","tR","lower","i0","i1","step","volumeProfile","rows","low","rowHeight","volumes","r1","barSpan","poc","rangeBars","volumeProfileTool","vp","left","right","maxW","maxV","yTop","yBot","volumeTools","allTools"],"sources":["../src/emitter.ts","../src/geometry.ts","../src/history.ts","../src/shapes.ts","../src/templates.ts","../src/types.ts","../src/plugin.ts","../src/source.ts","../src/tools/util.ts","../src/tools/annotations.ts","../src/tools/channels.ts","../src/tools/cycles.ts","../src/tools/fib.ts","../src/tools/figures.ts","../src/tools/gann.ts","../src/tools/lines.ts","../src/tools/measure.ts","../src/tools/patterns.ts","../src/tools/position.ts","../src/tools/volume.ts","../src/tools/all.ts"],"sourcesContent":["// Minimal typed event emitter.\n\nexport 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.map.get(type)?.delete(fn as (e: never) => void);\n }\n\n emit<K extends keyof E>(type: K, e: E[K]): void {\n const set = this.map.get(type);\n if (set) for (const fn of [...set]) (fn as (e: E[K]) => void)(e);\n }\n}\n","// Planar geometry for tools and hit-testing, in CSS px. Pure functions.\n\nexport interface Pt {\n x: number;\n y: number;\n}\n\nexport function dist(x1: number, y1: number, x2: number, y2: number): number {\n return Math.hypot(x2 - x1, y2 - y1);\n}\n\n/** Distance from (px, py) to the segment (x1,y1)-(x2,y2). */\nexport function distToSegment(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const l2 = dx * dx + dy * dy;\n if (l2 === 0) return dist(px, py, x1, y1);\n let t = ((px - x1) * dx + (py - y1) * dy) / l2;\n t = Math.max(0, Math.min(1, t));\n return dist(px, py, x1 + t * dx, y1 + t * dy);\n}\n\n/**\n * The part of the line through a→b to draw inside [-m, W+m]×[-m, H+m]:\n * the segment itself, plus the ray beyond a (extA) and/or beyond b (extB).\n * Null when nothing of it is inside.\n */\nexport function clipLine(\n x1: number, y1: number, x2: number, y2: number,\n extA: boolean, extB: boolean, W: number, H: number, m = 2,\n): [number, number, number, number] | null {\n const dx = x2 - x1, dy = y2 - y1;\n if (dx === 0 && dy === 0) return null;\n let t0 = -Infinity, t1 = Infinity;\n const clip = (p: number, q: number): boolean => {\n if (p === 0) return q >= 0;\n const r = q / p;\n if (p < 0) {\n if (r > t1) return false;\n if (r > t0) t0 = r;\n } else {\n if (r < t0) return false;\n if (r < t1) t1 = r;\n }\n return true;\n };\n if (!clip(-dx, x1 + m) || !clip(dx, W + m - x1) || !clip(-dy, y1 + m) || !clip(dy, H + m - y1)) return null;\n const lo = extA ? t0 : Math.max(t0, 0);\n const hi = extB ? t1 : Math.min(t1, 1);\n if (lo > hi) return null;\n return [x1 + lo * dx, y1 + lo * dy, x1 + hi * dx, y1 + hi * dy];\n}\n\n/** Flat [x0,y0,x1,y1,…] points of an ellipse (rotated by rot), n segments. */\nexport function ellipsePoints(cx: number, cy: number, rx: number, ry: number, rot: number, n = 72): number[] {\n const out: number[] = [];\n const c = Math.cos(rot), s = Math.sin(rot);\n for (let i = 0; i < n; i++) {\n const a = (i / n) * Math.PI * 2;\n const x = rx * Math.cos(a), y = ry * Math.sin(a);\n out.push(cx + x * c - y * s, cy + x * s + y * c);\n }\n return out;\n}\n\n/** Flat points along a circular arc from angle a0 to a1 (radians, y down). */\nexport function arcPoints(cx: number, cy: number, r: number, a0: number, a1: number): number[] {\n const n = Math.max(6, Math.min(180, Math.ceil((Math.abs(a1 - a0) * r) / 4)));\n const out: number[] = [];\n for (let i = 0; i <= n; i++) {\n const a = a0 + ((a1 - a0) * i) / n;\n out.push(cx + r * Math.cos(a), cy + r * Math.sin(a));\n }\n return out;\n}\n\n/** Quadratic Bézier points p0, control c, p1. */\nexport function quadPoints(p0: Pt, c: Pt, p1: Pt, n = 48): number[] {\n const out: number[] = [];\n for (let i = 0; i <= n; i++) {\n const t = i / n, u = 1 - t;\n out.push(u * u * p0.x + 2 * u * t * c.x + t * t * p1.x, u * u * p0.y + 2 * u * t * c.y + t * t * p1.y);\n }\n return out;\n}\n\n/** The quadratic control point that makes the curve p0→p1 pass through `through` at t = 0.5. */\nexport function controlThrough(p0: Pt, through: Pt, p1: Pt): Pt {\n return { x: 2 * through.x - (p0.x + p1.x) / 2, y: 2 * through.y - (p0.y + p1.y) / 2 };\n}\n\n/** Circle through three points, or null when they are collinear. */\nexport function circumcircle(a: Pt, b: Pt, c: Pt): { cx: number; cy: number; r: number } | null {\n const d = 2 * (a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y));\n if (Math.abs(d) < 1e-9) return null;\n const a2 = a.x * a.x + a.y * a.y, b2 = b.x * b.x + b.y * b.y, c2 = c.x * c.x + c.y * c.y;\n const cx = (a2 * (b.y - c.y) + b2 * (c.y - a.y) + c2 * (a.y - b.y)) / d;\n const cy = (a2 * (c.x - b.x) + b2 * (a.x - c.x) + c2 * (b.x - a.x)) / d;\n return { cx, cy, r: dist(cx, cy, a.x, a.y) };\n}\n\nexport function pointInPolygon(px: number, py: number, pts: readonly number[]): boolean {\n let inside = false;\n const n = pts.length / 2;\n for (let i = 0, j = n - 1; i < n; j = i++) {\n const xi = pts[2 * i]!, yi = pts[2 * i + 1]!, xj = pts[2 * j]!, yj = pts[2 * j + 1]!;\n if (yi > py !== yj > py && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi) inside = !inside;\n }\n return inside;\n}\n\n/** Distance from a point to a polyline (flat xy), optionally closed. */\nexport function distToPolyline(px: number, py: number, pts: readonly number[], close: boolean): number {\n const n = pts.length / 2;\n if (n === 0) return Infinity;\n if (n === 1) return dist(px, py, pts[0]!, pts[1]!);\n let best = Infinity;\n const last = close ? n : n - 1;\n for (let i = 0; i < last; i++) {\n const j = (i + 1) % n;\n best = Math.min(best, distToSegment(px, py, pts[2 * i]!, pts[2 * i + 1]!, pts[2 * j]!, pts[2 * j + 1]!));\n }\n return best;\n}\n\n/** Intersection of lines a1→a2 and b1→b2, or null when parallel. */\nexport function intersect(a1: Pt, a2: Pt, b1: Pt, b2: Pt): Pt | null {\n const d = (a2.x - a1.x) * (b2.y - b1.y) - (a2.y - a1.y) * (b2.x - b1.x);\n if (Math.abs(d) < 1e-12) return null;\n const t = ((b1.x - a1.x) * (b2.y - b1.y) - (b1.y - a1.y) * (b2.x - b1.x)) / d;\n return { x: a1.x + t * (a2.x - a1.x), y: a1.y + t * (a2.y - a1.y) };\n}\n\n/** Filled arrow head at (x2,y2) for a line coming from (x1,y1): flat polygon. */\nexport function arrowHead(x1: number, y1: number, x2: number, y2: number, size: number): number[] {\n const a = Math.atan2(y2 - y1, x2 - x1);\n const s = 0.45;\n return [x2, y2, x2 - size * Math.cos(a - s), y2 - size * Math.sin(a - s), x2 - size * Math.cos(a + s), y2 - size * Math.sin(a + s)];\n}\n","// The drawing store and the undo/redo command stack.\n//\n// Every mutation of the store is a Command that carries what it needs for an\n// exact inverse: Add remembers the index, Remove the drawings and their\n// indices, Patch the full before/after snapshots, Reorder both orders.\n// Undoing every command returns the store to a state that serializes\n// identically to the initial one (property-tested with seeded random runs).\n\nimport type { Drawing } from \"./types.js\";\n\nexport class DrawingStore {\n private items: Drawing[] = [];\n private index = new Map<string, Drawing>();\n\n /** Back to front: later = on top. */\n get list(): readonly Drawing[] {\n return this.items;\n }\n\n get(id: string): Drawing | undefined {\n return this.index.get(id);\n }\n\n require(id: string): Drawing {\n const d = this.index.get(id);\n if (!d) throw new Error(`drawings: no drawing with id \"${id}\"`);\n return d;\n }\n\n insert(d: Drawing, at: number): void {\n if (this.index.has(d.id)) throw new Error(`drawings: duplicate drawing id \"${d.id}\"`);\n if (!Number.isInteger(at) || at < 0 || at > this.items.length) throw new RangeError(`drawings: insert index ${at} outside 0..${this.items.length}`);\n this.items.splice(at, 0, d);\n this.index.set(d.id, d);\n }\n\n remove(id: string): number {\n const i = this.items.findIndex((x) => x.id === id);\n if (i < 0) throw new Error(`drawings: no drawing with id \"${id}\"`);\n this.items.splice(i, 1);\n this.index.delete(id);\n return i;\n }\n\n /** Replace the drawing with the same id, in place in the order. */\n replace(d: Drawing): void {\n const i = this.items.findIndex((x) => x.id === d.id);\n if (i < 0) throw new Error(`drawings: no drawing with id \"${d.id}\"`);\n this.items[i] = d;\n this.index.set(d.id, d);\n }\n\n setOrder(ids: readonly string[]): void {\n if (ids.length !== this.items.length || new Set(ids).size !== ids.length) throw new Error(\"drawings: setOrder needs every id exactly once\");\n this.items = ids.map((id) => this.require(id));\n }\n\n clear(): void {\n this.items = [];\n this.index.clear();\n }\n\n snapshot(): string {\n return JSON.stringify(this.items);\n }\n}\n\nexport const clone = <T>(v: T): T => structuredClone(v);\n\nexport interface Command {\n readonly label: string;\n /** Ids of drawings the command touches (for events). */\n readonly ids: readonly string[];\n apply(s: DrawingStore): void;\n revert(s: DrawingStore): void;\n}\n\nexport class AddCommand implements Command {\n readonly label = \"add\";\n readonly ids: readonly string[];\n constructor(private readonly d: Drawing, private readonly at: number) {\n this.ids = [d.id];\n }\n apply(s: DrawingStore): void {\n s.insert(clone(this.d), this.at);\n }\n revert(s: DrawingStore): void {\n s.remove(this.d.id);\n }\n}\n\nexport class RemoveCommand implements Command {\n readonly label = \"remove\";\n readonly ids: readonly string[];\n /** Ascending by index. */\n private readonly entries: Array<{ d: Drawing; at: number }>;\n constructor(entries: Array<{ d: Drawing; at: number }>) {\n this.entries = [...entries].sort((a, b) => a.at - b.at).map((e) => ({ d: clone(e.d), at: e.at }));\n this.ids = this.entries.map((e) => e.d.id);\n }\n apply(s: DrawingStore): void {\n for (const e of this.entries) s.remove(e.d.id);\n }\n revert(s: DrawingStore): void {\n for (const e of this.entries) s.insert(clone(e.d), e.at);\n }\n}\n\nexport class PatchCommand implements Command {\n readonly ids: readonly string[];\n constructor(readonly label: string, private readonly before: Drawing[], private readonly after: Drawing[]) {\n if (before.length !== after.length || before.some((b, i) => b.id !== after[i]!.id)) throw new Error(\"drawings: PatchCommand needs matching before/after drawings\");\n this.ids = before.map((b) => b.id);\n this.before = before.map(clone);\n this.after = after.map(clone);\n }\n apply(s: DrawingStore): void {\n for (const d of this.after) s.replace(clone(d));\n }\n revert(s: DrawingStore): void {\n for (const d of this.before) s.replace(clone(d));\n }\n}\n\nexport class ReorderCommand implements Command {\n readonly label = \"reorder\";\n readonly ids: readonly string[];\n constructor(private readonly before: string[], private readonly after: string[]) {\n this.ids = after;\n }\n apply(s: DrawingStore): void {\n s.setOrder(this.after);\n }\n revert(s: DrawingStore): void {\n s.setOrder(this.before);\n }\n}\n\nexport class BatchCommand implements Command {\n readonly ids: readonly string[];\n constructor(readonly label: string, private readonly cmds: Command[]) {\n this.ids = cmds.flatMap((c) => c.ids);\n }\n apply(s: DrawingStore): void {\n for (const c of this.cmds) c.apply(s);\n }\n revert(s: DrawingStore): void {\n for (let i = this.cmds.length - 1; i >= 0; i--) this.cmds[i]!.revert(s);\n }\n}\n\nexport class History {\n private undoStack: Command[] = [];\n private redoStack: Command[] = [];\n\n constructor(private readonly store: DrawingStore, private readonly max = 500) {}\n\n get canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n get canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n /** Apply a new command and make it undoable; clears redo. */\n run(c: Command): void {\n c.apply(this.store);\n this.undoStack.push(c);\n if (this.undoStack.length > this.max) this.undoStack.shift();\n this.redoStack = [];\n }\n\n /** Record a command whose effect is already in the store (a finished drag). */\n record(c: Command): void {\n this.undoStack.push(c);\n if (this.undoStack.length > this.max) this.undoStack.shift();\n this.redoStack = [];\n }\n\n undo(): Command | undefined {\n const c = this.undoStack.pop();\n if (!c) return undefined;\n c.revert(this.store);\n this.redoStack.push(c);\n return c;\n }\n\n redo(): Command | undefined {\n const c = this.redoStack.pop();\n if (!c) return undefined;\n c.apply(this.store);\n this.undoStack.push(c);\n return c;\n }\n\n clear(): void {\n this.undoStack = [];\n this.redoStack = [];\n }\n}\n","// Drawing and hit-testing shapes. Both are generic over Shape, so a tool is\n// only a function from a drawing to shapes.\n//\n// Hit-testing is in pane CSS px. Strokes hit within `tol`; filled shapes hit\n// inside; text hits its (padded) box. Ellipses and arcs are tested as\n// polylines, so the test and the picture can differ by a sub-pixel.\n\nimport { parseColor, rgba } from \"@alphacharts/core\";\nimport { arcPoints, clipLine, distToPolyline, distToSegment, ellipsePoints, pointInPolygon } from \"./geometry.js\";\nimport type { Dash, DrawingStyle, Shape } from \"./types.js\";\n\nexport function dashPattern(d: Dash, w: number): number[] {\n return d === \"solid\" ? [] : d === \"dashed\" ? [4 * w, 3 * w] : [w, 2 * w];\n}\n\n/** Tools call withAlpha for every shape on every frame; the colours repeat. */\nconst alphaCache = new Map<string, string>();\n\n/** `color` with its alpha replaced by `a` (0..1), as an rgba() string. */\nexport function withAlpha(color: string, a: number): string {\n const key = `${color}|${a}`;\n let out = alphaCache.get(key);\n if (out === undefined) {\n if (alphaCache.size > 2048) alphaCache.clear();\n const c = rgba(parseColor(color));\n out = `rgba(${Math.round(c[0]! * 255)},${Math.round(c[1]! * 255)},${Math.round(c[2]! * 255)},${a})`;\n alphaCache.set(key, out);\n }\n return out;\n}\n\nconst fontCache = new Map<string, string>();\n\nexport function font(style: DrawingStyle, size?: number): string {\n const sz = size ?? style.fontSize;\n const key = `${style.italic ? \"i\" : \"\"}${style.bold ? \"b\" : \"\"}${sz}`;\n let f = fontCache.get(key);\n if (f === undefined) {\n if (fontCache.size > 512) fontCache.clear();\n f = `${style.italic ? \"italic \" : \"\"}${style.bold ? \"bold \" : \"\"}${sz}px system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif`;\n fontCache.set(key, f);\n }\n return f;\n}\n\nexport interface TextBox {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/** Text box of a text shape; `measure` returns the text width in px. */\nexport function textBox(s: Extract<Shape, { k: \"text\" }>, style: DrawingStyle, measure: (text: string, font: string) => number): TextBox {\n const size = s.size ?? style.fontSize;\n const pad = s.pad ?? (s.bg || s.border ? 4 : 0);\n const f = font(style, size);\n let w: number, nLines: number;\n if (s.text.indexOf(\"\\n\") < 0) {\n w = measure(s.text, f) + 2 * pad;\n nLines = 1;\n } else {\n const lines = s.text.split(\"\\n\");\n w = Math.max(...lines.map((l) => measure(l, f))) + 2 * pad;\n nLines = lines.length;\n }\n const h = nLines * size * 1.25 + 2 * pad;\n const x = s.align === \"right\" ? s.x - w : s.align === \"center\" ? s.x - w / 2 : s.x;\n const y = s.base === \"bottom\" ? s.y - h : s.base === \"middle\" ? s.y - h / 2 : s.y;\n return { x, y, w, h };\n}\n\n/**\n * Moves the `stack` labels of one pane apart: in order from the top, a label that overlaps one already placed is\n * moved down until it clears it. Mutates the shapes (they are made anew for each frame); nothing else is touched.\n */\nexport function declutter(items: readonly { s: Extract<Shape, { k: \"text\" }>; style: DrawingStyle }[], measure: (text: string, font: string) => number): void {\n const placed: TextBox[] = [];\n const boxes = items.map((it) => ({ it, b: textBox(it.s, it.style, measure) })).sort((a, z) => a.b.y - z.b.y);\n for (const { it, b } of boxes) {\n let y = b.y;\n for (let again = true, guard = 0; again && guard < 64; guard++) {\n again = false;\n for (const o of placed) {\n if (b.x < o.x + o.w && o.x < b.x + b.w && y < o.y + o.h && o.y < y + b.h) {\n y = o.y + o.h + 1;\n again = true;\n }\n }\n }\n if (y !== b.y) it.s.y += y - b.y;\n placed.push({ x: b.x, y, w: b.w, h: b.h });\n }\n}\n\n/** Text widths by font, then text: measuring is the dearest part of drawing a label. */\nconst widths = new Map<string, Map<string, number>>();\nlet widthEntries = 0;\n\nfunction cachedWidth(ctx: CanvasRenderingContext2D, text: string, f: string): number {\n let byText = widths.get(f);\n if (!byText) widths.set(f, (byText = new Map()));\n let w = byText.get(text);\n if (w === undefined) {\n if (widthEntries > 4096) {\n widths.clear();\n widthEntries = 0;\n widths.set(f, (byText = new Map()));\n }\n ctx.font = f;\n byText.set(text, (w = ctx.measureText(text).width));\n widthEntries++;\n }\n return w;\n}\n\n/** True when the box [x0,x1]×[y0,y1] misses the pane [0,W]×[0,H] by more than `m`: nothing of it can show. */\nfunction offPane(x0: number, y0: number, x1: number, y1: number, W: number, H: number, m: number): boolean {\n return x1 < -m || x0 > W + m || y1 < -m || y0 > H + m;\n}\n\nexport function drawShapes(\n ctx: CanvasRenderingContext2D, shapes: readonly Shape[], style: DrawingStyle, W: number, H: number,\n opts: { widthBoost?: number } = {},\n): void {\n const boost = opts.widthBoost ?? 0;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n // Only touch a context property when it changes: each assignment is a call into the browser.\n let curStroke: string | undefined, curFill: string | undefined, curWidth = -1, curDash: string | undefined;\n const stroke = (s: Shape): boolean => {\n const w = (s.width ?? style.width) + boost;\n if (w <= 0) return false;\n const c = s.color ?? style.color;\n if (c !== curStroke) ctx.strokeStyle = curStroke = c;\n if (w !== curWidth) ctx.lineWidth = curWidth = w;\n const d = s.dash ?? style.dash;\n const dk = d === \"solid\" ? \"\" : `${d}${w}`;\n if (dk !== curDash) {\n ctx.setLineDash(dashPattern(d, w));\n curDash = dk;\n }\n return true;\n };\n const fill = (c: string): void => {\n if (c !== curFill) ctx.fillStyle = curFill = c;\n };\n for (const s of shapes) {\n // Anything wholly outside the (clipped) pane is not drawn: panned-away drawings cost no canvas calls.\n const m = (s.width ?? style.width) + boost + 2;\n switch (s.k) {\n case \"line\": {\n const seg = clipLine(s.x1, s.y1, s.x2, s.y2, s.extA ?? false, s.extB ?? false, W, H);\n if (!seg || !stroke(s)) break;\n ctx.beginPath();\n ctx.moveTo(seg[0], seg[1]);\n ctx.lineTo(seg[2], seg[3]);\n ctx.stroke();\n break;\n }\n case \"poly\": {\n const n = s.pts.length / 2;\n if (n < 2) break;\n let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n for (let i = 0; i < s.pts.length; i += 2) {\n const x = s.pts[i]!, y = s.pts[i + 1]!;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n if (offPane(x0, y0, x1, y1, W, H, m)) break;\n ctx.beginPath();\n ctx.moveTo(s.pts[0]!, s.pts[1]!);\n for (let i = 1; i < n; i++) ctx.lineTo(s.pts[2 * i]!, s.pts[2 * i + 1]!);\n if (s.close) ctx.closePath();\n if (s.fill) {\n fill(s.fill);\n ctx.fill();\n }\n if (stroke(s)) ctx.stroke();\n break;\n }\n case \"ellipse\": {\n const r = Math.max(Math.abs(s.rx), Math.abs(s.ry));\n if (offPane(s.cx - r, s.cy - r, s.cx + r, s.cy + r, W, H, m)) break;\n ctx.beginPath();\n ctx.ellipse(s.cx, s.cy, Math.max(0, s.rx), Math.max(0, s.ry), s.rot ?? 0, 0, Math.PI * 2);\n if (s.fill) {\n fill(s.fill);\n ctx.fill();\n }\n if (stroke(s)) ctx.stroke();\n break;\n }\n case \"arc\": {\n if (offPane(s.cx - Math.abs(s.r), s.cy - Math.abs(s.r), s.cx + Math.abs(s.r), s.cy + Math.abs(s.r), W, H, m)) break;\n ctx.beginPath();\n if (s.fill) ctx.moveTo(s.cx, s.cy);\n ctx.arc(s.cx, s.cy, Math.max(0, s.r), s.a0, s.a1, s.a1 < s.a0);\n if (s.fill) {\n ctx.closePath();\n fill(s.fill);\n ctx.fill();\n }\n if (stroke(s)) ctx.stroke();\n break;\n }\n case \"text\": {\n const size = s.size ?? style.fontSize;\n const b = textBox(s, style, (t, f) => cachedWidth(ctx, t, f));\n if (offPane(b.x, b.y, b.x + b.w, b.y + b.h, W, H, 2)) break;\n ctx.font = font(style, size);\n if (s.bg) {\n fill(s.bg);\n ctx.fillRect(b.x, b.y, b.w, b.h);\n }\n if (s.border) {\n ctx.strokeStyle = curStroke = s.border;\n ctx.lineWidth = curWidth = 1;\n ctx.setLineDash([]);\n curDash = \"\";\n ctx.strokeRect(b.x + 0.5, b.y + 0.5, b.w - 1, b.h - 1);\n }\n fill(s.textColor ?? style.textColor);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n const pad = s.pad ?? (s.bg || s.border ? 4 : 0);\n if (s.text.indexOf(\"\\n\") < 0) ctx.fillText(s.text, b.x + pad, b.y + pad + size * 0.125);\n else s.text.split(\"\\n\").forEach((line, i) => ctx.fillText(line, b.x + pad, b.y + pad + i * size * 1.25 + size * 0.125));\n break;\n }\n }\n }\n ctx.setLineDash([]);\n}\n\n/** Flat polylines (and fill flags) a shape is tested as. */\nfunction outlines(s: Shape, W: number, H: number): Array<{ pts: number[]; close: boolean; fill: boolean }> {\n switch (s.k) {\n case \"line\": {\n const seg = clipLine(s.x1, s.y1, s.x2, s.y2, s.extA ?? false, s.extB ?? false, W, H, 1e6);\n return seg ? [{ pts: [...seg], close: false, fill: false }] : [];\n }\n case \"poly\":\n return [{ pts: s.pts, close: s.close ?? false, fill: !!s.fill }];\n case \"ellipse\":\n return [{ pts: ellipsePoints(s.cx, s.cy, s.rx, s.ry, s.rot ?? 0), close: true, fill: !!s.fill }];\n case \"arc\": {\n const pts = arcPoints(s.cx, s.cy, s.r, s.a0, s.a1);\n return [{ pts: s.fill ? [s.cx, s.cy, ...pts] : pts, close: !!s.fill, fill: !!s.fill }];\n }\n case \"text\":\n return [];\n }\n}\n\n/**\n * Distance 0 when (x, y) is inside a filled shape or a text box, else the\n * distance to the nearest stroke; Infinity when the shape is not hittable.\n */\nexport function shapeDistance(\n s: Shape, x: number, y: number, W: number, H: number, style: DrawingStyle, measure: (t: string, f: string) => number,\n): number {\n if (s.hit === false) return Infinity;\n if (s.k === \"text\") {\n const b = textBox(s, style, measure);\n const dx = Math.max(b.x - x, 0, x - (b.x + b.w)), dy = Math.max(b.y - y, 0, y - (b.y + b.h));\n return Math.hypot(dx, dy);\n }\n if (s.k === \"line\") {\n const seg = clipLine(s.x1, s.y1, s.x2, s.y2, s.extA ?? false, s.extB ?? false, W, H, 1e6);\n return seg ? distToSegment(x, y, seg[0], seg[1], seg[2], seg[3]) : Infinity;\n }\n let best = Infinity;\n for (const o of outlines(s, W, H)) {\n if (o.fill && o.close && pointInPolygon(x, y, o.pts)) return 0;\n const stroked = (s.width ?? 1) > 0;\n if (stroked || !o.fill) best = Math.min(best, distToPolyline(x, y, o.pts, o.close));\n }\n return best;\n}\n\n/** True when any outline vertex (or a text box corner) of the shape lies in the rectangle. */\nexport function shapeInRect(s: Shape, x0: number, y0: number, x1: number, y1: number, W: number, H: number): boolean {\n const lo = (a: number, b: number) => Math.min(a, b), hi = (a: number, b: number) => Math.max(a, b);\n const inside = (x: number, y: number) => x >= lo(x0, x1) && x <= hi(x0, x1) && y >= lo(y0, y1) && y <= hi(y0, y1);\n if (s.hit === false) return false;\n if (s.k === \"text\") return inside(s.x, s.y);\n if (s.k === \"line\" && (inside(s.x1, s.y1) || inside(s.x2, s.y2))) return true;\n for (const o of outlines(s, W, H)) {\n for (let i = 0; i < o.pts.length; i += 2) if (inside(o.pts[i]!, o.pts[i + 1]!)) return true;\n }\n return false;\n}\n","// Style templates and favourite tools, kept in a LayoutStore from core\n// (MemoryStore, LocalStorageStore, or a server-backed one).\n//\n// Keys: \"<prefix>template/<tool>/<name>\" and \"<prefix>favourites\".\n\nimport type { LayoutStore } from \"@alphacharts/core\";\nimport type { Drawing, DrawingStyle } from \"./types.js\";\n\nexport interface DrawingTemplate {\n version: 1;\n tool: string;\n name: string;\n style: DrawingStyle;\n props: Record<string, unknown>;\n}\n\nfunction checkName(name: string): void {\n if (!name || name.includes(\"/\")) throw new RangeError(`template name must be non-empty and contain no \"/\", got \"${name}\"`);\n}\n\nexport class TemplateStore {\n constructor(private readonly store: LayoutStore, private readonly prefix = \"drawings/\") {}\n\n private key(tool: string, name: string): string {\n checkName(tool);\n checkName(name);\n return `${this.prefix}template/${tool}/${name}`;\n }\n\n /** Save a drawing's style and props as a template for its tool. */\n async save(name: string, d: Drawing): Promise<void> {\n const t: DrawingTemplate = { version: 1, tool: d.tool, name, style: { ...d.style }, props: structuredClone(d.props) };\n await this.store.save(this.key(d.tool, name), t);\n }\n\n async load(tool: string, name: string): Promise<DrawingTemplate> {\n const raw = (await this.store.load(this.key(tool, name))) as DrawingTemplate | undefined;\n if (!raw) throw new Error(`drawings: no template \"${name}\" for tool \"${tool}\"`);\n if (raw.version !== 1 || raw.tool !== tool) throw new Error(`drawings: template \"${name}\" is not a version 1 template of \"${tool}\"`);\n return raw;\n }\n\n async list(tool?: string): Promise<Array<{ tool: string; name: string }>> {\n const p = `${this.prefix}template/`;\n const out: Array<{ tool: string; name: string }> = [];\n for (const k of await this.store.keys()) {\n if (!k.startsWith(p)) continue;\n const [t, n] = k.slice(p.length).split(\"/\");\n if (t && n && (tool === undefined || t === tool)) out.push({ tool: t, name: n });\n }\n return out;\n }\n\n async remove(tool: string, name: string): Promise<void> {\n await this.store.remove(this.key(tool, name));\n }\n\n async favourites(): Promise<string[]> {\n const raw = await this.store.load(`${this.prefix}favourites`);\n if (raw === undefined) return [];\n if (!Array.isArray(raw) || raw.some((x) => typeof x !== \"string\")) throw new TypeError(\"drawings: stored favourites are not a list of tool ids\");\n return raw as string[];\n }\n\n async setFavourite(tool: string, on: boolean): Promise<string[]> {\n const cur = await this.favourites();\n const next = on ? (cur.includes(tool) ? cur : [...cur, tool]) : cur.filter((t) => t !== tool);\n await this.store.save(`${this.prefix}favourites`, next);\n return next;\n }\n}\n","// Drawing model and the tool-definition API.\n//\n// A drawing is plain JSON: a tool id, anchors (time + price, never a timeline\n// index), a style and tool-specific props. A tool is a pure function from a\n// drawing to pixel-space shapes; drawing, hit-testing, selection boxes and\n// serialization are generic over shapes, so adding a tool never touches the\n// interaction code.\n//\n// Anchors are exact inputs. Every number a tool prints (Δ price, %, Fib\n// level price, risk/reward, quantity) is arithmetic on the anchors and goes\n// through the chart's price formatter; nothing is estimated or defaulted.\n\nimport type { BarSource } from \"./source.js\";\n\nexport interface Anchor {\n /** UTC ms. Not required to be a bar time: it may sit between bars or past the last bar. */\n time: number;\n price: number;\n}\n\nexport type Dash = \"solid\" | \"dashed\" | \"dotted\";\n\nexport interface DrawingStyle {\n color: string;\n /** CSS px. */\n width: number;\n dash: Dash;\n /** CSS colour with alpha, or null for no fill. */\n fill: string | null;\n textColor: string;\n /** CSS px. */\n fontSize: number;\n bold: boolean;\n italic: boolean;\n text: string;\n extendLeft: boolean;\n extendRight: boolean;\n}\n\nexport interface Drawing {\n id: string;\n tool: string;\n pane: number;\n anchors: Anchor[];\n style: DrawingStyle;\n /** Tool-specific, JSON-safe (levels, account size, seeds …). */\n props: Record<string, unknown>;\n locked: boolean;\n hidden: boolean;\n /** Chart intervals (bar length in ms) the drawing shows on; null = all. */\n intervals: number[] | null;\n}\n\n// ---- shapes (pixel space) ------------------------------------------------------\n\nexport interface Stroke {\n color?: string;\n width?: number;\n dash?: Dash;\n /** false: drawn but not hit-testable (decorations, fills). Default true. */\n hit?: boolean;\n}\n\nexport type Shape =\n | (Stroke & { k: \"line\"; x1: number; y1: number; x2: number; y2: number; extA?: boolean; extB?: boolean })\n | (Stroke & { k: \"poly\"; pts: number[]; close?: boolean; fill?: string | null; round?: boolean })\n | (Stroke & { k: \"ellipse\"; cx: number; cy: number; rx: number; ry: number; rot?: number; fill?: string | null })\n | (Stroke & { k: \"arc\"; cx: number; cy: number; r: number; a0: number; a1: number; fill?: string | null })\n | (Stroke & {\n k: \"text\";\n x: number;\n y: number;\n text: string;\n align?: \"left\" | \"center\" | \"right\";\n base?: \"top\" | \"middle\" | \"bottom\";\n /** Text colour (default: the drawing's text colour). */\n textColor?: string;\n size?: number;\n bg?: string | null;\n /** Border of the background box. */\n border?: string | null;\n pad?: number;\n /**\n * A label that gives way: when the pane draws it over another stacking label it is moved down just clear of it\n * (the price labels of several levels close in price do not print over one another).\n */\n stack?: boolean;\n });\n\n// ---- tool context --------------------------------------------------------------\n\nexport interface ToolCtx {\n /** Pane size in CSS px. */\n readonly W: number;\n readonly H: number;\n readonly dpr: number;\n X(time: number): number;\n Y(price: number): number;\n T(x: number): number;\n P(y: number): number;\n /** The series' price formatter. */\n fmt(price: number): string;\n /** Bars of the main series, for tools that read them (and bar counts). */\n readonly source: BarSource | null;\n /** Current chart interval in ms, if known. */\n readonly interval: number | null;\n}\n\nexport type Gesture =\n /** Press, drag, release: anchors 0 and 1 (a click then a click works too). Further anchors by click. */\n | \"drag\"\n /** One click per anchor. */\n | \"clicks\"\n /** One click. */\n | \"single\"\n /** Press-drag-release collecting points. */\n | \"freehand\";\n\nexport interface ToolDef {\n readonly id: string;\n readonly label: string;\n readonly family: string;\n readonly gesture: Gesture;\n /** Anchors (the minimum for variable tools). 0 for screen-anchored tools. */\n readonly anchors: number;\n /** Any number of anchors ≥ `anchors`: finish with double-click or Enter. */\n readonly variable?: boolean;\n /** Positioned by props.fx / props.fy (fractions of the pane), not by time and price. */\n readonly screen?: boolean;\n /** Reads bars: the plugin must have a BarSource. */\n readonly needsSource?: boolean;\n /** No handles (brush strokes: moving the whole stroke only). */\n readonly noHandles?: boolean;\n defaults(): { style?: Partial<DrawingStyle>; props?: Record<string, unknown> };\n shapes(d: Drawing, c: ToolCtx): Shape[];\n /** Throw (with context) when anchors or props are not valid for the tool. */\n validate?(d: Drawing): void;\n /** Called after anchor `i` was set by an edit; enforce invariants. */\n constrain?(d: Drawing, i: number): void;\n /** Fill props that depend on the view when the drawing is created (may throw). */\n onCreate?(d: Drawing, c: ToolCtx): void;\n /** Pixel positions of the edit handles, when they differ from the anchors. */\n handlePoints?(d: Drawing, c: ToolCtx): Array<{ x: number; y: number }>;\n}\n\nexport const DEFAULT_STYLE: DrawingStyle = {\n color: \"#2962ff\",\n width: 1.5,\n dash: \"solid\",\n fill: null,\n textColor: \"#d1d4dc\",\n fontSize: 12,\n bold: false,\n italic: false,\n text: \"\",\n extendLeft: false,\n extendRight: false,\n};\n\nexport const SCHEMA_VERSION = 1;\n\nexport interface DrawingsState {\n version: typeof SCHEMA_VERSION;\n drawings: Drawing[];\n}\n","// DrawingsPlugin: one chart plugin that owns every drawing on a chart.\n//\n// - State is a DrawingStore (ordered back to front) plus a command History;\n// every change, API or pointer, goes through a Command with an exact inverse.\n// - Tools are plain ToolDefs passed in by the integrator, so unused tools stay\n// out of the bundle.\n// - Drawing, hit-testing, box selection and edit handles are generic over the\n// pixel Shapes a tool returns.\n// - Interaction: a tool is \"armed\" with setTool(); otherwise a press on a\n// drawing selects/moves it, a press on a handle edits it, and a press on\n// empty space is left to the chart (pan) unless Shift starts a box select.\n// While the plugin consumes a press the chart does not pan.\n// - A tool that throws (bad props, missing bars) is reported through\n// onError once per distinct message and skipped; the rest keep drawing.\n\nimport type { ChartPlugin, LayoutStore, PluginApi, PluginPaneView, PluginPointer } from \"@alphacharts/core\";\nimport { Emitter } from \"./emitter.js\";\nimport { dist } from \"./geometry.js\";\nimport { AddCommand, BatchCommand, clone, DrawingStore, History, PatchCommand, RemoveCommand, ReorderCommand, type Command } from \"./history.js\";\nimport { declutter, drawShapes, shapeDistance, shapeInRect } from \"./shapes.js\";\nimport type { BarSource } from \"./source.js\";\nimport { TemplateStore } from \"./templates.js\";\nimport { DEFAULT_STYLE, SCHEMA_VERSION, type Anchor, type Drawing, type DrawingStyle, type DrawingsState, type Shape, type ToolCtx, type ToolDef } from \"./types.js\";\n\nexport type MagnetMode = \"off\" | \"weak\" | \"strong\";\n\nexport interface DrawingsOptions {\n tools: readonly ToolDef[];\n /** Plugin id (key in layout JSON). Default \"drawings\". */\n id?: string;\n /** Bars of the main series: needed by bar-reading tools, bar counts and the magnet. */\n source?: BarSource;\n /** Current chart interval in ms (for per-interval visibility); default: the source's. */\n interval?: number;\n magnet?: MagnetMode;\n /** Stay in the tool after a drawing is finished. */\n continuous?: boolean;\n /**\n * Display only, for drawings the host places by code: the plugin never takes a pointer press, key or cursor, so\n * nothing it draws can be hit, selected, moved or deleted, and the chart (pan, zoom, its own handles above it)\n * gets every event as if no drawing were there. `setTool` throws. `add`, `update`, `remove` and `fromJSON` still work.\n */\n readOnly?: boolean;\n /** Templates and favourites storage. */\n store?: LayoutStore;\n /** A tool failed to draw or a gesture produced an invalid drawing. Default: console.error. */\n onError?: (error: Error, drawing: Drawing | null) => void;\n}\n\nexport interface DrawingsEvents {\n created: Drawing;\n changed: Drawing;\n removed: Drawing;\n selected: string[];\n tool: string | null;\n history: { canUndo: boolean; canRedo: boolean };\n}\n\nexport interface NewDrawing {\n tool: string;\n anchors?: Anchor[];\n pane?: number;\n id?: string;\n style?: Partial<DrawingStyle>;\n props?: Record<string, unknown>;\n locked?: boolean;\n hidden?: boolean;\n intervals?: number[] | null;\n}\n\nexport type DrawingPatch = Partial<Pick<Drawing, \"anchors\" | \"locked\" | \"hidden\" | \"intervals\">> & {\n style?: Partial<DrawingStyle>;\n props?: Record<string, unknown>;\n};\n\n/** Pixels the pointer must travel before a press-release counts as a drag. */\nexport const DRAG_SLOP = 4;\n/** Hit tolerance in CSS px by pointer type. */\nexport const TOLERANCE: Record<string, number> = { mouse: 5, pen: 8, touch: 14 };\n/** Weak magnet radius in CSS px. */\nexport const WEAK_MAGNET_PX = 16;\n/** Duplicate offsets a copy by this many bars in time (never in price). */\nexport const DUPLICATE_BARS = 5;\n\ntype Drag =\n | { kind: \"move\"; pane: number; start: { x: number; y: number }; before: Drawing[]; startAnchors: Map<string, Anchor[]>; startScreen: Map<string, { fx: number; fy: number }>; moved: boolean; clickOnly: { id: string; shift: boolean } | null }\n | { kind: \"handle\"; pane: number; id: string; index: number; before: Drawing; moved: boolean }\n | { kind: \"box\"; pane: number; x0: number; y0: number; x1: number; y1: number };\n\ninterface Creating {\n def: ToolDef;\n pane: number;\n anchors: Anchor[];\n /** Pointer position (snapped) for the rubber-band anchor. */\n pointer: Anchor | null;\n /** The press that began the drawing has not been released yet. */\n fresh: boolean;\n downPx: { x: number; y: number };\n lastPx: { x: number; y: number };\n screenPos: { fx: number; fy: number } | null;\n}\n\nexport class DrawingsPlugin implements ChartPlugin {\n readonly id: string;\n readonly events = new Emitter<DrawingsEvents>();\n private loading = false;\n /**\n * True while `fromJSON` emits its `removed` / `created` events: they describe\n * a layout being loaded, not something the user drew or deleted, so a listener\n * that mirrors drawings elsewhere (a sync between charts) must not act on them.\n */\n get restoring(): boolean {\n return this.loading;\n }\n readonly templates: TemplateStore | null;\n\n private api: PluginApi | null = null;\n private readonly tools = new Map<string, ToolDef>();\n private readonly store = new DrawingStore();\n private readonly history = new History(this.store);\n private readonly selected = new Set<string>();\n private hover: string | null = null;\n private tool: string | null = null;\n private creating: Creating | null = null;\n private drag: Drag | null = null;\n private clipboard: Drawing[] = [];\n private nextId = 1;\n private last: { pane: number; x: number; y: number; time: number; price: number; pointerType: string } | null = null;\n private source: BarSource | null;\n private intervalMs: number | null;\n private magnetMode: MagnetMode;\n private readonly continuous: boolean;\n private readonly onError: (e: Error, d: Drawing | null) => void;\n private readonly reported = new Set<string>();\n private measureCanvas: CanvasRenderingContext2D | null | undefined;\n\n constructor(private readonly options: DrawingsOptions) {\n this.id = options.id ?? \"drawings\";\n for (const t of options.tools) {\n if (this.tools.has(t.id)) throw new Error(`drawings: tool \"${t.id}\" registered twice`);\n this.tools.set(t.id, t);\n }\n this.source = options.source ?? null;\n this.intervalMs = options.interval ?? null;\n this.magnetMode = options.magnet ?? \"off\";\n this.continuous = options.continuous ?? false;\n this.templates = options.store ? new TemplateStore(options.store) : null;\n this.onError = options.onError ?? ((e, d) => console.error(`alphacharts drawings${d ? ` (${d.tool} ${d.id})` : \"\"}:`, e));\n }\n\n // ---- plugin lifecycle ---------------------------------------------------------\n\n install(api: PluginApi): void {\n this.api = api;\n }\n\n uninstall(): void {\n this.api = null;\n this.creating = null;\n this.drag = null;\n }\n\n dataChanged(): void {\n this.api?.requestRender();\n }\n\n viewChanged(): void {\n // The overlay redraws with the view; nothing is cached in pixels.\n }\n\n // ---- configuration ------------------------------------------------------------\n\n toolDef(id: string): ToolDef {\n const t = this.tools.get(id);\n if (!t) throw new Error(`drawings: unknown tool \"${id}\" (registered: ${[...this.tools.keys()].join(\", \") || \"none\"})`);\n return t;\n }\n\n toolIds(): string[] {\n return [...this.tools.keys()];\n }\n\n setSource(source: BarSource | null): void {\n this.source = source;\n this.render();\n }\n\n /** Current chart interval in ms; drawings with `intervals` show only when it is listed. */\n setInterval(ms: number | null): void {\n if (ms !== null && !(ms > 0)) throw new RangeError(`drawings: interval must be positive, got ${ms}`);\n this.intervalMs = ms;\n this.render();\n }\n\n setMagnet(mode: MagnetMode): void {\n this.magnetMode = mode;\n }\n\n magnet(): MagnetMode {\n return this.magnetMode;\n }\n\n // ---- reading state ------------------------------------------------------------\n\n list(): Drawing[] {\n return this.store.list.map(clone);\n }\n\n get(id: string): Drawing | undefined {\n const d = this.store.get(id);\n return d ? clone(d) : undefined;\n }\n\n selection(): string[] {\n return [...this.selected];\n }\n\n activeTool(): string | null {\n return this.tool;\n }\n\n get canUndo(): boolean {\n return this.history.canUndo;\n }\n\n get canRedo(): boolean {\n return this.history.canRedo;\n }\n\n // ---- mutation (every path is a Command) ------------------------------------\n\n private newId(): string {\n let id: string;\n do id = `d${this.nextId++}`;\n while (this.store.get(id));\n return id;\n }\n\n private build(spec: NewDrawing, anchors: Anchor[], fromView: PluginPaneView | null): Drawing {\n const def = this.toolDef(spec.tool);\n const dflt = def.defaults();\n const d: Drawing = {\n id: spec.id ?? this.newId(),\n tool: spec.tool,\n pane: spec.pane ?? 0,\n anchors: anchors.map((a) => ({ time: a.time, price: a.price })),\n style: { ...DEFAULT_STYLE, ...dflt.style, ...spec.style },\n props: { ...clone(dflt.props ?? {}), ...clone(spec.props ?? {}) },\n locked: spec.locked ?? false,\n hidden: spec.hidden ?? false,\n intervals: spec.intervals ?? null,\n };\n if (def.onCreate && fromView) def.onCreate(d, this.ctxFor(fromView));\n return d;\n }\n\n /** Throws with context unless `d` is a valid drawing of a registered tool. */\n validate(d: Drawing): void {\n const def = this.toolDef(d.tool);\n if (typeof d.id !== \"string\" || !d.id) throw new TypeError(\"drawings: a drawing needs a string id\");\n if (!Number.isInteger(d.pane) || d.pane < 0) throw new RangeError(`drawings: ${d.tool} \"${d.id}\" has invalid pane ${d.pane}`);\n if (!Array.isArray(d.anchors)) throw new TypeError(`drawings: ${d.tool} \"${d.id}\" anchors must be an array`);\n if (def.variable ? d.anchors.length < def.anchors : d.anchors.length !== def.anchors) {\n throw new RangeError(`drawings: ${d.tool} \"${d.id}\" needs ${def.variable ? \"at least \" : \"\"}${def.anchors} anchors, got ${d.anchors.length}`);\n }\n d.anchors.forEach((a, i) => {\n if (typeof a?.time !== \"number\" || typeof a?.price !== \"number\" || !Number.isFinite(a.time) || !Number.isFinite(a.price)) {\n throw new TypeError(`drawings: ${d.tool} \"${d.id}\" anchor ${i} must be {time, price} with finite numbers`);\n }\n });\n for (const k of Object.keys(DEFAULT_STYLE) as Array<keyof DrawingStyle>) {\n if (typeof d.style?.[k] !== typeof DEFAULT_STYLE[k] && !(k === \"fill\" && (d.style?.fill === null || typeof d.style?.fill === \"string\"))) {\n throw new TypeError(`drawings: ${d.tool} \"${d.id}\" style.${k} has the wrong type`);\n }\n }\n if (d.intervals !== null && (!Array.isArray(d.intervals) || d.intervals.some((x) => !(x > 0)))) throw new TypeError(`drawings: ${d.tool} \"${d.id}\" intervals must be null or positive numbers`);\n if (def.needsSource && !this.source) throw new Error(`drawings: ${d.tool} needs a BarSource; pass \\`source\\` to DrawingsPlugin`);\n if (def.screen) {\n if (typeof d.props.fx !== \"number\" || typeof d.props.fy !== \"number\") throw new TypeError(`drawings: ${d.tool} \"${d.id}\" needs numeric props fx and fy`);\n }\n def.validate?.(d);\n }\n\n /** Create a drawing; returns a copy. Throws when invalid. */\n add(spec: NewDrawing): Drawing {\n const view = this.api && (spec.pane ?? 0) < this.api.paneCount ? this.api.paneView(spec.pane ?? 0) : null;\n const d = this.build(spec, spec.anchors ?? [], view);\n if (this.store.get(d.id)) throw new Error(`drawings: id \"${d.id}\" is already used`);\n this.validate(d);\n this.exec(new AddCommand(d, this.store.list.length));\n return clone(d);\n }\n\n /** Change a drawing (programmatic: locks do not apply). */\n update(id: string, patch: DrawingPatch): Drawing {\n const before = clone(this.store.require(id));\n const after = this.applyPatch(before, patch);\n this.validate(after);\n this.exec(new PatchCommand(\"update\", [before], [after]));\n return clone(after);\n }\n\n private applyPatch(d: Drawing, patch: DrawingPatch): Drawing {\n const out = clone(d);\n if (patch.anchors) out.anchors = patch.anchors.map((a) => ({ time: a.time, price: a.price }));\n if (patch.style) out.style = { ...out.style, ...patch.style };\n if (patch.props) out.props = { ...out.props, ...clone(patch.props) };\n if (patch.locked !== undefined) out.locked = patch.locked;\n if (patch.hidden !== undefined) out.hidden = patch.hidden;\n if (patch.intervals !== undefined) out.intervals = patch.intervals;\n return out;\n }\n\n /** Update several drawings as one undo step. */\n updateMany(ids: readonly string[], patch: DrawingPatch): void {\n const before = ids.map((i) => clone(this.store.require(i)));\n const after = before.map((b) => this.applyPatch(b, patch));\n after.forEach((a) => this.validate(a));\n this.exec(new PatchCommand(\"update\", before, after));\n }\n\n remove(ids: readonly string[]): void {\n if (ids.length === 0) return;\n const entries = ids.map((id) => ({ d: this.store.require(id), at: this.store.list.indexOf(this.store.require(id)) }));\n this.exec(new RemoveCommand(entries));\n }\n\n clear(): void {\n this.remove(this.store.list.map((d) => d.id));\n }\n\n private exec(cmd: Command, how: \"run\" | \"undo\" | \"redo\" = \"run\"): void {\n // A drag holds snapshots of the state it started from: abandon it before the state changes under it.\n if (this.drag) this.cancelDrag();\n const snap = (ids: readonly string[]) => new Map(ids.map((i) => [i, this.store.get(i) ? JSON.stringify(this.store.get(i)) : undefined] as const));\n const before = snap(cmd.ids);\n if (how === \"run\") this.history.run(cmd);\n else if (how === \"undo\") this.history.undo();\n else this.history.redo();\n const after = snap(cmd.ids);\n for (const id of cmd.ids) {\n const b = before.get(id), a = after.get(id);\n if (b === undefined && a !== undefined) this.events.emit(\"created\", JSON.parse(a) as Drawing);\n else if (b !== undefined && a === undefined) this.events.emit(\"removed\", JSON.parse(b) as Drawing);\n else if (a !== undefined && a !== b) this.events.emit(\"changed\", JSON.parse(a) as Drawing);\n }\n this.afterMutation();\n }\n\n private afterMutation(): void {\n let dropped = false;\n for (const id of [...this.selected]) if (!this.store.get(id)) (this.selected.delete(id), (dropped = true));\n if (this.hover && !this.store.get(this.hover)) this.hover = null;\n if (dropped) this.events.emit(\"selected\", this.selection());\n this.events.emit(\"history\", { canUndo: this.history.canUndo, canRedo: this.history.canRedo });\n this.render();\n }\n\n undo(): boolean {\n const top = this.peekUndo();\n if (!top) return false;\n this.exec(top, \"undo\");\n return true;\n }\n\n redo(): boolean {\n const top = this.peekRedo();\n if (!top) return false;\n this.exec(top, \"redo\");\n return true;\n }\n\n // History does not expose its stacks; wrap to learn the command before applying it.\n private peekUndo(): Command | undefined {\n return (this.history as unknown as { undoStack: Command[] }).undoStack.at(-1);\n }\n private peekRedo(): Command | undefined {\n return (this.history as unknown as { redoStack: Command[] }).redoStack.at(-1);\n }\n\n // ---- selection ------------------------------------------------------------------\n\n select(ids: readonly string[]): void {\n for (const id of ids) this.store.require(id);\n const same = ids.length === this.selected.size && ids.every((i) => this.selected.has(i));\n if (same) return;\n this.selected.clear();\n for (const id of ids) this.selected.add(id);\n this.events.emit(\"selected\", this.selection());\n this.render();\n }\n\n selectAll(): void {\n this.select(this.store.list.filter((d) => !d.hidden).map((d) => d.id));\n }\n\n setTool(id: string | null): void {\n if (id !== null && this.options.readOnly) throw new Error(\"drawings: a read-only plugin takes no tool\");\n if (id !== null) this.toolDef(id);\n this.creating = null;\n if (this.tool === id) return;\n this.tool = id;\n if (id !== null) this.select([]);\n this.events.emit(\"tool\", id);\n this.render();\n }\n\n /** The anchor (time, price) under a pane pixel: for creating drawings from code at screen positions. */\n anchorAt(pane: number, x: number, y: number): Anchor {\n if (!this.api) throw new Error(\"drawings: the plugin is not installed on a chart\");\n const v = this.api.paneView(pane);\n return { time: v.xToTime(x), price: v.yToPrice(y) };\n }\n\n /** Pane pixel of an anchor. */\n pixelOf(pane: number, a: Anchor): { x: number; y: number } {\n if (!this.api) throw new Error(\"drawings: the plugin is not installed on a chart\");\n const v = this.api.paneView(pane);\n return { x: v.timeToX(a.time), y: v.priceToY(a.price) };\n }\n\n // ---- order, clipboard -----------------------------------------------------------\n\n private reorder(ids: readonly string[], f: (order: string[], sel: Set<string>) => string[]): void {\n const before = this.store.list.map((d) => d.id);\n const after = f([...before], new Set(ids));\n if (after.every((id, i) => id === before[i])) return;\n this.exec(new ReorderCommand(before, after));\n }\n\n bringToFront(ids: readonly string[] = this.selection()): void {\n this.reorder(ids, (o, s) => [...o.filter((i) => !s.has(i)), ...o.filter((i) => s.has(i))]);\n }\n\n sendToBack(ids: readonly string[] = this.selection()): void {\n this.reorder(ids, (o, s) => [...o.filter((i) => s.has(i)), ...o.filter((i) => !s.has(i))]);\n }\n\n /** Move each selected drawing one step up past the nearest unselected one. */\n bringForward(ids: readonly string[] = this.selection()): void {\n this.reorder(ids, (o, s) => {\n for (let i = o.length - 2; i >= 0; i--) if (s.has(o[i]!) && !s.has(o[i + 1]!)) [o[i], o[i + 1]] = [o[i + 1]!, o[i]!];\n return o;\n });\n }\n\n sendBackward(ids: readonly string[] = this.selection()): void {\n this.reorder(ids, (o, s) => {\n for (let i = 1; i < o.length; i++) if (s.has(o[i]!) && !s.has(o[i - 1]!)) [o[i], o[i - 1]] = [o[i - 1]!, o[i]!];\n return o;\n });\n }\n\n /** Copy the selection (or `ids`) to the plugin's clipboard; returns the copies. */\n copy(ids: readonly string[] = this.selection()): Drawing[] {\n this.clipboard = ids.map((i) => clone(this.store.require(i)));\n return clone(this.clipboard);\n }\n\n /**\n * Paste the clipboard as new drawings (one undo step) and select them. With\n * `at`, the first copy's first anchor lands there and the others keep their\n * offsets; without, the copies sit exactly on the originals.\n */\n paste(at?: { time: number; price: number }): Drawing[] {\n if (this.clipboard.length === 0) return [];\n const ref = this.clipboard.find((d) => d.anchors.length > 0)?.anchors[0];\n const dt = at && ref ? at.time - ref.time : 0, dp = at && ref ? at.price - ref.price : 0;\n return this.pasteShifted(dt, dp);\n }\n\n /** Copy + paste the selection shifted by DUPLICATE_BARS bars in time (price unchanged). */\n duplicate(): Drawing[] {\n if (this.selected.size === 0) return [];\n const bar = this.barMs();\n this.copy();\n return this.pasteShifted(DUPLICATE_BARS * bar, 0);\n }\n\n private barMs(): number {\n const v = this.intervalMs ?? (this.source && this.source.length > 1 ? this.source.interval : null);\n if (v === null) throw new Error(\"drawings: the bar interval is unknown; pass `interval` or a `source` with two bars\");\n return v;\n }\n\n private pasteShifted(dt: number, dp: number): Drawing[] {\n const adds: Command[] = [];\n const made: Drawing[] = [];\n let at = this.store.list.length;\n for (const src of this.clipboard) {\n const d = clone(src);\n d.id = this.newId();\n d.locked = false;\n d.anchors = d.anchors.map((a) => ({ time: a.time + dt, price: a.price + dp }));\n this.validate(d);\n adds.push(new AddCommand(d, at++));\n made.push(d);\n }\n this.exec(new BatchCommand(\"paste\", adds));\n this.select(made.map((d) => d.id));\n return clone(made);\n }\n\n // ---- templates -------------------------------------------------------------------\n\n /** Save a drawing's style as a named template for its tool. */\n async saveTemplate(id: string, name: string): Promise<void> {\n if (!this.templates) throw new Error(\"drawings: pass `store` to DrawingsPlugin to keep templates\");\n await this.templates.save(name, this.store.require(id));\n }\n\n /** Apply a saved template's style and props to drawings of that tool (one undo step). */\n async applyTemplate(ids: readonly string[], name: string): Promise<void> {\n if (!this.templates) throw new Error(\"drawings: pass `store` to DrawingsPlugin to keep templates\");\n const tools = new Set(ids.map((i) => this.store.require(i).tool));\n if (tools.size !== 1) throw new Error(\"drawings: a template applies to drawings of one tool\");\n const t = await this.templates.load([...tools][0]!, name);\n this.updateMany(ids, { style: t.style, props: t.props });\n }\n\n // ---- persistence -----------------------------------------------------------------\n\n toJSON(): DrawingsState {\n return { version: SCHEMA_VERSION, drawings: this.list() };\n }\n\n /** Throws what `fromJSON(state)` would, changing nothing (the core's `restoreState` calls it before it replaces anything). */\n validateState(state: unknown): void {\n this.parseState(state);\n }\n\n private parseState(state: unknown): Drawing[] {\n if (typeof state !== \"object\" || state === null) throw new TypeError(\"drawings: saved state must be an object\");\n const s = state as Partial<DrawingsState>;\n if (typeof s.version !== \"number\" || !Number.isInteger(s.version) || s.version < 1) throw new TypeError(`drawings: invalid saved version ${String(s.version)}`);\n if (s.version > SCHEMA_VERSION) throw new RangeError(`drawings: saved version ${s.version} is newer than this library understands (${SCHEMA_VERSION})`);\n if (!Array.isArray(s.drawings)) throw new TypeError(\"drawings: saved state has no drawings array\");\n const ids = new Set<string>();\n const next = s.drawings.map((raw) => {\n const d = clone(raw as Drawing);\n this.validate(d);\n if (ids.has(d.id)) throw new Error(`drawings: saved state repeats id \"${d.id}\"`);\n ids.add(d.id);\n return d;\n });\n return next;\n }\n\n fromJSON(state: unknown): void {\n const next = this.parseState(state);\n const gone = this.store.list.map(clone);\n this.store.clear();\n next.forEach((d, i) => this.store.insert(d, i));\n for (const d of next) {\n const n = /^d(\\d+)$/.exec(d.id);\n if (n) this.nextId = Math.max(this.nextId, Number(n[1]) + 1);\n }\n this.history.clear();\n this.selected.clear();\n this.creating = null;\n this.drag = null;\n this.hover = null;\n this.loading = true;\n try {\n gone.forEach((d) => this.events.emit(\"removed\", d));\n next.forEach((d) => this.events.emit(\"created\", clone(d)));\n } finally {\n this.loading = false;\n }\n this.events.emit(\"selected\", []);\n this.events.emit(\"history\", { canUndo: false, canRedo: false });\n this.render();\n }\n\n // ---- geometry helpers ---------------------------------------------------------------\n\n private render(): void {\n this.api?.requestRender();\n }\n\n private report(e: unknown, d: Drawing | null): void {\n const err = e instanceof Error ? e : new Error(String(e));\n const key = `${d?.id ?? \"\"}:${err.message}`;\n if (this.reported.has(key)) return;\n this.reported.add(key);\n this.onError(err, d ? clone(d) : null);\n }\n\n private measure = (t: string, f: string): number => {\n if (this.measureCanvas === undefined) {\n this.measureCanvas = typeof document !== \"undefined\" ? document.createElement(\"canvas\").getContext(\"2d\") : null;\n }\n const c = this.measureCanvas;\n if (!c) return t.length * parseFloat(f.match(/(\\d+(?:\\.\\d+)?)px/)?.[1] ?? \"12\") * 0.6;\n c.font = f;\n return c.measureText(t).width;\n };\n\n private sourceInterval(): number | null {\n return this.intervalMs ?? (this.source && this.source.length > 1 ? this.source.interval : null);\n }\n\n private ctxFor(v: PluginPaneView): ToolCtx {\n return {\n W: v.width, H: v.height, dpr: v.dpr,\n X: (t) => v.timeToX(t), Y: (p) => v.priceToY(p), T: (x) => v.xToTime(x), P: (y) => v.yToPrice(y),\n fmt: (p) => v.formatPrice(p),\n source: this.source,\n interval: this.sourceInterval(),\n };\n }\n\n private visible(d: Drawing): boolean {\n if (d.hidden) return false;\n if (d.intervals === null) return true;\n const iv = this.intervalMs;\n if (iv === null) {\n this.report(new Error(\"the chart interval is unknown (call setInterval); drawings limited to intervals are shown on every interval\"), d);\n return true;\n }\n return d.intervals.includes(iv);\n }\n\n private shapesOf(d: Drawing, c: ToolCtx): Shape[] {\n try {\n return this.toolDef(d.tool).shapes(d, c);\n } catch (e) {\n this.report(e, d);\n return [];\n }\n }\n\n private handlePoints(d: Drawing, c: ToolCtx): Array<{ x: number; y: number }> {\n const def = this.toolDef(d.tool);\n if (def.noHandles || d.locked) return [];\n if (def.screen) return [{ x: (d.props.fx as number) * c.W, y: (d.props.fy as number) * c.H }];\n try {\n return def.handlePoints ? def.handlePoints(d, c) : d.anchors.map((a) => ({ x: c.X(a.time), y: c.Y(a.price) }));\n } catch (e) {\n this.report(e, d);\n return [];\n }\n }\n\n private tolerance(type?: string): number {\n return TOLERANCE[type ?? this.last?.pointerType ?? \"mouse\"] ?? TOLERANCE.mouse!;\n }\n\n /**\n * What is under a pane point: a handle of a selected drawing first (topmost\n * selected wins), else the topmost visible drawing within `tol` px.\n */\n hitTest(pane: number, x: number, y: number, tol = this.tolerance()): { id: string; handle: number | null } | null {\n if (!this.api) throw new Error(\"drawings: the plugin is not installed on a chart\");\n const view = this.api.paneView(pane);\n const c = this.ctxFor(view);\n const list = this.store.list;\n for (let i = list.length - 1; i >= 0; i--) {\n const d = list[i]!;\n if (d.pane !== pane || !this.selected.has(d.id) || d.locked) continue;\n const hp = this.handlePoints(d, c);\n for (let h = 0; h < hp.length; h++) if (dist(x, y, hp[h]!.x, hp[h]!.y) <= tol + 3) return { id: d.id, handle: h };\n }\n for (let i = list.length - 1; i >= 0; i--) {\n const d = list[i]!;\n if (d.pane !== pane || !this.visible(d)) continue;\n for (const s of this.shapesOf(d, c)) {\n if (shapeDistance(s, x, y, c.W, c.H, d.style, this.measure) <= tol) return { id: d.id, handle: null };\n }\n }\n return null;\n }\n\n /** Snap a pointer position to the nearest bar's O/H/L/C according to the magnet mode. */\n snap(e: Pick<PluginPointer, \"pane\" | \"x\" | \"y\" | \"time\" | \"price\">): Anchor {\n const raw = { time: e.time, price: e.price };\n if (this.magnetMode === \"off\" || !this.source || this.source.length === 0 || e.pane !== 0 || !this.api) return raw;\n const v = this.api.paneView(0);\n const bar = this.source.nearest(e.time);\n if (!bar) return raw;\n const bx = v.timeToX(bar.time);\n let best: { price: number; d: number } | null = null;\n for (const p of [bar.open, bar.high, bar.low, bar.close]) {\n const d = Math.abs(v.priceToY(p) - e.y);\n if (!best || d < best.d) best = { price: p, d };\n }\n if (!best) return raw;\n if (this.magnetMode === \"weak\" && (best.d > WEAK_MAGNET_PX || Math.abs(bx - e.x) > WEAK_MAGNET_PX)) return raw;\n return { time: bar.time, price: best.price };\n }\n\n // ---- drawing ------------------------------------------------------------------------\n\n drawPane(ctx: CanvasRenderingContext2D, view: PluginPaneView): void {\n const c = this.ctxFor(view);\n const frame: Array<{ d: Drawing; shapes: Shape[] }> = [];\n for (const d of this.store.list) if (d.pane === view.pane && this.visible(d)) frame.push({ d, shapes: this.shapesOf(d, c) });\n // the price labels of levels close together give way to one another (a shape of this frame only)\n const labels: Array<{ s: Extract<Shape, { k: \"text\" }>; style: DrawingStyle }> = [];\n for (const { d, shapes } of frame) for (const s of shapes) if (s.k === \"text\" && s.stack) labels.push({ s, style: d.style });\n if (labels.length > 1) declutter(labels, this.measure);\n for (const { d, shapes } of frame) {\n const sel = this.selected.has(d.id);\n drawShapes(ctx, shapes, d.style, c.W, c.H, { widthBoost: sel || d.id === this.hover ? 0.5 : 0 });\n }\n for (const d of this.store.list) {\n if (d.pane !== view.pane || !this.selected.has(d.id) || !this.visible(d)) continue;\n for (const p of this.handlePoints(d, c)) {\n ctx.beginPath();\n ctx.arc(p.x, p.y, 4, 0, Math.PI * 2);\n ctx.fillStyle = \"#ffffff\";\n ctx.fill();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = d.style.color;\n ctx.stroke();\n }\n }\n const cr = this.creating;\n if (cr && cr.pane === view.pane) {\n const d = this.previewDrawing(cr);\n if (d) {\n ctx.save();\n drawShapes(ctx, this.shapesOf(d, c), d.style, c.W, c.H);\n ctx.restore();\n for (const a of cr.anchors) {\n ctx.beginPath();\n ctx.arc(c.X(a.time), c.Y(a.price), 3.5, 0, Math.PI * 2);\n ctx.fillStyle = d.style.color;\n ctx.fill();\n }\n }\n }\n const b = this.drag;\n if (b?.kind === \"box\" && b.pane === view.pane) {\n ctx.save();\n ctx.strokeStyle = \"#2962ff\";\n ctx.fillStyle = \"rgba(41,98,255,0.12)\";\n ctx.lineWidth = 1;\n ctx.setLineDash([4, 3]);\n ctx.fillRect(Math.min(b.x0, b.x1), Math.min(b.y0, b.y1), Math.abs(b.x1 - b.x0), Math.abs(b.y1 - b.y0));\n ctx.strokeRect(Math.min(b.x0, b.x1) + 0.5, Math.min(b.y0, b.y1) + 0.5, Math.abs(b.x1 - b.x0), Math.abs(b.y1 - b.y0));\n ctx.restore();\n }\n }\n\n /** The drawing being created, with the rubber-band anchor filling the rest. */\n private previewDrawing(cr: Creating): Drawing | null {\n const def = cr.def;\n const anchors = [...cr.anchors];\n if (def.screen) {\n if (!cr.screenPos) return null;\n } else {\n const p = cr.pointer ?? anchors[anchors.length - 1];\n if (!p) return null;\n if (def.gesture === \"freehand\") {\n if (anchors.length < 2) return null;\n } else if (def.variable) {\n anchors.push(p);\n if (anchors.length < def.anchors) while (anchors.length < def.anchors) anchors.push(p);\n } else {\n while (anchors.length < def.anchors) anchors.push(p);\n }\n }\n const d = this.build({ tool: def.id, pane: cr.pane, id: \"__preview__\", ...(cr.screenPos ? { props: cr.screenPos } : {}) }, anchors, null);\n this.constrainAll(d);\n return d;\n }\n\n private constrainAll(d: Drawing): void {\n const def = this.toolDef(d.tool);\n if (def.constrain) for (let i = 0; i < d.anchors.length; i++) def.constrain(d, i);\n }\n\n // ---- pointer -------------------------------------------------------------------------\n\n pointer(e: PluginPointer): boolean {\n if (this.options.readOnly) return false;\n this.last = { pane: e.pane, x: e.x, y: e.y, time: e.time, price: e.price, pointerType: e.pointerType };\n switch (e.type) {\n case \"down\": return this.onDown(e);\n case \"move\": return this.onMove(e);\n case \"up\": return this.onUp(e);\n case \"click\": return this.onClick(e);\n case \"dblclick\": return this.onDouble(e);\n case \"leave\":\n if (this.hover) {\n this.hover = null;\n this.render();\n }\n return false;\n }\n }\n\n private onDown(e: PluginPointer): boolean {\n if (this.creating) return true;\n if (this.tool) return this.beginCreate(e);\n const hit = this.hitTest(e.pane, e.x, e.y, this.tolerance(e.pointerType));\n if (!hit) {\n if (e.shiftKey) {\n this.drag = { kind: \"box\", pane: e.pane, x0: e.x, y0: e.y, x1: e.x, y1: e.y };\n return true;\n }\n return false;\n }\n const d = this.store.require(hit.id);\n if (hit.handle !== null) {\n this.drag = { kind: \"handle\", pane: e.pane, id: d.id, index: hit.handle, before: clone(d), moved: false };\n return true;\n }\n let clickOnly: { id: string; shift: boolean } | null = null;\n if (e.shiftKey) {\n if (this.selected.has(d.id)) clickOnly = { id: d.id, shift: true };\n else this.select([...this.selected, d.id]);\n } else if (!this.selected.has(d.id)) this.select([d.id]);\n else if (this.selected.size > 1) clickOnly = { id: d.id, shift: false };\n const movers = [...this.selected].map((id) => this.store.require(id)).filter((m) => !m.locked && m.pane === e.pane);\n this.drag = {\n kind: \"move\", pane: e.pane, start: { x: e.x, y: e.y }, before: movers.map(clone),\n startAnchors: new Map(movers.map((m) => [m.id, clone(m.anchors)])),\n startScreen: new Map(movers.filter((m) => this.toolDef(m.tool).screen).map((m) => [m.id, { fx: m.props.fx as number, fy: m.props.fy as number }])),\n moved: false, clickOnly,\n };\n return true;\n }\n\n private beginCreate(e: PluginPointer): boolean {\n const def = this.toolDef(this.tool!);\n const a = this.snap(e);\n const view = this.api!.paneView(e.pane);\n this.creating = {\n def, pane: e.pane, anchors: def.screen ? [] : [a], pointer: a, fresh: true,\n downPx: { x: e.x, y: e.y }, lastPx: { x: e.x, y: e.y },\n screenPos: def.screen ? { fx: e.x / view.width, fy: e.y / view.height } : null,\n };\n this.render();\n return true;\n }\n\n private onMove(e: PluginPointer): boolean {\n const cr = this.creating;\n if (cr) {\n if (e.pane !== cr.pane) return true;\n cr.pointer = this.snap(e);\n if (cr.screenPos) cr.screenPos = { fx: e.x / this.api!.paneView(cr.pane).width, fy: e.y / this.api!.paneView(cr.pane).height };\n if (cr.def.gesture === \"freehand\" && cr.fresh && (e.buttons & 1)) {\n if (dist(e.x, e.y, cr.lastPx.x, cr.lastPx.y) >= 3) {\n cr.anchors.push(cr.pointer);\n cr.lastPx = { x: e.x, y: e.y };\n }\n }\n this.render();\n return true;\n }\n const d = this.drag;\n if (d) {\n if (d.kind === \"box\") {\n d.x1 = e.x;\n d.y1 = e.y;\n } else if (d.kind === \"move\") this.dragMove(d, e);\n else this.dragHandle(d, e);\n this.render();\n return true;\n }\n if (this.tool) return false;\n const hit = this.hitTest(e.pane, e.x, e.y, this.tolerance(e.pointerType));\n const id = hit?.id ?? null;\n if (id !== this.hover) {\n this.hover = id;\n this.render();\n }\n return false;\n }\n\n private dragMove(d: Extract<Drag, { kind: \"move\" }>, e: PluginPointer): void {\n const dx = e.x - d.start.x, dy = e.y - d.start.y;\n if (!d.moved && Math.hypot(dx, dy) < DRAG_SLOP) return;\n d.moved = true;\n const v = this.api!.paneView(d.pane);\n for (const b of d.before) {\n const cur = this.store.require(b.id);\n const def = this.toolDef(b.tool);\n if (def.screen) {\n const s0 = d.startScreen.get(b.id)!;\n cur.props.fx = s0.fx + dx / v.width;\n cur.props.fy = s0.fy + dy / v.height;\n continue;\n }\n const a0 = d.startAnchors.get(b.id)!;\n // Move in pixels so the shape keeps its on-screen form across non-trading gaps.\n cur.anchors = a0.map((a) => ({ time: v.xToTime(v.timeToX(a.time) + dx), price: v.yToPrice(v.priceToY(a.price) + dy) }));\n }\n }\n\n private dragHandle(d: Extract<Drag, { kind: \"handle\" }>, e: PluginPointer): void {\n const cur = this.store.require(d.id);\n const def = this.toolDef(cur.tool);\n if (def.screen) return;\n d.moved = true;\n const a = this.snap(e);\n cur.anchors[d.index] = { time: a.time, price: a.price };\n def.constrain?.(cur, d.index);\n }\n\n private onUp(e: PluginPointer): boolean {\n const cr = this.creating;\n if (cr) return this.upCreate(cr, e);\n const d = this.drag;\n if (!d) return false;\n this.drag = null;\n if (d.kind === \"box\") {\n this.finishBox(d);\n return true;\n }\n if (d.kind === \"handle\") {\n const cur = this.store.require(d.id);\n if (d.moved && JSON.stringify(cur) !== JSON.stringify(d.before)) {\n try {\n this.validate(cur);\n } catch (err) {\n Object.assign(cur, d.before);\n this.report(err, cur);\n this.render();\n return true;\n }\n this.history.record(new PatchCommand(\"edit\", [d.before], [clone(cur)]));\n this.events.emit(\"changed\", clone(cur));\n this.events.emit(\"history\", { canUndo: true, canRedo: false });\n }\n this.render();\n return true;\n }\n if (d.moved) {\n const after = d.before.map((b) => clone(this.store.require(b.id)));\n this.history.record(new PatchCommand(\"move\", d.before, after));\n after.forEach((a) => this.events.emit(\"changed\", a));\n this.events.emit(\"history\", { canUndo: true, canRedo: false });\n } else if (d.clickOnly) {\n if (d.clickOnly.shift) this.select([...this.selected].filter((i) => i !== d.clickOnly!.id));\n else this.select([d.clickOnly.id]);\n }\n this.render();\n return true;\n }\n\n private finishBox(b: Extract<Drag, { kind: \"box\" }>): void {\n const view = this.api!.paneView(b.pane);\n const c = this.ctxFor(view);\n const ids: string[] = [];\n for (const d of this.store.list) {\n if (d.pane !== b.pane || !this.visible(d)) continue;\n if (this.shapesOf(d, c).some((s) => shapeInRect(s, b.x0, b.y0, b.x1, b.y1, c.W, c.H))) ids.push(d.id);\n }\n this.select(ids);\n }\n\n /** Select every visible drawing of a pane with a point inside the rectangle (CSS px). */\n selectInRect(pane: number, x0: number, y0: number, x1: number, y1: number): string[] {\n if (!this.api) throw new Error(\"drawings: the plugin is not installed on a chart\");\n this.finishBox({ kind: \"box\", pane, x0, y0, x1, y1 });\n return this.selection();\n }\n\n private upCreate(cr: Creating, e: PluginPointer): boolean {\n if (e.pane !== cr.pane) return true;\n const a = this.snap(e);\n cr.pointer = a;\n const def = cr.def;\n if (def.gesture === \"single\") {\n this.commit(cr);\n return true;\n }\n if (def.gesture === \"freehand\") {\n if (cr.anchors.length >= 2) this.commit(cr);\n else this.cancelCreate();\n return true;\n }\n if (cr.fresh) {\n cr.fresh = false;\n if (dist(cr.downPx.x, cr.downPx.y, e.x, e.y) > DRAG_SLOP) cr.anchors.push(a);\n } else {\n cr.anchors.push(a);\n }\n if (!def.variable && cr.anchors.length >= def.anchors) this.commit(cr);\n else this.render();\n return true;\n }\n\n private onClick(_e: PluginPointer): boolean {\n if (this.creating || this.tool) return true;\n // A click that no drawing took (the press was not consumed): clear the selection.\n if (this.selected.size > 0) this.select([]);\n return false;\n }\n\n private onDouble(_e: PluginPointer): boolean {\n const cr = this.creating;\n if (!cr || !cr.def.variable) return false;\n // The two clicks of a double click each placed an anchor on the same spot.\n const n = cr.anchors.length;\n if (n >= 2) {\n const p = cr.anchors[n - 1]!, q = cr.anchors[n - 2]!;\n const v = this.api!.paneView(cr.pane);\n if (dist(v.timeToX(p.time), v.priceToY(p.price), v.timeToX(q.time), v.priceToY(q.price)) <= DRAG_SLOP) cr.anchors.pop();\n }\n this.finishVariable(cr);\n return true;\n }\n\n private finishVariable(cr: Creating): void {\n if (cr.anchors.length >= cr.def.anchors) this.commit(cr);\n else this.cancelCreate();\n }\n\n cancelCreate(): void {\n this.creating = null;\n this.render();\n }\n\n private commit(cr: Creating): void {\n this.creating = null;\n const def = cr.def;\n let anchors = cr.anchors;\n if (def.gesture === \"single\" && !def.screen) anchors = [cr.pointer ?? anchors[0]!];\n try {\n const view = this.api!.paneView(cr.pane);\n const d = this.build({ tool: def.id, pane: cr.pane, ...(cr.screenPos ? { props: cr.screenPos } : {}) }, anchors, view);\n this.constrainAll(d);\n this.validate(d);\n this.exec(new AddCommand(d, this.store.list.length));\n if (!this.continuous) {\n this.tool = null;\n this.events.emit(\"tool\", null);\n }\n this.select([d.id]);\n } catch (err) {\n this.report(err, null);\n this.render();\n }\n }\n\n cursor(pane: number, x: number, y: number): string | null {\n if (this.options.readOnly) return null;\n if (this.tool || this.creating) return \"crosshair\";\n if (this.drag) return this.drag.kind === \"move\" ? \"move\" : \"pointer\";\n if (!this.api) return null;\n const hit = this.hitTest(pane, x, y);\n if (!hit) return null;\n return hit.handle !== null ? \"pointer\" : this.store.require(hit.id).locked ? \"default\" : \"move\";\n }\n\n // ---- keyboard -------------------------------------------------------------------------\n\n key(e: KeyboardEvent): boolean {\n if (this.options.readOnly) return false;\n const mod = e.metaKey || e.ctrlKey;\n const k = e.key;\n if (k === \"Escape\") {\n if (this.drag) {\n this.cancelDrag();\n return true;\n }\n if (this.creating) {\n this.cancelCreate();\n return true;\n }\n if (this.tool) {\n this.setTool(null);\n return true;\n }\n if (this.selected.size) {\n this.select([]);\n return true;\n }\n return false;\n }\n if (k === \"Enter\" && this.creating?.def.variable) {\n this.finishVariable(this.creating);\n return true;\n }\n if (k === \"Delete\" || k === \"Backspace\") {\n const ids = [...this.selected].filter((id) => !this.store.require(id).locked);\n if (ids.length === 0) return false;\n this.remove(ids);\n return true;\n }\n if (mod && (k === \"z\" || k === \"Z\")) return e.shiftKey ? this.redo() : this.undo();\n if (mod && (k === \"y\" || k === \"Y\")) return this.redo();\n if (mod && (k === \"c\" || k === \"C\")) {\n if (this.selected.size === 0) return false;\n this.copy();\n return true;\n }\n if (mod && (k === \"v\" || k === \"V\")) {\n if (this.clipboard.length === 0) return false;\n this.paste(this.last ? { time: this.last.time, price: this.last.price } : undefined);\n return true;\n }\n if (mod && (k === \"d\" || k === \"D\")) {\n if (this.selected.size === 0) return false;\n this.duplicate();\n return true;\n }\n return false;\n }\n\n private cancelDrag(): void {\n const d = this.drag;\n this.drag = null;\n if (!d || d.kind === \"box\") return this.render();\n if (d.kind === \"handle\") Object.assign(this.store.require(d.id), clone(d.before));\n else for (const b of d.before) Object.assign(this.store.require(b.id), clone(b));\n this.render();\n }\n}\n","// The bars drawings read: anchored VWAP, volume profile, bar counts, magnet\n// snapping, bars pattern. The chart core has no public range iteration over\n// series data, so the integrator, who owns the data, hands the plugin a\n// BarSource. ArrayBarSource is one over columnar Float64Arrays that mirrors\n// Series.setData / update / prepend.\n\nexport interface Bar {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n}\n\nexport interface BarSource {\n /** Bumps on every mutation: caches key on it. */\n readonly version: number;\n readonly length: number;\n /** Bar at array position i (0 = oldest). Throws when out of range. */\n at(i: number): Bar;\n /** Bar whose time is nearest to `time`, or undefined when empty. */\n nearest(time: number): Bar | undefined;\n /** Fractional position of `time` in the bar sequence: integer at a bar, linear between bars, extrapolated by the median interval outside. */\n logical(time: number): number;\n /** Inverse of logical(). */\n timeAtLogical(l: number): number;\n /** Index range [lo, hi) of bars with from <= time <= to. */\n range(from: number, to: number): [number, number];\n /** Median bar interval in ms. */\n readonly interval: number;\n}\n\nexport interface ColumnarBars {\n time: ArrayLike<number>;\n open: ArrayLike<number>;\n high: ArrayLike<number>;\n low: ArrayLike<number>;\n close: ArrayLike<number>;\n volume?: ArrayLike<number> | undefined;\n}\n\nexport class ArrayBarSource implements BarSource {\n private t: number[] = [];\n private o: number[] = [];\n private h: number[] = [];\n private l: number[] = [];\n private c: number[] = [];\n private v: number[] = [];\n private ver = 0;\n private cachedInterval = 0;\n\n constructor(data?: ColumnarBars) {\n if (data) this.setData(data);\n }\n\n get version(): number {\n return this.ver;\n }\n\n get length(): number {\n return this.t.length;\n }\n\n setData(d: ColumnarBars): void {\n const n = d.time.length;\n for (const k of [\"open\", \"high\", \"low\", \"close\"] as const) {\n if (d[k].length !== n) throw new RangeError(`ArrayBarSource: ${k} has ${d[k].length} rows, time has ${n}`);\n }\n if (d.volume && d.volume.length !== n) throw new RangeError(`ArrayBarSource: volume has ${d.volume.length} rows, time has ${n}`);\n for (let i = 1; i < n; i++) if (!(d.time[i]! > d.time[i - 1]!)) throw new RangeError(`ArrayBarSource: times must be strictly increasing (row ${i})`);\n this.t = Array.from(d.time);\n this.o = Array.from(d.open);\n this.h = Array.from(d.high);\n this.l = Array.from(d.low);\n this.c = Array.from(d.close);\n this.v = d.volume ? Array.from(d.volume) : new Array<number>(n).fill(0);\n this.touch();\n }\n\n /** Same time replaces the last bar; a later time appends. */\n update(b: Bar): void {\n const n = this.t.length;\n if (n > 0 && b.time < this.t[n - 1]!) throw new RangeError(`ArrayBarSource.update: time ${b.time} is before the last bar`);\n if (n > 0 && b.time === this.t[n - 1]) {\n this.o[n - 1] = b.open; this.h[n - 1] = b.high; this.l[n - 1] = b.low; this.c[n - 1] = b.close; this.v[n - 1] = b.volume;\n } else {\n this.t.push(b.time); this.o.push(b.open); this.h.push(b.high); this.l.push(b.low); this.c.push(b.close); this.v.push(b.volume);\n }\n this.touch();\n }\n\n /** Older history, all earlier than the first bar. */\n prepend(d: ColumnarBars): void {\n const n = d.time.length;\n if (n === 0) return;\n if (this.t.length && !(d.time[n - 1]! < this.t[0]!)) throw new RangeError(\"ArrayBarSource.prepend: bars must all be earlier than the first bar\");\n const older = new ArrayBarSource(d);\n this.t = [...older.t, ...this.t];\n this.o = [...older.o, ...this.o];\n this.h = [...older.h, ...this.h];\n this.l = [...older.l, ...this.l];\n this.c = [...older.c, ...this.c];\n this.v = [...older.v, ...this.v];\n this.touch();\n }\n\n private touch(): void {\n this.ver++;\n this.cachedInterval = 0;\n }\n\n at(i: number): Bar {\n if (!(i >= 0 && i < this.t.length) || !Number.isInteger(i)) throw new RangeError(`ArrayBarSource.at: index ${i} outside 0..${this.t.length - 1}`);\n return { time: this.t[i]!, open: this.o[i]!, high: this.h[i]!, low: this.l[i]!, close: this.c[i]!, volume: this.v[i]! };\n }\n\n /** First index with time >= t. */\n private lower(t: number): number {\n let lo = 0, hi = this.t.length;\n while (lo < hi) {\n const m = (lo + hi) >> 1;\n if (this.t[m]! < t) lo = m + 1;\n else hi = m;\n }\n return lo;\n }\n\n nearest(time: number): Bar | undefined {\n const n = this.t.length;\n if (n === 0) return undefined;\n const i = this.lower(time);\n if (i === 0) return this.at(0);\n if (i === n) return this.at(n - 1);\n return time - this.t[i - 1]! <= this.t[i]! - time ? this.at(i - 1) : this.at(i);\n }\n\n get interval(): number {\n if (this.cachedInterval > 0) return this.cachedInterval;\n const n = this.t.length;\n if (n < 2) throw new RangeError(\"ArrayBarSource.interval: needs at least two bars\");\n const d: number[] = [];\n for (let i = n - 1; i > 0 && d.length < 15; i--) d.push(this.t[i]! - this.t[i - 1]!);\n d.sort((a, b) => a - b);\n return (this.cachedInterval = d[d.length >> 1]!);\n }\n\n logical(time: number): number {\n const n = this.t.length;\n if (n === 0) throw new RangeError(\"ArrayBarSource.logical: no bars\");\n if (n === 1) return 0;\n if (time <= this.t[0]!) return (time - this.t[0]!) / this.interval;\n if (time >= this.t[n - 1]!) return n - 1 + (time - this.t[n - 1]!) / this.interval;\n const i = this.lower(time);\n const ti = this.t[i]!;\n if (ti === time) return i;\n const tp = this.t[i - 1]!;\n return i - 1 + (time - tp) / (ti - tp);\n }\n\n timeAtLogical(l: number): number {\n const n = this.t.length;\n if (n === 0) throw new RangeError(\"ArrayBarSource.timeAtLogical: no bars\");\n if (l <= 0) return this.t[0]! + l * this.interval;\n if (l >= n - 1) return this.t[n - 1]! + (l - (n - 1)) * this.interval;\n const i = Math.floor(l);\n return this.t[i]! + (l - i) * (this.t[i + 1]! - this.t[i]!);\n }\n\n range(from: number, to: number): [number, number] {\n const lo = this.lower(from);\n let hi = this.lower(to);\n if (hi < this.t.length && this.t[hi] === to) hi++;\n return [lo, Math.max(lo, hi)];\n }\n}\n","// Helpers shared by tool modules: anchor access, shape constructors, the\n// arithmetic behind every number a tool prints.\n\nimport type { Pt } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { BarSource } from \"../source.js\";\nimport type { Anchor, Drawing, DrawingStyle, Shape, Stroke, ToolCtx, ToolDef } from \"../types.js\";\n\n/** Anchor i of a drawing; a missing one is a bug in the caller, not a default. */\nexport function A(d: Drawing, i: number): Anchor {\n const a = d.anchors[i];\n if (!a) throw new Error(`drawings: ${d.tool} \"${d.id}\" has no anchor ${i} (has ${d.anchors.length})`);\n return a;\n}\n\nexport const px = (c: ToolCtx, a: Anchor): Pt => ({ x: c.X(a.time), y: c.Y(a.price) });\nexport const pxs = (c: ToolCtx, d: Drawing): Pt[] => d.anchors.map((a) => px(c, a));\n\nexport function prop<T>(d: Drawing, key: string): T {\n if (!(key in d.props)) throw new Error(`drawings: ${d.tool} \"${d.id}\" is missing prop \"${key}\"`);\n return d.props[key] as T;\n}\n\nexport function numProp(d: Drawing, key: string): number {\n const v = prop<unknown>(d, key);\n if (typeof v !== \"number\" || !Number.isFinite(v)) throw new TypeError(`drawings: ${d.tool} \"${d.id}\" prop \"${key}\" must be a finite number, got ${String(v)}`);\n return v;\n}\n\nexport function levelsProp(d: Drawing): number[] {\n const v = prop<unknown>(d, \"levels\");\n if (!Array.isArray(v) || v.some((x) => typeof x !== \"number\" || !Number.isFinite(x))) throw new TypeError(`drawings: ${d.tool} \"${d.id}\" prop \"levels\" must be an array of finite numbers`);\n return v as number[];\n}\n\n// ---- shapes -------------------------------------------------------------------\n\nexport function line(a: Pt, b: Pt, o: Stroke & { extA?: boolean; extB?: boolean } = {}): Shape {\n return { k: \"line\", x1: a.x, y1: a.y, x2: b.x, y2: b.y, ...o };\n}\n\nexport function poly(pts: readonly Pt[], o: Stroke & { close?: boolean; fill?: string | null } = {}): Shape {\n const flat: number[] = [];\n for (const p of pts) flat.push(p.x, p.y);\n return { k: \"poly\", pts: flat, ...o };\n}\n\n/** A filled polygon with no outline and no hit-test (bands, shading). */\nexport function shade(pts: readonly Pt[], fill: string): Shape {\n return poly(pts, { close: true, fill, width: 0, hit: false });\n}\n\nexport function text(x: number, y: number, t: string, o: Omit<Extract<Shape, { k: \"text\" }>, \"k\" | \"x\" | \"y\" | \"text\"> = {}): Shape {\n return { k: \"text\", x, y, text: t, ...o };\n}\n\n/** Filled arrow head at b for a shaft from a (hit-test off: the shaft carries the hit). */\nexport function head(a: Pt, b: Pt, size: number, color: string): Shape {\n const ang = Math.atan2(b.y - a.y, b.x - a.x), s = 0.45;\n return poly(\n [b, { x: b.x - size * Math.cos(ang - s), y: b.y - size * Math.sin(ang - s) }, { x: b.x - size * Math.cos(ang + s), y: b.y - size * Math.sin(ang + s) }],\n { close: true, fill: color, color, width: 0, hit: false },\n );\n}\n\n/** extendLeft/extendRight are in time terms: map them to the ends of the segment a→b (a may be the later one). */\nexport function extension(style: DrawingStyle, a: Pt, b: Pt): { extA: boolean; extB: boolean } {\n const aIsLeft = a.x <= b.x;\n return { extA: aIsLeft ? style.extendLeft : style.extendRight, extB: aIsLeft ? style.extendRight : style.extendLeft };\n}\n\nexport const lerp = (a: Pt, b: Pt, t: number): Pt => ({ x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t });\nexport const mid = (a: Pt, b: Pt): Pt => lerp(a, b, 0.5);\n\nexport function fillOf(style: DrawingStyle, alpha = 0.15): string {\n return style.fill ?? withAlpha(style.color, alpha);\n}\n\n// ---- readouts -----------------------------------------------------------------\n\nexport function fmtTime(t: number): string {\n if (!Number.isFinite(t)) throw new RangeError(`fmtTime: ${t}`);\n return new Date(t).toISOString().slice(0, 16).replace(\"T\", \" \");\n}\n\n/** Whole days/hours/minutes (seconds under a minute) of a duration in ms. */\nexport function fmtDuration(ms: number): string {\n const s = Math.round(Math.abs(ms) / 1000);\n if (s < 60) return `${s}s`;\n const d = Math.floor(s / 86400), h = Math.floor((s % 86400) / 3600), m = Math.floor((s % 3600) / 60);\n return [d ? `${d}d` : \"\", h ? `${h}h` : \"\", m ? `${m}m` : \"\"].filter(Boolean).join(\" \");\n}\n\nexport interface Measure {\n dPrice: number;\n /** Δ/|from|·100, or null when the start price is 0. */\n pct: number | null;\n /** Bars from a0 to a1 (fractional between bars), or null without a bar source. */\n bars: number | null;\n dTime: number;\n}\n\nexport function measure(a0: Anchor, a1: Anchor, source: BarSource | null): Measure {\n const dPrice = a1.price - a0.price;\n return {\n dPrice,\n pct: a0.price === 0 ? null : (dPrice / Math.abs(a0.price)) * 100,\n bars: source && source.length > 0 ? source.logical(a1.time) - source.logical(a0.time) : null,\n dTime: a1.time - a0.time,\n };\n}\n\nconst sign = (v: number) => (v < 0 ? \"-\" : v > 0 ? \"+\" : \"\");\n\nexport function barsText(bars: number): string {\n const r = Math.round(bars);\n return Math.abs(bars - r) < 1e-9 ? `${r}` : bars.toFixed(1);\n}\n\n/** \"+12.50 (+0.05%)\", then \"34 bars, 2h 5m\" when known. */\nexport function measureLines(m: Measure, c: ToolCtx): string[] {\n const pct = m.pct === null ? \"\" : ` (${sign(m.pct)}${Math.abs(m.pct).toFixed(2)}%)`;\n const out = [`${sign(m.dPrice)}${c.fmt(Math.abs(m.dPrice))}${pct}`];\n const tail = [m.bars === null ? \"\" : `${barsText(m.bars)} bars`, fmtDuration(m.dTime)].filter(Boolean).join(\", \");\n out.push(tail);\n return out;\n}\n\n/** Ratio b/a of two price moves, or null when a is 0. */\nexport function ratio(num: number, den: number): number | null {\n return den === 0 ? null : num / den;\n}\n\nexport function ratioText(r: number | null): string {\n return r === null ? \"n/a\" : (Math.round(r * 1000) / 1000).toString();\n}\n\nexport const FIB_COLORS: Record<string, string> = {\n \"0\": \"#787b86\", \"0.236\": \"#f23645\", \"0.382\": \"#ff9800\", \"0.5\": \"#4caf50\", \"0.618\": \"#089981\", \"0.786\": \"#00bcd4\",\n \"1\": \"#787b86\", \"1.272\": \"#9c27b0\", \"1.618\": \"#2962ff\", \"2\": \"#e91e63\", \"2.618\": \"#f23645\", \"3.618\": \"#9c27b0\", \"4.236\": \"#e91e63\",\n};\nexport const fibColor = (r: number): string => FIB_COLORS[String(r)] ?? \"#787b86\";\n\nexport const FIB_RETRACEMENT = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1, 1.618, 2.618, 3.618, 4.236];\nexport const FIB_BASIC = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1];\n\n/** Tool factory: fills the optional members so definitions stay short. */\nexport function tool(t: ToolDef): ToolDef {\n return t;\n}\n\nexport const lineDefaults = (style: Partial<DrawingStyle> = {}, props: Record<string, unknown> = {}) => () => ({ style, props });\n\nexport function needDistinctTimes(d: Drawing, i: number, j: number): void {\n if (A(d, i).time === A(d, j).time) throw new RangeError(`drawings: ${d.tool} \"${d.id}\" needs anchors ${i} and ${j} at different times`);\n}\n\n/** Validate every anchor is finite. */\nexport function finiteAnchors(d: Drawing): void {\n d.anchors.forEach((a, i) => {\n if (!Number.isFinite(a.time) || !Number.isFinite(a.price)) throw new TypeError(`drawings: ${d.tool} \"${d.id}\" anchor ${i} is not finite (${a.time}, ${a.price})`);\n });\n}\n","// Annotations: text, anchored text, note, anchored note, callout, comment,\n// price label, price note, signpost, flag mark, arrow, arrow marker, arrow\n// mark up, arrow mark down.\n//\n// \"Anchored\" text and notes are positioned on the pane (props.fx / props.fy,\n// fractions of its size) and stay put while the chart pans; every other tool\n// here is fixed to time + price.\n\nimport type { Pt } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { Drawing, Shape, ToolCtx, ToolDef } from \"../types.js\";\nimport { A, finiteAnchors, head, line, poly, px, pxs, text, tool } from \"./util.js\";\n\nconst BOX = { border: null, pad: 5 } as const;\n\nfunction content(d: Drawing, fallback: string): string {\n return d.style.text || fallback;\n}\n\nfunction screenPoint(d: Drawing, c: ToolCtx): Pt {\n const fx = d.props.fx, fy = d.props.fy;\n if (typeof fx !== \"number\" || typeof fy !== \"number\" || !Number.isFinite(fx) || !Number.isFinite(fy)) throw new TypeError(`drawings: ${d.tool} \"${d.id}\" needs numeric props fx and fy`);\n return { x: fx * c.W, y: fy * c.H };\n}\n\nexport const textTool = tool({\n id: \"text\", label: \"Text\", family: \"annotations\", gesture: \"single\", anchors: 1,\n defaults: () => ({ style: { text: \"Text\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n return [text(p.x, p.y, content(d, \"Text\"), { align: \"left\", base: \"middle\", textColor: d.style.color })];\n },\n});\n\nexport const anchoredText = tool({\n id: \"anchoredText\", label: \"Anchored text\", family: \"annotations\", gesture: \"single\", anchors: 0, screen: true,\n defaults: () => ({ style: { text: \"Text\" }, props: { fx: 0.5, fy: 0.5 } }),\n shapes(d, c) {\n const p = screenPoint(d, c);\n return [text(p.x, p.y, content(d, \"Text\"), { align: \"left\", base: \"middle\", textColor: d.style.color })];\n },\n});\n\nfunction noteShapes(d: Drawing, p: Pt): Shape[] {\n return [\n line(p, { x: p.x + 14, y: p.y - 14 }, { width: 1 }),\n { k: \"ellipse\", cx: p.x, cy: p.y, rx: 3, ry: 3, fill: d.style.color, width: 1 },\n text(p.x + 14, p.y - 14, content(d, \"Note\"), { align: \"left\", base: \"bottom\", bg: withAlpha(d.style.color, 0.9), textColor: \"#ffffff\", ...BOX }),\n ];\n}\n\nexport const note = tool({\n id: \"note\", label: \"Note\", family: \"annotations\", gesture: \"single\", anchors: 1,\n defaults: () => ({ style: { text: \"Note\" } }),\n validate: finiteAnchors,\n shapes: (d, c) => noteShapes(d, px(c, A(d, 0))),\n});\n\nexport const anchoredNote = tool({\n id: \"anchoredNote\", label: \"Anchored note\", family: \"annotations\", gesture: \"single\", anchors: 0, screen: true,\n defaults: () => ({ style: { text: \"Note\" }, props: { fx: 0.5, fy: 0.5 } }),\n shapes: (d, c) => noteShapes(d, screenPoint(d, c)),\n});\n\nexport const callout = tool({\n id: \"callout\", label: \"Callout\", family: \"annotations\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { text: \"Callout\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [target, boxAt] = pxs(c, d) as [Pt, Pt];\n return [\n line(boxAt, target, { width: 1 }),\n { k: \"ellipse\", cx: target.x, cy: target.y, rx: 3, ry: 3, fill: d.style.color, width: 1 },\n text(boxAt.x, boxAt.y, content(d, \"Callout\"), { align: \"center\", base: \"middle\", bg: withAlpha(d.style.color, 0.9), textColor: \"#ffffff\", ...BOX }),\n ];\n },\n});\n\nexport const comment = tool({\n id: \"comment\", label: \"Comment\", family: \"annotations\", gesture: \"single\", anchors: 1,\n defaults: () => ({ style: { text: \"Comment\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n return [\n poly([p, { x: p.x - 6, y: p.y - 14 }, { x: p.x + 6, y: p.y - 14 }], { close: true, fill: withAlpha(d.style.color, 0.9), width: 0, hit: false }),\n text(p.x, p.y - 14, content(d, \"Comment\"), { align: \"center\", base: \"bottom\", bg: withAlpha(d.style.color, 0.9), textColor: \"#ffffff\", ...BOX }),\n ];\n },\n});\n\nexport const priceLabel = tool({\n id: \"priceLabel\", label: \"Price label\", family: \"annotations\", gesture: \"single\", anchors: 1,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n const label = `${d.style.text ? d.style.text + \" \" : \"\"}${c.fmt(A(d, 0).price)}`;\n return [\n poly([p, { x: p.x + 8, y: p.y - 9 }, { x: p.x + 8, y: p.y + 9 }], { close: true, fill: d.style.color, width: 0, hit: false }),\n text(p.x + 8, p.y, label, { align: \"left\", base: \"middle\", bg: d.style.color, textColor: \"#ffffff\", ...BOX }),\n ];\n },\n});\n\nexport const priceNote = tool({\n id: \"priceNote\", label: \"Price note\", family: \"annotations\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const a = px(c, A(d, 0)), b = px(c, A(d, 1));\n const label = `${d.style.text ? d.style.text + \" \" : \"\"}${c.fmt(A(d, 0).price)}`;\n return [\n line(a, { x: b.x, y: a.y }, { dash: \"dashed\", width: 1 }),\n line({ x: b.x, y: a.y }, b, { width: 1 }),\n { k: \"ellipse\", cx: a.x, cy: a.y, rx: 3, ry: 3, fill: d.style.color, width: 1 },\n text(b.x, b.y, label, { align: \"center\", base: \"middle\", bg: d.style.color, textColor: \"#ffffff\", ...BOX }),\n ];\n },\n});\n\nexport const signpost = tool({\n id: \"signpost\", label: \"Signpost\", family: \"annotations\", gesture: \"single\", anchors: 1,\n defaults: () => ({ style: { text: \"Sign\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n const top = { x: p.x, y: p.y - 44 };\n return [\n line(p, top),\n { k: \"ellipse\", cx: p.x, cy: p.y, rx: 3, ry: 3, fill: d.style.color, width: 1 },\n text(top.x, top.y, content(d, \"Sign\"), { align: \"left\", base: \"bottom\", bg: d.style.color, textColor: \"#ffffff\", ...BOX }),\n ];\n },\n});\n\nexport const flagMark = tool({\n id: \"flagMark\", label: \"Flag mark\", family: \"annotations\", gesture: \"single\", anchors: 1,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n return [\n line(p, { x: p.x, y: p.y - 28 }),\n poly([{ x: p.x, y: p.y - 28 }, { x: p.x + 16, y: p.y - 22 }, { x: p.x, y: p.y - 16 }], { close: true, fill: d.style.color }),\n ];\n },\n});\n\nexport const arrow = tool({\n id: \"arrow\", label: \"Arrow\", family: \"annotations\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b] = pxs(c, d) as [Pt, Pt];\n return [line(a, b), head(a, b, 6 + d.style.width * 2, d.style.color)];\n },\n});\n\nexport const arrowMarker = tool({\n id: \"arrowMarker\", label: \"Arrow marker\", family: \"annotations\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { fill: \"#2962ff\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b] = pxs(c, d) as [Pt, Pt];\n const L = Math.hypot(b.x - a.x, b.y - a.y);\n if (L === 0) return [line(a, b)];\n const ux = (b.x - a.x) / L, uy = (b.y - a.y) / L, nx = -uy, ny = ux;\n const hl = Math.min(L * 0.45, 20), sw = 4, hw = 10;\n const at = (along: number, across: number): Pt => ({ x: a.x + ux * along + nx * across, y: a.y + uy * along + ny * across });\n return [poly([at(0, sw), at(L - hl, sw), at(L - hl, hw), at(L, 0), at(L - hl, -hw), at(L - hl, -sw), at(0, -sw)], { close: true, fill: d.style.fill ?? d.style.color })];\n },\n});\n\nfunction markShape(d: Drawing, p: Pt, dirUp: boolean): Shape[] {\n const s = dirUp ? 1 : -1; // tip is the anchor; the body extends away from the tip\n const pts: Pt[] = [\n p, { x: p.x - 9, y: p.y + s * 11 }, { x: p.x - 4, y: p.y + s * 11 }, { x: p.x - 4, y: p.y + s * 28 },\n { x: p.x + 4, y: p.y + s * 28 }, { x: p.x + 4, y: p.y + s * 11 }, { x: p.x + 9, y: p.y + s * 11 },\n ];\n return [poly(pts, { close: true, fill: d.style.color, width: 1 })];\n}\n\nexport const arrowMarkUp = tool({\n id: \"arrowMarkUp\", label: \"Arrow mark up\", family: \"annotations\", gesture: \"single\", anchors: 1,\n defaults: () => ({ style: { color: \"#26a69a\" } }),\n validate: finiteAnchors,\n shapes: (d, c) => markShape(d, px(c, A(d, 0)), true),\n});\n\nexport const arrowMarkDown = tool({\n id: \"arrowMarkDown\", label: \"Arrow mark down\", family: \"annotations\", gesture: \"single\", anchors: 1,\n defaults: () => ({ style: { color: \"#ef5350\" } }),\n validate: finiteAnchors,\n shapes: (d, c) => markShape(d, px(c, A(d, 0)), false),\n});\n\nexport const annotationTools: ToolDef[] = [\n textTool, anchoredText, note, anchoredNote, callout, comment, priceLabel, priceNote, signpost, flagMark, arrow, arrowMarker, arrowMarkUp, arrowMarkDown,\n];\n","// Channels and pitchforks: parallel channel, regression trend channel,\n// flat top/bottom, disjoint channel; pitchfork (standard, Schiff, modified\n// Schiff, inside) and pitchfan.\n\nimport type { Pt } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { BarSource } from \"../source.js\";\nimport type { Drawing, Shape, ToolCtx, ToolDef } from \"../types.js\";\nimport { A, FIB_BASIC, fibColor, fillOf, finiteAnchors, lerp, line, mid, needDistinctTimes, px, pxs, shade, text, tool } from \"./util.js\";\n\n/** y of the line through p0, p1 at x. */\nconst lineY = (p0: Pt, p1: Pt, x: number): number => p0.y + ((p1.y - p0.y) * (x - p0.x)) / (p1.x - p0.x);\n\n/** x range a channel is drawn over: its anchors, or the whole pane when extended. */\nfunction span(d: Drawing, p0: Pt, p1: Pt, c: ToolCtx): [number, number] {\n const lo = Math.min(p0.x, p1.x), hi = Math.max(p0.x, p1.x);\n return [d.style.extendLeft ? -10 : lo, d.style.extendRight ? c.W + 10 : hi];\n}\n\nexport const parallelChannel = tool({\n id: \"parallelChannel\", label: \"Parallel channel\", family: \"channels\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({ style: { fill: null }, props: { midline: true } }),\n validate(d) {\n finiteAnchors(d);\n needDistinctTimes(d, 0, 1);\n },\n shapes(d, c) {\n const [p0, p1, p2] = pxs(c, d) as [Pt, Pt, Pt];\n const off = p2.y - lineY(p0, p1, p2.x);\n const [xa, xb] = span(d, p0, p1, c);\n const base = (o: number): [Pt, Pt] => [{ x: xa, y: lineY(p0, p1, xa) + o }, { x: xb, y: lineY(p0, p1, xb) + o }];\n const [a0, a1] = base(0), [b0, b1] = base(off);\n const out: Shape[] = [shade([a0, a1, b1, b0], fillOf(d.style, 0.12)), line(a0, a1), line(b0, b1)];\n if (d.props.midline !== false) {\n const [m0, m1] = base(off / 2);\n out.push(line(m0, m1, { dash: \"dashed\", width: Math.max(1, d.style.width * 0.66) }));\n }\n return out;\n },\n});\n\nexport interface Regression {\n slope: number;\n intercept: number;\n /** Population standard deviation of the residuals. */\n sigma: number;\n n: number;\n}\n\n/** Ordinary least squares of y on x = 0..n-1. */\nexport function regression(y: readonly number[]): Regression {\n const n = y.length;\n if (n < 2) throw new RangeError(`regression: needs at least 2 values, got ${n}`);\n const mx = (n - 1) / 2;\n let my = 0;\n for (const v of y) my += v;\n my /= n;\n let sxy = 0, sxx = 0;\n for (let i = 0; i < n; i++) {\n sxy += (i - mx) * (y[i]! - my);\n sxx += (i - mx) * (i - mx);\n }\n const slope = sxy / sxx;\n const intercept = my - slope * mx;\n let ss = 0;\n for (let i = 0; i < n; i++) {\n const r = y[i]! - (intercept + slope * i);\n ss += r * r;\n }\n return { slope, intercept, sigma: Math.sqrt(ss / n), n };\n}\n\nexport function regressionOf(source: BarSource, t0: number, t1: number): { reg: Regression; lo: number; hi: number } {\n const [lo, hi] = source.range(Math.min(t0, t1), Math.max(t0, t1));\n if (hi - lo < 2) throw new RangeError(`regression channel: only ${hi - lo} bar(s) between the anchors`);\n const closes: number[] = [];\n for (let i = lo; i < hi; i++) closes.push(source.at(i).close);\n return { reg: regression(closes), lo, hi };\n}\n\nexport const regressionTrendChannel = tool({\n id: \"regressionTrendChannel\", label: \"Regression trend channel\", family: \"channels\", gesture: \"drag\", anchors: 2, needsSource: true,\n defaults: () => ({ props: { deviations: 2 } }),\n validate(d) {\n finiteAnchors(d);\n needDistinctTimes(d, 0, 1);\n const k = d.props.deviations;\n if (typeof k !== \"number\" || !(k > 0)) throw new RangeError(`drawings: regressionTrendChannel \"${d.id}\" prop \"deviations\" must be > 0`);\n },\n shapes(d, c) {\n if (!c.source) throw new Error(\"regressionTrendChannel needs a BarSource\");\n const { reg, lo, hi } = regressionOf(c.source, A(d, 0).time, A(d, 1).time);\n const k = d.props.deviations as number;\n const tFirst = c.source.at(lo).time, tLast = c.source.at(hi - 1).time;\n const at = (i: number, dev: number) => ({ x: 0, y: c.Y(reg.intercept + reg.slope * i + dev * reg.sigma) });\n const xa = c.X(tFirst), xb = c.X(tLast);\n const seg = (dev: number): [Pt, Pt] => [{ x: xa, y: at(0, dev).y }, { x: xb, y: at(hi - lo - 1, dev).y }];\n const [u0, u1] = seg(k), [m0, m1] = seg(0), [l0, l1] = seg(-k);\n return [\n shade([u0, u1, l1, l0], fillOf(d.style, 0.1)),\n line(u0, u1), line(l0, l1),\n line(m0, m1, { dash: \"dashed\" }),\n ];\n },\n});\n\nexport const flatTopBottom = tool({\n id: \"flatTopBottom\", label: \"Flat top/bottom\", family: \"channels\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({}),\n validate(d) {\n finiteAnchors(d);\n needDistinctTimes(d, 0, 1);\n },\n shapes(d, c) {\n const [p0, p1, p2] = pxs(c, d) as [Pt, Pt, Pt];\n const y = p2.y;\n return [shade([p0, p1, { x: p1.x, y }, { x: p0.x, y }], fillOf(d.style, 0.12)), line(p0, p1), line({ x: p0.x, y }, { x: p1.x, y })];\n },\n});\n\nexport const disjointChannel = tool({\n id: \"disjointChannel\", label: \"Disjoint channel\", family: \"channels\", gesture: \"clicks\", anchors: 4,\n defaults: () => ({}),\n validate(d) {\n finiteAnchors(d);\n needDistinctTimes(d, 0, 1);\n },\n shapes(d, c) {\n const [p0, p1, p2, p3] = pxs(c, d) as [Pt, Pt, Pt, Pt];\n return [shade([p0, p1, p3, p2], fillOf(d.style, 0.12)), line(p0, p1), line(p2, p3)];\n },\n});\n\n// ---- pitchforks ---------------------------------------------------------------\n\nexport type ForkVariant = \"standard\" | \"schiff\" | \"modifiedSchiff\" | \"inside\";\n\n/**\n * Where the median line starts and the points the two outer tines pass\n * through. The median always runs to the midpoint M of B and C; tines are\n * parallel to it.\n * - standard: from A; tines through B and C.\n * - schiff: from (A.x, midpoint price of A and B).\n * - modifiedSchiff: from the midpoint of A and B.\n * - inside: from A; tines through the midpoints of A–B and A–C.\n */\nexport function forkGeometry(v: ForkVariant, a: Pt, b: Pt, cc: Pt): { origin: Pt; m: Pt; t1: Pt; t2: Pt } {\n const m = mid(b, cc);\n switch (v) {\n case \"standard\": return { origin: a, m, t1: b, t2: cc };\n case \"schiff\": return { origin: { x: a.x, y: (a.y + b.y) / 2 }, m, t1: b, t2: cc };\n case \"modifiedSchiff\": return { origin: mid(a, b), m, t1: b, t2: cc };\n case \"inside\": return { origin: a, m, t1: mid(a, b), t2: mid(a, cc) };\n }\n}\n\nfunction forkTool(id: string, label: string, v: ForkVariant): ToolDef {\n return tool({\n id, label, family: \"pitchforks\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b, cc] = pxs(c, d) as [Pt, Pt, Pt];\n const g = forkGeometry(v, a, b, cc);\n const u = { x: g.m.x - g.origin.x, y: g.m.y - g.origin.y };\n if (u.x === 0 && u.y === 0) throw new RangeError(`drawings: ${id} \"${d.id}\" has a zero-length median`);\n const ahead = (p: Pt): Pt => ({ x: p.x + u.x, y: p.y + u.y });\n // Bands out to the pane edge along the median direction.\n const far = (p: Pt): Pt => {\n const k = u.x > 0 ? (c.W + 50 - p.x) / u.x : u.x < 0 ? (-50 - p.x) / u.x : 1e4;\n return { x: p.x + u.x * k, y: p.y + u.y * k };\n };\n const fo = far(g.origin);\n return [\n shade([g.origin, g.t1, far(g.t1), fo], withAlpha(d.style.color, 0.08)),\n shade([g.origin, g.t2, far(g.t2), fo], withAlpha(d.style.color, 0.08)),\n line(g.origin, ahead(g.origin), { extB: true }),\n line(g.t1, ahead(g.t1), { extB: true }),\n line(g.t2, ahead(g.t2), { extB: true }),\n line(b, cc, { dash: \"dashed\", width: 1 }),\n line(a, b, { dash: \"dotted\", width: 1, hit: false }),\n ];\n },\n });\n}\n\nexport const pitchfork = forkTool(\"pitchfork\", \"Pitchfork\", \"standard\");\nexport const schiffPitchfork = forkTool(\"schiffPitchfork\", \"Schiff pitchfork\", \"schiff\");\nexport const modifiedSchiffPitchfork = forkTool(\"modifiedSchiffPitchfork\", \"Modified Schiff pitchfork\", \"modifiedSchiff\");\nexport const insidePitchfork = forkTool(\"insidePitchfork\", \"Inside pitchfork\", \"inside\");\n\nexport const pitchfan = tool({\n id: \"pitchfan\", label: \"Pitchfan\", family: \"pitchforks\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({ props: { levels: FIB_BASIC } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b, cc] = pxs(c, d) as [Pt, Pt, Pt];\n const levels = d.props.levels as number[];\n const out: Shape[] = [line(b, cc, { dash: \"dashed\", width: 1 })];\n const rays = levels.map((r) => {\n const p = lerp(b, cc, r);\n return { r, p };\n });\n for (let i = 0; i + 1 < rays.length; i++) {\n const u = rays[i]!.p, v = rays[i + 1]!.p;\n const far = (p: Pt): Pt => {\n const dx = p.x - a.x, dy = p.y - a.y;\n const k = dx > 0 ? (c.W + 50 - a.x) / dx : dx < 0 ? (-50 - a.x) / dx : 1e4;\n return { x: a.x + dx * k, y: a.y + dy * k };\n };\n out.push(shade([a, far(u), far(v)], withAlpha(fibColor(rays[i]!.r), 0.07)));\n }\n for (const { r, p } of rays) out.push(line(a, p, { extB: true, color: fibColor(r), width: r === 0.5 ? d.style.width : 1 }), text(p.x, p.y, String(r), { textColor: fibColor(r), size: 10, hit: false }));\n return out;\n },\n});\n\nexport const channelTools: ToolDef[] = [parallelChannel, regressionTrendChannel, flatTopBottom, disjointChannel, pitchfork, schiffPitchfork, modifiedSchiffPitchfork, insidePitchfork, pitchfan];\n","// Cycle tools: cyclic lines, time cycles, sine line.\n//\n// Periods are measured in x, which is linear in the bar index, so a\n// non-trading gap does not stretch a cycle.\n\nimport type { Pt } from \"../geometry.js\";\nimport type { Shape, ToolDef } from \"../types.js\";\nimport { finiteAnchors, line, needDistinctTimes, pxs, tool } from \"./util.js\";\n\n/** Most lines/arcs one cycle tool draws; a period this dense is not drawn. */\nconst MAX_REPEATS = 600;\nconst MIN_PERIOD_PX = 2;\n\nfunction period(p0: Pt, p1: Pt): number {\n const w = Math.abs(p1.x - p0.x);\n return w;\n}\n\nexport const cyclicLines = tool({\n id: \"cyclicLines\", label: \"Cyclic lines\", family: \"cycles\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: (d) => { finiteAnchors(d); needDistinctTimes(d, 0, 1); },\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const w = period(p0, p1);\n if (w < MIN_PERIOD_PX) return [line(p0, p1)];\n const first = Math.ceil((-50 - p0.x) / w), last = Math.floor((c.W + 50 - p0.x) / w);\n const out: Shape[] = [];\n for (let k = first; k <= last && out.length < MAX_REPEATS; k++) {\n const x = p0.x + k * w;\n out.push(line({ x, y: 0 }, { x, y: c.H }, { extA: true, extB: true }));\n }\n return out;\n },\n});\n\nexport const timeCycles = tool({\n id: \"timeCycles\", label: \"Time cycles\", family: \"cycles\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { fill: \"rgba(41,98,255,0.1)\" } }),\n validate: (d) => { finiteAnchors(d); needDistinctTimes(d, 0, 1); },\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const w = period(p0, p1);\n if (w < MIN_PERIOD_PX) return [line(p0, p1)];\n const out: Shape[] = [];\n // Half-ellipses of width one period and height half a period, repeating to the right of the first anchor.\n const dir = p1.x >= p0.x ? 1 : -1;\n for (let k = 0; k < MAX_REPEATS; k++) {\n const x0 = p0.x + dir * k * w;\n if (dir > 0 ? x0 > c.W + 50 : x0 < -50) break;\n out.push({ k: \"arc\", cx: x0 + (dir * w) / 2, cy: p0.y, r: w / 2, a0: Math.PI, a1: 2 * Math.PI, fill: d.style.fill });\n }\n return out;\n },\n});\n\n/** y of the sine through two consecutive extrema (x0,y0) and (x1,y1) at x. */\nexport function sineY(x0: number, y0: number, x1: number, y1: number, x: number): number {\n const m = (y0 + y1) / 2;\n return m + (y0 - m) * Math.cos((Math.PI * (x - x0)) / (x1 - x0));\n}\n\nexport const sineLine = tool({\n id: \"sineLine\", label: \"Sine line\", family: \"cycles\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: (d) => { finiteAnchors(d); needDistinctTimes(d, 0, 1); },\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n if (Math.abs(p1.x - p0.x) < MIN_PERIOD_PX) return [line(p0, p1)];\n const pts: number[] = [];\n for (let x = -4; x <= c.W + 4; x += 2) pts.push(x, sineY(p0.x, p0.y, p1.x, p1.y, x));\n return [{ k: \"poly\", pts }];\n },\n});\n\nexport const cycleTools: ToolDef[] = [cyclicLines, timeCycles, sineLine];\n","// Fibonacci tools: retracement, trend-based extension, channel, time zone,\n// speed resistance fan, trend-based time, circles, spiral, speed resistance\n// arcs, wedge.\n//\n// Level prices are exact arithmetic on the anchors (see the *Price helpers);\n// the screen position is the price scale's mapping of that price. Spacing in\n// time (time zones, trend-based time) is done in x, which is linear in the\n// bar index, so a weekend gap does not stretch a zone.\n\nimport type { Pt } from \"../geometry.js\";\nimport { dist } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { Anchor, Drawing, Shape, ToolDef } from \"../types.js\";\nimport { A, FIB_BASIC, FIB_RETRACEMENT, fibColor, fillOf, finiteAnchors, levelsProp, line, needDistinctTimes, px, pxs, shade, text, tool } from \"./util.js\";\n\n/** Retracement: level 0 is a1, level 1 is a0. */\nexport const fibRetracementPrice = (a0: Anchor, a1: Anchor, r: number): number => a1.price + (a0.price - a1.price) * r;\n\n/** Trend-based extension: level 0 is c, 1 projects the full a→b move from c. */\nexport const fibExtensionPrice = (a: Anchor, b: Anchor, c: Anchor, r: number): number => c.price + (b.price - a.price) * r;\n\nexport const FIB_SEQUENCE = [0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89];\nconst PHI = (1 + Math.sqrt(5)) / 2;\n\nconst lvl = (levels: number[]) => ({ props: { levels } });\n\nexport const fibRetracement = tool({\n id: \"fibRetracement\", label: \"Fib retracement\", family: \"fibonacci\", gesture: \"drag\", anchors: 2,\n defaults: () => lvl(FIB_RETRACEMENT),\n validate: (d) => { finiteAnchors(d); levelsProp(d); },\n shapes(d, c) {\n const a0 = A(d, 0), a1 = A(d, 1);\n const p0 = px(c, a0), p1 = px(c, a1);\n const xl = Math.min(p0.x, p1.x), xr = d.style.extendRight ? c.W + 10 : Math.max(p0.x, p1.x);\n const out: Shape[] = [line(p0, p1, { dash: \"dashed\", width: 1, color: \"#787b86\" })];\n const lv = levelsProp(d);\n const ys = lv.map((r) => c.Y(fibRetracementPrice(a0, a1, r)));\n for (let i = 0; i + 1 < lv.length; i++) out.push(shade([{ x: xl, y: ys[i]! }, { x: xr, y: ys[i]! }, { x: xr, y: ys[i + 1]! }, { x: xl, y: ys[i + 1]! }], withAlpha(fibColor(lv[i + 1]!), 0.07)));\n lv.forEach((r, i) => {\n const y = ys[i]!;\n out.push(line({ x: xl, y }, { x: xr, y }, { color: fibColor(r), width: 1 }));\n out.push(text(xl - 4, y, `${r} (${c.fmt(fibRetracementPrice(a0, a1, r))})`, { align: \"right\", base: \"middle\", textColor: fibColor(r), size: 10, hit: false }));\n });\n return out;\n },\n});\n\nexport const fibExtension = tool({\n id: \"fibExtension\", label: \"Trend-based Fib extension\", family: \"fibonacci\", gesture: \"clicks\", anchors: 3,\n defaults: () => lvl([0, 0.236, 0.382, 0.5, 0.618, 0.786, 1, 1.272, 1.618, 2, 2.618, 3.618, 4.236]),\n validate: (d) => { finiteAnchors(d); levelsProp(d); },\n shapes(d, c) {\n const [a, b, cc] = [A(d, 0), A(d, 1), A(d, 2)];\n const [pa, pb, pc] = [px(c, a), px(c, b), px(c, cc)];\n const xl = pc.x, xr = d.style.extendRight ? c.W + 10 : Math.max(pc.x, pb.x) + 40;\n const out: Shape[] = [line(pa, pb, { dash: \"dashed\", width: 1, color: \"#787b86\" }), line(pb, pc, { dash: \"dashed\", width: 1, color: \"#787b86\" })];\n const lv = levelsProp(d);\n const ys = lv.map((r) => c.Y(fibExtensionPrice(a, b, cc, r)));\n for (let i = 0; i + 1 < lv.length; i++) out.push(shade([{ x: xl, y: ys[i]! }, { x: xr, y: ys[i]! }, { x: xr, y: ys[i + 1]! }, { x: xl, y: ys[i + 1]! }], withAlpha(fibColor(lv[i + 1]!), 0.07)));\n lv.forEach((r, i) => {\n const y = ys[i]!;\n out.push(line({ x: xl, y }, { x: xr, y }, { color: fibColor(r), width: 1 }));\n out.push(text(xl - 4, y, `${r} (${c.fmt(fibExtensionPrice(a, b, cc, r))})`, { align: \"right\", base: \"middle\", textColor: fibColor(r), size: 10, hit: false }));\n });\n return out;\n },\n});\n\nexport const fibChannel = tool({\n id: \"fibChannel\", label: \"Fib channel\", family: \"fibonacci\", gesture: \"clicks\", anchors: 3,\n defaults: () => lvl([0, 0.236, 0.382, 0.5, 0.618, 0.786, 1, 1.618, 2.618]),\n validate(d) {\n finiteAnchors(d);\n levelsProp(d);\n needDistinctTimes(d, 0, 1);\n },\n shapes(d, c) {\n const [p0, p1, p2] = pxs(c, d) as [Pt, Pt, Pt];\n const base = p0.y + ((p1.y - p0.y) * (p2.x - p0.x)) / (p1.x - p0.x);\n const off = p2.y - base;\n const lv = levelsProp(d);\n const at = (r: number): [Pt, Pt] => [{ x: p0.x, y: p0.y + r * off }, { x: p1.x, y: p1.y + r * off }];\n const out: Shape[] = [];\n for (let i = 0; i + 1 < lv.length; i++) {\n const [a0, a1] = at(lv[i]!), [b0, b1] = at(lv[i + 1]!);\n out.push(shade([a0, a1, b1, b0], withAlpha(fibColor(lv[i + 1]!), 0.07)));\n }\n for (const r of lv) {\n const [a0, a1] = at(r);\n out.push(line(a0, a1, { extB: d.style.extendRight, extA: d.style.extendLeft, color: fibColor(r), width: 1 }), text(a1.x + 4, a1.y, String(r), { base: \"middle\", textColor: fibColor(r), size: 10, hit: false }));\n }\n return out;\n },\n});\n\nexport const fibTimeZone = tool({\n id: \"fibTimeZone\", label: \"Fib time zone\", family: \"fibonacci\", gesture: \"drag\", anchors: 2,\n defaults: () => lvl(FIB_SEQUENCE),\n validate(d) {\n finiteAnchors(d);\n levelsProp(d);\n needDistinctTimes(d, 0, 1);\n },\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const unit = p1.x - p0.x;\n const out: Shape[] = [];\n for (const n of levelsProp(d)) {\n const x = p0.x + n * unit;\n if (x < -50 || x > c.W + 50) continue;\n out.push(line({ x, y: 0 }, { x, y: c.H }, { extA: true, extB: true, color: n === 0 || n === 1 ? \"#787b86\" : \"#2962ff\", width: 1 }), text(x + 3, 3, String(n), { base: \"top\", size: 10, textColor: \"#787b86\", hit: false }));\n }\n out.push(line(p0, p1, { dash: \"dashed\", width: 1 }));\n return out;\n },\n});\n\nexport const FIB_FAN = [0.25, 0.382, 0.5, 0.618, 0.75, 1];\nexport const fibSpeedFan = tool({\n id: \"fibSpeedFan\", label: \"Fib speed resistance fan\", family: \"fibonacci\", gesture: \"drag\", anchors: 2,\n defaults: () => lvl(FIB_FAN),\n validate(d) {\n finiteAnchors(d);\n levelsProp(d);\n needDistinctTimes(d, 0, 1);\n if (A(d, 0).price === A(d, 1).price) throw new RangeError(`drawings: fibSpeedFan \"${d.id}\" needs anchors at different prices`);\n },\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const out: Shape[] = [\n shade([p0, { x: p1.x, y: p0.y }, p1, { x: p0.x, y: p1.y }], withAlpha(d.style.color, 0.05)),\n line(p0, { x: p1.x, y: p0.y }, { dash: \"dashed\", width: 1, hit: false }), line({ x: p1.x, y: p0.y }, p1, { dash: \"dashed\", width: 1, hit: false }),\n line(p1, { x: p0.x, y: p1.y }, { dash: \"dashed\", width: 1, hit: false }), line({ x: p0.x, y: p1.y }, p0, { dash: \"dashed\", width: 1, hit: false }),\n ];\n for (const r of levelsProp(d)) {\n const colour = fibColor(r === 0.25 ? 0.5 : r);\n const e1 = { x: p1.x, y: p0.y + r * (p1.y - p0.y) }, e2 = { x: p0.x + r * (p1.x - p0.x), y: p1.y };\n out.push(line(p0, e1, { extB: true, color: colour, width: 1 }), line(p0, e2, { extB: true, color: colour, width: 1 }), text(e1.x + 3, e1.y, String(r), { base: \"middle\", size: 10, textColor: colour, hit: false }));\n }\n return out;\n },\n});\n\nexport const fibTrendTime = tool({\n id: \"fibTrendTime\", label: \"Trend-based Fib time\", family: \"fibonacci\", gesture: \"clicks\", anchors: 3,\n defaults: () => lvl([0, 0.382, 0.5, 0.618, 1, 1.382, 1.618, 2, 2.382, 2.618, 3, 4.236]),\n validate(d) {\n finiteAnchors(d);\n levelsProp(d);\n needDistinctTimes(d, 0, 1);\n },\n shapes(d, c) {\n const [pa, pb, pc] = pxs(c, d) as [Pt, Pt, Pt];\n const unit = pb.x - pa.x;\n const out: Shape[] = [line(pa, pb, { dash: \"dashed\", width: 1, color: \"#787b86\" })];\n for (const r of levelsProp(d)) {\n const x = pc.x + r * unit;\n if (x < -50 || x > c.W + 50) continue;\n out.push(line({ x, y: 0 }, { x, y: c.H }, { extA: true, extB: true, color: fibColor(r), width: 1 }), text(x + 3, 3, String(r), { base: \"top\", size: 10, textColor: fibColor(r), hit: false }));\n }\n return out;\n },\n});\n\nexport const fibCircles = tool({\n id: \"fibCircles\", label: \"Fib circles\", family: \"fibonacci\", gesture: \"drag\", anchors: 2,\n defaults: () => lvl([0.236, 0.382, 0.5, 0.618, 0.786, 1, 1.618, 2.618]),\n validate(d) {\n finiteAnchors(d);\n levelsProp(d);\n },\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const base = dist(p0.x, p0.y, p1.x, p1.y);\n const out: Shape[] = [line(p0, p1, { dash: \"dashed\", width: 1, color: \"#787b86\" })];\n for (const r of levelsProp(d)) {\n out.push({ k: \"ellipse\", cx: p0.x, cy: p0.y, rx: base * r, ry: base * r, color: fibColor(r), width: 1 }, text(p0.x + base * r, p0.y, String(r), { size: 10, base: \"bottom\", textColor: fibColor(r), hit: false }));\n }\n return out;\n },\n});\n\nexport const fibSpiral = tool({\n id: \"fibSpiral\", label: \"Fib spiral\", family: \"fibonacci\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ props: { clockwise: false } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const r0 = dist(p0.x, p0.y, p1.x, p1.y);\n if (r0 === 0) return [line(p0, p1)];\n const th0 = Math.atan2(p1.y - p0.y, p1.x - p0.x);\n const dir = d.props.clockwise === true ? 1 : -1;\n // r(θ) = r0·φ^(2θ/π): the golden spiral, growing by φ every quarter turn.\n const maxR = 2 * Math.hypot(c.W, c.H);\n const thMax = Math.min(8 * Math.PI, (Math.log(maxR / r0) * Math.PI) / (2 * Math.log(PHI)));\n const pts: Pt[] = [];\n for (let th = -3 * Math.PI; th <= thMax; th += 0.08) {\n const r = r0 * Math.pow(PHI, (2 * th) / Math.PI);\n pts.push({ x: p0.x + r * Math.cos(th0 + dir * th), y: p0.y + r * Math.sin(th0 + dir * th) });\n }\n return [line(p0, p1, { dash: \"dashed\", width: 1 }), { k: \"poly\", pts: pts.flatMap((p) => [p.x, p.y]) }];\n },\n});\n\nexport const FIB_ARCS = [0.382, 0.5, 0.618, 1, 1.382, 1.618];\nexport const fibSpeedArcs = tool({\n id: \"fibSpeedArcs\", label: \"Fib speed resistance arcs\", family: \"fibonacci\", gesture: \"drag\", anchors: 2,\n defaults: () => lvl(FIB_ARCS),\n validate: (d) => { finiteAnchors(d); levelsProp(d); },\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const base = dist(p0.x, p0.y, p1.x, p1.y);\n const th = Math.atan2(p1.y - p0.y, p1.x - p0.x);\n const out: Shape[] = [line(p0, p1, { dash: \"dashed\", width: 1, color: \"#787b86\" })];\n for (const r of levelsProp(d)) {\n out.push({ k: \"arc\", cx: p1.x, cy: p1.y, r: base * r, a0: th - Math.PI / 2, a1: th + Math.PI / 2, color: fibColor(r), width: 1 });\n out.push(text(p1.x + base * r * Math.cos(th), p1.y + base * r * Math.sin(th), String(r), { size: 10, base: \"middle\", textColor: fibColor(r), hit: false }));\n }\n return out;\n },\n});\n\nexport const fibWedge = tool({\n id: \"fibWedge\", label: \"Fib wedge\", family: \"fibonacci\", gesture: \"clicks\", anchors: 3,\n defaults: () => lvl([0.236, 0.382, 0.5, 0.618, 0.786, 1, 1.618]),\n validate: (d) => { finiteAnchors(d); levelsProp(d); },\n shapes(d, c) {\n const [p0, p1, p2] = pxs(c, d) as [Pt, Pt, Pt];\n const base = dist(p0.x, p0.y, p1.x, p1.y);\n const t1 = Math.atan2(p1.y - p0.y, p1.x - p0.x), t2 = Math.atan2(p2.y - p0.y, p2.x - p0.x);\n // Sweep the shorter way from arm 1 to arm 2.\n const delta = ((((t2 - t1 + Math.PI) % (2 * Math.PI)) + 2 * Math.PI) % (2 * Math.PI)) - Math.PI;\n const out: Shape[] = [line(p0, p1, { extB: true }), line(p0, p2, { extB: true })];\n for (const r of levelsProp(d)) out.push({ k: \"arc\", cx: p0.x, cy: p0.y, r: base * r, a0: t1, a1: t1 + delta, color: fibColor(r), width: 1 });\n return out;\n },\n});\n\nexport const fibTools: ToolDef[] = [fibRetracement, fibExtension, fibChannel, fibTimeZone, fibSpeedFan, fibTrendTime, fibCircles, fibSpiral, fibSpeedArcs, fibWedge];\nexport { FIB_BASIC, fillOf };\nexport type { Drawing };\n","// Figures: rectangle, rotated rectangle, ellipse, circle, triangle, arc,\n// curve, double curve, polyline, path, brush, highlighter.\n\nimport { circumcircle, controlThrough, dist, quadPoints, type Pt } from \"../geometry.js\";\nimport type { Shape, ToolDef } from \"../types.js\";\nimport { A, finiteAnchors, head, line, mid, needDistinctTimes, poly, px, pxs, text, tool } from \"./util.js\";\n\nconst FILL = \"rgba(41,98,255,0.15)\";\n\n/** Style text centred in a box when the drawing has any. */\nfunction inner(textValue: string, p: Pt): Shape[] {\n return textValue ? [text(p.x, p.y, textValue, { align: \"center\", base: \"middle\", hit: false })] : [];\n}\n\nexport const rectangle = tool({\n id: \"rectangle\", label: \"Rectangle\", family: \"shapes\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { fill: FILL } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n return [poly([p0, { x: p1.x, y: p0.y }, p1, { x: p0.x, y: p1.y }], { close: true, fill: d.style.fill }), ...inner(d.style.text, mid(p0, p1))];\n },\n});\n\n/** Corners of the rectangle with edge a→b and perpendicular extent through c. */\nexport function rotatedRectCorners(a: Pt, b: Pt, c: Pt): [Pt, Pt, Pt, Pt] {\n const dx = b.x - a.x, dy = b.y - a.y;\n const len = Math.hypot(dx, dy);\n if (len === 0) throw new RangeError(\"rotated rectangle: its first two anchors coincide\");\n const nx = -dy / len, ny = dx / len;\n const w = (c.x - a.x) * nx + (c.y - a.y) * ny;\n return [a, b, { x: b.x + nx * w, y: b.y + ny * w }, { x: a.x + nx * w, y: a.y + ny * w }];\n}\n\nexport const rotatedRectangle = tool({\n id: \"rotatedRectangle\", label: \"Rotated rectangle\", family: \"shapes\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({ style: { fill: FILL } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b, cc] = pxs(c, d) as [Pt, Pt, Pt];\n const q = rotatedRectCorners(a, b, cc);\n return [poly(q, { close: true, fill: d.style.fill }), ...inner(d.style.text, mid(q[0], q[2]))];\n },\n});\n\nexport const ellipse = tool({\n id: \"ellipse\", label: \"Ellipse\", family: \"shapes\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { fill: FILL } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const m = mid(p0, p1);\n return [{ k: \"ellipse\", cx: m.x, cy: m.y, rx: Math.abs(p1.x - p0.x) / 2, ry: Math.abs(p1.y - p0.y) / 2, fill: d.style.fill }, ...inner(d.style.text, m)];\n },\n});\n\nexport const circle = tool({\n id: \"circle\", label: \"Circle\", family: \"shapes\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { fill: FILL } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const r = dist(p0.x, p0.y, p1.x, p1.y);\n return [{ k: \"ellipse\", cx: p0.x, cy: p0.y, rx: r, ry: r, fill: d.style.fill }, line(p0, p1, { dash: \"dotted\", width: 1, hit: false }), ...inner(d.style.text, p0)];\n },\n});\n\nexport const triangle = tool({\n id: \"triangle\", label: \"Triangle\", family: \"shapes\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({ style: { fill: FILL } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const ps = pxs(c, d);\n return [poly(ps, { close: true, fill: d.style.fill })];\n },\n});\n\n/** Arc from a to b through m on their circumcircle: [cx, cy, r, from, to] in radians, or null when collinear. */\nexport function arcThrough(a: Pt, b: Pt, m: Pt): { cx: number; cy: number; r: number; a0: number; a1: number } | null {\n const cc = circumcircle(a, b, m);\n if (!cc) return null;\n const ang = (p: Pt) => Math.atan2(p.y - cc.cy, p.x - cc.cx);\n const norm = (x: number) => ((x % (2 * Math.PI)) + 2 * Math.PI) % (2 * Math.PI);\n const t0 = ang(a);\n const dEnd = norm(ang(b) - t0), dMid = norm(ang(m) - t0);\n // Increasing angle reaches m before b; otherwise sweep the other way round.\n return { ...cc, a0: t0, a1: dMid < dEnd ? t0 + dEnd : t0 - (2 * Math.PI - dEnd) };\n}\n\nexport const arc = tool({\n id: \"arc\", label: \"Arc\", family: \"shapes\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b, m] = pxs(c, d) as [Pt, Pt, Pt];\n const g = arcThrough(a, b, m);\n return g ? [{ k: \"arc\", cx: g.cx, cy: g.cy, r: g.r, a0: g.a0, a1: g.a1, fill: d.style.fill }] : [line(a, b)];\n },\n});\n\nexport const curve = tool({\n id: \"curve\", label: \"Curve\", family: \"shapes\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b, m] = pxs(c, d) as [Pt, Pt, Pt];\n return [{ k: \"poly\", pts: quadPoints(a, controlThrough(a, m, b), b) }];\n },\n});\n\nexport const doubleCurve = tool({\n id: \"doubleCurve\", label: \"Double curve\", family: \"shapes\", gesture: \"clicks\", anchors: 4,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n // Two quadratics joined at the midpoint of start and end; each passes through its bend anchor.\n const [a, b, m1, m2] = pxs(c, d) as [Pt, Pt, Pt, Pt];\n const j = mid(a, b);\n return [{ k: \"poly\", pts: [...quadPoints(a, controlThrough(a, m1, j), j), ...quadPoints(j, controlThrough(j, m2, b), b)] }];\n },\n});\n\nexport const polyline = tool({\n id: \"polyline\", label: \"Polyline\", family: \"shapes\", gesture: \"clicks\", anchors: 2, variable: true,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const ps = pxs(c, d);\n return [poly(ps, { close: d.style.fill !== null, fill: d.style.fill })];\n },\n});\n\nexport const path = tool({\n id: \"path\", label: \"Path\", family: \"shapes\", gesture: \"clicks\", anchors: 2, variable: true,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const ps = pxs(c, d);\n return [poly(ps), head(ps[ps.length - 2]!, ps[ps.length - 1]!, 6 + d.style.width * 2, d.style.color)];\n },\n});\n\nexport const brush = tool({\n id: \"brush\", label: \"Brush\", family: \"shapes\", gesture: \"freehand\", anchors: 2, variable: true, noHandles: true,\n defaults: () => ({ style: { width: 2 } }),\n validate: finiteAnchors,\n shapes: (d, c) => [poly(pxs(c, d))],\n});\n\nexport const highlighter = tool({\n id: \"highlighter\", label: \"Highlighter\", family: \"shapes\", gesture: \"freehand\", anchors: 2, variable: true, noHandles: true,\n defaults: () => ({ style: { width: 14, color: \"rgba(255,235,59,0.4)\" } }),\n validate: finiteAnchors,\n shapes: (d, c) => [poly(pxs(c, d))],\n});\n\nexport const figureTools: ToolDef[] = [rectangle, rotatedRectangle, ellipse, circle, triangle, arc, curve, doubleCurve, polyline, path, brush, highlighter];\nexport { A, needDistinctTimes, px };\n","// Gann tools: box, square fixed, square, fan.\n\nimport type { Pt } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { Anchor, Shape, ToolCtx, ToolDef } from \"../types.js\";\nimport { A, finiteAnchors, fmtTime, levelsProp, line, needDistinctTimes, px, pxs, shade, text, tool } from \"./util.js\";\n\nconst BOX_LEVELS = [0, 0.25, 0.382, 0.5, 0.618, 0.75, 1];\n\n/** Price at fraction r of the way from a0 to a1. */\nexport const gannBoxPrice = (a0: Anchor, a1: Anchor, r: number): number => a0.price + (a1.price - a0.price) * r;\n\n/** Gann fan: the line through a0 whose slope is num/den times the 1×1 slope (a0→a1); its price at a1's time. */\nexport const gannFanPrice = (a0: Anchor, a1: Anchor, num: number, den: number): number => a0.price + ((a1.price - a0.price) * num) / den;\n\nexport const GANN_RATIOS: ReadonlyArray<readonly [number, number]> = [[8, 1], [4, 1], [3, 1], [2, 1], [1, 1], [1, 2], [1, 3], [1, 4], [1, 8]];\n\nfunction grid(p0: Pt, p1: Pt, xs: number[], ys: number[], color: string): Shape[] {\n const out: Shape[] = [];\n for (const r of xs) out.push(line({ x: p0.x + r * (p1.x - p0.x), y: p0.y }, { x: p0.x + r * (p1.x - p0.x), y: p1.y }, { width: 1, color: withAlpha(color, 0.7) }));\n for (const r of ys) out.push(line({ x: p0.x, y: p0.y + r * (p1.y - p0.y) }, { x: p1.x, y: p0.y + r * (p1.y - p0.y) }, { width: 1, color: withAlpha(color, 0.7) }));\n return out;\n}\n\nexport const gannBox = tool({\n id: \"gannBox\", label: \"Gann box\", family: \"gann\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ props: { levels: BOX_LEVELS } }),\n validate: (d) => { finiteAnchors(d); needDistinctTimes(d, 0, 1); levelsProp(d); },\n shapes(d, c) {\n const a0 = A(d, 0), a1 = A(d, 1);\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const lv = levelsProp(d);\n // Horizontal lines sit at the scale's position of the labelled price, so label and line agree on any scale.\n const yAt = (r: number) => c.Y(gannBoxPrice(a0, a1, r));\n const out: Shape[] = [];\n for (let i = 0; i + 1 < lv.length; i += 2) {\n const ya = yAt(lv[i]!), yb = yAt(lv[i + 1]!);\n out.push(shade([{ x: p0.x, y: ya }, { x: p1.x, y: ya }, { x: p1.x, y: yb }, { x: p0.x, y: yb }], withAlpha(d.style.color, 0.06)));\n }\n out.push(...grid(p0, p1, lv, [], d.style.color));\n for (const r of lv) out.push(line({ x: p0.x, y: yAt(r) }, { x: p1.x, y: yAt(r) }, { width: 1, color: withAlpha(d.style.color, 0.7) }));\n out.push(line(p0, p1), line({ x: p0.x, y: p1.y }, { x: p1.x, y: p0.y }));\n out.push(line(p0, { x: p1.x, y: p0.y }), line({ x: p1.x, y: p0.y }, p1), line(p1, { x: p0.x, y: p1.y }), line({ x: p0.x, y: p1.y }, p0));\n for (const r of lv) {\n out.push(text(Math.min(p0.x, p1.x) - 4, yAt(r), c.fmt(gannBoxPrice(a0, a1, r)), { align: \"right\", base: \"middle\", size: 10, textColor: d.style.color, hit: false }));\n const x = p0.x + r * (p1.x - p0.x);\n out.push(text(x, Math.min(p0.y, p1.y) - 4, fmtTime(c.T(x)), { align: \"center\", base: \"bottom\", size: 9, textColor: d.style.color, hit: false }));\n }\n return out;\n },\n});\n\nconst DIV8 = [0, 1 / 8, 2 / 8, 3 / 8, 4 / 8, 5 / 8, 6 / 8, 7 / 8, 1];\n\nfunction squareShapes(p0: Pt, p1: Pt, color: string): Shape[] {\n const out = grid(p0, p1, DIV8, DIV8, color);\n const m = { x: (p0.x + p1.x) / 2, y: (p0.y + p1.y) / 2 };\n out.push(line(p0, p1, { extB: true }), line({ x: p0.x, y: p1.y }, { x: p1.x, y: p0.y }, { extB: true }));\n out.push(line({ x: m.x, y: p0.y }, { x: p1.x, y: m.y }, { width: 1 }), line({ x: p1.x, y: m.y }, { x: m.x, y: p1.y }, { width: 1 }), line({ x: m.x, y: p1.y }, { x: p0.x, y: m.y }, { width: 1 }), line({ x: p0.x, y: m.y }, { x: m.x, y: p0.y }, { width: 1 }));\n return out;\n}\n\nexport const gannSquare = tool({\n id: \"gannSquare\", label: \"Gann square\", family: \"gann\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: (d) => { finiteAnchors(d); needDistinctTimes(d, 0, 1); },\n shapes: (d, c) => {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n return squareShapes(p0, p1, d.style.color);\n },\n});\n\n/** The second corner of a fixed (screen-square) Gann square: same width and height in px. */\nfunction fixedCorner(d: { anchors: Anchor[] }, c: ToolCtx): Pt {\n const p0 = px(c, d.anchors[0]!), p1 = px(c, d.anchors[1]!);\n const side = Math.abs(p1.x - p0.x);\n return { x: p1.x, y: p0.y + (p1.y >= p0.y ? side : -side) };\n}\n\nexport const gannSquareFixed = tool({\n id: \"gannSquareFixed\", label: \"Gann square fixed\", family: \"gann\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: (d) => { finiteAnchors(d); needDistinctTimes(d, 0, 1); },\n handlePoints: (d, c) => [px(c, A(d, 0)), fixedCorner(d, c)],\n shapes: (d, c) => squareShapes(px(c, A(d, 0)), fixedCorner(d, c), d.style.color),\n});\n\nexport const gannFan = tool({\n id: \"gannFan\", label: \"Gann fan\", family: \"gann\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate(d) {\n finiteAnchors(d);\n needDistinctTimes(d, 0, 1);\n if (A(d, 0).price === A(d, 1).price) throw new RangeError(`drawings: gannFan \"${d.id}\" needs anchors at different prices (its 1×1 line would be flat)`);\n },\n shapes(d, c) {\n const a0 = A(d, 0), a1 = A(d, 1);\n const p0 = px(c, a0), x1 = c.X(a1.time);\n const out: Shape[] = [];\n const ends = GANN_RATIOS.map(([n, m]) => ({ n, m, e: { x: x1, y: c.Y(gannFanPrice(a0, a1, n, m)) } }));\n for (let i = 0; i + 1 < ends.length; i++) {\n const far = (e: Pt): Pt => {\n const dx = e.x - p0.x, dy = e.y - p0.y;\n const k = dx !== 0 ? (c.W + 50 - p0.x) / dx : 1e4;\n return { x: p0.x + dx * k, y: p0.y + dy * k };\n };\n if (x1 > p0.x) out.push(shade([p0, far(ends[i]!.e), far(ends[i + 1]!.e)], withAlpha(d.style.color, i % 2 ? 0.04 : 0.09)));\n }\n for (const { n, m, e } of ends) {\n out.push(line(p0, e, { extB: true, extA: false, width: n === m ? d.style.width : 1 }), text(e.x + 3, e.y, `${n}x${m}`, { base: \"middle\", size: 10, textColor: d.style.color, hit: false }));\n }\n return out;\n },\n});\n\nexport const gannTools: ToolDef[] = [gannBox, gannSquareFixed, gannSquare, gannFan];\n","// Line tools: trend line, ray, info line, extended line, horizontal line,\n// horizontal ray, vertical line, cross line.\n\nimport { crisp } from \"@alphacharts/core\";\nimport type { ToolDef } from \"../types.js\";\nimport { A, extension, finiteAnchors, fmtTime, line, measure, measureLines, needDistinctTimes, px, text, tool } from \"./util.js\";\n\nconst twoPoint = (d: Parameters<NonNullable<ToolDef[\"validate\"]>>[0]) => {\n finiteAnchors(d);\n};\n\nexport const trendLine = tool({\n id: \"trendLine\", label: \"Trend line\", family: \"lines\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: twoPoint,\n shapes: (d, c) => {\n const a = px(c, A(d, 0)), b = px(c, A(d, 1));\n return [line(a, b, extension(d.style, a, b))];\n },\n});\n\nexport const ray = tool({\n id: \"ray\", label: \"Ray\", family: \"lines\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { extendRight: true } }),\n validate: twoPoint,\n shapes: (d, c) => [line(px(c, A(d, 0)), px(c, A(d, 1)), { extA: false, extB: true })],\n});\n\nexport const extendedLine = tool({\n id: \"extendedLine\", label: \"Extended line\", family: \"lines\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { extendLeft: true, extendRight: true } }),\n validate: twoPoint,\n shapes: (d, c) => [line(px(c, A(d, 0)), px(c, A(d, 1)), { extA: true, extB: true })],\n});\n\nexport const infoLine = tool({\n id: \"infoLine\", label: \"Info line\", family: \"lines\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: twoPoint,\n shapes(d, c) {\n const a = A(d, 0), b = A(d, 1);\n const p = px(c, a), q = px(c, b);\n const m = measure(a, b, c.source);\n return [\n line(p, q, extension(d.style, p, q)),\n text((p.x + q.x) / 2, (p.y + q.y) / 2 - 8, [...measureLines(m, c), `${fmtTime(a.time)} → ${fmtTime(b.time)}`].join(\"\\n\"), {\n align: \"center\", base: \"bottom\", bg: d.style.color, border: null, textColor: \"#ffffff\", pad: 4,\n }),\n ];\n },\n});\n\nexport const horizontalLine = tool({\n id: \"horizontalLine\", label: \"Horizontal line\", family: \"lines\", gesture: \"single\", anchors: 1,\n defaults: () => ({}),\n validate: twoPoint,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n const y = crisp(p.y, c.dpr, d.style.width);\n return [\n line({ x: 0, y }, { x: c.W, y }, { extA: true, extB: true }),\n text(c.W - 6, y - 2, c.fmt(A(d, 0).price), { align: \"right\", base: \"bottom\", textColor: d.style.color, hit: false, stack: true }),\n ];\n },\n});\n\n/** Pixels left of a horizontal ray's start a price label needs (\"24579.90\" at the default size). */\nconst RAY_LABEL_ROOM = 72;\n\nexport const horizontalRay = tool({\n id: \"horizontalRay\", label: \"Horizontal ray\", family: \"lines\", gesture: \"single\", anchors: 1,\n defaults: () => ({}),\n validate: twoPoint,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n const y = crisp(p.y, c.dpr, d.style.width);\n // The price sits at the ray's left end, clear of the candles and the last-price tag at the right; a ray that\n // starts at the pane's left edge has no room there, so its label sits above the line at the start.\n const label = p.x >= RAY_LABEL_ROOM\n ? text(p.x - 4, y, c.fmt(A(d, 0).price), { align: \"right\", base: \"middle\", textColor: d.style.color, hit: false, stack: true })\n : text(Math.max(p.x, 0) + 4, y - 2, c.fmt(A(d, 0).price), { align: \"left\", base: \"bottom\", textColor: d.style.color, hit: false, stack: true });\n return [line({ x: p.x, y }, { x: p.x + 1, y }, { extB: true }), label];\n },\n});\n\nexport const verticalLine = tool({\n id: \"verticalLine\", label: \"Vertical line\", family: \"lines\", gesture: \"single\", anchors: 1,\n defaults: () => ({}),\n validate: twoPoint,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n const x = crisp(p.x, c.dpr, d.style.width);\n return [line({ x, y: 0 }, { x, y: c.H }, { extA: true, extB: true }), text(x + 4, 4, fmtTime(A(d, 0).time), { base: \"top\", textColor: d.style.color, hit: false })];\n },\n});\n\nexport const crossLine = tool({\n id: \"crossLine\", label: \"Cross line\", family: \"lines\", gesture: \"single\", anchors: 1,\n defaults: () => ({}),\n validate: twoPoint,\n shapes(d, c) {\n const p = px(c, A(d, 0));\n const x = crisp(p.x, c.dpr, d.style.width), y = crisp(p.y, c.dpr, d.style.width);\n return [line({ x: 0, y }, { x: c.W, y }, { extA: true, extB: true }), line({ x, y: 0 }, { x, y: c.H }, { extA: true, extB: true })];\n },\n});\n\nexport const lineTools: ToolDef[] = [trendLine, ray, infoLine, extendedLine, horizontalLine, horizontalRay, verticalLine, crossLine];\nexport { needDistinctTimes };\n","// Measure tools: date range, price range, date & price range.\n//\n// The numbers are `measure()` of the two anchors: Δ price, Δ/|from|·100 %,\n// bars between the anchors' positions in the bar sequence (only when the\n// plugin has a BarSource) and the time difference.\n\nimport type { Pt } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { Drawing, ToolCtx, ToolDef } from \"../types.js\";\nimport { A, finiteAnchors, line, measure, measureLines, poly, pxs, text, tool, head, barsText, fmtDuration } from \"./util.js\";\n\nfunction colour(d: Drawing, dPrice: number): string {\n return dPrice < 0 ? \"#ef5350\" : d.style.color;\n}\n\nconst label = (x: number, y: number, t: string, col: string) =>\n text(x, y, t, { align: \"center\", base: \"middle\", bg: withAlpha(col, 0.9), textColor: \"#ffffff\", pad: 4, hit: false });\n\nfunction priceText(d: Drawing, c: ToolCtx): string {\n const m = measure(A(d, 0), A(d, 1), c.source);\n const sign = m.dPrice < 0 ? \"-\" : m.dPrice > 0 ? \"+\" : \"\";\n return `${sign}${c.fmt(Math.abs(m.dPrice))}${m.pct === null ? \"\" : ` (${sign}${Math.abs(m.pct).toFixed(2)}%)`}`;\n}\n\nfunction timeText(d: Drawing, c: ToolCtx): string {\n const m = measure(A(d, 0), A(d, 1), c.source);\n return [m.bars === null ? \"\" : `${barsText(m.bars)} bars`, fmtDuration(m.dTime)].filter(Boolean).join(\", \");\n}\n\nexport const dateRange = tool({\n id: \"dateRange\", label: \"Date range\", family: \"measure\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const y = (p0.y + p1.y) / 2;\n const col = d.style.color;\n return [\n poly([{ x: p0.x, y: 0 }, { x: p1.x, y: 0 }, { x: p1.x, y: c.H }, { x: p0.x, y: c.H }], { close: true, fill: withAlpha(col, 0.1), width: 0 }),\n line({ x: p0.x, y: 0 }, { x: p0.x, y: c.H }, { width: 1, color: col }), line({ x: p1.x, y: 0 }, { x: p1.x, y: c.H }, { width: 1, color: col }),\n line({ x: p0.x, y }, { x: p1.x, y }, { width: 1, color: col }), head({ x: p0.x, y }, { x: p1.x, y }, 8, col),\n label((p0.x + p1.x) / 2, y - 14, timeText(d, c), col),\n ];\n },\n});\n\nexport const priceRange = tool({\n id: \"priceRange\", label: \"Price range\", family: \"measure\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const x = (p0.x + p1.x) / 2;\n const col = colour(d, A(d, 1).price - A(d, 0).price);\n return [\n poly([{ x: 0, y: p0.y }, { x: c.W, y: p0.y }, { x: c.W, y: p1.y }, { x: 0, y: p1.y }], { close: true, fill: withAlpha(col, 0.1), width: 0 }),\n line({ x: 0, y: p0.y }, { x: c.W, y: p0.y }, { width: 1, color: col, extA: true, extB: true }), line({ x: 0, y: p1.y }, { x: c.W, y: p1.y }, { width: 1, color: col, extA: true, extB: true }),\n line({ x, y: p0.y }, { x, y: p1.y }, { width: 1, color: col }), head({ x, y: p0.y }, { x, y: p1.y }, 8, col),\n label(x, (p0.y + p1.y) / 2, priceText(d, c), col),\n ];\n },\n});\n\nexport const dateAndPriceRange = tool({\n id: \"dateAndPriceRange\", label: \"Date and price range\", family: \"measure\", gesture: \"drag\", anchors: 2,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [p0, p1] = pxs(c, d) as [Pt, Pt];\n const col = colour(d, A(d, 1).price - A(d, 0).price);\n const cx = (p0.x + p1.x) / 2, cy = (p0.y + p1.y) / 2;\n return [\n poly([p0, { x: p1.x, y: p0.y }, p1, { x: p0.x, y: p1.y }], { close: true, fill: withAlpha(col, 0.12), color: col, width: 1 }),\n line({ x: cx, y: p0.y }, { x: cx, y: p1.y }, { width: 1, color: col, hit: false }), head({ x: cx, y: p0.y }, { x: cx, y: p1.y }, 8, col),\n line({ x: p0.x, y: cy }, { x: p1.x, y: cy }, { width: 1, color: col, hit: false }), head({ x: p0.x, y: cy }, { x: p1.x, y: cy }, 8, col),\n label(cx, Math.min(p0.y, p1.y) - 14, `${priceText(d, c)}\\n${timeText(d, c)}`, col),\n ];\n },\n});\n\nexport const measureTools: ToolDef[] = [dateRange, priceRange, dateAndPriceRange];\nexport { measureLines };\n","// Pattern tools: XABCD, cypher, ABCD, triangle pattern, three drives, head\n// and shoulders, and the Elliott family (impulse, correction, triangle,\n// double combo, triple combo).\n//\n// Ratios are |move| / |move| of exact anchor prices (see the *Ratios\n// helpers); a ratio over a zero move is printed as \"n/a\", never as 0.\n\nimport { intersect, type Pt } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { Anchor, Drawing, Shape, ToolDef } from \"../types.js\";\nimport { A, finiteAnchors, line, mid, poly, pxs, ratio, ratioText, shade, text, tool } from \"./util.js\";\n\nconst mv = (a: Anchor, b: Anchor) => Math.abs(b.price - a.price);\n\nexport function xabcdRatios(x: Anchor, a: Anchor, b: Anchor, c: Anchor, d: Anchor) {\n return { abXa: ratio(mv(a, b), mv(x, a)), bcAb: ratio(mv(b, c), mv(a, b)), cdBc: ratio(mv(c, d), mv(b, c)), adXa: ratio(mv(a, d), mv(x, a)) };\n}\n\nexport function cypherRatios(x: Anchor, a: Anchor, b: Anchor, c: Anchor, d: Anchor) {\n return { abXa: ratio(mv(a, b), mv(x, a)), xcXa: ratio(mv(x, c), mv(x, a)), cdXc: ratio(mv(c, d), mv(x, c)) };\n}\n\nexport function abcdRatios(a: Anchor, b: Anchor, c: Anchor, d: Anchor) {\n return { bcAb: ratio(mv(b, c), mv(a, b)), cdBc: ratio(mv(c, d), mv(b, c)) };\n}\n\nexport function driveRatios(pts: readonly Anchor[]) {\n if (pts.length !== 7) throw new RangeError(`three drives needs 7 anchors, got ${pts.length}`);\n const p = pts as readonly [Anchor, Anchor, Anchor, Anchor, Anchor, Anchor, Anchor];\n return [ratio(mv(p[1], p[2]), mv(p[0], p[1])), ratio(mv(p[2], p[3]), mv(p[1], p[2])), ratio(mv(p[3], p[4]), mv(p[2], p[3])), ratio(mv(p[4], p[5]), mv(p[3], p[4])), ratio(mv(p[5], p[6]), mv(p[4], p[5]))];\n}\n\n/** Labels at the anchors, above a local high and below a local low. */\nfunction pointLabels(ps: readonly Pt[], names: readonly string[], color: string): Shape[] {\n const out: Shape[] = [];\n ps.forEach((p, i) => {\n const name = names[i];\n if (!name) return;\n const prev = ps[i - 1], next = ps[i + 1];\n const high = (!prev || p.y <= prev.y) && (!next || p.y <= next.y);\n out.push(text(p.x, p.y + (high ? -6 : 6), name, { align: \"center\", base: high ? \"bottom\" : \"top\", textColor: color, hit: false }));\n });\n return out;\n}\n\nconst dashed = { dash: \"dashed\" as const, width: 1, hit: false };\nconst ratioLabel = (a: Pt, b: Pt, r: number | null, color: string): Shape => {\n const m = mid(a, b);\n return text(m.x, m.y, ratioText(r), { align: \"center\", base: \"middle\", bg: withAlpha(color, 0.85), textColor: \"#ffffff\", pad: 2, size: 10, hit: false });\n};\n\nexport const xabcd = tool({\n id: \"xabcd\", label: \"XABCD pattern\", family: \"patterns\", gesture: \"clicks\", anchors: 5,\n defaults: () => ({ style: { fill: \"rgba(41,98,255,0.12)\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [x, a, b, cc, dd] = pxs(c, d) as [Pt, Pt, Pt, Pt, Pt];\n const r = xabcdRatios(A(d, 0), A(d, 1), A(d, 2), A(d, 3), A(d, 4));\n const col = d.style.color;\n return [\n shade([x, a, b], d.style.fill ?? withAlpha(col, 0.12)), shade([b, cc, dd], d.style.fill ?? withAlpha(col, 0.12)),\n poly([x, a, b, cc, dd]),\n line(x, b, dashed), line(a, cc, dashed), line(b, dd, dashed), line(x, dd, dashed),\n ratioLabel(x, b, r.abXa, col), ratioLabel(a, cc, r.bcAb, col), ratioLabel(b, dd, r.cdBc, col), ratioLabel(x, dd, r.adXa, col),\n ...pointLabels([x, a, b, cc, dd], [\"X\", \"A\", \"B\", \"C\", \"D\"], col),\n ];\n },\n});\n\nexport const cypher = tool({\n id: \"cypher\", label: \"Cypher pattern\", family: \"patterns\", gesture: \"clicks\", anchors: 5,\n defaults: () => ({ style: { fill: \"rgba(156,39,176,0.12)\", color: \"#9c27b0\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [x, a, b, cc, dd] = pxs(c, d) as [Pt, Pt, Pt, Pt, Pt];\n const r = cypherRatios(A(d, 0), A(d, 1), A(d, 2), A(d, 3), A(d, 4));\n const col = d.style.color;\n return [\n shade([x, a, b], d.style.fill ?? withAlpha(col, 0.12)), shade([b, cc, dd], d.style.fill ?? withAlpha(col, 0.12)),\n poly([x, a, b, cc, dd]),\n line(x, b, dashed), line(a, cc, dashed), line(x, cc, dashed), line(b, dd, dashed),\n ratioLabel(x, b, r.abXa, col), ratioLabel(x, cc, r.xcXa, col), ratioLabel(b, dd, r.cdXc, col),\n ...pointLabels([x, a, b, cc, dd], [\"X\", \"A\", \"B\", \"C\", \"D\"], col),\n ];\n },\n});\n\nexport const abcd = tool({\n id: \"abcd\", label: \"ABCD pattern\", family: \"patterns\", gesture: \"clicks\", anchors: 4,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b, cc, dd] = pxs(c, d) as [Pt, Pt, Pt, Pt];\n const r = abcdRatios(A(d, 0), A(d, 1), A(d, 2), A(d, 3));\n const col = d.style.color;\n return [poly([a, b, cc, dd]), line(a, cc, dashed), line(b, dd, dashed), ratioLabel(a, cc, r.bcAb, col), ratioLabel(b, dd, r.cdBc, col), ...pointLabels([a, b, cc, dd], [\"A\", \"B\", \"C\", \"D\"], col)];\n },\n});\n\nexport const trianglePattern = tool({\n id: \"trianglePattern\", label: \"Triangle pattern\", family: \"patterns\", gesture: \"clicks\", anchors: 4,\n defaults: () => ({ style: { fill: \"rgba(41,98,255,0.1)\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a, b, cc, dd] = pxs(c, d) as [Pt, Pt, Pt, Pt];\n const col = d.style.color;\n const out: Shape[] = [poly([a, b, cc, dd]), line(a, cc, { extB: true, dash: \"dashed\", width: 1 }), line(b, dd, { extB: true, dash: \"dashed\", width: 1 })];\n // Apex: where the two trendlines meet, when they converge.\n const apex = intersect(a, cc, b, dd);\n if (apex && apex.x > Math.max(cc.x, dd.x)) out.unshift(shade([a, b, apex], d.style.fill ?? withAlpha(col, 0.1)));\n return [...out, ...pointLabels([a, b, cc, dd], [\"A\", \"B\", \"C\", \"D\"], col)];\n },\n});\n\nexport const threeDrives = tool({\n id: \"threeDrives\", label: \"Three drives pattern\", family: \"patterns\", gesture: \"clicks\", anchors: 7,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const ps = pxs(c, d);\n const col = d.style.color;\n const rs = driveRatios(d.anchors);\n const out: Shape[] = [poly(ps)];\n rs.forEach((r, i) => out.push(ratioLabel(ps[i + 1]!, ps[i + 2]!, r, col)));\n return [...out, ...pointLabels(ps, [\"0\", \"1\", \"A\", \"2\", \"B\", \"3\", \"C\"], col)];\n },\n});\n\nexport const headAndShoulders = tool({\n id: \"headAndShoulders\", label: \"Head and shoulders\", family: \"patterns\", gesture: \"clicks\", anchors: 7,\n defaults: () => ({ style: { fill: \"rgba(239,83,80,0.12)\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const ps = pxs(c, d);\n const [, ls, n1, head, n2, rs] = ps as [Pt, Pt, Pt, Pt, Pt, Pt, Pt];\n const col = d.style.color;\n return [\n shade([n1, ls, head], d.style.fill ?? withAlpha(col, 0.12)),\n shade([n1, head, n2], d.style.fill ?? withAlpha(col, 0.12)),\n shade([n2, head, rs], d.style.fill ?? withAlpha(col, 0.12)),\n poly(ps),\n line(n1, n2, { extB: true, dash: \"dashed\", width: 1 }),\n text(n2.x + 6, n2.y, \"Neckline\", { base: \"top\", size: 10, textColor: col, hit: false }),\n ...pointLabels(ps, [\"\", \"Left shoulder\", \"\", \"Head\", \"\", \"Right shoulder\", \"\"], col),\n ];\n },\n});\n\n// ---- Elliott ---------------------------------------------------------------------\n\nexport type Degree = \"minuette\" | \"minor\" | \"intermediate\" | \"primary\";\n\n/** Wave label for a degree: minuette ((1)), minor 1, intermediate (1), primary [1]. */\nexport function waveLabel(degree: Degree, n: string): string {\n switch (degree) {\n case \"minuette\": return `((${n}))`;\n case \"minor\": return n;\n case \"intermediate\": return `(${n})`;\n case \"primary\": return `[${n}]`;\n }\n}\n\nfunction elliott(id: string, label: string, names: string[]): ToolDef {\n return tool({\n id, label, family: \"elliott\", gesture: \"clicks\", anchors: names.length,\n defaults: () => ({ props: { degree: \"intermediate\" } }),\n validate(d: Drawing) {\n finiteAnchors(d);\n if (![\"minuette\", \"minor\", \"intermediate\", \"primary\"].includes(d.props.degree as string)) throw new RangeError(`drawings: ${id} \"${d.id}\" prop \"degree\" must be minuette, minor, intermediate or primary`);\n },\n shapes(d, c) {\n const ps = pxs(c, d);\n const deg = d.props.degree as Degree;\n return [poly(ps), ...pointLabels(ps, names.map((n) => (n ? waveLabel(deg, n) : \"\")), d.style.color)];\n },\n });\n}\n\nexport const elliottImpulse = elliott(\"elliottImpulse\", \"Elliott impulse wave\", [\"\", \"1\", \"2\", \"3\", \"4\", \"5\"]);\nexport const elliottCorrection = elliott(\"elliottCorrection\", \"Elliott correction wave\", [\"\", \"A\", \"B\", \"C\"]);\nexport const elliottTriangle = elliott(\"elliottTriangle\", \"Elliott triangle wave\", [\"\", \"A\", \"B\", \"C\", \"D\", \"E\"]);\nexport const elliottDoubleCombo = elliott(\"elliottDoubleCombo\", \"Elliott double combo wave\", [\"\", \"W\", \"X\", \"Y\"]);\nexport const elliottTripleCombo = elliott(\"elliottTripleCombo\", \"Elliott triple combo wave\", [\"\", \"W\", \"X\", \"Y\", \"X\", \"Z\"]);\n\nexport const patternTools: ToolDef[] = [\n xabcd, cypher, abcd, trianglePattern, threeDrives, headAndShoulders,\n elliottImpulse, elliottCorrection, elliottTriangle, elliottDoubleCombo, elliottTripleCombo,\n];\n","// Position and projection tools: long position, short position, forecast,\n// projection, bars pattern, ghost feed.\n//\n// Long/short anchors: [entry (time, price), target (end time, price), stop\n// (end time, price)]. Risk, reward, R:R and quantity are exact arithmetic on\n// those prices and on the props (accountSize, riskPercent, lotSize); a\n// quantity is shown only when an account size was given.\n\nimport type { Pt } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { Bar } from \"../source.js\";\nimport type { Anchor, Drawing, Shape, ToolCtx, ToolDef } from \"../types.js\";\nimport { A, finiteAnchors, line, measure, measureLines, poly, px, pxs, shade, text, tool } from \"./util.js\";\n\nexport type Side = \"long\" | \"short\";\n\nexport interface PositionInputs {\n accountSize?: number | null;\n /** Percent of the account risked between entry and stop. */\n riskPercent?: number | undefined;\n lotSize?: number | undefined;\n}\n\nexport interface PositionStats {\n /** Price distance entry→stop and entry→target (both ≥ 0). */\n risk: number;\n reward: number;\n /** reward / risk, or null when risk is 0. */\n rr: number | null;\n riskPct: number;\n rewardPct: number;\n /** Units to trade so that a stop-out loses at most accountSize·riskPercent/100; null without an account size or with 0 risk. */\n qty: number | null;\n /** qty × reward and qty × risk. */\n profit: number | null;\n loss: number | null;\n}\n\n/** Relative tolerance on the budget check (float noise only). */\nconst FLOOR_EPS = 1e-12;\n\nexport function positionStats(side: Side, entry: number, target: number, stop: number, o: PositionInputs = {}): PositionStats {\n const ok = side === \"long\" ? target >= entry && entry >= stop : target <= entry && entry <= stop;\n if (!ok) throw new RangeError(`position: a ${side} needs ${side === \"long\" ? \"target ≥ entry ≥ stop\" : \"target ≤ entry ≤ stop\"}, got target ${target}, entry ${entry}, stop ${stop}`);\n const risk = Math.abs(entry - stop), reward = Math.abs(target - entry);\n let qty: number | null = null;\n if (entry === 0) throw new RangeError(\"position: entry price 0 has no percent risk\");\n if (o.accountSize !== undefined && o.accountSize !== null && risk > 0) {\n const lot = o.lotSize, pct = o.riskPercent;\n if (lot === undefined || pct === undefined) throw new RangeError(\"position: riskPercent and lotSize are required with accountSize\");\n if (!(o.accountSize > 0) || !(lot > 0) || !Number.isInteger(lot) || !(pct > 0)) throw new RangeError(`position: accountSize and riskPercent must be positive and lotSize a positive whole number, got ${o.accountSize}, ${pct}, ${lot}`);\n const budget = (o.accountSize * pct) / 100;\n let lots = Math.floor(budget / risk / lot);\n // Float noise can leave an exact quotient just under the integer (0.3 / 0.1): take the next lot only if it fits within the budget to 1e-12 relative.\n if ((lots + 1) * lot * risk <= budget * (1 + FLOOR_EPS)) lots += 1;\n qty = lots * lot;\n }\n return {\n risk, reward, rr: risk === 0 ? null : reward / risk,\n riskPct: (risk / Math.abs(entry)) * 100,\n rewardPct: (reward / Math.abs(entry)) * 100,\n qty, profit: qty === null ? null : qty * reward, loss: qty === null ? null : qty * risk,\n };\n}\n\nconst num = (v: unknown, name: string, d: Drawing): number | null => {\n if (v === null || v === undefined) return null;\n if (typeof v !== \"number\" || !Number.isFinite(v)) throw new TypeError(`drawings: ${d.tool} \"${d.id}\" prop \"${name}\" must be a finite number or null`);\n return v;\n};\n\nexport function statsOf(side: Side, d: Drawing): PositionStats {\n return positionStats(side, A(d, 0).price, A(d, 1).price, A(d, 2).price, {\n accountSize: num(d.props.accountSize, \"accountSize\", d),\n riskPercent: num(d.props.riskPercent, \"riskPercent\", d) ?? undefined,\n lotSize: num(d.props.lotSize, \"lotSize\", d) ?? undefined,\n });\n}\n\nconst money = (v: number) => v.toFixed(2);\n\nfunction positionTool(side: Side): ToolDef {\n const long = side === \"long\";\n return tool({\n id: long ? \"longPosition\" : \"shortPosition\", label: long ? \"Long position\" : \"Short position\", family: \"position\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({ props: { accountSize: null, riskPercent: 1, lotSize: 1 } }),\n validate(d) {\n finiteAnchors(d);\n statsOf(side, d);\n },\n constrain(d, i) {\n const [e, t, s] = [A(d, 0), A(d, 1), A(d, 2)];\n // The target and stop share the end time, and stay on their own side of the entry.\n if (i === 1 || i === 2) {\n const end = i === 1 ? t.time : s.time;\n t.time = end;\n s.time = end;\n }\n if (long) {\n if (t.price < e.price) t.price = e.price;\n if (s.price > e.price) s.price = e.price;\n } else {\n if (t.price > e.price) t.price = e.price;\n if (s.price < e.price) s.price = e.price;\n }\n },\n shapes(d, c) {\n const st = statsOf(side, d);\n const [e, t, s] = pxs(c, d) as [Pt, Pt, Pt];\n const xl = Math.min(e.x, t.x), xr = Math.max(e.x, t.x);\n const good = \"#26a69a\", bad = \"#ef5350\";\n const out: Shape[] = [\n // Hittable: the whole box selects the position, as on a trading platform.\n poly([{ x: xl, y: e.y }, { x: xr, y: e.y }, { x: xr, y: t.y }, { x: xl, y: t.y }], { close: true, fill: withAlpha(good, 0.2), width: 0 }),\n poly([{ x: xl, y: e.y }, { x: xr, y: e.y }, { x: xr, y: s.y }, { x: xl, y: s.y }], { close: true, fill: withAlpha(bad, 0.2), width: 0 }),\n line({ x: xl, y: e.y }, { x: xr, y: e.y }, { color: d.style.color }),\n line({ x: xl, y: t.y }, { x: xr, y: t.y }, { color: good }),\n line({ x: xl, y: s.y }, { x: xr, y: s.y }, { color: bad }),\n ];\n const signed = (v: number) => `${v < 0 ? \"-\" : v > 0 ? \"+\" : \"\"}${c.fmt(Math.abs(v))}`;\n const tgtDelta = A(d, 1).price - A(d, 0).price, stopDelta = A(d, 2).price - A(d, 0).price;\n const tgt = [`Target ${c.fmt(A(d, 1).price)} (${signed(tgtDelta)}, ${st.rewardPct.toFixed(2)}%)`];\n if (st.profit !== null) tgt.push(`P&L ${money(st.profit)}`);\n const stp = [`Stop ${c.fmt(A(d, 2).price)} (${signed(stopDelta)}, ${st.riskPct.toFixed(2)}%)`];\n if (st.loss !== null) stp.push(`P&L -${money(st.loss)}`);\n const ctr = (xl + xr) / 2;\n out.push(text(ctr, (e.y + t.y) / 2, tgt.join(\"\\n\"), { align: \"center\", base: \"middle\", textColor: good, hit: false }));\n out.push(text(ctr, (e.y + s.y) / 2, stp.join(\"\\n\"), { align: \"center\", base: \"middle\", textColor: bad, hit: false }));\n const mid = [`Entry ${c.fmt(A(d, 0).price)}`, st.rr === null ? \"R:R n/a\" : `R:R ${st.rr.toFixed(2)}`];\n if (st.qty !== null) mid.push(`Qty ${st.qty}`);\n out.push(text(ctr, e.y, mid.join(\" \"), { align: \"center\", base: \"middle\", bg: withAlpha(d.style.color, 0.9), textColor: \"#ffffff\", pad: 3, hit: false }));\n return out;\n },\n });\n}\n\nexport const longPosition = positionTool(\"long\");\nexport const shortPosition = positionTool(\"short\");\n\nexport const forecast = tool({\n id: \"forecast\", label: \"Forecast\", family: \"position\", gesture: \"drag\", anchors: 2,\n defaults: () => ({ style: { fill: \"rgba(41,98,255,0.15)\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a0, a1] = [A(d, 0), A(d, 1)];\n const [p, q] = [px(c, a0), px(c, a1)];\n const m = measure(a0, a1, c.source);\n return [\n shade([p, { x: q.x, y: p.y }, q], d.style.fill ?? withAlpha(d.style.color, 0.15)),\n line(p, { x: q.x, y: p.y }, { dash: \"dotted\", width: 1, hit: false }),\n line({ x: q.x, y: p.y }, q, { dash: \"dotted\", width: 1, hit: false }),\n line(p, q, { dash: \"dashed\" }),\n { k: \"ellipse\", cx: q.x, cy: q.y, rx: 4, ry: 4, fill: d.style.color, width: 1 },\n text(q.x + 8, q.y, measureLines(m, c).join(\"\\n\"), { align: \"left\", base: \"middle\", bg: d.style.color, textColor: \"#ffffff\", pad: 4, hit: false }),\n ];\n },\n});\n\n/** The end of the projected move: same Δprice as a0→a1, started at a2. */\nexport function projectionTarget(a0: Anchor, a1: Anchor, a2: Anchor): number {\n return a2.price + (a1.price - a0.price);\n}\n\nexport const projection = tool({\n id: \"projection\", label: \"Projection\", family: \"position\", gesture: \"clicks\", anchors: 3,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const [a0, a1, a2] = [A(d, 0), A(d, 1), A(d, 2)];\n const [p0, p1, p2] = pxs(c, d) as [Pt, Pt, Pt];\n const end: Pt = { x: p2.x + (p1.x - p0.x), y: c.Y(projectionTarget(a0, a1, a2)) };\n return [\n line(p0, p1), line(p2, end, { dash: \"dashed\" }),\n line(p0, p2, { dash: \"dotted\", width: 1, hit: false }), line(p1, end, { dash: \"dotted\", width: 1, hit: false }),\n { k: \"ellipse\", cx: end.x, cy: end.y, rx: 3, ry: 3, fill: d.style.color, width: 1 },\n text(end.x + 6, end.y, c.fmt(projectionTarget(a0, a1, a2)), { align: \"left\", base: \"middle\", textColor: d.style.color, hit: false }),\n ];\n },\n});\n\n// ---- bar overlays ---------------------------------------------------------------\n\nconst UP = \"#26a69a\", DOWN = \"#ef5350\";\n\nfunction barShapes(x: number, w: number, o: number, h: number, l: number, cl: number, candle: boolean): Shape[] {\n const col = cl >= o ? UP : DOWN;\n if (candle) {\n const top = Math.min(o, cl), bot = Math.max(o, cl);\n return [\n line({ x, y: h }, { x, y: l }, { color: col, width: 1, }),\n poly([{ x: x - w, y: top }, { x: x + w, y: top }, { x: x + w, y: Math.max(bot, top + 1) }, { x: x - w, y: Math.max(bot, top + 1) }], { close: true, fill: col, color: col, width: 1 }),\n ];\n }\n return [\n line({ x, y: h }, { x, y: l }, { color: col, width: 1 }),\n line({ x: x - w, y: o }, { x, y: o }, { color: col, width: 1 }),\n line({ x, y: cl }, { x: x + w, y: cl }, { color: col, width: 1 }),\n ];\n}\n\nfunction needSource(c: ToolCtx, name: string) {\n if (!c.source) throw new Error(`${name} needs a BarSource`);\n return c.source;\n}\n\nfunction sourceBars(c: ToolCtx, d: Drawing, name: string): { src: NonNullable<ToolCtx[\"source\"]>; lo: number; hi: number } {\n const src = needSource(c, name);\n const t0 = A(d, 0).time, t1 = A(d, 1).time;\n const [lo, hi] = src.range(Math.min(t0, t1), Math.max(t0, t1));\n if (hi <= lo) throw new RangeError(`${name} \"${d.id}\": no bars between the first two anchors`);\n return { src, lo, hi };\n}\n\n/** Bars of [lo, hi) shifted so that the first bar's close sits at `price`; times keep their offsets from the first bar. */\nexport function patternBars(bars: readonly Bar[], price: number): Array<{ offsetMs: number; open: number; high: number; low: number; close: number }> {\n const first = bars[0];\n if (!first) throw new RangeError(\"patternBars: no bars\");\n const shift = price - first.close;\n return bars.map((b) => ({ offsetMs: b.time - first.time, open: b.open + shift, high: b.high + shift, low: b.low + shift, close: b.close + shift }));\n}\n\nexport const barsPattern = tool({\n id: \"barsPattern\", label: \"Bars pattern\", family: \"position\", gesture: \"clicks\", anchors: 3, needsSource: true,\n defaults: () => ({}),\n validate: finiteAnchors,\n shapes(d, c) {\n const { src, lo, hi } = sourceBars(c, d, \"barsPattern\");\n const bars: Bar[] = [];\n for (let i = lo; i < hi; i++) bars.push(src.at(i));\n const copy = patternBars(bars, A(d, 2).price);\n const x0 = c.X(bars[0]!.time), at = c.X(A(d, 2).time);\n const w = Math.max(1, (bars.length > 1 ? Math.abs(c.X(bars[1]!.time) - x0) : 6) * 0.35);\n const out: Shape[] = [];\n const xa = c.X(A(d, 0).time), xb = c.X(A(d, 1).time);\n out.push(line({ x: xa, y: 0 }, { x: xa, y: c.H }, { dash: \"dotted\", width: 1, extA: true, extB: true }), line({ x: xb, y: 0 }, { x: xb, y: c.H }, { dash: \"dotted\", width: 1, extA: true, extB: true }));\n for (let i = 0; i < copy.length; i++) {\n const b = copy[i]!;\n const x = at + (c.X(bars[i]!.time) - x0);\n out.push(...barShapes(x, w, c.Y(b.open), c.Y(b.high), c.Y(b.low), c.Y(b.close), false));\n }\n return out;\n },\n});\n\n/** mulberry32: a small seeded PRNG so a ghost feed redraws identically. */\nexport function seeded(seed: number): () => number {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) >>> 0;\n let t = a;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/**\n * `count` synthetic bars: each is a randomly drawn bar of `history` with its\n * open-relative high/low/close added to the previous synthetic close,\n * starting from `start`. Deterministic for a seed.\n */\nexport function ghostBars(history: readonly Bar[], start: number, count: number, seed: number): Array<{ open: number; high: number; low: number; close: number }> {\n if (history.length === 0) throw new RangeError(\"ghostBars: no history to sample\");\n const rnd = seeded(seed);\n const out: Array<{ open: number; high: number; low: number; close: number }> = [];\n let prev = start;\n for (let i = 0; i < count; i++) {\n const b = history[Math.floor(rnd() * history.length)]!;\n const open = prev;\n const close = open + (b.close - b.open);\n out.push({ open, high: open + (b.high - b.open), low: open + (b.low - b.open), close });\n prev = close;\n }\n return out;\n}\n\nexport const ghostFeed = tool({\n id: \"ghostFeed\", label: \"Ghost feed (resampled bars)\", family: \"position\", gesture: \"clicks\", anchors: 3, needsSource: true,\n defaults: () => ({ props: { seed: 1, count: 30 } }),\n validate(d) {\n finiteAnchors(d);\n const n = d.props.count, s = d.props.seed;\n if (typeof n !== \"number\" || !Number.isInteger(n) || n < 1 || n > 5000) throw new RangeError(`drawings: ghostFeed \"${d.id}\" prop \"count\" must be an integer in 1..5000`);\n if (typeof s !== \"number\" || !Number.isInteger(s)) throw new RangeError(`drawings: ghostFeed \"${d.id}\" prop \"seed\" must be an integer`);\n },\n shapes(d, c) {\n const { src, lo, hi } = sourceBars(c, d, \"ghostFeed\");\n const history: Bar[] = [];\n for (let i = lo; i < hi; i++) history.push(src.at(i));\n const bars = ghostBars(history, A(d, 2).price, d.props.count as number, d.props.seed as number);\n const t0 = A(d, 2).time;\n const w = Math.max(1, Math.abs(c.X(t0 + src.interval) - c.X(t0)) * 0.35);\n const out: Shape[] = [];\n bars.forEach((b, i) => out.push(...barShapes(c.X(t0 + i * src.interval), w, c.Y(b.open), c.Y(b.high), c.Y(b.low), c.Y(b.close), true)));\n const p = px(c, A(d, 2));\n out.push(text(p.x, p.y - 6, \"ghost feed\", { base: \"bottom\", size: 10, textColor: d.style.color, hit: false }));\n return out;\n },\n});\n\nexport const positionTools: ToolDef[] = [longPosition, shortPosition, forecast, projection, barsPattern, ghostFeed];\n","// Tools computed from bars: anchored VWAP and fixed-range volume profile.\n\nimport type { Pt } from \"../geometry.js\";\nimport { withAlpha } from \"../shapes.js\";\nimport type { BarSource } from \"../source.js\";\nimport type { Drawing, Shape, ToolDef } from \"../types.js\";\nimport { A, finiteAnchors, line, needDistinctTimes, poly, px, text, tool } from \"./util.js\";\n\nexport interface VwapSeries {\n times: Float64Array;\n values: Float64Array;\n}\n\n/**\n * VWAP from bar `start` to the last bar: Σ(typical·volume) / Σ(volume), typical\n * = (high + low + close) / 3. Bars before the first with volume have no value (NaN).\n */\nexport function anchoredVwap(src: BarSource, start: number): VwapSeries {\n if (!Number.isInteger(start) || start < 0 || start >= src.length) throw new RangeError(`anchoredVwap: start ${start} outside 0..${src.length - 1}`);\n const n = src.length - start;\n const times = new Float64Array(n), values = new Float64Array(n);\n let pv = 0, v = 0;\n for (let i = 0; i < n; i++) {\n const b = src.at(start + i);\n pv += ((b.high + b.low + b.close) / 3) * b.volume;\n v += b.volume;\n times[i] = b.time;\n values[i] = v === 0 ? Number.NaN : pv / v;\n }\n return { times, values };\n}\n\n/** Index of the bar the anchor sits on: the last bar at or before its time (the first bar if it is earlier than all). */\nexport function startIndex(src: BarSource, time: number): number | null {\n if (src.length === 0) return null;\n const [lo, hi] = src.range(time, time);\n if (hi > lo) return lo;\n if (lo >= src.length) return null; // anchored after the last bar: nothing to average yet\n return Math.max(0, lo - 1);\n}\n\nconst vwapCache = new WeakMap<BarSource, Map<number, { version: number; series: VwapSeries }>>();\n\nfunction cachedVwap(src: BarSource, start: number): VwapSeries {\n let m = vwapCache.get(src);\n if (!m) vwapCache.set(src, (m = new Map()));\n const hit = m.get(start);\n if (hit && hit.version === src.version) return hit.series;\n const series = anchoredVwap(src, start);\n if (m.size > 64) m.clear();\n m.set(start, { version: src.version, series });\n return series;\n}\n\nexport const anchoredVwapTool = tool({\n id: \"anchoredVwap\", label: \"Anchored VWAP\", family: \"volume\", gesture: \"single\", anchors: 1, needsSource: true,\n defaults: () => ({ style: { color: \"#ff9800\" } }),\n validate: finiteAnchors,\n shapes(d, c) {\n if (!c.source) throw new Error(\"anchoredVwap needs a BarSource\");\n const p = px(c, A(d, 0));\n const out: Shape[] = [{ k: \"ellipse\", cx: p.x, cy: p.y, rx: 4, ry: 4, fill: d.style.color, width: 1 }];\n const start = startIndex(c.source, A(d, 0).time);\n if (start === null) return out;\n const s = cachedVwap(c.source, start);\n const tL = c.T(-2), tR = c.T(c.W + 2);\n // Visible slice by binary search over the (sorted) bar times.\n const lower = (t: number) => {\n let lo = 0, hi = s.times.length;\n while (lo < hi) {\n const m = (lo + hi) >> 1;\n if (s.times[m]! < t) lo = m + 1;\n else hi = m;\n }\n return lo;\n };\n const i0 = Math.max(0, lower(tL) - 1), i1 = Math.min(s.times.length, lower(tR) + 1);\n // One point per pixel column at most.\n const step = Math.max(1, Math.floor((i1 - i0) / (c.W + 4)));\n const pts: number[] = [];\n for (let i = i0; i < i1; i += step) if (!Number.isNaN(s.values[i]!)) pts.push(c.X(s.times[i]!), c.Y(s.values[i]!));\n if (pts.length >= 4) out.push({ k: \"poly\", pts });\n return out;\n },\n});\n\nexport interface VolumeProfile {\n low: number;\n high: number;\n rowHeight: number;\n volumes: number[];\n poc: number;\n}\n\n/**\n * Bar-level volume profile of bars [lo, hi): a bar's volume is spread over\n * the rows its [low, high] range overlaps, in proportion to the overlap\n * (all of it in one row when low = high). This approximates real traded-at-\n * price volume, which a bar series does not contain. The row volumes sum to\n * the bars' total volume.\n */\nexport function volumeProfile(src: BarSource, lo: number, hi: number, rows: number): VolumeProfile {\n if (!Number.isInteger(rows) || rows < 1) throw new RangeError(`volumeProfile: rows must be a positive integer, got ${rows}`);\n if (hi <= lo) throw new RangeError(\"volumeProfile: no bars in the range\");\n let low = Infinity, high = -Infinity;\n for (let i = lo; i < hi; i++) {\n const b = src.at(i);\n if (b.low < low) low = b.low;\n if (b.high > high) high = b.high;\n }\n const span = high - low;\n const rowHeight = span / rows;\n const volumes = new Array<number>(rows).fill(0);\n for (let i = lo; i < hi; i++) {\n const b = src.at(i);\n if (span === 0 || b.high === b.low) {\n const r = span === 0 ? 0 : Math.min(rows - 1, Math.floor((b.low - low) / rowHeight));\n volumes[r]! += b.volume;\n continue;\n }\n const r0 = Math.min(rows - 1, Math.floor((b.low - low) / rowHeight)), r1 = Math.min(rows - 1, Math.floor((b.high - low) / rowHeight));\n const barSpan = b.high - b.low;\n for (let r = r0; r <= r1; r++) {\n const top = Math.min(b.high, low + (r + 1) * rowHeight), bot = Math.max(b.low, low + r * rowHeight);\n if (top > bot) volumes[r]! += (b.volume * (top - bot)) / barSpan;\n }\n }\n let poc = 0;\n volumes.forEach((v, r) => {\n if (v > volumes[poc]!) poc = r;\n });\n return { low, high, rowHeight, volumes, poc };\n}\n\nfunction rangeBars(d: Drawing, src: BarSource): [number, number] {\n const [lo, hi] = src.range(Math.min(A(d, 0).time, A(d, 1).time), Math.max(A(d, 0).time, A(d, 1).time));\n if (hi <= lo) throw new RangeError(`drawings: volumeProfile \"${d.id}\" has no bars between its anchors`);\n return [lo, hi];\n}\n\nexport const volumeProfileTool = tool({\n id: \"volumeProfile\", label: \"Fixed range volume profile (bar-level approximation)\", family: \"volume\", gesture: \"drag\", anchors: 2, needsSource: true,\n defaults: () => ({ props: { rows: 24 } }),\n validate(d) {\n finiteAnchors(d);\n needDistinctTimes(d, 0, 1);\n const r = d.props.rows;\n if (typeof r !== \"number\" || !Number.isInteger(r) || r < 1 || r > 500) throw new RangeError(`drawings: volumeProfile \"${d.id}\" prop \"rows\" must be an integer in 1..500`);\n },\n shapes(d, c) {\n if (!c.source) throw new Error(\"volumeProfile needs a BarSource\");\n const [lo, hi] = rangeBars(d, c.source);\n const rows = d.props.rows as number;\n const vp = volumeProfile(c.source, lo, hi, rows);\n const xa = c.X(A(d, 0).time), xb = c.X(A(d, 1).time);\n const left = Math.min(xa, xb), right = Math.max(xa, xb);\n const maxW = (right - left) * 0.6;\n const maxV = vp.volumes[vp.poc]!;\n const out: Shape[] = [line({ x: left, y: 0 }, { x: left, y: c.H }, { dash: \"dotted\", width: 1, extA: true, extB: true }), line({ x: right, y: 0 }, { x: right, y: c.H }, { dash: \"dotted\", width: 1, extA: true, extB: true })];\n vp.volumes.forEach((v, r) => {\n if (v === 0 || maxV === 0) return;\n const yTop = c.Y(vp.low + (r + 1) * vp.rowHeight), yBot = c.Y(vp.low + r * vp.rowHeight);\n const w = (v / maxV) * maxW;\n const pts: Pt[] = [{ x: left, y: yTop }, { x: left + w, y: yTop }, { x: left + w, y: yBot }, { x: left, y: yBot }];\n out.push(poly(pts, { close: true, fill: withAlpha(r === vp.poc ? \"#ff9800\" : d.style.color, r === vp.poc ? 0.6 : 0.35), width: 0 }));\n });\n out.push(text(left + 4, 4, \"Volume profile (bar-level approximation)\", { base: \"top\", size: 10, textColor: d.style.color, hit: false }));\n return out;\n },\n});\n\nexport const volumeTools: ToolDef[] = [anchoredVwapTool, volumeProfileTool];\n","// Every built-in tool. Import named tools from their modules instead to keep\n// the rest out of a bundle.\n\nimport type { ToolDef } from \"../types.js\";\nimport { annotationTools } from \"./annotations.js\";\nimport { channelTools } from \"./channels.js\";\nimport { cycleTools } from \"./cycles.js\";\nimport { fibTools } from \"./fib.js\";\nimport { figureTools } from \"./figures.js\";\nimport { gannTools } from \"./gann.js\";\nimport { lineTools } from \"./lines.js\";\nimport { measureTools } from \"./measure.js\";\nimport { patternTools } from \"./patterns.js\";\nimport { positionTools } from \"./position.js\";\nimport { volumeTools } from \"./volume.js\";\n\nexport const allTools: readonly ToolDef[] = [\n ...lineTools, ...channelTools, ...fibTools, ...gannTools, ...figureTools, ...annotationTools,\n ...positionTools, ...measureTools, ...patternTools, ...cycleTools, ...volumeTools,\n];\n"],"mappings":"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"}
|