lightweight-charts-drawing 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightweight-charts-drawing.umd.cjs","sources":["../src/tv/types.ts","../src/tv/specs.ts","../src/tv/_shared.ts","../src/tv/kinds/_glyph.ts","../src/tv/rotated-rect.ts","../src/tv/kinds/position.ts","../src/tv/kinds/gann-square.ts","../src/tv/kinds/gann-fan.ts","../src/tv/kinds/pitchfork.ts","../src/tv/kinds/fib-time.ts","../src/tv/kinds/tv-text.ts","../src/tv/kinds/price-note.ts","../src/tv/kinds/rectangle-text.ts","../src/tv/kinds/data-series.ts","../src/tv/kinds/speed-fan.ts","../src/tv/kinds/bars-pattern.ts","../src/tv/kinds/arrow-mark.ts","../src/tv/kinds/table.ts","../src/tv/kinds/images.ts","../src/tv/kinds/text-tools.ts","../src/tv/kinds/signpost.ts","../src/tv/kinds/hit-tests.ts","../src/tv/color.ts","../src/tv/kinds/axis-labels.ts","../src/tv/scene/text.ts","../src/tv/scene/lines.ts","../src/tv/scene/levels.ts","../src/tv/scene/channels.ts","../src/tv/kinds/fib-labels.ts","../src/tv/scene/fib.ts","../src/tv/scene/gann.ts","../src/tv/scene/shapes.ts","../src/tv/scene/patterns.ts","../src/tv/scene/markers.ts","../src/tv/scene/ranges.ts","../src/tv/scene/data.ts","../src/tv/time.ts","../src/tv/kinds/forecast-icons.ts","../src/tv/scene/positions.ts","../src/tv/scene/text-tools.ts","../src/tv/scene/index.ts","../src/tv/serialize.ts","../src/tv/interact/constants.ts","../src/tv/interact/project.ts","../src/tv/interact/placement.ts","../src/tv/interact/drag.ts","../src/tv/interact/anchor.ts","../src/runtime/coords.ts","../src/runtime/scene-canvas.ts","../src/runtime/manager.ts","../src/index.ts"],"sourcesContent":["/*\n * Drawing types shared across DrawingToolbar, App, ChartView, and the\n * DrawingsOverlay.\n *\n * Storage is data-space: each drawing's geometry is one or more\n * `{time, price}` data points. Screen-space projection happens at render\n * time via `Coords` so pan/zoom + chart rebuilds preserve placement.\n */\nimport type { Time } from \"lightweight-charts\";\n\nexport type DataPoint = { time: Time; price: number };\n\nexport type LineStyle = \"solid\" | \"dashed\" | \"dotted\";\n\nexport type DrawingStyle = {\n color: string;\n width: number;\n lineStyle: LineStyle;\n /** Colour for text labels (price/time labels, on-line text). Mirrors TV's\n * `textColor`. Optional so existing drawings & non-text kinds are\n * unaffected; renderers fall back to `color` when unset. */\n textColor?: string;\n /** Extend the line past p1/p2 to the pane edge. Mirrors TV `extendLeft`/\n * `extendRight`. Ray defaults to right-only, extended-line to both; when a\n * flag is unset the renderer uses the kind's intrinsic default (renderKind). */\n extendLeft?: boolean;\n extendRight?: boolean;\n\n // ── Line-family visuals (trend-line / ray / extended-line / info-line /\n // trend-angle). All optional + default-off so existing drawings and other\n // kinds are unaffected. Names mirror the captured TV `LineTool*` state. ──\n /** Small filled dot at the segment midpoint. TV `showMiddlePoint`. */\n showMiddlePoint?: boolean;\n /** Endpoint caps: 0 = none, 1 = arrowhead. TV `leftEnd` / `rightEnd`. */\n leftEnd?: number;\n rightEnd?: number;\n /** On-line text label + its font styling. TV `text`/`fontsize`/`bold`/\n * `italic`. Empty text renders nothing. */\n text?: string;\n fontSize?: number;\n bold?: boolean;\n italic?: boolean;\n /** Label anchor. TV `horzLabelsAlign` / `vertLabelsAlign`. */\n horzLabelsAlign?: \"left\" | \"center\" | \"right\";\n vertLabelsAlign?: \"top\" | \"middle\" | \"bottom\";\n /** Floating stats badge near the midpoint (price/percent/pips · bars/\n * duration/distance · angle), each row gated by a granular flag. TV\n * `alwaysShowStats` + the `show*` flags. */\n showStats?: boolean;\n /** TV statsPosition: 0 Left (p0), 1 Center (middle), 2 Right (p1), 3 Auto\n * (middle, kept in the pane and off the line). Unset = the TV factory\n * value of the kind (info line 1, other line tools 2). */\n statsPosition?: 0 | 1 | 2 | 3;\n showPriceRange?: boolean;\n showPercentPriceRange?: boolean;\n showPipsPriceRange?: boolean;\n showBarsRange?: boolean;\n showDateTimeRange?: boolean;\n showDistance?: boolean;\n showAngle?: boolean;\n\n /** Fib level tools (TV): level texts on / their alignment (retracement,\n * extension; factory on, centre / middle), full circles (speed arcs),\n * counterclockwise (spiral), pitchfork lines extended backwards\n * (extendLines). */\n showText?: boolean;\n horzTextAlign?: \"left\" | \"center\" | \"right\";\n vertTextAlign?: \"top\" | \"middle\" | \"bottom\";\n fullCircles?: boolean;\n counterclockwise?: boolean;\n extendLines?: boolean;\n /** Range tools (TV): extend top / bottom (date range), volume stat,\n * label background (fillLabelBackground / labelBackgroundColor), border\n * width (date and price range border). */\n extendTop?: boolean;\n extendBottom?: boolean;\n showVolume?: boolean;\n fillLabelBackground?: boolean;\n labelBackgroundColor?: string;\n borderWidth?: number;\n /** Text tools (TV drawBorder / wordWrap / wordWrapWidth): a border around\n * the text box, and wrapping at a fixed width (text, callout). */\n drawBorder?: boolean;\n wordWrap?: boolean;\n wordWrapWidth?: number;\n /** Signpost (TV showImage / plateColor / position): the emoji pin and its\n * colour; `signpostPosition` = the label's vertical place in the pane in\n * percent (TV `position`, factory 50). */\n showImage?: boolean;\n plateColor?: string;\n signpostPosition?: number;\n /** TV vertical line \"Extend\" (extendLine, factory on): the line runs\n * through every pane of the chart (OpenTrader draws in the main pane). */\n extendLine?: boolean;\n /** TV vertical line text orientation (factory vertical). */\n textOrientation?: \"vertical\" | \"horizontal\";\n /** TV Elliott waves \"Wave\" (showWave, factory on): the wave lines; off =\n * the labels only. */\n showWave?: boolean;\n\n // ── Axis labels ───────────────────────────────────────────────────────────\n /** Right-axis price pill at each endpoint (rendered via the chart's price\n * scale, not SVG). TV `showPriceLabels`. */\n showPriceLabels?: boolean;\n /** Time-axis label at the foot of a vertical-line / cross-line. TV `showTime`. */\n showTime?: boolean;\n\n // ── Shape interior fill (rectangle / circle / ellipse / triangle / rotated-\n // rectangle). Maps TV `fillBackground` / `backgroundColor` /\n // `transparency`. When absent the renderer falls back to the legacy\n // translucent stroke-colour fill (see _shared.ts `fillStyle`). ──────────\n /** Whether the shape interior is filled. TV `fillBackground`. */\n fillBackground?: boolean;\n /** Fill colour, independent of the stroke `color`. TV `backgroundColor`.\n * Falls back to `color` when unset. */\n backgroundColor?: string;\n /** Fill transparency on TV's 0-100 scale (higher = more transparent).\n * Rendered opacity = (100 - transparency) / 100. Unset → legacy 0.08. */\n transparency?: number;\n\n // ── Per-level model (fib retracement/extension/channel, pitchfork family,\n // gann fan). Mirrors TV's `level1..levelN` state: each level has its own\n // coefficient, colour and visibility; fills render between adjacent\n // visible levels using `fillBackground`/`transparency` above. Unset →\n // the kind's factory set (specs.ts defaults). ─────────────────────────\n levels?: LevelDef[];\n /** Mirror the level ladder (TV `reverse`, fib retracement/extension). */\n reverse?: boolean;\n /** Fib retracement: label levels as percentages (\"61.8%\" instead of\n * \"0.618\"). Settings \"Levels as percents\" checkbox. */\n fibLevelsAsPercents?: boolean;\n /** Fib retracement / trend-based extension: interpolate the level PRICES in\n * ln(price) space (TV `fibLevelsBasedOnLogScale`). Like TV's `isLog()`\n * gate, only in effect while the chart's price scale is logarithmic. */\n fibLevelsBasedOnLogScale?: boolean;\n\n // ── Position tool (long/short). TV's risk-reward model: the stop and\n // target are price OFFSETS from the entry (TV stores ticks; we store\n // price units), sized at placement to 20% of the visible range (1:1).\n // Unset on legacy drawings → derived from the old mirrored-target\n // points at render time. ────────────────────────────────────────────\n stopLevel?: number;\n profitLevel?: number;\n /** Risk inputs driving the Qty readout: qty = accountSize·risk% / (stop ·\n * lotSize). Mirrors TV's accountSize / risk / lotSize (factory 1000/25/1). */\n accountSize?: number;\n riskPercent?: number;\n lotSize?: number;\n /** TV riskDisplayMode: risk as a percent of the account (factory) or as a\n * money amount (`riskAmount`, capped at the account size). */\n riskDisplayMode?: \"percents\" | \"money\";\n riskAmount?: number;\n /** TV leverage (factory 10000): qty is capped at leverage · account / entry. */\n leverage?: number;\n /** TV qtyPrecision: \"default\" (stocks: floor) or \"0\"..\"10\" decimals. */\n qtyPrecision?: string;\n /** Position colours (TV stopBackground / profitBackground + their\n * transparency, factory #F23645 / #089981 at 80): zones and stop /\n * target lines at (100 − transparency)%, labels opaque. */\n stopColor?: string;\n stopTransparency?: number;\n targetColor?: string;\n targetTransparency?: number;\n /** TV infoBlocks (Stats): the parts shown in the target / middle / stop\n * labels; unset keys = the TV factory (all on except TP PL / SL PL). */\n positionStats?: Partial<Record<PositionStatKey, boolean>>;\n /** TV compact stats mode. */\n compactStats?: boolean;\n\n // ── Table (TV line-tool-table): rows of cell texts, column widths and row\n // heights in screen px (row height 0 = auto). Border colour = `color`,\n // plus backgroundColor / textColor / fontSize / horzLabelsAlign. TV keeps\n // cells and sizes in the template, so they live in the style. ──────────\n tableCells?: string[][];\n tableColWidths?: number[];\n tableRowHeights?: number[];\n\n /** Parallel channel: the dashed middle line (TV shows it by default). */\n middleLine?: boolean;\n /** Rectangle middle line (TV `middleLine`: showLine / lineColor /\n * lineWidth / lineStyle; factory off, the rectangle colour, 1px, dashed). */\n rectMiddleLine?: RegressionLine;\n /** Fib channel labels (TV showPrices / showCoeffs / labelFontSize, factory\n * on / on / 12); level values as percents = `fibLevelsAsPercents`. */\n showPrices?: boolean;\n showCoeffs?: boolean;\n /** Fib time zone level labels (TV showLabels, factory on). */\n showLabels?: boolean;\n /** Fib speed resistance fan (TV): time levels (`vlevel*`; `levels` = the\n * price levels), coefficient labels per side (factory all on) and the\n * grid (factory on, rgba(21, 56, 153, 0.8), 1px, solid). */\n vLevels?: LevelDef[];\n /** Trend-based fib time: the p0-p1-p2 trend lines (TV `trendline`,\n * factory on, #808080, 2px, dashed). */\n fibTrendLine?: RegressionLine;\n /** Gann square / Gann square fixed (TV levels / fanlines / arcs; the arcs\n * fill = fillBackground + transparency). */\n gannLevels?: GannLine[];\n gannFans?: GannRatioLine[];\n gannArcs?: GannRatioLine[];\n /** Sector (TV projection): background gradient colours color1 → color2\n * (factory tv-blue-500 → grapes-purple-500 at 80 transparency). */\n sectorColor1?: string;\n sectorColor2?: string;\n /** Gann box (TV): time-levels background (fillVertBackground /\n * vertTransparency; the price levels use fillBackground / transparency)\n * and the angle lines (fans: visible / color, factory off, #9C9C9C). */\n fillVertBackground?: boolean;\n vertTransparency?: number;\n fans?: { visible: boolean; color: string };\n showLeftLabels?: boolean;\n showRightLabels?: boolean;\n showTopLabels?: boolean;\n showBottomLabels?: boolean;\n fanGrid?: RegressionLine;\n labelFontSize?: number;\n /** Price note price label (TV priceLabel*: text colour / size / bold /\n * italic, background, border; factory white, 12px, tv-blue-500 x2). The\n * line colour is `color`. */\n /** Position forecast (TV line-tool-prediction): balloon colours; the\n * backgrounds, borders and status banners are drawn at `transparency`\n * (factory 10). */\n sourceTextColor?: string;\n sourceBackColor?: string;\n sourceStrokeColor?: string;\n targetTextColor?: string;\n targetBackColor?: string;\n targetStrokeColor?: string;\n successTextColor?: string;\n successBackground?: string;\n failureTextColor?: string;\n failureBackground?: string;\n priceLabelTextColor?: string;\n priceLabelFontSize?: number;\n priceLabelBold?: boolean;\n priceLabelItalic?: boolean;\n priceLabelBackgroundColor?: string;\n priceLabelBorderColor?: string;\n\n /** Trend-angle: the displayed angle in degrees, frozen in SCREEN space at\n * placement / anchor-drag end (TV stores `angle` + `distance` and derives\n * the second point, so zooming never changes the readout). */\n angle?: number;\n\n /** Bar-pattern display model (TV `mode` / `mirrored` / `flipped`):\n * \"line\" draws a close-price polyline instead of candles; mirrored\n * reverses the bar order; flipped inverts prices around the pattern base. */\n patternMode?: \"bars\" | \"oc\" | \"line\" | \"line-open\" | \"line-high\" | \"line-low\" | \"line-hl2\";\n /** Ghost feed candle style (TV candleStyle): body up / down colours,\n * borders (on + up / down colours), wick (on + colour). */\n ghostCandle?: GhostCandleStyle;\n mirrored?: boolean;\n flipped?: boolean;\n\n /** Ghost-feed candle randomness on TV's 0-100 scale (factory 50): 0 = every\n * bar spans exactly the frozen amplitude, 100 = maximum jitter. */\n variance?: number;\n\n // ── Regression trend (study model, line-tool-regression-trend chunk). The\n // bands sit at base ± dev·σ of the close-vs-index fit residuals; TV's\n // study inputs \"Upper Deviation\" / \"Lower Deviation\" (factory +2 / −2).\n // `showPearsons` mirrors styles.showPearsons (Pearson's R label under the\n // down line's start); extend-right maps TV's single styles.extendLines. ──\n /** Range tools custom text style (TV `customText`: colour, size, bold,\n * italic; the string itself is `text`). Factory #2962FF, 12px. */\n customTextColor?: string;\n customTextSize?: number;\n customTextBold?: boolean;\n customTextItalic?: boolean;\n /** Callout border colour (TV `bordercolor`); unset = the bubble colour. */\n borderColor?: string;\n\n /** Elliott wave degree (TV `degree`): 0 Supermillennium … 14 Minuscule,\n * factory 7 (Intermediate). Drives the label set, size and decoration. */\n elliottDegree?: number;\n\n upperDeviation?: number;\n lowerDeviation?: number;\n /** TV \"Use Upper / Lower Deviation\" (factory on). Off: the line sits at the\n * largest bar high above (low below) the base line instead of dev·σ. */\n useUpperDeviation?: boolean;\n useLowerDeviation?: boolean;\n /** TV study `source` (factory close): the series the base line, σ and\n * Pearson's R are computed on. */\n regressionSource?: \"open\" | \"high\" | \"low\" | \"close\" | \"hl2\" | \"hlc3\" | \"ohlc4\" | \"hlcc4\";\n showPearsons?: boolean;\n /** TV styles.baseLine / upLine / downLine: visibility, colour, width, style\n * per line (the fills take the line colour at `transparency`). */\n regressionLines?: { base: RegressionLine; up: RegressionLine; down: RegressionLine };\n\n /** Anchored VWAP source series (TV study `source` input; the classic VWAP\n * typical price hlc3 is the fallback). The ±σ band ladder rides `levels`\n * (coeff = the band's multiplier). */\n vwapSource?: \"open\" | \"high\" | \"low\" | \"close\" | \"hl2\" | \"hlc3\" | \"ohlc4\" | \"hlcc4\";\n /** Anchored VWAP (TV study): band distance unit (\"Bands Calculation\n * Mode\": Standard Deviation, or Percentage where multiplier 1 = 1% of the\n * VWAP), the upper / lower line of each band (UpperBand / LowerBand\n * styles: visible, colour, width) and the VWAP price-scale label\n * (axisLabelVisible, factory on). */\n vwapBandsMode?: \"stdev\" | \"percent\";\n vwapUpper?: RegressionLine[];\n vwapLower?: RegressionLine[];\n vwapPriceLabel?: boolean;\n};\n\n/** One configurable level of a levels-based tool. `label` overrides the\n * coefficient text (gann-fan's \"1/8\"..\"8/1\"); `width`/`style` override the\n * drawing's stroke per level (TV's per-level linewidth/linestyle). */\n/** Ghost feed candle style (TV `candleStyle`). */\nexport type GhostCandleStyle = {\n upColor: string;\n downColor: string;\n drawBorder: boolean;\n borderUpColor: string;\n borderDownColor: string;\n drawWick: boolean;\n wickColor: string;\n};\n\n/** One regression trend line (TV study plot style). */\n/** Gann level line (TV levels.N: color, width, visible). */\nexport type GannLine = { color: string; width: number; visible: boolean };\n/** Gann fan / arc line with its x·y ratio (TV fanlines.N / arcs.N). */\nexport type GannRatioLine = GannLine & { x: number; y: number };\n\n/** TV risk / reward infoBlocks keys. */\nexport type PositionStatKey =\n | \"tpPriceOffset\" | \"tpPercentOffset\" | \"tpTickOffset\" | \"tpAmount\" | \"tpPL\"\n | \"openClosePL\" | \"qty\" | \"riskRewardRatio\"\n | \"slPriceOffset\" | \"slPercentOffset\" | \"slTickOffset\" | \"slAmount\" | \"slPL\";\n\nexport type RegressionLine = { visible: boolean; color: string; width: number; style: LineStyle };\n\nexport type LevelDef = {\n coeff: number;\n color: string;\n visible: boolean;\n label?: string;\n width?: number;\n style?: LineStyle;\n /** TV fib level text (levelN.text), shown with `showText`. */\n text?: string;\n};\n\n/** Universal fallback style — the TradingView factory base (its trend-line\n * defaults: blue, 1px, solid). Per-tool overrides live in each spec's\n * `defaults` (see specs.ts `defaultStyleFor`); a kind with no override gets\n * this. Most tools inherit 1px; the heavier line/shape tools override to 2px. */\nexport const DEFAULT_STYLE: DrawingStyle = {\n color: \"#2962ff\",\n width: 1,\n lineStyle: \"solid\",\n};\n\n/* ── Per-interval visibility (TV's Visibility tab) ──────────────────────────\n * Captured live (3.2.0.7916): one row per interval unit, each a checkbox plus\n * a from/to range inside the unit — Ticks (checkbox only), Seconds 1-59,\n * Minutes 1-59, Hours 1-24, Days 1-366, Weeks 1-52, Months 1-12, Ranges\n * (checkbox only). A drawing renders only when the chart interval matches an\n * enabled row's range. Absent field (older saved drawings) = always visible. */\nexport type UnitVisibility = { on: boolean; from: number; to: number };\nexport type IntervalVisibility = {\n ticks: boolean;\n seconds: UnitVisibility;\n minutes: UnitVisibility;\n hours: UnitVisibility;\n days: UnitVisibility;\n weeks: UnitVisibility;\n months: UnitVisibility;\n ranges: boolean;\n};\n\n/** TV's defaults: every unit on, full range. */\nexport const DEFAULT_VISIBILITY: IntervalVisibility = {\n ticks: true,\n seconds: { on: true, from: 1, to: 59 },\n minutes: { on: true, from: 1, to: 59 },\n hours: { on: true, from: 1, to: 24 },\n days: { on: true, from: 1, to: 366 },\n weeks: { on: true, from: 1, to: 52 },\n months: { on: true, from: 1, to: 12 },\n ranges: true,\n};\n\n/** TRUE when a drawing with visibility `v` should render on `interval`.\n * Interval strings follow the app's TV-style format: bare number = minutes\n * (\"1\", \"5\", \"240\"; multiples of 60 read as hours), \"NS\" seconds, \"NT\" ticks,\n * \"NR\" ranges, \"ND\" days, \"NW\" weeks, \"NM\" months. Unknown formats stay\n * visible (fail open). */\nexport function isVisibleOnInterval(v: IntervalVisibility | undefined, interval: string | undefined): boolean {\n if (!v || !interval) return true;\n const m = /^(\\d+)([A-Z]+)?$/.exec(interval.trim().toUpperCase());\n if (!m) return true;\n const n = Math.max(1, parseInt(m[1], 10));\n const inRange = (u: UnitVisibility, value: number) => u.on && value >= u.from && value <= u.to;\n switch (m[2]) {\n case \"T\": return v.ticks; // tick charts (\"1T\"..\"1000T\")\n case \"R\": return v.ranges; // range charts (\"1R\"..\"1000R\")\n case \"S\": return inRange(v.seconds, n);\n case \"D\": return inRange(v.days, n);\n case \"W\": return inRange(v.weeks, n);\n case \"M\": return inRange(v.months, n);\n case undefined: {\n // Bare number = minutes. TV files 60-minute multiples under the Hours\n // row, sub-hour under Minutes; an odd >59-minute frame (e.g. a custom\n // 90m) is filed by its hour span so it can't fail CLOSED against the\n // 1-59 Minutes row.\n if (n % 60 === 0) return inRange(v.hours, n / 60);\n if (n < 60) return inRange(v.minutes, n);\n return inRange(v.hours, Math.round(n / 60));\n }\n default: return true; // unknown unit → stay visible (fail open)\n }\n}\n\nexport type DrawingKind =\n // 1-point\n | \"horizontal-line\"\n | \"horizontal-ray\"\n | \"vertical-line\"\n | \"cross-line\"\n | \"arrow-marker\"\n | \"arrow-mark-up\"\n | \"arrow-mark-down\"\n | \"price-label\"\n | \"flag-mark\"\n // 2-point\n | \"trend-line\"\n | \"ray\"\n | \"extended-line\"\n | \"info-line\"\n | \"trend-angle\"\n | \"long-position\"\n | \"short-position\"\n | \"gann-fan\"\n | \"gann-box\"\n | \"fib-time-zone\"\n | \"fib-circles\"\n | \"fib-speed-resistance-fan\"\n | \"fib-speed-resistance-arcs\"\n | \"fib-spiral\"\n | \"fib-wedge\"\n | \"pitchfan\"\n | \"cyclic-lines\"\n | \"sine-line\"\n | \"time-cycles\"\n | \"arrow\"\n | \"rectangle\"\n | \"circle\"\n | \"ellipse\"\n | \"fib-retracement\"\n | \"price-range\"\n | \"date-range\"\n | \"date-and-price-range\"\n | \"position-forecast\"\n | \"bar-pattern\"\n | \"ghost-feed\"\n // 3-point\n | \"triangle\"\n | \"parallel-channel\"\n | \"pitchfork\"\n | \"schiff-pitchfork\"\n | \"modified-schiff-pitchfork\"\n | \"inside-pitchfork\"\n | \"trend-based-fib-extension\"\n | \"trend-based-fib-time\"\n | \"gann-square-fixed\"\n | \"gann-square\"\n | \"sector\"\n | \"disjoint-channel\"\n | \"flat-top-bottom\"\n | \"fib-channel\"\n | \"rotated-rectangle\"\n | \"curve\"\n | \"arc\"\n // 4-point\n | \"double-curve\"\n // N-point pattern / Elliott family (labeled polylines/polygons)\n | \"abcd-pattern\"\n | \"xabcd-pattern\"\n | \"cypher-pattern\"\n | \"head-and-shoulders\"\n | \"triangle-pattern\"\n | \"three-drives-pattern\"\n | \"elliott-impulse\"\n | \"elliott-correction\"\n | \"elliott-triangle\"\n | \"elliott-double-combo\"\n | \"elliott-triple-combo\"\n // freehand (variable-length, double-click to finalize)\n | \"polyline\"\n | \"path\"\n | \"brush\"\n | \"highlighter\"\n // text annotations (carry an editable `text` field)\n | \"text\"\n | \"note\"\n | \"pin\"\n | \"comment\"\n | \"price-note\"\n | \"signpost\"\n | \"callout\"\n // font-icon (emoji / sticker / icon glyph placed at one point)\n | \"font-icon\"\n // table / image (TV line-tool-table / line-tool-image, 1 point)\n | \"table\"\n | \"image\"\n // data-driven (compute over the chart's bars in the selected range)\n | \"regression-trend\"\n | \"anchored-vwap\"\n | \"fixed-range-volume-profile\"\n | \"anchored-volume-profile\";\n\n/** Pattern / Elliott-wave family — rendered as a single labeled polyline/polygon\n * through a variable number of vertices (see DrawingsOverlay renderLabeledPolyline). */\nexport type PatternKind =\n | \"abcd-pattern\"\n | \"xabcd-pattern\"\n | \"cypher-pattern\"\n | \"head-and-shoulders\"\n | \"triangle-pattern\"\n | \"three-drives-pattern\"\n | \"elliott-impulse\"\n | \"elliott-correction\"\n | \"elliott-triangle\"\n | \"elliott-double-combo\"\n | \"elliott-triple-combo\";\n\n/** Freehand family — variable-length polylines placed click-per-vertex and\n * finalized with a double-click (the spec carries `variableLength: true`). */\nexport type FreehandKind = \"polyline\" | \"path\" | \"brush\" | \"highlighter\";\n\ntype WithId<T> = T & {\n id: string;\n style: DrawingStyle;\n /** User-editable display name (the input under the settings-dialog title;\n * TV defaults it to the tool's label). Shown in listings when set. */\n name?: string;\n /** Editable annotation text for the text family (text/note/comment/price-note/\n * signpost/callout). Empty/undefined renders a faint placeholder. */\n text?: string;\n /** Glyph payload for the `font-icon` kind — a Unicode emoji char OR raw\n * `<svg>` markup (icon/sticker). Rendered at the placement point. */\n glyph?: string;\n /** Bar-pattern frozen snapshot (TV model): the OHLC rows captured at\n * placement + the first bar's open as the anchor base. Rendered at\n * consecutive bar indices from p0, offset by (p0.price − base) — real\n * price scale, never renormalised into the box. */\n pattern?: { base: number; bars: [number, number, number, number][] };\n /** Ghost-feed generation params (TV model): a stable seed + the ATR-based\n * candle amplitude (price units) captured at placement, so the simulated\n * candles survive moves/reloads and resize with the drift line. */\n ghost?: { seed: number; amplitude: number };\n /** Image tool (TV line-tool-image): the stored file name (app data\n * `drawing-images/`) and the drawn size in screen px (TV cssWidth /\n * cssHeight). The point is the image centre. Not a style field: TV keeps\n * the url out of templates. `dx` = transient x offset of the centre\n * during a corner drag (TV dOffsetX), dropped when the drag ends. */\n image?: { name: string; cssWidth: number; cssHeight: number; dx?: number };\n /** TV \"Anchor drawing\" (property `anchored`; text, pin, table -\n * interact/anchor.ts): the drawing is fixed\n * to the screen at these pane fractions (TV positionPercents: x / time\n * scale width, y / pane height) and does not move with the chart. The\n * data point is kept for when it is unanchored. */\n anchored?: { x: number; y: number };\n /** Polyline closed into a shape (TV `filled`): set when the drawing is\n * finished on its first point or an end point is dragged onto the other\n * end. Only a closed polyline draws its closing side and its fill. */\n closed?: boolean;\n /** Locked drawings can be selected but not dragged or deleted via Delete-key. */\n locked?: boolean;\n /** Hidden drawings are not rendered or hit-tested. Toggle via context menu;\n * unhiding from the chart requires re-selecting through the ObjectTreePanel\n * (not yet built). */\n hidden?: boolean;\n /** Per-interval visibility matrix (Settings → Visibility). Absent = always\n * visible (the default for drawings saved before this field existed). */\n visibility?: IntervalVisibility;\n /** Point-model format version for kinds whose stored-point MEANING changed\n * without a count change (circle: bbox corners → center + radius point;\n * arc: [start, control, end] → [chord start, chord end, bulge]). Absent =\n * pre-change entry that migrateDrawing converts once; 2 = current model. */\n fmt?: number;\n /** ObjectTree group tag — drawings sharing a tag render under one group\n * header in the panel (set/cleared by its Manage mode). */\n group?: string;\n};\n\ntype OnePoint =\n | { kind: \"horizontal-line\"; points: [DataPoint] }\n | { kind: \"horizontal-ray\"; points: [DataPoint] }\n | { kind: \"vertical-line\"; points: [DataPoint] }\n | { kind: \"cross-line\"; points: [DataPoint] }\n | { kind: \"arrow-mark-up\"; points: [DataPoint] }\n | { kind: \"arrow-mark-down\"; points: [DataPoint] }\n | { kind: \"price-label\"; points: [DataPoint] }\n | { kind: \"flag-mark\"; points: [DataPoint] }\n | { kind: \"text\"; points: [DataPoint] }\n | { kind: \"note\"; points: [DataPoint, DataPoint] }\n | { kind: \"pin\"; points: [DataPoint] }\n | { kind: \"comment\"; points: [DataPoint] }\n | { kind: \"signpost\"; points: [DataPoint] }\n | { kind: \"font-icon\"; points: [DataPoint] }\n | { kind: \"table\"; points: [DataPoint] }\n | { kind: \"image\"; points: [DataPoint] }\n | { kind: \"anchored-vwap\"; points: [DataPoint] };\n\ntype TwoPoint =\n | { kind: \"arrow-marker\"; points: [DataPoint, DataPoint] }\n | { kind: \"price-note\"; points: [DataPoint, DataPoint] }\n | { kind: \"trend-line\"; points: [DataPoint, DataPoint] }\n | { kind: \"ray\"; points: [DataPoint, DataPoint] }\n | { kind: \"extended-line\"; points: [DataPoint, DataPoint] }\n | { kind: \"info-line\"; points: [DataPoint, DataPoint] }\n | { kind: \"trend-angle\"; points: [DataPoint, DataPoint] }\n | { kind: \"long-position\"; points: [DataPoint, DataPoint] }\n | { kind: \"short-position\"; points: [DataPoint, DataPoint] }\n | { kind: \"gann-fan\"; points: [DataPoint, DataPoint] }\n | { kind: \"gann-box\"; points: [DataPoint, DataPoint] }\n | { kind: \"fib-time-zone\"; points: [DataPoint, DataPoint] }\n | { kind: \"fib-circles\"; points: [DataPoint, DataPoint] }\n | { kind: \"fib-speed-resistance-fan\"; points: [DataPoint, DataPoint] }\n | { kind: \"fib-speed-resistance-arcs\"; points: [DataPoint, DataPoint] }\n | { kind: \"fib-spiral\"; points: [DataPoint, DataPoint] }\n | { kind: \"cyclic-lines\"; points: [DataPoint, DataPoint] }\n | { kind: \"sine-line\"; points: [DataPoint, DataPoint] }\n | { kind: \"time-cycles\"; points: [DataPoint, DataPoint] }\n | { kind: \"arrow\"; points: [DataPoint, DataPoint] }\n | { kind: \"rectangle\"; points: [DataPoint, DataPoint] }\n | { kind: \"circle\"; points: [DataPoint, DataPoint] }\n | { kind: \"fib-retracement\"; points: [DataPoint, DataPoint] }\n | { kind: \"price-range\"; points: [DataPoint, DataPoint] }\n | { kind: \"date-range\"; points: [DataPoint, DataPoint] }\n | { kind: \"date-and-price-range\"; points: [DataPoint, DataPoint] }\n | { kind: \"position-forecast\"; points: [DataPoint, DataPoint] }\n | { kind: \"bar-pattern\"; points: [DataPoint, DataPoint] }\n | { kind: \"callout\"; points: [DataPoint, DataPoint] }\n | { kind: \"regression-trend\"; points: [DataPoint, DataPoint] }\n | { kind: \"fixed-range-volume-profile\"; points: [DataPoint, DataPoint] }\n | { kind: \"anchored-volume-profile\"; points: [DataPoint] };\n\ntype ThreePoint =\n | { kind: \"triangle\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"fib-wedge\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"pitchfan\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"ellipse\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"parallel-channel\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"pitchfork\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"trend-based-fib-extension\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"trend-based-fib-time\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"gann-square-fixed\"; points: [DataPoint, DataPoint] }\n | { kind: \"gann-square\"; points: [DataPoint, DataPoint] }\n | { kind: \"sector\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"disjoint-channel\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"flat-top-bottom\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"schiff-pitchfork\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"modified-schiff-pitchfork\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"inside-pitchfork\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"fib-channel\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"rotated-rectangle\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"curve\"; points: [DataPoint, DataPoint, DataPoint] }\n | { kind: \"arc\"; points: [DataPoint, DataPoint, DataPoint] };\n\ntype FourPoint =\n | { kind: \"double-curve\"; points: [DataPoint, DataPoint, DataPoint, DataPoint] };\n\n/** Variable-length labeled polyline/polygon — one variant covers the pattern/\n * Elliott family plus the freehand tools. Fixed patterns enforce their vertex\n * count via the spec's pointCount; freehand tools place until a double-click. */\ntype PolyPoint = { kind: PatternKind | FreehandKind; points: DataPoint[] };\n\n/** Ghost feed — variable-length (TV pointsCount −1): every click after the\n * first appends another drift-segment vertex; candles generate along each\n * leg. Stored 2-point feeds are just 2-vertex polylines — no migration. */\ntype GhostFeedPoint = { kind: \"ghost-feed\"; points: DataPoint[] };\n\nexport type Drawing = WithId<OnePoint | TwoPoint | ThreePoint | FourPoint | PolyPoint | GhostFeedPoint>;\n\n/** Payload accepted by App.addDrawing — caller doesn't supply the id. The\n * optional `text` rides along so text-family placements can carry their\n * typed content through addDrawing's `...d` spread; `style`, when present,\n * replaces the kind's default style (position placement freezes its\n * stop/profit offsets into it). */\nexport type NewDrawing = (OnePoint | TwoPoint | ThreePoint | FourPoint | PolyPoint | GhostFeedPoint) & {\n text?: string;\n glyph?: string;\n image?: { name: string; cssWidth: number; cssHeight: number };\n style?: DrawingStyle;\n pattern?: { base: number; bars: [number, number, number, number][] };\n ghost?: { seed: number; amplitude: number };\n closed?: boolean;\n fmt?: number;\n};\n","/*\n * Per-kind specs for the SVG overlay: click-count, preview style, and\n * whether the kind uses the bbox-corner-remap drag pattern (rectangle,\n * circle, date-and-price-range) instead of the per-point drag pattern.\n *\n * Full DrawingSpec (defaults/floatingToolbar/settingsTabs) lands later\n * when the SelectedToolbar + SettingsDialog ports happen.\n */\nimport { DEFAULT_STYLE, type DrawingKind, type DrawingStyle, type GhostCandleStyle, type LevelDef, type RegressionLine, type GannLine, type GannRatioLine } from \"./types\";\n\n// ── Factory level sets (decompiled from TV's line-tool bundles, 10/07/2026;\n// colours re-checked live on TV 3.4.1 with properties().factoryDefaults(),\n// 24/09/2026 — research/drawings-gap/data/levels-compare.txt:\n// line-tool-fib-retracement / line-tool-pitchfork / line-tool-gann-fan\n// `_createWithDefaults` tables — coeffs, visibility and per-level palette\n// colours are verbatim). Shared TV palette tokens:\nconst GRAY = \"#808080\"; // grey (TV 3.4.1 factory; was cold-gray-500 #787b86)\nconst RED = \"#f23645\"; // ripe-red-500\nconst ORANGE = \"#ff9800\"; // tan-orange-500\nconst GREEN = \"#4caf50\"; // iguana-green-500\nconst MINTY = \"#089981\"; // minty-green-500\nconst SKY = \"#00bcd4\"; // cyan (TV 3.4.1 factory \"sky\" level colour; was #2196f3)\nconst BLUE = \"#2962ff\"; // tv-blue-500\nconst PURPLE = \"#9c27b0\"; // grapes-purple-500\nconst PINK = \"#e91e63\"; // berry-pink-500\nconst DEEP_PURPLE = \"#673ab7\"; // deep-purple (TV patterns, double curve)\n\n/** TV's 24-level fib set (retracement / trend-based extension / channel).\n * Default-visible: 0…1 plus the 1.618/2.618/3.618/4.236 extensions. */\n// TV factory order (level1..level24: the visible levels first, then the\n// hidden ones); the renderers sort by coefficient.\nexport const FIB_LEVEL_DEFAULTS: LevelDef[] = [\n { coeff: 0, color: GRAY, visible: true },\n { coeff: 0.236, color: RED, visible: true },\n { coeff: 0.382, color: ORANGE, visible: true },\n { coeff: 0.5, color: GREEN, visible: true },\n { coeff: 0.618, color: MINTY, visible: true },\n { coeff: 0.786, color: SKY, visible: true },\n { coeff: 1, color: GRAY, visible: true },\n { coeff: 1.618, color: BLUE, visible: true },\n { coeff: 2.618, color: RED, visible: true },\n { coeff: 3.618, color: PURPLE, visible: true },\n { coeff: 4.236, color: PINK, visible: true },\n { coeff: 1.272, color: ORANGE, visible: false },\n { coeff: 1.414, color: RED, visible: false },\n { coeff: 2.272, color: ORANGE, visible: false },\n { coeff: 2.414, color: GREEN, visible: false },\n { coeff: 2, color: MINTY, visible: false },\n { coeff: 3, color: SKY, visible: false },\n { coeff: 3.272, color: GRAY, visible: false },\n { coeff: 3.414, color: BLUE, visible: false },\n { coeff: 4, color: RED, visible: false },\n { coeff: 4.272, color: PURPLE, visible: false },\n { coeff: 4.414, color: PINK, visible: false },\n { coeff: 4.618, color: ORANGE, visible: false },\n { coeff: 4.764, color: MINTY, visible: false },\n];\n\n/** Pitchfork family: 9 levels, default-visible .5 and 1 (the tines). The\n * median is drawn in the drawing's base colour (TV default ripe-red). */\nexport const PITCHFORK_LEVEL_DEFAULTS: LevelDef[] = [\n { coeff: 0.25, color: \"#ffb74d\", visible: false }, // tan-orange-300\n { coeff: 0.382, color: \"#81c784\", visible: false }, // iguana-green-300\n { coeff: 0.5, color: MINTY, visible: true },\n { coeff: 0.618, color: MINTY, visible: false },\n { coeff: 0.75, color: SKY, visible: false },\n { coeff: 1, color: BLUE, visible: true },\n { coeff: 1.5, color: PURPLE, visible: false },\n { coeff: 1.75, color: PINK, visible: false },\n { coeff: 2, color: \"#f77c80\", visible: false }, // ripe-red-300\n];\n\n/** Gann fan: coeff = time-fraction of the 1/1 ray (1/8 is the steepest —\n * it reaches the anchor move's dy in an eighth of the dt). All visible. */\nexport const GANN_FAN_LEVEL_DEFAULTS: LevelDef[] = [\n { coeff: 1 / 8, color: ORANGE, visible: true, label: \"1/8\" },\n { coeff: 1 / 4, color: MINTY, visible: true, label: \"1/4\" },\n { coeff: 1 / 3, color: GREEN, visible: true, label: \"1/3\" },\n { coeff: 1 / 2, color: MINTY, visible: true, label: \"1/2\" },\n { coeff: 1, color: SKY, visible: true, label: \"1/1\" },\n { coeff: 2, color: BLUE, visible: true, label: \"2/1\" },\n { coeff: 3, color: PURPLE, visible: true, label: \"3/1\" },\n { coeff: 4, color: PINK, visible: true, label: \"4/1\" },\n { coeff: 8, color: RED, visible: true, label: \"8/1\" },\n];\n\n/** Fib wedge: 11 levels, .236…1 visible by default (the coeff-1 pair are the\n * wedge edges); extensions hidden. */\nexport const FIB_WEDGE_LEVEL_DEFAULTS: LevelDef[] = [\n { coeff: 0.236, color: RED, visible: true },\n { coeff: 0.382, color: ORANGE, visible: true },\n { coeff: 0.5, color: GREEN, visible: true },\n { coeff: 0.618, color: MINTY, visible: true },\n { coeff: 0.786, color: SKY, visible: true },\n { coeff: 1, color: GRAY, visible: true },\n { coeff: 1.618, color: BLUE, visible: false },\n { coeff: 2.618, color: RED, visible: false },\n { coeff: 3.618, color: DEEP_PURPLE, visible: false },\n { coeff: 4.236, color: PINK, visible: false },\n { coeff: 4.618, color: PINK, visible: false },\n];\n\n/** Speed-resistance fan: one ladder applied to BOTH the price and time axes.\n * TV keeps separate hlevel/vlevel lists; both factory lists are 0 · 0.25 ·\n * 0.382 · 0.5 · 0.618 · 0.75 · 1 with these colours (0 and 1 = the box edges). */\nexport const SPEED_FAN_LEVEL_DEFAULTS: LevelDef[] = [\n { coeff: 0, color: GRAY, visible: true },\n { coeff: 0.25, color: ORANGE, visible: true },\n { coeff: 0.382, color: SKY, visible: true },\n { coeff: 0.5, color: GREEN, visible: true },\n { coeff: 0.618, color: MINTY, visible: true },\n { coeff: 0.75, color: BLUE, visible: true },\n { coeff: 1, color: GRAY, visible: true },\n];\n\n/** Trend-based fib time (TV factory, read live 25/09/2026): 11 levels, 2px\n * solid, 0.5 hidden; dashed #808080 2px trend lines. */\nexport const TREND_FIB_TIME_LEVEL_DEFAULTS: LevelDef[] = [\n { coeff: 0, color: GRAY, visible: true, width: 2, style: \"solid\" },\n { coeff: 0.382, color: RED, visible: true, width: 2, style: \"solid\" },\n { coeff: 0.5, color: \"#81c784\", visible: false, width: 2, style: \"solid\" },\n { coeff: 0.618, color: GREEN, visible: true, width: 2, style: \"solid\" },\n { coeff: 1, color: MINTY, visible: true, width: 2, style: \"solid\" },\n { coeff: 1.382, color: SKY, visible: true, width: 2, style: \"solid\" },\n { coeff: 1.618, color: GRAY, visible: true, width: 2, style: \"solid\" },\n { coeff: 2, color: BLUE, visible: true, width: 2, style: \"solid\" },\n { coeff: 2.382, color: PINK, visible: true, width: 2, style: \"solid\" },\n { coeff: 2.618, color: PURPLE, visible: true, width: 2, style: \"solid\" },\n { coeff: 3, color: \"#673ab7\", visible: true, width: 2, style: \"solid\" },\n];\nexport const TREND_FIB_TIME_TREND_DEFAULT = { visible: true, color: GRAY, width: 2, style: \"dashed\" as const };\n/** TV fib \"Trend line\" factory: retracement / extension / circles / arcs\n * dashed #808080 2px; fib wedge solid. */\nexport const FIB_TREND_LINE_DEFAULT = TREND_FIB_TIME_TREND_DEFAULT;\nexport const FIB_WEDGE_TREND_LINE_DEFAULT = { visible: true, color: GRAY, width: 2, style: \"solid\" as const };\n\n/** Gann square / fixed (TV module 135885): 6 levels, 11 fans (2x1, 1x1, 1x2\n * on), 11 arcs (all on), 2px. */\nconst gl = (color: string, visible: boolean): GannLine => ({ color, width: 2, visible });\nconst gr = (color: string, visible: boolean, x: number, y: number): GannRatioLine => ({ color, width: 2, visible, x, y });\nexport const GANN_LEVEL_DEFAULTS: GannLine[] = [gl(GRAY, true), gl(ORANGE, true), gl(SKY, true), gl(GREEN, true), gl(MINTY, true), gl(GRAY, true)];\nexport const GANN_FAN_DEFAULTS: GannRatioLine[] = [\n gr(\"#b39ddb\", false, 8, 1), gr(RED, false, 5, 1), gr(GRAY, false, 4, 1), gr(ORANGE, false, 3, 1), gr(SKY, true, 2, 1),\n gr(GREEN, true, 1, 1), gr(MINTY, true, 1, 2), gr(MINTY, false, 1, 3), gr(BLUE, false, 1, 4), gr(\"#9575cd\", false, 1, 5), gr(\"#b39ddb\", false, 1, 8),\n];\nexport const GANN_ARC_DEFAULTS: GannRatioLine[] = [\n gr(ORANGE, true, 1, 0), gr(ORANGE, true, 1, 1), gr(ORANGE, true, 1.5, 0), gr(SKY, true, 2, 0), gr(SKY, true, 2, 1),\n gr(GREEN, true, 3, 0), gr(GREEN, true, 3, 1), gr(MINTY, true, 4, 0), gr(MINTY, true, 4, 1), gr(BLUE, true, 5, 0), gr(BLUE, true, 5, 1),\n];\n\n/** Fib speed resistance fan grid (TV factory, read live 25/09/2026). */\nexport const SPEED_FAN_GRID_DEFAULT = { visible: true, color: \"rgba(21, 56, 153, 0.8)\", width: 1, style: \"solid\" as const };\n\n/** Fib time zone (line-tool-fib-timezone `_createWithDefaults`): 11 levels at\n * the Fibonacci sequence, level 1 cold-gray and the rest tv-blue, all\n * visible. Rendered as vertical lines spaced by the p0→p1 bar distance. */\nexport const FIB_TIMEZONE_LEVEL_DEFAULTS: LevelDef[] = [\n { coeff: 0, color: GRAY, visible: true },\n { coeff: 1, color: BLUE, visible: true },\n { coeff: 2, color: BLUE, visible: true },\n { coeff: 3, color: BLUE, visible: true },\n { coeff: 5, color: BLUE, visible: true },\n { coeff: 8, color: BLUE, visible: true },\n { coeff: 13, color: BLUE, visible: true },\n { coeff: 21, color: BLUE, visible: true },\n { coeff: 34, color: BLUE, visible: true },\n { coeff: 55, color: BLUE, visible: true },\n { coeff: 89, color: BLUE, visible: true },\n];\n\n/** Anchored VWAP ±σ bands (line-tool-anchored-vwap: UpperBand/LowerBand #1..#3\n * style pairs + per-band multiplier inputs; the study ships them hidden so a\n * fresh tool draws only the VWAP line). coeff = the band's σ multiplier. The\n * study's factory palette lives in the server metaInfo (not in the captured\n * chunk) — the public VWAP study's green/olive/teal set is used. */\nexport const VWAP_BAND_DEFAULTS: LevelDef[] = [\n // TV anchoredvwap factory: band #1 on (calculate_stDev), #2 / #3 off.\n { coeff: 1, color: GREEN, visible: true },\n { coeff: 2, color: \"#808000\", visible: false },\n { coeff: 3, color: \"#00897b\", visible: false },\n];\n\n/** Anchored VWAP band lines (TV styles UpperBand / LowerBand #1..#3\n * factory: visible, #4caf50 / #808000 / #00897b, 1px, solid). */\nexport const VWAP_BAND_LINE_DEFAULTS: RegressionLine[] = [\n { visible: true, color: GREEN, width: 1, style: \"solid\" },\n { visible: true, color: \"#808000\", width: 1, style: \"solid\" },\n { visible: true, color: \"#00897b\", width: 1, style: \"solid\" },\n];\n\n/** Speed-resistance arcs: TV factory, 11 levels, all visible. */\nexport const SPEED_ARC_LEVEL_DEFAULTS: LevelDef[] = [\n { coeff: 0.236, color: RED, visible: true },\n { coeff: 0.382, color: ORANGE, visible: true },\n { coeff: 0.5, color: MINTY, visible: true },\n { coeff: 0.618, color: GREEN, visible: true },\n { coeff: 0.786, color: SKY, visible: true },\n { coeff: 1, color: GRAY, visible: true },\n { coeff: 1.618, color: BLUE, visible: true },\n { coeff: 2.618, color: PINK, visible: true },\n { coeff: 3.618, color: BLUE, visible: true },\n { coeff: 4.236, color: PINK, visible: true },\n { coeff: 4.618, color: RED, visible: true },\n];\n\n/** Fib circles (TV line-tool-fib-circles factory): 11 levels, all visible. */\nexport const FIB_CIRCLE_LEVEL_DEFAULTS: LevelDef[] = [\n { coeff: 0.236, color: RED, visible: true },\n { coeff: 0.382, color: ORANGE, visible: true },\n { coeff: 0.5, color: MINTY, visible: true },\n { coeff: 0.618, color: GREEN, visible: true },\n { coeff: 0.786, color: SKY, visible: true },\n { coeff: 1, color: GRAY, visible: true },\n { coeff: 1.618, color: BLUE, visible: true },\n { coeff: 2.618, color: PINK, visible: true },\n { coeff: 3.618, color: BLUE, visible: true },\n { coeff: 4.236, color: PINK, visible: true },\n { coeff: 4.618, color: RED, visible: true },\n];\n\n/** Gann box (TV gannbox factory): hlevel1..7 and vlevel1..7 are the same\n * ladder, all visible; one list drives both axes here. */\nexport const GANN_BOX_LEVEL_DEFAULTS: LevelDef[] = [\n { coeff: 0, color: GRAY, visible: true },\n { coeff: 0.25, color: ORANGE, visible: true },\n { coeff: 0.382, color: SKY, visible: true },\n { coeff: 0.5, color: GREEN, visible: true },\n { coeff: 0.618, color: MINTY, visible: true },\n { coeff: 0.75, color: BLUE, visible: true },\n { coeff: 1, color: GRAY, visible: true },\n];\n\n/** Elliott wave degrees (TV LineToolElliottDegree, value = index; English\n * titles from the TV translations) and the factory degree (Intermediate). */\nexport const ELLIOTT_DEGREE_NAMES = [\n \"Supermillennium\", \"Millennium\", \"Submillennium\", \"Grand supercycle\", \"Supercycle\",\n \"Cycle\", \"Primary\", \"Intermediate\", \"Minor\", \"Minute\", \"Minuette\", \"Subminuette\",\n \"Micro\", \"Submicro\", \"Minuscule\",\n] as const;\nexport const ELLIOTT_DEFAULT_DEGREE = 7;\nexport const ELLIOTT_KINDS = new Set<string>([\"elliott-impulse\", \"elliott-correction\", \"elliott-triangle\", \"elliott-double-combo\", \"elliott-triple-combo\"]);\n\n/** Ghost feed candle style (TV factory: minty-green-100 / ripe-red-200\n * bodies, minty-green-500 / ripe-red-500 borders, cold-gray-500 wick). */\nexport const GHOST_CANDLE_DEFAULTS: GhostCandleStyle = {\n upColor: \"#ACE5DC\",\n downColor: \"#FAA1A4\",\n drawBorder: true,\n borderUpColor: \"#089981\",\n borderDownColor: \"#F23645\",\n drawWick: true,\n wickColor: \"#808080\",\n};\n\n/** Regression trend line styles (TV linreg study factory: upLine / downLine\n * rgba(41,98,255,0.3) 2px solid, baseLine rgba(242,54,69,0.3) 1px dashed;\n * TV draws the lines opaque and the fills at the style transparency). */\nexport const REGRESSION_LINE_DEFAULTS: { base: RegressionLine; up: RegressionLine; down: RegressionLine } = {\n base: { visible: true, color: RED, width: 1, style: \"dashed\" },\n up: { visible: true, color: BLUE, width: 2, style: \"solid\" },\n down: { visible: true, color: BLUE, width: 2, style: \"solid\" },\n};\n\n/** Parallel channel (TV line-tool-parallel-channel v2): 7 levels, coeff =\n * share of the p0 -> p2 offset; 0 / 0.5 / 1 visible, 0 and 1 solid 2px,\n * 0.5 dashed 1px, all tv-blue-500. */\nexport const PARALLEL_CHANNEL_LEVEL_DEFAULTS: LevelDef[] = [-0.25, 0, 0.25, 0.5, 0.75, 1, 1.25].map((coeff, i) => ({\n coeff,\n color: BLUE,\n visible: i === 1 || i === 3 || i === 5,\n width: i === 1 || i === 5 ? 2 : 1,\n style: i === 3 ? \"dashed\" : \"solid\",\n}));\n\n/** Pitchfan: the pitchfork ladder, except the visible 0.5 ray is cyan. */\nexport const PITCHFAN_LEVEL_DEFAULTS: LevelDef[] = PITCHFORK_LEVEL_DEFAULTS.map((l) =>\n l.coeff === 0.5 ? { ...l, color: SKY } : l,\n);\n\nexport type PreviewKind = \"none\" | \"line\" | \"rect\";\n\nexport type OverlaySpec = {\n kind: DrawingKind;\n /** Clicks needed to place the drawing. 1–3 for the geometric kinds; 4 for\n * double-curve; 3–7 for the pattern/Elliott polylines. */\n pointCount: number;\n /** Rubber-band shown while placing. 1-point and 3-point kinds use\n * \"none\"; trend-line / arrow use \"line\"; all bbox kinds use \"rect\". */\n preview: PreviewKind;\n /** Bbox-style 4-handle remap on drag (otherwise per-point drag). */\n isBbox: boolean;\n /** Freehand tools (path/polyline/brush/highlighter): clicks keep appending\n * vertices and the user double-clicks to finalize, rather than auto-\n * finalizing once `pointCount` points are placed. `pointCount` is the\n * minimum needed to commit. */\n variableLength?: boolean;\n /** Freehand tools (brush/highlighter): the path is drawn while the mouse\n * button is held — sampled from pointer-move and committed on button-up —\n * rather than placed point-by-point. (TV's `isLineDrawnWithPressedButton`;\n * source of truth: tradingview-agent docs/drawing_placement.md §1.) */\n freehand?: boolean;\n /** Text-family kinds: opens the inline text editor on placement and on\n * double-click, writing the typed string to the drawing's `text` field. */\n textEditable?: boolean;\n hotkey?: string;\n /** Per-tool style overrides on top of DEFAULT_STYLE, applied at creation and\n * in the placement preview (see `defaultStyleFor`). Mirrors the mock's\n * per-spec `defaults`. Values sourced from the TradingView factory defaults\n * captured in tradingview-agent (docs/drawing_tools.md). Tools without an\n * entry use DEFAULT_STYLE unchanged. */\n defaults?: Partial<DrawingStyle>;\n};\n\nexport const OVERLAY_SPECS: Record<DrawingKind, OverlaySpec> = {\n // 1-point\n \"horizontal-line\": { kind: \"horizontal-line\", pointCount: 1, preview: \"none\", isBbox: false, hotkey: \"Alt + H\", defaults: { width: 2, textColor: \"#2962ff\", showPriceLabels: true } },\n \"horizontal-ray\": { kind: \"horizontal-ray\", pointCount: 1, preview: \"none\", isBbox: false, hotkey: \"Alt + J\", defaults: { width: 2, showPriceLabels: true } },\n \"vertical-line\": { kind: \"vertical-line\", pointCount: 1, preview: \"none\", isBbox: false, hotkey: \"Alt + V\", defaults: { width: 2, textColor: \"#2962ff\", showTime: true } },\n \"cross-line\": { kind: \"cross-line\", pointCount: 1, preview: \"none\", isBbox: false, hotkey: \"Alt + C\", defaults: { width: 2, textColor: \"#ffffff\", showPriceLabels: true, showTime: true } },\n // TV factory (line-tool-arrow-marker): tv-blue-600 body + text, 16px bold.\n \"arrow-marker\": { kind: \"arrow-marker\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { color: \"#1e53e5\", width: 2, textColor: \"#1e53e5\", fontSize: 16, bold: true } },\n // TV arrow marks: arrowColor = text colour, font 14 (minty-green-500 up,\n // ripe-red-600 down).\n \"arrow-mark-up\": { kind: \"arrow-mark-up\", pointCount: 1, preview: \"none\", isBbox: false, defaults: { color: \"#089981\", fontSize: 14 } },\n \"arrow-mark-down\": { kind: \"arrow-mark-down\", pointCount: 1, preview: \"none\", isBbox: false, defaults: { color: \"#cc2f3c\", fontSize: 14 } },\n // TV price label factory: bold 14px white on tv-blue-500, border\n // tv-blue-500, transparency 0.\n \"price-label\": { kind: \"price-label\", pointCount: 1, preview: \"none\", isBbox: false, defaults: { color: BLUE, textColor: \"#ffffff\", fontSize: 14, backgroundColor: BLUE, borderColor: BLUE, transparency: 0 } },\n // flag marker (single anchor; the flag flies above the point)\n \"flag-mark\": { kind: \"flag-mark\", pointCount: 1, preview: \"none\", isBbox: false, defaults: { color: \"#2962ff\" } },\n // 2-point\n \"trend-line\": { kind: \"trend-line\", pointCount: 2, preview: \"line\", isBbox: false, hotkey: \"Alt + T\", defaults: { width: 2, textColor: \"#2962ff\", fontSize: 14, horzLabelsAlign: \"center\", vertLabelsAlign: \"bottom\" } },\n ray: { kind: \"ray\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { width: 2, textColor: \"#2962ff\", fontSize: 14, horzLabelsAlign: \"center\", vertLabelsAlign: \"bottom\", extendRight: true } },\n \"extended-line\": { kind: \"extended-line\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { width: 2, textColor: \"#2962ff\", fontSize: 14, horzLabelsAlign: \"center\", vertLabelsAlign: \"bottom\", extendLeft: true, extendRight: true } },\n \"info-line\": {\n kind: \"info-line\", pointCount: 2, preview: \"line\", isBbox: false,\n // Info line's identity: the stats badge with every granular row on.\n defaults: {\n width: 2, textColor: \"#2962ff\", fontSize: 14, horzLabelsAlign: \"center\", vertLabelsAlign: \"bottom\",\n showStats: true,\n showPriceRange: true, showPercentPriceRange: true, showPipsPriceRange: true,\n showBarsRange: true, showDateTimeRange: true, showDistance: true, showAngle: true,\n },\n },\n \"trend-angle\": {\n kind: \"trend-angle\", pointCount: 2, preview: \"line\", isBbox: false,\n defaults: { width: 2, fontSize: 12 },\n },\n // TV risk / reward factory style: lines #808080 1px, text white 12px,\n // stop #F23645 / target #089981 at 80 transparency, price labels on.\n \"long-position\": { kind: \"long-position\", pointCount: 1, preview: \"none\", isBbox: false, defaults: { color: GRAY, width: 1, textColor: \"#ffffff\", fontSize: 12, stopColor: \"#f23645\", stopTransparency: 80, targetColor: \"#089981\", targetTransparency: 80, showPriceLabels: true, accountSize: 1000, riskPercent: 25, lotSize: 1, riskDisplayMode: \"percents\", leverage: 10000, qtyPrecision: \"default\" } },\n \"short-position\": { kind: \"short-position\", pointCount: 1, preview: \"none\", isBbox: false, defaults: { color: GRAY, width: 1, textColor: \"#ffffff\", fontSize: 12, stopColor: \"#f23645\", stopTransparency: 80, targetColor: \"#089981\", targetTransparency: 80, showPriceLabels: true, accountSize: 1000, riskPercent: 25, lotSize: 1, riskDisplayMode: \"percents\", leverage: 10000, qtyPrecision: \"default\" } },\n \"gann-fan\": { kind: \"gann-fan\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { width: 2, levels: GANN_FAN_LEVEL_DEFAULTS, fillBackground: true, transparency: 80 } },\n // TV factory (line-tool-gann-box): price and time levels alike, all four\n // label sides on, both backgrounds on at 80, angles off (#9C9C9C).\n \"gann-box\": { kind: \"gann-box\", pointCount: 2, preview: \"rect\", isBbox: true, defaults: { color: \"rgba(21, 56, 153, 0.8)\", width: 2, lineStyle: \"solid\", levels: GANN_BOX_LEVEL_DEFAULTS, vLevels: GANN_BOX_LEVEL_DEFAULTS, showLeftLabels: true, showRightLabels: true, showTopLabels: true, showBottomLabels: true, fillBackground: true, transparency: 80, fillVertBackground: true, vertTransparency: 80, fans: { visible: false, color: \"#9C9C9C\" }, reverse: false } },\n // TV factory: fills default OFF (unlike the retracement family).\n // TV fib time zone labels: on, right / bottom.\n \"fib-time-zone\": { kind: \"fib-time-zone\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { width: 2, levels: FIB_TIMEZONE_LEVEL_DEFAULTS, fillBackground: false, transparency: 80, showLabels: true, horzLabelsAlign: \"right\", vertLabelsAlign: \"bottom\" } },\n \"fib-circles\": { kind: \"fib-circles\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { color: GRAY, width: 2, levels: FIB_CIRCLE_LEVEL_DEFAULTS, fillBackground: true, transparency: 80 } },\n \"fib-speed-resistance-fan\": { kind: \"fib-speed-resistance-fan\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { width: 2, levels: SPEED_FAN_LEVEL_DEFAULTS, vLevels: SPEED_FAN_LEVEL_DEFAULTS, fillBackground: true, transparency: 80, showLeftLabels: true, showRightLabels: true, showTopLabels: true, showBottomLabels: true, reverse: false, fanGrid: SPEED_FAN_GRID_DEFAULT } },\n \"fib-speed-resistance-arcs\": { kind: \"fib-speed-resistance-arcs\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { width: 2, levels: SPEED_ARC_LEVEL_DEFAULTS, fillBackground: true, transparency: 80 } },\n // TV factory (line-tool-fib-spiral): sky-blue, 2px.\n \"fib-spiral\": { kind: \"fib-spiral\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { color: SKY, width: 2 } },\n // TV trend-based fib time (3 clicks), Gann square fixed / Gann square (2\n // clicks), Sector = TV projection (3 clicks, wedge model, one level).\n \"trend-based-fib-time\": { kind: \"trend-based-fib-time\", pointCount: 3, preview: \"line\", isBbox: false, defaults: { width: 2, levels: TREND_FIB_TIME_LEVEL_DEFAULTS, fibTrendLine: TREND_FIB_TIME_TREND_DEFAULT, fillBackground: true, transparency: 80, showLabels: true, horzLabelsAlign: \"right\", vertLabelsAlign: \"bottom\" } },\n \"gann-square-fixed\": { kind: \"gann-square-fixed\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { width: 2, gannLevels: GANN_LEVEL_DEFAULTS, gannFans: GANN_FAN_DEFAULTS, gannArcs: GANN_ARC_DEFAULTS, fillBackground: true, transparency: 80, reverse: false } },\n \"gann-square\": { kind: \"gann-square\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { width: 2, gannLevels: GANN_LEVEL_DEFAULTS, gannFans: GANN_FAN_DEFAULTS, gannArcs: GANN_ARC_DEFAULTS, fillBackground: true, transparency: 80, reverse: false, showLabels: true, labelFontSize: 12 } },\n sector: { kind: \"sector\", pointCount: 3, preview: \"line\", isBbox: false, defaults: { color: \"#9c9c9c\", width: 2, fillBackground: true, transparency: 80, sectorColor1: BLUE, sectorColor2: PURPLE } },\n \"fib-wedge\": { kind: \"fib-wedge\", pointCount: 3, preview: \"line\", isBbox: false, defaults: { width: 2, levels: FIB_WEDGE_LEVEL_DEFAULTS, fillBackground: true, transparency: 80 } },\n pitchfan: { kind: \"pitchfan\", pointCount: 3, preview: \"line\", isBbox: false, defaults: { color: \"#f23645\", width: 2, levels: PITCHFAN_LEVEL_DEFAULTS, fillBackground: true, transparency: 80 } },\n // TV factories: cyclic #80ccdb 2px; sine #159980 1px; time-cycles #159980\n // with the iguana-green fill on by default.\n \"cyclic-lines\": { kind: \"cyclic-lines\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { color: \"#80ccdb\", width: 2 } },\n \"sine-line\": { kind: \"sine-line\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { color: \"#159980\", width: 2 } },\n \"time-cycles\": { kind: \"time-cycles\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { color: \"#159980\", width: 2, fillBackground: true, backgroundColor: \"#6aa84f\", transparency: 50 } },\n \"fib-retracement\": { kind: \"fib-retracement\", pointCount: 2, preview: \"line\", isBbox: false, hotkey: \"Alt + F\", defaults: { width: 2, levels: FIB_LEVEL_DEFAULTS, fillBackground: true, transparency: 80 } },\n // TV arrow factory text: #2962FF, 14px, centre / bottom.\n // TV LineToolArrow: the trend line with rightEnd = Arrow.\n arrow: { kind: \"arrow\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { width: 2, textColor: BLUE, fontSize: 14, horzLabelsAlign: \"center\", vertLabelsAlign: \"bottom\", leftEnd: 0, rightEnd: 1 } },\n rectangle: { kind: \"rectangle\", pointCount: 2, preview: \"rect\", isBbox: true, hotkey: \"Alt + Shift + R\", defaults: { color: \"#9c27b0\", width: 2, fillBackground: true, backgroundColor: \"#9c27b0\", transparency: 50, rectMiddleLine: { visible: false, color: \"#9c27b0\", width: 1, style: \"dashed\" } } },\n // TV model: p0 = center, p1 = radius point (radius = their SCREEN distance).\n circle: { kind: \"circle\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { width: 2, color: \"#ff9800\", fillBackground: true, backgroundColor: \"#ff9800\", transparency: 80 } },\n ellipse: { kind: \"ellipse\", pointCount: 3, preview: \"line\", isBbox: false, defaults: { width: 2, color: \"#f23645\", fillBackground: true, backgroundColor: \"#f23645\", transparency: 50 } },\n \"price-range\": { kind: \"price-range\", pointCount: 2, preview: \"rect\", isBbox: false, defaults: { width: 2, color: BLUE, fillBackground: true, backgroundColor: BLUE, transparency: 85, textColor: \"#ffffff\", fontSize: 12 , customTextColor: BLUE, customTextSize: 12 } },\n \"date-range\": { kind: \"date-range\", pointCount: 2, preview: \"rect\", isBbox: false, defaults: { width: 2, color: BLUE, fillBackground: true, backgroundColor: BLUE, transparency: 85, textColor: \"#ffffff\", fontSize: 12 , customTextColor: BLUE, customTextSize: 12 } },\n \"date-and-price-range\": { kind: \"date-and-price-range\", pointCount: 2, preview: \"rect\", isBbox: false, defaults: { width: 2, color: BLUE, fillBackground: true, backgroundColor: BLUE, transparency: 85, textColor: \"#ffffff\", fontSize: 12 , customTextColor: BLUE, customTextSize: 12 } },\n // forecast: p0 = entry, p1 = target (vector + success/failure zones)\n // TV factory (line-tool-prediction): tv-blue-500 line and balloons, white\n // texts, iguana-green / ripe-red status banners, transparency 10.\n \"position-forecast\": { kind: \"position-forecast\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { width: 2, color: \"#2962FF\", transparency: 10, sourceTextColor: \"#ffffff\", sourceBackColor: \"#2962FF\", sourceStrokeColor: \"#2962FF\", targetTextColor: \"#ffffff\", targetBackColor: \"#2962FF\", targetStrokeColor: \"#2962FF\", successTextColor: \"#ffffff\", successBackground: \"#4caf50\", failureTextColor: \"#ffffff\", failureBackground: \"#F23645\" } },\n // data-driven bbox kinds (sampled / synthesised candles inside the box)\n \"bar-pattern\": { kind: \"bar-pattern\", pointCount: 2, preview: \"rect\", isBbox: true },\n // TV factory (line-tool-ghost-feed): variance 50. Variable-length (TV\n // pointsCount −1): every click after the first adds another drift segment;\n // finished like the polylines (re-click the last vertex / double-click).\n \"ghost-feed\": { kind: \"ghost-feed\", pointCount: 2, preview: \"line\", isBbox: false, variableLength: true, defaults: { variance: 50, transparency: 50 } },\n // 3-point\n triangle: { kind: \"triangle\", pointCount: 3, preview: \"none\", isBbox: false, defaults: { width: 2, color: \"#089981\", fillBackground: true, backgroundColor: \"#089981\", transparency: 80 } },\n // TV label factory: labelTextColor tv-blue-500, 14px, left, bottom.\n \"parallel-channel\": { kind: \"parallel-channel\", pointCount: 3, preview: \"line\", isBbox: false, defaults: { width: 2, levels: PARALLEL_CHANNEL_LEVEL_DEFAULTS, fillBackground: true, transparency: 80, textColor: BLUE, fontSize: 14, horzLabelsAlign: \"left\", vertLabelsAlign: \"bottom\" } },\n pitchfork: { kind: \"pitchfork\", pointCount: 3, preview: \"line\", isBbox: false, defaults: { color: \"#f23645\", width: 2, levels: PITCHFORK_LEVEL_DEFAULTS, fillBackground: true, transparency: 80 } },\n \"trend-based-fib-extension\": { kind: \"trend-based-fib-extension\", pointCount: 3, preview: \"line\", isBbox: false, defaults: { width: 2, levels: FIB_LEVEL_DEFAULTS, fillBackground: true, transparency: 80 } },\n // TV label factory: labelTextColor = the line colour, 14px, left, bottom.\n // TV factory: fill in the line colour at 0.2, prices off (12px, line\n // colour), no line ends, no extend.\n \"disjoint-channel\": { kind: \"disjoint-channel\", pointCount: 3, preview: \"line\", isBbox: false, defaults: { color: \"#089981\", width: 2, fillBackground: true, backgroundColor: \"#089981\", transparency: 80, textColor: \"#089981\", fontSize: 14, horzLabelsAlign: \"left\", vertLabelsAlign: \"bottom\", showPrices: false, priceLabelTextColor: \"#089981\", priceLabelFontSize: 12, leftEnd: 0, rightEnd: 0 } },\n \"flat-top-bottom\": { kind: \"flat-top-bottom\", pointCount: 3, preview: \"line\", isBbox: false, defaults: { color: \"#ff9800\", width: 2, fillBackground: true, backgroundColor: \"#ff9800\", transparency: 80, textColor: \"#ff9800\", fontSize: 14, horzLabelsAlign: \"left\", vertLabelsAlign: \"bottom\", showPrices: false, priceLabelTextColor: \"#ff9800\", priceLabelFontSize: 12, leftEnd: 0, rightEnd: 0 } },\n \"schiff-pitchfork\": { kind: \"schiff-pitchfork\", pointCount: 3, preview: \"line\", isBbox: false, defaults: { color: \"#f23645\", width: 2, levels: PITCHFORK_LEVEL_DEFAULTS, fillBackground: true, transparency: 80 } },\n \"modified-schiff-pitchfork\": { kind: \"modified-schiff-pitchfork\", pointCount: 3, preview: \"line\", isBbox: false, defaults: { color: \"#f23645\", width: 2, levels: PITCHFORK_LEVEL_DEFAULTS, fillBackground: true, transparency: 80 } },\n \"inside-pitchfork\": { kind: \"inside-pitchfork\", pointCount: 3, preview: \"line\", isBbox: false, defaults: { color: \"#f23645\", width: 2, levels: PITCHFORK_LEVEL_DEFAULTS, fillBackground: true, transparency: 80 } },\n \"fib-channel\": { kind: \"fib-channel\", pointCount: 3, preview: \"line\", isBbox: false, defaults: { width: 2, levels: FIB_LEVEL_DEFAULTS, fillBackground: true, transparency: 80, showPrices: true, showCoeffs: true, fibLevelsAsPercents: false, labelFontSize: 12, horzLabelsAlign: \"left\", vertLabelsAlign: \"middle\" } },\n \"rotated-rectangle\": { kind: \"rotated-rectangle\", pointCount: 3, preview: \"line\", isBbox: false, defaults: { color: \"#4caf50\", width: 2, fillBackground: true, backgroundColor: \"#4caf50\", transparency: 50 } },\n // TV bezier factory: fill off by default, tv-blue back @ 50.\n curve: { kind: \"curve\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { width: 2, fillBackground: false, backgroundColor: \"#2962ff\", transparency: 50 } },\n // TV model: p0/p1 = chord ends, p2 = bulge; a 60° circular cap scaled to the\n // bulge height, filled to the chord (berry-pink alpha20 factory defaults).\n arc: { kind: \"arc\", pointCount: 3, preview: \"line\", isBbox: false, defaults: { width: 2, color: \"#e91e63\", fillBackground: true, backgroundColor: \"#e91e63\", transparency: 80 } },\n // 4-point\n \"double-curve\": { kind: \"double-curve\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { color: DEEP_PURPLE, width: 2, fillBackground: false, backgroundColor: DEEP_PURPLE, transparency: 80 } },\n // N-point pattern / Elliott family (labeled polylines/polygons).\n // TV factories: abcd minty-green + white labels (line-tool-abcd); xabcd/\n // cypher tv-blue line + background @ transparency 85, white labels\n // (line-tool-5points-patterns `nonThemedFactoryDefaults`).\n \"abcd-pattern\": { kind: \"abcd-pattern\", pointCount: 4, preview: \"line\", isBbox: false, defaults: { color: MINTY, width: 2, textColor: \"#ffffff\", fontSize: 12 } },\n \"xabcd-pattern\": { kind: \"xabcd-pattern\", pointCount: 5, preview: \"line\", isBbox: false, defaults: { color: BLUE, width: 2, textColor: \"#ffffff\", backgroundColor: BLUE, fillBackground: true, transparency: 85, fontSize: 12 } },\n \"cypher-pattern\": { kind: \"cypher-pattern\", pointCount: 5, preview: \"line\", isBbox: false, defaults: { color: BLUE, width: 2, textColor: \"#ffffff\", backgroundColor: BLUE, fillBackground: true, transparency: 85, fontSize: 12 } },\n \"head-and-shoulders\": { kind: \"head-and-shoulders\", pointCount: 7, preview: \"line\", isBbox: false, defaults: { color: MINTY, width: 2, textColor: \"#ffffff\", fontSize: 12, fillBackground: true, backgroundColor: MINTY, transparency: 85 } },\n \"triangle-pattern\": { kind: \"triangle-pattern\", pointCount: 4, preview: \"line\", isBbox: false, defaults: { color: DEEP_PURPLE, width: 2, textColor: \"#ffffff\", fontSize: 12, fillBackground: true, backgroundColor: DEEP_PURPLE, transparency: 85 } },\n \"three-drives-pattern\": { kind: \"three-drives-pattern\", pointCount: 7, preview: \"line\", isBbox: false, defaults: { color: DEEP_PURPLE, width: 2, textColor: \"#ffffff\", fontSize: 12 } },\n \"elliott-impulse\": { kind: \"elliott-impulse\", pointCount: 6, preview: \"line\", isBbox: false, defaults: { color: \"#3d85c6\", width: 2 } },\n \"elliott-correction\": { kind: \"elliott-correction\", pointCount: 4, preview: \"line\", isBbox: false, defaults: { color: \"#3d85c6\", width: 2 } },\n \"elliott-triangle\": { kind: \"elliott-triangle\", pointCount: 6, preview: \"line\", isBbox: false, defaults: { color: ORANGE, width: 2 } },\n \"elliott-double-combo\": { kind: \"elliott-double-combo\", pointCount: 4, preview: \"line\", isBbox: false, defaults: { color: \"#6aa84f\", width: 2 } },\n \"elliott-triple-combo\": { kind: \"elliott-triple-combo\", pointCount: 6, preview: \"line\", isBbox: false, defaults: { color: \"#6aa84f\", width: 2 } },\n // freehand polylines (variable-length, double-click to finalize; pointCount = minimum)\n polyline: { kind: \"polyline\", pointCount: 2, preview: \"line\", isBbox: false, variableLength: true, defaults: { color: SKY, width: 2, fillBackground: true, transparency: 80 } },\n // TV path factory: lineWidth 2, leftEnd Normal, rightEnd Arrow.\n path: { kind: \"path\", pointCount: 2, preview: \"line\", isBbox: false, variableLength: true, defaults: { width: 2, leftEnd: 0, rightEnd: 1 } },\n // freehand brushes (drawn with the button held; sampled from pointer-move)\n // TV brush factory: no fill (backgroundColor rgba(0, 188, 212, 0.2) =\n // cyan at transparency 80), no line ends.\n brush: { kind: \"brush\", pointCount: 2, preview: \"line\", isBbox: false, freehand: true, defaults: { color: SKY, width: 2, fillBackground: false, backgroundColor: SKY, transparency: 80, leftEnd: 0, rightEnd: 0 } },\n highlighter: { kind: \"highlighter\", pointCount: 2, preview: \"line\", isBbox: false, freehand: true, defaults: { color: \"#f23645\", width: 20 } },\n // text annotations (inline editor on placement / double-click)\n // TV text factory: tv-blue-500 14px, no background (rgba(41,98,255,0.25)),\n // no border (#707070), no wrap (200px).\n text: { kind: \"text\", pointCount: 1, preview: \"none\", isBbox: false, textEditable: true, defaults: { color: BLUE, fontSize: 14, fillBackground: false, backgroundColor: BLUE, transparency: 75, drawBorder: false, borderColor: \"#707070\", wordWrap: false, wordWrapWidth: 200 } },\n // TV Note (LineToolTextNote): anchor + text label, leader line #DBDBDB,\n // label #DBDBDB on #2E2E2E.\n note: { kind: \"note\", pointCount: 2, preview: \"line\", isBbox: false, textEditable: true, defaults: { color: \"#dbdbdb\", textColor: \"#dbdbdb\", backgroundColor: \"#2e2e2e\", fillBackground: true, fontSize: 14 } },\n // TV Pin (LineToolNote): the map pin (marker #2962FF) with a text card.\n pin: { kind: \"pin\", pointCount: 1, preview: \"none\", isBbox: false, textEditable: true, defaults: { color: \"#2962ff\", textColor: \"#dbdbdb\", fontSize: 14, fillBackground: true, backgroundColor: \"#2e2e2e\", transparency: 0, drawBorder: false, borderColor: \"#4a4a4a\" } },\n // TV comment factory: white 16px text on a tv-blue-500 balloon, border\n // tv-blue-500 (2px), transparency 0.\n comment: { kind: \"comment\", pointCount: 1, preview: \"none\", isBbox: false, textEditable: true, defaults: { color: BLUE, textColor: \"#ffffff\", fontSize: 16, backgroundColor: BLUE, borderColor: BLUE, transparency: 0 } },\n // TV price note text factory: tv-blue-500, 14px, centre / bottom (the\n // dialog's \"Top\": box above the line).\n \"price-note\": { kind: \"price-note\", pointCount: 2, preview: \"line\", isBbox: false, textEditable: true, defaults: { color: BLUE, textColor: BLUE, fontSize: 14, horzLabelsAlign: \"center\", vertLabelsAlign: \"bottom\", priceLabelTextColor: \"#ffffff\", priceLabelFontSize: 12, priceLabelBackgroundColor: BLUE, priceLabelBorderColor: BLUE } },\n // TV signpost factory: 12px label, no emoji pin (plate tv-blue-500),\n // label halfway between the bar and the pane edge (position 50).\n signpost: { kind: \"signpost\", pointCount: 1, preview: \"none\", isBbox: false, textEditable: true, defaults: { fontSize: 12, showImage: false, plateColor: BLUE, signpostPosition: 50 } },\n // TV callout factory: sky-blue-700 border (2px) and background at\n // transparency 50, white 14px text, no wrap (200px).\n callout: { kind: \"callout\", pointCount: 2, preview: \"line\", isBbox: false, textEditable: true, defaults: { color: \"#0097a7\", width: 2, textColor: \"#ffffff\", fontSize: 14, backgroundColor: \"#0097a7\", transparency: 50, wordWrap: false, wordWrapWidth: 200 } },\n // font-icon (emoji / sticker / icon glyph placed at one point)\n // TV icon factory: size 72, colour tv-blue-500 (font icons; emoji keep\n // their own colours).\n \"font-icon\": { kind: \"font-icon\", pointCount: 1, preview: \"none\", isBbox: false, defaults: { fontSize: 72, color: BLUE } },\n // TV Table (line-tool-table, dark theme factory): 3 x 3 empty cells, columns\n // 120px, rows auto; background cold-gray-900 #0F0F0F, border cold-gray-650\n // #575757 (the toolbar line colour), text cold-gray-200 #DBDBDB 14px, left.\n table: { kind: \"table\", pointCount: 1, preview: \"none\", isBbox: false, defaults: { color: \"#575757\", backgroundColor: \"#0f0f0f\", textColor: \"#dbdbdb\", fontSize: 14, horzLabelsAlign: \"left\" } },\n // TV Image (line-tool-image): transparency 0; the file comes from the\n // Image dialog opened when the tool is armed.\n image: { kind: \"image\", pointCount: 1, preview: \"none\", isBbox: false, defaults: { transparency: 0 } },\n // data-driven (computed over the chart's bars in the selected range).\n // Regression trend (line-tool-regression-trend): base ± dev·σ study with\n // \"Upper/Lower Deviation\" inputs (+2/−2), channel fills, an \"Extend Lines\"\n // toggle (right only) and the Pearson's R label (styles.showPearsons).\n // TV factory styles: up / down lines #2962FF 2px solid, base line #F23645\n // 1px dashed, fills at transparency 70.\n \"regression-trend\": { kind: \"regression-trend\", pointCount: 2, preview: \"line\", isBbox: false, defaults: { upperDeviation: 2, lowerDeviation: -2, useUpperDeviation: true, useLowerDeviation: true, regressionSource: \"close\", showPearsons: true, fillBackground: true, transparency: 70, regressionLines: REGRESSION_LINE_DEFAULTS } },\n // fillBackground defined (off) so the Settings Background checkbox shows —\n // the renderer's band-interior fill gates on it.\n // TV anchoredvwap factory: VWAP #1e88e5 1px; areaBackground #4caf50 at\n // transparency 95 between UpperBand / LowerBand (band #1), on.\n \"anchored-vwap\": { kind: \"anchored-vwap\", pointCount: 1, preview: \"none\", isBbox: false, defaults: { color: \"#1e88e5\", width: 1, vwapSource: \"hlc3\", levels: VWAP_BAND_DEFAULTS, fillBackground: true, backgroundColor: \"#4caf50\", transparency: 95 } },\n \"fixed-range-volume-profile\": { kind: \"fixed-range-volume-profile\", pointCount: 2, preview: \"rect\", isBbox: true },\n \"anchored-volume-profile\": { kind: \"anchored-volume-profile\", pointCount: 1, preview: \"none\", isBbox: false },\n};\n\nconst OVERLAY_KIND_IDS = new Set<string>(Object.keys(OVERLAY_SPECS));\n\nexport function findOverlaySpec(toolId: string | null): OverlaySpec | undefined {\n if (toolId && OVERLAY_KIND_IDS.has(toolId)) {\n return OVERLAY_SPECS[toolId as DrawingKind];\n }\n return undefined;\n}\n\n/** Resolve a fresh drawing's style: DEFAULT_STYLE merged with the kind's\n * per-tool overrides. Used both when committing a new drawing and when\n * rendering the live placement preview, so the in-progress draw looks exactly\n * like the finished one (TV behaviour). */\nexport function defaultStyleFor(kind: DrawingKind): DrawingStyle {\n // Factory base + per-spec defaults, then any user-saved \"Save as default\"\n // override for this kind (so new drawings + Apply-default honour it).\n const style = { ...DEFAULT_STYLE, ...OVERLAY_SPECS[kind].defaults, ...defaultStyleOverride(kind) };\n // Deep-copy the level ladder so two drawings never share one array (level\n // edits in the settings dialog replace the array immutably, but a shared\n // reference would still leak factory-set edits across drawings).\n if (style.levels) style.levels = style.levels.map((l) => ({ ...l }));\n return style;\n}\n\n/** Factory style of a tool: base + per-spec defaults, WITHOUT the user's\n * saved default (TV restoreFactoryDefaults / \"Apply defaults\"). */\nexport function factoryStyleFor(kind: DrawingKind): DrawingStyle {\n const style = { ...DEFAULT_STYLE, ...OVERLAY_SPECS[kind].defaults };\n if (style.levels) style.levels = style.levels.map((l) => ({ ...l }));\n return style;\n}\n\n/** Host hook: the user's saved default style of a tool (OpenTrader: its\n * saved \"Save as default\" templates), merged over the factory defaults by\n * `defaultStyleFor`. */\nlet defaultStyleOverride: (kind: string) => DrawingStyle | undefined = () => undefined;\nexport function setDefaultStyleOverride(fn: (kind: string) => DrawingStyle | undefined): void {\n defaultStyleOverride = fn;\n}\n","/*\n * Shared geometry + formatting helpers used by every per-kind hit-test\n * module and by DrawingsOverlay's render switch. No JSX, no Solid — pure\n * functions so the overlay (which holds the SVG JSX) can mix-and-match.\n */\nimport type { Time } from \"lightweight-charts\";\nimport type { DrawingStyle } from \"./types\";\n\nexport type Pt = { x: number; y: number };\n\n/** Anchor radius in px — TV `RegularAnchorRadius` (lt-pane-views). */\nexport const HANDLE_RADIUS = 6;\n/** Slop added to every hit-test so thin strokes are still grabbable. */\nexport const HIT_TOLERANCE = 6;\n/** Half-extent of the bbox around a 1-point glyph (arrow-mark-up / -down,\n * price-label) used both for rendered size and hit-testing. */\nexport const GLYPH_HALF = 9;\n\nexport type HitResult =\n | { hit: \"handle\"; handleIndex: number }\n | { hit: \"body\"; cell?: [number, number] };\n\n/** Translate a line-style enum into an SVG stroke-dasharray. */\nexport function dashFor(style: DrawingStyle): string | undefined {\n if (style.lineStyle === \"dashed\") return \"6 4\";\n if (style.lineStyle === \"dotted\") return \"2 3\";\n return undefined;\n}\n\n/** Stroke hit slop scaled with the drawing's line width, so a fat stroke is\n * grabbable across its whole painted body (TV: tolerance + linewidth / 2). */\nexport function strokeTolerance(style: DrawingStyle | undefined): number {\n return Math.max(HIT_TOLERANCE, (style?.width ?? 1) / 2 + 2);\n}\n\n/** Resolve a shape's interior fill from the TV-faithful params\n * (`fillBackground` / `backgroundColor` / `transparency`), falling back to the\n * legacy stroke-colour @ 0.08 so shapes with no fill params render as before.\n * Returns SVG `fill` + `fillOpacity`. */\nexport function fillStyle(style: DrawingStyle): { fill: string; fillOpacity: number } {\n if (style.fillBackground === false) return { fill: \"none\", fillOpacity: 0 };\n const fill = style.backgroundColor || style.color;\n const fillOpacity =\n style.transparency != null ? Math.max(0, Math.min(1, (100 - style.transparency) / 100)) : 0.08;\n return { fill, fillOpacity };\n}\n\n/** Distance from a point to a segment, used by line-body hit-tests. */\nexport function distToSegment(px: number, py: number, a: Pt, b: Pt): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len2 = dx * dx + dy * dy;\n if (len2 === 0) return Math.hypot(px - a.x, py - a.y);\n let t = ((px - a.x) * dx + (py - a.y) * dy) / len2;\n t = Math.max(0, Math.min(1, t));\n return Math.hypot(px - (a.x + t * dx), py - (a.y + t * dy));\n}\n\n/** Ray-cast point-in-polygon, used by the triangle body hit-test. */\nexport function pointInPolygon(px: number, py: number, poly: Pt[]): boolean {\n let inside = false;\n for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n const xi = poly[i].x;\n const yi = poly[i].y;\n const xj = poly[j].x;\n const yj = poly[j].y;\n const intersect =\n yi > py !== yj > py &&\n px < ((xj - xi) * (py - yi)) / (yj - yi || 1e-9) + xi;\n if (intersect) inside = !inside;\n }\n return inside;\n}\n\n/** Four bbox corners (TL/TR/BR/BL) from two opposite-corner points. Shared\n * by every bbox kind (rectangle, circle, date-and-price-range) for both\n * rendering the visual handles and the corner-remap drag math. */\nexport function bboxCorners(a: Pt, b: Pt): [Pt, Pt, Pt, Pt] {\n const left = Math.min(a.x, b.x);\n const right = Math.max(a.x, b.x);\n const top = Math.min(a.y, b.y);\n const bottom = Math.max(a.y, b.y);\n return [\n { x: left, y: top },\n { x: right, y: top },\n { x: right, y: bottom },\n { x: left, y: bottom },\n ];\n}\n\n/** Best-effort time → seconds-since-epoch for date-range deltas. Handles the\n * three lightweight-charts `Time` representations; returns null if the\n * representation is unknown. */\nexport function timeToSec(t: Time): number | null {\n if (typeof t === \"number\") return t;\n if (typeof t === \"string\") {\n const ms = Date.parse(t);\n return Number.isFinite(ms) ? ms / 1000 : null;\n }\n if (typeof t === \"object\" && t !== null && \"year\" in t) {\n return Date.UTC(t.year, t.month - 1, t.day) / 1000;\n }\n return null;\n}\n\n/** \"+1.23 (+0.45%)\"-style label used by every price-measurement tool. */\nexport function formatPriceDelta(a: number, b: number): string {\n const d = b - a;\n const pct = a !== 0 ? (d / a) * 100 : 0;\n const sign = d >= 0 ? \"+\" : \"\";\n return `${sign}${d.toFixed(2)} (${sign}${pct.toFixed(2)}%)`;\n}\n\n/** \"3 d\" / \"2 h\" / \"12 m\" / \"30 s\"-style label for date-range tools.\n * Returns \"\" when the time representation isn't decodable. */\nexport function formatTimeDelta(a: Time, b: Time): string {\n const sa = timeToSec(a);\n const sb = timeToSec(b);\n if (sa == null || sb == null) return \"\";\n const sec = Math.abs(sb - sa);\n if (sec >= 86400) return `${(sec / 86400).toFixed(sec >= 86400 * 10 ? 0 : 1)} d`;\n if (sec >= 3600) return `${(sec / 3600).toFixed(sec >= 3600 * 10 ? 0 : 1)} h`;\n if (sec >= 60) return `${Math.round(sec / 60)} m`;\n return `${Math.round(sec)} s`;\n}\n","/*\n * Shared hit-test for 1-point glyph kinds (arrow-mark-up/-down, price-label,\n * font-icon). Each renders inside a square bbox of side 2*GLYPH_HALF\n * centered on the click point; the body is hittable anywhere inside that\n * bbox (with HIT_TOLERANCE slop). Handle = the click point itself.\n */\nimport {\n GLYPH_HALF,\n HANDLE_RADIUS,\n HIT_TOLERANCE,\n type HitResult,\n type Pt,\n} from \"../_shared\";\n\nexport function glyphHitTest(pts: Pt[], cursor: Pt): HitResult | null {\n const c = pts[0];\n if (Math.hypot(c.x - cursor.x, c.y - cursor.y) <= HANDLE_RADIUS + HIT_TOLERANCE) {\n return { hit: \"handle\", handleIndex: 0 };\n }\n if (\n Math.abs(cursor.x - c.x) <= GLYPH_HALF + HIT_TOLERANCE &&\n Math.abs(cursor.y - c.y) <= GLYPH_HALF + HIT_TOLERANCE\n ) {\n return { hit: \"body\" };\n }\n return null;\n}\n","/*\n * Rotated-rectangle geometry shared by the renderer and the hit test.\n */\nimport type { Pt } from \"./_shared\";\n\n/** Rotated rectangle corners.\n * fmt 2 (TV line-tool-rotated-rectangle): p0→p1 is the CENTRE line, the half\n * width is p2's distance to it; corners = p0/p1 ± perp·d.\n * Older entries: p0→p1 is one side and p2 sets the perpendicular offset. */\nexport function rotatedRectCorners(pts: Pt[], fmt2: boolean): Pt[] {\n const [a, b, c] = pts;\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.hypot(dx, dy) || 1;\n // TV perp = (dy, −dx) normalised.\n const nx = dy / len;\n const ny = -dx / len;\n if (fmt2) {\n const d = c ? Math.abs((c.x - a.x) * nx + (c.y - a.y) * ny) : 0;\n return [\n { x: a.x + nx * d, y: a.y + ny * d },\n { x: b.x + nx * d, y: b.y + ny * d },\n { x: b.x - nx * d, y: b.y - ny * d },\n { x: a.x - nx * d, y: a.y - ny * d },\n ];\n }\n const off = c ? (c.x - b.x) * -nx + (c.y - b.y) * -ny : 0;\n return [a, b, { x: b.x - nx * off, y: b.y - ny * off }, { x: a.x - nx * off, y: a.y - ny * off }];\n}\n","/*\n * Long / short position (TV LineToolRiskReward, line-tool-risk-reward chunk):\n * the risk model behind the Inputs tab and the stats. Pure TS, shared by the\n * overlay renderer, the hit test / drag code and the Settings dialog.\n *\n * TV RiskRewardCalculator (point value 1, no account currency conversion):\n * riskSize = percents: risk / 100 · accountSize; money: min(risk, account)\n * qty = min(riskSize / |entry − stop|, leverage · accountSize / entry)\n * shown qty = _roundQty(qty / lotSize): \"default\" = floor (stocks), else\n * rounded to the chosen decimals (\"0\" = Integer)\n * levels = ticks from the entry (TV stores ticks; OpenTrader stores the\n * price distance, ticks = distance / tick size)\n */\nimport type { Drawing, DrawingStyle, PositionStatKey } from \"../types\";\nimport type { Pt } from \"../_shared\";\nimport type { Coords } from \"../coords\";\n\n/** TV infoBlocks in the Stats list order, with their titles and factory\n * visibility (all on except TP PL / SL PL). */\nexport const POSITION_STATS: ReadonlyArray<readonly [PositionStatKey, string, boolean]> = [\n [\"tpPriceOffset\", \"TP price offset\", true],\n [\"tpPercentOffset\", \"TP percent offset\", true],\n [\"tpTickOffset\", \"TP tick offset\", true],\n [\"tpAmount\", \"TP amount\", true],\n [\"tpPL\", \"TP PL\", false],\n [\"openClosePL\", \"Open/closed PL\", true],\n [\"qty\", \"Qty\", true],\n [\"riskRewardRatio\", \"Risk/reward ratio\", true],\n [\"slPriceOffset\", \"SL price offset\", true],\n [\"slPercentOffset\", \"SL percent offset\", true],\n [\"slTickOffset\", \"SL tick offset\", true],\n [\"slAmount\", \"SL amount\", true],\n [\"slPL\", \"SL PL\", false],\n];\nexport function positionStatOn(s: DrawingStyle, k: PositionStatKey): boolean {\n const v = s.positionStats?.[k];\n return v ?? POSITION_STATS.find((x) => x[0] === k)![2];\n}\n\n/** TV number formatting in the position labels: price values with the\n * price precision and thousands commas (\"1,000.00\", minus U+2212), ticks\n * with thousands commas (\"5,108\"), amounts as plain numbers. */\nfunction fmtGrouped(v: number, digits: number): string {\n const t = Math.abs(v).toLocaleString(\"en-US\", { minimumFractionDigits: digits, maximumFractionDigits: digits });\n return v < 0 ? `\\u2212${t}` : t;\n}\n\n/** TV _createTargetLabel / _createStopLabel: offset price, percent (3\n * decimals of |entry|), ticks, amount and PL, each when its stat is on;\n * full mode \"Target: …\" / \"Stop: …\", \", Amount: …\", \", PnL: …\", compact\n * mode the bare values joined by spaces. Empty = no label. */\nexport function positionLegText(\n s: DrawingStyle,\n leg: \"tp\" | \"sl\",\n dist: number,\n entry: number,\n pip: number,\n digits: number,\n amount: number,\n pl: number,\n): string {\n const on = (k: string) => positionStatOn(s, (leg + k) as PositionStatKey);\n const compact = !!s.compactStats;\n const price = fmtGrouped(dist, digits);\n const pct = `${(entry !== 0 ? Math.round((100 * 1000 * dist) / entry) / 1000 : 0).toFixed(3)}%`;\n let t = \"\";\n if (on(\"PriceOffset\")) t += compact ? price : `${leg === \"tp\" ? \"Target\" : \"Stop\"}: ${price}`;\n if (on(\"PercentOffset\")) t += t !== \"\" ? ` (${pct})` : pct;\n if (on(\"TickOffset\")) t += (t !== \"\" ? \" \" : \"\") + fmtGrouped(Math.round(dist / pip), 0);\n if (on(\"Amount\")) t += compact ? (t !== \"\" ? \" \" : \"\") + String(amount) : (t !== \"\" ? \", \" : \"\") + `Amount: ${amount}`;\n if (on(\"PL\")) t += compact ? (t !== \"\" ? \" \" : \"\") + fmtGrouped(pl, digits) : (t !== \"\" ? \", \" : \"\") + `PnL: ${fmtGrouped(pl, digits)}`;\n return t;\n}\n\n/** TV _createMiddleLabel: open / closed P&L (signed change), qty, risk /\n * reward ratio; full \"{Open|Closed} PnL: …, Qty: …\" then \"Risk/reward\n * ratio: …\" on a new line, compact \"pnl ~ qty\" then the ratio. */\nexport function positionMiddleText(s: DrawingStyle, pnl: string | null, closed: boolean, qty: number, ratio: number): string {\n const compact = !!s.compactStats;\n let t = \"\";\n if (positionStatOn(s, \"openClosePL\") && pnl) t += compact ? pnl : `${closed ? \"Closed\" : \"Open\"} PnL: ${pnl}`;\n if (positionStatOn(s, \"qty\")) t += (t !== \"\" ? (compact ? \" ~ \" : \", \") : \"\") + (compact ? String(qty) : `Qty: ${qty}`);\n if (positionStatOn(s, \"riskRewardRatio\")) t += (t !== \"\" ? \"\\n\" : \"\") + (compact ? String(ratio) : `Risk/reward ratio: ${ratio}`);\n return t;\n}\n\n/** TV factory inputs (properties defaults of the risk/reward tool). */\nexport const POSITION_DEFAULTS = { accountSize: 1000, risk: 25, lotSize: 1, leverage: 10000 } as const;\n\n/** Stop / profit price distances; drawings saved before the level model\n * derive both from the old mirrored close point, else 100 ticks. */\nexport function positionLevels(d: Drawing, pip: number): { stop: number; profit: number } {\n const p0 = d.points[0];\n const p1 = d.points[1];\n const legacy = p0 && p1 ? Math.abs(p1.price - p0.price) : 0;\n return {\n stop: d.style.stopLevel ?? (legacy || pip * 100),\n profit: d.style.profitLevel ?? (legacy || pip * 100),\n };\n}\n\n/** TV riskSize: the money at risk. */\nexport function positionRiskSize(s: DrawingStyle): number {\n const account = s.accountSize ?? POSITION_DEFAULTS.accountSize;\n if (s.riskDisplayMode === \"money\") return Math.min(s.riskAmount ?? (account * (s.riskPercent ?? POSITION_DEFAULTS.risk)) / 100, account);\n return ((s.riskPercent ?? POSITION_DEFAULTS.risk) / 100) * account;\n}\n\n/** TV _roundQty for a stock: \"default\" floors, a decimals count rounds. */\nexport function roundQty(v: number, precision: string | undefined): number {\n if (!precision || precision === \"default\") return Math.floor(v);\n const k = Math.pow(10, parseInt(precision, 10));\n return Math.round(v * k) / k;\n}\n\n/** Raw qty (TV `qty`, drives the amounts) and the shown qty (stats). */\nexport function positionQty(s: DrawingStyle, entry: number, stop: number): { qty: number; shown: number } {\n const account = s.accountSize ?? POSITION_DEFAULTS.accountSize;\n const leverage = s.leverage ?? POSITION_DEFAULTS.leverage;\n const riskQty = stop > 0 ? positionRiskSize(s) / stop : Infinity;\n const levQty = entry > 0 ? (leverage * account) / entry : Infinity;\n const q = Math.min(riskQty, levQty);\n const qty = Number.isFinite(q) ? q : 0;\n const lot = s.lotSize && s.lotSize > 0 ? s.lotSize : 1;\n return { qty, shown: roundQty(qty / lot, s.qtyPrecision) };\n}\n\n/** TV prepare{Long,Short}{Stop,Profit}Price: the typed price rounded to the\n * tick, kept at least one tick on its side of the entry; returns the level\n * (price distance from the entry, a whole number of ticks). */\nexport function levelFromPrice(price: number, entry: number, pip: number, side: 1 | -1, leg: \"stop\" | \"profit\"): number {\n const base = 1 / pip;\n const r = Math.round(price * base) / base;\n const below = (side === 1) === (leg === \"stop\");\n const p = below ? Math.min(r, entry - pip) : Math.max(r, entry + pip);\n return Math.round(Math.abs(p - entry) * base) * pip;\n}\n\n/** Position-tool virtual anchors, shared by the renderer / hit-test / drag:\n * 0 = entry (free), 1 = close point (time-only), 2 = stop (price-only),\n * 3 = target (price-only). */\nexport function positionAnchors(\n d: Drawing,\n pts: Pt[],\n coords: Coords | null | undefined,\n): { anchors: Pt[]; yStop: number; yTarget: number; stop: number; profit: number } | null {\n if (d.kind !== \"long-position\" && d.kind !== \"short-position\") return null;\n const [a, b] = pts;\n const entry = d.points[0].price;\n const { stop, profit } = positionLevels(d, coords?.pipSize() ?? 0.01);\n const sign = d.kind === \"long-position\" ? 1 : -1;\n const yTarget = coords?.priceToY(entry + sign * profit) ?? a.y - 40;\n const yStop = coords?.priceToY(entry - sign * stop) ?? a.y + 40;\n if (yTarget == null || yStop == null) return null;\n // TV risk-reward anchors: entry, close (same y), stop and target at the\n // ENTRY x (the left edge of the box).\n return {\n anchors: [a, { x: b.x, y: a.y }, { x: a.x, y: yStop }, { x: a.x, y: yTarget }],\n yStop,\n yTarget,\n stop,\n profit,\n };\n}\n\n/** TV risk-reward trade over the bars (RiskRewardCalculator, module 88161 +\n * the long / short `_checkStopPrice`): actual entry = first bar from the\n * entry bar to the bar before the close point with low <= entry <= high;\n * actual close = from that bar on, the first bar that hits the stop (long\n * low <= stop, short high >= stop) else the target (long high >= target,\n * short low <= target). closePrice = the stop / target price once closed,\n * else the close of the bar at the close point (last bar if later).\n * Indices are positions in `coords.bars()`. */\nexport function positionTrade(\n d: Drawing,\n dir: \"long\" | \"short\",\n stopPrice: number,\n targetPrice: number,\n coords: Coords | null | undefined,\n): { entryIndex: number | null; closeIndex: number | null; closed: boolean; closePrice: number; barIndex: number } | null {\n if (!coords || d.points.length < 2) return null;\n const bars = coords.bars();\n if (bars.length === 0) return null;\n const last = bars.length - 1;\n const i0 = coords.timeToBarIndex(d.points[0].time);\n const p1 = d.points[1];\n if (!p1) return null;\n const i1 = coords.timeToBarIndex(p1.time);\n if (i0 == null || i1 == null || i1 < 0) return null;\n const entry = d.points[0].price;\n const end = Math.min(last, i1 - 1);\n let entryIndex: number | null = null;\n for (let i = Math.max(i0, 0); i <= end; i++) {\n if (bars[i].high >= entry && bars[i].low <= entry) { entryIndex = i; break; }\n }\n let closeIndex: number | null = null;\n let hit: number | null = null;\n if (entryIndex != null) {\n for (let i = entryIndex; i <= end; i++) {\n const bar = bars[i];\n if (dir === \"long\") {\n if (bar.low <= stopPrice) hit = stopPrice;\n else if (bar.high >= targetPrice) hit = targetPrice;\n } else if (bar.high >= stopPrice) hit = stopPrice;\n else if (bar.low <= targetPrice) hit = targetPrice;\n if (hit != null) { closeIndex = i; break; }\n }\n }\n if (closeIndex != null && hit != null) {\n return { entryIndex, closeIndex, closed: true, closePrice: hit, barIndex: Math.min(last, closeIndex) };\n }\n const barIndex = Math.min(last, i1);\n return { entryIndex, closeIndex: null, closed: false, closePrice: bars[barIndex].close, barIndex };\n}\n","/*\n * Gann square / Gann square fixed geometry (TV LineToolGannComplex, module\n * 884210, and LineToolGannFixed, module 86825, read live 25/09/2026), shared\n * by the overlay renderer and the hit test.\n *\n * Box: Gann square = p0 → p1 (start / end swapped when Reverse is on); Gann\n * square fixed = p0 → p0 + 5·|p0p1| on both axes, towards p1's quadrant\n * (screen px, so always a screen square; Reverse swaps the stored points).\n * Levels: vertical + horizontal lines at index / 5 of the box.\n * Fans: from the start to (end.x, start.y + y/x·dy) when x > y, else to\n * (start.x + x/y·dx, end.y).\n * Arcs (TV GannArcRenderer): quarter ellipse around the start in the end's\n * quadrant, the unit circle scaled by the box ratio dy/dx; radius from the\n * point (x/5, y/5) of the box; clipped to the box; the fill runs from the\n * previous visible arc to this one.\n */\nimport type { Drawing, GannLine, GannRatioLine } from \"../types\";\nimport type { Pt } from \"../_shared\";\n\nexport type GannFrame = { start: Pt; end: Pt; dx: number; dy: number };\n\nexport function gannFrame(d: Drawing, pts: Pt[]): GannFrame | null {\n const [p0, p1] = pts;\n if (!p0 || !p1) return null;\n if (d.kind === \"gann-square-fixed\") {\n const vx = p1.x - p0.x;\n const vy = p1.y - p0.y;\n const a = Math.hypot(vx, vy);\n if (a < 1e-9) return null;\n const end = { x: p0.x + 5 * a * (vx < 0 ? -1 : 1), y: p0.y + 5 * a * (vy < 0 ? -1 : 1) };\n return { start: p0, end, dx: end.x - p0.x, dy: end.y - p0.y };\n }\n const [start, end] = d.style.reverse ? [p1, p0] : [p0, p1];\n return { start, end, dx: end.x - start.x, dy: end.y - start.y };\n}\n\nexport function gannLevelLines(f: GannFrame, levels: GannLine[]) {\n return levels\n .map((l, i) => ({ l, t: i / 5 }))\n .filter((x) => x.l.visible)\n .map(({ l, t }) => ({ color: l.color, width: l.width, x: f.start.x + t * f.dx, y: f.start.y + t * f.dy }));\n}\n\nexport function gannFanLines(f: GannFrame, fans: GannRatioLine[]) {\n return fans\n .filter((l) => l.visible)\n .map((l) => {\n const to =\n l.x > l.y\n ? { x: f.end.x, y: f.start.y + (l.y / l.x) * f.dy }\n : { x: f.start.x + (l.x / l.y) * f.dx, y: f.end.y };\n return { color: l.color, width: l.width, from: f.start, to };\n });\n}\n\n/** Screen radii of the visible arcs, with the previous visible arc's radius\n * (0 for the first) for the fill. */\nexport function gannArcs(f: GannFrame, arcs: GannRatioLine[]) {\n const n = f.dx !== 0 ? f.dy / f.dx : 0;\n const radius = (px: number, py: number) => (n !== 0 ? Math.hypot(px, py / n) : Math.abs(px));\n let prev = 0;\n const out: { color: string; width: number; r: number; prev: number }[] = [];\n for (const a of arcs) {\n if (!a.visible) continue;\n const r = radius((a.x / 5) * f.dx, (a.y / 5) * f.dy);\n out.push({ color: a.color, width: a.width, r, prev });\n prev = r;\n }\n return out;\n}\n\n/** SVG paths of one arc: the quarter ellipse stroke and the fill band from\n * the previous radius (TV draws both inside the box clip). */\nexport function gannArcPaths(f: GannFrame, r: number, prev: number): { stroke: string; fill: string } {\n const sx = f.dx < 0 ? -1 : 1;\n const sy = f.dy < 0 ? -1 : 1;\n const k = f.dx !== 0 ? Math.abs(f.dy / f.dx) : 1;\n const sweep = sx * sy > 0 ? 1 : 0;\n const { x: cx, y: cy } = f.start;\n const stroke = `M ${cx + sx * r} ${cy} A ${r} ${r * k} 0 0 ${sweep} ${cx} ${cy + sy * r * k}`;\n const inner =\n prev > 0\n ? `L ${cx} ${cy + sy * prev * k} A ${prev} ${prev * k} 0 0 ${1 - sweep} ${cx + sx * prev} ${cy}`\n : `L ${cx} ${cy}`;\n const fill = `M ${cx + sx * prev} ${cy} L ${cx + sx * r} ${cy} A ${r} ${r * k} 0 0 ${sweep} ${cx} ${cy + sy * r * k} ${inner} Z`;\n return { stroke, fill };\n}\n\n/** Box rectangle (screen). */\nexport function gannBox(f: GannFrame) {\n return {\n left: Math.min(f.start.x, f.end.x),\n top: Math.min(f.start.y, f.end.y),\n right: Math.max(f.start.x, f.end.x),\n bottom: Math.max(f.start.y, f.end.y),\n };\n}\n","/*\n * Gann fan geometry, shared by the scene (scene/gann.ts) and the hit test\n * (kinds/hit-tests.ts).\n */\nimport type { Pt } from \"../_shared\";\n\n/** Gann-fan ray direction for a level: coeff scales the time leg of the 1/1\n * anchor move (\"1/8\" reaches the full dy in an eighth of the dt, the\n * steepest ray; \"8/1\" the shallowest). */\nexport function gannFanDir(a: Pt, b: Pt, coeff: number): Pt {\n const dx = b.x - a.x || 1;\n const dy = b.y - a.y;\n return { x: dx * coeff, y: dy };\n}\n","/*\n * Pitchfork family geometry (moved from OpenTrader DrawingsOverlay), shared by\n * the scene (scene/gann.ts) and the hit test (kinds/hit-tests.ts).\n */\nimport type { Pt } from \"../_shared\";\n\n/** Pitchfork family geometry (TV): pivot and median direction per variant.\n * Original: median from P0 through mid(P1,P2). Schiff: median base\n * (P0.x, (P0.y + P1.y) / 2). Modified Schiff: base mid(P0, P1). Inside:\n * median from mid(P1,P2) along (P2 − mid(P0,P1)). Level lines are parallel\n * to the median at ±coeff·(P2−P1)/2 from mid(P1,P2). */\nexport function pitchforkGeom(kind: string, pts: Pt[]): { pivot: Pt; dir: Pt; t1: Pt; t2: Pt; mid: Pt; half: Pt } | null {\n const [p1, p2, p3] = pts;\n const mid = { x: (p2.x + p3.x) / 2, y: (p2.y + p3.y) / 2 };\n const half = { x: (p3.x - p2.x) / 2, y: (p3.y - p2.y) / 2 };\n let pivot: Pt = p1;\n let dir: Pt;\n if (kind === \"schiff-pitchfork\") {\n pivot = { x: p1.x, y: (p1.y + p2.y) / 2 };\n dir = { x: mid.x - pivot.x, y: mid.y - pivot.y };\n } else if (kind === \"modified-schiff-pitchfork\") {\n pivot = { x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 };\n dir = { x: mid.x - pivot.x, y: mid.y - pivot.y };\n } else if (kind === \"inside-pitchfork\") {\n const m01 = { x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 };\n pivot = mid;\n dir = { x: p3.x - m01.x, y: p3.y - m01.y };\n } else {\n dir = { x: mid.x - pivot.x, y: mid.y - pivot.y };\n }\n if (Math.hypot(dir.x, dir.y) < 1e-6) return null;\n return { pivot, dir, t1: p2, t2: p3, mid, half };\n}\n\n/** A ray from `origin` along `dir` to the right pane edge; collapses to the\n * origin when the direction has no rightward component. */\nexport function pitchforkExtendRight(origin: Pt, dir: Pt, width: number): Pt {\n if (dir.x <= 0) return origin;\n const t = (width - origin.x) / dir.x;\n return { x: width, y: origin.y + dir.y * t };\n}\n","/*\n * Trend-based fib time level positions (TV line-tool-trend-based-fib-time\n * pane view), shared by the renderer and the hit test: level x = the bar\n * round(p2.index + coeff · (p1.index − p0.index)); no levels when p0 and p1\n * are on the same bar. Without coords (or an unknown bar), the screen\n * fallback p2.x + coeff · (p1.x − p0.x).\n */\nimport type { Coords } from \"../coords\";\nimport type { Drawing, LevelDef } from \"../types\";\nimport type { Pt } from \"../_shared\";\n\nexport function trendFibTimeLevels(d: Drawing, pts: Pt[], coords: Coords | null, levels: LevelDef[]): (LevelDef & { x: number })[] {\n const [a, b, c] = pts;\n if (!a || !b || !c) return [];\n const [p0, p1, p2] = d.points;\n const i0 = coords && p0 ? coords.timeToBarIndex(p0.time) : null;\n const i1 = coords && p1 ? coords.timeToBarIndex(p1.time) : null;\n const i2 = coords && p2 ? coords.timeToBarIndex(p2.time) : null;\n if (i0 != null && i1 != null && i0 === i1) return [];\n return levels.map((l) => {\n let x: number | null = null;\n if (coords && i0 != null && i1 != null && i2 != null) {\n const t = coords.barIndexToTime(Math.round(i2 + l.coeff * (i1 - i0)));\n x = t != null ? coords.timeToX(t) : null;\n }\n return { ...l, x: x ?? c.x + l.coeff * (b.x - a.x) };\n });\n}\n","/*\n * TV TextRenderer layout (module 470986), shared by the overlay renderers and\n * the hit tests. Pure TS (a canvas 2D context measures the text).\n */\nimport type { Pt } from \"../_shared\";\n\nlet ctx: CanvasRenderingContext2D | null = null;\nlet bodyFontFamily: string | null = null;\n/** Width of `text` in the chart font with bold / italic (label boxes). */\nexport function measureTextStyled(text: string, fontSize: number, bold: boolean, italic: boolean): number {\n if (!ctx) ctx = document.createElement(\"canvas\").getContext(\"2d\");\n if (!ctx) return text.length * fontSize * 0.6;\n bodyFontFamily ??= getComputedStyle(document.body).fontFamily;\n ctx.font = `${italic ? \"italic \" : \"\"}${bold ? \"bold \" : \"\"}${fontSize}px ${bodyFontFamily}`;\n return ctx.measureText(text).width;\n}\n\n/** TV TextRenderer layout (module 470986, `_getBoxSize` / `_getBox` /\n * `_getRotationPoint` / `_getInternalData`): box = widest line + left and\n * right padding (rounded, made even) by lines·fs + 2·padV (no line spacing);\n * placed at the point by the alignment and offsets (Bottom: box above,\n * Top: below, Left: box starts offsetX right of the point, Right: ends\n * offsetX left of it); text x at the padded left / centre / right, first\n * line centre = box top + padV + fs/2 (+0.05·fs); rotated by `angle`\n * (radians) around the aligned box corner / edge. Padding default fs/3. */\n/** TV wordWrap (module 691695) with hidden parts dropped (TextRenderer\n * keeps only the visible lines): each text line wider than `width` breaks\n * at spaces; a word longer than the width is cut by characters (the longest\n * prefix that fits, at least one character); spaces overflowing a line end\n * are hidden. No wrap when the width is not positive or narrower than \"x\". */\nexport function tvWordWrap(text: string, fs: number, bold: boolean, italic: boolean, width?: number): string[] {\n const lines = text.split(/\\r\\n|\\r|\\n/);\n if (width == null || !Number.isFinite(width) || width <= 0) return lines;\n const m = (t: string) => measureTextStyled(t, fs, bold, italic);\n if (m(\"x\") > width) return lines;\n const chunks = (t: string): string[] => {\n const out: string[] = [];\n while (t.length) {\n // first prefix length whose width exceeds the limit (upper bound)\n let lo = 0, hi = t.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (m(t.slice(0, mid + 1)) > width) hi = mid;\n else lo = mid + 1;\n }\n const h = Math.max(1, lo);\n out.push(t.slice(0, h));\n t = t.slice(h);\n }\n return out;\n };\n const out: string[] = [];\n for (const line of lines) {\n if (m(line) <= width) {\n out.push(line);\n continue;\n }\n const words: { word: string; spaces: string }[] = [];\n let rest = line;\n do {\n const sp = rest.match(/\\s+/);\n if (!sp || sp.index === undefined) {\n words.push({ word: rest, spaces: \"\" });\n break;\n }\n words.push({ word: rest.slice(0, sp.index), spaces: sp[0] });\n rest = rest.slice(sp.index + sp[0].length);\n } while (rest.length);\n let g = \"\";\n let f = 0;\n while (f < words.length) {\n const w = words[f];\n let t = `${g}${w.word}`;\n if (m(t) > width) {\n if (g !== \"\") {\n out.push(g);\n g = \"\";\n } else if (t.length === 1) {\n out.push(t);\n w.word = \"\";\n } else {\n const c = chunks(t);\n for (let k = 0; k < c.length - 1; k++) out.push(c[k]);\n w.word = c[c.length - 1];\n }\n continue;\n }\n t = `${g}${w.word}${w.spaces}`;\n if (m(t) < width) {\n g = t;\n f += 1;\n continue;\n }\n out.push(chunks(t)[0]);\n g = \"\";\n f += 1;\n }\n if (g !== \"\") out.push(g);\n }\n return out;\n}\n\nexport type TvTextInput = {\n x: number;\n y: number;\n text: string;\n fs: number;\n bold?: boolean;\n italic?: boolean;\n vert: \"top\" | \"middle\" | \"bottom\";\n horz: \"left\" | \"center\" | \"right\";\n offsetX?: number;\n offsetY?: number;\n angle?: number;\n padV?: number;\n padH?: number;\n /** TV wordWrapWidth / maxHeight (lines kept: floor(maxHeight / fs)). */\n wrapWidth?: number;\n maxHeight?: number;\n /** TV TextRenderer `_getLinesMaxWidth`: with a wrap width (and no\n * forceCalculateMaxLineWidth) the box is the wrap width wide. */\n boxWidthFromWrap?: boolean;\n /** TV lineSpacing (px between lines, default 0). */\n lineSpacing?: number;\n};\nexport function tvTextLayout(d: TvTextInput) {\n const fs = d.fs;\n let lines = d.wrapWidth != null ? tvWordWrap(d.text, fs, !!d.bold, !!d.italic, d.wrapWidth) : d.text.split(\"\\n\");\n if (d.maxHeight != null) lines = lines.slice(0, Math.max(0, Math.floor(d.maxHeight / fs)));\n const padV = d.padV ?? fs / 3;\n const padH = d.padH ?? fs / 3;\n const ox = d.offsetX ?? 0;\n const oy = d.offsetY ?? 0;\n const textW = d.boxWidthFromWrap && d.wrapWidth != null ? d.wrapWidth : Math.max(0, ...lines.map((l) => measureTextStyled(l, fs, !!d.bold, !!d.italic)));\n let bw = Math.round(textW + 2 * padH);\n if (bw % 2) bw += 1;\n const ls = d.lineSpacing ?? 0;\n const bh = fs * lines.length + ls * Math.max(0, lines.length - 1) + 2 * padV;\n const top = d.vert === \"bottom\" ? d.y - bh - oy : d.vert === \"middle\" ? d.y - bh / 2 : d.y + oy;\n const left = d.horz === \"left\" ? d.x + ox : d.horz === \"center\" ? d.x - bw / 2 : d.x - bw - ox;\n const rx = d.horz === \"center\" ? left + bw / 2 : d.horz === \"left\" ? left : left + bw;\n const ry = d.vert === \"middle\" ? top + bh / 2 : d.vert === \"top\" ? top : top + bh;\n const tx = d.horz === \"left\" ? left + padH : d.horz === \"right\" ? left + bw - padH : left + bw / 2;\n const anchor: \"start\" | \"middle\" | \"end\" = d.horz === \"left\" ? \"start\" : d.horz === \"right\" ? \"end\" : \"middle\";\n const a = d.angle ?? 0;\n const cos = Math.cos(a), sin = Math.sin(a);\n const rot = (x: number, y: number): Pt => ({ x: (x - rx) * cos - (y - ry) * sin + rx, y: (x - rx) * sin + (y - ry) * cos + ry });\n return {\n lines,\n fs,\n /** Distance between two line centres (fs + lineSpacing). */\n lineStep: fs + ls,\n tx,\n y0: top + padV + fs / 2 + 0.05 * fs,\n anchor,\n rotate: `rotate(${(a * 180) / Math.PI} ${rx} ${ry})`,\n box: { left, top, width: bw, height: bh },\n poly: [rot(left, top), rot(left + bw, top), rot(left + bw, top + bh), rot(left, top + bh)],\n };\n}\n\n","/*\n * Price note price label (TV line-tool-price-note renderer), shared by the\n * overlay renderer and the hit test: the P0 price in a TV text box at P1,\n * placed by the P0 → P1 angle (TV alignByAngle, degrees, y down): up\n * (−135…−45) centred above, right (−45…45) to the right, down (45…135)\n * centred below, left otherwise to the left. Padding 6 / 8, 12px factory,\n * background + 1px border, radius 4. TV hit-tests the line (3px) and this box.\n */\nimport type { Drawing } from \"../types\";\nimport type { Pt } from \"../_shared\";\nimport { tvTextLayout } from \"./tv-text\";\n\nexport function priceNoteLabel(d: Drawing, pts: Pt[], digits: number) {\n const [a, b] = pts;\n const p0 = d.points[0];\n if (!a || !b || !p0) return null;\n const deg = Math.round((Math.atan2(b.y - a.y, b.x - a.x) * 180) / Math.PI);\n const [horz, vert] =\n deg >= -135 && deg <= -45\n ? ([\"center\", \"bottom\"] as const)\n : deg > -45 && deg < 45\n ? ([\"left\", \"middle\"] as const)\n : deg >= 45 && deg <= 135\n ? ([\"center\", \"top\"] as const)\n : ([\"right\", \"middle\"] as const);\n const s = d.style;\n return tvTextLayout({\n x: b.x,\n y: b.y,\n text: p0.price.toFixed(digits),\n fs: s.priceLabelFontSize ?? 12,\n bold: s.priceLabelBold,\n italic: s.priceLabelItalic,\n horz,\n vert,\n padV: 6,\n padH: 8,\n });\n}\n","/*\n * Rectangle text (TV line-tool-rectangle pane view), shared by the renderer\n * and the hit test. Horizontal: Left = box from the left edge, Right = box\n * ending at the right edge, Center = centred (TV getTextAlignInBox point, the\n * box keeps the chosen alignment). Vertical (stored value / TV dialog name):\n * `bottom` / \"Top\" = box above the top edge, `top` / \"Bottom\" = box below the\n * bottom edge, `middle` / \"Inside\" = centred, wrapped to the rectangle width\n * less the side padding and cut to its height. Padding fs/3 vertical, fs/3\n * horizontal only inside. Factory 14px, centre / middle.\n */\nimport type { Drawing } from \"../types\";\nimport type { Pt } from \"../_shared\";\nimport { tvTextLayout } from \"./tv-text\";\n\n/** `paneW` = pane width (TV extends to 0 / the pane width). With an extend\n * flag on the aligned side, the text anchors at the pane edge while the box\n * is on screen (else at the other rectangle edge); a Left / Right text wider\n * than the visible part shifts back by the overflow (TV offsetX). */\nexport function rectangleTextLayout(d: Drawing, pts: Pt[], paneW: number) {\n const [a, b] = pts;\n if (!d.text || !a || !b) return null;\n const s = d.style;\n const left = Math.min(a.x, b.x);\n const right = Math.max(a.x, b.x);\n const top = Math.min(a.y, b.y);\n const bottom = Math.max(a.y, b.y);\n const extL = !!s.extendLeft;\n const extR = !!s.extendRight;\n const vis = (left <= paneW || extL) && (right >= 0 || extR);\n const fs = s.fontSize ?? 14;\n const padV = fs / 3;\n const horz = s.horzLabelsAlign ?? \"center\";\n const vert = s.vertLabelsAlign ?? \"middle\";\n const inside = vert === \"middle\";\n const padH = inside ? padV : 0;\n const x =\n horz === \"left\"\n ? extL ? (vis ? 0 : right) : left\n : horz === \"right\"\n ? extR ? (vis ? paneW : left) : right\n : ((extL && vis ? 0 : left) + (extR && vis ? paneW : right)) / 2;\n const input = {\n x,\n y: inside ? (top + bottom) / 2 : vert === \"top\" ? bottom : top,\n text: d.text,\n fs,\n bold: s.bold,\n italic: s.italic,\n vert,\n horz,\n padV,\n padH,\n wrapWidth: inside ? (extR ? paneW : right) - (extL ? 0 : left) - 2 * padH : undefined,\n maxHeight: inside ? bottom - top : undefined,\n };\n const l = tvTextLayout(input);\n if ((horz === \"left\" && extL) || (horz === \"right\" && extR)) {\n const segL = extL ? 0 : Math.max(left, 0);\n const segR = extR ? paneW : Math.min(right, paneW);\n const over = segR - segL - l.box.width;\n if (over < 0) return tvTextLayout({ ...input, offsetX: over });\n }\n return l;\n}\n","/*\n * Shared geometry for the data-driven drawings (regression-trend, anchored-vwap,\n * volume-profile) plus the forecast tool's data-resolved status. Pure TS — no\n * JSX, no Solid — so BOTH the overlay renderer and the hit-test dispatch compute\n * the exact same screen geometry from a single source of truth. Each helper\n * reads coords.bars() (the live OHLCV array) and projects the computed series\n * back to screen space via coords.\n */\nimport type { Coords } from \"../coords\";\nimport type { OHLC } from \"../coords\";\nimport type { Drawing, DrawingStyle, LevelDef, RegressionLine } from \"../types\";\nimport type { Time } from \"lightweight-charts\";\nimport { timeToSec, type Pt } from \"../_shared\";\nimport { VWAP_BAND_DEFAULTS, VWAP_BAND_LINE_DEFAULTS } from \"../specs\";\n\n/** Bars whose time falls within [aSec, bSec] (order-insensitive). */\nexport function barsBetween(bars: OHLC[], aSec: number, bSec: number): OHLC[] {\n const lo = Math.min(aSec, bSec);\n const hi = Math.max(aSec, bSec);\n const out: OHLC[] = [];\n for (const b of bars) {\n const ts = timeToSec(b.time);\n if (ts != null && ts >= lo && ts <= hi) out.push(b);\n }\n return out;\n}\n\n/** Least-squares fit of the source values vs bar-index; m/b in\n * price-per-index + price intercept, the residual standard deviation and\n * Pearson's R of the fit (TV's regression-trend study reports it as\n * `pearsons`). σ is the sample deviation (divided by n − 1): matches the TV\n * study output to the cent (read live 24/09/2026, 28 bars). */\nexport function linregress(ys: number[]): { m: number; b: number; sd: number; r: number } | null {\n const n = ys.length;\n if (n < 2) return null;\n let sx = 0, sy = 0, sxx = 0, sxy = 0, syy = 0;\n for (let i = 0; i < n; i++) {\n const y = ys[i];\n sx += i; sy += y; sxx += i * i; sxy += i * y; syy += y * y;\n }\n const denom = n * sxx - sx * sx;\n if (Math.abs(denom) < 1e-9) return null;\n const m = (n * sxy - sx * sy) / denom;\n const b = (sy - m * sx) / n;\n let ss = 0;\n for (let i = 0; i < n; i++) {\n const r = ys[i] - (b + m * i);\n ss += r * r;\n }\n const varY = n * syy - sy * sy;\n const r = varY > 1e-12 ? (n * sxy - sx * sy) / Math.sqrt(denom * varY) : 0;\n return { m, b, sd: Math.sqrt(ss / (n - 1)), r };\n}\n\nexport type RegressionLines = {\n center: [Pt, Pt];\n upper: [Pt, Pt] | null;\n lower: [Pt, Pt] | null;\n /** Pearson's R of the fit — rendered under the DOWN line's start when\n * `showPearsons` (TV prepareLinearRegressionRenderersData). */\n pearsons: number;\n /** Anchor positions for points 0 / 1: on the base line at the first / last\n * fitted bar (TV `_updateAnchorsPrice`: the anchors take the base line's\n * start / end prices, swapped when point 0 is the later one). */\n anchors: [Pt, Pt];\n};\n\n/** Extend a screen segment rightward to x = `toX` (TV styles.extendLines →\n * per-line `extendright` clipped by intersectLineWithViewport). */\nfunction extendSegRight(seg: [Pt, Pt], toX: number): [Pt, Pt] {\n const [a, b] = seg;\n if (b.x <= a.x || toX <= b.x) return seg;\n const t = (toX - a.x) / (b.x - a.x);\n return [a, { x: toX, y: a.y + (b.y - a.y) * t }];\n}\n\n/** Projected regression base line + deviation bands over the drawing's [t0,t1]\n * range, or null when there's no data to fit / projection fails (the caller\n * falls back to the stored screen segment). Band offsets are the style's\n * upper/lower deviation multipliers × the residual σ (TV factory +2 / −2);\n * with \"Use Upper / Lower Deviation\" off, the largest bar high above / low\n * below the base line, whatever the source (TV study, checked live with\n * close and high sources). `extendRightToX` (pane width) extends all three\n * lines right when the drawing's extend flag is on. */\nexport function regressionScreenLines(\n d: Drawing,\n coords: Coords | null,\n extendRightToX?: number,\n): RegressionLines | null {\n const p1 = d.points[1];\n const t0 = timeToSec(d.points[0].time);\n const t1 = p1 ? timeToSec(p1.time) : null;\n if (!coords || t0 == null || t1 == null) return null;\n const bars = barsBetween(coords.bars(), t0, t1);\n const src = d.style.regressionSource ?? \"close\";\n const fit = linregress(bars.map((b) => sourcePrice(b, src)));\n if (!fit) return null;\n const n = bars.length;\n const yFit0 = fit.b;\n const yFit1 = fit.b + fit.m * (n - 1);\n let maxHigh = -Infinity;\n let maxLow = -Infinity;\n for (let i = 0; i < n; i++) {\n const base = fit.b + fit.m * i;\n maxHigh = Math.max(maxHigh, bars[i].high - base);\n maxLow = Math.max(maxLow, base - bars[i].low);\n }\n const upDev = d.style.useUpperDeviation === false ? maxHigh : (d.style.upperDeviation ?? 2) * fit.sd;\n const loDev = d.style.useLowerDeviation === false ? -maxLow : (d.style.lowerDeviation ?? -2) * fit.sd;\n const proj = (time: Time, price: number): Pt | null => {\n const x = coords.timeToX(time);\n const y = coords.priceToY(price);\n return x == null || y == null ? null : { x, y };\n };\n const c0 = proj(bars[0].time, yFit0);\n const c1 = proj(bars[n - 1].time, yFit1);\n if (!c0 || !c1) return null;\n const u0 = proj(bars[0].time, yFit0 + upDev);\n const u1 = proj(bars[n - 1].time, yFit1 + upDev);\n const l0 = proj(bars[0].time, yFit0 + loDev);\n const l1 = proj(bars[n - 1].time, yFit1 + loDev);\n const ext = (seg: [Pt, Pt]): [Pt, Pt] =>\n d.style.extendRight && extendRightToX != null ? extendSegRight(seg, extendRightToX) : seg;\n return {\n center: ext([c0, c1]),\n upper: u0 && u1 ? ext([u0, u1]) : null,\n lower: l0 && l1 ? ext([l0, l1]) : null,\n pearsons: fit.r,\n anchors: t0 <= t1 ? [c0, c1] : [c1, c0],\n };\n}\n\n/* ── Anchored VWAP (LineToolAnchoredVWAP — study \"anchoredvwap\") ─────────────\n * Plots: VWAP + UpperBand/LowerBand #1..#3 at vwap ± mult·σ where σ is the\n * cumulative volume-weighted stdev of the source price from the anchor\n * (σ² = Σv·src² / Σv − vwap²). The source select mirrors the study's price\n * sources (631031 → 202637 studyAvailablePriceSources). */\n\nexport type VwapSource = NonNullable<Drawing[\"style\"][\"vwapSource\"]>;\n\nfunction sourcePrice(b: OHLC, src: VwapSource): number {\n switch (src) {\n case \"open\": return b.open;\n case \"high\": return b.high;\n case \"low\": return b.low;\n case \"close\": return b.close;\n case \"hl2\": return (b.high + b.low) / 2;\n case \"ohlc4\": return (b.open + b.high + b.low + b.close) / 4;\n case \"hlcc4\": return (b.high + b.low + b.close + b.close) / 4;\n case \"hlc3\":\n default: return (b.high + b.low + b.close) / 3;\n }\n}\n\n/** A computed band (`index` = band #index + 1). */\nexport type VwapBand = { level: LevelDef; index: number; upper: Pt[]; lower: Pt[] };\n\n/** Upper / lower line style of band `i` (TV UpperBand / LowerBand styles;\n * older drawings fall back to the level's colour / width). */\nexport function vwapBandLine(s: DrawingStyle, i: number, side: \"upper\" | \"lower\"): RegressionLine {\n const list = side === \"upper\" ? s.vwapUpper : s.vwapLower;\n const lvl = (s.levels ?? VWAP_BAND_DEFAULTS)[i];\n const def = VWAP_BAND_LINE_DEFAULTS[i] ?? VWAP_BAND_LINE_DEFAULTS[0];\n return list?.[i] ?? { ...def, color: lvl?.color ?? def.color, width: lvl?.width ?? def.width };\n}\nexport type VwapSeries = { line: Pt[]; bands: VwapBand[] };\n\n/** Cumulative VWAP and σ per bar from the anchor bar forward, in data space.\n * Cached per bars array (one per pane, so a drawing shown on several panes\n * doesn't thrash) and per drawing; recomputed only when the bars (length or\n * the forming last bar), the anchor or the source change, so a pan/zoom frame\n * only projects the visible slice instead of rescanning every bar. Entries\n * go with their bars array. */\ntype VwapData = { start: number; vwap: Float64Array; sd: Float64Array };\nconst vwapCache = new WeakMap<OHLC[], Map<string, { key: string; data: VwapData }>>();\n\nfunction vwapData(d: Drawing, bars: OHLC[], anchorSec: number, src: VwapSource): VwapData {\n const last = bars[bars.length - 1];\n const key = `${anchorSec}|${src}|${bars.length}|${last ? `${timeToSec(last.time)}:${last.close}:${last.volume}` : \"\"}`;\n let perBars = vwapCache.get(bars);\n if (!perBars) {\n perBars = new Map();\n vwapCache.set(bars, perBars);\n }\n const hit = perBars.get(d.id);\n if (hit && hit.key === key) return hit.data;\n // First bar at or after the anchor (bars are time-ascending).\n let lo = 0,\n hi = bars.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n const ts = timeToSec(bars[mid].time);\n if (ts != null && ts < anchorSec) lo = mid + 1;\n else hi = mid;\n }\n const n = bars.length - lo;\n const vwap = new Float64Array(Math.max(0, n));\n const sd = new Float64Array(Math.max(0, n));\n let cumPV = 0;\n let cumPV2 = 0;\n let cumV = 0;\n for (let i = 0; i < n; i++) {\n const b = bars[lo + i];\n const price = sourcePrice(b, src);\n const vol = b.volume && b.volume > 0 ? b.volume : 1;\n cumPV += price * vol;\n cumPV2 += price * price * vol;\n cumV += vol;\n const v = cumPV / cumV;\n vwap[i] = v;\n sd[i] = Math.sqrt(Math.max(0, cumPV2 / cumV - v * v));\n }\n const data = { start: lo, vwap, sd };\n perBars.set(d.id, { key, data });\n return data;\n}\n\n/** Index of the first bar with time ≥ sec (bars.length when none). */\nfunction firstIndexAtOrAfter(bars: OHLC[], sec: number): number {\n let lo = 0,\n hi = bars.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n const ts = timeToSec(bars[mid].time);\n if (ts != null && ts < sec) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\n/** The VWAP value at the last bar (TV price-scale label), null when the\n * anchor is past the data. */\nexport function vwapLastValue(d: Drawing, coords: Coords | null): number | null {\n const anchorSec = timeToSec(d.points[0].time);\n if (!coords || anchorSec == null) return null;\n const bars = coords.bars();\n if (bars.length === 0) return null;\n const data = vwapData(d, bars, anchorSec, d.style.vwapSource ?? \"hlc3\");\n return data.vwap.length > 0 ? data.vwap[data.vwap.length - 1] : null;\n}\n\n/** Projected cumulative-VWAP polyline from the anchor bar forward plus the\n * visible ±σ bands (equal weights when volume is absent). Only the bars in\n * view, plus one on each side so the lines run to the pane edges, are\n * projected. */\nexport function vwapScreenSeries(d: Drawing, coords: Coords | null): VwapSeries {\n const anchorSec = timeToSec(d.points[0].time);\n const out: VwapSeries = { line: [], bands: [] };\n if (!coords || anchorSec == null) return out;\n const src = d.style.vwapSource ?? \"hlc3\";\n // TV calculate_stDev #k: only the enabled bands are computed.\n out.bands = (d.style.levels ?? VWAP_BAND_DEFAULTS).map((level, index) => ({ level, index, upper: [] as Pt[], lower: [] as Pt[] })).filter((b) => b.level.visible);\n const percent = d.style.vwapBandsMode === \"percent\";\n const bars = coords.bars();\n if (bars.length === 0) return out;\n const data = vwapData(d, bars, anchorSec, src);\n let first = data.start;\n let end = bars.length; // exclusive\n const vis = coords.visibleTimeRange();\n if (vis) {\n first = Math.max(first, firstIndexAtOrAfter(bars, vis.from) - 1);\n end = Math.min(end, firstIndexAtOrAfter(bars, vis.to) + 2);\n }\n for (let i = first; i < end; i++) {\n const k = i - data.start;\n const b = bars[i];\n const vwap = data.vwap[k];\n const x = coords.timeToX(b.time);\n const y = coords.priceToY(vwap);\n if (x == null || y == null) continue;\n out.line.push({ x, y });\n if (out.bands.length > 0) {\n // TV: Standard Deviation = mult x sigma; Percentage = mult x 1% of the\n // VWAP (checked live 25/09/2026: upper = vwap x 1.01 at mult 1).\n const unit = percent ? vwap * 0.01 : data.sd[k];\n for (const band of out.bands) {\n const yu = coords.priceToY(vwap + band.level.coeff * unit);\n const yl = coords.priceToY(vwap - band.level.coeff * unit);\n if (yu != null) band.upper.push({ x, y: yu });\n if (yl != null) band.lower.push({ x, y: yl });\n }\n }\n }\n return out;\n}\n\n/* ── Position forecast (LineToolPrediction) ──────────────────────────────────\n * The vector is a quarter ellipse centred at (source.x, target.y) with\n * rx = |dx|, ry = |dy| (chunk 176288 `_drawImpl`: ctx.ellipse(i.x, r.y, a, s)).\n * Status resolves against the bar AT the target's time\n * (`recalculateStateByData`): up → success once that bar's high touches the\n * target price, down → its low; a passed target bar that never touched fails;\n * a target still in the future keeps waiting. */\n\nexport type ForecastStatus = \"waiting\" | \"success\" | \"failure\";\n\n/** Quarter-ellipse polyline from `a` (source) to `b` (target). */\nexport function forecastArcSamples(a: Pt, b: Pt, n = 32): Pt[] {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n if (Math.abs(dx) < 1 || Math.abs(dy) < 1) return [a, b];\n const rx = Math.abs(dx);\n const ry = Math.abs(dy);\n // Canvas-angle endpoints (y down): θ0 lands on the source, θ1 on the target.\n const t0 = dy < 0 ? Math.PI / 2 : -Math.PI / 2;\n const t1 = dx > 0 ? 0 : (dy < 0 ? Math.PI : -Math.PI);\n const out: Pt[] = [];\n for (let i = 0; i <= n; i++) {\n const t = t0 + ((t1 - t0) * i) / n;\n out.push({ x: a.x + rx * Math.cos(t), y: b.y + ry * Math.sin(t) });\n }\n return out;\n}\n\nexport function forecastStatus(d: Drawing, coords: Coords | null): ForecastStatus {\n const p1 = d.points[1];\n if (!coords || !p1) return \"waiting\";\n const targetSec = timeToSec(p1.time);\n if (targetSec == null) return \"waiting\";\n const bars = coords.bars();\n if (bars.length === 0) return \"waiting\";\n const lastSec = timeToSec(bars[bars.length - 1].time);\n if (lastSec == null || targetSec > lastSec) return \"waiting\";\n // The bar covering the target time: last bar at or before it.\n let bar: OHLC | null = null;\n let isLast = false;\n for (let i = bars.length - 1; i >= 0; i--) {\n const ts = timeToSec(bars[i].time);\n if (ts != null && ts <= targetSec) {\n bar = bars[i];\n isLast = i === bars.length - 1;\n break;\n }\n }\n if (!bar) return \"waiting\";\n const up = p1.price > d.points[0].price;\n if (up ? bar.high >= p1.price : bar.low <= p1.price) return \"success\";\n return isLast ? \"waiting\" : \"failure\";\n}\n\n/** Volume profile over a bar range (TV anchored / fixed range VP defaults:\n * 24 rows over the bars' low…high, Up/Down volume, 70% value area).\n * Each bar's volume is spread over the rows its low–high range covers, in\n * proportion to the overlap (a zero-range bar goes to its row); a bar with\n * close ≥ open counts as up volume. Value area: start at the POC row and\n * add the neighbouring row (above or below) with more volume until 70% of\n * the total is reached. Returns null when the range holds no bars. */\nexport type VolumeProfile = {\n lo: number;\n hi: number;\n rows: { up: number; down: number }[];\n poc: number;\n vaFrom: number;\n vaTo: number;\n maxTotal: number;\n lastTime: Time;\n};\nexport function volumeProfile(bars: OHLC[], fromSec: number, toSec: number, rowCount = 24, vaShare = 0.7): VolumeProfile | null {\n const inRange = barsBetween(bars, fromSec, toSec);\n if (inRange.length === 0) return null;\n let lo = Infinity;\n let hi = -Infinity;\n for (const b of inRange) {\n lo = Math.min(lo, b.low);\n hi = Math.max(hi, b.high);\n }\n if (!(hi > lo)) hi = lo + 1e-9;\n const step = (hi - lo) / rowCount;\n const rows = Array.from({ length: rowCount }, () => ({ up: 0, down: 0 }));\n for (const b of inRange) {\n const v = b.volume ?? 0;\n if (v <= 0) continue;\n const up = b.close >= b.open;\n const span = b.high - b.low;\n if (span <= 0) {\n const r = Math.min(rowCount - 1, Math.max(0, Math.floor((b.close - lo) / step)));\n if (up) rows[r].up += v;\n else rows[r].down += v;\n continue;\n }\n const r0 = Math.max(0, Math.floor((b.low - lo) / step));\n const r1 = Math.min(rowCount - 1, Math.floor((b.high - lo) / step));\n for (let r = r0; r <= r1; r++) {\n const a = Math.max(b.low, lo + r * step);\n const c = Math.min(b.high, lo + (r + 1) * step);\n const share = c > a ? ((c - a) / span) * v : 0;\n if (up) rows[r].up += share;\n else rows[r].down += share;\n }\n }\n const tot = rows.map((r) => r.up + r.down);\n let poc = 0;\n for (let i = 1; i < rowCount; i++) if (tot[i] > tot[poc]) poc = i;\n const total = tot.reduce((s, x) => s + x, 0);\n let vaFrom = poc;\n let vaTo = poc;\n let acc = tot[poc];\n while (acc < total * vaShare && (vaFrom > 0 || vaTo < rowCount - 1)) {\n const below = vaFrom > 0 ? tot[vaFrom - 1] : -1;\n const above = vaTo < rowCount - 1 ? tot[vaTo + 1] : -1;\n if (above >= below) acc += tot[++vaTo];\n else acc += tot[--vaFrom];\n }\n return { lo, hi, rows, poc, vaFrom, vaTo, maxTotal: Math.max(...tot), lastTime: inRange[inRange.length - 1].time };\n}\n\n/** Anchored volume profile screen box: anchor x → last bar x, profile low →\n * high. Null without data. */\nexport function anchoredVpBox(d: Drawing, pts: Pt[], coords: Coords | null): { left: number; right: number; top: number; bottom: number; vp: VolumeProfile } | null {\n if (!coords) return null;\n const bars = coords.bars();\n if (bars.length === 0) return null;\n const t0 = timeToSec(d.points[0].time);\n const tLast = timeToSec(bars[bars.length - 1].time);\n if (t0 == null || tLast == null) return null;\n const vp = volumeProfile(bars, t0, tLast);\n if (!vp) return null;\n const xr = coords.timeToX(vp.lastTime);\n const yt = coords.priceToY(vp.hi);\n const yb = coords.priceToY(vp.lo);\n if (xr == null || yt == null || yb == null) return null;\n return { left: pts[0].x, right: xr, top: Math.min(yt, yb), bottom: Math.max(yt, yb), vp };\n}\n\n/** Fixed range volume profile screen box: the P0-P1 time span × the bars'\n * price range over that span. Null without data. */\nexport function fixedVpBox(d: Drawing, pts: Pt[], coords: Coords | null): { left: number; right: number; top: number; bottom: number; vp: VolumeProfile } | null {\n if (!coords || d.points.length < 2 || pts.length < 2) return null;\n const t0 = timeToSec(d.points[0].time);\n const t1 = timeToSec(d.points[1]!.time);\n if (t0 == null || t1 == null) return null;\n const vp = volumeProfile(coords.bars(), Math.min(t0, t1), Math.max(t0, t1));\n if (!vp) return null;\n const yt = coords.priceToY(vp.hi);\n const yb = coords.priceToY(vp.lo);\n if (yt == null || yb == null) return null;\n return { left: Math.min(pts[0].x, pts[1].x), right: Math.max(pts[0].x, pts[1].x), top: Math.min(yt, yb), bottom: Math.max(yt, yb), vp };\n}\n","/*\n * Fib speed resistance fan geometry (TV line-tool-fib-speed-resistance-fan\n * pane view, module 716813), shared by the renderer and the hit test.\n * price levels: y of p1.price + coeff * (p0.price - p1.price) (0 = p1, 1 = p0)\n * time levels: x of bar round(p1.index + coeff * (p0.index - p1.index))\n * grid: one horizontal line per price level and one vertical line per time\n * level, inside the p0-p1 box; rays from p0 through (p1.x, level y) and\n * (level x, p1.y), extended past the level point.\n * Separate lists like TV: `levels` = price levels (hlevel), `vLevels` = time\n * levels (vlevel; drawings saved before 25/09/2026 use `levels` for both).\n * Reverse (TV): the levels count from p0 instead of p1\n * price = base + coeff * span, base = reverse ? p0 : p1, span = the other\n * end minus the base (same for the bar index).\n */\nimport type { Coords } from \"../coords\";\nimport type { Drawing, LevelDef } from \"../types\";\nimport type { Pt } from \"../_shared\";\n\nexport type SpeedFanLevel = { coeff: number; color: string };\nexport type SpeedFanGeometry = {\n /** Price levels (visible, in level order) with their screen y. */\n h: (SpeedFanLevel & { y: number })[];\n /** Time levels (visible, in level order) with their screen x. */\n v: (SpeedFanLevel & { x: number })[];\n box: { left: number; top: number; right: number; bottom: number };\n};\n\nexport function speedFanGeometry(d: Drawing, pts: Pt[], coords: Coords | null, fallback: LevelDef[]): SpeedFanGeometry {\n const [a, b] = pts;\n const hLevels = (d.style.levels ?? fallback).filter((l) => l.visible);\n const vLevels = (d.style.vLevels ?? d.style.levels ?? fallback).filter((l) => l.visible);\n const rev = !!d.style.reverse;\n const p0 = d.points[0];\n const p1 = d.points[1] ?? d.points[0];\n const baseP = rev ? p0.price : p1.price;\n const spanP = rev ? p1.price - p0.price : p0.price - p1.price;\n const baseY = rev ? a.y : b.y;\n const spanY = rev ? b.y - a.y : a.y - b.y;\n const h = hLevels.map((l) => {\n const y = coords?.priceToY(baseP + l.coeff * spanP) ?? baseY + l.coeff * spanY;\n return { coeff: l.coeff, color: l.color, y };\n });\n const i0 = coords?.timeToBarIndex(p0.time) ?? null;\n const i1 = coords?.timeToBarIndex(p1.time) ?? null;\n const baseX = rev ? a.x : b.x;\n const spanX = rev ? b.x - a.x : a.x - b.x;\n const v = vLevels.map((l) => {\n let x: number | null = null;\n if (coords && i0 != null && i1 != null) {\n const t = coords.barIndexToTime(Math.round((rev ? i0 : i1) + l.coeff * (rev ? i1 - i0 : i0 - i1)));\n x = t != null ? coords.timeToX(t) : null;\n }\n return { coeff: l.coeff, color: l.color, x: x ?? baseX + l.coeff * spanX };\n });\n return {\n h,\n v,\n box: { left: Math.min(a.x, b.x), top: Math.min(a.y, b.y), right: Math.max(a.x, b.x), bottom: Math.max(a.y, b.y) },\n };\n}\n\n/** Ray from `a` through `t`, extended past `t` far enough to leave a pane of\n * size w x h (TV TrendLineRenderer extendright, clipped by the SVG). */\nexport function extendRay(a: Pt, t: Pt, w: number, h: number): Pt {\n const dx = t.x - a.x;\n const dy = t.y - a.y;\n const len = Math.hypot(dx, dy);\n if (len < 1e-9) return t;\n const k = Math.max(1, (2 * (w + h)) / len);\n return { x: a.x + dx * k, y: a.y + dy * k };\n}\n","/*\n * Bars pattern geometry (TV line-tool-bars-pattern pane view, module\n * 432434), shared by the renderer and the hit test. The frozen bars\n * (`d.pattern`) are spread evenly between the two points (spacing\n * |x0 − x1| / (n − 1)); prices map through c(p) = priceToY(p) · scale,\n * scale = the points' pixel height / the pattern's first-to-last pixel\n * height, shifted so the first pattern price sits on the left point.\n * Mirrored inverts the prices around the pattern's middle, flipped reverses\n * the order; each toggle swaps the two points' prices (TV\n * `_switchPointsPrice`), so the effective prices swap when exactly one is on.\n */\nimport type { Coords } from \"../coords\";\nimport type { Drawing } from \"../types\";\nimport type { Pt } from \"../_shared\";\n\n/** TV modes: HL bars, OC bars and the five line sources. */\nexport const BAR_PATTERN_MODES = [\"bars\", \"oc\", \"line\", \"line-open\", \"line-high\", \"line-low\", \"line-hl2\"] as const;\nexport type BarPatternMode = (typeof BAR_PATTERN_MODES)[number];\ntype Bar = [number, number, number, number];\n\n/** Rendered prices of one pattern bar [o, h, l, c] by mode (TV table `b`). */\nfunction patternBarPrices(bar: Bar, mode: BarPatternMode): number[] {\n const [o, h, l, c] = bar;\n switch (mode) {\n case \"bars\": return [h, l];\n case \"oc\": return [o, c];\n case \"line\": return [c];\n case \"line-open\": return [o];\n case \"line-high\": return [h];\n case \"line-low\": return [l];\n default: return [(h + l) / 2];\n }\n}\n\n/** TV firstPatternPrice / lastPatternPrice (tables `_e` / `Pe`, swapped when\n * flipped). */\nfunction patternEdgePrice(bar: Bar, mode: BarPatternMode, first: boolean, flipped: boolean): number {\n const [o, h, l, c] = bar;\n if (mode === \"line-hl2\") return (h + l) / 2;\n const useFirst = first !== flipped;\n switch (mode) {\n case \"bars\": return useFirst ? h : l;\n case \"oc\": return useFirst ? o : c;\n case \"line\": return c;\n case \"line-open\": return o;\n case \"line-high\": return h;\n default: return l;\n }\n}\n\nexport type BarsPatternGeometry = {\n lineMode: boolean;\n /** HL / OC modes: one 2px bar per pattern bar (x centre, top / bottom y). */\n bars: { x: number; top: number; bottom: number }[];\n /** Line modes: the polyline vertices. */\n line: Pt[];\n};\n\n/** Screen geometry of a bars pattern, or null without a snapshot / data. */\nexport function barsPatternGeometry(d: Drawing, pts: Pt[], coords: Coords | null): BarsPatternGeometry | null {\n if (d.kind !== \"bar-pattern\" || !coords) return null;\n const rows0 = d.pattern?.bars ?? [];\n if (rows0.length === 0 || pts.length < 2) return null;\n const s = d.style;\n const [pa, pb] = pts;\n const mode: BarPatternMode = (BAR_PATTERN_MODES as readonly string[]).includes(s.patternMode ?? \"\") ? (s.patternMode as BarPatternMode) : \"bars\";\n let rows: Bar[] = rows0;\n if (s.mirrored) {\n let lo = Infinity;\n let hi = -Infinity;\n for (const r of rows) { lo = Math.min(lo, r[2], r[1]); hi = Math.max(hi, r[1], r[2]); }\n if (lo < hi) {\n const m = (lo + hi) / 2;\n const inv = (v: number) => m - (v - m);\n rows = rows.map(([o, h, l, c]) => [inv(o), inv(h), inv(l), inv(c)] as Bar);\n }\n }\n if (s.flipped) rows = [...rows].reverse();\n const swap = !!s.mirrored !== !!s.flipped;\n const price0 = swap ? d.points[1].price : d.points[0].price;\n const price1 = swap ? d.points[0].price : d.points[1].price;\n const y0 = coords.priceToY(price0);\n const y1 = coords.priceToY(price1);\n const firstP = patternEdgePrice(rows[0], mode, true, !!s.flipped);\n const lastP = patternEdgePrice(rows[rows.length - 1], mode, false, !!s.flipped);\n const yf = coords.priceToY(firstP);\n const yl = coords.priceToY(lastP);\n if (y0 == null || y1 == null || yf == null || yl == null) return null;\n const scale = yl !== yf ? +((y1 - y0) / (yl - yf)).toFixed(8) : 1;\n const c = (p: number) => (coords.priceToY(p) ?? 0) * scale;\n const i0 = coords.timeToBarIndex(d.points[0].time);\n const i1 = coords.timeToBarIndex(d.points[1].time);\n const leftIsP0 = i0 == null || i1 == null || i0 <= i1;\n const g = leftIsP0 ? { x: pa.x, y: y0 } : { x: pb.x, y: y1 };\n const n = rows.length;\n const step = n > 1 ? Math.abs(pa.x - pb.x) / (n - 1) : 0;\n const shift = g.y - c(firstP);\n const xs = rows.map((_, t) => Math.round(g.x + t * step + 0.5));\n const lineMode = mode !== \"bars\" && mode !== \"oc\";\n if (lineMode) {\n return { lineMode, bars: [], line: rows.map((r, t) => ({ x: xs[t], y: Math.round(c(patternBarPrices(r, mode)[0])) + shift })) };\n }\n return {\n lineMode,\n line: [],\n bars: rows.map((r, t) => {\n const [pA, pB] = patternBarPrices(r, mode);\n const ya = Math.round(c(pA)) + shift;\n const yb = Math.round(c(pB)) + shift;\n return { x: xs[t], top: Math.min(ya, yb), bottom: Math.max(ya, yb) };\n }),\n };\n}\n","/*\n * Arrow mark text box (TV line-tool-arrow-mark text renderer, module\n * 501042 + TextRenderer 385034), shared by the renderer and the hit test.\n * Box = the widest line + 2 · padding (fs / 3), rounded up to an even width;\n * height = lines · ceil(fs) + 2 · padding; centred on the point, its top 20px\n * below an up arrow, its bottom 20px above a down arrow. TV hit-tests the\n * text inside this box.\n */\nimport type { Drawing } from \"../types\";\nimport type { Pt } from \"../_shared\";\n\nlet ctx: CanvasRenderingContext2D | null = null;\nfunction textWidth(text: string, font: string): number {\n if (!ctx) ctx = document.createElement(\"canvas\").getContext(\"2d\");\n if (!ctx) return text.length * 8;\n ctx.font = font;\n return ctx.measureText(text).width;\n}\n\nexport type ArrowMarkTextBox = { left: number; top: number; width: number; height: number; lines: string[]; lineH: number; pad: number };\n\nexport function arrowMarkTextBox(d: Drawing, c: Pt): ArrowMarkTextBox | null {\n const text = d.text ?? \"\";\n if (text === \"\" || (d.kind !== \"arrow-mark-up\" && d.kind !== \"arrow-mark-down\")) return null;\n const s = d.style;\n const fs = s.fontSize ?? 14;\n const pad = fs / 3;\n const lineH = Math.ceil(fs);\n const lines = text.split(\"\\n\");\n const font = `${s.italic ? \"italic \" : \"\"}${s.bold ? \"bold \" : \"\"}${fs}px ${getComputedStyle(document.body).fontFamily}`;\n let width = Math.round(Math.max(...lines.map((l) => textWidth(l, font))) + 2 * pad);\n if (width % 2) width += 1;\n const height = lines.length * lineH + 2 * pad;\n const top = d.kind === \"arrow-mark-up\" ? c.y + 20 : c.y - 20 - height;\n return { left: c.x - width / 2, top, width, height, lines, lineH, pad };\n}\n","/*\n * TV Table tool (line-tool-table, module 995743): one point (top-left), a grid\n * of cells whose sizes are screen px (the table moves with its point but does\n * not scale with zoom). Pure TS layout + the TV resize rules, shared by the\n * overlay renderer, the hit test and the drag code.\n */\nimport type { Drawing, DrawingStyle } from \"../types\";\nimport type { Pt } from \"../_shared\";\nimport { measureTextStyled, tvWordWrap } from \"./tv-text\";\n\n/** TV table constants (enum T): CellPadding 8, CellBorderWidth 1,\n * CellActiveLineWidth 2, CellDefaultWidth 120, CellDefaultHeight 0 (auto),\n * TextDefaultSize 14, LineHeight 1.3. */\nexport const TABLE_PAD = 8;\nexport const TABLE_BORDER = 1;\nexport const TABLE_ACTIVE_LINE = 2;\nexport const TABLE_CELL_WIDTH = 120;\nexport const TABLE_LINE_HEIGHT = 1.3;\n/** TV colorTvBlue500 (active cell border) and its 20% alpha (hovered edge). */\nexport const TABLE_ACTIVE_COLOR = \"#2962ff\";\nexport const TABLE_EDGE_COLOR = \"rgba(41, 98, 255, 0.2)\";\n/** TV interactionTolerance().line for a mouse. */\nexport const TABLE_EDGE_TOL = 3;\n/** TV ResizeVirtualAnchorBase: edge anchors are base + (row+1)·base + (col+1),\n * row / col 0 = none (functions ae / re). */\nexport const TABLE_EDGE_BASE = 1024;\n\nexport type TableCellRef = [row: number, col: number];\nexport type TableEdge = { row: number | null; col: number | null };\n\nexport function tableEdgeIndex(e: TableEdge): number {\n return TABLE_EDGE_BASE + (e.row == null ? 0 : e.row + 1) * TABLE_EDGE_BASE + (e.col == null ? 0 : e.col + 1);\n}\nexport function tableEdgeOf(index: number): TableEdge | null {\n if (index < TABLE_EDGE_BASE) return null;\n const t = index - TABLE_EDGE_BASE;\n const r = Math.floor(t / TABLE_EDGE_BASE);\n const c = t % TABLE_EDGE_BASE;\n return { row: r === 0 ? null : r - 1, col: c === 0 ? null : c - 1 };\n}\n\nexport function tableCells(s: DrawingStyle): string[][] {\n return s.tableCells ?? [[\"\", \"\", \"\"], [\"\", \"\", \"\"], [\"\", \"\", \"\"]];\n}\nexport function tableColWidths(s: DrawingStyle): number[] {\n const n = tableCells(s)[0]?.length ?? 0;\n const w = s.tableColWidths ?? [];\n return Array.from({ length: n }, (_, i) => w[i] ?? TABLE_CELL_WIDTH);\n}\nexport function tableRowHeightsStored(s: DrawingStyle): number[] {\n const n = tableCells(s).length;\n const h = s.tableRowHeights ?? [];\n return Array.from({ length: n }, (_, i) => h[i] ?? 0);\n}\nconst fontSizeOf = (s: DrawingStyle) => s.fontSize ?? 14;\nconst zeroWidth = (fs: number) => measureTextStyled(\"0\", fs, false, false);\n\n/** TV H: minimum column width = width(\"0\") + 2·padding + 2·border. */\nexport function tableMinColWidth(fs: number): number {\n return zeroWidth(fs) + 2 * TABLE_PAD + 2 * TABLE_BORDER;\n}\n/** TV W: minimum row height = fs + 2·padding + border. */\nexport function tableMinRowHeight(fs: number): number {\n return fs + 2 * TABLE_PAD + TABLE_BORDER;\n}\n/** TV I: the word-wrap width of a column. */\nexport function tableWrapWidth(colW: number, fs: number): number {\n return Math.max(colW - 2 * TABLE_PAD - 2 * TABLE_BORDER, zeroWidth(fs));\n}\n/** Wrapped lines of a cell (TV wordWrap: an empty text has no line). */\nexport function tableCellLines(text: string, colW: number, fs: number): string[] {\n if (text === \"\") return [];\n return tvWordWrap(text, fs, false, false, tableWrapWidth(colW, fs));\n}\n/** TV A: the height a cell text needs. */\nfunction textHeight(n: number, fs: number): number {\n return n * fs + (n - 1) * fs * (TABLE_LINE_HEIGHT - 1) + 2 * TABLE_PAD + 2 * TABLE_BORDER;\n}\n\n/** TV rowHeights(): each row = max(stored, minimum, every cell text height);\n * `mins` = max(minimum, text heights) (the resize floor). */\nexport function tableRowHeights(s: DrawingStyle, cells = tableCells(s), widths = tableColWidths(s)): { heights: number[]; mins: number[] } {\n const fs = fontSizeOf(s);\n const stored = tableRowHeightsStored(s);\n const mins: number[] = [];\n const heights = stored.map((h, r) => {\n let m = tableMinRowHeight(fs);\n for (let c = 0; c < widths.length; c++) m = Math.max(m, textHeight(tableCellLines(cells[r]?.[c] ?? \"\", widths[c], fs).length, fs));\n mins.push(m);\n return Math.max(h, m);\n });\n return { heights, mins };\n}\n\nexport type TableLayout = {\n left: number;\n top: number;\n right: number;\n bottom: number;\n /** Cell edges: xs[c]..xs[c+1] for column c, ys[r]..ys[r+1] for row r\n * (TV D: cumulative from the point, each rounded). */\n xs: number[];\n ys: number[];\n cells: string[][];\n lines: string[][][];\n fs: number;\n};\n\nexport function tableLayout(d: Drawing, p: Pt): TableLayout {\n const s = d.style;\n const fs = fontSizeOf(s);\n const cells = tableCells(s);\n const widths = tableColWidths(s);\n const { heights } = tableRowHeights(s, cells, widths);\n const xs = [Math.round(p.x)];\n let acc = 0;\n for (const w of widths) { acc += w; xs.push(Math.round(p.x + acc)); }\n const ys = [Math.round(p.y)];\n acc = 0;\n for (const h of heights) { acc += h; ys.push(Math.round(p.y + acc)); }\n const lines = cells.map((row) => row.map((t, c) => tableCellLines(t, widths[c], fs)));\n return { left: xs[0], top: ys[0], right: xs[xs.length - 1], bottom: ys[ys.length - 1], xs, ys, cells, lines, fs };\n}\n\n/** The 4 anchors (TV order TopLeft, BottomLeft, TopRight, BottomRight). */\nexport function tableAnchors(l: TableLayout): Pt[] {\n return [\n { x: l.left, y: l.top },\n { x: l.left, y: l.bottom },\n { x: l.right, y: l.top },\n { x: l.right, y: l.bottom },\n ];\n}\n\n/** TV renderer hitTest: while selected, a row bottom / column right edge\n * (± line tolerance) is a resize anchor; then a cell (body, with its index);\n * then the table box. */\nexport function tableHitCell(l: TableLayout, cur: Pt, selected: boolean): { edge: TableEdge } | { cell: TableCellRef } | null {\n if (selected) {\n let row: number | null = null;\n let col: number | null = null;\n if (cur.x >= l.left && cur.x <= l.right) {\n for (let r = 0; r < l.ys.length - 1; r++) if (Math.abs(cur.y - l.ys[r + 1]) <= TABLE_EDGE_TOL) { row = r; break; }\n }\n if (cur.y >= l.top && cur.y <= l.bottom) {\n for (let c = 0; c < l.xs.length - 1; c++) if (Math.abs(cur.x - l.xs[c + 1]) <= TABLE_EDGE_TOL) { col = c; break; }\n }\n if (row != null || col != null) return { edge: { row, col } };\n }\n for (let r = 0; r < l.ys.length - 1; r++) {\n for (let c = 0; c < l.xs.length - 1; c++) {\n if (cur.x >= l.xs[c] && cur.x <= l.xs[c + 1] && cur.y >= l.ys[r] && cur.y <= l.ys[r + 1]) return { cell: [r, c] };\n }\n }\n return null;\n}\n\n/** TV $e: scale `sizes` to `total`, keeping each at least its minimum\n * (sizes already at their minimum stay fixed when shrinking). */\nexport function distributeSizes(sizes: number[], mins: number[], total: number): number[] {\n const sum = (a: number[]) => a.reduce((x, y) => x + y, 0);\n let o = sum(sizes);\n let t = Math.max(total, sum(mins));\n if (o === t) return [...sizes];\n if (t < o) for (let i = 0; i < sizes.length; i++) if (sizes[i] === mins[i]) { o -= sizes[i]; t -= sizes[i]; }\n const k = t / o;\n const r = sizes.map((v, i) => Math.max(mins[i], v * k));\n return sum(r) > t + 0.01 ? distributeSizes(r, mins, total) : r;\n}\n\n/** The active cell of the selected table (blue 2px border), whether its text\n * editor is open, and the hovered resize edge (host UI state; one table at\n * a time, like TV). */\nexport type TableUi = { id: string; cell: TableCellRef | null; editing: boolean; edge: TableEdge | null };\n\n// ── Cell operations (TV insertCells / removeCells) ──────────────────────────\nexport type TableOp = \"row\" | \"column\";\n\n/** TV insertCells: a column right of the active cell (else at the end, width\n * 120) or a row below it (else at the end, auto height). */\nexport function tableInsert(s: DrawingStyle, op: TableOp, at: TableCellRef | null): Partial<DrawingStyle> {\n const cells = tableCells(s).map((r) => [...r]);\n const widths = tableColWidths(s);\n const heights = tableRowHeightsStored(s);\n const [r0, c0] = at ?? [cells.length - 1, (cells[0]?.length ?? 1) - 1];\n if (op === \"row\") {\n const i = r0 + 1;\n cells.splice(i, 0, new Array(widths.length).fill(\"\"));\n heights.splice(i, 0, 0);\n } else {\n const i = c0 + 1;\n for (const row of cells) row.splice(i, 0, \"\");\n widths.splice(i, 0, TABLE_CELL_WIDTH);\n }\n return { tableCells: cells, tableColWidths: widths, tableRowHeights: heights };\n}\n\n/** TV isRemoveCellsAvailable: never removes the last row / column. */\nexport function tableCanRemove(s: DrawingStyle, op: TableOp): boolean {\n const cells = tableCells(s);\n return op === \"row\" ? cells.length > 1 : (cells[0]?.length ?? 0) > 1;\n}\n\n/** TV removeCells: drops the active cell's row / column; the active cell is\n * clamped to the new grid. */\nexport function tableRemove(s: DrawingStyle, op: TableOp, at: TableCellRef): { patch: Partial<DrawingStyle>; cell: TableCellRef } {\n const cells = tableCells(s).map((r) => [...r]);\n const widths = tableColWidths(s);\n const heights = tableRowHeightsStored(s);\n const [r0, c0] = at;\n if (op === \"row\") {\n cells.splice(r0, 1);\n heights.splice(r0, 1);\n } else {\n for (const row of cells) row.splice(c0, 1);\n widths.splice(c0, 1);\n }\n const cell: TableCellRef = [Math.min(r0, cells.length - 1), Math.min(c0, widths.length - 1)];\n return { patch: { tableCells: cells, tableColWidths: widths, tableRowHeights: heights }, cell };\n}\n\n/** TV switchActiveCell: the next (Tab) / previous (Shift+Tab) cell, row-major,\n * wrapping around the table. */\nexport function tableNextCell(s: DrawingStyle, at: TableCellRef, back: boolean): TableCellRef {\n const cells = tableCells(s);\n const cols = cells[0]?.length ?? 1;\n const n = cols * cells.length;\n const k = (at[0] * cols + at[1] + (back ? n - 1 : 1)) % n;\n return [Math.floor(k / cols) % cells.length, k % cols];\n}\n\n/** The same table with one cell's text replaced. */\nexport function tableWithText(s: DrawingStyle, at: TableCellRef, text: string): Partial<DrawingStyle> {\n const cells = tableCells(s).map((r) => [...r]);\n if (cells[at[0]]) cells[at[0]][at[1]] = text;\n return { tableCells: cells };\n}\n","/*\n * Drawing images (TV Image tool). The image file lives in the app data folder\n * (Rust commands save_drawing_image / read_drawing_image, named by content\n * hash); the drawing stores only that name. This module loads each image\n * once into a blob URL + natural size cache; `imagesVersion()` bumps when an\n * image finishes loading so renderers re-read the cache.\n */\nimport type { Drawing } from \"../types\";\nimport type { Pt } from \"../_shared\";\n\nexport type LoadedImage = { url: string; width: number; height: number };\n\n/** TV limits (line-tool-image module 117820): JPG, PNG or WEBP; 2 MB; images\n * larger than 2000 x 2000 are not drawn. */\nexport const IMAGE_MAX_BYTES = 2_000_000;\nexport const IMAGE_MAX_SIDE = 2000;\nexport const IMAGE_TYPES: Record<string, string> = { \"image/png\": \"png\", \"image/jpeg\": \"jpg\", \"image/webp\": \"webp\" };\n\nconst cache = new Map<string, LoadedImage | \"loading\" | \"error\">();\n\n/** Host hooks: how to read a stored image (OpenTrader: its Rust command),\n * and who to tell when an image finished loading (renderers re-read). */\nlet readImage: (name: string) => Promise<Blob> = () => Promise.reject(new Error(\"no image reader\"));\nconst listeners = new Set<() => void>();\nexport function setImageReader(fn: (name: string) => Promise<Blob>): void {\n readImage = fn;\n}\nexport function onImagesChanged(fn: () => void): () => void {\n listeners.add(fn);\n return () => listeners.delete(fn);\n}\nfunction changed(): void {\n for (const fn of listeners) fn();\n}\n\n/** MIME type of a stored image name (by extension). */\nexport const imageMimeOf = (name: string) => (name.endsWith(\".png\") ? \"image/png\" : name.endsWith(\".webp\") ? \"image/webp\" : \"image/jpeg\");\n\nexport function decodeImage(url: string): Promise<LoadedImage> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve({ url, width: img.naturalWidth, height: img.naturalHeight });\n img.onerror = () => reject(new Error(\"image decode failed\"));\n img.src = url;\n });\n}\n\n/** The loaded image for a stored name, or null while loading / on error\n * (starts the load on first use). Read `imagesVersion()` to react. */\nexport function drawingImage(name: string | undefined): LoadedImage | null {\n if (!name) return null;\n const hit = cache.get(name);\n if (hit && hit !== \"loading\" && hit !== \"error\") return hit;\n if (!hit) {\n cache.set(name, \"loading\");\n void readImage(name)\n .then((blob) => decodeImage(URL.createObjectURL(blob)))\n .then(\n (img) => cache.set(name, img),\n (e) => {\n cache.set(name, \"error\");\n console.warn(\"[image] read failed:\", e);\n },\n )\n .then(changed);\n }\n return null;\n}\n\n/** True when the stored file could not be read or decoded (TV removes an\n * image drawing whose image fails to load). */\nexport function drawingImageFailed(name: string | undefined): boolean {\n return !!name && cache.get(name) === \"error\";\n}\n\n/** TV image box (module line-tool-image `_calculateBox`, origin Centre): the\n * point is the image centre, the size is cssWidth x cssHeight screen px.\n * `dx` is the transient x offset kept during a corner drag (TV dOffsetX).\n * Null while the image is not loaded or larger than 2000 x 2000 (TV draws\n * nothing then). */\nexport function imageBox(d: Drawing, c: Pt): { left: number; top: number; right: number; bottom: number } | null {\n const im = d.image;\n const img = drawingImage(im?.name);\n if (!im || !img || img.width > IMAGE_MAX_SIDE || img.height > IMAGE_MAX_SIDE) return null;\n const x = c.x + (im.dx ?? 0);\n return { left: x - im.cssWidth / 2, top: c.y - im.cssHeight / 2, right: x + im.cssWidth / 2, bottom: c.y + im.cssHeight / 2 };\n}\n\n/** The 4 anchors inset 1px (TV order LeftTop, RightTop, LeftBottom,\n * RightBottom). */\nexport function imageAnchors(b: { left: number; top: number; right: number; bottom: number }): Pt[] {\n return [\n { x: b.left + 1, y: b.top + 1 },\n { x: b.right - 1, y: b.top + 1 },\n { x: b.left + 1, y: b.bottom - 1 },\n { x: b.right - 1, y: b.bottom - 1 },\n ];\n}\n/** Anchor direction from the centre (TV _correctOriginDirections). */\nexport const IMAGE_ANCHOR_DIRS: [number, number][] = [[-1, -1], [1, -1], [-1, 1], [1, 1]];\n\n/** TV initial size: natural size scaled down to fit a quarter of the pane\n * (time scale width / 4, pane height / 4), never scaled up, rounded. */\nexport function imageInitialSize(natW: number, natH: number, paneW: number, paneH: number): { cssWidth: number; cssHeight: number } {\n const k = Math.min(Math.min(1, paneW / 4 / natW), Math.min(1, paneH / 4 / natH));\n return { cssWidth: Math.round(k * natW), cssHeight: Math.round(k * natH) };\n}\n\n/** Put an image the host just stored into the cache (no reload). */\nexport function cacheImage(name: string, img: LoadedImage): void {\n if (!cache.has(name) || cache.get(name) === \"error\") cache.set(name, img);\n changed();\n}\n","/*\n * TV text tool geometry (pure TS), shared by the overlay renderers and the\n * hit tests. Sources: TV bundles line-tool-text, line-tool-comment,\n * line-tool-note (pin), line-tool-price-label, line-tool-callout (research\n * copies in .tmp/tv-bundles, 10/07/2026; checked against TV 3.4.1 screenshots\n * 25/09/2026, research/drawings-gap/captures/dialog-fix).\n */\nimport type { Drawing, DrawingStyle } from \"../types\";\nimport type { Pt } from \"../_shared\";\nimport { measureTextStyled, tvTextLayout, tvWordWrap } from \"./tv-text\";\n\n/** TV placeholder of an empty text tool (\"Add text\", drawn at 50%). */\nexport const TEXT_TOOL_PLACEHOLDER = \"Add text\";\n\n/** Placeholder text per annotation tool (the inline editor's hint, and the\n * note's faint text when empty). */\nexport const TEXT_PLACEHOLDER: Record<string, string> = {\n text: \"Text\", note: \"Add text\", pin: \"Note\", comment: \"Comment\", \"price-note\": \"Price note\",\n signpost: \"Signpost\", callout: \"Callout\",\n};\n/** Resolved annotation text + whether it's the faint placeholder fallback. */\nexport function annText(d: Drawing): { txt: string; faint: boolean } {\n const has = !!(d.text && d.text.length > 0);\n return { txt: has ? d.text! : (TEXT_PLACEHOLDER[d.kind] ?? \"Text\"), faint: !has };\n}\n\n/** Note (TV LineToolTextNote) text box at P1: text width + 16 by fs + 12\n * (padding 8 x 6). The box side follows the P0 → P1 direction (TV\n * alignByAngle): up → centred above P1, right → starts at P1, down →\n * centred below P1, left → ends at P1. Shared by the scene and the hit\n * test. */\nexport function noteLayout(d: Drawing, s: DrawingStyle, a: Pt, b: Pt) {\n const { txt, faint } = annText(d);\n const fs = s.fontSize ?? 14;\n const boxW = measureTextStyled(txt, fs, false, false) + 16;\n const boxH = fs + 12;\n const ang = Math.round((180 * Math.atan2(b.y - a.y, b.x - a.x)) / Math.PI);\n let x = b.x;\n let y = b.y - boxH / 2;\n if (ang >= -135 && ang <= -45) {\n x = b.x - boxW / 2;\n y = b.y - boxH;\n } else if (ang > -45 && ang < 45) {\n x = b.x;\n } else if (ang >= 45 && ang <= 135) {\n x = b.x - boxW / 2;\n y = b.y;\n } else {\n x = b.x - boxW;\n }\n return { txt, faint, fs, box: { left: x, top: y, width: boxW, height: boxH } };\n}\nexport function toolText(d: Drawing): { text: string; faint: boolean } {\n return d.text ? { text: d.text, faint: false } : { text: TEXT_TOOL_PLACEHOLDER, faint: true };\n}\n\n/** TV text (LineToolText): TextRenderer box with its top-left at the point,\n * padding fs / 6, word wrap at wordWrapWidth (box = wrap width wide). */\nexport function textToolLayout(d: Drawing, p: Pt) {\n const s = d.style;\n const fs = s.fontSize ?? 14;\n const pad = fs / 6;\n return tvTextLayout({\n x: p.x,\n y: p.y,\n text: toolText(d).text,\n fs,\n bold: s.bold,\n italic: s.italic,\n vert: \"top\",\n horz: \"left\",\n padV: pad,\n padH: pad,\n wrapWidth: s.wordWrap ? s.wordWrapWidth ?? 200 : undefined,\n boxWidthFromWrap: true,\n });\n}\n\n/** TV comment: text box above-right of the point (vert Bottom, horz Left),\n * padding round(fs / 1.3) x 12; the balloon is that box as a rounded rect\n * with radius min(width, fs + 2 padV) / 2 and a 2px corner at the point. */\nexport function commentLayout(d: Drawing, p: Pt) {\n const s = d.style;\n const fs = s.fontSize ?? 16;\n const padV = Math.round(fs / 1.3);\n const l = tvTextLayout({ x: p.x, y: p.y, text: toolText(d).text, fs, vert: \"bottom\", horz: \"left\", padV, padH: 12 });\n const r = Math.min(l.box.width, fs + 2 * padV) / 2;\n return { l, r };\n}\n/** SVG path of a rounded rect with corner radii [tl, tr, br, bl]. */\nexport function roundRectPath(x: number, y: number, w: number, h: number, [tl, tr, br, bl]: [number, number, number, number]): string {\n return `M ${x + tl} ${y} H ${x + w - tr} A ${tr} ${tr} 0 0 1 ${x + w} ${y + tr} V ${y + h - br} A ${br} ${br} 0 0 1 ${x + w - br} ${y + h} H ${x + bl} A ${bl} ${bl} 0 0 1 ${x} ${y + h - bl} V ${y + tl} A ${tl} ${tl} 0 0 1 ${x + tl} ${y} Z`;\n}\n\n/** TV pin marker (24 x 30 svg, tip at the point). */\nexport const PIN_MARKER_PATH = \"m12 30 .88-.77C20.25 22.73 24 17.07 24 12.09 24 5.04 18.54 0 12 0S0 5.04 0 12.1c0 4.97 3.75 10.64 11.12 17.13L12 30Zm0-13a5 5 0 1 0 0-10 5 5 0 0 0 0 10Z\";\n/** TV pin tooltip (shown on hover / selection): 236px wide (pane width at\n * most) with 10px margins, 12px padding, 5px line spacing, 13px from the\n * marker; above the marker with the caret at the bottom, else below with\n * the caret on top; no caret within 24px of a pane side. */\nexport function pinLayout(d: Drawing, p: Pt, paneW: number) {\n const s = d.style;\n const fs = s.fontSize ?? 14;\n const width = Math.min(236, paneW);\n const lines = tvWordWrap(toolText(d).text, fs, !!s.bold, !!s.italic, width - 24);\n let height = lines.length * fs + 24;\n if (lines.length > 1) height += 5 * (lines.length - 1);\n let left = Math.round(p.x - width / 2);\n let top = Math.round(p.y - 30 - height - 13);\n const edge = p.x < 24 || p.x + 24 > paneW;\n let caret: \"top\" | \"bottom\" | null = edge ? null : \"top\";\n if (top < 10) top = p.y + 13;\n else if (!edge) caret = \"bottom\";\n if (left < 10) left = 10;\n else if (left + width + 10 > paneW) left = paneW - width - 10;\n return { fs, width, height, left, top, lines, caret, marker: { left: p.x - 12, top: p.y - 30, right: p.x + 12, bottom: p.y } };\n}\n/** Tooltip outline (TV `z`): radius 4 box with a 12 x 10 caret at the\n * marker x on the side facing the marker. */\nexport function pinTooltipPath(t: ReturnType<typeof pinLayout>, x: number): string {\n const { left: l, top: tp, width: w, height: h, caret } = t;\n const r = 4;\n const c0 = x - 6, c1 = x + 6;\n let d = `M ${l} ${tp + r} A ${r} ${r} 0 0 1 ${l + r} ${tp}`;\n if (caret === \"top\") d += ` L ${c0} ${tp} L ${x} ${tp - 10} L ${c1} ${tp}`;\n d += ` L ${l + w - r} ${tp} A ${r} ${r} 0 0 1 ${l + w} ${tp + r} L ${l + w} ${tp + h - r} A ${r} ${r} 0 0 1 ${l + w - r} ${tp + h}`;\n if (caret === \"bottom\") d += ` L ${c1} ${tp + h} L ${x} ${tp + h + 10} L ${c0} ${tp + h}`;\n d += ` L ${l + r} ${tp + h} A ${r} ${r} 0 0 1 ${l} ${tp + h - r} Z`;\n return d;\n}\n\n/** TV price label: box (text + 20) x (fs + 10), bottom-left 9px right of\n * and 15px above the point, tail from the box to the point. */\nexport function priceLabelLayout(label: string, p: Pt, fs: number) {\n const w = measureTextStyled(label, fs, true, false) + 20;\n const h = fs + 10;\n const x = p.x + 9;\n const y = p.y - (h + 15);\n return { x, y, w, h, fs };\n}\nexport function priceLabelPath(b: ReturnType<typeof priceLabelLayout>): string {\n const { x, y, w, h } = b;\n const r = 3;\n return `M ${x + 12} ${y + h} L ${x - 9} ${y + h + 15} L ${x + 5} ${y + h} L ${x + r} ${y + h} A ${r} ${r} 0 0 1 ${x} ${y + h - r} L ${x} ${y + r} A ${r} ${r} 0 0 1 ${x + r} ${y} L ${x + w - r} ${y} A ${r} ${r} 0 0 1 ${x + w} ${y + r} L ${x + w} ${y + h - r} A ${r} ${r} 0 0 1 ${x + w - r} ${y + h} Z`;\n}\n\n/** TV callout: box centred at p1, (text width + 20) x (fs x lines + 20),\n * corner radius 8, the pointer to p0 drawn from the side / corner region\n * p0 is in (TV `_drawImpl`), text lines from the top-left + 10. */\nexport function calloutLayout(d: Drawing, p1: Pt) {\n const s = d.style;\n const fs = s.fontSize ?? 14;\n const wrap = s.wordWrap ? s.wordWrapWidth ?? 200 : undefined;\n const lines = tvWordWrap(toolText(d).text, fs, !!s.bold, !!s.italic, wrap);\n const textW = wrap ?? Math.max(0, ...lines.map((l) => measureTextStyled(l, fs, !!s.bold, !!s.italic)));\n const textH = fs * lines.length;\n const w = textW + 20;\n const h = textH + 20;\n const x = p1.x - w / 2;\n const y = p1.y - h / 2;\n return { fs, lines, textW, textH, x, y, w, h, wrap };\n}\nexport function calloutPath(c: ReturnType<typeof calloutLayout>, p0: Pt, p1: Pt): string {\n const { x: s, y: d, w: a, h: l, textW: n, textH: r } = c;\n const ex = p0.x - s, ey = p0.y - d;\n const ix = p1.x - s, iy = p1.y - d;\n let code = 0;\n if (p0.x > s + a) code = 20;\n else if (p0.x > s) code = 10;\n if (p0.y > d + l) code += 2;\n else if (p0.y > d) code += 1;\n const u = n + 4 > 16;\n const pv = r + 4 > 16;\n const P = (px: number, py: number) => `${s + px} ${d + py}`;\n const arc = (tx: number, ty: number) => `A 8 8 0 0 1 ${P(tx, ty)}`;\n let path = `M ${P(8, 0)}`;\n if (code === 10) path += u ? ` L ${P(ix - 8, 0)} L ${P(ex, ey)} L ${P(ix + 8, 0)} L ${P(a - 8, 0)}` : ` L ${P(ex, ey)} L ${P(a - 8, 0)}`;\n else path += ` L ${P(a - 8, 0)}`;\n path += code === 20 ? ` L ${P(ex, ey)} L ${P(a, 8)}` : ` ${arc(a, 8)}`;\n if (code === 21) path += pv ? ` L ${P(a, iy - 8)} L ${P(ex, ey)} L ${P(a, iy + 8)} L ${P(a, l - 8)}` : ` L ${P(ex, ey)} L ${P(a, l - 8)}`;\n else path += ` L ${P(a, l - 8)}`;\n path += code === 22 ? ` L ${P(ex, ey)} L ${P(a - 8, l)}` : ` ${arc(a - 8, l)}`;\n if (code === 12) path += u ? ` L ${P(ix + 8, l)} L ${P(ex, ey)} L ${P(ix - 8, l)} L ${P(8, l)}` : ` L ${P(ex, ey)} L ${P(8, l)}`;\n else path += ` L ${P(8, l)}`;\n path += code === 2 ? ` L ${P(ex, ey)} L ${P(0, l - 8)}` : ` ${arc(0, l - 8)}`;\n if (code === 1) path += pv ? ` L ${P(0, iy + 8)} L ${P(ex, ey)} L ${P(0, iy - 8)} L ${P(0, 8)}` : ` L ${P(ex, ey)} L ${P(0, 8)}`;\n else path += ` L ${P(0, 8)}`;\n path += code === 0 ? ` L ${P(ex, ey)} L ${P(8, 0)}` : ` ${arc(8, 0)}`;\n return path + \" Z\";\n}\n","/*\n * TV signpost (LineToolSignpost, module 28577 LineToolWithRelativePriceCoordinate\n * + line-tool-signpost). The drawing is tied to a bar: the pole starts 3px\n * off the bar's high (label above) or low (label below) and the label sits at\n * `position` percent of the distance from that bar to the pane edge (signed:\n * + above, - below; factory 50). Pure TS geometry for the renderer and the\n * hit test.\n */\nimport type { Coords } from \"../coords\";\nimport type { DataPoint, Drawing } from \"../types\";\nimport type { Pt } from \"../_shared\";\nimport { tvTextLayout } from \"./tv-text\";\nimport { toolText } from \"./text-tools\";\n\n/** TV theme colours (dark): pole cold-gray-500, label cold-gray-900 with a\n * cold-gray-800 border and cold-gray-200 text, plate border cold-gray-900. */\nexport const SIGNPOST_COLORS = { pole: \"#808080\", labelBg: \"#0f0f0f\", labelBorder: \"#2e2e2e\", labelText: \"#dbdbdb\", plateBorder: \"#0f0f0f\" };\n\nfunction barPrices(coords: Coords, p: DataPoint): { high: number; low: number } | null {\n const b = coords.barAt(p.time);\n return b ? { high: b.high, low: b.low } : null;\n}\n\n/** TV `_updatePositionAndCorrectPoint`: the signed position (%) for a point\n * whose price is the label height. */\nexport function signpostPositionFor(coords: Coords, p: DataPoint, paneH: number): number {\n const bar = barPrices(coords, p);\n const y = coords.priceToY(p.price);\n if (y == null) return 50;\n let n = 1;\n let barY = paneH / 2;\n if (bar) {\n n = p.price >= bar.low ? 1 : -1;\n barY = coords.priceToY(n === 1 ? bar.high : bar.low) ?? barY;\n } else {\n n = y <= paneH / 2 ? 1 : -1;\n }\n const avail = n === 1 ? barY : paneH - barY;\n const f = Math.min(paneH, Math.abs(y - barY));\n return avail > 0 ? Math.max(0, Math.min(100, (100 * f) / avail)) * n : 50 * n;\n}\n\n/** Label y for a signed position (TV positionToCoordinate). */\nfunction labelYFor(pos: number, paneH: number, barY: number, n: number): number {\n const i = Math.min(paneH, Math.max(0, n === 1 ? barY : paneH - barY));\n return barY - n * Math.abs((i * pos) / 100);\n}\n\nexport function signpostLayout(d: Drawing, p: Pt, coords: Coords, paneH: number) {\n const s = d.style;\n const pos = s.signpostPosition ?? 50;\n const n = pos >= 0 ? 1 : -1;\n const bar = barPrices(coords, d.points[0]);\n const barYraw = bar ? coords.priceToY(n === 1 ? bar.high : bar.low) : null;\n // No bar (off data, TV getNoDataPosition): the pole starts at the pane\n // bottom and the label is measured from the middle.\n const onData = barYraw != null;\n const barY = onData ? barYraw! : paneH / 2;\n const poleStart = onData ? barY - n * 3 : paneH;\n const fs = s.fontSize ?? 12;\n const make = (y: number) =>\n tvTextLayout({\n x: p.x,\n y,\n text: toolText(d).text,\n fs,\n bold: s.bold,\n italic: s.italic,\n vert: n === 1 ? \"top\" : \"bottom\",\n horz: \"center\",\n padV: 6,\n padH: 8,\n wrapWidth: 134,\n lineSpacing: 3,\n });\n let y = labelYFor(pos, paneH, barY, n);\n let l = make(y);\n const lh = l.box.height;\n const clamped = n === 1 ? Math.min(poleStart - lh, y) : Math.max(poleStart + lh, y);\n if (clamped !== y) {\n y = clamped;\n l = make(y);\n }\n const plate = s.showImage ? 80 : 0;\n // pole: bar -> the label side facing the bar (+ the plate when shown)\n const poleEnd = y + (lh + plate) * n;\n const plateY = y + (lh + 10 + 35) * n;\n const gap: [number, number] | null = s.showImage ? [y + lh * n, y + lh * n + 10 * n] : null;\n return { l, anchor: { x: p.x, y }, poleStart, poleEnd, plateY, gap, n, x: p.x };\n}\n\n/** The signed position for a label anchor dragged to screen y (TV setPoint\n * keeps the bar). */\nexport function signpostPositionAtY(d: Drawing, coords: Coords, paneH: number, y: number): number | null {\n const price = coords.yToPrice(y);\n return price == null ? null : signpostPositionFor(coords, { time: d.points[0].time, price }, paneH);\n}\n","/*\n * Per-kind hit-test dispatch. Pure TS — no JSX, no Solid.\n *\n * Each kind has a hit-test fn that takes the kind's projected screen points\n * and the cursor; returns either a handle hit (with index) or a body hit,\n * or null. The overlay's render switch handles the visual side.\n *\n * Geometry primitives (distToSegment, pointInPolygon, bboxCorners,\n * GLYPH_HALF, HIT_TOLERANCE, HANDLE_RADIUS) live in ../_shared.ts.\n */\nimport {\n HANDLE_RADIUS,\n HIT_TOLERANCE,\n bboxCorners,\n distToSegment,\n pointInPolygon,\n strokeTolerance,\n type HitResult,\n type Pt,\n} from \"../_shared\";\nimport { glyphHitTest } from \"./_glyph\";\nimport { rotatedRectCorners } from \"../rotated-rect\";\nimport type { Drawing } from \"../types\";\nimport { TREND_FIB_TIME_LEVEL_DEFAULTS } from \"../specs\";\nimport { FIB_CIRCLE_LEVEL_DEFAULTS, FIB_LEVEL_DEFAULTS, FIB_TIMEZONE_LEVEL_DEFAULTS, FIB_WEDGE_LEVEL_DEFAULTS, GANN_FAN_LEVEL_DEFAULTS, PARALLEL_CHANNEL_LEVEL_DEFAULTS, PITCHFORK_LEVEL_DEFAULTS, SPEED_ARC_LEVEL_DEFAULTS, SPEED_FAN_LEVEL_DEFAULTS } from \"../specs\";\nimport type { Coords } from \"../coords\";\nimport { positionLevels } from \"./position\";\nimport { gannBox, gannFrame } from \"./gann-square\";\nimport { gannFanDir } from \"./gann-fan\";\nimport { pitchforkExtendRight, pitchforkGeom } from \"./pitchfork\";\nimport { trendFibTimeLevels } from \"./fib-time\";\nimport { priceNoteLabel } from \"./price-note\";\nimport { rectangleTextLayout } from \"./rectangle-text\";\nimport { anchoredVpBox, fixedVpBox, forecastArcSamples, regressionScreenLines, vwapBandLine, vwapScreenSeries } from \"./data-series\";\nimport { extendRay, speedFanGeometry } from \"./speed-fan\";\nimport { barsPatternGeometry } from \"./bars-pattern\";\nimport { arrowMarkTextBox } from \"./arrow-mark\";\nimport { tableAnchors, tableEdgeIndex, tableHitCell, tableLayout } from \"./table\";\nimport { imageAnchors, imageBox } from \"./images\";\nimport { signpostLayout } from \"./signpost\";\nimport { calloutLayout, commentLayout, noteLayout, pinLayout, priceLabelLayout, textToolLayout } from \"./text-tools\";\n\nconst HANDLE_R = HANDLE_RADIUS + HIT_TOLERANCE;\n\nfunction inBox(c: Pt, b: { left: number; top: number; width: number; height: number }): boolean {\n return c.x >= b.left && c.x <= b.left + b.width && c.y >= b.top && c.y <= b.top + b.height;\n}\n\nfunction endpointHit(pts: Pt[], cursor: Pt): HitResult | null {\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(pts[i].x - cursor.x, pts[i].y - cursor.y) <= HANDLE_R) {\n return { hit: \"handle\", handleIndex: i };\n }\n }\n return null;\n}\n\nfunction bboxCornerHit(a: Pt, b: Pt, cursor: Pt): HitResult | null {\n const cs = bboxCorners(a, b);\n for (let i = 0; i < 4; i++) {\n if (Math.hypot(cs[i].x - cursor.x, cs[i].y - cursor.y) <= HANDLE_R) {\n return { hit: \"handle\", handleIndex: i };\n }\n }\n return null;\n}\n\nfunction horizontalLineHit(pts: Pt[], cursor: Pt, w: number, tol = HIT_TOLERANCE): HitResult | null {\n const a = pts[0];\n // Anchor at 90% of the pane width (TV line-tool-horizontal-line).\n if (Math.hypot(0.9 * w - cursor.x, a.y - cursor.y) <= HANDLE_R) {\n return { hit: \"handle\", handleIndex: 0 };\n }\n if (Math.abs(cursor.y - a.y) <= tol) return { hit: \"body\" };\n return null;\n}\n\nfunction verticalLineHit(pts: Pt[], cursor: Pt, h: number, tol = HIT_TOLERANCE): HitResult | null {\n const a = pts[0];\n // Anchor at 90% of the pane height (TV line-tool-vertical-line).\n if (Math.hypot(a.x - cursor.x, 0.9 * h - cursor.y) <= HANDLE_R) {\n return { hit: \"handle\", handleIndex: 0 };\n }\n if (Math.abs(cursor.x - a.x) <= tol) return { hit: \"body\" };\n return null;\n}\n\nfunction crossLineHit(pts: Pt[], cursor: Pt, tol = HIT_TOLERANCE): HitResult | null {\n const a = pts[0];\n if (Math.hypot(a.x - cursor.x, a.y - cursor.y) <= HANDLE_R) {\n return { hit: \"handle\", handleIndex: 0 };\n }\n if (Math.abs(cursor.y - a.y) <= tol || Math.abs(cursor.x - a.x) <= tol) {\n return { hit: \"body\" };\n }\n return null;\n}\n\nfunction horizontalRayHit(pts: Pt[], cursor: Pt, tol = HIT_TOLERANCE): HitResult | null {\n const a = pts[0];\n if (Math.hypot(a.x - cursor.x, a.y - cursor.y) <= HANDLE_R) {\n return { hit: \"handle\", handleIndex: 0 };\n }\n // Body only to the right of the anchor (the ray extends rightward).\n if (cursor.x >= a.x - HANDLE_R && Math.abs(cursor.y - a.y) <= tol) {\n return { hit: \"body\" };\n }\n return null;\n}\n\nfunction fibHit(drawing: Drawing, pts: Pt[], cursor: Pt): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n // Body anywhere within the price band the levels span, limited to the\n // anchors' x-range (TV: levels don't extend unless the extend flags are on).\n const s = drawing.style;\n const left = s.extendLeft ? -Infinity : Math.min(pts[0].x, pts[1].x);\n const right = s.extendRight ? Infinity : Math.max(pts[0].x, pts[1].x);\n const top = Math.min(pts[0].y, pts[1].y);\n const bottom = Math.max(pts[0].y, pts[1].y);\n if (\n cursor.x >= left - HIT_TOLERANCE && cursor.x <= right + HIT_TOLERANCE &&\n cursor.y >= top - HIT_TOLERANCE && cursor.y <= bottom + HIT_TOLERANCE\n ) {\n return { hit: \"body\" };\n }\n return null;\n}\n\n/** Trend-line family: the hit segment follows the RENDERED extension (TV's\n * `_extendAndHitTestLineSegment`) — a ray is selectable anywhere it paints,\n * not just between its anchors. Defaults per kind: ray extends right,\n * extended-line both ways; explicit style flags override. */\nfunction extendableLineHit(d: Drawing, pts: Pt[], cursor: Pt, width: number, height: number): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const s = d.style;\n const extL = s.extendLeft ?? (d.kind === \"extended-line\");\n const extR = s.extendRight ?? (d.kind === \"ray\" || d.kind === \"extended-line\");\n const [a, b] = pts;\n let A = a;\n let B = b;\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.hypot(dx, dy);\n if (len > 1e-6) {\n const big = (width + height) * 2;\n if (extR) B = { x: b.x + (dx / len) * big, y: b.y + (dy / len) * big };\n if (extL) A = { x: a.x - (dx / len) * big, y: a.y - (dy / len) * big };\n }\n if (distToSegment(cursor.x, cursor.y, A, B) <= strokeTolerance(s)) return { hit: \"body\" };\n return null;\n}\n\nfunction lineHit(pts: Pt[], cursor: Pt, tol = HIT_TOLERANCE): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n if (distToSegment(cursor.x, cursor.y, pts[0], pts[1]) <= tol) {\n return { hit: \"body\" };\n }\n return null;\n}\n\n/** Position tool (TV model): 4 virtual anchors — 0 = entry (free), 1 = close\n * point (time-only), 2 = stop (price-only), 3 = target (price-only) — plus\n * the risk/reward box body. Mirrors DrawingsOverlay positionAnchors. */\nfunction positionHit(drawing: Drawing, pts: Pt[], cursor: Pt, coords: Coords | null | undefined): HitResult | null {\n const a = pts[0];\n const b = pts[1];\n const dp0 = drawing.points[0];\n const dp1 = drawing.points[1];\n if (!dp0 || !dp1) return null;\n const entry = dp0.price;\n const { stop, profit } = positionLevels(drawing, coords?.pipSize() ?? 0.01);\n const sign = drawing.kind === \"long-position\" ? 1 : -1;\n const yTarget = coords?.priceToY(entry + sign * profit) ?? a.y - 40;\n const yStop = coords?.priceToY(entry - sign * stop) ?? a.y + 40;\n if (yTarget == null || yStop == null) return null;\n const midX = (a.x + b.x) / 2;\n const anchors: Pt[] = [a, { x: b.x, y: a.y }, { x: midX, y: yStop }, { x: midX, y: yTarget }];\n const ah = endpointHit(anchors, cursor);\n if (ah) return ah;\n const left = Math.min(a.x, b.x);\n const right = Math.max(a.x, b.x);\n const top = Math.min(yTarget, yStop);\n const bottom = Math.max(yTarget, yStop);\n if (\n cursor.x >= left - HIT_TOLERANCE && cursor.x <= right + HIT_TOLERANCE &&\n cursor.y >= top - HIT_TOLERANCE && cursor.y <= bottom + HIT_TOLERANCE\n ) {\n return { hit: \"body\" };\n }\n return null;\n}\n\n/** A segment continued past its ends to beyond the pane (TV extendleft /\n * extendright: the extended part hits like the line). */\nfunction extendHitSeg(l: Pt, r: Pt, extL: boolean, extR: boolean, big: number): [Pt, Pt] {\n const dx = r.x - l.x, dy = r.y - l.y;\n const len = Math.hypot(dx, dy) || 1;\n return [\n extL ? { x: l.x - (dx / len) * big, y: l.y - (dy / len) * big } : l,\n extR ? { x: r.x + (dx / len) * big, y: r.y + (dy / len) * big } : r,\n ];\n}\n\n/** Cursor inside the band a + u·(b − a) + v·n, v in [lo, hi], u in [0, 1]\n * (or open on an extended side). */\nfunction inBand(cursor: Pt, a: Pt, b: Pt, n: Pt, lo: number, hi: number, extL: boolean, extR: boolean): boolean {\n const ux = b.x - a.x, uy = b.y - a.y;\n const det = ux * n.y - uy * n.x;\n if (Math.abs(det) < 1e-9) return false;\n const px = cursor.x - a.x, py = cursor.y - a.y;\n const u = (px * n.y - py * n.x) / det;\n const v = (ux * py - uy * px) / det;\n return (extL || u >= 0) && (extR || u <= 1) && v >= Math.min(lo, hi) && v <= Math.max(lo, hi);\n}\n\n\nfunction pitchforkHit(drawing: Drawing, pts: Pt[], cursor: Pt, width: number, height: number): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const g = pitchforkGeom(drawing.kind, pts);\n if (!g) return null;\n const s = drawing.style;\n const far = (o: Pt) => pitchforkExtendRight(o, g.dir, width);\n // TV extendLines: the median and the level lines also run back.\n const big = (width + height) * 2;\n const dl = Math.hypot(g.dir.x, g.dir.y) || 1;\n const back = (o: Pt): Pt => (s.extendLines ? { x: o.x - (g.dir.x / dl) * big, y: o.y - (g.dir.y / dl) * big } : o);\n const lines: [Pt, Pt][] = [\n [back(g.pivot), far(g.pivot)],\n [pts[1], pts[2]],\n ];\n const levels = (s.levels ?? PITCHFORK_LEVEL_DEFAULTS).filter((l) => l.visible);\n for (const lvl of levels) {\n for (const sign of [1, -1] as const) {\n const o = { x: g.mid.x + g.half.x * lvl.coeff * sign, y: g.mid.y + g.half.y * lvl.coeff * sign };\n lines.push([back(o), far(o)]);\n }\n }\n for (const [a, b] of lines) {\n if (distToSegment(cursor.x, cursor.y, a, b) <= HIT_TOLERANCE) return { hit: \"body\" };\n }\n // TV ChannelRenderer (hittestOnBackground): the filled bands between the\n // median and the outermost visible level on each side, forward from the\n // p2-p3 segment (also backwards with extend lines).\n if (s.fillBackground !== false && levels.length > 0) {\n const kmax = Math.max(...levels.map((l) => l.coeff));\n const b = { x: g.mid.x + g.dir.x, y: g.mid.y + g.dir.y };\n if (inBand(cursor, g.mid, b, g.half, -kmax, kmax, !!s.extendLines, true)) return { hit: \"body\" };\n }\n return null;\n}\n\n/** Trend-based fib extension: pts 0-1 are the measured move, pt2 the projection\n * anchor. Hit an endpoint or anywhere within the projected band. */\nfunction fibExtHit(drawing: Drawing, pts: Pt[], cursor: Pt): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const s = drawing.style;\n const left = s.extendLeft ? -Infinity : Math.min(pts[1].x, pts[2].x);\n const right = s.extendRight ? Infinity : Math.max(pts[1].x, pts[2].x);\n const top = Math.min(pts[0].y, pts[1].y, pts[2].y);\n const bottom = Math.max(pts[0].y, pts[1].y, pts[2].y);\n if (\n cursor.x >= left - HIT_TOLERANCE && cursor.x <= right + HIT_TOLERANCE &&\n cursor.y >= top - HIT_TOLERANCE && cursor.y <= bottom + HIT_TOLERANCE\n ) {\n return { hit: \"body\" };\n }\n return null;\n}\n\n/** Gann fan: every visible level ray is hit-testable (kinds/gann-fan\n * gannFanDir, as drawn). */\nfunction gannFanHit(drawing: Drawing, pts: Pt[], cursor: Pt, width: number, height: number): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const [a, b] = pts;\n const big = (width + height) * 2;\n const levels = (drawing.style.levels ?? GANN_FAN_LEVEL_DEFAULTS).filter((l) => l.visible);\n for (const lvl of levels) {\n const v = gannFanDir(a, b, lvl.coeff);\n const len = Math.hypot(v.x, v.y) || 1;\n const e = { x: a.x + (v.x / len) * big, y: a.y + (v.y / len) * big };\n if (distToSegment(cursor.x, cursor.y, a, e) <= HIT_TOLERANCE) return { hit: \"body\" };\n }\n return null;\n}\n\n/** Fib time zone: vertical lines at level-coeff multiples of the p0→p1 x\n * distance (TV: 11 Fibonacci-sequence levels), plus the anchor connector. */\nfunction fibTimeZoneHit(drawing: Drawing, pts: Pt[], cursor: Pt, tol: number): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const unit = pts[1].x - pts[0].x;\n const levels = (drawing.style.levels ?? FIB_TIMEZONE_LEVEL_DEFAULTS).filter((l) => l.visible);\n for (const lvl of levels) {\n if (Math.abs(cursor.x - (pts[0].x + unit * lvl.coeff)) <= Math.max(tol, (lvl.width ?? 1) / 2 + 2)) {\n return { hit: \"body\" };\n }\n }\n if (distToSegment(cursor.x, cursor.y, pts[0], pts[1]) <= tol) return { hit: \"body\" };\n return null;\n}\n\n/** Fib circles: concentric rings centred on pt0, outer radius = |pt1 - pt0|. */\nfunction fibCirclesHit(drawing: Drawing, pts: Pt[], cursor: Pt): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n if (drawing.fmt === 2) {\n // TV model: inside the outermost visible ellipse (centre = p0-p1 midpoint).\n const coeffs = (drawing.style.levels ?? FIB_CIRCLE_LEVEL_DEFAULTS).filter((l) => l.visible).map((l) => l.coeff);\n if (coeffs.length === 0) return null;\n const k = Math.max(...coeffs);\n const hx = (Math.abs(pts[1].x - pts[0].x) / 2) * k + HIT_TOLERANCE;\n const hy = (Math.abs(pts[1].y - pts[0].y) / 2) * k + HIT_TOLERANCE;\n const dx = (cursor.x - (pts[0].x + pts[1].x) / 2) / hx;\n const dy = (cursor.y - (pts[0].y + pts[1].y) / 2) / hy;\n return dx * dx + dy * dy <= 1 ? { hit: \"body\" } : null;\n }\n const r = Math.hypot(pts[1].x - pts[0].x, pts[1].y - pts[0].y);\n const d = Math.hypot(cursor.x - pts[0].x, cursor.y - pts[0].y);\n if (d <= r + HIT_TOLERANCE) return { hit: \"body\" };\n return null;\n}\n\n/** Parallel channel (TV anchors): 0/1 = main-edge ends, 2/3 = offset-edge\n * ends, 4 = offset-edge middle (height), 5 = main-edge middle (move base).\n * Body = either edge, the middle line, or the band interior. */\nfunction parallelChannelHit(drawing: Drawing, pts: Pt[], cursor: Pt, tol: number, width: number, height: number): HitResult | null {\n const [a, b, c] = pts;\n const t = (b.x - a.x) === 0 ? 0 : (c.x - a.x) / (b.x - a.x);\n const dy = c.y - (a.y + (b.y - a.y) * t);\n const a2 = { x: a.x, y: a.y + dy };\n const b2 = { x: b.x, y: b.y + dy };\n const mid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n const anchors: Pt[] = [a, b, a2, b2, { x: mid.x, y: mid.y + dy }, mid];\n const ah = endpointHit(anchors, cursor);\n if (ah) return ah;\n // TV ParallelChannelRenderer: every visible level line (extended with the\n // extend flags) and, with the background on, the band between the first\n // and the last visible level (hittestOnBackground).\n const s = drawing.style;\n const vis = (s.levels ?? PARALLEL_CHANNEL_LEVEL_DEFAULTS).filter((l) => l.visible);\n if (vis.length === 0) return null;\n const big = (width + height) * 2;\n for (const l of vis) {\n const o = dy * l.coeff;\n const [p, q] = extendHitSeg({ x: a.x, y: a.y + o }, { x: b.x, y: b.y + o }, !!s.extendLeft, !!s.extendRight, big);\n if (distToSegment(cursor.x, cursor.y, p, q) <= tol) return { hit: \"body\" };\n }\n if (s.fillBackground !== false && inBand(cursor, a, b, { x: 0, y: dy }, vis[0].coeff, vis[vis.length - 1].coeff, !!s.extendLeft, !!s.extendRight)) return { hit: \"body\" };\n return null;\n}\n\n/** Disjoint channel (TV mirror model): edge 2 = (p1.x, y(p2)) → (p0.x,\n * y(p2) + (p1.y − p0.y)). Anchors: 0/1 = edge-1 ends, 2 = edge-2 end at\n * p1.x (→ p2 price), 3 = edge-2 end at p0.x (→ p0 price via the mirror). */\nfunction disjointChannelHit(drawing: Drawing, pts: Pt[], cursor: Pt, tol: number, width: number, height: number): HitResult | null {\n const [a, b, c] = pts;\n const P = { x: b.x, y: c.y };\n const A = { x: a.x, y: c.y + (b.y - a.y) };\n const anchors: Pt[] = [a, b, P, A];\n const ah = endpointHit(anchors, cursor);\n if (ah) return ah;\n // TV (module 632446): both lines with the extend flags; the background\n // hits only on mobile (hittestOnBackground = isAnyMobile).\n const s = drawing.style;\n const big = (width + height) * 2;\n for (const [l, r] of [[a, b], [A, P]] as const) {\n const [p, q] = extendHitSeg(l, r, !!s.extendLeft, !!s.extendRight, big);\n if (distToSegment(cursor.x, cursor.y, p, q) <= tol) return { hit: \"body\" };\n }\n return null;\n}\n\n/** Flat top/bottom channel: pts 0-1 are the sloped edge, pt2 the price of\n * the flat edge. Hit either edge (extended) or an endpoint. */\nfunction channelHit(drawing: Drawing, pts: Pt[], cursor: Pt, tol: number, width: number, height: number): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n // TV flat top/bottom: the p0-p1 line and the flat line at p2's price over\n // the same bars, both with the extend flags; no background hit on desktop.\n const [a, b, c] = pts;\n const s = drawing.style;\n const big = (width + height) * 2;\n for (const [l, r] of [[a, b], [{ x: a.x, y: c.y }, { x: b.x, y: c.y }]] as const) {\n const [p, q] = extendHitSeg(l, r, !!s.extendLeft, !!s.extendRight, big);\n if (distToSegment(cursor.x, cursor.y, p, q) <= tol) return { hit: \"body\" };\n }\n return null;\n}\n\n/** Fib channel (TV): level k = segment p0→p1 moved by coeff·(p2 − p0); the\n * band between the lowest and highest visible level is hit-testable (TV\n * `hittestOnBackground`), plus each level line. */\nfunction fibChannelHit(drawing: Drawing, pts: Pt[], cursor: Pt, tol: number, width: number, height: number): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const [a, b, c] = pts;\n if (!c) return distToSegment(cursor.x, cursor.y, a, b) <= tol ? { hit: \"body\" } : null;\n const s = drawing.style;\n const n = { x: c.x - a.x, y: c.y - a.y };\n const coeffs = (s.levels ?? FIB_LEVEL_DEFAULTS).filter((l) => l.visible).map((l) => l.coeff);\n if (coeffs.length === 0) return null;\n const big = (width + height) * 2;\n for (const k of coeffs) {\n const [p, q] = extendHitSeg({ x: a.x + n.x * k, y: a.y + n.y * k }, { x: b.x + n.x * k, y: b.y + n.y * k }, !!s.extendLeft, !!s.extendRight, big);\n if (distToSegment(cursor.x, cursor.y, p, q) <= tol) return { hit: \"body\" };\n }\n // TV ParallelChannelRenderer: the band between the lowest and highest\n // visible level when the background is on.\n if (s.fillBackground === false) return null;\n return inBand(cursor, a, b, n, Math.min(...coeffs), Math.max(...coeffs), !!s.extendLeft, !!s.extendRight) ? { hit: \"body\" } : null;\n}\n\n/** Rotated ellipse (TV): p0/p1 = major axis, p2 = half-height point. Cursor is\n * transformed into the ellipse frame for the containment test. */\nfunction ellipse3Hit(pts: Pt[], cursor: Pt): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const [a, b, c] = pts;\n if (!c) return null;\n const cx = (a.x + b.x) / 2;\n const cy = (a.y + b.y) / 2;\n const rx = Math.max(1, Math.hypot(b.x - a.x, b.y - a.y) / 2);\n const ang = Math.atan2(b.y - a.y, b.x - a.x);\n const nx = -Math.sin(ang);\n const ny = Math.cos(ang);\n const ry = Math.max(1, Math.abs((c.x - cx) * nx + (c.y - cy) * ny));\n // Rotate the cursor into the unrotated frame.\n const dx = cursor.x - cx;\n const dy = cursor.y - cy;\n const lx = dx * Math.cos(-ang) - dy * Math.sin(-ang);\n const ly = dx * Math.sin(-ang) + dy * Math.cos(-ang);\n const q = (lx / (rx + HIT_TOLERANCE)) ** 2 + (ly / (ry + HIT_TOLERANCE)) ** 2;\n if (q <= 1) return { hit: \"body\" };\n return null;\n}\n\n/** Rectangle edge midpoints (TV's 8-anchor rectangle): indices 4-7 continue\n * the bboxCorners order — 4 = top, 5 = right, 6 = bottom, 7 = left. Each\n * drags only its edge (see DrawingsOverlay applyDrag). */\nexport function rectEdgeMidpoints(a: Pt, b: Pt): [Pt, Pt, Pt, Pt] {\n const [tl, tr, br, bl] = bboxCorners(a, b);\n return [\n { x: (tl.x + tr.x) / 2, y: tl.y },\n { x: tr.x, y: (tr.y + br.y) / 2 },\n { x: (bl.x + br.x) / 2, y: br.y },\n { x: tl.x, y: (tl.y + bl.y) / 2 },\n ];\n}\n\nfunction rectangleHit(pts: Pt[], cursor: Pt, withMidpoints = false): HitResult | null {\n const [a, b] = pts;\n const ch = bboxCornerHit(a, b, cursor);\n if (ch) return ch;\n if (withMidpoints) {\n const mids = rectEdgeMidpoints(a, b);\n for (let i = 0; i < 4; i++) {\n if (Math.hypot(mids[i].x - cursor.x, mids[i].y - cursor.y) <= HANDLE_R) {\n return { hit: \"handle\", handleIndex: 4 + i };\n }\n }\n }\n const left = Math.min(a.x, b.x);\n const right = Math.max(a.x, b.x);\n const top = Math.min(a.y, b.y);\n const bottom = Math.max(a.y, b.y);\n if (\n cursor.x >= left - HIT_TOLERANCE &&\n cursor.x <= right + HIT_TOLERANCE &&\n cursor.y >= top - HIT_TOLERANCE &&\n cursor.y <= bottom + HIT_TOLERANCE\n ) {\n return { hit: \"body\" };\n }\n return null;\n}\n\n/** TV circle: center = p0, radius = screen distance to p1. Anything within\n * radius + tolerance hits (ring or filled interior — TV treats both as the\n * movable body; the two stored points are the anchors). */\nfunction circleHit(pts: Pt[], cursor: Pt): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const [c, e] = pts;\n const r = Math.hypot(e.x - c.x, e.y - c.y);\n if (Math.hypot(cursor.x - c.x, cursor.y - c.y) <= r + HIT_TOLERANCE) return { hit: \"body\" };\n return null;\n}\n\nfunction priceRangeHit(drawing: Drawing, pts: Pt[], cursor: Pt, width: number): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n // TV: the box between the two prices over the P0-P1 x range (extend flags\n // stretch it to the pane edges).\n const left = drawing.style.extendLeft ? 0 : Math.min(pts[0].x, pts[1].x);\n const right = drawing.style.extendRight ? width : Math.max(pts[0].x, pts[1].x);\n const top = Math.min(pts[0].y, pts[1].y);\n const bottom = Math.max(pts[0].y, pts[1].y);\n if (cursor.x >= left - HIT_TOLERANCE && cursor.x <= right + HIT_TOLERANCE && cursor.y >= top - HIT_TOLERANCE && cursor.y <= bottom + HIT_TOLERANCE) {\n return { hit: \"body\" };\n }\n return null;\n}\n\nfunction dateRangeHit(pts: Pt[], cursor: Pt): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n // TV: the box between the two times over the P0-P1 price range.\n const left = Math.min(pts[0].x, pts[1].x);\n const right = Math.max(pts[0].x, pts[1].x);\n const top = Math.min(pts[0].y, pts[1].y);\n const bottom = Math.max(pts[0].y, pts[1].y);\n if (cursor.x >= left - HIT_TOLERANCE && cursor.x <= right + HIT_TOLERANCE && cursor.y >= top - HIT_TOLERANCE && cursor.y <= bottom + HIT_TOLERANCE) {\n return { hit: \"body\" };\n }\n return null;\n}\n\n/** Rotated rectangle: pts 0-1 are one edge; pt2 sets the perpendicular width. */\nfunction rotatedRectHit(drawing: Drawing, pts: Pt[], cursor: Pt): HitResult | null {\n const fmt2 = drawing.fmt === 2;\n const corners = rotatedRectCorners(pts, fmt2);\n // fmt 2 (TV): anchors p0, p1 + the 4 corners; a corner drags p2 (index 2+).\n const anchors = fmt2 ? [pts[0], pts[1], ...corners] : pts;\n const h = endpointHit(anchors, cursor);\n if (h) return h;\n if (pointInPolygon(cursor.x, cursor.y, corners)) return { hit: \"body\" };\n return null;\n}\n\nfunction triangleHit(pts: Pt[], cursor: Pt): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n if (pointInPolygon(cursor.x, cursor.y, pts)) return { hit: \"body\" };\n return null;\n}\n\n/* ---------- fib-fan / cycle / curve family (mirror DrawingsOverlay renderers) ---------- */\n\nfunction polylineHit(samples: Pt[], cursor: Pt, tol = HIT_TOLERANCE): HitResult | null {\n for (let i = 1; i < samples.length; i++) {\n if (distToSegment(cursor.x, cursor.y, samples[i - 1], samples[i]) <= tol) {\n return { hit: \"body\" };\n }\n }\n return null;\n}\n\n/** Fan rays from p1 through (p2.x, p1.y + dy*ratio), extended to the right edge. */\n/** Speed-resistance fan: the coeff-0/1 rays + every visible ladder ray + the\n * box edges are all hit targets (mirrors renderFibSpeedFan). */\n/** Bars pattern (TV): the anchors, then the drawn bars (each 2px bar, x ± 1,\n * top to bottom, widened by the hit tolerance) or the line in line modes.\n * Without a snapshot: the two vertical lines and the P0-P1 median. */\nfunction barsPatternHit(drawing: Drawing, pts: Pt[], cursor: Pt, coords: Coords | null, tol = HIT_TOLERANCE): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const g = barsPatternGeometry(drawing, pts, coords);\n if (!g) {\n const [a, b] = pts;\n if (Math.abs(cursor.x - a.x) <= tol || Math.abs(cursor.x - b.x) <= tol) return { hit: \"body\" };\n return distToSegment(cursor.x, cursor.y, a, b) <= tol ? { hit: \"body\" } : null;\n }\n if (g.lineMode) {\n for (let i = 1; i < g.line.length; i++) {\n if (distToSegment(cursor.x, cursor.y, g.line[i - 1], g.line[i]) <= tol) return { hit: \"body\" };\n }\n return null;\n }\n for (const b of g.bars) {\n if (Math.abs(cursor.x - b.x) <= 1 + tol && cursor.y >= b.top - tol && cursor.y <= b.bottom + tol) return { hit: \"body\" };\n }\n return null;\n}\n\n/** TV arrow mark hit box: 19.5px wide, from the tip 22px along the arrow\n * (up: below the point, down: above); the anchor first. */\nfunction arrowMarkHit(drawing: Drawing, pts: Pt[], cursor: Pt, dir: \"up\" | \"down\"): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const c = pts[0];\n const top = dir === \"up\" ? c.y : c.y - 22;\n if (cursor.x >= c.x - 9.75 && cursor.x <= c.x + 9.75 && cursor.y >= top && cursor.y <= top + 22) return { hit: \"body\" };\n // TV TextRenderer.hitTest: inside the text box.\n const box = arrowMarkTextBox(drawing, c);\n if (box && cursor.x >= box.left && cursor.x <= box.left + box.width && cursor.y >= box.top && cursor.y <= box.top + box.height) return { hit: \"body\" };\n return null;\n}\n\nfunction speedFanHit(drawing: Drawing, pts: Pt[], cursor: Pt, width: number, coords: Coords | null): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const [a, b] = pts;\n // TV rays: p0 through every price level (on p1's bar) and every time level\n // (on p1's price), extended.\n const g = speedFanGeometry(drawing, pts, coords, SPEED_FAN_LEVEL_DEFAULTS);\n const size = Math.max(width, Math.abs(b.y - a.y) + Math.max(a.y, b.y));\n const targets: Pt[] = [...g.h.map((l) => ({ x: b.x, y: l.y })), ...g.v.map((l) => ({ x: l.x, y: b.y }))];\n for (const t of targets) {\n const far = extendRay(a, t, width, size);\n if (distToSegment(cursor.x, cursor.y, a, far) <= HIT_TOLERANCE) return { hit: \"body\" };\n }\n // Box edges.\n const c2 = { x: b.x, y: a.y };\n const c3 = { x: a.x, y: b.y };\n for (const [u, v] of [[a, c2], [c2, b], [b, c3], [c3, a]] as [Pt, Pt][]) {\n if (distToSegment(cursor.x, cursor.y, u, v) <= HIT_TOLERANCE) return { hit: \"body\" };\n }\n return null;\n}\n\n/** Fib wedge: apex p1, edges interpolated by retracement ratio about the\n * horizontal through p1. */\n/** Pitchfan (TV): rays from p0 through the median point + mid ± half·coeff. */\nfunction pitchfanHit(drawing: Drawing, pts: Pt[], cursor: Pt, width: number): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const [p0, p1, p2] = pts;\n if (!p2) return null;\n const mid = { x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 };\n const half = { x: (p2.x - p1.x) / 2, y: (p2.y - p1.y) / 2 };\n const big = width * 4;\n const targets: Pt[] = [mid];\n const levels = (drawing.style.levels ?? PITCHFORK_LEVEL_DEFAULTS).filter((l) => l.visible);\n for (const lvl of levels) {\n targets.push({ x: mid.x + half.x * lvl.coeff, y: mid.y + half.y * lvl.coeff });\n targets.push({ x: mid.x - half.x * lvl.coeff, y: mid.y - half.y * lvl.coeff });\n }\n for (const t of targets) {\n const dx = t.x - p0.x, dy = t.y - p0.y;\n const len = Math.hypot(dx, dy) || 1;\n const e = { x: p0.x + (dx / len) * big, y: p0.y + (dy / len) * big };\n if (distToSegment(cursor.x, cursor.y, p0, e) <= HIT_TOLERANCE) return { hit: \"body\" };\n }\n if (distToSegment(cursor.x, cursor.y, p1, p2) <= HIT_TOLERANCE) return { hit: \"body\" };\n return null;\n}\n\n/** Trend-based fib time: the anchors, the trend lines and every visible\n * level line (kinds/fib-time.ts). */\nfunction trendFibTimeHit(drawing: Drawing, pts: Pt[], cursor: Pt, tol: number, coords: Coords | null): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const [a, b, c] = pts;\n if (distToSegment(cursor.x, cursor.y, a, b) <= tol) return { hit: \"body\" };\n if (c && distToSegment(cursor.x, cursor.y, b, c) <= tol) return { hit: \"body\" };\n const levels = (drawing.style.levels ?? TREND_FIB_TIME_LEVEL_DEFAULTS).filter((l) => l.visible);\n for (const l of trendFibTimeLevels(drawing, pts, coords, levels)) {\n if (Math.abs(cursor.x - l.x) <= Math.max(tol, (l.width ?? 1) / 2 + 2)) return { hit: \"body\" };\n }\n return null;\n}\n\n/** Gann squares: the anchors, then the box (levels / fans / arcs cover it). */\nfunction gannSquareHit(drawing: Drawing, pts: Pt[], cursor: Pt): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const f = gannFrame(drawing, pts);\n if (!f) return null;\n const b = gannBox(f);\n return cursor.x >= b.left - HIT_TOLERANCE && cursor.x <= b.right + HIT_TOLERANCE && cursor.y >= b.top - HIT_TOLERANCE && cursor.y <= b.bottom + HIT_TOLERANCE\n ? { hit: \"body\" }\n : null;\n}\n\n/** Sector: the anchors, the edges, the arc and the filled wedge. */\nfunction sectorHit(pts: Pt[], cursor: Pt): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const [p0, p1, p2raw] = pts;\n if (!p2raw) return null;\n const len1 = Math.hypot(p1.x - p0.x, p1.y - p0.y);\n if (len1 < 1e-6) return null;\n const a1 = Math.atan2(p1.y - p0.y, p1.x - p0.x);\n const a2 = Math.atan2(p2raw.y - p0.y, p2raw.x - p0.x);\n let sweep = a2 - a1;\n while (sweep > Math.PI) sweep -= 2 * Math.PI;\n while (sweep < -Math.PI) sweep += 2 * Math.PI;\n const r = Math.hypot(cursor.x - p0.x, cursor.y - p0.y);\n let ang = Math.atan2(cursor.y - p0.y, cursor.x - p0.x) - a1;\n while (ang > Math.PI) ang -= 2 * Math.PI;\n while (ang < -Math.PI) ang += 2 * Math.PI;\n const inSweep = sweep >= 0 ? ang >= -0.05 && ang <= sweep + 0.05 : ang <= 0.05 && ang >= sweep - 0.05;\n return inSweep && r <= len1 + HIT_TOLERANCE ? { hit: \"body\" } : null;\n}\n\nfunction wedgeHit(drawing: Drawing, pts: Pt[], cursor: Pt): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const [p0, p1, p2raw] = pts;\n if (!p2raw) return null;\n const len1 = Math.hypot(p1.x - p0.x, p1.y - p0.y);\n if (len1 < 1e-6) return null;\n const a1 = Math.atan2(p1.y - p0.y, p1.x - p0.x);\n const a2 = Math.atan2(p2raw.y - p0.y, p2raw.x - p0.x);\n const p2 = { x: p0.x + Math.cos(a2) * len1, y: p0.y + Math.sin(a2) * len1 };\n if (distToSegment(cursor.x, cursor.y, p0, p1) <= HIT_TOLERANCE) return { hit: \"body\" };\n if (distToSegment(cursor.x, cursor.y, p0, p2) <= HIT_TOLERANCE) return { hit: \"body\" };\n // Level arcs: radius within tolerance of coeff·edge AND angle inside the sweep.\n let sweep = a2 - a1;\n while (sweep > Math.PI) sweep -= 2 * Math.PI;\n while (sweep < -Math.PI) sweep += 2 * Math.PI;\n const r = Math.hypot(cursor.x - p0.x, cursor.y - p0.y);\n let ang = Math.atan2(cursor.y - p0.y, cursor.x - p0.x) - a1;\n while (ang > Math.PI) ang -= 2 * Math.PI;\n while (ang < -Math.PI) ang += 2 * Math.PI;\n const inSweep = sweep >= 0 ? ang >= -0.05 && ang <= sweep + 0.05 : ang <= 0.05 && ang >= sweep - 0.05;\n if (inSweep) {\n const levels = (drawing.style.levels ?? FIB_WEDGE_LEVEL_DEFAULTS).filter((l) => l.visible);\n for (const lvl of levels) {\n if (Math.abs(r - len1 * lvl.coeff) <= HIT_TOLERANCE) return { hit: \"body\" };\n }\n }\n return null;\n}\n\n/** Fib speed-resistance arcs: concentric forward half-arcs at unit×ratio radii. */\nfunction arcsHit(drawing: Drawing, pts: Pt[], cursor: Pt): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const [c, edge] = pts;\n const unit = Math.hypot(edge.x - c.x, edge.y - c.y);\n if (unit < 1e-6) return null;\n // TV geometry: half circles cut by the horizontal through p0, opening\n // toward p1's vertical side — the cursor must be on that side.\n const dir = edge.y >= c.y ? 1 : -1;\n if ((cursor.y - c.y) * dir < -HIT_TOLERANCE) return null;\n const dist = Math.hypot(cursor.x - c.x, cursor.y - c.y);\n const levels = (drawing.style.levels ?? SPEED_ARC_LEVEL_DEFAULTS).filter((l) => l.visible);\n for (const lvl of levels) {\n if (Math.abs(dist - unit * lvl.coeff) <= HIT_TOLERANCE) return { hit: \"body\" };\n }\n return null;\n}\n\n/** TV fib-spiral radii (line-tool-fib-spiral): one Fibonacci number per\n * quarter turn, interpolated with a `frac^1.15` easing between steps. */\nconst FIB_SPIRAL_RADII = [0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89];\n\n/** TV fib-spiral samples: the spiral starts AT p0 (radius 0), winds clockwise\n * from the p0→p1 direction, and passes through p1 after exactly one full turn\n * (radius fib(4)=5 scaled by |p0p1|/5); 2.5 turns total. Shared by the\n * overlay renderer and the hit-test so both trace the same curve. */\nexport function spiralSamples(p1: Pt, p2: Pt, ccw = false): Pt[] {\n const dx = p2.x - p1.x;\n const dy = p2.y - p1.y;\n const r0 = Math.hypot(dx, dy);\n if (r0 < 1e-6) return [];\n const baseAngle = Math.atan2(dy, dx);\n const out: Pt[] = [];\n const last = 50 * (FIB_SPIRAL_RADII.length - 1);\n for (let e = 0; e <= last; e++) {\n const t = e / 50; // quarter-turns travelled\n const lo = Math.floor(t);\n const hi = Math.ceil(t);\n if (hi >= FIB_SPIRAL_RADII.length) break;\n const frac = Math.pow(t - lo, 1.15);\n const r = (FIB_SPIRAL_RADII[lo] + (FIB_SPIRAL_RADII[hi] - FIB_SPIRAL_RADII[lo]) * frac) * (r0 / 5);\n // TV counterclockwise: the turn runs the other way.\n const a = baseAngle + ((ccw ? -1 : 1) * e * Math.PI) / 100;\n out.push({ x: p1.x + Math.cos(a) * r, y: p1.y + Math.sin(a) * r });\n }\n return out;\n}\n\n/** TV sine-line samples: p0→p1 span HALF a period (p0 = trough, p1 = the\n * opposite extreme), amplitude = (p1.y − p0.y) / 2, and the wave repeats\n * across the WHOLE pane. Shared by the overlay renderer and the hit-test. */\nexport function sineSamples(p1: Pt, p2: Pt, paneW: number): Pt[] {\n const half = Math.abs(p2.x - p1.x);\n if (half < 1e-3) return [];\n const height = p2.y - p1.y; // signed; 0 → flat line (TV)\n const step = Math.max(1, half / 30);\n const out: Pt[] = [];\n for (let x = 0; x <= paneW + step; x += step) {\n out.push({ x, y: p1.y + height / 2 - (Math.cos(((x - p1.x) * Math.PI) / half) * height) / 2 });\n }\n return out;\n}\n\n/** Quadratic Bézier samples; extend flags continue the parabola parametrically\n * past t = 0 / 1 (TV extends the curve itself, not a tangent ray). */\nexport function bezierSamples(pts: Pt[], extendLeft = false, extendRight = false): Pt[] {\n const [p0, p1, p2] = pts;\n const t0 = extendLeft ? -4 : 0;\n const t1 = extendRight ? 5 : 1;\n const n = Math.ceil(32 * (t1 - t0));\n const out: Pt[] = [];\n for (let i = 0; i <= n; i++) {\n const t = t0 + ((t1 - t0) * i) / n;\n const u = 1 - t;\n out.push({ x: u * u * p0.x + 2 * u * t * p1.x + t * t * p2.x, y: u * u * p0.y + 2 * u * t * p1.y + t * t * p2.y });\n }\n return out;\n}\n\n/** TV arc geometry (line-tool-arc chunk): the arc is the 60° cap of a circle\n * of radius = chord length, drawn in the chord's rotated frame and scaled\n * vertically so the cap height equals the bulge point's perpendicular\n * distance from the chord. Returns screen samples start → end, or null when\n * the chord or the bulge is degenerate (render the plain chord then). */\nexport function arcSamples(a: Pt, b: Pt, c: Pt): Pt[] | null {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const u = Math.hypot(dx, dy);\n if (u < 1e-3) return null;\n const cos = dx / u;\n const sin = dy / u;\n // Signed perpendicular offset of the bulge point in the chord frame.\n const off = -sin * (c.x - a.x) + cos * (c.y - a.y);\n const l = Math.abs(off);\n if (l < 1) return null;\n const sign = off < 0 ? -1 : 1;\n const cap = 1 - Math.sqrt(3) / 2; // unscaled cap height, in chord lengths\n const scale = l / (u * cap);\n const out: Pt[] = [];\n for (let i = 0; i <= 48; i++) {\n // t sweeps 2π/3 → π/3 so samples run chord-start → chord-end.\n const t = (2 * Math.PI) / 3 - (i / 48) * (Math.PI / 3);\n const px = u / 2 + u * Math.cos(t);\n const py = sign * scale * u * (Math.sin(t) - Math.sqrt(3) / 2);\n out.push({ x: a.x + cos * px - sin * py, y: a.y + sin * px + cos * py });\n }\n return out;\n}\n\n/** Cubic Bézier samples; extend flags continue the cubic parametrically past\n * t = 0 / 1 (see bezierSamples). */\nexport function cubicSamples(pts: Pt[], extendLeft = false, extendRight = false): Pt[] {\n const [p0, p1, p2, p3] = pts;\n const t0 = extendLeft ? -3 : 0;\n const t1 = extendRight ? 4 : 1;\n const n = Math.ceil(32 * (t1 - t0));\n const out: Pt[] = [];\n for (let i = 0; i <= n; i++) {\n const t = t0 + ((t1 - t0) * i) / n;\n const u = 1 - t;\n out.push({\n x: u * u * u * p0.x + 3 * u * u * t * p1.x + 3 * u * t * t * p2.x + t * t * t * p3.x,\n y: u * u * u * p0.y + 3 * u * u * t * p1.y + 3 * u * t * t * p2.y + t * t * t * p3.y,\n });\n }\n return out;\n}\n\n/** Pattern/Elliott family — the filled kinds also register a body hit anywhere\n * inside the closed polygon. xabcd/cypher fill the two TRIANGLES (X-A-B and\n * B-C-D, TV Pattern5pointsPaneView), not the closed hull — hit-tested apart. */\nconst FILLED_PATTERN_KINDS = new Set<string>([\n \"triangle-pattern\",\n]);\n\nfunction labeledPolylineHit(drawing: Drawing, pts: Pt[], cursor: Pt): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const tol = strokeTolerance(drawing.style);\n for (let i = 1; i < pts.length; i++) {\n if (distToSegment(cursor.x, cursor.y, pts[i - 1], pts[i]) <= tol) return { hit: \"body\" };\n }\n if (drawing.kind === \"xabcd-pattern\" || drawing.kind === \"cypher-pattern\") {\n if (pts.length >= 3 && pointInPolygon(cursor.x, cursor.y, [pts[0], pts[1], pts[2]])) return { hit: \"body\" };\n if (pts.length >= 5 && pointInPolygon(cursor.x, cursor.y, [pts[2], pts[3], pts[4]])) return { hit: \"body\" };\n return null;\n }\n if (FILLED_PATTERN_KINDS.has(drawing.kind) && pts.length >= 3 && pointInPolygon(cursor.x, cursor.y, pts)) {\n return { hit: \"body\" };\n }\n // TV PolygonRenderer.hitTest: a closed + filled polyline also hits on its\n // closing side and inside.\n if (drawing.kind === \"polyline\" && drawing.closed === true && drawing.style.fillBackground !== false && pts.length >= 2) {\n if (distToSegment(cursor.x, cursor.y, pts[pts.length - 1], pts[0]) <= tol) return { hit: \"body\" };\n if (pts.length >= 3 && pointInPolygon(cursor.x, cursor.y, pts)) return { hit: \"body\" };\n }\n return null;\n}\n\n/** Freehand stroke (brush/highlighter): the sampled path has many vertices, but\n * only its two endpoints are draggable handles — the rest is body (the whole\n * stroke moves together). Mirrors how the overlay renders freehand handles. */\nfunction freehandHit(pts: Pt[], cursor: Pt, tol = HIT_TOLERANCE): HitResult | null {\n if (pts.length === 0) return null;\n const last = pts.length - 1;\n if (Math.hypot(pts[0].x - cursor.x, pts[0].y - cursor.y) <= HANDLE_R) return { hit: \"handle\", handleIndex: 0 };\n if (Math.hypot(pts[last].x - cursor.x, pts[last].y - cursor.y) <= HANDLE_R) return { hit: \"handle\", handleIndex: last };\n return polylineHit(pts, cursor, tol);\n}\n\nfunction sampledHit(samples: Pt[], pts: Pt[], cursor: Pt, tol = HIT_TOLERANCE): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n return polylineHit(samples, cursor, tol);\n}\n\n/** Cyclic lines (TV): vertical lines from p0 stepping by the SIGNED p0→p1\n * interval — one direction only, to the pane edge — plus the dashed anchor\n * connector. Any repeat line or the connector is the body. */\nfunction cyclicLinesHit(pts: Pt[], cursor: Pt, paneW: number, tol: number): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const [p1, p2] = pts;\n const unit = p2.x - p1.x;\n if (Math.abs(unit) < 1e-3) return null;\n for (let x = p1.x; unit > 0 ? x <= paneW + tol : x >= -tol; x += unit) {\n if (Math.abs(cursor.x - x) <= tol) return { hit: \"body\" };\n }\n if (distToSegment(cursor.x, cursor.y, p1, p2) <= tol) return { hit: \"body\" };\n return null;\n}\n\n/** Time cycles (TV): contiguous semicircles of diameter = the anchor Δx,\n * bulging UP from the baseline at p0.y, repeated across the whole pane. */\nfunction timeCyclesHit(pts: Pt[], cursor: Pt, paneW: number, tol: number): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const [p1, p2] = pts;\n const unit = Math.abs(p2.x - p1.x);\n if (unit < 1e-3) return null;\n const baseY = p1.y;\n if (cursor.y - baseY > tol) return null; // arcs live above the baseline\n const r = unit / 2;\n const startX = Math.min(p1.x, p2.x);\n const k0 = Math.floor((-startX) / unit) - 1;\n const k1 = Math.ceil((paneW - startX) / unit) + 1;\n for (let k = k0; k <= k1; k++) {\n const cx = startX + k * unit + r;\n const dist = Math.hypot(cursor.x - cx, cursor.y - baseY);\n if (Math.abs(dist - r) <= tol) return { hit: \"body\" };\n }\n return null;\n}\n\n/* ---------- text annotations (the boxes as drawn: kinds/text-tools layouts) ---------- */\n\n/** TV price note: the line, then the price label box at P1\n * (kinds/price-note.ts). */\nfunction priceNoteHit(d: Drawing, pts: Pt[], cursor: Pt, coords: Coords | null | undefined): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n if (pts[1] && distToSegment(cursor.x, cursor.y, pts[0], pts[1]) <= HIT_TOLERANCE) return { hit: \"body\" };\n const pip = coords?.pipSize() ?? 0.01;\n const box = priceNoteLabel(d, pts, Math.max(0, Math.min(8, Math.round(-Math.log10(pip)))))?.box;\n if (box && cursor.x >= box.left && cursor.x <= box.left + box.width && cursor.y >= box.top && cursor.y <= box.top + box.height) return { hit: \"body\" };\n return null;\n}\n\n\n/** Regression trend: hit the base line or either deviation band, extended\n * right when the drawing extends (recomputed from the bars via the shared\n * helper so the hit region matches the rendered shape exactly). Falls back to\n * the stored segment when there's no data. */\nfunction regressionHit(d: Drawing, pts: Pt[], cursor: Pt, width: number, coords: Coords | null): HitResult | null {\n const lines = regressionScreenLines(d, coords, width);\n // Anchors sit on the base line (TV _updateAnchorsPrice).\n const h = endpointHit(lines ? lines.anchors : pts, cursor);\n if (h) return h;\n if (!lines) return lineHit(pts, cursor);\n const segs: ([Pt, Pt] | null)[] = [lines.center, lines.upper, lines.lower];\n for (const seg of segs) {\n if (seg && distToSegment(cursor.x, cursor.y, seg[0], seg[1]) <= HIT_TOLERANCE) {\n return { hit: \"body\" };\n }\n }\n return null;\n}\n\n/** Anchored VWAP: handle at the anchor + the actual computed curve and any\n * visible ±σ band (recomputed via the shared helper). Falls back to a\n * near-anchor ray before bars load. */\nfunction vwapHit(d: Drawing, pts: Pt[], cursor: Pt, coords: Coords | null): HitResult | null {\n if (Math.hypot(pts[0].x - cursor.x, pts[0].y - cursor.y) <= HANDLE_R) {\n return { hit: \"handle\", handleIndex: 0 };\n }\n const series = vwapScreenSeries(d, coords);\n if (series.line.length < 2) return horizontalRayHit(pts, cursor);\n const center = polylineHit(series.line, cursor);\n if (center) return center;\n for (const band of series.bands) {\n if (band.upper.length >= 2 && vwapBandLine(d.style, band.index, \"upper\").visible && polylineHit(band.upper, cursor)) return { hit: \"body\" };\n if (band.lower.length >= 2 && vwapBandLine(d.style, band.index, \"lower\").visible && polylineHit(band.lower, cursor)) return { hit: \"body\" };\n }\n return null;\n}\n\n/** Position forecast: endpoint handles + the quarter-ellipse vector (TV hit\n * tests the ellipse; the source/target balloons stay grabbable through their\n * anchor handles). */\nfunction forecastHit(pts: Pt[], cursor: Pt, tol = HIT_TOLERANCE): HitResult | null {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n return polylineHit(forecastArcSamples(pts[0], pts[1]), cursor, tol);\n}\n\n/** Flag marker: anchor handle at pts[0]; body covers the pole + the banner that\n * flies up-and-right of it (matches renderFlagMark's box). */\nfunction flagMarkHit(pts: Pt[], cursor: Pt): HitResult | null {\n const c = pts[0];\n if (Math.hypot(c.x - cursor.x, c.y - cursor.y) <= HANDLE_R) return { hit: \"handle\", handleIndex: 0 };\n const POLE_H = 22, FLAG_W = 17;\n if (\n cursor.x >= c.x - HIT_TOLERANCE && cursor.x <= c.x + FLAG_W + HIT_TOLERANCE &&\n cursor.y >= c.y - POLE_H - HIT_TOLERANCE && cursor.y <= c.y + HIT_TOLERANCE\n ) {\n return { hit: \"body\" };\n }\n return null;\n}\n\n/** Ghost feed: per-vertex anchors + a per-leg segment test widened to the\n * candle band (the synthetic candles ride each drift leg within roughly ± one\n * frozen amplitude). Legacy feeds without frozen params render as a box and\n * keep the bbox hit model. */\nfunction ghostFeedHit(drawing: Drawing, pts: Pt[], cursor: Pt, coords: Coords | null): HitResult | null {\n if (!drawing.ghost) return rectangleHit(pts, cursor);\n const h = endpointHit(pts, cursor);\n if (h) return h;\n let band = HIT_TOLERANCE;\n if (coords) {\n const y0 = coords.priceToY(drawing.points[0].price);\n const y1 = coords.priceToY(drawing.points[0].price + drawing.ghost.amplitude);\n if (y0 != null && y1 != null) band = Math.max(band, Math.abs(y1 - y0));\n }\n for (let i = 1; i < pts.length; i++) {\n if (distToSegment(cursor.x, cursor.y, pts[i - 1], pts[i]) <= band) return { hit: \"body\" };\n }\n return null;\n}\n\n/** Dispatch entry point — projected screen points + the pane size (width/\n * height are needed by full-extent kinds like horizontal-line). */\nexport function hitTestKind(\n drawing: Drawing,\n pts: Pt[],\n cursor: Pt,\n width: number,\n height: number,\n coords: Coords | null,\n /** The drawing is selected (table: its row / column edges resize). */\n selected = false,\n): HitResult | null {\n // Stroked-line kinds get a hit slop that scales with the drawing's width.\n const tol = strokeTolerance(drawing.style);\n switch (drawing.kind) {\n case \"horizontal-line\":\n return horizontalLineHit(pts, cursor, width, tol);\n case \"horizontal-ray\":\n return horizontalRayHit(pts, cursor, tol);\n case \"vertical-line\":\n return verticalLineHit(pts, cursor, height, tol);\n case \"cross-line\":\n return crossLineHit(pts, cursor, tol);\n case \"arrow-mark-up\":\n case \"arrow-mark-down\":\n return arrowMarkHit(drawing, pts, cursor, drawing.kind === \"arrow-mark-up\" ? \"up\" : \"down\");\n case \"font-icon\":\n return glyphHitTest(pts, cursor);\n case \"table\": {\n // TV: corner anchors, then (selected) the row / column edges, then a\n // cell (body, with its index for the in-place editor).\n const l = tableLayout(drawing, pts[0]);\n const a = endpointHit(tableAnchors(l), cursor);\n if (a) return a;\n const r = tableHitCell(l, cursor, selected);\n if (!r) return null;\n return \"edge\" in r ? { hit: \"handle\", handleIndex: tableEdgeIndex(r.edge) } : { hit: \"body\", cell: r.cell };\n }\n case \"image\": {\n // TV: nothing is drawn (or hit) until the image is loaded.\n const b = imageBox(drawing, pts[0]);\n if (!b) return null;\n const a = endpointHit(imageAnchors(b), cursor);\n if (a) return a;\n return cursor.x >= b.left && cursor.x <= b.right && cursor.y >= b.top && cursor.y <= b.bottom ? { hit: \"body\" } : null;\n }\n case \"price-label\": {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const b = priceLabelLayout(drawing.points[0].price.toFixed(Math.max(0, Math.min(8, Math.round(-Math.log10(coords?.pipSize() ?? 0.01))))), pts[0], drawing.style.fontSize ?? 14);\n return inBox(cursor, { left: b.x, top: b.y, width: b.w, height: b.h }) ? { hit: \"body\" } : null;\n }\n case \"flag-mark\":\n return flagMarkHit(pts, cursor);\n case \"trend-line\":\n case \"ray\":\n case \"extended-line\":\n case \"info-line\":\n case \"arrow\":\n case \"trend-angle\":\n return extendableLineHit(drawing, pts, cursor, width, height);\n case \"arrow-marker\":\n return lineHit(pts, cursor, tol);\n case \"position-forecast\":\n return forecastHit(pts, cursor, tol);\n case \"long-position\":\n case \"short-position\":\n return positionHit(drawing, pts, cursor, coords);\n case \"bar-pattern\":\n return barsPatternHit(drawing, pts, cursor, coords, tol);\n case \"ghost-feed\":\n return ghostFeedHit(drawing, pts, cursor, coords);\n case \"gann-box\":\n return rectangleHit(pts, cursor);\n case \"gann-fan\":\n return gannFanHit(drawing, pts, cursor, width, height);\n case \"fib-time-zone\":\n return fibTimeZoneHit(drawing, pts, cursor, tol);\n case \"fib-circles\":\n return fibCirclesHit(drawing, pts, cursor);\n case \"fib-speed-resistance-fan\":\n return speedFanHit(drawing, pts, cursor, width, coords);\n case \"pitchfan\":\n return pitchfanHit(drawing, pts, cursor, width);\n case \"fib-wedge\":\n return wedgeHit(drawing, pts, cursor);\n case \"trend-based-fib-time\":\n return trendFibTimeHit(drawing, pts, cursor, tol, coords);\n case \"gann-square-fixed\":\n case \"gann-square\":\n return gannSquareHit(drawing, pts, cursor);\n case \"sector\":\n return sectorHit(pts, cursor);\n case \"fib-speed-resistance-arcs\":\n return arcsHit(drawing, pts, cursor);\n case \"fib-spiral\":\n return sampledHit(spiralSamples(pts[0], pts[1], !!drawing.style.counterclockwise), pts, cursor, tol);\n case \"sine-line\":\n return sampledHit(sineSamples(pts[0], pts[1], width), pts, cursor, tol);\n case \"time-cycles\":\n return timeCyclesHit(pts, cursor, width, tol);\n case \"cyclic-lines\":\n return cyclicLinesHit(pts, cursor, width, tol);\n case \"curve\":\n return sampledHit(\n bezierSamples(pts, !!drawing.style.extendLeft, !!drawing.style.extendRight),\n pts,\n cursor,\n tol,\n );\n case \"arc\":\n return sampledHit(\n (pts.length === 3 ? arcSamples(pts[0], pts[1], pts[2]) : null) ?? [pts[0], pts[1]],\n pts,\n cursor,\n tol,\n );\n case \"double-curve\":\n return sampledHit(\n cubicSamples(pts, !!drawing.style.extendLeft, !!drawing.style.extendRight),\n pts,\n cursor,\n tol,\n );\n case \"text\": {\n // TV text: the box; with word wrap (selected) the right-middle anchor\n // (index 1) sets the wrap width.\n const l = textToolLayout(drawing, pts[0]);\n if (selected && drawing.style.wordWrap) {\n const h = endpointHit([pts[0], { x: l.box.left + l.box.width, y: l.box.top + l.box.height / 2 }], cursor);\n if (h && h.hit === \"handle\" && h.handleIndex === 1) return h;\n }\n return inBox(cursor, l.box) ? { hit: \"body\" } : null;\n }\n case \"comment\": {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n return inBox(cursor, commentLayout(drawing, pts[0]).l.box) ? { hit: \"body\" } : null;\n }\n case \"pin\": {\n // TV pin: the marker; the tooltip only while shown (hover / selection).\n const t = pinLayout(drawing, pts[0], width);\n const m = t.marker;\n if (cursor.x >= m.left && cursor.x <= m.right && cursor.y >= m.top && cursor.y <= m.bottom) return { hit: \"body\" };\n if (selected && inBox(cursor, { left: t.left, top: t.top, width: t.width, height: t.height })) return { hit: \"body\" };\n return null;\n }\n case \"signpost\": {\n // TV: the anchor (label point), the pole (3px), the plate, the label.\n if (!coords) return null;\n const g = signpostLayout(drawing, pts[0], coords, height);\n if (Math.hypot(g.anchor.x - cursor.x, g.anchor.y - cursor.y) <= HANDLE_R) return { hit: \"handle\", handleIndex: 0 };\n if (distToSegment(cursor.x, cursor.y, { x: g.x, y: g.poleStart }, { x: g.x, y: g.poleEnd }) < 3) return { hit: \"body\" };\n if (drawing.style.showImage && Math.hypot(cursor.x - g.x, cursor.y - g.plateY) <= 38) return { hit: \"body\" };\n return inBox(cursor, g.l.box) ? { hit: \"body\" } : null;\n }\n case \"note\": {\n // TV text note: the leader line or the label box around P1.\n const h = endpointHit(pts, cursor);\n if (h) return h;\n if (pts[1] && distToSegment(cursor.x, cursor.y, pts[0], pts[1]) <= HIT_TOLERANCE) return { hit: \"body\" };\n // The box as drawn (noteLayout); TV TextRenderer.hitTest: inside it.\n if (pts[1] && inBox(cursor, noteLayout(drawing, drawing.style, pts[0], pts[1]).box)) return { hit: \"body\" };\n return null;\n }\n case \"price-note\":\n return priceNoteHit(drawing, pts, cursor, coords);\n case \"callout\": {\n // TV callout: p0 (3px), the wrap anchor (index 1, while wrapping), the\n // box.\n const c = calloutLayout(drawing, pts[1]);\n if (Math.hypot(pts[0].x - cursor.x, pts[0].y - cursor.y) <= HANDLE_R) return { hit: \"handle\", handleIndex: 0 };\n if (selected && c.wrap != null && Math.hypot(pts[1].x + c.wrap / 2 + 10 - cursor.x, pts[1].y - cursor.y) <= HANDLE_R) return { hit: \"handle\", handleIndex: 1 };\n return inBox(cursor, { left: c.x, top: c.y, width: c.w, height: c.h }) ? { hit: \"body\" } : null;\n }\n case \"regression-trend\":\n return regressionHit(drawing, pts, cursor, width, coords);\n case \"fixed-range-volume-profile\": {\n const h = endpointHit(pts, cursor);\n if (h) return h;\n const box = fixedVpBox(drawing, pts, coords);\n if (!box) return null;\n return cursor.x >= box.left && cursor.x <= box.right && cursor.y >= box.top && cursor.y <= box.bottom ? { hit: \"body\" } : null;\n }\n case \"anchored-volume-profile\": {\n const h = endpointHit([pts[0]], cursor);\n if (h) return h;\n const box = anchoredVpBox(drawing, pts, coords);\n if (!box) return null;\n return cursor.x >= box.left && cursor.x <= box.right && cursor.y >= box.top && cursor.y <= box.bottom ? { hit: \"body\" } : null;\n }\n case \"anchored-vwap\":\n return vwapHit(drawing, pts, cursor, coords);\n case \"abcd-pattern\":\n case \"xabcd-pattern\":\n case \"cypher-pattern\":\n case \"head-and-shoulders\":\n case \"triangle-pattern\":\n case \"three-drives-pattern\":\n case \"elliott-impulse\":\n case \"elliott-correction\":\n case \"elliott-triangle\":\n case \"elliott-double-combo\":\n case \"elliott-triple-combo\":\n case \"polyline\":\n case \"path\":\n return labeledPolylineHit(drawing, pts, cursor);\n case \"brush\":\n case \"highlighter\":\n return freehandHit(pts, cursor, tol);\n case \"parallel-channel\":\n return parallelChannelHit(drawing, pts, cursor, tol, width, height);\n case \"disjoint-channel\":\n return disjointChannelHit(drawing, pts, cursor, tol, width, height);\n case \"flat-top-bottom\":\n return channelHit(drawing, pts, cursor, tol, width, height);\n case \"pitchfork\":\n case \"schiff-pitchfork\":\n case \"modified-schiff-pitchfork\":\n case \"inside-pitchfork\":\n return pitchforkHit(drawing, pts, cursor, width, height);\n case \"fib-channel\":\n return fibChannelHit(drawing, pts, cursor, tol, width, height);\n case \"rotated-rectangle\":\n return rotatedRectHit(drawing, pts, cursor);\n case \"trend-based-fib-extension\":\n return fibExtHit(drawing, pts, cursor);\n case \"fib-retracement\":\n return fibHit(drawing, pts, cursor);\n case \"rectangle\": {\n // TV rectangles carry 8 anchors: 4 corners + 4 edge midpoints; the\n // text box hits too (TV TextRenderer), also outside the box.\n const pw = coords?.timeAxis().width || width;\n const r = rectangleHit(pts, cursor, true);\n if (r) return r;\n // TV extend: the box runs to the pane edge on the extended side.\n if (drawing.style.extendLeft || drawing.style.extendRight) {\n const top = Math.min(pts[0].y, pts[1].y);\n const bottom = Math.max(pts[0].y, pts[1].y);\n const l = drawing.style.extendLeft ? 0 : Math.min(pts[0].x, pts[1].x);\n const rr = drawing.style.extendRight ? pw : Math.max(pts[0].x, pts[1].x);\n if (cursor.x >= l && cursor.x <= rr && cursor.y >= top - HIT_TOLERANCE && cursor.y <= bottom + HIT_TOLERANCE) return { hit: \"body\" };\n }\n const box = rectangleTextLayout(drawing, pts, pw)?.box;\n return box && cursor.x >= box.left && cursor.x <= box.left + box.width && cursor.y >= box.top && cursor.y <= box.top + box.height ? { hit: \"body\" } : null;\n }\n case \"circle\":\n return circleHit(pts, cursor);\n case \"ellipse\":\n return ellipse3Hit(pts, cursor);\n case \"price-range\":\n return priceRangeHit(drawing, pts, cursor, width);\n case \"date-range\":\n return dateRangeHit(pts, cursor);\n case \"date-and-price-range\":\n // TV: 2 anchors (P0, P1) + the box.\n return dateRangeHit(pts, cursor);\n case \"triangle\":\n return triangleHit(pts, cursor);\n }\n}\n","/*\n * Colour helpers (moved from OpenTrader ColorPanel): a colour is a hex\n * (opacity 100) or an rgba() string; opacity in percent.\n */\n\nexport function hexToRgb(hex: string): [number, number, number] {\n const m = hex.replace(\"#\", \"\");\n const n = m.length === 3 ? m.split(\"\").map((c) => c + c).join(\"\") : m;\n return [parseInt(n.slice(0, 2), 16), parseInt(n.slice(2, 4), 16), parseInt(n.slice(4, 6), 16)];\n}\n\nexport function parseColor(v: string): { hex: string; opacity: number } {\n if (/^rgba?\\(/.test(v)) {\n const m = v.match(/[\\d.]+/g);\n if (m && m.length >= 3) {\n const hex = \"#\" + m.slice(0, 3).map((x) => Number(x).toString(16).padStart(2, \"0\")).join(\"\");\n return { hex: hex.toUpperCase(), opacity: m[3] != null ? Math.round(Number(m[3]) * 100) : 100 };\n }\n }\n return { hex: (v || \"#000000\").toUpperCase(), opacity: 100 };\n}\n\nexport function applyOpacity(hex: string, opacity: number): string {\n if (opacity >= 100) return hex;\n const [r, g, b] = hexToRgb(hex);\n return `rgba(${r}, ${g}, ${b}, ${(opacity / 100).toFixed(2)})`;\n}\n\n/** TV colorFromBackground: black text on a light label (grey value\n * 0.199·R + 0.687·G + 0.114·B ≥ 150), white otherwise. */\nexport function textOnColor(bg: string): string {\n let r = 0, g = 0, b = 0;\n const m = bg.match(/^#([0-9a-f]{6})/i);\n if (m) {\n const n = parseInt(m[1], 16);\n r = n >> 16; g = (n >> 8) & 255; b = n & 255;\n } else {\n const c = bg.match(/rgba?\\(\\s*(\\d+)[\\s,]+(\\d+)[\\s,]+(\\d+)/i);\n if (c) { r = +c[1]; g = +c[2]; b = +c[3]; }\n }\n return 0.199 * r + 0.687 * g + 0.114 * b >= 150 ? \"#000000\" : \"#ffffff\";\n}\n","/*\n * Axis labels of a drawing (port phase 3; the rules of OpenTrader's overlay:\n * renderAxisParts + the price-line sync):\n * - vertical / cross line with Show time: its time on the time axis, in the\n * line colour (TV showTime);\n * - long / short position (Price labels on by default): the entry, target\n * and stop prices on the price axis (grey, green, red);\n * - any other tool with Price labels: the price of each point, in the\n * line colour (a vertical line has none);\n * - anchored VWAP (Price label on by default): the VWAP's last value.\n * Text colour: black on a light label, white otherwise (textOnColor).\n */\nimport type { Time } from \"lightweight-charts\";\nimport type { Pt } from \"../_shared\";\nimport type { Coords } from \"../coords\";\nimport type { Drawing } from \"../types\";\nimport { parseColor, textOnColor } from \"../color\";\nimport { positionAnchors } from \"./position\";\nimport { vwapLastValue } from \"./data-series\";\n\nexport type PriceAxisLabel = { price: number; back: string; color: string };\nexport type TimeAxisLabel = { time: Time; back: string; color: string };\n\nconst label = <T extends object>(v: T, back: string) => ({ ...v, back, color: textOnColor(back) });\n\nexport function drawingAxisLabels(d: Drawing, pts: Pt[], coords: Coords): { price: PriceAxisLabel[]; time: TimeAxisLabel[] } {\n const s = d.style;\n const price: PriceAxisLabel[] = [];\n const time: TimeAxisLabel[] = [];\n if (d.kind === \"vertical-line\" || d.kind === \"cross-line\") {\n if (s.showTime && d.points[0]) time.push(label({ time: d.points[0].time }, parseColor(s.color).hex));\n }\n if (d.kind === \"long-position\" || d.kind === \"short-position\") {\n if (s.showPriceLabels !== false) {\n const pa = positionAnchors(d, pts, coords);\n if (pa) {\n const entry = d.points[0].price;\n const sign = d.kind === \"long-position\" ? 1 : -1;\n price.push(label({ price: entry }, \"#787b86\"), label({ price: entry + sign * pa.profit }, \"#089981\"), label({ price: entry - sign * pa.stop }, \"#f23645\"));\n }\n }\n return { price, time };\n }\n if (d.kind === \"anchored-vwap\") {\n if (s.vwapPriceLabel !== false) {\n const v = vwapLastValue(d, coords);\n if (v != null) price.push(label({ price: v }, parseColor(s.color).hex));\n }\n return { price, time };\n }\n if (s.showPriceLabels && d.kind !== \"vertical-line\") {\n for (const p of d.points) price.push(label({ price: p.price }, parseColor(s.color).hex));\n }\n return { price, time };\n}\n","/*\n * Text helpers shared by the scene builders (moved from OpenTrader\n * DrawingsOverlay, port phase 2): text measuring in the chart font, TV\n * number / time formatters, TV text-box labels and the channel / trend line\n * label (geometry + scene items).\n */\nimport type { Pt } from \"../_shared\";\nimport type { DrawingStyle } from \"../types\";\nimport { measureTextStyled, type tvTextLayout } from \"../kinds/tv-text\";\nimport type { SceneItem } from \"./types\";\n\nlet measureCtx: CanvasRenderingContext2D | null = null;\nlet bodyFont: string | null = null;\nfunction ctx2d(): CanvasRenderingContext2D | null {\n if (!measureCtx) measureCtx = document.createElement(\"canvas\").getContext(\"2d\");\n return measureCtx;\n}\n/** Width of `text` in the chart (page body) font. */\nexport function measureText(text: string, fontSize: number): number {\n const c = ctx2d();\n if (!c) return text.length * fontSize * 0.6;\n bodyFont ??= getComputedStyle(document.body).fontFamily;\n c.font = `${fontSize}px ${bodyFont}`;\n return c.measureText(text).width;\n}\n/** Width of `text` in the bold chart font. */\nexport function measureTextBold(text: string, fontSize: number): number {\n const c = ctx2d();\n if (!c) return text.length * fontSize * 0.65;\n bodyFont ??= getComputedStyle(document.body).fontFamily;\n c.font = `bold ${fontSize}px ${bodyFont}`;\n return c.measureText(text).width;\n}\n/** Width of `text` in a given font family. */\nexport function measureTextFont(text: string, fontSize: number, fontFamily: string): number {\n const c = ctx2d();\n if (!c) return text.length * fontSize * 0.6;\n c.font = `${fontSize}px ${fontFamily}`;\n return c.measureText(text).width;\n}\n\n/** Signed number with TV's minus sign (U+2212). */\nexport function signedFixed(v: number, digits: number): string {\n const t = Math.abs(v).toFixed(digits);\n return v < 0 ? `−${t}` : t;\n}\n\n/** TV TimeSpanFormatter: \"1d 21h 30m\", zero parts omitted. */\nexport function tvTimeSpan(seconds: number): string {\n const neg = seconds < 0;\n let t = Math.abs(Math.round(seconds));\n const dd = Math.floor(t / 86400);\n t -= dd * 86400;\n const hh = Math.floor(t / 3600);\n t -= hh * 3600;\n const mm = Math.floor(t / 60);\n t -= mm * 60;\n const parts: string[] = [];\n if (dd) parts.push(`${dd.toLocaleString(\"en-US\")}d`);\n if (hh) parts.push(`${hh}h`);\n if (mm) parts.push(`${mm}m`);\n if (t) parts.push(`${t}s`);\n const out = parts.join(\" \");\n return neg ? `-${out}` : out;\n}\n\n/** TV volume formatter: up to 2 decimals, unit after a narrow no-break\n * space (U+202F): \"519.06 K\", \"1.5 M\", \"2 B\". */\nexport function tvVolume(v: number): string {\n const units: [number, string][] = [[1e9, \" B\"], [1e6, \" M\"], [1e3, \" K\"]];\n for (const [div, u] of units) if (Math.abs(v) >= div) return `${Number((v / div).toFixed(2))}${u}`;\n return String(Math.round(v));\n}\n\n/** TV needTextExclusionPath: the line runs through the text only when the\n * text has an odd number of lines and the middle one is not blank. */\nexport function textCrossesLine(lines: string[]): boolean {\n return lines.length % 2 === 1 && lines[Math.floor(lines.length / 2)].trim() !== \"\";\n}\n\n/** Label text box polygon (TV TextRenderer `_getBox` + `getPolygonPoints`):\n * widest line + 2·padH wide, lines·lineH + 2·padV high, placed at `u` by the\n * alignment (Bottom = box above u, Top = below, Middle = centred; Left = box\n * starts at u, Right = ends at u, Center = centred), rotated by `angle`\n * (degrees) around u. */\nexport function labelBoxPolygon(\n u: Pt, angle: number, lines: string[], fs: number, lineH: number, padV: number, padH: number,\n vert: string, horz: string, bold: boolean, italic: boolean,\n): Pt[] {\n const bw = Math.max(0, ...lines.map((l) => measureTextStyled(l, fs, bold, italic))) + 2 * padH;\n const bh = lines.length * lineH + 2 * padV;\n const left = horz === \"left\" ? u.x : horz === \"right\" ? u.x - bw : u.x - bw / 2;\n const top = vert === \"bottom\" ? u.y - bh : vert === \"top\" ? u.y : u.y - bh / 2;\n const a = (angle * Math.PI) / 180;\n const cos = Math.cos(a), sin = Math.sin(a);\n const rot = (x: number, y: number): Pt => ({ x: (x - u.x) * cos - (y - u.y) * sin + u.x, y: (x - u.x) * sin + (y - u.y) * cos + u.y });\n return [rot(left, top), rot(left + bw, top), rot(left + bw, top + bh), rot(left, top + bh)];\n}\n\n/** TV TextRenderer text box as scene items (a rotated group of lines,\n * centre baseline). */\nexport function tvTextItems(layout: ReturnType<typeof tvTextLayout>, color: string, bold?: boolean, italic?: boolean): SceneItem {\n return {\n t: \"group\",\n transform: layout.rotate,\n inert: true,\n items: layout.lines.map((ln, k) => ({\n t: \"text\" as const,\n x: layout.tx,\n y: layout.y0 + k * layout.lineStep,\n text: ln,\n size: layout.fs,\n anchor: layout.anchor,\n baseline: \"central\" as const,\n weight: bold ? 700 : 400,\n fontStyle: italic ? (\"italic\" as const) : (\"normal\" as const),\n fill: color,\n pre: true,\n })),\n };\n}\n\n/** Channel / trend line label geometry (TV line tools with a text on the\n * line: parallel channel, trend line family): which edge carries it by the\n * vertical alignment, where along it by the horizontal alignment, rotated\n * with the edge. */\nexport function channelLabelGeom(e: Pt, t: Pt, i: Pt, n: Pt, s: DrawingStyle, padHArg?: number) {\n const text = s.text ?? \"\";\n if (text === \"\") return null;\n const vert = s.vertLabelsAlign ?? \"bottom\";\n const horz = s.horzLabelsAlign ?? \"left\";\n const mid = vert === \"middle\";\n let l: Pt;\n let r: Pt;\n if (vert === \"bottom\") [l, r] = e.y < i.y ? [e, t] : [i, n];\n else if (vert === \"top\") [l, r] = e.y > i.y ? [e, t] : [i, n];\n else [l, r] = [{ x: (e.x + i.x) / 2, y: (e.y + i.y) / 2 }, { x: (t.x + n.x) / 2, y: (t.y + n.y) / 2 }];\n const c = l.x < r.x ? l : r;\n const h = c === l ? r : l;\n const u = horz === \"left\" ? c : horz === \"right\" ? h : { x: (c.x + h.x) / 2, y: (c.y + h.y) / 2 };\n const rad = Math.atan((c.y - h.y) / (c.x - h.x));\n const angle = Number.isNaN(rad) ? 0 : (rad * 180) / Math.PI;\n const fs = s.fontSize ?? 14;\n const padV = fs / 3;\n const padH = padHArg ?? (mid ? padV : 0);\n const lines = text.split(\"\\n\");\n const lineH = Math.ceil(fs);\n const boxH = lines.length * lineH + 2 * padV;\n const top = vert === \"bottom\" ? u.y - boxH : vert === \"top\" ? u.y : u.y - boxH / 2;\n const x = horz === \"left\" ? u.x + padH : horz === \"right\" ? u.x - padH : u.x;\n const anchor: \"start\" | \"end\" | \"middle\" = horz === \"left\" ? \"start\" : horz === \"right\" ? \"end\" : \"middle\";\n return { u, angle, fs, lines, lineH, top: top + padV, x, anchor, vert, horz, padV, padH };\n}\n\n/** The channel / trend line label as scene items (nothing without text). */\nexport function channelLabelItems(e: Pt, t: Pt, i: Pt, n: Pt, s: DrawingStyle, padH?: number): SceneItem[] {\n const v = channelLabelGeom(e, t, i, n, s, padH);\n if (!v) return [];\n return [\n {\n t: \"group\",\n transform: `rotate(${v.angle} ${v.u.x} ${v.u.y})`,\n inert: true,\n items: v.lines.map((ln, k) => ({\n t: \"text\" as const,\n x: v.x,\n y: v.top + k * v.lineH,\n text: ln,\n size: v.fs,\n anchor: v.anchor,\n baseline: \"hanging\" as const,\n weight: s.bold ? 700 : 400,\n fontStyle: s.italic ? (\"italic\" as const) : (\"normal\" as const),\n fill: s.textColor ?? s.color,\n pre: true,\n })),\n },\n ];\n}\n\n/** Channel / trend line label box to cut out of the lines: Middle alignment\n * only; `always` = cut without the odd-line test (TV parallel channel). */\nexport function channelLabelCutPoly(e: Pt, t: Pt, i: Pt, n: Pt, s: DrawingStyle, padH: number | undefined, always: boolean): Pt[] | null {\n const g = channelLabelGeom(e, t, i, n, s, padH);\n if (!g || g.vert !== \"middle\") return null;\n if (!always && !textCrossesLine(g.lines)) return null;\n return labelBoxPolygon(g.u, g.angle, g.lines, g.fs, g.lineH, g.padV, g.padH, g.vert, g.horz, !!s.bold, !!s.italic);\n}\n","/*\n * Line tools as scenes (moved from OpenTrader DrawingsOverlay, port phase 2):\n * horizontal / vertical / cross line, trend line, ray, extended line,\n * horizontal ray, info line, trend angle, arrow (a trend line with a right\n * end arrow). TradingView geometry: labels (TextRenderer), label cut-outs,\n * line end arrows, middle point, stats box.\n */\nimport { dashFor, timeToSec, type Pt } from \"../_shared\";\nimport type { Coords } from \"../coords\";\nimport type { Drawing, DrawingStyle } from \"../types\";\nimport { tvTextLayout } from \"../kinds/tv-text\";\nimport type { Scene, SceneItem } from \"./types\";\nimport { channelLabelCutPoly, channelLabelItems, measureText, signedFixed, textCrossesLine, tvTextItems, tvTimeSpan } from \"./text\";\n\n/** Square (one-axis) anchor indices per tool, from TV's line-tool bundles\n * (`lineSourcePaneViewPointToLineAnchorPoint(…, square = true)`). */\nexport const SQUARE_ANCHORS = {\n rectangle: [4, 5, 6, 7], // edge midpoints (line-tool-rectangle)\n disjointChannel: [2], // offset-edge end at p1.x (line-tool-disjoint-channel)\n parallelChannel: [4, 5], // the two middle anchors (line-tool-parallel-channel)\n position: [1, 2, 3], // close point, stop, target (line-tool-risk-reward)\n single: [0], // horizontal line, vertical line, signpost pole\n} as const;\n\n/** TV trend angle arc radius. */\nexport const TREND_ANGLE_ARC_R = 50;\n\n/** TV stats icons (18 x 18, fill; modules 174588 price range, 567075 bars\n * range, 521722 angle). */\nexport const STAT_ICONS: Record<\"price\" | \"bars\" | \"angle\", string> = {\n price: \"M3 2h11v1H3V2Zm5.5 1.8.35.35 2 2 .36.35-.71.7-.35-.35L9 5.71v6.58l1.15-1.14.35-.36.7.71-.35.35-2 2-.35.36-.35-.36-2-2-.36-.35.71-.7.35.35L8 12.29V5.71L6.85 6.85l-.35.36-.7-.71.35-.35 2-2 .35-.36ZM3.5 16H3v-1h11v1H3.5Z\",\n bars: \"M2 3v2H1v9h1v2h1v-2h1V5H3V3H2Zm6.2 4.5-.35.35L6.71 9h4.58l-1.14-1.15-.36-.35.71-.7.35.35 2 2 .36.35-.36.35-2 2-.35.36-.7-.71.35-.35L11.29 10H6.71l1.14 1.15.36.35-.71.7-.35-.35-2-2-.36-.35.36-.35 2-2 .35-.36.7.71ZM3 6H2v7h1V6Zm12-2.5V3h1v2h1v9h-1v2h-1v-2h-1V5h1V3.5ZM15 6h1v7h-1V6Z\",\n angle: \"M8.55 2.78 2.7 15H15v-1h-4.01a6.2 6.2 0 0 0-1.36-3.95 7.94 7.94 0 0 0-2.57-1.83l2.4-5-.91-.44ZM6.63 9.12 4.29 14H10a5.18 5.18 0 0 0-1.12-3.3 6.93 6.93 0 0 0-2.24-1.58Z\",\n};\n\nexport type StatRow = { icon: \"price\" | \"bars\" | \"angle\"; text: string };\n\n/** TV stats rows of a two-point line tool (price / percent / pips, bars /\n * date-time / distance, angle), by the style flags. */\nexport function tvStatRows(d: Drawing, a: Pt, b: Pt, s: DrawingStyle, coords: Coords | null, withExtras: boolean): StatRow[] {\n const p0 = d.points[0];\n const p1 = d.points[1];\n if (!p0 || !p1) return [];\n const rows: StatRow[] = [];\n const dPrice = p1.price - p0.price;\n const pip = coords?.pipSize() ?? 0.01;\n const digits = Math.max(0, Math.min(8, Math.round(-Math.log10(pip))));\n if (s.showPriceRange || s.showPercentPriceRange || s.showPipsPriceRange) {\n const parts: string[] = [];\n if (s.showPriceRange || s.showPercentPriceRange) {\n const sub: string[] = [];\n if (s.showPriceRange) sub.push(signedFixed(dPrice, digits));\n if (s.showPercentPriceRange) {\n const pct = p0.price !== 0 ? `${signedFixed((dPrice / Math.abs(p0.price)) * 100, 2)}%` : \"\";\n if (pct) sub.push(s.showPriceRange ? `(${pct})` : pct);\n }\n parts.push(sub.join(\" \"));\n }\n if (s.showPipsPriceRange) parts.push(signedFixed(Math.round(dPrice / pip), 0));\n rows.push({ icon: \"price\", text: parts.join(\", \") });\n }\n const showDate = withExtras && !!s.showDateTimeRange;\n const showDist = withExtras && !!s.showDistance;\n if (s.showBarsRange || showDate || showDist) {\n let t = \"\";\n if (s.showBarsRange) {\n const i0 = coords ? coords.timeToBarIndex(p0.time) : null;\n const i1 = coords ? coords.timeToBarIndex(p1.time) : null;\n t += `${i0 != null && i1 != null ? i1 - i0 : 0} bars`;\n }\n if (showDate) {\n const aSec = timeToSec(p0.time);\n const bSec = timeToSec(p1.time);\n const span = aSec != null && bSec != null ? tvTimeSpan(bSec - aSec) : \"\";\n if (span) t += s.showBarsRange ? ` (${span})` : span;\n }\n if (showDist) t += (t ? \", \" : \"\") + `distance: ${Math.round(Math.hypot(b.x - a.x, b.y - a.y))} px`;\n if (t) rows.push({ icon: \"bars\", text: t });\n }\n if (withExtras && s.showAngle && Math.hypot(b.x - a.x, b.y - a.y) > 0) {\n const deg = (Math.atan2(-(b.y - a.y), b.x - a.x) * 180) / Math.PI;\n rows.push({ icon: \"angle\", text: `${Math.round(deg * 100) / 100}º` });\n }\n return rows;\n}\n\n/** Segment a-b clipped against the rectangle [x, x + rw] x [y, y + rh]\n * (Liang-Barsky): true when any part lies inside. */\nexport function segmentHitsRect(a: Pt, b: Pt, x: number, y: number, rw: number, rh: number): boolean {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n let t0 = 0;\n let t1 = 1;\n const clip = (p: number, q: number) => {\n if (p === 0) return q >= 0;\n const r = q / p;\n if (p < 0) { if (r > t1) return false; if (r > t0) t0 = r; }\n else { if (r < t0) return false; if (r < t1) t1 = r; }\n return true;\n };\n return clip(-dx, a.x - x) && clip(dx, x + rw - a.x) && clip(-dy, a.y - y) && clip(dy, y + rh - a.y) && t0 <= t1;\n}\n/** TV Auto visibility: the line (or the single point) touches the pane. */\nexport function segmentTouchesBox(a: Pt, b: Pt, w: number, h: number): boolean {\n if (a.x === b.x && a.y === b.y) return a.x >= 0 && a.x <= w && a.y >= 0 && a.y <= h;\n return segmentHitsRect(a, b, 0, 0, w, h);\n}\n\n/** TV stats box (module 815999 renderer + `_targetRect`): shown while the\n * drawing is hovered or selected, or always with \"Always show stats\".\n * Anchor point by TV statsPosition (0 = p0, 1 = middle, 2 = p1); box at\n * anchor.x + 12, 12px above the anchor when the line runs up-left or\n * down-right on screen, else 12px below. Box: font 12, padding 12, 18px\n * icons + 12px gap, row height 18 + spacing 8, radius 4, background\n * #464646e6, text #FFFFFF, icons #F9F9F9 (dark theme). */\nexport function statsBoxItems(a: Pt, b: Pt, rows: StatRow[], position: 0 | 1 | 2 | 3, visible: boolean, w: number, h: number): SceneItem[] {\n if (!visible || rows.length === 0) return [];\n const auto = position === 3;\n // TV Auto: no stats while the line is entirely outside the pane.\n if (auto && !segmentTouchesBox(a, b, w, h)) return [];\n const fs = 12;\n const rowH = 18;\n const gap = 8;\n const pad = 12;\n const textW = Math.max(...rows.map((r) => measureText(r.text, fs)));\n let bw = textW + pad * 2 + rowH + pad;\n if (Math.round(bw) % 2 !== 0) bw = Math.round(bw) + 1;\n const bh = rowH * rows.length + gap * (rows.length - 1) + pad * 2;\n const mid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n const anchor = position === 0 ? a : position === 2 ? b : mid;\n const upLeftOrDownRight = (b.y < a.y && b.x < a.x) || (b.y > a.y && b.x > a.x);\n let x = anchor.x + 12;\n let y = upLeftOrDownRight ? anchor.y - 12 - bh : anchor.y + 12;\n if (auto && (a.x !== b.x || a.y !== b.y)) {\n // TV _targetRect (Auto): keep the box in the pane; when it covers the\n // line, flip it to the other side and put it left of the middle point.\n if (x < 0) x = 0;\n else if (x + bw > w) x = w - bw;\n if (y < 0) y = 0;\n else if (y + bh > h) y = h - bh;\n if (segmentHitsRect(a, b, x, y, bw, bh)) {\n y = upLeftOrDownRight ? mid.y + 12 : mid.y - 12 - bh;\n x = Math.min(mid.x, w) - bw;\n }\n }\n const left = Math.floor(x);\n const top = Math.floor(y);\n const items: SceneItem[] = [{ t: \"rect\", x: left, y: top, w: bw, h: bh, rx: 4, ry: 4, fill: \"#464646\", fillOpacity: 0xe6 / 255 }];\n rows.forEach((row, i) => {\n const ry = top + pad + i * (rowH + gap);\n items.push({ t: \"path\", d: STAT_ICONS[row.icon], transform: `translate(${left + pad}, ${ry})`, fill: \"#F9F9F9\", fillRule: \"evenodd\" });\n items.push({ t: \"text\", x: left + pad + rowH + pad, y: ry + rowH / 2, text: row.text, size: fs, fill: \"#FFFFFF\", baseline: \"central\" });\n });\n return [{ t: \"group\", inert: true, items }];\n}\n\n/** TV line end arrow (module 438984 `f` + 937169 getArrowPoints): two\n * strokes from the tip, 5 x line width back and 5 x line width aside. */\nexport function rangeArrowPath(from: Pt, tip: Pt, lw: number): string {\n const len = Math.hypot(tip.x - from.x, tip.y - from.y) || 1;\n const ux = (tip.x - from.x) / len;\n const uy = (tip.y - from.y) / len;\n const hl = 5 * lw;\n const bx = tip.x - ux * hl;\n const by = tip.y - uy * hl;\n return `M ${bx - uy * hl} ${by + ux * hl} L ${tip.x} ${tip.y} L ${bx + uy * hl} ${by - ux * hl}`;\n}\n\n/** The end arrow drawn in the line's own stroke (colour, width, dash);\n * nothing under 1px. */\nexport function endArrowItems(from: Pt, tip: Pt, s: DrawingStyle): SceneItem[] {\n if (Math.hypot(tip.x - from.x, tip.y - from.y) < 1) return [];\n return [{\n t: \"path\",\n d: rangeArrowPath(from, tip, s.width),\n fill: \"none\",\n stroke: s.color,\n strokeWidth: s.width,\n dash: dashFor(s),\n join: \"round\",\n cap: (s.lineStyle ?? \"solid\") === \"solid\" ? \"round\" : \"butt\",\n inert: true,\n }];\n}\n\n/** TV trend line label style: factory centre / bottom, 14px. */\nexport function trendLabelStyle(s: DrawingStyle): DrawingStyle {\n return { ...s, horzLabelsAlign: s.horzLabelsAlign ?? \"center\", vertLabelsAlign: s.vertLabelsAlign ?? \"bottom\" };\n}\n\n/** Trend line family label cut-out polygon (TV line-tool-trend-line\n * `_needLabelExclusionPath`). */\nexport function trendLabelCutPoly(a: Pt, b: Pt, s: DrawingStyle): Pt[] | null {\n return channelLabelCutPoly(a, b, a, b, trendLabelStyle(s), (s.fontSize ?? 14) / 3, false);\n}\n\n/** A cut-out clip item + its name, or none (no polygon). */\nfunction cutOf(name: string, poly: Pt[] | null): { items: SceneItem[]; clip: string | undefined } {\n return poly && poly.length ? { items: [{ t: \"clip\", name, polys: [poly] }], clip: name } : { items: [], clip: undefined };\n}\n\n/** Decorations shared by trend line / ray / extended line / info line: end\n * arrows, middle point, on-line text, stats box (all by style flags;\n * geometry from the anchors a, b, not the extended ends). */\nexport function lineDecorationItems(d: Drawing, a: Pt, b: Pt, s: DrawingStyle, w: number, h: number, coords: Coords | null, active: boolean, clip?: string): SceneItem[] {\n if (!d.points[0] || !d.points[1]) return [];\n const statRows = tvStatRows(d, a, b, s, coords, true);\n // TV factory statsPosition: info line 1 (middle), trend line / ray /\n // extended line 2 (p1).\n const statsPos = s.statsPosition ?? (d.kind === \"info-line\" ? 1 : 2);\n const showBadge = active || !!s.showStats;\n const items: SceneItem[] = [{\n t: \"group\",\n clip,\n items: [...(s.leftEnd === 1 ? endArrowItems(b, a, s) : []), ...(s.rightEnd === 1 ? endArrowItems(a, b, s) : [])],\n }];\n // TV: the middle point is an anchor-style marker, shown only while the\n // line is hovered / selected.\n if (s.showMiddlePoint && active) items.push({ t: \"anchors\", pts: [{ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 }] });\n items.push(...channelLabelItems(a, b, a, b, trendLabelStyle(s), (s.fontSize ?? 14) / 3));\n items.push(...statsBoxItems(a, b, statRows, statsPos, showBadge, w, h));\n return items;\n}\n\n/** TV horizontal line label (line-tool-horizontal-line): at x 3 (Left), the\n * pane width with a 3px offset (Right) or the pane centre; factory 12px,\n * centre / middle. Middle cuts the line when the text crosses it. */\nexport function hLineTextLayout(y: number, pw: number, s: DrawingStyle) {\n if (!s.text) return null;\n const horz = s.horzLabelsAlign ?? \"center\";\n return tvTextLayout({\n x: horz === \"left\" ? 3 : horz === \"right\" ? pw : pw / 2,\n y,\n text: s.text,\n fs: s.fontSize ?? 12,\n bold: s.bold,\n italic: s.italic,\n vert: s.vertLabelsAlign ?? \"middle\",\n horz,\n offsetX: horz === \"right\" ? 3 : 0,\n });\n}\n\n/** TV horizontal ray label (line-tool-horizontal-ray): Left at the ray start;\n * Right at the pane edge with a 3px offset, or just past the start when the\n * box would not fit; Center halfway to the pane edge. Factory 12px, centre /\n * top. */\nexport function hRayTextLayout(a: Pt, pw: number, s: DrawingStyle) {\n if (!s.text) return null;\n const horz = s.horzLabelsAlign ?? \"center\";\n const base = { y: a.y, text: s.text, fs: s.fontSize ?? 12, bold: s.bold, italic: s.italic, vert: s.vertLabelsAlign ?? \"top\", horz } as const;\n if (horz === \"right\") {\n const bw = tvTextLayout({ ...base, x: 0 }).box.width;\n return a.x + bw + 3 >= pw ? tvTextLayout({ ...base, x: a.x + bw + 3 }) : tvTextLayout({ ...base, x: pw, offsetX: 3 });\n }\n return tvTextLayout({ ...base, x: horz === \"center\" ? (a.x + pw) / 2 : a.x });\n}\n\n/** Middle cut of a TV line label (`_needLabelExclusionPath`). */\nfunction lineLabelCutPoly(l: ReturnType<typeof tvTextLayout> | null, vert: string): Pt[] | null {\n return l && vert === \"middle\" && textCrossesLine(l.lines) ? l.poly : null;\n}\n\nconst hit = (a: Pt, b: Pt): SceneItem => ({ t: \"hit\", a, b, width: 12 });\nconst roundCap = (s: DrawingStyle) => ((s.lineStyle ?? \"solid\") === \"solid\" ? \"round\" : \"butt\") as \"round\" | \"butt\";\n\nexport function sceneHorizontalLine(pts: Pt[], selected: boolean, w: number, s: DrawingStyle): Scene {\n const a = pts[0];\n const label = hLineTextLayout(a.y, w, s);\n const cut = cutOf(\"cut\", lineLabelCutPoly(label, s.vertLabelsAlign ?? \"middle\"));\n return [\n hit({ x: 0, y: a.y }, { x: w, y: a.y }),\n ...cut.items,\n { t: \"line\", a: { x: 0, y: a.y }, b: { x: w, y: a.y }, stroke: s.color, strokeWidth: s.width, dash: dashFor(s), clip: cut.clip },\n ...(label ? [tvTextItems(label, s.textColor ?? s.color, s.bold, s.italic)] : []),\n // TV line-tool-horizontal-line: the anchor sits at 90% of the pane width.\n ...(selected ? [{ t: \"anchors\" as const, pts: [{ x: 0.9 * w, y: a.y }], squares: SQUARE_ANCHORS.single }] : []),\n ];\n}\n\nexport function sceneVerticalLine(pts: Pt[], selected: boolean, h: number, s: DrawingStyle): Scene {\n const a = pts[0];\n // TV line-tool-vertical-line, vertical orientation (factory): the text box\n // is turned −90° (reads bottom to top) around a point on the line at the\n // pane height (Top, as TV does), half height (Middle) or 0 (Bottom);\n // box horizontal align Left / Center / Right for Top / Middle / Bottom,\n // vertical align Bottom / Middle / Top for Left / Center / Right.\n // Factory 14px, centre / middle; Middle cuts the line.\n const vert = s.vertLabelsAlign ?? \"middle\";\n const horz = s.horzLabelsAlign ?? \"center\";\n const horizontal = s.textOrientation === \"horizontal\";\n const y = vert === \"top\" ? h : vert === \"middle\" ? h / 2 : 0;\n // Horizontal orientation (TV): the box is not turned, 5px from the line\n // (Left = box left of the line, Right = right of it), Top = above the\n // pane bottom, Bottom = below the pane top; the line is cut behind any\n // text.\n const label = !s.text\n ? null\n : horizontal\n ? tvTextLayout({\n x: a.x, y, text: s.text, fs: s.fontSize ?? 14, bold: s.bold, italic: s.italic,\n horz: horz === \"left\" ? \"right\" : horz === \"right\" ? \"left\" : \"center\",\n vert: vert === \"top\" ? \"bottom\" : vert === \"bottom\" ? \"top\" : \"middle\",\n offsetX: 5,\n })\n : tvTextLayout({\n x: a.x, y, text: s.text, fs: s.fontSize ?? 14, bold: s.bold, italic: s.italic,\n horz: vert === \"top\" ? \"left\" : vert === \"middle\" ? \"center\" : \"right\",\n vert: horz === \"left\" ? \"bottom\" : horz === \"right\" ? \"top\" : \"middle\",\n angle: -Math.PI / 2,\n });\n // TV `_needLabelExclusionPath`: horizontal = any text; vertical = the\n // Vertical setting (not the turned box).\n const cut = cutOf(\"cut\", horizontal ? (label && s.text?.trim() ? label.poly : null) : lineLabelCutPoly(label, vert));\n return [\n hit({ x: a.x, y: 0 }, { x: a.x, y: h }),\n ...cut.items,\n { t: \"line\", a: { x: a.x, y: 0 }, b: { x: a.x, y: h }, stroke: s.color, strokeWidth: s.width, dash: dashFor(s), clip: cut.clip },\n ...(label ? [tvTextItems(label, s.textColor ?? s.color, s.bold, s.italic)] : []),\n // TV line-tool-vertical-line: the anchor sits at 90% of the pane height.\n ...(selected ? [{ t: \"anchors\" as const, pts: [{ x: a.x, y: 0.9 * h }], squares: SQUARE_ANCHORS.single }] : []),\n ];\n}\n\nexport function sceneCrossLine(pts: Pt[], selected: boolean, w: number, h: number, s: DrawingStyle): Scene {\n const a = pts[0];\n const dash = dashFor(s);\n return [\n hit({ x: 0, y: a.y }, { x: w, y: a.y }),\n hit({ x: a.x, y: 0 }, { x: a.x, y: h }),\n { t: \"line\", a: { x: 0, y: a.y }, b: { x: w, y: a.y }, stroke: s.color, strokeWidth: s.width, dash },\n { t: \"line\", a: { x: a.x, y: 0 }, b: { x: a.x, y: h }, stroke: s.color, strokeWidth: s.width, dash },\n ...(selected ? [{ t: \"anchors\" as const, pts: [a] }] : []),\n ];\n}\n\nexport function sceneTrendLine(d: Drawing, pts: Pt[], selected: boolean, w: number, h: number, s: DrawingStyle, coords: Coords | null, active: boolean): Scene {\n const [a, b] = pts;\n const cut = cutOf(\"cut\", trendLabelCutPoly(a, b, s));\n return [\n hit(a, b),\n ...cut.items,\n { t: \"line\", a, b, stroke: s.color, strokeWidth: s.width, dash: dashFor(s), cap: roundCap(s), clip: cut.clip },\n ...lineDecorationItems(d, a, b, s, w, h, coords, active, cut.clip),\n ...(selected ? [{ t: \"anchors\" as const, pts }] : []),\n ];\n}\n\n/** Trend line extended past one or both endpoints to beyond the pane (ray =\n * end only, extended line = both); the pointer target stays a-b. */\nexport function sceneExtendedSegment(\n d: Drawing, pts: Pt[], selected: boolean, w: number, h: number, s: DrawingStyle,\n extendStart: boolean, extendEnd: boolean, coords: Coords | null, active: boolean,\n): Scene {\n const [a, b] = pts;\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.hypot(dx, dy) || 1;\n const ux = dx / len;\n const uy = dy / len;\n const big = (w + h) * 2;\n const start = extendStart ? { x: a.x - ux * big, y: a.y - uy * big } : a;\n const end = extendEnd ? { x: b.x + ux * big, y: b.y + uy * big } : b;\n const cut = cutOf(\"cut\", trendLabelCutPoly(a, b, s));\n return [\n hit(a, b),\n ...cut.items,\n { t: \"line\", a: start, b: end, stroke: s.color, strokeWidth: s.width, dash: dashFor(s), clip: cut.clip },\n ...lineDecorationItems(d, a, b, s, w, h, coords, active, cut.clip),\n ...(selected ? [{ t: \"anchors\" as const, pts }] : []),\n ];\n}\n\nexport function sceneHorizontalRay(pts: Pt[], selected: boolean, w: number, s: DrawingStyle): Scene {\n const a = pts[0];\n const label = hRayTextLayout(a, w, s);\n const cut = cutOf(\"cut\", lineLabelCutPoly(label, s.vertLabelsAlign ?? \"top\"));\n return [\n hit(a, { x: w, y: a.y }),\n ...cut.items,\n { t: \"line\", a, b: { x: w, y: a.y }, stroke: s.color, strokeWidth: s.width, dash: dashFor(s), clip: cut.clip },\n ...(label ? [tvTextItems(label, s.textColor ?? s.color, s.bold, s.italic)] : []),\n ...(selected ? [{ t: \"anchors\" as const, pts: [a] }] : []),\n ];\n}\n\nexport function sceneInfoLine(d: Drawing, pts: Pt[], selected: boolean, w: number, h: number, s: DrawingStyle, coords: Coords | null, active: boolean): Scene {\n if (d.kind !== \"info-line\") return [];\n const [a, b] = pts;\n const cut = cutOf(\"cut\", trendLabelCutPoly(a, b, s));\n // Info line = a plain segment whose identity is the stats badge.\n return [\n hit(a, b),\n ...cut.items,\n { t: \"line\", a, b, stroke: s.color, strokeWidth: s.width, dash: dashFor(s), cap: \"round\", clip: cut.clip },\n ...lineDecorationItems(d, a, b, s, w, h, coords, active, cut.clip),\n ...(selected ? [{ t: \"anchors\" as const, pts }] : []),\n ];\n}\n\nexport function sceneTrendAngle(d: Drawing, pts: Pt[], selected: boolean, w: number, h: number, s: DrawingStyle, coords: Coords | null, active: boolean): Scene {\n const [a, b] = pts;\n const dx = b.x - a.x, dy = b.y - a.y;\n // The readout uses the angle frozen in screen space at placement / last\n // anchor drag (TV `angle` state); older drawings use the live angle.\n const angleDeg = s.angle ?? (Math.atan2(-dy, dx) * 180) / Math.PI;\n const th = (angleDeg * Math.PI) / 180;\n const r = TREND_ANGLE_ARC_R;\n const end = { x: a.x + r * Math.cos(th), y: a.y - r * Math.sin(th) };\n // Canvas arc(0, 0, r, 0, -th, th > 0): upward (sweep 0) for a positive angle.\n const arcPath = `M ${a.x} ${a.y} L ${a.x + r} ${a.y} A ${r} ${r} 0 ${Math.abs(th) > Math.PI ? 1 : 0} ${th > 0 ? 0 : 1} ${end.x} ${end.y}`;\n const fs = s.fontSize ?? 12;\n // TV extendLeft / extendRight: the segment continues to the pane edges.\n const len = Math.hypot(dx, dy) || 1;\n const big = (w + h) * 2;\n const e0 = s.extendLeft ? { x: a.x - (dx / len) * big, y: a.y - (dy / len) * big } : a;\n const e1 = s.extendRight ? { x: b.x + (dx / len) * big, y: b.y + (dy / len) * big } : b;\n return [\n hit(a, b),\n { t: \"line\", a: e0, b: e1, stroke: s.color, strokeWidth: s.width, dash: dashFor(s), cap: roundCap(s) },\n ...(s.showMiddlePoint && active ? [{ t: \"anchors\" as const, pts: [{ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 }] }] : []),\n { t: \"path\", d: arcPath, fill: \"none\", stroke: s.color, strokeWidth: 1, dash: \"1 2\", inert: true },\n {\n t: \"text\", x: a.x + r + 5 + fs / 3, y: a.y, text: `${Math.round(angleDeg * 100) / 100}º`, size: fs,\n anchor: \"start\", baseline: \"central\", weight: s.bold ? 700 : 400, fontStyle: s.italic ? \"italic\" : \"normal\", fill: s.color, inert: true,\n },\n // TV TrendToolWithStatsPaneView: price / bars stats (factory off) at the\n // second point (statsPosition 2), on hover / selection / always.\n ...statsBoxItems(a, b, tvStatRows(d, a, b, s, coords, false), s.statsPosition ?? 2, active || !!s.showStats, w, h),\n ...(selected ? [{ t: \"anchors\" as const, pts }] : []),\n ];\n}\n","/*\n * Level helpers shared by the level tools (channels, fib, gann, pitchforks):\n * visible levels, background opacity, per-level stroke, extended segments.\n */\nimport { dashFor, type Pt } from \"../_shared\";\nimport type { DrawingStyle, LevelDef } from \"../types\";\n\n/** The visible levels sorted by coefficient. */\nexport function activeLevels(s: DrawingStyle, fallback: LevelDef[]): LevelDef[] {\n return (s.levels ?? fallback).filter((l) => l.visible).slice().sort((x, y) => x.coeff - y.coeff);\n}\n\n/** Fill opacity between adjacent levels: TV `fillBackground` +\n * `transparency` (default on at 80 → 0.2). 0 disables the fills. */\nexport function levelFillOpacity(s: DrawingStyle): number {\n if (s.fillBackground === false) return 0;\n return Math.max(0, Math.min(1, (100 - (s.transparency ?? 80)) / 100));\n}\n\n/** Per-level stroke width (TV level linewidth column), else the drawing's. */\nexport function levelWidth(lvl: LevelDef, s: DrawingStyle): number {\n return lvl.width ?? s.width;\n}\n\n/** Per-level dash (TV level linestyle column), else the drawing's. */\nexport function levelDash(lvl: LevelDef, s: DrawingStyle): string | undefined {\n return lvl.style ? dashFor({ ...s, lineStyle: lvl.style }) : dashFor(s);\n}\n\n/** A segment continued past its ends to beyond the pane (TV extendLeft /\n * extendRight of channel lines). */\nexport function extendSeg(l: Pt, r: Pt, extL: boolean, extR: boolean, big: number): { l: Pt; r: Pt } {\n const dx = r.x - l.x, dy = r.y - l.y;\n const len = Math.hypot(dx, dy) || 1;\n return {\n l: extL ? { x: l.x - (dx / len) * big, y: l.y - (dy / len) * big } : l,\n r: extR ? { x: r.x + (dx / len) * big, y: r.y + (dy / len) * big } : r,\n };\n}\n","/*\n * Channel tools as scenes (moved from OpenTrader DrawingsOverlay, port\n * phase 2): parallel channel, disjoint channel, flat top/bottom.\n */\nimport { dashFor, type Pt } from \"../_shared\";\nimport type { Coords } from \"../coords\";\nimport type { Drawing, DrawingStyle, LevelDef } from \"../types\";\nimport { PARALLEL_CHANNEL_LEVEL_DEFAULTS } from \"../specs\";\nimport { tvTextLayout } from \"../kinds/tv-text\";\nimport type { Scene, SceneItem } from \"./types\";\nimport { channelLabelCutPoly, channelLabelItems, tvTextItems } from \"./text\";\nimport { endArrowItems, SQUARE_ANCHORS } from \"./lines\";\nimport { extendSeg, levelDash, levelFillOpacity, levelWidth } from \"./levels\";\n\n/** Parallel channel anchors (TV line-tool-parallel-channel): p0, p1, their\n * copies on the second line, the two middle points; `dy` = the second\n * line's vertical offset at p0. */\nexport function parallelChannelAnchors(pts: Pt[]): { anchors: Pt[]; dy: number } {\n const [a, b, c] = pts;\n const t = b.x - a.x === 0 ? 0 : (c.x - a.x) / (b.x - a.x);\n const dy = c.y - (a.y + (b.y - a.y) * t);\n const mid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n return {\n anchors: [a, b, { x: a.x, y: a.y + dy }, { x: b.x, y: b.y + dy }, { x: mid.x, y: mid.y + dy }, mid],\n dy,\n };\n}\n\n/** Disjoint channel (TV mirror model): edge 2 has the mirrored slope of edge\n * 1 and passes through (p1.x, y(p2)). Anchors: 0 / 1 = edge-1 ends, 2 =\n * edge-2 end at p1.x (→ p2 price), 3 = edge-2 end at p0.x. */\nexport function disjointChannelAnchors(pts: Pt[]): { anchors: Pt[]; P: Pt; A: Pt } {\n const [a, b, c] = pts;\n const P = { x: b.x, y: c.y };\n const A = { x: a.x, y: c.y + (b.y - a.y) };\n return { anchors: [a, b, P, A], P, A };\n}\n\n/** Parallel channel label edges (TV line-tool-parallel-channel): the first\n * and last visible level lines; levels 0 and 1 for the Middle alignment. */\nexport function parallelChannelLabelEdges(a: Pt, b: Pt, dy: number, levels: LevelDef[], s: DrawingStyle) {\n const mid = (s.vertLabelsAlign ?? \"bottom\") === \"middle\";\n const c1 = mid ? 0 : levels.length > 0 ? levels[0].coeff : 0;\n const c2 = mid ? 1 : levels.length > 0 ? levels[levels.length - 1].coeff : 0;\n return { e: { x: a.x, y: a.y + dy * c1 }, t: { x: b.x, y: b.y + dy * c1 }, i: { x: a.x, y: a.y + dy * c2 }, n: { x: b.x, y: b.y + dy * c2 } };\n}\n\nexport function sceneParallelChannel(pts: Pt[], selected: boolean, s: DrawingStyle, w: number, h: number): Scene {\n const [a, b] = pts;\n const { anchors, dy } = parallelChannelAnchors(pts);\n // TV line-tool-parallel-channel (v2): each visible level (in level order) is\n // the p0-p1 line moved by coeff * (p2 - p0); the background fills every\n // band between two consecutive visible levels. One visible level = no band.\n const levels = (s.levels ?? PARALLEL_CHANNEL_LEVEL_DEFAULTS).filter((l) => l.visible);\n // TV extendLeft / extendRight: every line and band runs to the pane edges.\n const big = (w + h) * 2;\n const at = (coeff: number) => extendSeg({ x: a.x, y: a.y + dy * coeff }, { x: b.x, y: b.y + dy * coeff }, !!s.extendLeft, !!s.extendRight, big);\n const fillO = levelFillOpacity(s);\n const fill = s.backgroundColor ?? s.color;\n // TV: a Middle label cuts every channel line (no odd-line test here).\n const ed = parallelChannelLabelEdges(a, b, dy, levels, s);\n const cutPoly = channelLabelCutPoly(ed.e, ed.t, ed.i, ed.n, s, undefined, true);\n const clip = cutPoly && cutPoly.length ? \"cut\" : undefined;\n const items: SceneItem[] = [];\n if (clip) items.push({ t: \"clip\", name: clip, polys: [cutPoly!] });\n levels.slice(1).forEach((hi, i) => {\n const lo = at(levels[i].coeff);\n const up = at(hi.coeff);\n items.push({ t: \"polygon\", pts: [lo.l, lo.r, up.r, up.l], fill, fillOpacity: fillO, stroke: \"transparent\" });\n });\n for (const lvl of levels) {\n const g = at(lvl.coeff);\n items.push({ t: \"hit\", a: g.l, b: g.r, width: 12 });\n items.push({ t: \"line\", a: g.l, b: g.r, stroke: lvl.color, strokeWidth: levelWidth(lvl, s), dash: levelDash(lvl, s), clip });\n }\n items.push(...channelLabelItems(ed.e, ed.t, ed.i, ed.n, s));\n if (selected) items.push({ t: \"anchors\", pts: anchors, squares: SQUARE_ANCHORS.parallelChannel });\n return items;\n}\n\n/** TV flat top/bottom and disjoint channel \"Prices\": each line end's price in\n * 12px text 6px outside the end (no box). */\nexport function channelPricesItems(a: Pt, b: Pt, pa: string, pb: string, s: DrawingStyle): SceneItem[] {\n const lay = (p: Pt, other: Pt, text: string) =>\n tvTextLayout({ x: p.x, y: p.y, text, fs: s.priceLabelFontSize ?? 12, bold: s.priceLabelBold, italic: s.priceLabelItalic, vert: \"middle\", horz: p.x > other.x ? \"left\" : \"right\", offsetX: 6, padH: 0, padV: 0 });\n const color = s.priceLabelTextColor ?? s.color;\n return [\n tvTextItems(lay(a, b, pa), color, s.priceLabelBold, s.priceLabelItalic),\n tvTextItems(lay(b, a, pb), color, s.priceLabelBold, s.priceLabelItalic),\n ];\n}\n\n/** TV flat top/bottom and disjoint channel body (module 632446): both lines\n * with the tool's extend flags and line ends, the band between them filled\n * with the background colour (alpha = 1 - transparency, factory 0.2) and\n * extended with the lines, the prices. */\nexport function channelBodyItems(d: Drawing, a: Pt, b: Pt, A: Pt, P: Pt, priceB: number, priceB2: number, s: DrawingStyle, w: number, h: number, coords: Coords | null): SceneItem[] {\n const big = (w + h) * 2;\n const l1 = extendSeg(a, b, !!s.extendLeft, !!s.extendRight, big);\n const l2 = extendSeg(A, P, !!s.extendLeft, !!s.extendRight, big);\n const dash = dashFor(s);\n const cap = ((s.lineStyle ?? \"solid\") === \"solid\" ? \"round\" : \"butt\") as \"round\" | \"butt\";\n const digits = Math.max(0, Math.min(8, Math.round(-Math.log10(coords?.pipSize() ?? 0.01))));\n const fmt = (v: number) => v.toFixed(digits);\n const items: SceneItem[] = [];\n if (s.fillBackground !== false) items.push({ t: \"polygon\", pts: [l1.l, l1.r, l2.r, l2.l], fill: s.backgroundColor ?? s.color, fillOpacity: levelFillOpacity(s), stroke: \"transparent\" });\n items.push(\n { t: \"hit\", a, b, width: 12 },\n { t: \"hit\", a: A, b: P, width: 12 },\n { t: \"line\", a: l1.l, b: l1.r, stroke: s.color, strokeWidth: s.width, dash, cap },\n { t: \"line\", a: l2.l, b: l2.r, stroke: s.color, strokeWidth: s.width, dash, cap },\n );\n if (s.leftEnd === 1) items.push(...endArrowItems(b, a, s), ...endArrowItems(P, A, s));\n if (s.rightEnd === 1) items.push(...endArrowItems(a, b, s), ...endArrowItems(A, P, s));\n if (s.showPrices) {\n items.push(...channelPricesItems(a, b, fmt(d.points[0]?.price ?? 0), fmt(d.points[1]?.price ?? 0), s));\n items.push(...channelPricesItems(P, A, fmt(priceB), fmt(priceB2), s));\n }\n return items;\n}\n\nexport function sceneDisjointChannel(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle, w: number, h: number, coords: Coords | null): Scene {\n const [a, b] = pts;\n const { anchors, P, A } = disjointChannelAnchors(pts);\n const p2 = d.points[2]?.price ?? d.points[0].price;\n return [\n ...channelBodyItems(d, a, b, A, P, p2, p2 + ((d.points[1]?.price ?? 0) - d.points[0].price), s, w, h, coords),\n ...channelLabelItems(a, b, A, P, s),\n ...(selected ? [{ t: \"anchors\" as const, pts: anchors, squares: SQUARE_ANCHORS.disjointChannel }] : []),\n ];\n}\n\n/** Flat top/bottom channel: main edge pt0→pt1, second edge a horizontal line\n * at pt2's price spanning the same x range. */\nexport function sceneFlatTopBottom(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle, w: number, h: number, coords: Coords | null): Scene {\n const [a, b, c] = pts;\n const A = { x: a.x, y: c.y };\n const P = { x: b.x, y: c.y };\n const p2 = d.points[2]?.price ?? d.points[0].price;\n return [\n ...channelBodyItems(d, a, b, A, P, p2, p2, s, w, h, coords),\n ...channelLabelItems(a, b, A, P, s),\n ...(selected ? [{ t: \"anchors\" as const, pts }] : []),\n ];\n}\n","/*\n * TV fib level labels (module 445750 LineToolPaneViewFibWithLabels\n * `_updateLabelForLevel` / `_updateRendererLabel` + TextRenderer\n * getTextAlignInBox): the coefficient (number, or percent with 2 decimals)\n * and / or \" (price)\", in a text box 4px from the level's end chosen by the\n * horizontal alignment; font = labelFontSize (factory 12).\n */\nimport { tvTextLayout } from \"./tv-text\";\n\n/** Level value text (TV numeric / percentage formatter). */\nexport function fibCoeffText(coeff: number, percents: boolean): string {\n if (percents) return `${(100 * coeff).toFixed(2)}%`;\n return String(Math.round(coeff * 1e4) / 1e4);\n}\n\n/** Label of a horizontal level from `left` to `right` at `y`. TV Left = the\n * box ends 4px before the left end (with extend left: starts 4px after the\n * pane's left edge), Right = starts 4px after the right end (extend right:\n * ends 4px before the pane edge), Center = the middle of the drawn span. */\nexport function fibLevelLabel(o: {\n text: string;\n y: number;\n left: number;\n right: number;\n extendLeft: boolean;\n extendRight: boolean;\n paneW: number;\n horz: \"left\" | \"center\" | \"right\";\n vert: \"top\" | \"middle\" | \"bottom\";\n fs: number;\n}) {\n if (!o.text) return null;\n let x: number;\n let horz: \"left\" | \"center\" | \"right\";\n if (o.horz === \"left\") {\n x = o.extendLeft ? 0 : o.left;\n horz = o.extendLeft ? \"left\" : \"right\";\n } else if (o.horz === \"right\") {\n x = o.extendRight ? o.paneW : o.right;\n horz = o.extendRight ? \"right\" : \"left\";\n } else {\n x = ((o.extendLeft ? 0 : o.left) + (o.extendRight ? o.paneW : o.right)) / 2;\n horz = \"center\";\n }\n return tvTextLayout({ x, y: o.y, text: o.text, fs: o.fs, vert: o.vert, horz, offsetX: 4 });\n}\n","/*\n * Fibonacci tools as scenes (moved from OpenTrader DrawingsOverlay, port\n * phase 2): retracement, trend-based extension, channel, time zone,\n * trend-based time, circles, speed resistance fan / arcs, spiral, wedge,\n * pitchfan.\n */\nimport { dashFor, HIT_TOLERANCE, type Pt } from \"../_shared\";\nimport type { Coords } from \"../coords\";\nimport type { Drawing, DrawingStyle, LevelDef } from \"../types\";\nimport {\n FIB_CIRCLE_LEVEL_DEFAULTS, FIB_LEVEL_DEFAULTS, FIB_TIMEZONE_LEVEL_DEFAULTS, FIB_TREND_LINE_DEFAULT, FIB_WEDGE_LEVEL_DEFAULTS,\n FIB_WEDGE_TREND_LINE_DEFAULT, PITCHFORK_LEVEL_DEFAULTS, SPEED_ARC_LEVEL_DEFAULTS, SPEED_FAN_GRID_DEFAULT, SPEED_FAN_LEVEL_DEFAULTS,\n TREND_FIB_TIME_LEVEL_DEFAULTS, TREND_FIB_TIME_TREND_DEFAULT,\n} from \"../specs\";\nimport { tvTextLayout } from \"../kinds/tv-text\";\nimport { fibCoeffText, fibLevelLabel } from \"../kinds/fib-labels\";\nimport { trendFibTimeLevels } from \"../kinds/fib-time\";\nimport { extendRay, speedFanGeometry } from \"../kinds/speed-fan\";\nimport { spiralSamples } from \"../kinds/hit-tests\";\nimport type { Scene, SceneItem } from \"./types\";\nimport { textCrossesLine, tvTextItems } from \"./text\";\nimport { activeLevels, extendSeg, levelDash, levelFillOpacity, levelWidth } from \"./levels\";\n\n/** \"0.618\" without trailing zeros. */\nexport function fmtCoeff(c: number): string {\n return c.toFixed(3).replace(/0+$/, \"\").replace(/\\.$/, \"\") || \"0\";\n}\n\nconst anchorsIf = (selected: boolean, pts: Pt[]): SceneItem[] => (selected ? [{ t: \"anchors\", pts }] : []);\nconst digitsOf = (coords: Coords | null) => Math.max(0, Math.min(8, Math.round(-Math.log10(coords?.pipSize() ?? 0.01))));\n\n/** A cut-out clip for the given polygons (none when all are empty). */\nfunction clipOf(name: string, polys: (Pt[] | null | undefined)[]): { items: SceneItem[]; clip: string | undefined } {\n const ps = polys.filter((x): x is Pt[] => !!x && x.length > 0);\n return ps.length ? { items: [{ t: \"clip\", name, polys: ps }], clip: name } : { items: [], clip: undefined };\n}\n\n/** TV fib \"Trend line\" (trendline: visible / colour / width / style). */\nexport function fibTrendLineItems(a: Pt, b: Pt, s: DrawingStyle, wedge = false): SceneItem[] {\n const tl = s.fibTrendLine ?? (wedge ? FIB_WEDGE_TREND_LINE_DEFAULT : FIB_TREND_LINE_DEFAULT);\n if (!tl.visible) return [];\n return [{ t: \"line\", a, b, stroke: tl.color, strokeWidth: tl.width, dash: dashFor({ ...s, lineStyle: tl.style }), cap: tl.style === \"solid\" ? \"round\" : \"butt\", inert: true }];\n}\n\n/** A horizontal fib level with its TV label (value / price) and level text;\n * the line is cut behind both (TV exclusion path). */\nexport function fibHLevelItems(name: string, lvl: LevelDef, y: number, left: number, right: number, price: number, digits: number, s: DrawingStyle, paneW: number): SceneItem[] {\n const base = { y, left, right, extendLeft: !!s.extendLeft, extendRight: !!s.extendRight, paneW, fs: s.labelFontSize ?? 12 };\n const showC = s.showCoeffs !== false;\n const showP = s.showPrices !== false;\n let text = \"\";\n if (showC) text += fibCoeffText(lvl.coeff, !!s.fibLevelsAsPercents);\n if (showP) text += ` (${price.toFixed(digits)})`;\n const label = fibLevelLabel({ ...base, text, horz: s.horzLabelsAlign ?? \"left\", vert: s.vertLabelsAlign ?? \"middle\" });\n const lvText = s.showText !== false && lvl.text ? fibLevelLabel({ ...base, text: lvl.text, horz: s.horzTextAlign ?? \"center\", vert: s.vertTextAlign ?? \"middle\" }) : null;\n const cut = clipOf(name, [label?.poly ?? null, lvText?.poly]);\n return [\n { t: \"hit\", a: { x: left, y }, b: { x: right, y }, width: 10 },\n ...cut.items,\n { t: \"line\", a: { x: left, y }, b: { x: right, y }, stroke: lvl.color, strokeWidth: levelWidth(lvl, s), dash: levelDash(lvl, s), clip: cut.clip },\n ...(label ? [tvTextItems(label, lvl.color)] : []),\n ...(lvText ? [tvTextItems(lvText, lvl.color)] : []),\n ];\n}\n\n/** Background bands between neighbouring levels over [left, right] (in the\n * upper level's colour). */\nfunction hBands(levels: LevelDef[], yOf: (c: number) => number, left: number, right: number, fillO: number): SceneItem[] {\n if (!(fillO > 0)) return [];\n return levels.slice(1).map((hi, i) => {\n const y0 = yOf(levels[i].coeff);\n const y1 = yOf(hi.coeff);\n return { t: \"rect\" as const, x: left, y: Math.min(y0, y1), w: Math.max(1, right - left), h: Math.abs(y1 - y0), fill: hi.color, fillOpacity: fillO, stroke: \"none\", inert: true };\n });\n}\n\nexport function sceneFib(d: Drawing, pts: Pt[], selected: boolean, w: number, s: DrawingStyle, coords: Coords | null): Scene {\n if (d.kind !== \"fib-retracement\") return [];\n const [a, b] = pts;\n const priceA = d.points[0].price;\n const priceB = d.points[1].price;\n // TV: levels span the anchors' x-range; the extend flags (default off)\n // stretch them to the pane edges.\n const left = s.extendLeft ? 0 : Math.min(a.x, b.x);\n const right = s.extendRight ? w : Math.max(a.x, b.x);\n const levels = activeLevels(s, FIB_LEVEL_DEFAULTS);\n // \"Fib levels based on log scale\" (TV fibLevelsBasedOnLogScale): level\n // prices interpolate in ln(price) space; TV only honours it on a log price\n // scale, and non-positive anchors (no ln) fall back to linear.\n const useLog = !!s.fibLevelsBasedOnLogScale && !!coords?.isLog() && priceA > 0 && priceB > 0;\n // reverse mirrors the ladder: 0 at the first click instead of the second.\n const priceOf = (c: number) => {\n const pEnd = s.reverse ? priceA : priceB; // coeff-0 anchor\n const pStart = s.reverse ? priceB : priceA;\n return useLog ? Math.exp(Math.log(pEnd) + c * (Math.log(pStart) - Math.log(pEnd))) : pEnd + c * (pStart - pEnd);\n };\n // TV fibLevelCoordinate: log mode interpolates the anchors' coordinates;\n // linear mode maps the level price through the scale.\n const yLin = (c: number) => (s.reverse ? a.y + (b.y - a.y) * c : b.y + (a.y - b.y) * c);\n const yOf = (c: number) => (useLog ? yLin(c) : coords?.priceToY(priceOf(c)) ?? yLin(c));\n const digits = digitsOf(coords);\n return [\n ...hBands(levels, yOf, left, right, levelFillOpacity(s)),\n ...levels.flatMap((lvl, i) => fibHLevelItems(`l${i}`, lvl, yOf(lvl.coeff), left, right, priceOf(lvl.coeff), digits, s, w)),\n // TV draws the trend line after the levels, before the labels.\n ...fibTrendLineItems(a, b, s),\n ...anchorsIf(selected, pts),\n ];\n}\n\n/** Trend-based fib extension: levels of the pt0→pt1 move projected from pt2\n * over the x-range of points 2 and 3; `reverse` flips the measured leg. */\nexport function sceneFibExtension(d: Drawing, pts: Pt[], selected: boolean, w: number, s: DrawingStyle, coords: Coords | null): Scene {\n if (d.kind !== \"trend-based-fib-extension\") return [];\n const [, b, c] = pts;\n const p0 = d.points[0].price;\n const p1 = d.points[1].price;\n const pc = d.points[2].price;\n const move = s.reverse ? p0 - p1 : p1 - p0;\n const moveY = s.reverse ? pts[0].y - pts[1].y : pts[1].y - pts[0].y;\n const levels = activeLevels(s, FIB_LEVEL_DEFAULTS);\n const left = s.extendLeft ? 0 : Math.min(b.x, c.x);\n const right = s.extendRight ? w : Math.max(b.x, c.x);\n // Log scale (TV): the move projects from pc in ln(price) space.\n const useLog = !!s.fibLevelsBasedOnLogScale && !!coords?.isLog() && p0 > 0 && p1 > 0 && pc > 0;\n const priceOf = (lvl: number) => {\n if (!useLog) return pc + move * lvl;\n const lnMove = s.reverse ? Math.log(p0) - Math.log(p1) : Math.log(p1) - Math.log(p0);\n return Math.exp(Math.log(pc) + lvl * lnMove);\n };\n const yLin = (lvl: number) => c.y + moveY * lvl;\n const yOf = (lvl: number) => (useLog ? yLin(lvl) : coords?.priceToY(priceOf(lvl)) ?? yLin(lvl));\n const digits = digitsOf(coords);\n return [\n ...hBands(levels, yOf, left, right, levelFillOpacity(s)),\n ...levels.flatMap((lvl, i) => fibHLevelItems(`l${i}`, lvl, yOf(lvl.coeff), left, right, priceOf(lvl.coeff), digits, s, w)),\n // TV trend line: the measured move and the projection leg.\n ...fibTrendLineItems(pts[0], pts[1], s),\n ...fibTrendLineItems(pts[1], pts[2], s),\n ...anchorsIf(selected, pts),\n ];\n}\n\n/** Fib channel: level k = the p0→p1 segment moved by coeff·(p2 − p0); fills\n * between levels (lower level colour), labels at the chosen end, each line\n * cut behind its own label. */\nexport function sceneFibChannel(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle, coords: Coords | null, w: number, h: number): Scene {\n if (d.kind !== \"fib-channel\") return [];\n const [a, b, c] = pts;\n const nx = c.x - a.x;\n const ny = c.y - a.y;\n // TV extendLeft / extendRight: the level lines (and fills) to the pane\n // edges; labels keep the level ends.\n const big = (w + h) * 2;\n const at = (coeff: number) => ({ l: { x: a.x + nx * coeff, y: a.y + ny * coeff }, r: { x: b.x + nx * coeff, y: b.y + ny * coeff } });\n const atX = (coeff: number) => {\n const g = at(coeff);\n return extendSeg(g.l, g.r, !!s.extendLeft, !!s.extendRight, big);\n };\n const levels = activeLevels(s, FIB_LEVEL_DEFAULTS);\n const fillO = levelFillOpacity(s);\n const digits = digitsOf(coords);\n const priceAt = (coeff: number, y: number) => coords?.yToPrice(y) ?? d.points[0].price + (d.points[2].price - d.points[0].price) * coeff;\n // TV fib channel labels: value (numbers or percents, 2 decimals) + \" (price)\"\n // at the level's p0 end (Left: box ending 4px before it; Right: the p1 end,\n // starting 4px after it; Center: the middle). Factory 12px, left / middle.\n const labelFor = (lvl: LevelDef, seg: { l: Pt; r: Pt }) => {\n const showC = s.showCoeffs !== false;\n const showP = s.showPrices !== false;\n if (!showC && !showP) return null;\n let text = \"\";\n if (showC) text += s.fibLevelsAsPercents ? `${(100 * lvl.coeff).toFixed(2)}%` : fmtCoeff(lvl.coeff);\n if (showP) text += ` (${priceAt(lvl.coeff, seg.l.y).toFixed(digits)})`;\n const horz = s.horzLabelsAlign ?? \"left\";\n const pt = horz === \"left\" ? seg.l : horz === \"right\" ? seg.r : { x: (seg.l.x + seg.r.x) / 2, y: (seg.l.y + seg.r.y) / 2 };\n return tvTextLayout({ x: pt.x, y: pt.y, text, fs: s.labelFontSize ?? 12, vert: s.vertLabelsAlign ?? \"middle\", horz: horz === \"left\" ? \"right\" : horz === \"right\" ? \"left\" : \"center\", offsetX: 4 });\n };\n const items: SceneItem[] = [];\n if (fillO > 0) {\n levels.slice(1).forEach((hi, i) => {\n const lo = atX(levels[i].coeff);\n const up = atX(hi.coeff);\n items.push({ t: \"polygon\", pts: [lo.l, lo.r, up.r, up.l], fill: levels[i].color, fillOpacity: fillO, stroke: \"none\", inert: true });\n });\n }\n levels.forEach((lvl, i) => {\n const seg = at(lvl.coeff);\n const segX = atX(lvl.coeff);\n const label = labelFor(lvl, seg);\n const cut = clipOf(`l${i}`, [label ? label.poly : null]);\n items.push({ t: \"hit\", a: seg.l, b: seg.r, width: 12 }, ...cut.items);\n items.push({ t: \"line\", a: segX.l, b: segX.r, stroke: lvl.color, strokeWidth: levelWidth(lvl, s), dash: levelDash(lvl, s), clip: cut.clip });\n if (label) items.push(tvTextItems(label, lvl.color));\n });\n items.push(...anchorsIf(selected, pts));\n return items;\n}\n\n/** Vertical fib level line with its label (time zone family). */\nfunction vLevelItems(name: string, lvl: LevelDef, x: number, h: number, s: DrawingStyle, label: ReturnType<typeof tvTextLayout> | null, cutPoly: Pt[] | null): SceneItem[] {\n const cut = clipOf(name, [cutPoly]);\n return [\n { t: \"hit\", a: { x, y: 0 }, b: { x, y: h }, width: 8 },\n ...cut.items,\n { t: \"line\", a: { x, y: 0 }, b: { x, y: h }, stroke: lvl.color, strokeWidth: levelWidth(lvl, s), dash: levelDash(lvl, s), clip: cut.clip },\n ...(label ? [tvTextItems(label, lvl.color)] : []),\n ];\n}\n\n/** Trend-based fib time (TV): dashed trend lines p0-p1-p2, one vertical line\n * per visible level at bar(p2) + coeff · (bar(p1) − bar(p0)), full-height\n * fills (later level colour), fib time zone labels; a Center label cuts the\n * line. */\nexport function sceneTrendBasedFibTime(d: Drawing, pts: Pt[], selected: boolean, h: number, s: DrawingStyle, coords: Coords | null): Scene {\n const [a, b, c] = pts;\n const tl = s.fibTrendLine ?? TREND_FIB_TIME_TREND_DEFAULT;\n const tlDash = dashFor({ ...s, lineStyle: tl.style, width: tl.width });\n const levels = trendFibTimeLevels(d, pts, coords, activeLevels(s, TREND_FIB_TIME_LEVEL_DEFAULTS));\n const fillO = levelFillOpacity(s);\n const vert = s.vertLabelsAlign ?? \"bottom\";\n const horzS = s.horzLabelsAlign ?? \"right\";\n const horz = horzS === \"left\" ? \"right\" : horzS === \"right\" ? \"left\" : \"center\";\n const labelAt = (x: number, coeff: number) =>\n s.showLabels === false ? null : tvTextLayout({ x, y: vert === \"top\" ? 0 : vert === \"middle\" ? 0.5 * h : h, text: String(coeff), fs: 12, vert, horz, offsetX: 2 });\n const items: SceneItem[] = [];\n if (tl.visible) {\n items.push({ t: \"line\", a, b, stroke: tl.color, strokeWidth: tl.width, dash: tlDash });\n if (c) items.push({ t: \"line\", a: b, b: c, stroke: tl.color, strokeWidth: tl.width, dash: tlDash });\n }\n if (fillO > 0) {\n levels.slice(1).forEach((lvl, i) => {\n const x0 = levels[i].x;\n items.push({ t: \"rect\", x: Math.min(x0, lvl.x), y: 0, w: Math.max(1, Math.abs(lvl.x - x0)), h, fill: lvl.color, fillOpacity: fillO, stroke: \"none\", inert: true });\n });\n }\n levels.forEach((lvl, i) => {\n const label = labelAt(lvl.x, lvl.coeff);\n items.push(...vLevelItems(`l${i}`, lvl, lvl.x, h, s, label, label && horzS === \"center\" ? label.poly : null));\n });\n items.push(...anchorsIf(selected, pts));\n return items;\n}\n\n/** Fib time zone (TV): vertical level lines at p0 + coeff·(p1 − p0) in x,\n * labels (level number, 12px, 2px from the line, pane top / middle /\n * bottom, horizontal side inverted), a Middle label cuts the line. */\nexport function sceneFibTimeZone(pts: Pt[], selected: boolean, h: number, s: DrawingStyle): Scene {\n const [a, b] = pts;\n const vert = s.vertLabelsAlign ?? \"bottom\";\n const horzS = s.horzLabelsAlign ?? \"right\";\n const horz = horzS === \"left\" ? \"right\" : horzS === \"right\" ? \"left\" : \"center\";\n const labelAt = (x: number, coeff: number) =>\n s.showLabels === false ? null : tvTextLayout({ x, y: vert === \"top\" ? 0 : vert === \"middle\" ? 0.5 * h : h, text: String(coeff), fs: 12, vert, horz, offsetX: 2 });\n const unit = b.x - a.x;\n const levels = activeLevels(s, FIB_TIMEZONE_LEVEL_DEFAULTS);\n const fillO = levelFillOpacity(s);\n // anchor connector (TV trendline: #808080 dashed 1px)\n const items: SceneItem[] = [{ t: \"line\", a, b, stroke: \"#808080\", strokeWidth: 1, dash: \"6 4\" }];\n if (fillO > 0) {\n levels.slice(1).forEach((hi, i) => {\n const x0 = a.x + unit * levels[i].coeff;\n const x1 = a.x + unit * hi.coeff;\n items.push({ t: \"rect\", x: Math.min(x0, x1), y: 0, w: Math.max(1, Math.abs(x1 - x0)), h, fill: hi.color, fillOpacity: fillO, stroke: \"none\", inert: true });\n });\n }\n levels.forEach((lvl, i) => {\n const x = a.x + unit * lvl.coeff;\n const label = labelAt(x, lvl.coeff);\n items.push(...vLevelItems(`l${i}`, lvl, x, h, s, label, label && vert === \"middle\" && textCrossesLine(label.lines) ? label.poly : null));\n });\n items.push(...anchorsIf(selected, pts));\n return items;\n}\n\nconst FIB_CIRCLE_LEVELS = [0.236, 0.382, 0.5, 0.618, 1];\n\n/** Fib circles (TV line-tool-fib-circles): axis-aligned ellipses centred on\n * the p0-p1 midpoint, half-axes 0.5·|dx|·coeff × 0.5·|dy|·coeff, ring\n * fills, the value label at each ellipse bottom, dashed trend line. */\nexport function sceneFibCircles(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const [a, b] = pts;\n if (d.fmt !== 2) {\n // Legacy entries (before 24/09/2026): circles centred on p0, radius |p1 − p0|.\n const r = Math.hypot(b.x - a.x, b.y - a.y);\n const dash = dashFor(s);\n return [\n ...FIB_CIRCLE_LEVELS.map((lvl) => ({ t: \"circle\" as const, cx: a.x, cy: a.y, r: r * lvl, fill: \"none\", stroke: s.color, strokeWidth: s.width, dash, strokeOpacity: lvl === 1 ? 1 : 0.55 })),\n { t: \"line\", a, b, stroke: s.color, strokeWidth: 1, strokeOpacity: 0.4, dash: \"2 3\" },\n ...anchorsIf(selected, pts),\n ];\n }\n const cx = (a.x + b.x) / 2;\n const cy = (a.y + b.y) / 2;\n const hx = Math.abs(b.x - a.x) / 2;\n const hy = Math.abs(b.y - a.y) / 2;\n const levels = (s.levels ?? FIB_CIRCLE_LEVEL_DEFAULTS).filter((l) => l.visible);\n const fillO = levelFillOpacity(s);\n const ell = (c: number) => `M ${cx - hx * c} ${cy} a ${hx * c} ${hy * c} 0 1 0 ${2 * hx * c} 0 a ${hx * c} ${hy * c} 0 1 0 ${-2 * hx * c} 0 Z`;\n const items: SceneItem[] = [];\n if (fillO > 0) {\n levels.forEach((lvl, i) => items.push({ t: \"path\", d: ell(lvl.coeff) + (i > 0 ? \" \" + ell(levels[i - 1].coeff) : \"\"), fill: lvl.color, fillOpacity: fillO, fillRule: \"evenodd\", stroke: \"none\", inert: true }));\n }\n for (const lvl of levels) {\n // TV: the value label at the ellipse bottom, Left / Middle (box ending\n // 4px before the point); \"Levels\" / \"Coeffs as percents\".\n const l = s.showCoeffs !== false ? fibLevelLabel({ text: fibCoeffText(lvl.coeff, !!s.fibLevelsAsPercents), y: cy + hy * lvl.coeff, left: cx, right: cx, extendLeft: false, extendRight: false, paneW: 0, horz: \"left\", vert: \"middle\", fs: 12 }) : null;\n items.push({ t: \"ellipse\", cx, cy, rx: hx * lvl.coeff, ry: hy * lvl.coeff, fill: \"none\", stroke: lvl.color, strokeWidth: levelWidth(lvl, s), dash: levelDash(lvl, s) });\n if (l) items.push(tvTextItems(l, lvl.color));\n }\n items.push(...fibTrendLineItems(a, b, s), ...anchorsIf(selected, pts));\n return items;\n}\n\n/** Fib speed resistance fan (TV): price / time level grid inside the p0-p1\n * box, coefficient labels per side, rays from p0 through each level\n * (extended), fills between neighbouring rays in the second ray's colour. */\nexport function sceneFibSpeedFan(d: Drawing, pts: Pt[], selected: boolean, w: number, h: number, s: DrawingStyle, coords: Coords | null): Scene {\n const [a, b] = pts;\n const g = speedFanGeometry(d, pts, coords, SPEED_FAN_LEVEL_DEFAULTS);\n const dash = dashFor(s);\n const fillO = levelFillOpacity(s);\n const hRays = g.h.map((l) => ({ color: l.color, far: extendRay(a, { x: b.x, y: l.y }, w, h) }));\n const vRays = g.v.map((l) => ({ color: l.color, far: extendRay(a, { x: l.x, y: b.y }, w, h) }));\n const wedges = (rays: { color: string; far: Pt }[]) => rays.slice(1).map((r, i) => ({ color: r.color, pts: [a, r.far, rays[i].far] }));\n const { left, top, right, bottom } = g.box;\n const grid = s.fanGrid ?? SPEED_FAN_GRID_DEFAULT;\n const gridDash = dashFor({ ...s, lineStyle: grid.style, width: grid.width });\n const lab = (x: number, y: number, coeff: number, vert: \"top\" | \"middle\" | \"bottom\", horz: \"left\" | \"center\" | \"right\", ox: number, oy: number) =>\n tvTextLayout({ x, y, text: fmtCoeff(coeff), fs: 12, vert, horz, offsetX: ox, offsetY: oy });\n const items: SceneItem[] = [];\n if (fillO > 0) {\n for (const band of [...wedges(hRays), ...wedges(vRays)]) items.push({ t: \"polygon\", pts: band.pts, fill: band.color, fillOpacity: fillO, stroke: \"none\", inert: true });\n }\n for (const l of g.h) {\n if (grid.visible) items.push({ t: \"line\", a: { x: left, y: l.y }, b: { x: right, y: l.y }, stroke: grid.color, strokeWidth: grid.width, dash: gridDash, inert: true });\n if (s.showLeftLabels !== false) items.push(tvTextItems(lab(left, l.y, l.coeff, \"middle\", \"right\", 5, 0), l.color));\n if (s.showRightLabels !== false) items.push(tvTextItems(lab(right, l.y, l.coeff, \"middle\", \"left\", 5, 0), l.color));\n }\n for (const l of g.v) {\n if (grid.visible) items.push({ t: \"line\", a: { x: l.x, y: top }, b: { x: l.x, y: bottom }, stroke: grid.color, strokeWidth: grid.width, dash: gridDash, inert: true });\n if (s.showTopLabels !== false) items.push(tvTextItems(lab(l.x, top, l.coeff, \"bottom\", \"center\", 0, 5), l.color));\n if (s.showBottomLabels !== false) items.push(tvTextItems(lab(l.x, bottom, l.coeff, \"top\", \"center\", 0, 5), l.color));\n }\n for (const r of [...hRays, ...vRays]) {\n items.push({ t: \"hit\", a, b: r.far, width: HIT_TOLERANCE * 2 });\n items.push({ t: \"line\", a, b: r.far, stroke: r.color, strokeWidth: s.width, dash, cap: \"round\" });\n }\n items.push(...anchorsIf(selected, pts));\n return items;\n}\n\n/** Fib speed resistance arcs (TV module 49463): half circles (full circles\n * with fullCircles) of radius coeff·|p0p1| round p0, bulging toward p1;\n * fills between arcs; the value label at the arc apex; the trend line. */\nexport function sceneFibSpeedArcs(pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const [c, edge] = pts;\n const unit = Math.hypot(edge.x - c.x, edge.y - c.y);\n const dir = edge.y >= c.y ? 1 : -1;\n const dash = dashFor(s);\n const levels = activeLevels(s, SPEED_ARC_LEVEL_DEFAULTS);\n const fillO = levelFillOpacity(s);\n const full = !!s.fullCircles;\n const arc = (r: number) =>\n full\n ? `M ${c.x - r} ${c.y} A ${r} ${r} 0 1 0 ${c.x + r} ${c.y} A ${r} ${r} 0 1 0 ${c.x - r} ${c.y}`\n : `M ${c.x - r} ${c.y} A ${r} ${r} 0 0 ${dir > 0 ? 0 : 1} ${c.x + r} ${c.y}`;\n const items: SceneItem[] = [];\n if (unit >= 1e-6) {\n if (fillO > 0) {\n levels.slice(1).forEach((hi, i) => {\n const r0 = unit * levels[i].coeff;\n const r1 = unit * hi.coeff;\n // Annulus half: outer arc + inner arc reversed.\n const d = full\n ? `${arc(r1)} Z ${arc(r0)} Z`\n : `M ${c.x - r1} ${c.y} A ${r1} ${r1} 0 0 ${dir > 0 ? 0 : 1} ${c.x + r1} ${c.y} L ${c.x + r0} ${c.y} A ${r0} ${r0} 0 0 ${dir > 0 ? 1 : 0} ${c.x - r0} ${c.y} Z`;\n items.push({ t: \"path\", d, fill: hi.color, fillOpacity: fillO, fillRule: \"evenodd\", stroke: \"none\", inert: true });\n });\n }\n for (const lvl of levels) {\n const r = unit * lvl.coeff;\n items.push({ t: \"hitPath\", d: arc(r), width: HIT_TOLERANCE * 2 });\n items.push({ t: \"path\", d: arc(r), fill: \"none\", stroke: lvl.color, strokeWidth: levelWidth(lvl, s), dash: levelDash(lvl, s) ?? dash });\n if (s.showCoeffs !== false) {\n const l = fibLevelLabel({ text: fibCoeffText(lvl.coeff, false), y: c.y + dir * r, left: c.x, right: c.x, extendLeft: false, extendRight: false, paneW: 0, horz: \"left\", vert: \"middle\", fs: 12 });\n if (l) items.push(tvTextItems(l, lvl.color));\n }\n }\n items.push(...fibTrendLineItems(c, edge, s));\n }\n items.push(...anchorsIf(selected, pts));\n return items;\n}\n\n/** Fib spiral (TV): radius grows one Fibonacci number per quarter turn,\n * through p1 after one turn, 2.5 turns; connector p0→p1 extended right. */\nexport function sceneFibSpiral(pts: Pt[], selected: boolean, w: number, h: number, s: DrawingStyle): Scene {\n const [a, b] = pts;\n const samples = spiralSamples(a, b, !!s.counterclockwise);\n const dash = dashFor(s);\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.hypot(dx, dy) || 1;\n const big = (w + h) * 2;\n const end = { x: b.x + (dx / len) * big, y: b.y + (dy / len) * big };\n return [\n ...(samples.length >= 2\n ? [\n { t: \"line\" as const, a, b: end, stroke: s.color, strokeWidth: s.width, dash },\n { t: \"polyline\" as const, pts: samples, fill: \"none\", stroke: s.color, strokeWidth: s.width, dash, join: \"round\" as const, cap: \"round\" as const },\n ]\n : []),\n ...anchorsIf(selected, pts),\n ];\n}\n\n/** Fib wedge (TV): p0 = apex, p0→p1 / p0→p2 the edges (the second clamped\n * to the first's length); level arcs at radius coeff·edge length between\n * the edge angles, fills between them, the edges as the trend line. */\nexport function sceneFibWedge(pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const [p0, p1, p2raw] = pts;\n const len1 = Math.hypot(p1.x - p0.x, p1.y - p0.y);\n if (len1 < 1e-6) return anchorsIf(selected, pts);\n const a1 = Math.atan2(p1.y - p0.y, p1.x - p0.x);\n const a2raw = Math.atan2(p2raw.y - p0.y, p2raw.x - p0.x);\n const p2 = { x: p0.x + Math.cos(a2raw) * len1, y: p0.y + Math.sin(a2raw) * len1 };\n let sweep = a2raw - a1;\n while (sweep > Math.PI) sweep -= 2 * Math.PI;\n while (sweep < -Math.PI) sweep += 2 * Math.PI;\n const dash = dashFor(s);\n const levels = activeLevels(s, FIB_WEDGE_LEVEL_DEFAULTS);\n const fillO = levelFillOpacity(s);\n const SAMPLES = 24;\n const arcPts = (r: number): Pt[] => {\n const out: Pt[] = [];\n for (let i = 0; i <= SAMPLES; i++) {\n const ang = a1 + (sweep * i) / SAMPLES;\n out.push({ x: p0.x + Math.cos(ang) * r, y: p0.y + Math.sin(ang) * r });\n }\n return out;\n };\n const items: SceneItem[] = [\n { t: \"hit\", a: p0, b: p1, width: 12 },\n { t: \"hit\", a: p0, b: p2, width: 12 },\n ];\n if (fillO > 0) {\n levels.slice(1).forEach((hi, i) => {\n const outer = arcPts(len1 * hi.coeff);\n const inner = arcPts(len1 * levels[i].coeff).reverse();\n items.push({ t: \"polygon\", pts: [...outer, ...inner], fill: hi.color, fillOpacity: fillO, stroke: \"none\", inert: true });\n });\n }\n // TV fib wedge: the two edges are its \"Trend line\".\n items.push(...fibTrendLineItems(p0, p1, s, true), ...fibTrendLineItems(p0, p2, s, true));\n for (const lvl of levels) {\n const r = len1 * lvl.coeff;\n const midAng = a1 + sweep / 2;\n items.push({ t: \"polyline\", pts: arcPts(r), fill: \"none\", stroke: lvl.color, strokeWidth: levelWidth(lvl, s), dash: levelDash(lvl, s) ?? dash });\n if (s.showCoeffs !== false) {\n items.push({ t: \"text\", x: p0.x + Math.cos(midAng) * (r + 8), y: p0.y + Math.sin(midAng) * (r + 8), text: fmtCoeff(lvl.coeff), size: 11, fill: lvl.color, anchor: \"middle\", inert: true });\n }\n }\n items.push(...anchorsIf(selected, pts));\n return items;\n}\n\n/** Pitchfan (TV): rays from p0 through the median point and mid ± half·coeff\n * for each visible level, fills between neighbouring rays. */\nexport function scenePitchfan(pts: Pt[], selected: boolean, w: number, s: DrawingStyle): Scene {\n const [p0, p1, p2] = pts;\n const mid = { x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 };\n const half = { x: (p2.x - p1.x) / 2, y: (p2.y - p1.y) / 2 };\n const dash = dashFor(s);\n const levels = activeLevels(s, PITCHFORK_LEVEL_DEFAULTS);\n const fillO = levelFillOpacity(s);\n const big = w * 4;\n const rayEnd = (target: Pt): Pt => {\n const dx = target.x - p0.x;\n const dy = target.y - p0.y;\n const len = Math.hypot(dx, dy) || 1;\n return { x: p0.x + (dx / len) * big, y: p0.y + (dy / len) * big };\n };\n // Ordered ray targets: −levels … median … +levels (for the fills).\n const ordered: { t: Pt; color: string; median?: boolean }[] = [\n ...levels.slice().reverse().map((l) => ({ t: { x: mid.x - half.x * l.coeff, y: mid.y - half.y * l.coeff }, color: l.color })),\n { t: mid, color: s.color, median: true },\n ...levels.map((l) => ({ t: { x: mid.x + half.x * l.coeff, y: mid.y + half.y * l.coeff }, color: l.color })),\n ];\n const items: SceneItem[] = [{ t: \"line\", a: p1, b: p2, stroke: s.color, strokeWidth: s.width, dash }];\n for (const o of ordered) items.push({ t: \"hit\", a: p0, b: rayEnd(o.t), width: HIT_TOLERANCE * 2 });\n if (fillO > 0) {\n ordered.slice(1).forEach((hi, i) => items.push({ t: \"polygon\", pts: [p0, rayEnd(ordered[i].t), rayEnd(hi.t)], fill: hi.color, fillOpacity: fillO, stroke: \"none\", inert: true }));\n }\n for (const o of ordered) items.push({ t: \"line\", a: p0, b: rayEnd(o.t), stroke: o.color, strokeWidth: o.median ? s.width : 1, dash });\n items.push(...anchorsIf(selected, pts));\n return items;\n}\n","/*\n * Gann tools and the pitchfork family as scenes (moved from OpenTrader\n * DrawingsOverlay, port phase 2): Gann square / square fixed, Gann fan,\n * Gann box, pitchfork (original, Schiff, modified Schiff, inside).\n */\nimport { bboxCorners, dashFor, HIT_TOLERANCE, type Pt } from \"../_shared\";\nimport type { Coords } from \"../coords\";\nimport type { Drawing, DrawingStyle } from \"../types\";\nimport { GANN_ARC_DEFAULTS, GANN_BOX_LEVEL_DEFAULTS, GANN_FAN_DEFAULTS, GANN_FAN_LEVEL_DEFAULTS, GANN_LEVEL_DEFAULTS, PITCHFORK_LEVEL_DEFAULTS } from \"../specs\";\nimport { tvTextLayout } from \"../kinds/tv-text\";\nimport { gannArcPaths, gannArcs, gannBox, gannFanLines, gannFrame, gannLevelLines } from \"../kinds/gann-square\";\nimport { gannFanDir } from \"../kinds/gann-fan\";\nimport { pitchforkExtendRight, pitchforkGeom } from \"../kinds/pitchfork\";\nimport type { Scene, SceneItem } from \"./types\";\nimport { signedFixed, tvTextItems } from \"./text\";\nimport { activeLevels, levelDash, levelFillOpacity, levelWidth } from \"./levels\";\nimport { fmtCoeff } from \"./fib\";\n\nconst anchorsIf = (selected: boolean, pts: Pt[]): SceneItem[] => (selected ? [{ t: \"anchors\", pts }] : []);\n\n/** Gann square / Gann square fixed (TV): level lines, fan lines, arcs (with\n * ring fills) clipped to the box, then the labels of the Gann square:\n * price range at (start.x, end.y), bar range at (end.x, start.y), price /\n * bar ratio at the end (TV text box, last level colour, 10px out). */\nexport function sceneGannSquare(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle, coords: Coords | null): Scene {\n const f = gannFrame(d, pts);\n if (!f) return anchorsIf(selected, pts);\n const levels = s.gannLevels ?? GANN_LEVEL_DEFAULTS;\n const lv = gannLevelLines(f, levels);\n const fans = gannFanLines(f, s.gannFans ?? GANN_FAN_DEFAULTS);\n const arcs = gannArcs(f, s.gannArcs ?? GANN_ARC_DEFAULTS);\n const box = gannBox(f);\n const fillO = s.fillBackground === false ? 0 : Math.max(0, Math.min(1, (100 - (s.transparency ?? 80)) / 100));\n const labels = (() => {\n if (d.kind !== \"gann-square\" || s.showLabels === false || !coords) return [];\n const [p0, p1] = d.points;\n const i0 = coords.timeToBarIndex(p0.time);\n const i1 = coords.timeToBarIndex(p1.time);\n if (i0 == null || i1 == null) return [];\n const k = s.reverse ? -1 : 1;\n const c = (p1.price - p0.price) * k;\n const u = (i1 - i0) * k;\n const digits = Math.max(0, Math.min(8, Math.round(-Math.log10(coords.pipSize()))));\n const fs = s.labelFontSize ?? 12;\n const mk = (x: number, y: number, text: string, horz: \"left\" | \"right\", vert: \"top\" | \"bottom\", oy: number) =>\n tvTextLayout({ x, y, text, fs, bold: s.bold, italic: s.italic, horz, vert, offsetX: 10, offsetY: oy });\n const out = [\n mk(f.start.x, f.end.y, signedFixed(c, digits), u > 0 ? \"right\" : \"left\", c > 0 ? \"bottom\" : \"top\", c > 0 ? 8 : 10),\n mk(f.end.x, f.start.y, String(u), u > 0 ? \"left\" : \"right\", c > 0 ? \"top\" : \"bottom\", c > 0 ? 10 : 8),\n ];\n if (u !== 0) out.push(mk(f.end.x, f.end.y, String(Number(Math.abs(c / u).toFixed(7))), u > 0 ? \"left\" : \"right\", c > 0 ? \"bottom\" : \"top\", c > 0 ? 8 : 10));\n return out;\n })();\n const labelColor = levels[levels.length - 1]?.color ?? \"#808080\";\n const bw = box.right - box.left;\n const bh = box.bottom - box.top;\n const items: SceneItem[] = [\n { t: \"clipRect\", name: \"box\", x: box.left, y: box.top, w: bw, h: bh, idPrefix: \"gann-clip-\" },\n { t: \"rect\", x: box.left, y: box.top, w: bw, h: bh, fill: \"transparent\" },\n ];\n for (const l of lv) {\n items.push({ t: \"line\", a: { x: l.x, y: f.start.y }, b: { x: l.x, y: f.end.y }, stroke: l.color, strokeWidth: l.width, inert: true });\n items.push({ t: \"line\", a: { x: f.start.x, y: l.y }, b: { x: f.end.x, y: l.y }, stroke: l.color, strokeWidth: l.width, inert: true });\n }\n for (const l of fans) items.push({ t: \"line\", a: l.from, b: l.to, stroke: l.color, strokeWidth: l.width, cap: \"round\", inert: true });\n const arcItems: SceneItem[] = [];\n for (const a of arcs) {\n const p = gannArcPaths(f, a.r, a.prev);\n if (fillO > 0) arcItems.push({ t: \"path\", d: p.fill, fill: a.color, fillOpacity: fillO, stroke: \"none\" });\n arcItems.push({ t: \"path\", d: p.stroke, fill: \"none\", stroke: a.color, strokeWidth: a.width });\n }\n items.push({ t: \"group\", clip: \"box\", inert: true, items: arcItems });\n for (const l of labels) items.push(tvTextItems(l, labelColor, s.bold, s.italic));\n items.push(...anchorsIf(selected, pts));\n return items;\n}\n\n/** Gann fan (TV module 449964): a ray from p0 through each level's point\n * (on p1's vertical for c1 > c2, else on p1's horizontal); levels 1-3 fill\n * toward the next visible ray, levels 5-9 toward the previous one, level 4\n * (1/2) has no own fill; labels at the level points. */\nexport function sceneGannFan(pts: Pt[], selected: boolean, w: number, h: number, s: DrawingStyle): Scene {\n const [a, b] = pts;\n const big = (w + h) * 2;\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const levels = (s.levels ?? GANN_FAN_LEVEL_DEFAULTS).map((l, i) => ({ ...l, index: i + 1 })).filter((l) => l.visible);\n const fillO = levelFillOpacity(s);\n const pointOf = (coeff: number): Pt => (coeff > 1 ? { x: b.x, y: a.y + dy / coeff } : { x: a.x + dx * coeff, y: b.y });\n const farOf = (coeff: number): Pt => {\n const v = gannFanDir(a, b, coeff);\n const len = Math.hypot(v.x, v.y) || 1;\n return { x: a.x + (v.x / len) * big, y: a.y + (v.y / len) * big };\n };\n const bands: { from: number; to: number; color: string }[] = [];\n levels.forEach((l, e) => {\n if (l.index < 4 && e < levels.length - 1) bands.push({ from: l.coeff, to: levels[e + 1].coeff, color: l.color });\n else if (l.index > 4 && e > 0) bands.push({ from: l.coeff, to: levels[e - 1].coeff, color: l.color });\n });\n const pad = 12 / 3;\n const items: SceneItem[] = [{ t: \"hit\", a, b, width: 12 }];\n for (const lvl of levels) items.push({ t: \"hit\", a, b: farOf(lvl.coeff), width: HIT_TOLERANCE * 2 });\n if (fillO > 0) for (const band of bands) items.push({ t: \"polygon\", pts: [a, farOf(band.from), farOf(band.to)], fill: band.color, fillOpacity: fillO, stroke: \"none\", inert: true });\n for (const lvl of levels) {\n const e = farOf(lvl.coeff);\n const t = pointOf(lvl.coeff);\n items.push({ t: \"line\", a, b: e, stroke: lvl.color, strokeWidth: levelWidth(lvl, s), dash: levelDash(lvl, s) });\n if (s.showLabels !== false) items.push({ t: \"text\", x: t.x + pad, y: t.y, text: lvl.label ?? fmtCoeff(lvl.coeff), size: 12, fill: lvl.color, anchor: \"start\", baseline: \"central\", inert: true });\n }\n items.push(...anchorsIf(selected, pts));\n return items;\n}\n\n/** Gann box (TV module 972364): price levels m + coeff·g (lines across the\n * box, left / right labels, bands between consecutive visible levels in the\n * upper level colour), time levels at bar round(b + coeff·L) (vertical\n * lines, top / bottom labels, bands), then the angle lines (\"fans\", all 7\n * levels). Reverse swaps the base point. Anchors: the four corners. */\nexport function sceneGannBox(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle, coords: Coords | null): Scene {\n const [a, b] = pts;\n const left = Math.min(a.x, b.x);\n const right = Math.max(a.x, b.x);\n const top = Math.min(a.y, b.y);\n const bottom = Math.max(a.y, b.y);\n const corners = bboxCorners(a, b);\n const hAll = s.levels ?? GANN_BOX_LEVEL_DEFAULTS;\n const vAll = s.vLevels ?? GANN_BOX_LEVEL_DEFAULTS;\n const dash = dashFor(s);\n const [p0, p1] = d.points;\n const rev = !!s.reverse;\n const yOf = (c: number): number => {\n const base = rev ? p1.price : p0.price;\n const span = rev ? p0.price - p1.price : p1.price - p0.price;\n const y = coords?.priceToY(base + c * span);\n return y ?? (rev ? b.y + c * (a.y - b.y) : a.y + c * (b.y - a.y));\n };\n // Time levels (x), snapped to a bar index like TV; linear when unknown.\n const i0 = coords?.timeToBarIndex(p0.time) ?? null;\n const i1 = coords?.timeToBarIndex(p1.time) ?? null;\n const xOf = (c: number): number => {\n if (coords && i0 != null && i1 != null) {\n const base = rev ? i1 : i0;\n const span = rev ? i0 - i1 : i1 - i0;\n const t = coords.barIndexToTime(Math.round(base + c * span));\n const x = t != null ? coords.timeToX(t) : null;\n if (x != null) return x;\n }\n return rev ? b.x + c * (a.x - b.x) : a.x + c * (b.x - a.x);\n };\n const h = hAll.filter((l) => l.visible).map((l) => ({ ...l, y: yOf(l.coeff) }));\n const v = vAll.filter((l) => l.visible).map((l) => ({ ...l, x: xOf(l.coeff) }));\n const hO = s.fillBackground !== false ? Math.max(0, Math.min(1, (100 - (s.transparency ?? 80)) / 100)) : 0;\n const vO = s.fillVertBackground !== false ? Math.max(0, Math.min(1, (100 - (s.vertTransparency ?? 80)) / 100)) : 0;\n const fans = s.fans ?? { visible: false, color: \"#9C9C9C\" };\n // TV fans: level e's time point from hlevel e's coeff, its price point\n // from vlevel e's coeff.\n const fanLines: [Pt, Pt][] = [];\n if (fans.visible) {\n for (let e = 0; e < hAll.length; e++) {\n const fx = xOf(hAll[e].coeff);\n fanLines.push([{ x: left, y: bottom }, { x: fx, y: top }], [{ x: right, y: bottom }, { x: fx, y: top }], [{ x: left, y: top }, { x: fx, y: bottom }], [{ x: right, y: top }, { x: fx, y: bottom }]);\n const vl = vAll[e];\n if (!vl) continue;\n const fy = yOf(vl.coeff);\n fanLines.push([{ x: left, y: bottom }, { x: right, y: fy }], [{ x: right, y: bottom }, { x: left, y: fy }], [{ x: left, y: top }, { x: right, y: fy }], [{ x: right, y: top }, { x: left, y: fy }]);\n }\n }\n const label = (x: number, y: number, text: string, color: string, horz: \"left\" | \"center\" | \"right\", vert: \"top\" | \"middle\" | \"bottom\", offsetX: number, offsetY: number) =>\n tvTextItems(tvTextLayout({ x, y, text, fs: 12, horz, vert, offsetX, offsetY }), color);\n const items: SceneItem[] = [{ t: \"rect\", x: left, y: top, w: Math.max(1, right - left), h: Math.max(1, bottom - top), fill: \"transparent\" }];\n h.forEach((lv, i) => {\n if (i > 0 && hO > 0) items.push({ t: \"rect\", x: left, y: Math.min(lv.y, h[i - 1].y), w: right - left, h: Math.abs(lv.y - h[i - 1].y), fill: lv.color, fillOpacity: hO, inert: true });\n items.push({ t: \"line\", a: { x: left, y: lv.y }, b: { x: right, y: lv.y }, stroke: lv.color, strokeWidth: s.width, dash });\n if (s.showLeftLabels !== false) items.push(label(left, lv.y, fmtCoeff(lv.coeff), lv.color, \"right\", \"middle\", 5, 0));\n if (s.showRightLabels !== false) items.push(label(right, lv.y, fmtCoeff(lv.coeff), lv.color, \"left\", \"middle\", 5, 0));\n });\n v.forEach((lv, i) => {\n if (i > 0 && vO > 0) items.push({ t: \"rect\", x: Math.min(lv.x, v[i - 1].x), y: top, w: Math.abs(lv.x - v[i - 1].x), h: bottom - top, fill: lv.color, fillOpacity: vO, inert: true });\n items.push({ t: \"line\", a: { x: lv.x, y: top }, b: { x: lv.x, y: bottom }, stroke: lv.color, strokeWidth: s.width, dash });\n if (s.showTopLabels !== false) items.push(label(lv.x, top, fmtCoeff(lv.coeff), lv.color, \"center\", \"bottom\", 0, 3));\n if (s.showBottomLabels !== false) items.push(label(lv.x, bottom, fmtCoeff(lv.coeff), lv.color, \"center\", \"top\", 0, 5));\n });\n for (const [p, q] of fanLines) items.push({ t: \"line\", a: p, b: q, stroke: fans.color, strokeWidth: s.width, dash, inert: true });\n items.push(...anchorsIf(selected, corners));\n return items;\n}\n\nexport function scenePitchfork(kind: string, pts: Pt[], selected: boolean, w: number, s: DrawingStyle): Scene {\n const g = pitchforkGeom(kind, pts);\n if (!g) return [];\n const medianFar = pitchforkExtendRight(g.pivot, g.dir, w);\n // TV extendLines: the median and the level lines also run back from their\n // start (extendleft).\n const dl = Math.hypot(g.dir.x, g.dir.y) || 1;\n const back = (p: Pt): Pt => (s.extendLines ? { x: p.x - (g.dir.x / dl) * w * 4, y: p.y - (g.dir.y / dl) * w * 4 } : p);\n const dash = dashFor(s);\n const levels = activeLevels(s, PITCHFORK_LEVEL_DEFAULTS);\n const fillO = levelFillOpacity(s);\n const originOf = (c: number, sign: 1 | -1): Pt => ({ x: g.mid.x + g.half.x * c * sign, y: g.mid.y + g.half.y * c * sign });\n const bands: { from: number; to: number; color: string }[] = [];\n let prev = 0;\n for (const lvl of levels) {\n bands.push({ from: prev, to: lvl.coeff, color: lvl.color });\n prev = lvl.coeff;\n }\n const SIDES: (1 | -1)[] = [1, -1];\n // wide transparent hit lines on the median and every level line\n const items: SceneItem[] = [{ t: \"hit\", a: g.pivot, b: medianFar, width: HIT_TOLERANCE * 2 }];\n for (const sign of SIDES) for (const lvl of levels) {\n const o = originOf(lvl.coeff, sign);\n items.push({ t: \"hit\", a: o, b: pitchforkExtendRight(o, g.dir, w), width: HIT_TOLERANCE * 2 });\n }\n if (fillO > 0) {\n for (const sign of SIDES) for (const band of bands) {\n const o0 = originOf(band.from, sign);\n const o1 = originOf(band.to, sign);\n items.push({ t: \"polygon\", pts: [back(o0), pitchforkExtendRight(o0, g.dir, w), pitchforkExtendRight(o1, g.dir, w), back(o1)], fill: band.color, fillOpacity: fillO, stroke: \"none\", inert: true });\n }\n }\n // connector p2→p3 (the fork handle), then the median (base colour)\n items.push({ t: \"line\", a: pts[1], b: pts[2], stroke: s.color, strokeWidth: s.width, dash, cap: \"round\" });\n items.push({ t: \"line\", a: back(g.pivot), b: medianFar, stroke: s.color, strokeWidth: s.width, dash, cap: \"round\" });\n for (const sign of SIDES) for (const lvl of levels) {\n items.push({ t: \"line\", a: back(originOf(lvl.coeff, sign)), b: pitchforkExtendRight(originOf(lvl.coeff, sign), g.dir, w), stroke: lvl.color, strokeWidth: levelWidth(lvl, s), dash: levelDash(lvl, s), cap: \"round\" });\n }\n items.push(...anchorsIf(selected, pts));\n return items;\n}\n","/*\n * Shapes and cycles as scenes (moved from OpenTrader DrawingsOverlay, port\n * phase 2): rectangle, rotated rectangle, circle, ellipse, triangle, arc,\n * curve, double curve, sector, cyclic lines, sine line, time cycles.\n */\nimport { bboxCorners, dashFor, fillStyle, HIT_TOLERANCE, type Pt } from \"../_shared\";\nimport type { Drawing, DrawingStyle } from \"../types\";\nimport { arcSamples, bezierSamples, cubicSamples, rectEdgeMidpoints, sineSamples } from \"../kinds/hit-tests\";\nimport { rectangleTextLayout } from \"../kinds/rectangle-text\";\nimport { rotatedRectCorners } from \"../rotated-rect\";\nimport type { Scene, SceneItem } from \"./types\";\nimport { textCrossesLine, tvTextItems } from \"./text\";\nimport { endArrowItems, SQUARE_ANCHORS } from \"./lines\";\n\n/** Hover raises a fillable shape's fill slightly (TV affordance). */\nconst HOVER_FILL_DELTA = 0.06;\n\nexport function shapeFill(s: DrawingStyle, hovered: boolean): { fill: string; fillOpacity: number } {\n const f = fillStyle(s);\n if (hovered && f.fillOpacity > 0) {\n return { fill: f.fill, fillOpacity: Math.min(1, f.fillOpacity + HOVER_FILL_DELTA) };\n }\n return f;\n}\n\n/** Stored `text` centered inside a shape (TV: rectangle / circle / ellipse\n * carry an editable text). */\nexport function shapeTextItems(d: Drawing, cx: number, cy: number, s: DrawingStyle): SceneItem[] {\n if (!d.text) return [];\n return [{\n t: \"text\",\n x: cx,\n y: cy,\n text: d.text,\n size: s.fontSize ?? 14,\n fill: s.textColor ?? s.color,\n anchor: \"middle\",\n baseline: \"middle\",\n weight: s.bold ? 700 : 400,\n fontStyle: s.italic ? \"italic\" : \"normal\",\n inert: true,\n }];\n}\n\n/** Endpoint arrowheads (TV `leftEnd`/`rightEnd`) for a sampled curve: the\n * tip sits on the stored endpoint, opening back along the local tangent. */\nexport function curveEndArrowItems(base: Pt[], s: DrawingStyle): SceneItem[] {\n if (base.length < 2) return [];\n const out: SceneItem[] = [];\n if (s.leftEnd === 1) out.push(...endArrowItems(base[1], base[0], s));\n if (s.rightEnd === 1) out.push(...endArrowItems(base[base.length - 2], base[base.length - 1], s));\n return out;\n}\n\nconst pathOf = (pts: Pt[]) => pts.map((p, i) => `${i === 0 ? \"M\" : \"L\"} ${p.x} ${p.y}`).join(\" \");\n\nconst anchorsIf = (selected: boolean, pts: Pt[], squares?: readonly number[]): SceneItem[] =>\n selected ? [squares ? { t: \"anchors\", pts, squares } : { t: \"anchors\", pts }] : [];\n\nexport function sceneRectangle(d: Drawing, pts: Pt[], selected: boolean, w: number, s: DrawingStyle, hovered: boolean): Scene {\n const [a, b] = pts;\n // TV extend: the box (fill, border, middle line) runs from −lineWidth /\n // to pane width + lineWidth on the extended side.\n const left = s.extendLeft ? -s.width : Math.min(a.x, b.x);\n const right = s.extendRight ? w + s.width : Math.max(a.x, b.x);\n const top = Math.min(a.y, b.y);\n const bottom = Math.max(a.y, b.y);\n const f = shapeFill(s, hovered);\n // TV rectangle text (kinds/rectangle-text.ts). The middle line (TV\n // fillRectWithBorder: after the fill, before the border, at floor of the\n // box middle, butt caps) is cut behind a Middle (\"Inside\") text when the\n // text crosses it.\n const label = rectangleTextLayout(d, pts, w);\n const ml = s.rectMiddleLine;\n const out: Scene = [{\n t: \"rect\", x: left, y: top, w: right - left, h: bottom - top,\n fill: f.fill, fillOpacity: f.fillOpacity, stroke: s.color, strokeWidth: s.width, dash: dashFor(s),\n }];\n if (ml?.visible) {\n const cutPoly = label && (s.vertLabelsAlign ?? \"middle\") === \"middle\" && textCrossesLine(label.lines) ? label.poly : null;\n const cut = cutPoly && cutPoly.length ? \"mid\" : undefined;\n if (cut) out.push({ t: \"clip\", name: cut, polys: [cutPoly!] });\n const midY = Math.floor((top + bottom) / 2);\n out.push({\n t: \"line\", a: { x: left, y: midY }, b: { x: right, y: midY },\n stroke: ml.color, strokeWidth: ml.width, dash: dashFor({ ...s, lineStyle: ml.style, width: ml.width }),\n cap: \"butt\", clip: cut, inert: true,\n });\n }\n if (label) out.push(tvTextItems(label, s.textColor ?? s.color, s.bold, s.italic));\n // TV rectangles: 8 anchors — 4 corners + 4 edge midpoints (each midpoint\n // drags only its edge).\n out.push(...anchorsIf(selected, [...bboxCorners(a, b), ...rectEdgeMidpoints(a, b)], SQUARE_ANCHORS.rectangle));\n return out;\n}\n\nexport function sceneRotatedRectangle(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const fmt2 = d.fmt === 2;\n const corners = rotatedRectCorners(pts, fmt2);\n const f = fillStyle(s);\n // TV anchors: p0, p1 and the 4 corners (every corner drives the width).\n const anchors = fmt2 ? [pts[0], pts[1], ...corners] : pts;\n return [\n { t: \"polygon\", pts: corners, fill: f.fill, fillOpacity: f.fillOpacity, stroke: s.color, strokeWidth: s.width, dash: dashFor(s), join: \"round\" },\n ...anchorsIf(selected, anchors),\n ];\n}\n\nexport function sceneCircle(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle, hovered: boolean): Scene {\n const [c, e] = pts;\n const r = Math.hypot(e.x - c.x, e.y - c.y);\n const f = shapeFill(s, hovered);\n return [\n { t: \"circle\", cx: c.x, cy: c.y, r: Math.max(0, r), fill: f.fill, fillOpacity: f.fillOpacity, stroke: s.color, strokeWidth: s.width, dash: dashFor(s) },\n ...shapeTextItems(d, c.x, c.y, s),\n ...anchorsIf(selected, pts),\n ];\n}\n\nexport function sceneEllipse(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle, hovered: boolean): Scene {\n const [a, b, c] = pts;\n const cx = (a.x + b.x) / 2;\n const cy = (a.y + b.y) / 2;\n const rx = Math.max(1, Math.hypot(b.x - a.x, b.y - a.y) / 2);\n const angRad = Math.atan2(b.y - a.y, b.x - a.x);\n // Perpendicular distance of p2 from the axis line = the half-height.\n const nx = -Math.sin(angRad);\n const ny = Math.cos(angRad);\n const ry = Math.max(1, Math.abs((c.x - cx) * nx + (c.y - cy) * ny));\n const deg = (angRad * 180) / Math.PI;\n const f = shapeFill(s, hovered);\n return [\n {\n t: \"group\",\n transform: `rotate(${deg} ${cx} ${cy})`,\n items: [\n { t: \"ellipse\", cx, cy, rx, ry, fill: \"transparent\", stroke: \"transparent\", strokeWidth: HIT_TOLERANCE * 2 },\n { t: \"ellipse\", cx, cy, rx, ry, fill: f.fill, fillOpacity: f.fillOpacity, stroke: s.color, strokeWidth: s.width, dash: dashFor(s) },\n ],\n },\n ...shapeTextItems(d, cx, cy, s),\n ...anchorsIf(selected, pts),\n ];\n}\n\nexport function sceneTriangle(pts: Pt[], selected: boolean, s: DrawingStyle, hovered: boolean): Scene {\n const f = shapeFill(s, hovered);\n return [\n { t: \"polygon\", pts, fill: f.fill, fillOpacity: f.fillOpacity, stroke: s.color, strokeWidth: s.width, dash: dashFor(s), join: \"round\" },\n ...anchorsIf(selected, pts),\n ];\n}\n\n/** Arc through three points: p0 / p1 are the chord ends, p2 sets the\n * perpendicular distance from the chord (arcSamples); the region between the\n * arc and the chord is filled. */\nexport function sceneArc(pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const [a, b] = pts;\n const dash = dashFor(s);\n const samples = pts.length === 3 ? arcSamples(a, b, pts[2]) : null;\n if (!samples) {\n return [{ t: \"line\", a, b, stroke: s.color, strokeWidth: s.width, dash, cap: \"round\" }, ...anchorsIf(selected, pts)];\n }\n const d = pathOf(samples);\n const f = fillStyle(s);\n return [\n // fill closes back to the chord start; only the arc itself is stroked\n { t: \"path\", d: `${d} Z`, fill: f.fill, fillOpacity: f.fillOpacity, stroke: \"none\" },\n { t: \"path\", d, fill: \"none\", stroke: s.color, strokeWidth: s.width, dash, cap: \"round\" },\n ...anchorsIf(selected, pts),\n ];\n}\n\n/** Sampled curve (fill to the chord, stroke, end arrows) + the control\n * guides when selected. `controls` = [end, control] pairs. */\nfunction curveScene(pts: Pt[], selected: boolean, s: DrawingStyle, stroke: Pt[], base: Pt[], controls: [Pt, Pt][]): Scene {\n const out: Scene = [];\n if (s.fillBackground) {\n const f = fillStyle(s);\n out.push({ t: \"path\", d: pathOf(base) + \" Z\", fill: f.fill, fillOpacity: f.fillOpacity, stroke: \"none\" });\n }\n out.push({ t: \"path\", d: pathOf(stroke), fill: \"none\", stroke: s.color, strokeWidth: s.width, dash: dashFor(s), cap: \"round\" });\n out.push(...curveEndArrowItems(base, s));\n if (selected) {\n for (const [e, c] of controls) out.push({ t: \"line\", a: e, b: c, stroke: s.color, strokeOpacity: 0.3, dash: \"3 3\" });\n out.push({ t: \"anchors\", pts });\n }\n return out;\n}\n\nexport function sceneCurve(pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n // Placement preview hands 2 points (the control is derived at commit) —\n // degrade to a straight chord via a midpoint control.\n const full: Pt[] = pts.length >= 3\n ? pts\n : [pts[0], { x: (pts[0].x + pts[1].x) / 2, y: (pts[0].y + pts[1].y) / 2 }, pts[1]];\n const [a, ctrl, b] = full;\n const stroke = bezierSamples(full, !!s.extendLeft, !!s.extendRight);\n // Fill closes the UNEXTENDED curve back to its chord (TV fillBackground).\n const base = s.extendLeft || s.extendRight ? bezierSamples(full) : stroke;\n return curveScene(pts, selected, s, stroke, base, [[a, ctrl], [b, ctrl]]);\n}\n\nexport function sceneDoubleCurve(pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n // Placement preview hands 2 points (controls derive at commit) — degrade to\n // a straight chord via controls at the thirds.\n const full: Pt[] = pts.length >= 4\n ? pts\n : [\n pts[0],\n { x: pts[0].x + (pts[1].x - pts[0].x) / 3, y: pts[0].y + (pts[1].y - pts[0].y) / 3 },\n { x: pts[0].x + ((pts[1].x - pts[0].x) * 2) / 3, y: pts[0].y + ((pts[1].y - pts[0].y) * 2) / 3 },\n pts[1],\n ];\n const [a, c1, c2, b] = full;\n const stroke = cubicSamples(full, !!s.extendLeft, !!s.extendRight);\n const base = s.extendLeft || s.extendRight ? cubicSamples(full) : stroke;\n return curveScene(pts, selected, s, stroke, base, [[a, c1], [b, c2]]);\n}\n\n/** TV sector: radial gradient wedge from p0 with radius |p0 p1|, from the\n * p1 direction to the p2 direction (shortest way). */\nexport function sceneSector(pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const [p0, p1, p2raw] = pts;\n const len1 = Math.hypot(p1.x - p0.x, p1.y - p0.y);\n if (!p2raw || len1 < 1e-6) {\n return [{ t: \"line\", a: p0, b: p1, stroke: s.color, strokeWidth: s.width }, ...anchorsIf(selected, pts)];\n }\n const a1 = Math.atan2(p1.y - p0.y, p1.x - p0.x);\n const a2 = Math.atan2(p2raw.y - p0.y, p2raw.x - p0.x);\n const p2 = { x: p0.x + Math.cos(a2) * len1, y: p0.y + Math.sin(a2) * len1 };\n let sweep = a2 - a1;\n while (sweep > Math.PI) sweep -= 2 * Math.PI;\n while (sweep < -Math.PI) sweep += 2 * Math.PI;\n const arc: Pt[] = [];\n for (let i = 0; i <= 32; i++) {\n const ang = a1 + (sweep * i) / 32;\n arc.push({ x: p0.x + Math.cos(ang) * len1, y: p0.y + Math.sin(ang) * len1 });\n }\n const alpha = s.fillBackground === false ? 0 : Math.max(0, Math.min(1, (100 - (s.transparency ?? 80)) / 100));\n return [\n {\n t: \"radialGradient\", name: \"sector\", idPrefix: \"sector-grad-\", cx: p0.x, cy: p0.y, r: len1,\n stops: [\n { offset: 0, color: s.sectorColor1 ?? \"#2962ff\", opacity: alpha },\n { offset: 1, color: s.sectorColor2 ?? \"#9c27b0\", opacity: alpha },\n ],\n },\n { t: \"polygon\", pts: [p0, ...arc], fillRef: \"sector\", stroke: \"none\" },\n { t: \"line\", a: p0, b: p1, stroke: s.color, strokeWidth: s.width },\n { t: \"line\", a: p0, b: p2, stroke: s.color, strokeWidth: s.width },\n { t: \"polyline\", pts: arc, fill: \"none\", stroke: s.color, strokeWidth: s.width },\n ...anchorsIf(selected, pts),\n ];\n}\n\n/** TV cyclic lines: vertical lines every |p1 p2| bars from p1 to the pane\n * edge, and the dashed anchor connector. */\nexport function sceneCyclicLines(pts: Pt[], selected: boolean, w: number, h: number, s: DrawingStyle): Scene {\n const [p1, p2] = pts;\n const unit = p2.x - p1.x;\n const dash = dashFor(s);\n // anchor connector (TV: #808080 dashed 1px between the two clicks)\n const out: Scene = [{ t: \"line\", a: p1, b: p2, stroke: \"#808080\", strokeWidth: 1, dash: \"6 4\" }];\n if (Math.abs(unit) >= 2) {\n for (let x = p1.x; unit > 0 ? x <= w + 2 : x >= -2; x += unit) {\n out.push({ t: \"line\", a: { x, y: 0 }, b: { x, y: h }, stroke: s.color, strokeWidth: s.width, dash });\n }\n }\n out.push(...anchorsIf(selected, pts));\n return out;\n}\n\nexport function sceneSineLine(pts: Pt[], selected: boolean, w: number, s: DrawingStyle): Scene {\n const samples = sineSamples(pts[0], pts[1], w);\n const out: Scene = [];\n if (samples.length >= 2) out.push({ t: \"polyline\", pts: samples, fill: \"none\", stroke: s.color, strokeWidth: s.width, dash: dashFor(s) });\n out.push(...anchorsIf(selected, pts));\n return out;\n}\n\n/** TV time cycles: half circles of diameter |p1 p2| on the p1 level, repeated\n * over the whole pane width. */\nexport function sceneTimeCycles(pts: Pt[], selected: boolean, w: number, s: DrawingStyle): Scene {\n const [p1, p2] = pts;\n const unit = Math.abs(p2.x - p1.x);\n const r = unit / 2;\n const dash = dashFor(s);\n const f = fillStyle(s);\n const baseY = p1.y;\n const out: Scene = [];\n if (unit >= 2) {\n const startX = Math.min(p1.x, p2.x);\n const k0 = Math.floor(-startX / unit) - 1;\n const k1 = Math.ceil((w - startX) / unit) + 1;\n for (let k = k0; k <= k1; k++) {\n const sx = startX + k * unit;\n if (f.fillOpacity > 0) {\n out.push({ t: \"path\", d: `M ${sx} ${baseY} A ${r} ${r} 0 0 1 ${sx + unit} ${baseY} Z`, fill: f.fill, fillOpacity: f.fillOpacity, stroke: \"none\", inert: true });\n }\n out.push({ t: \"path\", d: `M ${sx} ${baseY} A ${r} ${r} 0 0 1 ${sx + unit} ${baseY}`, fill: \"none\", stroke: s.color, strokeWidth: s.width, dash });\n }\n }\n out.push(...anchorsIf(selected, pts));\n return out;\n}\n","/*\n * Patterns, Elliott waves and the plain polyline family as scenes (moved from\n * OpenTrader DrawingsOverlay, port phase 2): XABCD, Cypher, ABCD, three\n * drives, triangle pattern, head and shoulders, Elliott impulse / correction\n * / triangle / double combo / triple combo, polyline, path, brush,\n * highlighter.\n */\nimport { dashFor, HIT_TOLERANCE, type Pt } from \"../_shared\";\nimport type { Drawing, DrawingStyle } from \"../types\";\nimport { ELLIOTT_DEFAULT_DEGREE } from \"../specs\";\nimport { measureTextStyled } from \"../kinds/tv-text\";\nimport type { Scene, SceneItem } from \"./types\";\nimport { levelFillOpacity } from \"./levels\";\nimport { rangeArrowPath } from \"./lines\";\n\n/** Per-kind vertex labels — order matches stored-point order (the Nth click\n * gets the Nth label). */\nexport const KIND_LABELS: Record<string, readonly string[]> = {\n \"xabcd-pattern\": [\"X\", \"A\", \"B\", \"C\", \"D\"],\n \"cypher-pattern\": [\"X\", \"A\", \"B\", \"C\", \"D\"],\n \"abcd-pattern\": [\"A\", \"B\", \"C\", \"D\"],\n // 7 points (TV): labels only at the left shoulder / head / right shoulder.\n \"head-and-shoulders\": [\"\", \"LS\", \"\", \"H\", \"\", \"RS\", \"\"],\n \"triangle-pattern\": [\"A\", \"B\", \"C\", \"D\"],\n \"three-drives-pattern\": [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"],\n // Elliott label sets start at \"0\" (TV; the first click is the wave origin).\n \"elliott-impulse\": [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\"],\n \"elliott-correction\": [\"0\", \"A\", \"B\", \"C\"],\n \"elliott-triangle\": [\"0\", \"A\", \"B\", \"C\", \"D\", \"E\"],\n \"elliott-double-combo\": [\"0\", \"W\", \"X\", \"Y\"],\n \"elliott-triple-combo\": [\"0\", \"W\", \"X\", \"Y\", \"X\", \"Z\"],\n};\n\n/** Kinds whose polyline closes into a filled polygon. (TV: abcd has NO fill;\n * triangle-pattern fills only the convergence wedge and xabcd/cypher only\n * their two triangles — custom-rendered.) */\nconst FILLED_KINDS = new Set<string>([\n \"polyline\",\n]);\n\n/** Elliott waves (TV line-tool-elliott, module 910357). Degree 0\n * (Supermillennium) … 14 (Minuscule), factory 7 (Intermediate). With\n * t = 14 − degree: label group = floor(t / 3), decoration = none / brackets /\n * circle by t % 3. Group styles (font / circle / bold): 0 = 11 / 14 / bold,\n * 1 = 16 / 22, 2 = 18 / 22, 3 = 20 / 28, 4 = 24 / 36 / bold; circle border\n * 1px. Label sets: impulse 1-5, i-v, 1-5, I-V, 1-5; the letter waves\n * upper / lower / upper / lower / upper. Label centred yOffset 10 + half the\n * circle size off each point, in the wave colour at full opacity; the side\n * alternates along the wave, starting from the sign of p2.y − p1.y (1 =\n * below). The \"0\" origin label shows only while the anchors do (hover /\n * selection). */\nconst ELLIOTT_GROUP_STYLE: { font: number; circle: number; bold: boolean }[] = [\n { font: 11, circle: 14, bold: true },\n { font: 16, circle: 22, bold: false },\n { font: 18, circle: 22, bold: false },\n { font: 20, circle: 28, bold: false },\n { font: 24, circle: 36, bold: true },\n];\nconst ELLIOTT_BASE_LABELS: Record<string, string[]> = {\n \"elliott-impulse\": [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\"],\n \"elliott-correction\": [\"0\", \"A\", \"B\", \"C\"],\n \"elliott-triangle\": [\"0\", \"A\", \"B\", \"C\", \"D\", \"E\"],\n \"elliott-double-combo\": [\"0\", \"W\", \"X\", \"Y\"],\n \"elliott-triple-combo\": [\"0\", \"W\", \"X\", \"Y\", \"X\", \"Z\"],\n};\nconst ROMAN = [\"0\", \"i\", \"ii\", \"iii\", \"iv\", \"v\"];\nfunction elliottLabels(kind: string, group: number): string[] {\n const base = ELLIOTT_BASE_LABELS[kind] ?? [];\n if (kind === \"elliott-impulse\") {\n if (group === 1) return ROMAN;\n if (group === 3) return ROMAN.map((r) => r.toUpperCase());\n return base;\n }\n return group % 2 === 1 ? base.map((l) => l.toLowerCase()) : base;\n}\n\nexport function sceneElliott(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const degree = Math.max(0, Math.min(14, Math.round(s.elliottDegree ?? ELLIOTT_DEFAULT_DEGREE)));\n const t = 14 - degree;\n const group = Math.floor(t / 3);\n const deco = ([\"\", \"brackets\", \"circle\"] as const)[t % 3];\n const gs = ELLIOTT_GROUP_STYLE[group];\n const labels = elliottLabels(d.kind, group);\n const offset = 10 + gs.circle / 2;\n const start = pts.length > 2 ? Math.sign(pts[2].y - pts[1].y) : 1;\n const side = (i: number) => (i % 2 === 0 ? start : -start);\n const out: Scene = [{ t: \"polyline\", pts, fill: \"none\", stroke: \"transparent\", strokeWidth: Math.max(HIT_TOLERANCE * 2, s.width) }];\n if (s.showWave !== false) {\n out.push({ t: \"polyline\", pts, fill: \"none\", stroke: s.color, strokeWidth: s.width, dash: dashFor(s), join: \"round\", cap: \"round\" });\n }\n pts.forEach((pt, i) => {\n if (i === 0 && !selected) return;\n const cy = pt.y + (side(i) === 1 ? offset : -offset);\n const l = labels[i] ?? String(i);\n if (deco === \"circle\") out.push({ t: \"circle\", cx: pt.x, cy, r: gs.circle / 2 - 0.5, fill: \"none\", stroke: s.color, strokeWidth: 1, inert: true });\n out.push({\n t: \"text\", x: pt.x, y: cy + 0.05 * gs.font, text: deco === \"brackets\" ? `(${l})` : l, size: gs.font,\n weight: gs.bold ? 700 : 400, fill: s.color, anchor: \"middle\", baseline: \"central\", inert: true,\n });\n });\n if (selected) out.push({ t: \"anchors\", pts });\n return out;\n}\n\n/** Label y-offset: above local peaks, below local troughs (TV places pattern\n * letters on the outside of the zigzag). */\nfunction labelOffsetY(pts: Pt[], i: number): number {\n const prev = pts[i - 1] ?? pts[i + 1] ?? pts[i];\n const next = pts[i + 1] ?? pts[i - 1] ?? pts[i];\n const isPeak = pts[i].y <= Math.min(prev.y, next.y);\n return isPeak ? -8 : 16;\n}\n\ntype PillText = { bg: string; fg: string; fontSize: number; bold?: boolean; italic?: boolean };\n\n/** Vertex/ratio label pill (TV TextRenderer data used across the pattern pane\n * views: white text on the tool colour, backgroundRoundRect 4). `dy` places\n * the pill above (<0) or below (>0) the anchor; 0 centers it on the point. */\nfunction patternPill(x: number, y: number, dy: number, text: string, p: PillText): SceneItem {\n const w = text.length * p.fontSize * 0.62 + 8;\n const h = p.fontSize + 6;\n const top = dy < 0 ? y + dy - h : dy > 0 ? y + dy : y - h / 2;\n return {\n t: \"group\",\n inert: true,\n items: [\n { t: \"rect\", x: x - w / 2, y: top, w, h, rx: 4, fill: p.bg },\n {\n t: \"text\", x, y: top + h / 2 + 0.5, text, size: p.fontSize, weight: p.bold ? 700 : 400, fontStyle: p.italic ? \"italic\" : \"normal\",\n fill: p.fg, anchor: \"middle\", baseline: \"middle\",\n },\n ],\n };\n}\n\n/** \"0.618\"-style retracement value: |(c−b)/(b−a)| by price, rounded to\n * `decimals` (TV rounds abcd/xabcd to 3, three-drives to 2). */\nfunction retracement(a: number, b: number, c: number, decimals: number): string {\n const denom = b - a;\n if (Math.abs(denom) < 1e-12) return \"∞\";\n const f = Math.pow(10, decimals);\n return String(Math.round((Math.abs((c - b) / denom)) * f) / f);\n}\n\n/** Dotted retracement connector (TV TrendLineRenderer, LINESTYLE_DOTTED). */\nfunction patternConnector(a: Pt, b: Pt, color: string, width: number): SceneItem[] {\n return [\n { t: \"hit\", a, b, width: HIT_TOLERANCE * 2 },\n { t: \"line\", a, b, stroke: color, strokeWidth: width, dash: \"2 3\" },\n ];\n}\n\n/** A connector i→j with its ratio pill at the midpoint. */\nfunction ratioLeg(pts: Pt[], i: number, j: number, width: number, text: string, p: PillText): SceneItem[] {\n return [\n ...patternConnector(pts[i], pts[j], p.bg, width),\n patternPill((pts[i].x + pts[j].x) / 2, (pts[i].y + pts[j].y) / 2, 0, text, p),\n ];\n}\n\nconst pillText = (s: DrawingStyle): PillText => ({ bg: s.color, fg: s.textColor ?? \"#ffffff\", fontSize: s.fontSize ?? 12, bold: s.bold, italic: s.italic });\n\n/** Letter pills at each vertex, above local peaks / below troughs (the chunks\n * flip vertAlign per segment direction; the local-extremum rule matches for\n * zigzag patterns). */\nfunction patternLetterPills(pts: Pt[], labels: readonly string[], s: DrawingStyle): SceneItem[] {\n const p = pillText(s);\n const out: SceneItem[] = [];\n pts.forEach((pt, i) => {\n if (labels[i]) out.push(patternPill(pt.x, pt.y, labelOffsetY(pts, i) < 0 ? -5 : 5, labels[i], p));\n });\n return out;\n}\n\nconst hitPolyline = (pts: Pt[]): SceneItem => ({ t: \"polyline\", pts, fill: \"none\", stroke: \"transparent\", strokeWidth: HIT_TOLERANCE * 2 });\n\n/** ABCD pattern (line-tool-abcd): solid A-B-C-D polyline, DOTTED connectors\n * A→C and B→D carrying the retracement ratio at their midpoints —\n * |(C−B)/(B−A)| and |(D−C)/(C−B)| by price, 3 decimals — plus letter pills.\n * No polygon fill (TV renders it unfilled). */\nexport function sceneAbcdPattern(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const p = pillText(s);\n const prices = d.points.map((q) => q.price);\n const out: Scene = [\n hitPolyline(pts),\n { t: \"polyline\", pts, fill: \"none\", stroke: s.color, strokeWidth: s.width, dash: dashFor(s), join: \"round\" },\n ];\n if (pts.length >= 3) out.push(...ratioLeg(pts, 0, 2, s.width, retracement(prices[0], prices[1], prices[2], 3), p));\n if (pts.length >= 4) out.push(...ratioLeg(pts, 1, 3, s.width, retracement(prices[1], prices[2], prices[3], 3), p));\n out.push(...patternLetterPills(pts, KIND_LABELS[d.kind]!, s));\n if (selected) out.push({ t: \"anchors\", pts });\n return out;\n}\n\n/** XABCD / Cypher (line-tool-5points-patterns): the X-A-B and B-C-D triangles\n * fill with the translucent background colour (factory transparency 85), the\n * X-A-B-C-D polyline stays solid, and four DOTTED connectors (X→B, A→C, X→D,\n * B→D, 1px) carry midpoint ratio pills. Ratio formulas per chunk (cypher\n * overrides the bc/xd legs — LineToolCypherPattern `_updateBaseData`). */\nexport function sceneXabcdPattern(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const cypher = d.kind === \"cypher-pattern\";\n const p = pillText(s);\n const fill = s.backgroundColor ?? s.color;\n const fillO = s.fillBackground === false ? 0 : levelFillOpacity(s);\n const pr = d.points.map((q) => q.price);\n const out: Scene = [];\n if (fillO > 0 && pts.length >= 3) out.push({ t: \"polygon\", pts: [pts[0], pts[1], pts[2]], fill, fillOpacity: fillO, stroke: \"none\" });\n if (fillO > 0 && pts.length >= 5) out.push({ t: \"polygon\", pts: [pts[2], pts[3], pts[4]], fill, fillOpacity: fillO, stroke: \"none\" });\n out.push(hitPolyline(pts), { t: \"polyline\", pts, fill: \"none\", stroke: s.color, strokeWidth: s.width, dash: dashFor(s), join: \"round\" });\n // Ratio legs: xabcd vs cypher formulas from the decompiled `_updateBaseData`\n // pairs (X A B C D = points 0..4).\n if (pts.length >= 3) out.push(...ratioLeg(pts, 0, 2, 1, retracement(pr[0], pr[1], pr[2], 3), p));\n if (pts.length >= 4) out.push(...ratioLeg(pts, 1, 3, 1, cypher ? retracement(pr[1], pr[0], pr[3], 3) : retracement(pr[1], pr[2], pr[3], 3), p));\n if (pts.length >= 5) {\n // cypher xd leg = |(D−C)/(X−C)|; xabcd xd = |(D−A)/(A−X)|.\n const xd = cypher ? retracement(pr[0], pr[2], pr[4], 3) : retracement(pr[0], pr[1], pr[4], 3);\n out.push(\n ...patternConnector(pts[0], pts[4], s.color, 1),\n ...patternConnector(pts[2], pts[4], s.color, 1),\n patternPill((pts[2].x + pts[4].x) / 2, (pts[2].y + pts[4].y) / 2, 0, retracement(pr[2], pr[3], pr[4], 3), p),\n patternPill((pts[0].x + pts[4].x) / 2, (pts[0].y + pts[4].y) / 2, 0, xd, p),\n );\n }\n out.push(...patternLetterPills(pts, KIND_LABELS[d.kind]!, s));\n if (selected) out.push({ t: \"anchors\", pts });\n return out;\n}\n\n/** Three drives (line-tool-three-drivers): 7-point solid polyline; DOTTED\n * connectors p1→p3 and p3→p5 with the retracements |(p3−p2)/(p2−p1)| and\n * |(p5−p4)/(p4−p3)| (2 decimals) at their midpoints. TV renders no vertex\n * letters on this tool. */\nexport function sceneThreeDrives(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const p = pillText(s);\n const pr = d.points.map((q) => q.price);\n const out: Scene = [\n hitPolyline(pts),\n { t: \"polyline\", pts, fill: \"none\", stroke: s.color, strokeWidth: s.width, dash: dashFor(s), join: \"round\" },\n ];\n if (pts.length >= 4) out.push(...ratioLeg(pts, 1, 3, s.width, retracement(pr[1], pr[2], pr[3], 2), p));\n if (pts.length >= 6) out.push(...ratioLeg(pts, 3, 5, s.width, retracement(pr[3], pr[4], pr[5], 2), p));\n if (selected) out.push({ t: \"anchors\", pts });\n return out;\n}\n\n/** Head-and-shoulders / triangle pattern pill (white text on the tool colour,\n * radius 4, padding fs/3), 5px above or below the point. */\nfunction hnsPill(pt: Pt, above: boolean, text: string, p: PillText): SceneItem {\n const pad = p.fontSize / 3;\n const w = measureTextStyled(text, p.fontSize, !!p.bold, !!p.italic) + 2 * pad;\n const h = p.fontSize + 2 * pad;\n const top = above ? pt.y - 5 - h : pt.y + 5;\n return {\n t: \"group\",\n inert: true,\n items: [\n { t: \"rect\", x: pt.x - w / 2, y: top, w, h, rx: 4, fill: p.bg },\n {\n t: \"text\", x: pt.x, y: top + h / 2, text, size: p.fontSize, weight: p.bold ? 700 : 400, fontStyle: p.italic ? \"italic\" : \"normal\",\n fill: p.fg, anchor: \"middle\", baseline: \"central\",\n },\n ],\n };\n}\n\n/** Triangle pattern (TV line-tool-triangle-pattern): solid legs A-B, B-C,\n * C-D; the two edges (line A-C and line B-D) drawn from the leftmost point\n * (rightmost when they converge to the left) to their crossing, as a\n * dotted-outline triangle with the background fill; letter pills A-D (white\n * text on the tool colour, radius 4, padding fs/3) 5px above / below each\n * point by the direction of the neighbouring leg. */\nexport function sceneTrianglePattern(pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const [t, n, r, i] = pts;\n const p = pillText(s);\n let tri: Pt[] | null = null;\n if (Math.abs(r.x - t.x) >= 1 && Math.abs(i.x - n.x) >= 1) {\n const o = (r.y - t.y) / (r.x - t.x);\n const h = (i.y - n.y) / (i.x - n.x);\n if (Math.abs(o - h) >= 1e-6) {\n let e = Math.min(t.x, n.x, r.x, i.x);\n let l = { x: e, y: t.y + (e - t.x) * o };\n let a = { x: e, y: n.y + (e - n.x) * h };\n const px = (n.y - t.y + (t.x * o - n.x * h)) / (o - h);\n if (px < e) {\n e = Math.max(t.x, n.x, r.x, i.x);\n l = { x: e, y: t.y + (e - t.x) * o };\n a = { x: e, y: n.y + (e - n.x) * h };\n }\n tri = [l, a, { x: px, y: t.y + (px - t.x) * o }];\n }\n }\n const out: Scene = [hitPolyline(pts)];\n if (tri) {\n out.push({\n t: \"polygon\", pts: tri, fill: s.fillBackground === false ? \"none\" : (s.backgroundColor ?? s.color), fillOpacity: levelFillOpacity(s) || 0.15,\n stroke: s.color, strokeWidth: s.width, dash: dashFor({ ...s, lineStyle: \"dotted\" }), inert: true,\n });\n }\n out.push(\n { t: \"polyline\", pts, fill: \"none\", stroke: s.color, strokeWidth: s.width, join: \"round\" },\n hnsPill(t, n.y > t.y, \"A\", p),\n hnsPill(n, n.y < t.y, \"B\", p),\n hnsPill(r, r.y < n.y, \"C\", p),\n hnsPill(i, i.y < r.y, \"D\", p),\n );\n if (selected) out.push({ t: \"anchors\", pts });\n return out;\n}\n\n/** Intersection of the infinite line a-b with the segment c-d. */\nfunction lineSegmentHit(a: Pt, b: Pt, c: Pt, d: Pt): Pt | null {\n const r = { x: b.x - a.x, y: b.y - a.y };\n const s = { x: d.x - c.x, y: d.y - c.y };\n const den = r.x * s.y - r.y * s.x;\n if (Math.abs(den) < 1e-9) return null;\n const u = ((c.x - a.x) * r.y - (c.y - a.y) * r.x) / den;\n if (u < 0 || u > 1) return null;\n return { x: c.x + s.x * u, y: c.y + s.y * u };\n}\n\n/** Head and shoulders (TV line-tool-head-and-shoulders): polyline through the\n * 7 points; dotted neckline through the troughs p2-p4, cut where it meets\n * the first leg (p0-p1) and the last leg (p5-p6), extended to the troughs'\n * side when a leg is not reached; fills of the head triangle (p2, p3, p4)\n * and of the two shoulder triangles closed by the neckline; pill labels\n * \"Left Shoulder\" / \"Head\" / \"Right Shoulder\" 5px above the peak (below for\n * an inverted one). */\nexport function sceneHeadAndShoulders(pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const fillO = levelFillOpacity(s) || 0.15;\n const fill = s.backgroundColor ?? s.color;\n const [p0, p1, p2, p3, p4, p5, p6] = pts;\n const i1 = lineSegmentHit(p2, p4, p0, p1);\n const i2 = lineSegmentHit(p2, p4, p5, p6);\n // Neckline ends: the intersections, else extend from the trough outward.\n const far = (from: Pt, toward: Pt): Pt => ({ x: from.x + (toward.x - from.x) * 10, y: from.y + (toward.y - from.y) * 10 });\n const p = pillText(s);\n const tri = (a: Pt, b: Pt, c: Pt): SceneItem => ({ t: \"polygon\", pts: [a, b, c], fill, fillOpacity: fillO, stroke: \"none\", inert: true });\n const out: Scene = [hitPolyline(pts)];\n if (s.fillBackground !== false) {\n out.push(tri(p2, p3, p4));\n if (i1) out.push(tri(i1, p1, p2));\n if (i2) out.push(tri(p4, p5, i2));\n }\n out.push(\n { t: \"line\", a: i1 ?? far(p4, p2), b: i2 ?? far(p2, p4), stroke: s.color, strokeWidth: s.width, dash: dashFor({ ...s, lineStyle: \"dotted\" }), inert: true },\n { t: \"polyline\", pts, fill: \"none\", stroke: s.color, strokeWidth: s.width, dash: dashFor(s), join: \"round\" },\n hnsPill(p1, p1.y < p0.y, \"Left Shoulder\", p),\n hnsPill(p3, p3.y < p2.y, \"Head\", p),\n hnsPill(p5, p5.y < p4.y, \"Right Shoulder\", p),\n );\n if (selected) out.push({ t: \"anchors\", pts });\n return out;\n}\n\n/** TV brush smoothing (line-tool-brush pane view, smooth = 5, also used by\n * the highlighter): resample each segment into up to 5 parts (step ≥ smooth\n * px), then a moving average over 2·smooth samples, then repeat the last\n * point. Screen space, recomputed on every render like TV. */\nexport function smoothBrush(pts: Pt[], smooth = 5): Pt[] {\n if (pts.length < 2) return pts;\n const t = Math.max(1, smooth);\n const r: Pt[] = [pts[0]];\n for (let e = 1; e < pts.length; e++) {\n const dx = pts[e].x - pts[e - 1].x;\n const dy = pts[e].y - pts[e - 1].y;\n const len = Math.hypot(dx, dy);\n const o = Math.min(5, Math.floor(len / t));\n for (let k = 0; k < o - 1; k++) r.push({ x: pts[e - 1].x + (dx / o) * k, y: pts[e - 1].y + (dy / o) * k });\n r.push(pts[e]);\n }\n const out: Pt[] = new Array(r.length);\n for (let i = 0; i < r.length; i++) {\n let sx = 0;\n let sy = 0;\n for (let k = 0; k < t; k++) {\n const a = r[Math.max(i - k, 0)];\n const b = r[Math.min(i + k, r.length - 1)];\n sx += a.x + b.x;\n sy += a.y + b.y;\n }\n out[i] = { x: (sx * 0.5) / t, y: (sy * 0.5) / t };\n }\n out.push(r[r.length - 1]);\n return out;\n}\n\n/** Labeled polyline / polygon through N vertices (polyline, path, brush,\n * highlighter, and the pattern / Elliott tools, which get their own scene\n * once they have enough points), with a per-kind label at each vertex.\n * Filled kinds close into a translucent polygon; the highlighter paints a\n * wide semi-transparent marker stroke. */\nexport function sceneLabeledPolyline(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n if (d.kind === \"triangle-pattern\" && pts.length >= 4) return sceneTrianglePattern(pts, selected, s);\n if (d.kind === \"head-and-shoulders\" && pts.length >= 7) return sceneHeadAndShoulders(pts, selected, s);\n if (d.kind === \"abcd-pattern\" && pts.length >= 2) return sceneAbcdPattern(d, pts, selected, s);\n if ((d.kind === \"xabcd-pattern\" || d.kind === \"cypher-pattern\") && pts.length >= 2) return sceneXabcdPattern(d, pts, selected, s);\n if (d.kind === \"three-drives-pattern\" && pts.length >= 2) return sceneThreeDrives(d, pts, selected, s);\n if (d.kind.startsWith(\"elliott-\")) return sceneElliott(d, pts, selected, s);\n const labels = KIND_LABELS[d.kind];\n // TV polyline: the closing side and the fill only once closed (`filled`).\n const isFilled = FILLED_KINDS.has(d.kind) && d.closed === true;\n const isHighlighter = d.kind === \"highlighter\";\n // Freehand strokes (brush/highlighter) are densely sampled, so they show only\n // endpoint handles when selected (not one per vertex) and always paint solid.\n const isFreehand = d.kind === \"brush\" || isHighlighter;\n const strokeW = isHighlighter ? Math.max(s.width, 12) : s.width;\n // TV smooths brush / highlighter strokes on every render (smooth = 5).\n const drawPts = isFreehand ? smoothBrush(pts) : pts;\n const dash = isFreehand ? undefined : dashFor(s);\n const handlePts = isFreehand && pts.length > 1 ? [pts[0], pts[pts.length - 1]] : pts;\n const out: Scene = [];\n if (isFilled) {\n const fill = s.backgroundColor ?? s.color;\n const fillOpacity = s.fillBackground !== undefined ? levelFillOpacity(s) : 0.08;\n out.push(\n { t: \"polygon\", pts: drawPts, fill, fillOpacity, stroke: \"transparent\", strokeWidth: HIT_TOLERANCE * 2 },\n { t: \"polygon\", pts: drawPts, fill, fillOpacity, stroke: s.color, strokeWidth: s.width, dash, join: \"round\" },\n );\n } else {\n // TV brush fillBackground: the stroke closed and filled.\n if (d.kind === \"brush\" && s.fillBackground === true) {\n out.push({ t: \"polygon\", pts: drawPts, fill: s.backgroundColor ?? s.color, fillOpacity: levelFillOpacity(s), stroke: \"none\", inert: true });\n }\n out.push(\n { t: \"polyline\", pts: drawPts, fill: \"none\", stroke: \"transparent\", strokeWidth: Math.max(HIT_TOLERANCE * 2, strokeW) },\n { t: \"polyline\", pts: drawPts, fill: \"none\", stroke: s.color, strokeWidth: strokeW, strokeOpacity: isHighlighter ? 0.2 : 1, dash, join: \"round\", cap: \"round\" },\n );\n // TV path (PolygonRenderer): leftEnd / rightEnd arrows (factory right = 1)\n // drawn with drawArrow in the same stroke — two strokes 5 · width back and\n // 5 · width aside from the tip; with round caps (solid) the tip moves out by\n // width / 2 along the last segment (`_correctArrowPoints`).\n const endArrow = (from: Pt, to: Pt): SceneItem => {\n const len = Math.hypot(to.x - from.x, to.y - from.y);\n const round = (s.lineStyle ?? \"solid\") === \"solid\";\n const tip = round && len >= 1 ? { x: from.x + ((to.x - from.x) * (len + s.width / 2)) / len, y: from.y + ((to.y - from.y) * (len + s.width / 2)) / len } : to;\n return { t: \"path\", d: rangeArrowPath(from, tip, s.width), fill: \"none\", stroke: s.color, strokeWidth: s.width, dash, join: \"round\", cap: \"round\", inert: true };\n };\n const endKind = d.kind === \"path\" || d.kind === \"brush\";\n if (endKind && drawPts.length > 1 && (s.leftEnd ?? 0) === 1) out.push(endArrow(drawPts[1], drawPts[0]));\n if (endKind && drawPts.length > 1 && (s.rightEnd ?? (d.kind === \"path\" ? 1 : 0)) === 1) {\n out.push(endArrow(drawPts[drawPts.length - 2], drawPts[drawPts.length - 1]));\n }\n }\n if (labels) {\n pts.forEach((pt, i) => {\n out.push({ t: \"text\", x: pt.x, y: pt.y + labelOffsetY(pts, i), text: labels[i] ?? String(i + 1), size: 11, fill: s.color, anchor: \"middle\" });\n });\n }\n if (selected) out.push({ t: \"anchors\", pts: handlePts });\n return out;\n}\n","/*\n * Markers and candle replicas as scenes (moved from OpenTrader\n * DrawingsOverlay, port phase 2): arrow marker, arrow mark up / down, flag\n * mark, price label, font icon, bars pattern, ghost feed.\n */\nimport { bboxCorners, HANDLE_RADIUS, HIT_TOLERANCE, strokeTolerance, timeToSec, type Pt } from \"../_shared\";\nimport type { Coords } from \"../coords\";\nimport type { Drawing, DrawingStyle } from \"../types\";\nimport { GHOST_CANDLE_DEFAULTS } from \"../specs\";\nimport { arrowMarkTextBox } from \"../kinds/arrow-mark\";\nimport { barsPatternGeometry } from \"../kinds/bars-pattern\";\nimport { priceLabelLayout, priceLabelPath } from \"../kinds/text-tools\";\nimport { applyOpacity, parseColor } from \"../color\";\nimport type { Scene, SceneItem } from \"./types\";\n\n/* ---------- arrow marker (2-point; LineToolArrowMarker) ----------\n * TV geometry (line-tool-arrow-marker chunk): a filled arrow whose OUTLINE\n * tapers from a point at the tail (p0) to a swept head at p1. The head length\n * scales with the segment: 18px under a 92px threshold, else clamp(0.25·len,\n * 18…106, ≤0.9·len); the outline stroke scales clamp(round(0.02·len), 2…5).\n * Segments shorter than 22px draw at the 22px minimum (tail pushed back), and\n * a degenerate zero-length marker draws as a 9px dot. Optional style text\n * anchors at the tail, placed opposite the arrow direction. */\nfunction arrowMarkerHeadLen(len: number): number {\n if (len < 92) return 18;\n return Math.min(Math.max(len * 0.25, 18), 106, len * 0.9);\n}\n\nexport function sceneArrowMarker(pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const [a0, b] = pts;\n const rawLen = Math.hypot(b.x - a0.x, b.y - a0.y);\n const fs = s.fontSize ?? 16;\n const textItems = (x: number, y: number, anchor: \"start\" | \"middle\" | \"end\"): SceneItem[] =>\n s.text\n ? [{\n t: \"text\", x, y, text: s.text, anchor, size: fs, weight: s.bold !== false ? 700 : 400,\n fontStyle: s.italic ? \"italic\" : \"normal\", fill: s.textColor ?? s.color, inert: true,\n }]\n : [];\n // Degenerate marker (both clicks on the same spot): TV draws a 9px circle.\n if (rawLen < 1) {\n const out: Scene = [{ t: \"circle\", cx: b.x, cy: b.y, r: 9, fill: s.color }, ...textItems(b.x + 12, b.y + fs * 0.35, \"start\")];\n if (selected) out.push({ t: \"anchors\", pts: [b] });\n return out;\n }\n // Enforce TV's 22px minimum drawable length (tail pushed back behind p1).\n let a = a0;\n if (rawLen < 22) {\n const u = { x: (b.x - a0.x) / rawLen, y: (b.y - a0.y) / rawLen };\n a = { x: b.x - u.x * 22, y: b.y - u.y * 22 };\n }\n const dxv = b.x - a.x;\n const dyv = b.y - a.y;\n const len = Math.hypot(dxv, dyv);\n const ux = dxv / len;\n const uy = dyv / len;\n const px = -uy;\n const py = ux;\n const head = arrowMarkerHeadLen(len);\n const backStep = len >= 35 ? 0.1 : 0;\n // Half-profile (x along the shaft, y across): tail point → shaft flare →\n // head base → tip; mirrored across the axis for the full outline.\n const profile: Pt[] = [\n { x: 0, y: 0 },\n { x: len - head + head * backStep, y: (1.22 * head) / 4 },\n { x: len - head, y: (1.22 * head) / 2 },\n { x: len, y: 0 },\n ];\n const at = (o: Pt, side: 1 | -1): Pt => ({ x: a.x + ux * o.x + px * o.y * side, y: a.y + uy * o.x + py * o.y * side });\n const outline = [\n ...profile.map((o) => at(o, 1)),\n ...profile.slice(0, profile.length - 1).reverse().map((o) => at(o, -1)),\n ];\n const strokeW = Math.min(5, Math.max(2, Math.round(0.02 * len)));\n // Text placement: opposite the arrow's direction, off the tail (TV).\n const dirAng = Math.atan2(dxv, dyv); // TV convention: atan2(dx, dy)\n let tx = a0.x;\n let ty = a0.y;\n let anchor: \"start\" | \"middle\" | \"end\" = \"middle\";\n if (dirAng > -Math.PI / 4 && dirAng < Math.PI / 4) {\n ty -= 8; // arrow points down → text above the tail\n } else if (dirAng > (3 * Math.PI) / 4 || dirAng < (-3 * Math.PI) / 4) {\n ty += 8 + fs; // arrow points up → text below the tail\n } else if (dirAng < 0) {\n tx += 10; anchor = \"start\"; ty += fs * 0.35; // points left → text right\n } else {\n tx -= 10; anchor = \"end\"; ty += fs * 0.35; // points right → text left\n }\n const out: Scene = [\n { t: \"hit\", a, b, width: Math.max(12, (1.22 * head) / 2) },\n { t: \"polygon\", pts: outline, fill: s.color, stroke: s.color, strokeWidth: strokeW, join: \"round\", cap: \"round\" },\n ...textItems(tx, ty, anchor),\n ];\n if (selected) out.push({ t: \"anchors\", pts });\n return out;\n}\n\n/** TV arrow mark (line-tool-arrow-mark, module 501042): block arrow with its\n * tip on the point — head 12px long × 19.5px wide, stem 10px long × 10px\n * wide, filled in the arrow colour. Optional text (TV `text`, font 14,\n * colour = the text colour): centred, its box (padding fs/3) 20px below the\n * point for an up arrow, 20px above it for a down arrow. */\nfunction arrowMarkPath(c: Pt, dir: \"up\" | \"down\"): string {\n const k = dir === \"up\" ? 1 : -1;\n const head = k * 12;\n const stem = k * 10;\n const hw = 19.5 / 2;\n const sw = 5;\n return `M ${c.x} ${c.y} L ${c.x + hw} ${c.y + head} L ${c.x + sw} ${c.y + head} L ${c.x + sw} ${c.y + head + stem} L ${c.x - sw} ${c.y + head + stem} L ${c.x - sw} ${c.y + head} L ${c.x - hw} ${c.y + head} Z`;\n}\n\nexport function sceneArrowMark(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle, dir: \"up\" | \"down\"): Scene {\n const c = pts[0];\n const box = arrowMarkTextBox(d, c);\n const fs = s.fontSize ?? 14;\n const out: Scene = [{ t: \"path\", d: arrowMarkPath(c, dir), fill: s.color }];\n if (box) {\n // TV hit-tests the text box too: transparent pointer target\n out.push({ t: \"rect\", x: box.left, y: box.top, w: box.width, h: box.height, fill: \"transparent\" });\n box.lines.forEach((ln, i) => {\n out.push({\n t: \"text\", x: c.x, y: box.top + box.pad + i * box.lineH, text: ln, anchor: \"middle\", baseline: \"hanging\", size: fs,\n weight: s.bold ? 700 : 400, fontStyle: s.italic ? \"italic\" : \"normal\", fill: s.textColor ?? s.color, inert: true, pre: true,\n });\n });\n }\n if (selected) out.push({ t: \"anchors\", pts: [c] });\n return out;\n}\n\n/* ---------- flag marker (1-point pennant on a pole; LineToolFlagMark) ----------\n * Geometry traced from the captured tool icon (tradingview-agent\n * tool-icons/flag-mark.svg): a swallowtail banner that flies up-and-right from\n * a vertical pole rooted at the anchor point. */\nconst FLAG_POLE_H = 22;\nconst FLAG_W = 17;\nconst FLAG_H = 12;\nconst FLAG_NOTCH = 5; // depth of the right-edge V-notch (swallowtail)\n\nexport function sceneFlagMark(pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const c = pts[0];\n const topY = c.y - FLAG_POLE_H;\n const fx = c.x;\n // Banner: top-left → top-right → notch-in → bottom-right → bottom-left.\n const banner: Pt[] = [\n { x: fx, y: topY },\n { x: fx + FLAG_W, y: topY },\n { x: fx + FLAG_W - FLAG_NOTCH, y: topY + FLAG_H / 2 },\n { x: fx + FLAG_W, y: topY + FLAG_H },\n { x: fx, y: topY + FLAG_H },\n ];\n const out: Scene = [\n // fat transparent hit target over pole + banner\n { t: \"rect\", x: fx - HIT_TOLERANCE, y: topY - HIT_TOLERANCE, w: FLAG_W + HIT_TOLERANCE * 2, h: FLAG_POLE_H + HIT_TOLERANCE * 2, fill: \"transparent\" },\n { t: \"line\", a: { x: fx, y: topY }, b: { x: fx, y: c.y }, stroke: s.color, strokeWidth: Math.max(2, s.width + 1), cap: \"round\" },\n { t: \"polygon\", pts: banner, fill: s.color, stroke: s.color, strokeWidth: 1, join: \"round\" },\n ];\n if (selected) out.push({ t: \"anchors\", pts: [c] });\n return out;\n}\n\n/** TV price label (line-tool-price-label): the price in a box whose bottom\n * left is 9px right of and 15px above the point, a tail to the point, bold\n * text 10px in (factory white 14px on tv-blue-500), border 2px, a 2.5px dot\n * at the point ringed in the chart background. */\nexport function scenePriceLabel(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle, coords: Coords | null): Scene {\n const c = pts[0];\n const pip = coords?.pipSize() ?? 0.01;\n const digits = Math.max(0, Math.min(8, Math.round(-Math.log10(pip))));\n const label = d.points[0].price.toFixed(digits);\n const fs = s.fontSize ?? 14;\n const b = priceLabelLayout(label, c, fs);\n const t = 100 - (s.transparency ?? 0);\n const border = s.borderColor ?? s.color;\n const out: Scene = [\n { t: \"path\", d: priceLabelPath(b), fill: applyOpacity(parseColor(s.backgroundColor ?? s.color).hex, t), stroke: border, strokeWidth: 2, join: \"round\" },\n { t: \"text\", x: b.x + 10, y: b.y + b.h / 2 + Math.floor(0.35 * fs), text: label, size: fs, weight: \"bold\", fill: s.textColor ?? \"#ffffff\", pre: true },\n { t: \"circle\", cx: c.x, cy: c.y, r: 2.5, fill: applyOpacity(parseColor(border).hex, t), stroke: \"#0f0f0f\", strokeWidth: 1 },\n ];\n if (selected) out.push({ t: \"anchors\", pts: [c] });\n return out;\n}\n\n/** Side of the font-icon glyph box (centered on the placement point). */\nconst FONT_ICON_SIZE = 28;\n\n/** Font-icon glyph (emoji char OR raw `<svg>` markup) centered on the point;\n * selected: a dashed box around it (no anchor handle). */\nexport function sceneFontIcon(d: Drawing, pts: Pt[], selected: boolean): Scene {\n const [c] = pts;\n // TV's factory glyph size is 72; drawings saved before the size existed\n // keep the old 28px box.\n const size = d.style.fontSize ?? FONT_ICON_SIZE;\n const half = size / 2;\n const items: SceneItem[] = [];\n if (selected) {\n items.push({ t: \"rect\", x: c.x - half - 2, y: c.y - half - 2, w: size + 4, h: size + 4, fill: \"none\", stroke: \"#2962ff\", strokeWidth: 1, dash: \"3 3\", rx: 3 });\n }\n items.push({ t: \"glyph\", x: c.x - half, y: c.y - half, size, glyph: d.glyph ?? \"\", color: d.style.color });\n return [{ t: \"group\", items }];\n}\n\n/* ---------- candle replicas (bars-pattern / ghost-feed) ----------\n * Both draw OHLC candles between the two anchor points. bar-pattern renders\n * the FROZEN snapshot captured at placement (`d.pattern`, TV model) anchored\n * at p0 with a price offset — real scale, never renormalised — with display\n * modes (bars/line) and mirror/flip transforms from the style; only legacy\n * saves without a snapshot fall back to live-resampling into the box.\n * ghost-feed synthesises deterministic candles from its frozen seed +\n * amplitude (`d.ghost`), jittered by the style's variance. */\nconst CANDLE_UP = \"#089981\";\nconst CANDLE_DOWN = \"#f23645\";\n\ntype Candle = { x: number; openY: number; highY: number; lowY: number; closeY: number; up: boolean };\n\n/** OHLC candles given per-bar screen coords. */\nfunction candleItems(bars: Candle[], bodyW: number): SceneItem[] {\n const out: SceneItem[] = [];\n for (const bar of bars) {\n const color = bar.up ? CANDLE_UP : CANDLE_DOWN;\n const top = Math.min(bar.openY, bar.closeY);\n const bh = Math.max(1, Math.abs(bar.closeY - bar.openY));\n out.push(\n { t: \"line\", a: { x: bar.x, y: bar.highY }, b: { x: bar.x, y: bar.lowY }, stroke: color, strokeWidth: 1 },\n { t: \"rect\", x: bar.x - bodyW / 2, y: top, w: bodyW, h: bh, fill: color },\n );\n }\n return out;\n}\n\n/** Bars pattern (TV line-tool-bars-pattern, module 432434). Geometry in\n * kinds/bars-pattern.ts (shared with the hit test). HL / OC bars: 2px bars\n * (x ± 1) filled and bordered in the tool colour at transparency 10; line\n * modes: a 2px line at transparency 10. Without a snapshot TV draws two\n * vertical lines and the P0-P1 median in cold gray. */\nexport function sceneBarsPattern(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle, coords: Coords | null): Scene {\n if (d.kind !== \"bar-pattern\") return [];\n const [pa, pb] = pts;\n const g = barsPatternGeometry(d, pts, coords);\n const anchors: Scene = selected ? [{ t: \"anchors\", pts }] : [];\n if (!g) {\n const gray = { stroke: \"#808080\", strokeWidth: 1, inert: true };\n return [\n { t: \"line\", a: { x: pa.x, y: 0 }, b: { x: pa.x, y: 99999 }, ...gray },\n { t: \"line\", a: { x: pb.x, y: 0 }, b: { x: pb.x, y: 99999 }, ...gray },\n { t: \"line\", a: pa, b: pb, ...gray },\n ...anchors,\n ];\n }\n const color = s.color;\n const tol = strokeTolerance(s);\n // pointer targets = the drawn bars / line widened by the hit tolerance\n // (the same region as barsPatternHit)\n if (g.lineMode) {\n return [\n { t: \"polyline\", pts: g.line, fill: \"none\", stroke: \"transparent\", strokeWidth: tol * 2 },\n { t: \"polyline\", pts: g.line, fill: \"none\", stroke: color, strokeOpacity: 0.9, strokeWidth: 2, inert: true },\n ...anchors,\n ];\n }\n return [\n ...g.bars.map((b): SceneItem => ({ t: \"rect\", x: b.x - 1 - tol, y: b.top - tol, w: 2 + 2 * tol, h: b.bottom - b.top + 2 * tol, fill: \"transparent\" })),\n {\n t: \"group\",\n inert: true,\n items: g.bars.map((b): SceneItem => ({\n t: \"rect\", x: b.x - 1, y: b.top, w: 2, h: Math.max(1, b.bottom - b.top), fill: color, fillOpacity: 0.9, stroke: color, strokeWidth: 1,\n })),\n },\n ...anchors,\n ];\n}\n\n/** Deterministic [0,1) PRNG (mulberry32) so synthetic candles are stable across\n * re-renders/pan/zoom — seeded from the box geometry, not a live clock. */\nfunction seededRng(seed: number) {\n let t = seed >>> 0;\n return () => {\n t += 0x6d2b79f5;\n let r = Math.imul(t ^ (t >>> 15), 1 | t);\n r ^= r + Math.imul(r ^ (r >>> 7), 61 | r);\n return ((r ^ (r >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nconst GHOST_BARS = 14;\n\nexport function sceneGhostFeed(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle, coords: Coords | null): Scene {\n if (d.kind !== \"ghost-feed\") return [];\n // TV model (variable-length): every vertex pair is one drift segment; one\n // candle per bar index along each leg — legs after the first skip their\n // start vertex bar (GhostBarsSegment.generate: `_segmentIndex ? t.index + 1\n // : t.index`) and the end vertex bar is always excluded, so a shared vertex\n // never gets two candles. Amplitude frozen at placement (ATR-like), seed\n // persisted so the simulation is stable across moves/reloads and resizes\n // with a drag.\n // TV line-tool-ghost-feed (module 868823). Segment n spans the bar indices\n // [min, min + size) with size = |Δindex| (first segment) or |Δindex| − 1;\n // its drift runs in screen space from the left point's price (e = 0) to\n // the right point's price (e = size − 1). Each bar (TV `_createBar`,\n // averageHL = the frozen amplitude): centre offset amp·(1 − 2r)·v, range\n // amp·(1 + (0.5 − r)·v), open / close random inside the range. Candles:\n // body up #ACE5DC / down #FAA1A4, border up #089981 / down #F23645, wick\n // #808080, the whole candle layer at alpha 1 − transparency / 100 (50);\n // body half-width floor(0.3 · bar spacing) (TV optimalBarWidth). The\n // drift lines are cold gray #808080 1px.\n if (d.ghost && coords && d.points.length >= 2) {\n const amp = d.ghost.amplitude;\n const vt = Math.max(0, Math.min(1, (s.variance ?? 50) / 100));\n const candles: Candle[] = [];\n let spacing = 8;\n let anyLeg = false;\n for (let k = 0; k < d.points.length - 1; k++) {\n const idxA = coords.timeToBarIndex(d.points[k].time);\n const idxB = coords.timeToBarIndex(d.points[k + 1].time);\n if (idxA == null || idxB == null || idxA === idxB) continue;\n anyLeg = true;\n const leftFirst = pts[k].x <= pts[k + 1].x;\n const yL = coords.priceToY(leftFirst ? d.points[k].price : d.points[k + 1].price);\n const yR = coords.priceToY(leftFirst ? d.points[k + 1].price : d.points[k].price);\n if (yL == null || yR == null) continue;\n const lo = Math.min(idxA, idxB);\n const size = Math.abs(idxB - idxA) - (k === 0 ? 0 : 1);\n const stepY = size > 1 ? (yR - yL) / (size - 1) : 0;\n for (let e = 0; e < size; e++) {\n const t = coords.barIndexToTime(lo + e);\n const x = t == null ? null : coords.timeToX(t);\n if (x == null) continue;\n if (e > 0) {\n const tp = coords.barIndexToTime(lo + e - 1);\n const xp = tp == null ? null : coords.timeToX(tp);\n if (xp != null) spacing = Math.abs(x - xp) || spacing;\n }\n const level = coords.yToPrice(yL + e * stepY);\n if (level == null) continue;\n // One seed per drawing; the per-bar stream mixes the leg and the bar\n // offset inside the leg.\n const r = seededRng((d.ghost.seed ^ Math.imul(k, 0x9e3779b9) ^ Math.imul(e, 2654435761)) >>> 0);\n const centerOff = amp * (1 - 2 * r()) * vt;\n const range = Math.max(1e-9, amp * (1 + (0.5 - r()) * vt));\n const low = centerOff - range / 2;\n const o = low + r() * range;\n const c2 = low + r() * range;\n const oy = coords.priceToY(level + o);\n const hy = coords.priceToY(level + low + range);\n const ly = coords.priceToY(level + low);\n const cy = coords.priceToY(level + c2);\n if (oy == null || hy == null || ly == null || cy == null) continue;\n candles.push({ x, openY: oy, highY: hy, lowY: ly, closeY: cy, up: c2 >= o });\n }\n }\n if (anyLeg) {\n const half = Math.floor(0.3 * spacing);\n const cs = s.ghostCandle ?? GHOST_CANDLE_DEFAULTS;\n const yA = coords.priceToY(d.points[0].price);\n const yB = coords.priceToY(d.points[0].price + amp);\n const bandPx = yA != null && yB != null ? Math.abs(yB - yA) : 10;\n const items: SceneItem[] = [];\n for (const bar of candles) {\n if (cs.drawWick) {\n items.push({ t: \"line\", a: { x: bar.x, y: bar.highY }, b: { x: bar.x, y: bar.lowY }, stroke: cs.wickColor, strokeWidth: 1 });\n }\n items.push({\n t: \"rect\", x: Math.round(bar.x) - half - 0.5, y: Math.min(bar.openY, bar.closeY), w: 2 * half + 1, h: Math.max(1, Math.abs(bar.closeY - bar.openY)),\n fill: bar.up ? cs.upColor : cs.downColor, stroke: cs.drawBorder ? (bar.up ? cs.borderUpColor : cs.borderDownColor) : \"none\", strokeWidth: 1,\n });\n }\n const out: Scene = [\n { t: \"polyline\", pts, fill: \"none\", stroke: \"transparent\", strokeWidth: Math.max(12, bandPx * 2) },\n { t: \"polyline\", pts, fill: \"none\", stroke: \"#808080\", strokeWidth: 1, inert: true },\n { t: \"group\", inert: true, opacity: 1 - (s.transparency ?? 50) / 100, items },\n ];\n if (selected) out.push({ t: \"anchors\", pts });\n return out;\n }\n }\n const [pa, pb] = pts;\n const left = Math.min(pa.x, pb.x);\n const right = Math.max(pa.x, pb.x);\n const top = Math.min(pa.y, pb.y);\n const bottom = Math.max(pa.y, pb.y);\n const boxW = right - left;\n const boxH = bottom - top;\n // Seed from the box's data coords so the walk is reproducible for this drawing.\n const seed = Math.round((d.points[0].price + d.points[1].price) * 1000) ^ ((timeToSec(d.points[0].time) ?? 0) | 0);\n const rng = seededRng(seed);\n const slot = boxW / GHOST_BARS;\n const bodyW = Math.max(1, slot * 0.6);\n const wick = boxH * 0.06;\n const amp = boxH * 0.12;\n let level = top + boxH / 2;\n const candles: Candle[] = [];\n for (let i = 0; i < GHOST_BARS; i++) {\n const openY = level;\n const drift = (rng() - 0.5) * 2 * amp;\n let closeY = openY + drift;\n closeY = Math.max(top + wick, Math.min(bottom - wick, closeY));\n const highY = Math.min(openY, closeY) - rng() * wick;\n const lowY = Math.max(openY, closeY) + rng() * wick;\n candles.push({ x: left + slot * (i + 0.5), openY, highY, lowY, closeY, up: closeY <= openY });\n level = closeY;\n }\n const out: Scene = [\n { t: \"rect\", x: left, y: top, w: boxW, h: boxH, fill: s.color, fillOpacity: 0.04, stroke: s.color, strokeWidth: s.width, dash: \"4 3\" },\n // dotted guide line through the walk's midline (matches the icon)\n { t: \"line\", a: { x: left, y: top + boxH / 2 }, b: { x: right, y: top + boxH / 2 }, stroke: s.color, strokeWidth: 1, strokeOpacity: 0.4, dash: \"2 3\", inert: true },\n { t: \"group\", inert: true, items: candleItems(candles, bodyW) },\n ];\n if (selected) {\n for (const c of bboxCorners(pa, pb)) {\n out.push({ t: \"circle\", cx: c.x, cy: c.y, r: HANDLE_RADIUS, fill: \"#fff\", stroke: s.color, strokeWidth: 1.5, cursor: \"nwse-resize\" });\n }\n }\n return out;\n}\n","/*\n * Range tools as scenes (moved from OpenTrader DrawingsOverlay, port phase\n * 2): price range, date range, date and price range.\n *\n * TV line-tool-price-range / line-tool-date-range pane views (read live from\n * TV 3.4.1 on 24/09/2026). Shared label box (RangeToolsConstants): font 12,\n * text #ffffff on #2E2E2E, corner radius 4, padding horz = fs·0.4 + fs/3 /\n * vert = fs·0.2 + fs/3, line spacing 8, shadow rgba(0,0,0,0.4) blur 4 offset\n * 1; centre placed by calculateLabelPosition (10px past the moving end,\n * flipped / clamped to stay inside the pane). Arrow on the distance line (TV\n * getArrowPoints): open V, 5·lineWidth back and to each side, only when the\n * line is ≥ 15·lineWidth.\n */\nimport { timeToSec, type Pt } from \"../_shared\";\nimport type { Coords } from \"../coords\";\nimport type { Drawing, DrawingStyle } from \"../types\";\nimport { barsBetween } from \"../kinds/data-series\";\nimport type { Scene, SceneItem, Shadow } from \"./types\";\nimport { labelBoxPolygon, measureText, signedFixed, textCrossesLine, tvTimeSpan, tvVolume } from \"./text\";\nimport { rangeArrowPath } from \"./lines\";\n\nconst RANGE_LABEL_BG = \"#2e2e2e\";\nconst RANGE_LABEL_SHADOW: Shadow = { dx: 0, dy: 1, blur: 4, color: \"rgba(0,0,0,0.4)\" };\n\n/** TV calculateLabelPosition: label centre y for a box of `lh` height. */\nfunction rangeLabelY(a: Pt, b: Pt, lh: number, paneH: number): number {\n const r = lh / 2;\n const off = 10 + r;\n const lo = Math.min(a.y, b.y);\n const hi = Math.max(a.y, b.y);\n let y: number;\n if (a.y > b.y) {\n y = lo - off;\n const over = r - y;\n if (over > 0) {\n const alt = hi + off;\n if (alt + r <= paneH) y = alt;\n else y += over;\n }\n } else {\n y = hi + off;\n const over = y + r - paneH;\n if (over > 0) {\n const alt = lo - off;\n if (alt - r >= 0) y = alt;\n else y -= over;\n }\n }\n return y;\n}\n\n/** TV range label text (line-range-tools): the price part (change, \" (x%)\",\n * pips, each by its Stats flag) on the first line, then \"N bars, span\" and\n * \"Vol x\"; factory all on. */\nexport function rangeLabelLines(d: Drawing, s: DrawingStyle, coords: Coords | null, withPrice: boolean, withDate: boolean): string[] {\n const on = (v: boolean | undefined) => v !== false;\n const out: string[] = [];\n const [q0, q1] = d.points;\n if (!q0 || !q1) return out;\n if (withPrice) {\n const p0 = q0.price;\n const p1 = q1.price;\n const change = p1 - p0;\n const pip = coords?.pipSize() ?? 0.01;\n const digits = Math.max(0, Math.min(8, Math.round(-Math.log10(pip))));\n const v = on(s.showPriceRange), pc = on(s.showPercentPriceRange), pp = on(s.showPipsPriceRange);\n let c = \"\";\n if (v) c += signedFixed(change, digits);\n if (pc) {\n const pct = p0 !== 0 ? (100 * change) / Math.abs(p0) : 0;\n if (v) c += \" (\";\n c += `${signedFixed(Math.round(pct * 100) / 100, 2)}%`;\n if (v) c += \")\";\n }\n if (pp) {\n if (v) c += pc ? \" \" : \", \";\n else if (pc) c += \", \";\n c += signedFixed(Math.round(change / pip), 0);\n }\n if (c) out.push(c);\n }\n if (withDate) {\n const g = on(s.showBarsRange), f = on(s.showDateTimeRange), x = on(s.showVolume);\n let k = \"\";\n const t0 = timeToSec(q0.time);\n const t1 = timeToSec(q1.time);\n const i0 = coords?.timeToBarIndex(q0.time) ?? null;\n const i1 = coords?.timeToBarIndex(q1.time) ?? null;\n if (g && i0 != null && i1 != null) k += `${i1 - i0} bars`;\n if (f && t0 != null && t1 != null) {\n if (g) k += \", \";\n k += tvTimeSpan(t1 - t0);\n }\n if (k) out.push(k);\n if (x && coords && t0 != null && t1 != null) {\n const rows = barsBetween(coords.bars(), Math.min(t0, t1), Math.max(t0, t1));\n let vol = 0;\n let any = false;\n for (const r of rows) {\n if (r.volume != null) {\n vol += r.volume;\n any = true;\n }\n }\n if (any) out.push(`Vol ${tvVolume(vol)}`);\n }\n }\n return out;\n}\n\n/** The range label box (TV fillLabelBackground: the box + shadow; off = the\n * text only). */\nfunction rangeLabelItems(cx: number, a: Pt, b: Pt, paneH: number, lines: string[], s: DrawingStyle): SceneItem[] {\n if (!lines.length) return [];\n const fs = s.fontSize ?? 12;\n const padH = fs * 0.4 + fs / 3;\n const padV = fs * 0.2 + fs / 3;\n const boxW = Math.max(...lines.map((l) => measureText(l, fs))) + padH * 2;\n const boxH = fs * lines.length + 8 * (lines.length - 1) + padV * 2;\n const cy = rangeLabelY(a, b, boxH, paneH);\n const items: SceneItem[] = [];\n if (s.fillLabelBackground !== false) {\n items.push({ t: \"rect\", x: cx - boxW / 2, y: cy - boxH / 2, w: boxW, h: boxH, rx: 4, fill: s.labelBackgroundColor ?? RANGE_LABEL_BG, shadow: RANGE_LABEL_SHADOW });\n }\n lines.forEach((line, i) => {\n items.push({ t: \"text\", x: cx, y: cy - boxH / 2 + padV + i * (fs + 8) + fs / 2, text: line, size: fs, fill: s.textColor ?? \"#ffffff\", anchor: \"middle\", baseline: \"central\" });\n });\n return [{ t: \"group\", inert: true, items }];\n}\n\n/** Range tools custom text (TV DateAndPriceRangeBasePaneView\n * `_updateCustomTextRenderer`): centred on the box centre (x = middle of\n * P0 / P1, y = round((P0.y + P1.y) / 2)), default box padding fs/3, own\n * colour / size / bold / italic (factory #2962FF, 12px). */\nfunction rangeCustomTextGeom(a: Pt, b: Pt, s: DrawingStyle) {\n const text = s.text ?? \"\";\n if (text === \"\") return null;\n const fs = s.customTextSize ?? 12;\n const lines = text.split(\"\\n\");\n const lineH = Math.ceil(fs);\n const cy = Math.round((a.y + b.y) / 2);\n return { x: (a.x + b.x) / 2, cy, top: cy - (lines.length * lineH) / 2, lines, lineH, fs };\n}\n\n/** Range tools cut (TV `_updateCustomTextRenderer`): the distance lines and\n * their arrows lose the custom text box (padding fs/3) when the text\n * crosses them. Returns the clip item (if any) and its name. */\nfunction rangeTextCut(a: Pt, b: Pt, s: DrawingStyle): { items: SceneItem[]; clip: string | undefined } {\n const g = rangeCustomTextGeom(a, b, s);\n if (!g || !textCrossesLine(g.lines)) return { items: [], clip: undefined };\n const pad = g.fs / 3;\n const poly = labelBoxPolygon({ x: g.x, y: g.cy }, 0, g.lines, g.fs, g.lineH, pad, pad, \"middle\", \"center\", !!s.customTextBold, !!s.customTextItalic);\n return poly.length ? { items: [{ t: \"clip\", name: \"text\", polys: [poly] }], clip: \"text\" } : { items: [], clip: undefined };\n}\n\nfunction rangeCustomTextItems(a: Pt, b: Pt, s: DrawingStyle): SceneItem[] {\n const g = rangeCustomTextGeom(a, b, s);\n if (!g) return [];\n return g.lines.map((ln, k): SceneItem => ({\n t: \"text\", x: g.x, y: g.top + k * g.lineH, text: ln, anchor: \"middle\", baseline: \"hanging\", size: g.fs,\n weight: s.customTextBold ? 700 : 400, fontStyle: s.customTextItalic ? \"italic\" : \"normal\", fill: s.customTextColor ?? \"#2962ff\", inert: true, pre: true,\n }));\n}\n\nfunction rangeFillOpacity(s: DrawingStyle): number {\n if (s.fillBackground === false) return 0;\n return Math.max(0, Math.min(1, (100 - (s.transparency ?? 85)) / 100));\n}\n\n/** The range box fill (transparent when off: still a pointer target). */\nfunction rangeBox(x: number, y: number, w: number, h: number, s: DrawingStyle): SceneItem {\n const fillO = rangeFillOpacity(s);\n return { t: \"rect\", x, y, w, h, fill: fillO > 0 ? (s.backgroundColor ?? s.color) : \"transparent\", fillOpacity: fillO > 0 ? fillO : 1 };\n}\n\nconst edge = (a: Pt, b: Pt, s: DrawingStyle): SceneItem => ({ t: \"line\", a, b, stroke: s.color, strokeWidth: s.width, cap: \"round\" });\nconst arrow = (from: Pt, tip: Pt, s: DrawingStyle): SceneItem => ({\n t: \"path\", d: rangeArrowPath(from, tip, s.width), fill: \"none\", stroke: s.color, strokeWidth: s.width, cap: \"round\", join: \"round\",\n});\n\n/** Box, distance lines (+ arrows) cut behind the custom text, label, custom\n * text, anchors. */\nfunction rangeScene(box: SceneItem[], distance: SceneItem[], a: Pt, b: Pt, pts: Pt[], selected: boolean, h: number, s: DrawingStyle, lines: string[]): Scene {\n const cut = rangeTextCut(a, b, s);\n const out: Scene = [\n ...cut.items,\n ...box,\n { t: \"group\", clip: cut.clip, items: distance },\n ...rangeLabelItems((a.x + b.x) / 2, a, b, h, lines, s),\n ...rangeCustomTextItems(pts[0], pts[1], s),\n ];\n if (selected) out.push({ t: \"anchors\", pts });\n return out;\n}\n\nexport function scenePriceRange(d: Drawing, pts: Pt[], selected: boolean, w: number, h: number, s: DrawingStyle, coords: Coords | null): Scene {\n if (d.kind !== \"price-range\") return [];\n const [a, b] = pts;\n const left = s.extendLeft ? 0 : Math.min(a.x, b.x);\n const right = s.extendRight ? w : Math.max(a.x, b.x);\n const midX = Math.round((a.x + b.x) / 2);\n // Label: price change (price precision), percent (2 decimals), pips.\n const lines = rangeLabelLines(d, s, coords, true, false);\n const distance: SceneItem[] = [edge({ x: midX, y: a.y }, { x: midX, y: b.y }, s)];\n if (Math.abs(b.y - a.y) >= 15 * s.width) distance.push(arrow({ x: midX, y: a.y }, { x: midX, y: b.y }, s));\n const box = [\n rangeBox(left, Math.min(a.y, b.y), Math.max(1, right - left), Math.abs(b.y - a.y), s),\n edge({ x: left, y: a.y }, { x: right, y: a.y }, s),\n edge({ x: left, y: b.y }, { x: right, y: b.y }, s),\n ];\n return rangeScene(box, distance, a, b, pts, selected, h, s, lines);\n}\n\nexport function sceneDateRange(d: Drawing, pts: Pt[], selected: boolean, h: number, s: DrawingStyle, coords: Coords | null): Scene {\n if (d.kind !== \"date-range\") return [];\n const [a, b] = pts;\n // TV extendTop / extendBottom: the box and both borders to the pane edge.\n const top = s.extendTop ? 0 : Math.min(a.y, b.y);\n const bottom = s.extendBottom ? h : Math.max(a.y, b.y);\n const midY = Math.round((a.y + b.y) / 2);\n // Label: \"{n} bars, {span}\" then \"Vol {volume}\" (TV showBarsRange /\n // showDateTimeRange / showVolume, all on by default).\n const lines = rangeLabelLines(d, s, coords, false, true);\n const distance: SceneItem[] = [edge({ x: a.x, y: midY }, { x: b.x, y: midY }, s)];\n if (Math.abs(b.x - a.x) >= 15 * s.width) distance.push(arrow({ x: a.x, y: midY }, { x: b.x, y: midY }, s));\n const box = [\n rangeBox(Math.min(a.x, b.x), top, Math.max(1, Math.abs(b.x - a.x)), Math.max(1, bottom - top), s),\n edge({ x: a.x, y: top }, { x: a.x, y: bottom }, s),\n edge({ x: b.x, y: top }, { x: b.x, y: bottom }, s),\n ];\n return rangeScene(box, distance, a, b, pts, selected, h, s, lines);\n}\n\nexport function sceneDateAndPriceRange(d: Drawing, pts: Pt[], selected: boolean, h: number, s: DrawingStyle, coords: Coords | null): Scene {\n if (d.kind !== \"date-and-price-range\") return [];\n // TV line-tool-date-and-price-range pane view: filled P0-P1 box (border\n // only with drawBorder, off by default), a horizontal and a vertical\n // distance line through the middle, each with an arrow at the P1 end when\n // ≥ 25·lineWidth long, and the range label (price line, then \"bars, span\",\n // then \"Vol\") placed like the other range tools.\n const [a, b] = pts;\n const midY = Math.round((a.y + b.y) / 2);\n const midX = Math.round((a.x + b.x) / 2);\n const lines = rangeLabelLines(d, s, coords, true, true);\n // TV drawBorder: the box border (borderColor, borderWidth); the distance\n // lines then start borderWidth / 2 inside it.\n const bw = s.drawBorder ? s.borderWidth ?? 1 : 0;\n const o = bw / 2;\n const hx0 = a.x + Math.sign(b.x - a.x) * o, hx1 = b.x + Math.sign(a.x - b.x) * o;\n const vy0 = a.y + Math.sign(b.y - a.y) * o, vy1 = b.y + Math.sign(a.y - b.y) * o;\n const box: SceneItem[] = [rangeBox(Math.min(a.x, b.x), Math.min(a.y, b.y), Math.max(1, Math.abs(b.x - a.x)), Math.max(1, Math.abs(b.y - a.y)), s)];\n if (bw > 0) {\n box.push({ t: \"rect\", x: Math.min(a.x, b.x), y: Math.min(a.y, b.y), w: Math.abs(b.x - a.x), h: Math.abs(b.y - a.y), fill: \"none\", stroke: s.borderColor ?? s.color, strokeWidth: bw });\n }\n const distance: SceneItem[] = [\n edge({ x: hx0, y: midY }, { x: hx1, y: midY }, s),\n edge({ x: midX, y: vy0 }, { x: midX, y: vy1 }, s),\n ];\n if (Math.abs(b.x - a.x) >= 25 * s.width) distance.push(arrow({ x: hx0, y: midY }, { x: hx1, y: midY }, s));\n if (Math.abs(b.y - a.y) >= 25 * s.width) distance.push(arrow({ x: midX, y: vy0 }, { x: midX, y: vy1 }, s));\n return rangeScene(box, distance, a, b, pts, selected, h, s, lines);\n}\n","/*\n * Data-driven tools as scenes (moved from OpenTrader DrawingsOverlay, port\n * phase 2): regression trend, anchored VWAP, fixed range / anchored volume\n * profile. They compute over the chart's bars in range (coords.bars()) and\n * project the series back through coords; without bars in range they draw a\n * simple geometric fallback.\n */\nimport { dashFor, HANDLE_RADIUS, HIT_TOLERANCE, type Pt } from \"../_shared\";\nimport type { Coords } from \"../coords\";\nimport type { Drawing, DrawingStyle, RegressionLine } from \"../types\";\nimport { REGRESSION_LINE_DEFAULTS } from \"../specs\";\nimport { anchoredVpBox, fixedVpBox, regressionScreenLines, vwapBandLine, vwapScreenSeries } from \"../kinds/data-series\";\nimport type { Scene, SceneItem } from \"./types\";\nimport { levelFillOpacity } from \"./levels\";\n\n/** Regression trend (line-tool-regression-trend + module 742142): base line =\n * the close-vs-index least-squares fit over [t0,t1]; bands at base ± dev·σ\n * (style upper/lower deviation, factory +2/−2); channel fills between each\n * band and the base; Pearson's R printed under the DOWN line's start (12px,\n * centered, 4px below); styles.extendLines → all lines extend right.\n * Geometry comes from the shared data-series helper so the rendered shape and\n * the hit region are computed identically. */\nexport function sceneRegressionTrend(d: Drawing, pts: Pt[], selected: boolean, w: number, s: DrawingStyle, coords: Coords | null): Scene {\n const rl = s.regressionLines ?? REGRESSION_LINE_DEFAULTS;\n const lines = regressionScreenLines(d, coords, w);\n if (!lines) {\n const out: Scene = [{ t: \"line\", a: pts[0], b: pts[1], stroke: rl.base.color, strokeWidth: rl.base.width, dash: dashFor({ ...s, lineStyle: rl.base.style }), cap: \"round\" }];\n if (selected) out.push({ t: \"anchors\", pts });\n return out;\n }\n // TV RegressionTrendPaneView: lines in the order down, base, up (visible\n // ones only); the band between two neighbours is filled with the UPPER\n // line's colour at the style transparency (up band blue, base-down band\n // red); the lines are drawn opaque.\n const segs = [\n { seg: lines.lower, st: rl.down },\n { seg: lines.center, st: rl.base },\n { seg: lines.upper, st: rl.up },\n ].filter((x): x is { seg: [Pt, Pt]; st: RegressionLine } => !!x.seg && x.st.visible);\n const fillO = levelFillOpacity(s);\n const out: Scene = [];\n if (fillO > 0) {\n segs.slice(1).forEach((hi, i) => {\n const lo = segs[i].seg;\n out.push({ t: \"polygon\", pts: [lo[0], lo[1], hi.seg[1], hi.seg[0]], fill: hi.st.color, fillOpacity: fillO, stroke: \"none\", inert: true });\n });\n }\n for (const x of segs) {\n out.push(\n { t: \"hit\", a: x.seg[0], b: x.seg[1], width: HIT_TOLERANCE * 2 },\n { t: \"line\", a: x.seg[0], b: x.seg[1], stroke: x.st.color, strokeWidth: x.st.width, dash: dashFor({ ...s, lineStyle: x.st.style }), cap: \"round\" },\n );\n }\n // TV: \"\" + pearsons (full precision) under the down line's start, 12px,\n // centred, 4px below, in the down line colour.\n const l = lines.lower;\n if (s.showPearsons !== false && l) {\n out.push({ t: \"text\", x: l[0].x, y: l[0].y + 4, text: String(lines.pearsons), anchor: \"middle\", baseline: \"hanging\", size: 12, fill: rl.down.color, inert: true });\n }\n // TV _updateAnchorsPrice: the anchors sit on the base line.\n if (selected) out.push({ t: \"anchors\", pts: lines.anchors });\n return out;\n}\n\n/** Anchored VWAP (LineToolAnchoredVWAP): cumulative volume-weighted average of\n * the source price from the anchor bar forward, plus the visible ±σ bands\n * (vwap ± mult·σ of the cumulative weighted variance — the study's\n * UpperBand/LowerBand plot pairs). Geometry from the shared data-series\n * helper so the hit region matches. */\nexport function sceneAnchoredVwap(d: Drawing, pts: Pt[], selected: boolean, w: number, s: DrawingStyle, coords: Coords | null): Scene {\n const dash = dashFor(s);\n const series = vwapScreenSeries(d, coords);\n // TV draws no text on the chart for the anchored VWAP (study plots + axis\n // labels only). Transparent target over the anchor (vwapHit's anchor test).\n const badge: Scene = [{ t: \"circle\", cx: pts[0].x, cy: pts[0].y, r: HANDLE_RADIUS + HIT_TOLERANCE, fill: \"transparent\" }];\n if (selected) badge.push({ t: \"anchors\", pts });\n if (series.line.length < 2) {\n const b = { x: w, y: pts[0].y };\n return [\n { t: \"hit\", a: pts[0], b, width: 12 },\n { t: \"line\", a: pts[0], b, stroke: s.color, strokeWidth: s.width, dash },\n ...badge,\n ];\n }\n const out: Scene = [];\n const polyPair = (line: Pt[], color: string, width: number, lineDash?: string): SceneItem[] => [\n { t: \"polyline\", pts: line, fill: \"none\", stroke: \"transparent\", strokeWidth: HIT_TOLERANCE * 2, join: \"round\" },\n { t: \"polyline\", pts: line, fill: \"none\", stroke: color, strokeWidth: width, dash: lineDash, join: \"round\" },\n ];\n for (const band of series.bands) {\n if (band.upper.length < 2 || band.lower.length < 2) continue;\n // TV areaBackground (\"Background #1\") fills between UpperBand and\n // LowerBand only (band #1), in one colour (factory #4caf50, transparency 95).\n if (s.fillBackground === true && band.index === 0) {\n out.push({ t: \"polygon\", pts: [...band.upper, ...band.lower.slice().reverse()], fill: s.backgroundColor ?? \"#4caf50\", fillOpacity: levelFillOpacity(s), stroke: \"none\", inert: true });\n }\n for (const [side, line] of [[\"upper\", band.upper], [\"lower\", band.lower]] as const) {\n const st = vwapBandLine(s, band.index, side);\n if (st.visible) out.push(...polyPair(line, st.color, st.width));\n }\n }\n out.push(...polyPair(series.line, s.color, s.width, dash), ...badge);\n return out;\n}\n\n/** Volume profile histogram: box background rgba(38,198,218,0.05); rows of\n * up volume (cyan) at the base and down volume (pink) beyond it, 0.75 alpha\n * in the value area and 0.5 outside, 30% of the box width, from the left\n * or the right edge; POC line #DBDBDB width 2 across the box. */\nfunction volumeProfileScene(box: NonNullable<ReturnType<typeof fixedVpBox>>, coords: Coords, fromRight: boolean): SceneItem[] {\n const { left, right, top, bottom, vp } = box;\n const width = Math.max(1, right - left);\n const histW = 0.3 * width;\n const n = vp.rows.length;\n const step = (vp.hi - vp.lo) / n;\n const rowY = (i: number) => {\n const y0 = coords.priceToY(vp.lo + (i + 1) * step) ?? top;\n const y1 = coords.priceToY(vp.lo + i * step) ?? bottom;\n return { y: Math.min(y0, y1), h: Math.abs(y1 - y0) };\n };\n const poc = rowY(vp.poc);\n const pocY = poc.y + poc.h / 2;\n const items: SceneItem[] = [];\n vp.rows.forEach((row, i) => {\n const r = rowY(i);\n const inVa = i >= vp.vaFrom && i <= vp.vaTo;\n const upW = vp.maxTotal > 0 ? (row.up / vp.maxTotal) * histW : 0;\n const downW = vp.maxTotal > 0 ? (row.down / vp.maxTotal) * histW : 0;\n const h = Math.max(1, r.h - 1);\n const upX = fromRight ? right - upW : left;\n const downX = fromRight ? right - upW - downW : left + upW;\n items.push(\n { t: \"rect\", x: upX, y: r.y, w: upW, h, fill: inVa ? \"rgba(38,198,218,0.75)\" : \"rgba(38,198,218,0.5)\" },\n { t: \"rect\", x: downX, y: r.y, w: downW, h, fill: inVa ? \"rgba(236,64,122,0.75)\" : \"rgba(236,64,122,0.5)\" },\n );\n });\n items.push({ t: \"line\", a: { x: left, y: pocY }, b: { x: right, y: pocY }, stroke: \"#DBDBDB\", strokeWidth: 2 });\n return [\n { t: \"rect\", x: left, y: top, w: width, h: Math.max(1, bottom - top), fill: \"rgba(38,198,218,0.05)\" },\n { t: \"group\", inert: true, items },\n ];\n}\n\n/** Fixed range volume profile (TV LineToolFixedRangeVolumeProfile factory\n * graphics): profile over the bars between P0 and P1 (24 rows over their\n * low-high, Up/Down, 70% value area); box = the P0-P1 time span × the bars'\n * price range; histogram drawn from the LEFT edge (left_to_right). Anchors\n * at P0 / P1. */\nexport function sceneFixedRangeVolumeProfile(d: Drawing, pts: Pt[], selected: boolean, coords: Coords | null): Scene {\n const box = fixedVpBox(d, pts, coords);\n const out: Scene = box && coords ? volumeProfileScene(box, coords, false) : [];\n if (selected) out.push({ t: \"anchors\", pts });\n return out;\n}\n\n/** Anchored volume profile (TV LineToolAnchoredVolumeProfile, factory\n * graphics): 1 anchor; profile over the bars from the anchor to the last\n * bar; histogram drawn from the right edge (right_to_left). */\nexport function sceneAnchoredVolumeProfile(d: Drawing, pts: Pt[], selected: boolean, coords: Coords | null): Scene {\n const box = anchoredVpBox(d, pts, coords);\n const out: Scene = box && coords ? volumeProfileScene(box, coords, true) : [];\n if (selected) out.push({ t: \"anchors\", pts: [pts[0]] });\n return out;\n}\n","/*\n * Calendar parts of an epoch-seconds bar time in a time zone (moved from\n * OpenTrader chart/time-format). One cached Intl formatter per time zone.\n */\n\nexport type Parts = { y: number; m: number; d: number; wd: string; hh: string; mi: string; ss: string };\n\nconst partsFmt = new Map<string, Intl.DateTimeFormat>();\n\nexport function partsOf(sec: number, timeZone: string): Parts {\n let f = partsFmt.get(timeZone);\n if (!f) {\n f = new Intl.DateTimeFormat(\"en-US\", {\n timeZone, year: \"numeric\", month: \"numeric\", day: \"numeric\", weekday: \"short\",\n hour: \"2-digit\", minute: \"2-digit\", second: \"2-digit\", hourCycle: \"h23\",\n });\n partsFmt.set(timeZone, f);\n }\n const p = f.formatToParts(new Date(sec * 1000));\n const g = (k: string) => p.find((x) => x.type === k)?.value ?? \"\";\n return { y: Number(g(\"year\")), m: Number(g(\"month\")), d: Number(g(\"day\")), wd: g(\"weekday\"), hh: g(\"hour\"), mi: g(\"minute\"), ss: g(\"second\") };\n}\n\nconst pad = (n: number, w: number) => String(n).padStart(w, \"0\");\n\n/** Date \"yyyy-MM-dd\" and time \"HH:mm\" of a bar time in `timeZone` (TV\n * DateFormatter / TimeFormatter defaults, used by the Position forecast). */\nexport function isoDateTimeParts(sec: number, timeZone: string): { date: string; time: string } {\n const p = partsOf(sec, timeZone);\n return { date: `${pad(p.y, 4)}-${pad(p.m, 2)}-${pad(p.d, 2)}`, time: `${p.hh}:${p.mi}` };\n}\n","/*\n * TV Position forecast icons (TV 3.4.1 static bundles, white on transparent):\n * prediction-clock-white.c4675d37769f1df4c9ec.png (module 107829)\n * prediction-success-white.2fb9966b4c0f3529a2ea.png (module 415926)\n * prediction-failure-white.a838a6689f951970e715.png (module 31265)\n * Embedded as data URIs; sizes are the PNG sizes (TV draws them 1:1).\n */\nexport const FORECAST_CLOCK_ICON = { href: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAZ0lEQVR4Xl2OsQmAMBRErwgSsHAJV3GHgEVKl3ADixSClViKYPkHfEI+Wsg1j8dxnCQCiQ1jJRFcFIybHsNYCCJXvCSsJonzp/YXbiKzs7d8pavyEBP2yQEji5YV+1KIkmjI/ouRID31wXKLSuZPUAAAAABJRU5ErkJggg==\", w: 9, h: 9 };\nexport const FORECAST_SUCCESS_ICON = { href: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAKCAQAAADI+WwIAAAAb0lEQVQIHWXAMQpBAQAG4L9eKQdQSr3JpFzC5CoOoJzBSUzK+iallNWkrG99pUymDxHw5Z+RdX4ZOpnmm57aXiuWunnScXAxTGLhqMyNth1muVNq1AYKK2wVeTBGo8JZP2/mgEk+KWxQ5ZfSUS8vV97kThm/FD/aAAAAAElFTkSuQmCC\", w: 11, h: 10 };\nexport const FORECAST_FAILURE_ICON = { href: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAARElEQVR4AWMgHvy/9//5f34gzQZiQYSeAyEPkOYE0iAhMJOTAc4ixXjR/13/r/7////h/zn/pSFCT/43/lcHS6X9fwgANMArS3ikrioAAAAASUVORK5CYII=\", w: 9, h: 9 };\n","/*\n * Long / short position and position forecast as scenes (moved from\n * OpenTrader DrawingsOverlay, port phase 2).\n */\nimport { HANDLE_RADIUS, timeToSec, type Pt } from \"../_shared\";\nimport type { Coords } from \"../coords\";\nimport type { Drawing, DrawingStyle } from \"../types\";\nimport { applyOpacity, parseColor } from \"../color\";\nimport { isoDateTimeParts } from \"../time\";\nimport { positionAnchors, positionLegText, positionMiddleText, positionQty, positionTrade } from \"../kinds/position\";\nimport { forecastArcSamples, forecastStatus } from \"../kinds/data-series\";\nimport { FORECAST_CLOCK_ICON, FORECAST_FAILURE_ICON, FORECAST_SUCCESS_ICON } from \"../kinds/forecast-icons\";\nimport type { Scene, SceneItem } from \"./types\";\nimport { measureText, measureTextBold, signedFixed, tvTimeSpan } from \"./text\";\nimport { rangeArrowPath, SQUARE_ANCHORS } from \"./lines\";\n\n/** Position stats label (TV risk-reward `_addCenterLabel`): 12px text, box\n * padding 4 × fs/3, corner radius 4, background = the level colour at full\n * opacity (middle: white 1px border). `align` places the box relative to\n * `y` like TV's vertAlign: \"bottom\" = box above y, \"top\" = box below y. */\nfunction positionLabel(cx: number, y: number, align: \"top\" | \"middle\" | \"bottom\", gap: number, lines: string[], bg: string, s: DrawingStyle, border?: string): SceneItem {\n const fs = s.fontSize ?? 12;\n const padH = 4;\n const padV = fs / 3;\n const boxW = Math.max(...lines.map((l) => measureText(l, fs))) + padH * 2;\n const boxH = fs * lines.length + padV * 2;\n const top = align === \"bottom\" ? y - gap - boxH : align === \"top\" ? y + gap : y - boxH / 2 + gap;\n return {\n t: \"group\",\n inert: true,\n items: [\n { t: \"rect\", x: cx - boxW / 2, y: top, w: boxW, h: boxH, rx: 4, fill: bg, stroke: border ?? \"none\", strokeWidth: border ? 1 : 0 },\n ...lines.map((line, i): SceneItem => ({\n t: \"text\", x: cx, y: top + padV + i * fs + fs / 2, text: line, anchor: \"middle\", baseline: \"central\", size: fs, fill: s.textColor ?? \"#ffffff\",\n })),\n ],\n };\n}\n\n/** Risk/reward position tool (TV model). pt0 = entry, pt1 = close point\n * (price locked to the entry); the stop/profit offsets live on the style\n * (frozen at placement to 20% of the visible range — 1:1). Stats: middle\n * pill = open P&L + Qty + Risk/Reward, target/stop pills = distance, %,\n * amount. Qty = accountSize·risk% / stop distance. `selected` = the active\n * flag (selected or hovered). */\nexport function scenePosition(d: Drawing, pts: Pt[], selected: boolean, dir: \"long\" | \"short\", s: DrawingStyle, coords: Coords | null | undefined): Scene {\n const pa = positionAnchors(d, pts, coords);\n if (!pa) return [];\n const [a, b] = pts;\n const entry = d.points[0].price;\n const left = Math.min(a.x, b.x);\n const right = Math.max(a.x, b.x);\n const wBox = Math.max(8, right - left);\n const midX = (left + right) / 2;\n // TV stop / target colours: zones and lines at (100 − transparency)%, the\n // P&L zone at 1 − (transparency / 100)³, labels opaque.\n const stopHex = parseColor(s.stopColor ?? \"#f23645\").hex;\n const targetHex = parseColor(s.targetColor ?? \"#089981\").hex;\n const stopT = s.stopTransparency ?? 80;\n const targetT = s.targetTransparency ?? 80;\n const up = applyOpacity(targetHex, 100 - targetT);\n const down = applyOpacity(stopHex, 100 - stopT);\n const { yStop, yTarget, stop, profit } = pa;\n // TV risk-reward calculator (line-tool-risk-reward, kinds/position.ts):\n // qty = min(riskSize / |entry − stop|, leverage · account / entry) (stocks:\n // point value 1); shown = qty / lotSize rounded by QTY precision.\n // Amounts = account ± qty·distance, rounded to 2 decimals (roundValue).\n const accountSize = s.accountSize ?? 1000;\n const { qty: qtyRaw, shown: qty } = positionQty(s, entry, stop);\n const round2 = (v: number) => parseFloat(v.toFixed(2));\n const amountTarget = round2(accountSize + profit * qtyRaw);\n const amountStop = round2(accountSize - stop * qtyRaw);\n const ratio = stop > 0 ? Math.round((100 * profit) / stop) / 100 : 0;\n const sign = dir === \"long\" ? 1 : -1;\n const trade = positionTrade(d, dir, entry - sign * stop, entry + sign * profit, coords);\n // TV lastBarData: the actual close price once closed, else the close of the\n // bar at the close point (or the last bar); P&L = (price − entry) · side.\n const pl = trade ? (trade.closePrice - entry) * sign : null;\n const pip = coords?.pipSize() ?? 0.01;\n const digits = Math.max(0, Math.min(8, Math.round(-Math.log10(pip))));\n // TV label texts from the Stats flags and compact mode (kinds/position.ts);\n // TP / SL PL = (target | stop − entry) · side · qty.\n const targetText = positionLegText(s, \"tp\", profit, entry, pip, digits, amountTarget, profit * qtyRaw);\n const stopText = positionLegText(s, \"sl\", stop, entry, pip, digits, amountStop, -stop * qtyRaw);\n const midText = positionMiddleText(s, pl != null ? signedFixed(pl, digits) : null, !!trade?.closed, qty, ratio);\n const midLines = midText ? midText.split(\"\\n\") : [];\n const midBg = pl != null && pl < 0 ? stopHex : pl != null && pl > 0 ? targetHex : s.color;\n // Screen geometry of the actual trade (TV entryX / right / closeLevel).\n const xAt = (i: number) => {\n const bars = coords?.bars() ?? [];\n const t = bars[i]?.time;\n return t != null && coords ? coords.timeToX(t) : null;\n };\n const yClose = trade && coords ? coords.priceToY(trade.closePrice) : null;\n const entryX = trade?.entryIndex != null ? xAt(trade.entryIndex) : b.x;\n const rightX = trade?.closeIndex != null ? xAt(trade.closeIndex) : b.x;\n const pnlZone =\n entryX != null && rightX != null && yClose != null && entryX !== rightX\n ? { x: Math.min(entryX, rightX), y: Math.min(a.y, yClose), w: Math.abs(rightX - entryX), h: Math.abs(yClose - a.y) }\n : null;\n const lineEndX = trade ? xAt(trade.closed ? trade.closeIndex! : trade.barIndex) : null;\n const posLine =\n trade?.entryIndex != null && entryX != null && lineEndX != null && yClose != null\n ? { from: { x: entryX, y: a.y }, to: { x: lineEndX, y: yClose } }\n : null;\n // TV shows the stats on hover / selection only, unless \"Always show stats\".\n const showStats = selected || !!s.showStats;\n // Narrow box (TV): when the labels don't fit beside the anchors, the target\n // / stop labels move 14px (anchor radius + 8) away from their lines and the\n // middle label shifts toward the smaller leg.\n const labelW = Math.max(\n 0,\n measureText(targetText, s.fontSize ?? 12),\n measureText(stopText, s.fontSize ?? 12),\n ...midLines.map((l) => measureText(l, s.fontSize ?? 12)),\n ) + 8;\n const narrow = right - left - labelW - HANDLE_RADIUS <= 8;\n const gap = narrow ? HANDLE_RADIUS + 8 : 0;\n const midShift = narrow\n ? (yTarget < yStop ? 1 : -1) * (profit > stop ? -1 : 1) * (0.5 * ((s.fontSize ?? 12) * 2 + (2 * (s.fontSize ?? 12)) / 3) + HANDLE_RADIUS + 8)\n : 0;\n const out: Scene = [\n { t: \"rect\", x: left, y: Math.min(yTarget, yStop), w: wBox, h: Math.abs(yTarget - yStop), fill: \"transparent\" },\n // profit + stop zones; the P&L zone from the actual entry to the actual\n // close (or the close point) between the entry and close prices, alpha\n // 1 − (transparency / 100)^3 (TV)\n { t: \"rect\", x: left, y: Math.min(a.y, yStop), w: wBox, h: Math.abs(yStop - a.y), fill: down },\n ];\n if (pnlZone && pl != null && pl < 0) out.push({ t: \"rect\", ...pnlZone, fill: stopHex, fillOpacity: 1 - (stopT / 100) ** 3 });\n out.push({ t: \"rect\", x: left, y: Math.min(a.y, yTarget), w: wBox, h: Math.abs(yTarget - a.y), fill: up });\n if (pnlZone && pl != null && pl > 0) out.push({ t: \"rect\", ...pnlZone, fill: targetHex, fillOpacity: 1 - (targetT / 100) ** 3 });\n // TV position line: dashed 1px, line colour, arrow at the end, from the\n // actual entry to the actual close (or the close bar's close)\n if (posLine) {\n out.push(\n { t: \"line\", a: posLine.from, b: posLine.to, stroke: s.color, strokeWidth: 1, dash: \"6 4\", inert: true },\n { t: \"path\", d: rangeArrowPath(posLine.from, posLine.to, 1), fill: \"none\", stroke: s.color, strokeWidth: 1, inert: true },\n );\n }\n // entry / target / stop lines; TV draws the stop / target lines in the zone\n // colours (factory alpha 0.2) at the Lines width\n out.push(\n { t: \"line\", a: { x: left, y: a.y }, b: { x: right, y: a.y }, stroke: s.color, strokeWidth: s.width },\n { t: \"line\", a: { x: left, y: yTarget }, b: { x: right, y: yTarget }, stroke: up, strokeWidth: s.width },\n { t: \"line\", a: { x: left, y: yStop }, b: { x: right, y: yStop }, stroke: down, strokeWidth: s.width },\n );\n // stats labels (TV: target above its line for a long, stop below, middle on\n // the entry line)\n if (showStats) {\n if (targetText) out.push(positionLabel(midX, yTarget, yTarget < a.y ? \"bottom\" : \"top\", gap, [targetText], targetHex, s));\n if (midLines.length > 0) out.push(positionLabel(midX, a.y, \"middle\", midShift, midLines, midBg, s, \"#ffffff\"));\n if (stopText) out.push(positionLabel(midX, yStop, yStop > a.y ? \"top\" : \"bottom\", gap, [stopText], stopHex, s));\n }\n if (selected) out.push({ t: \"anchors\", pts: pa.anchors, squares: SQUARE_ANCHORS.position });\n return out;\n}\n\n/* ---------- forecast (2-point; LineToolPrediction → \"Position forecast\") ----\n * Per the line-tool-prediction chunk (module 176288): p0 = source, p1 = target.\n * The vector is a QUARTER ELLIPSE centred at (source.x, target.y) with\n * rx=|dx| / ry=|dy| plus a tangent arrowhead at the target (size max(8, 4·lw)).\n * Source balloon (price 12px / date 10px, height 32) hangs on the direction\n * side of the source; target balloon (\"±Δ (pct%) in <span>\" 14px / \"price\n * date\" 11px, height 38) on the opposite side of the target; both are rounded\n * cards with a 5px pointed tail and a small #202020 dot on the anchor.\n * Status (`recalculateStateByData`): success once the target bar's high (up) /\n * low (down) touches the target price, failure when the target bar has passed\n * without touching, waiting while the target is still in the future — drawn as\n * an 18px bold banner glued to the balloon (iguana-green / ripe-red factory\n * backgrounds). Balloon fills use the factory transparency 10. The clock /\n * success / failure icons are TV's PNGs (kinds/forecast-icons.ts), drawn 1:1. */\nconst FORECAST_CENTER_DOT = \"#202020\"; // centersColor factory\n/** Width of the clock image TV draws before the target date (clockWhite). */\nconst FORECAST_CLOCK_W = FORECAST_CLOCK_ICON.w;\n/** TV DateFormatter \"yyyy-mm-dd\", plus `sep` + \"HH:mm\" on intraday charts,\n * in the chart's time zone (bar times are UTC epoch seconds). */\nfunction fmtForecastDate(t: unknown, sep: string, coords: Coords | null): string {\n const n = timeToSec(t as import(\"lightweight-charts\").Time);\n if (n == null) return \"\";\n const info = coords?.timeInfo() ?? { timeZone: \"UTC\", intraday: true };\n const { date, time } = isoDateTimeParts(n, info.timeZone);\n return info.intraday ? `${date}${sep}${time}` : date;\n}\n\ntype BalloonProps = {\n cx: number;\n y: number;\n below: boolean;\n paneW: number;\n height: number;\n rows: { text: string; size: number; dy?: number; clockThen?: string }[];\n bg: string;\n stroke: string;\n fg: string;\n opacity: number;\n banner?: { text: string; bg: string; fg: string; above: boolean; icon: { href: string; w: number; h: number } };\n};\n\n/** One prediction balloon: rounded card with a pointed tail at the anchor,\n * anchored 11px off the point (chunk: 6px offset + 5px tail), extending 20px\n * left of the anchor unless the pane's right edge pushes it further left.\n * `banner` glues the bold status strip to the far edge of the card. */\nfunction forecastBalloon(props: BalloonProps): SceneItem {\n // TV: width = the widest row (+ clock icon and 2 spaces on the date row) + 12.\n const rowW = (r: { text: string; size: number; clockThen?: string }) =>\n measureText(r.text, r.size) + (r.clockThen ? FORECAST_CLOCK_W + 2 * measureText(\" \", r.size) + measureText(r.clockThen, r.size) : 0);\n const w = Math.max(...props.rows.map(rowW)) + 12;\n const h = props.height;\n // Chunk: leftOffset = max(20, min(w − 15, point.x + w − paneWidth + 5)).\n const leftOff = Math.max(20, Math.min(w - 15, props.cx + w - props.paneW + 5));\n const x = props.cx - leftOff;\n const top = props.below ? props.y + 11 : props.y - 11 - h;\n const tailY = props.below ? top : top + h;\n const tailTip = props.y + (props.below ? 3 : -3);\n let rowY = top + 4;\n const items: SceneItem[] = [\n { t: \"rect\", x, y: top, w, h, rx: 3, fill: props.bg, fillOpacity: props.opacity, stroke: props.stroke, strokeOpacity: props.opacity, strokeWidth: 2 },\n { t: \"path\", d: `M ${props.cx - 5} ${tailY} L ${props.cx} ${tailTip} L ${props.cx + 5} ${tailY} Z`, fill: props.bg, fillOpacity: props.opacity },\n { t: \"circle\", cx: props.cx, cy: props.y, r: 3, fill: FORECAST_CENTER_DOT },\n ];\n for (const r of props.rows) {\n const y = r.dy != null ? top + r.dy : rowY;\n rowY = y + r.size + 4;\n items.push({ t: \"text\", x: x + 6, y, text: r.text, size: r.size, fill: props.fg, baseline: \"hanging\" });\n if (r.clockThen) {\n // TV: clock image at (text x + date width + 1 space, row top + 1).\n const cx0 = x + 6 + measureText(r.text, r.size) + measureText(\" \", r.size);\n items.push(\n { t: \"image\", href: FORECAST_CLOCK_ICON.href, x: cx0, y: y + 1, w: FORECAST_CLOCK_ICON.w, h: FORECAST_CLOCK_ICON.h },\n { t: \"text\", x: cx0 + FORECAST_CLOCK_W + measureText(\" \", r.size), y, text: r.clockThen, size: r.size, fill: props.fg, baseline: \"hanging\" },\n );\n }\n }\n const bn = props.banner;\n if (bn) {\n // TV: bold 14px text left-aligned at round((w − textW) / 2), top 3px into\n // the 18px strip; icon 4px left of the text, centred (TV's own offsets:\n // +|18 − h| / 2 above the card, 8 − |18 − h| / 2 below).\n const bannerH = 18;\n const bannerTop = bn.above ? top - bannerH - 2 : top + h + 2;\n const tw = measureTextBold(bn.text, 14);\n const tx = x + Math.round((w - tw) / 2);\n const ic = bn.icon;\n const iy = bn.above ? bannerTop + Math.abs(bannerH - ic.h) / 2 : bannerTop + 8 - Math.abs(bannerH - ic.h) / 2;\n items.push(\n { t: \"rect\", x: x - 1, y: bannerTop, w: w + 2, h: bannerH, rx: 5, fill: bn.bg, fillOpacity: props.opacity },\n { t: \"text\", x: tx, y: bannerTop + 3, text: bn.text, size: 14, weight: \"bold\", fill: bn.fg, baseline: \"hanging\" },\n { t: \"image\", href: ic.href, x: tx - ic.w - 4, y: iy, w: ic.w, h: ic.h },\n );\n }\n return { t: \"group\", inert: true, items };\n}\n\nexport function sceneForecast(d: Drawing, pts: Pt[], selected: boolean, w: number, s: DrawingStyle, coords: Coords | null): Scene {\n if (d.kind !== \"position-forecast\") return [];\n const [a, b] = pts;\n const up = b.y <= a.y; // screen-space direction (price-up renders upward)\n const samples = forecastArcSamples(a, b);\n // Tangent arrowhead at the target (chunk: triangle of size max(8, 4·lw)).\n const prev = samples[samples.length - 2] ?? a;\n const tLen = Math.hypot(b.x - prev.x, b.y - prev.y) || 1;\n const ux = (b.x - prev.x) / tLen;\n const uy = (b.y - prev.y) / tLen;\n const hd = Math.max(8, 4 * s.width);\n const bx = b.x - ux * hd;\n const by = b.y - uy * hd;\n const head: Pt[] = [b, { x: bx - uy * (hd / 2), y: by + ux * (hd / 2) }, { x: bx + uy * (hd / 2), y: by - ux * (hd / 2) }];\n const dPrice = d.points[1].price - d.points[0].price;\n const pct = d.points[0].price !== 0 ? (dPrice / Math.abs(d.points[0].price)) * 100 : 0;\n const t0 = timeToSec(d.points[0].time);\n const t1 = timeToSec(d.points[1].time);\n // TV line-tool-prediction texts: target \"1.74 (7.04%) in 1d 21h 30m\" /\n // \"26.40 [clock] 2026-09-02 11:30\"; source \"24.67\" / \"2026-08-31 14:00\".\n const span = t0 != null && t1 != null ? tvTimeSpan(t1 - t0) : \"\";\n const pip = coords?.pipSize() ?? 0.01;\n const digits = Math.max(0, Math.min(8, Math.round(-Math.log10(pip))));\n const status = forecastStatus(d, coords);\n // TV: backgrounds, borders and banners at the drawing's transparency.\n const op = Math.max(0, Math.min(1, (100 - (s.transparency ?? 10)) / 100));\n const out: Scene = [\n { t: \"polyline\", pts: samples, fill: \"none\", stroke: \"transparent\", strokeWidth: 12 },\n { t: \"polyline\", pts: samples, fill: \"none\", stroke: s.color, strokeWidth: s.width, join: \"round\" },\n { t: \"polygon\", pts: head, fill: s.color, stroke: s.color, strokeWidth: 1, join: \"round\" },\n // source balloon on the direction side; target balloon opposite\n forecastBalloon({\n cx: a.x,\n y: a.y,\n below: up,\n paneW: w,\n height: 32,\n rows: [\n { text: d.points[0].price.toFixed(digits), size: 12, dy: 4 },\n { text: fmtForecastDate(d.points[0].time, \" \", coords), size: 10, dy: 18 },\n ],\n bg: s.sourceBackColor ?? \"#2962FF\",\n stroke: s.sourceStrokeColor ?? \"#2962FF\",\n fg: s.sourceTextColor ?? \"#ffffff\",\n opacity: op,\n }),\n forecastBalloon({\n cx: b.x,\n y: b.y,\n below: !up,\n paneW: w,\n height: 38,\n rows: [\n { text: `${signedFixed(dPrice, digits)} (${signedFixed(Math.round(pct * 100) / 100, 2)}%)${span ? ` in ${span}` : \"\"}`, size: 14, dy: 5 },\n { text: d.points[1].price.toFixed(digits), size: 11, dy: 22, clockThen: fmtForecastDate(d.points[1].time, \" \", coords) },\n ],\n bg: s.targetBackColor ?? \"#2962FF\",\n stroke: s.targetStrokeColor ?? \"#2962FF\",\n fg: s.targetTextColor ?? \"#ffffff\",\n opacity: op,\n banner:\n status === \"waiting\"\n ? undefined\n : {\n text: status === \"success\" ? \"SUCCESS\" : \"FAILURE\",\n icon: status === \"success\" ? FORECAST_SUCCESS_ICON : FORECAST_FAILURE_ICON,\n bg: status === \"success\" ? s.successBackground ?? \"#4caf50\" : s.failureBackground ?? \"#F23645\",\n fg: status === \"success\" ? s.successTextColor ?? \"#ffffff\" : s.failureTextColor ?? \"#ffffff\",\n above: up,\n },\n }),\n ];\n if (selected) out.push({ t: \"anchors\", pts });\n return out;\n}\n","/*\n * Text tools as scenes (moved from OpenTrader DrawingsOverlay, port phase 2):\n * text, pin, note, comment, signpost, price note, callout, table, image. The\n * inline editors (text input, table cell editing, table edge hover) stay in\n * the host; the table scene takes the host's table UI state.\n */\nimport { tvTextLayout } from \"../kinds/tv-text\";\nimport { HIT_TOLERANCE, type Pt } from \"../_shared\";\nimport type { Coords } from \"../coords\";\nimport type { Drawing, DrawingStyle } from \"../types\";\nimport { applyOpacity, parseColor } from \"../color\";\nimport { calloutLayout, calloutPath, commentLayout, noteLayout, PIN_MARKER_PATH, pinLayout, pinTooltipPath, roundRectPath, textToolLayout, toolText } from \"../kinds/text-tools\";\nimport { SIGNPOST_COLORS, signpostLayout } from \"../kinds/signpost\";\nimport { priceNoteLabel } from \"../kinds/price-note\";\nimport { tableAnchors, tableLayout, TABLE_ACTIVE_COLOR, TABLE_ACTIVE_LINE, TABLE_BORDER, TABLE_EDGE_COLOR, TABLE_LINE_HEIGHT, TABLE_PAD, type TableUi } from \"../kinds/table\";\nimport { drawingImage, imageAnchors, imageBox } from \"../kinds/images\";\nimport type { Scene, SceneItem, Shadow } from \"./types\";\nimport { tvTextItems } from \"./text\";\nimport { SQUARE_ANCHORS } from \"./lines\";\n\n/** Drop shadow of the note / pin boxes: rgba(0,0,0,0.4) blur 4 offset 2. */\nconst BOX_SHADOW: Shadow = { dx: 0, dy: 2, blur: 4, color: \"rgba(0,0,0,0.4)\" };\n/** Drop shadow of the signpost plate: offset 1. */\nconst PLATE_SHADOW: Shadow = { dx: 0, dy: 1, blur: 4, color: \"rgba(0,0,0,0.4)\" };\n\n/** A colour at 50% (the faint placeholder text). */\nconst faintColor = (c: string) => applyOpacity(parseColor(c).hex, 50);\n\n/** TV text (line-tool-text): the text box top-left at the point, padding\n * fs / 6, optional background (its colour with the transparency), border\n * (width max(fs / 12, 1), outside the box) and word wrap (a resize anchor at\n * the right middle, index 1); an outline while hovered / selected (TV\n * TextRenderer outlineBorder: 1.5px (2px on screen) ring outside the box and\n * the border, tv-blue-500 when selected, at 40% when hovered); no anchor\n * otherwise. Empty = \"Add text\" at 50%. */\nexport function sceneTextTool(d: Drawing, p: Pt, selected: boolean, hovered: boolean): Scene {\n const s = d.style;\n const l = textToolLayout(d, p);\n const faint = toolText(d).faint;\n const bw = Math.max(1, Math.round(Math.max((s.fontSize ?? 14) / 12, 1)));\n const outline = selected ? \"#2962ff\" : hovered ? \"rgba(41, 98, 255, 0.4)\" : null;\n const box = l.box;\n const out: Scene = [\n {\n t: \"rect\", x: box.left, y: box.top, w: box.width, h: box.height,\n fill: s.fillBackground ? applyOpacity(parseColor(s.backgroundColor ?? s.color).hex, 100 - (s.transparency ?? 75)) : \"transparent\",\n },\n ];\n if (s.drawBorder) {\n out.push({ t: \"rect\", x: box.left - bw / 2, y: box.top - bw / 2, w: box.width + bw, h: box.height + bw, fill: \"none\", stroke: s.borderColor ?? \"#707070\", strokeWidth: bw, inert: true });\n }\n out.push(tvTextItems(l, faint ? faintColor(s.color) : s.color, s.bold, s.italic));\n if (outline) {\n const o = s.drawBorder ? bw : 0;\n out.push({\n t: \"path\",\n d: `M ${box.left - o - 2} ${box.top - o - 2} h ${box.width + 2 * o + 4} v ${box.height + 2 * o + 4} h ${-(box.width + 2 * o + 4)} Z M ${box.left - o} ${box.top - o} v ${box.height + 2 * o} h ${box.width + 2 * o} v ${-(box.height + 2 * o)} Z`,\n fill: outline,\n fillRule: \"evenodd\",\n inert: true,\n });\n }\n if (selected && s.wordWrap) out.push({ t: \"anchors\", pts: [{ x: box.left + box.width, y: box.top + box.height / 2 }] });\n return out;\n}\n\n/** TV pin (line-tool-note): the 24 x 30 marker (markerColor) standing on the\n * point; on hover / selection the text tooltip (kinds/text-tools.ts\n * pinLayout): background with its transparency and a drop shadow\n * rgba(0,0,0,0.4) blur 4 offset 2, optional 1px border, text 12px in. */\nexport function scenePin(d: Drawing, p: Pt, active: boolean, w: number): Scene {\n const s = d.style;\n const out: Scene = [{ t: \"path\", d: PIN_MARKER_PATH, transform: `translate(${p.x - 12} ${p.y - 30})`, fill: s.color, fillRule: \"evenodd\" }];\n if (!active) return out;\n const t = pinLayout(d, p, w);\n const faint = toolText(d).faint;\n const textColor = s.textColor ?? \"#dbdbdb\";\n const tip: SceneItem[] = [];\n if (s.fillBackground !== false) {\n tip.push({ t: \"path\", d: pinTooltipPath(t, p.x), fill: applyOpacity(parseColor(s.backgroundColor ?? \"#2e2e2e\").hex, 100 - (s.transparency ?? 0)), shadow: BOX_SHADOW });\n }\n if (s.drawBorder) tip.push({ t: \"path\", d: pinTooltipPath(t, p.x), fill: \"none\", stroke: s.borderColor ?? \"#4a4a4a\", strokeWidth: 1, inert: true });\n t.lines.forEach((ln, k) => {\n tip.push({\n t: \"text\", x: t.left + 12, y: t.top + 12 + t.fs / 2 + k * (t.fs + 5), text: ln, baseline: \"central\", size: t.fs,\n weight: s.bold ? 700 : 400, fontStyle: s.italic ? \"italic\" : \"normal\", fill: faint ? faintColor(textColor) : textColor, pre: true, inert: true,\n });\n });\n out.push({ t: \"group\", items: tip }, { t: \"anchors\", pts: [p] });\n return out;\n}\n\n/** Note (TV LineToolTextNote): 2 points — a 1px leader line P0→P1 in the\n * line colour (#DBDBDB), a dot at P0 (radius 2, 1px #1f1f1f ring) and the\n * text box at P1 (kinds/text-tools noteLayout): 14px #DBDBDB text on\n * #2E2E2E, radius 4, shadow rgba(0,0,0,0.4) blur 4 offset 2. */\nexport function sceneTextNote(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const [a, b] = pts;\n if (!b) return [];\n const { txt, faint, fs, box } = noteLayout(d, s, a, b);\n const x = box.left;\n const y = box.top;\n const boxW = box.width;\n const boxH = box.height;\n const lineColor = s.color ?? \"#dbdbdb\";\n const out: Scene = [\n { t: \"hit\", a, b, width: HIT_TOLERANCE * 2 },\n { t: \"line\", a, b, stroke: lineColor, strokeWidth: 1 },\n { t: \"circle\", cx: a.x, cy: a.y, r: 2, fill: lineColor },\n { t: \"circle\", cx: a.x, cy: a.y, r: 2.5, fill: \"none\", stroke: \"#1f1f1f\", strokeWidth: 1 },\n {\n t: \"rect\", x, y, w: boxW, h: boxH, rx: 4,\n fill: s.fillBackground === false ? \"transparent\" : (s.backgroundColor ?? \"#2e2e2e\"),\n stroke: s.drawBorder ? s.borderColor ?? \"#4a4a4a\" : undefined,\n strokeWidth: s.drawBorder ? 1 : undefined,\n shadow: s.fillBackground === false && !s.drawBorder ? undefined : BOX_SHADOW,\n },\n {\n t: \"text\", x: x + 8, y: y + boxH / 2, text: txt, size: fs, weight: s.bold ? 700 : 400, fontStyle: s.italic ? \"italic\" : \"normal\",\n fill: s.textColor ?? \"#dbdbdb\", baseline: \"central\", opacity: faint ? 0.6 : 1,\n },\n ];\n if (selected) out.push({ t: \"anchors\", pts });\n return out;\n}\n\n/** TV comment: the text box above-right of the point (padding round(fs /\n * 1.3) x 12) drawn as a balloon: radius min(width, fs + 2 padV) / 2 with a\n * 2px corner at the point, background with its transparency, border 2px;\n * white 16px text (factory); anchor at the point. */\nexport function sceneComment(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const [c] = pts;\n const { l, r } = commentLayout(d, c);\n const faint = toolText(d).faint;\n const textColor = s.textColor ?? \"#ffffff\";\n const b = l.box;\n const out: Scene = [\n {\n t: \"path\", d: roundRectPath(b.left, b.top, b.width, b.height, [r, r, r, 2]),\n fill: applyOpacity(parseColor(s.backgroundColor ?? s.color).hex, 100 - (s.transparency ?? 0)), stroke: s.borderColor ?? s.color, strokeWidth: 2,\n },\n tvTextItems(l, faint ? faintColor(textColor) : textColor),\n ];\n if (selected) out.push({ t: \"anchors\", pts });\n return out;\n}\n\n/** TV signpost (kinds/signpost.ts): the pole (cold-gray-500, 1px) from the\n * bar's high / low to the label, the label box (padding 6 x 8, radius 4,\n * #0F0F0F with a #2E2E2E border, #DBDBDB 12px text, wrap 134) at the\n * position percent, and with \"Emoji pin\" the 35px plate (plate colour,\n * shadow, 1px border) with the emoji between label and bar. Anchor at the\n * label point (vertical move). */\nexport function sceneSignpost(d: Drawing, p: Pt, coords: Coords | null, paneH: number, active: boolean): Scene {\n const v = coords ? signpostLayout(d, p, coords, paneH) : null;\n if (!v) return [];\n const out: Scene = [{ t: \"line\", a: { x: v.x, y: v.poleStart }, b: { x: v.x, y: v.poleEnd }, stroke: SIGNPOST_COLORS.pole, strokeWidth: 1 }];\n if (v.gap) out.push({ t: \"line\", a: { x: v.x, y: v.gap[0] }, b: { x: v.x, y: v.gap[1] }, stroke: SIGNPOST_COLORS.pole, strokeWidth: 1 });\n if (d.style.showImage) {\n out.push(\n { t: \"circle\", cx: v.x, cy: v.plateY, r: 35, fill: d.style.plateColor ?? \"#2962ff\", stroke: SIGNPOST_COLORS.plateBorder, strokeWidth: 1, shadow: PLATE_SHADOW },\n { t: \"text\", x: v.x, y: v.plateY, text: d.glyph || \"🙂\", anchor: \"middle\", baseline: \"central\", size: 32, inert: true },\n );\n }\n const box = v.l.box;\n out.push(\n { t: \"rect\", x: box.left, y: box.top, w: box.width, h: box.height, rx: 4, fill: SIGNPOST_COLORS.labelBg, stroke: SIGNPOST_COLORS.labelBorder, strokeWidth: 1 },\n tvTextItems(v.l, toolText(d).faint ? faintColor(SIGNPOST_COLORS.labelText) : SIGNPOST_COLORS.labelText, d.style.bold, d.style.italic),\n );\n if (active) out.push({ t: \"anchors\", pts: [v.anchor], squares: SQUARE_ANCHORS.single });\n return out;\n}\n\n/** Price note (TV): a 2-point line; p0 carries a price bubble (the formatted\n * price) + anchor dot; the user text rides along the line. */\nexport function scenePriceNote(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle, coords: Coords | null): Scene {\n const [a, b] = pts;\n // TV price note renderer: 1px solid line in the line colour, a 2px dot at\n // P0 with a 1px ring in the pane colour (#0F0F0F dark), the P0 price label\n // at P1 (kinds/price-note.ts). Draw order: custom text, dot, line, label,\n // ring.\n const pip = coords?.pipSize() ?? 0.01;\n const digits = Math.max(0, Math.min(8, Math.round(-Math.log10(pip))));\n const priceLabel = priceNoteLabel(d, pts, digits);\n // TV price note text (line-tool-price-note `_customLabelRenderer`): the\n // TV text box at the left end / right end / middle of the line, turned to\n // the line angle, no placeholder on the chart; factory tv-blue-500, 14px,\n // centre / bottom (box above the line). Middle cuts the line.\n const label = (() => {\n if (!d.text) return null;\n const l = a.x < b.x ? a : b;\n const r = l === a ? b : a;\n const horz = s.horzLabelsAlign ?? \"center\";\n const u = horz === \"left\" ? l : horz === \"right\" ? r : { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n const ang = Math.atan((r.y - l.y) / (r.x - l.x));\n return tvTextLayout({ x: u.x, y: u.y, text: d.text, fs: s.fontSize ?? 14, bold: s.bold, italic: s.italic, vert: s.vertLabelsAlign ?? \"bottom\", horz, angle: Number.isNaN(ang) ? 0 : ang });\n })();\n const cutPoly = label && (s.vertLabelsAlign ?? \"bottom\") === \"middle\" ? label.poly : null;\n const cut = cutPoly && cutPoly.length ? \"text\" : undefined;\n const out: Scene = [{ t: \"hit\", a, b, width: 12 }];\n if (label) out.push(tvTextItems(label, s.textColor ?? \"#2962ff\", s.bold, s.italic));\n out.push({ t: \"circle\", cx: a.x, cy: a.y, r: 2, fill: s.color });\n if (cut) out.push({ t: \"clip\", name: cut, polys: [cutPoly!] });\n out.push({ t: \"line\", a, b, stroke: s.color, strokeWidth: 1, cap: \"round\", clip: cut });\n if (priceLabel) {\n const box = priceLabel.box;\n out.push(\n { t: \"rect\", x: box.left, y: box.top, w: box.width, h: box.height, rx: 4, fill: s.priceLabelBackgroundColor ?? \"#2962ff\", stroke: s.priceLabelBorderColor ?? \"#2962ff\", strokeWidth: 1 },\n tvTextItems(priceLabel, s.priceLabelTextColor ?? \"#ffffff\", s.priceLabelBold, s.priceLabelItalic),\n );\n }\n out.push({ t: \"circle\", cx: a.x, cy: a.y, r: 2.5, fill: \"none\", stroke: \"#0f0f0f\", strokeWidth: 1, inert: true });\n if (selected) out.push({ t: \"anchors\", pts });\n return out;\n}\n\n/** TV callout: box centred at p1 with the pointer to p0 in its outline\n * (kinds/text-tools.ts calloutPath), border = line width, background with\n * its transparency, text 10px in; anchors at p0 (and the wrap handle at the\n * right middle when wrapping). */\nexport function sceneCallout(d: Drawing, pts: Pt[], selected: boolean, s: DrawingStyle): Scene {\n const [anchor, balloon] = pts;\n const c = calloutLayout(d, balloon);\n const faint = toolText(d).faint;\n const textColor = s.textColor ?? \"#ffffff\";\n const out: Scene = [{\n t: \"path\", d: calloutPath(c, anchor, balloon), fill: applyOpacity(parseColor(s.backgroundColor ?? s.color).hex, 100 - (s.transparency ?? 50)),\n stroke: s.borderColor ?? s.color, strokeWidth: s.width, join: \"round\",\n }];\n c.lines.forEach((ln, k) => {\n out.push({\n t: \"text\", x: c.x + 10, y: c.y + 10 + k * c.fs + c.fs / 2, text: ln, baseline: \"central\", size: c.fs,\n weight: s.bold ? 700 : 400, fontStyle: s.italic ? \"italic\" : \"normal\", fill: faint ? faintColor(textColor) : textColor, pre: true,\n });\n });\n if (selected) out.push({ t: \"anchors\", pts: c.wrap != null ? [anchor, { x: balloon.x + c.wrap / 2 + 10, y: balloon.y }] : [anchor] });\n return out;\n}\n\n/** TV table (module 995743, renderer `de` + pane view `ue`): background,\n * 1px grid at every cell edge, cell texts (TextRenderer padding 8, offset 1,\n * line height 1.3, top aligned; left / centre / right in the cell), the\n * active cell's 2px tv-blue inner border, the hovered resize edge (7px\n * tv-blue at 20%) and the 4 corner anchors. The cell being edited shows the\n * editor instead of its text. `ui` = the host's table UI state when this\n * table is selected, else null. */\nexport function sceneTable(d: Drawing, p: Pt, active: boolean, ui: TableUi | null): Scene {\n const L = tableLayout(d, p);\n const s = d.style;\n const w = L.right - L.left;\n const h = L.bottom - L.top;\n let grid = \"\";\n for (const y of L.ys) grid += `M${L.left} ${y}h${w}v${TABLE_BORDER}h${-w}Z`;\n for (const x of L.xs) grid += `M${x} ${L.top}h${TABLE_BORDER}v${h}h${-TABLE_BORDER}Z`;\n let activeBorder = \"\";\n if (ui?.cell && ui.cell[0] < L.ys.length - 1 && ui.cell[1] < L.xs.length - 1) {\n const [r, c] = ui.cell;\n const left = L.xs[c], right = L.xs[c + 1], top = L.ys[r], bottom = L.ys[r + 1];\n const b = TABLE_BORDER, a = TABLE_ACTIVE_LINE;\n const rects = [\n [left + b, top + b, right - left - b, a],\n [left + b, bottom - a, right - left - b, a],\n [left + b, top + b, a, bottom - top - b],\n [right - a, top + b, a, bottom - top - b],\n ];\n activeBorder = rects.map(([x, y, rw, rh]) => `M${x} ${y}h${rw}v${rh}h${-rw}Z`).join(\"\");\n }\n let edgeBand = \"\";\n if (ui?.edge) {\n if (ui.edge.col != null && L.xs[ui.edge.col + 1] != null) edgeBand += `M${L.xs[ui.edge.col + 1] - 3} ${L.top}h7v${L.bottom - L.top}h-7Z`;\n if (ui.edge.row != null && L.ys[ui.edge.row + 1] != null) edgeBand += `M${L.left} ${L.ys[ui.edge.row + 1] - 3}h${L.right - L.left}v7h${-(L.right - L.left)}Z`;\n }\n const align = s.horzLabelsAlign ?? \"left\";\n const texts: SceneItem[] = [];\n L.cells.forEach((row, r) => {\n row.forEach((_, c) => {\n const lines = ui?.editing && ui.cell && ui.cell[0] === r && ui.cell[1] === c ? [] : L.lines[r]?.[c] ?? [];\n const left = L.xs[c], right = L.xs[c + 1];\n const x = align === \"right\" ? right - TABLE_BORDER - TABLE_PAD : align === \"center\" ? left + (right - left) / 2 : left + TABLE_BORDER + TABLE_PAD;\n const y0 = L.ys[r] + TABLE_BORDER + TABLE_PAD + L.fs / 2 + 0.05 * L.fs;\n lines.forEach((ln, k) => {\n texts.push({\n t: \"text\", x, y: y0 + k * L.fs * TABLE_LINE_HEIGHT, text: ln, anchor: align === \"right\" ? \"end\" : align === \"center\" ? \"middle\" : \"start\",\n baseline: \"central\", size: L.fs, fill: s.textColor ?? \"#dbdbdb\", pre: true,\n });\n });\n });\n });\n const out: Scene = [\n // hit surface reaching the edge tolerance past the right / bottom edges\n { t: \"rect\", x: L.left - 3, y: L.top - 3, w: w + 7, h: h + 7, fill: \"transparent\" },\n { t: \"rect\", x: L.left, y: L.top, w, h, fill: s.backgroundColor ?? \"#0f0f0f\" },\n { t: \"path\", d: grid, fill: s.color, crisp: true },\n ];\n if (activeBorder) out.push({ t: \"path\", d: activeBorder, fill: TABLE_ACTIVE_COLOR, crisp: true });\n out.push({ t: \"group\", inert: true, items: texts });\n if (edgeBand) out.push({ t: \"path\", d: edgeBand, fill: TABLE_EDGE_COLOR, inert: true });\n if (active) out.push({ t: \"anchors\", pts: tableAnchors(L) });\n return out;\n}\n\n/** TV image (line-tool-image): the picture at its css size centred on the\n * point, drawn at (100 − transparency)% opacity, with 4 corner anchors\n * inset 1px. Nothing until the file is loaded. */\nexport function sceneImage(d: Drawing, p: Pt, active: boolean): Scene {\n const b = imageBox(d, p);\n if (!b) return [];\n const out: Scene = [{\n t: \"image\", href: drawingImage(d.image?.name)?.url ?? \"\", x: b.left, y: b.top, w: b.right - b.left, h: b.bottom - b.top,\n stretch: true, opacity: (100 - (d.style.transparency ?? 0)) / 100,\n }];\n if (active) out.push({ t: \"anchors\", pts: imageAnchors(b) });\n return out;\n}\n","/*\n * The scene of any drawing (moved from OpenTrader DrawingsOverlay\n * `renderKind`, port phase 3): the tool kind picks its scene builder. Used by\n * OpenTrader (SVG) and by this library's canvas runtime.\n */\nimport { HANDLE_RADIUS, type Pt } from \"../_shared\";\nimport type { Coords } from \"../coords\";\nimport type { Drawing } from \"../types\";\nimport type { TableUi } from \"../kinds/table\";\nimport type { Scene, SceneItem } from \"./types\";\nimport {\n sceneCrossLine, sceneExtendedSegment, sceneHorizontalLine, sceneHorizontalRay, sceneInfoLine, sceneTrendAngle, sceneTrendLine, sceneVerticalLine,\n} from \"./lines\";\nimport { sceneDisjointChannel, sceneFlatTopBottom, sceneParallelChannel } from \"./channels\";\nimport {\n sceneFib, sceneFibChannel, sceneFibCircles, sceneFibExtension, sceneFibSpeedArcs, sceneFibSpeedFan, sceneFibSpiral, sceneFibTimeZone, sceneFibWedge,\n scenePitchfan, sceneTrendBasedFibTime,\n} from \"./fib\";\nimport { sceneGannBox, sceneGannFan, sceneGannSquare, scenePitchfork } from \"./gann\";\nimport {\n sceneArc, sceneCircle, sceneCurve, sceneCyclicLines, sceneDoubleCurve, sceneEllipse, sceneRectangle, sceneRotatedRectangle, sceneSector, sceneSineLine,\n sceneTimeCycles, sceneTriangle,\n} from \"./shapes\";\nimport { sceneLabeledPolyline } from \"./patterns\";\nimport { sceneArrowMark, sceneArrowMarker, sceneBarsPattern, sceneFlagMark, sceneFontIcon, sceneGhostFeed, scenePriceLabel } from \"./markers\";\nimport { sceneDateAndPriceRange, sceneDateRange, scenePriceRange } from \"./ranges\";\nimport { sceneAnchoredVolumeProfile, sceneAnchoredVwap, sceneFixedRangeVolumeProfile, sceneRegressionTrend } from \"./data\";\nimport { sceneForecast, scenePosition } from \"./positions\";\nimport { sceneCallout, sceneComment, sceneImage, scenePin, scenePriceNote, sceneSignpost, sceneTable, sceneTextNote, sceneTextTool } from \"./text-tools\";\n\nexport type SceneContext = {\n /** Pane size in px. */\n w: number;\n h: number;\n coords: Coords | null;\n /** Anchors shown (selected, or hovered for the tools TV shows them on). */\n selected: boolean;\n hovered?: boolean;\n /** Text tool: selected state for its outline / wrap anchor (default\n * `selected`). */\n textSelected?: boolean;\n /** Table: the host's UI state for this table (active cell, edge, editor). */\n tableUi?: TableUi | null;\n};\n\n/** Screen scene of drawing `d` at the screen points `pts`. */\nexport function sceneOf(d: Drawing, pts: Pt[], c: SceneContext): Scene {\n const { w, h, coords, selected } = c;\n const hovered = !!c.hovered;\n const active = selected || hovered;\n const s = d.style;\n switch (d.kind) {\n case \"horizontal-line\":\n return sceneHorizontalLine(pts, selected, w, s);\n case \"vertical-line\":\n return sceneVerticalLine(pts, selected, h, s);\n case \"cross-line\":\n return sceneCrossLine(pts, selected, w, h, s);\n case \"trend-line\":\n // A plain trendline by default, but honour extend flags if a style sets\n // them (so a trendline toggled to extend renders like a ray/extended-line).\n return s.extendLeft || s.extendRight\n ? sceneExtendedSegment(d, pts, selected, w, h, s, !!s.extendLeft, !!s.extendRight, coords, active)\n : sceneTrendLine(d, pts, selected, w, h, s, coords, active);\n case \"horizontal-ray\":\n return sceneHorizontalRay(pts, selected, w, s);\n case \"ray\":\n // Extends past p2 by default; flags override (fallback keeps old rays right-extended).\n return sceneExtendedSegment(d, pts, selected, w, h, s, s.extendLeft ?? false, s.extendRight ?? true, coords, active);\n case \"extended-line\":\n // Extends both ways by default; flags override (fallback keeps old lines both-extended).\n return sceneExtendedSegment(d, pts, selected, w, h, s, s.extendLeft ?? true, s.extendRight ?? true, coords, active);\n case \"info-line\":\n return sceneInfoLine(d, pts, selected, w, h, s, coords, active);\n case \"trend-angle\":\n return sceneTrendAngle(d, pts, selected, w, h, s, coords, active);\n case \"arrow\": {\n // TV LineToolArrow = the trend line with rightEnd = Arrow (factory);\n // saves from before the line-end rows keep that arrow.\n const as = { ...s, leftEnd: s.leftEnd ?? 0, rightEnd: s.rightEnd ?? 1 };\n return as.extendLeft || as.extendRight\n ? sceneExtendedSegment(d, pts, selected, w, h, as, !!as.extendLeft, !!as.extendRight, coords, active)\n : sceneTrendLine(d, pts, selected, w, h, as, coords, active);\n }\n case \"long-position\":\n return scenePosition(d, pts, selected, \"long\", s, coords);\n case \"short-position\":\n return scenePosition(d, pts, selected, \"short\", s, coords);\n case \"position-forecast\":\n return sceneForecast(d, pts, selected, w, s, coords);\n case \"parallel-channel\":\n return sceneParallelChannel(pts, selected, s, w, h);\n case \"disjoint-channel\":\n return sceneDisjointChannel(d, pts, selected, s, w, h, coords);\n case \"flat-top-bottom\":\n return sceneFlatTopBottom(d, pts, selected, s, w, h, coords);\n case \"fib-retracement\":\n return sceneFib(d, pts, selected, w, s, coords);\n case \"trend-based-fib-extension\":\n return sceneFibExtension(d, pts, selected, w, s, coords);\n case \"fib-channel\":\n return sceneFibChannel(d, pts, selected, s, coords, w, h);\n case \"trend-based-fib-time\":\n return sceneTrendBasedFibTime(d, pts, selected, h, s, coords);\n case \"fib-time-zone\":\n return sceneFibTimeZone(pts, selected, h, s);\n case \"fib-circles\":\n return sceneFibCircles(d, pts, selected, s);\n case \"fib-speed-resistance-fan\":\n return sceneFibSpeedFan(d, pts, selected, w, h, s, coords);\n case \"fib-speed-resistance-arcs\":\n return sceneFibSpeedArcs(pts, selected, s);\n case \"fib-spiral\":\n return sceneFibSpiral(pts, selected, w, h, s);\n case \"fib-wedge\":\n return sceneFibWedge(pts, selected, s);\n case \"pitchfan\":\n return scenePitchfan(pts, selected, w, s);\n case \"pitchfork\":\n case \"schiff-pitchfork\":\n case \"modified-schiff-pitchfork\":\n case \"inside-pitchfork\":\n return scenePitchfork(d.kind, pts, selected, w, s);\n case \"gann-fan\":\n return sceneGannFan(pts, selected, w, h, s);\n case \"gann-box\":\n return sceneGannBox(d, pts, selected, s, coords);\n case \"gann-square-fixed\":\n case \"gann-square\":\n return sceneGannSquare(d, pts, selected, s, coords);\n case \"rectangle\":\n return sceneRectangle(d, pts, selected, w, s, hovered);\n case \"rotated-rectangle\":\n return sceneRotatedRectangle(d, pts, selected, s);\n case \"circle\":\n return sceneCircle(d, pts, selected, s, hovered);\n case \"ellipse\":\n return sceneEllipse(d, pts, selected, s, hovered);\n case \"triangle\":\n return sceneTriangle(pts, selected, s, hovered);\n case \"arc\":\n return sceneArc(pts, selected, s);\n case \"curve\":\n return sceneCurve(pts, selected, s);\n case \"double-curve\":\n return sceneDoubleCurve(pts, selected, s);\n case \"sector\":\n return sceneSector(pts, selected, s);\n case \"cyclic-lines\":\n return sceneCyclicLines(pts, selected, w, h, s);\n case \"sine-line\":\n return sceneSineLine(pts, selected, w, s);\n case \"time-cycles\":\n return sceneTimeCycles(pts, selected, w, s);\n case \"abcd-pattern\":\n case \"xabcd-pattern\":\n case \"cypher-pattern\":\n case \"head-and-shoulders\":\n case \"triangle-pattern\":\n case \"three-drives-pattern\":\n case \"elliott-impulse\":\n case \"elliott-correction\":\n case \"elliott-triangle\":\n case \"elliott-double-combo\":\n case \"elliott-triple-combo\":\n case \"polyline\":\n case \"path\":\n case \"brush\":\n case \"highlighter\":\n return sceneLabeledPolyline(d, pts, selected, s);\n case \"arrow-marker\":\n return sceneArrowMarker(pts, selected, s);\n case \"arrow-mark-up\":\n return sceneArrowMark(d, pts, selected, s, \"up\");\n case \"arrow-mark-down\":\n return sceneArrowMark(d, pts, selected, s, \"down\");\n case \"flag-mark\":\n return sceneFlagMark(pts, selected, s);\n case \"price-label\":\n return scenePriceLabel(d, pts, selected, s, coords);\n case \"font-icon\":\n return sceneFontIcon(d, pts, selected);\n case \"bar-pattern\":\n return sceneBarsPattern(d, pts, selected, s, coords);\n case \"ghost-feed\":\n return sceneGhostFeed(d, pts, selected, s, coords);\n case \"price-range\":\n return scenePriceRange(d, pts, selected, w, h, s, coords);\n case \"date-range\":\n return sceneDateRange(d, pts, selected, h, s, coords);\n case \"date-and-price-range\":\n return sceneDateAndPriceRange(d, pts, selected, h, s, coords);\n case \"regression-trend\":\n return sceneRegressionTrend(d, pts, selected, w, s, coords);\n case \"anchored-vwap\":\n return sceneAnchoredVwap(d, pts, selected, w, s, coords);\n case \"fixed-range-volume-profile\":\n return sceneFixedRangeVolumeProfile(d, pts, selected, coords);\n case \"anchored-volume-profile\":\n return sceneAnchoredVolumeProfile(d, pts, selected, coords);\n case \"text\":\n return sceneTextTool(d, pts[0], c.textSelected ?? selected, hovered);\n case \"pin\":\n return scenePin(d, pts[0], selected, w);\n case \"note\":\n return sceneTextNote(d, pts, selected, s);\n case \"comment\":\n return sceneComment(d, pts, selected, s);\n case \"price-note\":\n return scenePriceNote(d, pts, selected, s, coords);\n case \"signpost\":\n return sceneSignpost(d, pts[0], coords, h, selected);\n case \"callout\":\n return sceneCallout(d, pts, selected, s);\n case \"table\":\n return sceneTable(d, pts[0], selected, c.tableUi ?? null);\n case \"image\":\n return sceneImage(d, pts[0], selected);\n }\n return [];\n}\n\n/** Locked-selection anchors (TV): a padlock glyph on each anchor point in\n * place of the grab handles (moved from OpenTrader renderLockedAnchors). */\nexport function sceneLockedAnchors(pts: Pt[], color: string): Scene {\n return pts.map((p): SceneItem => ({\n t: \"group\",\n inert: true,\n items: [\n { t: \"circle\", cx: p.x, cy: p.y, r: HANDLE_RADIUS + 3, fill: \"#fff\", stroke: color, strokeWidth: 1.5 },\n // padlock: shackle arc over a filled body\n { t: \"path\", d: `M ${p.x - 2} ${p.y - 0.5} v -1.5 a 2 2 0 0 1 4 0 v 1.5`, fill: \"none\", stroke: color, strokeWidth: 1.2 },\n { t: \"rect\", x: p.x - 3.2, y: p.y - 0.5, w: 6.4, h: 4.6, rx: 1, fill: color },\n ],\n }));\n}\n","/*\n * Saved drawings: schema check and point-model migration (moved from\n * OpenTrader persistence.ts, port phase 3). Storage stays with the host.\n */\nimport { DEFAULT_STYLE, type Drawing } from \"./types\";\nimport { PARALLEL_CHANNEL_LEVEL_DEFAULTS } from \"./specs\";\n\n/** Saved drawings (parsed JSON) -> the entries that match the current\n * schema: id + kind + a points array of DataPoints, style backfilled, point\n * models migrated (migrateDrawing). Anything else is dropped: e.g. pre-5c\n * horizontal-line entries (`{price}` instead of `{points}`) — losing one or\n * two test lines is the cost of avoiding a complicated migrator. */\nexport function parseDrawings(parsed: unknown): Drawing[] {\n if (!Array.isArray(parsed)) return [];\n const valid: Drawing[] = [];\n for (const d of parsed) {\n if (!d || typeof d !== \"object\") continue;\n if (typeof d.id !== \"string\" || typeof d.kind !== \"string\") continue;\n if (!Array.isArray(d.points) || d.points.length === 0) continue;\n const pointsOk = d.points.every(\n (p: unknown) =>\n p != null &&\n typeof p === \"object\" &&\n \"time\" in p &&\n \"price\" in p &&\n typeof (p as { price: unknown }).price === \"number\",\n );\n if (!pointsOk) continue;\n // Backfill style for pre-toolbar entries (Feature 5b/5c without style).\n if (!d.style || typeof d.style !== \"object\") {\n d.style = { ...DEFAULT_STYLE };\n }\n valid.push(migrateDrawing(d as Drawing));\n }\n return valid;\n}\n\n/** Point-count migration (10/07/2026): several kinds moved to TV's point\n * models. Old saved drawings are padded/synthesized best-effort so they keep\n * rendering; a drag then normalises them.\n * - fib-wedge / pitchfan: 2 → 3 (mirror the second edge across p0's price)\n * - ellipse: 2 (bbox corners) → 3 (major axis + half-height point)\n * - price-note: 1 → 2 (degenerate line at the anchor)\n * - head-and-shoulders: 5 → 7 (duplicate the two outer points)\n * - elliott impulse/triangle/triple: 5 → 6; correction/double: 3 → 4\n * (prepend the \"0\" origin as a copy of the first point) */\nexport function migrateDrawing(d: Drawing): Drawing {\n const pts = d.points as { time: unknown; price: number }[];\n const n = pts.length;\n const dup = (p: { time: unknown; price: number }) => ({ ...p });\n switch (d.kind) {\n case \"polyline\":\n // 24/09/2026: TV fills a polyline only once it is closed (`filled`).\n // Polylines saved before the flag were always drawn closed + filled:\n // keep that look. New ones store `closed` explicitly.\n return d.closed === undefined ? ({ ...d, closed: true } as Drawing) : d;\n case \"fib-speed-resistance-fan\": {\n // 24/09/2026: TV's 0 and 1 levels are real levels (grey); fans saved\n // before drew them implicitly, so add them when missing.\n const lv = d.style.levels;\n if (!lv) return d;\n const has = (c: number) => lv.some((l) => l.coeff === c);\n if (has(0) && has(1)) return d;\n const levels = [\n ...(has(0) ? [] : [{ coeff: 0, color: \"#808080\", visible: true }]),\n ...lv,\n ...(has(1) ? [] : [{ coeff: 1, color: \"#808080\", visible: true }]),\n ];\n return { ...d, style: { ...d.style, levels } } as Drawing;\n }\n case \"parallel-channel\": {\n // 24/09/2026: TV's 7-level ladder. Channels saved before it keep their\n // look (TV v1 -> v2 rule): levels 0 and 1 = the line colour / width /\n // style, level 0.5 = the dashed middle line when it was on.\n if (d.style.levels) return d;\n const st = d.style;\n const { middleLine, ...rest } = st;\n const levels = PARALLEL_CHANNEL_LEVEL_DEFAULTS.map((l) => ({\n ...l,\n color: st.color,\n ...(l.coeff === 0 || l.coeff === 1 ? { width: st.width, style: st.lineStyle ?? \"solid\" } : {}),\n ...(l.coeff === 0.5 ? { visible: middleLine !== false } : {}),\n }));\n return { ...d, style: { ...rest, levels } } as Drawing;\n }\n case \"fib-wedge\":\n case \"pitchfan\":\n if (n === 2) {\n const p2 = { time: pts[1].time, price: 2 * pts[0].price - pts[1].price };\n return { ...d, points: [pts[0], pts[1], p2] } as Drawing;\n }\n return d;\n case \"ellipse\":\n if (n === 2) {\n const midPrice = (pts[0].price + pts[1].price) / 2;\n const t0 = Number(pts[0].time);\n const t1 = Number(pts[1].time);\n const midTime = Number.isFinite(t0) && Number.isFinite(t1) ? (t0 + t1) / 2 : Number(pts[0].time);\n return {\n ...d,\n points: [\n { time: pts[0].time, price: midPrice },\n { time: pts[1].time, price: midPrice },\n { time: midTime, price: pts[1].price },\n ],\n } as Drawing;\n }\n return d;\n case \"price-note\":\n if (n === 1) return { ...d, points: [pts[0], dup(pts[0])] } as Drawing;\n return d;\n case \"head-and-shoulders\":\n if (n === 5) return { ...d, points: [dup(pts[0]), ...pts, dup(pts[4])] } as Drawing;\n return d;\n case \"elliott-impulse\":\n case \"elliott-triangle\":\n case \"elliott-triple-combo\":\n if (n === 5) return { ...d, points: [dup(pts[0]), ...pts] } as Drawing;\n return d;\n case \"elliott-correction\":\n case \"elliott-double-combo\":\n if (n === 3) return { ...d, points: [dup(pts[0]), ...pts] } as Drawing;\n return d;\n case \"note\":\n // 24/09/2026: the 1-point map pin is TV's Pin; \"note\" is now TV's\n // 2-point text note. Old 1-point notes become pins (same look).\n return n === 1 ? ({ ...d, kind: \"pin\", points: [pts[0]] } as unknown as Drawing) : d;\n case \"anchored-volume-profile\":\n // 24/09/2026: TV places it with 1 click (anchor → last bar); older\n // 2-point entries keep their first point as the anchor.\n return n > 1 ? ({ ...d, points: [pts[0]] } as Drawing) : d;\n case \"anchored-vwap\":\n // 12/07/2026: the Background (band fill) checkbox renders only when\n // `fillBackground` is defined; VWAPs saved before the spec default\n // existed load with it undefined and lose the row.\n if (d.style.fillBackground === undefined) {\n return { ...d, style: { ...d.style, fillBackground: false } } as Drawing;\n }\n return d;\n // Point-MEANING migrations (11/07/2026), marked with fmt: 2 since the\n // count doesn't change and would re-migrate on every load otherwise.\n case \"circle\":\n // bbox corners → TV's center + radius point: center = corner midpoint,\n // the old second corner stays as the radius point (the new circle\n // circumscribes the old ellipse's box).\n if (d.fmt !== 2 && n === 2) {\n const t0 = Number(pts[0].time);\n const t1 = Number(pts[1].time);\n const midTime = Number.isFinite(t0) && Number.isFinite(t1) ? (t0 + t1) / 2 : pts[0].time;\n const center = { time: midTime, price: (pts[0].price + pts[1].price) / 2 };\n return { ...d, fmt: 2, points: [center, dup(pts[1])] } as Drawing;\n }\n return d;\n case \"arc\":\n // [start, bezier control, end] → TV's [chord start, chord end, bulge];\n // the old control point becomes the bulge, which keeps roughly the same\n // visual bow.\n if (d.fmt !== 2 && n === 3) {\n return { ...d, fmt: 2, points: [pts[0], pts[2], pts[1]] } as Drawing;\n }\n return d;\n default:\n return d;\n }\n}\n","/*\n * Gesture constants of the drawing interaction (moved from OpenTrader\n * DrawingsOverlay, port phase 3).\n */\n\nexport const DRAG_THRESHOLD = 3;\n\n/** TV interactionTolerance().minDistanceBetweenPoints (mouse): a click this\n * close to the last / first vertex finishes a path / polyline; dragging a\n * polyline end this close to the other end closes it. */\nexport const MIN_DISTANCE_BETWEEN_POINTS = 5;\n\n/** Freehand (brush/highlighter) pointer-move sampling: append a new vertex only\n * once the cursor has travelled this many screen-px from the last sample, so the\n * stroke stays smooth without an unbounded point count. */\nexport const FREEHAND_SAMPLE_PX = 2;\n","/*\n * Screen <-> chart projection helpers of the drawing interaction (moved from\n * OpenTrader DrawingsOverlay, port phase 3): project / unproject points, the\n * anchored-drawing screen position, body translation, the point-tuple rebuild\n * per kind, the Shift 45-degree snap and the OHLC magnet.\n */\nimport type { Pt } from \"../_shared\";\nimport type { Coords } from \"../coords\";\nimport type { DataPoint, Drawing } from \"../types\";\n\n/** Weak-magnet reach: snap only when the cursor is within this many screen-px\n * of an OHLC / indicator level (TV's weak magnet). Strong magnet ignores it. */\nexport const MAGNET_WEAK_RADIUS_PX = 50;\n\n/** Screen points of a drawing: its data points projected, or the TV fixed\n * position of an anchored drawing (pane fractions x pane size). */\nexport function screenPoints(coords: Coords, d: Drawing, pane: { w: number; h: number }): Pt[] | null {\n if (d.anchored) return [{ x: d.anchored.x * pane.w, y: d.anchored.y * pane.h }];\n return projectAll(coords, d.points);\n}\n\n/** Body translation by a screen delta: every data point unprojected, or the\n * fixed position of an anchored drawing (TV addFixedPoint). */\nexport function translateDrawing(coords: Coords, d: Drawing, startScreen: Pt[], dx: number, dy: number, pane?: { w: number; h: number }): Drawing | null {\n if (d.anchored && pane && pane.w > 0 && pane.h > 0) {\n return { ...d, anchored: { x: (startScreen[0].x + dx) / pane.w, y: (startScreen[0].y + dy) / pane.h } };\n }\n const next: DataPoint[] = [];\n for (const sp of startScreen) {\n const u = unproject(coords, { x: sp.x + dx, y: sp.y + dy });\n if (!u) return null;\n next.push(u);\n }\n return replaceDrawingPoints(d, next);\n}\n\nexport function projectPoint(coords: Coords, p: DataPoint): Pt | null {\n const x = coords.timeToX(p.time);\n const y = coords.priceToY(p.price);\n if (x == null || y == null) return null;\n return { x, y };\n}\n\nexport function projectAll(coords: Coords, ps: DataPoint[]): Pt[] | null {\n const out: Pt[] = [];\n for (const p of ps) {\n const sp = projectPoint(coords, p);\n if (!sp) return null;\n out.push(sp);\n }\n return out;\n}\n\n/** Constrain a screen endpoint to the nearest 45° ray from `origin`, preserving\n * the cursor's distance along that direction (TV's Shift behaviour). Works in\n * screen space so the angle is the visual on-screen angle, not data-space. */\nexport function snapAngle(origin: Pt, p: Pt): Pt {\n const dx = p.x - origin.x;\n const dy = p.y - origin.y;\n const dist = Math.hypot(dx, dy);\n if (dist === 0) return p;\n const step = Math.PI / 4;\n const ang = Math.round(Math.atan2(dy, dx) / step) * step;\n return { x: origin.x + Math.cos(ang) * dist, y: origin.y + Math.sin(ang) * dist };\n}\n\nexport function unproject(coords: Coords, p: Pt): DataPoint | null {\n const time = coords.xToTime(p.x);\n const price = coords.yToPrice(p.y);\n if (time == null || price == null) return null;\n // TV stores the raw price of the click (no rounding).\n return { time, price };\n}\n\n/** Snap a data point's price to the closest OHLC value of the bar under the\n * cursor's time (plus overlay-indicator levels when `snapToIndicators`). Time\n * stays untouched — snapping along the time axis would change which bar the\n * drawing lives on. The closest candidate is chosen by SCREEN distance to the\n * cursor, so the pick matches what the eye expects across uneven price scales.\n * Returns `null` when no level is in reach — in \"weak\" mode that's beyond\n * MAGNET_WEAK_RADIUS_PX; \"strong\" always finds one. Callers that need a value\n * regardless fall back to the raw point (`magnetSnap(...) ?? dp`); the preview\n * uses the null to keep the crosshair on the free cursor. */\nexport function magnetSnap(\n dp: DataPoint,\n coords: Coords,\n mode: \"weak\" | \"strong\",\n snapToIndicators: boolean,\n): DataPoint | null {\n const bar = coords.barAt(dp.time);\n if (!bar) return null;\n const candidates = [bar.open, bar.high, bar.low, bar.close];\n if (snapToIndicators) {\n for (const v of coords.indicatorValuesAt(bar.time)) candidates.push(v);\n }\n // Prefer screen-distance ranking; fall back to price distance if the cursor\n // price can't be projected (pre-layout).\n const cursorY = coords.priceToY(dp.price);\n let best = bar.close;\n let bestDy = Infinity;\n for (const v of candidates) {\n const vy = coords.priceToY(v);\n const dy = cursorY != null && vy != null ? Math.abs(vy - cursorY) : Math.abs(dp.price - v);\n if (dy < bestDy) {\n bestDy = dy;\n best = v;\n }\n }\n // Weak magnet only engages when a level is within reach (in screen-px when\n // available, else a price-proportional fallback).\n if (mode === \"weak\" && cursorY != null && bestDy >= MAGNET_WEAK_RADIUS_PX) return null;\n return { time: dp.time, price: best };\n}\n\n/** Replace points[index] in a drawing while preserving the discriminated-\n * union tuple type. Re-creates the array as a same-arity tuple. */\nexport function replaceDrawingPoints(d: Drawing, points: DataPoint[]): Drawing {\n // Re-spread under the existing `kind` so the resulting object matches the\n // tuple arity for that kind. Caller guarantees `points.length` matches.\n switch (d.kind) {\n case \"horizontal-line\":\n case \"horizontal-ray\":\n case \"vertical-line\":\n case \"cross-line\":\n case \"arrow-mark-up\":\n case \"arrow-mark-down\":\n case \"price-label\":\n case \"flag-mark\":\n case \"text\":\n case \"pin\":\n case \"comment\":\n case \"signpost\":\n case \"font-icon\":\n case \"table\":\n case \"image\":\n case \"anchored-vwap\":\n return { ...d, points: [points[0]] };\n case \"price-note\":\n case \"note\":\n return { ...d, points: [points[0], points[1]] };\n case \"arrow-marker\":\n case \"trend-line\":\n case \"ray\":\n case \"extended-line\":\n case \"info-line\":\n case \"trend-angle\":\n case \"long-position\":\n case \"short-position\":\n case \"gann-fan\":\n case \"gann-box\":\n case \"gann-square-fixed\":\n case \"gann-square\":\n case \"fib-time-zone\":\n case \"fib-circles\":\n case \"fib-speed-resistance-fan\":\n case \"fib-speed-resistance-arcs\":\n case \"fib-spiral\":\n case \"cyclic-lines\":\n case \"sine-line\":\n case \"time-cycles\":\n case \"arrow\":\n case \"rectangle\":\n case \"circle\":\n case \"fib-retracement\":\n case \"price-range\":\n case \"date-range\":\n case \"date-and-price-range\":\n case \"position-forecast\":\n case \"bar-pattern\":\n case \"callout\":\n case \"regression-trend\":\n case \"fixed-range-volume-profile\":\n return { ...d, points: [points[0], points[1]] };\n case \"anchored-volume-profile\":\n return { ...d, points: [points[0]] };\n case \"triangle\":\n case \"parallel-channel\":\n case \"pitchfork\":\n case \"schiff-pitchfork\":\n case \"modified-schiff-pitchfork\":\n case \"inside-pitchfork\":\n case \"trend-based-fib-extension\":\n case \"trend-based-fib-time\":\n case \"sector\":\n case \"disjoint-channel\":\n case \"flat-top-bottom\":\n case \"fib-channel\":\n case \"rotated-rectangle\":\n case \"curve\":\n case \"fib-wedge\":\n case \"pitchfan\":\n case \"ellipse\":\n case \"arc\":\n return { ...d, points: [points[0], points[1], points[2]] };\n case \"double-curve\":\n return { ...d, points: [points[0], points[1], points[2], points[3]] };\n case \"abcd-pattern\":\n case \"xabcd-pattern\":\n case \"cypher-pattern\":\n case \"head-and-shoulders\":\n case \"triangle-pattern\":\n case \"three-drives-pattern\":\n case \"elliott-impulse\":\n case \"elliott-correction\":\n case \"elliott-triangle\":\n case \"elliott-double-combo\":\n case \"elliott-triple-combo\":\n case \"polyline\":\n case \"path\":\n case \"brush\":\n case \"highlighter\":\n case \"ghost-feed\":\n // Variable-arity polylines: preserve whatever vertex count the drag\n // hands back (body drag + per-point drag both keep the length).\n return { ...d, points };\n }\n}\n\n/** Screen-space angle of a→b in degrees, y-up (0° = right, 90° = up). */\nexport function screenAngleDeg(a: Pt, b: Pt): number {\n return (Math.atan2(-(b.y - a.y), b.x - a.x) * 180) / Math.PI;\n}\n","/*\n * Placement of a new drawing (moved from OpenTrader DrawingsOverlay, port\n * phase 3): the clicked points -> the drawing of a kind (point model per\n * tool), then the data TV computes at placement (position levels, bar-pattern\n * snapshot, ghost-feed seed, curve controls, trend angle, Gann square).\n */\nimport type { Time } from \"lightweight-charts\";\nimport { timeToSec } from \"../_shared\";\nimport type { Coords } from \"../coords\";\nimport type { DataPoint, DrawingKind } from \"../types\";\nimport { defaultStyleFor } from \"../specs\";\nimport { barsBetween } from \"../kinds/data-series\";\nimport { projectPoint, screenAngleDeg, unproject } from \"./project\";\n\n/** Straight single-segment 2-point line tools whose second point honours TV's\n * Shift-to-snap-angle constraint (the line locks to 0/45/90/… while drawing). */\nexport const ANGLE_SNAP_KINDS = new Set<DrawingKind>([\n \"trend-line\", \"ray\", \"extended-line\", \"info-line\", \"trend-angle\", \"arrow\",\n // circle: the radius point snaps 45° around the center (TV's\n // snapTo45DegreesAvailable on LineToolCircle).\n \"circle\",\n]);\n\n/** 3-point kinds whose in-flight point honours the Shift 45°-step constraint\n * around the PREVIOUS point (placement and anchor drags — TV parity). */\nexport const ANGLE_SNAP_3PT_KINDS = new Set<DrawingKind>([\n \"pitchfork\", \"schiff-pitchfork\", \"modified-schiff-pitchfork\", \"inside-pitchfork\",\n \"pitchfan\", \"triangle\", \"trend-based-fib-extension\",\n]);\n\n/** Pattern / Elliott polylines keep the plain-segment rubber-band while\n * placing (TV also shows connected segments for these, not the finished\n * labeled shape); every other fixed-arity kind previews the REAL tool. */\nexport const SEGMENT_PREVIEW_KINDS = new Set<DrawingKind>([\n \"abcd-pattern\", \"xabcd-pattern\", \"cypher-pattern\", \"head-and-shoulders\",\n \"triangle-pattern\", \"three-drives-pattern\",\n \"elliott-impulse\", \"elliott-correction\", \"elliott-triangle\",\n \"elliott-double-combo\", \"elliott-triple-combo\",\n]);\n\n/** ---------- placement helpers ---------- */\n\nexport function buildNewDrawing(\n kind: import(\"../types\").DrawingKind,\n pts: DataPoint[],\n): import(\"../types\").NewDrawing | null {\n // The case grouping guarantees the tuple arity matches `kind`, but TS won't\n // distribute a fresh object literal with a union-typed discriminant over the\n // (now large) NewDrawing union, so each return is cast to the union.\n type NewDrawing = import(\"../types\").NewDrawing;\n switch (kind) {\n case \"horizontal-line\":\n case \"horizontal-ray\":\n case \"vertical-line\":\n case \"cross-line\":\n case \"arrow-mark-up\":\n case \"arrow-mark-down\":\n case \"price-label\":\n case \"flag-mark\":\n case \"text\":\n case \"pin\":\n case \"comment\":\n case \"signpost\":\n case \"font-icon\":\n case \"table\":\n case \"image\":\n case \"anchored-vwap\":\n return { kind, points: [pts[0]] } as NewDrawing;\n case \"price-note\":\n // 2-point tool (TV): p0 carries the price bubble, p0-p1 is the line.\n return { kind, points: [pts[0], pts[1]] } as NewDrawing;\n case \"note\":\n // TV Note (LineToolTextNote): 2 clicks — anchor, then the text label.\n return { kind, points: [pts[0], pts[1]] } as NewDrawing;\n case \"long-position\":\n case \"short-position\":\n // 1-click tool (TV): the close point starts AT the entry; the placement\n // path (enrichPositionPlacement) then sizes the box + default levels\n // from the chart, which buildNewDrawing has no coords for.\n return { kind, points: [pts[0], { ...pts[0] }] } as NewDrawing;\n case \"parallel-channel\": {\n // Re-anchor the 3rd click to p0's time (TV `_convertLastPointTo3rdPoint`):\n // the offset point rides the first anchor, so later endpoint drags keep\n // the channel height without extra bookkeeping. Time-proportional\n // interpolation stands in for the x-fraction (times are epoch seconds).\n const [a, b, c] = pts;\n const t0 = Number(a.time), t1 = Number(b.time), tc = Number(c.time);\n if (Number.isFinite(t0) && Number.isFinite(t1) && Number.isFinite(tc) && t1 !== t0) {\n const t = (tc - t0) / (t1 - t0);\n const dy = c.price - (a.price + (b.price - a.price) * t);\n return { kind, points: [a, b, { time: a.time, price: a.price + dy }] } as NewDrawing;\n }\n return { kind, points: [a, b, c] } as NewDrawing;\n }\n case \"arrow-marker\":\n case \"trend-line\":\n case \"ray\":\n case \"extended-line\":\n case \"info-line\":\n case \"trend-angle\":\n case \"gann-fan\":\n case \"gann-box\":\n case \"gann-square-fixed\":\n case \"gann-square\":\n case \"fib-time-zone\":\n case \"fib-speed-resistance-fan\":\n case \"fib-speed-resistance-arcs\":\n case \"fib-spiral\":\n case \"cyclic-lines\":\n case \"sine-line\":\n case \"time-cycles\":\n case \"arrow\":\n case \"rectangle\":\n case \"fib-retracement\":\n case \"price-range\":\n case \"date-range\":\n case \"date-and-price-range\":\n case \"position-forecast\":\n case \"bar-pattern\":\n case \"callout\":\n case \"regression-trend\":\n case \"fixed-range-volume-profile\":\n return { kind, points: [pts[0], pts[1]] } as NewDrawing;\n case \"anchored-volume-profile\":\n // TV: 1 click — the profile runs from the anchor bar to the last bar.\n return { kind, points: [pts[0]] } as NewDrawing;\n case \"circle\":\n // TV model: click 1 = center, click 2 = radius point. fmt 2 tags the\n // entry as the current point model (see migrateDrawing).\n return { kind, points: [pts[0], pts[1]], fmt: 2 } as NewDrawing;\n case \"arc\":\n // TV model: clicks 1-2 = chord ends, click 3 = bulge.\n return { kind, points: [pts[0], pts[1], pts[2]], fmt: 2 } as NewDrawing;\n case \"fib-circles\":\n // TV model: ellipses centred on the p0-p1 midpoint (fmt 2); older\n // entries keep the circles-around-p0 model (renderFibCircles).\n return { kind, points: [pts[0], pts[1]], fmt: 2 } as NewDrawing;\n case \"rotated-rectangle\":\n // TV model: clicks 1-2 = the centre line, click 3 = half-width (its\n // distance to that line). fmt 2 tags it; older entries keep the\n // side + offset model (renderRotatedRectangle).\n return { kind, points: [pts[0], pts[1], pts[2]], fmt: 2 } as NewDrawing;\n case \"triangle\":\n case \"pitchfork\":\n case \"schiff-pitchfork\":\n case \"modified-schiff-pitchfork\":\n case \"inside-pitchfork\":\n case \"trend-based-fib-extension\":\n case \"trend-based-fib-time\":\n case \"sector\":\n // Disjoint channel keeps the raw 3rd click (TV stores it as clicked; the\n // mirror geometry reads only its price) — not the parallel-channel re-anchor.\n case \"disjoint-channel\":\n case \"flat-top-bottom\":\n case \"fib-channel\":\n case \"fib-wedge\":\n case \"pitchfan\":\n case \"ellipse\":\n return { kind, points: [pts[0], pts[1], pts[2]] } as NewDrawing;\n case \"curve\": {\n // 2 clicks (TV): the control point is auto-derived (midpoint; the\n // placement path then offsets it perpendicular in screen space) and\n // stays draggable as the middle anchor.\n const mid = { time: ((Number(pts[0].time) + Number(pts[1].time)) / 2) as unknown as Time, price: (pts[0].price + pts[1].price) / 2 };\n return { kind, points: [pts[0], mid, pts[1]] } as NewDrawing;\n }\n case \"double-curve\": {\n // 2 clicks (TV): both cubic controls auto-derived at the thirds; the\n // placement path offsets them perpendicular in screen space.\n const t0 = Number(pts[0].time), t1 = Number(pts[1].time);\n const c1 = { time: (t0 + (t1 - t0) / 3) as unknown as Time, price: pts[0].price + (pts[1].price - pts[0].price) / 3 };\n const c2 = { time: (t0 + ((t1 - t0) * 2) / 3) as unknown as Time, price: pts[0].price + ((pts[1].price - pts[0].price) * 2) / 3 };\n return { kind, points: [pts[0], c1, c2, pts[1]] } as NewDrawing;\n }\n case \"abcd-pattern\":\n case \"xabcd-pattern\":\n case \"cypher-pattern\":\n case \"head-and-shoulders\":\n case \"triangle-pattern\":\n case \"three-drives-pattern\":\n case \"elliott-impulse\":\n case \"elliott-correction\":\n case \"elliott-triangle\":\n case \"elliott-double-combo\":\n case \"elliott-triple-combo\":\n case \"polyline\":\n case \"path\":\n case \"brush\":\n case \"highlighter\":\n case \"ghost-feed\":\n return { kind, points: pts.slice() } as NewDrawing;\n }\n return null;\n}\n\n/** TV's 1-click position placement: freeze stop = profit = 20% of the visible\n * price range (pip-rounded) into the style, and put the close point at the\n * entry bar + max(3, round(0.15 · bars visible in the pane)) — TV\n * line-tool-risk-reward `_getClosePointIndex` (paneWidth / barSpacing). */\nexport function enrichPositionPlacement(\n placed: import(\"../types\").NewDrawing,\n kind: \"long-position\" | \"short-position\",\n coords: Coords,\n paneW: number,\n paneH: number,\n): import(\"../types\").NewDrawing {\n const entry = placed.points[0];\n const pip = coords.pipSize();\n const pTop = coords.yToPrice(0);\n const pBot = coords.yToPrice(Math.max(1, paneH));\n const range = pTop != null && pBot != null ? Math.abs(pTop - pBot) : 0;\n const level = Math.max(pip, Math.round(((range || pip * 500) * 0.2) / pip) * pip);\n // Close point: entry index + max(3, round(0.15 · visible bars)); the bar\n // spacing is measured between two neighbouring bar times.\n const bars = coords.bars();\n const entryIdx = coords.timeToBarIndex(entry.time) ?? bars.length;\n const tA = coords.barIndexToTime(entryIdx);\n const tB = coords.barIndexToTime(entryIdx + 1);\n const xA = tA != null ? coords.timeToX(tA) : null;\n const xB = tB != null ? coords.timeToX(tB) : null;\n const spacing = xA != null && xB != null ? Math.abs(xB - xA) : 0;\n const visibleBars = spacing > 0 ? Math.round(paneW / spacing) : 0;\n const closeIdx = entryIdx + Math.max(3, Math.round(0.15 * visibleBars));\n const closeTime: Time = coords.barIndexToTime(closeIdx) ?? entry.time;\n const style = { ...defaultStyleFor(kind), stopLevel: level, profitLevel: level };\n return {\n ...placed,\n points: [entry, { time: closeTime, price: entry.price }],\n style,\n } as import(\"../types\").NewDrawing;\n}\n\n/** Freeze the bars covered by a fresh bar-pattern (TV keeps a snapshot; the\n * copy must not re-sample live data as it is dragged around). TV placement\n * (`_preparePoint` + `addPoint`): the points snap to the first / last bar of\n * the range, P0 = the first bar's high (HL bars mode) raised by 5% of the\n * price-scale height, P1 = P0 + (last pattern price − first pattern price). */\nexport function enrichBarPattern(\n placed: import(\"../types\").NewDrawing,\n coords: Coords,\n scaleHeight: number,\n): import(\"../types\").NewDrawing {\n const p1 = placed.points[1];\n if (!p1) return placed;\n const t0 = timeToSec(placed.points[0].time);\n const t1 = timeToSec(p1.time);\n if (t0 == null || t1 == null) return placed;\n const rows = barsBetween(coords.bars(), Math.min(t0, t1), Math.max(t0, t1));\n if (rows.length === 0) return placed;\n const first = rows[0];\n const last = rows[rows.length - 1];\n const yHigh = coords.priceToY(first.high);\n const price0 = yHigh != null ? (coords.yToPrice(yHigh - 0.05 * scaleHeight) ?? first.high) : first.high;\n const price1 = price0 + (last.low - first.high);\n return {\n ...placed,\n points: [\n { time: first.time, price: price0 },\n { time: last.time, price: price1 },\n ],\n pattern: {\n base: first.open,\n bars: rows.map((b) => [b.open, b.high, b.low, b.close] as [number, number, number, number]),\n },\n } as import(\"../types\").NewDrawing;\n}\n\n/** Freeze a fresh ghost-feed's generation params: a random seed + the mean\n * bar range of the last 14 real bars (the TV `averageHL` ≈ ATR init). */\nexport function enrichGhostFeed(\n placed: import(\"../types\").NewDrawing,\n coords: Coords,\n): import(\"../types\").NewDrawing {\n // TV `_calculateATR`: mean high − low over all loaded bars, rounded to whole\n // ticks (averageHL is an integer in ticks).\n const bars = coords.bars();\n const pip = coords.pipSize();\n const mean = bars.length > 0 ? bars.reduce((s, b) => s + (b.high - b.low), 0) / bars.length : 0;\n const amp = mean > 0 ? Math.max(1, Math.round(mean / pip)) * pip : Math.abs(placed.points[0].price) * 0.01 || 1;\n return {\n ...placed,\n ghost: { seed: Math.floor(Math.random() * 0x7fffffff), amplitude: amp },\n } as import(\"../types\").NewDrawing;\n}\n\n/** Offset a curve's auto-derived control point(s) perpendicular to the chord\n * in screen space (TV: 0.15 x chord length). */\nexport function enrichCurvePlacement(\n placed: import(\"../types\").NewDrawing,\n coords: Coords,\n): import(\"../types\").NewDrawing {\n const first = placed.points[0];\n const last = placed.points[placed.points.length - 1];\n if (!first || !last) return placed;\n const a = projectPoint(coords, first);\n const b = projectPoint(coords, last);\n if (!a || !b) return placed;\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.hypot(dx, dy) || 1;\n const px = (-dy / len) * len * 0.15;\n const py = (dx / len) * len * 0.15;\n const bend = (t: number): DataPoint | null =>\n unproject(coords, { x: a.x + dx * t + px, y: a.y + dy * t + py });\n if (placed.kind === \"curve\") {\n const c = bend(0.5);\n if (!c) return placed;\n return { ...placed, points: [placed.points[0], c, placed.points[2]] } as import(\"../types\").NewDrawing;\n }\n if (placed.kind === \"double-curve\") {\n const c1 = bend(1 / 3);\n const c2 = bend(2 / 3);\n if (!c1 || !c2) return placed;\n return { ...placed, points: [placed.points[0], c1, c2, placed.points[3]] } as import(\"../types\").NewDrawing;\n }\n return placed;\n}\n\n/** Freeze a fresh trend-angle's readout (TV stores `angle` computed in SCREEN\n * space and keeps it through zooms; only anchor drags re-derive it). */\nexport function enrichTrendAngle(\n placed: import(\"../types\").NewDrawing,\n coords: Coords,\n): import(\"../types\").NewDrawing {\n const a = projectPoint(coords, placed.points[0]);\n const b = placed.points[1] ? projectPoint(coords, placed.points[1]) : null;\n if (!a || !b) return placed;\n return {\n ...placed,\n style: { ...(placed.style ?? defaultStyleFor(\"trend-angle\")), angle: screenAngleDeg(a, b) },\n } as import(\"../types\").NewDrawing;\n}\n\n/** Gann square (TV addPoint / setLastPoint `_correctPoint(1)`): p1's price =\n * p0's price ± |bars| · ratio, keeping the cursor's side, with ratio = the\n * price per bar that makes a screen square now (TV scaleRatio: bar spacing /\n * pixels per price). Not on a log scale (TV). */\nexport function snapGannSquare<T extends { points: DataPoint[] }>(d: T, coords: Coords): T {\n const [p0, p1] = d.points;\n if (!p0 || !p1 || coords.isLog()) return d;\n const i0 = coords.timeToBarIndex(p0.time);\n const i1 = coords.timeToBarIndex(p1.time);\n if (i0 == null || i1 == null) return d;\n const ya = coords.priceToY(p0.price);\n const yb = coords.priceToY(p0.price + 1);\n const ta = coords.barIndexToTime(i0);\n const tb = coords.barIndexToTime(i0 + 1);\n const xa = ta != null ? coords.timeToX(ta) : null;\n const xb = tb != null ? coords.timeToX(tb) : null;\n if (ya == null || yb == null || xa == null || xb == null || ya === yb) return d;\n const ratio = Math.abs(xb - xa) / Math.abs(yb - ya);\n const sign = p1.price - p0.price >= 0 ? 1 : -1;\n return { ...d, points: [p0, { ...p1, price: p0.price + sign * Math.abs(i1 - i0) * ratio }] };\n}\n\n/** A finished placement: the clicked points -> the new drawing with the data\n * TV computes at placement (position box, curve controls, Gann square,\n * bar-pattern snapshot, trend angle, ghost-feed seed; polyline `closed`,\n * font-icon glyph). `pane` = the pane size in px. */\nexport function finishPlacement(\n kind: DrawingKind,\n pts: DataPoint[],\n coords: Coords | null,\n pane: { w: number; h: number },\n opts: { glyph?: string; closed?: boolean } = {},\n): import(\"../types\").NewDrawing | null {\n let placed = buildNewDrawing(kind, pts);\n if (!placed) return null;\n // Position tool (TV): one click creates the whole 1:1 box — stop = profit\n // = 20% of the visible price range, close point a span forward.\n if ((kind === \"long-position\" || kind === \"short-position\") && coords) placed = enrichPositionPlacement(placed, kind, coords, pane.w, pane.h);\n // Curves (TV): the auto-derived control point(s) bow perpendicular to the\n // chord in screen space (0.15 x chord length).\n if ((kind === \"curve\" || kind === \"double-curve\") && coords) placed = enrichCurvePlacement(placed, coords);\n // Gann square (TV addPoint / setLastPoint): a screen square at this zoom.\n if (kind === \"gann-square\" && coords) placed = snapGannSquare(placed, coords);\n // Copy tools (TV): bar-pattern freezes the covered bars.\n if (kind === \"bar-pattern\" && coords) placed = enrichBarPattern(placed, coords, Math.max(1, pane.h));\n // Trend-angle (TV): the readout angle freezes in screen space.\n if (kind === \"trend-angle\" && coords) placed = enrichTrendAngle(placed, coords);\n // TV polyline `filled`: stored explicitly (false = open) so older saves can\n // be told apart (see migrateDrawing).\n if (kind === \"polyline\" && opts.closed !== undefined) placed = { ...placed, closed: opts.closed } as typeof placed;\n // Ghost-feed (a copy tool): the seed + ATR-based amplitude freeze at commit.\n if (kind === \"ghost-feed\" && coords) placed = enrichGhostFeed(placed, coords);\n if (kind === \"font-icon\") placed = { ...placed, glyph: opts.glyph } as typeof placed;\n return placed;\n}\n","/*\n * Anchor and body drags (moved from OpenTrader DrawingsOverlay, port phase 3):\n * the drag state, the per-kind anchor semantics (positions, channels, rotated\n * rectangle, table, image, signpost, text / callout wrap, rectangle edges,\n * bbox corners), the Shift constraints and the anchor resize cursor.\n */\nimport type { Time } from \"lightweight-charts\";\nimport { bboxCorners, type HitResult, type Pt } from \"../_shared\";\nimport type { Coords } from \"../coords\";\nimport type { DataPoint, Drawing, DrawingStyle } from \"../types\";\nimport { findOverlaySpec } from \"../specs\";\nimport { positionLevels } from \"../kinds/position\";\nimport { signpostLayout, signpostPositionAtY } from \"../kinds/signpost\";\nimport { distributeSizes, tableColWidths, tableEdgeOf, tableMinColWidth, tableMinRowHeight, tableRowHeights } from \"../kinds/table\";\nimport { drawingImage, IMAGE_ANCHOR_DIRS } from \"../kinds/images\";\nimport { projectPoint, replaceDrawingPoints, screenAngleDeg, snapAngle, translateDrawing, unproject } from \"./project\";\nimport { ANGLE_SNAP_3PT_KINDS, ANGLE_SNAP_KINDS } from \"./placement\";\nimport { MIN_DISTANCE_BETWEEN_POINTS } from \"./constants\";\n\nexport type DragState = {\n id: string;\n start: Drawing;\n startCursor: Pt;\n /** Each stored point projected to screen at drag start (SVG-local). */\n startScreen: Pt[];\n mode: HitResult;\n active: boolean;\n /** Multi-select body drag: every selected drawing captured at drag start\n * (the hit drawing included) — the whole group translates together. */\n group?: { start: Drawing; startScreen: Pt[] }[];\n /** Ctrl was held on a body press: a bare click (no drag) toggles selection\n * membership on release; crossing the drag threshold clones instead. */\n pendingToggle?: boolean;\n /** Plain click on a member of a multi-selection: a bare click collapses the\n * selection to just that drawing on release (a drag moves the group). */\n pendingCollapse?: boolean;\n /** Pane size at drag start (anchored drawings store pane fractions). */\n pane?: { w: number; h: number };\n};\n\nexport function applyPositionDrag(\n state: DragState,\n cursor: Pt,\n coords: Coords,\n snap: (p: DataPoint) => DataPoint,\n): Drawing | null {\n const d = state.start;\n if (d.kind !== \"long-position\" && d.kind !== \"short-position\") return null;\n if (state.mode.hit !== \"handle\") return null;\n const idx = state.mode.handleIndex;\n const [p0, p1] = d.points;\n const pip = coords.pipSize();\n const sign = d.kind === \"long-position\" ? 1 : -1;\n const { stop, profit } = positionLevels(d, pip);\n if (idx === 0) {\n // Entry: free move; the close point's price stays locked to the entry.\n const m = unproject(coords, cursor);\n if (!m) return null;\n const sm = snap(m);\n return replaceDrawingPoints(d, [sm, { time: p1.time, price: sm.price }]);\n }\n if (idx === 1) {\n // Close point: horizontal-only.\n const t = coords.xToTime(cursor.x);\n if (t == null) return null;\n return replaceDrawingPoints(d, [p0, { time: t, price: p0.price }]);\n }\n const price = coords.yToPrice(cursor.y);\n if (price == null) return null;\n if (idx === 2) {\n const lvl = Math.max(pip, (p0.price - price) * sign);\n return { ...d, style: { ...d.style, stopLevel: lvl, profitLevel: profit } } as Drawing;\n }\n if (idx === 3) {\n const lvl = Math.max(pip, (price - p0.price) * sign);\n return { ...d, style: { ...d.style, profitLevel: lvl, stopLevel: stop } } as Drawing;\n }\n return null;\n}\n\nexport function applyParallelChannelDrag(state: DragState, cursor: Pt, coords: Coords): Drawing | null {\n const d = state.start;\n if (d.kind !== \"parallel-channel\" || state.mode.hit !== \"handle\") return null;\n const [aS, bS, cS] = state.startScreen;\n if (!aS || !bS || !cS) return null;\n const idx = state.mode.handleIndex;\n const dx = cursor.x - state.startCursor.x;\n const dy = cursor.y - state.startCursor.y;\n const up = (p: Pt) => unproject(coords, p);\n const pts = d.points;\n if (idx === 0 || idx === 2) {\n // Main-edge start / offset-edge start: co-move p0 + p2 (TV preserves the\n // channel height on endpoint drags; height changes only via anchor 4).\n const p0n = up({ x: aS.x + dx, y: aS.y + dy });\n const p2n = up({ x: cS.x + dx, y: cS.y + dy });\n if (!p0n || !p2n) return null;\n return replaceDrawingPoints(d, [p0n, pts[1], p2n]);\n }\n if (idx === 1 || idx === 3) {\n // Main-edge end / offset-edge end: move p1 (height rides p0/p2).\n const p1n = up({ x: bS.x + dx, y: bS.y + dy });\n if (!p1n) return null;\n return replaceDrawingPoints(d, [pts[0], p1n, pts[2]]);\n }\n if (idx === 4) {\n // Offset-edge middle: height only (vertical p2 drag).\n const p2n = up({ x: cS.x, y: cS.y + dy });\n if (!p2n) return null;\n return replaceDrawingPoints(d, [pts[0], pts[1], p2n]);\n }\n if (idx === 5) {\n // Main-edge middle: shift the whole channel vertically.\n const p0n = up({ x: aS.x, y: aS.y + dy });\n const p1n = up({ x: bS.x, y: bS.y + dy });\n const p2n = up({ x: cS.x, y: cS.y + dy });\n if (!p0n || !p1n || !p2n) return null;\n return replaceDrawingPoints(d, [p0n, p1n, p2n]);\n }\n return null;\n}\n\nexport function applyDisjointChannelDrag(\n state: DragState,\n cursor: Pt,\n coords: Coords,\n snap: (p: DataPoint) => DataPoint,\n): Drawing | null {\n const d = state.start;\n if (d.kind !== \"disjoint-channel\" || state.mode.hit !== \"handle\") return null;\n const idx = state.mode.handleIndex;\n const pts = d.points;\n if (idx === 0 || idx === 1) {\n const m = unproject(coords, cursor);\n if (!m) return null;\n const next = pts.slice() as DataPoint[];\n next[idx] = snap(m);\n return replaceDrawingPoints(d, next);\n }\n const price = coords.yToPrice(cursor.y);\n if (price == null) return null;\n if (idx === 2) {\n // Offset-edge end at p1.x → p2's price directly.\n return replaceDrawingPoints(d, [pts[0], pts[1], { time: pts[2].time, price }]);\n }\n if (idx === 3) {\n // Offset-edge end at p0.x: its price = p2 + p1 − p0 (mirror), so the drag\n // adjusts p0's price — the mirrored edges stay coupled (TV model).\n const p0price = pts[2].price + pts[1].price - price;\n return replaceDrawingPoints(d, [{ time: pts[0].time, price: p0price }, pts[1], pts[2]]);\n }\n return null;\n}\n\n/** Rotated rectangle (fmt 2, TV): anchors 0/1 move the centre-line ends and\n * keep the width (TV setPoint recomputes p2 = p0 + perp·distance); anchors\n * 2-5 are the corners and set p2 (the width) to the cursor. */\nexport function applyRotatedRectDrag(\n state: DragState,\n cursor: Pt,\n coords: Coords,\n snap: (p: DataPoint) => DataPoint,\n): Drawing | null {\n const d = state.start;\n if (d.kind !== \"rotated-rectangle\" || state.mode.hit !== \"handle\") return null;\n const idx = state.mode.handleIndex;\n const m = unproject(coords, cursor);\n if (!m) return null;\n const pts = d.points.slice() as DataPoint[];\n if (idx >= 2) {\n pts[2] = m;\n return replaceDrawingPoints(d, pts);\n }\n const [a0, b0, c0] = state.startScreen;\n const ux = b0.x - a0.x;\n const uy = b0.y - a0.y;\n const ul = Math.hypot(ux, uy) || 1;\n const dist = Math.abs(((c0.x - a0.x) * uy - (c0.y - a0.y) * ux) / ul);\n const sm = snap(m);\n pts[idx] = sm;\n const a = idx === 0 ? projectPoint(coords, sm) : a0;\n const b = idx === 1 ? projectPoint(coords, sm) : b0;\n if (!a || !b) return null;\n const len = Math.hypot(b.x - a.x, b.y - a.y) || 1;\n const p2 = unproject(coords, { x: a.x + ((b.y - a.y) / len) * dist, y: a.y - ((b.x - a.x) / len) * dist });\n if (!p2) return null;\n pts[2] = p2;\n return replaceDrawingPoints(d, pts);\n}\n\n/** Given the current cursor + drag state, compute the updated drawing.\n * `snap` is the price-axis snap fn used when magnet is on; pass the\n * identity function (`(p) => p`) when off. */\nexport function applyDrag(\n state: DragState,\n cursor: Pt,\n coords: Coords,\n snap: (p: DataPoint) => DataPoint,\n constrain = false,\n): Drawing | null {\n const spec = findOverlaySpec(state.start.kind);\n // Shift constraint on ANCHOR drags (TV): 2-point line kinds snap the dragged\n // endpoint to 45° steps around the fixed one; bbox kinds constrain to a\n // square around the opposite corner.\n if (constrain && state.mode.hit === \"handle\") {\n if (\n ANGLE_SNAP_KINDS.has(state.start.kind) &&\n state.startScreen.length === 2 &&\n state.mode.handleIndex >= 0 && state.mode.handleIndex <= 1 &&\n // circle: only the RADIUS point (index 1) snaps around the center —\n // TV never constrains the center drag.\n (state.start.kind !== \"circle\" || state.mode.handleIndex === 1)\n ) {\n const other = state.startScreen[1 - state.mode.handleIndex];\n if (other) cursor = snapAngle(other, cursor);\n } else if (spec?.isBbox && state.startScreen.length === 2 && state.mode.handleIndex < 4) {\n const cs = bboxCorners(state.startScreen[0], state.startScreen[1]);\n const opp = cs[(state.mode.handleIndex + 2) % 4];\n if (opp) {\n const dx = cursor.x - opp.x;\n const dy = cursor.y - opp.y;\n const m = Math.max(Math.abs(dx), Math.abs(dy));\n cursor = { x: opp.x + Math.sign(dx || 1) * m, y: opp.y + Math.sign(dy || 1) * m };\n }\n } else if (\n ANGLE_SNAP_3PT_KINDS.has(state.start.kind) &&\n state.mode.handleIndex >= 0 && state.mode.handleIndex < state.startScreen.length\n ) {\n // 3-point kinds: the dragged point snaps 45° around the PREVIOUS point\n // (the next one for the first anchor).\n const i = state.mode.handleIndex;\n const ref = state.startScreen[i > 0 ? i - 1 : 1];\n if (ref) cursor = snapAngle(ref, cursor);\n }\n }\n // Kind-specific anchor semantics (virtual anchors beyond the stored points).\n if (state.mode.hit === \"handle\") {\n switch (state.start.kind) {\n case \"long-position\":\n case \"short-position\":\n return applyPositionDrag(state, cursor, coords, snap);\n case \"parallel-channel\":\n return applyParallelChannelDrag(state, cursor, coords);\n case \"table\":\n return applyTableDrag(state, cursor, coords);\n case \"signpost\": {\n const paneH = state.pane?.h ?? 0;\n const pos = signpostPositionAtY(state.start, coords, paneH, cursor.y);\n if (pos == null) return null;\n return { ...state.start, style: { ...state.start.style, signpostPosition: pos } } as Drawing;\n }\n // TV text: anchor 1 = the wrap width (min 100), from the point.\n case \"text\": {\n if (state.mode.handleIndex !== 1) break;\n const fs = state.start.style.fontSize ?? 14;\n return { ...state.start, style: { ...state.start.style, wordWrapWidth: Math.max(100, cursor.x - state.startScreen[0].x - Math.floor(fs / 6)) } } as Drawing;\n }\n // TV callout: anchor 1 = the wrap width (min 100) with the box's left\n // edge kept; the balloon centre follows.\n case \"callout\": {\n if (state.mode.handleIndex !== 1) break;\n const st = state.start.style;\n const wrap0 = st.wordWrapWidth ?? 200;\n const leftEdge = state.startScreen[1].x - wrap0 / 2 - 10;\n const wrap = Math.max(100, cursor.x - leftEdge - 10);\n const m = unproject(coords, { x: leftEdge + wrap / 2 + 10, y: state.startScreen[1].y });\n if (!m) return null;\n return { ...replaceDrawingPoints(state.start, [state.start.points[0], m]), style: { ...st, wordWrapWidth: wrap } } as Drawing;\n }\n case \"image\":\n return applyImageDrag(state, cursor, coords);\n // Anchored pin (TV Anchor drawing): its one anchor moves the fixed pane\n // position like a body move (TV refuses point changes of a fixed\n // drawing; the pin has a single point).\n case \"pin\":\n if (state.start.anchored) return translateDrawing(coords, state.start, state.startScreen, cursor.x - state.startCursor.x, cursor.y - state.startCursor.y, state.pane);\n break;\n case \"polyline\": {\n // TV LineToolPolyline.setPoint: an end point dragged within\n // minDistanceBetweenPoints of the other end closes the polyline\n // (`filled`); the point stays where it is dropped.\n const i = state.mode.handleIndex;\n const n = state.startScreen.length;\n if (n > 2 && (i === 0 || i === n - 1)) {\n const other = state.startScreen[i === 0 ? n - 1 : 0];\n if (Math.hypot(cursor.x - other.x, cursor.y - other.y) < MIN_DISTANCE_BETWEEN_POINTS) {\n const m = unproject(coords, cursor);\n if (!m) return null;\n const next = state.start.points.slice() as DataPoint[];\n next[i] = snap(m);\n return { ...replaceDrawingPoints(state.start, next), closed: true } as Drawing;\n }\n }\n break;\n }\n case \"disjoint-channel\":\n return applyDisjointChannelDrag(state, cursor, coords, snap);\n case \"rotated-rectangle\":\n if (state.start.fmt === 2) return applyRotatedRectDrag(state, cursor, coords, snap);\n break;\n // TV: the h-line anchor is a vertical resize (price only), the v-line\n // anchor a horizontal resize (time only).\n case \"horizontal-line\": {\n const m = unproject(coords, cursor);\n if (!m) return null;\n return replaceDrawingPoints(state.start, [{ time: state.start.points[0].time, price: snap(m).price }]);\n }\n case \"vertical-line\": {\n const m = unproject(coords, cursor);\n if (!m) return null;\n return replaceDrawingPoints(state.start, [{ time: snap(m).time, price: state.start.points[0].price }]);\n }\n }\n }\n // Body drag: translate every stored point by the screen-delta, then\n // unproject. Body drags don't snap — snapping every point individually\n // would tear the shape apart on a single drag gesture.\n // TV signpost body move: the bar follows x, the position follows the\n // label's y.\n if (state.mode.hit === \"body\" && state.start.kind === \"signpost\") {\n const dx = cursor.x - state.startCursor.x;\n const dy = cursor.y - state.startCursor.y;\n const m = unproject(coords, { x: state.startScreen[0].x + dx, y: state.startScreen[0].y });\n const paneH = state.pane?.h ?? 0;\n const g0 = signpostLayout(state.start, state.startScreen[0], coords, paneH);\n if (!m) return null;\n const moved = replaceDrawingPoints(state.start, [{ time: m.time, price: state.start.points[0].price }]);\n const pos = signpostPositionAtY(moved, coords, paneH, g0.anchor.y + dy);\n return pos == null ? moved : ({ ...moved, style: { ...moved.style, signpostPosition: pos } } as Drawing);\n }\n if (state.mode.hit === \"body\") {\n return translateDrawing(coords, state.start, state.startScreen, cursor.x - state.startCursor.x, cursor.y - state.startCursor.y, state.pane);\n }\n // Rectangle edge-midpoint anchors (indices 4-7 = top/right/bottom/left):\n // drag only that edge; the opposite edge and both cross-axis edges stay put.\n if (state.start.kind === \"rectangle\" && state.mode.handleIndex >= 4 && state.startScreen.length === 2) {\n const [tl, , br] = bboxCorners(state.startScreen[0], state.startScreen[1]);\n let { x: left, y: top } = tl;\n let { x: right, y: bottom } = br;\n switch (state.mode.handleIndex) {\n case 4: top = cursor.y; break;\n case 5: right = cursor.x; break;\n case 6: bottom = cursor.y; break;\n case 7: left = cursor.x; break;\n }\n const a = unproject(coords, { x: left, y: top });\n const b = unproject(coords, { x: right, y: bottom });\n if (!a || !b) return null;\n return replaceDrawingPoints(state.start, [a, b]);\n }\n // Handle drag for bbox kinds: opposite-diagonal corner stays fixed.\n if (spec?.isBbox && state.startScreen.length === 2 && state.mode.handleIndex < 4) {\n const cs = bboxCorners(state.startScreen[0], state.startScreen[1]);\n const opposite = cs[(state.mode.handleIndex + 2) % 4];\n const a = unproject(coords, cursor);\n const b = unproject(coords, opposite);\n if (!a || !b) return null;\n return replaceDrawingPoints(state.start, [snap(a), b]);\n }\n // Handle drag for line / triangle / 1-point kinds: cursor → that point.\n const moved = unproject(coords, cursor);\n if (!moved) return null;\n const idx = state.mode.handleIndex;\n const next = state.start.points.slice() as DataPoint[];\n if (idx < 0 || idx >= next.length) return null;\n next[idx] = snap(moved);\n const updated = replaceDrawingPoints(state.start, next);\n // Trend-angle: re-freeze the screen-space angle from the dragged geometry\n // (the only edit that changes the readout — zooming never does).\n if (updated.kind === \"trend-angle\" && state.startScreen.length === 2 && idx <= 1) {\n const aS = idx === 0 ? cursor : state.startScreen[0];\n const bS = idx === 1 ? cursor : state.startScreen[1];\n return { ...updated, style: { ...updated.style, angle: screenAngleDeg(aS, bS) } };\n }\n return updated;\n}\n\n/** Time of the bar at or left of screen x (TV Math.floor(coordinateToFloatIndex)). */\nexport function floorTimeAt(coords: Coords, x: number): Time | null {\n const t = coords.xToTime(x);\n if (t == null) return null;\n const tx = coords.timeToX(t);\n if (tx == null || tx <= x + 1e-6) return t;\n const i = coords.timeToBarIndex(t);\n return i == null ? t : coords.barIndexToTime(i - 1) ?? t;\n}\n\n/** TV LineToolTable.setPoint. Corner anchors (0 TopLeft, 1 BottomLeft,\n * 2 TopRight, 3 BottomRight) resize the whole table from the opposite corner\n * (sizes scaled with distributeSizes, kept at their minimum; a left corner\n * snaps the point to the bar at or left of the cursor and the last column\n * absorbs the rounding so the right edge stays). Edge anchors (≥ 1024)\n * resize one column (≥ min width) or one row (≥ its text height). */\nexport function applyTableDrag(state: DragState, cursor: Pt, coords: Coords): Drawing | null {\n if (state.mode.hit !== \"handle\") return null;\n const d = state.start;\n const s = d.style;\n const i = state.mode.handleIndex;\n const p0 = state.startScreen[0];\n const fs = s.fontSize ?? 14;\n const widths = tableColWidths(s);\n const { heights, mins: rowMins } = tableRowHeights(s);\n const colMin = tableMinColWidth(fs);\n const colMins = widths.map(() => colMin);\n const sum = (a: number[]) => a.reduce((x, y) => x + y, 0);\n const totalW = sum(widths);\n const totalH = sum(heights);\n const edge = tableEdgeOf(i);\n if (edge) {\n const patch: Partial<DrawingStyle> = {};\n if (edge.col != null) {\n const left = p0.x + sum(widths.slice(0, edge.col));\n patch.tableColWidths = widths.map((w, k) => (k === edge.col ? Math.max(colMin, cursor.x - left) : w));\n }\n if (edge.row != null) {\n const top = p0.y + sum(heights.slice(0, edge.row));\n patch.tableRowHeights = heights.map((h, k) => (k === edge.row ? Math.max(rowMins[k], cursor.y - top) : h));\n }\n return { ...d, style: { ...s, ...patch } } as Drawing;\n }\n if (i > 3) return null;\n const isLeft = i === 0 || i === 1;\n const isTop = i === 0 || i === 2;\n const start = { x: p0.x + (isLeft ? 0 : totalW), y: p0.y + (isTop ? 0 : totalH) };\n const opp = { x: start.x + (isLeft ? totalW : -totalW), y: start.y + (isTop ? totalH : -totalH) };\n const minW = colMin * widths.length;\n const minH = sum(rowMins);\n let x = isLeft ? Math.min(cursor.x, opp.x - minW) : Math.max(cursor.x, opp.x + minW);\n const y = isTop ? Math.min(cursor.y, opp.y - minH) : Math.max(cursor.y, opp.y + minH);\n let time = d.points[0].time;\n // Anchored (TV isFixed): the fixed point follows the corner, no bar snap.\n const fixed = d.anchored && state.pane && state.pane.w > 0 && state.pane.h > 0 ? state.pane : null;\n if (isLeft && !fixed) {\n const t = floorTimeAt(coords, x);\n const tx = t == null ? null : coords.timeToX(t);\n if (t == null || tx == null) return null;\n time = t;\n x = tx;\n }\n let price = d.points[0].price;\n if (isTop && !fixed) {\n const pr = coords.yToPrice(y);\n if (pr == null) return null;\n price = pr;\n }\n const dxW = start.x - x;\n const dyH = start.y - y;\n const w = distributeSizes(widths, colMins, isLeft ? totalW + dxW : totalW - dxW);\n if (isLeft) w[w.length - 1] += Math.round(p0.x + totalW) - x - sum(w);\n const h = distributeSizes(heights, rowMins, isTop ? totalH + dyH : totalH - dyH);\n const rowMin = tableMinRowHeight(fs);\n if (fixed) {\n const fx = isLeft ? x : p0.x;\n const fy = isTop ? y : p0.y;\n return {\n ...d,\n anchored: { x: fx / fixed.w, y: fy / fixed.h },\n style: { ...s, tableColWidths: w.map((v) => Math.max(v, colMin)), tableRowHeights: h.map((v) => Math.max(v, rowMin)) },\n } as Drawing;\n }\n return {\n ...d,\n points: [{ time, price }],\n style: { ...s, tableColWidths: w.map((v) => Math.max(v, colMin)), tableRowHeights: h.map((v) => Math.max(v, rowMin)) },\n } as Drawing;\n}\n\n/** TV LineToolImage.setPoint: a corner drag scales the image uniformly from\n * the opposite corner (scale = max(|dx| / natural width, |dy| / natural\n * height), sizes rounded). The centre point snaps to a bar; `dx` keeps the\n * exact centre while dragging (TV dOffsetX). */\nexport function applyImageDrag(state: DragState, cursor: Pt, coords: Coords): Drawing | null {\n const d = state.start;\n const im = d.image;\n const nat = drawingImage(im?.name);\n if (!im || !nat || state.mode.hit !== \"handle\" || state.mode.handleIndex > 3) return null;\n const [sx, sy] = IMAGE_ANCHOR_DIRS[state.mode.handleIndex];\n const c0 = { x: state.startScreen[0].x + (im.dx ?? 0), y: state.startScreen[0].y };\n const opp = { x: c0.x - (sx * im.cssWidth) / 2, y: c0.y - (sy * im.cssHeight) / 2 };\n const k = Math.max(Math.abs(opp.x - cursor.x) / nat.width, Math.abs(opp.y - cursor.y) / nat.height);\n const w = Math.round(nat.width * k);\n const h = Math.round(nat.height * k);\n const c = { x: opp.x + (sx * w) / 2, y: opp.y + (sy * h) / 2 };\n const m = unproject(coords, c);\n if (!m) return null;\n const mx = coords.timeToX(m.time);\n return { ...d, points: [m], image: { ...im, cssWidth: w, cssHeight: h, dx: mx == null ? 0 : c.x - mx } } as Drawing;\n}\n\n/** Direction-aware resize cursor for an anchor: the angle from the drawing's\n * centroid to the anchor picks ew/ns/nesw/nwse (TV's anchorResizeCursorType).\n * Single-anchor drawings keep the grab cursor. */\nexport function anchorCursor(p: Pt, pts: Pt[]): string {\n if (pts.length < 2) return \"grab\";\n let cx = 0, cy = 0;\n for (const q of pts) { cx += q.x; cy += q.y; }\n cx /= pts.length; cy /= pts.length;\n const dx = p.x - cx, dy = p.y - cy;\n if (Math.hypot(dx, dy) < 1) return \"grab\";\n const deg = ((Math.atan2(dy, dx) * 180) / Math.PI + 360) % 180;\n if (deg < 22.5 || deg >= 157.5) return \"ew-resize\";\n if (deg < 67.5) return \"nwse-resize\";\n if (deg < 112.5) return \"ns-resize\";\n return \"nesw-resize\";\n}\n","/*\n * TV \"Anchor drawing\" (floating toolbar button toggle-anchor, action\n * Chart.SelectedObject.ToggleAnchored; property `anchored`): an anchored\n * drawing keeps a fixed position on the pane (pane fractions) instead of a\n * time / price point. Anchorable tools in TradingView (anchorable() true):\n * Text, Pin (TV LineToolNote), Table. TradingView's retired \"Anchored text\"\n * tool was the Text tool with this on by default (OpenTrader\n * research/anchored-text, 26/09/2026). Moved from OpenTrader DrawingsOverlay\n * toggleAnchored (table only until then).\n */\nimport type { Coords } from \"../coords\";\nimport type { Drawing } from \"../types\";\nimport { projectPoint, replaceDrawingPoints } from \"./project\";\nimport { floorTimeAt } from \"./drag\";\n\nexport const ANCHORABLE_KINDS = new Set<string>([\"text\", \"pin\", \"table\"]);\n\nexport function isAnchorable(kind: string): boolean {\n return ANCHORABLE_KINDS.has(kind);\n}\n\n/** TV _onAnchoredChange: anchoring stores the current screen point as pane\n * fractions; unanchoring turns the fixed point back into a data point (bar\n * at or left of it, as TV setPoint). Null when not anchorable / not\n * projectable. */\nexport function toggleAnchored(d: Drawing, coords: Coords, pane: { w: number; h: number }): Drawing | null {\n if (!isAnchorable(d.kind) || pane.w <= 0 || pane.h <= 0) return null;\n if (!d.anchored) {\n const p = projectPoint(coords, d.points[0]);\n return p ? ({ ...d, anchored: { x: p.x / pane.w, y: p.y / pane.h } } as Drawing) : null;\n }\n const x = d.anchored.x * pane.w;\n const y = d.anchored.y * pane.h;\n const time = floorTimeAt(coords, x);\n const price = coords.yToPrice(y);\n if (time == null || price == null) return null;\n const { anchored: _a, ...rest } = d;\n return replaceDrawingPoints(rest as Drawing, [{ time, price }]);\n}\n","/*\n * Coords — pixel <-> data bridge of the drawings, built from a\n * lightweight-charts chart + series (moved from OpenTrader\n * window/drawings/coords.ts, port phase 3). Types only are imported from\n * lightweight-charts, so a host with its own lightweight-charts build (e.g. a\n * fork) keeps a single copy.\n *\n * `barAt` is the magnet snap helper: time -> closest OHLC bar. `getRaw`\n * returns the host's latest bar array, so no rebuild is needed when data\n * changes.\n */\nimport type { IChartApi, ISeriesApi, Logical, SeriesType, Time } from \"lightweight-charts\";\nimport type { Coords, OHLC } from \"../tv/coords\";\n\n/** lightweight-charts PriceScaleMode.Logarithmic (a const enum value; not\n * imported so no lightweight-charts runtime is pulled in). */\nconst PRICE_SCALE_MODE_LOG = 1;\n\nexport function makeCoords(\n chart: IChartApi,\n series: ISeriesApi<SeriesType>,\n getRaw: () => OHLC[],\n /** Resolves overlay-indicator values at an epoch-seconds bar time. Injected\n * by ChartView (reads the live IndicatorController); defaults to none. */\n getIndicatorValues: (sec: number | null) => number[] = () => [],\n getTimeInfo: () => { timeZone: string; intraday: boolean } = () => ({ timeZone: \"UTC\", intraday: true }),\n): Coords {\n return {\n priceToY: (p) => series.priceToCoordinate(p),\n yToPrice: (y) => series.coordinateToPrice(y),\n isLog: () => series.priceScale().options().mode === PRICE_SCALE_MODE_LOG,\n // timeToCoordinate / coordinateToTime only map within the loaded data range;\n // off-data x (the empty space to the RIGHT of the last bar — i.e. the\n // future, where drawings should be anchorable just like in TradingView)\n // returns null. We fall back to the logical-index axis, which extends\n // infinitely, and extrapolate a synthetic time off the last bar using the\n // bar interval. Both directions share the same anchor + interval so a future\n // point round-trips (place → project) to the same pixel.\n timeToX: (t) => {\n const x = chart.timeScale().timeToCoordinate(t);\n if (x != null) return x;\n const raw = getRaw();\n if (raw.length === 0) return null;\n const sec = timeAsSec(t);\n if (sec == null) return null;\n const logical = logicalForSec(raw, sec);\n if (logical == null) return null;\n return logicalToX(chart, logical);\n },\n xToTime: (x) => {\n const t = chart.timeScale().coordinateToTime(x);\n if (t != null) return t;\n const raw = getRaw();\n if (raw.length === 0) return null;\n const logical = chart.timeScale().coordinateToLogical(x);\n const lastSec = timeAsSec(raw[raw.length - 1].time);\n if (logical == null || lastSec == null) return null;\n const iv = barIntervalSec(raw);\n if (iv <= 0) return null;\n return Math.round(lastSec + (logical - (raw.length - 1)) * iv) as Time;\n },\n barAt: (t) => nearestBar(getRaw(), t),\n timeToBarIndex: (t) => {\n const raw = getRaw();\n if (raw.length === 0) return null;\n const sec = timeAsSec(t);\n if (sec == null) return null;\n const lastIdx = raw.length - 1;\n const lastSec = timeAsSec(raw[lastIdx].time);\n const firstSec = timeAsSec(raw[0].time);\n const iv = barIntervalSec(raw);\n // Off-data: extrapolate against the nearest edge with the median interval.\n if (lastSec != null && sec > lastSec) return Math.round(lastIdx + (sec - lastSec) / iv);\n if (firstSec != null && sec < firstSec) return Math.round((sec - firstSec) / iv);\n // Within the loaded range: the nearest bar's index (handles gaps).\n let best = 0;\n let bestD = Infinity;\n for (let i = 0; i < raw.length; i++) {\n const bs = timeAsSec(raw[i].time);\n if (bs == null) continue;\n const d = Math.abs(bs - sec);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n },\n barIndexToTime: (i) => {\n const raw = getRaw();\n if (raw.length === 0) return null;\n if (i >= 0 && i < raw.length) return raw[i].time;\n const lastIdx = raw.length - 1;\n const lastSec = timeAsSec(raw[lastIdx].time);\n if (lastSec == null) return null;\n const iv = barIntervalSec(raw);\n return Math.round(lastSec + (i - lastIdx) * iv) as Time;\n },\n bars: getRaw,\n visibleTimeRange: () => {\n const r = chart.timeScale().getVisibleRange();\n if (!r) return null;\n const from = timeAsSec(r.from);\n const to = timeAsSec(r.to);\n return from == null || to == null ? null : { from, to };\n },\n indicatorValuesAt: (t) => getIndicatorValues(timeAsSec(t)),\n pipSize: () => {\n const pf = series.options().priceFormat;\n return pf && typeof pf.minMove === \"number\" && pf.minMove > 0 ? pf.minMove : 0.01;\n },\n addPriceLine: (opts) => series.createPriceLine(opts),\n removePriceLine: (line) => series.removePriceLine(line),\n zoomToScreenRect: (x1, x2, y1, y2) => {\n const ts = chart.timeScale();\n const la = ts.coordinateToLogical(Math.min(x1, x2));\n const lb = ts.coordinateToLogical(Math.max(x1, x2));\n if (la != null && lb != null && lb > la) ts.setVisibleLogicalRange({ from: la, to: lb });\n const pa = series.coordinateToPrice(y1);\n const pb = series.coordinateToPrice(y2);\n if (pa != null && pb != null) {\n const lo = Math.min(pa, pb);\n const hi = Math.max(pa, pb);\n if (hi > lo) {\n const ps = series.priceScale();\n ps.setAutoScale(false);\n ps.setVisibleRange({ from: lo, to: hi });\n }\n }\n },\n formatTime: (t) => {\n const f = chart.options().localization.timeFormatter;\n if (f) return f(t);\n // No host formatter: a crosshair-like label, \"29 Oct '25 13:30\" (the\n // time only when the time scale shows it), in the chart locale, UTC.\n const sec = timeAsSec(t);\n if (sec == null) return String(t);\n const o = chart.options();\n const d = new Date(sec * 1000);\n const mon = new Intl.DateTimeFormat(o.localization.locale, { month: \"short\", timeZone: \"UTC\" }).format(d);\n const date = `${d.getUTCDate()} ${mon} '${String(d.getUTCFullYear() % 100).padStart(2, \"0\")}`;\n if (!o.timeScale.timeVisible) return date;\n const two = (n: number) => String(n).padStart(2, \"0\");\n const time = `${two(d.getUTCHours())}:${two(d.getUTCMinutes())}${o.timeScale.secondsVisible ? `:${two(d.getUTCSeconds())}` : \"\"}`;\n return `${date} ${time}`;\n },\n timeInfo: () => getTimeInfo(),\n timeAxis: () => {\n const l = chart.options().layout;\n return { height: chart.timeScale().height(), width: chart.timeScale().width(), fontSize: l.fontSize, fontFamily: l.fontFamily };\n },\n };\n}\n\nfunction timeAsSec(t: Time): number | null {\n if (typeof t === \"number\") return t;\n if (typeof t === \"string\") {\n const ms = Date.parse(t);\n return Number.isFinite(ms) ? ms / 1000 : null;\n }\n if (typeof t === \"object\" && t !== null && \"year\" in t) {\n return Date.UTC(t.year, t.month - 1, t.day) / 1000;\n }\n return null;\n}\n\n/** Median spacing (in seconds) between consecutive bars, used to extrapolate a\n * time for off-data (future) coordinates. Sampled from the tail so the live\n * interval wins even if older history was a different resolution; median shrugs\n * off weekend/holiday gaps. Falls back to one day when too little data. */\nfunction barIntervalSec(raw: OHLC[]): number {\n if (raw.length < 2) return 86400;\n const deltas: number[] = [];\n for (let i = Math.max(1, raw.length - 50); i < raw.length; i++) {\n const a = timeAsSec(raw[i - 1].time);\n const b = timeAsSec(raw[i].time);\n if (a != null && b != null && b > a) deltas.push(b - a);\n }\n if (deltas.length === 0) return 86400;\n deltas.sort((x, y) => x - y);\n return deltas[Math.floor(deltas.length / 2)];\n}\n\n/** Fractional logical index (0 = first loaded bar) for an arbitrary time.\n * `timeToCoordinate` only resolves times that land exactly on a bar, so a\n * finer-resolution time (e.g. a minute anchor shown on a daily chart) lands\n * here. Within the loaded range we interpolate between the two bracketing\n * bars' integer positions — this honours real gaps (weekends/holidays), so a\n * drawing keeps its place across timeframes. Only off-data (before the first\n * or after the last bar) do we extrapolate with the median interval, since\n * there are no real bars to interpolate against. */\nfunction logicalForSec(raw: OHLC[], sec: number): number | null {\n const n = raw.length;\n const firstSec = timeAsSec(raw[0].time);\n const lastSec = timeAsSec(raw[n - 1].time);\n if (firstSec == null || lastSec == null) return null;\n if (sec >= lastSec) {\n const iv = barIntervalSec(raw);\n return iv > 0 ? n - 1 + (sec - lastSec) / iv : null;\n }\n if (sec <= firstSec) {\n const iv = barIntervalSec(raw);\n return iv > 0 ? (sec - firstSec) / iv : null;\n }\n // In range: binary-search the last bar at or before `sec`, then interpolate.\n let lo = 0;\n let hi = n - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n const ms = timeAsSec(raw[mid].time);\n if (ms != null && ms <= sec) lo = mid;\n else hi = mid - 1;\n }\n const aSec = timeAsSec(raw[lo].time);\n const bSec = lo + 1 < n ? timeAsSec(raw[lo + 1].time) : null;\n if (aSec == null) return lo;\n if (bSec == null || bSec <= aSec) return lo;\n return lo + (sec - aSec) / (bSec - aSec);\n}\n\n/** Pixel x for a (possibly fractional) logical index. lightweight-charts'\n * `logicalToCoordinate` only returns a correct value for *integer* indices —\n * a fractional index yields 0 — so we interpolate linearly between the two\n * bracketing integer indices. The logical axis is uniform in pixels, so this\n * is exact and gives sub-bar precision (e.g. an intraday time placed partway\n * through a daily bar). */\nfunction logicalToX(chart: IChartApi, logical: number): number | null {\n const ts = chart.timeScale();\n const lo = Math.floor(logical);\n const cLo = ts.logicalToCoordinate(lo as Logical);\n if (cLo == null) return null;\n const frac = logical - lo;\n if (frac === 0) return cLo;\n const cHi = ts.logicalToCoordinate((lo + 1) as Logical);\n if (cHi == null) return cLo;\n return cLo + frac * (cHi - cLo);\n}\n\n/** Shared time→x with the off-bar fallback, for non-drawing renderers (event\n * markers, etc.) that paint at arbitrary times. Mirrors the `timeToX` method:\n * try lightweight-charts' exact mapping first, then the gap-aware logical\n * interpolation. `sec` is UNIX seconds. Returns null with no data. */\nexport function timeToXFallback(chart: IChartApi, sec: number, bars: OHLC[]): number | null {\n if (bars.length === 0) return null;\n const logical = logicalForSec(bars, sec);\n if (logical == null) return null;\n return logicalToX(chart, logical);\n}\n\nfunction nearestBar(raw: OHLC[], t: Time): OHLC | null {\n if (raw.length === 0) return null;\n const ts = timeAsSec(t);\n if (ts == null) return raw[0];\n let best = raw[0];\n let bestD = Infinity;\n for (const b of raw) {\n const bs = timeAsSec(b.time);\n if (bs == null) continue;\n const d = Math.abs(bs - ts);\n if (d < bestD) {\n best = b;\n bestD = d;\n }\n }\n return best;\n}\n","/*\n * Canvas renderer of the drawing scenes (src/tv/scene): every scene item to\n * CanvasRenderingContext2D calls, in CSS pixels (the caller scales the\n * context for the device pixel ratio). The semantics follow SVG, so a scene\n * drawn here matches the same scene drawn as SVG by a host (OpenTrader\n * scene-svg): default fill black, default stroke none, stroke width 1, butt\n * caps / miter joins, even-odd cut-out clips, text anchors / baselines,\n * collapsed white space unless `pre`, images kept in aspect unless\n * `stretch`.\n */\nimport type { Pt } from \"../tv/_shared\";\nimport { HANDLE_RADIUS } from \"../tv/_shared\";\nimport type { Paint, SceneItem, Shadow } from \"../tv/scene/types\";\n\n/** TV anchor ring colour (colorsPalette \"color-tv-blue-600\"), the same for\n * every drawing. */\nexport const TV_ANCHOR_COLOR = \"#1e53e5\";\n\nexport type AnchorStyle = {\n /** Chart background at a y (the anchor fill). */\n fillAt: (y: number) => string;\n /** The owner drawing is selected (TV: ring stroke 2, else 1). */\n selected: boolean;\n /** Index of the hovered anchor in its anchors item (TV 20% halo), or -1. */\n hovered?: number;\n};\n\nexport type CanvasSceneOptions = {\n /** Font family of scene text without its own family (the chart font). */\n fontFamily: string;\n anchors: AnchorStyle;\n /** Called when an image / glyph used by the scene finishes loading (the\n * caller redraws). */\n onAsyncLoad?: () => void;\n};\n\ntype Ctx = CanvasRenderingContext2D;\ntype Named = { clips: Map<string, (ctx: Ctx) => void>; grads: Map<string, CanvasGradient> };\n\n/** Draws `items` on `ctx` (current transform = CSS pixels). */\nexport function drawScene(ctx: Ctx, items: SceneItem[], o: CanvasSceneOptions): void {\n const named: Named = { clips: new Map(), grads: new Map() };\n for (const it of items) drawItem(ctx, it, o, named);\n}\n\nfunction drawItem(ctx: Ctx, it: SceneItem, o: CanvasSceneOptions, named: Named): void {\n switch (it.t) {\n case \"clip\": {\n // Cut-out: everything outside the polygons (even-odd with a huge rect).\n const polys = it.polys;\n named.clips.set(it.name, (c) => {\n const B = 1e5;\n const p = new Path2D();\n p.rect(-B, -B, 2 * B, 2 * B);\n for (const pl of polys) {\n if (!pl.length) continue;\n p.moveTo(pl[0].x, pl[0].y);\n for (let i = 1; i < pl.length; i++) p.lineTo(pl[i].x, pl[i].y);\n p.closePath();\n }\n c.clip(p, \"evenodd\");\n });\n return;\n }\n case \"clipRect\": {\n const { x, y, w, h } = it;\n named.clips.set(it.name, (c) => {\n const p = new Path2D();\n p.rect(x, y, w, h);\n c.clip(p);\n });\n return;\n }\n case \"radialGradient\": {\n const g = ctx.createRadialGradient(it.cx, it.cy, 0, it.cx, it.cy, it.r);\n for (const st of it.stops) g.addColorStop(st.offset, withAlpha(st.color, st.opacity));\n named.grads.set(it.name, g);\n return;\n }\n case \"hit\":\n case \"hitPath\":\n return;\n case \"anchors\":\n drawAnchors(ctx, it.pts, it.squares, o.anchors);\n return;\n }\n const clip = \"clip\" in it && it.clip ? named.clips.get(it.clip) : undefined;\n const needSave = !!clip || it.t === \"group\" || (\"transform\" in it && !!it.transform);\n if (needSave) ctx.save();\n if (clip) clip(ctx);\n switch (it.t) {\n case \"line\": {\n const p = new Path2D();\n p.moveTo(it.a.x, it.a.y);\n p.lineTo(it.b.x, it.b.y);\n paint(ctx, p, it, named, false);\n break;\n }\n case \"polyline\":\n case \"polygon\": {\n const p = new Path2D();\n it.pts.forEach((q, i) => (i === 0 ? p.moveTo(q.x, q.y) : p.lineTo(q.x, q.y)));\n if (it.t === \"polygon\" && it.pts.length) p.closePath();\n paint(ctx, p, it, named, true);\n break;\n }\n case \"path\": {\n if (it.transform) applyTransform(ctx, it.transform);\n paint(ctx, new Path2D(it.d), it, named, true);\n break;\n }\n case \"rect\": {\n if (it.w < 0 || it.h < 0) break;\n const p = new Path2D();\n const rx = Math.min(it.rx ?? it.ry ?? 0, it.w / 2);\n const ry = Math.min(it.ry ?? it.rx ?? 0, it.h / 2);\n if (rx > 0 || ry > 0) roundRect(p, it.x, it.y, it.w, it.h, rx, ry);\n else p.rect(it.x, it.y, it.w, it.h);\n paint(ctx, p, it, named, true);\n break;\n }\n case \"circle\": {\n if (it.r <= 0) break;\n const p = new Path2D();\n p.arc(it.cx, it.cy, it.r, 0, Math.PI * 2);\n paint(ctx, p, it, named, true);\n break;\n }\n case \"ellipse\": {\n if (it.transform) applyTransform(ctx, it.transform);\n if (it.rx <= 0 || it.ry <= 0) break;\n const p = new Path2D();\n p.ellipse(it.cx, it.cy, it.rx, it.ry, 0, 0, Math.PI * 2);\n paint(ctx, p, it, named, true);\n break;\n }\n case \"text\":\n drawText(ctx, it, o);\n break;\n case \"image\":\n drawImage(ctx, it, o);\n break;\n case \"glyph\":\n drawGlyph(ctx, it, o);\n break;\n case \"group\": {\n if (it.transform) applyTransform(ctx, it.transform);\n if (it.opacity != null && it.opacity < 1) {\n // SVG group opacity: the children composite as one layer, then the\n // layer is blended (overlapping children do not add up).\n const layer = groupLayer(ctx);\n if (layer) {\n for (const c of it.items) drawItem(layer, c, o, named);\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.globalAlpha *= it.opacity;\n ctx.drawImage(layer.canvas, 0, 0);\n ctx.restore();\n break;\n }\n ctx.globalAlpha *= it.opacity;\n }\n for (const c of it.items) drawItem(ctx, c, o, named);\n break;\n }\n }\n if (needSave) ctx.restore();\n}\n\n/** A cleared offscreen context the size of `ctx`'s canvas with the same\n * transform and clip-free state (group opacity layers). */\nfunction groupLayer(ctx: Ctx): Ctx | null {\n const w = ctx.canvas.width;\n const h = ctx.canvas.height;\n if (!w || !h) return null;\n const c = document.createElement(\"canvas\");\n c.width = w;\n c.height = h;\n const l = c.getContext(\"2d\");\n if (!l) return null;\n l.setTransform(ctx.getTransform());\n return l;\n}\n\n/** Fill then stroke a path with SVG paint rules (`closedFill`: the item\n * fills by default, as SVG shapes do; a line never fills). */\nfunction paint(ctx: Ctx, p: Path2D, it: Paint, named: Named, closedFill: boolean): void {\n const fill = it.fillRef ? named.grads.get(it.fillRef) ?? null : closedFill ? it.fill ?? \"#000000\" : null;\n const stroke = it.stroke;\n const shadow = it.shadow;\n if (fill && fill !== \"none\" && fill !== \"transparent\") {\n ctx.save();\n if (shadow) setShadow(ctx, shadow);\n ctx.globalAlpha *= it.fillOpacity ?? 1;\n ctx.fillStyle = fill;\n ctx.fill(p, it.fillRule === \"evenodd\" ? \"evenodd\" : \"nonzero\");\n ctx.restore();\n }\n if (stroke && stroke !== \"none\" && stroke !== \"transparent\") {\n const width = it.strokeWidth ?? 1;\n if (width <= 0) return;\n ctx.save();\n if (shadow && (!fill || fill === \"none\" || fill === \"transparent\")) setShadow(ctx, shadow);\n ctx.globalAlpha *= it.strokeOpacity ?? 1;\n ctx.strokeStyle = stroke;\n ctx.lineWidth = width;\n ctx.lineCap = it.cap ?? \"butt\";\n ctx.lineJoin = it.join ?? \"miter\";\n ctx.setLineDash(dashArray(it.dash));\n ctx.stroke(p);\n ctx.restore();\n }\n}\n\nfunction setShadow(ctx: Ctx, s: Shadow): void {\n ctx.shadowOffsetX = s.dx;\n ctx.shadowOffsetY = s.dy;\n ctx.shadowBlur = s.blur;\n ctx.shadowColor = s.color;\n}\n\nfunction dashArray(d: string | undefined): number[] {\n if (!d || d === \"none\") return [];\n const v = d.split(/[\\s,]+/).map(Number).filter((x) => Number.isFinite(x) && x >= 0);\n if (!v.length || v.every((x) => x === 0)) return [];\n return v.length % 2 ? [...v, ...v] : v;\n}\n\nfunction roundRect(p: Path2D, x: number, y: number, w: number, h: number, rx: number, ry: number): void {\n p.moveTo(x + rx, y);\n p.lineTo(x + w - rx, y);\n p.ellipse(x + w - rx, y + ry, rx, ry, 0, -Math.PI / 2, 0);\n p.lineTo(x + w, y + h - ry);\n p.ellipse(x + w - rx, y + h - ry, rx, ry, 0, 0, Math.PI / 2);\n p.lineTo(x + rx, y + h);\n p.ellipse(x + rx, y + h - ry, rx, ry, 0, Math.PI / 2, Math.PI);\n p.lineTo(x, y + ry);\n p.ellipse(x + rx, y + ry, rx, ry, 0, Math.PI, (3 * Math.PI) / 2);\n p.closePath();\n}\n\n/** SVG transform list: rotate(a [cx cy]), translate(x [y]), scale(x [y]),\n * matrix(a b c d e f). */\nfunction applyTransform(ctx: Ctx, t: string): void {\n const re = /(rotate|translate|scale|matrix)\\s*\\(([^)]*)\\)/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(t))) {\n const a = m[2].split(/[\\s,]+/).filter(Boolean).map(Number);\n switch (m[1]) {\n case \"rotate\": {\n const r = ((a[0] ?? 0) * Math.PI) / 180;\n if (a.length >= 3) {\n ctx.translate(a[1], a[2]);\n ctx.rotate(r);\n ctx.translate(-a[1], -a[2]);\n } else ctx.rotate(r);\n break;\n }\n case \"translate\":\n ctx.translate(a[0] ?? 0, a[1] ?? 0);\n break;\n case \"scale\":\n ctx.scale(a[0] ?? 1, a[1] ?? a[0] ?? 1);\n break;\n case \"matrix\":\n ctx.transform(a[0], a[1], a[2], a[3], a[4], a[5]);\n break;\n }\n }\n}\n\nfunction drawText(ctx: Ctx, it: Extract<SceneItem, { t: \"text\" }>, o: CanvasSceneOptions): void {\n const text = it.pre ? it.text : it.text.replace(/\\s+/g, \" \").trim();\n if (!text) return;\n ctx.save();\n if (it.opacity != null) ctx.globalAlpha *= it.opacity;\n const weight = it.weight === \"bold\" ? 700 : it.weight ?? 400;\n ctx.font = `${it.fontStyle === \"italic\" ? \"italic \" : \"\"}${weight} ${it.size}px ${it.family ?? o.fontFamily}`;\n ctx.textAlign = it.anchor === \"middle\" ? \"center\" : it.anchor === \"end\" ? \"right\" : \"left\";\n let y = it.y;\n if (it.baseline === \"central\") {\n // SVG central baseline: the alphabetic baseline sits (font ascent −\n // descent) / 2 below y (measured against Chrome's SVG, 25/09/2026; canvas\n // \"middle\" is 1-2 px higher).\n ctx.textBaseline = \"alphabetic\";\n y += centralShift(ctx);\n } else {\n // canvas \"middle\" = SVG \"middle\" within 0.5 px, \"hanging\" identical.\n ctx.textBaseline = it.baseline === \"middle\" ? \"middle\" : it.baseline === \"hanging\" ? \"hanging\" : \"alphabetic\";\n }\n ctx.fillStyle = it.fill ?? \"#000000\";\n ctx.fillText(text, it.x, y);\n ctx.restore();\n}\n\nconst centralShifts = new Map<string, number>();\n/** Alphabetic baseline offset of the SVG central baseline for ctx.font. */\nfunction centralShift(ctx: Ctx): number {\n let v = centralShifts.get(ctx.font);\n if (v == null) {\n const m = ctx.measureText(\"H\");\n v = (m.fontBoundingBoxAscent - m.fontBoundingBoxDescent) / 2;\n centralShifts.set(ctx.font, v);\n }\n return v;\n}\n\nconst images = new Map<string, HTMLImageElement>();\nfunction loadImage(src: string, o: CanvasSceneOptions): HTMLImageElement | null {\n let im = images.get(src);\n if (!im) {\n im = new Image();\n im.onload = () => o.onAsyncLoad?.();\n im.src = src;\n images.set(src, im);\n }\n return im.complete && im.naturalWidth > 0 ? im : null;\n}\n\nfunction drawImage(ctx: Ctx, it: Extract<SceneItem, { t: \"image\" }>, o: CanvasSceneOptions): void {\n if (!it.href) return;\n const im = loadImage(it.href, o);\n if (!im) return;\n ctx.save();\n if (it.opacity != null) ctx.globalAlpha *= it.opacity;\n if (it.stretch) ctx.drawImage(im, it.x, it.y, it.w, it.h);\n else {\n // SVG preserveAspectRatio xMidYMid meet.\n const k = Math.min(it.w / im.naturalWidth, it.h / im.naturalHeight);\n const w = im.naturalWidth * k;\n const h = im.naturalHeight * k;\n ctx.drawImage(im, it.x + (it.w - w) / 2, it.y + (it.h - h) / 2, w, h);\n }\n ctx.restore();\n}\n\n/** Font-icon glyph: an emoji / character centred in the box (font size\n * size − 4, as OpenTrader's host), or `<svg>` markup drawn as an image with\n * currentColor = the glyph colour. */\nfunction drawGlyph(ctx: Ctx, it: Extract<SceneItem, { t: \"glyph\" }>, o: CanvasSceneOptions): void {\n const g = it.glyph.trim();\n if (!g) return;\n if (g.startsWith(\"<svg\")) {\n let svg = g.replace(/currentColor/g, it.color);\n if (!/xmlns=/.test(svg)) svg = svg.replace(\"<svg\", '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n const im = loadImage(`data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`, o);\n if (im) ctx.drawImage(im, it.x, it.y, it.size, it.size);\n return;\n }\n ctx.save();\n ctx.font = `${it.size - 4}px ${o.fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = it.color;\n ctx.fillText(g, it.x + it.size / 2, it.y + it.size / 2);\n ctx.restore();\n}\n\n/** TV line anchors (LineAnchorRenderer): radius 6, ring in tv-blue-600\n * inside the radius, stroke 1 (2 when the drawing is selected), filled with\n * the chart background; one-axis anchors are rounded squares (corner 3);\n * the hovered anchor gets a 3px ring at 20% just outside. */\nfunction drawAnchors(ctx: Ctx, pts: Pt[], squares: readonly number[] | undefined, a: AnchorStyle): void {\n const sw = a.selected ? 2 : 1;\n pts.forEach((p, i) => {\n const square = !!squares?.includes(i);\n ctx.save();\n if (a.hovered === i) {\n ctx.strokeStyle = withAlpha(TV_ANCHOR_COLOR, 0.2);\n ctx.lineWidth = 3;\n const ring = new Path2D();\n if (square) roundRect(ring, p.x - HANDLE_RADIUS - 1.5, p.y - HANDLE_RADIUS - 1.5, 2 * HANDLE_RADIUS + 3, 2 * HANDLE_RADIUS + 3, 4.5, 4.5);\n else ring.arc(p.x, p.y, HANDLE_RADIUS + 1.5, 0, Math.PI * 2);\n ctx.stroke(ring);\n }\n const body = new Path2D();\n if (square) {\n const s = 2 * HANDLE_RADIUS - sw;\n roundRect(body, p.x - HANDLE_RADIUS + sw / 2, p.y - HANDLE_RADIUS + sw / 2, s, s, 3, 3);\n } else body.arc(p.x, p.y, HANDLE_RADIUS - sw / 2, 0, Math.PI * 2);\n ctx.fillStyle = a.fillAt(p.y);\n ctx.fill(body);\n ctx.strokeStyle = TV_ANCHOR_COLOR;\n ctx.lineWidth = sw;\n ctx.stroke(body);\n ctx.restore();\n });\n}\n\n/** A colour with its alpha multiplied by `k` (hex #rgb / #rrggbb / rgb(a)). */\nfunction withAlpha(c: string, k: number): string {\n if (k >= 1) return c;\n const h = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(c);\n if (h) {\n const s = h[1].length === 3 ? h[1].split(\"\").map((x) => x + x).join(\"\") : h[1];\n const n = parseInt(s, 16);\n return `rgba(${n >> 16}, ${(n >> 8) & 255}, ${n & 255}, ${k})`;\n }\n const r = /^rgba?\\(([^)]*)\\)$/i.exec(c);\n if (r) {\n const [R, G, B, A] = r[1].split(/[\\s,/]+/).filter(Boolean).map(Number);\n return `rgba(${R}, ${G}, ${B}, ${(A ?? 1) * k})`;\n }\n return c;\n}\n","/*\n * DrawingManager — the library runtime (port phase 3.3): TradingView-style\n * drawing tools on a lightweight-charts chart, built on the shared core\n * (src/tv). One series primitive draws every drawing, the placement preview\n * and the anchors in one canvas pass (scene -> canvas); the pointer / key\n * gestures reproduce OpenTrader's overlay with the core interaction functions\n * (placement, magnet, Shift constraints, anchor / body drags, hit tests).\n *\n * The host keeps what is not drawing logic: undo stack, storage, settings\n * dialogs, inline text / table editors, toolbar, context menu. It listens to\n * the events and calls the methods.\n */\nimport type { IChartApi, ISeriesApi, ISeriesPrimitive, ISeriesPrimitiveAxisView, IPrimitivePaneRenderer, IPrimitivePaneView, PrimitiveHoveredItem, SeriesAttachedParameter, SeriesType, Time } from \"lightweight-charts\";\nimport type { CanvasRenderingTarget2D } from \"fancy-canvas\";\nimport type { HitResult, Pt } from \"../tv/_shared\";\nimport type { Coords, OHLC } from \"../tv/coords\";\nimport { isVisibleOnInterval, type DataPoint, type Drawing, type DrawingKind, type NewDrawing } from \"../tv/types\";\nimport { defaultStyleFor, findOverlaySpec, type OverlaySpec } from \"../tv/specs\";\nimport { hitTestKind } from \"../tv/kinds/hit-tests\";\nimport { signpostPositionFor } from \"../tv/kinds/signpost\";\nimport { drawingAxisLabels } from \"../tv/kinds/axis-labels\";\nimport { tableCanRemove, tableEdgeOf, tableInsert, tableLayout, tableRemove, tableWithText, type TableCellRef, type TableUi } from \"../tv/kinds/table\";\nimport { drawingImageFailed, imageInitialSize, onImagesChanged } from \"../tv/kinds/images\";\nimport { sceneLockedAnchors, sceneOf } from \"../tv/scene\";\nimport type { Scene } from \"../tv/scene/types\";\nimport { parseDrawings } from \"../tv/serialize\";\nimport { DRAG_THRESHOLD, FREEHAND_SAMPLE_PX, MIN_DISTANCE_BETWEEN_POINTS } from \"../tv/interact/constants\";\nimport { magnetSnap, projectAll, projectPoint, screenPoints, snapAngle, translateDrawing, unproject } from \"../tv/interact/project\";\nimport { ANGLE_SNAP_3PT_KINDS, ANGLE_SNAP_KINDS, buildNewDrawing, finishPlacement, SEGMENT_PREVIEW_KINDS, snapGannSquare } from \"../tv/interact/placement\";\nimport { anchorCursor, applyDrag, type DragState } from \"../tv/interact/drag\";\nimport { toggleAnchored as toggleAnchoredDrawing } from \"../tv/interact/anchor\";\nimport { makeCoords } from \"./coords\";\nimport { drawScene } from \"./scene-canvas\";\n\nexport type MagnetMode = \"off\" | \"weak\" | \"strong\";\n\nexport type DrawingManagerOptions = {\n /** The bars of the series (magnet, data-driven tools, positions). Default:\n * the series data (OHLC series; line series use `value` for all four). */\n bars?: () => OHLC[];\n /** Chart font for the drawings' text. Default: the chart layout font. */\n fontFamily?: string;\n /** Magnet (TV weak / strong OHLC snap). Default \"off\". */\n magnet?: MagnetMode;\n /** Chart interval for the per-interval visibility of drawings (TV\n * Visibility tab), e.g. \"30\", \"1D\". Unset = every drawing shown. */\n interval?: string;\n /** Time zone / intraday flag for dates in labels. Default UTC, intraday. */\n timeInfo?: () => { timeZone: string; intraday: boolean };\n /** Keep the tool armed after a placement (TV \"Keep drawing\"). */\n stayInDrawingMode?: boolean;\n};\n\nexport type DrawingManagerEvents = {\n /** The drawing list changed (add / update / remove / import / clear). */\n change: (drawings: readonly Drawing[]) => void;\n add: (d: Drawing) => void;\n update: (d: Drawing, prev: Drawing) => void;\n remove: (d: Drawing) => void;\n selection: (ids: readonly string[]) => void;\n /** The armed tool changed (null = none). */\n tool: (kind: DrawingKind | null) => void;\n /** A text tool was placed (or double-clicked): the host opens its editor\n * at `screen` (pane coordinates) and calls update with the text. */\n textEdit: (d: Drawing, screen: Pt) => void;\n /** A drag / placement gesture ended (undo coalescing). */\n gestureEnd: () => void;\n /** A click on a cell of a selected table (TV in-place editing): the host\n * opens its editor over `box` (pane coordinates) and calls\n * setTableCellText; endTableEdit when it closes. */\n tableEdit: (d: Drawing, cell: TableCellRef, box: { left: number; top: number; width: number; height: number }) => void;\n};\n\nexport type TableOp = \"insert-column\" | \"insert-row\" | \"remove-row\" | \"remove-column\";\n\ntype Listeners = { [K in keyof DrawingManagerEvents]: Set<DrawingManagerEvents[K]> };\n\n/** Drag state of a pointer gesture on a drawing (the core DragState plus the\n * gesture's selection bookkeeping). */\ntype Gesture = DragState & { canDrag: boolean };\n\nconst newId = () => `dw_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\n\nexport class DrawingManager {\n private readonly chart: IChartApi;\n private readonly series: ISeriesApi<SeriesType>;\n private readonly opts: DrawingManagerOptions;\n private readonly coords: Coords;\n private readonly primitive: DrawingsPrimitive;\n private readonly el: HTMLElement;\n private readonly listeners: Listeners = { change: new Set(), add: new Set(), update: new Set(), remove: new Set(), selection: new Set(), tool: new Set(), textEdit: new Set(), gestureEnd: new Set(), tableEdit: new Set() };\n private list: Drawing[] = [];\n private selected: string[] = [];\n private hovered: { id: string; anchor: number } | null = null;\n private spec: OverlaySpec | null = null;\n private glyph: string | undefined;\n private pending: DataPoint[] = [];\n private cursor: Pt | null = null;\n private gesture: Gesture | null = null;\n /** TV table UI of the selected table: active cell, open editor, hovered\n * resize edge. */\n private tableUi: TableUi | null = null;\n /** Cursor over the hovered drawing (TV: pointer, move when selected,\n * resize cursors on anchors and table edges), null = the chart's own. */\n private hoverCursor: string | null = null;\n private shift = false;\n private ctrl = false;\n private savedScroll: { handleScroll: unknown; handleScale: unknown } | null = null;\n private readonly off: (() => void)[] = [];\n\n constructor(chart: IChartApi, series: ISeriesApi<SeriesType>, opts: DrawingManagerOptions = {}) {\n this.chart = chart;\n this.series = series;\n this.opts = { magnet: \"off\", ...opts };\n const bars = opts.bars ?? (() => seriesBars(series));\n this.coords = makeCoords(chart, series, bars, () => [], opts.timeInfo);\n this.primitive = new DrawingsPrimitive(this);\n series.attachPrimitive(this.primitive as ISeriesPrimitive<Time>);\n this.el = chart.chartElement();\n this.listen(this.el, \"pointerdown\", (e) => this.onPointerDown(e as PointerEvent), true);\n this.listen(this.el, \"pointermove\", (e) => this.onHover(e as PointerEvent));\n this.listen(this.el, \"pointerleave\", () => { this.hoverCursor = null; this.setHover(null); });\n this.listen(this.el, \"dblclick\", (e) => this.onDoubleClick(e as MouseEvent), true);\n this.listen(window, \"keydown\", (e) => this.onKey(e as KeyboardEvent));\n this.listen(window, \"keyup\", (e) => this.onKey(e as KeyboardEvent));\n this.listen(window, \"blur\", () => { this.shift = false; this.ctrl = false; });\n // Images load asynchronously (core image cache, filled by the host's\n // reader): redraw, and drop an image drawing whose file failed (TV).\n this.off.push(onImagesChanged(() => {\n for (const d of this.list) if (d.kind === \"image\" && drawingImageFailed(d.image?.name)) this.remove(d.id);\n this.redraw();\n }));\n }\n\n // ── public API ────────────────────────────────────────────────────────────\n\n on<K extends keyof DrawingManagerEvents>(event: K, cb: DrawingManagerEvents[K]): () => void {\n (this.listeners[event] as Set<DrawingManagerEvents[K]>).add(cb);\n return () => (this.listeners[event] as Set<DrawingManagerEvents[K]>).delete(cb);\n }\n\n /** Arm a tool (a DrawingKind of the core specs) or disarm (null). `glyph`:\n * the font-icon glyph to place. */\n setTool(kind: DrawingKind | null, o: { glyph?: string } = {}): void {\n const spec = kind ? findOverlaySpec(kind) ?? null : null;\n this.spec = spec;\n this.glyph = o.glyph;\n this.pending = [];\n this.cursor = null;\n this.emit(\"tool\", spec ? spec.kind : null);\n this.redraw();\n }\n tool(): DrawingKind | null {\n return this.spec?.kind ?? null;\n }\n setMagnet(mode: MagnetMode): void {\n this.opts.magnet = mode;\n }\n setInterval(interval: string | undefined): void {\n this.opts.interval = interval;\n this.redraw();\n }\n setStayInDrawingMode(on: boolean): void {\n this.opts.stayInDrawingMode = on;\n }\n\n drawings(): readonly Drawing[] {\n return this.list;\n }\n get(id: string): Drawing | undefined {\n return this.list.find((d) => d.id === id);\n }\n /** Add a drawing (default style of its kind when none); returns its id. */\n add(nd: NewDrawing | Drawing): string {\n const d = { id: newId(), style: defaultStyleFor(nd.kind), ...nd } as Drawing;\n this.list = [...this.list, d];\n this.emit(\"add\", d);\n this.changed();\n return d.id;\n }\n update(d: Drawing): void {\n const prev = this.get(d.id);\n if (!prev) return;\n this.list = this.list.map((x) => (x.id === d.id ? d : x));\n this.emit(\"update\", d, prev);\n this.changed();\n }\n remove(id: string): void {\n const d = this.get(id);\n if (!d) return;\n this.list = this.list.filter((x) => x.id !== id);\n if (this.selected.includes(id)) this.select(this.selected.filter((x) => x !== id));\n this.emit(\"remove\", d);\n this.changed();\n }\n clear(): void {\n this.list = [];\n this.select([]);\n this.changed();\n }\n /** Z-order (TV Visual order): the list order is the draw order. */\n bringToFront(id: string): void {\n this.reorder(id, this.list.length - 1);\n }\n sendToBack(id: string): void {\n this.reorder(id, 0);\n }\n\n select(ids: readonly string[]): void {\n this.selected = ids.filter((id) => this.get(id));\n if (this.tableUi && !this.selected.includes(this.tableUi.id)) this.tableUi = null;\n this.emit(\"selection\", this.selected);\n this.redraw();\n }\n selection(): readonly string[] {\n return this.selected;\n }\n\n /** TV image: placed at the pane centre at its initial size (a quarter of\n * the pane at most) and selected. The file must be known to the core\n * image cache (cacheImage / setImageReader) under `name`. */\n addImage(img: { name: string; width: number; height: number; transparency?: number }): string | null {\n const { w, h } = this.paneSize();\n const dp = unproject(this.coords, { x: w / 2, y: h / 2 });\n if (!dp) return null;\n const style = defaultStyleFor(\"image\");\n const id = this.add({\n kind: \"image\",\n points: [dp],\n image: { name: img.name, ...imageInitialSize(img.width, img.height, w, h) },\n style: { ...style, transparency: img.transparency ?? style.transparency },\n } as NewDrawing);\n this.select([id]);\n return id;\n }\n\n /** TV \"Anchor drawing\" (text, pin, table): an anchored drawing keeps its\n * pane position when the chart scrolls; toggling back turns it into a\n * time / price point again. Returns whether the drawing changed. */\n toggleAnchored(id: string): boolean {\n const d = this.get(id);\n if (!d) return false;\n const next = toggleAnchoredDrawing(d, this.coords, this.paneSize());\n if (!next) return false;\n this.update(next);\n this.emit(\"gestureEnd\");\n return true;\n }\n\n /** The table UI state (active cell, editor open, hovered edge) or null. */\n tableState(): TableUi | null {\n return this.tableUi;\n }\n setTableCellText(id: string, cell: TableCellRef, text: string): void {\n const d = this.get(id);\n if (d?.kind !== \"table\") return;\n this.update({ ...d, style: { ...d.style, ...tableWithText(d.style, cell, text) } } as Drawing);\n }\n /** The cell editor closed (the cell stays active). */\n endTableEdit(): void {\n if (this.tableUi) this.tableUi = { ...this.tableUi, editing: false };\n this.redraw();\n }\n /** TV table context actions on the active cell (insert after it, or at the\n * end without one; remove its row / column). */\n tableOp(id: string, op: TableOp): void {\n const d = this.get(id);\n if (d?.kind !== \"table\") return;\n const cell = this.tableUi?.id === id ? this.tableUi.cell : null;\n if (op === \"insert-column\" || op === \"insert-row\") {\n this.update({ ...d, style: { ...d.style, ...tableInsert(d.style, op === \"insert-row\" ? \"row\" : \"column\", cell) } } as Drawing);\n } else {\n const kind = op === \"remove-row\" ? \"row\" : \"column\";\n if (!cell || !tableCanRemove(d.style, kind)) return;\n const r = tableRemove(d.style, kind, cell);\n this.update({ ...d, style: { ...d.style, ...r.patch } } as Drawing);\n this.tableUi = { id, cell: r.cell, editing: this.tableUi?.editing ?? false, edge: null };\n }\n this.emit(\"gestureEnd\");\n }\n\n /** The drawings as JSON (the core Drawing model). */\n exportJSON(): string {\n return JSON.stringify(this.list);\n }\n /** Replace the drawings from JSON (string or parsed): entries are checked\n * and migrated (core parseDrawings); returns how many were loaded. */\n importJSON(json: string | unknown): number {\n const parsed = typeof json === \"string\" ? JSON.parse(json) : json;\n this.list = parseDrawings(parsed);\n this.select([]);\n this.changed();\n return this.list.length;\n }\n\n /** Redraw on the next frame (the chart repaints the primitive). */\n redraw(): void {\n this.primitive.requestUpdate();\n }\n\n destroy(): void {\n this.endGesture();\n for (const f of this.off) f();\n this.series.detachPrimitive(this.primitive as ISeriesPrimitive<Time>);\n }\n\n // ── rendering (called by the primitive) ─────────────────────────────────\n\n /** Every visible drawing, then the placement preview, as scenes in pane\n * coordinates, with the anchor state of their drawing (TV ring stroke 2\n * when selected, the hovered anchor's halo). */\n scenes(w: number, h: number): { scene: Scene; selected: boolean; hoveredAnchor: number }[] {\n const out: { scene: Scene; selected: boolean; hoveredAnchor: number }[] = [];\n const c = this.coords;\n const pane = { w, h };\n for (const d of this.list) {\n if (!this.shown(d)) continue;\n const pts = screenPoints(c, d, pane);\n if (!pts) continue;\n const sel = this.selected.includes(d.id);\n const hov = this.hovered?.id === d.id && !d.locked;\n // TV shows a drawing's anchors on hover too; locked drawings and an\n // armed tool keep hover feedback off.\n const active = sel || (hov && !this.spec);\n const tableUi = d.kind === \"table\" && sel && this.tableUi?.id === d.id ? this.tableUi : null;\n const scene = sceneOf(d, pts, { w, h, coords: c, selected: active && !d.locked, hovered: hov, textSelected: sel, tableUi });\n out.push({ scene, selected: sel, hoveredAnchor: hov ? this.hovered!.anchor : -1 });\n if (sel && d.locked) out.push({ scene: sceneLockedAnchors(pts, d.style.color), selected: sel, hoveredAnchor: -1 });\n }\n const p = this.previewScene(w, h);\n if (p) out.push({ scene: p, selected: false, hoveredAnchor: -1 });\n return out;\n }\n /** Axis labels of the visible drawings (core drawingAxisLabels) as\n * lightweight-charts axis views: prices formatted by the series, times by\n * the chart's time formatter. */\n axisViews(): { price: ISeriesPrimitiveAxisView[]; time: ISeriesPrimitiveAxisView[] } {\n const price: ISeriesPrimitiveAxisView[] = [];\n const time: ISeriesPrimitiveAxisView[] = [];\n const c = this.coords;\n const pane = this.paneSize();\n const fmt = this.series.priceFormatter();\n for (const d of this.list) {\n if (!this.shown(d)) continue;\n const pts = screenPoints(c, d, pane);\n if (!pts) continue;\n const l = drawingAxisLabels(d, pts, c);\n for (const p of l.price) {\n const y = c.priceToY(p.price);\n if (y != null) price.push(axisView(y, fmt.format(p.price), p.back, p.color));\n }\n for (const t of l.time) {\n const x = c.timeToX(t.time);\n if (x != null) time.push(axisView(x, c.formatTime(t.time), t.back, t.color));\n }\n }\n return { price, time };\n }\n /** The cursor at a pane point, for the primitive hitTest (lightweight-\n * charts shows it): crosshair while a tool is armed, the hovered\n * drawing's cursor, else null (the chart's own). */\n hoveredId(): string | null {\n return this.hovered?.id ?? null;\n }\n cursorAt(): string | null {\n if (this.spec) return \"crosshair\";\n if (this.gesture?.active) return this.gesture.mode.hit === \"body\" ? \"move\" : this.hoverCursor;\n return this.hoverCursor;\n }\n fontFamily(): string {\n return this.opts.fontFamily ?? this.chart.options().layout.fontFamily;\n }\n /** Chart background at a y (the anchor fill). */\n backgroundAt(y: number, h: number): string {\n const bg = this.chart.options().layout.background as { type?: string; color?: string; topColor?: string; bottomColor?: string };\n if (bg.type === \"gradient\" && bg.topColor && bg.bottomColor) return mixHex(bg.topColor, bg.bottomColor, h > 0 ? Math.max(0, Math.min(1, y / h)) : 0);\n return bg.color ?? \"#ffffff\";\n }\n\n // ── internals ─────────────────────────────────────────────────────────────\n\n private listen(t: EventTarget, type: string, f: (e: Event) => void, capture = false): void {\n t.addEventListener(type, f, capture);\n this.off.push(() => t.removeEventListener(type, f, capture));\n }\n private emit<K extends keyof DrawingManagerEvents>(event: K, ...args: Parameters<DrawingManagerEvents[K]>): void {\n for (const cb of this.listeners[event]) (cb as (...a: unknown[]) => void)(...args);\n }\n private changed(): void {\n this.emit(\"change\", this.list);\n this.redraw();\n }\n private reorder(id: string, to: number): void {\n const i = this.list.findIndex((d) => d.id === id);\n if (i < 0) return;\n const next = this.list.slice();\n const [d] = next.splice(i, 1);\n next.splice(Math.max(0, Math.min(next.length, to)), 0, d);\n this.list = next;\n this.changed();\n }\n private shown(d: Drawing): boolean {\n return !d.hidden && (this.opts.interval == null || isVisibleOnInterval(d.visibility, this.opts.interval));\n }\n private paneSize(): { w: number; h: number } {\n const idx = this.series.getPane().paneIndex();\n const s = this.chart.paneSize(idx);\n return { w: s.width, h: s.height };\n }\n /** Pointer position in pane coordinates. */\n private panePoint(e: MouseEvent): Pt {\n const paneEl = this.series.getPane().getHTMLElement();\n const r = (paneEl ?? this.el).getBoundingClientRect();\n const left = this.chart.priceScale(\"left\").width();\n const chartLeft = this.el.getBoundingClientRect().left;\n return { x: e.clientX - chartLeft - left, y: e.clientY - r.top };\n }\n private magnet(): { enabled: boolean; mode: \"weak\" | \"strong\" } {\n const m = this.opts.magnet ?? \"off\";\n const mode = m === \"strong\" ? \"strong\" : \"weak\";\n // TV: Shift forces the magnet off; Ctrl / Cmd inverts it (off -> strong).\n if (this.shift) return { enabled: false, mode };\n if (this.ctrl) return { enabled: m === \"off\", mode: \"strong\" };\n return { enabled: m !== \"off\", mode };\n }\n private snapFn(): (p: DataPoint) => DataPoint {\n const m = this.magnet();\n const c = this.coords;\n return m.enabled ? (p) => magnetSnap(p, c, m.mode, false) ?? p : (p) => p;\n }\n private dataAt(p: Pt): DataPoint | null {\n const dp = unproject(this.coords, p);\n return dp ? this.snapFn()(dp) : null;\n }\n /** The magnet-snapped aim point of the preview (x and y lock onto the\n * candle when the magnet engages). */\n private aimAt(cur: Pt): Pt {\n const m = this.magnet();\n if (!m.enabled) return cur;\n const dp = unproject(this.coords, cur);\n const snapped = dp ? magnetSnap(dp, this.coords, m.mode, false) : null;\n return (snapped && projectPoint(this.coords, snapped)) || cur;\n }\n\n private hitTopmost(sp: Pt): { drawing: Drawing; mode: HitResult; pts: Pt[] } | null {\n const { w, h } = this.paneSize();\n // Drawings are clipped to the pane (TV): nothing hits over the axes.\n if (sp.x < 0 || sp.x > w || sp.y < 0 || sp.y > h) return null;\n for (let i = this.list.length - 1; i >= 0; i--) {\n const d = this.list[i];\n if (!this.shown(d)) continue;\n const pts = screenPoints(this.coords, d, { w, h });\n if (!pts) continue;\n const r = hitTestKind(d, pts, sp, w, h, this.coords, this.selected.includes(d.id));\n if (r) return { drawing: d, mode: r, pts };\n }\n return null;\n }\n\n private setHover(h: { id: string; anchor: number } | null): void {\n if (this.hovered?.id === h?.id && this.hovered?.anchor === h?.anchor) return;\n this.hovered = h;\n this.redraw();\n }\n\n /** Take the pointer gesture from the chart: no pan / zoom until release. */\n private holdChart(): void {\n if (this.savedScroll) return;\n // options() returns live objects: copy them before switching off.\n const o = this.chart.options() as unknown as { handleScroll: unknown; handleScale: unknown };\n this.savedScroll = { handleScroll: structuredClone(o.handleScroll), handleScale: structuredClone(o.handleScale) };\n this.chart.applyOptions({ handleScroll: false, handleScale: false });\n }\n private releaseChart(): void {\n if (!this.savedScroll) return;\n this.chart.applyOptions(this.savedScroll as never);\n this.savedScroll = null;\n }\n\n private onKey(e: KeyboardEvent): void {\n const down = e.type === \"keydown\";\n if (e.key === \"Shift\") this.shift = down;\n else if (e.key === \"Control\" || e.key === \"Meta\") this.ctrl = down;\n if (!down) return;\n const t = e.target as HTMLElement | null;\n if (t && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)) return;\n if (e.key === \"Escape\") {\n // TV cascade: pending points -> the armed tool -> the selection.\n if (this.pending.length) {\n this.pending = [];\n this.redraw();\n } else if (this.spec) this.setTool(null);\n else if (this.selected.length) this.select([]);\n else return;\n e.preventDefault();\n } else if ((e.key === \"Delete\" || e.key === \"Backspace\") && this.selected.length) {\n const ids = this.selected.filter((id) => !this.get(id)?.locked);\n if (!ids.length) return;\n for (const id of ids) this.remove(id);\n e.preventDefault();\n }\n }\n\n private onHover(e: PointerEvent): void {\n if (this.gesture || e.buttons) return;\n const sp = this.panePoint(e);\n if (this.spec) {\n this.cursor = sp;\n this.redraw();\n return;\n }\n const hit = this.hitTopmost(sp);\n this.setHover(hit ? { id: hit.drawing.id, anchor: hit.mode.hit === \"handle\" ? hit.mode.handleIndex : -1 } : null);\n // TV table: the hovered row / column edge of the selected table.\n const edge = hit?.drawing.kind === \"table\" && hit.mode.hit === \"handle\" ? tableEdgeOf(hit.mode.handleIndex) : null;\n const ui = this.tableUi;\n if (hit?.drawing.kind === \"table\" && this.selected.includes(hit.drawing.id)) {\n if ((ui?.edge?.row ?? -1) !== (edge?.row ?? -1) || (ui?.edge?.col ?? -1) !== (edge?.col ?? -1) || ui?.id !== hit.drawing.id) {\n this.tableUi = ui && ui.id === hit.drawing.id ? { ...ui, edge } : { id: hit.drawing.id, cell: null, editing: false, edge };\n this.redraw();\n }\n } else if (ui?.edge) {\n this.tableUi = { ...ui, edge: null };\n this.redraw();\n }\n this.hoverCursor = !hit\n ? null\n : hit.drawing.locked\n ? \"default\"\n : edge\n ? edge.col != null && edge.row != null ? \"default\" : edge.col != null ? \"ew-resize\" : \"ns-resize\"\n : hit.mode.hit === \"handle\"\n ? anchorCursor(hit.pts[hit.mode.handleIndex] ?? sp, hit.pts)\n : this.selected.includes(hit.drawing.id) ? \"move\" : \"pointer\";\n }\n\n private onPointerDown(e: PointerEvent): void {\n if (e.button !== 0) return;\n const sp = this.panePoint(e);\n const { w, h } = this.paneSize();\n if (sp.x < 0 || sp.x > w || sp.y < 0 || sp.y > h) return;\n if (this.spec) {\n e.stopPropagation();\n this.holdChart();\n if (this.spec.freehand) this.startFreehand(sp);\n else {\n this.placementClick(sp);\n window.addEventListener(\"pointerup\", () => this.releaseChart(), { once: true });\n }\n return;\n }\n this.selectionDown(e, sp);\n }\n\n private onDoubleClick(e: MouseEvent): void {\n // Variable-length tools (polyline / path / ghost feed): a double-click\n // finishes the drawing.\n if (this.spec?.variableLength) {\n e.stopPropagation();\n this.finishVariable(false);\n return;\n }\n if (this.spec) return;\n const hit = this.hitTopmost(this.panePoint(e));\n if (hit && findOverlaySpec(hit.drawing.kind)?.textEditable) {\n e.stopPropagation();\n this.emit(\"textEdit\", hit.drawing, textAnchor(hit.drawing, hit.pts));\n }\n }\n\n private placementClick(spRaw: Pt): void {\n const spec = this.spec!;\n // TV image: placed by the host (file dialog), not by a click.\n if (spec.kind === \"image\") return;\n let sp = spRaw;\n const pend = this.pending;\n const c = this.coords;\n // Shift: 45-degree steps from the first anchor (2-point line tools), from\n // the previous anchor (3-point tools), a square for bbox tools (TV).\n if (this.shift && pend.length === 1 && spec.pointCount === 2 && ANGLE_SNAP_KINDS.has(spec.kind)) {\n const o = projectPoint(c, pend[0]);\n if (o) sp = snapAngle(o, sp);\n }\n if (this.shift && pend.length >= 1 && ANGLE_SNAP_3PT_KINDS.has(spec.kind)) {\n const o = projectPoint(c, pend[pend.length - 1]);\n if (o) sp = snapAngle(o, sp);\n }\n if (this.shift && pend.length === 1 && spec.isBbox) {\n const o = projectPoint(c, pend[0]);\n if (o) {\n const dx = sp.x - o.x;\n const dy = sp.y - o.y;\n const m = Math.max(Math.abs(dx), Math.abs(dy));\n sp = { x: o.x + Math.sign(dx || 1) * m, y: o.y + Math.sign(dy || 1) * m };\n }\n }\n // Variable length (TV addPoint): a click on the last vertex finishes, on\n // the first vertex of a polyline closes it.\n if (spec.variableLength && pend.length >= 1) {\n const near = (v: DataPoint) => {\n const p = projectPoint(c, v);\n return !!p && Math.hypot(p.x - sp.x, p.y - sp.y) < MIN_DISTANCE_BETWEEN_POINTS;\n };\n if (near(pend[pend.length - 1])) {\n if (pend.length >= 2) this.finishVariable(false);\n return;\n }\n if (spec.kind === \"polyline\" && pend.length >= 2 && near(pend[0])) {\n this.finishVariable(true);\n return;\n }\n }\n const dp = this.dataAt(sp);\n if (!dp) return;\n const next = [...pend, dp];\n if (spec.variableLength || next.length < spec.pointCount) {\n this.pending = next;\n this.cursor = sp;\n this.redraw();\n return;\n }\n const { w, h } = this.paneSize();\n let placed = finishPlacement(spec.kind, next, c, { w, h }, { glyph: this.glyph });\n // TV signpost addPoint: the click height sets the label position.\n if (placed && spec.kind === \"signpost\") {\n placed = { ...placed, style: { ...defaultStyleFor(\"signpost\"), signpostPosition: signpostPositionFor(c, next[0], h) } } as NewDrawing;\n }\n this.pending = [];\n this.cursor = null;\n if (placed) this.placeNew(placed, spec.textEditable ? sp : null);\n else this.afterPlacement();\n }\n\n private finishVariable(closed: boolean): void {\n const spec = this.spec;\n if (!spec?.variableLength || this.pending.length < 2) return;\n const { w, h } = this.paneSize();\n const placed = finishPlacement(spec.kind, this.pending, this.coords, { w, h }, { closed });\n this.pending = [];\n this.cursor = null;\n if (placed) this.placeNew(placed, null);\n else this.afterPlacement();\n }\n\n /** TV selects every new drawing once placed; text tools ask the host for\n * their editor. */\n private placeNew(nd: NewDrawing, textAt: Pt | null): void {\n const id = this.add(nd);\n if (!this.opts.stayInDrawingMode) this.select([id]);\n const d = this.get(id);\n if (d && textAt) this.emit(\"textEdit\", d, textAt);\n this.afterPlacement();\n }\n private afterPlacement(): void {\n this.emit(\"gestureEnd\");\n if (!this.opts.stayInDrawingMode) this.setTool(null);\n else this.redraw();\n }\n\n /** Brush / highlighter: press, drag (a vertex every FREEHAND_SAMPLE_PX),\n * release commits (no magnet, like TV). */\n private startFreehand(sp0: Pt): void {\n const spec = this.spec!;\n const dp0 = unproject(this.coords, sp0);\n if (!dp0) return;\n this.pending = [dp0];\n this.cursor = sp0;\n let last = sp0;\n const move = (ev: PointerEvent) => {\n const cur = this.panePoint(ev);\n this.cursor = cur;\n if (Math.hypot(cur.x - last.x, cur.y - last.y) < FREEHAND_SAMPLE_PX) return;\n const dp = unproject(this.coords, cur);\n if (!dp) return;\n last = cur;\n this.pending = [...this.pending, dp];\n this.redraw();\n };\n const up = () => {\n document.removeEventListener(\"pointermove\", move);\n document.removeEventListener(\"pointerup\", up);\n this.releaseChart();\n const pts = this.pending;\n this.pending = [];\n this.cursor = null;\n const placed = pts.length >= 2 ? buildNewDrawing(spec.kind, pts) : null;\n if (placed) this.placeNew(placed, null);\n else this.afterPlacement();\n };\n document.addEventListener(\"pointermove\", move);\n document.addEventListener(\"pointerup\", up);\n }\n\n private selectionDown(e: PointerEvent, sp: Pt): void {\n const hit = this.hitTopmost(sp);\n const multiKey = e.ctrlKey || e.metaKey;\n if (!hit) {\n // Ctrl+click on empty space keeps the selection (TV); a plain click\n // clears it and the chart pans as usual.\n if (!multiKey && this.selected.length) this.select([]);\n return;\n }\n e.stopPropagation();\n this.holdChart();\n const ids = this.selected;\n const wasSelected = ids.includes(hit.drawing.id);\n const inGroup = wasSelected && ids.length > 1;\n if (!multiKey && !wasSelected) this.select([hit.drawing.id]);\n // Locked drawings can join / leave the selection but never drag.\n if (hit.drawing.locked) {\n if (multiKey) this.toggle(hit.drawing.id);\n else if (inGroup) this.select([hit.drawing.id]);\n window.addEventListener(\"pointerup\", () => this.releaseChart(), { once: true });\n return;\n }\n const pane = this.paneSize();\n const group =\n inGroup && hit.mode.hit === \"body\"\n ? ids\n .map((id) => this.get(id))\n .filter((d): d is Drawing => !!d && !d.locked && this.shown(d))\n .map((d) => ({ start: d, startScreen: screenPoints(this.coords, d, pane) }))\n .filter((m): m is { start: Drawing; startScreen: Pt[] } => !!m.startScreen)\n : undefined;\n // TV gates body drags on selection: a press on an unselected drawing's\n // body only selects it; anchor drags engage at once.\n this.gesture = {\n id: hit.drawing.id,\n start: hit.drawing,\n startCursor: sp,\n startScreen: hit.pts,\n mode: hit.mode,\n active: false,\n group,\n pendingToggle: multiKey,\n pendingCollapse: !multiKey && inGroup,\n pane,\n canDrag: hit.mode.hit === \"handle\" || wasSelected,\n };\n const move = (ev: PointerEvent) => this.dragMove(this.panePoint(ev));\n const up = () => {\n document.removeEventListener(\"pointermove\", move);\n document.removeEventListener(\"pointerup\", up);\n const g = this.gesture;\n if (g && !g.active) {\n if (g.pendingToggle) this.toggle(g.id);\n else if (g.pendingCollapse) this.select([g.id]);\n // TV table: a click on a cell of the already selected table makes it\n // the active cell and opens its editor; a corner anchor clears it.\n if (g.start.kind === \"table\" && !multiKey) {\n if (g.mode.hit === \"body\" && g.mode.cell && wasSelected) this.openCell(g.start, g.mode.cell);\n else if (g.mode.hit === \"handle\" && g.mode.handleIndex < 4 && this.tableUi?.id === g.id) {\n this.tableUi = { ...this.tableUi, cell: null, editing: false };\n this.redraw();\n }\n }\n }\n // TV image endChanging: the centre goes back to its bar.\n if (g?.active && g.start.kind === \"image\") {\n const cur = this.get(g.id);\n if (cur?.image?.dx != null) {\n const { dx: _dx, ...im } = cur.image;\n this.update({ ...cur, image: im } as Drawing);\n }\n }\n this.endGesture();\n this.emit(\"gestureEnd\");\n };\n document.addEventListener(\"pointermove\", move);\n document.addEventListener(\"pointerup\", up);\n }\n\n private dragMove(cur: Pt): void {\n const g = this.gesture;\n if (!g) return;\n if (!g.active) {\n if (!g.canDrag) return;\n if (Math.hypot(cur.x - g.startCursor.x, cur.y - g.startCursor.y) < DRAG_THRESHOLD) return;\n // Ctrl + body drag of a single drawing clones it (TV): the copy stays,\n // the original moves.\n if (g.pendingToggle && g.mode.hit === \"body\" && !g.group) {\n const { id: _id, ...copy } = g.start;\n this.add(copy as NewDrawing);\n this.select([g.id]);\n }\n g.active = true;\n g.pendingToggle = false;\n g.pendingCollapse = false;\n }\n if (g.group) {\n const dx = cur.x - g.startCursor.x;\n const dy = cur.y - g.startCursor.y;\n for (const m of g.group) {\n const nd = translateDrawing(this.coords, m.start, m.startScreen, dx, dy, this.paneSize());\n if (nd) this.update(nd);\n }\n return;\n }\n const updated = applyDrag(g, cur, this.coords, this.snapFn(), this.shift);\n if (updated) this.update(updated);\n }\n\n private endGesture(): void {\n this.gesture = null;\n this.releaseChart();\n }\n\n private openCell(d: Drawing, cell: TableCellRef): void {\n this.tableUi = { id: d.id, cell, editing: true, edge: null };\n this.redraw();\n const pts = screenPoints(this.coords, d, this.paneSize());\n if (!pts) return;\n const L = tableLayout(d, pts[0]);\n const [r, c] = cell;\n this.emit(\"tableEdit\", d, cell, { left: L.xs[c], top: L.ys[r], width: L.xs[c + 1] - L.xs[c], height: L.ys[r + 1] - L.ys[r] });\n }\n\n private toggle(id: string): void {\n this.select(this.selected.includes(id) ? this.selected.filter((x) => x !== id) : [...this.selected, id]);\n }\n\n /** The live placement preview: the real tool with the cursor standing in\n * for the unplaced points (TV), the real freehand stroke, or the segment\n * rubber band (patterns, Elliott, variable-length tools). */\n private previewScene(w: number, h: number): Scene | null {\n const spec = this.spec;\n const p = this.pending;\n const raw = this.cursor;\n if (!spec || !p.length || !raw) return null;\n const c = this.coords;\n const placed = p.map((dp) => projectPoint(c, dp)).filter((x): x is Pt => !!x);\n if (!placed.length) return null;\n const style = defaultStyleFor(spec.kind);\n const cur = this.aimAt(raw);\n const dots: Scene = placed.map((pt) => ({ t: \"circle\", cx: pt.x, cy: pt.y, r: 3, fill: style.color }));\n if (!spec.variableLength && !spec.freehand && !SEGMENT_PREVIEW_KINDS.has(spec.kind) && placed.length === p.length && placed.length < spec.pointCount) {\n let end = cur;\n if (this.shift && ((placed.length === 1 && spec.pointCount === 2 && ANGLE_SNAP_KINDS.has(spec.kind)) || ANGLE_SNAP_3PT_KINDS.has(spec.kind))) {\n end = snapAngle(placed[placed.length - 1], cur);\n }\n const curData = this.dataAt(end);\n if (curData) {\n const full = [...p];\n while (full.length < spec.pointCount) full.push(curData);\n const nd0 = buildNewDrawing(spec.kind, full);\n const nd = nd0 && spec.kind === \"gann-square\" ? snapGannSquare(nd0, c) : nd0;\n const d = nd ? ({ ...nd, id: \"__preview__\", style } as Drawing) : null;\n const screen = d ? projectAll(c, d.points) : null;\n if (d && screen) return [...sceneOf(d, screen, { w, h, coords: c, selected: false }), ...dots];\n }\n }\n if (spec.freehand && placed.length >= 2) {\n return sceneOf({ id: \"__preview__\", kind: spec.kind, points: p, style } as Drawing, placed, { w, h, coords: c, selected: false });\n }\n const last = placed[placed.length - 1];\n const out: Scene = [];\n if (placed.length >= 2) out.push({ t: \"polyline\", pts: placed, fill: \"none\", stroke: style.color, strokeWidth: style.width, cap: \"round\" });\n out.push({ t: \"line\", a: last, b: cur, stroke: style.color, strokeWidth: style.width, cap: \"round\" });\n return [...out, ...dots];\n }\n}\n\n/** The editor anchor of a text drawing: the click point, the balloon centre\n * (callout / note), the line middle (price note). */\nfunction textAnchor(d: Drawing, pts: Pt[]): Pt {\n if ((d.kind === \"callout\" || d.kind === \"note\") && pts[1]) return pts[1];\n if (d.kind === \"price-note\" && pts[1]) return { x: (pts[0].x + pts[1].x) / 2, y: (pts[0].y + pts[1].y) / 2 };\n return pts[0];\n}\n\n/** OHLC bars of a series from its data (line / area data: value for all). */\nfunction seriesBars(series: ISeriesApi<SeriesType>): OHLC[] {\n return series.data().map((b) => {\n const r = b as { time: Time; open?: number; high?: number; low?: number; close?: number; value?: number; volume?: number };\n const v = r.value ?? r.close ?? 0;\n return { time: r.time, open: r.open ?? v, high: r.high ?? v, low: r.low ?? v, close: r.close ?? v, volume: r.volume };\n }) as OHLC[];\n}\n\nfunction mixHex(a: string, b: string, t: number): string {\n const pa = /^#([0-9a-f]{6})$/i.exec(a);\n const pb = /^#([0-9a-f]{6})$/i.exec(b);\n if (!pa || !pb) return a;\n const na = parseInt(pa[1], 16);\n const nb = parseInt(pb[1], 16);\n const ch = (sh: number) => Math.round(((na >> sh) & 255) + (((nb >> sh) & 255) - ((na >> sh) & 255)) * t);\n return \"#\" + ((ch(16) << 16) | (ch(8) << 8) | ch(0)).toString(16).padStart(6, \"0\");\n}\n\nfunction axisView(coordinate: number, text: string, back: string, color: string): ISeriesPrimitiveAxisView {\n return { coordinate: () => coordinate, text: () => text, backColor: () => back, textColor: () => color, visible: () => true, tickVisible: () => true };\n}\n\n/** The series primitive: one pane view drawing every scene of the manager\n * in the pane (clipped to it), above the series, and the drawings' axis\n * labels (price / time axis views, rebuilt on every chart update). */\nclass DrawingsPrimitive implements ISeriesPrimitive<Time> {\n private readonly m: DrawingManager;\n private request: (() => void) | null = null;\n private readonly view: IPrimitivePaneView;\n\n constructor(m: DrawingManager) {\n this.m = m;\n const renderer: IPrimitivePaneRenderer = { draw: (t) => this.draw(t) };\n this.view = { zOrder: () => \"top\", renderer: () => renderer };\n }\n attached(p: SeriesAttachedParameter<Time>): void {\n this.request = p.requestUpdate;\n }\n detached(): void {\n this.request = null;\n }\n paneViews(): readonly IPrimitivePaneView[] {\n return [this.view];\n }\n private axis: { price: ISeriesPrimitiveAxisView[]; time: ISeriesPrimitiveAxisView[] } = { price: [], time: [] };\n updateAllViews(): void {\n this.axis = this.m.axisViews();\n }\n priceAxisViews(): readonly ISeriesPrimitiveAxisView[] {\n return this.axis.price;\n }\n timeAxisViews(): readonly ISeriesPrimitiveAxisView[] {\n return this.axis.time;\n }\n requestUpdate(): void {\n this.request?.();\n }\n /** lightweight-charts sets the pane cursor from this (the manager's hover\n * state, updated on pointer move). */\n hitTest(): PrimitiveHoveredItem | null {\n const c = this.m.cursorAt();\n // The chart re-reads the cursor only when the hovered item changes: the\n // id carries the drawing and its cursor.\n return c ? { cursorStyle: c, externalId: `lwcd:${this.m.hoveredId() ?? \"\"}:${c}`, zOrder: \"top\" } : null;\n }\n private draw(target: CanvasRenderingTarget2D): void {\n target.useMediaCoordinateSpace(({ context: ctx, mediaSize }) => {\n const w = mediaSize.width;\n const h = mediaSize.height;\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, 0, w, h);\n ctx.clip();\n const family = this.m.fontFamily();\n const fillAt = (y: number) => this.m.backgroundAt(y, h);\n const onAsyncLoad = () => this.requestUpdate();\n for (const s of this.m.scenes(w, h)) {\n drawScene(ctx, s.scene, { fontFamily: family, anchors: { fillAt, selected: s.selected, hovered: s.hoveredAnchor }, onAsyncLoad });\n }\n ctx.restore();\n });\n }\n}\n","/**\n * lightweight-charts-drawing 0.2\n *\n * TradingView-style drawing tools for lightweight-charts v5, built on a shared\n * drawing core (src/tv: tool model + TradingView factory defaults, hit tests,\n * placement / drag rules, renderer-neutral scenes) and a canvas runtime\n * (src/runtime: DrawingManager).\n *\n * @packageDocumentation\n */\n\n// ============ Runtime ============\nexport { DrawingManager, type DrawingManagerEvents, type DrawingManagerOptions, type MagnetMode, type TableOp } from \"./runtime/manager\";\nexport { makeCoords, timeToXFallback } from \"./runtime/coords\";\nexport { drawScene, TV_ANCHOR_COLOR, type AnchorStyle, type CanvasSceneOptions } from \"./runtime/scene-canvas\";\n\n// ============ Core model ============\nexport {\n DEFAULT_STYLE,\n isVisibleOnInterval,\n type DataPoint,\n type Drawing,\n type DrawingKind,\n type DrawingStyle,\n type LevelDef,\n type NewDrawing,\n} from \"./tv/types\";\nexport { OVERLAY_SPECS, defaultStyleFor, factoryStyleFor, findOverlaySpec, setDefaultStyleOverride, type OverlaySpec } from \"./tv/specs\";\nexport type { Coords, OHLC } from \"./tv/coords\";\nexport type { Pt, HitResult } from \"./tv/_shared\";\nexport { parseDrawings, migrateDrawing } from \"./tv/serialize\";\n\n// ============ Scenes and hit tests (hosts drawing their own way) ============\nexport { sceneOf, sceneLockedAnchors, type SceneContext } from \"./tv/scene\";\nexport type { Scene, SceneItem, Paint, Shadow } from \"./tv/scene/types\";\nexport { hitTestKind } from \"./tv/kinds/hit-tests\";\nexport { drawingAxisLabels, type PriceAxisLabel, type TimeAxisLabel } from \"./tv/kinds/axis-labels\";\n\n// ============ Host hooks: images, tables ============\nexport { cacheImage, decodeImage, setImageReader, onImagesChanged, IMAGE_MAX_BYTES, IMAGE_MAX_SIDE, IMAGE_TYPES, type LoadedImage } from \"./tv/kinds/images\";\nexport type { TableCellRef, TableUi } from \"./tv/kinds/table\";\n\n// ============ Interaction rules ============\nexport { finishPlacement, buildNewDrawing } from \"./tv/interact/placement\";\nexport { applyDrag, anchorCursor, type DragState } from \"./tv/interact/drag\";\nexport { ANCHORABLE_KINDS, isAnchorable, toggleAnchored } from \"./tv/interact/anchor\";\n\nexport const VERSION = \"0.2.0\";\n"],"names":["DEFAULT_STYLE","isVisibleOnInterval","v","interval","m","n","inRange","u","value","GRAY","RED","ORANGE","GREEN","MINTY","SKY","BLUE","PURPLE","PINK","DEEP_PURPLE","FIB_LEVEL_DEFAULTS","PITCHFORK_LEVEL_DEFAULTS","GANN_FAN_LEVEL_DEFAULTS","FIB_WEDGE_LEVEL_DEFAULTS","SPEED_FAN_LEVEL_DEFAULTS","TREND_FIB_TIME_LEVEL_DEFAULTS","TREND_FIB_TIME_TREND_DEFAULT","FIB_TREND_LINE_DEFAULT","FIB_WEDGE_TREND_LINE_DEFAULT","gl","color","visible","gr","x","y","GANN_LEVEL_DEFAULTS","GANN_FAN_DEFAULTS","GANN_ARC_DEFAULTS","SPEED_FAN_GRID_DEFAULT","FIB_TIMEZONE_LEVEL_DEFAULTS","VWAP_BAND_DEFAULTS","VWAP_BAND_LINE_DEFAULTS","SPEED_ARC_LEVEL_DEFAULTS","FIB_CIRCLE_LEVEL_DEFAULTS","GANN_BOX_LEVEL_DEFAULTS","ELLIOTT_DEFAULT_DEGREE","GHOST_CANDLE_DEFAULTS","REGRESSION_LINE_DEFAULTS","PARALLEL_CHANNEL_LEVEL_DEFAULTS","coeff","i","PITCHFAN_LEVEL_DEFAULTS","l","OVERLAY_SPECS","OVERLAY_KIND_IDS","findOverlaySpec","toolId","defaultStyleFor","kind","style","defaultStyleOverride","factoryStyleFor","setDefaultStyleOverride","fn","HANDLE_RADIUS","HIT_TOLERANCE","GLYPH_HALF","dashFor","strokeTolerance","fillStyle","fill","fillOpacity","distToSegment","px","py","a","b","dx","dy","len2","t","pointInPolygon","poly","inside","j","xi","yi","xj","yj","bboxCorners","left","right","top","bottom","timeToSec","ms","glyphHitTest","pts","cursor","c","rotatedRectCorners","fmt2","len","nx","ny","d","off","POSITION_STATS","positionStatOn","s","k","_a","fmtGrouped","digits","positionLegText","leg","dist","entry","pip","amount","pl","on","compact","price","pct","positionMiddleText","pnl","closed","qty","ratio","POSITION_DEFAULTS","positionLevels","p0","p1","legacy","positionRiskSize","account","roundQty","precision","positionQty","stop","leverage","riskQty","levQty","q","lot","positionAnchors","coords","profit","sign","yTarget","yStop","positionTrade","dir","stopPrice","targetPrice","bars","last","i0","i1","end","entryIndex","closeIndex","hit","bar","barIndex","gannFrame","vx","vy","start","gannLevelLines","f","levels","gannFanLines","fans","to","gannArcs","arcs","radius","prev","out","r","gannArcPaths","sx","sy","sweep","cx","cy","stroke","inner","gannBox","gannFanDir","pitchforkGeom","p2","p3","mid","half","pivot","m01","pitchforkExtendRight","origin","width","trendFibTimeLevels","i2","ctx","bodyFontFamily","measureTextStyled","text","fontSize","bold","italic","tvWordWrap","fs","lines","chunks","lo","hi","h","line","words","rest","sp","g","w","tvTextLayout","padV","padH","ox","oy","textW","bw","ls","bh","rx","ry","tx","anchor","cos","sin","rot","priceNoteLabel","deg","horz","vert","rectangleTextLayout","paneW","extL","extR","vis","input","segL","over","barsBetween","aSec","bSec","ts","linregress","ys","sxx","sxy","syy","denom","ss","varY","extendSegRight","seg","toX","regressionScreenLines","extendRightToX","t0","t1","src","fit","sourcePrice","yFit0","yFit1","maxHigh","maxLow","base","upDev","loDev","proj","time","c0","c1","u0","u1","l0","l1","ext","vwapBandLine","side","list","lvl","def","vwapCache","vwapData","anchorSec","key","perBars","vwap","sd","cumPV","cumPV2","cumV","vol","data","firstIndexAtOrAfter","sec","vwapLastValue","vwapScreenSeries","level","index","percent","first","unit","band","yu","yl","forecastArcSamples","forecastStatus","targetSec","lastSec","isLast","volumeProfile","fromSec","toSec","rowCount","vaShare","step","rows","up","span","r0","r1","share","tot","poc","total","vaFrom","vaTo","acc","below","anchoredVpBox","tLast","vp","xr","yt","yb","fixedVpBox","speedFanGeometry","fallback","hLevels","vLevels","rev","baseP","spanP","baseY","spanY","baseX","spanX","extendRay","BAR_PATTERN_MODES","patternBarPrices","mode","o","patternEdgePrice","flipped","useFirst","barsPatternGeometry","rows0","pa","pb","inv","swap","price0","price1","y0","y1","firstP","lastP","yf","scale","p","shift","xs","_","lineMode","pA","pB","ya","textWidth","font","arrowMarkTextBox","pad","lineH","height","TABLE_PAD","TABLE_BORDER","TABLE_ACTIVE_LINE","TABLE_CELL_WIDTH","TABLE_LINE_HEIGHT","TABLE_ACTIVE_COLOR","TABLE_EDGE_COLOR","TABLE_EDGE_TOL","TABLE_EDGE_BASE","tableEdgeIndex","tableEdgeOf","tableCells","tableColWidths","tableRowHeightsStored","fontSizeOf","zeroWidth","tableMinColWidth","tableMinRowHeight","tableWrapWidth","colW","tableCellLines","textHeight","tableRowHeights","cells","widths","stored","mins","tableLayout","heights","row","tableAnchors","tableHitCell","cur","selected","col","distributeSizes","sizes","sum","tableInsert","op","at","tableCanRemove","tableRemove","cell","tableWithText","IMAGE_MAX_BYTES","IMAGE_MAX_SIDE","IMAGE_TYPES","cache","readImage","listeners","setImageReader","onImagesChanged","changed","decodeImage","url","resolve","reject","img","drawingImage","name","blob","e","drawingImageFailed","imageBox","im","imageAnchors","IMAGE_ANCHOR_DIRS","imageInitialSize","natW","natH","paneH","cacheImage","TEXT_TOOL_PLACEHOLDER","TEXT_PLACEHOLDER","annText","has","noteLayout","txt","faint","boxW","boxH","ang","toolText","textToolLayout","commentLayout","roundRectPath","tl","tr","br","bl","PIN_MARKER_PATH","pinLayout","edge","caret","pinTooltipPath","tp","priceLabelLayout","label","priceLabelPath","calloutLayout","wrap","textH","calloutPath","ex","ey","ix","iy","code","pv","P","arc","ty","path","SIGNPOST_COLORS","barPrices","signpostPositionFor","barY","avail","labelYFor","pos","signpostLayout","barYraw","onData","poleStart","make","lh","clamped","plate","poleEnd","plateY","gap","signpostPositionAtY","HANDLE_R","inBox","endpointHit","bboxCornerHit","cs","horizontalLineHit","tol","verticalLineHit","crossLineHit","horizontalRayHit","fibHit","drawing","extendableLineHit","A","B","big","lineHit","positionHit","dp0","dp1","midX","anchors","ah","extendHitSeg","inBand","ux","uy","det","pitchforkHit","far","dl","back","kmax","fibExtHit","gannFanHit","fibTimeZoneHit","fibCirclesHit","coeffs","hx","hy","parallelChannelHit","a2","b2","disjointChannelHit","channelHit","fibChannelHit","ellipse3Hit","lx","ly","rectEdgeMidpoints","rectangleHit","withMidpoints","ch","mids","circleHit","priceRangeHit","dateRangeHit","rotatedRectHit","corners","triangleHit","polylineHit","samples","barsPatternHit","arrowMarkHit","box","speedFanHit","size","targets","c2","c3","pitchfanHit","trendFibTimeHit","gannSquareHit","sectorHit","p2raw","len1","a1","wedgeHit","arcsHit","FIB_SPIRAL_RADII","spiralSamples","ccw","baseAngle","frac","sineSamples","bezierSamples","extendLeft","extendRight","arcSamples","cap","cubicSamples","FILLED_PATTERN_KINDS","labeledPolylineHit","freehandHit","sampledHit","cyclicLinesHit","timeCyclesHit","startX","k0","k1","priceNoteHit","regressionHit","segs","vwapHit","series","center","forecastHit","flagMarkHit","ghostFeedHit","hitTestKind","pw","rr","hexToRgb","hex","parseColor","applyOpacity","opacity","textOnColor","bg","drawingAxisLabels","measureCtx","bodyFont","ctx2d","measureText","measureTextBold","signedFixed","tvTimeSpan","seconds","neg","dd","hh","mm","parts","tvVolume","units","div","textCrossesLine","labelBoxPolygon","angle","tvTextItems","layout","ln","channelLabelGeom","padHArg","rad","channelLabelItems","channelLabelCutPoly","always","SQUARE_ANCHORS","TREND_ANGLE_ARC_R","STAT_ICONS","tvStatRows","withExtras","dPrice","sub","showDate","showDist","segmentHitsRect","rw","rh","clip","segmentTouchesBox","statsBoxItems","position","auto","rowH","upLeftOrDownRight","items","rangeArrowPath","from","tip","lw","hl","bx","by","endArrowItems","trendLabelStyle","trendLabelCutPoly","cutOf","lineDecorationItems","active","statRows","statsPos","showBadge","hLineTextLayout","hRayTextLayout","lineLabelCutPoly","roundCap","sceneHorizontalLine","cut","sceneVerticalLine","horizontal","sceneCrossLine","dash","sceneTrendLine","sceneExtendedSegment","extendStart","extendEnd","sceneHorizontalRay","sceneInfoLine","sceneTrendAngle","angleDeg","th","arcPath","e0","e1","activeLevels","levelFillOpacity","levelWidth","levelDash","extendSeg","parallelChannelAnchors","disjointChannelAnchors","parallelChannelLabelEdges","sceneParallelChannel","fillO","ed","cutPoly","channelPricesItems","lay","other","channelBodyItems","priceB","priceB2","l2","fmt","_b","sceneDisjointChannel","sceneFlatTopBottom","fibCoeffText","percents","fibLevelLabel","fmtCoeff","anchorsIf","digitsOf","clipOf","polys","ps","fibTrendLineItems","wedge","fibHLevelItems","showC","showP","lvText","hBands","yOf","sceneFib","priceA","useLog","priceOf","pEnd","pStart","yLin","sceneFibExtension","pc","move","moveY","lnMove","sceneFibChannel","atX","priceAt","labelFor","pt","segX","vLevelItems","sceneTrendBasedFibTime","tlDash","horzS","labelAt","x0","sceneFibTimeZone","x1","FIB_CIRCLE_LEVELS","sceneFibCircles","ell","sceneFibSpeedFan","hRays","vRays","wedges","rays","grid","gridDash","lab","sceneFibSpeedArcs","full","sceneFibSpiral","sceneFibWedge","a2raw","SAMPLES","arcPts","outer","midAng","scenePitchfan","rayEnd","target","ordered","sceneGannSquare","lv","labels","mk","labelColor","arcItems","sceneGannFan","pointOf","farOf","bands","sceneGannBox","hAll","vAll","xOf","hO","vO","fanLines","fx","vl","fy","offsetX","offsetY","scenePitchfork","medianFar","originOf","SIDES","o0","o1","HOVER_FILL_DELTA","shapeFill","hovered","shapeTextItems","curveEndArrowItems","pathOf","squares","sceneRectangle","ml","midY","sceneRotatedRectangle","sceneCircle","sceneEllipse","angRad","sceneTriangle","sceneArc","curveScene","controls","sceneCurve","ctrl","sceneDoubleCurve","sceneSector","alpha","sceneCyclicLines","sceneSineLine","sceneTimeCycles","KIND_LABELS","FILLED_KINDS","ELLIOTT_GROUP_STYLE","ELLIOTT_BASE_LABELS","ROMAN","elliottLabels","group","sceneElliott","deco","gs","offset","labelOffsetY","next","patternPill","retracement","decimals","patternConnector","ratioLeg","pillText","patternLetterPills","hitPolyline","sceneAbcdPattern","prices","sceneXabcdPattern","cypher","pr","xd","sceneThreeDrives","hnsPill","above","sceneTrianglePattern","tri","lineSegmentHit","den","sceneHeadAndShoulders","p4","p5","p6","toward","smoothBrush","smooth","sceneLabeledPolyline","isFilled","isHighlighter","isFreehand","strokeW","drawPts","handlePts","endArrow","endKind","arrowMarkerHeadLen","sceneArrowMarker","a0","rawLen","textItems","dxv","dyv","head","backStep","profile","outline","dirAng","arrowMarkPath","stem","hw","sw","sceneArrowMark","FLAG_POLE_H","FLAG_W","FLAG_H","FLAG_NOTCH","sceneFlagMark","topY","banner","scenePriceLabel","border","FONT_ICON_SIZE","sceneFontIcon","CANDLE_UP","CANDLE_DOWN","candleItems","bodyW","sceneBarsPattern","gray","seededRng","seed","GHOST_BARS","sceneGhostFeed","amp","vt","candles","spacing","anyLeg","idxA","idxB","leftFirst","yL","yR","stepY","xp","centerOff","range","low","yA","yB","bandPx","rng","slot","wick","openY","drift","closeY","highY","lowY","RANGE_LABEL_BG","RANGE_LABEL_SHADOW","rangeLabelY","alt","rangeLabelLines","withPrice","withDate","q0","q1","change","pp","any","rangeLabelItems","rangeCustomTextGeom","rangeTextCut","rangeCustomTextItems","rangeFillOpacity","rangeBox","arrow","rangeScene","distance","scenePriceRange","sceneDateRange","sceneDateAndPriceRange","hx0","hx1","vy0","vy1","sceneRegressionTrend","rl","sceneAnchoredVwap","badge","polyPair","lineDash","st","volumeProfileScene","fromRight","histW","rowY","pocY","inVa","upW","downW","upX","downX","sceneFixedRangeVolumeProfile","sceneAnchoredVolumeProfile","partsFmt","partsOf","timeZone","isoDateTimeParts","FORECAST_CLOCK_ICON","FORECAST_SUCCESS_ICON","FORECAST_FAILURE_ICON","positionLabel","align","scenePosition","wBox","stopHex","targetHex","stopT","targetT","down","accountSize","qtyRaw","round2","amountTarget","amountStop","trade","targetText","stopText","midText","midLines","midBg","xAt","yClose","entryX","rightX","pnlZone","lineEndX","posLine","showStats","labelW","narrow","midShift","FORECAST_CENTER_DOT","FORECAST_CLOCK_W","fmtForecastDate","sep","info","date","forecastBalloon","props","rowW","leftOff","tailY","tailTip","cx0","bn","bannerTop","tw","ic","sceneForecast","tLen","hd","status","BOX_SHADOW","PLATE_SHADOW","faintColor","sceneTextTool","scenePin","textColor","sceneTextNote","lineColor","sceneComment","sceneSignpost","scenePriceNote","priceLabel","sceneCallout","balloon","sceneTable","ui","L","activeBorder","edgeBand","texts","sceneImage","sceneOf","as","sceneLockedAnchors","parseDrawings","parsed","valid","migrateDrawing","dup","middleLine","midPrice","midTime","DRAG_THRESHOLD","MIN_DISTANCE_BETWEEN_POINTS","FREEHAND_SAMPLE_PX","MAGNET_WEAK_RADIUS_PX","screenPoints","pane","projectAll","translateDrawing","startScreen","unproject","replaceDrawingPoints","projectPoint","snapAngle","magnetSnap","dp","snapToIndicators","candidates","cursorY","best","bestDy","points","screenAngleDeg","ANGLE_SNAP_KINDS","ANGLE_SNAP_3PT_KINDS","SEGMENT_PREVIEW_KINDS","buildNewDrawing","tc","enrichPositionPlacement","placed","pTop","pBot","entryIdx","tA","tB","xA","xB","visibleBars","closeIdx","closeTime","enrichBarPattern","scaleHeight","yHigh","enrichGhostFeed","mean","enrichCurvePlacement","bend","enrichTrendAngle","snapGannSquare","ta","tb","xa","xb","finishPlacement","opts","applyPositionDrag","state","snap","idx","sm","applyParallelChannelDrag","aS","bS","cS","p0n","p2n","p1n","applyDisjointChannelDrag","p0price","applyRotatedRectDrag","b0","ul","applyDrag","constrain","spec","opp","ref","applyTableDrag","wrap0","leftEdge","applyImageDrag","g0","moved","opposite","updated","floorTimeAt","rowMins","colMin","colMins","totalW","totalH","patch","isLeft","isTop","minW","minH","fixed","dxW","dyH","rowMin","nat","mx","anchorCursor","ANCHORABLE_KINDS","isAnchorable","toggleAnchored","PRICE_SCALE_MODE_LOG","makeCoords","chart","getRaw","getIndicatorValues","getTimeInfo","raw","timeAsSec","logical","logicalForSec","logicalToX","iv","barIntervalSec","nearestBar","lastIdx","firstSec","bestD","bs","pf","x2","y2","la","lb","mon","two","deltas","cLo","cHi","timeToXFallback","TV_ANCHOR_COLOR","drawScene","named","it","drawItem","withAlpha","drawAnchors","needSave","paint","applyTransform","drawText","drawImage","drawGlyph","layer","groupLayer","closedFill","shadow","setShadow","dashArray","roundRect","re","weight","centralShift","centralShifts","images","loadImage","svg","square","ring","body","R","G","newId","DrawingManager","__publicField","seriesBars","DrawingsPrimitive","event","cb","id","nd","ids","toggleAnchoredDrawing","json","sel","hov","tableUi","scene","axisView","mixHex","type","capture","args","chartLeft","snapped","textAnchor","spRaw","pend","near","textAt","sp0","ev","multiKey","wasSelected","inGroup","_dx","_id","copy","dots","curData","nd0","screen","na","nb","sh","coordinate","renderer","mediaSize","family","fillAt","onAsyncLoad","VERSION"],"mappings":"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"}