acttrader-charts 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/DataStore.ts","../src/core/ScaleManager.ts","../src/core/EventEmitter.ts","../src/core/themes.ts","../src/core/uiConfig.ts","../src/core/labels.ts","../src/interaction/PanHandler.ts","../src/interaction/ZoomHandler.ts","../src/series/CandlestickSeries.ts","../src/series/HollowCandleSeries.ts","../src/series/LineSeries.ts","../src/series/OHLCSeries.ts","../src/series/VolumeSeries.ts","../src/series/HeikinAshiSeries.ts","../src/series/VolumeCandles.ts","../src/series/LineWithMarkers.ts","../src/series/StepLineSeries.ts","../src/series/HLCAreaSeries.ts","../src/series/BaselineSeries.ts","../src/series/ColumnSeries.ts","../src/series/HighLowSeries.ts","../src/overlays/GridOverlay.ts","../src/overlays/CrosshairOverlay.ts","../src/overlays/TradeLevelOverlay.ts","../src/axis/TimeAxis.ts","../src/axis/PriceAxis.ts","../src/ui/icons.ts","../src/ui/TopBar.ts","../src/ui/BottomBar.ts","../src/ui/LeftBar.ts","../src/drawings/HorizontalLine.ts","../src/drawings/VerticalLine.ts","../src/drawings/TrendLine.ts","../src/drawings/TrendAngle.ts","../src/drawings/CrossLine.ts","../src/drawings/ParallelChannel.ts","../src/drawings/FlatChannel.ts","../src/drawings/DisjointChannel.ts","../src/drawings/FibRetracement.ts","../src/drawings/FibExtension.ts","../src/drawings/FibChannel.ts","../src/drawings/FibTimezone.ts","../src/drawings/FibCircles.ts","../src/drawings/FibSpiral.ts","../src/drawings/FibFan.ts","../src/drawings/FibProjection.ts","../src/drawings/GannFan.ts","../src/drawings/GannSquare.ts","../src/drawings/GannBox.ts","../src/drawings/Rectangle.ts","../src/drawings/RotatedRectangle.ts","../src/drawings/Ellipse.ts","../src/drawings/Triangle.ts","../src/drawings/Circle.ts","../src/drawings/Arc.ts","../src/drawings/Polyline.ts","../src/drawings/Path.ts","../src/drawings/PriceRange.ts","../src/drawings/DateRange.ts","../src/drawings/DatePriceRange.ts","../src/drawings/Ruler.ts","../src/drawings/Pitchfork.ts","../src/drawings/SchiffPitchfork.ts","../src/drawings/ModifiedSchiff.ts","../src/drawings/InsidePitchfork.ts","../src/drawings/FixedRangeVP.ts","../src/drawings/AnchoredVP.ts","../src/drawings/VolumeProfile.ts","../src/drawings/RegressionTrend.ts","../src/drawings/Text.ts","../src/drawings/Callout.ts","../src/drawings/PriceLabel.ts","../src/drawings/ArrowMarker.ts","../src/drawings/Flag.ts","../src/drawings/PriceNote.ts","../src/drawings/AnchoredNote.ts","../src/drawings/ArrowUp.ts","../src/drawings/ArrowDown.ts","../src/drawings/HeadShoulders.ts","../src/drawings/TrianglePattern.ts","../src/drawings/ThreeDrives.ts","../src/drawings/AbcdPattern.ts","../src/drawings/CypherPattern.ts","../src/drawings/ButterflyPattern.ts","../src/drawings/BatPattern.ts","../src/drawings/GartleyPattern.ts","../src/drawings/CrabPattern.ts","../src/drawings/SharkPattern.ts","../src/drawings/ElliottImpulse.ts","../src/drawings/ElliottCorrective.ts","../src/drawings/ElliottTriangle.ts","../src/drawings/ElliottCombination.ts","../src/drawings/ElliottWxy.ts","../src/drawings/Brush.ts","../src/drawings/Highlighter.ts","../src/drawings/SineLine.ts","../src/drawings/CyclicLines.ts","../src/drawings/TimeCycles.ts","../src/drawings/Projection.ts","../src/drawings/PriceProjection.ts","../src/drawings/GhostFeed.ts","../src/drawings/DrawingManager.ts","../src/ui/IndicatorOverlay.ts","../src/ui/IndicatorSettingsDialog.ts","../src/ui/ChartSettingsDialog.ts","../src/ui/TradeButton.ts","../src/ui/TradePopover.ts","../src/ui/DraftOrderQtyInput.ts","../src/ui/IsinPickerModal.ts","../src/interaction/TradeDragHandler.ts","../src/indicators/sourceField.ts","../src/indicators/SMA.ts","../src/indicators/EMA.ts","../src/indicators/WMA.ts","../src/indicators/HMA.ts","../src/indicators/MARibbon.ts","../src/indicators/BollingerBands.ts","../src/indicators/KeltnerChannels.ts","../src/indicators/DonchianChannels.ts","../src/indicators/ATR.ts","../src/indicators/RSI.ts","../src/indicators/Stochastic.ts","../src/indicators/StochRSI.ts","../src/indicators/MACD.ts","../src/indicators/CCI.ts","../src/indicators/WilliamsR.ts","../src/indicators/ROC.ts","../src/indicators/OBV.ts","../src/indicators/VWAP.ts","../src/indicators/AccDistribution.ts","../src/indicators/MFI.ts","../src/indicators/CMF.ts","../src/indicators/PivotPoints.ts","../src/indicators/FibRetracementIndicator.ts","../src/indicators/Supertrend.ts","../src/indicators/ParabolicSAR.ts","../src/indicators/IchimokuCloud.ts","../src/indicators/ADX.ts","../src/indicators/AwesomeOscillator.ts","../src/indicators/HeikinAshi.ts","../src/indicators/VOL.ts","../src/indicators/LinearRegression.ts","../src/core/indicators.json","../src/utils/aggregateCandles.ts","../src/ChartEngine.ts","../src/data/WebSocketAdapter.ts"],"names":["withAlpha","d","DURATIONS","HIT_TOLERANCE","pointToSegmentDist","FIB_LEVELS","FIB_COLORS","drawArrowhead","extendToX","COLOR","BAR_WEIGHTS","BADGE_H","PAD_H","LABELS","FIB_RATIOS","started","timeAxisY","priceH","priceRange","lastBar"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { OHLCVBar, PriceRange, Viewport } from \"./types.js\";\n\nexport class DataStore {\n private bars: OHLCVBar[] = [];\n\n set(bars: OHLCVBar[]): void {\n // Sort ascending by timestamp, normalize timestamps to ms\n this.bars = [...bars].sort((a, b) => a.time - b.time);\n }\n\n get all(): OHLCVBar[] {\n return this.bars;\n }\n\n get length(): number {\n return this.bars.length;\n }\n\n getVisible(viewport: Viewport): OHLCVBar[] {\n const start = Math.max(0, Math.floor(viewport.startIndex));\n const end = Math.min(\n this.bars.length - 1,\n Math.ceil(viewport.endIndex),\n );\n return this.bars.slice(start, end + 1);\n }\n\n getPriceRange(viewport: Viewport, padding = 0.05): PriceRange {\n const visible = this.getVisible(viewport);\n if (visible.length === 0) return { min: 0, max: 1 };\n\n let min = Infinity;\n let max = -Infinity;\n\n for (const bar of visible) {\n if (bar.low < min) min = bar.low;\n if (bar.high > max) max = bar.high;\n }\n\n const range = max - min;\n return {\n min: min - range * padding,\n max: max + range * padding,\n };\n }\n\n getVolumeRange(viewport: Viewport): { min: number; max: number } {\n const visible = this.getVisible(viewport);\n if (visible.length === 0) return { min: 0, max: 1 };\n const max = Math.max(...visible.map((b) => b.volume ?? 0));\n return { min: 0, max };\n }\n\n get hasVolumeData(): boolean {\n return this.bars.some(b => 'volume' in b && (b.volume ?? 0) > 0);\n }\n\n getPricePrecision(): number {\n let max = 2;\n for (const bar of this.bars) {\n for (const v of [bar.open, bar.high, bar.low, bar.close]) {\n const s = v.toString();\n const dot = s.indexOf('.');\n if (dot !== -1) {\n const d = s.length - dot - 1;\n if (d > max) max = d;\n }\n }\n }\n return Math.min(max, 8);\n }\n\n /**\n * Prepends historical bars before the current dataset.\n * Filters out any bars that overlap with existing data (dedup guard).\n * Returns the number of bars actually inserted so the caller can shift\n * viewport indices by the same amount to avoid a visual jump.\n */\n prepend(bars: OHLCVBar[]): number {\n const cutoff = this.bars[0]?.time ?? Infinity;\n const filtered = bars\n .filter(b => b.time < cutoff)\n .sort((a, b) => a.time - b.time);\n if (filtered.length === 0) return 0;\n this.bars = [...filtered, ...this.bars];\n return filtered.length;\n }\n}\n","import type { Viewport, PriceRange } from './types.js';\n\nexport class ScaleManager {\n private static readonly VERTICAL_PADDING_PX = 20;\n\n // ── X axis: bar index → canvas pixel ──────────────────────────────────────\n\n xToPixel(index: number, viewport: Viewport, chartWidth: number): number {\n const visibleBars = viewport.endIndex - viewport.startIndex;\n const candleWidth = chartWidth / visibleBars;\n return (index - viewport.startIndex) * candleWidth + candleWidth / 2;\n }\n\n pixelToBarIndex(x: number, viewport: Viewport, chartWidth: number): number {\n const visibleBars = viewport.endIndex - viewport.startIndex;\n const candleWidth = chartWidth / visibleBars;\n return viewport.startIndex + x / candleWidth - 0.5;\n }\n\n candleBodyWidth(viewport: Viewport, chartWidth: number): number {\n const visibleBars = viewport.endIndex - viewport.startIndex;\n const raw = (chartWidth / visibleBars) * 0.7;\n return Math.max(1, Math.min(raw, 40)); // clamp 1–40px\n }\n\n // ── Y axis: price → canvas pixel ──────────────────────────────────────────\n\n yToPixel(price: number, range: PriceRange, chartHeight: number): number {\n const { min, max } = range;\n const pad = ScaleManager.VERTICAL_PADDING_PX;\n const usable = chartHeight - 2 * pad;\n return pad + usable - ((price - min) / (max - min)) * usable;\n }\n\n pixelToPrice(y: number, range: PriceRange, chartHeight: number): number {\n const { min, max } = range;\n const pad = ScaleManager.VERTICAL_PADDING_PX;\n const usable = chartHeight - 2 * pad;\n return max - ((y - pad) / usable) * (max - min);\n }\n\n // ── Volume: volume value → canvas pixel (bottom-anchored) ─────────────────\n\n volumeToPixel(\n volume: number,\n maxVolume: number,\n volumePanelHeight: number,\n ): number {\n return volumePanelHeight - (volume / maxVolume) * volumePanelHeight * 0.9;\n }\n}\n","type Listener<T> = (payload: T) => void;\n\nexport class EventEmitter<EventMap extends Record<string, unknown>> {\n private listeners = new Map<keyof EventMap, Set<Listener<unknown>>>();\n\n on<K extends keyof EventMap>(event: K, listener: Listener<EventMap[K]>): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener as Listener<unknown>);\n // Return unsubscribe fn\n return () => this.off(event, listener);\n }\n\n off<K extends keyof EventMap>(event: K, listener: Listener<EventMap[K]>): void {\n this.listeners.get(event)?.delete(listener as Listener<unknown>);\n }\n\n emit<K extends keyof EventMap>(event: K, payload: EventMap[K]): void {\n this.listeners.get(event)?.forEach((fn) => fn(payload));\n }\n}\n","// ── Deep-partial helper (local, keeps themes.ts self-contained) ───────────────\n\ntype DeepPartial<T> = { [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K] };\n\n// ── Per-component color groups ────────────────────────────────────────────────\n//\n// These are the colors every UI component refers to for interactive / state\n// coloring. They live inside `ChartTheme` so both built-in themes and any\n// custom theme override can supply consistent values.\n\n/** Accent and interactive-state colors shared across all UI components. */\nexport interface ChartThemeUi {\n /** Primary accent color — active borders, highlights (e.g. #2196f3 blue) */\n accent: string;\n /** Text color on accented (active) elements */\n accentText: string;\n /** Light semi-transparent fill for active list rows / buttons */\n accentBg: string;\n /** Slightly stronger semi-transparent fill (drawing-toolbar active icons) */\n accentBgStrong: string;\n /** Text color for unimplemented / disabled tool entries */\n disabledText: string;\n /** Text color for \"coming soon\" badges */\n soonBadgeText: string;\n /** Stream-status indicator dot colors */\n stream: {\n connected: string;\n reconnecting: string;\n disconnected: string;\n };\n}\n\n/** Colors specific to the drawing toolbar (LeftBar). */\nexport interface DrawingToolbarColors {\n /** Default icon color (category buttons, action buttons) */\n iconColor: string;\n /** Active/selected icon color */\n activeIconColor: string;\n /** Flyout row text for implemented tools */\n flyoutLabelColor: string;\n /** Flyout group-heading color */\n flyoutHeadingColor: string;\n}\n\n/** Colors specific to the top bar and its flyout dropdowns. */\nexport interface TopBarColors {\n /** Default button text color */\n btnColor: string;\n /** Active button text color */\n activeBtnColor: string;\n /** Flyout row text color */\n flyoutRowColor: string;\n /** Flyout group-header text color */\n flyoutCategoryColor: string;\n}\n\n/** Colors specific to the bottom bar duration buttons. */\nexport interface BottomBarColors {\n /** Inactive duration button text */\n btnColor: string;\n /** Active duration button background */\n activeBtnBg: string;\n /** Active duration button text */\n activeBtnText: string;\n /** Active duration button border */\n activeBtnBorder: string;\n}\n\n/** Colors specific to the indicator overlay pills. */\nexport interface IndicatorOverlayColors {\n /** Pill background (semi-transparent) */\n pillBg: string;\n /** Gear and remove icon color */\n iconColor: string;\n /** Dropdown row hover background */\n dropdownHoverBg: string;\n}\n\n/** Colors for trade/position horizontal level lines. */\nexport interface TradeLevelColors {\n /** Line + box border color for open executed trades. */\n tradeLine: string;\n /** Line + box border color for open positions. */\n positionLine: string;\n /** Dashed line color for pending buy orders (limit/stop). */\n pendingBuyLine: string;\n /** Dashed line color for pending sell orders (limit/stop). */\n pendingSellLine: string;\n /** Primary text color inside the info box. */\n labelText: string;\n /** Background fill of the × close button. */\n closeBtn: string;\n /** Icon color of the × inside the close button. */\n closeBtnText: string;\n /** Background of the floating info box (semi-transparent). */\n boxBg: string;\n /** Background of the floating info box when hovered. */\n boxBgHover: string;\n /** Color of the 6-dot drag grip icon. */\n dragHandle: string;\n /** Color of the drag grip icon when hovered. */\n dragHandleHover: string;\n}\n\n/** Colors for the Trade Panel side drawer. */\nexport interface TradePanelColors {\n background: string;\n border: string;\n headerBg: string;\n tabActive: string;\n tabInactive: string;\n rowHoverBg: string;\n rowText: string;\n rowSubText: string;\n}\n\n// ── Main theme interface ──────────────────────────────────────────────────────\n\nexport interface ChartTheme {\n // ── Canvas-level colors ──────────────────────────────────────────────────\n background: string;\n grid: string;\n axisText: string;\n axisBorder: string;\n crosshair: string;\n tooltip: { background: string; text: string; border: string };\n candle: {\n up: string;\n down: string;\n wickUp: string;\n wickDown: string;\n /** Border/outline color for up candle bodies. Defaults to `up` if omitted. */\n borderUp?: string;\n /** Border/outline color for down candle bodies. Defaults to `down` if omitted. */\n borderDown?: string;\n };\n volume: { up: string; down: string };\n\n // ── UI component colors ──────────────────────────────────────────────────\n /** Shared accent / interactive-state colors */\n ui: ChartThemeUi;\n /** Drawing toolbar (LeftBar) specific colors */\n drawingToolbar: DrawingToolbarColors;\n /** Top bar specific colors */\n topBar: TopBarColors;\n /** Bottom bar specific colors */\n bottomBar: BottomBarColors;\n /** Indicator overlay (pills) specific colors */\n indicatorOverlay: IndicatorOverlayColors;\n /** Trade and position level line colors */\n tradeLevels: TradeLevelColors;\n /** Trade Panel side drawer colors */\n tradePanel: TradePanelColors;\n}\n\n/** A deep-partial version of ChartTheme for use in `themeOverrides`. */\nexport type DeepPartialChartTheme = DeepPartial<ChartTheme>;\n\n// ── Theme helpers ─────────────────────────────────────────────────────────────\n\n/**\n * Deep-merge a partial theme override on top of a full base theme.\n * Only the keys you supply are replaced; everything else falls back to `base`.\n */\nexport function deepMergeTheme(\n base: ChartTheme,\n override: DeepPartial<ChartTheme> | undefined,\n): ChartTheme {\n if (!override) return base;\n return {\n background: override.background ?? base.background,\n grid: override.grid ?? base.grid,\n axisText: override.axisText ?? base.axisText,\n axisBorder: override.axisBorder ?? base.axisBorder,\n crosshair: override.crosshair ?? base.crosshair,\n tooltip: { ...base.tooltip, ...override.tooltip },\n candle: { ...base.candle, ...override.candle },\n volume: { ...base.volume, ...override.volume },\n ui: {\n ...base.ui,\n ...override.ui,\n stream: { ...base.ui.stream, ...override.ui?.stream },\n },\n drawingToolbar: { ...base.drawingToolbar, ...override.drawingToolbar },\n topBar: { ...base.topBar, ...override.topBar },\n bottomBar: { ...base.bottomBar, ...override.bottomBar },\n indicatorOverlay: { ...base.indicatorOverlay, ...override.indicatorOverlay },\n tradeLevels: { ...base.tradeLevels, ...override.tradeLevels },\n tradePanel: { ...base.tradePanel, ...override.tradePanel },\n };\n}\n\n/**\n * Walk every color string in `theme` and resolve any `var(--…)` CSS custom\n * properties to a concrete color value using the provided container element.\n * Non-variable strings are returned unchanged.\n *\n * Must be called after the container is appended to the live DOM so that the\n * browser can look up the custom property inheritance chain.\n */\nexport function resolveCssVarsInTheme(\n theme: ChartTheme,\n container: HTMLElement,\n): ChartTheme {\n const tmp = document.createElement('div');\n tmp.style.display = 'none';\n container.appendChild(tmp);\n\n const resolve = (value: string): string => {\n if (!value.includes('var(')) return value;\n tmp.style.color = value;\n const resolved = getComputedStyle(tmp).color;\n return resolved || value;\n };\n\n const result: ChartTheme = {\n background: resolve(theme.background),\n grid: resolve(theme.grid),\n axisText: resolve(theme.axisText),\n axisBorder: resolve(theme.axisBorder),\n crosshair: resolve(theme.crosshair),\n tooltip: {\n background: resolve(theme.tooltip.background),\n text: resolve(theme.tooltip.text),\n border: resolve(theme.tooltip.border),\n },\n candle: {\n up: resolve(theme.candle.up),\n down: resolve(theme.candle.down),\n wickUp: resolve(theme.candle.wickUp),\n wickDown: resolve(theme.candle.wickDown),\n ...(theme.candle.borderUp !== undefined && { borderUp: resolve(theme.candle.borderUp) }),\n ...(theme.candle.borderDown !== undefined && { borderDown: resolve(theme.candle.borderDown) }),\n },\n volume: {\n up: resolve(theme.volume.up),\n down: resolve(theme.volume.down),\n },\n ui: {\n accent: resolve(theme.ui.accent),\n accentText: resolve(theme.ui.accentText),\n accentBg: resolve(theme.ui.accentBg),\n accentBgStrong: resolve(theme.ui.accentBgStrong),\n disabledText: resolve(theme.ui.disabledText),\n soonBadgeText: resolve(theme.ui.soonBadgeText),\n stream: {\n connected: resolve(theme.ui.stream.connected),\n reconnecting: resolve(theme.ui.stream.reconnecting),\n disconnected: resolve(theme.ui.stream.disconnected),\n },\n },\n drawingToolbar: {\n iconColor: resolve(theme.drawingToolbar.iconColor),\n activeIconColor: resolve(theme.drawingToolbar.activeIconColor),\n flyoutLabelColor: resolve(theme.drawingToolbar.flyoutLabelColor),\n flyoutHeadingColor: resolve(theme.drawingToolbar.flyoutHeadingColor),\n },\n topBar: {\n btnColor: resolve(theme.topBar.btnColor),\n activeBtnColor: resolve(theme.topBar.activeBtnColor),\n flyoutRowColor: resolve(theme.topBar.flyoutRowColor),\n flyoutCategoryColor: resolve(theme.topBar.flyoutCategoryColor),\n },\n bottomBar: {\n btnColor: resolve(theme.bottomBar.btnColor),\n activeBtnBg: resolve(theme.bottomBar.activeBtnBg),\n activeBtnText: resolve(theme.bottomBar.activeBtnText),\n activeBtnBorder: resolve(theme.bottomBar.activeBtnBorder),\n },\n indicatorOverlay: {\n pillBg: resolve(theme.indicatorOverlay.pillBg),\n iconColor: resolve(theme.indicatorOverlay.iconColor),\n dropdownHoverBg: resolve(theme.indicatorOverlay.dropdownHoverBg),\n },\n tradeLevels: {\n tradeLine: resolve(theme.tradeLevels.tradeLine),\n positionLine: resolve(theme.tradeLevels.positionLine),\n pendingBuyLine: resolve(theme.tradeLevels.pendingBuyLine),\n pendingSellLine: resolve(theme.tradeLevels.pendingSellLine),\n labelText: resolve(theme.tradeLevels.labelText),\n closeBtn: resolve(theme.tradeLevels.closeBtn),\n closeBtnText: resolve(theme.tradeLevels.closeBtnText),\n boxBg: resolve(theme.tradeLevels.boxBg),\n boxBgHover: resolve(theme.tradeLevels.boxBgHover),\n dragHandle: resolve(theme.tradeLevels.dragHandle),\n dragHandleHover: resolve(theme.tradeLevels.dragHandleHover),\n },\n tradePanel: {\n background: resolve(theme.tradePanel.background),\n border: resolve(theme.tradePanel.border),\n headerBg: resolve(theme.tradePanel.headerBg),\n tabActive: resolve(theme.tradePanel.tabActive),\n tabInactive: resolve(theme.tradePanel.tabInactive),\n rowHoverBg: resolve(theme.tradePanel.rowHoverBg),\n rowText: resolve(theme.tradePanel.rowText),\n rowSubText: resolve(theme.tradePanel.rowSubText),\n },\n };\n\n container.removeChild(tmp);\n return result;\n}\n\n// ── Dark theme ────────────────────────────────────────────────────────────────\n\nexport const DARK_THEME: ChartTheme = {\n background: '#141d22',\n grid: '#243344',\n axisText: '#a8bac8',\n axisBorder: '#1c2a35',\n crosshair: 'rgba(255,255,255,0.4)',\n tooltip: { background: '#1c2a35', text: '#e8eef2', border: '#1c2a35' },\n candle: { up: '#5caf79', down: '#DF6868', wickUp: '#5caf79', wickDown: '#DF6868' },\n volume: { up: 'rgba(92,175,121,0.4)', down: 'rgba(223,104,104,0.4)' },\n\n ui: {\n accent: '#398dff',\n accentText: '#93bcff',\n accentBg: 'rgba(57,141,255,0.15)',\n accentBgStrong: 'rgba(57,141,255,0.22)',\n disabledText: '#484f58',\n soonBadgeText: '#30363d',\n stream: {\n connected: '#5caf79',\n reconnecting: '#e8b84b',\n disconnected: '#555555',\n },\n },\n\n drawingToolbar: {\n iconColor: '#e8eef2', // tooltip.text equivalent\n activeIconColor: '#93bcff',\n flyoutLabelColor: '#a8bac8', // axisText\n flyoutHeadingColor: '#a8bac8',\n },\n\n topBar: {\n btnColor: '#a8bac8',\n activeBtnColor: '#93bcff',\n flyoutRowColor: '#a8bac8',\n flyoutCategoryColor: '#a8bac8',\n },\n\n bottomBar: {\n btnColor: '#a8bac8',\n activeBtnBg: '#5caf79', // candle.up\n activeBtnText: '#ffffff',\n activeBtnBorder: '#5caf79',\n },\n\n indicatorOverlay: {\n pillBg: 'rgba(28,42,53,0.73)', // tooltip.background + alpha\n iconColor: '#a8bac8',\n dropdownHoverBg: '#1c2a35',\n },\n\n tradeLevels: {\n tradeLine: '#5caf79',\n positionLine: '#7b61ff',\n pendingBuyLine: 'rgba(92,175,121,0.75)',\n pendingSellLine: 'rgba(223,104,104,0.75)',\n labelText: '#ffffff',\n closeBtn: 'rgba(255,255,255,0.18)',\n closeBtnText: '#ffffff',\n boxBg: 'rgba(20, 24, 36, 0.92)',\n boxBgHover: 'rgba(35, 40, 58, 0.97)',\n dragHandle: 'rgba(255,255,255,0.3)',\n dragHandleHover: '#9ca3af',\n },\n\n tradePanel: {\n background: '#1c2a35',\n border: '#243344',\n headerBg: '#151f28',\n tabActive: '#93bcff',\n tabInactive: '#a8bac8',\n rowHoverBg: 'rgba(255,255,255,0.04)',\n rowText: '#e8eef2',\n rowSubText: '#9ca3af',\n },\n};\n\n// ── Light theme ───────────────────────────────────────────────────────────────\n\nexport const LIGHT_THEME: ChartTheme = {\n background: '#ffffff',\n grid: '#efefef',\n axisText: '#666666',\n axisBorder: '#cccccc',\n crosshair: '#999999',\n tooltip: { background: '#f8f8f8', text: '#333333', border: '#cccccc' },\n candle: { up: '#5caf79', down: '#DF6868', wickUp: '#5caf79', wickDown: '#DF6868' },\n volume: { up: 'rgba(92,175,121,0.6)', down: 'rgba(223,104,104,0.6)' },\n\n ui: {\n accent: '#398dff',\n accentText: '#2a7aff',\n accentBg: 'rgba(57,141,255,0.10)',\n accentBgStrong: 'rgba(57,141,255,0.18)',\n disabledText: '#94a3b8',\n soonBadgeText: '#cbd5e1',\n stream: {\n connected: '#5caf79',\n reconnecting: '#d97706',\n disconnected: '#94a3b8',\n },\n },\n\n drawingToolbar: {\n iconColor: '#333333', // tooltip.text\n activeIconColor: '#398dff',\n flyoutLabelColor: '#666666',\n flyoutHeadingColor: '#666666',\n },\n\n topBar: {\n btnColor: '#666666',\n activeBtnColor: '#398dff',\n flyoutRowColor: '#666666',\n flyoutCategoryColor: '#666666',\n },\n\n bottomBar: {\n btnColor: '#666666',\n activeBtnBg: '#5caf79', // candle.up\n activeBtnText: '#ffffff',\n activeBtnBorder: '#5caf79',\n },\n\n indicatorOverlay: {\n pillBg: 'rgba(248,248,248,0.85)', // tooltip.background + alpha\n iconColor: '#666666',\n dropdownHoverBg: '#f0f0f0',\n },\n\n tradeLevels: {\n tradeLine: '#5caf79',\n positionLine: '#6d28d9',\n pendingBuyLine: 'rgba(92,175,121,0.75)',\n pendingSellLine: 'rgba(223,104,104,0.75)',\n labelText: '#ffffff',\n closeBtn: 'rgba(0,0,0,0.15)',\n closeBtnText: '#ffffff',\n boxBg: 'rgba(240, 244, 252, 0.95)',\n boxBgHover: 'rgba(255, 255, 255, 0.99)',\n dragHandle: '#94a3b8',\n dragHandleHover: '#475569',\n },\n\n tradePanel: {\n background: '#f8f8f8',\n border: '#cccccc',\n headerBg: '#f0f0f0',\n tabActive: '#398dff',\n tabInactive: '#666666',\n rowHoverBg: 'rgba(0,0,0,0.03)',\n rowText: '#333333',\n rowSubText: '#666666',\n },\n};\n","// ── Per-component UI configuration ────────────────────────────────────────────\n//\n// Non-color values only (sizes, fonts, spacing).\n// Colors live in ChartTheme (themes.ts) under the `ui` and component-specific\n// sub-keys so they can be swapped per theme.\n//\n// Each section is intentionally independent — a drawing-toolbar label and an\n// indicator-pill label may share the same numeric value by coincidence but are\n// separate properties so either can be changed without affecting the other.\n\n// ── Drawing Toolbar (LeftBar) ─────────────────────────────────────────────────\n\nexport interface DrawingToolbarUiConfig {\n /** Icon button size (width = height) in px */\n iconBtnSize: number;\n /** Font size for unicode icons inside category buttons */\n iconFontSize: string;\n /** Font family for icon buttons */\n iconFontFamily: string;\n /** Font size for tool-name labels inside the category flyout */\n flyoutLabelFontSize: string;\n /** Font family for flyout tool labels */\n flyoutLabelFontFamily: string;\n /** Font size for keyboard shortcut hints in flyout rows */\n shortcutFontSize: string;\n /** Font size for \"soon\" badges in flyout rows */\n soonBadgeFontSize: string;\n /** Font size for the category-group header inside flyouts */\n flyoutHeadingFontSize: string;\n /** Letter-spacing for flyout group headings */\n flyoutHeadingLetterSpacing: string;\n /** Height of the scroll-up / scroll-down indicator buttons in px */\n scrollBtnHeight: number;\n /** Font size for scroll indicator arrow glyphs */\n scrollBtnFontSize: string;\n /** Horizontal padding inside the sidebar bar in px */\n barPadding: number;\n /** Gap between icon buttons in the grid in px */\n btnGap: number;\n /** Container width (px) below which LeftBar switches to mobile layout */\n mobileBreakpoint: number;\n}\n\n// ── Top Bar ───────────────────────────────────────────────────────────────────\n\nexport interface TopBarUiConfig {\n /** Height of the top bar strip */\n height: string;\n /** Font size for series / timeframe / indicator dropdown buttons */\n dropBtnFontSize: string;\n /** Font family for dropdown buttons */\n dropBtnFontFamily: string;\n /** Size (width = height) of the drawing-mode toggle button */\n drawBtnSize: string;\n /** Font size for the icon inside the drawing toggle button */\n drawBtnIconFontSize: string;\n /** Font size for flyout list rows */\n flyoutRowFontSize: string;\n /** Font family for flyout list rows */\n flyoutRowFontFamily: string;\n /** Font size for flyout group-category headers */\n flyoutCategoryFontSize: string;\n /** Letter-spacing for flyout category headers */\n flyoutCategoryLetterSpacing: string;\n /** Checkmark icon font size inside flyout active rows */\n flyoutCheckFontSize: string;\n /** Diameter of the stream-status dot indicator */\n streamDotSize: string;\n}\n\n// ── Bottom Bar ────────────────────────────────────────────────────────────────\n\nexport interface BottomBarUiConfig {\n /** Height of the bottom bar strip */\n height: string;\n /** Font size for duration selector buttons (1D, 5D, 1M …) */\n btnFontSize: string;\n /** Font family for duration buttons */\n btnFontFamily: string;\n}\n\n// ── Price Axis (Y-axis) ───────────────────────────────────────────────────────\n\nexport interface PriceAxisUiConfig {\n /** Font size for price tick labels */\n fontSize: string;\n /** Font family for price tick labels */\n fontFamily: string;\n}\n\n// ── Time Axis (X-axis) ────────────────────────────────────────────────────────\n\nexport interface TimeAxisUiConfig {\n /** Font size for time tick labels */\n fontSize: string;\n /** Font family for time tick labels */\n fontFamily: string;\n}\n\n// ── Crosshair overlay ─────────────────────────────────────────────────────────\n\nexport interface CrosshairUiConfig {\n /** Height of the price-tag label drawn on the Y-axis in px */\n labelHeight: number;\n /** Horizontal padding inside the price-tag label in px */\n labelPaddingX: number;\n /** Font size for price and time labels */\n fontSize: string;\n /** Font family for price and time labels */\n fontFamily: string;\n}\n\n// ── Indicator Overlay (pills above the chart) ─────────────────────────────────\n\nexport interface IndicatorOverlayUiConfig {\n /** Font size for inline indicator pill labels */\n pillFontSize: string;\n /** Font family for inline indicator pills */\n pillFontFamily: string;\n /** Font size for the colour-dot glyph inside pills */\n dotFontSize: string;\n /** Font size for gear ⚙ and remove ✕ icons inside inline pills */\n pillIconFontSize: string;\n /** Font size for the \"N indicators\" collapse toggle button */\n collapseBtnFontSize: string;\n /** Font family for the collapse toggle button */\n collapseBtnFontFamily: string;\n /** Font size for rows inside the collapsed dropdown panel */\n dropdownRowFontSize: string;\n /** Font family for dropdown rows */\n dropdownRowFontFamily: string;\n /** Font size for gear ⚙ and remove ✕ icons inside dropdown rows */\n dropdownIconFontSize: string;\n}\n\n// ── Aggregated full UI config ─────────────────────────────────────────────────\n\nexport interface UiConfig {\n drawingToolbar: DrawingToolbarUiConfig;\n topBar: TopBarUiConfig;\n bottomBar: BottomBarUiConfig;\n priceAxis: PriceAxisUiConfig;\n timeAxis: TimeAxisUiConfig;\n crosshair: CrosshairUiConfig;\n indicatorOverlay: IndicatorOverlayUiConfig;\n}\n\n// ── Default values ────────────────────────────────────────────────────────────\n\nconst INTER_FONT = \"'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\";\n\nexport const DEFAULT_DRAWING_TOOLBAR_CONFIG: DrawingToolbarUiConfig = {\n iconBtnSize: 40,\n iconFontSize: '20px',\n iconFontFamily: INTER_FONT,\n flyoutLabelFontSize: '12px',\n flyoutLabelFontFamily: INTER_FONT,\n shortcutFontSize: '9px',\n soonBadgeFontSize: '9px',\n flyoutHeadingFontSize: '10px',\n flyoutHeadingLetterSpacing: '0.08em',\n scrollBtnHeight: 20,\n scrollBtnFontSize: '9px',\n barPadding: 7,\n btnGap: 4,\n mobileBreakpoint: 480,\n};\n\nexport const DEFAULT_TOP_BAR_CONFIG: TopBarUiConfig = {\n height: '36px',\n dropBtnFontSize: '11px',\n dropBtnFontFamily: INTER_FONT,\n drawBtnSize: '26px',\n drawBtnIconFontSize: '14px',\n flyoutRowFontSize: '12px',\n flyoutRowFontFamily: INTER_FONT,\n flyoutCategoryFontSize: '10px',\n flyoutCategoryLetterSpacing: '0.08em',\n flyoutCheckFontSize: '11px',\n streamDotSize: '7px',\n};\n\nexport const DEFAULT_BOTTOM_BAR_CONFIG: BottomBarUiConfig = {\n height: '32px',\n btnFontSize: '11px',\n btnFontFamily: INTER_FONT,\n};\n\nexport const DEFAULT_PRICE_AXIS_CONFIG: PriceAxisUiConfig = {\n fontSize: '11px',\n fontFamily: INTER_FONT,\n};\n\nexport const DEFAULT_TIME_AXIS_CONFIG: TimeAxisUiConfig = {\n fontSize: '11px',\n fontFamily: INTER_FONT,\n};\n\nexport const DEFAULT_CROSSHAIR_CONFIG: CrosshairUiConfig = {\n labelHeight: 18,\n labelPaddingX: 4,\n fontSize: '11px',\n fontFamily: INTER_FONT,\n};\n\nexport const DEFAULT_INDICATOR_OVERLAY_CONFIG: IndicatorOverlayUiConfig = {\n pillFontSize: '13px',\n pillFontFamily: INTER_FONT,\n dotFontSize: '8px',\n pillIconFontSize: '12px',\n collapseBtnFontSize: '13px',\n collapseBtnFontFamily: INTER_FONT,\n dropdownRowFontSize: '11px',\n dropdownRowFontFamily: INTER_FONT,\n dropdownIconFontSize: '10px',\n};\n\nexport const DEFAULT_UI_CONFIG: UiConfig = {\n drawingToolbar: DEFAULT_DRAWING_TOOLBAR_CONFIG,\n topBar: DEFAULT_TOP_BAR_CONFIG,\n bottomBar: DEFAULT_BOTTOM_BAR_CONFIG,\n priceAxis: DEFAULT_PRICE_AXIS_CONFIG,\n timeAxis: DEFAULT_TIME_AXIS_CONFIG,\n crosshair: DEFAULT_CROSSHAIR_CONFIG,\n indicatorOverlay: DEFAULT_INDICATOR_OVERLAY_CONFIG,\n};\n\n// ── Deep-partial helper type ──────────────────────────────────────────────────\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];\n};\n\n/**\n * Merge a deep-partial user override on top of a full default config.\n * Only the top-level keys of `UiConfig` are merged — component configs\n * are replaced as a whole unit if provided (shallow merge per component).\n */\nexport function resolveUiConfig(override?: DeepPartial<UiConfig>): UiConfig {\n if (!override) return DEFAULT_UI_CONFIG;\n return {\n drawingToolbar: { ...DEFAULT_DRAWING_TOOLBAR_CONFIG, ...override.drawingToolbar },\n topBar: { ...DEFAULT_TOP_BAR_CONFIG, ...override.topBar },\n bottomBar: { ...DEFAULT_BOTTOM_BAR_CONFIG, ...override.bottomBar },\n priceAxis: { ...DEFAULT_PRICE_AXIS_CONFIG, ...override.priceAxis },\n timeAxis: { ...DEFAULT_TIME_AXIS_CONFIG, ...override.timeAxis },\n crosshair: { ...DEFAULT_CROSSHAIR_CONFIG, ...override.crosshair },\n indicatorOverlay: { ...DEFAULT_INDICATOR_OVERLAY_CONFIG, ...override.indicatorOverlay },\n };\n}\n","// ── User-visible UI string labels ─────────────────────────────────────────────\n//\n// All static text that appears in the chart UI is centralised here so that\n// consumer projects can supply their own translations without forking the library.\n//\n// Usage:\n// import { DEFAULT_LABELS, resolveLabels } from '@acttrader/stockchart';\n// const labels = resolveLabels({ trade: { buy: 'Acheter', sell: 'Vendre' } });\n//\n// In ChartConfig pass `labels` and the engine resolves it automatically:\n// new ChartEngine({ ..., labels: { trade: { buy: 'Acheter' } } });\n//\n// Placeholder tokens:\n// {count} — replaced with the current count at render time\n// {name} — replaced with the indicator / level name at render time\n\nimport type { Timeframe, Duration, DrawingToolType } from './types.js';\nimport type { DeepPartial } from './uiConfig.js';\n\n// ── Top bar ───────────────────────────────────────────────────────────────────\n\nexport interface TopBarLabels {\n /** Dropdown label for each series (chart) type. */\n series: {\n candlestick: string;\n hollow: string;\n ohlc: string;\n line: string;\n area: string;\n heikinashi: string;\n volumecandles: string;\n linemarkers: string;\n step: string;\n hlcarea: string;\n baseline: string;\n columns: string;\n highlow: string;\n };\n /** Timeframe dropdown button labels. */\n timeframes: Record<Timeframe, string>;\n /** Indicators button text when no indicators are active. */\n indicatorsBtn: string;\n /** Indicators button text when one or more indicators are active.\n * Use `{count}` as a placeholder for the active count. */\n indicatorsBtnActive: string;\n /** Tooltip on the drawing-toolbar toggle button. */\n toggleDrawingTitle: string;\n /** Tooltip on the fullscreen button when in normal mode. */\n toggleFullscreenTitle: string;\n /** Tooltip on the fullscreen button when already in fullscreen. */\n exitFullscreenTitle: string;\n /** Tooltip on the chart-settings button. */\n settingsTitle: string;\n}\n\n// ── Bottom bar ────────────────────────────────────────────────────────────────\n\nexport interface BottomBarLabels {\n /** Duration selector button labels. */\n durations: Record<Duration, string>;\n}\n\n// ── Drawing toolbar (LeftBar) ─────────────────────────────────────────────────\n\nexport interface DrawingToolbarLabels {\n /** Category flyout heading labels. */\n categories: {\n trendLines: string;\n fibonacci: string;\n shapes: string;\n measurements: string;\n pitchforks: string;\n volume: string;\n annotations: string;\n patterns: string;\n elliott: string;\n brushes: string;\n advanced: string;\n priceProjection: string;\n };\n /** Individual drawing tool names (used in flyout rows). */\n tools: Record<DrawingToolType, string>;\n /** Action button tooltips at the bottom of the toolbar. */\n actions: {\n undo: string;\n redo: string;\n deleteSelected: string;\n clearAll: string;\n showAll: string;\n hideAll: string;\n lockAll: string;\n unlockAll: string;\n /** Tooltip for the combined actions button in mobile layout. */\n moreActions: string;\n };\n /** Badge text shown on drawing tools that are not yet implemented. */\n soonBadge: string;\n /** Tooltip for the scroll-up indicator button. */\n scrollUp: string;\n /** Tooltip for the scroll-down indicator button. */\n scrollDown: string;\n}\n\n// ── OHLC strip ────────────────────────────────────────────────────────────────\n\nexport interface OhlcLabels {\n /** Label shown before the open price. */\n open: string;\n /** Label shown before the high price. */\n high: string;\n /** Label shown before the low price. */\n low: string;\n /** Label shown before the close price. */\n close: string;\n /** Label shown before the volume value. */\n volume: string;\n}\n\n// ── Trade / TFC labels ────────────────────────────────────────────────────────\n\nexport interface TradeLabels {\n /** Buy side label (trade button, order popover). */\n buy: string;\n /** Sell side label. */\n sell: string;\n /** Limit order type label. */\n limit: string;\n /** Stop order type label. */\n stop: string;\n /** Market order type label. */\n market: string;\n /** Quantity input label in the draft-order input. */\n qty: string;\n /** Tooltip on the floating trade button (⊕). */\n placeOrderTitle: string;\n}\n\n// ── Dialogs ───────────────────────────────────────────────────────────────────\n\nexport interface DialogLabels {\n /** Chart Settings dialog. */\n settings: {\n /** Dialog title bar text. */\n title: string;\n /** Section header for Trade from Charts settings. */\n tfcSection: string;\n /** Label for the trade-display-filter radio group. */\n showLabel: string;\n /** Label for the position render-style radio group. */\n positionStyleLabel: string;\n /** Radio option — show all levels. */\n showAll: string;\n /** Radio option — show positions only. */\n showPositions: string;\n /** Radio option — show pending orders only. */\n showOrders: string;\n /** Radio option — hide all trade levels. */\n showNone: string;\n /** Radio option — render positions as full horizontal lines. */\n styleLine: string;\n /** Radio option — render positions as dots on the price axis. */\n styleDot: string;\n /** Reset-to-defaults button label. */\n resetBtn: string;\n };\n /** Indicator Settings dialog. */\n indicator: {\n /** Appended to the indicator name in the dialog title bar.\n * Rendered as \"{indicator name} {titleSuffix}\". */\n titleSuffix: string;\n /** Message shown when an indicator has no configurable parameters. */\n noParams: string;\n };\n}\n\n// ── Misc chart-level labels ───────────────────────────────────────────────────\n\nexport interface ChartMiscLabels {\n /** Overlay text shown while data is being fetched. */\n loading: string;\n /** Tooltip on the \"jump to live edge\" button. */\n scrollToLatest: string;\n /** Collapse button text in the indicator overlay when more than 2 indicators\n * are active. Use `{count}` as a placeholder for the count. */\n nIndicators: string;\n}\n\n// ── Root interface ────────────────────────────────────────────────────────────\n\nexport interface ChartLabels {\n topBar: TopBarLabels;\n bottomBar: BottomBarLabels;\n drawingToolbar: DrawingToolbarLabels;\n ohlc: OhlcLabels;\n trade: TradeLabels;\n dialogs: DialogLabels;\n chart: ChartMiscLabels;\n}\n\n// ── Default English labels ────────────────────────────────────────────────────\n\nexport const DEFAULT_LABELS: ChartLabels = {\n topBar: {\n series: {\n candlestick: 'Candles',\n hollow: 'Hollow',\n ohlc: 'OHLC',\n line: 'Line',\n area: 'Area',\n heikinashi: 'Heikin Ashi',\n volumecandles: 'Volume Candles',\n linemarkers: 'Line with Markers',\n step: 'Step Line',\n hlcarea: 'HLC Area',\n baseline: 'Baseline',\n columns: 'Columns',\n highlow: 'High-low',\n },\n timeframes: {\n '1m': '1m',\n '5m': '5m',\n '15m': '15m',\n '30m': '30m',\n '1h': '1h',\n '4h': '4h',\n '1D': '1D',\n '1W': '1W',\n '1M': '1M',\n '1Y': '1Y',\n },\n indicatorsBtn: 'Indicators',\n indicatorsBtnActive: 'Indicators ({count})',\n toggleDrawingTitle: 'Toggle Drawing Tools',\n toggleFullscreenTitle:'Toggle Fullscreen',\n exitFullscreenTitle: 'Exit Fullscreen',\n settingsTitle: 'Settings',\n },\n\n bottomBar: {\n durations: {\n '1D': '1D',\n '5D': '5D',\n '1M': '1M',\n '3M': '3M',\n '6M': '6M',\n '1Y': '1Y',\n '5Y': '5Y',\n 'All': 'All',\n },\n },\n\n drawingToolbar: {\n categories: {\n trendLines: 'Trend Lines & Channels',\n fibonacci: 'Fibonacci & Gann Tools',\n shapes: 'Geometric Shapes',\n measurements: 'Measurement Tools',\n pitchforks: 'Pitchfork Tools',\n volume: 'Volume & Statistical Tools',\n annotations: 'Annotation Tools',\n patterns: 'Pattern Recognition',\n elliott: 'Elliott Wave Tools',\n brushes: 'Brush & Highlighter',\n advanced: 'Advanced Tools',\n priceProjection: 'Price Projection Tools',\n },\n tools: {\n horizontalLine: 'Horizontal Line',\n verticalLine: 'Vertical Line',\n trendLine: 'Trend Line',\n trendAngle: 'Trend Angle',\n crossLine: 'Cross Line',\n parallelChannel: 'Parallel Channel',\n flatChannel: 'Flat Top/Bottom Channel',\n disjointChannel: 'Disjoint Channel',\n fibRetracement: 'Fibonacci Retracement',\n fibExtension: 'Fibonacci Extension',\n fibChannel: 'Fibonacci Channel',\n fibTimezone: 'Fibonacci Timezone',\n fibCircles: 'Fibonacci Circles',\n fibSpiral: 'Fibonacci Spiral',\n fibFan: 'Fibonacci Speed Resistance Fan',\n fibProjection: 'Fibonacci Projection',\n gannFan: 'Gann Fan',\n gannSquare: 'Gann Square',\n gannBox: 'Gann Box',\n rectangle: 'Rectangle',\n rotatedRectangle: 'Rotated Rectangle',\n ellipse: 'Ellipse',\n triangle: 'Triangle',\n circle: 'Circle',\n arc: 'Arc',\n polyline: 'Polyline',\n path: 'Path',\n priceRange: 'Price Range',\n dateRange: 'Date Range',\n datePriceRange: 'Date & Price Range',\n ruler: 'Ruler',\n pitchfork: 'Pitchfork',\n schiffPitchfork: 'Schiff Pitchfork',\n modifiedSchiff: 'Modified Schiff Pitchfork',\n insidePitchfork: 'Inside Pitchfork',\n fixedRangeVP: 'Fixed Range Volume Profile',\n anchoredVP: 'Anchored Volume Profile',\n volumeProfile: 'Volume Profile',\n regressionTrend: 'Regression Trend',\n text: 'Text',\n callout: 'Callout',\n priceLabel: 'Price Label',\n arrowMarker: 'Arrow Marker',\n flag: 'Flag',\n priceNote: 'Price Note',\n anchoredNote: 'Anchored Note',\n arrowUp: 'Arrow Up',\n arrowDown: 'Arrow Down',\n headShoulders: 'Head & Shoulders',\n trianglePattern: 'Triangle Pattern',\n threeDrives: '3 Drives Pattern',\n abcdPattern: 'ABCD Pattern',\n cypherPattern: 'Cypher Pattern',\n butterflyPattern: 'Butterfly Pattern',\n batPattern: 'Bat Pattern',\n gartleyPattern: 'Gartley Pattern',\n crabPattern: 'Crab Pattern',\n sharkPattern: 'Shark Pattern',\n elliottImpulse: 'Elliott Impulse (12345)',\n elliottCorrective: 'Elliott Corrective (ABC)',\n elliottTriangle: 'Elliott Wave Triangle',\n elliottCombination: 'Elliott Wave Combination',\n elliottWxy: 'Elliott Double Three (WXY)',\n brush: 'Brush',\n highlighter: 'Highlighter',\n ghostFeed: 'Ghost Feed',\n projection: 'Projection',\n sineLine: 'Sine Line',\n cyclicLines: 'Cyclic Lines',\n timeCycles: 'Time Cycles',\n priceProjection: 'Price Projection',\n },\n actions: {\n undo: 'Undo (Ctrl+Z)',\n redo: 'Redo (Ctrl+Y)',\n deleteSelected: 'Delete Selected (Del)',\n clearAll: 'Clear All',\n showAll: 'Show All',\n hideAll: 'Hide All',\n lockAll: 'Lock All',\n unlockAll: 'Unlock All',\n moreActions: 'Actions',\n },\n soonBadge: 'soon',\n scrollUp: 'Scroll up',\n scrollDown: 'Scroll down',\n },\n\n ohlc: {\n open: 'O',\n high: 'H',\n low: 'L',\n close: 'C',\n volume: 'V',\n },\n\n trade: {\n buy: 'Buy',\n sell: 'Sell',\n limit: 'Limit',\n stop: 'Stop',\n market: 'Market',\n qty: 'Qty',\n placeOrderTitle:'Place order at this price',\n },\n\n dialogs: {\n settings: {\n title: 'Chart Settings',\n tfcSection: 'Trade from Charts',\n showLabel: 'Show',\n positionStyleLabel: 'Position Style',\n showAll: 'All',\n showPositions: 'Positions Only',\n showOrders: 'Orders Only',\n showNone: 'None',\n styleLine: 'Full Line',\n styleDot: 'Dot',\n resetBtn: 'Reset to Defaults',\n },\n indicator: {\n titleSuffix: 'Settings',\n noParams: 'No configurable parameters.',\n },\n },\n\n chart: {\n loading: 'Loading\\u2026', // 'Loading…'\n scrollToLatest: 'Scroll to latest',\n nIndicators: '{count} indicators',\n },\n};\n\n// ── Merge helper ──────────────────────────────────────────────────────────────\n\n/**\n * Deep-merges a partial labels override on top of `DEFAULT_LABELS`.\n * Only keys you provide are overridden; all others fall back to the defaults.\n *\n * @example\n * const labels = resolveLabels({\n * trade: { buy: 'Acheter', sell: 'Vendre' },\n * });\n */\nexport function resolveLabels(override?: DeepPartial<ChartLabels>): ChartLabels {\n if (!override) return DEFAULT_LABELS;\n\n const base = DEFAULT_LABELS;\n\n return {\n topBar: {\n ...base.topBar,\n ...override.topBar,\n series: { ...base.topBar.series, ...override.topBar?.series },\n timeframes: { ...base.topBar.timeframes, ...override.topBar?.timeframes },\n },\n bottomBar: {\n durations: { ...base.bottomBar.durations, ...override.bottomBar?.durations },\n },\n drawingToolbar: {\n ...base.drawingToolbar,\n ...override.drawingToolbar,\n categories: { ...base.drawingToolbar.categories, ...override.drawingToolbar?.categories },\n tools: { ...base.drawingToolbar.tools, ...override.drawingToolbar?.tools },\n actions: { ...base.drawingToolbar.actions, ...override.drawingToolbar?.actions },\n },\n ohlc: { ...base.ohlc, ...override.ohlc },\n trade: { ...base.trade, ...override.trade },\n dialogs: {\n settings: { ...base.dialogs.settings, ...override.dialogs?.settings },\n indicator: { ...base.dialogs.indicator, ...override.dialogs?.indicator },\n },\n chart: { ...base.chart, ...override.chart },\n };\n}\n","import type { Viewport } from '../core/types.js';\n\nexport class PanHandler {\n private isDragging = false;\n private lastX = 0;\n private lastY = 0;\n private dragStartX = 0;\n private dragStartY = 0;\n private hasPanned = false;\n private static readonly DRAG_THRESHOLD = 4; // px — below this = click, not drag\n\n constructor(\n private readonly canvas: HTMLCanvasElement,\n private getViewport: () => Viewport,\n private setViewport: (v: Viewport) => void,\n private totalBars: () => number,\n private onUpdate: () => void,\n /** When this returns true, all pan interaction is suppressed (e.g. drawing mode). */\n private isLocked: () => boolean = () => false,\n /** Optional vertical pan callback — receives pixel delta Y. */\n private panY?: (deltaY: number) => void,\n ) {\n this.attach();\n }\n\n private attach(): void {\n this.canvas.addEventListener('mousedown', this.onMouseDown);\n window.addEventListener('mousemove', this.onMouseMove);\n window.addEventListener('mouseup', this.onMouseUp);\n\n // Touch support\n this.canvas.addEventListener('touchstart', this.onTouchStart, { passive: true });\n window.addEventListener('touchmove', this.onTouchMove, { passive: false });\n window.addEventListener('touchend', this.onMouseUp);\n }\n\n destroy(): void {\n this.canvas.removeEventListener('mousedown', this.onMouseDown);\n window.removeEventListener('mousemove', this.onMouseMove);\n window.removeEventListener('mouseup', this.onMouseUp);\n this.canvas.removeEventListener('touchstart', this.onTouchStart);\n window.removeEventListener('touchmove', this.onTouchMove);\n window.removeEventListener('touchend', this.onMouseUp);\n }\n\n private onMouseDown = (e: MouseEvent) => {\n if (this.isLocked()) return;\n this.isDragging = true;\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n this.dragStartX = e.clientX;\n this.dragStartY = e.clientY;\n this.hasPanned = false;\n };\n\n private onTouchStart = (e: TouchEvent) => {\n if (this.isLocked()) return;\n if (e.touches.length !== 1) return;\n this.isDragging = true;\n this.lastX = e.touches[0].clientX;\n this.lastY = e.touches[0].clientY;\n };\n\n private onMouseMove = (e: MouseEvent) => {\n if (!this.isDragging) return;\n if (this.isLocked()) { this.isDragging = false; this.hasPanned = false; return; }\n const deltaX = e.clientX - this.lastX;\n const deltaY = e.clientY - this.lastY;\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n const totalDeltaX = Math.abs(e.clientX - this.dragStartX);\n const totalDeltaY = Math.abs(e.clientY - this.dragStartY);\n if (!this.hasPanned && (totalDeltaX > PanHandler.DRAG_THRESHOLD || totalDeltaY > PanHandler.DRAG_THRESHOLD)) {\n this.hasPanned = true;\n this.canvas.style.cursor = 'grabbing';\n }\n if (this.hasPanned) {\n this.pan(deltaX);\n if (this.panY) this.panY(deltaY);\n }\n };\n\n private onTouchMove = (e: TouchEvent) => {\n if (!this.isDragging || e.touches.length !== 1) return;\n if (this.isLocked()) { this.isDragging = false; return; }\n e.preventDefault();\n const deltaX = e.touches[0].clientX - this.lastX;\n const deltaY = e.touches[0].clientY - this.lastY;\n this.pan(deltaX);\n if (this.panY) this.panY(deltaY);\n this.lastX = e.touches[0].clientX;\n this.lastY = e.touches[0].clientY;\n };\n\n private onMouseUp = () => {\n if (this.hasPanned) this.canvas.style.cursor = 'crosshair';\n this.isDragging = false;\n this.hasPanned = false;\n };\n\n private pan(deltaX: number): void {\n const vp = this.getViewport();\n const visibleBars = vp.endIndex - vp.startIndex;\n const barsPerPixel = visibleBars / this.canvas.width;\n const shift = -deltaX * barsPerPixel;\n\n const maxStart = this.totalBars(); // allow scrolling up to one full viewport ahead of the last candle\n const newStart = Math.max(0, Math.min(maxStart, vp.startIndex + shift));\n\n this.setViewport({ ...vp, startIndex: newStart, endIndex: newStart + visibleBars });\n this.onUpdate();\n }\n}\n","import type { Viewport } from '../core/types.js';\n\nconst MIN_VISIBLE_BARS = 10;\nconst MAX_VISIBLE_BARS = 500;\n\nexport class ZoomHandler {\n private _pinchStartDist = 0;\n private _pinchStartRatio = 0;\n private _pinchStartViewport: Viewport | null = null;\n\n constructor(\n private readonly canvas: HTMLCanvasElement,\n private getViewport: () => Viewport,\n private setViewport: (v: Viewport) => void,\n private totalBars: () => number,\n private onUpdate: () => void,\n private getCanvasRect: () => DOMRect = () => canvas.getBoundingClientRect(),\n private getChartWidth: () => number = () => canvas.offsetWidth,\n private panByPixelDelta?: (dx: number) => void,\n ) {\n this.attach();\n }\n\n private attach(): void {\n this.canvas.addEventListener('wheel', this.onWheel, { passive: false });\n this.canvas.addEventListener('touchstart', this.onTouchStart, { passive: true });\n this.canvas.addEventListener('touchmove', this.onTouchMove, { passive: false });\n this.canvas.addEventListener('touchend', this.onTouchEnd);\n }\n\n destroy(): void {\n this.canvas.removeEventListener('wheel', this.onWheel);\n this.canvas.removeEventListener('touchstart', this.onTouchStart);\n this.canvas.removeEventListener('touchmove', this.onTouchMove);\n this.canvas.removeEventListener('touchend', this.onTouchEnd);\n }\n\n private onWheel = (e: WheelEvent): void => {\n e.preventDefault();\n\n const vp = this.getViewport();\n const visibleBars = vp.endIndex - vp.startIndex;\n\n // On macOS trackpads (and Windows touchpads with pinch), browsers synthesize\n // a wheel event with `ctrlKey === true` for pinch gestures. The `deltaY`\n // values are small/continuous, so a fixed-step factor produces a jumpy zoom.\n // Use a smooth proportional factor for pinch, fixed step for regular scroll.\n let zoomFactor: number;\n if (e.ctrlKey) {\n // Pinch: smooth, proportional. Clamp deltaY to avoid extreme jumps.\n const clamped = Math.max(-50, Math.min(50, e.deltaY));\n zoomFactor = Math.exp(clamped * 0.01);\n } else {\n // Horizontal trackpad swipe: route to pan instead of zoom.\n // deltaX dominates (or is non-zero alongside a small deltaY) → pan.\n if (e.deltaX !== 0 && Math.abs(e.deltaX) > Math.abs(e.deltaY) * 0.5) {\n if (this.panByPixelDelta) this.panByPixelDelta(e.deltaX);\n this.onUpdate();\n return;\n }\n if (e.deltaY === 0) return;\n zoomFactor = e.deltaY > 0 ? 1.1 : 0.9; // scroll down = zoom out\n }\n const newVisible = Math.round(\n Math.max(MIN_VISIBLE_BARS, Math.min(MAX_VISIBLE_BARS, visibleBars * zoomFactor)),\n );\n\n if (vp.endIndex >= this.totalBars()) {\n // At the live edge: anchor the right side so the last candle stays\n // near the price axis instead of drifting left on zoom-in.\n const newEnd = vp.endIndex;\n const newStart = Math.max(0, newEnd - newVisible);\n this.setViewport({ ...vp, startIndex: newStart, endIndex: newEnd });\n } else {\n // Historical view: zoom around the mouse cursor position.\n const mouseRatio = e.offsetX / this.canvas.width;\n const pivotBar = vp.startIndex + visibleBars * mouseRatio;\n const newStart = Math.max(0, pivotBar - newVisible * mouseRatio);\n this.setViewport({ ...vp, startIndex: newStart, endIndex: newStart + newVisible });\n }\n\n this.onUpdate();\n };\n\n private onTouchStart = (e: TouchEvent): void => {\n if (e.touches.length !== 2) return;\n const dist = this.pinchDist(e.touches[0], e.touches[1]);\n this._pinchStartDist = dist;\n this._pinchStartViewport = { ...this.getViewport() };\n\n const rect = this.getCanvasRect();\n const midClientX = (e.touches[0].clientX + e.touches[1].clientX) / 2;\n const midX = midClientX - rect.left;\n this._pinchStartRatio = Math.max(0, Math.min(1, midX / this.getChartWidth()));\n };\n\n private onTouchMove = (e: TouchEvent): void => {\n if (e.touches.length !== 2) return;\n e.preventDefault();\n\n const currentDist = this.pinchDist(e.touches[0], e.touches[1]);\n\n // Fallback: initialize if touchstart was missed\n if (this._pinchStartDist === 0 || !this._pinchStartViewport) {\n this._pinchStartDist = currentDist;\n this._pinchStartViewport = { ...this.getViewport() };\n const rect = this.getCanvasRect();\n const midClientX = (e.touches[0].clientX + e.touches[1].clientX) / 2;\n this._pinchStartRatio = Math.max(0, Math.min(1, (midClientX - rect.left) / this.getChartWidth()));\n return;\n }\n\n // Total zoom factor from gesture start — avoids incremental drift accumulation\n const totalFactor = this._pinchStartDist / currentDist;\n\n const vp = this._pinchStartViewport;\n const startVisibleBars = vp.endIndex - vp.startIndex;\n const newVisible = Math.round(\n Math.max(MIN_VISIBLE_BARS, Math.min(MAX_VISIBLE_BARS, startVisibleBars * totalFactor)),\n );\n\n // Anchor around the fixed initial midpoint — midpoint drift mid-gesture has no effect\n const mouseRatio = this._pinchStartRatio;\n const pivotBar = vp.startIndex + startVisibleBars * mouseRatio;\n const newStart = Math.max(0, pivotBar - newVisible * mouseRatio);\n this.setViewport({ ...vp, startIndex: newStart, endIndex: newStart + newVisible });\n this.onUpdate();\n };\n\n private onTouchEnd = (): void => {\n this._pinchStartDist = 0;\n this._pinchStartViewport = null;\n };\n\n private pinchDist(t0: Touch, t1: Touch): number {\n const dx = t1.clientX - t0.clientX;\n const dy = t1.clientY - t0.clientY;\n return Math.sqrt(dx * dx + dy * dy);\n }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderCandlestick(\n ctx: CanvasRenderingContext2D,\n bars: OHLCVBar[],\n viewport: Viewport,\n priceRange: PriceRange,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n chartHeight: number,\n): void {\n const bodyWidth = scale.candleBodyWidth(viewport, chartWidth);\n const n = bars.length;\n\n // Precompute pixel coords once to avoid redundant transform calls across passes\n const xs = new Float32Array(n);\n const highsY = new Float32Array(n);\n const lowsY = new Float32Array(n);\n const opensY = new Float32Array(n);\n const closesY = new Float32Array(n);\n const upFlags = new Uint8Array(n);\n\n const startBar = Math.floor(viewport.startIndex);\n for (let i = 0; i < n; i++) {\n const bar = bars[i];\n xs[i] = scale.xToPixel(startBar + i, viewport, chartWidth);\n highsY[i] = scale.yToPixel(bar.high, priceRange, chartHeight);\n lowsY[i] = scale.yToPixel(bar.low, priceRange, chartHeight);\n opensY[i] = scale.yToPixel(bar.open, priceRange, chartHeight);\n closesY[i] = scale.yToPixel(bar.close, priceRange, chartHeight);\n upFlags[i] = bar.close >= bar.open ? 1 : 0;\n }\n\n ctx.lineWidth = 1;\n\n // Pass 1a: up wicks — one batched path\n ctx.strokeStyle = theme.candle.wickUp;\n ctx.beginPath();\n for (let i = 0; i < n; i++) {\n if (upFlags[i]) { ctx.moveTo(xs[i], highsY[i]); ctx.lineTo(xs[i], lowsY[i]); }\n }\n ctx.stroke();\n\n // Pass 1b: down wicks — one batched path\n ctx.strokeStyle = theme.candle.wickDown;\n ctx.beginPath();\n for (let i = 0; i < n; i++) {\n if (!upFlags[i]) { ctx.moveTo(xs[i], highsY[i]); ctx.lineTo(xs[i], lowsY[i]); }\n }\n ctx.stroke();\n\n // Pass 2: bodies\n for (let i = 0; i < n; i++) {\n const bodyTop = Math.min(opensY[i], closesY[i]);\n const bodyHeight = Math.max(Math.abs(closesY[i] - opensY[i]), 1);\n const isUp = upFlags[i] === 1;\n const fillColor = isUp ? theme.candle.up : theme.candle.down;\n const borderColor = isUp\n ? (theme.candle.borderUp ?? theme.candle.up)\n : (theme.candle.borderDown ?? theme.candle.down);\n ctx.fillStyle = fillColor;\n ctx.fillRect(xs[i] - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n if (borderColor !== fillColor) {\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = 1;\n ctx.strokeRect(xs[i] - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n }\n }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\n/**\n * Hollow candle series:\n * - Up bar (close >= open): hollow body (stroke only), wick in up color\n * - Down bar (close < open): filled body, wick in down color\n */\nexport function renderHollowCandle(\n ctx: CanvasRenderingContext2D,\n bars: OHLCVBar[],\n viewport: Viewport,\n priceRange: PriceRange,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n chartHeight: number,\n): void {\n const bodyWidth = scale.candleBodyWidth(viewport, chartWidth);\n const startBar = Math.floor(viewport.startIndex);\n\n for (let i = 0; i < bars.length; i++) {\n const bar = bars[i];\n const barIndex = startBar + i;\n const x = scale.xToPixel(barIndex, viewport, chartWidth);\n const isUp = bar.close >= bar.open;\n\n const openY = scale.yToPixel(bar.open, priceRange, chartHeight);\n const closeY = scale.yToPixel(bar.close, priceRange, chartHeight);\n const highY = scale.yToPixel(bar.high, priceRange, chartHeight);\n const lowY = scale.yToPixel(bar.low, priceRange, chartHeight);\n\n const color = isUp ? theme.candle.up : theme.candle.down;\n const wickColor = isUp ? theme.candle.wickUp : theme.candle.wickDown;\n\n // Wick\n ctx.beginPath();\n ctx.strokeStyle = wickColor;\n ctx.lineWidth = 1;\n ctx.moveTo(x, highY);\n ctx.lineTo(x, lowY);\n ctx.stroke();\n\n // Body\n const bodyTop = Math.min(openY, closeY);\n const bodyHeight = Math.max(Math.abs(closeY - openY), 1);\n\n if (isUp) {\n // Hollow: stroke only\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n ctx.strokeRect(x - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n } else {\n // Filled\n const borderColor = theme.candle.borderDown ?? theme.candle.down;\n ctx.fillStyle = color;\n ctx.fillRect(x - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n if (borderColor !== color) {\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = 1;\n ctx.strokeRect(x - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n }\n }\n }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nfunction withAlpha(hex: string, alpha: number): string {\n const h = hex.replace('#', '');\n const f = h.length === 3 ? h.split('').map(c => c + c).join('') : h;\n const r = parseInt(f.slice(0, 2), 16);\n const g = parseInt(f.slice(2, 4), 16);\n const b = parseInt(f.slice(4, 6), 16);\n return `rgba(${r},${g},${b},${alpha})`;\n}\n\ninterface GradCache { gradient: CanvasGradient; height: number; color: string }\nlet _gradCache: GradCache | null = null;\n\nexport function renderLine(\n ctx: CanvasRenderingContext2D,\n bars: OHLCVBar[],\n viewport: Viewport,\n priceRange: PriceRange,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n chartHeight: number,\n area = false,\n): void {\n if (bars.length === 0) return;\n\n ctx.beginPath();\n ctx.strokeStyle = theme.candle.up;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n\n const startBar = Math.floor(viewport.startIndex);\n for (let i = 0; i < bars.length; i++) {\n const barIndex = startBar + i;\n const x = scale.xToPixel(barIndex, viewport, chartWidth);\n const y = scale.yToPixel(bars[i].close, priceRange, chartHeight);\n i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\n }\n\n ctx.stroke();\n\n if (area) {\n const lastX = scale.xToPixel(startBar + bars.length - 1, viewport, chartWidth);\n const firstX = scale.xToPixel(startBar, viewport, chartWidth);\n\n ctx.lineTo(lastX, chartHeight);\n ctx.lineTo(firstX, chartHeight);\n ctx.closePath();\n\n if (!_gradCache || _gradCache.height !== chartHeight || _gradCache.color !== theme.candle.up) {\n const grad = ctx.createLinearGradient(0, 0, 0, chartHeight);\n grad.addColorStop(0, withAlpha(theme.candle.up, 0.15));\n grad.addColorStop(1, withAlpha(theme.candle.up, 0));\n _gradCache = { gradient: grad, height: chartHeight, color: theme.candle.up };\n }\n ctx.fillStyle = _gradCache.gradient;\n ctx.fill();\n }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderOHLC(\n ctx: CanvasRenderingContext2D,\n bars: OHLCVBar[],\n viewport: Viewport,\n priceRange: PriceRange,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n chartHeight: number,\n): void {\n const tickWidth = Math.max(2, scale.candleBodyWidth(viewport, chartWidth) * 0.4);\n const startBar = Math.floor(viewport.startIndex);\n\n for (let i = 0; i < bars.length; i++) {\n const bar = bars[i];\n const barIndex = startBar + i;\n const x = scale.xToPixel(barIndex, viewport, chartWidth);\n const isUp = bar.close >= bar.open;\n const color = isUp ? theme.candle.up : theme.candle.down;\n\n const openY = scale.yToPixel(bar.open, priceRange, chartHeight);\n const closeY = scale.yToPixel(bar.close, priceRange, chartHeight);\n const highY = scale.yToPixel(bar.high, priceRange, chartHeight);\n const lowY = scale.yToPixel(bar.low, priceRange, chartHeight);\n\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n\n // High-low vertical line\n ctx.beginPath();\n ctx.moveTo(x, highY);\n ctx.lineTo(x, lowY);\n ctx.stroke();\n\n // Open tick (left)\n ctx.beginPath();\n ctx.moveTo(x - tickWidth, openY);\n ctx.lineTo(x, openY);\n ctx.stroke();\n\n // Close tick (right)\n ctx.beginPath();\n ctx.moveTo(x, closeY);\n ctx.lineTo(x + tickWidth, closeY);\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderVolume(\n ctx: CanvasRenderingContext2D,\n bars: OHLCVBar[],\n viewport: Viewport,\n maxVolume: number,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n panelHeight: number,\n offsetY: number,\n): void {\n const bodyWidth = scale.candleBodyWidth(viewport, chartWidth);\n const startBar = Math.floor(viewport.startIndex);\n\n for (let i = 0; i < bars.length; i++) {\n const bar = bars[i];\n if (bar.volume == null) continue;\n\n const barIndex = startBar + i;\n const x = scale.xToPixel(barIndex, viewport, chartWidth);\n const isUp = bar.close >= bar.open;\n\n const barHeight = panelHeight - scale.volumeToPixel(bar.volume, maxVolume, panelHeight);\n const y = offsetY + panelHeight - barHeight;\n\n ctx.fillStyle = isUp ? theme.volume.up : theme.volume.down;\n ctx.fillRect(x - bodyWidth / 2, y, bodyWidth, barHeight);\n }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nfunction computeHeikinAshi(bars: OHLCVBar[]): OHLCVBar[] {\n const out: OHLCVBar[] = [];\n for (let i = 0; i < bars.length; i++) {\n const b = bars[i];\n const haClose = (b.open + b.high + b.low + b.close) / 4;\n const haOpen = i === 0\n ? (b.open + b.close) / 2\n : (out[i - 1].open + out[i - 1].close) / 2;\n out.push({\n time: b.time,\n open: haOpen,\n close: haClose,\n high: Math.max(b.high, haOpen, haClose),\n low: Math.min(b.low, haOpen, haClose),\n volume: b.volume,\n });\n }\n return out;\n}\n\nexport function renderHeikinAshi(\n ctx: CanvasRenderingContext2D,\n bars: OHLCVBar[],\n viewport: Viewport,\n priceRange: PriceRange,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n chartHeight: number,\n): void {\n const haBars = computeHeikinAshi(bars);\n const bodyWidth = scale.candleBodyWidth(viewport, chartWidth);\n const startBar = Math.floor(viewport.startIndex);\n\n for (let i = 0; i < haBars.length; i++) {\n const bar = haBars[i];\n const barIndex = startBar + i;\n const x = scale.xToPixel(barIndex, viewport, chartWidth);\n const isUp = bar.close >= bar.open;\n\n const openY = scale.yToPixel(bar.open, priceRange, chartHeight);\n const closeY = scale.yToPixel(bar.close, priceRange, chartHeight);\n const highY = scale.yToPixel(bar.high, priceRange, chartHeight);\n const lowY = scale.yToPixel(bar.low, priceRange, chartHeight);\n\n const color = isUp ? theme.candle.up : theme.candle.down;\n const wickColor = isUp ? theme.candle.wickUp : theme.candle.wickDown;\n const borderColor = isUp\n ? (theme.candle.borderUp ?? theme.candle.up)\n : (theme.candle.borderDown ?? theme.candle.down);\n\n // Wick\n ctx.beginPath();\n ctx.strokeStyle = wickColor;\n ctx.lineWidth = 1;\n ctx.moveTo(x, highY);\n ctx.lineTo(x, lowY);\n ctx.stroke();\n\n // Body\n const bodyTop = Math.min(openY, closeY);\n const bodyHeight = Math.max(Math.abs(closeY - openY), 1);\n\n ctx.fillStyle = color;\n ctx.fillRect(x - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n if (borderColor !== color) {\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = 1;\n ctx.strokeRect(x - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n }\n }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderVolumeCandles(\n ctx: CanvasRenderingContext2D,\n bars: OHLCVBar[],\n viewport: Viewport,\n priceRange: PriceRange,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n chartHeight: number,\n): void {\n const baseBodyWidth = scale.candleBodyWidth(viewport, chartWidth);\n const maxVol = Math.max(...bars.map(b => b.volume ?? 0), 1);\n const startBar = Math.floor(viewport.startIndex);\n\n for (let i = 0; i < bars.length; i++) {\n const bar = bars[i];\n const barIndex = startBar + i;\n const x = scale.xToPixel(barIndex, viewport, chartWidth);\n const isUp = bar.close >= bar.open;\n\n // Body width proportional to volume; fallback to base width when volume is absent\n const volRatio = maxVol > 0 ? (bar.volume ?? maxVol) / maxVol : 1;\n const bodyWidth = Math.max(1, volRatio * baseBodyWidth);\n\n const openY = scale.yToPixel(bar.open, priceRange, chartHeight);\n const closeY = scale.yToPixel(bar.close, priceRange, chartHeight);\n const highY = scale.yToPixel(bar.high, priceRange, chartHeight);\n const lowY = scale.yToPixel(bar.low, priceRange, chartHeight);\n\n const color = isUp ? theme.candle.up : theme.candle.down;\n const wickColor = isUp ? theme.candle.wickUp : theme.candle.wickDown;\n const borderColor = isUp\n ? (theme.candle.borderUp ?? theme.candle.up)\n : (theme.candle.borderDown ?? theme.candle.down);\n\n // Wick\n ctx.beginPath();\n ctx.strokeStyle = wickColor;\n ctx.lineWidth = 1;\n ctx.moveTo(x, highY);\n ctx.lineTo(x, lowY);\n ctx.stroke();\n\n // Body\n const bodyTop = Math.min(openY, closeY);\n const bodyHeight = Math.max(Math.abs(closeY - openY), 1);\n\n ctx.fillStyle = color;\n ctx.fillRect(x - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n if (borderColor !== color) {\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = 1;\n ctx.strokeRect(x - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n }\n }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderLineWithMarkers(\n ctx: CanvasRenderingContext2D,\n bars: OHLCVBar[],\n viewport: Viewport,\n priceRange: PriceRange,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n chartHeight: number,\n): void {\n if (bars.length === 0) return;\n\n // Draw the line\n ctx.beginPath();\n ctx.strokeStyle = theme.candle.up;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n\n const startBar = Math.floor(viewport.startIndex);\n for (let i = 0; i < bars.length; i++) {\n const barIndex = startBar + i;\n const x = scale.xToPixel(barIndex, viewport, chartWidth);\n const y = scale.yToPixel(bars[i].close, priceRange, chartHeight);\n i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\n }\n ctx.stroke();\n\n // Draw circle markers at each close price point\n const markerRadius = Math.min(3, scale.candleBodyWidth(viewport, chartWidth) * 0.35);\n if (markerRadius < 0.5) return; // too zoomed out to draw markers\n\n ctx.fillStyle = theme.candle.up;\n for (let i = 0; i < bars.length; i++) {\n const barIndex = startBar + i;\n const x = scale.xToPixel(barIndex, viewport, chartWidth);\n const y = scale.yToPixel(bars[i].close, priceRange, chartHeight);\n ctx.beginPath();\n ctx.arc(x, y, markerRadius, 0, Math.PI * 2);\n ctx.fill();\n }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderStepLine(\n ctx: CanvasRenderingContext2D,\n bars: OHLCVBar[],\n viewport: Viewport,\n priceRange: PriceRange,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n chartHeight: number,\n): void {\n if (bars.length === 0) return;\n\n ctx.beginPath();\n ctx.strokeStyle = theme.candle.up;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n\n const startBar = Math.floor(viewport.startIndex);\n let prevY = 0;\n for (let i = 0; i < bars.length; i++) {\n const barIndex = startBar + i;\n const x = scale.xToPixel(barIndex, viewport, chartWidth);\n const y = scale.yToPixel(bars[i].close, priceRange, chartHeight);\n\n if (i === 0) {\n ctx.moveTo(x, y);\n } else {\n ctx.lineTo(x, prevY); // horizontal step at previous y\n ctx.lineTo(x, y); // vertical step to current y\n }\n prevY = y;\n }\n ctx.stroke();\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nfunction withAlpha(hex: string, alpha: number): string {\n const h = hex.replace('#', '');\n const f = h.length === 3 ? h.split('').map(c => c + c).join('') : h;\n const r = parseInt(f.slice(0, 2), 16);\n const g = parseInt(f.slice(2, 4), 16);\n const b = parseInt(f.slice(4, 6), 16);\n return `rgba(${r},${g},${b},${alpha})`;\n}\n\nexport function renderHLCArea(\n ctx: CanvasRenderingContext2D,\n bars: OHLCVBar[],\n viewport: Viewport,\n priceRange: PriceRange,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n chartHeight: number,\n): void {\n if (bars.length === 0) return;\n\n // Build the high-low band as a closed polygon\n const startBar = Math.floor(viewport.startIndex);\n ctx.beginPath();\n // Forward pass: high prices\n for (let i = 0; i < bars.length; i++) {\n const x = scale.xToPixel(startBar + i, viewport, chartWidth);\n const y = scale.yToPixel(bars[i].high, priceRange, chartHeight);\n i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\n }\n // Backward pass: low prices\n for (let i = bars.length - 1; i >= 0; i--) {\n const x = scale.xToPixel(startBar + i, viewport, chartWidth);\n const y = scale.yToPixel(bars[i].low, priceRange, chartHeight);\n ctx.lineTo(x, y);\n }\n ctx.closePath();\n ctx.fillStyle = withAlpha(theme.candle.up, 0.12);\n ctx.fill();\n\n // Draw the close price line on top\n ctx.beginPath();\n ctx.strokeStyle = theme.candle.up;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n for (let i = 0; i < bars.length; i++) {\n const x = scale.xToPixel(startBar + i, viewport, chartWidth);\n const y = scale.yToPixel(bars[i].close, priceRange, chartHeight);\n i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\n }\n ctx.stroke();\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nfunction withAlpha(hex: string, alpha: number): string {\n const h = hex.replace('#', '');\n const f = h.length === 3 ? h.split('').map(c => c + c).join('') : h;\n const r = parseInt(f.slice(0, 2), 16);\n const g = parseInt(f.slice(2, 4), 16);\n const b = parseInt(f.slice(4, 6), 16);\n return `rgba(${r},${g},${b},${alpha})`;\n}\n\nexport function renderBaseline(\n ctx: CanvasRenderingContext2D,\n bars: OHLCVBar[],\n viewport: Viewport,\n priceRange: PriceRange,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n chartHeight: number,\n): void {\n if (bars.length === 0) return;\n\n const baselinePrice = (priceRange.min + priceRange.max) / 2;\n const baselineY = scale.yToPixel(baselinePrice, priceRange, chartHeight);\n\n // Collect x/y points for the close line\n const startBar = Math.floor(viewport.startIndex);\n const pts: { x: number; y: number }[] = bars.map((bar, i) => ({\n x: scale.xToPixel(startBar + i, viewport, chartWidth),\n y: scale.yToPixel(bar.close, priceRange, chartHeight),\n }));\n\n const firstX = pts[0].x;\n const lastX = pts[pts.length - 1].x;\n\n // Helper: build the area path (line path + bottom edge)\n const buildAreaPath = (): void => {\n ctx.beginPath();\n for (let i = 0; i < pts.length; i++) {\n i === 0 ? ctx.moveTo(pts[i].x, pts[i].y) : ctx.lineTo(pts[i].x, pts[i].y);\n }\n ctx.lineTo(lastX, baselineY);\n ctx.lineTo(firstX, baselineY);\n ctx.closePath();\n };\n\n // Upper fill — close above baseline (green)\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, 0, chartWidth, baselineY);\n ctx.clip();\n buildAreaPath();\n ctx.fillStyle = withAlpha(theme.candle.up, 0.15);\n ctx.fill();\n ctx.restore();\n\n // Lower fill — close below baseline (red)\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, baselineY, chartWidth, chartHeight - baselineY);\n ctx.clip();\n buildAreaPath();\n ctx.fillStyle = withAlpha(theme.candle.down, 0.15);\n ctx.fill();\n ctx.restore();\n\n // Draw the close price line on top\n ctx.beginPath();\n ctx.strokeStyle = theme.candle.up;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n for (let i = 0; i < pts.length; i++) {\n i === 0 ? ctx.moveTo(pts[i].x, pts[i].y) : ctx.lineTo(pts[i].x, pts[i].y);\n }\n ctx.stroke();\n\n // Draw the baseline itself as a dashed horizontal line\n ctx.beginPath();\n ctx.strokeStyle = withAlpha(theme.candle.up, 0.4);\n ctx.lineWidth = 1;\n ctx.setLineDash([4, 4]);\n ctx.moveTo(firstX, baselineY);\n ctx.lineTo(lastX, baselineY);\n ctx.stroke();\n ctx.setLineDash([]);\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderColumns(\n ctx: CanvasRenderingContext2D,\n bars: OHLCVBar[],\n viewport: Viewport,\n priceRange: PriceRange,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n chartHeight: number,\n): void {\n const bodyWidth = scale.candleBodyWidth(viewport, chartWidth);\n const startBar = Math.floor(viewport.startIndex);\n\n for (let i = 0; i < bars.length; i++) {\n const bar = bars[i];\n const barIndex = startBar + i;\n const x = scale.xToPixel(barIndex, viewport, chartWidth);\n const isUp = bar.close >= bar.open;\n\n const closeY = scale.yToPixel(bar.close, priceRange, chartHeight);\n const barHeight = Math.max(1, chartHeight - closeY);\n\n ctx.fillStyle = isUp ? theme.candle.up : theme.candle.down;\n ctx.fillRect(x - bodyWidth / 2, closeY, bodyWidth, barHeight);\n }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderHighLow(\n ctx: CanvasRenderingContext2D,\n bars: OHLCVBar[],\n viewport: Viewport,\n priceRange: PriceRange,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n chartHeight: number,\n): void {\n ctx.lineWidth = 1.5;\n const startBar = Math.floor(viewport.startIndex);\n\n for (let i = 0; i < bars.length; i++) {\n const bar = bars[i];\n const barIndex = startBar + i;\n const x = scale.xToPixel(barIndex, viewport, chartWidth);\n const isUp = bar.close >= bar.open;\n\n const highY = scale.yToPixel(bar.high, priceRange, chartHeight);\n const lowY = scale.yToPixel(bar.low, priceRange, chartHeight);\n\n ctx.strokeStyle = isUp ? theme.candle.up : theme.candle.down;\n ctx.beginPath();\n ctx.moveTo(x, highY);\n ctx.lineTo(x, lowY);\n ctx.stroke();\n }\n}\n","import type { PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderGrid(\n ctx: CanvasRenderingContext2D,\n priceRange: PriceRange,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n chartHeight: number,\n gridLines = 6\n): void {\n ctx.save();\n ctx.globalAlpha = 0.6;\n ctx.strokeStyle = theme.grid;\n ctx.lineWidth = 1;\n\n // Horizontal lines — one batched path\n const step = (priceRange.max - priceRange.min) / gridLines;\n ctx.beginPath();\n for (let i = 0; i <= gridLines; i++) {\n const price = priceRange.min + step * i;\n const y = Math.round(scale.yToPixel(price, priceRange, chartHeight)) + 0.5;\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n }\n ctx.stroke();\n\n // Vertical lines (every ~80px) — one batched path\n const vertCols = Math.max(1, Math.floor(chartWidth / 80));\n const xStep = chartWidth / vertCols;\n ctx.beginPath();\n for (let i = 1; i < vertCols; i++) {\n const x = Math.round(i * xStep) + 0.5;\n ctx.moveTo(x, 0);\n ctx.lineTo(x, chartHeight);\n }\n ctx.stroke();\n\n ctx.restore();\n}\n","import type { PriceRange, Viewport, CrosshairPosition, Timeframe } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_CROSSHAIR_CONFIG, type CrosshairUiConfig } from '../core/uiConfig.js';\n\nconst SUB_DAILY: Timeframe[] = ['1m', '5m', '15m', '30m', '1h', '4h'];\n\nfunction formatCrosshairTime(ts: number, timeframe: Timeframe): string {\n const d = new Date(ts);\n if (SUB_DAILY.includes(timeframe)) {\n const date = d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n const time = d.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: false });\n return `${date} ${time}`;\n }\n if (timeframe === '1Y') {\n return d.toLocaleDateString('en-US', { year: 'numeric' });\n }\n if (timeframe === '1M') {\n return d.toLocaleDateString('en-US', { month: 'short', year: 'numeric' });\n }\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n}\n\nexport function renderCrosshair(\n ctx: CanvasRenderingContext2D,\n pos: CrosshairPosition,\n priceRange: PriceRange,\n viewport: Viewport,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n chartHeight: number,\n priceAxisWidth: number,\n axisY: number,\n timeframe: Timeframe,\n pricePrecision = 2,\n cfg: CrosshairUiConfig = DEFAULT_CROSSHAIR_CONFIG,\n): void {\n const x = scale.xToPixel(pos.barIndex, viewport, chartWidth);\n const y = scale.yToPixel(pos.price, priceRange, chartHeight);\n\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = theme.crosshair;\n ctx.lineWidth = 1;\n\n // Vertical line — extends through sub-panes to the time axis\n ctx.beginPath();\n ctx.moveTo(x, 0);\n ctx.lineTo(x, axisY);\n ctx.stroke();\n\n // Horizontal line\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n\n ctx.setLineDash([]);\n\n const labelH = cfg.labelHeight;\n const labelPad = cfg.labelPaddingX;\n ctx.font = `${cfg.fontSize} ${cfg.fontFamily}`;\n\n // ── Price label on y-axis ─────────────────────────────────────────────────\n const priceLabel = pos.price.toFixed(pricePrecision);\n ctx.fillStyle = theme.tooltip.background;\n ctx.fillRect(chartWidth, y - labelH / 2, priceAxisWidth, labelH);\n ctx.strokeStyle = theme.crosshair;\n ctx.lineWidth = 1;\n ctx.strokeRect(chartWidth, y - labelH / 2, priceAxisWidth, labelH);\n ctx.fillStyle = theme.tooltip.text;\n ctx.textAlign = 'left';\n ctx.fillText(priceLabel, chartWidth + labelPad, y + 4);\n\n // ── Time label on x-axis ──────────────────────────────────────────────────\n if (pos.bar) {\n const timeLabel = formatCrosshairTime(pos.bar.time, timeframe);\n const tw = ctx.measureText(timeLabel).width;\n const boxW = tw + labelPad * 2;\n const boxX = Math.max(0, Math.min(chartWidth - boxW, x - boxW / 2));\n\n ctx.fillStyle = theme.tooltip.background;\n ctx.fillRect(boxX, axisY, boxW, labelH);\n ctx.strokeStyle = theme.crosshair;\n ctx.lineWidth = 1;\n ctx.strokeRect(boxX, axisY, boxW, labelH);\n ctx.fillStyle = theme.tooltip.text;\n ctx.textAlign = 'left';\n ctx.fillText(timeLabel, boxX + labelPad, axisY + 13);\n }\n}\n","import type {\n AnyLevel,\n PendingOrderLevel,\n PositionLevel,\n PositionRenderStyle,\n} from '../core/types.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { PriceRange } from '../core/types.js';\n\n// ── Layout constants ───────────────────────────────────────────────────────────\nconst BOX_PAD_X = 8; // horizontal padding inside main-level box\nconst BOX_PAD_Y = 4; // vertical padding inside main-level box\nconst ROW_H = 16; // height of one text row\nconst BOX_RADIUS = 3; // corner radius of info boxes\nconst LINE_WIDTH = 1; // main position/order line width\nconst CLOSE_R = 7; // radius of the × circle\nconst EDIT_R = 7; // radius of the edit/pencil circle\nconst EDIT_GAP = 4; // gap between edit circle and × circle\nconst CONFIRM_R = 7; // radius of the ✓ and ✗ circles\nconst CONFIRM_GAP = 4; // gap between confirm/cancel circles and × circle\nconst PNL_GAP = 6; // gap between pnl text and label text\nconst FONT_MAIN = \"13px 'Inter', system-ui, sans-serif\";\nconst FONT_PNL = \"13px 'Inter', system-ui, sans-serif\";\nconst GRIP_W = 14; // width of drag handle zone left of info box\nconst GRIP_DOT_R = 1.5; // radius of each grip dot\nconst BRACKET_LINE_W = 1; // SL/TP line width\nconst BRACKET_BOX_PAD_X = 5; // horizontal padding inside bracket info box\nconst BRACKET_BOX_PAD_Y = 3; // vertical padding inside bracket info box\nconst BRACKET_BOX_H = ROW_H + BRACKET_BOX_PAD_Y * 2; // ~20 px\nconst FONT_BRACKET = \"12px 'Inter', system-ui, sans-serif\";\nconst BRACKET_BASE_RATIO = 0.68; // bracket line X base: 72% of chartW (right zone, clear of centred main label)\n// Column offsets (fractions of chartW) tried in order for bracket line placement\nconst BRACKET_COL_OFFSETS = [0, -0.08, 0.08] as const;\nconst ADD_BRACKET_BTN_OFFSET_PX = 30; // px above/below entry line where +SL/+TP button appears\n\n/** × button hit area — returned so ChartEngine can detect close clicks. */\nexport interface TradeLevelHitArea {\n label: string;\n type: AnyLevel['type'];\n data: unknown;\n /** Present only for bracket (SL/TP) close buttons. */\n bracketType?: 'stopLoss' | 'takeProfit';\n /** Label of the ToClose order backing this bracket, when applicable. */\n bracketOrderLabel?: string;\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/** ✓ / ✗ confirm/cancel button hit area — returned for pending-change inline buttons. */\nexport interface TradeLevelConfirmArea {\n label: string;\n type: AnyLevel['type'];\n data: unknown;\n action: 'confirm' | 'cancel';\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/** Box + line strip hit areas — used for hover detection. */\nexport interface TradeHoverArea {\n label: string;\n /** Bounding rect of the info box */\n boxX: number;\n boxY: number;\n boxW: number;\n boxH: number;\n /** Thin strip along the line itself */\n lineX: number;\n lineY: number;\n lineW: number;\n lineH: number;\n}\n\n/** Drag handle hit area for the main level line (non-bracket). */\nexport interface TradeLevelDragArea {\n label: string;\n type: AnyLevel['type'];\n data: unknown;\n /** The price of this level — used to initialize drag state. */\n price: number;\n x: number;\n y: number;\n w: number;\n h: number;\n isBracket: false;\n}\n\n/** Drag handle hit area for a bracket (SL/TP) line. */\nexport interface TradeLevelBracketDragArea {\n /** Label of the parent PendingOrderLevel. */\n label: string;\n data: unknown;\n bracketType: 'stopLoss' | 'takeProfit';\n /** The current price of this bracket line. */\n price: number;\n /** Price of the parent order (used for constraint enforcement). */\n parentPrice: number;\n /** Side of the parent order. */\n parentSide: 'buy' | 'sell';\n /**\n * When this bracket originated from a `ToClose` pending order, this holds\n * that order's own label — used in the drag confirmation message.\n * Undefined for inline stopLossPrice / takeProfitPrice fields.\n */\n bracketOrderLabel?: string;\n x: number;\n y: number;\n w: number;\n h: number;\n isBracket: true;\n}\n\nexport type AnyDragArea = TradeLevelDragArea | TradeLevelBracketDragArea;\n\n/** Hit area for the +SL / +TP add-bracket button shown when a level is selected and missing that bracket. */\nexport interface TradeAddBracketArea {\n label: string;\n type: AnyLevel['type'];\n data: unknown;\n bracketType: 'stopLoss' | 'takeProfit';\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface TradeLevelRenderResult {\n hitAreas: TradeLevelHitArea[];\n editAreas: TradeLevelHitArea[];\n hoverAreas: TradeHoverArea[];\n dragAreas: AnyDragArea[];\n confirmAreas: TradeLevelConfirmArea[];\n addBracketAreas: TradeAddBracketArea[];\n}\n\n// ── Internal layout record ─────────────────────────────────────────────────────\ninterface LevelLayout {\n price: number; // drag-aware price used to compute y\n y: number; // line y pixel\n boxY: number; // top of info box\n boxW: number; // measured box width\n boxH: number; // box height (single row)\n}\n\nfunction hasPnl(level: AnyLevel): level is AnyLevel & { pnlText: string } {\n return level.type === 'position' && !!(level as { pnlText?: string }).pnlText;\n}\n\nfunction rectsOverlapY(ay: number, ah: number, by: number, bh: number): boolean {\n return ay < by + bh && ay + ah > by;\n}\n\n/**\n * Returns the display text for a level's info box.\n * ES/EL positions and pending orders show \"BUY/SELL {lots}L @{price}\".\n * All other levels fall back to level.text ?? level.label.\n */\nfunction getLevelDisplayText(level: AnyLevel, price: number, precision: number): string {\n if ((level.data as { _isDraft?: boolean } | undefined)?._isDraft) return 'DRAFT';\n\n if (level.type === 'pending') {\n const p = level as PendingOrderLevel;\n const lotsStr = p.lots !== undefined ? ` ${p.lots}` : '';\n return level.text ?? `${p.side.toUpperCase()}${lotsStr} @${price.toFixed(precision)}`;\n }\n\n if (level.type === 'position' && (level as PositionLevel).entryPriceEditable) {\n const pos = level as PositionLevel;\n const sideStr = pos.side ? pos.side.toUpperCase() : '';\n const lotsStr = pos.lots !== undefined ? ` ${pos.lots}` : '';\n return level.text ?? `${sideStr}${lotsStr} @${price.toFixed(precision)}`;\n }\n\n if (level.type === 'position') return level.text ?? '';\n return level.text ?? level.label;\n}\n\n/**\n * Assigns a per-bracket start X so that bracket info-boxes (centered on each\n * bracket line) never overlap each other.\n *\n * Three columns are tried in order: 50 %, 40 %, 60 % of chartW.\n * Each column tracks the Y of the last box placed in it; a bracket is placed\n * in the first column where there is enough vertical clearance.\n */\nfunction computeBracketLineX(\n levels: AnyLevel[],\n scale: ScaleManager,\n priceRange: PriceRange,\n priceH: number,\n chartW: number,\n draggingLabel: string | null,\n dragNewPrice: number | null,\n hoveredLabel: string | null,\n selectedLabel: string | null\n): Map<string, number> {\n type BH = AnyLevel & { stopLossPrice?: number; takeProfitPrice?: number };\n\n const items: Array<{ key: string; y: number }> = [];\n\n for (const level of levels) {\n // Only include brackets for hovered or selected levels\n if (level.label !== hoveredLabel && level.label !== selectedLabel) continue;\n const bh = level as BH;\n if (bh.stopLossPrice !== undefined) {\n const key = `${level.label}:stopLoss`;\n const isDrag = draggingLabel === key;\n const price = isDrag && dragNewPrice !== null ? dragNewPrice : bh.stopLossPrice;\n items.push({ key, y: scale.yToPixel(price, priceRange, priceH) });\n }\n if (bh.takeProfitPrice !== undefined) {\n const key = `${level.label}:takeProfit`;\n const isDrag = draggingLabel === key;\n const price = isDrag && dragNewPrice !== null ? dragNewPrice : bh.takeProfitPrice;\n items.push({ key, y: scale.yToPixel(price, priceRange, priceH) });\n }\n }\n\n items.sort((a, b) => a.y - b.y);\n\n const baseX = chartW * BRACKET_BASE_RATIO;\n const columns = BRACKET_COL_OFFSETS.map((o) => baseX + o * chartW);\n const colLastY = columns.map(() => -Infinity);\n const result = new Map<string, number>();\n\n for (const item of items) {\n let assigned = false;\n for (let c = 0; c < columns.length; c++) {\n if (item.y >= colLastY[c] + BRACKET_BOX_H) {\n result.set(item.key, columns[c]);\n colLastY[c] = item.y;\n assigned = true;\n break;\n }\n }\n if (!assigned) {\n const best = colLastY.indexOf(Math.min(...colLastY));\n result.set(item.key, columns[best]);\n colLastY[best] = item.y;\n }\n }\n\n return result;\n}\n\n/** White on dark themes, black on light themes. */\nfunction monoColor(theme: ChartTheme): string {\n return theme.background === '#ffffff' ? '#000000' : '#ffffff';\n}\n\n/** Resolve box background color for a level. */\nfunction monoBoxBg(theme: ChartTheme, active: boolean): string {\n const isDark = theme.background !== '#ffffff';\n if (isDark) return active ? 'rgb(30,30,30)' : 'rgb(0,0,0)';\n return active ? 'rgb(230,230,230)' : 'rgb(255,255,255)';\n}\n\n/** Resolve line + box color for a level. */\nfunction levelColor(level: AnyLevel, colors: ChartTheme['tradeLevels'], theme: ChartTheme): string {\n if (level.type === 'position') {\n const pnl = (level as { pnl?: number }).pnl;\n if (pnl !== undefined) return pnl >= 0 ? theme.candle.up : theme.candle.down;\n return colors.positionLine;\n }\n if (level.type === 'pending') {\n const p = level as PendingOrderLevel;\n return p.side === 'buy' ? colors.pendingBuyLine : colors.pendingSellLine;\n }\n return colors.tradeLine;\n}\n\n/**\n * Whether this level's main line gets a drag handle.\n * - pending: always draggable (entry price can be moved)\n * - position + entryPriceEditable: draggable (e.g. Entry Limit / Entry Stop orders)\n * - position (normal): never draggable (entry price is fixed)\n * - trade: never\n */\nfunction isDraggable(level: AnyLevel): boolean {\n if (level.type === 'pending') return true;\n if (level.type === 'position')\n return !!(level as import('../core/types.js').PositionLevel).entryPriceEditable;\n return false;\n}\n\n/**\n * Renders all trade/position horizontal levels on the given canvas context.\n */\nexport function renderTradeLevels(\n ctx: CanvasRenderingContext2D,\n levels: AnyLevel[],\n scale: ScaleManager,\n priceRange: PriceRange,\n theme: ChartTheme,\n chartW: number,\n priceH: number,\n precision: number,\n hoveredLabel: string | null = null,\n draggingLabel: string | null = null,\n dragNewPrice: number | null = null,\n selectedLabel: string | null = null,\n pendingLabels: ReadonlySet<string> = new Set(),\n positionStyle: PositionRenderStyle = 'line'\n): TradeLevelRenderResult {\n if (levels.length === 0)\n return {\n hitAreas: [],\n editAreas: [],\n hoverAreas: [],\n dragAreas: [],\n confirmAreas: [],\n addBracketAreas: [],\n };\n\n const colors = theme.tradeLevels;\n const boxH = ROW_H + BOX_PAD_Y * 2;\n\n ctx.save();\n ctx.font = FONT_MAIN;\n\n // ── Phase 1: compute pixel y and measure box dimensions ───────────────────\n const measured: Array<{\n level: AnyLevel;\n price: number;\n y: number;\n boxW: number;\n boxH: number;\n }> = [];\n\n for (const level of levels) {\n // Use drag-overridden price during active drag\n const price =\n draggingLabel === level.label && dragNewPrice !== null ? dragNewPrice : level.price;\n\n const y = scale.yToPixel(price, priceRange, priceH);\n if (y < -40 || y > priceH + 40) continue;\n\n // Dot style for positions — no box measurement needed unless selected (renders as full line)\n if (positionStyle === 'dot' && level.type === 'position' && level.label !== selectedLabel) {\n measured.push({ level, price, y, boxW: 0, boxH: 0 });\n continue;\n }\n\n // Market draft — no entry line or info box, only brackets rendered\n const isMarketDraft =\n level.type === 'pending' &&\n (level as PendingOrderLevel).orderType === 'market' &&\n (level.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n if (isMarketDraft) {\n measured.push({ level, price, y, boxW: 0, boxH: 0 });\n continue;\n }\n\n const pnlText = hasPnl(level) ? (level as { pnlText: string }).pnlText : null;\n const hasPending = pendingLabels.has(level.label);\n\n const displayText = getLevelDisplayText(level, price, precision);\n const pnlW = pnlText ? ctx.measureText(pnlText).width + PNL_GAP : 0;\n const labelW = ctx.measureText(displayText).width;\n // When pending: show ✓/✗ only (no × close). Otherwise show × close only.\n const confirmW = hasPending ? (CONFIRM_R * 2 + CONFIRM_GAP) * 2 : 0;\n const closeW = hasPending ? 0 : EDIT_R * 2 + EDIT_GAP + CLOSE_R * 2 + BOX_PAD_X / 2;\n const bW = BOX_PAD_X + pnlW + labelW + BOX_PAD_X + confirmW + closeW;\n\n measured.push({ level, price, y, boxW: bW, boxH });\n }\n\n // ── Phase 2: collision-aware vertical placement ───────────────────────────\n measured.sort((a, b) => a.y - b.y);\n\n const placed: Array<{ label: string; boxY: number; boxH: number }> = [];\n const layouts = new Map<string, LevelLayout>();\n\n for (const m of measured) {\n const centeredY = m.y - m.boxH / 2;\n const overlaps = placed.some((p) => rectsOverlapY(centeredY, m.boxH, p.boxY, p.boxH));\n const boxY = overlaps ? centeredY - m.boxH - 2 : centeredY;\n\n placed.push({ label: m.level.label, boxY, boxH: m.boxH });\n layouts.set(m.level.label, { price: m.price, y: m.y, boxY, boxW: m.boxW, boxH: m.boxH });\n }\n\n // ── Phase 3: bracket lineX column assignments ─────────────────────────────\n const bracketLineXMap = computeBracketLineX(\n levels,\n scale,\n priceRange,\n priceH,\n chartW,\n draggingLabel,\n dragNewPrice,\n hoveredLabel,\n selectedLabel\n );\n\n // ── Phase 4: two-pass draw (hovered/selected level drawn last = on top) ───\n const activeLabel = hoveredLabel ?? selectedLabel;\n const drawOrder = [\n ...measured.filter((m) => m.level.label !== activeLabel),\n ...measured.filter((m) => m.level.label === activeLabel),\n ];\n\n const hitAreas: TradeLevelHitArea[] = [];\n const editAreas: TradeLevelHitArea[] = [];\n const hoverAreas: TradeHoverArea[] = [];\n const dragAreas: AnyDragArea[] = [];\n const confirmAreas: TradeLevelConfirmArea[] = [];\n const addBracketAreas: TradeAddBracketArea[] = [];\n\n for (const { level } of drawOrder) {\n const layout = layouts.get(level.label);\n if (!layout) continue;\n\n drawLevel(\n ctx,\n level,\n layout,\n chartW,\n colors,\n theme,\n precision,\n level.label === hoveredLabel,\n level.label === selectedLabel,\n scale,\n priceRange,\n priceH,\n draggingLabel,\n dragNewPrice,\n bracketLineXMap,\n pendingLabels.has(level.label),\n positionStyle,\n hitAreas,\n editAreas,\n hoverAreas,\n dragAreas,\n confirmAreas,\n addBracketAreas\n );\n }\n\n ctx.restore();\n return { hitAreas, editAreas, hoverAreas, dragAreas, confirmAreas, addBracketAreas };\n}\n\n/**\n * Compact hover tooltip drawn to the left of the dot when the user is hovering\n * but has not yet selected the level. Shows: entry price, SL (if any), TP (if any).\n */\nfunction drawDotHoverBox(\n ctx: CanvasRenderingContext2D,\n level: AnyLevel,\n y: number,\n dotX: number,\n dotR: number,\n theme: ChartTheme,\n precision: number\n): void {\n type PL = {\n pnl?: number;\n pnlText?: string;\n side?: 'buy' | 'sell';\n lots?: number;\n orderType?: 'limit' | 'stop';\n };\n const pl = level as PL;\n\n const rows: Array<{ label: string; value: string; pnlColor?: string }> = [];\n\n // ES/EL orders share level.type === 'position' but have orderType set — show Price/SL/TP for those\n type PLBrackets = { stopLossPrice?: number; takeProfitPrice?: number };\n const brackets = level as PLBrackets;\n if (pl.orderType !== undefined) {\n rows.push({ label: 'Price', value: level.price.toFixed(precision) });\n if (brackets.stopLossPrice !== undefined)\n rows.push({ label: 'SL', value: brackets.stopLossPrice.toFixed(precision) });\n if (brackets.takeProfitPrice !== undefined)\n rows.push({ label: 'TP', value: brackets.takeProfitPrice.toFixed(precision) });\n } else {\n // True open position — show PnL, Side, Lots\n if (pl.pnlText !== undefined) {\n const pnlColor =\n pl.pnl !== undefined\n ? pl.pnl >= 0\n ? theme.candle.up\n : theme.candle.down\n : undefined;\n rows.push({ label: 'PnL', value: pl.pnlText, pnlColor });\n }\n if (pl.side !== undefined) {\n rows.push({ label: 'Side', value: pl.side === 'buy' ? 'Buy' : 'Sell' });\n }\n if (pl.lots !== undefined) {\n rows.push({ label: 'Lots', value: String(pl.lots) });\n }\n // Fallback when none of the position fields are populated\n if (rows.length === 0) {\n rows.push({ label: 'Price', value: level.price.toFixed(precision) });\n }\n }\n\n const PAD_X = BOX_PAD_X;\n const PAD_Y = BOX_PAD_Y;\n const ROW_H_TT = ROW_H + 3;\n\n ctx.save();\n ctx.font = FONT_MAIN;\n\n // Measure widest label column and widest value column separately for alignment\n const labelW = Math.max(...rows.map((r) => ctx.measureText(r.label).width));\n const valueW = Math.max(...rows.map((r) => ctx.measureText(r.value).width));\n const colGap = 8;\n const boxW = PAD_X + labelW + colGap + valueW + PAD_X;\n const boxH = PAD_Y + rows.length * ROW_H_TT - 3 + PAD_Y;\n\n // Position to the left of the dot\n const boxRight = dotX - dotR - 8;\n const boxX = boxRight - boxW;\n const boxY = y - boxH / 2;\n\n ctx.fillStyle = monoBoxBg(theme, true);\n ctx.strokeStyle = monoColor(theme);\n ctx.lineWidth = 1;\n roundRect(ctx, boxX, boxY, boxW, boxH, BOX_RADIUS);\n ctx.fill();\n ctx.stroke();\n\n ctx.textBaseline = 'top';\n rows.forEach((row, i) => {\n const rowY = boxY + PAD_Y + i * ROW_H_TT;\n ctx.textAlign = 'left';\n ctx.fillStyle = monoColor(theme);\n ctx.globalAlpha = 0.55;\n ctx.fillText(row.label, boxX + PAD_X, rowY);\n ctx.globalAlpha = 1;\n ctx.textAlign = 'right';\n ctx.fillStyle = row.pnlColor ?? monoColor(theme);\n ctx.fillText(row.value, boxX + PAD_X + labelW + colGap + valueW, rowY);\n });\n\n ctx.restore();\n}\n\nfunction drawLevel(\n ctx: CanvasRenderingContext2D,\n level: AnyLevel,\n layout: LevelLayout,\n chartW: number,\n colors: ChartTheme['tradeLevels'],\n theme: ChartTheme,\n precision: number,\n hovered: boolean,\n selected: boolean,\n scale: ScaleManager,\n priceRange: PriceRange,\n priceH: number,\n draggingLabel: string | null,\n dragNewPrice: number | null,\n bracketLineXMap: Map<string, number>,\n hasPendingChanges: boolean,\n positionStyle: PositionRenderStyle,\n hitAreas: TradeLevelHitArea[],\n editAreas: TradeLevelHitArea[],\n hoverAreas: TradeHoverArea[],\n dragAreas: AnyDragArea[],\n confirmAreas: TradeLevelConfirmArea[],\n addBracketAreas: TradeAddBracketArea[]\n): void {\n const { y, boxY, boxW, boxH } = layout;\n const color = levelColor(level, colors, theme);\n const active = hovered || selected;\n\n // ── Dot style for position levels ─────────────────────────────────────────\n // When selected, fall through to full line rendering so close/bracket UI appears.\n if (positionStyle === 'dot' && level.type === 'position' && !selected) {\n const dotR = 6;\n const dotX = chartW - dotR - 4;\n\n // Hover tooltip: Price / SL / TP — drawn before dot so dot renders on top\n if (hovered) {\n drawDotHoverBox(ctx, level, y, dotX, dotR, theme, precision);\n }\n\n ctx.save();\n ctx.fillStyle = color;\n ctx.globalAlpha = hovered ? 1 : 0.75;\n ctx.beginPath();\n ctx.arc(dotX, y, dotR, 0, Math.PI * 2);\n ctx.fill();\n ctx.globalAlpha = 1;\n ctx.restore();\n\n hoverAreas.push({\n label: level.label,\n boxX: dotX - dotR,\n boxY: y - dotR,\n boxW: dotR * 2,\n boxH: dotR * 2,\n lineX: dotX - dotR,\n lineY: y - dotR,\n lineW: dotR * 2,\n lineH: dotR * 2,\n });\n return;\n }\n\n const pnlText = hasPnl(level) ? (level as { pnlText: string }).pnlText : null;\n const pnl = level.type === 'position' ? (level as { pnl?: number }).pnl : undefined;\n const isPending = level.type === 'pending';\n\n // Market draft — only brackets are drawn; no entry line, no info box, no buttons\n const isMarketDraft =\n isPending &&\n (level as PendingOrderLevel).orderType === 'market' &&\n (level.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n\n const draggable = isDraggable(level);\n // Center the grip+box group horizontally on the chart\n const groupW = (draggable ? GRIP_W + 2 : 0) + boxW;\n const groupX = Math.round((chartW - groupW) / 2);\n const gripX = draggable ? groupX : 0;\n const boxX = draggable ? groupX + GRIP_W + 2 : groupX;\n\n // ── Bracket lines (SL / TP) — only when hovered or selected (always for market draft) ──\n type BracketHost = AnyLevel & {\n stopLossPrice?: number;\n takeProfitPrice?: number;\n side?: 'buy' | 'sell';\n _slOrderLabel?: string;\n _tpOrderLabel?: string;\n };\n const bracketHost = level as BracketHost;\n\n // Market drafts always show brackets regardless of hover/selection state\n if (active || isMarketDraft) {\n const slDragKey = `${level.label}:stopLoss`;\n const tpDragKey = `${level.label}:takeProfit`;\n\n if (bracketHost.stopLossPrice !== undefined) {\n const bLineX = bracketLineXMap.get(slDragKey) ?? chartW * BRACKET_BASE_RATIO;\n drawBracketLine(\n ctx,\n bracketHost as PendingOrderLevel,\n 'stopLoss',\n bracketHost.stopLossPrice,\n scale,\n priceRange,\n priceH,\n bLineX,\n chartW,\n theme,\n precision,\n draggingLabel,\n dragNewPrice,\n hitAreas,\n dragAreas,\n bracketHost._slOrderLabel\n );\n } else if (draggingLabel === slDragKey && dragNewPrice !== null) {\n // New SL being placed via +SL button — draw draft line at drag price\n const bLineX = chartW * BRACKET_BASE_RATIO;\n drawBracketLine(\n ctx,\n bracketHost as PendingOrderLevel,\n 'stopLoss',\n dragNewPrice,\n scale,\n priceRange,\n priceH,\n bLineX,\n chartW,\n theme,\n precision,\n draggingLabel,\n dragNewPrice,\n hitAreas,\n dragAreas,\n undefined\n );\n }\n\n if (bracketHost.takeProfitPrice !== undefined) {\n const bLineX = bracketLineXMap.get(tpDragKey) ?? chartW * BRACKET_BASE_RATIO;\n drawBracketLine(\n ctx,\n bracketHost as PendingOrderLevel,\n 'takeProfit',\n bracketHost.takeProfitPrice,\n scale,\n priceRange,\n priceH,\n bLineX,\n chartW,\n theme,\n precision,\n draggingLabel,\n dragNewPrice,\n hitAreas,\n dragAreas,\n bracketHost._tpOrderLabel\n );\n } else if (draggingLabel === tpDragKey && dragNewPrice !== null) {\n // New TP being placed via +TP button — draw draft line at drag price\n const bLineX = chartW * BRACKET_BASE_RATIO;\n drawBracketLine(\n ctx,\n bracketHost as PendingOrderLevel,\n 'takeProfit',\n dragNewPrice,\n scale,\n priceRange,\n priceH,\n bLineX,\n chartW,\n theme,\n precision,\n draggingLabel,\n dragNewPrice,\n hitAreas,\n dragAreas,\n undefined\n );\n }\n\n // +SL / +TP add buttons — only when selected, bracket is missing, and not currently dragging that bracket\n if (selected && bracketHost.side !== undefined) {\n const addLineX = chartW * BRACKET_BASE_RATIO;\n if (bracketHost.stopLossPrice === undefined && draggingLabel !== slDragKey) {\n drawAddBracketButton(\n ctx,\n bracketHost,\n 'stopLoss',\n y,\n addLineX,\n chartW,\n priceH,\n theme,\n addBracketAreas\n );\n }\n if (bracketHost.takeProfitPrice === undefined && draggingLabel !== tpDragKey) {\n drawAddBracketButton(\n ctx,\n bracketHost,\n 'takeProfit',\n y,\n addLineX,\n chartW,\n priceH,\n theme,\n addBracketAreas\n );\n }\n }\n }\n\n // Market drafts only render brackets — skip the main line, info box, and all buttons\n if (isMarketDraft) return;\n\n // ── Horizontal line (full width) ──────────────────────────────────────────\n ctx.save();\n ctx.strokeStyle = monoColor(theme);\n ctx.lineWidth = LINE_WIDTH;\n ctx.globalAlpha = active ? 0.9 : 0.6;\n\n if (isPending) {\n ctx.setLineDash([5, 4]);\n }\n\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartW, y);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.globalAlpha = 1;\n ctx.restore();\n\n // ── Info box ──────────────────────────────────────────────────────────────\n const midY = boxY + boxH / 2;\n\n ctx.save();\n\n // Box background — monochrome (black on light theme, dark on dark theme)\n ctx.fillStyle = monoBoxBg(theme, active);\n ctx.strokeStyle = monoColor(theme);\n ctx.lineWidth = 1;\n roundRect(ctx, boxX, boxY, boxW, boxH, BOX_RADIUS);\n ctx.fill();\n ctx.stroke();\n\n // PnL text — left side, colored green/red\n let textX = boxX + BOX_PAD_X;\n if (pnlText) {\n const pnlColor =\n pnl !== undefined ? (pnl >= 0 ? theme.candle.up : theme.candle.down) : monoColor(theme);\n ctx.font = FONT_PNL;\n ctx.fillStyle = pnlColor;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(pnlText, textX, midY);\n textX += ctx.measureText(pnlText).width + PNL_GAP;\n }\n\n // Label text\n const displayText = getLevelDisplayText(level, layout.price, precision);\n ctx.font = FONT_MAIN;\n ctx.fillStyle = monoColor(theme);\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(displayText, textX, midY);\n\n const btnY = midY;\n const d = 3.5;\n\n if (hasPendingChanges) {\n // ✓ confirm + ✗ cancel only — no × close to avoid confusion\n const cancelX = boxX + boxW - BOX_PAD_X / 2 - CONFIRM_R;\n const confirmX = cancelX - CONFIRM_R - CONFIRM_GAP - CONFIRM_R;\n\n // ✓ confirm button — green\n ctx.fillStyle = theme.candle.up;\n ctx.beginPath();\n ctx.arc(confirmX, btnY, CONFIRM_R, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.strokeStyle = theme.background;\n ctx.lineWidth = 1.5;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n const ck = 3.1;\n ctx.beginPath();\n ctx.moveTo(confirmX - ck, btnY);\n ctx.lineTo(confirmX - ck * 0.2, btnY + ck * 0.8);\n ctx.lineTo(confirmX + ck, btnY - ck * 0.7);\n ctx.stroke();\n\n // ✗ cancel button — red/down color\n ctx.fillStyle = theme.candle.down;\n ctx.beginPath();\n ctx.arc(cancelX, btnY, CONFIRM_R, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.strokeStyle = theme.background;\n ctx.lineWidth = 1.5;\n ctx.lineCap = 'round';\n ctx.beginPath();\n ctx.moveTo(cancelX - d, btnY - d);\n ctx.lineTo(cancelX + d, btnY + d);\n ctx.moveTo(cancelX + d, btnY - d);\n ctx.lineTo(cancelX - d, btnY + d);\n ctx.stroke();\n\n confirmAreas.push({\n label: level.label,\n type: level.type,\n data: level.data,\n action: 'confirm',\n x: confirmX - CONFIRM_R,\n y: btnY - CONFIRM_R,\n w: CONFIRM_R * 2,\n h: CONFIRM_R * 2,\n });\n confirmAreas.push({\n label: level.label,\n type: level.type,\n data: level.data,\n action: 'cancel',\n x: cancelX - CONFIRM_R,\n y: btnY - CONFIRM_R,\n w: CONFIRM_R * 2,\n h: CONFIRM_R * 2,\n });\n } else {\n // × close button — rightmost in box\n const closeX = boxX + boxW - BOX_PAD_X / 2 - CLOSE_R;\n // edit/pencil button — left of × button\n const editX = closeX - CLOSE_R - EDIT_GAP - EDIT_R;\n\n // ✎ edit button\n ctx.fillStyle = monoColor(theme);\n ctx.beginPath();\n ctx.arc(editX, btnY, EDIT_R, 0, Math.PI * 2);\n ctx.fill();\n\n // Pencil icon inside edit circle\n const ep = EDIT_R * 0.48;\n ctx.save();\n ctx.strokeStyle = theme.background;\n ctx.lineWidth = 1.5;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n ctx.translate(editX, btnY);\n ctx.rotate(Math.PI / 4);\n // Pencil shaft (rectangle outline)\n ctx.beginPath();\n ctx.moveTo(-ep * 0.35, -ep);\n ctx.lineTo(-ep * 0.35, ep * 0.5);\n ctx.lineTo(ep * 0.35, ep * 0.5);\n ctx.lineTo(ep * 0.35, -ep);\n ctx.closePath();\n ctx.stroke();\n // Pencil tip (triangle)\n ctx.beginPath();\n ctx.moveTo(-ep * 0.35, ep * 0.5);\n ctx.lineTo(0, ep + ep * 0.45);\n ctx.lineTo(ep * 0.35, ep * 0.5);\n ctx.stroke();\n ctx.restore();\n\n // × close button\n ctx.fillStyle = monoColor(theme);\n ctx.beginPath();\n ctx.arc(closeX, btnY, CLOSE_R, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.strokeStyle = theme.background;\n ctx.lineWidth = 1.5;\n ctx.lineCap = 'round';\n ctx.beginPath();\n ctx.moveTo(closeX - d, btnY - d);\n ctx.lineTo(closeX + d, btnY + d);\n ctx.moveTo(closeX + d, btnY - d);\n ctx.lineTo(closeX - d, btnY + d);\n ctx.stroke();\n\n editAreas.push({\n label: level.label,\n type: level.type,\n data: level.data,\n x: editX - EDIT_R,\n y: btnY - EDIT_R,\n w: EDIT_R * 2,\n h: EDIT_R * 2,\n });\n hitAreas.push({\n label: level.label,\n type: level.type,\n data: level.data,\n x: closeX - CLOSE_R,\n y: btnY - CLOSE_R,\n w: CLOSE_R * 2,\n h: CLOSE_R * 2,\n });\n }\n\n ctx.restore();\n\n // ── Drag handle (grip) ─────────────────────────────────────────────────────\n if (draggable) {\n drawGripHandle(ctx, gripX, boxY, boxH, colors, hovered);\n\n // Expand drag area to grip + box body, excluding the button zone on the right.\n // Button zone is always 36px: edit(14) + gap(4) + close(14) + right-pad(4).\n const BTN_ZONE_W = EDIT_R * 2 + EDIT_GAP + CLOSE_R * 2 + BOX_PAD_X / 2;\n dragAreas.push({\n label: level.label,\n type: level.type,\n data: level.data,\n price: level.price,\n x: gripX,\n y: boxY,\n w: GRIP_W + 2 + boxW - BTN_ZONE_W,\n h: boxH,\n isBracket: false,\n });\n // Also make the full horizontal line draggable (buttons are checked first so they still work).\n dragAreas.push({\n label: level.label,\n type: level.type,\n data: level.data,\n price: level.price,\n x: 0,\n y: y - 4,\n w: chartW,\n h: 8,\n isBracket: false,\n });\n }\n\n hoverAreas.push({\n label: level.label,\n boxX,\n boxY,\n boxW,\n boxH,\n lineX: 0,\n lineY: y - 4,\n lineW: chartW,\n lineH: 8,\n });\n}\n\nfunction drawAddBracketButton(\n ctx: CanvasRenderingContext2D,\n level: AnyLevel & { side?: 'buy' | 'sell' },\n bracketType: 'stopLoss' | 'takeProfit',\n entryY: number,\n bracketLineX: number,\n chartW: number,\n priceH: number,\n theme: ChartTheme,\n addBracketAreas: TradeAddBracketArea[]\n): void {\n // For a buy: SL is below entry (positive Y offset), TP is above (negative Y offset). Sell is reversed.\n const belowEntry =\n (level.side === 'buy' && bracketType === 'stopLoss') ||\n (level.side === 'sell' && bracketType === 'takeProfit');\n const btnY = entryY + (belowEntry ? ADD_BRACKET_BTN_OFFSET_PX : -ADD_BRACKET_BTN_OFFSET_PX);\n if (btnY < 0 || btnY > priceH) return;\n\n // Faint dashed preview line\n ctx.save();\n ctx.strokeStyle = monoColor(theme);\n ctx.lineWidth = 0.8;\n ctx.globalAlpha = 0.3;\n ctx.setLineDash([4, 4]);\n ctx.beginPath();\n ctx.moveTo(bracketLineX, btnY);\n ctx.lineTo(chartW, btnY);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.globalAlpha = 1;\n ctx.restore();\n\n // Pill box: \"+SL\" / \"+TP\"\n const typeLabel = bracketType === 'stopLoss' ? '+SL' : '+TP';\n ctx.font = FONT_BRACKET;\n const textW = ctx.measureText(typeLabel).width;\n const bW = BRACKET_BOX_PAD_X + textW + BRACKET_BOX_PAD_X;\n const bH = BRACKET_BOX_H;\n const bX = bracketLineX - bW - 2;\n const bY = btnY - bH / 2;\n\n ctx.save();\n ctx.globalAlpha = 0.75;\n ctx.fillStyle = monoBoxBg(theme, false);\n ctx.strokeStyle = monoColor(theme);\n ctx.lineWidth = 0.8;\n roundRect(ctx, bX, bY, bW, bH, BOX_RADIUS);\n ctx.fill();\n ctx.stroke();\n ctx.globalAlpha = 1;\n ctx.fillStyle = monoColor(theme);\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(typeLabel, bX + BRACKET_BOX_PAD_X, btnY);\n ctx.restore();\n\n addBracketAreas.push({\n label: level.label,\n type: level.type,\n data: level.data,\n bracketType,\n x: bX,\n y: bY,\n w: bW,\n h: bH,\n });\n}\n\nfunction drawBracketLine(\n ctx: CanvasRenderingContext2D,\n level: PendingOrderLevel | (AnyLevel & { side?: 'buy' | 'sell' }),\n bracketType: 'stopLoss' | 'takeProfit',\n bracketPrice: number,\n scale: ScaleManager,\n priceRange: PriceRange,\n priceH: number,\n bracketLineX: number,\n chartW: number,\n theme: ChartTheme,\n precision: number,\n draggingLabel: string | null,\n dragNewPrice: number | null,\n hitAreas: TradeLevelHitArea[],\n dragAreas: AnyDragArea[],\n bracketOrderLabel?: string\n): void {\n const isDraggingThis = draggingLabel === `${level.label}:${bracketType}`;\n const price = isDraggingThis && dragNewPrice !== null ? dragNewPrice : bracketPrice;\n\n const y = scale.yToPixel(price, priceRange, priceH);\n if (y < -20 || y > priceH + 20) return;\n\n // ── Solid horizontal line ─────────────────────────────────────────────────\n ctx.save();\n ctx.strokeStyle = monoColor(theme);\n ctx.lineWidth = BRACKET_LINE_W;\n ctx.globalAlpha = 0.8;\n ctx.beginPath();\n ctx.moveTo(bracketLineX, y);\n ctx.lineTo(chartW, y);\n ctx.stroke();\n ctx.globalAlpha = 1;\n\n // ── Info box (label + × button) at LEFT end, centered on y ───────────────\n const typeLabel = bracketType === 'stopLoss' ? 'SL' : 'TP';\n const priceStr = price.toFixed(precision);\n const boxLabel = `${typeLabel} ${priceStr}`;\n\n ctx.font = FONT_BRACKET;\n const textW = ctx.measureText(boxLabel).width;\n const bW = BRACKET_BOX_PAD_X + textW + BRACKET_BOX_PAD_X + CLOSE_R * 2 + BRACKET_BOX_PAD_X / 2;\n const bH = BRACKET_BOX_H;\n const bX = bracketLineX - bW - 2;\n const bY = y - bH / 2;\n\n ctx.fillStyle = monoBoxBg(theme, false);\n ctx.strokeStyle = monoColor(theme);\n ctx.lineWidth = 0.8;\n roundRect(ctx, bX, bY, bW, bH, BOX_RADIUS);\n ctx.fill();\n ctx.stroke();\n\n ctx.fillStyle = monoColor(theme);\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(boxLabel, bX + BRACKET_BOX_PAD_X, y);\n\n // × close button\n const btnX = bX + bW - BRACKET_BOX_PAD_X / 2 - CLOSE_R;\n const btnY = y;\n\n ctx.fillStyle = monoColor(theme);\n ctx.beginPath();\n ctx.arc(btnX, btnY, CLOSE_R, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.strokeStyle = theme.background;\n ctx.lineWidth = 1.5;\n ctx.lineCap = 'round';\n const brd = 3.5;\n ctx.beginPath();\n ctx.moveTo(btnX - brd, btnY - brd);\n ctx.lineTo(btnX + brd, btnY + brd);\n ctx.moveTo(btnX + brd, btnY - brd);\n ctx.lineTo(btnX - brd, btnY + brd);\n ctx.stroke();\n\n ctx.restore();\n\n hitAreas.push({\n label: level.label,\n type: level.type,\n data: level.data,\n bracketType,\n bracketOrderLabel,\n x: btnX - CLOSE_R,\n y: btnY - CLOSE_R,\n w: CLOSE_R * 2,\n h: CLOSE_R * 2,\n });\n\n // Line drag area\n dragAreas.push({\n label: level.label,\n data: level.data,\n bracketType,\n price,\n parentPrice: level.price,\n parentSide: (level as PendingOrderLevel).side ?? 'buy',\n bracketOrderLabel,\n x: bracketLineX,\n y: y - 5,\n w: chartW - bracketLineX,\n h: 10,\n isBracket: true,\n });\n // Box drag area (× button is checked first so it still works)\n const closeBtnZoneW = CLOSE_R * 2 + BRACKET_BOX_PAD_X / 2;\n dragAreas.push({\n label: level.label,\n data: level.data,\n bracketType,\n price,\n parentPrice: level.price,\n parentSide: (level as PendingOrderLevel).side ?? 'buy',\n bracketOrderLabel,\n x: bX,\n y: bY,\n w: bW - closeBtnZoneW,\n h: bH,\n isBracket: true,\n });\n}\n\nfunction drawGripHandle(\n ctx: CanvasRenderingContext2D,\n x: number,\n boxY: number,\n boxH: number,\n colors: ChartTheme['tradeLevels'],\n hovered: boolean\n): void {\n const dotColor = hovered ? colors.dragHandleHover : colors.dragHandle;\n const cols = 2;\n const rows = 3;\n const totalW = cols * (GRIP_DOT_R * 2) + (cols - 1) * 3;\n const totalH = rows * (GRIP_DOT_R * 2) + (rows - 1) * 3;\n const startX = x + (GRIP_W - totalW) / 2 + GRIP_DOT_R;\n const startY = boxY + (boxH - totalH) / 2 + GRIP_DOT_R;\n\n ctx.save();\n ctx.fillStyle = dotColor;\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const dx = startX + c * (GRIP_DOT_R * 2 + 3);\n const dy = startY + r * (GRIP_DOT_R * 2 + 3);\n ctx.beginPath();\n ctx.arc(dx, dy, GRIP_DOT_R, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n ctx.restore();\n}\n\n/** Portable roundRect helper. */\nfunction roundRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number\n): void {\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + w - r, y);\n ctx.arcTo(x + w, y, x + w, y + r, r);\n ctx.lineTo(x + w, y + h - r);\n ctx.arcTo(x + w, y + h, x + w - r, y + h, r);\n ctx.lineTo(x + r, y + h);\n ctx.arcTo(x, y + h, x, y + h - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n}\n\n/**\n * Returns the hit area whose × button contains the given canvas coordinate,\n * or `null` if none match.\n */\nexport function hitTestTradeLevelClose(\n x: number,\n y: number,\n hitAreas: TradeLevelHitArea[]\n): TradeLevelHitArea | null {\n return hitAreas.find((h) => x >= h.x && x <= h.x + h.w && y >= h.y && y <= h.y + h.h) ?? null;\n}\n\n/**\n * Returns the edit area whose pencil button contains the given canvas coordinate,\n * or `null` if none match.\n */\nexport function hitTestTradeLevelEdit(\n x: number,\n y: number,\n editAreas: TradeLevelHitArea[]\n): TradeLevelHitArea | null {\n return editAreas.find((h) => x >= h.x && x <= h.x + h.w && y >= h.y && y <= h.y + h.h) ?? null;\n}\n\n/**\n * Returns the confirm/cancel area that contains the given coordinate, or `null`.\n */\nexport function hitTestTradeLevelConfirm(\n x: number,\n y: number,\n confirmAreas: TradeLevelConfirmArea[]\n): TradeLevelConfirmArea | null {\n return (\n confirmAreas.find((a) => x >= a.x && x <= a.x + a.w && y >= a.y && y <= a.y + a.h) ?? null\n );\n}\n\n/**\n * Returns the hover area whose box or line strip contains the given coordinate,\n * or `null` if none match.\n */\nexport function hitTestTradeLevelHover(\n x: number,\n y: number,\n hoverAreas: TradeHoverArea[]\n): TradeHoverArea | null {\n return (\n hoverAreas.find(\n (h) =>\n (x >= h.boxX && x <= h.boxX + h.boxW && y >= h.boxY && y <= h.boxY + h.boxH) ||\n (x >= h.lineX && x <= h.lineX + h.lineW && y >= h.lineY && y <= h.lineY + h.lineH)\n ) ?? null\n );\n}\n\n/**\n * Returns the drag area (grip handle or bracket line strip) that contains the\n * given coordinate, or `null` if none match.\n */\nexport function hitTestTradeLevelDrag(\n x: number,\n y: number,\n dragAreas: AnyDragArea[]\n): AnyDragArea | null {\n return dragAreas.find((d) => x >= d.x && x <= d.x + d.w && y >= d.y && y <= d.y + d.h) ?? null;\n}\n\n/**\n * Returns the +SL / +TP add-bracket button area that contains the given\n * coordinate, or `null` if none match.\n */\nexport function hitTestTradeLevelAddBracket(\n x: number,\n y: number,\n areas: TradeAddBracketArea[]\n): TradeAddBracketArea | null {\n return areas.find((a) => x >= a.x && x <= a.x + a.w && y >= a.y && y <= a.y + a.h) ?? null;\n}\n\n/**\n * Renders a floating price label pill on the right side of the chart,\n * used during a drag to show the live price under the cursor.\n */\nexport function renderDragPriceLabel(\n ctx: CanvasRenderingContext2D,\n price: number,\n y: number,\n theme: ChartTheme,\n chartW: number,\n precision: number\n): void {\n const label = price.toFixed(precision);\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n const tw = ctx.measureText(label).width;\n const pad = 6;\n const bw = tw + pad * 2;\n const bh = 16;\n const bx = chartW - bw - 2;\n const by = y - bh / 2;\n\n ctx.save();\n ctx.fillStyle = theme.ui.accent;\n ctx.strokeStyle = theme.ui.accent;\n roundRect(ctx, bx, by, bw, bh, 3);\n ctx.fill();\n\n ctx.fillStyle = '#ffffff';\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(label, bx + pad, y);\n ctx.restore();\n}\n","import type { OHLCVBar, Viewport } from \"../core/types.js\";\nimport type { ScaleManager } from \"../core/ScaleManager.js\";\nimport type { ChartTheme } from \"../core/themes.js\";\nimport { DEFAULT_TIME_AXIS_CONFIG, type TimeAxisUiConfig } from \"../core/uiConfig.js\";\n\nconst COUNTDOWN_LABEL_HEIGHT = 18;\nconst COUNTDOWN_LABEL_PADDING_X = 6;\nconst COUNTDOWN_LABEL_RADIUS = 3;\n\nconst INTRADAY_TIMEFRAMES: string[] = [\"1m\", \"5m\", \"15m\", \"30m\", \"1h\", \"4h\"];\n\nfunction formatRemaining(totalSec: number): string {\n if (totalSec < 60) return `${totalSec}s`;\n if (totalSec < 3_600) {\n const m = Math.floor(totalSec / 60);\n const s = totalSec % 60;\n return `${m}:${s.toString().padStart(2, \"0\")}`;\n }\n if (totalSec < 86_400) {\n const h = Math.floor(totalSec / 3_600);\n const m = Math.floor((totalSec % 3_600) / 60);\n return `${h}h ${m}m`;\n }\n if (totalSec < 604_800) {\n const d = Math.floor(totalSec / 86_400);\n const h = Math.floor((totalSec % 86_400) / 3_600);\n return `${d}d ${h}h`;\n }\n const w = Math.floor(totalSec / 604_800);\n const d = Math.floor((totalSec % 604_800) / 86_400);\n return `${w}w ${d}d`;\n}\n\nfunction formatTimestamp(ts: number, visibleBars: number, timeframe?: string, spansMultipleDays?: boolean): string {\n const d = new Date(ts);\n if (timeframe && INTRADAY_TIMEFRAMES.includes(timeframe)) {\n const time = d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n if (spansMultipleDays) {\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" }) + \" \" + time;\n }\n return time;\n }\n if (timeframe === \"1Y\") {\n return d.toLocaleDateString(\"en-US\", { year: \"numeric\" });\n }\n if (timeframe === \"1M\") {\n return d.toLocaleDateString(\"en-US\", { month: \"short\", year: \"numeric\" });\n }\n if (visibleBars <= 365) {\n return d.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n }\n return d.toLocaleDateString(\"en-US\", { month: \"short\", year: \"2-digit\" });\n}\n\nexport function renderTimeAxis(\n ctx: CanvasRenderingContext2D,\n bars: OHLCVBar[],\n viewport: Viewport,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n axisY: number,\n maxLabels = 8,\n cfg: TimeAxisUiConfig = DEFAULT_TIME_AXIS_CONFIG,\n timeframe?: string,\n countdownBarIndex?: number,\n): void {\n const visibleBars = viewport.endIndex - viewport.startIndex;\n\n const firstBar = bars[0];\n const lastBar = bars[bars.length - 1];\n const spansMultipleDays =\n !!firstBar &&\n !!lastBar &&\n new Date(firstBar.time).toDateString() !== new Date(lastBar.time).toDateString();\n\n ctx.fillStyle = theme.axisText;\n ctx.font = `${cfg.fontSize} ${cfg.fontFamily}`;\n ctx.textAlign = \"center\";\n\n // Determine a step that prevents label overlap.\n // Start from the count-based step, then widen until adjacent labels have\n // enough room (measured text width + MIN_GAP px on each side).\n const MIN_GAP = 12;\n const sampleLabel = formatTimestamp(bars[Math.floor(bars.length / 2)]?.time ?? bars[0].time, visibleBars, timeframe, spansMultipleDays);\n const labelW = ctx.measureText(sampleLabel).width;\n const minStep = Math.max(1, Math.floor(bars.length / maxLabels));\n let step = minStep;\n if (bars.length > 1) {\n const pxPerBar = chartWidth / Math.max(1, bars.length);\n const requiredPx = labelW + MIN_GAP * 2;\n if (pxPerBar * step < requiredPx) {\n step = Math.ceil(requiredPx / pxPerBar);\n }\n }\n\n for (let i = 0; i < bars.length; i += step) {\n const barIndex = viewport.startIndex + i;\n if (countdownBarIndex !== undefined && barIndex === countdownBarIndex) continue;\n const x = scale.xToPixel(barIndex, viewport, chartWidth);\n const label = formatTimestamp(bars[i].time, visibleBars, timeframe, spansMultipleDays);\n\n const halfW = ctx.measureText(label).width / 2;\n const clampedX = Math.max(halfW, Math.min(chartWidth - halfW, x));\n ctx.fillText(label, clampedX, axisY + 14);\n }\n}\n\n/**\n * Renders a countdown pill on the time axis showing how much time remains\n * until the current (last) candle closes. Positioned beneath the last bar.\n */\nexport function renderCandleCountdown(\n ctx: CanvasRenderingContext2D,\n lastBarTime: number,\n intervalMs: number,\n lastBarIndex: number,\n viewport: Viewport,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n axisY: number,\n cfg: TimeAxisUiConfig = DEFAULT_TIME_AXIS_CONFIG,\n): void {\n const remaining = Math.max(0, lastBarTime + intervalMs - Date.now());\n const totalSec = Math.ceil(remaining / 1000);\n const label = formatRemaining(totalSec);\n\n ctx.font = `${cfg.fontSize} ${cfg.fontFamily}`;\n const textW = ctx.measureText(label).width;\n const boxW = textW + COUNTDOWN_LABEL_PADDING_X * 2;\n const boxH = COUNTDOWN_LABEL_HEIGHT;\n\n const x = scale.xToPixel(lastBarIndex, viewport, chartWidth);\n // Only clamp against the left edge; clip against the right so the pill\n // stays centred on the last candle even when it is near the right boundary.\n const cx = Math.max(boxW / 2, x);\n const boxX = cx - boxW / 2;\n const boxY = axisY + 1;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, axisY, chartWidth, COUNTDOWN_LABEL_HEIGHT + 4);\n ctx.clip();\n\n // Filled rounded-rect background — use axisText (always opaque) so any\n // time label at this position is fully occluded.\n ctx.fillStyle = theme.axisText;\n ctx.beginPath();\n ctx.roundRect(boxX, boxY, boxW, boxH, COUNTDOWN_LABEL_RADIUS);\n ctx.fill();\n\n // Label text\n ctx.fillStyle = theme.background;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(label, cx, boxY + boxH / 2);\n ctx.textBaseline = \"alphabetic\";\n\n ctx.restore();\n}\n","import type { PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_PRICE_AXIS_CONFIG, type PriceAxisUiConfig } from '../core/uiConfig.js';\n\nexport function renderPriceAxis(\n ctx: CanvasRenderingContext2D,\n priceRange: PriceRange,\n scale: ScaleManager,\n theme: ChartTheme,\n chartWidth: number,\n chartHeight: number,\n axisWidth: number,\n gridLines = 6,\n pricePrecision = 2,\n cfg: PriceAxisUiConfig = DEFAULT_PRICE_AXIS_CONFIG,\n): void {\n ctx.fillStyle = theme.axisText;\n ctx.font = `${cfg.fontSize} ${cfg.fontFamily}`;\n ctx.textAlign = 'left';\n\n const step = (priceRange.max - priceRange.min) / gridLines;\n\n for (let i = 0; i <= gridLines; i++) {\n const price = priceRange.min + step * i;\n const y = scale.yToPixel(price, priceRange, chartHeight);\n const label = price.toFixed(pricePrecision);\n ctx.fillText(label, chartWidth + 4, y + 4);\n }\n}\n","/**\n * Central SVG icon definitions for FinChart UI.\n *\n * Two patterns:\n * - Static strings (currentColor) — for elements whose CSS `color` is reliably\n * set by the parent (TopBar, LeftBar, IndicatorOverlay, dialogs).\n * - Color functions `(c: string) => string` — for elements inside ChartEngine\n * where a full-size canvas sits above them in the stacking context, making\n * `currentColor` inheritance unreliable. The hex color is baked directly into\n * the SVG `stroke` attribute.\n *\n * All icons use a 16×16 viewBox. Coordinates are hand-verified against the\n * circle/path geometry so the shapes render correctly at any scale.\n */\n\nimport type { SeriesType } from '../core/types.js';\n\n// ── Internal helper ───────────────────────────────────────────────────────────\n\nfunction mkSvg(body: string, size: number): string {\n return `<svg viewBox=\"0 0 16 16\" width=\"${size}\" height=\"${size}\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">${body}</svg>`;\n}\n\n// ── Static icons (currentColor) ──────────────────────────────────────────────\n\n/** Gear / settings icon — cog with 8 teeth and centre bore. */\nexport const ICON_SETTINGS =\n `<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<path d=\"M6.5 1.5h3l.5 1.8a5.1 5.1 0 0 1 1.24.72l1.76-.56 1.5 2.6-1.38 1.18a5.2 5.2 0 0 1 0 1.44l1.38 1.18-1.5 2.6-1.76-.56A5.1 5.1 0 0 1 10 12.7l-.5 1.8h-3l-.5-1.8a5.1 5.1 0 0 1-1.24-.72l-1.76.56-1.5-2.6L2.88 8.76a5.2 5.2 0 0 1 0-1.44L1.5 6.14l1.5-2.6 1.76.56A5.1 5.1 0 0 1 6 3.38Z\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linejoin=\"round\"/>` +\n `<circle cx=\"8\" cy=\"8\" r=\"2.2\" stroke=\"currentColor\" stroke-width=\"1.3\"/>` +\n `</svg>`;\n\n/** Alias — same icon, used where variable is called \"gear\". */\nexport const ICON_GEAR = ICON_SETTINGS;\n\n/** Pencil / drawing tools toggle icon. */\nexport const ICON_PENCIL =\n `<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<path d=\"M11.5 2.5a1.5 1.5 0 0 1 2.121 2.121l-8.5 8.5L2.5 13.5l.379-2.621 8.621-8.379Z\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n `</svg>`;\n\n/** Close / remove × icon. */\nexport const ICON_CLOSE =\n `<svg viewBox=\"0 0 16 16\" width=\"10\" height=\"10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<path d=\"M3 3l10 10M13 3L3 13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>` +\n `</svg>`;\n\n/** Fullscreen enter (arrows pointing outward). */\nexport const ICON_FULLSCREEN_ENTER =\n `<svg viewBox=\"0 0 16 16\" width=\"15\" height=\"15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<path d=\"M1.5 6.5V1.5h5M6.5 6.5L1.5 1.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n `<path d=\"M14.5 9.5v5h-5M9.5 9.5l5 5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n `</svg>`;\n\n/** Fullscreen exit (arrows pointing inward). */\nexport const ICON_FULLSCREEN_EXIT =\n `<svg viewBox=\"0 0 16 16\" width=\"15\" height=\"15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<path d=\"M6.5 1.5H1.5v5M1.5 1.5l5 5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n `<path d=\"M9.5 14.5H14.5v-5M14.5 14.5l-5-5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n `</svg>`;\n\n/** Trash / delete icon (bin body + lid). */\nexport const ICON_TRASH =\n `<svg viewBox=\"0 0 16 16\" width=\"15\" height=\"15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<polyline points=\"3.5,5 4.5,13.5 11.5,13.5 12.5,5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n `<line x1=\"2\" y1=\"5\" x2=\"14\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>` +\n `<path d=\"M6 5V3.5C6 3 6.5 2.5 7 2.5h2C9.5 2.5 10 3 10 3.5V5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>` +\n `</svg>`;\n\n/** Chart-type icons for the series picker dropdown. */\nexport const ICON_SERIES: Record<SeriesType, string> = {\n candlestick: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <line x1=\"3\" y1=\"1.5\" x2=\"3\" y2=\"3.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <rect x=\"1.5\" y=\"3.5\" width=\"3\" height=\"5\" fill=\"currentColor\" rx=\"0.5\"/>\n <line x1=\"3\" y1=\"8.5\" x2=\"3\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n <rect x=\"6.5\" y=\"4\" width=\"3\" height=\"7\" fill=\"currentColor\" rx=\"0.5\" opacity=\"0.5\"/>\n <line x1=\"8\" y1=\"11\" x2=\"8\" y2=\"13.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n <line x1=\"13\" y1=\"3.5\" x2=\"13\" y2=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <rect x=\"11.5\" y=\"5.5\" width=\"3\" height=\"4.5\" fill=\"currentColor\" rx=\"0.5\"/>\n <line x1=\"13\" y1=\"10\" x2=\"13\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n </svg>`,\n\n hollow: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <line x1=\"3\" y1=\"1.5\" x2=\"3\" y2=\"3.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <rect x=\"1.5\" y=\"3.5\" width=\"3\" height=\"5\" fill=\"currentColor\" rx=\"0.5\"/>\n <line x1=\"3\" y1=\"8.5\" x2=\"3\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n <rect x=\"6.5\" y=\"4\" width=\"3\" height=\"7\" stroke=\"currentColor\" stroke-width=\"1.2\" rx=\"0.5\" opacity=\"0.7\"/>\n <line x1=\"8\" y1=\"11\" x2=\"8\" y2=\"13.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n <line x1=\"13\" y1=\"3.5\" x2=\"13\" y2=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <rect x=\"11.5\" y=\"5.5\" width=\"3\" height=\"4.5\" fill=\"currentColor\" rx=\"0.5\"/>\n <line x1=\"13\" y1=\"10\" x2=\"13\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n </svg>`,\n\n ohlc: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <line x1=\"3\" y1=\"2\" x2=\"3\" y2=\"11.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"1.5\" y1=\"4.5\" x2=\"3\" y2=\"4.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"3\" y1=\"8.5\" x2=\"4.5\" y2=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n <line x1=\"6.5\" y1=\"6\" x2=\"8\" y2=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n <line x1=\"8\" y1=\"10.5\" x2=\"9.5\" y2=\"10.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n <line x1=\"13\" y1=\"4.5\" x2=\"13\" y2=\"12.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"11.5\" y1=\"7\" x2=\"13\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"13\" y1=\"10\" x2=\"14.5\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>`,\n\n line: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"1,13 4,8 7,10 10,4 13,6 15,3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\" stroke-linecap=\"round\"/>\n </svg>`,\n\n area: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1,13 L4,8 L7,10 L10,4 L13,6 L15,3 L15,14 L1,14 Z\" fill=\"currentColor\" opacity=\"0.25\"/>\n <polyline points=\"1,13 4,8 7,10 10,4 13,6 15,3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\" stroke-linecap=\"round\"/>\n </svg>`,\n\n heikinashi: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <line x1=\"3\" y1=\"2\" x2=\"3\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <rect x=\"1.5\" y=\"4\" width=\"3\" height=\"5\" fill=\"currentColor\" rx=\"0.5\"/>\n <line x1=\"3\" y1=\"9\" x2=\"3\" y2=\"11.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <line x1=\"8.5\" y1=\"1.5\" x2=\"8.5\" y2=\"3.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.5\"/>\n <rect x=\"7\" y=\"3.5\" width=\"3\" height=\"6.5\" fill=\"currentColor\" rx=\"0.5\" opacity=\"0.45\"/>\n <line x1=\"8.5\" y1=\"10\" x2=\"8.5\" y2=\"12.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.5\"/>\n <line x1=\"13.5\" y1=\"3\" x2=\"13.5\" y2=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <rect x=\"12\" y=\"5.5\" width=\"3\" height=\"4\" fill=\"currentColor\" rx=\"0.5\"/>\n <line x1=\"13.5\" y1=\"9.5\" x2=\"13.5\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n </svg>`,\n\n volumecandles: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <line x1=\"3\" y1=\"1.5\" x2=\"3\" y2=\"3.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <rect x=\"1.5\" y=\"3.5\" width=\"3\" height=\"5\" fill=\"currentColor\" rx=\"0.5\"/>\n <line x1=\"3\" y1=\"8.5\" x2=\"3\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n <rect x=\"5.5\" y=\"4\" width=\"5\" height=\"7\" fill=\"currentColor\" rx=\"0.5\" opacity=\"0.7\"/>\n <line x1=\"8\" y1=\"11\" x2=\"8\" y2=\"13.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n <line x1=\"13\" y1=\"3.5\" x2=\"13\" y2=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <rect x=\"11.5\" y=\"5.5\" width=\"3\" height=\"4.5\" fill=\"currentColor\" rx=\"0.5\"/>\n <line x1=\"13\" y1=\"10\" x2=\"13\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n </svg>`,\n\n linemarkers: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"1,13 4,8 7,10 10,4 13,6 15,3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\" stroke-linecap=\"round\"/>\n <circle cx=\"1\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"4\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"7\" cy=\"10\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"10\" cy=\"4\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"6\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"15\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>`,\n\n step: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"1,13 1,13 4,13 4,8 7,8 7,10 10,10 10,4 13,4 13,6 15,6 15,3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\" stroke-linecap=\"round\"/>\n </svg>`,\n\n hlcarea: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1,11 L4,6 L7,8 L10,3 L13,5 L15,2 L15,8 L13,10 L10,9 L7,13 L4,11 L1,14 Z\" fill=\"currentColor\" opacity=\"0.2\"/>\n <polyline points=\"1,11 4,6 7,8 10,3 13,5 15,2\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\" stroke-linecap=\"round\"/>\n </svg>`,\n\n baseline: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <line x1=\"1\" y1=\"8.5\" x2=\"15\" y2=\"8.5\" stroke=\"currentColor\" stroke-width=\"0.8\" stroke-dasharray=\"3 2\" opacity=\"0.5\"/>\n <path d=\"M1,13 L4,8 L7,6 L10,4 L15,3 L15,8.5 L1,8.5 Z\" fill=\"currentColor\" opacity=\"0.2\"/>\n <polyline points=\"1,13 4,8 7,6 10,4 15,3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\" stroke-linecap=\"round\"/>\n </svg>`,\n\n columns: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1.5\" y=\"5\" width=\"3\" height=\"9\" fill=\"currentColor\" rx=\"0.5\"/>\n <rect x=\"6.5\" y=\"3\" width=\"3\" height=\"11\" fill=\"currentColor\" rx=\"0.5\" opacity=\"0.7\"/>\n <rect x=\"11.5\" y=\"7\" width=\"3\" height=\"7\" fill=\"currentColor\" rx=\"0.5\"/>\n </svg>`,\n\n highlow: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <line x1=\"3\" y1=\"2\" x2=\"3\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"4\" x2=\"8\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" opacity=\"0.65\"/>\n <line x1=\"13\" y1=\"1\" x2=\"13\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>`,\n};\n\n// ── LeftBar category icons (18×18) ────────────────────────────────────────────\n\n/** Category sidebar icons keyed by category id. */\nexport const ICON_CAT: Record<string, string> = {\n trend_lines: mkSvg(\n `<line x1=\"2\" y1=\"14\" x2=\"12\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <polyline points=\"7,4 12,4 12,9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 18\n ),\n fibonacci_gann: mkSvg(\n `<line x1=\"3\" y1=\"3\" x2=\"3\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"3\" y1=\"4\" x2=\"13\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" opacity=\"0.7\"/>\n <line x1=\"3\" y1=\"12\" x2=\"13\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`,\n 18\n ),\n geometric_shapes: mkSvg(\n `<rect x=\"2.5\" y=\"4.5\" width=\"11\" height=\"7\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.5\"/>`,\n 18\n ),\n measurement_tools: mkSvg(\n `<line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <polyline points=\"5,5 8,2 11,5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <polyline points=\"5,11 8,14 11,11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 18\n ),\n pitchfork_tools: mkSvg(\n `<line x1=\"8\" y1=\"14\" x2=\"8\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"7\" x2=\"4\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"7\" x2=\"8\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"7\" x2=\"12\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n 18\n ),\n volume_statistics: mkSvg(\n `<rect x=\"2\" y=\"9\" width=\"3\" height=\"5\" rx=\"0.5\" fill=\"currentColor\"/>\n <rect x=\"6.5\" y=\"5\" width=\"3\" height=\"9\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.75\"/>\n <rect x=\"11\" y=\"2\" width=\"3\" height=\"12\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.5\"/>`,\n 18\n ),\n annotation_tools: mkSvg(\n `<path d=\"M2 3.5C2 2.67 2.67 2 3.5 2h9C13.33 2 14 2.67 14 3.5v6c0 .83-.67 1.5-1.5 1.5H7l-3 2.5V11H3.5C2.67 11 2 10.33 2 9.5V3.5z\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linejoin=\"round\"/>`,\n 18\n ),\n pattern_recognition: mkSvg(\n `<polyline points=\"1,13 3.5,9 6,11 8,4 10,11 12.5,9 15,13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"1\" y1=\"13\" x2=\"15\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.4\"/>`,\n 18\n ),\n elliott_wave: mkSvg(\n `<path d=\"M1 9 C3 3,5 3,7 9 C9 15,11 15,13 9 C14 6,15 6,15 8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" fill=\"none\"/>`,\n 18\n ),\n brush_highlighter: mkSvg(\n `<path d=\"M11.5 2.5l2 2-7.5 7.5-3 1 1-3 7.5-7.5z\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"9.5\" y1=\"4.5\" x2=\"11.5\" y2=\"6.5\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`,\n 18\n ),\n advanced_tools: mkSvg(\n `<path d=\"M1 8 C3 4,5 4,7 8 C9 12,11 12,13 8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" fill=\"none\"/>\n <circle cx=\"14.5\" cy=\"5.5\" r=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.2\"/>`,\n 18\n ),\n price_projections: mkSvg(\n `<line x1=\"2\" y1=\"11\" x2=\"8\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"5\" x2=\"13.5\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-dasharray=\"2 1.5\"/>\n <polyline points=\"10.5,2 13.5,5 10.5,8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 18\n ),\n};\n\n// ── LeftBar action button icons (16×16) ───────────────────────────────────────\n\n/** Action button icons keyed by action id. */\nexport const ICON_ACTION: Record<string, string> = {\n undo: mkSvg(\n `<path d=\"M3 8a5 5 0 1 1 1.4 3.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" fill=\"none\"/>\n <polyline points=\"2,5 3,9 7,8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 16\n ),\n redo: mkSvg(\n `<path d=\"M13 8a5 5 0 1 0-1.4 3.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" fill=\"none\"/>\n <polyline points=\"14,5 13,9 9,8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 16\n ),\n delete_selected: mkSvg(\n `<line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n 16\n ),\n clear_all: mkSvg(\n `<polyline points=\"3.5,5 4.5,13.5 11.5,13.5 12.5,5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"2\" y1=\"5\" x2=\"14\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n <path d=\"M6 5V3.5C6 3 6.5 2.5 7 2.5h2C9.5 2.5 10 3 10 3.5V5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`,\n 16\n ),\n toggle_visibility: mkSvg(\n `<path d=\"M1.5 8C3 5 5.5 3.5 8 3.5S13 5 14.5 8C13 11 10.5 12.5 8 12.5S3 11 1.5 8z\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n <circle cx=\"8\" cy=\"8\" r=\"2\" stroke=\"currentColor\" stroke-width=\"1.4\"/>`,\n 16\n ),\n toggle_lock: mkSvg(\n `<rect x=\"3.5\" y=\"7.5\" width=\"9\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.4\"/>\n <path d=\"M5.5 7.5V5.5a2.5 2.5 0 0 1 5 0\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`,\n 16\n ),\n};\n\n/** Toggled states for visibility (hidden) and lock (locked). */\nexport const ICON_ACTION_TOGGLED: Partial<Record<string, string>> = {\n toggle_visibility: mkSvg(\n `<path d=\"M1.5 8C3 5 5.5 3.5 8 3.5S13 5 14.5 8C13 11 10.5 12.5 8 12.5S3 11 1.5 8z\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" opacity=\"0.35\"/>\n <line x1=\"3\" y1=\"3\" x2=\"13\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`,\n 16\n ),\n toggle_lock: mkSvg(\n `<rect x=\"3.5\" y=\"7.5\" width=\"9\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.4\"/>\n <path d=\"M5.5 7.5V5.5a2.5 2.5 0 0 1 5 0v2\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`,\n 16\n ),\n};\n\n// ── Eye icons (reused from toggle_visibility action) ──────────────────────────\n\n/** Eye open — indicator visible. Alias of ICON_ACTION['toggle_visibility']. */\nexport const ICON_EYE: string = ICON_ACTION['toggle_visibility']!;\n\n/** Eye with slash — indicator hidden. Alias of ICON_ACTION_TOGGLED['toggle_visibility']. */\nexport const ICON_EYE_OFF: string = ICON_ACTION_TOGGLED['toggle_visibility']!;\n\n// ── LeftBar individual tool icons (14×14) ─────────────────────────────────────\n\n/** Individual drawing tool icons keyed by tool id. */\nexport const ICON_TOOL: Record<string, string> = {\n // Trend Lines & Channels\n trend_line: mkSvg(\n `<line x1=\"2\" y1=\"14\" x2=\"12\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <polyline points=\"7,4 12,4 12,9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n trend_angle: mkSvg(\n `<line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <path d=\"M3 13 L9 13\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n <path d=\"M3 13 A6 6 0 0 0 8.5 8.5\" stroke=\"currentColor\" stroke-width=\"1\" fill=\"none\" opacity=\"0.7\"/>`,\n 14\n ),\n horizontal_line: mkSvg(\n `<line x1=\"2\" y1=\"8\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n 14\n ),\n vertical_line: mkSvg(\n `<line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n 14\n ),\n cross_line: mkSvg(\n `<line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"2\" y1=\"8\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n 14\n ),\n parallel_channel: mkSvg(\n `<line x1=\"2\" y1=\"11\" x2=\"12\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"4\" y1=\"14\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" opacity=\"0.6\"/>`,\n 14\n ),\n disjoint_channel: mkSvg(\n `<line x1=\"2\" y1=\"10\" x2=\"12\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"3\" y1=\"14\" x2=\"14\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" opacity=\"0.6\"/>`,\n 14\n ),\n flat_channel: mkSvg(\n `<line x1=\"2\" y1=\"5\" x2=\"14\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"2\" y1=\"11\" x2=\"14\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" opacity=\"0.6\"/>`,\n 14\n ),\n // Fibonacci & Gann\n fib_retracement: mkSvg(\n `<line x1=\"3\" y1=\"3\" x2=\"3\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"3\" y1=\"4\" x2=\"13\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n <line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.7\"/>\n <line x1=\"3\" y1=\"12\" x2=\"13\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`,\n 14\n ),\n fib_extension: mkSvg(\n `<line x1=\"3\" y1=\"2\" x2=\"3\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"3\" y1=\"3\" x2=\"13\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n <line x1=\"3\" y1=\"7\" x2=\"13\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.7\"/>\n <line x1=\"3\" y1=\"11\" x2=\"13\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>\n <line x1=\"3\" y1=\"14\" x2=\"13\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.35\"/>`,\n 14\n ),\n fib_channel: mkSvg(\n `<line x1=\"2\" y1=\"12\" x2=\"12\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"4\" y1=\"14\" x2=\"14\" y2=\"6\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n <line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.4\"/>`,\n 14\n ),\n fib_timezone: mkSvg(\n `<line x1=\"4\" y1=\"3\" x2=\"4\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"7\" y1=\"3\" x2=\"7\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" opacity=\"0.75\"/>\n <line x1=\"11\" y1=\"3\" x2=\"11\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\" opacity=\"0.55\"/>`,\n 14\n ),\n fib_circles: mkSvg(\n `<circle cx=\"8\" cy=\"8\" r=\"2\" stroke=\"currentColor\" stroke-width=\"1.4\"/>\n <circle cx=\"8\" cy=\"8\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1\" opacity=\"0.6\"/>`,\n 14\n ),\n fib_spiral: mkSvg(\n `<path d=\"M8 8 C8 5,11 5,11 8 C11 12,5 12,5 8 C5 3,13 3,13 8\" stroke=\"currentColor\" stroke-width=\"1.3\" fill=\"none\" stroke-linecap=\"round\"/>`,\n 14\n ),\n fib_fan: mkSvg(\n `<line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n <line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.7\"/>\n <line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`,\n 14\n ),\n gann_fan: mkSvg(\n `<line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n <line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"6\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.7\"/>\n <line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`,\n 14\n ),\n gann_square: mkSvg(\n `<rect x=\"3\" y=\"3\" width=\"10\" height=\"10\" stroke=\"currentColor\" stroke-width=\"1.4\"/>\n <line x1=\"3\" y1=\"3\" x2=\"13\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1\" opacity=\"0.5\"/>\n <line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1\" opacity=\"0.5\"/>`,\n 14\n ),\n gann_box: mkSvg(\n `<rect x=\"3\" y=\"3\" width=\"10\" height=\"10\" stroke=\"currentColor\" stroke-width=\"1.4\"/>\n <line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1\" opacity=\"0.5\"/>\n <line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1\" opacity=\"0.5\"/>`,\n 14\n ),\n // Geometric Shapes\n rectangle: mkSvg(\n `<rect x=\"2.5\" y=\"4.5\" width=\"11\" height=\"7\" rx=\"0.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>`,\n 14\n ),\n rotated_rectangle: mkSvg(\n `<rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"0.5\" stroke=\"currentColor\" stroke-width=\"1.5\" transform=\"rotate(45 8 8)\"/>`,\n 14\n ),\n ellipse: mkSvg(\n `<ellipse cx=\"8\" cy=\"8\" rx=\"6\" ry=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\"/>`,\n 14\n ),\n triangle: mkSvg(\n `<polygon points=\"8,2 14,13 2,13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n circle: mkSvg(`<circle cx=\"8\" cy=\"8\" r=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>`, 14),\n arc: mkSvg(\n `<path d=\"M3 12 A7 7 0 0 1 13 12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" fill=\"none\"/>`,\n 14\n ),\n polyline: mkSvg(\n `<polyline points=\"2,12 5,5 8,10 11,5 14,9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n path: mkSvg(\n `<path d=\"M2 12 C4 5,6 5,8 8 C10 11,12 11,14 5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" fill=\"none\"/>`,\n 14\n ),\n // Measurement Tools\n price_range: mkSvg(\n `<line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <polyline points=\"5,5 8,2 11,5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <polyline points=\"5,11 8,14 11,11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n date_range: mkSvg(\n `<line x1=\"2\" y1=\"8\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <polyline points=\"5,5 2,8 5,11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <polyline points=\"11,5 14,8 11,11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n date_price_range: mkSvg(\n `<rect x=\"2.5\" y=\"3.5\" width=\"11\" height=\"9\" stroke=\"currentColor\" stroke-width=\"1.4\"/>\n <line x1=\"2.5\" y1=\"3.5\" x2=\"13.5\" y2=\"12.5\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.6\"/>`,\n 14\n ),\n ruler: mkSvg(\n `<line x1=\"2\" y1=\"8\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"4\" y1=\"6\" x2=\"4\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <line x1=\"7\" y1=\"7\" x2=\"7\" y2=\"9\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <line x1=\"10\" y1=\"6\" x2=\"10\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <line x1=\"13\" y1=\"7\" x2=\"13\" y2=\"9\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>`,\n 14\n ),\n // Pitchfork Tools\n pitchfork: mkSvg(\n `<line x1=\"8\" y1=\"14\" x2=\"8\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"7\" x2=\"4\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"7\" x2=\"8\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"7\" x2=\"12\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n 14\n ),\n schiff_pitchfork: mkSvg(\n `<line x1=\"8\" y1=\"14\" x2=\"8\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"8\" x2=\"4\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"8\" x2=\"9\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"8\" x2=\"13\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n 14\n ),\n modified_schiff: mkSvg(\n `<line x1=\"8\" y1=\"14\" x2=\"7\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"7\" y1=\"8\" x2=\"3\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"7\" y1=\"8\" x2=\"8\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"7\" y1=\"8\" x2=\"13\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n 14\n ),\n inside_pitchfork: mkSvg(\n `<line x1=\"8\" y1=\"14\" x2=\"8\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"7\" x2=\"4\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"7\" x2=\"8\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"7\" x2=\"12\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"6\" y1=\"5\" x2=\"10\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`,\n 14\n ),\n // Volume & Statistical\n fixed_range_vp: mkSvg(\n `<rect x=\"2\" y=\"3\" width=\"7\" height=\"10\" stroke=\"currentColor\" stroke-width=\"1.2\" opacity=\"0.5\"/>\n <line x1=\"9\" y1=\"5\" x2=\"14\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n <line x1=\"9\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" opacity=\"0.75\"/>\n <line x1=\"9\" y1=\"11\" x2=\"11\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" opacity=\"0.5\"/>`,\n 14\n ),\n anchored_vp: mkSvg(\n `<circle cx=\"5\" cy=\"5\" r=\"2\" stroke=\"currentColor\" stroke-width=\"1.3\"/>\n <line x1=\"5\" y1=\"7\" x2=\"5\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" opacity=\"0.5\"/>\n <line x1=\"7\" y1=\"7\" x2=\"12\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n <line x1=\"7\" y1=\"10\" x2=\"11\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" opacity=\"0.7\"/>\n <line x1=\"7\" y1=\"13\" x2=\"9\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" opacity=\"0.45\"/>`,\n 14\n ),\n volume_profile: mkSvg(\n `<line x1=\"3\" y1=\"4\" x2=\"11\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n <line x1=\"3\" y1=\"7\" x2=\"14\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" opacity=\"0.75\"/>\n <line x1=\"3\" y1=\"10\" x2=\"9\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" opacity=\"0.55\"/>\n <line x1=\"3\" y1=\"13\" x2=\"7\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" opacity=\"0.35\"/>`,\n 14\n ),\n regression_trend: mkSvg(\n `<line x1=\"2\" y1=\"12\" x2=\"13\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"2\" y1=\"9\" x2=\"13\" y2=\"1\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-dasharray=\"2 1.5\" opacity=\"0.6\"/>\n <line x1=\"2\" y1=\"15\" x2=\"13\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-dasharray=\"2 1.5\" opacity=\"0.6\"/>`,\n 14\n ),\n // Annotations\n text: mkSvg(\n `<line x1=\"3\" y1=\"4\" x2=\"13\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"4\" x2=\"8\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n 14\n ),\n callout: mkSvg(\n `<path d=\"M2 3.5C2 2.67 2.67 2 3.5 2h9C13.33 2 14 2.67 14 3.5v5c0 .83-.67 1.5-1.5 1.5H8l-2.5 3V9H3.5C2.67 9 2 8.33 2 7.5V3.5z\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n price_label: mkSvg(\n `<path d=\"M2 8 L5 5 H13.5C14 5 14.5 5.5 14.5 6v4c0 .5-.5 1-1 1H5L2 8z\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n arrow_marker: mkSvg(\n `<line x1=\"3\" y1=\"8\" x2=\"12\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <polyline points=\"9,5 12,8 9,11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n flag: mkSvg(\n `<line x1=\"4\" y1=\"2\" x2=\"4\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <path d=\"M4 3 L12 3 L10 7 L4 7z\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n price_note: mkSvg(\n `<rect x=\"2.5\" y=\"4\" width=\"11\" height=\"8\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.3\"/>\n <line x1=\"5\" y1=\"7\" x2=\"11\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <line x1=\"5\" y1=\"9.5\" x2=\"9\" y2=\"9.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>`,\n 14\n ),\n anchored_note: mkSvg(\n `<circle cx=\"8\" cy=\"5\" r=\"2.5\" stroke=\"currentColor\" stroke-width=\"1.3\"/>\n <line x1=\"8\" y1=\"7.5\" x2=\"8\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-dasharray=\"1.5 1.5\"/>`,\n 14\n ),\n arrow_up: mkSvg(\n `<line x1=\"8\" y1=\"13\" x2=\"8\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <polyline points=\"4,7 8,3 12,7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n arrow_down: mkSvg(\n `<line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <polyline points=\"4,9 8,13 12,9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n // Pattern Recognition\n head_shoulders: mkSvg(\n `<polyline points=\"1,13 3.5,10 5.5,12 8,4 10.5,12 12.5,10 15,13\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"1\" y1=\"13\" x2=\"15\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.4\"/>`,\n 14\n ),\n triangle_pattern: mkSvg(\n `<line x1=\"2\" y1=\"4\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n <line x1=\"2\" y1=\"12\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" opacity=\"0.7\"/>\n <line x1=\"2\" y1=\"4\" x2=\"2\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`,\n 14\n ),\n three_drives: mkSvg(\n `<polyline points=\"2,12 4,7 6,10 8,5 10,9 12,4 14,9\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n abcd_pattern: mkSvg(\n `<polyline points=\"3,12 6,4 9,10 12,3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <circle cx=\"3\" cy=\"12\" r=\"1\" fill=\"currentColor\"/>\n <circle cx=\"6\" cy=\"4\" r=\"1\" fill=\"currentColor\"/>\n <circle cx=\"9\" cy=\"10\" r=\"1\" fill=\"currentColor\"/>\n <circle cx=\"12\" cy=\"3\" r=\"1\" fill=\"currentColor\"/>`,\n 14\n ),\n cypher_pattern: mkSvg(\n `<polyline points=\"2,12 5,5 8,9 11,3 14,8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n butterfly_pattern: mkSvg(\n `<polyline points=\"3,12 6,5 8,10 10,5 13,12\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"3\" y1=\"12\" x2=\"13\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.4\"/>`,\n 14\n ),\n bat_pattern: mkSvg(\n `<polyline points=\"3,11 5.5,5 8,9 10.5,4 13,9\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n gartley_pattern: mkSvg(\n `<polyline points=\"3,12 5.5,4 8,9 10.5,3 13,8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n crab_pattern: mkSvg(\n `<polyline points=\"2,11 5,5 7,9 10,3 14,11\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n shark_pattern: mkSvg(\n `<polyline points=\"2,12 5,6 8,11 11,4 14,10\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n // Elliott Wave\n elliott_impulse: mkSvg(\n `<polyline points=\"2,12 4,5 6,10 8,3 10,8 12,4 14,8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n elliott_corrective: mkSvg(\n `<polyline points=\"2,5 5,12 8,7 11,12 14,5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n elliott_triangle: mkSvg(\n `<polyline points=\"2,4 6,12 8,7 10,12 14,4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"2\" y1=\"4\" x2=\"14\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.4\"/>`,\n 14\n ),\n elliott_combination: mkSvg(\n `<polyline points=\"2,12 4,5 6,10 8,3 10,9 13,4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n elliott_wxy: mkSvg(\n `<polyline points=\"2,5 5,12 8,6 11,13 14,7\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n // Brush & Highlighter\n brush: mkSvg(\n `<path d=\"M11.5 2.5l2 2-7.5 7.5-3 1 1-3 7.5-7.5z\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"9.5\" y1=\"4.5\" x2=\"11.5\" y2=\"6.5\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`,\n 14\n ),\n highlighter: mkSvg(\n `<path d=\"M10 3l3 3-6 6H4v-3l6-6z\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"4\" y1=\"13\" x2=\"12\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" opacity=\"0.6\"/>`,\n 14\n ),\n // Advanced Tools\n ghost_feed: mkSvg(\n `<path d=\"M5 6a3 3 0 0 1 6 0v5l1.5 2h-9L5 11V6z\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"6.5\" y1=\"13.5\" x2=\"9.5\" y2=\"13.5\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"/>`,\n 14\n ),\n projection: mkSvg(\n `<line x1=\"2\" y1=\"11\" x2=\"8\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"5\" x2=\"13.5\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-dasharray=\"2 1.5\"/>\n <polyline points=\"10.5,2.5 13.5,5 10.5,7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n sine_line: mkSvg(\n `<path d=\"M1 8 C3 4,5 4,7 8 C9 12,11 12,13 8 C14 6,15 6,15 7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" fill=\"none\"/>`,\n 14\n ),\n cyclic_lines: mkSvg(\n `<line x1=\"4\" y1=\"3\" x2=\"4\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-dasharray=\"1.5 1.5\"/>\n <line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-dasharray=\"1.5 1.5\"/>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-dasharray=\"1.5 1.5\"/>`,\n 14\n ),\n time_cycles: mkSvg(\n `<ellipse cx=\"5\" cy=\"8\" rx=\"3\" ry=\"5\" stroke=\"currentColor\" stroke-width=\"1.3\" opacity=\"0.9\"/>\n <ellipse cx=\"11\" cy=\"8\" rx=\"3\" ry=\"5\" stroke=\"currentColor\" stroke-width=\"1.3\" opacity=\"0.6\"/>`,\n 14\n ),\n // Price Projections\n fib_projection: mkSvg(\n `<line x1=\"3\" y1=\"3\" x2=\"3\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"3\" y1=\"4\" x2=\"13\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n <line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.7\"/>\n <line x1=\"3\" y1=\"12\" x2=\"13\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-dasharray=\"2 1.5\" opacity=\"0.5\"/>`,\n 14\n ),\n price_projection: mkSvg(\n `<line x1=\"2\" y1=\"11\" x2=\"8\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"8\" y1=\"5\" x2=\"13.5\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-dasharray=\"2 1.5\"/>\n <polyline points=\"10.5,2.5 13.5,5 10.5,7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n 14\n ),\n};\n\n// ── Color-function icons ──────────────────────────────────────────────────────\n// Used inside ChartEngine's floating buttons via CSS background-image data URI,\n// so the hex stroke color is baked in directly (no `currentColor` dependency).\n\n/**\n * Skip-to-latest icon (two filled arrows + vertical end bar).\n *\n * Geometry (16×16 viewBox):\n * Arrow 1 (1,4)→(6,8)→(1,12) — filled right-pointing triangle.\n * Arrow 2 (6,4)→(11,8)→(6,12) — filled right-pointing triangle.\n * Bar x=13.5, y=3.5→12.5 — stop/end marker (rounded cap).\n * Content spans x=1–14 (centre x=7.5) and y=3.5–12.5 (centre y=8). ✓\n */\nexport const iconScrollToEnd = (c: string, size = 16): string =>\n `<svg viewBox=\"0 0 16 16\" width=\"${size}\" height=\"${size}\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<path d=\"M1 4L6 8L1 12Z\" fill=\"${c}\"/>` +\n `<path d=\"M6 4L11 8L6 12Z\" fill=\"${c}\"/>` +\n `<line x1=\"13.5\" y1=\"3.5\" x2=\"13.5\" y2=\"12.5\" stroke=\"${c}\" stroke-width=\"2\" stroke-linecap=\"round\"/>` +\n `</svg>`;\n\n/**\n * Reset-view / refresh icon (270° clockwise arc + arrowhead).\n *\n * Geometry (16×16 viewBox, circle centre (8,8) radius 6):\n * Arc start (8, 2) — top of circle (angle 270°)\n * Arc end (2, 8) — left of circle (angle 180°)\n * Sweep: CW (flag=1), large-arc (flag=1) → 270° arc going right→bottom→left.\n * Arrowhead (4,10)→(2,8)→(1,10) — tip at (2,8), pointing upward,\n * which is the CW tangent direction at the leftmost point. ✓\n */\nexport const iconResetView = (c: string, size = 16): string =>\n `<svg viewBox=\"0 0 16 16\" width=\"${size}\" height=\"${size}\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<path d=\"M8 2A6 6 0 1 1 2 8\" stroke=\"${c}\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>` +\n `<path d=\"M4 10L2 8L1 10\" stroke=\"${c}\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n `</svg>`;\n\n// ── Settings dialog tab icons ─────────────────────────────────────────────────\n\n/** Tab icons for ChartSettingsDialog sidebar (appearance / tools / trading). */\nexport const ICON_TAB: Record<'appearance' | 'tools' | 'trading', string> = {\n appearance: `<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"8\" cy=\"8\" r=\"3\" stroke=\"currentColor\" stroke-width=\"1.4\"/><path d=\"M8 1v1.5M8 13.5V15M1 8h1.5M13.5 8H15M3.05 3.05l1.06 1.06M11.89 11.89l1.06 1.06M3.05 12.95l1.06-1.06M11.89 4.11l1.06-1.06\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/></svg>`,\n tools: `<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2 14l4-4M10 2l4 4-7 7-4-4z\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M13 3l1 1\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/></svg>`,\n trading: `<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1 12l4-5 3 2 4-6\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M11 3h4v4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`,\n};\n\n// ── Small close icon (12×12) ──────────────────────────────────────────────────\n\n/** Close × icon at 12×12 — used in dialog headers. */\nexport const ICON_CLOSE_SM =\n `<svg viewBox=\"0 0 12 12\" width=\"12\" height=\"12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<path d=\"M1 1l10 10M11 1L1 11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>` +\n `</svg>`;\n\n// ── Indicator overlay icons ───────────────────────────────────────────────────\n\n/** Solid circle bullet — used as colour dot in indicator pills. */\nexport const ICON_BULLET =\n `<svg viewBox=\"0 0 10 10\" width=\"10\" height=\"10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<circle cx=\"5\" cy=\"5\" r=\"4\" fill=\"currentColor\"/>` +\n `</svg>`;\n\n// ── Dropdown / list icons ─────────────────────────────────────────────────────\n\n/** Checkmark tick — used to mark the active item in dropdowns. */\nexport const ICON_CHECKMARK =\n `<svg viewBox=\"0 0 12 12\" width=\"10\" height=\"10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<path d=\"M1.5 6l3.5 3.5 5.5-6\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n `</svg>`;\n\n// ── Action / button icons ─────────────────────────────────────────────────────\n\n/** Plus-in-circle ⊕ — used on the Trade button. */\nexport const ICON_PLUS_CIRCLE =\n `<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.4\"/>` +\n `<line x1=\"8\" y1=\"4.5\" x2=\"8\" y2=\"11.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>` +\n `<line x1=\"4.5\" y1=\"8\" x2=\"11.5\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>` +\n `</svg>`;\n\n/** Chevron pointing up — used on scroll buttons. */\nexport const ICON_CHEVRON_UP =\n `<svg viewBox=\"0 0 10 10\" width=\"10\" height=\"10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<polyline points=\"2,7 5,3 8,7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n `</svg>`;\n\n/** Chevron pointing down — used on scroll buttons. */\nexport const ICON_CHEVRON_DOWN =\n `<svg viewBox=\"0 0 10 10\" width=\"10\" height=\"10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<polyline points=\"2,3 5,7 8,3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n `</svg>`;\n\n/** Three horizontal dots — used as the combined actions button in mobile LeftBar. */\nexport const ICON_MORE_ACTIONS = mkSvg(\n `<circle cx=\"4\" cy=\"8\" r=\"1.3\" fill=\"currentColor\"/>` +\n `<circle cx=\"8\" cy=\"8\" r=\"1.3\" fill=\"currentColor\"/>` +\n `<circle cx=\"12\" cy=\"8\" r=\"1.3\" fill=\"currentColor\"/>`,\n 14,\n);\n","import type { SeriesType, Timeframe, Duration } from '../core/types.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_TOP_BAR_CONFIG, type TopBarUiConfig } from '../core/uiConfig.js';\nimport { DEFAULT_LABELS, type TopBarLabels } from '../core/labels.js';\nimport { ICON_SETTINGS, ICON_FULLSCREEN_ENTER, ICON_FULLSCREEN_EXIT, ICON_SERIES, ICON_CHECKMARK, ICON_PENCIL } from './icons.js';\n\nconst DURATIONS: Duration[] = ['1D', '5D', '1M', '3M', '6M', '1Y', '5Y', 'All'];\n\n/** Indicators that require volume data — disabled in the flyout when no volume is present. */\nconst VOLUME_REQUIRED = new Set(['VOL', 'VWAP', 'OBV', 'A/D', 'MFI', 'CMF']);\n\ntype DropdownId = 'series' | 'timeframe' | 'indicators' | 'duration';\n\n\n// ── Scrollbar CSS (injected once) ────────────────────────────────────────────\n\nfunction injectFlyoutScrollbarStyles(): void {\n if (document.getElementById('finchart-flyout-scrollbar')) return;\n const style = document.createElement('style');\n style.id = 'finchart-flyout-scrollbar';\n style.textContent = `\n .finchart-flyout::-webkit-scrollbar { width: 4px; }\n .finchart-flyout::-webkit-scrollbar-track { background: transparent; }\n .finchart-flyout::-webkit-scrollbar-thumb { background: rgba(120,130,150,0.35); border-radius: 4px; }\n .finchart-flyout::-webkit-scrollbar-thumb:hover { background: rgba(120,130,150,0.6); }\n .finchart-flyout-row:hover { background: var(--finchart-row-hover) !important; }\n `;\n document.head.appendChild(style);\n}\n\nexport class TopBar {\n readonly el: HTMLDivElement;\n private leftGroup: HTMLDivElement;\n private rightGroup: HTMLDivElement;\n private seriesBtn: HTMLButtonElement;\n private tfBtn: HTMLButtonElement;\n private indBtn: HTMLButtonElement;\n private fullscreenBtn: HTMLButtonElement;\n private settingsBtn: HTMLButtonElement;\n private isFullscreen = false;\n private durationBtns = new Map<Duration, HTMLButtonElement>();\n private durationSep: HTMLDivElement;\n private durationDropBtn: HTMLButtonElement;\n private isMobileLayout = false;\n private activeDuration: Duration | null;\n private durationMap: Record<Duration, Timeframe>;\n private theme: ChartTheme;\n private cfg: TopBarUiConfig;\n private labels: TopBarLabels;\n\n private drawingBtn: HTMLButtonElement | null = null;\n\n private flyout: HTMLDivElement;\n private openDropdown: DropdownId | null = null;\n private docClickHandler: (e: MouseEvent) => void;\n\n private currentSeries: SeriesType;\n private currentTf: Timeframe;\n private indicatorOptions: { value: string; label: string; category?: string }[] = [];\n private activeIndicators = new Set<string>();\n private volHasData = true;\n\n constructor(\n private onSeriesChange: (s: SeriesType) => void,\n private onTimeframeChange: (tf: Timeframe) => void,\n private onAddIndicator: (name: string) => void,\n private onDurationChange: (d: Duration, tf: Timeframe) => void,\n private onSettingsClick: () => void,\n private onFullscreenToggle: () => void,\n private onDrawingToolsToggle: (() => void) | null,\n showDrawingToolsBtn: boolean,\n initialSeries: SeriesType,\n initialTf: Timeframe,\n initialDuration: Duration | null,\n durationMap: Record<Duration, Timeframe>,\n theme: ChartTheme,\n cfg: TopBarUiConfig = DEFAULT_TOP_BAR_CONFIG,\n labels: TopBarLabels = DEFAULT_LABELS.topBar,\n ) {\n this.theme = theme;\n this.cfg = cfg;\n this.labels = labels;\n this.currentSeries = initialSeries;\n this.currentTf = initialTf;\n this.activeDuration = initialDuration;\n this.durationMap = durationMap;\n\n injectFlyoutScrollbarStyles();\n\n this.el = document.createElement('div');\n this.applyBarStyles(theme);\n\n // ── Flyout (shared for all dropdowns) ─────────────────────────────────\n this.flyout = document.createElement('div');\n this.flyout.classList.add('finchart-flyout');\n this.applyFlyoutStyles();\n document.body.appendChild(this.flyout);\n\n // ── Left group: dropdowns ─────────────────────────────────────────────\n this.leftGroup = document.createElement('div');\n Object.assign(this.leftGroup.style, {\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n flex: '1',\n minWidth: '0',\n overflow: 'hidden',\n });\n\n if (showDrawingToolsBtn) {\n this.drawingBtn = this.makeDrawingBtn(theme);\n this.leftGroup.appendChild(this.drawingBtn);\n }\n\n this.seriesBtn = this.makeSeriesBtn(initialSeries, theme);\n this.seriesBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleDropdown('series', this.seriesBtn);\n });\n this.addBtnHover(this.seriesBtn);\n\n this.tfBtn = this.makeDropBtn(initialTf, theme, false);\n this.tfBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleDropdown('timeframe', this.tfBtn);\n });\n this.addBtnHover(this.tfBtn);\n\n this.indBtn = this.makeDropBtn(this.labels.indicatorsBtn, theme, false);\n this.indBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleDropdown('indicators', this.indBtn);\n });\n this.addBtnHover(this.indBtn);\n\n this.leftGroup.append(this.seriesBtn, this.tfBtn, this.indBtn);\n\n // ── Right group: duration buttons + fullscreen + settings ──────────────\n this.rightGroup = document.createElement('div');\n Object.assign(this.rightGroup.style, {\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n flexShrink: '0',\n });\n\n // Duration controls have been moved to BottomBar.\n // Stub elements are retained so existing setTheme/setMobileLayout/setActiveDuration\n // calls remain no-ops without needing null guards.\n this.durationDropBtn = this.makeDropBtn(initialDuration ?? DURATIONS[0], theme, false);\n this.durationDropBtn.style.display = 'none';\n this.durationSep = document.createElement('div');\n this.durationSep.style.display = 'none';\n\n this.fullscreenBtn = document.createElement('button');\n this.fullscreenBtn.title = this.labels.toggleFullscreenTitle;\n this.fullscreenBtn.innerHTML = ICON_FULLSCREEN_ENTER;\n this.applyIconBtnStyles(this.fullscreenBtn, theme, false);\n this.fullscreenBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.onFullscreenToggle();\n });\n this.addBtnHover(this.fullscreenBtn);\n this.rightGroup.appendChild(this.fullscreenBtn);\n\n this.settingsBtn = document.createElement('button');\n this.settingsBtn.title = this.labels.settingsTitle;\n this.settingsBtn.innerHTML = ICON_SETTINGS;\n this.applyIconBtnStyles(this.settingsBtn, theme, false);\n this.settingsBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.onSettingsClick();\n });\n this.addBtnHover(this.settingsBtn);\n this.rightGroup.appendChild(this.settingsBtn);\n\n this.el.append(this.leftGroup, this.rightGroup);\n\n // ── Close flyout on outside click ─────────────────────────────────────\n this.docClickHandler = (e: MouseEvent) => {\n if (\n !this.el.contains(e.target as Node) &&\n !this.flyout.contains(e.target as Node)\n ) {\n this.closeDropdown();\n }\n };\n document.addEventListener('click', this.docClickHandler, true);\n }\n\n // ── Public API ────────────────────────────────────────────────────────────\n\n destroy(): void {\n this.flyout.remove();\n document.removeEventListener('click', this.docClickHandler, true);\n }\n\n reparentFlyout(root: HTMLElement): void {\n if (this.flyout.parentElement !== root) root.appendChild(this.flyout);\n }\n\n setFullscreen(active: boolean): void {\n this.isFullscreen = active;\n this.fullscreenBtn.innerHTML = active ? ICON_FULLSCREEN_EXIT : ICON_FULLSCREEN_ENTER;\n this.fullscreenBtn.title = active ? this.labels.exitFullscreenTitle : this.labels.toggleFullscreenTitle;\n this.applyIconBtnStyles(this.fullscreenBtn, this.theme, active);\n }\n\n setDrawingsBtnActive(active: boolean): void {\n if (!this.drawingBtn) return;\n this.applyIconBtnStyles(this.drawingBtn, this.theme, active);\n }\n\n setTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.closeDropdown();\n this.applyBarStyles(theme);\n this.applyFlyoutStyles();\n if (this.drawingBtn) this.applyIconBtnStyles(this.drawingBtn, theme, false);\n this.applyIconBtnStyles(this.fullscreenBtn, theme, this.isFullscreen);\n this.applyIconBtnStyles(this.settingsBtn, theme, false);\n this.applySeriesBtnStyles(this.seriesBtn, theme, false);\n this.applyDropBtnStyles(this.tfBtn, theme, false);\n this.applyDropBtnStyles(this.indBtn, theme, false);\n for (const [d, btn] of this.durationBtns) {\n this.applyDurationBtnStyles(btn, theme, d === this.activeDuration);\n }\n this.durationSep.style.background = theme.axisBorder;\n this.applyDropBtnStyles(this.durationDropBtn, theme, false);\n }\n\n setSeries(s: SeriesType): void {\n this.currentSeries = s;\n this.updateSeriesBtnContent(this.seriesBtn, s);\n }\n\n setTimeframe(tf: Timeframe): void {\n this.currentTf = tf;\n this.tfBtn.textContent = tf;\n }\n\n setActiveDuration(d: Duration | null | undefined): void {\n if (this.activeDuration === (d ?? null)) return;\n if (this.activeDuration) {\n const prev = this.durationBtns.get(this.activeDuration);\n if (prev) this.applyDurationBtnStyles(prev, this.theme, false);\n }\n this.activeDuration = d ?? null;\n if (d) {\n const next = this.durationBtns.get(d);\n if (next) this.applyDurationBtnStyles(next, this.theme, true);\n this.durationDropBtn.textContent = d;\n }\n }\n\n setMobileLayout(isMobile: boolean): void {\n if (this.isMobileLayout === isMobile) return;\n this.isMobileLayout = isMobile;\n const btnDisplay = isMobile ? 'none' : '';\n for (const btn of this.durationBtns.values()) {\n btn.style.display = btnDisplay;\n }\n this.durationSep.style.display = btnDisplay;\n this.durationDropBtn.style.display = isMobile ? '' : 'none';\n }\n\n setIndicatorOptions(options: { value: string; label: string; category?: string }[]): void {\n this.indicatorOptions = options;\n }\n\n setIndicatorOptionActive(value: string, active: boolean): void {\n if (active) {\n this.activeIndicators.add(value);\n } else {\n this.activeIndicators.delete(value);\n }\n this.updateIndBtnLabel();\n }\n\n /** Update volume control state — reflects VOL as active/inactive in the indicators flyout. */\n setVolumeControl(show: boolean, hasData: boolean): void {\n this.volHasData = hasData;\n const active = hasData && show;\n if (active) {\n this.activeIndicators.add('VOL');\n } else {\n this.activeIndicators.delete('VOL');\n }\n this.updateIndBtnLabel();\n }\n\n // ── Private – drawing tools button ───────────────────────────────────────\n\n private makeDrawingBtn(theme: ChartTheme): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.title = 'Drawing Tools';\n btn.innerHTML = ICON_PENCIL;\n this.applyIconBtnStyles(btn, theme, false);\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.onDrawingToolsToggle?.();\n });\n this.addBtnHover(btn);\n return btn;\n }\n\n // ── Private – series button ────────────────────────────────────────────────\n\n private makeSeriesBtn(series: SeriesType, theme: ChartTheme): HTMLButtonElement {\n const btn = document.createElement('button');\n this.applySeriesBtnStyles(btn, theme, false);\n this.updateSeriesBtnContent(btn, series);\n return btn;\n }\n\n private updateSeriesBtnContent(btn: HTMLButtonElement, series: SeriesType): void {\n const label = (this.labels.series as Record<string, string>)[series] ?? series;\n btn.title = label;\n btn.innerHTML = ICON_SERIES[series];\n }\n\n private applySeriesBtnStyles(btn: HTMLButtonElement, theme: ChartTheme, active: boolean): void {\n btn.dataset.active = String(active);\n Object.assign(btn.style, {\n background: active ? theme.ui.accentBg : 'transparent',\n color: active ? theme.ui.accentText : theme.topBar.btnColor,\n border: `1px solid ${active ? theme.ui.accent : theme.axisBorder}`,\n borderRadius: '5px',\n padding: '3px 7px',\n cursor: 'pointer',\n outline: 'none',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n flexShrink: '0',\n height: '24px',\n transition: 'border-color 0.12s, background 0.12s',\n });\n }\n\n // ── Private – flyout ──────────────────────────────────────────────────────\n\n private applyFlyoutStyles(): void {\n Object.assign(this.flyout.style, {\n position: 'fixed',\n zIndex: '9999',\n display: 'none',\n background: this.theme.tooltip.background,\n border: `1px solid ${this.theme.axisBorder}`,\n borderRadius: '8px',\n padding: '4px 0',\n minWidth: '168px',\n maxHeight: '340px',\n overflowY: 'auto',\n overflowX: 'hidden',\n boxShadow: '0 8px 24px rgba(0,0,0,0.55), 0 2px 8px rgba(0,0,0,0.3)',\n fontFamily: this.cfg.flyoutRowFontFamily,\n fontSize: this.cfg.flyoutRowFontSize,\n scrollbarWidth: 'thin',\n scrollbarColor: `rgba(120,130,150,0.35) transparent`,\n });\n }\n\n private toggleDropdown(id: DropdownId, anchorBtn: HTMLButtonElement): void {\n if (this.openDropdown === id) {\n this.closeDropdown();\n return;\n }\n\n this.openDropdown = id;\n this.applySeriesBtnStyles(this.seriesBtn, this.theme, id === 'series');\n this.applyDropBtnStyles(this.tfBtn, this.theme, id === 'timeframe');\n this.applyDropBtnStyles(this.indBtn, this.theme, id === 'indicators');\n this.applyDropBtnStyles(this.durationDropBtn, this.theme, id === 'duration');\n\n this.buildDropdownContent(id);\n\n const rect = anchorBtn.getBoundingClientRect();\n Object.assign(this.flyout.style, {\n display: 'block',\n left: `${rect.left}px`,\n top: `${rect.bottom + 6}px`,\n });\n\n requestAnimationFrame(() => {\n const fr = this.flyout.getBoundingClientRect();\n if (fr.right > window.innerWidth - 8) {\n this.flyout.style.left = `${window.innerWidth - fr.width - 8}px`;\n }\n if (fr.bottom > window.innerHeight - 8) {\n this.flyout.style.top = `${rect.top - fr.height - 6}px`;\n }\n });\n }\n\n private buildDropdownContent(id: DropdownId): void {\n this.flyout.innerHTML = '';\n this.flyout.style.minWidth = id === 'series' ? '152px' : id === 'timeframe' ? '160px' : id === 'duration' ? '120px' : '180px';\n\n if (id === 'series') {\n const seriesOptions: { value: SeriesType; label: string }[] = [\n { value: 'candlestick', label: this.labels.series.candlestick },\n { value: 'hollow', label: this.labels.series.hollow },\n { value: 'ohlc', label: this.labels.series.ohlc },\n { value: 'line', label: this.labels.series.line },\n { value: 'area', label: this.labels.series.area },\n { value: 'heikinashi', label: this.labels.series.heikinashi },\n { value: 'volumecandles', label: this.labels.series.volumecandles },\n { value: 'linemarkers', label: this.labels.series.linemarkers },\n { value: 'step', label: this.labels.series.step },\n { value: 'hlcarea', label: this.labels.series.hlcarea },\n { value: 'baseline', label: this.labels.series.baseline },\n { value: 'columns', label: this.labels.series.columns },\n { value: 'highlow', label: this.labels.series.highlow },\n ];\n for (const opt of seriesOptions) {\n const row = this.makeRow(opt.label, opt.value === this.currentSeries, false, ICON_SERIES[opt.value]);\n row.addEventListener('click', () => {\n this.currentSeries = opt.value;\n this.updateSeriesBtnContent(this.seriesBtn, opt.value);\n this.onSeriesChange(opt.value);\n this.closeDropdown();\n });\n this.flyout.appendChild(row);\n }\n } else if (id === 'timeframe') {\n const intraday: Timeframe[] = ['1m', '5m', '15m', '30m', '1h', '4h'];\n const daily: Timeframe[] = ['1D', '1W', '1M', '1Y'];\n\n this.flyout.appendChild(this.makeCategoryHeader('Intraday'));\n for (const tf of intraday) {\n const tfLabel = this.labels.timeframes[tf] ?? tf;\n const row = this.makeRow(tfLabel, tf === this.currentTf, false);\n row.addEventListener('click', () => {\n this.currentTf = tf;\n this.tfBtn.textContent = tfLabel;\n this.onTimeframeChange(tf as Timeframe);\n this.closeDropdown();\n });\n this.flyout.appendChild(row);\n }\n this.flyout.appendChild(this.makeCategoryHeader('Daily +'));\n for (const tf of daily) {\n const tfLabel = this.labels.timeframes[tf] ?? tf;\n const row = this.makeRow(tfLabel, tf === this.currentTf, false);\n row.addEventListener('click', () => {\n this.currentTf = tf;\n this.tfBtn.textContent = tfLabel;\n this.onTimeframeChange(tf as Timeframe);\n this.closeDropdown();\n });\n this.flyout.appendChild(row);\n }\n } else if (id === 'duration') {\n for (const d of DURATIONS) {\n const row = this.makeRow(d, d === this.activeDuration, false);\n row.addEventListener('click', () => {\n this.setActiveDuration(d);\n this.onDurationChange(d, this.durationMap[d]);\n this.closeDropdown();\n });\n this.flyout.appendChild(row);\n }\n } else {\n // ── Search input ──────────────────────────────────────────────────\n const searchWrap = document.createElement('div');\n Object.assign(searchWrap.style, {\n position: 'sticky',\n top: '0',\n zIndex: '1',\n padding: '6px 8px',\n background: this.theme.tooltip.background,\n borderBottom: `1px solid ${this.theme.axisBorder}`,\n });\n\n const searchInput = document.createElement('input');\n searchInput.type = 'text';\n searchInput.placeholder = 'Search indicators…';\n Object.assign(searchInput.style, {\n width: '100%',\n boxSizing: 'border-box',\n padding: '5px 8px',\n background: this.theme.background,\n color: this.theme.tooltip.text,\n border: `1px solid ${this.theme.axisBorder}`,\n borderRadius: '4px',\n fontSize: '12px',\n outline: 'none',\n });\n searchWrap.appendChild(searchInput);\n this.flyout.appendChild(searchWrap);\n\n // ── Scrollable list container ─────────────────────────────────────\n const listContainer = document.createElement('div');\n this.flyout.appendChild(listContainer);\n\n // Build grouped structure once\n const groups = new Map<string, { value: string; label: string }[]>();\n for (const o of this.indicatorOptions) {\n const cat = o.category ?? '';\n if (!groups.has(cat)) groups.set(cat, []);\n groups.get(cat)!.push(o);\n }\n\n const renderList = (query: string) => {\n listContainer.innerHTML = '';\n const q = query.trim().toLowerCase();\n\n if (q) {\n // Flat filtered results, no category headers\n for (const o of this.indicatorOptions) {\n if (!o.label.toLowerCase().includes(q) && !o.value.toLowerCase().includes(q)) continue;\n const isActive = this.activeIndicators.has(o.value);\n const isDisabled = VOLUME_REQUIRED.has(o.value) && !this.volHasData;\n const row = this.makeRow(o.label, isActive, isDisabled);\n if (!isDisabled) {\n row.addEventListener('click', () => {\n this.onAddIndicator(o.value);\n renderList(searchInput.value);\n });\n }\n listContainer.appendChild(row);\n }\n } else {\n // Grouped view\n for (const [cat, entries] of groups) {\n if (cat) listContainer.appendChild(this.makeCategoryHeader(cat));\n for (const o of entries) {\n const isActive = this.activeIndicators.has(o.value);\n const isDisabled = VOLUME_REQUIRED.has(o.value) && !this.volHasData;\n const row = this.makeRow(o.label, isActive, isDisabled);\n if (!isDisabled) {\n row.addEventListener('click', () => {\n this.onAddIndicator(o.value);\n renderList(searchInput.value);\n });\n }\n listContainer.appendChild(row);\n }\n }\n }\n };\n\n renderList('');\n searchInput.addEventListener('input', () => renderList(searchInput.value));\n\n // Auto-focus search after layout\n requestAnimationFrame(() => searchInput.focus());\n }\n }\n\n private makeCategoryHeader(label: string): HTMLDivElement {\n const header = document.createElement('div');\n Object.assign(header.style, {\n padding: '6px 12px 4px',\n fontSize: this.cfg.flyoutCategoryFontSize,\n fontWeight: '600',\n letterSpacing: this.cfg.flyoutCategoryLetterSpacing,\n color: this.theme.topBar.flyoutCategoryColor,\n textTransform: 'uppercase',\n opacity: '0.55',\n marginTop: '2px',\n });\n header.textContent = label;\n return header;\n }\n\n private makeRow(\n label: string,\n active: boolean,\n disabled: boolean,\n iconHtml?: string,\n ): HTMLButtonElement {\n const row = document.createElement('button');\n const hoverBg = this.theme.ui.accentBg;\n const activeBg = this.theme.ui.accentBg;\n\n Object.assign(row.style, {\n width: '100%',\n padding: '7px 12px',\n background: active ? activeBg : 'transparent',\n border: 'none',\n borderLeft: active\n ? `2px solid ${this.theme.ui.accent}`\n : '2px solid transparent',\n color: disabled\n ? this.theme.ui.disabledText\n : active\n ? this.theme.ui.accentText\n : this.theme.topBar.flyoutRowColor,\n fontSize: this.cfg.flyoutRowFontSize,\n fontFamily: this.cfg.flyoutRowFontFamily,\n textAlign: 'left',\n cursor: disabled ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n boxSizing: 'border-box',\n opacity: disabled ? '0.45' : '1',\n transition: 'background 0.1s',\n });\n\n if (!disabled && !active) {\n row.addEventListener('mouseenter', () => {\n row.style.background = hoverBg;\n });\n row.addEventListener('mouseleave', () => {\n row.style.background = 'transparent';\n });\n }\n\n if (iconHtml) {\n const iconWrap = document.createElement('span');\n Object.assign(iconWrap.style, {\n display: 'flex',\n alignItems: 'center',\n flexShrink: '0',\n opacity: active ? '1' : '0.7',\n });\n iconWrap.innerHTML = iconHtml;\n // resize the svg inside\n const svg = iconWrap.querySelector('svg');\n if (svg) {\n svg.setAttribute('width', '13');\n svg.setAttribute('height', '13');\n }\n row.appendChild(iconWrap);\n }\n\n const nameSpan = document.createElement('span');\n nameSpan.style.flex = '1';\n nameSpan.textContent = label;\n row.appendChild(nameSpan);\n\n if (active) {\n const check = document.createElement('span');\n Object.assign(check.style, {\n color: this.theme.ui.accent,\n fontSize: this.cfg.flyoutCheckFontSize,\n flexShrink: '0',\n });\n check.innerHTML = ICON_CHECKMARK;\n row.appendChild(check);\n }\n\n return row;\n }\n\n private closeDropdown(): void {\n this.flyout.style.display = 'none';\n this.openDropdown = null;\n this.applySeriesBtnStyles(this.seriesBtn, this.theme, false);\n this.applyDropBtnStyles(this.tfBtn, this.theme, false);\n this.applyDropBtnStyles(this.indBtn, this.theme, false);\n this.applyDropBtnStyles(this.durationDropBtn, this.theme, false);\n }\n\n private updateIndBtnLabel(): void {\n const count = this.activeIndicators.size;\n this.indBtn.textContent = count > 0\n ? this.labels.indicatorsBtnActive.replace('{count}', String(count))\n : this.labels.indicatorsBtn;\n }\n\n // ── Private helpers ───────────────────────────────────────────────────────\n\n private addBtnHover(btn: HTMLButtonElement): void {\n btn.addEventListener('mouseenter', () => {\n if (btn.dataset.active !== 'true') btn.style.background = this.theme.ui.accentBg;\n });\n btn.addEventListener('mouseleave', () => {\n if (btn.dataset.active !== 'true') btn.style.background = 'transparent';\n });\n }\n\n private applyBarStyles(theme: ChartTheme): void {\n Object.assign(this.el.style, {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n height: this.cfg.height,\n padding: '0 10px',\n background: theme.background,\n borderBottom: `1px solid ${theme.axisBorder}`,\n boxSizing: 'border-box',\n flexShrink: '0',\n });\n }\n\n private makeDropBtn(label: string, theme: ChartTheme, active: boolean): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.textContent = label;\n this.applyDropBtnStyles(btn, theme, active);\n return btn;\n }\n\n private applyDropBtnStyles(btn: HTMLButtonElement, theme: ChartTheme, active: boolean): void {\n btn.dataset.active = String(active);\n Object.assign(btn.style, {\n background: active ? theme.ui.accentBg : 'transparent',\n color: active ? theme.ui.accentText : theme.topBar.btnColor,\n border: `1px solid ${active ? theme.ui.accent : theme.axisBorder}`,\n borderRadius: '5px',\n padding: '3px 8px',\n height: '24px',\n fontSize: this.cfg.dropBtnFontSize,\n fontFamily: this.cfg.dropBtnFontFamily,\n cursor: 'pointer',\n outline: 'none',\n whiteSpace: 'nowrap',\n transition: 'border-color 0.12s, background 0.12s',\n });\n }\n\n private applyDurationBtnStyles(btn: HTMLButtonElement, theme: ChartTheme, active: boolean): void {\n btn.dataset.active = String(active);\n Object.assign(btn.style, {\n background: active ? theme.bottomBar.activeBtnBg : 'transparent',\n color: active ? theme.bottomBar.activeBtnText : theme.bottomBar.btnColor,\n border: `1px solid ${active ? theme.bottomBar.activeBtnBorder : 'transparent'}`,\n borderRadius: '4px',\n padding: '2px 7px',\n fontSize: this.cfg.dropBtnFontSize,\n fontFamily: this.cfg.dropBtnFontFamily,\n cursor: 'pointer',\n outline: 'none',\n transition: 'background 0.15s, color 0.15s',\n whiteSpace: 'nowrap',\n });\n }\n\n private applyIconBtnStyles(btn: HTMLButtonElement, theme: ChartTheme, active: boolean): void {\n btn.dataset.active = String(active);\n Object.assign(btn.style, {\n background: active ? theme.ui.accentBg : 'transparent',\n color: active ? theme.ui.accentText : theme.topBar.btnColor,\n border: `1px solid ${active ? theme.ui.accent : theme.axisBorder}`,\n borderRadius: '5px',\n width: '26px',\n height: '26px',\n cursor: 'pointer',\n outline: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0',\n flexShrink: '0',\n transition: 'border-color 0.12s, background 0.12s',\n });\n }\n}\n","import type { Duration, Timeframe } from '../core/types.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_BOTTOM_BAR_CONFIG, type BottomBarUiConfig } from '../core/uiConfig.js';\nimport { DEFAULT_LABELS, type BottomBarLabels } from '../core/labels.js';\n\nexport const DURATION_TIMEFRAME_MAP: Record<Duration, Timeframe> = {\n '1D': '5m',\n '5D': '15m',\n '1M': '30m',\n '3M': '30m',\n '6M': '1D',\n '1Y': '1D',\n '5Y': '1W',\n All: '1M',\n};\n\nconst DURATIONS: Duration[] = ['1D', '5D', '1M', '3M', '6M', '1Y', '5Y', 'All'];\n\nexport class BottomBar {\n readonly el: HTMLDivElement;\n private buttons = new Map<Duration, HTMLButtonElement>();\n private activeDuration: Duration | null;\n private theme: ChartTheme;\n private cfg: BottomBarUiConfig;\n private labels: BottomBarLabels;\n private map: Record<Duration, Timeframe>;\n\n constructor(\n private onDurationChange: (d: Duration, tf: Timeframe) => void,\n initialDuration: Duration | null,\n theme: ChartTheme,\n customMap?: Partial<Record<Duration, Timeframe>>,\n cfg: BottomBarUiConfig = DEFAULT_BOTTOM_BAR_CONFIG,\n labels: BottomBarLabels = DEFAULT_LABELS.bottomBar\n ) {\n this.activeDuration = initialDuration;\n this.theme = theme;\n this.cfg = cfg;\n this.labels = labels;\n this.map = { ...DURATION_TIMEFRAME_MAP, ...customMap };\n\n this.el = document.createElement('div');\n this.applyBarStyles(theme);\n\n for (const d of DURATIONS) {\n const btn = document.createElement('button');\n btn.textContent = this.labels.durations[d] ?? d;\n this.applyButtonStyles(btn, theme, d === initialDuration);\n btn.addEventListener('click', () => {\n this.setActive(d);\n this.onDurationChange(d, this.map[d]);\n });\n this.buttons.set(d, btn);\n this.el.appendChild(btn);\n }\n }\n\n setTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.applyBarStyles(theme);\n for (const [d, btn] of this.buttons) {\n this.applyButtonStyles(\n btn,\n theme,\n this.activeDuration !== null && d === this.activeDuration\n );\n }\n }\n\n setActive(d: Duration | null | undefined): void {\n if (this.activeDuration === (d ?? null)) return;\n if (this.activeDuration) {\n const prev = this.buttons.get(this.activeDuration);\n if (prev) this.applyButtonStyles(prev, this.theme, false);\n }\n this.activeDuration = d ?? null;\n if (d) {\n const next = this.buttons.get(d);\n if (next) this.applyButtonStyles(next, this.theme, true);\n }\n }\n\n // ── Private helpers ───────────────────────────────────────────────────────\n\n private applyBarStyles(theme: ChartTheme): void {\n Object.assign(this.el.style, {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: '2px',\n height: this.cfg.height,\n padding: '0 10px',\n background: theme.background,\n borderTop: `1px solid ${theme.axisBorder}`,\n boxSizing: 'border-box',\n flexShrink: '0',\n });\n }\n\n private applyButtonStyles(btn: HTMLButtonElement, theme: ChartTheme, active: boolean): void {\n Object.assign(btn.style, {\n background: active ? theme.bottomBar.activeBtnBg : 'transparent',\n color: active ? theme.bottomBar.activeBtnText : theme.bottomBar.btnColor,\n border: `1px solid ${active ? theme.bottomBar.activeBtnBorder : 'transparent'}`,\n borderRadius: '3px',\n padding: '2px 7px',\n fontSize: this.cfg.btnFontSize,\n fontFamily: this.cfg.btnFontFamily,\n cursor: 'pointer',\n outline: 'none',\n transition: 'background 0.15s',\n });\n }\n}\n","import type { DrawingToolType } from '../core/types.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_DRAWING_TOOLBAR_CONFIG, type DrawingToolbarUiConfig } from '../core/uiConfig.js';\nimport { DEFAULT_LABELS, type DrawingToolbarLabels } from '../core/labels.js';\nimport { ICON_CAT, ICON_ACTION, ICON_ACTION_TOGGLED, ICON_TOOL, ICON_CHEVRON_UP, ICON_CHEVRON_DOWN, ICON_MORE_ACTIONS } from './icons.js';\n\n// ── Data ──────────────────────────────────────────────────────────────────────\n\nconst IMPLEMENTED: Record<string, DrawingToolType> = {\n // Trend Lines & Channels\n horizontal_line: 'horizontalLine',\n vertical_line: 'verticalLine',\n trend_line: 'trendLine',\n trend_angle: 'trendAngle',\n cross_line: 'crossLine',\n parallel_channel: 'parallelChannel',\n disjoint_channel: 'disjointChannel',\n flat_channel: 'flatChannel',\n // Fibonacci & Gann\n fib_retracement: 'fibRetracement',\n fib_extension: 'fibExtension',\n fib_channel: 'fibChannel',\n fib_timezone: 'fibTimezone',\n fib_circles: 'fibCircles',\n fib_spiral: 'fibSpiral',\n fib_fan: 'fibFan',\n gann_fan: 'gannFan',\n gann_square: 'gannSquare',\n gann_box: 'gannBox',\n // Geometric Shapes\n rectangle: 'rectangle',\n rotated_rectangle: 'rotatedRectangle',\n ellipse: 'ellipse',\n triangle: 'triangle',\n circle: 'circle',\n arc: 'arc',\n polyline: 'polyline',\n path: 'path',\n // Measurement\n price_range: 'priceRange',\n date_range: 'dateRange',\n date_price_range: 'datePriceRange',\n ruler: 'ruler',\n // Pitchfork\n pitchfork: 'pitchfork',\n schiff_pitchfork: 'schiffPitchfork',\n modified_schiff: 'modifiedSchiff',\n inside_pitchfork: 'insidePitchfork',\n // Volume & Statistical\n fixed_range_vp: 'fixedRangeVP',\n anchored_vp: 'anchoredVP',\n volume_profile: 'volumeProfile',\n regression_trend: 'regressionTrend',\n // Annotations\n text: 'text',\n callout: 'callout',\n price_label: 'priceLabel',\n arrow_marker: 'arrowMarker',\n flag: 'flag',\n price_note: 'priceNote',\n anchored_note: 'anchoredNote',\n arrow_up: 'arrowUp',\n arrow_down: 'arrowDown',\n // Pattern Recognition\n head_shoulders: 'headShoulders',\n triangle_pattern: 'trianglePattern',\n three_drives: 'threeDrives',\n abcd_pattern: 'abcdPattern',\n cypher_pattern: 'cypherPattern',\n butterfly_pattern: 'butterflyPattern',\n bat_pattern: 'batPattern',\n gartley_pattern: 'gartleyPattern',\n crab_pattern: 'crabPattern',\n shark_pattern: 'sharkPattern',\n // Elliott Wave\n elliott_impulse: 'elliottImpulse',\n elliott_corrective: 'elliottCorrective',\n elliott_triangle: 'elliottTriangle',\n elliott_combination: 'elliottCombination',\n elliott_wxy: 'elliottWxy',\n // Brush & Highlighter\n brush: 'brush',\n highlighter: 'highlighter',\n // Advanced\n ghost_feed: 'ghostFeed',\n projection: 'projection',\n sine_line: 'sineLine',\n cyclic_lines: 'cyclicLines',\n time_cycles: 'timeCycles',\n // Price Projections\n fib_projection: 'fibProjection',\n price_projection: 'priceProjection',\n};\n\ninterface Tool { id: string; name: string; icon: string; shortcut?: string; }\ninterface Category { id: string; name: string; icon: string; tools: Tool[]; }\n\nconst CATEGORIES: Category[] = [\n {\n id: 'trend_lines', name: 'Trend Lines & Channels', icon: '↗',\n tools: [\n { id: 'trend_line', name: 'Trend Line', icon: '↗', shortcut: 'Alt+T' },\n { id: 'trend_angle', name: 'Trend Angle', icon: '∠' },\n { id: 'horizontal_line', name: 'Horizontal Line', icon: '—', shortcut: 'Alt+H' },\n { id: 'vertical_line', name: 'Vertical Line', icon: '⏐', shortcut: 'Alt+V' },\n { id: 'cross_line', name: 'Cross Line', icon: '✚' },\n { id: 'parallel_channel', name: 'Parallel Channel', icon: '⫿' },\n { id: 'disjoint_channel', name: 'Disjoint Channel', icon: '≠' },\n { id: 'flat_channel', name: 'Flat Top/Bottom Channel', icon: '⊓' },\n ],\n },\n {\n id: 'fibonacci_gann', name: 'Fibonacci & Gann Tools', icon: 'φ',\n tools: [\n { id: 'fib_retracement', name: 'Fibonacci Retracement', icon: 'φ', shortcut: 'Alt+F' },\n { id: 'fib_extension', name: 'Fibonacci Extension', icon: 'φ' },\n { id: 'fib_channel', name: 'Fibonacci Channel', icon: 'φ' },\n { id: 'fib_timezone', name: 'Fibonacci Timezone', icon: 'φ' },\n { id: 'fib_circles', name: 'Fibonacci Circles', icon: '⊙' },\n { id: 'fib_spiral', name: 'Fibonacci Spiral', icon: '@' },\n { id: 'fib_fan', name: 'Fibonacci Speed Resistance Fan', icon: '⌇' },\n { id: 'gann_fan', name: 'Gann Fan', icon: '⌇' },\n { id: 'gann_square', name: 'Gann Square', icon: '⊞' },\n { id: 'gann_box', name: 'Gann Box', icon: '⊡' },\n ],\n },\n {\n id: 'geometric_shapes', name: 'Geometric Shapes', icon: '▭',\n tools: [\n { id: 'rectangle', name: 'Rectangle', icon: '▭' },\n { id: 'rotated_rectangle', name: 'Rotated Rectangle', icon: '◇' },\n { id: 'ellipse', name: 'Ellipse', icon: '⬭' },\n { id: 'triangle', name: 'Triangle', icon: '△' },\n { id: 'circle', name: 'Circle', icon: '○' },\n { id: 'arc', name: 'Arc', icon: '⌒' },\n { id: 'polyline', name: 'Polyline', icon: '⚡' },\n { id: 'path', name: 'Path', icon: '〰' },\n ],\n },\n {\n id: 'measurement_tools', name: 'Measurement Tools', icon: '⇕',\n tools: [\n { id: 'price_range', name: 'Price Range', icon: '⇕' },\n { id: 'date_range', name: 'Date Range', icon: '⇔' },\n { id: 'date_price_range', name: 'Date & Price Range', icon: '⊞' },\n { id: 'ruler', name: 'Ruler', icon: '⊢' },\n ],\n },\n {\n id: 'pitchfork_tools', name: 'Pitchfork Tools', icon: '⑁',\n tools: [\n { id: 'pitchfork', name: 'Pitchfork', icon: '⑁' },\n { id: 'schiff_pitchfork', name: 'Schiff Pitchfork', icon: '⑁' },\n { id: 'modified_schiff', name: 'Modified Schiff Pitchfork', icon: '⑁' },\n { id: 'inside_pitchfork', name: 'Inside Pitchfork', icon: '⑁' },\n ],\n },\n {\n id: 'volume_statistics', name: 'Volume & Statistical Tools', icon: '▤',\n tools: [\n { id: 'fixed_range_vp', name: 'Fixed Range Volume Profile', icon: '▤' },\n { id: 'anchored_vp', name: 'Anchored Volume Profile', icon: '▤' },\n { id: 'volume_profile', name: 'Volume Profile', icon: '▤' },\n { id: 'regression_trend', name: 'Regression Trend', icon: '↗' },\n ],\n },\n {\n id: 'annotation_tools', name: 'Annotation Tools', icon: 'A',\n tools: [\n { id: 'text', name: 'Text', icon: 'A' },\n { id: 'callout', name: 'Callout', icon: '⬕' },\n { id: 'price_label', name: 'Price Label', icon: '$' },\n { id: 'arrow_marker', name: 'Arrow Marker', icon: '→' },\n { id: 'flag', name: 'Flag', icon: '⚑' },\n { id: 'price_note', name: 'Price Note', icon: '≡' },\n { id: 'anchored_note', name: 'Anchored Note', icon: '⊕' },\n { id: 'arrow_up', name: 'Arrow Up', icon: '↑' },\n { id: 'arrow_down', name: 'Arrow Down', icon: '↓' },\n ],\n },\n {\n id: 'pattern_recognition', name: 'Pattern Recognition', icon: '◬',\n tools: [\n { id: 'head_shoulders', name: 'Head & Shoulders', icon: '⌢' },\n { id: 'triangle_pattern', name: 'Triangle Pattern', icon: '◬' },\n { id: 'three_drives', name: '3 Drives Pattern', icon: '⋎' },\n { id: 'abcd_pattern', name: 'ABCD Pattern', icon: '⊿' },\n { id: 'cypher_pattern', name: 'Cypher Pattern', icon: 'C' },\n { id: 'butterfly_pattern', name: 'Butterfly Pattern', icon: '⋈' },\n { id: 'bat_pattern', name: 'Bat Pattern', icon: '⌓' },\n { id: 'gartley_pattern', name: 'Gartley Pattern', icon: 'G' },\n { id: 'crab_pattern', name: 'Crab Pattern', icon: '⊓' },\n { id: 'shark_pattern', name: 'Shark Pattern', icon: '⊳' },\n ],\n },\n {\n id: 'elliott_wave', name: 'Elliott Wave Tools', icon: '∿',\n tools: [\n { id: 'elliott_impulse', name: 'Elliott Impulse (12345)', icon: '∿' },\n { id: 'elliott_corrective', name: 'Elliott Corrective (ABC)', icon: '∿' },\n { id: 'elliott_triangle', name: 'Elliott Wave Triangle', icon: '△' },\n { id: 'elliott_combination', name: 'Elliott Wave Combination', icon: '∿' },\n { id: 'elliott_wxy', name: 'Elliott Double Three (WXY)', icon: '∿' },\n ],\n },\n {\n id: 'brush_highlighter', name: 'Brush & Highlighter', icon: '∫',\n tools: [\n { id: 'brush', name: 'Brush', icon: '∫' },\n { id: 'highlighter', name: 'Highlighter', icon: '▬' },\n ],\n },\n {\n id: 'advanced_tools', name: 'Advanced Tools', icon: '⊛',\n tools: [\n { id: 'ghost_feed', name: 'Ghost Feed', icon: '◑' },\n { id: 'projection', name: 'Projection', icon: '→' },\n { id: 'sine_line', name: 'Sine Line', icon: '∿' },\n { id: 'cyclic_lines', name: 'Cyclic Lines', icon: '⟳' },\n { id: 'time_cycles', name: 'Time Cycles', icon: '⊙' },\n ],\n },\n {\n id: 'price_projections', name: 'Price Projection Tools', icon: '⊿',\n tools: [\n { id: 'fib_projection', name: 'Fibonacci Projection', icon: 'φ' },\n { id: 'price_projection', name: 'Price Projection', icon: '⊿' },\n ],\n },\n];\n\nconst ACTIONS = [\n { id: 'undo', icon: '↶', title: 'Undo (Ctrl+Z)' },\n { id: 'redo', icon: '↷', title: 'Redo (Ctrl+Y)' },\n { id: 'delete_selected', icon: '✕', title: 'Delete Selected (Del)' },\n { id: 'clear_all', icon: '⊡', title: 'Clear All' },\n { id: 'toggle_visibility', icon: '◌', title: 'Hide All' },\n { id: 'toggle_lock', icon: '⊠', title: 'Lock All' },\n];\n\n// ── Class ─────────────────────────────────────────────────────────────────────\n\nexport class LeftBar {\n readonly el: HTMLDivElement;\n private flyout: HTMLDivElement;\n private activeTool: DrawingToolType | null = null;\n private openCategoryId: string | null = null;\n private openActionsMenu = false;\n private theme: ChartTheme;\n private cfg: DrawingToolbarUiConfig;\n private labels: DrawingToolbarLabels;\n private catButtons = new Map<string, HTMLButtonElement>();\n private docClickHandler: (e: MouseEvent) => void;\n private drawingsHidden = false;\n private drawingsLocked = false;\n private toolsArea!: HTMLDivElement;\n private scrollUpBtn!: HTMLButtonElement;\n private scrollDownBtn!: HTMLButtonElement;\n private mobileMode = false;\n private topSection!: HTMLDivElement;\n private toolsGrid!: HTMLDivElement;\n private settingsVisible = true;\n\n constructor(\n private onToolChange: (tool: DrawingToolType | null) => void,\n private onAction: (actionId: string) => void,\n private onMobileClose: (() => void) | null,\n theme: ChartTheme,\n cfg: DrawingToolbarUiConfig = DEFAULT_DRAWING_TOOLBAR_CONFIG,\n labels: DrawingToolbarLabels = DEFAULT_LABELS.drawingToolbar,\n ) {\n this.theme = theme;\n this.cfg = cfg;\n this.labels = labels;\n this.el = document.createElement('div');\n this.flyout = document.createElement('div');\n\n this.applyBarStyles();\n this.applyWidth();\n this.buildToolbar();\n this.buildFlyout();\n\n document.body.appendChild(this.flyout);\n\n this.docClickHandler = (e: MouseEvent) => {\n if (\n !this.el.contains(e.target as Node) &&\n !this.flyout.contains(e.target as Node)\n ) {\n this.closeFlyout();\n }\n };\n document.addEventListener('click', this.docClickHandler, true);\n }\n\n // ── Public API ────────────────────────────────────────────────────────────\n\n setTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.closeFlyout();\n this.applyBarStyles();\n this.applyWidth();\n this.buildFlyout();\n this.applyScrollBtnStyles(this.scrollUpBtn, 'up');\n this.applyScrollBtnStyles(this.scrollDownBtn, 'down');\n\n // Rebuild action buttons so they pick up the new theme colors\n this.topSection.innerHTML = '';\n // Single-column layout for both desktop and mobile: always use the\n // collapsed \"more actions\" flyout button instead of the desktop grid.\n this.topSection.appendChild(this.buildMobileActionsBtn());\n\n for (const [catId, btn] of this.catButtons) {\n const isActive = this.activeTool !== null &&\n CATEGORIES.find(c => c.id === catId)\n ?.tools.some(t => IMPLEMENTED[t.id] === this.activeTool) === true;\n this.applyCatBtnStyles(btn, isActive);\n }\n }\n\n setActiveTool(tool: DrawingToolType | null): void {\n if (this.activeTool !== null) {\n const prev = CATEGORIES.find(c => c.tools.some(t => IMPLEMENTED[t.id] === this.activeTool));\n if (prev) this.applyCatBtnStyles(this.catButtons.get(prev.id)!, false);\n }\n this.activeTool = tool;\n if (tool !== null) {\n const next = CATEGORIES.find(c => c.tools.some(t => IMPLEMENTED[t.id] === tool));\n if (next) this.applyCatBtnStyles(this.catButtons.get(next.id)!, true);\n }\n }\n\n setVisible(visible: boolean): void {\n this.settingsVisible = visible;\n this.applyWidth();\n }\n\n /**\n * Switch between desktop (2-column) and mobile (1-column + overlay) layouts.\n * Called automatically by ChartEngine when the container crosses the\n * `mobileBreakpoint` threshold.\n */\n setMobileMode(enabled: boolean): void {\n if (this.mobileMode === enabled) return;\n this.mobileMode = enabled;\n this.closeFlyout();\n\n // Rebuild actions section\n this.topSection.innerHTML = '';\n // Single-column layout for both desktop and mobile: always use the\n // collapsed \"more actions\" flyout button instead of the desktop grid.\n this.topSection.appendChild(this.buildMobileActionsBtn());\n\n // Rebuild category grid with new column count\n this.catButtons.clear();\n const newGrid = this.makeGrid();\n this.populateCategoryGrid(newGrid);\n this.toolsGrid.replaceWith(newGrid);\n this.toolsGrid = newGrid;\n // Reapply active tool highlight on new buttons\n if (this.activeTool !== null) {\n const activeCat = CATEGORIES.find(c => c.tools.some(t => IMPLEMENTED[t.id] === this.activeTool));\n if (activeCat) {\n const catBtn = this.catButtons.get(activeCat.id);\n if (catBtn) this.applyCatBtnStyles(catBtn, true);\n }\n }\n\n if (enabled) {\n // Mobile: overlay mode — float above the canvas, hidden by default\n Object.assign(this.el.style, {\n position: 'absolute',\n left: '0',\n top: '0',\n height: '100%',\n zIndex: '50',\n });\n this.settingsVisible = false;\n } else {\n // Desktop: normal flex item\n Object.assign(this.el.style, {\n position: '',\n left: '',\n top: '',\n height: '',\n zIndex: '',\n });\n this.settingsVisible = true;\n }\n\n // Update bar width\n this.applyBarStyles();\n this.applyWidth();\n\n requestAnimationFrame(() => this.updateScrollIndicators());\n }\n\n reparentFlyout(root: HTMLElement): void {\n if (this.flyout.parentElement !== root) root.appendChild(this.flyout);\n }\n\n destroy(): void {\n this.flyout.remove();\n document.removeEventListener('click', this.docClickHandler, true);\n }\n\n // ── Private – layout builders ─────────────────────────────────────────────\n\n private get barWidth(): number {\n return this.cfg.barPadding * 2 + this.cfg.iconBtnSize;\n }\n\n private applyBarStyles(): void {\n Object.assign(this.el.style, {\n display: 'flex',\n flexDirection: 'column',\n flexShrink: '0',\n position: 'relative',\n height: '100%',\n background: this.theme.background,\n borderRight: `1px solid ${this.theme.axisBorder}`,\n boxSizing: 'border-box',\n userSelect: 'none',\n fontFamily: this.cfg.flyoutLabelFontFamily,\n overflow: 'hidden',\n transition: 'width 0.2s ease',\n });\n }\n\n private applyWidth(): void {\n if (!this.settingsVisible) {\n this.el.style.width = '0';\n } else {\n this.el.style.width = `${this.barWidth}px`;\n }\n }\n\n private buildToolbar(): void {\n // ── Actions at top ────────────────────────────────────────────────────\n this.topSection = document.createElement('div');\n Object.assign(this.topSection.style, {\n borderBottom: `1px solid ${this.theme.axisBorder}`,\n padding: `10px ${this.cfg.barPadding}px 10px`,\n boxSizing: 'border-box',\n flexShrink: '0',\n });\n // Single-column layout for both desktop and mobile: always use the\n // collapsed \"more actions\" flyout button instead of the desktop grid.\n this.topSection.appendChild(this.buildMobileActionsBtn());\n this.el.appendChild(this.topSection);\n\n // ── Scroll-up indicator ───────────────────────────────────────────────\n this.scrollUpBtn = document.createElement('button');\n this.applyScrollBtnStyles(this.scrollUpBtn, 'up');\n this.scrollUpBtn.addEventListener('click', () => {\n this.toolsArea.scrollBy({\n top: -(this.cfg.iconBtnSize + this.cfg.btnGap) * 3,\n behavior: 'smooth',\n });\n });\n this.el.appendChild(this.scrollUpBtn);\n\n // ── Scrollable tools area ─────────────────────────────────────────────\n this.toolsArea = document.createElement('div');\n Object.assign(this.toolsArea.style, {\n flex: '1',\n overflowY: 'scroll',\n padding: `10px ${this.cfg.barPadding}px 4px`,\n boxSizing: 'border-box',\n scrollbarWidth: 'none',\n msOverflowStyle: 'none',\n });\n const styleTag = document.createElement('style');\n styleTag.textContent = '.lb-tools::-webkit-scrollbar{display:none}';\n document.head.appendChild(styleTag);\n this.toolsArea.classList.add('lb-tools');\n\n this.toolsGrid = this.makeGrid();\n this.populateCategoryGrid(this.toolsGrid);\n this.toolsArea.appendChild(this.toolsGrid);\n\n this.toolsArea.addEventListener('scroll', () => this.updateScrollIndicators());\n this.el.appendChild(this.toolsArea);\n\n // ── Scroll-down indicator ─────────────────────────────────────────────\n this.scrollDownBtn = document.createElement('button');\n this.applyScrollBtnStyles(this.scrollDownBtn, 'down');\n this.scrollDownBtn.addEventListener('click', () => {\n this.toolsArea.scrollBy({\n top: (this.cfg.iconBtnSize + this.cfg.btnGap) * 3,\n behavior: 'smooth',\n });\n });\n this.el.appendChild(this.scrollDownBtn);\n\n requestAnimationFrame(() => this.updateScrollIndicators());\n }\n\n private buildMobileActionsBtn(): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.title = this.labels.actions.moreActions;\n btn.innerHTML = ICON_MORE_ACTIONS;\n this.applyActionBtnStyles(btn, false);\n this.addBtnHover(btn);\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleActionsFlyout(btn);\n });\n return btn;\n }\n\n private populateCategoryGrid(grid: HTMLDivElement): void {\n this.catButtons.clear();\n for (const cat of CATEGORIES) {\n const btn = document.createElement('button');\n btn.title = this.getCategoryLabel(cat.id);\n btn.innerHTML = ICON_CAT[cat.id] ?? cat.icon;\n this.applyCatBtnStyles(btn, false);\n this.addBtnHover(btn);\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleCategory(cat, btn);\n });\n this.catButtons.set(cat.id, btn);\n grid.appendChild(btn);\n }\n }\n\n private updateScrollIndicators(): void {\n const { scrollTop, scrollHeight, clientHeight } = this.toolsArea;\n const canScrollUp = scrollTop > 2;\n const canScrollDown = scrollTop + clientHeight < scrollHeight - 2;\n if (this.mobileMode) {\n // Always visible in mobile; opacity indicates whether scrolling is possible\n this.scrollUpBtn.style.display = 'flex';\n this.scrollDownBtn.style.display = 'flex';\n this.scrollUpBtn.style.opacity = canScrollUp ? '0.9' : '0.2';\n this.scrollDownBtn.style.opacity = canScrollDown ? '0.9' : '0.2';\n } else {\n this.scrollUpBtn.style.display = canScrollUp ? 'flex' : 'none';\n this.scrollDownBtn.style.display = canScrollDown ? 'flex' : 'none';\n }\n }\n\n private buildFlyout(): void {\n Object.assign(this.flyout.style, {\n position: 'fixed',\n zIndex: '9999',\n display: 'none',\n background: this.theme.background,\n border: `1px solid ${this.theme.axisBorder}`,\n borderRadius: '6px',\n padding: '6px 0',\n minWidth: '200px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.45)',\n fontFamily: this.cfg.flyoutLabelFontFamily,\n fontSize: this.cfg.flyoutLabelFontSize,\n });\n }\n\n private makeGrid(cols = 1): HTMLDivElement {\n const g = document.createElement('div');\n Object.assign(g.style, {\n display: 'grid',\n gridTemplateColumns: `repeat(${cols}, ${this.cfg.iconBtnSize}px)`,\n gap: `${this.cfg.btnGap}px`,\n });\n return g;\n }\n\n private applyScrollBtnStyles(btn: HTMLButtonElement, dir: 'up' | 'down'): void {\n btn.innerHTML = dir === 'up' ? ICON_CHEVRON_UP : ICON_CHEVRON_DOWN;\n btn.title = dir === 'up' ? this.labels.scrollUp : this.labels.scrollDown;\n const display = btn.style.display || 'none';\n Object.assign(btn.style, {\n display,\n width: '100%',\n height: `${this.cfg.scrollBtnHeight}px`,\n background: this.theme.background,\n color: this.theme.tooltip.text,\n border: 'none',\n borderBottom: dir === 'up' ? `1px solid ${this.theme.axisBorder}` : 'none',\n borderTop: dir === 'down' ? `1px solid ${this.theme.axisBorder}` : 'none',\n fontSize: this.cfg.scrollBtnFontSize,\n cursor: 'pointer',\n outline: 'none',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: '0',\n opacity: '0.6',\n });\n }\n\n // ── Private – category flyout ─────────────────────────────────────────────\n\n private toggleCategory(cat: Category, anchorBtn: HTMLButtonElement): void {\n if (this.openCategoryId === cat.id) {\n this.closeFlyout();\n return;\n }\n this.openCategoryId = cat.id;\n\n const rect = anchorBtn.getBoundingClientRect();\n Object.assign(this.flyout.style, {\n display: 'block',\n left: `${rect.right + 4}px`,\n top: `${rect.top}px`,\n });\n\n this.flyout.innerHTML = '';\n\n // Header\n const header = document.createElement('div');\n Object.assign(header.style, {\n padding: '4px 12px 8px',\n fontSize: this.cfg.flyoutHeadingFontSize,\n fontWeight: '600',\n letterSpacing: this.cfg.flyoutHeadingLetterSpacing,\n color: this.theme.drawingToolbar.flyoutHeadingColor,\n textTransform: 'uppercase',\n borderBottom: `1px solid ${this.theme.axisBorder}`,\n marginBottom: '4px',\n opacity: '0.6',\n });\n header.textContent = this.getCategoryLabel(cat.id);\n this.flyout.appendChild(header);\n\n // Tool rows\n for (const tool of cat.tools) {\n const isImpl = tool.id in IMPLEMENTED;\n const isActive = this.activeTool !== null && IMPLEMENTED[tool.id] === this.activeTool;\n const row = document.createElement('button');\n\n Object.assign(row.style, {\n width: '100%',\n padding: '5px 12px',\n background: isActive ? this.theme.ui.accentBg : 'transparent',\n border: 'none',\n borderLeft: isActive\n ? `2px solid ${this.theme.ui.accent}`\n : '2px solid transparent',\n color: isActive\n ? this.theme.ui.accentText\n : isImpl\n ? this.theme.drawingToolbar.flyoutLabelColor\n : this.theme.ui.disabledText,\n fontSize: this.cfg.flyoutLabelFontSize,\n fontFamily: this.cfg.flyoutLabelFontFamily,\n textAlign: 'left',\n cursor: isImpl ? 'pointer' : 'default',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n boxSizing: 'border-box',\n });\n\n const iconSpan = document.createElement('span');\n Object.assign(iconSpan.style, {\n width: '16px',\n display: 'flex',\n alignItems: 'center',\n flexShrink: '0',\n });\n iconSpan.innerHTML = ICON_TOOL[tool.id] ?? ICON_CAT[cat.id] ?? tool.icon;\n\n const nameSpan = document.createElement('span');\n nameSpan.style.flex = '1';\n nameSpan.textContent = this.getToolLabel(tool);\n\n row.appendChild(iconSpan);\n row.appendChild(nameSpan);\n\n if (tool.shortcut && isImpl) {\n const sc = document.createElement('span');\n Object.assign(sc.style, {\n fontSize: this.cfg.shortcutFontSize,\n color: this.theme.ui.disabledText,\n flexShrink: '0',\n });\n sc.textContent = tool.shortcut;\n row.appendChild(sc);\n } else if (!isImpl) {\n const soon = document.createElement('span');\n Object.assign(soon.style, {\n fontSize: this.cfg.soonBadgeFontSize,\n color: this.theme.ui.soonBadgeText,\n flexShrink: '0',\n });\n soon.textContent = this.labels.soonBadge;\n row.appendChild(soon);\n }\n\n if (isImpl) {\n if (!isActive) {\n const hoverBg = this.theme.ui.accentBg;\n row.addEventListener('mouseenter', () => { row.style.background = hoverBg; });\n row.addEventListener('mouseleave', () => { row.style.background = 'transparent'; });\n }\n row.addEventListener('click', () => {\n const drawingType = IMPLEMENTED[tool.id];\n const next = this.activeTool === drawingType ? null : drawingType;\n this.setActiveTool(next);\n this.onToolChange(next);\n this.closeFlyout();\n // On mobile, auto-close the bar after a tool is selected\n if (this.mobileMode && next !== null) {\n this.settingsVisible = false;\n this.applyWidth();\n this.onMobileClose?.();\n }\n });\n }\n\n this.flyout.appendChild(row);\n }\n\n requestAnimationFrame(() => {\n const flyRect = this.flyout.getBoundingClientRect();\n if (flyRect.bottom > window.innerHeight - 8) {\n this.flyout.style.top = `${window.innerHeight - flyRect.height - 8}px`;\n }\n });\n }\n\n private closeFlyout(): void {\n this.flyout.style.display = 'none';\n this.openCategoryId = null;\n this.openActionsMenu = false;\n }\n\n private toggleActionsFlyout(anchorBtn: HTMLButtonElement): void {\n if (this.openActionsMenu) {\n this.closeFlyout();\n return;\n }\n this.closeFlyout();\n this.openActionsMenu = true;\n\n this.flyout.innerHTML = '';\n\n // Header\n const header = document.createElement('div');\n Object.assign(header.style, {\n padding: '4px 12px 8px',\n fontSize: this.cfg.flyoutHeadingFontSize,\n fontWeight: '600',\n letterSpacing: this.cfg.flyoutHeadingLetterSpacing,\n color: this.theme.drawingToolbar.flyoutHeadingColor,\n textTransform: 'uppercase',\n borderBottom: `1px solid ${this.theme.axisBorder}`,\n marginBottom: '4px',\n opacity: '0.6',\n });\n header.textContent = this.labels.actions.moreActions;\n this.flyout.appendChild(header);\n\n for (const action of ACTIONS) {\n const isToggled = action.id === 'toggle_visibility' ? this.drawingsHidden\n : action.id === 'toggle_lock' ? this.drawingsLocked\n : false;\n\n const currentIcon = isToggled\n ? (ICON_ACTION_TOGGLED[action.id] ?? ICON_ACTION[action.id] ?? action.icon)\n : (ICON_ACTION[action.id] ?? action.icon);\n\n const label = action.id === 'toggle_visibility'\n ? (this.drawingsHidden ? this.labels.actions.showAll : this.labels.actions.hideAll)\n : action.id === 'toggle_lock'\n ? (this.drawingsLocked ? this.labels.actions.unlockAll : this.labels.actions.lockAll)\n : this.getActionLabel(action.id);\n\n const row = document.createElement('button');\n Object.assign(row.style, {\n width: '100%',\n padding: '6px 12px',\n background: isToggled ? this.theme.ui.accentBg : 'transparent',\n border: 'none',\n borderLeft: isToggled\n ? `2px solid ${this.theme.ui.accent}`\n : '2px solid transparent',\n color: isToggled\n ? this.theme.ui.accentText\n : this.theme.drawingToolbar.flyoutLabelColor,\n fontSize: this.cfg.flyoutLabelFontSize,\n fontFamily: this.cfg.flyoutLabelFontFamily,\n textAlign: 'left',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n boxSizing: 'border-box',\n });\n\n const iconSpan = document.createElement('span');\n Object.assign(iconSpan.style, {\n width: '16px',\n display: 'flex',\n alignItems: 'center',\n flexShrink: '0',\n });\n iconSpan.innerHTML = currentIcon;\n\n const nameSpan = document.createElement('span');\n nameSpan.style.flex = '1';\n nameSpan.textContent = label;\n\n row.appendChild(iconSpan);\n row.appendChild(nameSpan);\n\n const hoverBg = this.theme.ui.accentBg;\n if (!isToggled) {\n row.addEventListener('mouseenter', () => { row.style.background = hoverBg; });\n row.addEventListener('mouseleave', () => { row.style.background = 'transparent'; });\n }\n\n row.addEventListener('click', () => {\n if (action.id === 'toggle_visibility') {\n this.drawingsHidden = !this.drawingsHidden;\n this.onAction(this.drawingsHidden ? 'hide_all' : 'show_all');\n } else if (action.id === 'toggle_lock') {\n this.drawingsLocked = !this.drawingsLocked;\n this.onAction(this.drawingsLocked ? 'lock_all' : 'unlock_all');\n } else {\n this.onAction(action.id);\n }\n this.closeFlyout();\n });\n\n this.flyout.appendChild(row);\n }\n\n const rect = anchorBtn.getBoundingClientRect();\n const elRect = this.el.getBoundingClientRect();\n Object.assign(this.flyout.style, {\n display: 'block',\n left: `${elRect.right + 4}px`,\n top: `${rect.top}px`,\n });\n\n requestAnimationFrame(() => {\n const flyRect = this.flyout.getBoundingClientRect();\n if (flyRect.bottom > window.innerHeight - 8) {\n this.flyout.style.top = `${window.innerHeight - flyRect.height - 8}px`;\n }\n });\n }\n\n // ── Private – label helpers ───────────────────────────────────────────────\n\n private getCategoryLabel(catId: string): string {\n const map: Record<string, keyof DrawingToolbarLabels['categories']> = {\n trend_lines: 'trendLines',\n fibonacci_gann: 'fibonacci',\n geometric_shapes: 'shapes',\n measurement_tools: 'measurements',\n pitchfork_tools: 'pitchforks',\n volume_statistics: 'volume',\n annotation_tools: 'annotations',\n pattern_recognition: 'patterns',\n elliott_wave: 'elliott',\n brush_highlighter: 'brushes',\n advanced_tools: 'advanced',\n price_projections: 'priceProjection',\n };\n const key = map[catId];\n return key ? this.labels.categories[key] : catId;\n }\n\n private getToolLabel(tool: Tool): string {\n const drawingType = IMPLEMENTED[tool.id];\n if (drawingType && this.labels.tools[drawingType]) {\n return this.labels.tools[drawingType];\n }\n return tool.name;\n }\n\n private getActionLabel(actionId: string): string {\n const map: Record<string, keyof DrawingToolbarLabels['actions']> = {\n undo: 'undo',\n redo: 'redo',\n delete_selected: 'deleteSelected',\n clear_all: 'clearAll',\n toggle_visibility: 'hideAll',\n toggle_lock: 'lockAll',\n };\n const key = map[actionId];\n return key ? this.labels.actions[key] : actionId;\n }\n\n // ── Private – styling helpers ─────────────────────────────────────────────\n\n private addBtnHover(btn: HTMLButtonElement): void {\n btn.addEventListener('mouseenter', () => {\n if (btn.dataset.active !== 'true') btn.style.background = this.theme.ui.accentBg;\n });\n btn.addEventListener('mouseleave', () => {\n if (btn.dataset.active !== 'true') btn.style.background = 'transparent';\n });\n }\n\n private applyCatBtnStyles(btn: HTMLButtonElement, active: boolean): void {\n btn.dataset.active = String(active);\n Object.assign(btn.style, {\n width: `${this.cfg.iconBtnSize}px`,\n height: `${this.cfg.iconBtnSize}px`,\n background: active ? this.theme.ui.accentBgStrong : 'transparent',\n color: active\n ? this.theme.drawingToolbar.activeIconColor\n : this.theme.drawingToolbar.iconColor,\n border: `1px solid ${active ? this.theme.ui.accent : this.theme.axisBorder}`,\n borderRadius: '5px',\n cursor: 'pointer',\n outline: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0',\n });\n }\n\n private applyActionBtnStyles(btn: HTMLButtonElement, toggled: boolean): void {\n btn.dataset.active = String(toggled);\n Object.assign(btn.style, {\n width: `${this.cfg.iconBtnSize}px`,\n height: `${this.cfg.iconBtnSize}px`,\n background: toggled ? this.theme.ui.accentBg : 'transparent',\n color: toggled\n ? this.theme.drawingToolbar.activeIconColor\n : this.theme.drawingToolbar.iconColor,\n border: `1px solid ${toggled ? this.theme.ui.accent : this.theme.axisBorder}`,\n borderRadius: '5px',\n cursor: 'pointer',\n outline: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0',\n });\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6; // px\n\nexport class HorizontalLine implements IDrawing {\n readonly id: string;\n readonly type = 'horizontalLine' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(point: DrawingPoint) {\n this.id = `hl_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [point];\n this.complete = true; // single-click placement\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n _viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n pricePrecision = 2,\n ): void {\n const price = this.points[0].price;\n const y = scale.yToPixel(price, priceRange, chartH);\n\n ctx.save();\n ctx.strokeStyle = '#e8b84b';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n if (!isSelected) ctx.setLineDash([6, 3]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartW, y);\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Price label\n const label = price.toFixed(pricePrecision);\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n const tw = ctx.measureText(label).width;\n ctx.fillStyle = '#e8b84b';\n ctx.fillText(label, chartW - tw - 4, y - 3);\n ctx.restore();\n }\n\n hitTest(\n _x: number,\n y: number,\n scale: ScaleManager,\n _viewport: Viewport,\n priceRange: PriceRange,\n _chartW: number,\n chartH: number,\n ): boolean {\n const lineY = scale.yToPixel(this.points[0].price, priceRange, chartH);\n return Math.abs(y - lineY) <= HIT_TOLERANCE;\n }\n\n getHandle(): DrawingHandle | null {\n return null; // full-width line — no endpoint handles\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6; // px\n\nexport class VerticalLine implements IDrawing {\n readonly id: string;\n readonly type = 'verticalLine' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(point: DrawingPoint) {\n this.id = `vl_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [point];\n this.complete = true; // single-click placement\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n _priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n const x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n\n ctx.save();\n ctx.strokeStyle = '#e8b84b';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n if (!isSelected) ctx.setLineDash([6, 3]);\n ctx.beginPath();\n ctx.moveTo(x, 0);\n ctx.lineTo(x, chartH);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.restore();\n }\n\n hitTest(\n x: number,\n _y: number,\n scale: ScaleManager,\n viewport: Viewport,\n _priceRange: PriceRange,\n chartW: number,\n _chartH: number,\n ): boolean {\n const lineX = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n return Math.abs(x - lineX) <= HIT_TOLERANCE;\n }\n\n getHandle(): DrawingHandle | null {\n return null; // full-height line — no endpoint handles\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6; // px\n\n/** Distance from point (px, py) to line segment (x1,y1)-(x2,y2) */\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class TrendLine implements IDrawing {\n readonly id: string;\n readonly type = 'trendLine' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `tl_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }]; // second point tracks mouse until complete\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n ctx.save();\n ctx.strokeStyle = '#26c6da';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n // Anchor dots\n for (const [x, y] of [[x1, y1], [x2, y2]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(x, y, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = '#26c6da';\n ctx.fill();\n }\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n return pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class TrendAngle implements IDrawing {\n readonly id: string;\n readonly type = 'trendAngle' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `ta_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const angleDeg = Math.atan2(-(y2 - y1), x2 - x1) * 180 / Math.PI;\n const angleRad = Math.atan2(-(y2 - y1), x2 - x1);\n\n ctx.save();\n ctx.strokeStyle = '#26c6da';\n ctx.fillStyle = '#26c6da';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Main trend line\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n // Angle arc at p1\n const arcRadius = 28;\n ctx.beginPath();\n ctx.arc(x1, y1, arcRadius, -angleRad, 0, angleRad < 0);\n ctx.stroke();\n\n // Horizontal reference line from p1\n ctx.setLineDash([4, 3]);\n ctx.globalAlpha = 0.5;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x1 + arcRadius + 8, y1);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.globalAlpha = 1;\n\n // Angle label\n const labelX = x1 + arcRadius + 6;\n const labelY = y1 - (angleRad >= 0 ? 6 : -14);\n ctx.font = \"bold 11px 'Inter', system-ui, sans-serif\";\n ctx.fillText(`${angleDeg.toFixed(1)}°`, labelX, labelY);\n\n // Anchor dots\n if (isSelected) {\n for (const [ax, ay] of [[x1, y1], [x2, y2]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n return pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nexport class CrossLine implements IDrawing {\n readonly id: string;\n readonly type = 'crossLine' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(point: DrawingPoint) {\n this.id = `xl_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [point];\n this.complete = true;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n const p = this.points[0];\n const x = scale.xToPixel(p.barIndex, viewport, chartW);\n const y = scale.yToPixel(p.price, priceRange, chartH);\n\n ctx.save();\n ctx.strokeStyle = '#78909c';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n if (!isSelected) ctx.setLineDash([6, 3]);\n\n // Horizontal line across full width\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartW, y);\n ctx.stroke();\n\n // Vertical line at barIndex\n ctx.beginPath();\n ctx.moveTo(x, 0);\n ctx.lineTo(x, chartH);\n ctx.stroke();\n\n ctx.setLineDash([]);\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n const p = this.points[0];\n const lineX = scale.xToPixel(p.barIndex, viewport, chartW);\n const lineY = scale.yToPixel(p.price, priceRange, chartH);\n // Near horizontal line\n if (Math.abs(y - lineY) <= HIT_TOLERANCE) return true;\n // Near vertical line\n if (Math.abs(x - lineX) <= HIT_TOLERANCE) return true;\n return false;\n }\n\n getHandle(): DrawingHandle | null {\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class ParallelChannel implements IDrawing {\n readonly id: string;\n readonly type = 'parallelChannel' as const;\n readonly requiredPoints = 3;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `pch_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n // Offset based on p3 price vs midpoint of p1-p2\n let offsetY = 0;\n if (p3) {\n const midPrice = (p1.price + p2.price) / 2;\n const midPixelY = scale.yToPixel(midPrice, priceRange, chartH);\n const p3PixelY = scale.yToPixel(p3.price, priceRange, chartH);\n offsetY = p3PixelY - midPixelY;\n }\n\n const ox1 = x1, oy1 = y1 + offsetY;\n const ox2 = x2, oy2 = y2 + offsetY;\n\n ctx.save();\n ctx.strokeStyle = '#26c6da';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Fill between lines\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(ox2, oy2);\n ctx.lineTo(ox1, oy1);\n ctx.closePath();\n ctx.fillStyle = 'rgba(38, 198, 218, 0.08)';\n ctx.fill();\n\n // Main line p1 -> p2\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n // Parallel line\n if (p3) {\n ctx.beginPath();\n ctx.moveTo(ox1, oy1);\n ctx.lineTo(ox2, oy2);\n ctx.stroke();\n }\n\n // Anchor dots\n if (isSelected) {\n const anchorPts: [number, number][] = [[x1, y1], [x2, y2]];\n if (p3) {\n const p3x = scale.xToPixel(p3.barIndex, viewport, chartW);\n const p3y = scale.yToPixel(p3.price, priceRange, chartH);\n anchorPts.push([p3x, p3y]);\n }\n ctx.fillStyle = '#26c6da';\n for (const [ax, ay] of anchorPts) {\n ctx.beginPath();\n ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n if (pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE) return true;\n\n if (p3) {\n const midPrice = (p1.price + p2.price) / 2;\n const midPixelY = scale.yToPixel(midPrice, priceRange, chartH);\n const p3PixelY = scale.yToPixel(p3.price, priceRange, chartH);\n const offsetY = p3PixelY - midPixelY;\n if (pointToSegmentDist(x, y, x1, y1 + offsetY, x2, y2 + offsetY) <= HIT_TOLERANCE) return true;\n }\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n const candidates = this.points.map((p, i) => ({\n i,\n px: scale.xToPixel(p.barIndex, viewport, chartW),\n py: scale.yToPixel(p.price, priceRange, chartH),\n }));\n for (const { i, px, py } of candidates) {\n if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class FlatChannel implements IDrawing {\n readonly id: string;\n readonly type = 'flatChannel' as const;\n readonly requiredPoints = 3;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `fch_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2, p3] = this.points;\n\n // First line is horizontal at p1.price from p1.barIndex to p2.barIndex\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n\n // Second line is horizontal at (p1.price + priceOffset)\n const priceOffset = p3 ? p3.price - p1.price : 0;\n const y2 = scale.yToPixel(p1.price + priceOffset, priceRange, chartH);\n\n ctx.save();\n ctx.strokeStyle = '#ab47bc';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Fill between lines\n ctx.beginPath();\n ctx.rect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1));\n ctx.fillStyle = 'rgba(171, 71, 188, 0.08)';\n ctx.fill();\n\n // First horizontal line\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y1);\n ctx.stroke();\n\n // Second horizontal line (shown once p3 exists)\n if (p3) {\n ctx.beginPath();\n ctx.moveTo(x1, y2);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n }\n\n // Anchor dots\n if (isSelected) {\n ctx.fillStyle = '#ab47bc';\n const anchorPts: [number, number][] = [[x1, y1], [x2, y1]];\n if (p3) {\n const p3x = scale.xToPixel(p3.barIndex, viewport, chartW);\n const p3y = scale.yToPixel(p3.price, priceRange, chartH);\n anchorPts.push([p3x, p3y]);\n }\n for (const [ax, ay] of anchorPts) {\n ctx.beginPath();\n ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2, p3] = this.points;\n\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n\n if (pointToSegmentDist(x, y, x1, y1, x2, y1) <= HIT_TOLERANCE) return true;\n\n if (p3) {\n const priceOffset = p3.price - p1.price;\n const y2 = scale.yToPixel(p1.price + priceOffset, priceRange, chartH);\n if (pointToSegmentDist(x, y, x1, y2, x2, y2) <= HIT_TOLERANCE) return true;\n }\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n const candidates = this.points.map((p, i) => ({\n i,\n px: scale.xToPixel(p.barIndex, viewport, chartW),\n py: scale.yToPixel(p.price, priceRange, chartH),\n }));\n for (const { i, px, py } of candidates) {\n if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class DisjointChannel implements IDrawing {\n readonly id: string;\n readonly type = 'disjointChannel' as const;\n readonly requiredPoints = 4;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `dch_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const toXY = (p: DrawingPoint): [number, number] => [\n scale.xToPixel(p.barIndex, viewport, chartW),\n scale.yToPixel(p.price, priceRange, chartH),\n ];\n\n const [p1, p2, p3, p4] = this.points;\n const [x1, y1] = toXY(p1);\n const [x2, y2] = toXY(p2);\n\n ctx.save();\n ctx.strokeStyle = '#ef9a9a';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // If we have all 4 points, draw filled polygon\n if (p3 && p4) {\n const [x3, y3] = toXY(p3);\n const [x4, y4] = toXY(p4);\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(x4, y4);\n ctx.lineTo(x3, y3);\n ctx.closePath();\n ctx.fillStyle = 'rgba(239, 154, 154, 0.1)';\n ctx.fill();\n\n // First segment p1 -> p2\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n // Second segment p3 -> p4\n ctx.beginPath();\n ctx.moveTo(x3, y3);\n ctx.lineTo(x4, y4);\n ctx.stroke();\n\n if (isSelected) {\n ctx.fillStyle = '#ef9a9a';\n for (const [ax, ay] of [[x1, y1], [x2, y2], [x3, y3], [x4, y4]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n } else if (p3) {\n const [x3, y3] = toXY(p3);\n\n // First segment\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n // Third point so far (tracking 4th)\n ctx.beginPath();\n ctx.moveTo(x3, y3);\n ctx.lineTo(x3, y3);\n ctx.stroke();\n\n if (isSelected) {\n ctx.fillStyle = '#ef9a9a';\n for (const [ax, ay] of [[x1, y1], [x2, y2], [x3, y3]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n } else {\n // Only first segment being drawn\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n if (isSelected) {\n ctx.fillStyle = '#ef9a9a';\n for (const [ax, ay] of [[x1, y1], [x2, y2]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n\n const toXY = (p: DrawingPoint): [number, number] => [\n scale.xToPixel(p.barIndex, viewport, chartW),\n scale.yToPixel(p.price, priceRange, chartH),\n ];\n\n const [p1, p2, p3, p4] = this.points;\n const [x1, y1] = toXY(p1);\n const [x2, y2] = toXY(p2);\n\n if (pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE) return true;\n\n if (p3 && p4) {\n const [x3, y3] = toXY(p3);\n const [x4, y4] = toXY(p4);\n if (pointToSegmentDist(x, y, x3, y3, x4, y4) <= HIT_TOLERANCE) return true;\n }\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n const candidates = this.points.map((p, i) => ({\n i,\n px: scale.xToPixel(p.barIndex, viewport, chartW),\n py: scale.yToPixel(p.price, priceRange, chartH),\n }));\n for (const { i, px, py } of candidates) {\n if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst FIB_LEVELS = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1];\nconst FIB_COLORS = ['#ef5350', '#e8b84b', '#26a69a', '#2196f3', '#26a69a', '#e8b84b', '#ef5350'];\nconst HIT_TOLERANCE = 6;\n\nexport class FibRetracement implements IDrawing {\n readonly id: string;\n readonly type = 'fibRetracement' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `fib_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n pricePrecision = 2,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const highPrice = Math.max(p1.price, p2.price);\n const lowPrice = Math.min(p1.price, p2.price);\n const range = highPrice - lowPrice;\n\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n const xMin = Math.min(x1, x2);\n const xMax = Math.max(x1, x2);\n\n ctx.save();\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n\n for (let i = 0; i < FIB_LEVELS.length; i++) {\n const level = FIB_LEVELS[i];\n const price = highPrice - range * level;\n const y = scale.yToPixel(price, priceRange, chartH);\n const color = FIB_COLORS[i];\n const alpha = isSelected ? 'cc' : '99';\n\n ctx.strokeStyle = color + alpha;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.setLineDash(level === 0 || level === 1 ? [] : [4, 3]);\n ctx.beginPath();\n ctx.moveTo(xMin, y);\n ctx.lineTo(xMax, y);\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Label inside the bounded region\n const pct = `${(level * 100).toFixed(1)}%`;\n const lbl = `${pct} ${price.toFixed(pricePrecision)}`;\n ctx.fillStyle = color + alpha;\n ctx.fillText(lbl, xMin + 4, y - 3);\n }\n\n // Anchor dots on the two defining points\n\n for (const [ax, ay] of [[x1, y1], [x2, y2]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(ax, ay, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = '#e8b84b';\n ctx.fill();\n }\n ctx.restore();\n }\n\n hitTest(\n _x: number,\n y: number,\n scale: ScaleManager,\n _viewport: Viewport,\n priceRange: PriceRange,\n _chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const highPrice = Math.max(this.points[0].price, this.points[1].price);\n const lowPrice = Math.min(this.points[0].price, this.points[1].price);\n const range = highPrice - lowPrice;\n\n for (const level of FIB_LEVELS) {\n const price = highPrice - range * level;\n const lineY = scale.yToPixel(price, priceRange, chartH);\n if (Math.abs(y - lineY) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const anchors = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n for (let i = 0; i < anchors.length; i++) {\n if (Math.hypot(x - anchors[i].px, y - anchors[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nconst FIB_EXT_LEVELS = [0, 0.382, 0.618, 1, 1.382, 1.618, 2.0, 2.618];\nconst FIB_EXT_COLORS = ['#ef5350', '#e8b84b', '#26a69a', '#2196f3', '#26a69a', '#e8b84b', '#ef5350', '#ef5350'];\n\nexport class FibExtension implements IDrawing {\n readonly id: string;\n readonly type = 'fibExtension' as const;\n readonly requiredPoints = 3;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `fext_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n pricePrecision = 2,\n ): void {\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n // Phase 1 preview: show the swing (p1→p2) being defined\n if (!p3) {\n ctx.save();\n ctx.strokeStyle = '#888888aa';\n ctx.lineWidth = 1;\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.fillStyle = '#e8b84b';\n ctx.beginPath();\n ctx.arc(x1, y1, 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n return;\n }\n\n const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n const xMin = Math.min(x1, x2, x3);\n const xMax = Math.max(x1, x2, x3);\n\n const priceMove = p2.price - p1.price;\n\n ctx.save();\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Draw connecting lines between anchors (dashed)\n ctx.strokeStyle = '#888888aa';\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(x2, y2);\n ctx.lineTo(x3, y3);\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Draw extension level lines\n for (let i = 0; i < FIB_EXT_LEVELS.length; i++) {\n const level = FIB_EXT_LEVELS[i];\n const levelPrice = p3.price + level * priceMove;\n const y = scale.yToPixel(levelPrice, priceRange, chartH);\n const color = FIB_EXT_COLORS[i];\n const alpha = isSelected ? 'cc' : '99';\n\n ctx.strokeStyle = color + alpha;\n ctx.setLineDash(level === 0 || level === 1 ? [] : [4, 3]);\n ctx.beginPath();\n ctx.moveTo(xMin, y);\n ctx.lineTo(xMax, y);\n ctx.stroke();\n ctx.setLineDash([]);\n\n const pct = `${(level * 100).toFixed(1)}%`;\n const lbl = `${pct} ${levelPrice.toFixed(pricePrecision)}`;\n ctx.fillStyle = color + alpha;\n ctx.fillText(lbl, xMin + 4, y - 3);\n }\n\n // Anchor dots at p1, p2, p3\n for (const [ax, ay] of [[x1, y1], [x2, y2], [x3, y3]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(ax, ay, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = '#e8b84b';\n ctx.fill();\n }\n\n ctx.restore();\n }\n\n hitTest(\n _x: number,\n y: number,\n scale: ScaleManager,\n _viewport: Viewport,\n priceRange: PriceRange,\n _chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 3) return false;\n const [p1, p2, p3] = this.points;\n const priceMove = p2.price - p1.price;\n\n for (const level of FIB_EXT_LEVELS) {\n const levelPrice = p3.price + level * priceMove;\n const lineY = scale.yToPixel(levelPrice, priceRange, chartH);\n if (Math.abs(y - lineY) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 3) return null;\n const anchors = this.points.map(p => ({\n px: scale.xToPixel(p.barIndex, viewport, chartW),\n py: scale.yToPixel(p.price, priceRange, chartH),\n }));\n for (let i = 0; i < anchors.length; i++) {\n if (Math.hypot(x - anchors[i].px, y - anchors[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nconst FIB_LEVELS = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0];\nconst FIB_COLORS = ['#ef5350', '#e8b84b', '#26a69a', '#2196f3', '#26a69a', '#e8b84b', '#ef5350'];\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class FibChannel implements IDrawing {\n readonly id: string;\n readonly type = 'fibChannel' as const;\n readonly requiredPoints = 3;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `fchann_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n pricePrecision = 2,\n ): void {\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n // Phase 1 preview: show the base line (p1→p2) being defined\n if (!p3) {\n ctx.save();\n ctx.strokeStyle = '#888888aa';\n ctx.lineWidth = 1;\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.fillStyle = '#e8b84b';\n ctx.beginPath();\n ctx.arc(x1, y1, 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n return;\n }\n\n const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n // Direction vector of the base line p1->p2\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.hypot(dx, dy);\n if (len === 0) return;\n\n // Unit normal (perpendicular) to the base line\n const nx = -dy / len;\n const ny = dx / len;\n\n // Perpendicular distance of p3 from the base line\n const perpDist = (x3 - x1) * nx + (y3 - y1) * ny;\n\n ctx.save();\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n for (let i = 0; i < FIB_LEVELS.length; i++) {\n const level = FIB_LEVELS[i];\n const offset = level * perpDist;\n const lx1 = x1 + offset * nx;\n const ly1 = y1 + offset * ny;\n const lx2 = x2 + offset * nx;\n const ly2 = y2 + offset * ny;\n\n const color = FIB_COLORS[i];\n const alpha = isSelected ? 'cc' : '99';\n\n ctx.strokeStyle = color + alpha;\n ctx.setLineDash(level === 0 || level === 1 ? [] : [4, 3]);\n ctx.beginPath();\n ctx.moveTo(lx1, ly1);\n ctx.lineTo(lx2, ly2);\n ctx.stroke();\n ctx.setLineDash([]);\n\n const pct = `${(level * 100).toFixed(1)}%`;\n ctx.fillStyle = color + alpha;\n ctx.fillText(pct, lx2 + 4, ly2 + 3);\n }\n\n // Anchor dot at p3 (the width-defining point)\n ctx.beginPath();\n ctx.arc(x3, y3, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = '#e8b84b';\n ctx.fill();\n\n // Anchor dots at p1 and p2\n for (const [ax, ay] of [[x1, y1], [x2, y2]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(ax, ay, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = '#e8b84b';\n ctx.fill();\n }\n\n // Dashed guide line from base line to p3\n ctx.strokeStyle = '#888888aa';\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x3, y3);\n ctx.stroke();\n ctx.setLineDash([]);\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 3) return false;\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.hypot(dx, dy);\n if (len === 0) return false;\n\n const nx = -dy / len;\n const ny = dx / len;\n const perpDist = (x3 - x1) * nx + (y3 - y1) * ny;\n\n for (const level of FIB_LEVELS) {\n const offset = level * perpDist;\n const lx1 = x1 + offset * nx;\n const ly1 = y1 + offset * ny;\n const lx2 = x2 + offset * nx;\n const ly2 = y2 + offset * ny;\n if (pointToSegmentDist(x, y, lx1, ly1, lx2, ly2) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 3) return null;\n const anchors = this.points.map(p => ({\n px: scale.xToPixel(p.barIndex, viewport, chartW),\n py: scale.yToPixel(p.price, priceRange, chartH),\n }));\n for (let i = 0; i < anchors.length; i++) {\n if (Math.hypot(x - anchors[i].px, y - anchors[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nconst FIB_NUMBERS = [1, 2, 3, 5, 8, 13, 21, 34, 55, 89];\n\nexport class FibTimezone implements IDrawing {\n readonly id: string;\n readonly type = 'fibTimezone' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `ftz_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const interval = p2.barIndex - p1.barIndex;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n\n ctx.save();\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Draw the base interval line (p1 to p2)\n const color = '#e8b84b';\n const alpha = isSelected ? 'cc' : '88';\n ctx.strokeStyle = color + alpha;\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n ctx.moveTo(x1, 0);\n ctx.lineTo(x1, chartH);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(x2, 0);\n ctx.lineTo(x2, chartH);\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Draw Fibonacci vertical lines\n for (const fib of FIB_NUMBERS) {\n const barIndex = p1.barIndex + fib * interval;\n const xFib = scale.xToPixel(barIndex, viewport, chartW);\n\n // Skip lines outside the visible area\n if (xFib < -50 || xFib > chartW + 50) continue;\n\n ctx.strokeStyle = color + alpha;\n ctx.setLineDash([5, 3]);\n ctx.beginPath();\n ctx.moveTo(xFib, 0);\n ctx.lineTo(xFib, chartH);\n ctx.stroke();\n ctx.setLineDash([]);\n\n ctx.fillStyle = color + alpha;\n ctx.fillText(String(fib), xFib + 3, 12);\n }\n\n // Anchor dots at p1 and p2\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n for (const [ax, ay] of [[x1, y1], [x2, y2]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(ax, ay, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = '#e8b84b';\n ctx.fill();\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n _y: number,\n scale: ScaleManager,\n viewport: Viewport,\n _priceRange: PriceRange,\n chartW: number,\n _chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const interval = p2.barIndex - p1.barIndex;\n\n // Check p1 base line\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n if (Math.abs(x - x1) <= HIT_TOLERANCE) return true;\n\n for (const fib of FIB_NUMBERS) {\n const barIndex = p1.barIndex + fib * interval;\n const xFib = scale.xToPixel(barIndex, viewport, chartW);\n if (Math.abs(x - xFib) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const anchors = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n for (let i = 0; i < anchors.length; i++) {\n if (Math.hypot(x - anchors[i].px, y - anchors[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nconst FIB_RATIOS = [0.236, 0.382, 0.5, 0.618, 0.786, 1.0, 1.618, 2.618];\nconst FIB_COLORS = ['#ef5350', '#e8b84b', '#26a69a', '#2196f3', '#26a69a', '#e8b84b', '#ef5350', '#ef5350'];\n\nexport class FibCircles implements IDrawing {\n readonly id: string;\n readonly type = 'fibCircles' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `fcirc_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const cx = scale.xToPixel(p1.barIndex, viewport, chartW);\n const cy = scale.yToPixel(p1.price, priceRange, chartH);\n const rx = scale.xToPixel(p2.barIndex, viewport, chartW);\n const ry = scale.yToPixel(p2.price, priceRange, chartH);\n const baseRadius = Math.hypot(rx - cx, ry - cy);\n\n ctx.save();\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n for (let i = 0; i < FIB_RATIOS.length; i++) {\n const ratio = FIB_RATIOS[i];\n const radius = ratio * baseRadius;\n const color = FIB_COLORS[i % FIB_COLORS.length];\n const alpha = isSelected ? 'cc' : '88';\n\n ctx.strokeStyle = color + alpha;\n ctx.beginPath();\n ctx.arc(cx, cy, radius, 0, Math.PI * 2);\n ctx.stroke();\n\n // Label at top of each circle\n ctx.fillStyle = color + alpha;\n ctx.fillText(`${(ratio * 100).toFixed(1)}%`, cx + 3, cy - radius + 12);\n }\n\n // Anchor dot at center (p1)\n ctx.beginPath();\n ctx.arc(cx, cy, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = '#e8b84b';\n ctx.fill();\n\n // Anchor dot at radius point (p2)\n ctx.beginPath();\n ctx.arc(rx, ry, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = '#e8b84b';\n ctx.fill();\n\n // Line from center to radius point\n ctx.strokeStyle = '#88888866';\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n ctx.moveTo(cx, cy);\n ctx.lineTo(rx, ry);\n ctx.stroke();\n ctx.setLineDash([]);\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const cx = scale.xToPixel(p1.barIndex, viewport, chartW);\n const cy = scale.yToPixel(p1.price, priceRange, chartH);\n const rx = scale.xToPixel(p2.barIndex, viewport, chartW);\n const ry = scale.yToPixel(p2.price, priceRange, chartH);\n const baseRadius = Math.hypot(rx - cx, ry - cy);\n const distFromCenter = Math.hypot(x - cx, y - cy);\n\n for (const ratio of FIB_RATIOS) {\n const radius = ratio * baseRadius;\n if (Math.abs(distFromCenter - radius) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const p1x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n const p1y = scale.yToPixel(this.points[0].price, priceRange, chartH);\n const p2x = scale.xToPixel(this.points[1].barIndex, viewport, chartW);\n const p2y = scale.yToPixel(this.points[1].price, priceRange, chartH);\n\n if (Math.hypot(x - p1x, y - p1y) <= HIT_TOLERANCE + 2) {\n return { pointIndex: 0, cursor: 'move' };\n }\n if (Math.hypot(x - p2x, y - p2y) <= HIT_TOLERANCE + 2) {\n return { pointIndex: 1, cursor: 'grab' };\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\n// Fibonacci sequence multipliers for each quarter-circle arc radius\nconst FIB_SEQUENCE = [1, 1, 2, 3, 5, 8, 13, 21];\n\nexport class FibSpiral implements IDrawing {\n readonly id: string;\n readonly type = 'fibSpiral' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `fspi_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n /** Compute the pivot center and radius for each arc in the spiral */\n private computeArcs(\n cx: number, cy: number,\n dx: number, dy: number,\n ): Array<{ ox: number; oy: number; r: number; startAngle: number; endAngle: number }> {\n const baseDist = Math.hypot(dx, dy);\n // Largest fib number is 21; base unit = baseDist / 21\n const unit = baseDist / FIB_SEQUENCE[FIB_SEQUENCE.length - 1];\n\n // Start angle: direction from center to p2\n const startAngle = Math.atan2(dy, dx);\n\n const arcs: Array<{ ox: number; oy: number; r: number; startAngle: number; endAngle: number }> = [];\n\n // We build the spiral by placing each arc's pivot at the corner of the previous rectangle.\n // The golden spiral approximation: successive quarter arcs whose centers walk along\n // the vertices of a shrinking (towards center) golden rectangle.\n //\n // Strategy: start from p2 direction, walk inward.\n // Each arc i has radius = FIB_SEQUENCE[i] * unit.\n // The pivot for arc i is offset from the previous pivot.\n\n let pivotX = cx;\n let pivotY = cy;\n // Rotation direction: counter-clockwise (positive math direction)\n // Initial heading angle (from center to p2)\n let angle = startAngle;\n\n for (let i = FIB_SEQUENCE.length - 1; i >= 0; i--) {\n const r = FIB_SEQUENCE[i] * unit;\n const arcStart = angle + Math.PI; // start drawing on the opposite side\n const arcEnd = arcStart + Math.PI / 2; // quarter circle\n\n arcs.unshift({ ox: pivotX, oy: pivotY, r, startAngle: arcStart, endAngle: arcEnd });\n\n // Advance pivot for next (smaller) arc\n // The next pivot is 90° rotated, at distance (r - nextR) from current pivot along current heading\n if (i > 0) {\n const nextR = FIB_SEQUENCE[i - 1] * unit;\n // Move pivot along the direction perpendicular (left turn)\n const perpAngle = angle - Math.PI / 2;\n pivotX += (r - nextR) * Math.cos(perpAngle);\n pivotY += (r - nextR) * Math.sin(perpAngle);\n angle -= Math.PI / 2;\n }\n }\n\n return arcs;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const cx = scale.xToPixel(p1.barIndex, viewport, chartW);\n const cy = scale.yToPixel(p1.price, priceRange, chartH);\n const px2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const py2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const dx = px2 - cx;\n const dy = py2 - cy;\n\n ctx.save();\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n ctx.strokeStyle = isSelected ? '#e8b84bcc' : '#e8b84b88';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n const arcs = this.computeArcs(cx, cy, dx, dy);\n\n ctx.beginPath();\n for (let i = 0; i < arcs.length; i++) {\n const arc = arcs[i];\n if (i === 0) {\n const startX = arc.ox + arc.r * Math.cos(arc.startAngle);\n const startY = arc.oy + arc.r * Math.sin(arc.startAngle);\n ctx.moveTo(startX, startY);\n }\n ctx.arc(arc.ox, arc.oy, arc.r, arc.startAngle, arc.endAngle, false);\n }\n ctx.stroke();\n\n // Anchor dot at center (p1)\n ctx.beginPath();\n ctx.arc(cx, cy, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = '#e8b84b';\n ctx.fill();\n\n // Anchor dot at scale point (p2)\n ctx.beginPath();\n ctx.arc(px2, py2, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = '#e8b84b';\n ctx.fill();\n\n // Dashed line from center to p2\n ctx.strokeStyle = '#88888866';\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n ctx.moveTo(cx, cy);\n ctx.lineTo(px2, py2);\n ctx.stroke();\n ctx.setLineDash([]);\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n\n const [p1, p2] = this.points;\n const cx = scale.xToPixel(p1.barIndex, viewport, chartW);\n const cy = scale.yToPixel(p1.price, priceRange, chartH);\n const px2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const py2 = scale.yToPixel(p2.price, priceRange, chartH);\n const dx = px2 - cx;\n const dy = py2 - cy;\n\n const arcs = this.computeArcs(cx, cy, dx, dy);\n const SAMPLES = 16; // sample points per arc for hit testing\n\n for (const arc of arcs) {\n const angleSpan = arc.endAngle - arc.startAngle;\n for (let s = 0; s <= SAMPLES; s++) {\n const t = s / SAMPLES;\n const a = arc.startAngle + t * angleSpan;\n const sx = arc.ox + arc.r * Math.cos(a);\n const sy = arc.oy + arc.r * Math.sin(a);\n if (Math.hypot(x - sx, y - sy) <= HIT_TOLERANCE) return true;\n }\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const p1x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n const p1y = scale.yToPixel(this.points[0].price, priceRange, chartH);\n const p2x = scale.xToPixel(this.points[1].barIndex, viewport, chartW);\n const p2y = scale.yToPixel(this.points[1].price, priceRange, chartH);\n\n if (Math.hypot(x - p1x, y - p1y) <= HIT_TOLERANCE + 2) {\n return { pointIndex: 0, cursor: 'move' };\n }\n if (Math.hypot(x - p2x, y - p2y) <= HIT_TOLERANCE + 2) {\n return { pointIndex: 1, cursor: 'grab' };\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nconst FIB_FAN_RATIOS = [0.236, 0.382, 0.5, 0.618, 0.786];\nconst FIB_FAN_COLORS = ['#e8b84b', '#26a69a', '#2196f3', '#26a69a', '#e8b84b'];\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\n/** Extend a ray from (ox, oy) through (tx, ty) to the chart boundaries */\nfunction extendRay(\n ox: number, oy: number,\n tx: number, ty: number,\n chartW: number, chartH: number,\n): [number, number] {\n const dx = tx - ox;\n const dy = ty - oy;\n if (dx === 0 && dy === 0) return [tx, ty];\n\n let tMin = Infinity;\n // Right boundary\n if (dx > 0) tMin = Math.min(tMin, (chartW - ox) / dx);\n // Left boundary\n if (dx < 0) tMin = Math.min(tMin, (0 - ox) / dx);\n // Bottom boundary\n if (dy > 0) tMin = Math.min(tMin, (chartH - oy) / dy);\n // Top boundary\n if (dy < 0) tMin = Math.min(tMin, (0 - oy) / dy);\n\n return [ox + tMin * dx, oy + tMin * dy];\n}\n\nexport class FibFan implements IDrawing {\n readonly id: string;\n readonly type = 'fibFan' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `ffan_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n ctx.save();\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Draw baseline p1→p2 faintly (dashed)\n ctx.strokeStyle = '#888888aa';\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.setLineDash([]);\n\n const priceRange2 = p2.price - p1.price;\n\n for (let i = 0; i < FIB_FAN_RATIOS.length; i++) {\n const ratio = FIB_FAN_RATIOS[i];\n const color = FIB_FAN_COLORS[i];\n const alpha = isSelected ? 'cc' : '99';\n\n // Fan target point: same barIndex as p2, price interpolated by ratio\n const targetPrice = p1.price + ratio * priceRange2;\n const tx = x2;\n const ty = scale.yToPixel(targetPrice, priceRange, chartH);\n\n // Extend from origin through target to chart edges\n const [ex, ey] = extendRay(x1, y1, tx, ty, chartW, chartH);\n\n ctx.strokeStyle = color + alpha;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(ex, ey);\n ctx.stroke();\n\n // Label near the extended endpoint\n ctx.fillStyle = color + alpha;\n ctx.fillText(`${(ratio * 100).toFixed(1)}%`, Math.min(ex - 32, chartW - 40), ey - 3);\n }\n\n // Anchor dots at p1 and p2\n for (const [ax, ay] of [[x1, y1], [x2, y2]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(ax, ay, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = '#e8b84b';\n ctx.fill();\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const priceRange2 = p2.price - p1.price;\n\n for (const ratio of FIB_FAN_RATIOS) {\n const targetPrice = p1.price + ratio * priceRange2;\n const tx = x2;\n const ty = scale.yToPixel(targetPrice, priceRange, chartH);\n const [ex, ey] = extendRay(x1, y1, tx, ty, chartW, chartH);\n if (pointToSegmentDist(x, y, x1, y1, ex, ey) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const anchors = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n for (let i = 0; i < anchors.length; i++) {\n if (Math.hypot(x - anchors[i].px, y - anchors[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nconst FIB_PROJ_LEVELS = [0, 0.618, 1, 1.272, 1.618, 2, 2.618];\nconst FIB_PROJ_COLORS = ['#ef5350', '#26a69a', '#2196f3', '#26a69a', '#e8b84b', '#ef5350', '#ef5350'];\n\n\nexport class FibProjection implements IDrawing {\n readonly id: string;\n readonly type = 'fibProjection' as const;\n readonly requiredPoints = 3;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `fproj_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n pricePrecision = 2,\n ): void {\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n // Phase 1 preview: show the swing (p1→p2) being defined\n if (!p3) {\n ctx.save();\n ctx.strokeStyle = '#888888aa';\n ctx.lineWidth = 1;\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.fillStyle = '#e8b84b';\n ctx.beginPath();\n ctx.arc(x1, y1, 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n return;\n }\n\n const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n const xMin = Math.min(x1, x3);\n const xMax = Math.max(x1, x3);\n const baseMove = p2.price - p1.price;\n\n ctx.save();\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Dashed connector lines: p1→p2 and p2→p3\n ctx.strokeStyle = '#888888aa';\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(x2, y2);\n ctx.lineTo(x3, y3);\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Projection level lines\n for (let i = 0; i < FIB_PROJ_LEVELS.length; i++) {\n const level = FIB_PROJ_LEVELS[i];\n const levelPrice = p3.price + level * baseMove;\n const y = scale.yToPixel(levelPrice, priceRange, chartH);\n const color = FIB_PROJ_COLORS[i];\n const alpha = isSelected ? 'cc' : '99';\n\n ctx.strokeStyle = color + alpha;\n ctx.setLineDash(level === 0 || level === 1 ? [] : [4, 3]);\n ctx.beginPath();\n ctx.moveTo(xMin, y);\n ctx.lineTo(xMax, y);\n ctx.stroke();\n ctx.setLineDash([]);\n\n const pct = `${(level * 100).toFixed(1)}%`;\n const lbl = `${pct} ${levelPrice.toFixed(pricePrecision)}`;\n ctx.fillStyle = color + alpha;\n ctx.fillText(lbl, xMin + 4, y - 3);\n }\n\n // Anchor dots at all 3 points\n for (const [ax, ay] of [[x1, y1], [x2, y2], [x3, y3]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(ax, ay, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = '#e8b84b';\n ctx.fill();\n }\n\n ctx.restore();\n }\n\n hitTest(\n _x: number,\n y: number,\n scale: ScaleManager,\n _viewport: Viewport,\n priceRange: PriceRange,\n _chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 3) return false;\n const [p1, p2, p3] = this.points;\n const baseMove = p2.price - p1.price;\n\n for (const level of FIB_PROJ_LEVELS) {\n const levelPrice = p3.price + level * baseMove;\n const lineY = scale.yToPixel(levelPrice, priceRange, chartH);\n if (Math.abs(y - lineY) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 3) return null;\n const anchors = this.points.map(p => ({\n px: scale.xToPixel(p.barIndex, viewport, chartW),\n py: scale.yToPixel(p.price, priceRange, chartH),\n }));\n for (let i = 0; i < anchors.length; i++) {\n if (Math.hypot(x - anchors[i].px, y - anchors[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\n// Gann fan ratios as [priceUnits, timeUnits, label]\n// The 1:1 line is the base direction; other lines scale the y-component.\nconst GANN_RATIOS: [number, number, string][] = [\n [1, 8, '1:8'],\n [1, 4, '1:4'],\n [1, 3, '1:3'],\n [1, 2, '1:2'],\n [1, 1, '1:1'],\n [2, 1, '2:1'],\n [3, 1, '3:1'],\n [4, 1, '4:1'],\n [8, 1, '8:1'],\n];\n\nexport class GannFan implements IDrawing {\n readonly id: string;\n readonly type = 'gannFan' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `gfan_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const baseWidth = Math.abs(x2 - x1) || 1;\n const baseHeight = y2 - y1; // signed: negative means price went up (y decreases)\n const dirX = x2 > x1 ? 1 : -1;\n\n ctx.save();\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n GANN_RATIOS.forEach(([priceUnits, timeUnits, label], idx) => {\n // For the 1:1 line, scale factor = 1 (baseHeight / 1 * 1)\n // For ratio priceUnits:timeUnits relative to 1:1:\n // scaleFactor = (priceUnits / 1) * (1 / timeUnits) = priceUnits / timeUnits\n // But the reference 1:1 slope is baseHeight / baseWidth (per pixel).\n // We scale the y-component by (priceUnits / timeUnits) relative to 1:1:\n const scaleFactor = priceUnits / timeUnits;\n const fanDY = baseHeight * scaleFactor;\n\n // Line goes from (x1,y1) toward chartW\n const tMax = (chartW - x1) / (baseWidth * dirX);\n const xEnd = x1 + baseWidth * dirX * tMax;\n const yEnd = y1 + fanDY * tMax;\n\n // Opacity varies: center line (1:1) is fully opaque\n const opacities = ['55', '66', '77', '99', 'cc', '99', '77', '66', '55'];\n const alpha = opacities[idx] ?? '88';\n const color = '#ffa726' + alpha;\n\n ctx.strokeStyle = color;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(xEnd, yEnd);\n ctx.stroke();\n\n // Label at the end of the line\n ctx.fillStyle = color;\n const labelX = Math.min(xEnd, chartW - 30);\n ctx.fillText(label, labelX, yEnd - 3);\n });\n\n // Anchor dots\n ctx.fillStyle = '#ffa726';\n ctx.beginPath();\n ctx.arc(x1, y1, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.beginPath();\n ctx.arc(x2, y2, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const baseWidth = Math.abs(x2 - x1) || 1;\n const baseHeight = y2 - y1;\n const dirX = x2 > x1 ? 1 : -1;\n\n for (const [priceUnits, timeUnits] of GANN_RATIOS) {\n const scaleFactor = priceUnits / timeUnits;\n const fanDY = baseHeight * scaleFactor;\n const tMax = (chartW - x1) / (baseWidth * dirX);\n const xEnd = x1 + baseWidth * dirX * tMax;\n const yEnd = y1 + fanDY * tMax;\n if (pointToSegmentDist(x, y, x1, y1, xEnd, yEnd) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n const cursors = ['move', 'grab'];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: cursors[i] };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nexport class GannSquare implements IDrawing {\n readonly id: string;\n readonly type = 'gannSquare' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `gsq_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const left = Math.min(x1, x2);\n const top = Math.min(y1, y2);\n const right = Math.max(x1, x2);\n const bottom = Math.max(y1, y2);\n const w = right - left;\n const h = bottom - top;\n\n ctx.save();\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.strokeStyle = '#ab47bc';\n\n // Light fill\n ctx.fillStyle = '#ab47bc0a';\n ctx.fillRect(left, top, w, h);\n\n // Border\n ctx.strokeRect(left, top, w, h);\n\n // 2 interior horizontal lines (at 1/3 and 2/3 height)\n ctx.beginPath();\n ctx.moveTo(left, top + h / 3);\n ctx.lineTo(right, top + h / 3);\n ctx.moveTo(left, top + (2 * h) / 3);\n ctx.lineTo(right, top + (2 * h) / 3);\n ctx.stroke();\n\n // 2 interior vertical lines (at 1/3 and 2/3 width)\n ctx.beginPath();\n ctx.moveTo(left + w / 3, top);\n ctx.lineTo(left + w / 3, bottom);\n ctx.moveTo(left + (2 * w) / 3, top);\n ctx.lineTo(left + (2 * w) / 3, bottom);\n ctx.stroke();\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const left = Math.min(x1, x2);\n const top = Math.min(y1, y2);\n const right = Math.max(x1, x2);\n const bottom = Math.max(y1, y2);\n\n return x >= left && x <= right && y >= top && y <= bottom;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'nwse-resize' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nexport class GannBox implements IDrawing {\n readonly id: string;\n readonly type = 'gannBox' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `gbox_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const left = Math.min(x1, x2);\n const top = Math.min(y1, y2);\n const right = Math.max(x1, x2);\n const bottom = Math.max(y1, y2);\n const w = right - left;\n const h = bottom - top;\n const midX = left + w / 2;\n const midY = top + h / 2;\n\n ctx.save();\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.strokeStyle = '#7e57c2';\n\n // Light fill\n ctx.fillStyle = '#7e57c20a';\n ctx.fillRect(left, top, w, h);\n\n // Border\n ctx.strokeRect(left, top, w, h);\n\n // Diagonal 1: top-left to bottom-right\n ctx.beginPath();\n ctx.moveTo(left, top);\n ctx.lineTo(right, bottom);\n ctx.stroke();\n\n // Diagonal 2: top-right to bottom-left\n ctx.beginPath();\n ctx.moveTo(right, top);\n ctx.lineTo(left, bottom);\n ctx.stroke();\n\n // Horizontal midline\n ctx.beginPath();\n ctx.moveTo(left, midY);\n ctx.lineTo(right, midY);\n ctx.stroke();\n\n // Vertical midline\n ctx.beginPath();\n ctx.moveTo(midX, top);\n ctx.lineTo(midX, bottom);\n ctx.stroke();\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const left = Math.min(x1, x2);\n const top = Math.min(y1, y2);\n const right = Math.max(x1, x2);\n const bottom = Math.max(y1, y2);\n\n return x >= left && x <= right && y >= top && y <= bottom;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'nwse-resize' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6; // px\n\nexport class Rectangle implements IDrawing {\n readonly id: string;\n readonly type = 'rectangle' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `rect_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const rx = Math.min(x1, x2);\n const ry = Math.min(y1, y2);\n const rw = Math.abs(x2 - x1);\n const rh = Math.abs(y2 - y1);\n\n ctx.save();\n ctx.fillStyle = '#9b59b6' + '18';\n ctx.strokeStyle = '#9b59b6';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.fillRect(rx, ry, rw, rh);\n ctx.strokeRect(rx, ry, rw, rh);\n\n // Corner handles when selected\n if (isSelected) {\n for (const [cx, cy] of [[x1, y1], [x2, y1], [x1, y2], [x2, y2]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(cx, cy, 3.5, 0, Math.PI * 2);\n ctx.fillStyle = '#9b59b6';\n ctx.fill();\n }\n }\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const rx = Math.min(x1, x2) - HIT_TOLERANCE;\n const ry = Math.min(y1, y2) - HIT_TOLERANCE;\n const rw = Math.abs(x2 - x1) + HIT_TOLERANCE * 2;\n const rh = Math.abs(y2 - y1) + HIT_TOLERANCE * 2;\n\n return x >= rx && x <= rx + rw && y >= ry && y <= ry + rh;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n // Only the 2 actual control points are interactive handles\n // (the other 2 rendered corners are mixtures of both points' x/y — not directly movable)\n const diag = x1 <= x2 ? (y1 <= y2 ? 'nwse-resize' : 'nesw-resize') : (y1 <= y2 ? 'nesw-resize' : 'nwse-resize');\n const handles: [number, number, number, string][] = [\n [0, x1, y1, diag],\n [1, x2, y2, diag],\n ];\n for (const [pi, cx, cy, cursor] of handles) {\n if (Math.hypot(x - cx, y - cy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: pi as number, cursor };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointInPolygon(px: number, py: number, poly: [number, number][]): boolean {\n let inside = false;\n const n = poly.length;\n for (let i = 0, j = n - 1; i < n; j = i++) {\n const [xi, yi] = poly[i];\n const [xj, yj] = poly[j];\n const intersect = ((yi > py) !== (yj > py)) &&\n (px < (xj - xi) * (py - yi) / (yj - yi) + xi);\n if (intersect) inside = !inside;\n }\n return inside;\n}\n\nexport class RotatedRectangle implements IDrawing {\n readonly id: string;\n readonly type = 'rotatedRectangle' as const;\n readonly requiredPoints = 3;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `rrect_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n private getCorners(\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): [number, number][] {\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n const abLen = Math.hypot(x2 - x1, y2 - y1);\n if (abLen < 1e-6) {\n return [[x1, y1], [x2, y2], [x2, y2], [x1, y1]];\n }\n\n // Perpendicular unit vector (rotated 90° CCW)\n const perpX = -(y2 - y1) / abLen;\n const perpY = (x2 - x1) / abLen;\n\n // Signed width = projection of p3-p1 onto perp\n const width = (x3 - x1) * perpX + (y3 - y1) * perpY;\n\n // Corner A = p1, B = p2, C = B + perp*width, D = A + perp*width\n const ax = x1, ay = y1;\n const bx = x2, by = y2;\n const cx = bx + perpX * width, cy = by + perpY * width;\n const dx = ax + perpX * width, dy = ay + perpY * width;\n\n return [[ax, ay], [bx, by], [cx, cy], [dx, dy]];\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 3) return;\n\n const corners = this.getCorners(scale, viewport, priceRange, chartW, chartH);\n\n ctx.save();\n\n // Filled polygon\n ctx.beginPath();\n ctx.moveTo(corners[0][0], corners[0][1]);\n for (let i = 1; i < corners.length; i++) {\n ctx.lineTo(corners[i][0], corners[i][1]);\n }\n ctx.closePath();\n ctx.fillStyle = '#9c27b018';\n ctx.fill();\n\n // Border\n ctx.strokeStyle = '#9c27b0';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.stroke();\n\n // Anchor dots at A, B, C, D\n ctx.fillStyle = '#9c27b0';\n for (const [x, y] of corners) {\n ctx.beginPath();\n ctx.arc(x, y, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 3) return false;\n const corners = this.getCorners(scale, viewport, priceRange, chartW, chartH);\n return pointInPolygon(x, y, corners);\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n // Expose p1 (index 0), p2 (index 1), p3 (index 2 — the width handle)\n for (let i = 0; i < this.points.length; i++) {\n const px = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const py = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6; // px\n\nexport class Ellipse implements IDrawing {\n readonly id: string;\n readonly type = 'ellipse' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `ell_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const rx = Math.abs(x2 - x1) / 2;\n const ry = Math.abs(y2 - y1) / 2;\n\n if (rx < 1 || ry < 1) return;\n\n ctx.save();\n ctx.fillStyle = '#2196f3' + '18';\n ctx.strokeStyle = '#2196f3';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n ctx.beginPath();\n ctx.ellipse(cx, cy, rx, ry, 0, 0, Math.PI * 2);\n ctx.fill();\n ctx.stroke();\n\n if (isSelected) {\n for (const [hx, hy] of [[x1, y1], [x2, y2]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(hx, hy, 3.5, 0, Math.PI * 2);\n ctx.fillStyle = '#2196f3';\n ctx.fill();\n }\n }\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const rx = Math.abs(x2 - x1) / 2 + HIT_TOLERANCE;\n const ry = Math.abs(y2 - y1) / 2 + HIT_TOLERANCE;\n\n if (rx < 1 || ry < 1) return false;\n const dx = (x - cx) / rx;\n const dy = (y - cy) / ry;\n return dx * dx + dy * dy <= 1;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const diag = x1 <= x2\n ? (y1 <= y2 ? 'nwse-resize' : 'nesw-resize')\n : (y1 <= y2 ? 'nesw-resize' : 'nwse-resize');\n const handles: [number, number, number, string][] = [\n [0, x1, y1, diag],\n [1, x2, y2, diag],\n ];\n for (const [pi, hx, hy, cursor] of handles) {\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: pi as number, cursor };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6; // px\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class Triangle implements IDrawing {\n readonly id: string;\n readonly type = 'triangle' as const;\n readonly requiredPoints = 3;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `tri_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n\n ctx.save();\n ctx.strokeStyle = '#ff9800';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n for (let i = 1; i < px.length; i++) {\n ctx.lineTo(px[i], py[i]);\n }\n if (this.complete) {\n ctx.closePath();\n ctx.fillStyle = '#ff9800' + '18';\n ctx.fill();\n }\n ctx.stroke();\n\n if (isSelected) {\n for (let i = 0; i < px.length; i++) {\n ctx.beginPath();\n ctx.arc(px[i], py[i], 4, 0, Math.PI * 2);\n ctx.fillStyle = '#ff9800';\n ctx.fill();\n }\n }\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 3) return false;\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n for (let i = 0; i < n; i++) {\n const j = (i + 1) % n;\n if (pointToSegmentDist(x, y, px[i], py[i], px[j], py[j]) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 3) return null;\n for (let i = 0; i < this.points.length; i++) {\n const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6; // px\n\nexport class Circle implements IDrawing {\n readonly id: string;\n readonly type = 'circle' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `circ_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const cx = scale.xToPixel(p1.barIndex, viewport, chartW);\n const cy = scale.yToPixel(p1.price, priceRange, chartH);\n const ex = scale.xToPixel(p2.barIndex, viewport, chartW);\n const ey = scale.yToPixel(p2.price, priceRange, chartH);\n const r = Math.hypot(ex - cx, ey - cy);\n\n if (r < 1) return;\n\n ctx.save();\n ctx.fillStyle = '#4caf50' + '18';\n ctx.strokeStyle = '#4caf50';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n ctx.beginPath();\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n ctx.fill();\n ctx.stroke();\n\n if (isSelected) {\n // Center handle\n ctx.beginPath();\n ctx.arc(cx, cy, 3, 0, Math.PI * 2);\n ctx.fillStyle = '#4caf50';\n ctx.fill();\n // Edge handle\n ctx.beginPath();\n ctx.arc(ex, ey, 3.5, 0, Math.PI * 2);\n ctx.fillStyle = '#4caf50';\n ctx.fill();\n }\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const cx = scale.xToPixel(p1.barIndex, viewport, chartW);\n const cy = scale.yToPixel(p1.price, priceRange, chartH);\n const ex = scale.xToPixel(p2.barIndex, viewport, chartW);\n const ey = scale.yToPixel(p2.price, priceRange, chartH);\n const r = Math.hypot(ex - cx, ey - cy);\n return Math.hypot(x - cx, y - cy) <= r + HIT_TOLERANCE;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const [p1, p2] = this.points;\n const cx = scale.xToPixel(p1.barIndex, viewport, chartW);\n const cy = scale.yToPixel(p1.price, priceRange, chartH);\n const ex = scale.xToPixel(p2.barIndex, viewport, chartW);\n const ey = scale.yToPixel(p2.price, priceRange, chartH);\n\n if (Math.hypot(x - cx, y - cy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: 0, cursor: 'move' };\n }\n if (Math.hypot(x - ex, y - ey) <= HIT_TOLERANCE + 2) {\n return { pointIndex: 1, cursor: 'grab' };\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class Arc implements IDrawing {\n readonly id: string;\n readonly type = 'arc' as const;\n readonly requiredPoints = 3;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `arc_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 3) return;\n\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n ctx.save();\n ctx.strokeStyle = '#26c6da';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Compute circumscribed circle through 3 points using perpendicular bisector method\n const ax = x1, ay = y1;\n const bx = x2, by = y2;\n const cx = x3, cy = y3;\n\n const D = 2 * (ax * (by - cy) + bx * (cy - ay) + cx * (ay - by));\n\n if (Math.abs(D) < 1e-6) {\n // Collinear — draw straight line\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x3, y3);\n ctx.stroke();\n } else {\n const ax2 = ax * ax, ay2 = ay * ay;\n const bx2 = bx * bx, by2 = by * by;\n const cx2 = cx * cx, cy2 = cy * cy;\n\n const ux = ((ax2 + ay2) * (by - cy) + (bx2 + by2) * (cy - ay) + (cx2 + cy2) * (ay - by)) / D;\n const uy = ((ax2 + ay2) * (cx - bx) + (bx2 + by2) * (ax - cx) + (cx2 + cy2) * (bx - ax)) / D;\n\n const r = Math.hypot(ax - ux, ay - uy);\n\n // Angles from center to each point\n const aStart = Math.atan2(ay - uy, ax - ux);\n const aMid = Math.atan2(by - uy, bx - ux);\n const aEnd = Math.atan2(cy - uy, cx - ux);\n\n // Determine direction: counterclockwise if p2 is CCW between p1 and p3\n const normalizeAngle = (a: number, base: number): number => {\n let diff = a - base;\n while (diff < 0) diff += Math.PI * 2;\n while (diff >= Math.PI * 2) diff -= Math.PI * 2;\n return diff;\n };\n\n const midFromStart = normalizeAngle(aMid, aStart);\n const endFromStart = normalizeAngle(aEnd, aStart);\n\n // If midFromStart < endFromStart, p2 is between p1→p3 going CCW\n const anticlockwise = midFromStart > endFromStart;\n\n ctx.beginPath();\n ctx.arc(ux, uy, r, aStart, aEnd, anticlockwise);\n ctx.stroke();\n }\n\n // Anchor dots at all 3 points\n const anchors: [number, number][] = [[x1, y1], [x2, y2], [x3, y3]];\n ctx.fillStyle = '#26c6da';\n for (const [x, y] of anchors) {\n ctx.beginPath();\n ctx.arc(x, y, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 3) return false;\n\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n const ax = x1, ay = y1;\n const bx = x2, by = y2;\n const cx = x3, cy = y3;\n\n const D = 2 * (ax * (by - cy) + bx * (cy - ay) + cx * (ay - by));\n\n if (Math.abs(D) < 1e-6) {\n return pointToSegmentDist(x, y, x1, y1, x3, y3) <= HIT_TOLERANCE;\n }\n\n const ax2 = ax * ax, ay2 = ay * ay;\n const bx2 = bx * bx, by2 = by * by;\n const cx2 = cx * cx, cy2 = cy * cy;\n\n const ux = ((ax2 + ay2) * (by - cy) + (bx2 + by2) * (cy - ay) + (cx2 + cy2) * (ay - by)) / D;\n const uy = ((ax2 + ay2) * (cx - bx) + (bx2 + by2) * (ax - cx) + (cx2 + cy2) * (bx - ax)) / D;\n\n const r = Math.hypot(ax - ux, ay - uy);\n const dist = Math.abs(Math.hypot(x - ux, y - uy) - r);\n\n if (dist > HIT_TOLERANCE) return false;\n\n // Also verify the hit point is on the correct arc segment\n const aStart = Math.atan2(ay - uy, ax - ux);\n const aMid = Math.atan2(by - uy, bx - ux);\n const aEnd = Math.atan2(cy - uy, cx - ux);\n const aHit = Math.atan2(y - uy, x - ux);\n\n const normalizeAngle = (a: number, base: number): number => {\n let diff = a - base;\n while (diff < 0) diff += Math.PI * 2;\n while (diff >= Math.PI * 2) diff -= Math.PI * 2;\n return diff;\n };\n\n const midFromStart = normalizeAngle(aMid, aStart);\n const endFromStart = normalizeAngle(aEnd, aStart);\n const hitFromStart = normalizeAngle(aHit, aStart);\n\n const anticlockwise = midFromStart > endFromStart;\n\n if (!anticlockwise) {\n return hitFromStart <= endFromStart;\n } else {\n return hitFromStart >= endFromStart || hitFromStart <= 0;\n }\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n for (let i = 0; i < this.points.length; i++) {\n const px = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const py = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class Polyline implements IDrawing {\n readonly id: string;\n readonly type = 'polyline' as const;\n readonly openEnded = true;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `poly_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const pixelPts = this.points.map(p => ({\n x: scale.xToPixel(p.barIndex, viewport, chartW),\n y: scale.yToPixel(p.price, priceRange, chartH),\n }));\n\n ctx.save();\n ctx.strokeStyle = '#ff7043';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Draw confirmed segments (all except the last when not complete)\n const solidCount = this.complete ? pixelPts.length : pixelPts.length - 1;\n\n if (solidCount >= 2) {\n ctx.setLineDash([]);\n ctx.beginPath();\n ctx.moveTo(pixelPts[0].x, pixelPts[0].y);\n for (let i = 1; i < solidCount; i++) {\n ctx.lineTo(pixelPts[i].x, pixelPts[i].y);\n }\n ctx.stroke();\n }\n\n // Draw the preview (last) segment as dashed when not complete\n if (!this.complete && pixelPts.length >= 2) {\n const last = pixelPts.length - 1;\n ctx.setLineDash([4, 4]);\n ctx.beginPath();\n ctx.moveTo(pixelPts[last - 1].x, pixelPts[last - 1].y);\n ctx.lineTo(pixelPts[last].x, pixelPts[last].y);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n // Anchor dots at confirmed points\n ctx.fillStyle = '#ff7043';\n const dotCount = this.complete ? pixelPts.length : pixelPts.length - 1;\n for (let i = 0; i < dotCount; i++) {\n ctx.beginPath();\n ctx.arc(pixelPts[i].x, pixelPts[i].y, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n\n const pixelPts = this.points.map(p => ({\n x: scale.xToPixel(p.barIndex, viewport, chartW),\n y: scale.yToPixel(p.price, priceRange, chartH),\n }));\n\n const segCount = this.complete ? pixelPts.length - 1 : pixelPts.length - 2;\n for (let i = 0; i < segCount; i++) {\n if (pointToSegmentDist(x, y, pixelPts[i].x, pixelPts[i].y, pixelPts[i + 1].x, pixelPts[i + 1].y) <= HIT_TOLERANCE) {\n return true;\n }\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n for (let i = 0; i < this.points.length; i++) {\n const px = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const py = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class Path implements IDrawing {\n readonly id: string;\n readonly type = 'path' as const;\n readonly openEnded = true;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `path_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const pixelPts = this.points.map(p => ({\n x: scale.xToPixel(p.barIndex, viewport, chartW),\n y: scale.yToPixel(p.price, priceRange, chartH),\n }));\n\n // Solid points: all confirmed points (exclude preview when !complete)\n const solidCount = this.complete ? pixelPts.length : pixelPts.length - 1;\n\n ctx.save();\n ctx.strokeStyle = '#ec407a';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Draw smooth bezier curve through confirmed points using quadratic Catmull-Rom style\n if (solidCount >= 2) {\n ctx.setLineDash([]);\n ctx.beginPath();\n ctx.moveTo(pixelPts[0].x, pixelPts[0].y);\n\n if (solidCount === 2) {\n ctx.lineTo(pixelPts[1].x, pixelPts[1].y);\n } else {\n // Quadratic smooth: for each interior control point, draw to midpoint\n for (let i = 1; i < solidCount - 1; i++) {\n const midX = (pixelPts[i].x + pixelPts[i + 1].x) / 2;\n const midY = (pixelPts[i].y + pixelPts[i + 1].y) / 2;\n ctx.quadraticCurveTo(pixelPts[i].x, pixelPts[i].y, midX, midY);\n }\n // Final segment to last confirmed point\n ctx.lineTo(pixelPts[solidCount - 1].x, pixelPts[solidCount - 1].y);\n }\n ctx.stroke();\n }\n\n // Draw preview (last) segment as dashed line when not complete\n if (!this.complete && pixelPts.length >= 2) {\n const last = pixelPts.length - 1;\n ctx.setLineDash([4, 4]);\n ctx.beginPath();\n ctx.moveTo(pixelPts[last - 1].x, pixelPts[last - 1].y);\n ctx.lineTo(pixelPts[last].x, pixelPts[last].y);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n // Anchor dots at confirmed points\n ctx.fillStyle = '#ec407a';\n for (let i = 0; i < solidCount; i++) {\n ctx.beginPath();\n ctx.arc(pixelPts[i].x, pixelPts[i].y, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n\n const pixelPts = this.points.map(p => ({\n x: scale.xToPixel(p.barIndex, viewport, chartW),\n y: scale.yToPixel(p.price, priceRange, chartH),\n }));\n\n // Approximate hit test using line segments between confirmed points\n const segCount = this.complete ? pixelPts.length - 1 : pixelPts.length - 2;\n for (let i = 0; i < segCount; i++) {\n if (pointToSegmentDist(x, y, pixelPts[i].x, pixelPts[i].y, pixelPts[i + 1].x, pixelPts[i + 1].y) <= HIT_TOLERANCE) {\n return true;\n }\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n for (let i = 0; i < this.points.length; i++) {\n const px = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const py = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange as IPriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nfunction drawArrowhead(ctx: CanvasRenderingContext2D, fromX: number, fromY: number, toX: number, toY: number, size = 7): void {\n const angle = Math.atan2(toY - fromY, toX - fromX);\n ctx.beginPath();\n ctx.moveTo(toX, toY);\n ctx.lineTo(toX - size * Math.cos(angle - Math.PI / 6), toY - size * Math.sin(angle - Math.PI / 6));\n ctx.lineTo(toX - size * Math.cos(angle + Math.PI / 6), toY - size * Math.sin(angle + Math.PI / 6));\n ctx.closePath();\n ctx.fill();\n}\n\nexport class PriceRange implements IDrawing {\n readonly id: string;\n readonly type = 'priceRange' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `pr_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: IPriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n pricePrecision = 2,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const midX = (x1 + x2) / 2;\n const midY = (y1 + y2) / 2;\n const topY = Math.min(y1, y2);\n const botY = Math.max(y1, y2);\n const tickHalf = 10;\n const color = '#26a69a';\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n\n // Vertical line (arrow shaft)\n ctx.beginPath();\n ctx.moveTo(midX, topY);\n ctx.lineTo(midX, botY);\n ctx.stroke();\n\n // Arrowheads\n drawArrowhead(ctx, midX, botY, midX, topY); // pointing up\n drawArrowhead(ctx, midX, topY, midX, botY); // pointing down\n\n // Horizontal tick at y1\n ctx.beginPath();\n ctx.moveTo(x1 - tickHalf, y1);\n ctx.lineTo(x1 + tickHalf, y1);\n ctx.stroke();\n\n // Horizontal tick at y2\n ctx.beginPath();\n ctx.moveTo(x2 - tickHalf, y2);\n ctx.lineTo(x2 + tickHalf, y2);\n ctx.stroke();\n\n // Label box at midpoint\n const priceDiff = Math.abs(p1.price - p2.price).toFixed(pricePrecision);\n const pctChange = ((p2.price - p1.price) / p1.price * 100).toFixed(2) + '%';\n const line1 = priceDiff;\n const line2 = pctChange;\n\n const boxPad = 4;\n const boxW = 70;\n const boxH = 30;\n const boxX = midX + 8;\n const boxY = midY - boxH / 2;\n\n ctx.fillStyle = 'rgba(0,0,0,0.55)';\n ctx.fillRect(boxX, boxY, boxW, boxH);\n ctx.strokeStyle = color;\n ctx.strokeRect(boxX, boxY, boxW, boxH);\n\n ctx.fillStyle = color;\n ctx.fillText(line1, boxX + boxPad, boxY + boxPad + 10);\n ctx.fillText(line2, boxX + boxPad, boxY + boxPad + 22);\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: IPriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n const midX = (x1 + x2) / 2;\n const topY = Math.min(y1, y2);\n const botY = Math.max(y1, y2);\n return Math.abs(x - midX) <= HIT_TOLERANCE && y >= topY && y <= botY;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: IPriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'ns-resize' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nfunction drawArrowhead(ctx: CanvasRenderingContext2D, fromX: number, fromY: number, toX: number, toY: number, size = 7): void {\n const angle = Math.atan2(toY - fromY, toX - fromX);\n ctx.beginPath();\n ctx.moveTo(toX, toY);\n ctx.lineTo(toX - size * Math.cos(angle - Math.PI / 6), toY - size * Math.sin(angle - Math.PI / 6));\n ctx.lineTo(toX - size * Math.cos(angle + Math.PI / 6), toY - size * Math.sin(angle + Math.PI / 6));\n ctx.closePath();\n ctx.fill();\n}\n\nexport class DateRange implements IDrawing {\n readonly id: string;\n readonly type = 'dateRange' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `dr_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const midY = (y1 + y2) / 2;\n const leftX = Math.min(x1, x2);\n const rightX = Math.max(x1, x2);\n const tickHalf = 10;\n const color = '#42a5f5';\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n\n // Horizontal arrow shaft\n ctx.beginPath();\n ctx.moveTo(leftX, midY);\n ctx.lineTo(rightX, midY);\n ctx.stroke();\n\n // Arrowheads\n drawArrowhead(ctx, rightX, midY, leftX, midY); // pointing left\n drawArrowhead(ctx, leftX, midY, rightX, midY); // pointing right\n\n // Vertical tick at x1\n ctx.beginPath();\n ctx.moveTo(x1, y1 - tickHalf);\n ctx.lineTo(x1, y1 + tickHalf);\n ctx.stroke();\n\n // Vertical tick at x2\n ctx.beginPath();\n ctx.moveTo(x2, y2 - tickHalf);\n ctx.lineTo(x2, y2 + tickHalf);\n ctx.stroke();\n\n // Label: bar count above the arrow\n const barCount = Math.abs(p2.barIndex - p1.barIndex);\n const label = `${barCount} bars`;\n const midX = (x1 + x2) / 2;\n const textW = ctx.measureText(label).width;\n\n ctx.fillStyle = color;\n ctx.fillText(label, midX - textW / 2, midY - 10);\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n const midY = (y1 + y2) / 2;\n const leftX = Math.min(x1, x2);\n const rightX = Math.max(x1, x2);\n return Math.abs(y - midY) <= HIT_TOLERANCE && x >= leftX && x <= rightX;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'ew-resize' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nfunction drawArrowhead(ctx: CanvasRenderingContext2D, fromX: number, fromY: number, toX: number, toY: number, size = 7): void {\n const angle = Math.atan2(toY - fromY, toX - fromX);\n ctx.beginPath();\n ctx.moveTo(toX, toY);\n ctx.lineTo(toX - size * Math.cos(angle - Math.PI / 6), toY - size * Math.sin(angle - Math.PI / 6));\n ctx.lineTo(toX - size * Math.cos(angle + Math.PI / 6), toY - size * Math.sin(angle + Math.PI / 6));\n ctx.closePath();\n ctx.fill();\n}\n\nexport class DatePriceRange implements IDrawing {\n readonly id: string;\n readonly type = 'datePriceRange' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `dpr_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n pricePrecision = 2,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const left = Math.min(x1, x2);\n const top = Math.min(y1, y2);\n const right = Math.max(x1, x2);\n const bottom = Math.max(y1, y2);\n const w = right - left;\n const h = bottom - top;\n const color = '#66bb6a';\n\n ctx.save();\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Light fill\n ctx.fillStyle = '#66bb6a12';\n ctx.fillRect(left, top, w, h);\n\n // Dashed border\n ctx.strokeStyle = color;\n ctx.setLineDash([5, 3]);\n ctx.strokeRect(left, top, w, h);\n ctx.setLineDash([]);\n\n // Diagonal arrow from p1 corner to p2 corner\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n drawArrowhead(ctx, x1, y1, x2, y2);\n\n // Price range label on the right side\n const priceRangeVal = Math.abs(p1.price - p2.price).toFixed(pricePrecision);\n const priceLabel = `\\u0394${priceRangeVal}`;\n ctx.fillStyle = color;\n ctx.fillText(priceLabel, right + 4, (top + bottom) / 2);\n\n // Bar count label at the bottom\n const barCount = Math.abs(p2.barIndex - p1.barIndex);\n const barLabel = `${barCount} bars`;\n const textW = ctx.measureText(barLabel).width;\n ctx.fillText(barLabel, left + w / 2 - textW / 2, bottom + 12);\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const left = Math.min(x1, x2) - HIT_TOLERANCE;\n const top = Math.min(y1, y2) - HIT_TOLERANCE;\n const right = Math.max(x1, x2) + HIT_TOLERANCE;\n const bottom = Math.max(y1, y2) + HIT_TOLERANCE;\n\n return x >= left && x <= right && y >= top && y <= bottom;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'nwse-resize' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class Ruler implements IDrawing {\n readonly id: string;\n readonly type = 'ruler' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `rul_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n pricePrecision = 2,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const color = '#ffb300';\n const angle = Math.atan2(y2 - y1, x2 - x1);\n const perpAngle = angle + Math.PI / 2;\n const tickLen = 8;\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n ctx.lineWidth = 2;\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n\n // Main line\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n // Perpendicular tick at p1\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.beginPath();\n ctx.moveTo(x1 - tickLen * Math.cos(perpAngle), y1 - tickLen * Math.sin(perpAngle));\n ctx.lineTo(x1 + tickLen * Math.cos(perpAngle), y1 + tickLen * Math.sin(perpAngle));\n ctx.stroke();\n\n // Perpendicular tick at p2\n ctx.beginPath();\n ctx.moveTo(x2 - tickLen * Math.cos(perpAngle), y2 - tickLen * Math.sin(perpAngle));\n ctx.lineTo(x2 + tickLen * Math.cos(perpAngle), y2 + tickLen * Math.sin(perpAngle));\n ctx.stroke();\n\n // Labels near midpoint\n const midX = (x1 + x2) / 2;\n const midY = (y1 + y2) / 2;\n const barDiff = Math.abs(p2.barIndex - p1.barIndex);\n const priceDiff = (p2.price - p1.price).toFixed(pricePrecision);\n const barLabel = `${barDiff} bars`;\n const priceLabel = `${priceDiff}`;\n\n // Offset labels perpendicular to the line\n const labelOffsetX = -12 * Math.sin(angle);\n const labelOffsetY = 12 * Math.cos(angle);\n\n ctx.fillStyle = color;\n ctx.fillText(barLabel, midX + labelOffsetX, midY + labelOffsetY - 12);\n ctx.fillText(priceLabel, midX + labelOffsetX, midY + labelOffsetY);\n\n // Anchor dots\n ctx.beginPath();\n ctx.arc(x1, y1, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.beginPath();\n ctx.arc(x2, y2, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n return pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\n/** Extend a ray from (ox,oy) in direction (dx,dy) to x = targetX, returning the endpoint. */\nfunction extendToX(ox: number, oy: number, dx: number, dy: number, targetX: number): [number, number] {\n if (dx === 0) return [ox, oy];\n const t = (targetX - ox) / dx;\n return [targetX, oy + t * dy];\n}\n\nexport class Pitchfork implements IDrawing {\n readonly id: string;\n readonly type = 'pitchfork' as const;\n readonly requiredPoints = 3;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `pfk_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n ctx.save();\n ctx.strokeStyle = '#ffa726';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n if (p3) {\n const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n // Midpoint of p2 and p3\n const midX = (x2 + x3) / 2;\n const midY = (y2 + y3) / 2;\n\n // Direction vector: from p1 to midpoint\n const dirX = midX - x1;\n const dirY = midY - y1;\n\n // Extend median line from p1 through midpoint to chartW\n const [medEndX, medEndY] = extendToX(x1, y1, dirX, dirY, chartW);\n\n // Draw handle: short line from p1 to midpoint\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(midX, midY);\n ctx.stroke();\n\n // Median line: from p1 extended to chartW\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(medEndX, medEndY);\n ctx.stroke();\n\n // Tine 1: from p2 extended rightward parallel to median direction\n const [tine1EndX, tine1EndY] = extendToX(x2, y2, dirX, dirY, chartW);\n ctx.beginPath();\n ctx.moveTo(x2, y2);\n ctx.lineTo(tine1EndX, tine1EndY);\n ctx.stroke();\n\n // Tine 2: from p3 extended rightward parallel to median direction\n const [tine2EndX, tine2EndY] = extendToX(x3, y3, dirX, dirY, chartW);\n ctx.beginPath();\n ctx.moveTo(x3, y3);\n ctx.lineTo(tine2EndX, tine2EndY);\n ctx.stroke();\n\n // Anchor dots\n if (isSelected) {\n ctx.fillStyle = '#ffa726';\n for (const [ax, ay] of [[x1, y1], [x2, y2], [x3, y3]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n } else {\n // Preview: just draw first segment\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 3) return false;\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n const midX = (x2 + x3) / 2;\n const midY = (y2 + y3) / 2;\n const dirX = midX - x1;\n const dirY = midY - y1;\n\n const [medEndX, medEndY] = extendToX(x1, y1, dirX, dirY, chartW);\n const [tine1EndX, tine1EndY] = extendToX(x2, y2, dirX, dirY, chartW);\n const [tine2EndX, tine2EndY] = extendToX(x3, y3, dirX, dirY, chartW);\n\n if (pointToSegmentDist(x, y, x1, y1, medEndX, medEndY) <= HIT_TOLERANCE) return true;\n if (pointToSegmentDist(x, y, x2, y2, tine1EndX, tine1EndY) <= HIT_TOLERANCE) return true;\n if (pointToSegmentDist(x, y, x3, y3, tine2EndX, tine2EndY) <= HIT_TOLERANCE) return true;\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n const candidates = this.points.map((p, i) => ({\n i,\n px: scale.xToPixel(p.barIndex, viewport, chartW),\n py: scale.yToPixel(p.price, priceRange, chartH),\n }));\n for (const { i, px, py } of candidates) {\n if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nfunction extendToX(ox: number, oy: number, dx: number, dy: number, targetX: number): [number, number] {\n if (dx === 0) return [ox, oy];\n const t = (targetX - ox) / dx;\n return [targetX, oy + t * dy];\n}\n\nexport class SchiffPitchfork implements IDrawing {\n readonly id: string;\n readonly type = 'schiffPitchfork' as const;\n readonly requiredPoints = 3;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `spfk_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n ctx.save();\n ctx.strokeStyle = '#ff7043';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n if (p3) {\n const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n // Schiff: median starts at midpoint of (p1, p2) instead of p1\n const pivotX = (x1 + x2) / 2;\n const pivotY = (y1 + y2) / 2;\n\n // Midpoint of p2 and p3 — median target\n const midX = (x2 + x3) / 2;\n const midY = (y2 + y3) / 2;\n\n // Direction from shifted pivot to mid(p2,p3)\n const dirX = midX - pivotX;\n const dirY = midY - pivotY;\n\n // Median line: from pivot extended to chartW\n const [medEndX, medEndY] = extendToX(pivotX, pivotY, dirX, dirY, chartW);\n\n // Draw handle: short line from pivot to midpoint\n ctx.beginPath();\n ctx.moveTo(pivotX, pivotY);\n ctx.lineTo(midX, midY);\n ctx.stroke();\n\n // Median line\n ctx.beginPath();\n ctx.moveTo(pivotX, pivotY);\n ctx.lineTo(medEndX, medEndY);\n ctx.stroke();\n\n // Tine 1: from p2 parallel to median direction\n const [tine1EndX, tine1EndY] = extendToX(x2, y2, dirX, dirY, chartW);\n ctx.beginPath();\n ctx.moveTo(x2, y2);\n ctx.lineTo(tine1EndX, tine1EndY);\n ctx.stroke();\n\n // Tine 2: from p3 parallel to median direction\n const [tine2EndX, tine2EndY] = extendToX(x3, y3, dirX, dirY, chartW);\n ctx.beginPath();\n ctx.moveTo(x3, y3);\n ctx.lineTo(tine2EndX, tine2EndY);\n ctx.stroke();\n\n // Anchor dots\n if (isSelected) {\n ctx.fillStyle = '#ff7043';\n for (const [ax, ay] of [[x1, y1], [x2, y2], [x3, y3]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n } else {\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 3) return false;\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n const pivotX = (x1 + x2) / 2;\n const pivotY = (y1 + y2) / 2;\n const midX = (x2 + x3) / 2;\n const midY = (y2 + y3) / 2;\n const dirX = midX - pivotX;\n const dirY = midY - pivotY;\n\n const [medEndX, medEndY] = extendToX(pivotX, pivotY, dirX, dirY, chartW);\n const [tine1EndX, tine1EndY] = extendToX(x2, y2, dirX, dirY, chartW);\n const [tine2EndX, tine2EndY] = extendToX(x3, y3, dirX, dirY, chartW);\n\n if (pointToSegmentDist(x, y, pivotX, pivotY, medEndX, medEndY) <= HIT_TOLERANCE) return true;\n if (pointToSegmentDist(x, y, x2, y2, tine1EndX, tine1EndY) <= HIT_TOLERANCE) return true;\n if (pointToSegmentDist(x, y, x3, y3, tine2EndX, tine2EndY) <= HIT_TOLERANCE) return true;\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n const candidates = this.points.map((p, i) => ({\n i,\n px: scale.xToPixel(p.barIndex, viewport, chartW),\n py: scale.yToPixel(p.price, priceRange, chartH),\n }));\n for (const { i, px, py } of candidates) {\n if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nfunction extendToX(ox: number, oy: number, dx: number, dy: number, targetX: number): [number, number] {\n if (dx === 0) return [ox, oy];\n const t = (targetX - ox) / dx;\n return [targetX, oy + t * dy];\n}\n\nexport class ModifiedSchiff implements IDrawing {\n readonly id: string;\n readonly type = 'modifiedSchiff' as const;\n readonly requiredPoints = 3;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `mspfk_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n ctx.save();\n ctx.strokeStyle = '#ef5350';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n if (p3) {\n const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n // Midpoint of p2 and p3\n const midX = (x2 + x3) / 2;\n const midY = (y2 + y3) / 2;\n\n // Modified Schiff: pivot = midpoint(p1, mid(p2, p3))\n const pivotX = (x1 + midX) / 2;\n const pivotY = (y1 + midY) / 2;\n\n // Direction from pivot to mid(p2,p3)\n const dirX = midX - pivotX;\n const dirY = midY - pivotY;\n\n // Median line: from pivot extended to chartW\n const [medEndX, medEndY] = extendToX(pivotX, pivotY, dirX, dirY, chartW);\n\n // Draw handle: pivot to midpoint\n ctx.beginPath();\n ctx.moveTo(pivotX, pivotY);\n ctx.lineTo(midX, midY);\n ctx.stroke();\n\n // Median line\n ctx.beginPath();\n ctx.moveTo(pivotX, pivotY);\n ctx.lineTo(medEndX, medEndY);\n ctx.stroke();\n\n // Tine 1: from p2 parallel to median direction\n const [tine1EndX, tine1EndY] = extendToX(x2, y2, dirX, dirY, chartW);\n ctx.beginPath();\n ctx.moveTo(x2, y2);\n ctx.lineTo(tine1EndX, tine1EndY);\n ctx.stroke();\n\n // Tine 2: from p3 parallel to median direction\n const [tine2EndX, tine2EndY] = extendToX(x3, y3, dirX, dirY, chartW);\n ctx.beginPath();\n ctx.moveTo(x3, y3);\n ctx.lineTo(tine2EndX, tine2EndY);\n ctx.stroke();\n\n // Anchor dots\n if (isSelected) {\n ctx.fillStyle = '#ef5350';\n for (const [ax, ay] of [[x1, y1], [x2, y2], [x3, y3]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n } else {\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 3) return false;\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n const midX = (x2 + x3) / 2;\n const midY = (y2 + y3) / 2;\n const pivotX = (x1 + midX) / 2;\n const pivotY = (y1 + midY) / 2;\n const dirX = midX - pivotX;\n const dirY = midY - pivotY;\n\n const [medEndX, medEndY] = extendToX(pivotX, pivotY, dirX, dirY, chartW);\n const [tine1EndX, tine1EndY] = extendToX(x2, y2, dirX, dirY, chartW);\n const [tine2EndX, tine2EndY] = extendToX(x3, y3, dirX, dirY, chartW);\n\n if (pointToSegmentDist(x, y, pivotX, pivotY, medEndX, medEndY) <= HIT_TOLERANCE) return true;\n if (pointToSegmentDist(x, y, x2, y2, tine1EndX, tine1EndY) <= HIT_TOLERANCE) return true;\n if (pointToSegmentDist(x, y, x3, y3, tine2EndX, tine2EndY) <= HIT_TOLERANCE) return true;\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n const candidates = this.points.map((p, i) => ({\n i,\n px: scale.xToPixel(p.barIndex, viewport, chartW),\n py: scale.yToPixel(p.price, priceRange, chartH),\n }));\n for (const { i, px, py } of candidates) {\n if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nfunction extendToX(ox: number, oy: number, dx: number, dy: number, targetX: number): [number, number] {\n if (dx === 0) return [ox, oy];\n const t = (targetX - ox) / dx;\n return [targetX, oy + t * dy];\n}\n\nexport class InsidePitchfork implements IDrawing {\n readonly id: string;\n readonly type = 'insidePitchfork' as const;\n readonly requiredPoints = 3;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `ipfk_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n ctx.save();\n ctx.strokeStyle = '#ab47bc';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n if (p3) {\n const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n // Midpoint of p2 and p3\n const midX = (x2 + x3) / 2;\n const midY = (y2 + y3) / 2;\n\n // Direction vector: from p1 to midpoint\n const dirX = midX - x1;\n const dirY = midY - y1;\n\n // 1. Handle: p1 to mid(p2,p3)\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(midX, midY);\n ctx.stroke();\n\n // 2. Median line: from p1 extended to chartW\n const [medEndX, medEndY] = extendToX(x1, y1, dirX, dirY, chartW);\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(medEndX, medEndY);\n ctx.stroke();\n\n // 3. Outer tine 1: from p2\n const [tine1EndX, tine1EndY] = extendToX(x2, y2, dirX, dirY, chartW);\n ctx.beginPath();\n ctx.moveTo(x2, y2);\n ctx.lineTo(tine1EndX, tine1EndY);\n ctx.stroke();\n\n // 4. Outer tine 2: from p3\n const [tine2EndX, tine2EndY] = extendToX(x3, y3, dirX, dirY, chartW);\n ctx.beginPath();\n ctx.moveTo(x3, y3);\n ctx.lineTo(tine2EndX, tine2EndY);\n ctx.stroke();\n\n // 5. Inner half-tines at 50% between median and each outer tine\n // Inner tine 1: halfway between p1 and p2 (x,y) as origin, parallel to median\n const inner1X = (x1 + x2) / 2;\n const inner1Y = (y1 + y2) / 2;\n const [inner1EndX, inner1EndY] = extendToX(inner1X, inner1Y, dirX, dirY, chartW);\n ctx.globalAlpha = 0.55;\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n ctx.moveTo(inner1X, inner1Y);\n ctx.lineTo(inner1EndX, inner1EndY);\n ctx.stroke();\n\n // Inner tine 2: halfway between p1 and p3\n const inner2X = (x1 + x3) / 2;\n const inner2Y = (y1 + y3) / 2;\n const [inner2EndX, inner2EndY] = extendToX(inner2X, inner2Y, dirX, dirY, chartW);\n ctx.beginPath();\n ctx.moveTo(inner2X, inner2Y);\n ctx.lineTo(inner2EndX, inner2EndY);\n ctx.stroke();\n\n ctx.setLineDash([]);\n ctx.globalAlpha = 1;\n\n // Anchor dots\n if (isSelected) {\n ctx.fillStyle = '#ab47bc';\n for (const [ax, ay] of [[x1, y1], [x2, y2], [x3, y3]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n } else {\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 3) return false;\n const [p1, p2, p3] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n const midX = (x2 + x3) / 2;\n const midY = (y2 + y3) / 2;\n const dirX = midX - x1;\n const dirY = midY - y1;\n\n const [medEndX, medEndY] = extendToX(x1, y1, dirX, dirY, chartW);\n const [tine1EndX, tine1EndY] = extendToX(x2, y2, dirX, dirY, chartW);\n const [tine2EndX, tine2EndY] = extendToX(x3, y3, dirX, dirY, chartW);\n\n if (pointToSegmentDist(x, y, x1, y1, medEndX, medEndY) <= HIT_TOLERANCE) return true;\n if (pointToSegmentDist(x, y, x2, y2, tine1EndX, tine1EndY) <= HIT_TOLERANCE) return true;\n if (pointToSegmentDist(x, y, x3, y3, tine2EndX, tine2EndY) <= HIT_TOLERANCE) return true;\n\n // Inner half-tines\n const inner1X = (x1 + x2) / 2;\n const inner1Y = (y1 + y2) / 2;\n const [inner1EndX, inner1EndY] = extendToX(inner1X, inner1Y, dirX, dirY, chartW);\n if (pointToSegmentDist(x, y, inner1X, inner1Y, inner1EndX, inner1EndY) <= HIT_TOLERANCE) return true;\n\n const inner2X = (x1 + x3) / 2;\n const inner2Y = (y1 + y3) / 2;\n const [inner2EndX, inner2EndY] = extendToX(inner2X, inner2Y, dirX, dirY, chartW);\n if (pointToSegmentDist(x, y, inner2X, inner2Y, inner2EndX, inner2EndY) <= HIT_TOLERANCE) return true;\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n const candidates = this.points.map((p, i) => ({\n i,\n px: scale.xToPixel(p.barIndex, viewport, chartW),\n py: scale.yToPixel(p.price, priceRange, chartH),\n }));\n for (const { i, px, py } of candidates) {\n if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nconst COLOR = '#64b5f6';\n\n// Bell-curve-like bar widths for 8 bars (values are relative fractions 0–1)\nconst BAR_WEIGHTS = [0.35, 0.55, 0.75, 1.0, 1.0, 0.75, 0.55, 0.35];\n\nexport class FixedRangeVP implements IDrawing {\n readonly id: string;\n readonly type = 'fixedRangeVP' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `frvp_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const rx = Math.min(x1, x2);\n const ry = Math.min(y1, y2);\n const rw = Math.abs(x2 - x1);\n const rh = Math.abs(y2 - y1);\n\n ctx.save();\n\n // Rectangle border\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.strokeRect(rx, ry, rw, rh);\n\n // Simulated volume histogram: 8 horizontal bars on the left side\n const numBars = BAR_WEIGHTS.length;\n const barH = rh / numBars;\n const maxBarW = rw * 0.6; // bars occupy up to 60% of rect width\n\n for (let i = 0; i < numBars; i++) {\n const barW = maxBarW * BAR_WEIGHTS[i];\n const barY = ry + i * barH;\n ctx.fillStyle = COLOR + '60';\n ctx.fillRect(rx, barY, barW, barH - 1);\n }\n\n // Label at top-left\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n ctx.fillStyle = COLOR;\n ctx.fillText('Volume Profile', rx + 4, ry + 13);\n\n // Corner handles when selected\n if (isSelected) {\n for (const [cx, cy] of [[x1, y1], [x2, y2]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(cx, cy, 3.5, 0, Math.PI * 2);\n ctx.fillStyle = COLOR;\n ctx.fill();\n }\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const rx = Math.min(x1, x2) - HIT_TOLERANCE;\n const ry = Math.min(y1, y2) - HIT_TOLERANCE;\n const rw = Math.abs(x2 - x1) + HIT_TOLERANCE * 2;\n const rh = Math.abs(y2 - y1) + HIT_TOLERANCE * 2;\n\n return x >= rx && x <= rx + rw && y >= ry && y <= ry + rh;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const handles: [number, number, number][] = [\n [0, scale.xToPixel(this.points[0].barIndex, viewport, chartW), scale.yToPixel(this.points[0].price, priceRange, chartH)],\n [1, scale.xToPixel(this.points[1].barIndex, viewport, chartW), scale.yToPixel(this.points[1].price, priceRange, chartH)],\n ];\n for (const [pi, hx, hy] of handles) {\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: pi, cursor: 'nwse-resize' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nconst COLOR = '#4db6ac';\n\n// Bell-curve-like bar widths for 8 bars (values are relative fractions 0–1)\nconst BAR_WEIGHTS = [0.35, 0.55, 0.75, 1.0, 1.0, 0.75, 0.55, 0.35];\n\nexport class AnchoredVP implements IDrawing {\n readonly id: string;\n readonly type = 'anchoredVP' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `avp_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const rx = Math.min(x1, x2);\n const ry = Math.min(y1, y2);\n const rw = Math.abs(x2 - x1);\n const rh = Math.abs(y2 - y1);\n\n ctx.save();\n\n // Rectangle border\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.strokeRect(rx, ry, rw, rh);\n\n // Simulated volume histogram: 8 horizontal bars on the left side\n const numBars = BAR_WEIGHTS.length;\n const barH = rh / numBars;\n const maxBarW = rw * 0.6;\n\n for (let i = 0; i < numBars; i++) {\n const barW = maxBarW * BAR_WEIGHTS[i];\n const barY = ry + i * barH;\n ctx.fillStyle = COLOR + '60';\n ctx.fillRect(rx, barY, barW, barH - 1);\n }\n\n // Label at top-left\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n ctx.fillStyle = COLOR;\n ctx.fillText('Anchored VP', rx + 4, ry + 13);\n\n // Anchor point indicator: small diamond at p1\n ctx.beginPath();\n ctx.arc(x1, y1, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = COLOR;\n ctx.fill();\n\n // Corner handles when selected\n if (isSelected) {\n for (const [cx, cy] of [[x1, y1], [x2, y2]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(cx, cy, 3.5, 0, Math.PI * 2);\n ctx.fillStyle = COLOR;\n ctx.fill();\n }\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const rx = Math.min(x1, x2) - HIT_TOLERANCE;\n const ry = Math.min(y1, y2) - HIT_TOLERANCE;\n const rw = Math.abs(x2 - x1) + HIT_TOLERANCE * 2;\n const rh = Math.abs(y2 - y1) + HIT_TOLERANCE * 2;\n\n return x >= rx && x <= rx + rw && y >= ry && y <= ry + rh;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const handles: [number, number, number][] = [\n [0, scale.xToPixel(this.points[0].barIndex, viewport, chartW), scale.yToPixel(this.points[0].price, priceRange, chartH)],\n [1, scale.xToPixel(this.points[1].barIndex, viewport, chartW), scale.yToPixel(this.points[1].price, priceRange, chartH)],\n ];\n for (const [pi, hx, hy] of handles) {\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: pi, cursor: 'nwse-resize' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nconst COLOR = '#26a69a';\n\n// Bell-curve-like bar widths for 10 bars (values are relative fractions 0–1)\nconst BAR_WEIGHTS = [0.25, 0.45, 0.65, 0.85, 1.0, 1.0, 0.85, 0.65, 0.45, 0.25];\n\nexport class VolumeProfile implements IDrawing {\n readonly id: string;\n readonly type = 'volumeProfile' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `vp_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const rx = Math.min(x1, x2);\n const ry = Math.min(y1, y2);\n const rw = Math.abs(x2 - x1);\n const rh = Math.abs(y2 - y1);\n\n ctx.save();\n\n // Rectangle border\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.strokeRect(rx, ry, rw, rh);\n\n // Simulated volume histogram: 10 horizontal bars on the left side\n const numBars = BAR_WEIGHTS.length;\n const barH = rh / numBars;\n const maxBarW = rw * 0.6;\n\n for (let i = 0; i < numBars; i++) {\n const barW = maxBarW * BAR_WEIGHTS[i];\n const barY = ry + i * barH;\n ctx.fillStyle = COLOR + '55';\n ctx.fillRect(rx, barY, barW, barH - 1);\n }\n\n // Label at top-left\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n ctx.fillStyle = COLOR;\n ctx.fillText('Volume Profile', rx + 4, ry + 13);\n\n // Corner handles when selected\n if (isSelected) {\n for (const [cx, cy] of [[x1, y1], [x2, y2]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(cx, cy, 3.5, 0, Math.PI * 2);\n ctx.fillStyle = COLOR;\n ctx.fill();\n }\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const rx = Math.min(x1, x2) - HIT_TOLERANCE;\n const ry = Math.min(y1, y2) - HIT_TOLERANCE;\n const rw = Math.abs(x2 - x1) + HIT_TOLERANCE * 2;\n const rh = Math.abs(y2 - y1) + HIT_TOLERANCE * 2;\n\n return x >= rx && x <= rx + rw && y >= ry && y <= ry + rh;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const handles: [number, number, number][] = [\n [0, scale.xToPixel(this.points[0].barIndex, viewport, chartW), scale.yToPixel(this.points[0].price, priceRange, chartH)],\n [1, scale.xToPixel(this.points[1].barIndex, viewport, chartW), scale.yToPixel(this.points[1].price, priceRange, chartH)],\n ];\n for (const [pi, hx, hy] of handles) {\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: pi, cursor: 'nwse-resize' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class RegressionTrend implements IDrawing {\n readonly id: string;\n readonly type = 'regressionTrend' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `reg_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const color = '#26c6da';\n\n // Perpendicular unit vector for the ±20px offset channels\n const lineLen = Math.hypot(x2 - x1, y2 - y1) || 1;\n const perpX = -(y2 - y1) / lineLen;\n const perpY = (x2 - x1) / lineLen;\n const offset = 20;\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Main diagonal line (solid)\n ctx.setLineDash([]);\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n // Upper channel at +20px perpendicular offset (dashed)\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n ctx.moveTo(x1 + perpX * offset, y1 + perpY * offset);\n ctx.lineTo(x2 + perpX * offset, y2 + perpY * offset);\n ctx.stroke();\n\n // Lower channel at -20px perpendicular offset (dashed)\n ctx.beginPath();\n ctx.moveTo(x1 - perpX * offset, y1 - perpY * offset);\n ctx.lineTo(x2 - perpX * offset, y2 - perpY * offset);\n ctx.stroke();\n\n ctx.setLineDash([]);\n\n // Anchor dots at p1 and p2\n ctx.beginPath();\n ctx.arc(x1, y1, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.beginPath();\n ctx.arc(x2, y2, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n return pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\nconst PLACEHOLDER = 'Text';\nconst PAD = 4;\n\nexport class Text implements IDrawing {\n readonly id: string;\n readonly type = 'text' as const;\n points: DrawingPoint[];\n complete: boolean;\n text: string = '';\n\n constructor(point: DrawingPoint) {\n this.id = `txt_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [point];\n this.complete = true;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n const x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n const y = scale.yToPixel(this.points[0].price, priceRange, chartH);\n\n ctx.save();\n ctx.font = '13px system-ui, sans-serif';\n ctx.textBaseline = 'top';\n\n const label = this.text || PLACEHOLDER;\n const isPlaceholder = !this.text;\n const textW = ctx.measureText(label).width;\n\n if (isSelected) {\n ctx.strokeStyle = '#2196f3';\n ctx.lineWidth = 1;\n ctx.strokeRect(x - 2, y - 2, textW + PAD * 2, 16 + 4);\n }\n\n ctx.fillStyle = isPlaceholder ? '#888' : '#f5f5f5';\n ctx.fillText(label, x + PAD, y);\n\n if (isSelected) {\n ctx.strokeStyle = '#f5f5f5';\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(x, y + 16);\n ctx.lineTo(x + textW + PAD * 2, y + 16);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n const ax = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n const ay = scale.yToPixel(this.points[0].price, priceRange, chartH);\n // Use a conservative fixed width for hit-testing (avoids needing ctx here)\n const approxW = Math.max(40, (this.text?.length ?? 4) * 8);\n return (\n x >= ax - HIT_TOLERANCE &&\n x <= ax + approxW + HIT_TOLERANCE &&\n y >= ay - HIT_TOLERANCE &&\n y <= ay + 16 + HIT_TOLERANCE\n );\n }\n\n getHandle(): DrawingHandle | null {\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nconst BOX_H = 24;\nconst RADIUS = 8;\nconst PAD_H = 12; // horizontal padding inside box\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nfunction roundedRect(ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, r: number): void {\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + w - r, y);\n ctx.arcTo(x + w, y, x + w, y + r, r);\n ctx.lineTo(x + w, y + h - r);\n ctx.arcTo(x + w, y + h, x + w - r, y + h, r);\n ctx.lineTo(x + r, y + h);\n ctx.arcTo(x, y + h, x, y + h - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n}\n\nexport class Callout implements IDrawing {\n readonly id: string;\n readonly type = 'callout' as const;\n points: DrawingPoint[];\n complete: boolean;\n text: string = '';\n\n constructor(first: DrawingPoint) {\n this.id = `cal_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n private getBoxW(ctx: CanvasRenderingContext2D): number {\n const label = this.text || 'Note';\n return Math.max(60, ctx.measureText(label).width + PAD_H * 2);\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const tipX = scale.xToPixel(p1.barIndex, viewport, chartW);\n const tipY = scale.yToPixel(p1.price, priceRange, chartH);\n const boxX = scale.xToPixel(p2.barIndex, viewport, chartW);\n const boxY = scale.yToPixel(p2.price, priceRange, chartH);\n\n ctx.save();\n ctx.font = '11px system-ui, sans-serif';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n const boxW = this.getBoxW(ctx);\n const bx = boxX - boxW / 2;\n const by = boxY - BOX_H / 2;\n\n // Find nearest edge point of the box to draw the pointer line\n const clampedX = Math.max(bx, Math.min(bx + boxW, tipX));\n const clampedY = Math.max(by, Math.min(by + BOX_H, tipY));\n const edgeX = tipX < bx ? bx : tipX > bx + boxW ? bx + boxW : clampedX;\n const edgeY = tipY < by ? by : tipY > by + BOX_H ? by + BOX_H : clampedY;\n\n // Pointer line\n ctx.strokeStyle = '#546e7a';\n ctx.beginPath();\n ctx.moveTo(edgeX, edgeY);\n ctx.lineTo(tipX, tipY);\n ctx.stroke();\n\n // Small dot at tip\n ctx.fillStyle = '#546e7a';\n ctx.beginPath();\n ctx.arc(tipX, tipY, 3, 0, Math.PI * 2);\n ctx.fill();\n\n // Rounded box background\n roundedRect(ctx, bx, by, boxW, BOX_H, RADIUS);\n ctx.fillStyle = '#37474f';\n ctx.fill();\n ctx.strokeStyle = '#546e7a';\n ctx.stroke();\n\n // Text\n const label = this.text || 'Note';\n const isPlaceholder = !this.text;\n ctx.fillStyle = isPlaceholder ? '#888' : '#f5f5f5';\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillText(label, boxX, boxY);\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const tipX = scale.xToPixel(p1.barIndex, viewport, chartW);\n const tipY = scale.yToPixel(p1.price, priceRange, chartH);\n const boxX = scale.xToPixel(p2.barIndex, viewport, chartW);\n const boxY = scale.yToPixel(p2.price, priceRange, chartH);\n const approxBoxW = Math.max(60, (this.text?.length ?? 4) * 7 + 24);\n const bx = boxX - approxBoxW / 2;\n const by = boxY - BOX_H / 2;\n\n // Hit on box\n if (x >= bx - HIT_TOLERANCE && x <= bx + approxBoxW + HIT_TOLERANCE &&\n y >= by - HIT_TOLERANCE && y <= by + BOX_H + HIT_TOLERANCE) {\n return true;\n }\n\n // Find nearest edge point (same logic as render)\n const edgeX = tipX < bx ? bx : tipX > bx + approxBoxW ? bx + approxBoxW : Math.max(bx, Math.min(bx + approxBoxW, tipX));\n const edgeY = tipY < by ? by : tipY > by + BOX_H ? by + BOX_H : Math.max(by, Math.min(by + BOX_H, tipY));\n\n // Hit on pointer line\n if (pointToSegmentDist(x, y, edgeX, edgeY, tipX, tipY) <= HIT_TOLERANCE) {\n return true;\n }\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n const cursors: string[] = ['grab', 'move'];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 4) {\n return { pointIndex: i, cursor: cursors[i] };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nconst BADGE_W = 60;\nconst BADGE_H = 18;\nconst ARROW_W = 7; // width of the left triangle pointer\n\nexport class PriceLabel implements IDrawing {\n readonly id: string;\n readonly type = 'priceLabel' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(point: DrawingPoint) {\n this.id = `plbl_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [point];\n this.complete = true;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n pricePrecision = 2,\n ): void {\n const x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n const y = scale.yToPixel(this.points[0].price, priceRange, chartH);\n const price = this.points[0].price;\n\n ctx.save();\n\n // Triangle pointer pointing left\n ctx.fillStyle = '#26a69a';\n ctx.beginPath();\n ctx.moveTo(x, y); // tip of arrow (left-most)\n ctx.lineTo(x + ARROW_W, y - BADGE_H / 2);\n ctx.lineTo(x + ARROW_W, y + BADGE_H / 2);\n ctx.closePath();\n ctx.fill();\n\n // Pill badge to the right of the arrow\n const bx = x + ARROW_W;\n const by = y - BADGE_H / 2;\n ctx.fillStyle = '#26a69a';\n ctx.beginPath();\n ctx.roundRect(bx, by, BADGE_W, BADGE_H, BADGE_H / 2);\n ctx.fill();\n\n // Selection outline\n if (isSelected) {\n ctx.strokeStyle = '#80cbc4';\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.roundRect(bx - 2, by - 2, BADGE_W + 4, BADGE_H + 4, BADGE_H / 2 + 2);\n ctx.stroke();\n }\n\n // Price text\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n ctx.fillStyle = '#ffffff';\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillText(price.toFixed(pricePrecision), bx + BADGE_W / 2, y);\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n const ax = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n const ay = scale.yToPixel(this.points[0].price, priceRange, chartH);\n const bx = ax + ARROW_W;\n const by = ay - BADGE_H / 2;\n return (\n x >= ax - HIT_TOLERANCE &&\n x <= bx + BADGE_W + HIT_TOLERANCE &&\n y >= by - HIT_TOLERANCE &&\n y <= by + BADGE_H + HIT_TOLERANCE\n );\n }\n\n getHandle(): DrawingHandle | null {\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class ArrowMarker implements IDrawing {\n readonly id: string;\n readonly type = 'arrowMarker' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `arw_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n ctx.save();\n ctx.strokeStyle = '#ef5350';\n ctx.fillStyle = '#ef5350';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Line from tail to tip\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n // Arrowhead at p2 (tip)\n const angle = Math.atan2(y2 - y1, x2 - x1);\n const size = 10;\n ctx.beginPath();\n ctx.moveTo(x2, y2);\n ctx.lineTo(x2 - size * Math.cos(angle - Math.PI / 6), y2 - size * Math.sin(angle - Math.PI / 6));\n ctx.lineTo(x2 - size * Math.cos(angle + Math.PI / 6), y2 - size * Math.sin(angle + Math.PI / 6));\n ctx.closePath();\n ctx.fill();\n\n // Anchor dots when selected\n if (isSelected) {\n for (const [cx, cy] of [[x1, y1], [x2, y2]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(cx, cy, 4, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n return pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nexport class Flag implements IDrawing {\n readonly id: string;\n readonly type = 'flag' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(point: DrawingPoint) {\n this.id = `flag_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [point];\n this.complete = true;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n _isSelected: boolean,\n ): void {\n const x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n const y = scale.yToPixel(this.points[0].price, priceRange, chartH);\n\n ctx.save();\n ctx.strokeStyle = '#ef5350';\n ctx.fillStyle = '#ef5350';\n ctx.lineWidth = 1.5;\n\n // Vertical flagpole: from (x, y+20) up to (x, y-10)\n ctx.beginPath();\n ctx.moveTo(x, y + 20);\n ctx.lineTo(x, y - 10);\n ctx.stroke();\n\n // Flag rectangle: 16px wide × 10px tall at top of pole\n const flagX = x;\n const flagY = y - 10;\n ctx.fillRect(flagX, flagY, 16, 10);\n\n // Text \"F\" in white inside the flag\n ctx.font = '8px system-ui, sans-serif';\n ctx.fillStyle = '#ffffff';\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillText('F', flagX + 8, flagY + 5);\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n const ax = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n const ay = scale.yToPixel(this.points[0].price, priceRange, chartH);\n return Math.hypot(x - ax, y - ay) <= 20;\n }\n\n getHandle(): DrawingHandle | null {\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nconst BADGE_H = 16;\nconst BADGE_PADDING_X = 6;\nconst TICK_HALF = 10; // half-width of the tick mark\n\nexport class PriceNote implements IDrawing {\n readonly id: string;\n readonly type = 'priceNote' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(point: DrawingPoint) {\n this.id = `pnote_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [point];\n this.complete = true;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n _isSelected: boolean,\n pricePrecision = 2,\n ): void {\n const x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n const y = scale.yToPixel(this.points[0].price, priceRange, chartH);\n const price = this.points[0].price;\n const label = price.toFixed(pricePrecision);\n\n ctx.save();\n\n // Horizontal tick mark: x-10 to x+10\n ctx.strokeStyle = '#ffa726';\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.moveTo(x - TICK_HALF, y);\n ctx.lineTo(x + TICK_HALF, y);\n ctx.stroke();\n\n // Measure text for badge width\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n const tw = ctx.measureText(label).width;\n const badgeW = tw + BADGE_PADDING_X * 2;\n\n // Badge rectangle to the right of the tick\n const bx = x + TICK_HALF + 2;\n const by = y - BADGE_H / 2;\n ctx.fillStyle = '#ffa726';\n ctx.beginPath();\n ctx.roundRect(bx, by, badgeW, BADGE_H, 3);\n ctx.fill();\n\n // Price text in badge\n ctx.fillStyle = '#ffffff';\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillText(label, bx + badgeW / 2, y);\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n const ax = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n const ay = scale.yToPixel(this.points[0].price, priceRange, chartH);\n // Check near the tick mark\n return (\n x >= ax - TICK_HALF - HIT_TOLERANCE &&\n x <= ax + TICK_HALF + HIT_TOLERANCE &&\n Math.abs(y - ay) <= HIT_TOLERANCE\n );\n }\n\n getHandle(): DrawingHandle | null {\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nconst BADGE_H = 20;\nconst PAD_H = 10; // horizontal padding inside badge\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class AnchoredNote implements IDrawing {\n readonly id: string;\n readonly type = 'anchoredNote' as const;\n points: DrawingPoint[];\n complete: boolean;\n text: string = '';\n\n constructor(first: DrawingPoint) {\n this.id = `anote_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n private getBadgeW(ctx: CanvasRenderingContext2D): number {\n const label = this.text || 'Note';\n return Math.max(50, ctx.measureText(label).width + PAD_H * 2);\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n ctx.save();\n ctx.font = '11px system-ui, sans-serif';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n const badgeW = this.getBadgeW(ctx);\n const bx = x2 - badgeW / 2;\n const by = y2 - BADGE_H / 2;\n\n // Dashed line from anchor (p1) to note position (p2)\n ctx.strokeStyle = '#42a5f5';\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Small dot at anchor\n ctx.fillStyle = '#42a5f5';\n ctx.beginPath();\n ctx.arc(x1, y1, 3, 0, Math.PI * 2);\n ctx.fill();\n\n // Badge background\n ctx.fillStyle = '#37474f';\n ctx.beginPath();\n ctx.roundRect(bx, by, badgeW, BADGE_H, 4);\n ctx.fill();\n\n // Badge border\n ctx.strokeStyle = '#42a5f5';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.beginPath();\n ctx.roundRect(bx, by, badgeW, BADGE_H, 4);\n ctx.stroke();\n\n // Badge text\n const label = this.text || 'Note';\n const isPlaceholder = !this.text;\n ctx.fillStyle = isPlaceholder ? '#888' : '#f5f5f5';\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillText(label, x2, y2);\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n const approxBadgeW = Math.max(50, (this.text?.length ?? 4) * 7 + 20);\n const bx = x2 - approxBadgeW / 2;\n const by = y2 - BADGE_H / 2;\n\n // Near the badge\n if (x >= bx - HIT_TOLERANCE && x <= bx + approxBadgeW + HIT_TOLERANCE &&\n y >= by - HIT_TOLERANCE && y <= by + BADGE_H + HIT_TOLERANCE) {\n return true;\n }\n\n // Near the dashed line\n if (pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE) {\n return true;\n }\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n const cursors: string[] = ['grab', 'move'];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 4) {\n return { pointIndex: i, cursor: cursors[i] };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nexport class ArrowUp implements IDrawing {\n readonly id: string;\n readonly type = 'arrowUp' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(point: DrawingPoint) {\n this.id = `awup_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [point];\n this.complete = true;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n _isSelected: boolean,\n ): void {\n const x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n const y = scale.yToPixel(this.points[0].price, priceRange, chartH);\n\n ctx.save();\n ctx.strokeStyle = '#26a69a';\n ctx.fillStyle = '#26a69a';\n ctx.lineWidth = 1.5;\n\n // Vertical line from (x, y+10) to (x, y-2)\n ctx.beginPath();\n ctx.moveTo(x, y + 10);\n ctx.lineTo(x, y - 2);\n ctx.stroke();\n\n // Arrowhead pointing up: triangle at top (x, y-10)\n const tipX = x;\n const tipY = y - 10;\n const halfBase = 6;\n ctx.beginPath();\n ctx.moveTo(tipX, tipY);\n ctx.lineTo(tipX - halfBase, tipY + 10);\n ctx.lineTo(tipX + halfBase, tipY + 10);\n ctx.closePath();\n ctx.fill();\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n const ax = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n const ay = scale.yToPixel(this.points[0].price, priceRange, chartH);\n return Math.hypot(x - ax, y - ay) <= 12;\n }\n\n getHandle(): DrawingHandle | null {\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nexport class ArrowDown implements IDrawing {\n readonly id: string;\n readonly type = 'arrowDown' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(point: DrawingPoint) {\n this.id = `awdn_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [point];\n this.complete = true;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n _isSelected: boolean,\n ): void {\n const x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n const y = scale.yToPixel(this.points[0].price, priceRange, chartH);\n\n ctx.save();\n ctx.strokeStyle = '#ef5350';\n ctx.fillStyle = '#ef5350';\n ctx.lineWidth = 1.5;\n\n // Vertical line from (x, y-10) to (x, y+2)\n ctx.beginPath();\n ctx.moveTo(x, y - 10);\n ctx.lineTo(x, y + 2);\n ctx.stroke();\n\n // Arrowhead pointing down: triangle at bottom (x, y+10)\n const tipX = x;\n const tipY = y + 10;\n const halfBase = 6;\n ctx.beginPath();\n ctx.moveTo(tipX, tipY);\n ctx.lineTo(tipX - halfBase, tipY - 10);\n ctx.lineTo(tipX + halfBase, tipY - 10);\n ctx.closePath();\n ctx.fill();\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n const ax = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n const ay = scale.yToPixel(this.points[0].price, priceRange, chartH);\n return Math.hypot(x - ax, y - ay) <= 12;\n }\n\n getHandle(): DrawingHandle | null {\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst COLOR = '#ff7043';\n\nexport class HeadShoulders implements IDrawing {\n readonly id: string;\n readonly type = 'headShoulders' as const;\n readonly requiredPoints = 5;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `hs_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n // Labels: [LS, H, RS, L1, L2]\n // Points: 0=LS, 1=H, 2=RS, 3=L1, 4=L2\n const labels = ['LS', 'H', 'RS', 'L1', 'L2'];\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n ctx.save();\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Main pattern segments: LS(0)→L1(3)→H(1)→L2(4)→RS(2)\n // Only draw segments for points that exist\n // We'll draw the zigzag path based on available points\n const zigzagOrder = [0, 3, 1, 4, 2];\n const availableZigzag = zigzagOrder.filter(i => i < n);\n\n if (availableZigzag.length >= 2) {\n ctx.beginPath();\n ctx.moveTo(px[availableZigzag[0]], py[availableZigzag[0]]);\n for (let i = 1; i < availableZigzag.length; i++) {\n ctx.lineTo(px[availableZigzag[i]], py[availableZigzag[i]]);\n }\n ctx.stroke();\n }\n\n // Fill the pattern lightly when complete\n if (this.complete && n === 5) {\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n ctx.lineTo(px[3], py[3]);\n ctx.lineTo(px[1], py[1]);\n ctx.lineTo(px[4], py[4]);\n ctx.lineTo(px[2], py[2]);\n ctx.closePath();\n ctx.fillStyle = COLOR + '10';\n ctx.fill();\n }\n\n // Neckline: dashed line from L1(3) to L2(4) — only when both exist\n if (n >= 5) {\n ctx.save();\n ctx.setLineDash([5, 4]);\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.beginPath();\n ctx.moveTo(px[3], py[3]);\n ctx.lineTo(px[4], py[4]);\n ctx.stroke();\n ctx.restore();\n }\n\n // Vertex dots and labels\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n ctx.fillStyle = COLOR;\n for (let i = 0; i < n; i++) {\n ctx.beginPath();\n ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n // Check zigzag segments: LS(0)→L1(3)→H(1)→L2(4)→RS(2)\n const zigzagOrder = [0, 3, 1, 4, 2];\n const availableZigzag = zigzagOrder.filter(i => i < n);\n for (let i = 0; i < availableZigzag.length - 1; i++) {\n const a = availableZigzag[i];\n const b = availableZigzag[i + 1];\n if (pointToSegmentDist(x, y, px[a], py[a], px[b], py[b]) <= HIT_TOLERANCE) return true;\n }\n\n // Check neckline\n if (n >= 5 && pointToSegmentDist(x, y, px[3], py[3], px[4], py[4]) <= HIT_TOLERANCE) return true;\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length !== this.requiredPoints) return null;\n for (let i = 0; i < this.points.length; i++) {\n const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst COLOR = '#ffa726';\n\nexport class TrianglePattern implements IDrawing {\n readonly id: string;\n readonly type = 'trianglePattern' as const;\n readonly requiredPoints = 5;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `tpat_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n // Points: 0=1, 1=2, 2=3, 3=4, 4=5\n const labels = ['1', '2', '3', '4', '5'];\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n ctx.save();\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Main path: 1→2→3→4→5\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n for (let i = 1; i < n; i++) {\n ctx.lineTo(px[i], py[i]);\n }\n ctx.stroke();\n\n // Dashed upper trendline: 1(0)→3(2)→5(4)\n if (n >= 3) {\n ctx.save();\n ctx.setLineDash([5, 4]);\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n ctx.lineTo(px[2], py[2]);\n if (n >= 5) ctx.lineTo(px[4], py[4]);\n ctx.stroke();\n ctx.restore();\n }\n\n // Dashed lower trendline: 2(1)→4(3)\n if (n >= 4) {\n ctx.save();\n ctx.setLineDash([5, 4]);\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.beginPath();\n ctx.moveTo(px[1], py[1]);\n ctx.lineTo(px[3], py[3]);\n ctx.stroke();\n ctx.restore();\n }\n\n // Vertex dots and labels\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n ctx.fillStyle = COLOR;\n for (let i = 0; i < n; i++) {\n ctx.beginPath();\n ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillText(labels[i] ?? String(i + 1), px[i] + 5, py[i] - 5);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n // Check main path segments\n for (let i = 0; i < n - 1; i++) {\n if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n }\n\n // Check upper trendline segments 1→3, 3→5\n if (n >= 3 && pointToSegmentDist(x, y, px[0], py[0], px[2], py[2]) <= HIT_TOLERANCE) return true;\n if (n >= 5 && pointToSegmentDist(x, y, px[2], py[2], px[4], py[4]) <= HIT_TOLERANCE) return true;\n\n // Check lower trendline 2→4\n if (n >= 4 && pointToSegmentDist(x, y, px[1], py[1], px[3], py[3]) <= HIT_TOLERANCE) return true;\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length !== this.requiredPoints) return null;\n for (let i = 0; i < this.points.length; i++) {\n const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst COLOR = '#66bb6a';\n\nexport class ThreeDrives implements IDrawing {\n readonly id: string;\n readonly type = 'threeDrives' as const;\n readonly requiredPoints = 7;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `td_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n // Labels: O=origin, A=first drive, B=retracement, C=second drive, D=retracement, E=third drive, F=end\n const labels = ['O', 'A', 'B', 'C', 'D', 'E', 'F'];\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n ctx.save();\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Draw all connected segments in order\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n for (let i = 1; i < n; i++) {\n ctx.lineTo(px[i], py[i]);\n }\n ctx.stroke();\n\n // Light fill between the zigzag when complete\n if (this.complete && n === 7) {\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n for (let i = 1; i < n; i++) {\n ctx.lineTo(px[i], py[i]);\n }\n ctx.closePath();\n ctx.fillStyle = COLOR + '18';\n ctx.fill();\n }\n\n // Vertex dots and labels\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n ctx.fillStyle = COLOR;\n for (let i = 0; i < n; i++) {\n ctx.beginPath();\n ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n for (let i = 0; i < n - 1; i++) {\n if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length !== this.requiredPoints) return null;\n for (let i = 0; i < this.points.length; i++) {\n const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst COLOR = '#42a5f5';\n\nexport class AbcdPattern implements IDrawing {\n readonly id: string;\n readonly type = 'abcdPattern' as const;\n readonly requiredPoints = 4;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `abcd_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const labels = ['A', 'B', 'C', 'D'];\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n ctx.save();\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Main zigzag: A→B→C→D\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n for (let i = 1; i < n; i++) {\n ctx.lineTo(px[i], py[i]);\n }\n ctx.stroke();\n\n // Dotted line from A(0) to D(3) to show the full range\n if (n >= 4) {\n ctx.save();\n ctx.setLineDash([3, 4]);\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n ctx.lineTo(px[3], py[3]);\n ctx.stroke();\n ctx.restore();\n }\n\n // Vertex dots and labels\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n ctx.fillStyle = COLOR;\n for (let i = 0; i < n; i++) {\n ctx.beginPath();\n ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n for (let i = 0; i < n - 1; i++) {\n if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n }\n\n // Check A→D dotted line\n if (n >= 4 && pointToSegmentDist(x, y, px[0], py[0], px[3], py[3]) <= HIT_TOLERANCE) return true;\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length !== this.requiredPoints) return null;\n for (let i = 0; i < this.points.length; i++) {\n const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst COLOR = '#ab47bc';\n\nexport class CypherPattern implements IDrawing {\n readonly id: string;\n readonly type = 'cypherPattern' as const;\n readonly requiredPoints = 5;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `cyp_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const labels = ['X', 'A', 'B', 'C', 'D'];\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n ctx.save();\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Main zigzag: X→A→B→C→D\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n for (let i = 1; i < n; i++) {\n ctx.lineTo(px[i], py[i]);\n }\n ctx.stroke();\n\n // Light fill under the pattern when complete\n if (this.complete && n === 5) {\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n for (let i = 1; i < n; i++) {\n ctx.lineTo(px[i], py[i]);\n }\n ctx.closePath();\n ctx.fillStyle = COLOR + '12';\n ctx.fill();\n }\n\n // Vertex dots and labels\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n ctx.fillStyle = COLOR;\n for (let i = 0; i < n; i++) {\n ctx.beginPath();\n ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n for (let i = 0; i < n - 1; i++) {\n if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length !== this.requiredPoints) return null;\n for (let i = 0; i < this.points.length; i++) {\n const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst COLOR = '#ec407a';\n\nexport class ButterflyPattern implements IDrawing {\n readonly id: string;\n readonly type = 'butterflyPattern' as const;\n readonly requiredPoints = 5;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `bfly_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const labels = ['X', 'A', 'B', 'C', 'D'];\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n ctx.save();\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Main zigzag: X→A→B→C→D\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n for (let i = 1; i < n; i++) {\n ctx.lineTo(px[i], py[i]);\n }\n ctx.stroke();\n\n // Dashed XD line (completion zone) — only when both X(0) and D(4) exist\n if (n >= 5) {\n ctx.save();\n ctx.setLineDash([5, 4]);\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n ctx.lineTo(px[4], py[4]);\n ctx.stroke();\n ctx.restore();\n }\n\n // Vertex dots and labels\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n ctx.fillStyle = COLOR;\n for (let i = 0; i < n; i++) {\n ctx.beginPath();\n ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n for (let i = 0; i < n - 1; i++) {\n if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n }\n\n // Check XD dashed line\n if (n >= 5 && pointToSegmentDist(x, y, px[0], py[0], px[4], py[4]) <= HIT_TOLERANCE) return true;\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length !== this.requiredPoints) return null;\n for (let i = 0; i < this.points.length; i++) {\n const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst COLOR = '#26a69a';\n\nexport class BatPattern implements IDrawing {\n readonly id: string;\n readonly type = 'batPattern' as const;\n readonly requiredPoints = 5;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `bat_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const labels = ['X', 'A', 'B', 'C', 'D'];\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n ctx.save();\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Main zigzag: X→A→B→C→D\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n for (let i = 1; i < n; i++) {\n ctx.lineTo(px[i], py[i]);\n }\n ctx.stroke();\n\n // Dashed XD line\n if (n >= 5) {\n ctx.save();\n ctx.setLineDash([5, 4]);\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n ctx.lineTo(px[4], py[4]);\n ctx.stroke();\n ctx.restore();\n }\n\n // Vertex dots and labels\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n ctx.fillStyle = COLOR;\n for (let i = 0; i < n; i++) {\n ctx.beginPath();\n ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n for (let i = 0; i < n - 1; i++) {\n if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n }\n\n // Check XD dashed line\n if (n >= 5 && pointToSegmentDist(x, y, px[0], py[0], px[4], py[4]) <= HIT_TOLERANCE) return true;\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length !== this.requiredPoints) return null;\n for (let i = 0; i < this.points.length; i++) {\n const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst COLOR = '#7986cb';\n\nexport class GartleyPattern implements IDrawing {\n readonly id: string;\n readonly type = 'gartleyPattern' as const;\n readonly requiredPoints = 5;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `gart_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const labels = ['X', 'A', 'B', 'C', 'D'];\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n ctx.save();\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Main zigzag: X→A→B→C→D\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n for (let i = 1; i < n; i++) {\n ctx.lineTo(px[i], py[i]);\n }\n ctx.stroke();\n\n // Dashed XD line\n if (n >= 5) {\n ctx.save();\n ctx.setLineDash([5, 4]);\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n ctx.lineTo(px[4], py[4]);\n ctx.stroke();\n ctx.restore();\n }\n\n // Vertex dots and labels\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n ctx.fillStyle = COLOR;\n for (let i = 0; i < n; i++) {\n ctx.beginPath();\n ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n for (let i = 0; i < n - 1; i++) {\n if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n }\n\n // Check XD dashed line\n if (n >= 5 && pointToSegmentDist(x, y, px[0], py[0], px[4], py[4]) <= HIT_TOLERANCE) return true;\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length !== this.requiredPoints) return null;\n for (let i = 0; i < this.points.length; i++) {\n const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst COLOR = '#ef5350';\n\nexport class CrabPattern implements IDrawing {\n readonly id: string;\n readonly type = 'crabPattern' as const;\n readonly requiredPoints = 5;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `crab_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const labels = ['X', 'A', 'B', 'C', 'D'];\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n ctx.save();\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Main zigzag: X→A→B→C→D\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n for (let i = 1; i < n; i++) {\n ctx.lineTo(px[i], py[i]);\n }\n ctx.stroke();\n\n // Dashed XD line\n if (n >= 5) {\n ctx.save();\n ctx.setLineDash([5, 4]);\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n ctx.lineTo(px[4], py[4]);\n ctx.stroke();\n ctx.restore();\n }\n\n // Vertex dots and labels\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n ctx.fillStyle = COLOR;\n for (let i = 0; i < n; i++) {\n ctx.beginPath();\n ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n for (let i = 0; i < n - 1; i++) {\n if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n }\n\n // Check XD dashed line\n if (n >= 5 && pointToSegmentDist(x, y, px[0], py[0], px[4], py[4]) <= HIT_TOLERANCE) return true;\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length !== this.requiredPoints) return null;\n for (let i = 0; i < this.points.length; i++) {\n const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst COLOR = '#78909c';\n\nexport class SharkPattern implements IDrawing {\n readonly id: string;\n readonly type = 'sharkPattern' as const;\n readonly requiredPoints = 5;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `shrk_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const labels = ['X', 'A', 'B', 'C', 'D'];\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n ctx.save();\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Main zigzag: X→A→B→C→D\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n for (let i = 1; i < n; i++) {\n ctx.lineTo(px[i], py[i]);\n }\n ctx.stroke();\n\n // Dashed XD line\n if (n >= 5) {\n ctx.save();\n ctx.setLineDash([5, 4]);\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n ctx.lineTo(px[4], py[4]);\n ctx.stroke();\n ctx.restore();\n }\n\n // Vertex dots and labels\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n ctx.fillStyle = COLOR;\n for (let i = 0; i < n; i++) {\n ctx.beginPath();\n ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n for (let i = 0; i < n - 1; i++) {\n if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n }\n\n // Check XD dashed line\n if (n >= 5 && pointToSegmentDist(x, y, px[0], py[0], px[4], py[4]) <= HIT_TOLERANCE) return true;\n\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length !== this.requiredPoints) return null;\n for (let i = 0; i < this.points.length; i++) {\n const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst COLOR = '#29b6f6';\nconst LABELS = ['0', '1', '2', '3', '4', '5'];\n\nexport class ElliottImpulse implements IDrawing {\n readonly id: string;\n readonly type = 'elliottImpulse' as const;\n readonly requiredPoints = 6;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `eimp_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n ctx.save();\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Draw segments with alternating alpha: impulse (0→1, 2→3, 4→5) brighter, corrective (1→2, 3→4) dimmer\n for (let i = 0; i < n - 1; i++) {\n const isImpulse = i % 2 === 0; // segments 0,2,4 are impulse waves\n ctx.strokeStyle = isImpulse ? COLOR : COLOR + 'aa';\n ctx.beginPath();\n ctx.moveTo(px[i], py[i]);\n ctx.lineTo(px[i + 1], py[i + 1]);\n ctx.stroke();\n }\n\n // Vertex circles and labels\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n for (let i = 0; i < n; i++) {\n ctx.beginPath();\n ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = COLOR;\n ctx.fill();\n ctx.fillStyle = COLOR;\n ctx.fillText(LABELS[i] ?? String(i), px[i] + 5, py[i] - 5);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n for (let i = 0; i < px.length - 1; i++) {\n if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (!this.complete) return null;\n for (let i = 0; i < this.points.length; i++) {\n const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) return { pointIndex: i, cursor: 'grab' };\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst COLOR = '#ff8a65';\nconst LABELS = ['0', 'A', 'B', 'C'];\n\nexport class ElliottCorrective implements IDrawing {\n readonly id: string;\n readonly type = 'elliottCorrective' as const;\n readonly requiredPoints = 4;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `ecor_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n\n ctx.save();\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n for (let i = 1; i < px.length; i++) ctx.lineTo(px[i], py[i]);\n ctx.stroke();\n\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n for (let i = 0; i < px.length; i++) {\n ctx.beginPath();\n ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = COLOR;\n ctx.fill();\n ctx.fillStyle = COLOR;\n ctx.fillText(LABELS[i] ?? String(i), px[i] + 5, py[i] - 5);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n for (let i = 0; i < px.length - 1; i++) {\n if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (!this.complete) return null;\n for (let i = 0; i < this.points.length; i++) {\n const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) return { pointIndex: i, cursor: 'grab' };\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst COLOR = '#aed581';\nconst LABELS = ['A', 'B', 'C', 'D', 'E', 'end'];\n\nexport class ElliottTriangle implements IDrawing {\n readonly id: string;\n readonly type = 'elliottTriangle' as const;\n readonly requiredPoints = 6;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `etri_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n const n = px.length;\n\n ctx.save();\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Main zigzag A→B→C→D→E→end\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n for (let i = 1; i < n; i++) ctx.lineTo(px[i], py[i]);\n ctx.stroke();\n\n // Dashed upper trendline: A(0)→C(2)→E(4)\n if (n >= 3) {\n ctx.save();\n ctx.setLineDash([5, 4]);\n ctx.strokeStyle = COLOR + 'aa';\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n if (n > 2) ctx.lineTo(px[2], py[2]);\n if (n > 4) ctx.lineTo(px[4], py[4]);\n ctx.stroke();\n ctx.restore();\n }\n\n // Dashed lower trendline: B(1)→D(3)\n if (n >= 4) {\n ctx.save();\n ctx.setLineDash([5, 4]);\n ctx.strokeStyle = COLOR + 'aa';\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(px[1], py[1]);\n ctx.lineTo(px[3], py[3]);\n ctx.stroke();\n ctx.restore();\n }\n\n // Vertex circles and labels\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n for (let i = 0; i < n; i++) {\n ctx.beginPath();\n ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = COLOR;\n ctx.fill();\n ctx.fillStyle = COLOR;\n ctx.fillText(LABELS[i] ?? String(i), px[i] + 5, py[i] - 5);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n for (let i = 0; i < px.length - 1; i++) {\n if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (!this.complete) return null;\n for (let i = 0; i < this.points.length; i++) {\n const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) return { pointIndex: i, cursor: 'grab' };\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst COLOR = '#f48fb1';\nconst LABELS = ['W', 'X', 'Y', 'X2', 'Z', 'X3', 'end'];\n\nexport class ElliottCombination implements IDrawing {\n readonly id: string;\n readonly type = 'elliottCombination' as const;\n readonly requiredPoints = 7;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `ecom_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n\n ctx.save();\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n for (let i = 1; i < px.length; i++) ctx.lineTo(px[i], py[i]);\n ctx.stroke();\n\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n for (let i = 0; i < px.length; i++) {\n ctx.beginPath();\n ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = COLOR;\n ctx.fill();\n ctx.fillStyle = COLOR;\n ctx.fillText(LABELS[i] ?? String(i), px[i] + 5, py[i] - 5);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n for (let i = 0; i < px.length - 1; i++) {\n if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (!this.complete) return null;\n for (let i = 0; i < this.points.length; i++) {\n const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) return { pointIndex: i, cursor: 'grab' };\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst COLOR = '#80cbc4';\nconst LABELS = ['W', 'X', 'Y', 'end'];\n\nexport class ElliottWxy implements IDrawing {\n readonly id: string;\n readonly type = 'elliottWxy' as const;\n readonly requiredPoints = 4;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `ewxy_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n\n ctx.save();\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.beginPath();\n ctx.moveTo(px[0], py[0]);\n for (let i = 1; i < px.length; i++) ctx.lineTo(px[i], py[i]);\n ctx.stroke();\n\n ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n for (let i = 0; i < px.length; i++) {\n ctx.beginPath();\n ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fillStyle = COLOR;\n ctx.fill();\n ctx.fillStyle = COLOR;\n ctx.fillText(LABELS[i] ?? String(i), px[i] + 5, py[i] - 5);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n for (let i = 0; i < px.length - 1; i++) {\n if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (!this.complete) return null;\n for (let i = 0; i < this.points.length; i++) {\n const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) return { pointIndex: i, cursor: 'grab' };\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 8;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class Brush implements IDrawing {\n readonly id: string;\n readonly type = 'brush' as const;\n readonly openEnded = true;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `brush_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const pixelPts = this.points.map(p => ({\n x: scale.xToPixel(p.barIndex, viewport, chartW),\n y: scale.yToPixel(p.price, priceRange, chartH),\n }));\n\n const solidCount = this.complete ? pixelPts.length : pixelPts.length - 1;\n\n ctx.save();\n ctx.strokeStyle = '#ff5722';\n ctx.lineWidth = isSelected ? 2.5 : 2;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n\n // Draw confirmed segments\n if (solidCount >= 2) {\n ctx.setLineDash([]);\n ctx.beginPath();\n ctx.moveTo(pixelPts[0].x, pixelPts[0].y);\n for (let i = 1; i < solidCount; i++) {\n ctx.lineTo(pixelPts[i].x, pixelPts[i].y);\n }\n ctx.stroke();\n }\n\n // Draw the preview (last) segment as dashed when not complete\n if (!this.complete && pixelPts.length >= 2) {\n const last = pixelPts.length - 1;\n ctx.setLineDash([4, 4]);\n ctx.beginPath();\n ctx.moveTo(pixelPts[last - 1].x, pixelPts[last - 1].y);\n ctx.lineTo(pixelPts[last].x, pixelPts[last].y);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n\n const pixelPts = this.points.map(p => ({\n x: scale.xToPixel(p.barIndex, viewport, chartW),\n y: scale.yToPixel(p.price, priceRange, chartH),\n }));\n\n const segCount = this.complete ? pixelPts.length - 1 : pixelPts.length - 2;\n for (let i = 0; i < segCount; i++) {\n if (pointToSegmentDist(x, y, pixelPts[i].x, pixelPts[i].y, pixelPts[i + 1].x, pixelPts[i + 1].y) <= HIT_TOLERANCE) {\n return true;\n }\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length === 0) return null;\n\n // Only expose first and last points as handles\n const indices = [0, this.points.length - 1];\n for (const i of indices) {\n const px = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const py = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 12;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class Highlighter implements IDrawing {\n readonly id: string;\n readonly type = 'highlighter' as const;\n readonly openEnded = true;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `hl2_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const pixelPts = this.points.map(p => ({\n x: scale.xToPixel(p.barIndex, viewport, chartW),\n y: scale.yToPixel(p.price, priceRange, chartH),\n }));\n\n const solidCount = this.complete ? pixelPts.length : pixelPts.length - 1;\n\n ctx.save();\n ctx.strokeStyle = '#ffeb3b66';\n ctx.lineWidth = 12;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n\n // Draw confirmed segments\n if (solidCount >= 2) {\n ctx.setLineDash([]);\n ctx.beginPath();\n ctx.moveTo(pixelPts[0].x, pixelPts[0].y);\n for (let i = 1; i < solidCount; i++) {\n ctx.lineTo(pixelPts[i].x, pixelPts[i].y);\n }\n ctx.stroke();\n }\n\n // Draw the preview (last) segment as dashed when not complete\n if (!this.complete && pixelPts.length >= 2) {\n const last = pixelPts.length - 1;\n ctx.setLineDash([8, 6]);\n ctx.beginPath();\n ctx.moveTo(pixelPts[last - 1].x, pixelPts[last - 1].y);\n ctx.lineTo(pixelPts[last].x, pixelPts[last].y);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n\n const pixelPts = this.points.map(p => ({\n x: scale.xToPixel(p.barIndex, viewport, chartW),\n y: scale.yToPixel(p.price, priceRange, chartH),\n }));\n\n const segCount = this.complete ? pixelPts.length - 1 : pixelPts.length - 2;\n for (let i = 0; i < segCount; i++) {\n if (pointToSegmentDist(x, y, pixelPts[i].x, pixelPts[i].y, pixelPts[i + 1].x, pixelPts[i + 1].y) <= HIT_TOLERANCE) {\n return true;\n }\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length === 0) return null;\n\n // Only expose first and last points as handles\n const indices = [0, this.points.length - 1];\n for (const i of indices) {\n const px = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n const py = scale.yToPixel(this.points[i].price, priceRange, chartH);\n if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nexport class SineLine implements IDrawing {\n readonly id: string;\n readonly type = 'sineLine' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `sine_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const period = x2 - x1;\n const amplitude = Math.abs(y2 - y1) / 2;\n const midY = (y1 + y2) / 2;\n\n ctx.save();\n ctx.strokeStyle = '#ce93d8';\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n ctx.beginPath();\n\n if (Math.abs(period) < 1) {\n // Degenerate: just draw a vertical line\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n } else {\n ctx.moveTo(x1, midY + amplitude * Math.sin(0));\n const step = period > 0 ? 1 : -1;\n const xEnd = x2;\n for (let x = x1 + step; (period > 0 ? x <= xEnd : x >= xEnd); x += step) {\n const t = (x - x1) / period;\n const y = midY + amplitude * Math.sin(2 * Math.PI * t);\n ctx.lineTo(x, y);\n }\n // Ensure we hit the end point exactly\n ctx.lineTo(x2, midY + amplitude * Math.sin(2 * Math.PI));\n }\n ctx.stroke();\n\n // Anchor dots at p1 and p2\n ctx.fillStyle = '#ce93d8';\n for (const [x, y] of [[x1, y1], [x2, y2]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(x, y, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const period = x2 - x1;\n const amplitude = Math.abs(y2 - y1) / 2;\n const midY = (y1 + y2) / 2;\n\n if (Math.abs(period) < 1) {\n return Math.hypot(x - x1, y - midY) <= HIT_TOLERANCE;\n }\n\n // Sample every 5 pixels along the sine wave\n const step = period > 0 ? 5 : -5;\n let prevSx = x1;\n let prevSy = midY + amplitude * Math.sin(0);\n\n for (let sx = x1 + step; (period > 0 ? sx <= x2 + Math.abs(step) : sx >= x2 - Math.abs(step)); sx += step) {\n const clampedSx = period > 0 ? Math.min(sx, x2) : Math.max(sx, x2);\n const t = (clampedSx - x1) / period;\n const sy = midY + amplitude * Math.sin(2 * Math.PI * t);\n if (Math.hypot(x - clampedSx, y - sy) <= HIT_TOLERANCE) return true;\n // Also check segment between samples for better accuracy\n const dx = clampedSx - prevSx, dy = sy - prevSy;\n const lenSq = dx * dx + dy * dy;\n if (lenSq > 0) {\n const tt = Math.max(0, Math.min(1, ((x - prevSx) * dx + (y - prevSy) * dy) / lenSq));\n const nearX = prevSx + tt * dx;\n const nearY = prevSy + tt * dy;\n if (Math.hypot(x - nearX, y - nearY) <= HIT_TOLERANCE) return true;\n }\n prevSx = clampedSx;\n prevSy = sy;\n if (clampedSx === x2) break;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nexport class CyclicLines implements IDrawing {\n readonly id: string;\n readonly type = 'cyclicLines' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `cyc_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const cycleLen = Math.abs(p2.barIndex - p1.barIndex);\n if (cycleLen === 0) return;\n\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const color = '#7986cb';\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.setLineDash([4, 3]);\n\n for (let i = 0; i <= 8; i++) {\n const barIdx = p1.barIndex + cycleLen * i;\n const x = scale.xToPixel(barIdx, viewport, chartW);\n if (x > chartW) break;\n\n ctx.beginPath();\n ctx.moveTo(x, 0);\n ctx.lineTo(x, chartH);\n ctx.stroke();\n }\n\n ctx.setLineDash([]);\n\n // Anchor dots\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.arc(x1, chartH / 2, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.beginPath();\n ctx.arc(x2, chartH / 2, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n _y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const cycleLen = Math.abs(p2.barIndex - p1.barIndex);\n if (cycleLen === 0) return false;\n\n for (let i = 0; i <= 8; i++) {\n const barIdx = p1.barIndex + cycleLen * i;\n const cx = scale.xToPixel(barIdx, viewport, chartW);\n if (cx > chartW) break;\n if (Math.abs(x - cx) <= HIT_TOLERANCE) return true;\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: chartH / 2 },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: chartH / 2 },\n ];\n const cursors = ['move', 'ew-resize'];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: cursors[i] };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nexport class TimeCycles implements IDrawing {\n readonly id: string;\n readonly type = 'timeCycles' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `tcy_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const cycleLen = Math.abs(p2.barIndex - p1.barIndex);\n if (cycleLen === 0) return;\n\n const color = '#80cbc4';\n const maxLines = 6;\n\n ctx.save();\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Collect line positions first\n const lineXs: number[] = [];\n for (let i = 0; i <= maxLines; i++) {\n const barIdx = p1.barIndex + cycleLen * i;\n const x = scale.xToPixel(barIdx, viewport, chartW);\n if (x > chartW) break;\n lineXs.push(x);\n }\n\n // Draw alternating shaded bands between consecutive cycle lines\n for (let i = 0; i + 1 < lineXs.length; i++) {\n if (i % 2 === 0) {\n ctx.fillStyle = '#80cbc410';\n ctx.fillRect(lineXs[i], 0, lineXs[i + 1] - lineXs[i], chartH);\n }\n }\n\n // Draw solid vertical lines with labels\n ctx.strokeStyle = color;\n ctx.setLineDash([]);\n for (let i = 0; i < lineXs.length; i++) {\n ctx.beginPath();\n ctx.moveTo(lineXs[i], 0);\n ctx.lineTo(lineXs[i], chartH);\n ctx.stroke();\n\n // Label at the top of each line\n ctx.fillStyle = color;\n ctx.fillText(String(i + 1), lineXs[i] + 3, 14);\n }\n\n // Anchor dots\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.arc(x1, chartH / 2, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.beginPath();\n ctx.arc(x2, chartH / 2, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n _y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const cycleLen = Math.abs(p2.barIndex - p1.barIndex);\n if (cycleLen === 0) return false;\n\n for (let i = 0; i <= 6; i++) {\n const barIdx = p1.barIndex + cycleLen * i;\n const cx = scale.xToPixel(barIdx, viewport, chartW);\n if (cx > chartW) break;\n // Hit on line itself or within shaded region\n if (Math.abs(x - cx) <= HIT_TOLERANCE) return true;\n // Check if within a band (between line i and line i+1)\n if (i < 6) {\n const nextBarIdx = p1.barIndex + cycleLen * (i + 1);\n const nextX = scale.xToPixel(nextBarIdx, viewport, chartW);\n if (x >= cx && x <= nextX) return true;\n }\n }\n return false;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: chartH / 2 },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: chartH / 2 },\n ];\n const cursors = ['move', 'ew-resize'];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: cursors[i] };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class Projection implements IDrawing {\n readonly id: string;\n readonly type = 'projection' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `proj_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const color = '#78909c';\n const dxLine = x2 - x1;\n\n // Projected endpoint: extrapolate from p2 toward chartW\n let xEnd: number;\n let yEnd: number;\n if (Math.abs(dxLine) < 0.001) {\n // Vertical line — projection straight down\n xEnd = x2;\n yEnd = y2 + (y2 - y1);\n } else {\n const slope = (y2 - y1) / dxLine;\n xEnd = chartW;\n yEnd = y2 + slope * (chartW - x2);\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Solid segment: p1 → p2\n ctx.setLineDash([]);\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n // Dashed projection: p2 → extrapolated end\n ctx.setLineDash([6, 3]);\n ctx.beginPath();\n ctx.moveTo(x2, y2);\n ctx.lineTo(xEnd, yEnd);\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Anchor dots\n ctx.beginPath();\n ctx.arc(x1, y1, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.beginPath();\n ctx.arc(x2, y2, isSelected ? 4 : 3, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const dxLine = x2 - x1;\n let xEnd: number, yEnd: number;\n if (Math.abs(dxLine) < 0.001) {\n xEnd = x2;\n yEnd = y2 + (y2 - y1);\n } else {\n const slope = (y2 - y1) / dxLine;\n xEnd = chartW;\n yEnd = y2 + slope * (chartW - x2);\n }\n\n return (\n pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE ||\n pointToSegmentDist(x, y, x2, y2, xEnd, yEnd) <= HIT_TOLERANCE\n );\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'grab' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nconst HIT_TOLERANCE = 6;\n\nfunction drawArrowhead(ctx: CanvasRenderingContext2D, fromX: number, fromY: number, toX: number, toY: number, size = 7): void {\n const angle = Math.atan2(toY - fromY, toX - fromX);\n ctx.beginPath();\n ctx.moveTo(toX, toY);\n ctx.lineTo(toX - size * Math.cos(angle - Math.PI / 6), toY - size * Math.sin(angle - Math.PI / 6));\n ctx.lineTo(toX - size * Math.cos(angle + Math.PI / 6), toY - size * Math.sin(angle + Math.PI / 6));\n ctx.closePath();\n ctx.fill();\n}\n\nexport class PriceProjection implements IDrawing {\n readonly id: string;\n readonly type = 'priceProjection' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `pp_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n pricePrecision = 2,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const left = Math.min(x1, x2);\n const right = Math.max(x1, x2);\n const topY = Math.min(y1, y2);\n const botY = Math.max(y1, y2);\n const w = right - left;\n const h = botY - topY;\n const midX = left + w / 2;\n const midY = topY + h / 2;\n const midPrice = (p1.price + p2.price) / 2;\n const color = '#ef9a9a';\n\n ctx.save();\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n ctx.lineWidth = isSelected ? 1.5 : 1;\n\n // Light pink fill\n ctx.fillStyle = '#ef9a9a18';\n ctx.fillRect(left, topY, w, h);\n\n ctx.strokeStyle = color;\n\n // Horizontal line at p1.price\n ctx.beginPath();\n ctx.moveTo(left, y1);\n ctx.lineTo(right, y1);\n ctx.stroke();\n\n // Horizontal line at midpoint price\n const yMid = scale.yToPixel(midPrice, priceRange, chartH);\n ctx.beginPath();\n ctx.moveTo(left, yMid);\n ctx.lineTo(right, yMid);\n ctx.stroke();\n\n // Horizontal line at p2.price\n ctx.beginPath();\n ctx.moveTo(left, y2);\n ctx.lineTo(right, y2);\n ctx.stroke();\n\n // Labels on the right side\n ctx.fillStyle = color;\n ctx.fillText(p1.price.toFixed(pricePrecision), right + 4, y1 + 4);\n ctx.fillText(midPrice.toFixed(pricePrecision), right + 4, yMid + 4);\n ctx.fillText(p2.price.toFixed(pricePrecision), right + 4, y2 + 4);\n\n // Bidirectional vertical arrow in the middle\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(midX, topY);\n ctx.lineTo(midX, botY);\n ctx.stroke();\n drawArrowhead(ctx, midX, botY, midX, topY); // pointing up\n drawArrowhead(ctx, midX, topY, midX, botY); // pointing down\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const left = Math.min(x1, x2);\n const right = Math.max(x1, x2);\n const topY = Math.min(y1, y2);\n const botY = Math.max(y1, y2);\n\n return x >= left && x <= right && y >= topY && y <= botY;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const pts = [\n { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n ];\n for (let i = 0; i < pts.length; i++) {\n if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n return { pointIndex: i, cursor: 'ns-resize' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst HIT_TOLERANCE = 6;\n\nconst COLOR = '#90a4ae';\n\nexport class GhostFeed implements IDrawing {\n readonly id: string;\n readonly type = 'ghostFeed' as const;\n points: DrawingPoint[];\n complete: boolean;\n\n constructor(first: DrawingPoint) {\n this.id = `gfeed_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n this.points = [first, { ...first }];\n this.complete = false;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n isSelected: boolean,\n ): void {\n if (this.points.length < 2) return;\n\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const rx = Math.min(x1, x2);\n const ry = Math.min(y1, y2);\n const rw = Math.abs(x2 - x1);\n const rh = Math.abs(y2 - y1);\n\n ctx.save();\n\n // 1. Fill rectangle with very faint tint\n ctx.fillStyle = COLOR + '08';\n ctx.fillRect(rx, ry, rw, rh);\n\n // 2. Dashed border\n ctx.strokeStyle = COLOR;\n ctx.lineWidth = isSelected ? 1.5 : 1;\n ctx.setLineDash([6, 4]);\n ctx.strokeRect(rx, ry, rw, rh);\n ctx.setLineDash([]);\n\n // 3. Diagonal hatching lines (top-left to bottom-right, 20px spacing)\n ctx.save();\n ctx.beginPath();\n ctx.rect(rx, ry, rw, rh);\n ctx.clip();\n\n ctx.strokeStyle = COLOR + '30';\n ctx.lineWidth = 1;\n ctx.setLineDash([4, 4]);\n\n const step = 20;\n const diagExtent = rw + rh;\n for (let offset = -rh; offset <= diagExtent; offset += step) {\n const lx1 = rx + offset;\n const ly1 = ry;\n const lx2 = rx + offset + rh;\n const ly2 = ry + rh;\n ctx.beginPath();\n ctx.moveTo(lx1, ly1);\n ctx.lineTo(lx2, ly2);\n ctx.stroke();\n }\n\n ctx.setLineDash([]);\n ctx.restore();\n\n // 4. Label \"Ghost Feed\" in center\n ctx.font = \"12px 'Inter', system-ui, sans-serif\";\n ctx.fillStyle = COLOR;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText('Ghost Feed', rx + rw / 2, ry + rh / 2);\n\n // Corner handles when selected\n if (isSelected) {\n ctx.textAlign = 'left';\n ctx.textBaseline = 'alphabetic';\n for (const [cx, cy] of [[x1, y1], [x2, y2]] as [number, number][]) {\n ctx.beginPath();\n ctx.arc(cx, cy, 3.5, 0, Math.PI * 2);\n ctx.fillStyle = COLOR;\n ctx.fill();\n }\n }\n\n ctx.restore();\n }\n\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): boolean {\n if (this.points.length < 2) return false;\n const [p1, p2] = this.points;\n const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n const rx = Math.min(x1, x2) - HIT_TOLERANCE;\n const ry = Math.min(y1, y2) - HIT_TOLERANCE;\n const rw = Math.abs(x2 - x1) + HIT_TOLERANCE * 2;\n const rh = Math.abs(y2 - y1) + HIT_TOLERANCE * 2;\n\n return x >= rx && x <= rx + rw && y >= ry && y <= ry + rh;\n }\n\n getHandle(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRange,\n chartW: number,\n chartH: number,\n ): DrawingHandle | null {\n if (this.points.length < 2) return null;\n const handles: [number, number, number][] = [\n [0, scale.xToPixel(this.points[0].barIndex, viewport, chartW), scale.yToPixel(this.points[0].price, priceRange, chartH)],\n [1, scale.xToPixel(this.points[1].barIndex, viewport, chartW), scale.yToPixel(this.points[1].price, priceRange, chartH)],\n ];\n for (const [pi, hx, hy] of handles) {\n if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n return { pointIndex: pi, cursor: 'nwse-resize' };\n }\n }\n return null;\n }\n}\n","import type { IDrawing, DrawingHandle, DrawingToolType, DrawingPoint, Viewport, PriceRange as PriceRangeData, SerializedDrawing } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\n// ── Lines & Channels ──────────────────────────────────────────────────────────\nimport { HorizontalLine } from './HorizontalLine.js';\nimport { VerticalLine } from './VerticalLine.js';\nimport { TrendLine } from './TrendLine.js';\nimport { TrendAngle } from './TrendAngle.js';\nimport { CrossLine } from './CrossLine.js';\nimport { ParallelChannel } from './ParallelChannel.js';\nimport { FlatChannel } from './FlatChannel.js';\nimport { DisjointChannel } from './DisjointChannel.js';\n// ── Fibonacci & Gann ──────────────────────────────────────────────────────────\nimport { FibRetracement } from './FibRetracement.js';\nimport { FibExtension } from './FibExtension.js';\nimport { FibChannel } from './FibChannel.js';\nimport { FibTimezone } from './FibTimezone.js';\nimport { FibCircles } from './FibCircles.js';\nimport { FibSpiral } from './FibSpiral.js';\nimport { FibFan } from './FibFan.js';\nimport { FibProjection } from './FibProjection.js';\nimport { GannFan } from './GannFan.js';\nimport { GannSquare } from './GannSquare.js';\nimport { GannBox } from './GannBox.js';\n// ── Geometric Shapes ─────────────────────────────────────────────────────────\nimport { Rectangle } from './Rectangle.js';\nimport { RotatedRectangle } from './RotatedRectangle.js';\nimport { Ellipse } from './Ellipse.js';\nimport { Triangle } from './Triangle.js';\nimport { Circle } from './Circle.js';\nimport { Arc } from './Arc.js';\nimport { Polyline } from './Polyline.js';\nimport { Path } from './Path.js';\n// ── Measurement ───────────────────────────────────────────────────────────────\nimport { PriceRange } from './PriceRange.js';\nimport { DateRange } from './DateRange.js';\nimport { DatePriceRange } from './DatePriceRange.js';\nimport { Ruler } from './Ruler.js';\n// ── Pitchfork ─────────────────────────────────────────────────────────────────\nimport { Pitchfork } from './Pitchfork.js';\nimport { SchiffPitchfork } from './SchiffPitchfork.js';\nimport { ModifiedSchiff } from './ModifiedSchiff.js';\nimport { InsidePitchfork } from './InsidePitchfork.js';\n// ── Volume & Statistical ──────────────────────────────────────────────────────\nimport { FixedRangeVP } from './FixedRangeVP.js';\nimport { AnchoredVP } from './AnchoredVP.js';\nimport { VolumeProfile } from './VolumeProfile.js';\nimport { RegressionTrend } from './RegressionTrend.js';\n// ── Annotations ───────────────────────────────────────────────────────────────\nimport { Text } from './Text.js';\nimport { Callout } from './Callout.js';\nimport { PriceLabel } from './PriceLabel.js';\nimport { ArrowMarker } from './ArrowMarker.js';\nimport { Flag } from './Flag.js';\nimport { PriceNote } from './PriceNote.js';\nimport { AnchoredNote } from './AnchoredNote.js';\nimport { ArrowUp } from './ArrowUp.js';\nimport { ArrowDown } from './ArrowDown.js';\n// ── Pattern Recognition ───────────────────────────────────────────────────────\nimport { HeadShoulders } from './HeadShoulders.js';\nimport { TrianglePattern } from './TrianglePattern.js';\nimport { ThreeDrives } from './ThreeDrives.js';\nimport { AbcdPattern } from './AbcdPattern.js';\nimport { CypherPattern } from './CypherPattern.js';\nimport { ButterflyPattern } from './ButterflyPattern.js';\nimport { BatPattern } from './BatPattern.js';\nimport { GartleyPattern } from './GartleyPattern.js';\nimport { CrabPattern } from './CrabPattern.js';\nimport { SharkPattern } from './SharkPattern.js';\n// ── Elliott Wave ──────────────────────────────────────────────────────────────\nimport { ElliottImpulse } from './ElliottImpulse.js';\nimport { ElliottCorrective } from './ElliottCorrective.js';\nimport { ElliottTriangle } from './ElliottTriangle.js';\nimport { ElliottCombination } from './ElliottCombination.js';\nimport { ElliottWxy } from './ElliottWxy.js';\n// ── Brush & Highlighter ───────────────────────────────────────────────────────\nimport { Brush } from './Brush.js';\nimport { Highlighter } from './Highlighter.js';\n// ── Advanced ──────────────────────────────────────────────────────────────────\nimport { SineLine } from './SineLine.js';\nimport { CyclicLines } from './CyclicLines.js';\nimport { TimeCycles } from './TimeCycles.js';\nimport { Projection } from './Projection.js';\nimport { PriceProjection } from './PriceProjection.js';\nimport { GhostFeed } from './GhostFeed.js';\n\ntype DrawingState = 'idle' | 'placing';\n\nconst TEXT_TOOL_TYPES = new Set<DrawingToolType>(['text', 'callout', 'anchoredNote']);\n\nexport class DrawingManager {\n private drawings: IDrawing[] = [];\n private activeDrawing: IDrawing | null = null;\n private selectedDrawing: IDrawing | null = null;\n private activeTool: DrawingToolType | null = null;\n private state: DrawingState = 'idle';\n private history: IDrawing[][] = [];\n private redoStack: IDrawing[][] = [];\n private onCompleteCallback: (() => void) | null = null;\n /** Called after any completed state-mutating operation (drawing placed, moved, deleted, etc.). */\n onDrawingsChange: (() => void) | null = null;\n /** Called when a text-type drawing is first completed — ChartEngine shows the text input. */\n onStartTextEdit: ((drawing: IDrawing) => void) | null = null;\n /** Set to true by ChartEngine while the text input is focused — prevents Delete/Backspace from deleting the drawing. */\n private editingText: boolean = false;\n\n // Drag state (move whole drawing)\n private dragDrawing: IDrawing | null = null;\n private dragStartMouse: DrawingPoint | null = null;\n private dragStartPoints: DrawingPoint[] | null = null;\n\n // Resize state (move single control point)\n private resizeDrawing: IDrawing | null = null;\n private resizePointIndex: number = -1;\n\n /** Called by ChartEngine to be notified when a drawing is finished. */\n setOnComplete(cb: () => void): void {\n this.onCompleteCallback = cb;\n }\n\n /** Toggle the text-editing guard so Delete/Backspace are not intercepted. */\n setEditingText(editing: boolean): void {\n this.editingText = editing;\n }\n\n // ── Tool selection ────────────────────────────────────────────────────────\n\n setActiveTool(tool: DrawingToolType | null): void {\n this.activeTool = tool;\n this.state = 'idle';\n this.activeDrawing = null;\n }\n\n getActiveTool(): DrawingToolType | null {\n return this.activeTool;\n }\n\n // ── Mouse events (called from ChartEngine) ───────────────────────────────\n\n /** Returns true if the drawing system consumed the event */\n onMouseDown(point: DrawingPoint): boolean {\n if (!this.activeTool) {\n return false;\n }\n\n if (this.state === 'idle') {\n this.snapshot();\n this.activeDrawing = this.createDrawing(this.activeTool, point);\n this.drawings.push(this.activeDrawing);\n if (this.activeDrawing.complete) {\n // Single-click tool (e.g. horizontalLine, verticalLine, crossLine, text)\n const completed = this.activeDrawing;\n this.selectedDrawing = completed;\n this.activeDrawing = null;\n this.activeTool = null;\n this.onCompleteCallback?.();\n this.notifyChange();\n if (TEXT_TOOL_TYPES.has(completed.type)) {\n this.onStartTextEdit?.(completed);\n }\n } else {\n this.state = 'placing';\n }\n return true;\n }\n\n if (this.state === 'placing' && this.activeDrawing) {\n const isOpenEnded: boolean = (this.activeDrawing as any).openEnded ?? false;\n\n if (isOpenEnded) {\n // Open-ended tool (Polyline, Path, Brush, Highlighter):\n // Confirm current preview point and add a new one.\n const last = this.activeDrawing.points.length - 1;\n this.activeDrawing.points[last] = { ...point };\n this.activeDrawing.points.push({ ...point });\n return true;\n }\n\n const required: number = (this.activeDrawing as any).requiredPoints ?? 2;\n const current = this.activeDrawing.points.length;\n\n // Confirm the current preview point\n this.activeDrawing.points[current - 1] = { ...point };\n\n if (current < required) {\n // More points needed — add a new preview point\n this.activeDrawing.points.push({ ...point });\n return true;\n }\n\n // All points placed — complete\n this.activeDrawing.complete = true;\n const completed = this.activeDrawing;\n this.selectedDrawing = completed;\n this.activeDrawing = null;\n this.state = 'idle';\n this.activeTool = null;\n this.onCompleteCallback?.();\n this.notifyChange();\n if (TEXT_TOOL_TYPES.has(completed.type)) {\n this.onStartTextEdit?.(completed);\n }\n return true;\n }\n\n return false;\n }\n\n onMouseMove(point: DrawingPoint): void {\n if (this.state === 'placing' && this.activeDrawing) {\n const last = this.activeDrawing.points.length - 1;\n this.activeDrawing.points[last] = point;\n }\n if (this.dragDrawing && this.dragStartMouse && this.dragStartPoints) {\n const dBar = point.barIndex - this.dragStartMouse.barIndex;\n const dPrice = point.price - this.dragStartMouse.price;\n for (let i = 0; i < this.dragDrawing.points.length; i++) {\n this.dragDrawing.points[i] = {\n barIndex: this.dragStartPoints[i].barIndex + dBar,\n price: this.dragStartPoints[i].price + dPrice,\n };\n }\n }\n if (this.resizeDrawing && this.resizePointIndex >= 0) {\n this.resizeDrawing.points[this.resizePointIndex] = { ...point };\n }\n }\n\n /**\n * Finalizes an open-ended drawing (Polyline, Path, Brush, Highlighter)\n * on double-click. Removes the dangling preview point and marks complete.\n */\n finalizePlacing(): void {\n if (this.state !== 'placing' || !this.activeDrawing) return;\n const isOpenEnded: boolean = (this.activeDrawing as any).openEnded ?? false;\n if (!isOpenEnded) return;\n\n // Remove the last preview point (was tracking mouse)\n if (this.activeDrawing.points.length > 2) {\n this.activeDrawing.points.pop();\n }\n if (this.activeDrawing.points.length < 2) {\n this.drawings.pop();\n this.activeDrawing = null;\n this.state = 'idle';\n this.activeTool = null;\n return;\n }\n this.activeDrawing.complete = true;\n this.selectedDrawing = this.activeDrawing;\n this.activeDrawing = null;\n this.state = 'idle';\n this.activeTool = null;\n this.onCompleteCallback?.();\n this.notifyChange();\n }\n\n startDrag(drawing: IDrawing, mouse: DrawingPoint): void {\n this.snapshot();\n this.dragDrawing = drawing;\n this.dragStartMouse = { ...mouse };\n this.dragStartPoints = drawing.points.map(p => ({ ...p }));\n }\n\n endDrag(): void {\n this.dragDrawing = null;\n this.dragStartMouse = null;\n this.dragStartPoints = null;\n this.notifyChange();\n }\n\n isDraggingDrawing(): boolean {\n return this.dragDrawing !== null;\n }\n\n /** True when a multi-point drawing has been started and is awaiting further touch/click input. */\n isPlacing(): boolean {\n return this.state === 'placing';\n }\n\n startResize(drawing: IDrawing, pointIndex: number): void {\n this.snapshot();\n this.resizeDrawing = drawing;\n this.resizePointIndex = pointIndex;\n }\n\n endResize(): void {\n this.resizeDrawing = null;\n this.resizePointIndex = -1;\n this.notifyChange();\n }\n\n isResizingDrawing(): boolean {\n return this.resizeDrawing !== null;\n }\n\n /** Returns the handle under (x,y) across all complete drawings, or null */\n getHandleAtPoint(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRangeData,\n chartW: number,\n chartH: number,\n ): { drawing: IDrawing; handle: DrawingHandle } | null {\n for (let i = this.drawings.length - 1; i >= 0; i--) {\n const d = this.drawings[i];\n if (!d.complete || d.visible === false || d.locked) continue;\n const h = d.getHandle(x, y, scale, viewport, priceRange, chartW, chartH);\n if (h) return { drawing: d, handle: h };\n }\n return null;\n }\n\n /** Returns the drawing that was hit, or null */\n hitTest(\n x: number,\n y: number,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRangeData,\n chartW: number,\n chartH: number,\n ): IDrawing | null {\n for (let i = this.drawings.length - 1; i >= 0; i--) {\n const d = this.drawings[i];\n if (d.visible === false || d.locked) continue;\n if (d.hitTest(x, y, scale, viewport, priceRange, chartW, chartH)) {\n return d;\n }\n }\n return null;\n }\n\n selectDrawing(drawing: IDrawing | null): void {\n this.selectedDrawing = drawing;\n }\n\n getSelectedDrawing(): IDrawing | null {\n return this.selectedDrawing;\n }\n\n // ── Keyboard shortcuts ────────────────────────────────────────────────────\n\n onKeyDown(key: string): boolean {\n if (key === 'Escape') {\n if (this.state === 'placing' && this.activeDrawing) {\n this.drawings.pop();\n this.activeDrawing = null;\n this.state = 'idle';\n }\n this.activeTool = null;\n this.selectedDrawing = null;\n return true;\n }\n if ((key === 'Delete' || key === 'Backspace') && this.selectedDrawing && !this.editingText) {\n this.deleteSelected();\n return true;\n }\n if (key === 'z' && this.history.length > 0) {\n this.undo();\n return true;\n }\n return false;\n }\n\n deleteSelected(): void {\n if (!this.selectedDrawing) return;\n this.snapshot();\n this.drawings = this.drawings.filter(d => d !== this.selectedDrawing);\n this.selectedDrawing = null;\n this.notifyChange();\n }\n\n undo(): void {\n const prev = this.history.pop();\n if (prev !== undefined) {\n this.redoStack.push(this.cloneDrawings(this.drawings));\n this.drawings = prev;\n this.selectedDrawing = null;\n this.notifyChange();\n }\n }\n\n redo(): void {\n const next = this.redoStack.pop();\n if (next !== undefined) {\n this.history.push(this.cloneDrawings(this.drawings));\n this.drawings = next;\n this.selectedDrawing = null;\n this.notifyChange();\n }\n }\n\n hideAll(): void {\n if (this.drawings.length === 0) return;\n this.snapshot();\n for (const d of this.drawings) d.visible = false;\n this.selectedDrawing = null;\n this.notifyChange();\n }\n\n showAll(): void {\n if (this.drawings.length === 0) return;\n this.snapshot();\n for (const d of this.drawings) d.visible = true;\n this.notifyChange();\n }\n\n lockAll(): void {\n if (this.drawings.length === 0) return;\n this.snapshot();\n for (const d of this.drawings) d.locked = true;\n this.selectedDrawing = null;\n this.notifyChange();\n }\n\n unlockAll(): void {\n if (this.drawings.length === 0) return;\n this.snapshot();\n for (const d of this.drawings) d.locked = false;\n this.notifyChange();\n }\n\n // ── Rendering ─────────────────────────────────────────────────────────────\n\n render(\n ctx: CanvasRenderingContext2D,\n scale: ScaleManager,\n viewport: Viewport,\n priceRange: PriceRangeData,\n chartW: number,\n chartH: number,\n pricePrecision = 2,\n ): void {\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n if (this.drawings.length === 0) return;\n\n const dpr = window.devicePixelRatio || 1;\n ctx.save();\n ctx.scale(dpr, dpr);\n\n for (const drawing of this.drawings) {\n if (drawing.visible === false) continue;\n drawing.render(ctx, scale, viewport, priceRange, chartW, chartH, drawing === this.selectedDrawing, pricePrecision);\n }\n\n ctx.restore();\n }\n\n getDrawings(): IDrawing[] {\n return [...this.drawings];\n }\n\n /** Returns a JSON-serializable snapshot of all drawings (data fields only, no methods). */\n getDrawingsSnapshot(): SerializedDrawing[] {\n return this.drawings.map(d => ({\n id: d.id,\n type: d.type,\n points: d.points.map(p => ({ ...p })),\n complete: d.complete,\n ...(d.visible !== undefined && { visible: d.visible }),\n ...(d.locked !== undefined && { locked: d.locked }),\n ...(d.text !== undefined && { text: d.text }),\n }));\n }\n\n /** Restores drawings from a serialized snapshot, replacing current drawings. */\n loadDrawings(drawings: SerializedDrawing[]): void {\n this.drawings = drawings.map(sd => {\n const drawing = this.createDrawing(sd.type, sd.points[0] ?? { barIndex: 0, price: 0 });\n drawing.id = sd.id;\n drawing.points = sd.points.map(p => ({ ...p }));\n drawing.complete = sd.complete;\n if (sd.visible !== undefined) drawing.visible = sd.visible;\n if (sd.locked !== undefined) drawing.locked = sd.locked;\n if (sd.text !== undefined) drawing.text = sd.text;\n return drawing;\n });\n this.selectedDrawing = null;\n this.activeDrawing = null;\n this.history = [this.drawings.map(d => ({ ...d, points: d.points.map(p => ({ ...p })) }) as IDrawing)];\n this.redoStack = [];\n }\n\n // ── Private helpers ───────────────────────────────────────────────────────\n\n clearAll(): void {\n if (this.drawings.length === 0) return;\n this.snapshot();\n this.drawings = [];\n this.selectedDrawing = null;\n this.activeDrawing = null;\n this.notifyChange();\n }\n\n private notifyChange(): void {\n this.onDrawingsChange?.();\n }\n\n private snapshot(): void {\n this.history.push(this.cloneDrawings(this.drawings));\n if (this.history.length > 50) this.history.shift();\n this.redoStack = [];\n }\n\n private cloneDrawings(drawings: IDrawing[]): IDrawing[] {\n return drawings.map(d => {\n const clone = Object.create(Object.getPrototypeOf(d)) as IDrawing;\n Object.assign(clone, d);\n clone.points = d.points.map((p: DrawingPoint) => ({ ...p }));\n return clone;\n });\n }\n\n private createDrawing(tool: DrawingToolType, point: DrawingPoint): IDrawing {\n switch (tool) {\n // Lines & Channels\n case 'horizontalLine': return new HorizontalLine(point);\n case 'verticalLine': return new VerticalLine(point);\n case 'trendLine': return new TrendLine(point);\n case 'trendAngle': return new TrendAngle(point);\n case 'crossLine': return new CrossLine(point);\n case 'parallelChannel': return new ParallelChannel(point);\n case 'flatChannel': return new FlatChannel(point);\n case 'disjointChannel': return new DisjointChannel(point);\n // Fibonacci & Gann\n case 'fibRetracement': return new FibRetracement(point);\n case 'fibExtension': return new FibExtension(point);\n case 'fibChannel': return new FibChannel(point);\n case 'fibTimezone': return new FibTimezone(point);\n case 'fibCircles': return new FibCircles(point);\n case 'fibSpiral': return new FibSpiral(point);\n case 'fibFan': return new FibFan(point);\n case 'fibProjection': return new FibProjection(point);\n case 'gannFan': return new GannFan(point);\n case 'gannSquare': return new GannSquare(point);\n case 'gannBox': return new GannBox(point);\n // Geometric Shapes\n case 'rectangle': return new Rectangle(point);\n case 'rotatedRectangle': return new RotatedRectangle(point);\n case 'ellipse': return new Ellipse(point);\n case 'triangle': return new Triangle(point);\n case 'circle': return new Circle(point);\n case 'arc': return new Arc(point);\n case 'polyline': return new Polyline(point);\n case 'path': return new Path(point);\n // Measurement\n case 'priceRange': return new PriceRange(point);\n case 'dateRange': return new DateRange(point);\n case 'datePriceRange': return new DatePriceRange(point);\n case 'ruler': return new Ruler(point);\n // Pitchfork\n case 'pitchfork': return new Pitchfork(point);\n case 'schiffPitchfork': return new SchiffPitchfork(point);\n case 'modifiedSchiff': return new ModifiedSchiff(point);\n case 'insidePitchfork': return new InsidePitchfork(point);\n // Volume & Statistical\n case 'fixedRangeVP': return new FixedRangeVP(point);\n case 'anchoredVP': return new AnchoredVP(point);\n case 'volumeProfile': return new VolumeProfile(point);\n case 'regressionTrend': return new RegressionTrend(point);\n // Annotations\n case 'text': return new Text(point);\n case 'callout': return new Callout(point);\n case 'priceLabel': return new PriceLabel(point);\n case 'arrowMarker': return new ArrowMarker(point);\n case 'flag': return new Flag(point);\n case 'priceNote': return new PriceNote(point);\n case 'anchoredNote': return new AnchoredNote(point);\n case 'arrowUp': return new ArrowUp(point);\n case 'arrowDown': return new ArrowDown(point);\n // Pattern Recognition\n case 'headShoulders': return new HeadShoulders(point);\n case 'trianglePattern': return new TrianglePattern(point);\n case 'threeDrives': return new ThreeDrives(point);\n case 'abcdPattern': return new AbcdPattern(point);\n case 'cypherPattern': return new CypherPattern(point);\n case 'butterflyPattern': return new ButterflyPattern(point);\n case 'batPattern': return new BatPattern(point);\n case 'gartleyPattern': return new GartleyPattern(point);\n case 'crabPattern': return new CrabPattern(point);\n case 'sharkPattern': return new SharkPattern(point);\n // Elliott Wave\n case 'elliottImpulse': return new ElliottImpulse(point);\n case 'elliottCorrective': return new ElliottCorrective(point);\n case 'elliottTriangle': return new ElliottTriangle(point);\n case 'elliottCombination': return new ElliottCombination(point);\n case 'elliottWxy': return new ElliottWxy(point);\n // Brush & Highlighter\n case 'brush': return new Brush(point);\n case 'highlighter': return new Highlighter(point);\n // Advanced\n case 'sineLine': return new SineLine(point);\n case 'cyclicLines': return new CyclicLines(point);\n case 'timeCycles': return new TimeCycles(point);\n case 'projection': return new Projection(point);\n case 'priceProjection': return new PriceProjection(point);\n case 'ghostFeed': return new GhostFeed(point);\n default: return new TrendLine(point);\n }\n }\n}\n","import type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_INDICATOR_OVERLAY_CONFIG, type IndicatorOverlayUiConfig } from '../core/uiConfig.js';\nimport { DEFAULT_LABELS, type ChartMiscLabels } from '../core/labels.js';\nimport { ICON_GEAR, ICON_CLOSE, ICON_BULLET, ICON_EYE, ICON_EYE_OFF } from './icons.js';\n\nconst MAX_INLINE = 2;\n\ninterface PillEntry {\n color: string;\n label: string;\n timeframe: string;\n visible: boolean;\n onRemove: () => void;\n onEdit: (() => void) | null;\n onToggleVisibility: () => void;\n}\n\nexport class IndicatorOverlay {\n readonly el: HTMLDivElement;\n private theme: ChartTheme;\n private cfg: IndicatorOverlayUiConfig;\n private labels: ChartMiscLabels;\n private pills = new Map<string, PillEntry>();\n\n private inlineRow: HTMLDivElement;\n private collapseBtn: HTMLButtonElement;\n private dropdownPanel: HTMLDivElement;\n private isOpen = false;\n\n constructor(\n theme: ChartTheme,\n cfg: IndicatorOverlayUiConfig = DEFAULT_INDICATOR_OVERLAY_CONFIG,\n labels: ChartMiscLabels = DEFAULT_LABELS.chart,\n ) {\n this.theme = theme;\n this.cfg = cfg;\n this.labels = labels;\n\n this.el = document.createElement('div');\n Object.assign(this.el.style, {\n position: 'absolute',\n top: '52px',\n left: '6px',\n zIndex: '10',\n display: 'none',\n alignItems: 'center',\n gap: '10px',\n pointerEvents: 'auto',\n });\n\n this.inlineRow = document.createElement('div');\n Object.assign(this.inlineRow.style, {\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n });\n\n this.collapseBtn = document.createElement('button');\n Object.assign(this.collapseBtn.style, {\n display: 'none',\n alignItems: 'center',\n gap: '4px',\n background: this.theme.indicatorOverlay.pillBg,\n color: this.theme.axisText,\n border: `1px solid ${this.theme.axisBorder}`,\n borderRadius: '4px',\n padding: '2px 8px',\n fontSize: this.cfg.collapseBtnFontSize,\n fontFamily: this.cfg.collapseBtnFontFamily,\n cursor: 'pointer',\n outline: 'none',\n });\n this.collapseBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleDropdown();\n });\n\n this.dropdownPanel = document.createElement('div');\n Object.assign(this.dropdownPanel.style, {\n display: 'none',\n position: 'absolute',\n top: '100%',\n left: '0',\n marginTop: '4px',\n background: this.theme.tooltip.background,\n border: `1px solid ${this.theme.axisBorder}`,\n borderRadius: '4px',\n padding: '4px 0',\n minWidth: '140px',\n zIndex: '20',\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n });\n\n const collapseWrap = document.createElement('div');\n Object.assign(collapseWrap.style, { position: 'relative' });\n collapseWrap.append(this.collapseBtn, this.dropdownPanel);\n\n this.el.append(this.inlineRow, collapseWrap);\n\n document.addEventListener('click', this.onDocClick);\n }\n\n // ── Public API ────────────────────────────────────────────────────────────\n\n addPill(\n name: string,\n color: string,\n label: string,\n timeframe: string = 'Chart',\n visible: boolean = true,\n onRemove: () => void,\n onEdit: (() => void) | null = null,\n onToggleVisibility: () => void,\n ): void {\n if (this.pills.has(name)) return;\n this.pills.set(name, { color, label, timeframe, visible, onRemove, onEdit, onToggleVisibility });\n this.refresh();\n }\n\n updatePillColor(name: string, newColor: string): void {\n const entry = this.pills.get(name);\n if (!entry) return;\n entry.color = newColor;\n this.refresh();\n }\n\n updatePillLabel(name: string, label: string): void {\n const entry = this.pills.get(name);\n if (!entry) return;\n entry.label = label;\n this.refresh();\n }\n\n updatePillTimeframe(name: string, timeframe: string): void {\n const entry = this.pills.get(name);\n if (!entry) return;\n entry.timeframe = timeframe;\n this.refresh();\n }\n\n updatePillVisibility(name: string, visible: boolean): void {\n const entry = this.pills.get(name);\n if (!entry) return;\n entry.visible = visible;\n this.refresh();\n }\n\n removePill(name: string): void {\n if (!this.pills.has(name)) return;\n this.pills.delete(name);\n this.refresh();\n }\n\n setTheme(theme: ChartTheme): void {\n this.theme = theme;\n Object.assign(this.collapseBtn.style, {\n background: theme.indicatorOverlay.pillBg,\n color: theme.axisText,\n border: `1px solid ${theme.axisBorder}`,\n });\n Object.assign(this.dropdownPanel.style, {\n background: theme.tooltip.background,\n border: `1px solid ${theme.axisBorder}`,\n });\n this.refresh();\n }\n\n destroy(): void {\n document.removeEventListener('click', this.onDocClick);\n }\n\n // ── Private helpers ───────────────────────────────────────────────────────\n\n private refresh(): void {\n const entries = Array.from(this.pills.entries());\n this.inlineRow.innerHTML = '';\n this.dropdownPanel.innerHTML = '';\n\n if (entries.length === 0) {\n this.el.style.display = 'none';\n this.collapseBtn.style.display = 'none';\n return;\n }\n\n this.el.style.display = 'flex';\n\n if (entries.length <= MAX_INLINE) {\n this.isOpen = false;\n this.dropdownPanel.style.display = 'none';\n this.collapseBtn.style.display = 'none';\n for (const [name, entry] of entries) {\n this.inlineRow.appendChild(this.makePill(name, entry));\n }\n } else {\n this.collapseBtn.style.display = 'inline-flex';\n this.collapseBtn.textContent = this.labels.nIndicators.replace('{count}', String(entries.length));\n for (const [name, entry] of entries) {\n this.dropdownPanel.appendChild(this.makeDropdownRow(name, entry));\n }\n this.dropdownPanel.style.display = this.isOpen ? 'block' : 'none';\n }\n }\n\n private makeTimeframeBadge(timeframe: string): HTMLSpanElement | null {\n if (!timeframe || timeframe === 'Chart') return null;\n const badge = document.createElement('span');\n badge.textContent = timeframe;\n Object.assign(badge.style, {\n fontSize: '10px',\n padding: '1px 4px',\n borderRadius: '3px',\n background: 'rgba(128,128,128,0.18)',\n color: this.theme.axisText,\n marginLeft: '2px',\n lineHeight: '1.4',\n });\n return badge;\n }\n\n private makeEyeIcon(entry: PillEntry): HTMLSpanElement {\n const eye = document.createElement('span');\n eye.innerHTML = entry.visible ? ICON_EYE : ICON_EYE_OFF;\n Object.assign(eye.style, {\n display: 'inline-flex',\n alignItems: 'center',\n color: this.theme.indicatorOverlay.iconColor,\n cursor: 'pointer',\n opacity: entry.visible ? '0.6' : '0.4',\n lineHeight: '1',\n });\n eye.addEventListener('mouseenter', () => { eye.style.opacity = '1'; });\n eye.addEventListener('mouseleave', () => { eye.style.opacity = entry.visible ? '0.6' : '0.4'; });\n eye.addEventListener('click', (e) => { e.stopPropagation(); entry.onToggleVisibility(); });\n return eye;\n }\n\n private makePill(_name: string, entry: PillEntry): HTMLSpanElement {\n const pill = document.createElement('span');\n Object.assign(pill.style, {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: this.cfg.pillFontSize,\n fontFamily: this.cfg.pillFontFamily,\n color: entry.color,\n whiteSpace: 'nowrap',\n userSelect: 'none',\n background: this.theme.indicatorOverlay.pillBg,\n borderRadius: '4px',\n padding: '1px 6px 1px 5px',\n opacity: entry.visible ? '1' : '0.4',\n });\n\n const dot = document.createElement('span');\n dot.innerHTML = ICON_BULLET;\n Object.assign(dot.style, { display: 'inline-flex', alignItems: 'center' });\n\n const txt = document.createElement('span');\n txt.textContent = entry.label;\n\n const badge = this.makeTimeframeBadge(entry.timeframe);\n\n const actions = document.createElement('span');\n Object.assign(actions.style, {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n marginLeft: '12px',\n });\n\n actions.appendChild(this.makeEyeIcon(entry));\n\n if (entry.onEdit) {\n const gear = document.createElement('span');\n gear.innerHTML = ICON_GEAR;\n Object.assign(gear.style, {\n display: 'inline-flex',\n alignItems: 'center',\n color: this.theme.indicatorOverlay.iconColor,\n cursor: 'pointer',\n opacity: '0.6',\n lineHeight: '1',\n });\n gear.addEventListener('mouseenter', () => { gear.style.opacity = '1'; });\n gear.addEventListener('mouseleave', () => { gear.style.opacity = '0.6'; });\n gear.addEventListener('click', (e) => { e.stopPropagation(); entry.onEdit!(); });\n actions.appendChild(gear);\n }\n\n const x = document.createElement('span');\n x.innerHTML = ICON_CLOSE;\n Object.assign(x.style, {\n display: 'inline-flex',\n alignItems: 'center',\n color: this.theme.indicatorOverlay.iconColor,\n cursor: 'pointer',\n });\n x.addEventListener('click', (e) => { e.stopPropagation(); entry.onRemove(); });\n actions.appendChild(x);\n\n pill.append(dot, txt);\n if (badge) pill.appendChild(badge);\n pill.appendChild(actions);\n return pill;\n }\n\n private makeDropdownRow(_name: string, entry: PillEntry): HTMLDivElement {\n const row = document.createElement('div');\n Object.assign(row.style, {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n padding: '4px 10px',\n fontSize: this.cfg.dropdownRowFontSize,\n fontFamily: this.cfg.dropdownRowFontFamily,\n color: entry.color,\n cursor: 'default',\n opacity: entry.visible ? '1' : '0.4',\n });\n row.addEventListener('mouseenter', () => { row.style.background = this.theme.indicatorOverlay.dropdownHoverBg; });\n row.addEventListener('mouseleave', () => { row.style.background = 'transparent'; });\n\n const dot = document.createElement('span');\n dot.innerHTML = ICON_BULLET;\n Object.assign(dot.style, { display: 'inline-flex', alignItems: 'center' });\n\n const nameWrap = document.createElement('span');\n Object.assign(nameWrap.style, { display: 'inline-flex', alignItems: 'center', gap: '4px', flex: '1' });\n\n const txt = document.createElement('span');\n txt.textContent = entry.label;\n nameWrap.appendChild(txt);\n\n const badge = this.makeTimeframeBadge(entry.timeframe);\n if (badge) nameWrap.appendChild(badge);\n\n const actions = document.createElement('span');\n Object.assign(actions.style, { display: 'inline-flex', alignItems: 'center', gap: '4px' });\n\n const eye = document.createElement('span');\n eye.innerHTML = entry.visible ? ICON_EYE : ICON_EYE_OFF;\n Object.assign(eye.style, {\n display: 'inline-flex',\n alignItems: 'center',\n color: this.theme.indicatorOverlay.iconColor,\n cursor: 'pointer',\n opacity: entry.visible ? '0.6' : '0.4',\n lineHeight: '1',\n });\n eye.addEventListener('mouseenter', () => { eye.style.opacity = '1'; });\n eye.addEventListener('mouseleave', () => { eye.style.opacity = entry.visible ? '0.6' : '0.4'; });\n eye.addEventListener('click', (e) => {\n e.stopPropagation();\n entry.onToggleVisibility();\n });\n actions.appendChild(eye);\n\n if (entry.onEdit) {\n const gear = document.createElement('span');\n gear.innerHTML = ICON_GEAR;\n Object.assign(gear.style, {\n display: 'inline-flex',\n alignItems: 'center',\n color: this.theme.indicatorOverlay.iconColor,\n cursor: 'pointer',\n opacity: '0.6',\n lineHeight: '1',\n });\n gear.addEventListener('mouseenter', () => { gear.style.opacity = '1'; });\n gear.addEventListener('mouseleave', () => { gear.style.opacity = '0.6'; });\n gear.addEventListener('click', (e) => {\n e.stopPropagation();\n this.isOpen = false;\n this.dropdownPanel.style.display = 'none';\n entry.onEdit!();\n });\n actions.appendChild(gear);\n }\n\n const x = document.createElement('span');\n x.innerHTML = ICON_CLOSE;\n Object.assign(x.style, {\n display: 'inline-flex',\n alignItems: 'center',\n color: this.theme.indicatorOverlay.iconColor,\n cursor: 'pointer',\n });\n x.addEventListener('click', (e) => {\n e.stopPropagation();\n entry.onRemove();\n });\n actions.appendChild(x);\n\n row.append(dot, nameWrap, actions);\n return row;\n }\n\n private toggleDropdown(): void {\n this.isOpen = !this.isOpen;\n this.dropdownPanel.style.display = this.isOpen ? 'block' : 'none';\n this.collapseBtn.textContent = this.labels.nIndicators.replace('{count}', String(this.pills.size));\n }\n\n private onDocClick = (e: MouseEvent): void => {\n if (this.isOpen && !this.el.contains(e.target as Node)) {\n this.isOpen = false;\n this.dropdownPanel.style.display = 'none';\n this.collapseBtn.textContent = this.labels.nIndicators.replace('{count}', String(this.pills.size));\n }\n };\n}\n","import type { ChartTheme } from '../core/themes.js';\nimport type { IndicatorParamSchema, ParamFieldDef } from '../core/indicatorSettings.js';\nimport type { IndicatorParams } from '../core/types.js';\nimport { DEFAULT_LABELS, type DialogLabels } from '../core/labels.js';\nimport { ICON_CLOSE } from './icons.js';\n\nexport class IndicatorSettingsDialog {\n /** Backdrop element — append this to document.body */\n readonly el: HTMLDivElement;\n\n private theme: ChartTheme;\n private labels: DialogLabels;\n private panel: HTMLDivElement;\n private schema: IndicatorParamSchema | null = null;\n private currentParams: IndicatorParams = {};\n private onUpdate: ((params: IndicatorParams) => void) | null = null;\n private onRemove: (() => void) | null = null;\n private inputRefs = new Map<string, HTMLInputElement | HTMLSelectElement>();\n\n constructor(theme: ChartTheme, labels: DialogLabels = DEFAULT_LABELS.dialogs) {\n this.theme = theme;\n this.labels = labels;\n\n // Backdrop\n this.el = document.createElement('div');\n Object.assign(this.el.style, {\n position: 'fixed',\n inset: '0',\n background: 'rgba(0,0,0,0.5)',\n display: 'none',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: '1000',\n });\n this.el.addEventListener('mousedown', (e) => {\n if (e.target === this.el) this.hide();\n });\n\n // Modal panel\n this.panel = document.createElement('div');\n Object.assign(this.panel.style, {\n display: 'flex',\n flexDirection: 'column',\n minWidth: '300px',\n maxWidth: '360px',\n background: this.theme.tooltip.background,\n border: `1px solid ${this.theme.axisBorder}`,\n borderRadius: '6px',\n boxShadow: '0 8px 32px rgba(0,0,0,0.45)',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n fontSize: '12px',\n overflow: 'hidden',\n });\n // Prevent backdrop click from firing when clicking inside panel\n this.panel.addEventListener('mousedown', (e) => e.stopPropagation());\n\n this.el.appendChild(this.panel);\n }\n\n // ── Public API ────────────────────────────────────────────────────────────\n\n show(\n schema: IndicatorParamSchema,\n currentParams: IndicatorParams,\n onUpdate: (params: IndicatorParams) => void,\n onRemove: () => void,\n ): void {\n this.schema = schema;\n this.currentParams = { ...currentParams };\n this.onUpdate = onUpdate;\n this.onRemove = onRemove;\n this.rebuild();\n this.el.style.display = 'flex';\n }\n\n hide(): void {\n this.el.style.display = 'none';\n this.schema = null;\n this.onUpdate = null;\n this.onRemove = null;\n }\n\n setTheme(theme: ChartTheme): void {\n this.theme = theme;\n Object.assign(this.panel.style, {\n background: theme.tooltip.background,\n border: `1px solid ${theme.axisBorder}`,\n });\n // Rebuild DOM with new theme if currently visible\n if (this.el.style.display !== 'none' && this.schema) {\n this.rebuild();\n }\n }\n\n destroy(): void {\n this.el.remove();\n }\n\n // ── Private helpers ───────────────────────────────────────────────────────\n\n private rebuild(): void {\n this.panel.innerHTML = '';\n this.inputRefs.clear();\n if (!this.schema) return;\n\n this.panel.appendChild(this.buildHeader(this.schema.shortName));\n this.panel.appendChild(this.buildBody(this.schema.fields));\n this.panel.appendChild(this.buildFooter());\n }\n\n private buildHeader(title: string): HTMLDivElement {\n const header = document.createElement('div');\n Object.assign(header.style, {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '10px 14px',\n borderBottom: `1px solid ${this.theme.axisBorder}`,\n });\n\n const titleEl = document.createElement('span');\n titleEl.textContent = `${title} ${this.labels.indicator.titleSuffix}`;\n Object.assign(titleEl.style, {\n color: this.theme.tooltip.text,\n fontWeight: '600',\n fontSize: '13px',\n });\n\n const closeBtn = document.createElement('span');\n closeBtn.innerHTML = ICON_CLOSE;\n Object.assign(closeBtn.style, {\n display: 'inline-flex',\n alignItems: 'center',\n color: this.theme.axisText,\n cursor: 'pointer',\n });\n closeBtn.addEventListener('mouseenter', () => { closeBtn.style.color = this.theme.tooltip.text; });\n closeBtn.addEventListener('mouseleave', () => { closeBtn.style.color = this.theme.axisText; });\n closeBtn.addEventListener('click', () => this.hide());\n\n header.append(titleEl, closeBtn);\n return header;\n }\n\n private buildBody(fields: ParamFieldDef[]): HTMLDivElement {\n const body = document.createElement('div');\n Object.assign(body.style, {\n padding: '12px 14px',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n });\n\n if (fields.length === 0) {\n const empty = document.createElement('span');\n empty.textContent = this.labels.indicator.noParams;\n Object.assign(empty.style, { color: this.theme.axisText, fontSize: '11px' });\n body.appendChild(empty);\n return body;\n }\n\n for (const field of fields) {\n body.appendChild(this.buildField(field));\n }\n return body;\n }\n\n private buildField(field: ParamFieldDef): HTMLDivElement {\n const row = document.createElement('div');\n Object.assign(row.style, {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '10px',\n });\n\n const label = document.createElement('label');\n label.textContent = field.label;\n Object.assign(label.style, {\n color: this.theme.axisText,\n fontSize: '12px',\n flex: '1',\n });\n\n const currentVal = this.currentParams[field.key] ?? field.default;\n\n if (field.kind === 'number') {\n const input = document.createElement('input');\n input.type = 'number';\n input.min = String(field.min);\n input.max = String(field.max);\n input.step = String(field.step);\n input.value = String(currentVal);\n Object.assign(input.style, {\n width: '80px',\n background: this.theme.background,\n color: this.theme.tooltip.text,\n border: `1px solid ${this.theme.axisBorder}`,\n borderRadius: '3px',\n padding: '4px 6px',\n fontSize: '12px',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n outline: 'none',\n textAlign: 'right',\n });\n this.inputRefs.set(field.key, input);\n row.append(label, input);\n } else if (field.kind === 'select') {\n const select = document.createElement('select');\n for (const opt of field.options) {\n const option = document.createElement('option');\n option.value = opt;\n option.textContent = opt;\n if (opt === String(currentVal)) option.selected = true;\n select.appendChild(option);\n }\n Object.assign(select.style, {\n minWidth: '120px',\n background: this.theme.background,\n color: this.theme.tooltip.text,\n border: `1px solid ${this.theme.axisBorder}`,\n borderRadius: '3px',\n padding: '4px 6px',\n fontSize: '12px',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n outline: 'none',\n cursor: 'pointer',\n });\n this.inputRefs.set(field.key, select);\n row.append(label, select);\n } else {\n const input = document.createElement('input');\n input.type = 'color';\n input.value = String(currentVal);\n Object.assign(input.style, {\n width: '40px',\n height: '26px',\n border: 'none',\n padding: '0',\n cursor: 'pointer',\n background: 'transparent',\n borderRadius: '3px',\n });\n this.inputRefs.set(field.key, input);\n row.append(label, input);\n }\n\n return row;\n }\n\n private buildFooter(): HTMLDivElement {\n const footer = document.createElement('div');\n Object.assign(footer.style, {\n display: 'flex',\n gap: '8px',\n padding: '10px 14px',\n borderTop: `1px solid ${this.theme.axisBorder}`,\n });\n\n const removeBtn = this.makeButton('Remove', '#ef5350', 'transparent', '#ef5350');\n removeBtn.addEventListener('click', () => {\n this.onRemove?.();\n this.hide();\n });\n\n const updateBtn = this.makeButton('Update', '#fff', '#2196f3', '#2196f3');\n updateBtn.addEventListener('click', () => {\n if (!this.schema || !this.onUpdate) return;\n const params: IndicatorParams = {};\n for (const field of this.schema.fields) {\n const inp = this.inputRefs.get(field.key);\n if (!inp) continue;\n params[field.key] = field.kind === 'number' ? Number(inp.value) : String(inp.value);\n }\n this.onUpdate(params);\n this.hide();\n });\n\n footer.append(removeBtn, updateBtn);\n return footer;\n }\n\n private makeButton(\n text: string,\n color: string,\n background: string,\n borderColor: string,\n ): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.textContent = text;\n Object.assign(btn.style, {\n flex: '1',\n color,\n background,\n border: `1px solid ${borderColor}`,\n borderRadius: '4px',\n padding: '6px 0',\n cursor: 'pointer',\n fontSize: '12px',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n fontWeight: '600',\n outline: 'none',\n });\n btn.addEventListener('mouseenter', () => { btn.style.opacity = '0.85'; });\n btn.addEventListener('mouseleave', () => { btn.style.opacity = '1'; });\n return btn;\n }\n}\n","import type { ChartTheme } from '../core/themes.js';\nimport type { TradeDisplayFilter, PositionRenderStyle, CanvasColorSettings } from '../core/types.js';\nimport { DEFAULT_LABELS, type DialogLabels } from '../core/labels.js';\nimport { ICON_TAB, ICON_CLOSE_SM } from './icons.js';\n\nexport type { CanvasColorSettings };\n\nexport interface ChartSettings {\n tradeDisplayFilter: TradeDisplayFilter;\n positionRenderStyle: PositionRenderStyle;\n theme: 'dark' | 'light';\n canvasColors?: {\n dark?: Partial<CanvasColorSettings>;\n light?: Partial<CanvasColorSettings>;\n };\n}\n\ntype SettingsTab = 'appearance' | 'trading';\n\nconst TAB_LABELS: Record<SettingsTab, string> = {\n appearance: 'Appearance',\n trading: 'Trading',\n};\n\nexport class ChartSettingsDialog {\n readonly el: HTMLDivElement;\n private panel: HTMLDivElement;\n private sidebar: HTMLDivElement;\n private content: HTMLDivElement;\n\n private theme: ChartTheme;\n private labels: DialogLabels;\n private current: ChartSettings;\n private activeTab: SettingsTab = 'appearance';\n private onChange: ((s: ChartSettings) => void) | null = null;\n private onReset: (() => void) | null = null;\n\n private tabEls = new Map<SettingsTab, HTMLButtonElement>();\n\n constructor(\n theme: ChartTheme,\n initial: ChartSettings,\n labels: DialogLabels = DEFAULT_LABELS.dialogs\n ) {\n this.theme = theme;\n this.labels = labels;\n this.current = { ...initial };\n\n // ── Backdrop ──────────────────────────────────────────────────────────\n this.el = document.createElement('div');\n Object.assign(this.el.style, {\n position: 'fixed',\n inset: '0',\n background: 'rgba(0,0,0,0.5)',\n display: 'none',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: '10000',\n });\n this.el.addEventListener('mousedown', (e) => {\n if (e.target === this.el) this.hide();\n });\n\n // ── Panel ─────────────────────────────────────────────────────────────\n this.panel = document.createElement('div');\n Object.assign(this.panel.style, {\n display: 'flex',\n flexDirection: 'column',\n width: '540px',\n minHeight: '340px',\n maxWidth: 'calc(100vw - 32px)',\n maxHeight: 'calc(100vh - 48px)',\n background: theme.tooltip.background,\n border: `1px solid ${theme.axisBorder}`,\n borderRadius: '10px',\n boxShadow: '0 16px 48px rgba(0,0,0,0.55), 0 4px 16px rgba(0,0,0,0.3)',\n fontFamily: \"'Inter', system-ui, -apple-system, sans-serif\",\n fontSize: '12px',\n overflow: 'hidden',\n });\n this.panel.addEventListener('mousedown', (e) => e.stopPropagation());\n\n // ── Header ────────────────────────────────────────────────────────────\n const header = this.buildHeader();\n this.panel.appendChild(header);\n\n // ── Body: sidebar + content ────────────────────────────────────────────\n const body = document.createElement('div');\n Object.assign(body.style, {\n display: 'flex',\n flex: '1',\n overflow: 'hidden',\n });\n\n this.sidebar = this.buildSidebar();\n body.appendChild(this.sidebar);\n\n this.content = document.createElement('div');\n Object.assign(this.content.style, {\n flex: '1',\n padding: '20px 24px',\n overflowY: 'auto',\n scrollbarWidth: 'thin',\n });\n body.appendChild(this.content);\n\n this.panel.appendChild(body);\n\n // ── Footer ────────────────────────────────────────────────────────────\n this.panel.appendChild(this.buildFooter());\n\n this.el.appendChild(this.panel);\n }\n\n show(current: ChartSettings, onChange: (s: ChartSettings) => void, onReset?: () => void): void {\n this.current = { ...current };\n this.onChange = onChange;\n this.onReset = onReset ?? null;\n this.renderContent();\n this.el.style.display = 'flex';\n }\n\n hide(): void {\n this.el.style.display = 'none';\n this.onChange = null;\n this.onReset = null;\n }\n\n setTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.applyPanelTheme();\n if (this.el.style.display !== 'none') this.renderContent();\n }\n\n destroy(): void {\n this.el.remove();\n }\n\n // ── Private – emit ────────────────────────────────────────────────────────\n\n private emit(): void {\n this.onChange?.({ ...this.current });\n }\n\n // ── Private – panel theme ─────────────────────────────────────────────────\n\n private applyPanelTheme(): void {\n Object.assign(this.panel.style, {\n background: this.theme.tooltip.background,\n border: `1px solid ${this.theme.axisBorder}`,\n });\n // Re-render sidebar tabs with updated theme\n this.sidebar.innerHTML = '';\n this.tabEls.clear();\n this.buildSidebarTabs(this.sidebar);\n this.highlightActiveTab();\n }\n\n // ── Private – header ──────────────────────────────────────────────────────\n\n private buildHeader(): HTMLDivElement {\n const header = document.createElement('div');\n Object.assign(header.style, {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '14px 20px 12px',\n borderBottom: `1px solid ${this.theme.axisBorder}`,\n flexShrink: '0',\n });\n\n const title = document.createElement('span');\n title.textContent = this.labels.settings.title;\n Object.assign(title.style, {\n color: this.theme.tooltip.text,\n fontWeight: '600',\n fontSize: '14px',\n letterSpacing: '-0.01em',\n });\n\n const closeBtn = document.createElement('button');\n closeBtn.innerHTML = ICON_CLOSE_SM;\n Object.assign(closeBtn.style, {\n color: this.theme.axisText,\n cursor: 'pointer',\n background: 'transparent',\n border: 'none',\n padding: '4px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n outline: 'none',\n transition: 'color 0.1s, background 0.1s',\n });\n closeBtn.addEventListener('mouseenter', () => {\n closeBtn.style.color = this.theme.tooltip.text;\n closeBtn.style.background = this.theme.ui.accentBg;\n });\n closeBtn.addEventListener('mouseleave', () => {\n closeBtn.style.color = this.theme.axisText;\n closeBtn.style.background = 'transparent';\n });\n closeBtn.addEventListener('click', () => this.hide());\n\n header.append(title, closeBtn);\n return header;\n }\n\n // ── Private – footer ──────────────────────────────────────────────────────\n\n private buildFooter(): HTMLDivElement {\n const footer = document.createElement('div');\n Object.assign(footer.style, {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n padding: '10px 20px',\n borderTop: `1px solid ${this.theme.axisBorder}`,\n flexShrink: '0',\n });\n\n const resetBtn = document.createElement('button');\n resetBtn.textContent = this.labels.settings.resetBtn;\n Object.assign(resetBtn.style, {\n color: this.theme.axisText,\n fontSize: '11px',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n background: 'transparent',\n border: `1px solid ${this.theme.axisBorder}`,\n borderRadius: '5px',\n padding: '5px 12px',\n cursor: 'pointer',\n outline: 'none',\n transition: 'color 0.1s, border-color 0.1s, background 0.1s',\n });\n resetBtn.addEventListener('mouseenter', () => {\n resetBtn.style.color = this.theme.tooltip.text;\n resetBtn.style.borderColor = this.theme.ui.accent;\n resetBtn.style.background = this.theme.ui.accentBg;\n });\n resetBtn.addEventListener('mouseleave', () => {\n resetBtn.style.color = this.theme.axisText;\n resetBtn.style.borderColor = this.theme.axisBorder;\n resetBtn.style.background = 'transparent';\n });\n resetBtn.addEventListener('click', () => {\n this.onReset?.();\n this.hide();\n });\n\n footer.appendChild(resetBtn);\n return footer;\n }\n\n // ── Private – sidebar ─────────────────────────────────────────────────────\n\n private buildSidebar(): HTMLDivElement {\n const sidebar = document.createElement('div');\n Object.assign(sidebar.style, {\n width: '130px',\n flexShrink: '0',\n borderRight: `1px solid ${this.theme.axisBorder}`,\n padding: '10px 0',\n display: 'flex',\n flexDirection: 'column',\n gap: '2px',\n });\n this.buildSidebarTabs(sidebar);\n return sidebar;\n }\n\n private buildSidebarTabs(container: HTMLDivElement): void {\n const tabs: SettingsTab[] = ['appearance', 'trading'];\n for (const tab of tabs) {\n const btn = document.createElement('button');\n Object.assign(btn.style, {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 14px',\n background: 'transparent',\n border: 'none',\n borderLeft: '2px solid transparent',\n color: this.theme.axisText,\n fontSize: '12px',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n cursor: 'pointer',\n width: '100%',\n textAlign: 'left',\n outline: 'none',\n transition: 'background 0.1s, color 0.1s',\n boxSizing: 'border-box',\n });\n\n const iconSpan = document.createElement('span');\n iconSpan.innerHTML = ICON_TAB[tab];\n Object.assign(iconSpan.style, { display: 'flex', flexShrink: '0' });\n\n const labelSpan = document.createElement('span');\n labelSpan.textContent = TAB_LABELS[tab];\n\n btn.append(iconSpan, labelSpan);\n\n btn.addEventListener('mouseenter', () => {\n if (this.activeTab !== tab) {\n btn.style.background = this.theme.ui.accentBg;\n btn.style.color = this.theme.tooltip.text;\n }\n });\n btn.addEventListener('mouseleave', () => {\n if (this.activeTab !== tab) {\n btn.style.background = 'transparent';\n btn.style.color = this.theme.axisText;\n }\n });\n btn.addEventListener('click', () => {\n this.activeTab = tab;\n this.highlightActiveTab();\n this.renderContent();\n });\n\n this.tabEls.set(tab, btn);\n container.appendChild(btn);\n }\n }\n\n private highlightActiveTab(): void {\n for (const [tab, btn] of this.tabEls) {\n const isActive = tab === this.activeTab;\n Object.assign(btn.style, {\n background: isActive ? this.theme.ui.accentBg : 'transparent',\n color: isActive ? this.theme.ui.accentText : this.theme.axisText,\n borderLeft: isActive\n ? `2px solid ${this.theme.ui.accent}`\n : '2px solid transparent',\n fontWeight: isActive ? '500' : '400',\n });\n }\n }\n\n // ── Private – content rendering ───────────────────────────────────────────\n\n private renderContent(): void {\n this.content.innerHTML = '';\n this.highlightActiveTab();\n\n switch (this.activeTab) {\n case 'appearance':\n this.buildAppearanceSection();\n break;\n case 'trading':\n this.buildTradingSection();\n break;\n }\n }\n\n // ── Appearance ────────────────────────────────────────────────────────────\n\n private buildAppearanceSection(): void {\n // ── Theme row (label + toggle inline) ────────────────────────────────\n const themeRow = document.createElement('div');\n Object.assign(themeRow.style, {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingBottom: '10px',\n borderBottom: `1px solid ${this.theme.axisBorder}`,\n });\n\n const themeLabel = document.createElement('span');\n themeLabel.textContent = 'Theme';\n Object.assign(themeLabel.style, {\n color: this.theme.tooltip.text,\n fontSize: '13px',\n fontWeight: '600',\n });\n\n themeRow.append(themeLabel, this.makeThemeToggle());\n this.content.appendChild(themeRow);\n\n // ── Colors ─────────────────────────────────────────────────────────────\n this.content.appendChild(this.makeSectionHeader('Colors'));\n this.content.appendChild(this.buildColorRows());\n }\n\n private makeThemeToggle(): HTMLDivElement {\n let isLight = this.current.theme === 'light';\n\n const wrap = document.createElement('div');\n Object.assign(wrap.style, {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n });\n\n const darkLbl = document.createElement('span');\n darkLbl.textContent = 'Dark';\n const lightLbl = document.createElement('span');\n lightLbl.textContent = 'Light';\n\n const updateLabels = () => {\n Object.assign(darkLbl.style, {\n color: isLight ? this.theme.axisText : this.theme.tooltip.text,\n fontWeight: isLight ? '400' : '500',\n fontSize: '11px',\n cursor: 'pointer',\n userSelect: 'none',\n });\n Object.assign(lightLbl.style, {\n color: isLight ? this.theme.tooltip.text : this.theme.axisText,\n fontWeight: isLight ? '500' : '400',\n fontSize: '11px',\n cursor: 'pointer',\n userSelect: 'none',\n });\n };\n\n const track = document.createElement('div');\n Object.assign(track.style, {\n position: 'relative',\n width: '36px',\n height: '20px',\n borderRadius: '10px',\n cursor: 'pointer',\n flexShrink: '0',\n transition: 'background 0.18s',\n background: this.theme.axisBorder,\n border: `1px solid ${this.theme.axisText}50`,\n boxSizing: 'border-box',\n });\n\n const thumb = document.createElement('div');\n Object.assign(thumb.style, {\n position: 'absolute',\n top: '2px',\n left: isLight ? '18px' : '2px',\n width: '14px',\n height: '14px',\n borderRadius: '50%',\n background: this.theme.ui.accent,\n transition: 'left 0.18s',\n pointerEvents: 'none',\n });\n track.appendChild(thumb);\n\n const doToggle = () => {\n isLight = !isLight;\n thumb.style.left = isLight ? '18px' : '2px';\n this.current.theme = isLight ? 'light' : 'dark';\n updateLabels();\n this.emit();\n this.renderContent();\n };\n\n track.addEventListener('click', doToggle);\n darkLbl.addEventListener('click', () => {\n if (isLight) doToggle();\n });\n lightLbl.addEventListener('click', () => {\n if (!isLight) doToggle();\n });\n\n updateLabels();\n wrap.append(darkLbl, track, lightLbl);\n return wrap;\n }\n\n /**\n * Renders all canvas colors as a label → swatch(es) grid.\n * All swatch columns are pixel-aligned regardless of label length.\n *\n * Layout: [label 1fr] [swatch1 24px] [swatch2 24px]\n *\n * Single-color rows leave swatch2 empty (the grid column is still reserved,\n * keeping swatch1 aligned with paired rows).\n */\n private buildColorRows(): HTMLDivElement {\n const themeKey = this.current.theme;\n const current = this.current.canvasColors?.[themeKey] ?? {};\n\n const SWATCH = 24;\n const GAP = 8;\n\n const grid = document.createElement('div');\n Object.assign(grid.style, {\n display: 'grid',\n gridTemplateColumns: `max-content ${SWATCH}px ${SWATCH}px`,\n columnGap: `${GAP}px`,\n rowGap: '8px',\n padding: '8px 0 4px',\n alignItems: 'center',\n });\n\n type SwatchDef = { field: keyof CanvasColorSettings; fallback: string };\n type RowDef = { label: string; s1: SwatchDef; s2?: SwatchDef };\n\n const rows: RowDef[] = [\n { label: 'Background', s1: { field: 'background', fallback: this.theme.background } },\n { label: 'Grid', s1: { field: 'grid', fallback: this.theme.grid } },\n { label: 'Axis Text', s1: { field: 'axisText', fallback: this.theme.axisText } },\n { label: 'Axis Border', s1: { field: 'axisBorder', fallback: this.theme.axisBorder } },\n { label: 'Crosshair', s1: { field: 'crosshair', fallback: this.theme.crosshair } },\n {\n label: 'Candle Body',\n s1: { field: 'candleUp', fallback: this.theme.candle.up },\n s2: { field: 'candleDown', fallback: this.theme.candle.down },\n },\n {\n label: 'Candle Wick',\n s1: { field: 'wickUp', fallback: this.theme.candle.wickUp },\n s2: { field: 'wickDown', fallback: this.theme.candle.wickDown },\n },\n {\n label: 'Candle Border',\n s1: {\n field: 'borderUp',\n fallback: this.theme.candle.borderUp ?? this.theme.candle.up,\n },\n s2: {\n field: 'borderDown',\n fallback: this.theme.candle.borderDown ?? this.theme.candle.down,\n },\n },\n {\n label: 'Volume',\n s1: { field: 'volumeUp', fallback: this.theme.volume.up },\n s2: { field: 'volumeDown', fallback: this.theme.volume.down },\n },\n ];\n\n const makeSwatch = (def: SwatchDef) =>\n this.makeColorSwatch(current[def.field] ?? def.fallback, (hex) => {\n if (!this.current.canvasColors) this.current.canvasColors = {};\n if (!this.current.canvasColors[themeKey]) this.current.canvasColors[themeKey] = {};\n (this.current.canvasColors[themeKey] as Partial<CanvasColorSettings>)[def.field] =\n hex;\n this.emit();\n });\n\n for (const { label, s1, s2 } of rows) {\n // Col 1 — label\n const lbl = document.createElement('span');\n lbl.textContent = label;\n Object.assign(lbl.style, {\n color: this.theme.axisText,\n fontSize: '11px',\n paddingRight: '12px',\n });\n\n // Col 2 — primary swatch\n const sw1 = makeSwatch(s1);\n sw1.style.width = `${SWATCH}px`;\n sw1.style.height = `${SWATCH}px`;\n\n // Col 3 — secondary swatch or empty spacer\n let col3: HTMLElement;\n if (s2) {\n col3 = makeSwatch(s2);\n col3.style.width = `${SWATCH}px`;\n col3.style.height = `${SWATCH}px`;\n } else {\n col3 = document.createElement('span');\n }\n\n grid.append(lbl, sw1, col3);\n }\n\n return grid;\n }\n\n /** A 24×24 color swatch backed by a hidden <input type=\"color\">. */\n private makeColorSwatch(initialHex: string, onChange: (hex: string) => void): HTMLDivElement {\n // Semi-transparent axisText gives a visible border in both dark and light themes.\n // (axisBorder alone is #1c2a35 in dark mode — nearly invisible against the panel.)\n const borderColor = `${this.theme.axisText}80`; // 50% alpha via 8-digit hex\n const wrap = document.createElement('div');\n Object.assign(wrap.style, {\n position: 'relative',\n width: '28px',\n height: '28px',\n borderRadius: '6px',\n overflow: 'hidden',\n cursor: 'pointer',\n border: `1.5px solid ${borderColor}`,\n flexShrink: '0',\n boxSizing: 'border-box',\n });\n\n const swatch = document.createElement('div');\n Object.assign(swatch.style, {\n position: 'absolute',\n inset: '0',\n background: initialHex,\n });\n\n const input = document.createElement('input');\n input.type = 'color';\n input.value = initialHex;\n Object.assign(input.style, {\n position: 'absolute',\n inset: '0',\n opacity: '0',\n width: '100%',\n height: '100%',\n cursor: 'pointer',\n padding: '0',\n border: 'none',\n });\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n input.addEventListener('input', () => {\n swatch.style.background = input.value;\n if (debounceTimer !== null) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n debounceTimer = null;\n onChange(input.value);\n }, 300);\n });\n\n wrap.append(swatch, input);\n return wrap;\n }\n\n // ── Trading ───────────────────────────────────────────────────────────────\n\n private buildTradingSection(): void {\n const s = this.labels.settings;\n\n this.content.appendChild(this.makeSectionHeader(s.tfcSection));\n\n this.content.appendChild(\n this.makeVerticalSettingRow(\n s.showLabel,\n 'Controls which trade levels are displayed on the chart',\n this.makeSegmented<TradeDisplayFilter>(\n [\n { value: 'all', label: s.showAll },\n { value: 'positions', label: s.showPositions },\n { value: 'orders', label: s.showOrders },\n { value: 'none', label: s.showNone },\n ],\n this.current.tradeDisplayFilter,\n (v) => {\n this.current.tradeDisplayFilter = v;\n this.emit();\n }\n )\n )\n );\n\n this.content.appendChild(\n this.makeVerticalSettingRow(\n s.positionStyleLabel,\n 'How open positions are rendered on the chart',\n this.makeSegmented<PositionRenderStyle>(\n [\n { value: 'line', label: s.styleLine },\n { value: 'dot', label: s.styleDot },\n ],\n this.current.positionRenderStyle,\n (v) => {\n this.current.positionRenderStyle = v;\n this.emit();\n }\n )\n )\n );\n }\n\n // ── Private – helpers ─────────────────────────────────────────────────────\n\n private makeSectionHeader(label: string, first = false): HTMLDivElement {\n const el = document.createElement('div');\n el.textContent = label;\n Object.assign(el.style, {\n color: this.theme.tooltip.text,\n fontSize: '13px',\n fontWeight: '600',\n paddingBottom: '10px',\n marginTop: first ? '0' : '20px',\n marginBottom: '2px',\n borderBottom: `1px solid ${this.theme.axisBorder}`,\n });\n return el;\n }\n\n private makeVerticalSettingRow(\n label: string,\n desc: string,\n control: HTMLElement\n ): HTMLDivElement {\n const row = document.createElement('div');\n Object.assign(row.style, {\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n padding: '14px 0',\n borderBottom: `1px solid ${this.theme.axisBorder}`,\n });\n\n const textGroup = document.createElement('div');\n Object.assign(textGroup.style, {\n display: 'flex',\n flexDirection: 'column',\n gap: '0px',\n });\n\n const labelEl = document.createElement('span');\n labelEl.textContent = label;\n Object.assign(labelEl.style, {\n color: this.theme.tooltip.text,\n fontSize: '12px',\n fontWeight: '500',\n });\n\n const descEl = document.createElement('span');\n descEl.textContent = desc;\n Object.assign(descEl.style, {\n color: this.theme.axisText,\n fontSize: '10px',\n });\n\n textGroup.append(labelEl, descEl);\n\n Object.assign(control.style, {\n width: 'fit-content',\n border: `1px solid ${this.theme.axisText}`,\n borderRadius: '6px',\n overflow: 'hidden',\n });\n row.append(textGroup, control);\n return row;\n }\n\n /** Segmented control (pill-style button group). */\n private makeSegmented<T extends string>(\n options: Array<{ value: T; label: string }>,\n current: T,\n onChange: (v: T) => void\n ): HTMLDivElement {\n const wrap = document.createElement('div');\n Object.assign(wrap.style, {\n display: 'inline-flex',\n borderRadius: '6px',\n border: `1px solid ${this.theme.axisText}`,\n overflow: 'hidden',\n flexShrink: '0',\n });\n\n const btns: HTMLButtonElement[] = [];\n\n for (const opt of options) {\n const btn = document.createElement('button');\n const isActive = opt.value === current;\n\n Object.assign(btn.style, {\n padding: '5px 14px',\n fontSize: '11px',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n background: isActive ? this.theme.ui.accent : 'transparent',\n color: isActive ? '#ffffff' : this.theme.axisText,\n border: 'none',\n borderRight: `1px solid ${this.theme.axisText}`,\n cursor: 'pointer',\n outline: 'none',\n transition: 'background 0.12s, color 0.12s',\n whiteSpace: 'nowrap',\n textAlign: 'center',\n });\n // remove right border from last item\n if (opt === options[options.length - 1]) {\n btn.style.borderRight = 'none';\n }\n\n btn.textContent = opt.label;\n\n btn.addEventListener('mouseenter', () => {\n if (current !== opt.value) {\n btn.style.background = this.theme.ui.accentBg;\n btn.style.color = this.theme.ui.accentText;\n }\n });\n btn.addEventListener('mouseleave', () => {\n if (current !== opt.value) {\n btn.style.background = 'transparent';\n btn.style.color = this.theme.axisText;\n }\n });\n btn.addEventListener('click', () => {\n current = opt.value;\n for (const b of btns) {\n b.style.background = 'transparent';\n b.style.color = this.theme.axisText;\n }\n btn.style.background = this.theme.ui.accent;\n btn.style.color = '#ffffff';\n onChange(opt.value);\n });\n\n btns.push(btn);\n wrap.appendChild(btn);\n }\n\n return wrap;\n }\n}\n","import type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_LABELS, type TradeLabels } from '../core/labels.js';\nimport { ICON_PLUS_CIRCLE } from './icons.js';\n\n/**\n * Floating ⊕ button that tracks mouse-Y along the right edge of the price pane.\n * Lives inside `canvasWrap` (position:absolute).\n */\nexport class TradeButton {\n readonly el: HTMLButtonElement;\n private theme: ChartTheme;\n private _visible = false;\n\n constructor(\n theme: ChartTheme,\n priceAxisWidth: number,\n onClick: () => void,\n labels: TradeLabels = DEFAULT_LABELS.trade,\n ) {\n this.theme = theme;\n\n this.el = document.createElement('button');\n this.el.innerHTML = ICON_PLUS_CIRCLE;\n this.el.title = labels.placeOrderTitle;\n Object.assign(this.el.style, {\n position: 'absolute',\n right: `${priceAxisWidth + 26}px`,\n top: '0',\n width: '22px',\n height: '22px',\n borderRadius: '50%',\n border: `1px solid ${theme.axisBorder}`,\n background: theme.tooltip.background,\n color: theme.axisText,\n fontSize: '14px',\n lineHeight: '1',\n display: 'none',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n padding: '0',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n zIndex: '15',\n transform: 'translateY(-50%)',\n transition: 'opacity 0.1s',\n pointerEvents: 'auto',\n userSelect: 'none',\n });\n\n this.el.addEventListener('click', (e) => {\n e.stopPropagation();\n onClick();\n });\n // Prevent mouseleave on the canvas wrapper when moving onto the button\n this.el.addEventListener('mouseenter', () => {\n this.el.style.opacity = '1';\n Object.assign(this.el.style, {\n background: theme.tooltip.background,\n color: '#26a69a',\n border: '1px solid #26a69a',\n });\n });\n this.el.addEventListener('mouseleave', (e) => {\n Object.assign(this.el.style, {\n background: this.theme.tooltip.background,\n color: this.theme.axisText,\n border: `1px solid ${this.theme.axisBorder}`,\n });\n // If cursor left the button but NOT back onto the canvas, hide the button\n const related = e.relatedTarget as HTMLElement | null;\n if (!related || !this.el.parentElement?.contains(related)) {\n this.hide();\n }\n });\n }\n\n /** Move button to Y pixel position within canvasWrap */\n setY(y: number): void {\n this.el.style.top = `${y}px`;\n }\n\n show(): void {\n if (this._visible) return;\n this._visible = true;\n this.el.style.display = 'flex';\n }\n\n hide(): void {\n if (!this._visible) return;\n this._visible = false;\n this.el.style.display = 'none';\n }\n\n setTheme(theme: ChartTheme, priceAxisWidth: number): void {\n this.theme = theme;\n Object.assign(this.el.style, {\n border: `1px solid ${theme.axisBorder}`,\n background: theme.tooltip.background,\n color: theme.axisText,\n right: `${priceAxisWidth + 26}px`,\n });\n }\n}\n","import type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_LABELS, type TradeLabels } from '../core/labels.js';\n\n/**\n * Small Buy/Sell popover anchored next to the trade button.\n * Rows now show the dynamic order type (Limit / Stop) based on cursor price\n * relative to the market price. Clicking a row creates a draft level instead\n * of calling onOrderSubmit directly.\n */\nexport class TradePopover {\n readonly el: HTMLDivElement;\n private theme: ChartTheme;\n private labels: TradeLabels;\n private lots: number;\n private onDraftCreate: (side: 'buy' | 'sell', price: number, orderType: 'limit' | 'stop') => void;\n private _price = 0;\n private _pricePrecision = 2;\n private _buyOrderType: 'limit' | 'stop' = 'limit';\n private _sellOrderType: 'limit' | 'stop' = 'limit';\n\n constructor(\n theme: ChartTheme,\n lots: number,\n onDraftCreate: (side: 'buy' | 'sell', price: number, orderType: 'limit' | 'stop') => void,\n labels: TradeLabels = DEFAULT_LABELS.trade,\n ) {\n this.theme = theme;\n this.lots = lots;\n this.onDraftCreate = onDraftCreate;\n this.labels = labels;\n\n this.el = document.createElement('div');\n Object.assign(this.el.style, {\n position: 'absolute',\n display: 'none',\n flexDirection: 'column',\n gap: '1px',\n background: theme.tooltip.background,\n border: `1px solid ${theme.axisBorder}`,\n borderRadius: '5px',\n padding: '4px',\n zIndex: '20',\n boxShadow: '0 4px 16px rgba(0,0,0,0.25)',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n fontSize: '12px',\n minWidth: '140px',\n pointerEvents: 'auto',\n });\n\n // Close when clicking outside\n document.addEventListener('mousedown', this.onDocMouseDown);\n }\n\n // ── Public ────────────────────────────────────────────────────────────────\n\n show(\n price: number,\n buttonY: number,\n buttonRight: number,\n pricePrecision = 2,\n buyOrderType: 'limit' | 'stop' = 'limit',\n sellOrderType: 'limit' | 'stop' = 'limit',\n ): void {\n this._price = price;\n this._pricePrecision = pricePrecision;\n this._buyOrderType = buyOrderType;\n this._sellOrderType = sellOrderType;\n this.rebuild();\n this.el.style.display = 'flex';\n\n // Position to the left of the button\n const popW = 145;\n this.el.style.right = `${buttonRight}px`;\n this.el.style.top = `${buttonY - 16}px`;\n this.el.style.width = `${popW}px`;\n }\n\n hide(): void {\n this.el.style.display = 'none';\n }\n\n get isVisible(): boolean {\n return this.el.style.display !== 'none';\n }\n\n setLots(lots: number): void {\n this.lots = lots;\n }\n\n setTheme(theme: ChartTheme): void {\n this.theme = theme;\n Object.assign(this.el.style, {\n background: theme.tooltip.background,\n border: `1px solid ${theme.axisBorder}`,\n });\n }\n\n destroy(): void {\n document.removeEventListener('mousedown', this.onDocMouseDown);\n }\n\n // ── Private ───────────────────────────────────────────────────────────────\n\n private rebuild(): void {\n this.el.innerHTML = '';\n this.el.append(\n this.makeRow(this.labels.buy, '#26a69a', 'buy', this._buyOrderType),\n this.makeRow(this.labels.sell, '#ef5350', 'sell', this._sellOrderType),\n );\n }\n\n private makeRow(\n label: string,\n color: string,\n side: 'buy' | 'sell',\n orderType: 'limit' | 'stop',\n ): HTMLButtonElement {\n const btn = document.createElement('button');\n const priceStr = this._price.toFixed(this._pricePrecision);\n const typeLabel = orderType === 'limit' ? this.labels.limit : this.labels.stop;\n btn.textContent = `${label} ${typeLabel} ${priceStr}`;\n Object.assign(btn.style, {\n display: 'block',\n width: '100%',\n background: 'transparent',\n color: color,\n border: 'none',\n borderRadius: '3px',\n padding: '7px 10px',\n textAlign: 'left',\n cursor: 'pointer',\n fontSize: '12px',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n fontWeight: '600',\n });\n btn.addEventListener('mouseenter', () => { btn.style.background = color + '22'; });\n btn.addEventListener('mouseleave', () => { btn.style.background = 'transparent'; });\n btn.addEventListener('mousedown', (e) => {\n e.stopPropagation();\n this.onDraftCreate(side, this._price, orderType);\n this.hide();\n });\n return btn;\n }\n\n private onDocMouseDown = (e: MouseEvent): void => {\n if (this.isVisible && !this.el.contains(e.target as Node)) {\n this.hide();\n }\n };\n}\n","import type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_LABELS, type TradeLabels } from '../core/labels.js';\n\n/**\n * A small DOM quantity input overlaid on the chart canvas, shown while a\n * draft pending order is active. Positioned to the left of the trade buttons.\n */\nexport class DraftOrderQtyInput {\n readonly el: HTMLDivElement;\n private input: HTMLInputElement;\n private priceAxisWidth: number;\n\n /** Called whenever the user changes the qty input. Wired by ChartEngine from config. */\n onLotsChange?: (lots: number) => void;\n /** Queued value to apply on the next show() call (set when setValue is called while hidden). */\n private _pendingLots: number | null = null;\n\n constructor(priceAxisWidth: number, labels: TradeLabels = DEFAULT_LABELS.trade) {\n this.priceAxisWidth = priceAxisWidth;\n\n this.el = document.createElement('div');\n Object.assign(this.el.style, {\n position: 'absolute',\n display: 'none',\n alignItems: 'center',\n gap: '5px',\n right: `${priceAxisWidth + 70}px`,\n top: '0',\n transform: 'translateY(-50%)',\n zIndex: '18',\n pointerEvents: 'auto',\n userSelect: 'none',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n fontSize: '11px',\n });\n\n const label = document.createElement('span');\n label.textContent = labels.qty;\n\n this.input = document.createElement('input');\n this.input.type = 'number';\n Object.assign(this.input.style, {\n width: '52px',\n padding: '3px 5px',\n border: '1px solid #ffffff',\n borderRadius: '3px',\n background: 'rgb(30,30,30)',\n color: '#ffffff',\n fontSize: '11px',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n outline: 'none',\n textAlign: 'right',\n });\n // Prevent canvas pan/zoom from consuming clicks on the input\n this.input.addEventListener('mousedown', (e) => e.stopPropagation());\n this.input.addEventListener('wheel', (e) => e.stopPropagation());\n this.input.addEventListener('focus', () => this.input.select());\n this.input.addEventListener('input', () => this.onLotsChange?.(this.getValue()));\n\n this.el.append(label, this.input);\n }\n\n // ── Public ────────────────────────────────────────────────────────────────\n\n private static boxBg(theme: ChartTheme): string {\n return theme.background !== '#ffffff' ? 'rgb(30,30,30)' : 'rgb(230,230,230)';\n }\n\n private static boxFg(theme: ChartTheme): string {\n return theme.background !== '#ffffff' ? '#ffffff' : '#000000';\n }\n\n show(y: number, minQty: number, theme: ChartTheme, priceH?: number): void {\n // Apply theme colours — match the main level info box style\n const bg = DraftOrderQtyInput.boxBg(theme);\n const fg = DraftOrderQtyInput.boxFg(theme);\n Object.assign(this.input.style, {\n background: bg,\n color: fg,\n border: `1px solid ${fg}`,\n });\n const span = this.el.firstElementChild as HTMLSpanElement;\n if (span) span.style.color = fg;\n\n this.input.min = String(minQty);\n this.input.step = String(minQty);\n this.input.value = String(this._pendingLots ?? minQty);\n this._pendingLots = null;\n\n // Clamp Y so the overlay stays within the chart area when the draft price\n // is outside the visible viewport. Without this, a very negative or very\n // large top value causes the browser to scroll the page to the focused\n // element, visually breaking the chart layout.\n const clampedY = priceH !== undefined ? Math.max(10, Math.min(priceH - 10, y)) : y;\n this.el.style.top = `${clampedY}px`;\n this.el.style.display = 'flex';\n\n // preventScroll: true guards against any remaining scroll-to-element\n // behaviour when the clamped position is at a chart edge.\n requestAnimationFrame(() => this.input.focus({ preventScroll: true }));\n }\n\n hide(): void {\n this.el.style.display = 'none';\n }\n\n /** Programmatically set the input value. Queues the value for the next show() if currently hidden. */\n setValue(lots: number): void {\n if (this.el.style.display === 'none') {\n this._pendingLots = lots;\n return;\n }\n this.input.value = String(lots);\n }\n\n /** Returns the current quantity; falls back to min if the field is empty or invalid */\n getValue(): number {\n const v = parseFloat(this.input.value);\n return isNaN(v) || v <= 0 ? parseFloat(this.input.min || '1') : v;\n }\n\n setY(y: number, priceH?: number): void {\n const clampedY = priceH !== undefined ? Math.max(10, Math.min(priceH - 10, y)) : y;\n this.el.style.top = `${clampedY}px`;\n }\n\n setTheme(theme: ChartTheme, priceAxisWidth: number): void {\n this.priceAxisWidth = priceAxisWidth;\n this.el.style.right = `${priceAxisWidth + 70}px`;\n const bg = DraftOrderQtyInput.boxBg(theme);\n const fg = DraftOrderQtyInput.boxFg(theme);\n Object.assign(this.input.style, {\n background: bg,\n color: fg,\n border: `1px solid ${fg}`,\n });\n const span = this.el.firstElementChild as HTMLSpanElement;\n if (span) span.style.color = fg;\n }\n\n destroy(): void {\n this.el.remove();\n }\n}\n","import type { ChartTheme } from '../core/themes.js';\nimport { ICON_CLOSE } from './icons.js';\n\nconst INITIAL_LIMIT = 50;\nconst SEARCH_LIMIT = 20;\n\nexport class IsinPickerModal {\n /** Backdrop element — append this to document.body */\n readonly el: HTMLDivElement;\n\n private theme: ChartTheme;\n private panel: HTMLDivElement;\n private listEl: HTMLDivElement;\n private searchInput: HTMLInputElement;\n private onSelect: (isin: string) => void;\n\n private isins: string[] = [];\n private currentSymbol: string = '';\n\n private escHandler: ((e: KeyboardEvent) => void) | null = null;\n\n constructor(theme: ChartTheme, onSelect: (isin: string) => void) {\n this.theme = theme;\n this.onSelect = onSelect;\n\n // ── Backdrop ──────────────────────────────────────────────────────────\n this.el = document.createElement('div');\n Object.assign(this.el.style, {\n position: 'fixed',\n inset: '0',\n background: 'rgba(0,0,0,0.5)',\n display: 'none',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: '1000',\n });\n this.el.addEventListener('mousedown', (e) => {\n if (e.target === this.el) this.hide();\n });\n\n // ── Panel ─────────────────────────────────────────────────────────────\n this.panel = document.createElement('div');\n Object.assign(this.panel.style, {\n display: 'flex',\n flexDirection: 'column',\n width: '360px',\n maxHeight: '520px',\n background: theme.tooltip.background,\n border: `1px solid ${theme.axisBorder}`,\n borderRadius: '6px',\n boxShadow: '0 8px 32px rgba(0,0,0,0.45)',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n fontSize: '12px',\n overflow: 'hidden',\n });\n this.panel.addEventListener('mousedown', (e) => e.stopPropagation());\n this.el.appendChild(this.panel);\n\n // ── Header ────────────────────────────────────────────────────────────\n const header = document.createElement('div');\n Object.assign(header.style, {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '10px 14px',\n borderBottom: `1px solid ${theme.axisBorder}`,\n flexShrink: '0',\n });\n\n const titleEl = document.createElement('span');\n titleEl.textContent = 'Select Symbol';\n Object.assign(titleEl.style, {\n color: theme.tooltip.text,\n fontWeight: '600',\n fontSize: '13px',\n });\n\n const closeBtn = document.createElement('span');\n closeBtn.innerHTML = ICON_CLOSE;\n Object.assign(closeBtn.style, {\n display: 'inline-flex',\n alignItems: 'center',\n color: theme.axisText,\n cursor: 'pointer',\n });\n closeBtn.addEventListener('mouseenter', () => { closeBtn.style.color = theme.tooltip.text; });\n closeBtn.addEventListener('mouseleave', () => { closeBtn.style.color = theme.axisText; });\n closeBtn.addEventListener('click', () => this.hide());\n\n header.appendChild(titleEl);\n header.appendChild(closeBtn);\n this.panel.appendChild(header);\n\n // ── Search input ──────────────────────────────────────────────────────\n const searchWrap = document.createElement('div');\n Object.assign(searchWrap.style, {\n padding: '8px 14px',\n borderBottom: `1px solid ${theme.axisBorder}`,\n flexShrink: '0',\n });\n\n this.searchInput = document.createElement('input');\n this.searchInput.type = 'text';\n this.searchInput.placeholder = 'Search symbols…';\n Object.assign(this.searchInput.style, {\n width: '100%',\n boxSizing: 'border-box',\n background: 'transparent',\n border: `1px solid ${theme.axisBorder}`,\n borderRadius: '4px',\n color: theme.tooltip.text,\n fontSize: '12px',\n padding: '5px 8px',\n outline: 'none',\n });\n this.searchInput.addEventListener('input', () => this.renderList());\n\n searchWrap.appendChild(this.searchInput);\n this.panel.appendChild(searchWrap);\n\n // ── List ──────────────────────────────────────────────────────────────\n this.listEl = document.createElement('div');\n Object.assign(this.listEl.style, {\n overflowY: 'auto',\n flex: '1',\n scrollbarWidth: 'thin',\n scrollbarColor: 'rgba(120,130,150,0.35) transparent',\n });\n this.panel.appendChild(this.listEl);\n }\n\n // ── Public API ────────────────────────────────────────────────────────────\n\n show(isins: string[], currentSymbol: string): void {\n this.isins = isins;\n this.currentSymbol = currentSymbol;\n this.searchInput.value = '';\n this.renderList();\n this.el.style.display = 'flex';\n // Focus search after paint so the input is visible\n requestAnimationFrame(() => this.searchInput.focus());\n\n // Escape key to close\n this.escHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') this.hide();\n };\n document.addEventListener('keydown', this.escHandler);\n }\n\n hide(): void {\n this.el.style.display = 'none';\n if (this.escHandler) {\n document.removeEventListener('keydown', this.escHandler);\n this.escHandler = null;\n }\n }\n\n setCurrentSymbol(symbol: string): void {\n this.currentSymbol = symbol;\n // Refresh highlight if modal is open\n if (this.el.style.display !== 'none') {\n this.renderList();\n }\n }\n\n setIsins(isins: string[]): void {\n this.isins = isins;\n }\n\n setTheme(theme: ChartTheme): void {\n this.theme = theme;\n Object.assign(this.panel.style, {\n background: theme.tooltip.background,\n border: `1px solid ${theme.axisBorder}`,\n });\n }\n\n destroy(): void {\n if (this.escHandler) document.removeEventListener('keydown', this.escHandler);\n this.el.remove();\n }\n\n // ── Private helpers ───────────────────────────────────────────────────────\n\n private sortWithCurrentFirst(items: string[]): string[] {\n if (!this.currentSymbol) return items;\n const idx = items.indexOf(this.currentSymbol);\n if (idx <= 0) return items;\n const sorted = items.slice();\n sorted.splice(idx, 1);\n sorted.unshift(this.currentSymbol);\n return sorted;\n }\n\n private renderList(): void {\n const query = this.searchInput.value.trim().toLowerCase();\n const filtered = this.sortWithCurrentFirst(query\n ? this.isins.filter(s => s.toLowerCase().includes(query)).slice(0, SEARCH_LIMIT)\n : this.isins.slice(0, INITIAL_LIMIT));\n\n this.listEl.innerHTML = '';\n\n if (filtered.length === 0) {\n const empty = document.createElement('div');\n empty.textContent = 'No symbols found';\n Object.assign(empty.style, {\n padding: '16px 14px',\n color: this.theme.axisText,\n textAlign: 'center',\n });\n this.listEl.appendChild(empty);\n return;\n }\n\n for (const isin of filtered) {\n const row = document.createElement('div');\n const isActive = isin === this.currentSymbol;\n Object.assign(row.style, {\n padding: '8px 14px',\n cursor: 'pointer',\n color: isActive ? this.theme.ui.accentText : this.theme.tooltip.text,\n background: isActive ? this.theme.ui.accentBg : 'transparent',\n fontWeight: isActive ? '600' : '400',\n borderLeft: isActive ? `2px solid ${this.theme.ui.accent}` : '2px solid transparent',\n boxSizing: 'border-box',\n userSelect: 'none',\n });\n\n row.textContent = isin;\n\n row.addEventListener('mouseenter', () => {\n if (isin !== this.currentSymbol) {\n row.style.background = this.theme.ui.accentBg;\n }\n });\n row.addEventListener('mouseleave', () => {\n if (isin !== this.currentSymbol) {\n row.style.background = 'transparent';\n }\n });\n row.addEventListener('click', () => {\n this.onSelect(isin);\n this.hide();\n });\n\n this.listEl.appendChild(row);\n }\n }\n}\n","import type { AnyLevel, TradeLevelType } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { PriceRange } from '../core/types.js';\n\n/**\n * Manages the drag lifecycle for trade level lines and bracket (SL/TP) lines.\n *\n * This is NOT a standalone DOM event listener — it is a stateful helper driven\n * entirely by ChartEngine's existing mouse event handlers.\n *\n * Usage:\n * mousedown → startDrag(...)\n * mousemove → onMouseMove(...) → returns live price for floating label\n * mouseup → endDrag() → returns final payload for event emission\n */\nexport class TradeDragHandler {\n private _active = false;\n private _isDraggingBracket = false;\n\n // Main line drag state\n private _level: AnyLevel | null = null;\n private _startY: number = 0;\n private _startPrice: number = 0;\n private _currentPrice: number = 0;\n // Entry-price constraint bounds (applied when SL/TP exist on the level)\n private _mainMinPrice: number = -Infinity;\n private _mainMaxPrice: number = +Infinity;\n\n // Bracket drag state\n private _bracketType: 'stopLoss' | 'takeProfit' | null = null;\n private _bracketStartPrice: number = 0;\n private _bracketCurrentPrice: number = 0;\n\n // Bracket constraint state (populated on startBracketDrag)\n private _bracketParentPrice: number = 0;\n private _bracketParentSide: 'buy' | 'sell' = 'buy';\n private _bracketMarketPrice: number = 0; // current market price at drag start\n\n /**\n * Starts dragging a main level line.\n * Pass `slPrice` / `tpPrice` / `side` to constrain the drag between SL and TP\n * (used for ES/EL entry orders where the entry price must stay between brackets).\n */\n startDrag(\n level: AnyLevel,\n startY: number,\n startPrice: number,\n slPrice?: number,\n tpPrice?: number,\n side?: 'buy' | 'sell',\n marketPrice?: number,\n orderType?: 'limit' | 'stop' | 'market',\n ): void {\n this._active = true;\n this._isDraggingBracket = false;\n this._level = level;\n this._startY = startY;\n this._startPrice = startPrice;\n this._currentPrice = startPrice;\n this._bracketType = null;\n\n // Compute constraint bounds from SL/TP\n if (slPrice !== undefined || tpPrice !== undefined) {\n const s = side ?? 'buy';\n if (s === 'buy') {\n this._mainMinPrice = slPrice ?? -Infinity;\n this._mainMaxPrice = tpPrice ?? +Infinity;\n } else {\n this._mainMinPrice = tpPrice ?? -Infinity;\n this._mainMaxPrice = slPrice ?? +Infinity;\n }\n } else {\n this._mainMinPrice = -Infinity;\n this._mainMaxPrice = +Infinity;\n }\n\n // Market-side constraint for pending order types (not applicable to market orders)\n if (marketPrice && marketPrice > 0 && orderType && orderType !== 'market' && side) {\n const mustBeBelowMarket =\n (side === 'buy' && orderType === 'limit') ||\n (side === 'sell' && orderType === 'stop');\n if (mustBeBelowMarket) {\n this._mainMaxPrice = Math.min(this._mainMaxPrice, marketPrice);\n } else {\n this._mainMinPrice = Math.max(this._mainMinPrice, marketPrice);\n }\n }\n }\n\n /**\n * Starts dragging a bracket (SL/TP) line.\n * @param parentLevel Parent level\n * @param bracketType 'stopLoss' | 'takeProfit'\n * @param startPrice Current bracket price\n */\n startBracketDrag(\n parentLevel: AnyLevel,\n bracketType: 'stopLoss' | 'takeProfit',\n startPrice: number,\n currentMarketPrice: number = 0,\n parentPriceOverride?: number,\n ): void {\n this._active = true;\n this._isDraggingBracket = true;\n this._level = parentLevel;\n this._bracketType = bracketType;\n this._bracketStartPrice = startPrice;\n this._bracketCurrentPrice = startPrice;\n this._bracketParentPrice = parentPriceOverride ?? parentLevel.price;\n this._bracketParentSide = (parentLevel as { side?: 'buy' | 'sell' }).side ?? 'buy';\n this._bracketMarketPrice = currentMarketPrice;\n }\n\n /**\n * Called on every mousemove during an active drag.\n * Returns the live price (main or bracket) for the floating label, or null if not dragging.\n */\n onMouseMove(\n currentY: number,\n scale: ScaleManager,\n priceRange: PriceRange,\n priceH: number,\n ): { newPrice: number; label: string; isBracket: boolean } | null {\n if (!this._active || !this._level) return null;\n\n const rawPrice = scale.pixelToPrice(currentY, priceRange, priceH);\n\n if (this._isDraggingBracket && this._bracketType !== null) {\n const clampedPrice = this._clampBracketPrice(rawPrice, this._bracketType, this._bracketParentPrice, this._bracketParentSide, this._bracketMarketPrice);\n this._bracketCurrentPrice = clampedPrice;\n return {\n newPrice: clampedPrice,\n label: `${this._level.label}:${this._bracketType}`,\n isBracket: true,\n };\n }\n\n // Clamp to SL/TP bounds when they were provided at drag start\n const constrained = Math.max(this._mainMinPrice, Math.min(this._mainMaxPrice, rawPrice));\n this._currentPrice = constrained;\n return {\n newPrice: constrained,\n label: this._level.label,\n isBracket: false,\n };\n }\n\n /**\n * Called on mouseup to finalise the drag.\n * Returns the payload for event emission, or null if not active.\n */\n endDrag(): {\n label: string;\n type: TradeLevelType;\n newPrice: number;\n /** Price when the drag started — use this as oldPrice when recording pending changes. */\n startPrice: number;\n data: unknown;\n bracketType?: 'stopLoss' | 'takeProfit';\n } | null {\n if (!this._active || !this._level) return null;\n\n const level = this._level;\n let result: ReturnType<TradeDragHandler['endDrag']>;\n\n if (this._isDraggingBracket && this._bracketType !== null) {\n result = {\n label: level.label,\n type: level.type,\n newPrice: this._bracketCurrentPrice,\n startPrice: this._bracketStartPrice,\n data: level.data,\n bracketType: this._bracketType,\n };\n } else {\n result = {\n label: level.label,\n type: level.type,\n newPrice: this._currentPrice,\n startPrice: this._startPrice,\n data: level.data,\n };\n }\n\n this._reset();\n return result;\n }\n\n /** Cancels any in-progress drag without emitting. */\n cancelDrag(): void {\n this._reset();\n }\n\n get active(): boolean {\n return this._active;\n }\n\n /** The label of the level being dragged (or `label:bracketType` for bracket drag). */\n get dragLabel(): string | null {\n if (!this._active || !this._level) return null;\n if (this._isDraggingBracket && this._bracketType) {\n return `${this._level.label}:${this._bracketType}`;\n }\n return this._level.label;\n }\n\n /** The live price during an active drag (for use in renderTradeLayer). */\n get currentPrice(): number | null {\n if (!this._active) return null;\n return this._isDraggingBracket\n ? this._bracketCurrentPrice\n : this._currentPrice;\n }\n\n // ── Private helpers ────────────────────────────────────────────────────────\n\n /**\n * Returns whether `price` is a valid placement for a bracket.\n *\n * The boundary is the stricter of `parentPrice` (entry) and\n * `currentMarketPrice` (live price), so neither is crossed:\n *\n * Buy SL → must be below min(entry, market)\n * Buy TP → must be above max(entry, market)\n * Sell SL → must be above max(entry, market)\n * Sell TP → must be below min(entry, market)\n *\n * Pass `currentMarketPrice = 0` (default) to validate against entry only.\n */\n static isBracketPriceValid(\n price: number,\n bracketType: 'stopLoss' | 'takeProfit',\n parentPrice: number,\n parentSide: 'buy' | 'sell',\n currentMarketPrice: number = 0,\n ): boolean {\n const ref = currentMarketPrice > 0\n ? (parentSide === 'buy'\n ? (bracketType === 'stopLoss'\n ? Math.min(parentPrice, currentMarketPrice) // buy SL: below both\n : Math.max(parentPrice, currentMarketPrice)) // buy TP: above both\n : (bracketType === 'stopLoss'\n ? Math.max(parentPrice, currentMarketPrice) // sell SL: above both\n : Math.min(parentPrice, currentMarketPrice))) // sell TP: below both\n : parentPrice;\n\n if (parentSide === 'buy') {\n return bracketType === 'stopLoss' ? price < ref : price > ref;\n }\n return bracketType === 'stopLoss' ? price > ref : price < ref;\n }\n\n /**\n * Clamps `rawPrice` to the valid side of the boundary price.\n * Snaps to the boundary itself when the limit is hit, giving visual\n * feedback without allowing the line to cross the constraint.\n */\n private _clampBracketPrice(\n rawPrice: number,\n bracketType: 'stopLoss' | 'takeProfit',\n parentPrice: number,\n parentSide: 'buy' | 'sell',\n currentMarketPrice: number = 0,\n ): number {\n if (TradeDragHandler.isBracketPriceValid(rawPrice, bracketType, parentPrice, parentSide, currentMarketPrice)) {\n return rawPrice;\n }\n // Snap to the boundary so the line sticks at the limit visually\n if (currentMarketPrice > 0) {\n return parentSide === 'buy'\n ? (bracketType === 'stopLoss'\n ? Math.min(parentPrice, currentMarketPrice)\n : Math.max(parentPrice, currentMarketPrice))\n : (bracketType === 'stopLoss'\n ? Math.max(parentPrice, currentMarketPrice)\n : Math.min(parentPrice, currentMarketPrice));\n }\n return parentPrice;\n }\n\n private _reset(): void {\n this._active = false;\n this._isDraggingBracket = false;\n this._level = null;\n this._bracketType = null;\n this._currentPrice = 0;\n this._mainMinPrice = -Infinity;\n this._mainMaxPrice = +Infinity;\n this._bracketStartPrice = 0;\n this._bracketCurrentPrice = 0;\n this._bracketParentPrice = 0;\n this._bracketParentSide = 'buy';\n this._bracketMarketPrice = 0;\n }\n}\n","import type { OHLCVBar } from '../core/types.js';\n\nexport type PriceSource = 'open' | 'high' | 'low' | 'close';\n\nexport function getSource(bar: OHLCVBar, source: PriceSource): number {\n return bar[source];\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class SMA implements IIndicator {\n readonly name: string;\n readonly color: string;\n\n constructor(\n private readonly period: number,\n color = '#F5A623',\n name = 'MA',\n private readonly source: PriceSource = 'close',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((_, i) => {\n if (i < this.period - 1) return { index: i, value: null };\n let sum = 0;\n for (let j = i - this.period + 1; j <= i; j++) sum += getSource(data[j], this.source);\n return { index: i, value: sum / this.period };\n });\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const priceRange = getPriceRangeFromCtx(ctx);\n if (!priceRange) return;\n\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n\n let started = false;\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n\n ctx.stroke();\n }\n}\n\n// Helper — ChartEngine injects priceRange via canvas dataset\nfunction getPriceRangeFromCtx(ctx: CanvasRenderingContext2D) {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n return canvas._priceRange ?? null;\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class EMA implements IIndicator {\n readonly name: string;\n readonly color: string;\n\n constructor(\n private readonly period: number,\n color = '#9B59B6',\n name = 'EMA',\n private readonly source: PriceSource = 'close',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const k = 2 / (this.period + 1);\n const results: IndicatorResult[] = [];\n let ema: number | null = null;\n\n for (let i = 0; i < data.length; i++) {\n if (i < this.period - 1) {\n results.push({ index: i, value: null });\n continue;\n }\n if (ema === null) {\n // Seed with SMA\n let sum = 0;\n for (let j = 0; j < this.period; j++) sum += getSource(data[i - j], this.source);\n ema = sum / this.period;\n } else {\n ema = getSource(data[i], this.source) * k + ema * (1 - k);\n }\n results.push({ index: i, value: ema });\n }\n\n return results;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n\n let started = false;\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class WMA implements IIndicator {\n readonly name: string;\n readonly color: string;\n\n constructor(\n private readonly period = 20,\n color = '#e91e63',\n name = 'WMA',\n private readonly source: PriceSource = 'close',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const denominator = (this.period * (this.period + 1)) / 2;\n const results: IndicatorResult[] = [];\n\n for (let i = 0; i < data.length; i++) {\n if (i < this.period - 1) {\n results.push({ index: i, value: null });\n continue;\n }\n let wma = 0;\n for (let j = 0; j < this.period; j++) {\n // j=0 is oldest, j=period-1 is newest; weight = j+1\n wma += getSource(data[i - (this.period - 1 - j)], this.source) * (j + 1);\n }\n results.push({ index: i, value: wma / denominator });\n }\n\n return results;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nfunction computeWMA(data: number[], period: number): (number | null)[] {\n const denominator = (period * (period + 1)) / 2;\n const results: (number | null)[] = [];\n\n for (let i = 0; i < data.length; i++) {\n if (i < period - 1) {\n results.push(null);\n continue;\n }\n let wma = 0;\n for (let j = 0; j < period; j++) {\n // j=0 is oldest, j=period-1 is newest; weight = j+1\n wma += data[i - (period - 1 - j)] * (j + 1);\n }\n results.push(wma / denominator);\n }\n\n return results;\n}\n\nexport class HMA implements IIndicator {\n readonly name: string;\n readonly color: string;\n\n constructor(\n private readonly period = 20,\n color = '#00bcd4',\n name = 'HMA',\n private readonly source: PriceSource = 'close',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const closes = data.map((b) => getSource(b, this.source));\n const halfPeriod = Math.floor(this.period / 2);\n const sqrtPeriod = Math.floor(Math.sqrt(this.period));\n\n // Step 1: WMA(n/2) and WMA(n) on closes\n const wmaHalf = computeWMA(closes, halfPeriod);\n const wmaFull = computeWMA(closes, this.period);\n\n // Step 2: diff[i] = 2 * wmaHalf[i] - wmaFull[i]\n const diff: (number | null)[] = wmaHalf.map((half, i) => {\n const full = wmaFull[i];\n if (half === null || full === null) return null;\n return 2 * half - full;\n });\n\n // Step 3: WMA(sqrt(n)) on diff, treating nulls as 0 for computation\n // but only emit values from indices where diff was not null\n const diffForWma = diff.map((v) => (v === null ? 0 : v));\n const hmaRaw = computeWMA(diffForWma, sqrtPeriod);\n\n return data.map((_, i) => {\n // Only valid if the diff at the start of the window was not null\n const windowStart = i - sqrtPeriod + 1;\n if (windowStart < 0) return { index: i, value: null };\n // Check that all diff values in the window were valid\n const allDiffValid = diff[windowStart] !== null && diff[i] !== null;\n if (!allDiffValid || hmaRaw[i] === null) return { index: i, value: null };\n return { index: i, value: hmaRaw[i] };\n });\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nconst RIBBON_PERIODS = [5, 10, 20, 50, 100] as const;\nconst RIBBON_COLORS = ['#ff6b6b', '#ffd93d', '#6bcb77', '#4d96ff', '#c77dff'] as const;\n\nexport class MARibbon implements IIndicator {\n readonly name = 'MARibbon';\n readonly color: string;\n\n constructor(\n color = '#ffcc80',\n private readonly source: PriceSource = 'close',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const sma = (endIndex: number, period: number): number | null => {\n if (endIndex < period - 1) return null;\n let sum = 0;\n for (let j = endIndex - period + 1; j <= endIndex; j++) sum += getSource(data[j], this.source);\n return sum / period;\n };\n\n return data.map((_, i) => ({\n index: i,\n value: sma(i, 5), // SMA5\n upper: sma(i, 10), // SMA10\n lower: sma(i, 20), // SMA20\n signal: sma(i, 50), // SMA50\n histogram: sma(i, 100), // SMA100\n }));\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n ctx.lineWidth = 1;\n ctx.lineJoin = 'round';\n\n type ValueKey = 'value' | 'upper' | 'lower' | 'signal' | 'histogram';\n const keys: ValueKey[] = ['value', 'upper', 'lower', 'signal', 'histogram'];\n\n for (let li = 0; li < RIBBON_PERIODS.length; li++) {\n const key = keys[li];\n const lineColor = RIBBON_COLORS[li];\n\n ctx.beginPath();\n ctx.strokeStyle = lineColor;\n let started = false;\n\n for (const r of results) {\n const val = r[key];\n if (val == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(val, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class BollingerBands implements IIndicator {\n readonly name: string;\n readonly color: string;\n\n constructor(\n private readonly period = 20,\n private readonly stdDevMultiplier = 2,\n color = '#3B82F6',\n name = 'BB',\n private readonly source: PriceSource = 'close',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((_, i) => {\n if (i < this.period - 1) return { index: i, value: null, upper: null, lower: null };\n\n const slice = data.slice(i - this.period + 1, i + 1).map((b) => getSource(b, this.source));\n const mean = slice.reduce((s, v) => s + v, 0) / this.period;\n const variance = slice.reduce((s, v) => s + (v - mean) ** 2, 0) / this.period;\n const std = Math.sqrt(variance);\n\n return {\n index: i,\n value: mean,\n upper: mean + std * this.stdDevMultiplier,\n lower: mean - std * this.stdDevMultiplier,\n };\n });\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n ctx.lineWidth = 1;\n ctx.lineJoin = 'round';\n\n const drawLine = (getValue: (r: IndicatorResult) => number | null | undefined, dash = false) => {\n if (dash) ctx.setLineDash([4, 3]);\n ctx.beginPath();\n let started = false;\n for (const r of results) {\n const val = getValue(r);\n if (val == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(val, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n if (dash) ctx.setLineDash([]);\n };\n\n ctx.strokeStyle = this.color;\n drawLine((r) => r.value); // Middle band (SMA)\n\n ctx.strokeStyle = `${this.color}99`;\n drawLine((r) => r.upper, true); // Upper band\n drawLine((r) => r.lower, true); // Lower band\n\n // Fill band area\n const upperPoints: [number, number][] = [];\n const lowerPoints: [number, number][] = [];\n\n for (const r of results) {\n if (r.upper == null || r.lower == null) continue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n upperPoints.push([x, scale.yToPixel(r.upper, priceRange, chartHeight)]);\n lowerPoints.push([x, scale.yToPixel(r.lower, priceRange, chartHeight)]);\n }\n\n if (upperPoints.length < 2) return;\n\n ctx.beginPath();\n upperPoints.forEach(([x, y], i) => i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y));\n lowerPoints.reverse().forEach(([x, y]) => ctx.lineTo(x, y));\n ctx.closePath();\n ctx.fillStyle = `${this.color}12`;\n ctx.fill();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class KeltnerChannels implements IIndicator {\n readonly name: string;\n readonly color: string;\n\n constructor(\n private readonly period = 20,\n private readonly mult = 2,\n private readonly atrPeriod = 10,\n color = '#4caf50',\n name = 'KC',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n const emaK = 2 / (this.period + 1);\n\n let ema: number | null = null;\n let atr: number | null = null;\n\n for (let i = 0; i < data.length; i++) {\n const bar = data[i];\n\n // EMA of close, seeded with SMA\n if (i < this.period - 1) {\n results.push({ index: i, value: null, upper: null, lower: null });\n continue;\n }\n\n if (ema === null) {\n let sum = 0;\n for (let j = 0; j < this.period; j++) sum += data[i - j].close;\n ema = sum / this.period;\n } else {\n ema = bar.close * emaK + ema * (1 - emaK);\n }\n\n // ATR using Wilder's smoothing\n const tr = i === 0\n ? bar.high - bar.low\n : Math.max(\n bar.high - bar.low,\n Math.abs(bar.high - data[i - 1].close),\n Math.abs(bar.low - data[i - 1].close),\n );\n\n if (atr === null) {\n if (i < this.atrPeriod) {\n // Accumulate until we have enough bars for initial ATR seed\n results.pop();\n results.push({ index: i, value: null, upper: null, lower: null });\n // Temporarily track a running sum via a local variable approach:\n // We'll recompute ATR seed once we reach atrPeriod\n if (i === this.atrPeriod - 1) {\n let trSum = 0;\n for (let j = 0; j < this.atrPeriod; j++) {\n const b = data[i - j];\n const prev = data[i - j - 1];\n const trj = j === i\n ? b.high - b.low\n : Math.max(\n b.high - b.low,\n Math.abs(b.high - prev.close),\n Math.abs(b.low - prev.close),\n );\n trSum += trj;\n }\n atr = trSum / this.atrPeriod;\n }\n continue;\n }\n } else {\n atr = (atr * (this.atrPeriod - 1) + tr) / this.atrPeriod;\n }\n\n if (atr === null) {\n results.push({ index: i, value: null, upper: null, lower: null });\n continue;\n }\n\n const upper = ema + this.mult * atr;\n const lower = ema - this.mult * atr;\n results.push({ index: i, value: ema, upper, lower });\n }\n\n return results;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n ctx.lineWidth = 1;\n ctx.lineJoin = 'round';\n\n const drawLine = (getValue: (r: IndicatorResult) => number | null | undefined, dash = false) => {\n if (dash) ctx.setLineDash([4, 3]);\n ctx.beginPath();\n let started = false;\n for (const r of results) {\n const val = getValue(r);\n if (val == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(val, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n if (dash) ctx.setLineDash([]);\n };\n\n // Middle line (EMA) — solid\n ctx.strokeStyle = this.color;\n drawLine((r) => r.value);\n\n // Upper and lower — dashed\n ctx.strokeStyle = `${this.color}99`;\n drawLine((r) => r.upper, true);\n drawLine((r) => r.lower, true);\n\n // Fill between upper and lower\n const upperPoints: [number, number][] = [];\n const lowerPoints: [number, number][] = [];\n\n for (const r of results) {\n if (r.upper == null || r.lower == null) continue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n upperPoints.push([x, scale.yToPixel(r.upper, priceRange, chartHeight)]);\n lowerPoints.push([x, scale.yToPixel(r.lower, priceRange, chartHeight)]);\n }\n\n if (upperPoints.length < 2) return;\n\n ctx.beginPath();\n upperPoints.forEach(([x, y], i) => i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y));\n lowerPoints.reverse().forEach(([x, y]) => ctx.lineTo(x, y));\n ctx.closePath();\n ctx.fillStyle = `${this.color}12`;\n ctx.fill();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class DonchianChannels implements IIndicator {\n readonly name = 'DC';\n readonly color: string;\n\n constructor(\n private readonly period = 20,\n color = '#26c6da',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((_, i) => {\n if (i < this.period - 1) return { index: i, value: null, upper: null, lower: null };\n\n let highest = -Infinity;\n let lowest = Infinity;\n for (let j = i - this.period + 1; j <= i; j++) {\n if (data[j].high > highest) highest = data[j].high;\n if (data[j].low < lowest) lowest = data[j].low;\n }\n\n const middle = (highest + lowest) / 2;\n return { index: i, value: middle, upper: highest, lower: lowest };\n });\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n ctx.lineWidth = 1;\n ctx.lineJoin = 'round';\n\n const drawLine = (getValue: (r: IndicatorResult) => number | null | undefined, dash = false) => {\n if (dash) ctx.setLineDash([4, 3]);\n ctx.beginPath();\n let started = false;\n for (const r of results) {\n const val = getValue(r);\n if (val == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(val, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n if (dash) ctx.setLineDash([]);\n };\n\n // Middle line — dashed, full color\n ctx.strokeStyle = this.color;\n drawLine((r) => r.value, true);\n\n // Upper and lower — solid, 60% opacity\n ctx.strokeStyle = `${this.color}99`;\n drawLine((r) => r.upper);\n drawLine((r) => r.lower);\n\n // Fill between upper and lower at 8% opacity\n const upperPoints: [number, number][] = [];\n const lowerPoints: [number, number][] = [];\n\n for (const r of results) {\n if (r.upper == null || r.lower == null) continue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n upperPoints.push([x, scale.yToPixel(r.upper, priceRange, chartHeight)]);\n lowerPoints.push([x, scale.yToPixel(r.lower, priceRange, chartHeight)]);\n }\n\n if (upperPoints.length < 2) return;\n\n ctx.beginPath();\n upperPoints.forEach(([x, y], i) => i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y));\n lowerPoints.slice().reverse().forEach(([x, y]) => ctx.lineTo(x, y));\n ctx.closePath();\n ctx.fillStyle = `${this.color}14`;\n ctx.fill();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class ATR implements IIndicator {\n readonly name: string;\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly period: number = 14,\n color = '#ff5722',\n name = 'ATR',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n\n if (data.length === 0) return results;\n\n // Compute True Range values\n const tr: number[] = [];\n for (let i = 0; i < data.length; i++) {\n if (i === 0) {\n tr.push(data[i].high - data[i].low);\n } else {\n const prevClose = data[i - 1].close;\n tr.push(Math.max(\n data[i].high - data[i].low,\n Math.abs(data[i].high - prevClose),\n Math.abs(data[i].low - prevClose),\n ));\n }\n }\n\n // Need at least `period` bars to compute first ATR\n if (data.length < this.period) {\n return data.map((_, i) => ({ index: i, value: null }));\n }\n\n // Seed with SMA of first `period` TR values\n let atr = 0;\n for (let i = 0; i < this.period; i++) {\n atr += tr[i];\n }\n atr /= this.period;\n\n // Fill nulls before first ATR value\n for (let i = 0; i < this.period - 1; i++) {\n results.push({ index: i, value: null });\n }\n\n // First ATR value at index period-1\n results.push({ index: this.period - 1, value: atr });\n\n // Wilder's smoothing for subsequent values\n for (let i = this.period; i < data.length; i++) {\n atr = (atr * (this.period - 1) + tr[i]) / this.period;\n results.push({ index: i, value: atr });\n }\n\n return results;\n }\n\n getValueRange(results: IndicatorResult[]): PriceRange {\n let maxVal = 0.0001;\n for (const r of results) {\n if (r.value != null) maxVal = Math.max(maxVal, r.value);\n }\n return { min: 0, max: maxVal * 1.2 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n // Compute range from results\n let maxVal = 0.0001;\n for (const r of results) {\n if (r.value != null) maxVal = Math.max(maxVal, r.value);\n }\n const range = rangeOverride ?? { min: 0, max: maxVal * 1.2 };\n\n // Collect path points\n const points: { x: number; y: number }[] = [];\n for (const r of results) {\n if (r.value == null) continue;\n points.push({\n x: scale.xToPixel(r.index, viewport, chartWidth),\n y: scale.yToPixel(r.value, range, paneHeight),\n });\n }\n\n if (points.length === 0) return;\n\n // Filled area under line\n const baseY = scale.yToPixel(0, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(points[0].x, baseY);\n for (const p of points) ctx.lineTo(p.x, p.y);\n ctx.lineTo(points[points.length - 1].x, baseY);\n ctx.closePath();\n ctx.fillStyle = this.color + '33';\n ctx.fill();\n\n // Line on top\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class RSI implements IIndicator {\n readonly name: string;\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly period: number = 14,\n color = '#e8b84b',\n name = 'RSI',\n private readonly source: PriceSource = 'close',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n\n if (data.length < this.period + 1) {\n return data.map((_, i) => ({ index: i, value: null }));\n }\n\n // Wilder's smoothing: seed with simple average, then exponential\n let avgGain = 0;\n let avgLoss = 0;\n\n // Initial average over first `period` changes\n for (let i = 1; i <= this.period; i++) {\n const delta = getSource(data[i], this.source) - getSource(data[i - 1], this.source);\n if (delta > 0) avgGain += delta;\n else avgLoss += Math.abs(delta);\n }\n avgGain /= this.period;\n avgLoss /= this.period;\n\n // Fill nulls for bars before we have a result\n for (let i = 0; i < this.period; i++) {\n results.push({ index: i, value: null });\n }\n\n // First RSI value\n const rs0 = avgLoss === 0 ? Infinity : avgGain / avgLoss;\n results.push({ index: this.period, value: avgLoss === 0 ? 100 : 100 - 100 / (1 + rs0) });\n\n // Subsequent values via Wilder's smoothing\n for (let i = this.period + 1; i < data.length; i++) {\n const delta = getSource(data[i], this.source) - getSource(data[i - 1], this.source);\n const gain = delta > 0 ? delta : 0;\n const loss = delta < 0 ? Math.abs(delta) : 0;\n avgGain = (avgGain * (this.period - 1) + gain) / this.period;\n avgLoss = (avgLoss * (this.period - 1) + loss) / this.period;\n const rs = avgLoss === 0 ? Infinity : avgGain / avgLoss;\n results.push({ index: i, value: avgLoss === 0 ? 100 : 100 - 100 / (1 + rs) });\n }\n\n return results;\n }\n\n getValueRange(_results: IndicatorResult[]): PriceRange {\n return { min: 0, max: 100 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n const range = rangeOverride ?? { min: 0, max: 100 };\n\n // Overbought / oversold fill zones\n const y70 = scale.yToPixel(70, range, paneHeight);\n const y30 = scale.yToPixel(30, range, paneHeight);\n\n ctx.fillStyle = 'rgba(239,83,80,0.06)';\n ctx.fillRect(0, 0, chartWidth, y70);\n\n ctx.fillStyle = 'rgba(38,166,154,0.06)';\n ctx.fillRect(0, y30, chartWidth, paneHeight - y30);\n\n // Reference lines\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n for (const level of [70, 50, 30]) {\n const y = scale.yToPixel(level, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n ctx.restore();\n\n // RSI line\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class Stochastic implements IIndicator {\n readonly name = 'Stoch';\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly kPeriod: number = 14,\n private readonly dPeriod: number = 3,\n color = '#e040fb',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n const kValues: (number | null)[] = [];\n\n for (let i = 0; i < data.length; i++) {\n if (i < this.kPeriod - 1) {\n kValues.push(null);\n results.push({ index: i, value: null, upper: null });\n continue;\n }\n\n let lowestLow = Infinity;\n let highestHigh = -Infinity;\n for (let j = i - this.kPeriod + 1; j <= i; j++) {\n if (data[j].low < lowestLow) lowestLow = data[j].low;\n if (data[j].high > highestHigh) highestHigh = data[j].high;\n }\n\n const denom = highestHigh - lowestLow;\n const k = denom === 0 ? 50 : ((data[i].close - lowestLow) / denom) * 100;\n kValues.push(k);\n results.push({ index: i, value: k, upper: null });\n }\n\n // Compute %D = SMA(dPeriod) of %K\n for (let i = 0; i < data.length; i++) {\n const kVal = kValues[i];\n if (kVal === null) continue;\n\n // Check if we have enough non-null kValues ending at i\n let count = 0;\n let sum = 0;\n for (let j = i; j >= 0 && count < this.dPeriod; j--) {\n if (kValues[j] === null) break;\n sum += kValues[j] as number;\n count++;\n }\n if (count === this.dPeriod) {\n results[i].upper = sum / this.dPeriod;\n }\n }\n\n return results;\n }\n\n getValueRange(_results: IndicatorResult[]): PriceRange {\n return { min: 0, max: 100 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n const range = rangeOverride ?? { min: 0, max: 100 };\n\n // Overbought zone (80-100) red fill\n const y80 = scale.yToPixel(80, range, paneHeight);\n const y20 = scale.yToPixel(20, range, paneHeight);\n\n ctx.fillStyle = 'rgba(239,83,80,0.06)';\n ctx.fillRect(0, 0, chartWidth, y80);\n\n ctx.fillStyle = 'rgba(38,166,154,0.06)';\n ctx.fillRect(0, y20, chartWidth, paneHeight - y20);\n\n // Reference lines at 80, 50, 20\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n for (const level of [80, 50, 20]) {\n const y = scale.yToPixel(level, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n ctx.restore();\n\n // %K line (this.color)\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n\n // %D line (orange)\n ctx.beginPath();\n ctx.strokeStyle = '#ff9800';\n ctx.lineWidth = 1;\n ctx.lineJoin = 'round';\n started = false;\n for (const r of results) {\n if (r.upper == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.upper, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nfunction computeSMA(values: (number | null)[], period: number): (number | null)[] {\n const result: (number | null)[] = [];\n for (let i = 0; i < values.length; i++) {\n if (i < period - 1) { result.push(null); continue; }\n let sum = 0;\n let valid = true;\n for (let j = i - period + 1; j <= i; j++) {\n if (values[j] === null) { valid = false; break; }\n sum += values[j] as number;\n }\n result.push(valid ? sum / period : null);\n }\n return result;\n}\n\nexport class StochRSI implements IIndicator {\n readonly name = 'StochRSI';\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly rsiPeriod: number = 14,\n private readonly stochPeriod: number = 14,\n private readonly kPeriod: number = 3,\n private readonly dPeriod: number = 3,\n color = '#00e5ff',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n // Step 1: Compute RSI with Wilder's smoothing\n const rsiValues: (number | null)[] = [];\n\n if (data.length < this.rsiPeriod + 1) {\n return data.map((_, i) => ({ index: i, value: null, upper: null }));\n }\n\n let avgGain = 0;\n let avgLoss = 0;\n for (let i = 1; i <= this.rsiPeriod; i++) {\n const delta = data[i].close - data[i - 1].close;\n if (delta > 0) avgGain += delta;\n else avgLoss += Math.abs(delta);\n }\n avgGain /= this.rsiPeriod;\n avgLoss /= this.rsiPeriod;\n\n for (let i = 0; i < this.rsiPeriod; i++) rsiValues.push(null);\n\n const rs0 = avgLoss === 0 ? Infinity : avgGain / avgLoss;\n rsiValues.push(avgLoss === 0 ? 100 : 100 - 100 / (1 + rs0));\n\n for (let i = this.rsiPeriod + 1; i < data.length; i++) {\n const delta = data[i].close - data[i - 1].close;\n const gain = delta > 0 ? delta : 0;\n const loss = delta < 0 ? Math.abs(delta) : 0;\n avgGain = (avgGain * (this.rsiPeriod - 1) + gain) / this.rsiPeriod;\n avgLoss = (avgLoss * (this.rsiPeriod - 1) + loss) / this.rsiPeriod;\n const rs = avgLoss === 0 ? Infinity : avgGain / avgLoss;\n rsiValues.push(avgLoss === 0 ? 100 : 100 - 100 / (1 + rs));\n }\n\n // Step 2: Apply Stochastic formula to RSI values\n const stochRsiValues: (number | null)[] = [];\n for (let i = 0; i < data.length; i++) {\n if (rsiValues[i] === null) { stochRsiValues.push(null); continue; }\n\n // Check we have stochPeriod non-null rsi values ending at i\n if (i < this.rsiPeriod + this.stochPeriod - 1) {\n stochRsiValues.push(null);\n continue;\n }\n\n let minRsi = Infinity;\n let maxRsi = -Infinity;\n let valid = true;\n for (let j = i - this.stochPeriod + 1; j <= i; j++) {\n if (rsiValues[j] === null) { valid = false; break; }\n const v = rsiValues[j] as number;\n if (v < minRsi) minRsi = v;\n if (v > maxRsi) maxRsi = v;\n }\n if (!valid) { stochRsiValues.push(null); continue; }\n\n const denom = maxRsi - minRsi;\n const stoch = denom === 0 ? 50 : ((rsiValues[i] as number) - minRsi) / denom * 100;\n stochRsiValues.push(stoch);\n }\n\n // Step 3: K = SMA(kPeriod) of stochRSI, D = SMA(dPeriod) of K\n const kLine = computeSMA(stochRsiValues, this.kPeriod);\n const dLine = computeSMA(kLine, this.dPeriod);\n\n return data.map((_, i) => ({\n index: i,\n value: kLine[i] ?? null,\n upper: dLine[i] ?? null,\n }));\n }\n\n getValueRange(_results: IndicatorResult[]): PriceRange {\n return { min: 0, max: 100 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n const range = rangeOverride ?? { min: 0, max: 100 };\n\n // Overbought/oversold zone fills\n const y80 = scale.yToPixel(80, range, paneHeight);\n const y20 = scale.yToPixel(20, range, paneHeight);\n\n ctx.fillStyle = 'rgba(239,83,80,0.06)';\n ctx.fillRect(0, 0, chartWidth, y80);\n\n ctx.fillStyle = 'rgba(38,166,154,0.06)';\n ctx.fillRect(0, y20, chartWidth, paneHeight - y20);\n\n // Reference lines at 80, 50, 20\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n for (const level of [80, 50, 20]) {\n const y = scale.yToPixel(level, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n ctx.restore();\n\n // K line (this.color)\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n\n // D line (orange)\n ctx.beginPath();\n ctx.strokeStyle = '#ff9800';\n ctx.lineWidth = 1;\n ctx.lineJoin = 'round';\n started = false;\n for (const r of results) {\n if (r.upper == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.upper, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nfunction computeEMA(data: number[], period: number): (number | null)[] {\n const k = 2 / (period + 1);\n const results: (number | null)[] = [];\n let ema: number | null = null;\n\n for (let i = 0; i < data.length; i++) {\n if (i < period - 1) { results.push(null); continue; }\n if (ema === null) {\n let sum = 0;\n for (let j = 0; j < period; j++) sum += data[i - j];\n ema = sum / period;\n } else {\n ema = data[i] * k + ema * (1 - k);\n }\n results.push(ema);\n }\n return results;\n}\n\nexport class MACD implements IIndicator {\n readonly name: string;\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly fast: number = 12,\n private readonly slow: number = 26,\n private readonly signal: number = 9,\n color = '#2196f3',\n name = 'MACD',\n private readonly source: PriceSource = 'close',\n ) {\n this.name = name;\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const closes = data.map(b => getSource(b, this.source));\n const fastEMA = computeEMA(closes, this.fast);\n const slowEMA = computeEMA(closes, this.slow);\n\n // MACD line = fast EMA - slow EMA (null until both exist)\n const macdLine: (number | null)[] = closes.map((_, i) => {\n if (fastEMA[i] === null || slowEMA[i] === null) return null;\n return (fastEMA[i] as number) - (slowEMA[i] as number);\n });\n\n // Signal line = EMA(signal period) of MACD line\n const macdValues = macdLine.map(v => v ?? 0); // temp: pad with 0 for EMA calc\n const rawSignal = computeEMA(macdValues, this.signal);\n\n return data.map((_, i) => {\n const macd = macdLine[i];\n if (macd === null) return { index: i, value: null, upper: null, lower: null, histogram: null };\n\n // Only emit signal/histogram once signal period has warmed up past slow period\n const signalStart = this.slow - 1 + this.signal - 1;\n const sig = i >= signalStart ? rawSignal[i] : null;\n const hist = macd !== null && sig !== null ? macd - sig : null;\n\n return {\n index: i,\n value: macd, // MACD line\n upper: sig, // Signal line\n lower: hist, // Histogram\n };\n });\n }\n\n getValueRange(results: IndicatorResult[]): PriceRange {\n let maxAbs = 0.0001;\n for (const r of results) {\n if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n if (r.upper != null) maxAbs = Math.max(maxAbs, Math.abs(r.upper));\n if (r.lower != null) maxAbs = Math.max(maxAbs, Math.abs(r.lower));\n }\n return { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n // Dynamic range from visible values\n let maxAbs = 0.0001;\n for (const r of results) {\n if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n if (r.upper != null) maxAbs = Math.max(maxAbs, Math.abs(r.upper));\n if (r.lower != null) maxAbs = Math.max(maxAbs, Math.abs(r.lower));\n }\n const range = rangeOverride ?? { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n const zeroY = scale.yToPixel(0, range, paneHeight);\n\n // Zero line\n ctx.strokeStyle = 'rgba(150,150,150,0.3)';\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, zeroY);\n ctx.lineTo(chartWidth, zeroY);\n ctx.stroke();\n\n // Histogram bars (lower)\n const bodyW = Math.max(scale.candleBodyWidth(viewport, chartWidth), 1);\n for (const r of results) {\n if (r.lower == null) continue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const barY = scale.yToPixel(r.lower, range, paneHeight);\n const h = Math.abs(barY - zeroY);\n const top = Math.min(barY, zeroY);\n ctx.fillStyle = r.lower >= 0 ? 'rgba(38,166,154,0.55)' : 'rgba(239,83,80,0.55)';\n ctx.fillRect(x - bodyW / 2, top, bodyW, h);\n }\n\n // MACD line (value)\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n\n // Signal line (upper)\n ctx.beginPath();\n ctx.strokeStyle = '#ff6b35';\n ctx.lineWidth = 1;\n ctx.lineJoin = 'round';\n started = false;\n for (const r of results) {\n if (r.upper == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.upper, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class CCI implements IIndicator {\n readonly name = 'CCI';\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly period: number = 20,\n color = '#4db6ac',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((_, i) => {\n if (i < this.period - 1) return { index: i, value: null };\n\n const slice = data.slice(i - this.period + 1, i + 1);\n const tpSlice = slice.map(b => (b.high + b.low + b.close) / 3);\n const tp = tpSlice[tpSlice.length - 1];\n const sma = tpSlice.reduce((s, v) => s + v, 0) / this.period;\n const meanDev = tpSlice.reduce((s, v) => s + Math.abs(v - sma), 0) / this.period;\n\n if (meanDev === 0) return { index: i, value: 0 };\n return { index: i, value: (tp - sma) / (0.015 * meanDev) };\n });\n }\n\n getValueRange(results: IndicatorResult[]): PriceRange {\n let maxAbs = 0.0001;\n for (const r of results) {\n if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n }\n return { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n // Dynamic range\n let maxAbs = 0.0001;\n for (const r of results) {\n if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n }\n const range = rangeOverride ?? { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n\n // Overbought zone (above 100) red fill\n const y100 = scale.yToPixel(100, range, paneHeight);\n const yNeg100 = scale.yToPixel(-100, range, paneHeight);\n\n ctx.fillStyle = 'rgba(239,83,80,0.10)';\n ctx.fillRect(0, 0, chartWidth, y100);\n\n ctx.fillStyle = 'rgba(38,166,154,0.10)';\n ctx.fillRect(0, yNeg100, chartWidth, paneHeight - yNeg100);\n\n // Reference lines at 0, 100, -100\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n for (const level of [100, 0, -100]) {\n const y = scale.yToPixel(level, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n ctx.restore();\n\n // CCI line\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class WilliamsR implements IIndicator {\n readonly name = '%R';\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly period: number = 14,\n color = '#ff7043',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((_, i) => {\n if (i < this.period - 1) return { index: i, value: null };\n\n let highestHigh = -Infinity;\n let lowestLow = Infinity;\n for (let j = i - this.period + 1; j <= i; j++) {\n if (data[j].high > highestHigh) highestHigh = data[j].high;\n if (data[j].low < lowestLow) lowestLow = data[j].low;\n }\n\n const denom = highestHigh - lowestLow;\n const r = denom === 0 ? -50 : ((highestHigh - data[i].close) / denom) * -100;\n return { index: i, value: r };\n });\n }\n\n getValueRange(_results: IndicatorResult[]): PriceRange {\n return { min: -100, max: 0 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n const range = rangeOverride ?? { min: -100, max: 0 };\n\n // Overbought zone (-20 to 0) red fill\n const yNeg20 = scale.yToPixel(-20, range, paneHeight);\n const yNeg80 = scale.yToPixel(-80, range, paneHeight);\n\n ctx.fillStyle = 'rgba(239,83,80,0.06)';\n ctx.fillRect(0, 0, chartWidth, yNeg20);\n\n ctx.fillStyle = 'rgba(38,166,154,0.06)';\n ctx.fillRect(0, yNeg80, chartWidth, paneHeight - yNeg80);\n\n // Reference lines at -20, -50, -80\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n for (const level of [-20, -50, -80]) {\n const y = scale.yToPixel(level, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n ctx.restore();\n\n // %R line\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class ROC implements IIndicator {\n readonly name: string;\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly period: number = 12,\n color = '#80cbc4',\n private readonly source: PriceSource = 'close',\n ) {\n this.name = 'ROC';\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((_, i) => {\n if (i < this.period) return { index: i, value: null };\n const prev = getSource(data[i - this.period], this.source);\n if (prev === 0) return { index: i, value: null };\n return { index: i, value: (getSource(data[i], this.source) - prev) / prev * 100 };\n });\n }\n\n getValueRange(results: IndicatorResult[]): PriceRange {\n let maxAbs = 0.0001;\n for (const r of results) {\n if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n }\n return { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n // Dynamic range centered on 0\n let maxAbs = 0.0001;\n for (const r of results) {\n if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n }\n const range = rangeOverride ?? { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n const zeroY = scale.yToPixel(0, range, paneHeight);\n\n // Collect valid points\n const points: { x: number; y: number; value: number }[] = [];\n for (const r of results) {\n if (r.value == null) continue;\n points.push({\n x: scale.xToPixel(r.index, viewport, chartWidth),\n y: scale.yToPixel(r.value, range, paneHeight),\n value: r.value,\n });\n }\n\n // Area fill: above zero green, below zero red\n if (points.length >= 2) {\n // Above zero fill\n ctx.beginPath();\n ctx.moveTo(points[0].x, zeroY);\n for (const p of points) {\n ctx.lineTo(p.x, Math.min(p.y, zeroY));\n }\n ctx.lineTo(points[points.length - 1].x, zeroY);\n ctx.closePath();\n ctx.fillStyle = 'rgba(38,166,154,0.05)';\n ctx.fill();\n\n // Below zero fill\n ctx.beginPath();\n ctx.moveTo(points[0].x, zeroY);\n for (const p of points) {\n ctx.lineTo(p.x, Math.max(p.y, zeroY));\n }\n ctx.lineTo(points[points.length - 1].x, zeroY);\n ctx.closePath();\n ctx.fillStyle = 'rgba(239,83,80,0.05)';\n ctx.fill();\n }\n\n // Zero dashed line\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, zeroY);\n ctx.lineTo(chartWidth, zeroY);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.restore();\n\n // ROC line\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class OBV implements IIndicator {\n readonly name = 'OBV';\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(color = '#aed581') {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n let obv = 0;\n\n for (let i = 0; i < data.length; i++) {\n if (i === 0) {\n obv = data[i].volume ?? 0;\n } else {\n if (data[i].close > data[i - 1].close) {\n obv += data[i].volume ?? 0;\n } else if (data[i].close < data[i - 1].close) {\n obv -= data[i].volume ?? 0;\n }\n // else unchanged\n }\n results.push({ index: i, value: obv });\n }\n\n return results;\n }\n\n getValueRange(results: IndicatorResult[]): PriceRange {\n let minVal = Infinity;\n let maxVal = -Infinity;\n for (const r of results) {\n if (r.value != null) {\n if (r.value < minVal) minVal = r.value;\n if (r.value > maxVal) maxVal = r.value;\n }\n }\n if (minVal === Infinity) return { min: 0, max: 1 };\n const padding = (maxVal - minVal) * 0.1 || 1;\n return { min: minVal - padding, max: maxVal + padding };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n // Dynamic range from min/max OBV\n let minVal = Infinity;\n let maxVal = -Infinity;\n for (const r of results) {\n if (r.value != null) {\n if (r.value < minVal) minVal = r.value;\n if (r.value > maxVal) maxVal = r.value;\n }\n }\n if (minVal === Infinity) return;\n\n const padding = (maxVal - minVal) * 0.1 || 1;\n const range = rangeOverride ?? { min: minVal - padding, max: maxVal + padding };\n const zeroY = scale.yToPixel(0, range, paneHeight);\n\n // Collect valid points\n const points: { x: number; y: number; value: number }[] = [];\n for (const r of results) {\n if (r.value == null) continue;\n points.push({\n x: scale.xToPixel(r.index, viewport, chartWidth),\n y: scale.yToPixel(r.value, range, paneHeight),\n value: r.value,\n });\n }\n\n if (points.length === 0) return;\n\n // Baseline / zero line\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, zeroY);\n ctx.lineTo(chartWidth, zeroY);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.restore();\n\n // Area fill under OBV line — green tint if positive, red tint if negative\n // Use a split fill based on current OBV relative to zero\n if (points.length >= 2) {\n ctx.beginPath();\n ctx.moveTo(points[0].x, zeroY);\n for (const p of points) ctx.lineTo(p.x, p.y);\n ctx.lineTo(points[points.length - 1].x, zeroY);\n ctx.closePath();\n // Use the last point's value to determine dominant fill color\n const lastVal = points[points.length - 1].value;\n ctx.fillStyle = lastVal >= 0\n ? 'rgba(38,166,154,0.12)'\n : 'rgba(239,83,80,0.12)';\n ctx.fill();\n }\n\n // OBV line\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class VWAP implements IIndicator {\n readonly name = 'VWAP';\n readonly color: string;\n\n constructor(color = '#9c27b0') {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n let cumTPV = 0; // cumulative (typicalPrice * volume)\n let cumVol = 0; // cumulative volume\n\n for (let i = 0; i < data.length; i++) {\n const bar = data[i];\n const typicalPrice = (bar.high + bar.low + bar.close) / 3;\n cumTPV += typicalPrice * (bar.volume ?? 0);\n cumVol += bar.volume ?? 0;\n\n results.push({\n index: i,\n value: cumVol === 0 ? null : cumTPV / cumVol,\n });\n }\n\n return results;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n ctx.setLineDash([4, 3]);\n\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n\n ctx.stroke();\n ctx.setLineDash([]);\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class AccDistribution implements IIndicator {\n readonly name = 'A/D';\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(color = '#ce93d8') {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n let ad = 0;\n\n for (let i = 0; i < data.length; i++) {\n const { high, low, close, volume } = data[i];\n const denom = high - low;\n const mfm = denom === 0 ? 0 : ((close - low) - (high - close)) / denom;\n ad += mfm * (volume ?? 0);\n results.push({ index: i, value: ad });\n }\n\n return results;\n }\n\n getValueRange(results: IndicatorResult[]): PriceRange {\n let minVal = Infinity;\n let maxVal = -Infinity;\n for (const r of results) {\n if (r.value != null) {\n if (r.value < minVal) minVal = r.value;\n if (r.value > maxVal) maxVal = r.value;\n }\n }\n if (minVal === Infinity) return { min: 0, max: 1 };\n const padding = (maxVal - minVal) * 0.1 || 1;\n return { min: minVal - padding, max: maxVal + padding };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n // Dynamic range\n let minVal = Infinity;\n let maxVal = -Infinity;\n for (const r of results) {\n if (r.value != null) {\n if (r.value < minVal) minVal = r.value;\n if (r.value > maxVal) maxVal = r.value;\n }\n }\n if (minVal === Infinity) return;\n\n const padding = (maxVal - minVal) * 0.1 || 1;\n const range = rangeOverride ?? { min: minVal - padding, max: maxVal + padding };\n\n // Collect valid points\n const points: { x: number; y: number }[] = [];\n for (const r of results) {\n if (r.value == null) continue;\n points.push({\n x: scale.xToPixel(r.index, viewport, chartWidth),\n y: scale.yToPixel(r.value, range, paneHeight),\n });\n }\n\n if (points.length === 0) return;\n\n // Area fill\n if (points.length >= 2) {\n const baseY = paneHeight;\n ctx.beginPath();\n ctx.moveTo(points[0].x, baseY);\n for (const p of points) ctx.lineTo(p.x, p.y);\n ctx.lineTo(points[points.length - 1].x, baseY);\n ctx.closePath();\n ctx.fillStyle = this.color + '20';\n ctx.fill();\n }\n\n // A/D line\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class MFI implements IIndicator {\n readonly name: string;\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly period: number = 14,\n color = '#ffab40',\n ) {\n this.name = 'MFI';\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n\n // Compute typical price and raw money flow per bar\n const tp: number[] = data.map(b => (b.high + b.low + b.close) / 3);\n const rawMF: number[] = data.map((b, i) => tp[i] * (b.volume ?? 0));\n\n for (let i = 0; i < data.length; i++) {\n if (i < this.period) {\n results.push({ index: i, value: null });\n continue;\n }\n\n let posSum = 0;\n let negSum = 0;\n for (let j = i - this.period + 1; j <= i; j++) {\n if (tp[j] > tp[j - 1]) {\n posSum += rawMF[j];\n } else if (tp[j] < tp[j - 1]) {\n negSum += rawMF[j];\n }\n }\n\n if (negSum === 0) {\n results.push({ index: i, value: 100 });\n } else {\n const mfRatio = posSum / negSum;\n results.push({ index: i, value: 100 - 100 / (1 + mfRatio) });\n }\n }\n\n return results;\n }\n\n getValueRange(_results: IndicatorResult[]): PriceRange {\n return { min: 0, max: 100 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n const range = rangeOverride ?? { min: 0, max: 100 };\n\n // Overbought/oversold zone fills\n const y80 = scale.yToPixel(80, range, paneHeight);\n const y20 = scale.yToPixel(20, range, paneHeight);\n\n ctx.fillStyle = 'rgba(239,83,80,0.06)';\n ctx.fillRect(0, 0, chartWidth, y80);\n\n ctx.fillStyle = 'rgba(38,166,154,0.06)';\n ctx.fillRect(0, y20, chartWidth, paneHeight - y20);\n\n // Reference lines at 80, 50, 20\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n for (const level of [80, 50, 20]) {\n const y = scale.yToPixel(level, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n ctx.restore();\n\n // MFI line\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class CMF implements IIndicator {\n readonly name: string;\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly period: number = 20,\n color = '#80deea',\n ) {\n this.name = 'CMF';\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n // Precompute MFM and MFV per bar\n const mfv: number[] = data.map(b => {\n const denom = b.high - b.low;\n const mfm = denom === 0 ? 0 : ((b.close - b.low) - (b.high - b.close)) / denom;\n return mfm * (b.volume ?? 0);\n });\n\n return data.map((b, i) => {\n if (i < this.period - 1) return { index: i, value: null };\n\n let sumMFV = 0;\n let sumVol = 0;\n for (let j = i - this.period + 1; j <= i; j++) {\n sumMFV += mfv[j];\n sumVol += data[j].volume ?? 0;\n }\n\n const cmf = sumVol === 0 ? 0 : sumMFV / sumVol;\n return { index: i, value: cmf };\n });\n }\n\n getValueRange(_results: IndicatorResult[]): PriceRange {\n return { min: -1, max: 1 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n const range = rangeOverride ?? { min: -1, max: 1 };\n const zeroY = scale.yToPixel(0, range, paneHeight);\n\n // Fill zones above 0.2 (bullish) and below -0.2 (bearish)\n const y02 = scale.yToPixel(0.2, range, paneHeight);\n const yN02 = scale.yToPixel(-0.2, range, paneHeight);\n\n ctx.fillStyle = 'rgba(38,166,154,0.08)';\n ctx.fillRect(0, 0, chartWidth, y02);\n\n ctx.fillStyle = 'rgba(239,83,80,0.08)';\n ctx.fillRect(0, yN02, chartWidth, paneHeight - yN02);\n\n // Reference lines at 0.2, 0, -0.2\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n for (const level of [0.2, 0, -0.2]) {\n const y = scale.yToPixel(level, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n }\n ctx.setLineDash([]);\n ctx.restore();\n\n // Histogram bars\n const bodyW = Math.max(1, chartWidth / Math.max(results.length, 1) * 0.6);\n for (const r of results) {\n if (r.value == null) continue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const barY = scale.yToPixel(r.value, range, paneHeight);\n const h = Math.abs(barY - zeroY);\n const top = Math.min(barY, zeroY);\n ctx.fillStyle = r.value >= 0 ? 'rgba(38,166,154,0.45)' : 'rgba(239,83,80,0.45)';\n ctx.fillRect(x - bodyW / 2, top, bodyW, h);\n }\n\n // CMF line on top\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class PivotPoints implements IIndicator {\n readonly name = 'Pivot';\n readonly color: string;\n\n constructor(color = '#ffd54f') {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((_, i) => {\n if (i === 0) return { index: i, value: null, upper: null, lower: null, signal: null, histogram: null };\n\n const prev = data[i - 1];\n const pp = (prev.high + prev.low + prev.close) / 3;\n const r1 = 2 * pp - prev.low;\n const s1 = 2 * pp - prev.high;\n const r2 = pp + (prev.high - prev.low);\n const s2 = pp - (prev.high - prev.low);\n\n return {\n index: i,\n value: pp, // PP\n upper: r1, // R1\n lower: s1, // S1\n signal: r2, // R2\n histogram: s2, // S2\n };\n });\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n // Find the last non-null result\n let lastResult: IndicatorResult | null = null;\n for (let i = results.length - 1; i >= 0; i--) {\n if (results[i].value !== null) {\n lastResult = results[i];\n break;\n }\n }\n\n if (lastResult === null) return;\n\n const levels: Array<{ value: number | null | undefined; label: string; color: string }> = [\n { value: lastResult.signal, label: 'R2', color: '#b71c1c' },\n { value: lastResult.upper, label: 'R1', color: '#ef5350' },\n { value: lastResult.value, label: 'PP', color: '#ffd54f' },\n { value: lastResult.lower, label: 'S1', color: '#26a69a' },\n { value: lastResult.histogram, label: 'S2', color: '#1b5e20' },\n ];\n\n ctx.lineWidth = 1;\n ctx.font = '10px sans-serif';\n ctx.textBaseline = 'middle';\n\n for (const level of levels) {\n if (level.value == null) continue;\n const y = scale.yToPixel(level.value, priceRange, chartHeight);\n\n // Draw dashed horizontal line across full chart width\n ctx.beginPath();\n ctx.setLineDash([6, 4]);\n ctx.strokeStyle = level.color;\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Draw label on the right side\n ctx.fillStyle = level.color;\n ctx.fillText(level.label, chartWidth - 28, y - 6);\n }\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst FIB_RATIOS = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0] as const;\nconst FIB_LABELS = ['0%', '23.6%', '38.2%', '50%', '61.8%', '78.6%', '100%'] as const;\nconst FIB_COLORS = ['#90a4ae', '#4d96ff', '#6bcb77', '#ffd93d', '#ff9800', '#ef5350', '#90a4ae'] as const;\n\nexport class FibRetracementIndicator implements IIndicator {\n readonly name = 'Fib';\n readonly color: string;\n\n constructor(\n private readonly lookback = 50,\n color = '#e1bee7',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((_, i) => {\n const start = Math.max(0, i - this.lookback + 1);\n let high = -Infinity;\n let low = Infinity;\n for (let j = start; j <= i; j++) {\n if (data[j].high > high) high = data[j].high;\n if (data[j].low < low) low = data[j].low;\n }\n\n const range = high - low;\n\n return {\n index: i,\n value: high, // 100% (top of range)\n upper: low + 0.618 * range, // 61.8%\n lower: low + 0.382 * range, // 38.2%\n signal: low + 0.5 * range, // 50%\n histogram: low, // 0% (bottom of range)\n };\n });\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n // Use the last result's values\n let lastResult: IndicatorResult | null = null;\n for (let i = results.length - 1; i >= 0; i--) {\n if (results[i].value !== null) {\n lastResult = results[i];\n break;\n }\n }\n\n if (lastResult === null) return;\n\n const high = lastResult.value;\n const low = lastResult.histogram;\n\n if (high == null || low == null) return;\n\n const range = high - low;\n\n // Compute all 7 fib levels\n const fibValues = FIB_RATIOS.map((ratio) => low + ratio * range);\n\n ctx.lineWidth = 1;\n ctx.font = '10px sans-serif';\n ctx.textBaseline = 'middle';\n\n for (let fi = 0; fi < FIB_RATIOS.length; fi++) {\n const price = fibValues[fi];\n const y = scale.yToPixel(price, priceRange, chartHeight);\n const color = FIB_COLORS[fi];\n\n ctx.beginPath();\n ctx.setLineDash([6, 4]);\n ctx.strokeStyle = color;\n ctx.moveTo(0, y);\n ctx.lineTo(chartWidth, y);\n ctx.stroke();\n ctx.setLineDash([]);\n\n ctx.fillStyle = color;\n ctx.fillText(FIB_LABELS[fi], chartWidth - 38, y - 6);\n }\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class Supertrend implements IIndicator {\n readonly name = 'Supertrend';\n readonly color: string;\n\n constructor(\n private readonly atrPeriod = 10,\n private readonly multiplier = 3,\n color = '#26a69a',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const n = data.length;\n const results: IndicatorResult[] = [];\n\n if (n === 0) return results;\n\n // Compute True Range\n const tr: number[] = new Array(n).fill(0);\n for (let i = 0; i < n; i++) {\n const high = data[i].high;\n const low = data[i].low;\n const prevClose = i > 0 ? data[i - 1].close : data[i].close;\n tr[i] = Math.max(high - low, Math.abs(high - prevClose), Math.abs(low - prevClose));\n }\n\n // ATR using Wilder's smoothing seeded with SMA\n const atr: number[] = new Array(n).fill(0);\n if (n < this.atrPeriod) {\n for (let i = 0; i < n; i++) results.push({ index: i, value: null, upper: null });\n return results;\n }\n\n // Seed ATR with SMA of first atrPeriod TRs\n let atrSeed = 0;\n for (let i = 0; i < this.atrPeriod; i++) atrSeed += tr[i];\n atr[this.atrPeriod - 1] = atrSeed / this.atrPeriod;\n\n for (let i = this.atrPeriod; i < n; i++) {\n atr[i] = (atr[i - 1] * (this.atrPeriod - 1) + tr[i]) / this.atrPeriod;\n }\n\n // Compute Supertrend\n const finalUpperBand: number[] = new Array(n).fill(0);\n const finalLowerBand: number[] = new Array(n).fill(0);\n // direction: 1 = bullish, -1 = bearish\n const direction: number[] = new Array(n).fill(1);\n\n for (let i = 0; i < n; i++) {\n if (i < this.atrPeriod - 1) {\n results.push({ index: i, value: null, upper: null });\n continue;\n }\n\n const hl2 = (data[i].high + data[i].low) / 2;\n const basicUpper = hl2 + this.multiplier * atr[i];\n const basicLower = hl2 - this.multiplier * atr[i];\n\n if (i === this.atrPeriod - 1) {\n finalUpperBand[i] = basicUpper;\n finalLowerBand[i] = basicLower;\n direction[i] = 1;\n results.push({ index: i, value: finalLowerBand[i], upper: 1 });\n continue;\n }\n\n const prevClose = data[i - 1].close;\n\n // Final upper band\n finalUpperBand[i] =\n basicUpper < finalUpperBand[i - 1] || prevClose > finalUpperBand[i - 1]\n ? basicUpper\n : finalUpperBand[i - 1];\n\n // Final lower band\n finalLowerBand[i] =\n basicLower > finalLowerBand[i - 1] || prevClose < finalLowerBand[i - 1]\n ? basicLower\n : finalLowerBand[i - 1];\n\n // Determine direction\n if (direction[i - 1] === -1) {\n direction[i] = data[i].close > finalUpperBand[i] ? 1 : -1;\n } else {\n direction[i] = data[i].close < finalLowerBand[i] ? -1 : 1;\n }\n\n const supertrendVal = direction[i] === 1 ? finalLowerBand[i] : finalUpperBand[i];\n results.push({ index: i, value: supertrendVal, upper: direction[i] });\n }\n\n return results;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n ctx.lineWidth = 2;\n ctx.lineJoin = 'round';\n\n const BULLISH_COLOR = '#26a69a';\n const BEARISH_COLOR = '#ef5350';\n\n let prevDirection: number | null = null;\n\n // Draw bullish segments\n ctx.beginPath();\n ctx.strokeStyle = BULLISH_COLOR;\n let startedBull = false;\n\n for (const r of results) {\n if (r.value == null || r.upper == null) { startedBull = false; continue; }\n const isBullish = r.upper >= 0;\n if (!isBullish) { startedBull = false; continue; }\n if (prevDirection !== 1) startedBull = false;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n startedBull ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (startedBull = true));\n prevDirection = 1;\n }\n ctx.stroke();\n\n // Draw bearish segments\n ctx.beginPath();\n ctx.strokeStyle = BEARISH_COLOR;\n let startedBear = false;\n prevDirection = null;\n\n for (const r of results) {\n if (r.value == null || r.upper == null) { startedBear = false; continue; }\n const isBearish = r.upper < 0;\n if (!isBearish) { startedBear = false; continue; }\n if (prevDirection !== -1) startedBear = false;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n startedBear ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (startedBear = true));\n prevDirection = -1;\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class ParabolicSAR implements IIndicator {\n readonly name = 'PSAR';\n readonly color: string;\n\n constructor(\n private readonly step = 0.02,\n private readonly maxAF = 0.2,\n color = '#ff6b9d',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const n = data.length;\n const results: IndicatorResult[] = [];\n\n if (n < 2) {\n for (let i = 0; i < n; i++) results.push({ index: i, value: null, upper: null });\n return results;\n }\n\n // Initialization: start bullish\n let bullish = true;\n let af = this.step;\n let ep = data[0].high; // Extreme point\n let sar = data[0].low; // Initial SAR below price\n\n results.push({ index: 0, value: null, upper: null });\n\n for (let i = 1; i < n; i++) {\n // Calculate new SAR\n let newSar = sar + af * (ep - sar);\n\n if (bullish) {\n // In uptrend: SAR is below price, can't be above last two lows\n const prevLow = data[i - 1].low;\n const prevPrevLow = i >= 2 ? data[i - 2].low : data[i - 1].low;\n newSar = Math.min(newSar, prevLow, prevPrevLow);\n\n // Check for reversal\n if (newSar > data[i].low) {\n // Flip to bearish\n bullish = false;\n newSar = ep; // SAR flips to EP (highest high)\n ep = data[i].low;\n af = this.step;\n } else {\n // Update EP if new high\n if (data[i].high > ep) {\n ep = data[i].high;\n af = Math.min(af + this.step, this.maxAF);\n }\n }\n } else {\n // In downtrend: SAR is above price, can't be below last two highs\n const prevHigh = data[i - 1].high;\n const prevPrevHigh = i >= 2 ? data[i - 2].high : data[i - 1].high;\n newSar = Math.max(newSar, prevHigh, prevPrevHigh);\n\n // Check for reversal\n if (newSar < data[i].high) {\n // Flip to bullish\n bullish = true;\n newSar = ep; // SAR flips to EP (lowest low)\n ep = data[i].high;\n af = this.step;\n } else {\n // Update EP if new low\n if (data[i].low < ep) {\n ep = data[i].low;\n af = Math.min(af + this.step, this.maxAF);\n }\n }\n }\n\n sar = newSar;\n // upper: 1 = bullish, -1 = bearish\n results.push({ index: i, value: sar, upper: bullish ? 1 : -1 });\n }\n\n return results;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n const BULLISH_COLOR = '#26a69a';\n const BEARISH_COLOR = '#ef5350';\n\n for (const r of results) {\n if (r.value == null || r.upper == null) continue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n\n ctx.beginPath();\n ctx.arc(x, y, 2, 0, Math.PI * 2);\n ctx.fillStyle = r.upper >= 0 ? BULLISH_COLOR : BEARISH_COLOR;\n ctx.fill();\n }\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nfunction periodHighLow(data: OHLCVBar[], index: number, period: number): { high: number; low: number } | null {\n if (index < period - 1) return null;\n let high = -Infinity;\n let low = Infinity;\n for (let j = index - period + 1; j <= index; j++) {\n if (data[j].high > high) high = data[j].high;\n if (data[j].low < low) low = data[j].low;\n }\n return { high, low };\n}\n\nexport class IchimokuCloud implements IIndicator {\n readonly name = 'Ichimoku';\n readonly color: string;\n\n constructor(\n private readonly tenkanPeriod = 9,\n private readonly kijunPeriod = 26,\n private readonly senkouBPeriod = 52,\n color = '#b0bec5',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((bar, i) => {\n // Tenkan-sen (Conversion Line)\n const tenkanHL = periodHighLow(data, i, this.tenkanPeriod);\n const tenkan = tenkanHL !== null ? (tenkanHL.high + tenkanHL.low) / 2 : null;\n\n // Kijun-sen (Base Line)\n const kijunHL = periodHighLow(data, i, this.kijunPeriod);\n const kijun = kijunHL !== null ? (kijunHL.high + kijunHL.low) / 2 : null;\n\n // Senkou Span A = (Tenkan + Kijun) / 2 (no displacement in stored data)\n const spanA = tenkan !== null && kijun !== null ? (tenkan + kijun) / 2 : null;\n\n // Senkou Span B = (highest high + lowest low) over senkouBPeriod\n const spanBHL = periodHighLow(data, i, this.senkouBPeriod);\n const spanB = spanBHL !== null ? (spanBHL.high + spanBHL.low) / 2 : null;\n\n // Chikou Span = close plotted kijunPeriod bars back\n // Store current close in histogram; render will offset it back by kijunPeriod\n const chikou = bar.close;\n\n return {\n index: i,\n value: tenkan,\n upper: kijun,\n lower: spanA,\n signal: spanB,\n histogram: chikou,\n };\n });\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n ctx.lineWidth = 1;\n ctx.lineJoin = 'round';\n\n const drawLine = (\n getValue: (r: IndicatorResult) => number | null | undefined,\n color: string,\n dash = false,\n ) => {\n ctx.strokeStyle = color;\n if (dash) ctx.setLineDash([4, 3]);\n ctx.beginPath();\n let started = false;\n for (const r of results) {\n const val = getValue(r);\n if (val == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(val, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n if (dash) ctx.setLineDash([]);\n };\n\n // Draw cloud fill between SpanA (lower) and SpanB (signal)\n const spanAPoints: [number, number][] = [];\n const spanBPoints: [number, number][] = [];\n\n for (const r of results) {\n if (r.lower == null || r.signal == null) continue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n spanAPoints.push([x, scale.yToPixel(r.lower, priceRange, chartHeight)]);\n spanBPoints.push([x, scale.yToPixel(r.signal, priceRange, chartHeight)]);\n }\n\n // Per-segment cloud fill — green when SpanA > SpanB (bullish), red otherwise\n for (let i = 0; i + 1 < spanAPoints.length; i++) {\n const [x0, a0] = spanAPoints[i];\n const [x1, a1] = spanAPoints[i + 1];\n const [, b0] = spanBPoints[i];\n const [, b1] = spanBPoints[i + 1];\n\n // spanA is r.lower (SpanA price → pixel y), spanB is r.signal\n // Note: lower y pixel = higher price\n // SpanA > SpanB in price means a0 < b0 (smaller y = higher on canvas)\n const spanAAbove = a0 < b0; // bullish cloud (SpanA above SpanB)\n ctx.beginPath();\n ctx.moveTo(x0, a0);\n ctx.lineTo(x1, a1);\n ctx.lineTo(x1, b1);\n ctx.lineTo(x0, b0);\n ctx.closePath();\n ctx.fillStyle = spanAAbove\n ? 'rgba(38, 166, 154, 0.15)'\n : 'rgba(239, 83, 80, 0.15)';\n ctx.fill();\n }\n\n // SpanA line (dashed, green)\n drawLine((r) => r.lower, '#26a69a', true);\n\n // SpanB line (dashed, red)\n drawLine((r) => r.signal, '#ef5350', true);\n\n // Tenkan-sen (thin solid, red-ish)\n drawLine((r) => r.value, '#ef9a9a');\n\n // Kijun-sen (thin solid, blue-ish)\n drawLine((r) => r.upper, '#90caf9');\n\n // Chikou span: draw close shifted back kijunPeriod bars\n ctx.strokeStyle = '#b0bec5';\n ctx.beginPath();\n let started = false;\n for (const r of results) {\n if (r.histogram == null) { started = false; continue; }\n const shiftedIndex = r.index - this.kijunPeriod;\n if (shiftedIndex < 0) { started = false; continue; }\n const x = scale.xToPixel(shiftedIndex, viewport, chartWidth);\n const y = scale.yToPixel(r.histogram, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class ADX implements IIndicator {\n readonly name: string;\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly period: number = 14,\n color = '#fff176',\n ) {\n this.name = 'ADX';\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const n = data.length;\n if (n < this.period + 1) {\n return data.map((_, i) => ({ index: i, value: null, upper: null, lower: null }));\n }\n\n // Compute TR, +DM, -DM for all bars starting at index 1\n const tr: number[] = new Array(n).fill(0);\n const dmP: number[] = new Array(n).fill(0);\n const dmM: number[] = new Array(n).fill(0);\n\n tr[0] = data[0].high - data[0].low;\n dmP[0] = 0;\n dmM[0] = 0;\n\n for (let i = 1; i < n; i++) {\n const prevClose = data[i - 1].close;\n const prevHigh = data[i - 1].high;\n const prevLow = data[i - 1].low;\n const currHigh = data[i].high;\n const currLow = data[i].low;\n\n tr[i] = Math.max(\n currHigh - currLow,\n Math.abs(currHigh - prevClose),\n Math.abs(currLow - prevClose),\n );\n\n const upMove = currHigh - prevHigh;\n const downMove = prevLow - currLow;\n\n dmP[i] = (upMove > downMove && upMove > 0) ? upMove : 0;\n dmM[i] = (downMove > upMove && downMove > 0) ? downMove : 0;\n }\n\n // Seed Wilder's smoothed sums over first `period` bars (indices 0..period-1)\n let smoothTR = 0;\n let smoothDP = 0;\n let smoothDM = 0;\n for (let i = 0; i < this.period; i++) {\n smoothTR += tr[i];\n smoothDP += dmP[i];\n smoothDM += dmM[i];\n }\n\n const results: IndicatorResult[] = [];\n\n // Nulls for bars before first DI/ADX is available\n for (let i = 0; i < this.period; i++) {\n results.push({ index: i, value: null, upper: null, lower: null });\n }\n\n // Compute DI values starting at period-1 (index of first seeded bar)\n // We actually start emitting from index period (first smoothed bar after seed)\n // But let's do the standard approach: seed then roll from period onwards.\n\n const diPArr: number[] = new Array(n).fill(0);\n const diMArr: number[] = new Array(n).fill(0);\n const dxArr: number[] = new Array(n).fill(0);\n\n // First seeded values at index period-1\n const diP0 = smoothTR === 0 ? 0 : 100 * smoothDP / smoothTR;\n const diM0 = smoothTR === 0 ? 0 : 100 * smoothDM / smoothTR;\n const dx0 = (diP0 + diM0 === 0) ? 0 : 100 * Math.abs(diP0 - diM0) / (diP0 + diM0);\n\n diPArr[this.period - 1] = diP0;\n diMArr[this.period - 1] = diM0;\n dxArr[this.period - 1] = dx0;\n\n // Replace the last null result with actual DI (no ADX yet)\n results[this.period - 1] = {\n index: this.period - 1,\n value: null, // ADX not ready yet\n upper: diP0,\n lower: diM0,\n };\n\n // Roll Wilder's smoothing from period onwards\n for (let i = this.period; i < n; i++) {\n smoothTR = smoothTR - smoothTR / this.period + tr[i];\n smoothDP = smoothDP - smoothDP / this.period + dmP[i];\n smoothDM = smoothDM - smoothDM / this.period + dmM[i];\n\n const diP = smoothTR === 0 ? 0 : 100 * smoothDP / smoothTR;\n const diM = smoothTR === 0 ? 0 : 100 * smoothDM / smoothTR;\n const dx = (diP + diM === 0) ? 0 : 100 * Math.abs(diP - diM) / (diP + diM);\n\n diPArr[i] = diP;\n diMArr[i] = diM;\n dxArr[i] = dx;\n\n results.push({ index: i, value: null, upper: diP, lower: diM });\n }\n\n // Compute ADX using Wilder's EMA of DX, seeded at index period-1\n // ADX first available at index 2*period - 2 (need period DX values)\n const adxStart = 2 * this.period - 2;\n\n // Seed ADX with SMA of first `period` DX values (indices period-1 .. 2*period-2)\n if (adxStart >= n) return results;\n\n let adx = 0;\n for (let i = this.period - 1; i <= adxStart; i++) {\n adx += dxArr[i];\n }\n adx /= (this.period); // period values from period-1 to 2*period-2 inclusive\n\n results[adxStart].value = adx;\n\n for (let i = adxStart + 1; i < n; i++) {\n adx = (adx * (this.period - 1) + dxArr[i]) / this.period;\n results[i].value = adx;\n }\n\n return results;\n }\n\n getValueRange(_results: IndicatorResult[]): PriceRange {\n return { min: 0, max: 100 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n const range = rangeOverride ?? { min: 0, max: 100 };\n\n // Reference line at 25 (trend threshold)\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n const y25 = scale.yToPixel(25, range, paneHeight);\n ctx.beginPath();\n ctx.moveTo(0, y25);\n ctx.lineTo(chartWidth, y25);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.restore();\n\n // Helper to draw a line\n const drawLine = (\n getValue: (r: IndicatorResult) => number | null | undefined,\n strokeColor: string,\n lineWidth: number,\n ) => {\n ctx.beginPath();\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = lineWidth;\n ctx.lineJoin = 'round';\n let started = false;\n for (const r of results) {\n const val = getValue(r);\n if (val == null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(val, range, paneHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n ctx.stroke();\n };\n\n // +DI (green)\n drawLine(r => r.upper, '#26a69a', 1);\n // -DI (red)\n drawLine(r => r.lower, '#ef5350', 1);\n // ADX (this.color, solid, thicker)\n drawLine(r => r.value, this.color, 1.5);\n\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class AwesomeOscillator implements IIndicator {\n readonly name = 'AO';\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n constructor(\n private readonly fastPeriod = 5,\n private readonly slowPeriod = 34,\n color = '#b0bec5',\n ) {\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n // Midpoint = (high + low) / 2\n const mid: number[] = data.map(b => (b.high + b.low) / 2);\n\n // SMA helper\n const sma = (arr: number[], end: number, period: number): number | null => {\n if (end < period - 1) return null;\n let sum = 0;\n for (let j = end - period + 1; j <= end; j++) sum += arr[j];\n return sum / period;\n };\n\n return data.map((_, i) => {\n const fast = sma(mid, i, this.fastPeriod);\n const slow = sma(mid, i, this.slowPeriod);\n if (fast === null || slow === null) return { index: i, value: null };\n return { index: i, value: fast - slow };\n });\n }\n\n getValueRange(results: IndicatorResult[]): PriceRange {\n let maxAbs = 0.0001;\n for (const r of results) {\n if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n }\n return { min: -maxAbs * 1.2, max: maxAbs * 1.2 };\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n rangeOverride?: PriceRange,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n // Dynamic range ±maxAbs*1.2\n let maxAbs = 0.0001;\n for (const r of results) {\n if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n }\n const range = rangeOverride ?? { min: -maxAbs * 1.2, max: maxAbs * 1.2 };\n const zeroY = scale.yToPixel(0, range, paneHeight);\n\n // Zero dashed line\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, zeroY);\n ctx.lineTo(chartWidth, zeroY);\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.restore();\n\n // Histogram bars: green if AO[i] >= AO[i-1], red otherwise (first bar defaults green)\n const bodyW = Math.max(scale.candleBodyWidth(viewport, chartWidth), 1);\n let prevValue: number | null = null;\n\n for (const r of results) {\n if (r.value == null) { prevValue = null; continue; }\n\n const isGreen = prevValue === null ? true : r.value >= prevValue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const barY = scale.yToPixel(r.value, range, paneHeight);\n const h = Math.abs(barY - zeroY);\n const top = Math.min(barY, zeroY);\n\n ctx.fillStyle = isGreen ? 'rgba(38,166,154,0.70)' : 'rgba(239,83,80,0.70)';\n ctx.fillRect(x - bodyW / 2, top, bodyW, h);\n\n prevValue = r.value;\n }\n\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class HeikinAshi implements IIndicator {\n readonly name = 'HA';\n readonly color: string;\n private readonly upColor: string;\n private readonly downColor: string;\n\n constructor(color = '#90a4ae', upColor = '#26a69a', downColor = '#ef5350') {\n this.color = color;\n this.upColor = upColor;\n this.downColor = downColor;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const results: IndicatorResult[] = [];\n let prevHAOpen = 0;\n let prevHAClose = 0;\n\n for (let i = 0; i < data.length; i++) {\n const bar = data[i];\n\n const haClose = (bar.open + bar.high + bar.low + bar.close) / 4;\n\n let haOpen: number;\n if (i === 0) {\n haOpen = (bar.open + bar.close) / 2;\n } else {\n haOpen = (prevHAOpen + prevHAClose) / 2;\n }\n\n const haHigh = Math.max(bar.high, haOpen, haClose);\n const haLow = Math.min(bar.low, haOpen, haClose);\n\n prevHAOpen = haOpen;\n prevHAClose = haClose;\n\n results.push({\n index: i,\n value: haClose, // HA-Close\n upper: haHigh, // HA-High\n lower: haLow, // HA-Low\n signal: haOpen, // HA-Open\n });\n }\n\n return results;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n const candleWidth = scale.candleBodyWidth(viewport, chartWidth);\n const halfBody = candleWidth / 2;\n\n for (const r of results) {\n if (r.value == null || r.upper == null || r.lower == null || r.signal == null) continue;\n\n const haClose = r.value;\n const haHigh = r.upper;\n const haLow = r.lower;\n const haOpen = r.signal;\n\n const isBullish = haClose >= haOpen;\n const color = isBullish ? this.upColor : this.downColor;\n\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const yHigh = scale.yToPixel(haHigh, priceRange, chartHeight);\n const yLow = scale.yToPixel(haLow, priceRange, chartHeight);\n const yOpen = scale.yToPixel(haOpen, priceRange, chartHeight);\n const yClose = scale.yToPixel(haClose, priceRange, chartHeight);\n\n const bodyTop = Math.min(yOpen, yClose);\n const bodyBottom = Math.max(yOpen, yClose);\n const bodyHeight = Math.max(1, bodyBottom - bodyTop);\n\n // Draw wick\n ctx.beginPath();\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n ctx.moveTo(x, yHigh);\n ctx.lineTo(x, yLow);\n ctx.stroke();\n\n // Draw body\n ctx.fillStyle = color;\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n ctx.fillRect(x - halfBody, bodyTop, candleWidth, bodyHeight);\n ctx.strokeRect(x - halfBody, bodyTop, candleWidth, bodyHeight);\n }\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class VOL implements IIndicator {\n readonly name = 'VOL';\n readonly color: string;\n readonly pane = 'sub' as const;\n readonly paneHeight = 80;\n\n private readonly upColor: string;\n private readonly downColor: string;\n\n constructor(upColor = '#26a69a', downColor = '#ef5350') {\n this.upColor = upColor;\n this.downColor = downColor;\n this.color = upColor;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n return data.map((bar, i) => ({\n index: i,\n value: bar.volume ?? 0,\n // encode direction in signal field for render phase\n signal: bar.close >= bar.open ? 1 : 0,\n }));\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n paneHeight: number,\n ): void {\n const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n ?? ctx.canvas.width;\n\n // Dynamic range from 0 to max volume\n let maxVol = 0;\n for (const r of results) {\n if (r.value != null && r.value > maxVol) maxVol = r.value;\n }\n if (maxVol === 0) return;\n\n const range = { min: 0, max: maxVol * 1.1 };\n const baseY = scale.yToPixel(0, range, paneHeight);\n const bodyW = Math.max(scale.candleBodyWidth(viewport, chartWidth), 1);\n\n for (const r of results) {\n if (r.value == null || r.value === 0) continue;\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const topY = scale.yToPixel(r.value, range, paneHeight);\n const h = Math.abs(baseY - topY);\n ctx.fillStyle = r.signal === 1 ? `${this.upColor}99` : `${this.downColor}99`;\n ctx.fillRect(x - bodyW / 2, topY, bodyW, h);\n }\n\n // Label\n ctx.fillStyle = this.upColor;\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n ctx.fillText(this.name, 4, 11);\n }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class LinearRegression implements IIndicator {\n readonly name: string;\n readonly color: string;\n\n constructor(\n private readonly period = 14,\n color = '#ff9800',\n ) {\n this.name = 'LinReg';\n this.color = color;\n }\n\n compute(data: OHLCVBar[]): IndicatorResult[] {\n const n = this.period;\n const results: IndicatorResult[] = [];\n\n // Precompute constant parts of the regression that depend only on n\n // x values are 0, 1, ..., n-1\n const sumX = (n * (n - 1)) / 2;\n const sumX2 = (n * (n - 1) * (2 * n - 1)) / 6;\n const denom = n * sumX2 - sumX * sumX;\n\n for (let i = 0; i < data.length; i++) {\n if (i < n - 1) {\n results.push({ index: i, value: null });\n continue;\n }\n\n let sumY = 0;\n let sumXY = 0;\n for (let j = 0; j < n; j++) {\n const close = data[i - (n - 1 - j)].close;\n sumY += close;\n sumXY += j * close;\n }\n\n const slope = (n * sumXY - sumX * sumY) / denom;\n const intercept = (sumY - slope * sumX) / n;\n const value = intercept + slope * (n - 1);\n\n results.push({ index: i, value });\n }\n\n return results;\n }\n\n render(\n ctx: CanvasRenderingContext2D,\n results: IndicatorResult[],\n scale: ScaleManager,\n viewport: Viewport,\n chartHeight: number,\n ): void {\n const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n const priceRange = canvas._priceRange;\n if (!priceRange) return;\n\n const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n ctx.beginPath();\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 1.5;\n ctx.lineJoin = 'round';\n\n let started = false;\n for (const r of results) {\n if (r.value === null) { started = false; continue; }\n const x = scale.xToPixel(r.index, viewport, chartWidth);\n const y = scale.yToPixel(r.value, priceRange, chartHeight);\n started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n }\n\n ctx.stroke();\n }\n}\n","[\n {\n \"name\": \"Moving Average\",\n \"short_name\": \"MA\",\n \"type\": \"Trend\",\n \"enabled\": true\n },\n {\n \"name\": \"Exponential Moving Average\",\n \"short_name\": \"EMA\",\n \"type\": \"Trend\",\n \"enabled\": true\n },\n {\n \"name\": \"Weighted Moving Average\",\n \"short_name\": \"WMA\",\n \"type\": \"Trend\",\n \"enabled\": true\n },\n {\n \"name\": \"Hull Moving Average\",\n \"short_name\": \"HMA\",\n \"type\": \"Trend\",\n \"enabled\": true\n },\n {\n \"name\": \"Moving Average Ribbon\",\n \"short_name\": \"MARibbon\",\n \"type\": \"Trend\",\n \"enabled\": true\n },\n {\n \"name\": \"Bollinger Bands\",\n \"short_name\": \"BB\",\n \"type\": \"Volatility\",\n \"enabled\": true\n },\n {\n \"name\": \"Keltner Channels\",\n \"short_name\": \"KC\",\n \"type\": \"Volatility\",\n \"enabled\": true\n },\n {\n \"name\": \"Donchian Channels\",\n \"short_name\": \"DC\",\n \"type\": \"Volatility\",\n \"enabled\": true\n },\n {\n \"name\": \"Average True Range\",\n \"short_name\": \"ATR\",\n \"type\": \"Volatility\",\n \"enabled\": true\n },\n {\n \"name\": \"Relative Strength Index\",\n \"short_name\": \"RSI\",\n \"type\": \"Momentum\",\n \"enabled\": true\n },\n {\n \"name\": \"Stochastic Oscillator\",\n \"short_name\": \"Stoch\",\n \"type\": \"Momentum\",\n \"enabled\": true\n },\n {\n \"name\": \"Stochastic RSI\",\n \"short_name\": \"StochRSI\",\n \"type\": \"Momentum\",\n \"enabled\": true\n },\n {\n \"name\": \"MACD\",\n \"short_name\": \"MACD\",\n \"type\": \"Momentum\",\n \"enabled\": true\n },\n {\n \"name\": \"Commodity Channel Index\",\n \"short_name\": \"CCI\",\n \"type\": \"Momentum\",\n \"enabled\": true\n },\n {\n \"name\": \"Williams %R\",\n \"short_name\": \"%R\",\n \"type\": \"Momentum\",\n \"enabled\": true\n },\n {\n \"name\": \"Rate of Change\",\n \"short_name\": \"ROC\",\n \"type\": \"Momentum\",\n \"enabled\": true\n },\n {\n \"name\": \"On Balance Volume\",\n \"short_name\": \"OBV\",\n \"type\": \"Volume\",\n \"enabled\": true\n },\n {\n \"name\": \"Volume\",\n \"short_name\": \"VOL\",\n \"type\": \"Volume\",\n \"enabled\": true\n },\n {\n \"name\": \"Volume Weighted Average Price\",\n \"short_name\": \"VWAP\",\n \"type\": \"Volume\",\n \"enabled\": true\n },\n {\n \"name\": \"Accumulation/Distribution\",\n \"short_name\": \"A/D\",\n \"type\": \"Volume\",\n \"enabled\": true\n },\n {\n \"name\": \"Money Flow Index\",\n \"short_name\": \"MFI\",\n \"type\": \"Volume\",\n \"enabled\": true\n },\n {\n \"name\": \"Chaikin Money Flow\",\n \"short_name\": \"CMF\",\n \"type\": \"Volume\",\n \"enabled\": true\n },\n {\n \"name\": \"Pivot Points Standard\",\n \"short_name\": \"Pivot\",\n \"type\": \"Support/Resistance\",\n \"enabled\": true\n },\n {\n \"name\": \"Fibonacci Retracement\",\n \"short_name\": \"Fib\",\n \"type\": \"Support/Resistance\",\n \"enabled\": true\n },\n {\n \"name\": \"Supertrend\",\n \"short_name\": \"Supertrend\",\n \"type\": \"Trend\",\n \"enabled\": true\n },\n {\n \"name\": \"Parabolic SAR\",\n \"short_name\": \"PSAR\",\n \"type\": \"Trend\",\n \"enabled\": true\n },\n {\n \"name\": \"Ichimoku Cloud\",\n \"short_name\": \"Ichimoku\",\n \"type\": \"Trend\",\n \"enabled\": true\n },\n {\n \"name\": \"ADX\",\n \"short_name\": \"ADX\",\n \"type\": \"Trend Strength\",\n \"enabled\": true\n },\n {\n \"name\": \"Awesome Oscillator\",\n \"short_name\": \"AO\",\n \"type\": \"Momentum\",\n \"enabled\": true\n },\n {\n \"name\": \"Heikin Ashi\",\n \"short_name\": \"HA\",\n \"type\": \"Price Transformation\",\n \"enabled\": false\n },\n {\n \"name\": \"Linear Regression\",\n \"short_name\": \"LinReg\",\n \"type\": \"Trend\",\n \"enabled\": true\n }\n]\n","import type { OHLCVBar } from '../core/types.js';\n\n/**\n * Aggregates an array of fine-grained OHLCV bars into a coarser timeframe.\n *\n * Bars are grouped by time bucket: `Math.floor(bar.time / targetIntervalMs) * targetIntervalMs`.\n * Each bucket produces one output bar:\n * - open = first bar's open\n * - high = max of all highs\n * - low = min of all lows\n * - close = last bar's close\n * - volume = sum of all volumes\n *\n * Empty time buckets (weekends, holidays, gaps) are skipped — no phantom bars are created.\n * Partial buckets (e.g. the live/in-progress candle) are included as-is.\n *\n * @param bars Source bars sorted ascending by time.\n * @param targetIntervalMs Target candle duration in milliseconds.\n * @returns Aggregated bars sorted ascending by time.\n */\nexport function aggregateCandles(bars: OHLCVBar[], targetIntervalMs: number): OHLCVBar[] {\n if (bars.length === 0 || targetIntervalMs <= 0) return bars;\n\n const buckets = new Map<number, OHLCVBar[]>();\n\n for (const bar of bars) {\n const key = Math.floor(bar.time / targetIntervalMs) * targetIntervalMs;\n const group = buckets.get(key);\n if (group) {\n group.push(bar);\n } else {\n buckets.set(key, [bar]);\n }\n }\n\n const result: OHLCVBar[] = [];\n\n for (const [bucketTime, group] of buckets) {\n let high = group[0].high;\n let low = group[0].low;\n let volume = 0;\n for (const b of group) {\n if (b.high > high) high = b.high;\n if (b.low < low) low = b.low;\n volume += b.volume ?? 0;\n }\n result.push({\n time: bucketTime,\n open: group[0].open,\n high,\n low,\n close: group[group.length - 1].close,\n volume,\n });\n }\n\n result.sort((a, b) => a.time - b.time);\n return result;\n}\n","import actLogoUrl from '../act.svg';\nimport { DataStore } from './core/DataStore.js';\nimport { ScaleManager } from './core/ScaleManager.js';\nimport { EventEmitter } from './core/EventEmitter.js';\nimport { DARK_THEME, LIGHT_THEME, deepMergeTheme, resolveCssVarsInTheme } from './core/themes.js';\nimport type { ChartTheme, DeepPartialChartTheme } from './core/themes.js';\nimport { resolveUiConfig, type UiConfig } from './core/uiConfig.js';\nimport { resolveLabels, type ChartLabels } from './core/labels.js';\nimport { PanHandler } from './interaction/PanHandler.js';\nimport { ZoomHandler } from './interaction/ZoomHandler.js';\nimport { renderCandlestick } from './series/CandlestickSeries.js';\nimport { renderHollowCandle } from './series/HollowCandleSeries.js';\nimport { renderLine } from './series/LineSeries.js';\nimport { renderOHLC } from './series/OHLCSeries.js';\nimport { renderVolume } from './series/VolumeSeries.js';\nimport { renderHeikinAshi } from './series/HeikinAshiSeries.js';\nimport { renderVolumeCandles } from './series/VolumeCandles.js';\nimport { renderLineWithMarkers } from './series/LineWithMarkers.js';\nimport { renderStepLine } from './series/StepLineSeries.js';\nimport { renderHLCArea } from './series/HLCAreaSeries.js';\nimport { renderBaseline } from './series/BaselineSeries.js';\nimport { renderColumns } from './series/ColumnSeries.js';\nimport { renderHighLow } from './series/HighLowSeries.js';\nimport { renderGrid } from './overlays/GridOverlay.js';\nimport { renderCrosshair } from './overlays/CrosshairOverlay.js';\nimport {\n renderTradeLevels,\n hitTestTradeLevelClose,\n hitTestTradeLevelEdit,\n hitTestTradeLevelHover,\n hitTestTradeLevelDrag,\n hitTestTradeLevelConfirm,\n hitTestTradeLevelAddBracket,\n type TradeLevelHitArea,\n type TradeHoverArea,\n type AnyDragArea,\n type TradeLevelConfirmArea,\n type TradeAddBracketArea,\n} from './overlays/TradeLevelOverlay.js';\nimport { renderTimeAxis, renderCandleCountdown } from './axis/TimeAxis.js';\nimport { renderPriceAxis } from './axis/PriceAxis.js';\nimport { TopBar } from './ui/TopBar.js';\nimport { iconScrollToEnd, iconResetView, ICON_TRASH, ICON_CLOSE } from './ui/icons.js';\nimport { BottomBar, DURATION_TIMEFRAME_MAP } from './ui/BottomBar.js';\nimport { LeftBar } from './ui/LeftBar.js';\nimport { DrawingManager } from './drawings/DrawingManager.js';\nimport { IndicatorOverlay } from './ui/IndicatorOverlay.js';\nimport { IndicatorSettingsDialog } from './ui/IndicatorSettingsDialog.js';\nimport { ChartSettingsDialog, type ChartSettings } from './ui/ChartSettingsDialog.js';\nimport { TradeButton } from './ui/TradeButton.js';\nimport { TradePopover } from './ui/TradePopover.js';\nimport { DraftOrderQtyInput } from './ui/DraftOrderQtyInput.js';\nimport { IsinPickerModal } from './ui/IsinPickerModal.js';\nimport { TradeDragHandler } from './interaction/TradeDragHandler.js';\nimport { SMA } from './indicators/SMA.js';\nimport { EMA } from './indicators/EMA.js';\nimport { WMA } from './indicators/WMA.js';\nimport { HMA } from './indicators/HMA.js';\nimport { MARibbon } from './indicators/MARibbon.js';\nimport { BollingerBands } from './indicators/BollingerBands.js';\nimport { KeltnerChannels } from './indicators/KeltnerChannels.js';\nimport { DonchianChannels } from './indicators/DonchianChannels.js';\nimport { ATR } from './indicators/ATR.js';\nimport { RSI } from './indicators/RSI.js';\nimport { Stochastic } from './indicators/Stochastic.js';\nimport { StochRSI } from './indicators/StochRSI.js';\nimport { MACD } from './indicators/MACD.js';\nimport { CCI } from './indicators/CCI.js';\nimport { WilliamsR } from './indicators/WilliamsR.js';\nimport { ROC } from './indicators/ROC.js';\nimport { OBV } from './indicators/OBV.js';\nimport { VWAP } from './indicators/VWAP.js';\nimport { AccDistribution } from './indicators/AccDistribution.js';\nimport { MFI } from './indicators/MFI.js';\nimport { CMF } from './indicators/CMF.js';\nimport { PivotPoints } from './indicators/PivotPoints.js';\nimport { FibRetracementIndicator } from './indicators/FibRetracementIndicator.js';\nimport { Supertrend } from './indicators/Supertrend.js';\nimport { ParabolicSAR } from './indicators/ParabolicSAR.js';\nimport { IchimokuCloud } from './indicators/IchimokuCloud.js';\nimport { ADX } from './indicators/ADX.js';\nimport { AwesomeOscillator } from './indicators/AwesomeOscillator.js';\nimport { HeikinAshi } from './indicators/HeikinAshi.js';\nimport { VOL } from './indicators/VOL.js';\nimport { LinearRegression } from './indicators/LinearRegression.js';\nimport INDICATORS_CONFIG from './core/indicators.json';\nimport type { IndicatorParamSchema, ParamFieldDef } from './core/indicatorSettings.js';\nimport type { PriceSource } from './indicators/sourceField.js';\nimport { aggregateCandles } from './utils/aggregateCandles.js';\n\nimport type {\n OHLCVBar,\n ChartConfig,\n DataLoaderParams,\n IIndicator,\n IWebSocketAdapter,\n Viewport,\n PriceRange,\n CrosshairPosition,\n ChartEventMap,\n SeriesType,\n Timeframe,\n Duration,\n DrawingToolType,\n Tick,\n IndicatorParams,\n ActiveIndicatorState,\n StreamStatus,\n PositionLevel,\n PendingOrderLevel,\n AnyLevel,\n TradeLevelType,\n TradeDisplayFilter,\n PositionRenderStyle,\n OrderSubmit,\n ChartState,\n} from './core/types.js';\n\n// ── Built-in indicator presets (keyed by short_name matching indicators.json) ─\nconst INDICATOR_PRESETS: { shortName: string; factory: () => IIndicator }[] = [\n // Trend\n { shortName: 'MA', factory: () => new SMA(20) },\n { shortName: 'EMA', factory: () => new EMA(20) },\n { shortName: 'WMA', factory: () => new WMA(20) },\n { shortName: 'HMA', factory: () => new HMA(20) },\n { shortName: 'MARibbon', factory: () => new MARibbon() },\n // Volatility\n { shortName: 'BB', factory: () => new BollingerBands(20, 2) },\n { shortName: 'KC', factory: () => new KeltnerChannels(20, 2) },\n { shortName: 'DC', factory: () => new DonchianChannels(20) },\n { shortName: 'ATR', factory: () => new ATR(14) },\n // Momentum\n { shortName: 'RSI', factory: () => new RSI(14) },\n { shortName: 'Stoch', factory: () => new Stochastic(14, 3) },\n { shortName: 'StochRSI', factory: () => new StochRSI(14, 14, 3, 3) },\n { shortName: 'MACD', factory: () => new MACD(12, 26, 9) },\n { shortName: 'CCI', factory: () => new CCI(20) },\n { shortName: '%R', factory: () => new WilliamsR(14) },\n { shortName: 'ROC', factory: () => new ROC(12) },\n { shortName: 'AO', factory: () => new AwesomeOscillator() },\n // Volume\n { shortName: 'OBV', factory: () => new OBV() },\n { shortName: 'VWAP', factory: () => new VWAP() },\n { shortName: 'A/D', factory: () => new AccDistribution() },\n { shortName: 'MFI', factory: () => new MFI(14) },\n { shortName: 'CMF', factory: () => new CMF(20) },\n // Support / Resistance\n { shortName: 'Pivot', factory: () => new PivotPoints() },\n { shortName: 'Fib', factory: () => new FibRetracementIndicator(50) },\n // Trend (overlay)\n { shortName: 'Supertrend', factory: () => new Supertrend(10, 3) },\n { shortName: 'PSAR', factory: () => new ParabolicSAR(0.02, 0.2) },\n { shortName: 'Ichimoku', factory: () => new IchimokuCloud(9, 26, 52) },\n // Trend Strength\n { shortName: 'ADX', factory: () => new ADX(14) },\n // Price Transformation\n { shortName: 'HA', factory: () => new HeikinAshi() },\n // Volume (sub-pane)\n { shortName: 'VOL', factory: () => new VOL() },\n // Trend (overlay)\n { shortName: 'LinReg', factory: () => new LinearRegression(14) },\n];\n\n// ── Common timeframe lock field injected into every indicator's settings ────────\nconst TIMEFRAME_FIELD: ParamFieldDef = {\n kind: 'select',\n key: 'timeframe',\n label: 'Timeframe',\n options: ['Chart', '1m', '5m', '15m', '30m', '1h', '4h', '1D', '1W', '1M', '1Y'],\n default: 'Chart',\n};\n\n// ── Builds a display label like \"RSI(14)\" or \"MACD(12, 26, 9)\" ────────────────\nfunction buildIndicatorLabel(\n shortName: string,\n params: IndicatorParams,\n schema: IndicatorParamSchema | undefined\n): string {\n if (!schema) return shortName;\n const nums = schema.fields\n .filter((f) => f.kind === 'number')\n .map((f) => params[f.key] ?? f.default);\n return nums.length > 0 ? `${shortName}(${nums.join(', ')})` : shortName;\n}\n\n// ── Indicator param schemas (define editable fields per indicator) ─────────────\nconst INDICATOR_PARAM_SCHEMAS: IndicatorParamSchema[] = [\n // Trend\n {\n shortName: 'MA',\n fields: [\n {\n kind: 'number',\n key: 'period',\n label: 'Period',\n min: 1,\n max: 500,\n step: 1,\n default: 20,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#F5A623' },\n {\n kind: 'select',\n key: 'source',\n label: 'Source',\n options: ['open', 'high', 'low', 'close'],\n default: 'close',\n },\n ],\n factory: (p) =>\n new SMA(p.period as number, p.color as string, 'MA', p.source as PriceSource),\n },\n {\n shortName: 'EMA',\n fields: [\n {\n kind: 'number',\n key: 'period',\n label: 'Period',\n min: 1,\n max: 500,\n step: 1,\n default: 20,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#9B59B6' },\n {\n kind: 'select',\n key: 'source',\n label: 'Source',\n options: ['open', 'high', 'low', 'close'],\n default: 'close',\n },\n ],\n factory: (p) =>\n new EMA(p.period as number, p.color as string, 'EMA', p.source as PriceSource),\n },\n {\n shortName: 'WMA',\n fields: [\n {\n kind: 'number',\n key: 'period',\n label: 'Period',\n min: 1,\n max: 500,\n step: 1,\n default: 20,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#e91e63' },\n {\n kind: 'select',\n key: 'source',\n label: 'Source',\n options: ['open', 'high', 'low', 'close'],\n default: 'close',\n },\n ],\n factory: (p) =>\n new WMA(p.period as number, p.color as string, 'WMA', p.source as PriceSource),\n },\n {\n shortName: 'HMA',\n fields: [\n {\n kind: 'number',\n key: 'period',\n label: 'Period',\n min: 1,\n max: 500,\n step: 1,\n default: 20,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#00bcd4' },\n {\n kind: 'select',\n key: 'source',\n label: 'Source',\n options: ['open', 'high', 'low', 'close'],\n default: 'close',\n },\n ],\n factory: (p) =>\n new HMA(p.period as number, p.color as string, 'HMA', p.source as PriceSource),\n },\n {\n shortName: 'MARibbon',\n fields: [\n { kind: 'color', key: 'color', label: 'Color', default: '#ffcc80' },\n {\n kind: 'select',\n key: 'source',\n label: 'Source',\n options: ['open', 'high', 'low', 'close'],\n default: 'close',\n },\n ],\n factory: (p) => new MARibbon(p.color as string, p.source as PriceSource),\n },\n // Volatility\n {\n shortName: 'BB',\n fields: [\n {\n kind: 'number',\n key: 'period',\n label: 'Period',\n min: 1,\n max: 500,\n step: 1,\n default: 20,\n },\n {\n kind: 'number',\n key: 'stdDev',\n label: 'Std Dev',\n min: 0.1,\n max: 10,\n step: 0.1,\n default: 2,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#3B82F6' },\n {\n kind: 'select',\n key: 'source',\n label: 'Source',\n options: ['open', 'high', 'low', 'close'],\n default: 'close',\n },\n ],\n factory: (p) =>\n new BollingerBands(\n p.period as number,\n p.stdDev as number,\n p.color as string,\n 'BB',\n p.source as PriceSource\n ),\n },\n {\n shortName: 'KC',\n fields: [\n {\n kind: 'number',\n key: 'period',\n label: 'Period',\n min: 1,\n max: 500,\n step: 1,\n default: 20,\n },\n {\n kind: 'number',\n key: 'mult',\n label: 'Multiplier',\n min: 0.1,\n max: 10,\n step: 0.1,\n default: 2,\n },\n {\n kind: 'number',\n key: 'atrPeriod',\n label: 'ATR Period',\n min: 1,\n max: 500,\n step: 1,\n default: 10,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#4caf50' },\n ],\n factory: (p) =>\n new KeltnerChannels(\n p.period as number,\n p.mult as number,\n p.atrPeriod as number,\n p.color as string\n ),\n },\n {\n shortName: 'DC',\n fields: [\n {\n kind: 'number',\n key: 'period',\n label: 'Period',\n min: 1,\n max: 500,\n step: 1,\n default: 20,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#26c6da' },\n ],\n factory: (p) => new DonchianChannels(p.period as number, p.color as string),\n },\n {\n shortName: 'ATR',\n fields: [\n {\n kind: 'number',\n key: 'period',\n label: 'Period',\n min: 1,\n max: 500,\n step: 1,\n default: 14,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#ff5722' },\n ],\n factory: (p) => new ATR(p.period as number, p.color as string),\n },\n // Momentum\n {\n shortName: 'RSI',\n fields: [\n {\n kind: 'number',\n key: 'period',\n label: 'Period',\n min: 1,\n max: 500,\n step: 1,\n default: 14,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#e8b84b' },\n {\n kind: 'select',\n key: 'source',\n label: 'Source',\n options: ['open', 'high', 'low', 'close'],\n default: 'close',\n },\n ],\n factory: (p) =>\n new RSI(p.period as number, p.color as string, 'RSI', p.source as PriceSource),\n },\n {\n shortName: 'Stoch',\n fields: [\n {\n kind: 'number',\n key: 'kPeriod',\n label: 'K Period',\n min: 1,\n max: 500,\n step: 1,\n default: 14,\n },\n {\n kind: 'number',\n key: 'dPeriod',\n label: 'D Period',\n min: 1,\n max: 100,\n step: 1,\n default: 3,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#e040fb' },\n ],\n factory: (p) => new Stochastic(p.kPeriod as number, p.dPeriod as number, p.color as string),\n },\n {\n shortName: 'StochRSI',\n fields: [\n {\n kind: 'number',\n key: 'rsiPeriod',\n label: 'RSI Period',\n min: 1,\n max: 500,\n step: 1,\n default: 14,\n },\n {\n kind: 'number',\n key: 'stochPeriod',\n label: 'Stoch Period',\n min: 1,\n max: 500,\n step: 1,\n default: 14,\n },\n {\n kind: 'number',\n key: 'kPeriod',\n label: 'K Smooth',\n min: 1,\n max: 100,\n step: 1,\n default: 3,\n },\n {\n kind: 'number',\n key: 'dPeriod',\n label: 'D Smooth',\n min: 1,\n max: 100,\n step: 1,\n default: 3,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#00e5ff' },\n ],\n factory: (p) =>\n new StochRSI(\n p.rsiPeriod as number,\n p.stochPeriod as number,\n p.kPeriod as number,\n p.dPeriod as number,\n p.color as string\n ),\n },\n {\n shortName: 'MACD',\n fields: [\n {\n kind: 'number',\n key: 'fast',\n label: 'Fast Period',\n min: 1,\n max: 500,\n step: 1,\n default: 12,\n },\n {\n kind: 'number',\n key: 'slow',\n label: 'Slow Period',\n min: 1,\n max: 500,\n step: 1,\n default: 26,\n },\n {\n kind: 'number',\n key: 'signal',\n label: 'Signal Period',\n min: 1,\n max: 100,\n step: 1,\n default: 9,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#2196f3' },\n {\n kind: 'select',\n key: 'source',\n label: 'Source',\n options: ['open', 'high', 'low', 'close'],\n default: 'close',\n },\n ],\n factory: (p) =>\n new MACD(\n p.fast as number,\n p.slow as number,\n p.signal as number,\n p.color as string,\n 'MACD',\n p.source as PriceSource\n ),\n },\n {\n shortName: 'CCI',\n fields: [\n {\n kind: 'number',\n key: 'period',\n label: 'Period',\n min: 1,\n max: 500,\n step: 1,\n default: 20,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#4db6ac' },\n ],\n factory: (p) => new CCI(p.period as number, p.color as string),\n },\n {\n shortName: '%R',\n fields: [\n {\n kind: 'number',\n key: 'period',\n label: 'Period',\n min: 1,\n max: 500,\n step: 1,\n default: 14,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#ff7043' },\n ],\n factory: (p) => new WilliamsR(p.period as number, p.color as string),\n },\n {\n shortName: 'ROC',\n fields: [\n {\n kind: 'number',\n key: 'period',\n label: 'Period',\n min: 1,\n max: 500,\n step: 1,\n default: 12,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#80cbc4' },\n {\n kind: 'select',\n key: 'source',\n label: 'Source',\n options: ['open', 'high', 'low', 'close'],\n default: 'close',\n },\n ],\n factory: (p) => new ROC(p.period as number, p.color as string, p.source as PriceSource),\n },\n {\n shortName: 'AO',\n fields: [\n {\n kind: 'number',\n key: 'fastPeriod',\n label: 'Fast Period',\n min: 1,\n max: 100,\n step: 1,\n default: 5,\n },\n {\n kind: 'number',\n key: 'slowPeriod',\n label: 'Slow Period',\n min: 1,\n max: 200,\n step: 1,\n default: 34,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#b0bec5' },\n ],\n factory: (p) =>\n new AwesomeOscillator(\n p.fastPeriod as number,\n p.slowPeriod as number,\n p.color as string\n ),\n },\n // Volume\n {\n shortName: 'OBV',\n fields: [{ kind: 'color', key: 'color', label: 'Color', default: '#aed581' }],\n factory: (p) => new OBV(p.color as string),\n },\n {\n shortName: 'VWAP',\n fields: [{ kind: 'color', key: 'color', label: 'Color', default: '#9c27b0' }],\n factory: (p) => new VWAP(p.color as string),\n },\n {\n shortName: 'A/D',\n fields: [{ kind: 'color', key: 'color', label: 'Color', default: '#ce93d8' }],\n factory: (p) => new AccDistribution(p.color as string),\n },\n {\n shortName: 'MFI',\n fields: [\n {\n kind: 'number',\n key: 'period',\n label: 'Period',\n min: 1,\n max: 500,\n step: 1,\n default: 14,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#ffab40' },\n ],\n factory: (p) => new MFI(p.period as number, p.color as string),\n },\n {\n shortName: 'CMF',\n fields: [\n {\n kind: 'number',\n key: 'period',\n label: 'Period',\n min: 1,\n max: 500,\n step: 1,\n default: 20,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#80deea' },\n ],\n factory: (p) => new CMF(p.period as number, p.color as string),\n },\n // Support / Resistance\n {\n shortName: 'Pivot',\n fields: [{ kind: 'color', key: 'color', label: 'Color', default: '#ffd54f' }],\n factory: (p) => new PivotPoints(p.color as string),\n },\n {\n shortName: 'Fib',\n fields: [\n {\n kind: 'number',\n key: 'lookback',\n label: 'Lookback',\n min: 1,\n max: 500,\n step: 1,\n default: 50,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#e1bee7' },\n ],\n factory: (p) => new FibRetracementIndicator(p.lookback as number, p.color as string),\n },\n // Trend (overlay)\n {\n shortName: 'Supertrend',\n fields: [\n {\n kind: 'number',\n key: 'atrPeriod',\n label: 'ATR Period',\n min: 1,\n max: 500,\n step: 1,\n default: 10,\n },\n {\n kind: 'number',\n key: 'multiplier',\n label: 'Multiplier',\n min: 0.1,\n max: 20,\n step: 0.1,\n default: 3,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#26a69a' },\n ],\n factory: (p) =>\n new Supertrend(p.atrPeriod as number, p.multiplier as number, p.color as string),\n },\n {\n shortName: 'PSAR',\n fields: [\n {\n kind: 'number',\n key: 'step',\n label: 'Step',\n min: 0.001,\n max: 0.1,\n step: 0.001,\n default: 0.02,\n },\n {\n kind: 'number',\n key: 'maxAF',\n label: 'Max AF',\n min: 0.01,\n max: 1,\n step: 0.01,\n default: 0.2,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#ff6b9d' },\n ],\n factory: (p) => new ParabolicSAR(p.step as number, p.maxAF as number, p.color as string),\n },\n {\n shortName: 'Ichimoku',\n fields: [\n {\n kind: 'number',\n key: 'tenkan',\n label: 'Tenkan Period',\n min: 1,\n max: 100,\n step: 1,\n default: 9,\n },\n {\n kind: 'number',\n key: 'kijun',\n label: 'Kijun Period',\n min: 1,\n max: 200,\n step: 1,\n default: 26,\n },\n {\n kind: 'number',\n key: 'senkouB',\n label: 'Senkou B Period',\n min: 1,\n max: 500,\n step: 1,\n default: 52,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#b0bec5' },\n ],\n factory: (p) =>\n new IchimokuCloud(\n p.tenkan as number,\n p.kijun as number,\n p.senkouB as number,\n p.color as string\n ),\n },\n // Trend Strength\n {\n shortName: 'ADX',\n fields: [\n {\n kind: 'number',\n key: 'period',\n label: 'Period',\n min: 1,\n max: 500,\n step: 1,\n default: 14,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#fff176' },\n ],\n factory: (p) => new ADX(p.period as number, p.color as string),\n },\n // Price Transformation\n {\n shortName: 'HA',\n fields: [\n { kind: 'color', key: 'color', label: 'Color', default: '#90a4ae' },\n { kind: 'color', key: 'upColor', label: 'Up Color', default: '#26a69a' },\n { kind: 'color', key: 'downColor', label: 'Down Color', default: '#ef5350' },\n ],\n factory: (p) =>\n new HeikinAshi(p.color as string, p.upColor as string, p.downColor as string),\n },\n // Volume (sub-pane)\n {\n shortName: 'VOL',\n fields: [\n { kind: 'color', key: 'upColor', label: 'Up Color', default: '#26a69a' },\n { kind: 'color', key: 'downColor', label: 'Down Color', default: '#ef5350' },\n ],\n factory: (p) => new VOL(p.upColor as string, p.downColor as string),\n },\n // Trend (overlay)\n {\n shortName: 'LinReg',\n fields: [\n {\n kind: 'number',\n key: 'period',\n label: 'Period',\n min: 1,\n max: 500,\n step: 1,\n default: 14,\n },\n { kind: 'color', key: 'color', label: 'Color', default: '#ff9800' },\n ],\n factory: (p) => new LinearRegression(p.period as number, p.color as string),\n },\n];\n\n// ── Layout constants ──────────────────────────────────────────────────────────\nconst PRICE_AXIS_WIDTH = 70;\nconst TIME_AXIS_HEIGHT = 24;\nconst VOLUME_PANEL_RATIO = 0.18;\nconst SUB_PANE_HEIGHT = 80;\nconst PANE_SEPARATOR = 1; // px — thin line between panes\nconst DEFAULT_VISIBLE_BARS = 80;\nconst PRICE_RANGE_LERP = 0.25; // lerp fraction per frame; converges in ~10 frames at 60fps\nfunction isMobileDevice(): boolean {\n return (\n typeof window !== 'undefined' && ('ontouchstart' in window || navigator.maxTouchPoints > 1)\n );\n}\nfunction initialVisibleBars(mobileBarDivisor: number = 2, forceApply = false): number {\n if (!forceApply && !isMobileDevice()) return DEFAULT_VISIBLE_BARS;\n return Math.max(10, Math.round(DEFAULT_VISIBLE_BARS / mobileBarDivisor));\n}\nconst LOOKAHEAD = 4; // empty candle slots to show after the last bar\n\n// ── Sub-pane helpers ──────────────────────────────────────────────────────────\nfunction applySubPaneScale(range: { min: number; max: number }, factor: number): { min: number; max: number } {\n const mid = (range.min + range.max) / 2;\n const half = (range.max - range.min) / 2;\n return { min: mid - half * factor, max: mid + half * factor };\n}\n\nfunction subPaneAxisPrecision(range: { min: number; max: number }): number {\n const span = range.max - range.min;\n if (span >= 100) return 0;\n if (span >= 10) return 1;\n if (span >= 1) return 2;\n if (span >= 0.1) return 3;\n return 4;\n}\n\n// ── Canvas tag ────────────────────────────────────────────────────────────────\ntype TaggedCanvas = HTMLCanvasElement & {\n _priceRange?: { min: number; max: number };\n _chartWidth?: number;\n};\n\nexport class ChartEngine {\n // DOM\n private wrapper: HTMLDivElement;\n private canvasWrap: HTMLDivElement;\n private canvas: HTMLCanvasElement;\n private drawCanvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private drawCtx: CanvasRenderingContext2D;\n // UI bars\n private topBar: TopBar | null = null;\n private bottomBar: BottomBar | null = null;\n private leftBar: LeftBar | null = null;\n private leftBarVisible = true;\n private drawingToolsEnabled = true;\n private _mobileLayout = false;\n private indicatorOverlay: IndicatorOverlay | null = null;\n private subPaneOverlays = new Map<string, IndicatorOverlay>();\n // ISIN picker modal\n private isinPickerModal: IsinPickerModal | null = null;\n private isins: string[] = [];\n // Symbol info overlay (top-left of chart canvas)\n private siEl: HTMLDivElement | null = null;\n private siStreamDot: HTMLSpanElement | null = null;\n private siSymbolSpan: HTMLSpanElement | null = null;\n private siOHLCSpan: HTMLSpanElement | null = null;\n private tickActivityTimer: ReturnType<typeof setTimeout> | null = null;\n private tickActivityMs = 30_000;\n private streamStatus: StreamStatus = 'disconnected';\n private indicatorSettingsDialog: IndicatorSettingsDialog | null = null;\n private chartSettingsDialog: ChartSettingsDialog | null = null;\n private tradeButton: TradeButton | null = null;\n private tradePopover: TradePopover | null = null;\n private draftOrderLabel: string | null = null;\n private draftOrderQtyInput: DraftOrderQtyInput | null = null;\n private _hoverBuyType: 'limit' | 'stop' = 'limit';\n private _hoverSellType: 'limit' | 'stop' = 'limit';\n private _onOrderSubmit: ((order: OrderSubmit) => void) | undefined = undefined;\n private _minLots = 1;\n private scrollToEndBtn: HTMLButtonElement | null = null;\n private scrollToEndVisible = false;\n private scrollAnimId: number | null = null;\n private resetViewBtn: HTMLButtonElement | null = null;\n // Core\n private dataStore = new DataStore();\n private scaleManager = new ScaleManager();\n private emitter = new EventEmitter<ChartEventMap>();\n private theme: ChartTheme;\n private themeName: 'dark' | 'light' = 'dark';\n private _debug = false;\n private series: SeriesType;\n private showVolume: boolean;\n private symbol: string = '';\n private showBidAskLines = false;\n private showActLogo = false;\n private timeframe: Timeframe;\n private duration: Duration | undefined;\n private activeIndicators: ActiveIndicatorState[] = [];\n private get indicators(): IIndicator[] {\n return this.activeIndicators\n .filter((s) => {\n if (!s.visible) return false;\n const tf = s.currentParams['timeframe'] as string | undefined;\n if (tf && tf !== 'Chart' && tf !== this.timeframe) return false;\n return true;\n })\n .map((s) => s.indicator);\n }\n private indicatorResults = new Map<string, ReturnType<IIndicator['compute']>>();\n private viewport: Viewport = {\n startIndex: 0,\n endIndex: initialVisibleBars(),\n candleWidth: 8,\n candleGap: 2,\n };\n private crosshair: CrosshairPosition | null = null;\n // Drawing\n private drawingManager = new DrawingManager();\n private textInputEl: HTMLInputElement | null = null;\n private textInputDrawing: import('./core/types.js').IDrawing | null = null;\n // Pane resize\n private paneHeightOverrides = new Map<string, number>();\n private separatorDrag: {\n indicatorName: string;\n startY: number;\n startH: number;\n } | null = null;\n // Axis dimensions (not user-resizable)\n private readonly priceAxisWidth = PRICE_AXIS_WIDTH;\n private readonly timeAxisHeight = TIME_AXIS_HEIGHT;\n // Price axis state — fixed base range + user-controlled overrides\n private priceScaleFactor = 1.0; // >1 = zoom out (more range), <1 = zoom in\n private pricePanOffset = 0; // price units offset from vertical drag\n private _displayedPriceRange: PriceRange | null = null; // lerp target; null = snap on next render\n private _lockedAutoFitBase: PriceRange | null = null; // non-null = user has manually adjusted Y-axis\n private axisDrag: { axis: 'price' | 'time' | 'subpane'; startPos: number; startSize: number; indicatorName?: string } | null = null;\n private subPaneScaleFactors = new Map<string, number>();\n private _mobileCrosshairActive = false;\n private _mobileTapStartXY: { x: number; y: number } | null = null;\n private _isHoveringTradeButton = false;\n private _tradeButtonClickData: { price: number; y: number } | null = null;\n // Interaction\n private panHandler: PanHandler;\n private zoomHandler: ZoomHandler;\n private resizeObserver: ResizeObserver;\n private rafId: number | null = null;\n private countdownRafId: number | null = null;\n private countdownActive = false;\n private _cachedWrapRect: DOMRect | null = null;\n private _cachedDrawRect: DOMRect | null = null;\n // Touch drawing state\n private _drawTouchAnchorActive = false; // true during the first-anchor touch gesture (suppress preview)\n private _lastDrawingTouchPoint: { barIndex: number; price: number } | null = null;\n private _drawTouchStartXY: { x: number; y: number } | null = null; // for tap vs drag detection\n // Mobile drawing action flyout\n private _mobileDrawingFlyout: HTMLDivElement | null = null;\n // Fullscreen state\n private _isCssFullscreen = false;\n // UI config\n private uiConfig: UiConfig;\n private themeOverrides: ChartConfig['themeOverrides'];\n private settingsCanvasColors: NonNullable<ChartSettings['canvasColors']> = {};\n private aggregateFrom: ChartConfig['aggregateFrom'];\n private labels: ChartLabels;\n // Streaming\n private streamAdapter: IWebSocketAdapter | null = null;\n private liveBidAsk: { bid: number; ask: number } | null = null;\n private tickClosePriceSource: 'bid' | 'ask' = 'bid';\n // Trade / position levels\n private levels: AnyLevel[] = [];\n private tradeLevelHitAreas: TradeLevelHitArea[] = [];\n private tradeLevelEditAreas: TradeLevelHitArea[] = [];\n private tradeHoverAreas: TradeHoverArea[] = [];\n private tradeLevelDragAreas: AnyDragArea[] = [];\n private tradeLevelConfirmAreas: TradeLevelConfirmArea[] = [];\n private tradeAddBracketAreas: TradeAddBracketArea[] = [];\n private hoveredTradeLabel: string | null = null;\n private selectedTradeLabel: string | null = null;\n private tradeCanvas!: HTMLCanvasElement;\n private tradeCtx!: CanvasRenderingContext2D;\n // TFC components\n private tradeDragHandler: TradeDragHandler | null = null;\n private tradeDragNewPrice: number | null = null;\n /** bracketOrderLabel stored when a bracket drag starts, for use in the confirm message. */\n private _pendingBracketOrderLabel: string | null = null;\n /** True when the current bracket drag is adding a NEW bracket (via +SL/+TP button). */\n private _isBracketNew = false;\n // Inline drag confirmation — accumulates changes per level until user confirms\n private pendingLevelDrags = new Map<\n string,\n Array<{\n field: 'main' | 'stopLoss' | 'takeProfit';\n newPrice: number;\n oldPrice: number;\n isNew?: boolean;\n isRemoval?: boolean;\n bracketOrderLabel?: string;\n }>\n >();\n // Trade from Charts settings\n private tradeDisplayFilter: TradeDisplayFilter = 'all';\n private positionRenderStyle: PositionRenderStyle = 'dot';\n private tradesThresholdForHorizontalLine: number = 2;\n /** Explicit user override from settings dialog. null = no override yet. */\n private positionRenderStyleOverride: PositionRenderStyle | null = null;\n private readonly RENDER_STYLE_LS_KEY = 'finchart:positionRenderStyle';\n // Data loading\n private dataLoader: ((params: DataLoaderParams) => Promise<OHLCVBar[]>) | null = null;\n private isFetching = false;\n private noMoreData = false;\n private maxCandles = 200;\n private mobileBarDivisor: number = 2;\n private explicitMobileDivisor: boolean = false;\n private maxSubPanes = 3;\n private showCandleCountdown = true;\n private candleCountdownTimeframes: Timeframe[] | 'all' | undefined;\n private loadingOverlayEl: HTMLDivElement | null = null;\n // Watermark\n private logoImage: HTMLImageElement | null = null;\n\n constructor(config: ChartConfig) {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n throw new Error('stockchart requires a browser environment');\n }\n\n const {\n container,\n theme = 'dark',\n series = 'candlestick',\n showVolume = true,\n showUI = true,\n timeframe = '1D',\n duration = undefined,\n symbol = '',\n isins,\n onIsinSelect,\n onOrderSubmit,\n dataLoader,\n durationTimeframeMap,\n uiConfig,\n labels,\n tickActivityMs = 30_000,\n } = config;\n\n this.dataLoader = dataLoader ?? null;\n this.drawingToolsEnabled = config.showDrawingTools !== false;\n this.uiConfig = resolveUiConfig(uiConfig);\n this.labels = resolveLabels(labels);\n this.tickActivityMs = tickActivityMs;\n this.maxCandles = config.maxCandles ?? 200;\n this.explicitMobileDivisor = config.mobileBarDivisor !== undefined;\n this.mobileBarDivisor = config.mobileBarDivisor ?? 2;\n this.viewport = { ...this.viewport, endIndex: initialVisibleBars(this.mobileBarDivisor, this.explicitMobileDivisor) };\n this.maxSubPanes = config.maxSubPanes ?? 3;\n this.tickClosePriceSource = config.tickClosePriceSource ?? 'bid';\n this.tradesThresholdForHorizontalLine = config.tradesThresholdForHorizontalLine ?? 2;\n // Config-provided values (restored from persisted state) take precedence over localStorage.\n if (config.positionRenderStyle === 'line' || config.positionRenderStyle === 'dot') {\n this.positionRenderStyleOverride = config.positionRenderStyle;\n } else {\n const _storedStyle = localStorage.getItem(this.RENDER_STYLE_LS_KEY) as PositionRenderStyle | null;\n if (_storedStyle === 'line' || _storedStyle === 'dot') {\n this.positionRenderStyleOverride = _storedStyle;\n }\n }\n if (config.tradeDisplayFilter) {\n this.tradeDisplayFilter = config.tradeDisplayFilter;\n }\n if (config.canvasColors) {\n this.settingsCanvasColors = config.canvasColors;\n }\n this.recomputeRenderStyle();\n this.showBidAskLines = config.showBidAskLines ?? false;\n this.showActLogo = config.showActLogo ?? false;\n this.showCandleCountdown = config.showCandleCountdown ?? true;\n this.candleCountdownTimeframes = config.candleCountdownTimeframes;\n this._onOrderSubmit = onOrderSubmit;\n this._minLots = config.minLots ?? 1;\n\n this.themeName = theme === 'dark' ? 'dark' : 'light';\n this.themeOverrides = config.themeOverrides;\n this.aggregateFrom = config.aggregateFrom;\n // Initial theme: deep-merge overrides without CSS var resolution yet\n // (wrapper isn't in the DOM until later; resolution happens post-mount)\n const _baseTheme = this.themeName === 'dark' ? DARK_THEME : LIGHT_THEME;\n this.theme = deepMergeTheme(_baseTheme, this.themeOverrides?.[this.themeName]);\n this.series = series;\n this.showVolume = showVolume;\n this.timeframe = timeframe;\n this.duration = duration;\n this.symbol = symbol;\n\n // ── Build DOM layout ─────────────────────────────────────────────────\n\n this.wrapper = document.createElement('div');\n Object.assign(this.wrapper.style, {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n boxSizing: 'border-box',\n });\n\n // Top bar\n if (showUI) {\n const resolvedDurationMap = { ...DURATION_TIMEFRAME_MAP, ...durationTimeframeMap };\n this.topBar = new TopBar(\n (s) => this.setSeries(s),\n (tf) => {\n this.timeframe = tf;\n this.emitter.emit('timeframeChange', { timeframe: tf });\n this.emitStateChange();\n this.updateCountdownState();\n this.triggerLoad('timeframe');\n },\n (name) => this.addIndicatorByName(name),\n (d, tf) => {\n this.duration = d;\n this.timeframe = tf;\n this.topBar?.setTimeframe(tf);\n this.bottomBar?.setActive(d);\n this.emitter.emit('durationChange', { duration: d, timeframe: tf });\n this.emitStateChange();\n this.updateCountdownState();\n this.triggerLoad('duration');\n },\n () => {\n this.openChartSettings();\n },\n () => {\n this.toggleFullscreen();\n },\n this.drawingToolsEnabled ? () => this.toggleDrawingTools() : null,\n this.drawingToolsEnabled,\n this.series,\n this.timeframe,\n null,\n resolvedDurationMap,\n this.theme,\n this.uiConfig.topBar,\n this.labels.topBar\n );\n this.topBar.setIndicatorOptions(\n INDICATORS_CONFIG.filter((e) => e.enabled).map((e) => ({\n value: e.short_name,\n label: `${e.name} (${e.short_name})`,\n category: e.type,\n }))\n );\n this.wrapper.appendChild(this.topBar.el);\n }\n\n // Middle row: left bar + canvas wrapper\n const middleRow = document.createElement('div');\n Object.assign(middleRow.style, {\n display: 'flex',\n flex: '1',\n minHeight: '0',\n overflow: 'hidden',\n position: 'relative', // needed for LeftBar absolute overlay in mobile mode\n });\n\n if (showUI && this.drawingToolsEnabled) {\n this.leftBar = new LeftBar(\n (tool) => this.setDrawingTool(tool),\n (actionId) => {\n switch (actionId) {\n case 'undo':\n this.undoDrawing();\n break;\n case 'redo':\n this.redoDrawing();\n break;\n case 'delete_selected':\n this.deleteSelectedDrawing();\n break;\n case 'clear_all':\n this.clearAllDrawings();\n break;\n case 'hide_all':\n this.hideAllDrawings();\n break;\n case 'show_all':\n this.showAllDrawings();\n break;\n case 'lock_all':\n this.lockAllDrawings();\n break;\n case 'unlock_all':\n this.unlockAllDrawings();\n break;\n }\n },\n () => {\n // Mobile: bar auto-closed after tool selection — sync pencil button\n this.leftBarVisible = false;\n this.topBar?.setDrawingsBtnActive(false);\n },\n this.theme,\n this.uiConfig.drawingToolbar,\n this.labels.drawingToolbar\n );\n middleRow.appendChild(this.leftBar.el);\n }\n\n this.canvasWrap = document.createElement('div');\n Object.assign(this.canvasWrap.style, {\n flex: '1',\n position: 'relative',\n overflow: 'hidden',\n });\n\n // Main chart canvas (no pointer events — sits below the drawing canvas)\n this.canvas = document.createElement('canvas');\n Object.assign(this.canvas.style, {\n position: 'absolute',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n });\n this.canvasWrap.appendChild(this.canvas);\n\n // Trade level canvas — sits above main canvas, below drawing canvas\n this.tradeCanvas = document.createElement('canvas');\n Object.assign(this.tradeCanvas.style, {\n position: 'absolute',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n });\n this.canvasWrap.appendChild(this.tradeCanvas);\n\n // Drawing overlay canvas — always on top, always receives all mouse events\n this.drawCanvas = document.createElement('canvas');\n Object.assign(this.drawCanvas.style, {\n position: 'absolute',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n cursor: 'crosshair',\n touchAction: 'none',\n });\n this.canvasWrap.appendChild(this.drawCanvas);\n\n // Text input overlay — shown when editing text-type drawings\n this.textInputEl = document.createElement('input');\n this.textInputEl.type = 'text';\n Object.assign(this.textInputEl.style, {\n position: 'absolute',\n display: 'none',\n zIndex: '15',\n background: 'transparent',\n border: 'none',\n borderBottom: '1px solid #2196f3',\n color: '#f5f5f5',\n font: '13px system-ui, sans-serif',\n outline: 'none',\n minWidth: '60px',\n padding: '0 2px',\n });\n this.canvasWrap.appendChild(this.textInputEl);\n\n // Loading overlay — shown during data fetches\n this.loadingOverlayEl = document.createElement('div');\n Object.assign(this.loadingOverlayEl.style, {\n display: 'none',\n position: 'absolute',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'none',\n zIndex: '20',\n });\n const loadingLabel = document.createElement('span');\n loadingLabel.textContent = this.labels.chart.loading;\n Object.assign(loadingLabel.style, {\n color: 'rgba(200,200,200,0.9)',\n fontSize: '13px',\n background: 'rgba(0,0,0,0.45)',\n padding: '4px 12px',\n borderRadius: '4px',\n });\n this.loadingOverlayEl.appendChild(loadingLabel);\n this.canvasWrap.appendChild(this.loadingOverlayEl);\n\n // Symbol info overlay — top-left of chart canvas\n if (showUI) {\n this.siEl = document.createElement('div');\n Object.assign(this.siEl.style, {\n position: 'absolute',\n top: '6px',\n left: '6px',\n zIndex: '10',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n pointerEvents: 'none',\n });\n\n this.siSymbolSpan = document.createElement('span');\n Object.assign(this.siSymbolSpan.style, {\n color: this.theme.axisText,\n fontSize: '17px',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n fontWeight: '700',\n display: symbol ? 'inline' : 'none',\n });\n this.siSymbolSpan.textContent = symbol ?? '';\n\n // ISIN picker — initialised whenever a callback is provided; list can be set later via setIsins()\n if (onIsinSelect) {\n if (isins) this.isins = isins;\n this.isinPickerModal = new IsinPickerModal(this.theme, onIsinSelect);\n this.getFloatingRoot().appendChild(this.isinPickerModal.el);\n Object.assign(this.siSymbolSpan.style, {\n cursor: 'pointer',\n textDecoration: 'underline',\n pointerEvents: 'auto',\n });\n this.siSymbolSpan.addEventListener('click', () => {\n this.isinPickerModal!.show(this.isins, this.siSymbolSpan!.textContent ?? '');\n });\n }\n\n this.siOHLCSpan = document.createElement('span');\n Object.assign(this.siOHLCSpan.style, {\n fontSize: '14px',\n fontFamily: \"'Inter', system-ui, sans-serif\",\n whiteSpace: 'nowrap',\n });\n\n this.siStreamDot = document.createElement('span');\n Object.assign(this.siStreamDot.style, {\n width: '7px',\n height: '7px',\n borderRadius: '50%',\n background: this.theme.ui.stream.disconnected,\n display: 'inline-block',\n flexShrink: '0',\n });\n\n this.siEl.append(this.siStreamDot, this.siSymbolSpan, this.siOHLCSpan);\n this.canvasWrap.appendChild(this.siEl);\n }\n\n // Indicator overlay — sits inside canvasWrap above everything\n if (showUI) {\n this.indicatorOverlay = new IndicatorOverlay(\n this.theme,\n this.uiConfig.indicatorOverlay,\n this.labels.chart\n );\n this.canvasWrap.appendChild(this.indicatorOverlay.el);\n\n this.indicatorSettingsDialog = new IndicatorSettingsDialog(\n this.theme,\n this.labels.dialogs\n );\n this.getFloatingRoot().appendChild(this.indicatorSettingsDialog.el);\n\n // Scroll-to-end button — bottom-right, shown when last candle is off-screen\n this.scrollToEndBtn = document.createElement('button');\n this.scrollToEndBtn.title = this.labels.chart.scrollToLatest;\n this.applyScrollToEndBtnStyles();\n this.scrollToEndBtn.addEventListener('click', () => this.scrollToEnd());\n this.canvasWrap.appendChild(this.scrollToEndBtn);\n\n // Reset view button — bottom-center, always visible\n this.resetViewBtn = document.createElement('button');\n this.resetViewBtn.title = 'Reset view';\n this.applyResetViewBtnStyles();\n this.resetViewBtn.addEventListener('click', () => this.resetView());\n this.canvasWrap.appendChild(this.resetViewBtn);\n }\n\n // TFC — TradePanel + TradeDragHandler (always initialised when trading is enabled)\n this.tradeDragHandler = new TradeDragHandler();\n\n if (config.onLevelDragEnd) {\n this.emitter.on('tradeLevelDragEnd', config.onLevelDragEnd);\n }\n if (config.onLevelEdit) {\n this.emitter.on('tradeLevelEdit', config.onLevelEdit);\n }\n\n // Trade button + popover\n if (onOrderSubmit) {\n const lots = config.minLots ?? 1;\n this.tradePopover = new TradePopover(\n this.theme,\n lots,\n (side, price, orderType) => this.createDraftOrder(side, price, orderType),\n this.labels.trade\n );\n this.canvasWrap.appendChild(this.tradePopover.el);\n\n this.draftOrderQtyInput = new DraftOrderQtyInput(\n this.priceAxisWidth,\n this.labels.trade\n );\n this.draftOrderQtyInput.onLotsChange = config.onLotsChange;\n this.canvasWrap.appendChild(this.draftOrderQtyInput.el);\n\n this.tradeButton = new TradeButton(\n this.theme,\n this.priceAxisWidth,\n () => {\n if (this._tradeButtonClickData && this.tradePopover) {\n const btnRight = this.priceAxisWidth + 10 + 22 + 4; // right offset inside canvasWrap\n this.tradePopover.show(\n this._tradeButtonClickData.price,\n this._tradeButtonClickData.y,\n btnRight,\n this.dataStore.getPricePrecision(),\n this._hoverBuyType,\n this._hoverSellType\n );\n }\n },\n this.labels.trade\n );\n this.canvasWrap.appendChild(this.tradeButton.el);\n this.tradeButton.el.addEventListener('mouseenter', () => {\n this._isHoveringTradeButton = true;\n this.crosshair = null;\n this.scheduleRender();\n });\n this.tradeButton.el.addEventListener('mousemove', (e) => {\n if (e.buttons !== 0) return;\n const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const { priceH } = this.getChartLayout();\n if (y >= 0 && y <= priceH) {\n this.tradeButton?.setY(y);\n const priceRange = this._displayedPriceRange ?? this.getScaledPriceRange(this.viewport);\n const price = this.scaleManager.pixelToPrice(y, priceRange, priceH);\n this._tradeButtonClickData = { price, y };\n }\n });\n this.tradeButton.el.addEventListener('mouseleave', () => {\n this._isHoveringTradeButton = false;\n });\n }\n\n middleRow.appendChild(this.canvasWrap);\n this.wrapper.appendChild(middleRow);\n\n // Bottom bar — duration selector (right-aligned)\n if (showUI) {\n const resolvedDurationMap = { ...DURATION_TIMEFRAME_MAP, ...durationTimeframeMap };\n this.bottomBar = new BottomBar(\n (d, tf) => {\n this.duration = d;\n this.timeframe = tf;\n this.topBar?.setTimeframe(tf);\n this.emitter.emit('durationChange', { duration: d, timeframe: tf });\n this.emitStateChange();\n this.updateCountdownState();\n this.triggerLoad('duration');\n },\n this.duration ?? null,\n this.theme,\n resolvedDurationMap,\n this.uiConfig.bottomBar,\n this.labels.bottomBar,\n );\n this.wrapper.appendChild(this.bottomBar.el);\n }\n\n container.appendChild(this.wrapper);\n\n // Resolve CSS custom properties now that wrapper is in the live DOM.\n // Sub-components created above (topBar, leftBar, tradeButton) receive the\n // resolved theme so DOM colors and canvas fills both use concrete values.\n if (this.themeOverrides) {\n this.theme = this.buildTheme(this.themeName);\n this.topBar?.setTheme(this.theme);\n this.bottomBar?.setTheme(this.theme);\n this.leftBar?.setTheme(this.theme);\n this.tradeButton?.setTheme(this.theme, this.priceAxisWidth);\n }\n\n // ── Canvas contexts ──────────────────────────────────────────────────\n\n const ctx = this.canvas.getContext('2d');\n if (!ctx) throw new Error('Canvas 2D context unavailable');\n this.ctx = ctx;\n\n const drawCtx = this.drawCanvas.getContext('2d');\n if (!drawCtx) throw new Error('Drawing canvas 2D context unavailable');\n this.drawCtx = drawCtx;\n\n const tradeCtx = this.tradeCanvas.getContext('2d');\n if (!tradeCtx) throw new Error('Trade canvas 2D context unavailable');\n this.tradeCtx = tradeCtx;\n\n // Preload watermark logo (only when enabled)\n if (this.showActLogo) {\n const img = new Image();\n img.onload = () => {\n this.logoImage = img;\n this.scheduleRender();\n };\n img.src = actLogoUrl;\n }\n\n // Deactivate tool + sync UI when a drawing is finished\n this.drawingManager.setOnComplete(() => {\n this.leftBar?.setActiveTool(null);\n this.drawCanvas.style.cursor = 'default';\n });\n // Notify state persistence whenever drawings change\n this.drawingManager.onDrawingsChange = () => this.emitStateChange();\n\n // Show text input when a text-type drawing is placed\n this.drawingManager.onStartTextEdit = (drawing) => this.showTextInput(drawing);\n\n // ── Interaction ──────────────────────────────────────────────────────\n\n this.panHandler = new PanHandler(\n this.drawCanvas,\n () => this.viewport,\n (v) => {\n this.viewport = v;\n this.clearDuration();\n this.checkNeedMoreData();\n },\n () => this.dataStore.length,\n () => this.scheduleRender(),\n () =>\n this.drawingManager.getActiveTool() !== null ||\n this.drawingManager.isDraggingDrawing() ||\n this.drawingManager.isResizingDrawing() ||\n this.separatorDrag !== null ||\n this.axisDrag !== null ||\n (this.tradeDragHandler?.active ?? false) ||\n this._mobileCrosshairActive,\n (deltaY: number) => {\n const { priceH } = this.getChartLayout();\n const range = this.getScaledPriceRange(this.viewport);\n const pricePerPixel = (range.max - range.min) / priceH;\n this.pricePanOffset += deltaY * pricePerPixel;\n this.scheduleRender();\n }\n );\n\n this.zoomHandler = new ZoomHandler(\n this.drawCanvas,\n () => this.viewport,\n (v) => {\n this.viewport = v;\n this.clearDuration();\n this.checkNeedMoreData();\n },\n () => this.dataStore.length,\n () => this.scheduleRender(),\n () => this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect(),\n () => this.getChartLayout().chartW,\n (dx: number) => {\n const vp = this.viewport;\n const visibleBars = vp.endIndex - vp.startIndex;\n const barsPerPixel = visibleBars / this.drawCanvas.width;\n const shift = dx * barsPerPixel;\n const maxStart = this.dataStore.length;\n const newStart = Math.max(0, Math.min(maxStart, vp.startIndex + shift));\n this.viewport = { ...vp, startIndex: newStart, endIndex: newStart + visibleBars };\n this.clearDuration();\n this.checkNeedMoreData();\n }\n );\n\n this.drawCanvas.addEventListener('mousemove', this.onMouseMove);\n this.drawCanvas.addEventListener('mouseleave', this.onMouseLeave);\n this.drawCanvas.addEventListener('mousedown', this.onCanvasClick);\n this.drawCanvas.addEventListener('dblclick', this.onDoubleClick);\n window.addEventListener('mouseup', this.onMouseUp);\n this.drawCanvas.addEventListener('touchstart', this.onDrawingTouchStart, {\n passive: false,\n });\n this.drawCanvas.addEventListener('touchmove', this.onDrawingTouchMove, { passive: false });\n this.drawCanvas.addEventListener('touchend', this.onDrawingTouchEnd, { passive: false });\n\n // Keyboard shortcuts for drawings\n document.addEventListener('keydown', this.onKeyDown);\n\n // Sync fullscreen button and re-parent floating elements on fullscreen change\n // Listen on document too so Escape-key exits are caught reliably\n const onFullscreenChange = () => {\n const active = !!document.fullscreenElement;\n if (!active) this._isCssFullscreen = false; // native exit clears CSS state\n this.topBar?.setFullscreen(active);\n this.reparentFloatingElements();\n };\n this.wrapper.addEventListener('fullscreenchange', onFullscreenChange);\n document.addEventListener('fullscreenchange', onFullscreenChange);\n\n // ── Resize ───────────────────────────────────────────────────────────\n\n this.resizeObserver = new ResizeObserver(() => this.onResize());\n this.resizeObserver.observe(this.canvasWrap);\n this.onResize();\n\n // Trigger initial data load if a loader was provided\n if (this.dataLoader) {\n this.triggerLoad('initial');\n }\n }\n\n // ── Public API ────────────────────────────────────────────────────────────\n\n loadData(bars: OHLCVBar[], fitAll = false): this {\n this.isFetching = false;\n this.noMoreData = false;\n this.pricePanOffset = 0;\n this.priceScaleFactor = 1.0;\n this._displayedPriceRange = null;\n this._lockedAutoFitBase = null;\n this.dataStore.set(bars);\n this.viewport = {\n ...this.viewport,\n startIndex: fitAll ? 0 : Math.max(0, bars.length - initialVisibleBars(this.mobileBarDivisor, this.explicitMobileDivisor) + LOOKAHEAD),\n endIndex: bars.length + LOOKAHEAD,\n };\n const hasVol = this.dataStore.hasVolumeData;\n if (!hasVol) this.showVolume = false;\n this.topBar?.setVolumeControl(this.showVolume, hasVol);\n if (this.showVolume && hasVol) {\n this.indicatorOverlay?.addPill(\n 'VOL',\n this.theme.volume.up,\n 'VOL',\n 'Chart',\n true,\n () => {\n this.setVolume(false);\n this.indicatorOverlay?.removePill('VOL');\n this.topBar?.setVolumeControl(false, this.dataStore.hasVolumeData);\n },\n null,\n () => {\n this.setVolume(!this.showVolume);\n this.indicatorOverlay?.updatePillVisibility('VOL', this.showVolume);\n this.scheduleRender();\n }\n );\n }\n this.recomputeIndicators();\n this.updateCountdownState();\n this.scheduleRender();\n return this;\n }\n\n /** Prepends historical bars before the current dataset without a visual jump. */\n prependData(bars: OHLCVBar[]): this {\n if (bars.length === 0) {\n this.noMoreData = true;\n this.isFetching = false;\n return this;\n }\n const n = this.dataStore.prepend(bars);\n if (n > 0) {\n this.viewport = {\n ...this.viewport,\n startIndex: this.viewport.startIndex + n,\n endIndex: this.viewport.endIndex + n,\n };\n this.recomputeIndicators();\n this.scheduleRender();\n }\n this.isFetching = false;\n return this;\n }\n\n /** Shows or hides the loading overlay. */\n setLoading(loading: boolean): this {\n if (this.loadingOverlayEl) {\n this.loadingOverlayEl.style.display = loading ? 'flex' : 'none';\n }\n return this;\n }\n\n // ── Data loading helpers ──────────────────────────────────────────────────\n\n private timeframeToMs(tf: Timeframe): number {\n const MIN = 60_000;\n const map: Record<Timeframe, number> = {\n '1m': 1 * MIN,\n '5m': 5 * MIN,\n '15m': 15 * MIN,\n '30m': 30 * MIN,\n '1h': 60 * MIN,\n '4h': 240 * MIN,\n '1D': 1440 * MIN,\n '1W': 10080 * MIN,\n '1M': 43200 * MIN,\n '1Y': 525600 * MIN,\n };\n return map[tf] ?? 1440 * MIN;\n }\n\n /** Returns the base interval to request from the dataLoader for the current timeframe.\n * Falls back to the current timeframe itself when no mapping is configured. */\n private getBaseInterval(): Timeframe {\n return this.aggregateFrom?.[this.timeframe] ?? this.timeframe;\n }\n\n /** Returns true when the base interval is finer than the target timeframe,\n * meaning the fetched bars must be aggregated before rendering. */\n private shouldAggregate(): boolean {\n const base = this.getBaseInterval();\n return base !== this.timeframe && this.timeframeToMs(base) < this.timeframeToMs(this.timeframe);\n }\n\n /** Aggregates bars if shouldAggregate(), otherwise returns them unchanged. */\n private maybeAggregate(bars: OHLCVBar[]): OHLCVBar[] {\n return this.shouldAggregate()\n ? aggregateCandles(bars, this.timeframeToMs(this.timeframe))\n : bars;\n }\n\n private timeframeToInterval(tf: Timeframe): string {\n const map: Record<Timeframe, string> = {\n '1m': '1min',\n '5m': '5min',\n '15m': '15min',\n '30m': '30min',\n '1h': '1hour',\n '4h': '4hour',\n '1D': '1day',\n '1W': '1week',\n '1M': '1month',\n '1Y': '1week',\n };\n return map[tf] ?? '1day';\n }\n\n private durationToMs(d: Duration): number {\n const DAY = 24 * 60 * 60 * 1000;\n const map: Record<Duration, number> = {\n '1D': 1 * DAY,\n '5D': 5 * DAY,\n '1M': 30 * DAY,\n '3M': 90 * DAY,\n '6M': 180 * DAY,\n '1Y': 365 * DAY,\n '5Y': 5 * 365 * DAY,\n All: 20 * 365 * DAY,\n };\n return map[d] ?? 365 * DAY;\n }\n\n private triggerLoad(reason: 'initial' | 'timeframe' | 'duration'): void {\n if (!this.dataLoader) return;\n this.isFetching = true;\n this.noMoreData = false;\n const end = new Date();\n const maxCandleStart = new Date(\n end.getTime() - this.maxCandles * this.timeframeToMs(this.timeframe)\n );\n const durationStart = this.duration\n ? new Date(end.getTime() - this.durationToMs(this.duration))\n : maxCandleStart;\n const start = new Date(Math.max(durationStart.getTime(), maxCandleStart.getTime()));\n const interval = this.timeframeToInterval(this.getBaseInterval());\n this.setLoading(true);\n this.dataLoader({ start, end, interval })\n .then((bars) => {\n this.loadData(this.maybeAggregate(bars), reason === 'duration');\n this.setLoading(false);\n this.emitter.emit('dataLoaded', {\n timeframe: this.timeframe,\n interval,\n start,\n end,\n });\n })\n .catch(() => {\n this.isFetching = false;\n this.setLoading(false);\n });\n }\n\n private checkNeedMoreData(): void {\n if (!this.dataLoader || this.isFetching || this.noMoreData) return;\n const threshold = Math.max(20, Math.round(initialVisibleBars(this.mobileBarDivisor, this.explicitMobileDivisor) * 0.25));\n if (this.viewport.startIndex > threshold) return;\n if (this.dataStore.length === 0) return;\n\n this.isFetching = true;\n const before = this.dataStore.all[0].time;\n const end = new Date(before - 1);\n const maxCandleStart = new Date(\n before - this.maxCandles * this.timeframeToMs(this.timeframe)\n );\n const durationStart = this.duration\n ? new Date(before - this.durationToMs(this.duration))\n : maxCandleStart;\n const start = new Date(Math.max(durationStart.getTime(), maxCandleStart.getTime()));\n const interval = this.timeframeToInterval(this.getBaseInterval());\n this.setLoading(true);\n this.dataLoader({ start, end, interval })\n .then((bars) => {\n this.prependData(this.maybeAggregate(bars));\n this.setLoading(false);\n })\n .catch(() => {\n this.isFetching = false;\n this.setLoading(false);\n });\n }\n\n addIndicator(indicator: IIndicator): this {\n if (indicator.pane === 'sub') {\n const subPaneCount = this.activeIndicators.filter(\n (s) => s.indicator.pane === 'sub'\n ).length;\n if (subPaneCount >= this.maxSubPanes) return this;\n }\n const schema = INDICATOR_PARAM_SCHEMAS.find((s) => s.shortName === indicator.name);\n const defaultParams: IndicatorParams = schema\n ? Object.fromEntries(schema.fields.map((f) => [f.key, f.default]))\n : {};\n defaultParams['timeframe'] = 'Chart';\n const state: ActiveIndicatorState = {\n indicator,\n shortName: indicator.name,\n currentParams: defaultParams,\n visible: true,\n };\n this.activeIndicators.push(state);\n if (this.dataStore.length > 0) {\n this.indicatorResults.set(indicator.name, indicator.compute(this.dataStore.all));\n }\n const hasSettings = schema !== undefined && schema.fields.length > 0;\n const label = buildIndicatorLabel(indicator.name, defaultParams, schema);\n if (indicator.pane === 'sub') {\n // Sub-pane indicators get their own overlay positioned within the sub-pane\n const paneOverlay = new IndicatorOverlay(\n this.theme,\n this.uiConfig.indicatorOverlay,\n this.labels.chart,\n );\n Object.assign(paneOverlay.el.style, {\n position: 'absolute',\n top: '6px',\n left: '6px',\n zIndex: '10',\n });\n this.canvasWrap.appendChild(paneOverlay.el);\n this.subPaneOverlays.set(indicator.name, paneOverlay);\n paneOverlay.addPill(\n indicator.name,\n indicator.color,\n label,\n 'Chart',\n true,\n () => this.removeIndicator(indicator.name),\n hasSettings ? () => this.openIndicatorSettings(indicator.name) : null,\n () => {\n state.visible = !state.visible;\n paneOverlay.updatePillVisibility(indicator.name, state.visible);\n this.scheduleRender();\n this.emitStateChange();\n }\n );\n } else {\n this.indicatorOverlay?.addPill(\n indicator.name,\n indicator.color,\n label,\n 'Chart',\n true,\n () => this.removeIndicator(indicator.name),\n hasSettings ? () => this.openIndicatorSettings(indicator.name) : null,\n () => {\n state.visible = !state.visible;\n this.indicatorOverlay?.updatePillVisibility(indicator.name, state.visible);\n this.scheduleRender();\n this.emitStateChange();\n }\n );\n }\n this.topBar?.setIndicatorOptionActive(indicator.name, true);\n this.scheduleRender();\n this.emitStateChange();\n return this;\n }\n\n removeIndicator(name: string): this {\n this.activeIndicators = this.activeIndicators.filter((s) => s.indicator.name !== name);\n this.indicatorResults.delete(name);\n this.subPaneScaleFactors.delete(name);\n const subOverlay = this.subPaneOverlays.get(name);\n if (subOverlay) {\n subOverlay.destroy();\n subOverlay.el.remove();\n this.subPaneOverlays.delete(name);\n } else {\n this.indicatorOverlay?.removePill(name);\n }\n this.topBar?.setIndicatorOptionActive(name, false);\n this.scheduleRender();\n this.emitStateChange();\n return this;\n }\n\n addIndicatorByName(shortName: string): void {\n // VOL is a special case: toggle the volume bars panel\n if (shortName === 'VOL') {\n this.setVolume(!this.showVolume);\n if (this.showVolume) {\n this.indicatorOverlay?.addPill(\n 'VOL',\n this.theme.volume.up,\n 'VOL',\n 'Chart',\n true,\n () => {\n this.setVolume(false);\n this.indicatorOverlay?.removePill('VOL');\n this.topBar?.setVolumeControl(false, this.dataStore.hasVolumeData);\n },\n null,\n () => {\n this.setVolume(!this.showVolume);\n this.indicatorOverlay?.updatePillVisibility('VOL', this.showVolume);\n this.scheduleRender();\n }\n );\n } else {\n this.indicatorOverlay?.removePill('VOL');\n }\n this.topBar?.setVolumeControl(this.showVolume, this.dataStore.hasVolumeData);\n return;\n }\n const preset = INDICATOR_PRESETS.find((p) => p.shortName === shortName);\n if (!preset) return;\n // Toggle off if already active\n if (this.activeIndicators.some((s) => s.shortName === shortName)) {\n this.removeIndicator(shortName);\n return;\n }\n this.addIndicator(preset.factory());\n }\n\n private openIndicatorSettings(shortName: string): void {\n const state = this.activeIndicators.find((s) => s.shortName === shortName);\n if (!state) return;\n const schema = INDICATOR_PARAM_SCHEMAS.find((s) => s.shortName === shortName);\n if (!schema || schema.fields.length === 0) return;\n const augmentedSchema = { ...schema, fields: [...schema.fields, TIMEFRAME_FIELD] };\n this.indicatorSettingsDialog?.show(\n augmentedSchema,\n state.currentParams,\n (newParams) => this.updateIndicatorParams(shortName, newParams),\n () => this.removeIndicator(shortName)\n );\n }\n\n private updateIndicatorParams(shortName: string, newParams: IndicatorParams): void {\n const stateIdx = this.activeIndicators.findIndex((s) => s.shortName === shortName);\n if (stateIdx === -1) return;\n const schema = INDICATOR_PARAM_SCHEMAS.find((s) => s.shortName === shortName);\n if (!schema) return;\n\n const prevState = this.activeIndicators[stateIdx];\n if (!prevState) return;\n // Strip the injected timeframe key before passing to factory (schema doesn't know it)\n const { timeframe: tf, ...factoryParams } = newParams;\n const newIndicator = schema.factory(factoryParams);\n // Mutate in place so the toggle closure in addIndicator (which captured the\n // original state object by reference) continues to read/write the correct object.\n prevState.indicator = newIndicator;\n prevState.currentParams = { ...newParams };\n\n this.indicatorResults.delete(shortName);\n if (this.dataStore.length > 0) {\n this.indicatorResults.set(shortName, newIndicator.compute(this.dataStore.all));\n }\n\n const pillOverlay = this.subPaneOverlays.get(shortName) ?? this.indicatorOverlay;\n pillOverlay?.updatePillColor(shortName, newIndicator.color);\n pillOverlay?.updatePillLabel(\n shortName,\n buildIndicatorLabel(shortName, prevState.currentParams, schema)\n );\n pillOverlay?.updatePillTimeframe(shortName, (tf as string) ?? 'Chart');\n this.scheduleRender();\n this.emitStateChange();\n }\n\n on<K extends keyof ChartEventMap>(event: K, listener: (payload: ChartEventMap[K]) => void) {\n return this.emitter.on(event, listener);\n }\n\n private buildTheme(mode: 'dark' | 'light'): ChartTheme {\n const base = mode === 'dark' ? DARK_THEME : LIGHT_THEME;\n const c = this.settingsCanvasColors[mode];\n const userOverride: DeepPartialChartTheme | undefined = c ? {\n ...(c.background !== undefined && { background: c.background }),\n ...(c.grid !== undefined && { grid: c.grid }),\n ...(c.axisText !== undefined && { axisText: c.axisText }),\n ...(c.axisBorder !== undefined && { axisBorder: c.axisBorder }),\n ...(c.crosshair !== undefined && { crosshair: c.crosshair }),\n ...((c.candleUp ?? c.candleDown ?? c.wickUp ?? c.wickDown ?? c.borderUp ?? c.borderDown) !== undefined && {\n candle: {\n ...(c.candleUp !== undefined && { up: c.candleUp }),\n ...(c.candleDown !== undefined && { down: c.candleDown }),\n ...(c.wickUp !== undefined && { wickUp: c.wickUp }),\n ...(c.wickDown !== undefined && { wickDown: c.wickDown }),\n ...(c.borderUp !== undefined && { borderUp: c.borderUp }),\n ...(c.borderDown !== undefined && { borderDown: c.borderDown }),\n },\n }),\n ...((c.volumeUp ?? c.volumeDown) !== undefined && {\n volume: {\n ...(c.volumeUp !== undefined && { up: c.volumeUp }),\n ...(c.volumeDown !== undefined && { down: c.volumeDown }),\n },\n }),\n } : undefined;\n const merged = deepMergeTheme(deepMergeTheme(base, this.themeOverrides?.[mode]), userOverride);\n return resolveCssVarsInTheme(merged, this.wrapper);\n }\n\n setTheme(theme: 'dark' | 'light'): this {\n this.themeName = theme;\n this.theme = this.buildTheme(theme);\n this.topBar?.setTheme(this.theme);\n this.bottomBar?.setTheme(this.theme);\n this.leftBar?.setTheme(this.theme);\n this.tradeButton?.setTheme(this.theme, this.priceAxisWidth);\n this.tradePopover?.setTheme(this.theme);\n this.indicatorSettingsDialog?.setTheme(this.theme);\n this.chartSettingsDialog?.setTheme(this.theme);\n this.applyScrollToEndBtnStyles();\n this.applyResetViewBtnStyles();\n this.applyMobileDrawingFlyoutTheme();\n if (this.siSymbolSpan) this.siSymbolSpan.style.color = this.theme.axisText;\n if (this.siStreamDot) this.siStreamDot.style.background = this.theme.ui.stream.disconnected;\n this.scheduleRender();\n this.emitStateChange();\n return this;\n }\n\n setSeries(series: SeriesType): this {\n this.series = series;\n this.topBar?.setSeries(series);\n this.emitter.emit('seriesChange', { series });\n this.scheduleRender();\n this.emitStateChange();\n return this;\n }\n\n private clearDuration(): void {\n if (this.duration === undefined) return;\n this.duration = undefined;\n this.topBar?.setActiveDuration(undefined);\n this.bottomBar?.setActive(undefined);\n this.emitStateChange();\n }\n\n setVolume(show: boolean): this {\n this.showVolume = show;\n this.scheduleRender();\n this.emitStateChange();\n return this;\n }\n\n // ── State persistence ─────────────────────────────────────────────────────\n\n private isRestoringState = false;\n\n private emitStateChange(): void {\n if (this.isRestoringState) return;\n this.emitter.emit('stateChange', { symbol: this.symbol, state: this.getState() });\n }\n\n /**\n * Returns a full serializable snapshot of the current chart configuration.\n * Includes timeframe, chart type, active indicators (with params), and drawings.\n */\n getState(): ChartState {\n return {\n symbol: this.symbol,\n timeframe: this.timeframe,\n duration: this.duration,\n series: this.series,\n showVolume: this.showVolume,\n theme: this.themeName,\n indicators: this.activeIndicators.map((s) => ({\n shortName: s.shortName,\n params: { ...s.currentParams },\n visible: s.visible,\n })),\n drawings: this.drawingManager.getDrawingsSnapshot(),\n positionRenderStyle: this.positionRenderStyle,\n tradeDisplayFilter: this.tradeDisplayFilter,\n canvasColors: Object.keys(this.settingsCanvasColors).length > 0\n ? { ...this.settingsCanvasColors }\n : undefined,\n };\n }\n\n /**\n * Restores chart configuration from a previously captured `ChartState`.\n * Call this after construction to hydrate a chart from persisted state.\n */\n setState(state: ChartState): this {\n this.isRestoringState = true;\n try {\n // Series, volume, theme\n this.setSeries(state.series);\n this.setVolume(state.showVolume);\n this.setTheme(state.theme);\n\n // Timeframe & duration — set directly to avoid triggering a data reload\n this.timeframe = state.timeframe;\n this.duration = state.duration;\n this.topBar?.setTimeframe(state.timeframe);\n this.topBar?.setActiveDuration(state.duration);\n this.bottomBar?.setActive(state.duration);\n this.updateCountdownState();\n\n // Indicators — clear existing and re-add from state\n const existingNames = this.activeIndicators.map((s) => s.shortName);\n for (const name of existingNames) {\n this.removeIndicator(name);\n }\n for (const entry of state.indicators) {\n const schema = INDICATOR_PARAM_SCHEMAS.find((s) => s.shortName === entry.shortName);\n if (schema) {\n const indicator = schema.factory(entry.params);\n this.addIndicator(indicator);\n // Sync params and visibility to what was stored\n const idx = this.activeIndicators.findIndex(\n (s) => s.shortName === entry.shortName\n );\n if (idx !== -1) {\n const st = this.activeIndicators[idx];\n if (st) {\n st.currentParams = { ...entry.params };\n if (entry.visible === false) {\n st.visible = false;\n const restoreOverlay = this.subPaneOverlays.get(entry.shortName) ?? this.indicatorOverlay;\n restoreOverlay?.updatePillVisibility(entry.shortName, false);\n }\n const tf = (entry.params['timeframe'] as string) ?? 'Chart';\n const tfOverlay = this.subPaneOverlays.get(entry.shortName) ?? this.indicatorOverlay;\n tfOverlay?.updatePillTimeframe(entry.shortName, tf);\n }\n }\n }\n }\n\n // Drawings\n this.drawingManager.loadDrawings(state.drawings);\n\n // Settings dialog state\n if (state.positionRenderStyle) {\n this.positionRenderStyleOverride = state.positionRenderStyle;\n this.positionRenderStyle = state.positionRenderStyle;\n }\n if (state.tradeDisplayFilter) {\n this.tradeDisplayFilter = state.tradeDisplayFilter;\n }\n if (state.canvasColors) {\n this.settingsCanvasColors = state.canvasColors;\n }\n } finally {\n this.isRestoringState = false;\n }\n\n this.scheduleRender();\n return this;\n }\n\n /**\n * Resets all chart settings that are captured by `getState()` back to their\n * defaults (candlestick / dark / 1D / 1Y / volume on / no indicators / no drawings)\n * and emits a `stateChange` event so consumers can persist the cleared state.\n */\n resetChartSettings(): this {\n this.setState({\n symbol: this.symbol,\n series: 'candlestick',\n theme: 'dark',\n timeframe: '1D',\n duration: undefined,\n showVolume: true,\n indicators: [],\n drawings: [],\n });\n this.positionRenderStyleOverride = null;\n localStorage.removeItem(this.RENDER_STYLE_LS_KEY);\n this.recomputeRenderStyle();\n this.settingsCanvasColors = {};\n this.setTheme('dark');\n this.emitStateChange();\n return this;\n }\n\n setSymbol(symbol: string): this {\n this.symbol = symbol;\n if (this.siSymbolSpan) {\n this.siSymbolSpan.textContent = symbol;\n this.siSymbolSpan.style.display = symbol ? 'inline' : 'none';\n }\n this.isinPickerModal?.setCurrentSymbol(symbol);\n // Reset tick-activity indicator on symbol change\n if (this.tickActivityTimer !== null) {\n clearTimeout(this.tickActivityTimer);\n this.tickActivityTimer = null;\n }\n if (this.siStreamDot)\n this.siStreamDot.style.background = this.theme.ui.stream[this.streamStatus];\n return this;\n }\n\n /**\n * Update the list of symbols available in the ISIN picker modal.\n * Has no effect if the chart was not initialised with `isins` + `onIsinSelect`.\n */\n setIsins(isins: string[]): this {\n this.isins = isins;\n this.isinPickerModal?.setIsins(isins);\n return this;\n }\n\n private renderSymbolInfoOHLC(bar: OHLCVBar | null): void {\n if (!this.siOHLCSpan) return;\n if (!bar) {\n this.siOHLCSpan.innerHTML = '';\n return;\n }\n const up = bar.close >= bar.open;\n const color = up ? this.theme.candle.up : this.theme.candle.down;\n const fmt = (n: number) => n.toFixed(this.dataStore.getPricePrecision());\n const fmtVol = (v: number) =>\n v >= 1_000_000\n ? (v / 1_000_000).toFixed(2) + 'M'\n : v >= 1_000\n ? (v / 1_000).toFixed(1) + 'K'\n : v.toFixed(0);\n const ol = this.labels.ohlc;\n const fields: [string, string, string][] = [\n [ol.open, fmt(bar.open), this.theme.axisText],\n [ol.high, fmt(bar.high), this.theme.axisText],\n [ol.low, fmt(bar.low), this.theme.axisText],\n [ol.close, fmt(bar.close), color],\n ...(bar.volume != null && bar.volume !== 0\n ? [[ol.volume, fmtVol(bar.volume), this.theme.axisText] as [string, string, string]]\n : []),\n ];\n this.siOHLCSpan.innerHTML = '';\n for (const [lbl, val, clr] of fields) {\n const span = document.createElement('span');\n span.style.marginRight = '8px';\n const key = document.createElement('span');\n key.textContent = lbl + '\\u00A0';\n key.style.color = this.theme.axisText;\n key.style.opacity = '0.6';\n const num = document.createElement('span');\n num.textContent = val;\n num.style.color = clr;\n span.append(key, num);\n this.siOHLCSpan.appendChild(span);\n }\n }\n\n setMinLots(lots: number): this {\n this.tradePopover?.setLots(lots);\n return this;\n }\n\n setDrawingTool(tool: DrawingToolType | null): this {\n this.drawingManager.setActiveTool(tool);\n this.leftBar?.setActiveTool(tool);\n this.drawCanvas.style.cursor = tool ? 'crosshair' : 'default';\n this.scheduleRender();\n return this;\n }\n\n undoDrawing(): this {\n this.drawingManager.undo();\n this.scheduleRender();\n return this;\n }\n\n redoDrawing(): this {\n this.drawingManager.redo();\n this.scheduleRender();\n return this;\n }\n\n hideAllDrawings(): this {\n this.drawingManager.hideAll();\n this.scheduleRender();\n return this;\n }\n\n showAllDrawings(): this {\n this.drawingManager.showAll();\n this.scheduleRender();\n return this;\n }\n\n lockAllDrawings(): this {\n this.drawingManager.lockAll();\n this.scheduleRender();\n return this;\n }\n\n unlockAllDrawings(): this {\n this.drawingManager.unlockAll();\n this.scheduleRender();\n return this;\n }\n\n deleteSelectedDrawing(): this {\n this.drawingManager.deleteSelected();\n this.hideMobileDrawingFlyout();\n this.scheduleRender();\n return this;\n }\n\n clearAllDrawings(): this {\n this.drawingManager.clearAll();\n this.scheduleRender();\n return this;\n }\n\n getActiveTool(): DrawingToolType | null {\n return this.drawingManager.getActiveTool();\n }\n\n /** Returns a copy of all current drawings as live IDrawing objects. */\n getDrawings() {\n return this.drawingManager.getDrawings();\n }\n\n connectStream(adapter: IWebSocketAdapter): this {\n this.streamAdapter = adapter;\n adapter.onTick((tick) => this.onTick(tick));\n adapter.onStatus((status) => {\n this.streamStatus = status;\n if (this.siStreamDot) {\n this.siStreamDot.style.background = this.theme.ui.stream[status];\n this.siStreamDot.title = `Stream ${status}`;\n }\n this.emitter.emit('streamStatus', { status });\n });\n adapter.connect();\n return this;\n }\n\n disconnectStream(): this {\n this.streamAdapter?.disconnect();\n this.streamAdapter = null;\n return this;\n }\n\n /** Push a live bid/ask tick directly — no adapter needed.\n * Pass `T` from your feed as the server timestamp (ISO string or Unix ms)\n * to avoid system clock skew causing premature candle formation. */\n pushTick(prices: { B: number; A: number; T?: string | number }): this {\n const time =\n prices.T != null\n ? typeof prices.T === 'string'\n ? new Date(prices.T).getTime()\n : prices.T\n : Date.now();\n this.onTick({ time, bid: prices.B, ask: prices.A, volume: 0 });\n return this;\n }\n\n // ── Trade / Position level API ────────────────────────────────────────────\n\n /**\n * Replace all levels of a given type and trigger a re-render.\n * Pass an empty array to clear all levels of that type.\n *\n * @param data Array of your domain objects (orders, positions, etc.)\n * @param labelKey Key whose value is shown as the level label\n * @param priceKey Key whose value is the entry/order price\n * @param type `'trade'` → solid line, no PnL; `'position'` → dashed line, optional PnL\n * @param pnlKey (positions only) Key whose numeric value determines PnL badge color\n * @param pnlTextKey (positions only) Key whose pre-formatted string is rendered verbatim in the box\n */\n setLevels<T extends Record<string, unknown>>(\n data: T[],\n labelKey: keyof T,\n priceKey: keyof T,\n type: TradeLevelType,\n pnlKey?: keyof T,\n pnlTextKey?: keyof T\n ): this {\n const newLevels: AnyLevel[] = data.map((d) => {\n if (type === 'position') {\n const level: PositionLevel = {\n label: String(d[labelKey]),\n price: Number(d[priceKey]),\n type: 'position',\n data: d,\n };\n if (d['text'] !== undefined) {\n level.text = String(d['text']);\n }\n if (pnlKey !== undefined && d[pnlKey] !== undefined) {\n level.pnl = Number(d[pnlKey]);\n }\n if (pnlTextKey !== undefined && d[pnlTextKey] !== undefined) {\n level.pnlText = String(d[pnlTextKey]);\n }\n if (d['side'] !== undefined) level.side = d['side'] as 'buy' | 'sell';\n if (d['stopLossPrice'] !== undefined)\n level.stopLossPrice = Number(d['stopLossPrice']);\n if (d['takeProfitPrice'] !== undefined)\n level.takeProfitPrice = Number(d['takeProfitPrice']);\n if (d['entryPriceEditable']) level.entryPriceEditable = true;\n if (d['orderType'] !== undefined)\n level.orderType = d['orderType'] as 'limit' | 'stop';\n if (d['lots'] !== undefined) level.lots = Number(d['lots']);\n return level;\n }\n if (type === 'pending') {\n const level: PendingOrderLevel = {\n label: String(d[labelKey]),\n price: Number(d[priceKey]),\n type: 'pending',\n side: (d['side'] as 'buy' | 'sell') ?? 'buy',\n orderType: (d['orderType'] as 'limit' | 'stop') ?? 'limit',\n data: d,\n };\n if (d['text'] !== undefined) level.text = String(d['text']);\n if (d['lots'] !== undefined) level.lots = Number(d['lots']);\n if (d['stopLossPrice'] !== undefined)\n level.stopLossPrice = Number(d['stopLossPrice']);\n if (d['takeProfitPrice'] !== undefined)\n level.takeProfitPrice = Number(d['takeProfitPrice']);\n if (d['ToClose'] !== undefined) level.ToClose = String(d['ToClose']);\n return level;\n }\n return {\n label: String(d[labelKey]),\n price: Number(d[priceKey]),\n type: 'trade' as const,\n text: d['text'] !== undefined ? String(d['text']) : undefined,\n data: d,\n };\n });\n\n this.levels = [...this.levels.filter((l) => l.type !== type), ...newLevels];\n this.recomputeRenderStyle();\n this.renderTradeLayer();\n return this;\n }\n\n /**\n * Remove a single level by its label (derived from `labelKey` at `setLevels` time).\n * No-op if no level with that label exists.\n */\n removeLevelByLabel(label: string): this {\n this.levels = this.levels.filter((l) => l.label !== label);\n this.renderTradeLayer();\n return this;\n }\n\n /**\n * Show a draft pending order preview line on the chart.\n * Typically called from an external order panel when the user selects a limit/stop order type.\n * Clears any existing draft first. The draft line is draggable; price changes emit `tradeLevelDrag`.\n * When confirmed from the chart, `onOrderSubmit` is called and `tradeLevelConfirmed` is emitted.\n */\n showDraftOrder(price: number, side: 'buy' | 'sell', orderType: 'limit' | 'stop'): this {\n this.clearDraftOrder();\n this.createDraftOrder(side, price, orderType);\n return this;\n }\n\n /**\n * Show a draft market order preview on the chart at the given price.\n * Unlike limit/stop drafts, the main line is informational (not draggable),\n * no qty overlay is shown, and no confirm/cancel buttons appear.\n * SL/TP brackets can still be attached via updateDraftOrderBracket.\n */\n showMarketDraft(price: number, side: 'buy' | 'sell'): this {\n this.clearDraftOrder();\n const label = `__draft_${Date.now()}`;\n const draftLevel: PendingOrderLevel = {\n type: 'pending',\n label,\n side,\n price,\n orderType: 'market',\n data: { _isDraft: true },\n };\n this.levels = [...this.levels, draftLevel];\n this.draftOrderLabel = label;\n this.renderTradeLayer();\n return this;\n }\n\n /**\n * Remove the current draft order preview line without emitting any events.\n * Call when the order panel closes or the user switches to market order type.\n */\n clearDraftOrder(): this {\n this.removeDraftOrder();\n return this;\n }\n\n /**\n * Programmatically set the quantity on the active draft order's qty input.\n * No-op when no draft order is currently shown.\n * Use this to sync an external order panel's qty field to the chart.\n */\n setDraftOrderLots(lots: number): this {\n this.draftOrderQtyInput?.setValue(lots);\n return this;\n }\n\n /**\n * Update the stop-loss or take-profit bracket price on any existing level by label.\n * Pass `null` to remove the bracket. No-op if no level with that label exists.\n * Use this when an external panel changes SL/TP for an open position or pending order.\n */\n updateLevelBracket(label: string, type: 'sl' | 'tp', price: number | null): this {\n this.levels = this.levels.map((l) => {\n if (l.label !== label) return l;\n const level = l as PositionLevel | PendingOrderLevel;\n return type === 'sl'\n ? { ...level, stopLossPrice: price ?? undefined }\n : { ...level, takeProfitPrice: price ?? undefined };\n });\n this.renderTradeLayer();\n return this;\n }\n\n /**\n * Move an existing level's entry price line to a new price and re-render.\n * Used when an external panel updates the entry price for an open position or pending order.\n * No-op if no level with that label exists.\n */\n updateLevelMainPrice(label: string, price: number): this {\n const level = this.levels.find((l) => l.label === label);\n if (level) {\n level.price = price;\n this.renderTradeLayer();\n }\n return this;\n }\n\n /**\n * Update the stop-loss or take-profit price on the current draft order.\n * Pass `null` to remove the bracket. No-op if no draft order is active.\n */\n updateDraftOrderBracket(type: 'sl' | 'tp', price: number | null): this {\n if (!this.draftOrderLabel) return this;\n this.levels = this.levels.map((l) => {\n if (l.label !== this.draftOrderLabel) return l;\n const level = l as PendingOrderLevel;\n return type === 'sl'\n ? { ...level, stopLossPrice: price ?? undefined }\n : { ...level, takeProfitPrice: price ?? undefined };\n });\n this.scheduleRender();\n return this;\n }\n\n /**\n * Update the entry price of the active draft order in-place without recreating it.\n * Unlike `showDraftOrder`, this does NOT call `clearDraftOrder` + `createDraftOrder`,\n * so the qty overlay is repositioned but never re-focused.\n * Returns `true` if a draft existed and was updated, `false` if no draft is active.\n */\n updateDraftOrderPrice(price: number): boolean {\n if (!this.draftOrderLabel) return false;\n\n this.levels = this.levels.map((l) => {\n if (l.label !== this.draftOrderLabel) return l;\n return { ...(l as PendingOrderLevel), price };\n });\n\n const changes = this.pendingLevelDrags.get(this.draftOrderLabel);\n if (changes) {\n const main = changes.find((c) => c.field === 'main');\n if (main) main.newPrice = price;\n }\n\n const { priceH } = this.getChartLayout();\n const yPx = this.scaleManager.yToPixel(\n price,\n this.getScaledPriceRange(this.viewport),\n priceH\n );\n this.draftOrderQtyInput?.setY(yPx, priceH);\n\n this.renderTradeLayer();\n return true;\n }\n\n /**\n * Cancel the pending edit state of a level without firing `tradeLevelEdit`.\n * Use when the external order panel has already handled the confirmation,\n * preventing the chart from sending a duplicate server request.\n */\n cancelLevelEdit(label: string): this {\n this.pendingLevelDrags.delete(label);\n if (this.selectedTradeLabel === label) this.selectedTradeLabel = null;\n this.renderTradeLayer();\n return this;\n }\n\n /**\n * Programmatically select (activate) a trade level by its label.\n * Pass `null` to deselect the currently active level.\n * Useful when an external panel (e.g. positions table) opens an edit form\n * and the chart should highlight the corresponding level.\n */\n selectLevel(label: string | null): this {\n this.selectedTradeLabel = label;\n this.renderTradeLayer();\n return this;\n }\n\n destroy(): void {\n this.panHandler.destroy();\n this.zoomHandler.destroy();\n this.resizeObserver.disconnect();\n this.indicatorOverlay?.destroy();\n for (const overlay of this.subPaneOverlays.values()) overlay.destroy();\n this.subPaneOverlays.clear();\n this.indicatorSettingsDialog?.destroy();\n this.chartSettingsDialog?.destroy();\n this.isinPickerModal?.destroy();\n this.tradePopover?.destroy();\n this.draftOrderQtyInput?.destroy();\n this.leftBar?.destroy();\n this.drawCanvas.removeEventListener('mousemove', this.onMouseMove);\n this.drawCanvas.removeEventListener('mouseleave', this.onMouseLeave);\n this.drawCanvas.removeEventListener('mousedown', this.onCanvasClick);\n this.drawCanvas.removeEventListener('dblclick', this.onDoubleClick);\n window.removeEventListener('mouseup', this.onMouseUp);\n this.drawCanvas.removeEventListener('touchstart', this.onDrawingTouchStart);\n this.drawCanvas.removeEventListener('touchmove', this.onDrawingTouchMove);\n this.drawCanvas.removeEventListener('touchend', this.onDrawingTouchEnd);\n document.removeEventListener('keydown', this.onKeyDown);\n this.streamAdapter?.disconnect();\n if (this.rafId !== null) cancelAnimationFrame(this.rafId);\n if (this.scrollAnimId !== null) cancelAnimationFrame(this.scrollAnimId);\n this.stopCountdownLoop();\n this.resetViewBtn?.remove();\n this.textInputEl?.remove();\n this._mobileDrawingFlyout?.remove();\n this.wrapper.remove();\n }\n\n // ── Mobile drawing flyout ─────────────────────────────────────────────────\n\n private createMobileDrawingFlyout(): HTMLDivElement {\n const flyout = document.createElement('div');\n Object.assign(flyout.style, {\n position: 'fixed',\n display: 'none',\n alignItems: 'center',\n gap: '2px',\n zIndex: '10000',\n background: this.theme.background,\n border: `1px solid ${this.theme.axisBorder}`,\n borderRadius: '8px',\n padding: '4px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.45)',\n pointerEvents: 'auto',\n });\n\n const mkBtn = (icon: string, label: string, danger: boolean): HTMLButtonElement => {\n const btn = document.createElement('button');\n btn.title = label;\n btn.innerHTML = icon;\n Object.assign(btn.style, {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '34px',\n height: '34px',\n padding: '0',\n border: 'none',\n borderRadius: '6px',\n background: 'transparent',\n color: danger ? this.theme.candle.down : this.theme.axisText,\n cursor: 'pointer',\n flexShrink: '0',\n });\n btn.addEventListener('pointerenter', () => {\n btn.style.background = danger\n ? `${this.theme.candle.down}22`\n : this.theme.axisBorder;\n });\n btn.addEventListener('pointerleave', () => {\n btn.style.background = 'transparent';\n });\n return btn;\n };\n\n const deleteBtn = mkBtn(ICON_TRASH, 'Delete drawing', true);\n deleteBtn.addEventListener('pointerdown', (e) => {\n e.stopPropagation();\n this.deleteSelectedDrawing();\n this.hideMobileDrawingFlyout();\n });\n\n const closeBtn = mkBtn(ICON_CLOSE, 'Deselect', false);\n closeBtn.addEventListener('pointerdown', (e) => {\n e.stopPropagation();\n this.drawingManager.selectDrawing(null);\n this.hideMobileDrawingFlyout();\n this.scheduleRender();\n });\n\n flyout.appendChild(deleteBtn);\n flyout.appendChild(closeBtn);\n this.wrapper.appendChild(flyout);\n return flyout;\n }\n\n private showMobileDrawingFlyout(clientX: number, clientY: number): void {\n if (!isMobileDevice()) return;\n if (!this._mobileDrawingFlyout) {\n this._mobileDrawingFlyout = this.createMobileDrawingFlyout();\n }\n const flyout = this._mobileDrawingFlyout;\n flyout.style.display = 'flex';\n\n // Position above the touch point; clamp to viewport bounds\n requestAnimationFrame(() => {\n const fw = flyout.offsetWidth || 78;\n const fh = flyout.offsetHeight || 42;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const gap = 12;\n const left = Math.min(Math.max(clientX - fw / 2, 8), vw - fw - 8);\n const top = Math.min(Math.max(clientY - fh - gap, 8), vh - fh - 8);\n flyout.style.left = `${left}px`;\n flyout.style.top = `${top}px`;\n });\n }\n\n private hideMobileDrawingFlyout(): void {\n if (this._mobileDrawingFlyout) {\n this._mobileDrawingFlyout.style.display = 'none';\n }\n }\n\n private applyMobileDrawingFlyoutTheme(): void {\n if (!this._mobileDrawingFlyout) return;\n const f = this._mobileDrawingFlyout;\n f.style.background = this.theme.background;\n f.style.border = `1px solid ${this.theme.axisBorder}`;\n const btns = Array.from(f.querySelectorAll<HTMLButtonElement>('button'));\n const [deleteBtn, closeBtn] = btns;\n if (deleteBtn) deleteBtn.style.color = this.theme.candle.down;\n if (closeBtn) closeBtn.style.color = this.theme.axisText;\n }\n\n // ── Rendering ─────────────────────────────────────────────────────────────\n\n private scheduleRender(): void {\n if (this.rafId !== null) return;\n this.rafId = requestAnimationFrame(() => {\n this.rafId = null;\n this.render();\n this.renderTradeLayer();\n });\n }\n\n private startCountdownLoop(): void {\n if (this.countdownRafId !== null) return;\n let lastTick = 0;\n const loop = (now: number) => {\n if (!this.countdownActive) { this.countdownRafId = null; return; }\n if (now - lastTick >= 1000) { lastTick = now; this.scheduleRender(); }\n this.countdownRafId = requestAnimationFrame(loop);\n };\n this.countdownRafId = requestAnimationFrame(loop);\n }\n\n private stopCountdownLoop(): void {\n this.countdownActive = false;\n if (this.countdownRafId !== null) {\n cancelAnimationFrame(this.countdownRafId);\n this.countdownRafId = null;\n }\n }\n\n private updateCountdownState(): void {\n const INTRADAY: Timeframe[] = ['1m', '5m', '15m', '30m', '1h', '4h'];\n const allowed = this.candleCountdownTimeframes === 'all'\n ? true\n : (this.candleCountdownTimeframes ?? INTRADAY).includes(this.timeframe as Timeframe);\n const should = this.showCandleCountdown && allowed && this.dataStore.length > 0;\n if (should && !this.countdownActive) {\n this.countdownActive = true;\n this.startCountdownLoop();\n } else if (!should && this.countdownActive) {\n this.stopCountdownLoop();\n }\n }\n\n private openChartSettings(): void {\n if (!this.chartSettingsDialog) {\n this.chartSettingsDialog = new ChartSettingsDialog(\n this.theme,\n {\n tradeDisplayFilter: this.tradeDisplayFilter,\n positionRenderStyle: this.positionRenderStyle,\n theme: this.themeName,\n },\n this.labels.dialogs\n );\n this.getFloatingRoot().appendChild(this.chartSettingsDialog.el);\n }\n this.chartSettingsDialog.show(\n {\n tradeDisplayFilter: this.tradeDisplayFilter,\n positionRenderStyle: this.positionRenderStyle,\n theme: this.themeName,\n canvasColors: { ...this.settingsCanvasColors },\n },\n (settings: ChartSettings) => {\n this.tradeDisplayFilter = settings.tradeDisplayFilter;\n this.positionRenderStyleOverride = settings.positionRenderStyle;\n localStorage.setItem(this.RENDER_STYLE_LS_KEY, settings.positionRenderStyle);\n this.positionRenderStyle = settings.positionRenderStyle;\n if (settings.canvasColors) {\n this.settingsCanvasColors = settings.canvasColors;\n }\n this.setTheme(settings.theme);\n this.renderTradeLayer();\n this.emitStateChange();\n },\n () => {\n this.resetChartSettings();\n }\n );\n }\n\n /** Returns the element floating UI should be parented to — the fullscreen element when active, otherwise document.body. */\n private getFloatingRoot(): HTMLElement {\n return (document.fullscreenElement as HTMLElement | null) ?? document.body;\n }\n\n /**\n * Re-parents all floating elements (flyouts, modals) to the correct root.\n * Called on fullscreenchange so they remain visible inside the fullscreen context.\n */\n private reparentFloatingElements(): void {\n const root = this.getFloatingRoot();\n this.topBar?.reparentFlyout(root);\n this.leftBar?.reparentFlyout(root);\n const modals: (HTMLElement | undefined)[] = [\n this.isinPickerModal?.el,\n this.indicatorSettingsDialog?.el,\n this.chartSettingsDialog?.el,\n ];\n for (const el of modals) {\n if (el && el.parentElement !== root) root.appendChild(el);\n }\n }\n\n private toggleDrawingTools(): void {\n this.leftBarVisible = !this.leftBarVisible;\n this.leftBar?.setVisible(this.leftBarVisible);\n this.topBar?.setDrawingsBtnActive(this.leftBarVisible);\n }\n\n private _applyCssFullscreen(enter: boolean): void {\n this._isCssFullscreen = enter;\n if (enter) {\n Object.assign(this.wrapper.style, {\n position: 'fixed',\n inset: '0',\n width: '100vw',\n height: '100vh',\n zIndex: '9999',\n });\n } else {\n Object.assign(this.wrapper.style, {\n position: '',\n inset: '',\n width: '',\n height: '',\n zIndex: '',\n });\n }\n this.topBar?.setFullscreen(enter);\n this.reparentFloatingElements();\n requestAnimationFrame(() => this.onResize());\n }\n\n private toggleFullscreen(): void {\n const isNativeFs = !!document.fullscreenElement;\n\n if (!isNativeFs && !this._isCssFullscreen) {\n // Enter fullscreen — try native first, fall back to CSS\n if (this.wrapper.requestFullscreen) {\n this.wrapper.requestFullscreen().catch(() => {\n this._applyCssFullscreen(true);\n });\n // icon update handled by fullscreenchange listener for native path\n } else {\n // iOS Safari and environments with no Fullscreen API\n this._applyCssFullscreen(true);\n }\n } else if (isNativeFs) {\n document.exitFullscreen().catch(() => {});\n // fullscreenchange listener handles icon + CSS state reset\n } else {\n // Exit CSS fullscreen\n this._applyCssFullscreen(false);\n }\n }\n\n private recomputeRenderStyle(): void {\n if (this.positionRenderStyleOverride !== null) {\n this.positionRenderStyle = this.positionRenderStyleOverride;\n return;\n }\n const activeCount = this.levels.filter(\n (l) => l.type === 'position' || l.type === 'pending'\n ).length;\n this.positionRenderStyle =\n activeCount > this.tradesThresholdForHorizontalLine ? 'dot' : 'line';\n }\n\n private renderTradeLayer(): void {\n const dpr = window.devicePixelRatio || 1;\n const { tradeCtx: ctx, tradeCanvas: canvas, theme, viewport } = this;\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n if (this.levels.length === 0 || this.dataStore.length === 0) {\n this.tradeLevelHitAreas = [];\n this.tradeLevelEditAreas = [];\n this.tradeHoverAreas = [];\n this.tradeAddBracketAreas = [];\n return;\n }\n\n const { chartW, priceH } = this.getChartLayout();\n const priceRange = this.getScaledPriceRange(viewport);\n\n // Keep draft order qty input Y in sync with the dragged price\n if (this.draftOrderLabel && this.draftOrderQtyInput) {\n const draftChanges = this.pendingLevelDrags.get(this.draftOrderLabel);\n const mainEntry = draftChanges?.find((c) => c.field === 'main');\n const draftLevel = this.levels.find((l) => l.label === this.draftOrderLabel) as\n | PendingOrderLevel\n | undefined;\n const currentPrice = mainEntry?.newPrice ?? draftLevel?.price;\n if (currentPrice !== undefined) {\n this.draftOrderQtyInput.setY(\n this.scaleManager.yToPixel(currentPrice, priceRange, priceH),\n priceH\n );\n }\n }\n\n // Separate bracket orders (ToClose set) from main levels, then inject\n // stopLossPrice / takeProfitPrice onto their parent levels.\n const bracketOrders = this.levels.filter(\n (l) => l.type === 'pending' && (l as PendingOrderLevel).ToClose != null\n ) as PendingOrderLevel[];\n\n const processedLevels = this.levels\n .filter((l) => !(l.type === 'pending' && (l as PendingOrderLevel).ToClose != null))\n .map((l) => {\n const draftChanges = this.pendingLevelDrags.get(l.label) ?? [];\n const slDraft = draftChanges.find((c) => c.field === 'stopLoss')?.newPrice;\n const tpDraft = draftChanges.find((c) => c.field === 'takeProfit')?.newPrice;\n const mainDraft = draftChanges.find((c) => c.field === 'main')?.newPrice;\n\n const linked = bracketOrders.filter((b) => b.ToClose === l.label);\n if (\n linked.length === 0 &&\n slDraft === undefined &&\n tpDraft === undefined &&\n mainDraft === undefined\n )\n return l;\n\n type CloneWithBracketLabels = (PositionLevel | PendingOrderLevel) & {\n _slOrderLabel?: string;\n _tpOrderLabel?: string;\n };\n const clone = { ...l } as CloneWithBracketLabels;\n\n // Apply pending draft prices for all fields\n if (mainDraft !== undefined) clone.price = mainDraft;\n if (slDraft !== undefined) (clone as PositionLevel).stopLossPrice = slDraft;\n if (tpDraft !== undefined) (clone as PositionLevel).takeProfitPrice = tpDraft;\n\n // Inject SL/TP from ToClose bracket orders.\n // Priority: pending drag > panel override (clone.stopLossPrice set via updateLevelBracket) > bracket order price\n if (linked.length > 0) {\n const parentSide = (l as PositionLevel | PendingOrderLevel).side ?? 'buy';\n for (const b of linked) {\n const isSL = parentSide === 'buy' ? b.price < l.price : b.price > l.price;\n if (isSL) {\n clone.stopLossPrice = slDraft ?? clone.stopLossPrice ?? b.price;\n clone._slOrderLabel = b.label;\n } else {\n clone.takeProfitPrice = tpDraft ?? clone.takeProfitPrice ?? b.price;\n clone._tpOrderLabel = b.label;\n }\n }\n }\n\n return clone;\n });\n\n ctx.save();\n ctx.scale(dpr, dpr);\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, 0, chartW, priceH);\n ctx.clip();\n\n // When a level is selected, show only that level (hide all others)\n // Otherwise apply the display filter setting\n const isEntryOrder = (l: AnyLevel) =>\n l.type === 'position' && !!(l as PositionLevel).entryPriceEditable;\n\n const filteredLevels =\n this.selectedTradeLabel !== null\n ? processedLevels.filter((l) => l.label === this.selectedTradeLabel)\n : this.tradeDisplayFilter === 'none'\n ? []\n : this.tradeDisplayFilter === 'positions'\n ? // Exclude entry-order positions (ES/EL) — they behave as pending orders\n processedLevels.filter((l) => l.type === 'position' && !isEntryOrder(l))\n : this.tradeDisplayFilter === 'orders'\n ? // Include true pending orders AND entry-order positions (ES/EL)\n processedLevels.filter((l) => l.type === 'pending' || isEntryOrder(l))\n : processedLevels;\n\n const result = renderTradeLevels(\n ctx,\n filteredLevels,\n this.scaleManager,\n priceRange,\n theme,\n chartW,\n priceH,\n this.dataStore.getPricePrecision(),\n this.hoveredTradeLabel,\n this.tradeDragHandler?.dragLabel ?? null,\n this.tradeDragNewPrice,\n this.selectedTradeLabel,\n new Set(this.pendingLevelDrags.keys()),\n this.positionRenderStyle\n );\n\n ctx.restore(); // end price-pane clip\n ctx.restore();\n\n this.tradeLevelHitAreas = result.hitAreas;\n this.tradeLevelEditAreas = result.editAreas;\n this.tradeHoverAreas = result.hoverAreas;\n this.tradeLevelDragAreas = result.dragAreas;\n this.tradeLevelConfirmAreas = result.confirmAreas;\n this.tradeAddBracketAreas = result.addBracketAreas;\n }\n\n // ── Inline pending-change confirmation ────────────────────────────────────\n\n /** Returns the effective entry price for a level, preferring any staged main drag. */\n private _effectiveEntryPrice(label: string, fallback: number): number {\n const changes = this.pendingLevelDrags.get(label);\n return changes?.find((c) => c.field === 'main')?.newPrice ?? fallback;\n }\n\n private storePendingChange(\n result: {\n label: string;\n type: TradeLevelType;\n newPrice: number;\n data: unknown;\n bracketType?: 'stopLoss' | 'takeProfit';\n },\n oldPrice: number,\n bracketOrderLabel?: string\n ): void {\n // Bracket SL/TP validation\n if (result.bracketType) {\n const level = this.levels.find((l) => l.label === result.label) as\n | {\n side?: 'buy' | 'sell';\n price: number;\n entryPriceEditable?: boolean;\n data?: unknown;\n }\n | undefined;\n const parentSide = level?.side ?? 'buy';\n const parentPrice = this._effectiveEntryPrice(result.label, level?.price ?? oldPrice);\n const isEntryOrder = level?.entryPriceEditable === true;\n const isDraft = (level?.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n const all = this.dataStore.all;\n const marketPrice = isEntryOrder || isDraft ? 0 : (all[all.length - 1]?.close ?? 0);\n if (\n !TradeDragHandler.isBracketPriceValid(\n result.newPrice,\n result.bracketType,\n parentPrice,\n parentSide,\n marketPrice\n )\n ) {\n this.tradeDragNewPrice = null;\n this.renderTradeLayer();\n return;\n }\n }\n\n // Main entry price market-side validation (pending orders)\n if (!result.bracketType) {\n const pendingLvl = this.levels.find((l) => l.label === result.label) as\n | { side?: 'buy' | 'sell'; orderType?: 'limit' | 'stop'; data?: unknown }\n | undefined;\n if (pendingLvl?.orderType && pendingLvl?.side) {\n const allBars = this.dataStore.all;\n const mktPrice = allBars[allBars.length - 1]?.close ?? 0;\n if (mktPrice > 0) {\n const mustBeBelowMarket =\n (pendingLvl.side === 'buy' && pendingLvl.orderType === 'limit') ||\n (pendingLvl.side === 'sell' && pendingLvl.orderType === 'stop');\n const valid = mustBeBelowMarket\n ? result.newPrice < mktPrice\n : result.newPrice > mktPrice;\n if (!valid) {\n this.tradeDragNewPrice = null;\n this.renderTradeLayer();\n return;\n }\n }\n }\n }\n\n // Accumulate in the pending map (replace same-field entry if re-dragged)\n const field: 'main' | 'stopLoss' | 'takeProfit' = result.bracketType ?? 'main';\n const isNew = this._isBracketNew;\n this._isBracketNew = false;\n\n // Market drafts auto-commit bracket drags immediately — no confirm button\n const draggedLevel = this.levels.find((l) => l.label === result.label) as\n | PendingOrderLevel\n | undefined;\n const isMarketDraft =\n draggedLevel?.orderType === 'market' &&\n (draggedLevel?.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n if (isMarketDraft) {\n if (field !== 'main') {\n this.updateDraftOrderBracket(field === 'stopLoss' ? 'sl' : 'tp', result.newPrice);\n this.emitter.emit('tradeLevelDrag', {\n label: result.label,\n newPrice: result.newPrice,\n data: draggedLevel?.data,\n bracketType: field as 'stopLoss' | 'takeProfit',\n });\n }\n this.tradeDragNewPrice = null;\n this.renderTradeLayer();\n return;\n }\n\n const existing = this.pendingLevelDrags.get(result.label) ?? [];\n const filtered = existing.filter((c) => c.field !== field);\n filtered.push({ field, newPrice: result.newPrice, oldPrice, isNew, bracketOrderLabel });\n this.pendingLevelDrags.set(result.label, filtered);\n\n this.tradeDragNewPrice = null;\n this.renderTradeLayer();\n }\n\n private createDraftOrder(\n side: 'buy' | 'sell',\n price: number,\n orderType: 'limit' | 'stop'\n ): void {\n if (this.draftOrderLabel) return; // one draft at a time\n const label = `__draft_${Date.now()}`;\n const draftLevel: PendingOrderLevel = {\n type: 'pending',\n label,\n side,\n price,\n orderType,\n data: { _isDraft: true },\n };\n this.levels = [...this.levels, draftLevel];\n this.draftOrderLabel = label;\n this.selectedTradeLabel = label;\n // Seed pendingLevelDrags so confirm/cancel buttons appear immediately\n this.pendingLevelDrags.set(label, [{ field: 'main', newPrice: price, oldPrice: price }]);\n const { priceH } = this.getChartLayout();\n const yPx = this.scaleManager.yToPixel(\n price,\n this.getScaledPriceRange(this.viewport),\n priceH\n );\n this.draftOrderQtyInput?.show(yPx, this._minLots, this.theme, priceH);\n this.renderTradeLayer();\n }\n\n private removeDraftOrder(): void {\n if (!this.draftOrderLabel) return;\n this.levels = this.levels.filter((l) => l.label !== this.draftOrderLabel);\n this.pendingLevelDrags.delete(this.draftOrderLabel);\n this.selectedTradeLabel = null;\n this.draftOrderLabel = null;\n this.draftOrderQtyInput?.hide();\n this.renderTradeLayer();\n }\n\n private applyPendingChanges(label: string): void {\n const changes = this.pendingLevelDrags.get(label);\n if (!changes) return;\n const level = this.levels.find((l) => l.label === label);\n if (!level) return;\n\n // Intercept draft orders — call onOrderSubmit instead of emitting tradeLevelEdit\n if (label === this.draftOrderLabel) {\n const mainEntry = changes.find((c) => c.field === 'main');\n const slEntry = changes.find((c) => c.field === 'stopLoss' && c.isNew);\n const tpEntry = changes.find((c) => c.field === 'takeProfit' && c.isNew);\n const draft = level as PendingOrderLevel;\n this._onOrderSubmit?.({\n price: mainEntry?.newPrice ?? draft.price,\n lots: this.draftOrderQtyInput?.getValue() ?? this._minLots,\n side: draft.side,\n orderType: draft.orderType,\n ...(slEntry ? { stopLoss: slEntry.newPrice } : {}),\n ...(tpEntry ? { takeProfit: tpEntry.newPrice } : {}),\n });\n this.emitter.emit('tradeLevelConfirmed', { label, type: 'draft' });\n this.removeDraftOrder();\n return;\n }\n\n // Emit all changes as a single event\n this.emitter.emit('tradeLevelEdit', {\n label,\n type: level.type as TradeLevelType,\n data: level.data,\n changes: changes.map((c) => {\n type LevelWithBracketData = { stopLossData?: unknown; takeProfitData?: unknown };\n const lbd = level.data as LevelWithBracketData;\n\n // Resolve per-bracket data: inline field → ToClose order → parent fallback\n let changeData: unknown = level.data;\n if (c.field === 'stopLoss') {\n changeData = lbd.stopLossData ?? level.data;\n } else if (c.field === 'takeProfit') {\n changeData = lbd.takeProfitData ?? level.data;\n }\n if (c.bracketOrderLabel) {\n const bracketOrder = this.levels.find((l) => l.label === c.bracketOrderLabel);\n if (bracketOrder) changeData = bracketOrder.data;\n }\n\n let emitField:\n | 'MAIN'\n | 'SL'\n | 'TP'\n | 'ADD_SL'\n | 'ADD_TP'\n | 'REMOVE_SL'\n | 'REMOVE_TP';\n if (c.field === 'main') emitField = 'MAIN';\n else if (c.field === 'stopLoss')\n emitField = c.isRemoval ? 'REMOVE_SL' : c.isNew ? 'ADD_SL' : 'SL';\n else emitField = c.isRemoval ? 'REMOVE_TP' : c.isNew ? 'ADD_TP' : 'TP';\n\n return {\n field: emitField,\n newPrice: c.newPrice,\n data: changeData,\n bracketOrderLabel: c.bracketOrderLabel,\n };\n }),\n });\n\n this.emitter.emit('tradeLevelConfirmed', { label, type: level.type as TradeLevelType });\n this.pendingLevelDrags.delete(label);\n this.selectedTradeLabel = null;\n this.renderTradeLayer();\n }\n\n private revertPendingChanges(label?: string): void {\n // Intercept draft order cancellation\n if (label && label === this.draftOrderLabel) {\n this.removeDraftOrder();\n return;\n }\n // If reverting all and there's an active draft, remove it too\n if (!label && this.draftOrderLabel) {\n this.removeDraftOrder();\n }\n\n const toRevert: Array<\n [\n string,\n Array<{\n field: 'main' | 'stopLoss' | 'takeProfit';\n newPrice: number;\n oldPrice: number;\n bracketOrderLabel?: string;\n }>,\n ]\n > = label\n ? this.pendingLevelDrags.has(label)\n ? [[label, this.pendingLevelDrags.get(label) ?? []]]\n : []\n : [...this.pendingLevelDrags.entries()];\n\n for (const [lbl] of toRevert) {\n this.pendingLevelDrags.delete(lbl);\n }\n this.selectedTradeLabel = null;\n this.renderTradeLayer();\n }\n\n private render(): void {\n const { ctx, canvas, theme, viewport } = this;\n const dpr = window.devicePixelRatio || 1;\n const totalW = canvas.width;\n const totalH = canvas.height;\n\n const chartW = totalW / dpr - this.priceAxisWidth;\n\n // Sub-pane layout — includes hidden panes so they keep their reserved space\n const allSubPaneStates = this.activeIndicators.filter((s) => s.indicator.pane === 'sub');\n const subPanes = allSubPaneStates.map((s) => s.indicator);\n const subPanesH = subPanes.reduce((acc, ind) => acc + this.paneH(ind) + PANE_SEPARATOR, 0);\n\n const priceH = totalH / dpr - this.timeAxisHeight - subPanesH;\n\n ctx.clearRect(0, 0, totalW, totalH);\n ctx.fillStyle = theme.background;\n ctx.fillRect(0, 0, totalW, totalH);\n\n const bars = this.dataStore.getVisible(viewport);\n if (bars.length === 0) return;\n\n const isManualMode = this.priceScaleFactor !== 1.0 || this.pricePanOffset !== 0;\n\n if (!isManualMode) {\n // Auto-fit: lerp displayed range toward visible-bars range each frame\n this._lockedAutoFitBase = null;\n const targetRange = this.getScaledPriceRange(viewport);\n if (!this._displayedPriceRange) {\n this._displayedPriceRange = targetRange;\n } else {\n const epsilon = (targetRange.max - targetRange.min) * 0.0001;\n const dMin = targetRange.min - this._displayedPriceRange.min;\n const dMax = targetRange.max - this._displayedPriceRange.max;\n if (Math.abs(dMin) < epsilon && Math.abs(dMax) < epsilon) {\n this._displayedPriceRange = targetRange;\n } else {\n this._displayedPriceRange = {\n min: this._displayedPriceRange.min + dMin * PRICE_RANGE_LERP,\n max: this._displayedPriceRange.max + dMax * PRICE_RANGE_LERP,\n };\n this.scheduleRender();\n }\n }\n } else {\n // Manual mode: lock the auto-fit base on first entry, then apply scale/pan to it\n if (!this._lockedAutoFitBase) {\n // Capture whatever was displayed (the lerped auto-fit range, scale=1/pan=0)\n this._lockedAutoFitBase = this._displayedPriceRange ?? this.dataStore.getPriceRange(viewport);\n }\n const base = this._lockedAutoFitBase;\n const mid = (base.min + base.max) / 2 + this.pricePanOffset;\n const halfSpan = base.max !== base.min ? (base.max - base.min) / 2 : 1;\n this._displayedPriceRange = {\n min: mid - halfSpan * this.priceScaleFactor,\n max: mid + halfSpan * this.priceScaleFactor,\n };\n }\n const priceRange = this._displayedPriceRange!;\n const volRange = this.showVolume ? this.dataStore.getVolumeRange(viewport) : null;\n\n // Expose for indicators that use the canvas tag pattern\n const tagged = canvas as TaggedCanvas;\n tagged._priceRange = priceRange;\n tagged._chartWidth = chartW;\n\n ctx.save();\n ctx.scale(dpr, dpr);\n\n // ── Price pane ────────────────────────────────────────────────────────\n\n // Clip to price pane so candles/grid/volume never bleed into axes\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, 0, chartW, priceH);\n ctx.clip();\n\n renderGrid(ctx, priceRange, this.scaleManager, theme, chartW, priceH);\n\n switch (this.series) {\n case 'candlestick':\n renderCandlestick(\n ctx,\n bars,\n viewport,\n priceRange,\n this.scaleManager,\n theme,\n chartW,\n priceH\n );\n break;\n case 'hollow':\n renderHollowCandle(\n ctx,\n bars,\n viewport,\n priceRange,\n this.scaleManager,\n theme,\n chartW,\n priceH\n );\n break;\n case 'line':\n renderLine(\n ctx,\n bars,\n viewport,\n priceRange,\n this.scaleManager,\n theme,\n chartW,\n priceH,\n false\n );\n break;\n case 'area':\n renderLine(\n ctx,\n bars,\n viewport,\n priceRange,\n this.scaleManager,\n theme,\n chartW,\n priceH,\n true\n );\n break;\n case 'ohlc':\n renderOHLC(\n ctx,\n bars,\n viewport,\n priceRange,\n this.scaleManager,\n theme,\n chartW,\n priceH\n );\n break;\n case 'heikinashi':\n renderHeikinAshi(\n ctx,\n bars,\n viewport,\n priceRange,\n this.scaleManager,\n theme,\n chartW,\n priceH\n );\n break;\n case 'volumecandles':\n renderVolumeCandles(\n ctx,\n bars,\n viewport,\n priceRange,\n this.scaleManager,\n theme,\n chartW,\n priceH\n );\n break;\n case 'linemarkers':\n renderLineWithMarkers(\n ctx,\n bars,\n viewport,\n priceRange,\n this.scaleManager,\n theme,\n chartW,\n priceH\n );\n break;\n case 'step':\n renderStepLine(\n ctx,\n bars,\n viewport,\n priceRange,\n this.scaleManager,\n theme,\n chartW,\n priceH\n );\n break;\n case 'hlcarea':\n renderHLCArea(\n ctx,\n bars,\n viewport,\n priceRange,\n this.scaleManager,\n theme,\n chartW,\n priceH\n );\n break;\n case 'baseline':\n renderBaseline(\n ctx,\n bars,\n viewport,\n priceRange,\n this.scaleManager,\n theme,\n chartW,\n priceH\n );\n break;\n case 'columns':\n renderColumns(\n ctx,\n bars,\n viewport,\n priceRange,\n this.scaleManager,\n theme,\n chartW,\n priceH\n );\n break;\n case 'highlow':\n renderHighLow(\n ctx,\n bars,\n viewport,\n priceRange,\n this.scaleManager,\n theme,\n chartW,\n priceH\n );\n break;\n }\n\n // Main-pane (overlay) indicators\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, 0, chartW, priceH);\n ctx.clip();\n for (const ind of this.indicators.filter((i) => !i.pane || i.pane === 'main')) {\n const results = this.indicatorResults.get(ind.name);\n if (!results) continue;\n const visible = results.slice(\n Math.floor(viewport.startIndex),\n Math.ceil(viewport.endIndex) + 1\n );\n ind.render(ctx, visible, this.scaleManager, viewport, priceH);\n }\n ctx.restore();\n ctx.restore(); // end price-pane clip\n\n renderPriceAxis(\n ctx,\n priceRange,\n this.scaleManager,\n theme,\n chartW,\n priceH,\n this.priceAxisWidth,\n undefined,\n this.dataStore.getPricePrecision(),\n this.uiConfig.priceAxis\n );\n\n // Trade levels are rendered on the dedicated tradeCanvas layer via renderTradeLayer()\n\n // ── Bid / Ask price lines ─────────────────────────────────────────────\n\n const lastBar = this.dataStore.all[this.dataStore.all.length - 1];\n if (lastBar) {\n const precision = this.dataStore.getPricePrecision();\n const tagH = 16;\n\n const drawPriceLine = (price: number, color: string, prefix: string) => {\n const y = this.scaleManager.yToPixel(price, priceRange, priceH);\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n ctx.setLineDash([3, 3]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(chartW, y);\n ctx.stroke();\n ctx.setLineDash([]);\n\n const label = prefix + price.toFixed(precision);\n const tw = ctx.measureText(label).width;\n ctx.fillStyle = color;\n ctx.fillRect(chartW, y - tagH / 2, tw + 12, tagH);\n ctx.fillStyle = '#ffffff';\n ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n ctx.textAlign = 'left';\n ctx.fillText(label, chartW + 4, y + 4);\n ctx.restore();\n };\n\n if (this.liveBidAsk) {\n const { bid, ask } = this.liveBidAsk;\n if (this.showBidAskLines) {\n // Show full spread — both lines\n drawPriceLine(bid, theme.candle.down, '');\n drawPriceLine(ask, theme.candle.up, '');\n } else {\n // Show only the side that matches tickClosePriceSource\n const price = this.tickClosePriceSource === 'ask' ? ask : bid;\n const color =\n this.tickClosePriceSource === 'ask' ? theme.candle.up : theme.candle.down;\n drawPriceLine(price, color, '');\n }\n } else {\n // No live tick yet — show last close\n const isUp = lastBar.close >= lastBar.open;\n drawPriceLine(lastBar.close, isUp ? theme.candle.up : theme.candle.down, '');\n }\n }\n\n // ── Sub-panes (RSI, MACD, …) ──────────────────────────────────────────\n\n let subPaneY = priceH;\n for (const subState of allSubPaneStates) {\n const ind = subState.indicator;\n const paneH = this.paneH(ind);\n\n // Separator line\n ctx.fillStyle = theme.axisBorder;\n ctx.fillRect(0, subPaneY, chartW + this.priceAxisWidth, PANE_SEPARATOR);\n subPaneY += PANE_SEPARATOR;\n\n // Clip and translate to pane\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, subPaneY, chartW + this.priceAxisWidth, paneH);\n ctx.clip();\n ctx.translate(0, subPaneY);\n\n // Sub-pane background\n ctx.fillStyle = theme.background;\n ctx.fillRect(0, 0, chartW + this.priceAxisWidth, paneH);\n\n // Only render indicator content when it is visible\n const isVisible = subState.visible &&\n ((): boolean => {\n const tf = subState.currentParams['timeframe'] as string | undefined;\n return !tf || tf === 'Chart' || tf === this.timeframe;\n })();\n\n if (isVisible) {\n const results = this.indicatorResults.get(ind.name);\n if (results) {\n const visible = results.slice(\n Math.floor(viewport.startIndex),\n Math.ceil(viewport.endIndex) + 1\n );\n const baseRange = ind.getValueRange?.(visible);\n const scaleFactor = this.subPaneScaleFactors.get(ind.name) ?? 1;\n const scaledRange = baseRange ? applySubPaneScale(baseRange, scaleFactor) : undefined;\n ind.render(ctx, visible, this.scaleManager, viewport, paneH, scaledRange);\n if (scaledRange) {\n renderPriceAxis(\n ctx,\n scaledRange,\n this.scaleManager,\n theme,\n chartW,\n paneH,\n this.priceAxisWidth,\n 3,\n subPaneAxisPrecision(scaledRange),\n this.uiConfig.priceAxis,\n );\n }\n }\n }\n\n ctx.restore();\n subPaneY += paneH;\n }\n\n // ── Volume overlay (bottom of price pane) ─────────────────────────────\n\n if (this.showVolume && volRange && volRange.max > 0) {\n const volOverlayH = priceH * VOLUME_PANEL_RATIO;\n renderVolume(\n ctx,\n bars,\n viewport,\n volRange.max,\n this.scaleManager,\n theme,\n chartW,\n volOverlayH,\n priceH - volOverlayH\n );\n }\n\n // ── Time axis ─────────────────────────────────────────────────────────\n\n {\n const INTRADAY_TF: Timeframe[] = ['1m', '5m', '15m', '30m', '1h', '4h'];\n const countdownAllowed = this.candleCountdownTimeframes === 'all'\n ? true\n : (this.candleCountdownTimeframes ?? INTRADAY_TF).includes(this.timeframe as Timeframe);\n const showCountdown =\n this.showCandleCountdown &&\n countdownAllowed &&\n bars.length > 0 &&\n viewport.endIndex >= this.dataStore.length - 1;\n const countdownBarIndex = showCountdown ? this.dataStore.length - 1 : undefined;\n\n if (this._debug) {\n // eslint-disable-next-line no-console\n console.log('[countdown] showCandleCountdown:', this.showCandleCountdown,\n '| tf:', this.timeframe, '| allowed:', countdownAllowed,\n '| bars:', bars.length, '| endIndex:', viewport.endIndex,\n '| dataLen:', this.dataStore.length, '| atLiveEdge:', viewport.endIndex >= this.dataStore.length - 1);\n }\n\n renderTimeAxis(\n ctx,\n bars,\n viewport,\n this.scaleManager,\n theme,\n chartW,\n subPaneY,\n isMobileDevice() ? 3 : undefined,\n this.uiConfig.timeAxis,\n this.timeframe,\n countdownBarIndex,\n );\n\n // ── Candle countdown ──────────────────────────────────────────────\n\n if (showCountdown) {\n const lastBar = this.dataStore.all[this.dataStore.length - 1];\n const intervalMs = this.timeframeToMs(this.timeframe as Timeframe);\n renderCandleCountdown(\n ctx,\n lastBar.time,\n intervalMs,\n this.dataStore.length - 1,\n viewport,\n this.scaleManager,\n theme,\n chartW,\n subPaneY,\n this.uiConfig.timeAxis,\n );\n }\n }\n\n // ── Crosshair ─────────────────────────────────────────────────────────\n\n if (this.crosshair) {\n renderCrosshair(\n ctx,\n this.crosshair,\n priceRange,\n viewport,\n this.scaleManager,\n theme,\n chartW,\n priceH,\n this.priceAxisWidth,\n subPaneY,\n this.timeframe,\n this.dataStore.getPricePrecision(),\n this.uiConfig.crosshair\n );\n }\n\n // ── Watermark logo (bottom-left of price pane) ────────────────────────\n\n if (this.logoImage) {\n const logoSize = 40;\n const margin = 20;\n const cx = margin + logoSize / 2; // circle center x\n const cy = priceH - margin - logoSize / 2; // circle center y, anchored from bottom\n ctx.save();\n ctx.globalAlpha = 0.6;\n // Clip to price pane so logo never bleeds into axes/sub-panes\n ctx.beginPath();\n ctx.rect(0, 0, chartW, priceH);\n ctx.clip();\n // Circle clip\n ctx.beginPath();\n ctx.arc(cx, cy, logoSize / 2, 0, Math.PI * 2);\n ctx.closePath();\n ctx.clip();\n ctx.drawImage(this.logoImage, cx - logoSize / 2, cy - logoSize / 2, logoSize, logoSize);\n ctx.restore();\n }\n\n ctx.restore();\n\n // ── Symbol info OHLC strip ────────────────────────────────────────────\n const ohlcBar = this.crosshair\n ? (this.dataStore.all[this.crosshair.barIndex] ?? null)\n : (this.dataStore.all[this.dataStore.length - 1] ?? null);\n this.renderSymbolInfoOHLC(ohlcBar);\n\n // ── Drawing overlay ───────────────────────────────────────────────────\n\n this.drawingManager.render(\n this.drawCtx,\n this.scaleManager,\n viewport,\n priceRange,\n chartW,\n priceH,\n this.dataStore.getPricePrecision()\n );\n\n // Show scroll-to-end button when the last candle has scrolled off-screen\n if (this.scrollToEndBtn) {\n const atEnd =\n this.dataStore.length === 0 ||\n this.viewport.endIndex >= this.dataStore.length - 0.5;\n if (atEnd !== !this.scrollToEndVisible) {\n this.scrollToEndVisible = !atEnd;\n this.scrollToEndBtn.style.opacity = atEnd ? '0' : '0.85';\n this.scrollToEndBtn.style.pointerEvents = atEnd ? 'none' : 'auto';\n }\n }\n\n // Update sub-pane overlay positions after layout is fully rendered\n this.updateSubPaneOverlayPositions();\n }\n\n // ── Private helpers ───────────────────────────────────────────────────────\n\n private recomputeIndicators(): void {\n for (const ind of this.indicators) {\n this.indicatorResults.set(ind.name, ind.compute(this.dataStore.all));\n }\n }\n\n private onResize(): void {\n const dpr = window.devicePixelRatio || 1;\n const rect = this.canvasWrap.getBoundingClientRect();\n this._cachedWrapRect = rect;\n this._cachedDrawRect = this.drawCanvas.getBoundingClientRect();\n for (const c of [this.canvas, this.tradeCanvas, this.drawCanvas]) {\n c.width = rect.width * dpr;\n c.height = rect.height * dpr;\n }\n\n const totalWidth = this.wrapper.offsetWidth;\n const isMobile =\n totalWidth > 0 && totalWidth < this.uiConfig.drawingToolbar.mobileBreakpoint;\n if (isMobile !== this._mobileLayout) {\n this._mobileLayout = isMobile;\n this.leftBar?.setMobileMode(isMobile);\n this.topBar?.setMobileLayout(isMobile);\n if (isMobile) {\n // Hide left bar by default on mobile; pencil button opens it\n this.leftBarVisible = false;\n this.topBar?.setDrawingsBtnActive(false);\n } else {\n // Restore left bar on desktop\n this.leftBarVisible = true;\n this.leftBar?.setVisible(true);\n this.topBar?.setDrawingsBtnActive(true);\n }\n }\n // Render synchronously here: ResizeObserver fires after layout but\n // before paint, so a direct render() call lands on-screen this frame.\n // scheduleRender() would queue a RAF that fires *next* frame, after the\n // canvas has already been cleared, leaving it blank on every frame\n // while a CSS width transition (e.g. the drawing toolbar toggle) runs.\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.render();\n this.renderTradeLayer();\n }\n\n private paneH(ind: IIndicator): number {\n return this.paneHeightOverrides.get(ind.name) ?? ind.paneHeight ?? SUB_PANE_HEIGHT;\n }\n\n /** Translate pixel + data space dimensions used for drawing hit-tests */\n private getChartLayout() {\n const subPanes = this.activeIndicators.filter((s) => s.indicator.pane === 'sub').map((s) => s.indicator);\n const subPanesH = subPanes.reduce((a, i) => a + this.paneH(i) + PANE_SEPARATOR, 0);\n const rect = this._cachedWrapRect ?? this.canvasWrap.getBoundingClientRect();\n const chartW = rect.width - this.priceAxisWidth;\n const priceH = rect.height - this.timeAxisHeight - subPanesH;\n return { chartW, priceH };\n }\n\n /** Repositions each sub-pane IndicatorOverlay element to sit at the top of its pane */\n private updateSubPaneOverlayPositions(): void {\n if (this.subPaneOverlays.size === 0) return;\n const seps = this.getSeparatorPositions();\n for (const sep of seps) {\n const overlay = this.subPaneOverlays.get(sep.indicatorName);\n if (overlay) {\n overlay.el.style.top = `${sep.y + PANE_SEPARATOR + 6}px`;\n }\n }\n }\n\n /** Y positions (logical px) of each sub-pane top separator, used for drag-resize */\n private getSeparatorPositions(): { y: number; indicatorName: string }[] {\n const { priceH } = this.getChartLayout();\n const subPanes = this.activeIndicators.filter((s) => s.indicator.pane === 'sub').map((s) => s.indicator);\n const result: { y: number; indicatorName: string }[] = [];\n let y = priceH;\n for (const ind of subPanes) {\n result.push({ y, indicatorName: ind.name });\n y += this.paneH(ind) + PANE_SEPARATOR;\n }\n return result;\n }\n\n private getScaledPriceRange(viewport: Viewport): PriceRange {\n const base = this.dataStore.getPriceRange(viewport);\n let rangeMin = base.min;\n let rangeMax = base.max;\n\n // Extend range to keep active overlay indicators fully in view\n for (const ind of this.indicators.filter((i) => !i.pane || i.pane === 'main')) {\n const results = this.indicatorResults.get(ind.name);\n if (!results) continue;\n const lo = Math.floor(viewport.startIndex);\n const hi = Math.ceil(viewport.endIndex) + 1;\n for (let idx = lo; idx < hi && idx < results.length; idx++) {\n const v = results[idx]?.value;\n if (v === null || v === undefined) continue;\n const vals: number[] = Array.isArray(v)\n ? (v as (number | null)[]).filter((x): x is number => x !== null)\n : [v as number];\n for (const n of vals) {\n if (isFinite(n)) {\n if (n < rangeMin) rangeMin = n;\n if (n > rangeMax) rangeMax = n;\n }\n }\n }\n }\n\n const mid = (rangeMin + rangeMax) / 2 + this.pricePanOffset;\n const halfSpan = rangeMin === rangeMax ? 1 : (rangeMax - rangeMin) / 2;\n return {\n min: mid - halfSpan * this.priceScaleFactor,\n max: mid + halfSpan * this.priceScaleFactor,\n };\n }\n\n private onMouseMove = (e: MouseEvent): void => {\n if (this._mobileCrosshairActive) return;\n const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n const { chartW, priceH } = this.getChartLayout();\n const priceRange = this._displayedPriceRange ?? this.getScaledPriceRange(this.viewport);\n\n // Only show crosshair when mouse is inside the chart area, not over axes\n const timeAxisY = rect.height - this.timeAxisHeight;\n const isInChartArea = x < chartW && y < timeAxisY;\n\n // Raw float coords — used for precise drawing placement\n const rawBarIndex = this.scaleManager.pixelToBarIndex(x, this.viewport, chartW);\n const price = this.scaleManager.pixelToPrice(y, priceRange, priceH);\n\n // Rounded + clamped — used for crosshair bar snap and event payload\n const clamped = Math.max(\n Math.floor(this.viewport.startIndex),\n Math.min(Math.ceil(this.viewport.endIndex), Math.round(rawBarIndex))\n );\n const bar = this.dataStore.all[clamped] ?? null;\n\n this.crosshair = (isInChartArea && !this._isHoveringTradeButton) ? { x, y, barIndex: clamped, price, bar } : null;\n if (this.crosshair) this.emitter.emit('crosshair', this.crosshair);\n\n // Trade button — only show in price pane, not below it, in the axis, or over a dot-style level\n const hoveringDotLevel =\n this.positionRenderStyle === 'dot' && this.hoveredTradeLabel !== null;\n if (this.tradeButton) {\n if (\n isInChartArea &&\n y >= 0 &&\n y <= priceH &&\n !this.tradePopover?.isVisible &&\n !hoveringDotLevel\n ) {\n this.tradeButton.setY(y);\n this.tradeButton.show();\n this._tradeButtonClickData = { price, y };\n // Compute limit/stop type for each side based on price vs last close\n const allBars = this.dataStore.all;\n const lastClose = allBars.length > 0 ? allBars[allBars.length - 1].close : price;\n this._hoverBuyType = price < lastClose ? 'limit' : 'stop';\n this._hoverSellType = price > lastClose ? 'limit' : 'stop';\n } else if (!this.tradePopover?.isVisible) {\n this.tradeButton.hide();\n }\n }\n\n // Forward raw coords to drawing manager\n this.drawingManager.onMouseMove({ barIndex: rawBarIndex, price });\n\n // Axis resize drag\n if (this.axisDrag) {\n if (this.axisDrag.axis === 'price') {\n // Vertical drag on price axis → scale the main price range\n const delta = y - this.axisDrag.startPos;\n this.priceScaleFactor = Math.max(\n 0.1,\n Math.min(10, this.axisDrag.startSize * Math.pow(1.005, delta))\n );\n } else if (this.axisDrag.axis === 'subpane' && this.axisDrag.indicatorName) {\n // Vertical drag on sub-pane axis → scale that pane's value range\n const delta = y - this.axisDrag.startPos;\n const newFactor = Math.max(\n 0.1,\n Math.min(20, this.axisDrag.startSize * Math.pow(1.005, delta))\n );\n this.subPaneScaleFactors.set(this.axisDrag.indicatorName, newFactor);\n } else {\n // Horizontal drag on time axis → adjust visible bar count\n const delta = x - this.axisDrag.startPos; // right = more bars = zoom out\n const newVisible = Math.max(\n 10,\n Math.min(500, Math.round(this.axisDrag.startSize + delta * 0.5))\n );\n const mid = (this.viewport.startIndex + this.viewport.endIndex) / 2;\n const newStart = Math.max(0, mid - newVisible / 2);\n this.viewport = {\n ...this.viewport,\n startIndex: newStart,\n endIndex: newStart + newVisible,\n };\n }\n this.drawCanvas.style.cursor =\n this.axisDrag.axis === 'time' ? 'ew-resize' : 'ns-resize';\n this.scheduleRender();\n return;\n }\n\n // Separator drag\n if (this.separatorDrag) {\n const delta = this.separatorDrag.startY - y; // dragging top edge down shrinks the pane\n const newH = Math.max(40, Math.min(300, this.separatorDrag.startH + delta));\n this.paneHeightOverrides.set(this.separatorDrag.indicatorName, newH);\n this.drawCanvas.style.cursor = 'ns-resize';\n this.scheduleRender();\n return;\n }\n\n // Trade level drag move\n if (this.tradeDragHandler?.active) {\n const moveResult = this.tradeDragHandler.onMouseMove(\n y,\n this.scaleManager,\n priceRange,\n priceH\n );\n this.tradeDragNewPrice = moveResult?.newPrice ?? null;\n this.drawCanvas.style.cursor = 'ns-resize';\n this.renderTradeLayer();\n // Emit live drag event for external panel sync\n if (this.tradeDragNewPrice !== null && moveResult) {\n const colonIdx = moveResult.label.indexOf(':');\n const baseLabel =\n colonIdx !== -1 ? moveResult.label.slice(0, colonIdx) : moveResult.label;\n const bracketType =\n colonIdx !== -1\n ? (moveResult.label.slice(colonIdx + 1) as 'stopLoss' | 'takeProfit')\n : undefined;\n const draggingLevel = this.levels.find((l) => l.label === baseLabel);\n if (draggingLevel) {\n this.emitter.emit('tradeLevelDrag', {\n label: draggingLevel.label,\n newPrice: this.tradeDragNewPrice,\n data: draggingLevel.data,\n bracketType,\n });\n }\n }\n return;\n }\n\n // Cursor feedback\n if (!this.drawingManager.getActiveTool()) {\n // × , ✎, and confirm/cancel buttons always take cursor priority — must run before drag-hover\n if (\n hitTestTradeLevelClose(x, y, this.tradeLevelHitAreas) ||\n hitTestTradeLevelEdit(x, y, this.tradeLevelEditAreas) ||\n hitTestTradeLevelConfirm(x, y, this.tradeLevelConfirmAreas)\n ) {\n this.drawCanvas.style.cursor = 'pointer';\n this.scheduleRender();\n return;\n }\n\n // Trade level drag handle hover — ns-resize cursor\n const dragHover = hitTestTradeLevelDrag(x, y, this.tradeLevelDragAreas);\n if (dragHover) {\n this.drawCanvas.style.cursor = 'ns-resize';\n this.scheduleRender();\n return;\n }\n\n // Trade level hover — update hovered label and repaint trade layer\n const hoverHit = hitTestTradeLevelHover(x, y, this.tradeHoverAreas);\n const newHover = hoverHit?.label ?? null;\n if (newHover !== this.hoveredTradeLabel) {\n this.hoveredTradeLabel = newHover;\n this.renderTradeLayer();\n }\n\n // Show pointer cursor when hovering a dot-style level\n if (this.positionRenderStyle === 'dot' && newHover !== null) {\n this.crosshair = null;\n this.drawCanvas.style.cursor = 'pointer';\n this.scheduleRender();\n return;\n }\n\n const seps = this.getSeparatorPositions();\n const nearSep = seps.find((s) => Math.abs(y - s.y) <= 4);\n if (nearSep) {\n this.drawCanvas.style.cursor = 'ns-resize';\n } else if (x >= chartW) {\n this.drawCanvas.style.cursor = 'ns-resize';\n } else if (y >= timeAxisY) {\n this.drawCanvas.style.cursor = 'ew-resize';\n } else if (\n this.drawingManager.isDraggingDrawing() ||\n this.drawingManager.isResizingDrawing()\n ) {\n this.drawCanvas.style.cursor = 'grabbing';\n } else {\n const handleHit = this.drawingManager.getHandleAtPoint(\n x,\n y,\n this.scaleManager,\n this.viewport,\n priceRange,\n chartW,\n priceH\n );\n if (handleHit) {\n this.drawCanvas.style.cursor = handleHit.handle.cursor;\n } else {\n const bodyHit = this.drawingManager.hitTest(\n x,\n y,\n this.scaleManager,\n this.viewport,\n priceRange,\n chartW,\n priceH\n );\n this.drawCanvas.style.cursor = bodyHit ? 'move' : 'default';\n }\n }\n }\n\n this.scheduleRender();\n };\n\n private onMouseLeave = (e: MouseEvent): void => {\n // When cursor moves onto the trade button let button.mouseenter handle crosshair hiding.\n // Returning early avoids the canvas.mouseleave → canvas.mousemove rapid-toggle flicker.\n if (this.tradeButton && this.tradeButton.el.contains(e.relatedTarget as Node | null)) {\n return;\n }\n // Synthetic mouseleave fires on mobile after touchend — ignore when crosshair is active.\n if (this._mobileCrosshairActive) return;\n this.crosshair = null;\n if (!this.tradePopover?.isVisible) {\n this.tradeButton?.hide();\n }\n if (this.hoveredTradeLabel !== null) {\n this.hoveredTradeLabel = null;\n this.renderTradeLayer();\n }\n this.scheduleRender();\n };\n\n private onMouseUp = (): void => {\n if (this.tradeDragHandler?.active) {\n const result = this.tradeDragHandler.endDrag();\n if (result) {\n // startPrice is the price at drag start — correct old price in all cases\n this.storePendingChange(\n result,\n result.startPrice,\n this._pendingBracketOrderLabel ?? undefined\n );\n } else {\n this.tradeDragNewPrice = null;\n }\n this._pendingBracketOrderLabel = null;\n this.drawCanvas.style.cursor = 'default';\n this.renderTradeLayer();\n return;\n }\n if (this.axisDrag) {\n this.axisDrag = null;\n this.drawCanvas.style.cursor = 'default';\n this.scheduleRender();\n }\n if (this.separatorDrag) {\n this.separatorDrag = null;\n this.drawCanvas.style.cursor = 'default';\n this.scheduleRender();\n }\n if (this.drawingManager.isDraggingDrawing()) {\n this.drawingManager.endDrag();\n this.drawCanvas.style.cursor = 'default';\n this.scheduleRender();\n }\n if (this.drawingManager.isResizingDrawing()) {\n this.drawingManager.endResize();\n this.drawCanvas.style.cursor = 'default';\n this.scheduleRender();\n }\n };\n\n private touchToDrawingPoint(touch: Touch): { barIndex: number; price: number } {\n const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n const x = touch.clientX - rect.left;\n const y = touch.clientY - rect.top;\n const { chartW, priceH } = this.getChartLayout();\n const priceRange = this._displayedPriceRange ?? this.getScaledPriceRange(this.viewport);\n return {\n barIndex: this.scaleManager.pixelToBarIndex(x, this.viewport, chartW),\n price: this.scaleManager.pixelToPrice(y, priceRange, priceH),\n };\n }\n\n private onDrawingTouchStart = (e: TouchEvent): void => {\n if (e.touches.length !== 1) return;\n const touch = e.touches[0];\n const point = this.touchToDrawingPoint(touch);\n const activeTool = this.drawingManager.getActiveTool();\n const placing = this.drawingManager.isPlacing();\n\n // — Placing a new drawing —\n if (activeTool !== null || placing) {\n e.preventDefault();\n this._lastDrawingTouchPoint = point;\n if (!placing) {\n // First tap: place anchor. Suppress touchmove preview until finger lifts.\n this.drawingManager.onMouseDown(point);\n this._drawTouchAnchorActive = this.drawingManager.isPlacing();\n } else {\n // Subsequent tap: move the preview point to where the user touched.\n // Actual confirmation happens on touchend so the user can drag to adjust.\n this._drawTouchAnchorActive = false;\n this.drawingManager.onMouseMove(point);\n }\n this.scheduleRender();\n return;\n }\n\n // — Editing an existing drawing —\n const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n const x = touch.clientX - rect.left;\n const y = touch.clientY - rect.top;\n const { chartW, priceH } = this.getChartLayout();\n const priceRange = this.getScaledPriceRange(this.viewport);\n\n // Axis touch drag — must check before drawing hit-tests\n if (x >= chartW) {\n e.preventDefault();\n if (y <= priceH) {\n this.axisDrag = { axis: 'price', startPos: y, startSize: this.priceScaleFactor };\n } else {\n const subPanes = this.activeIndicators.filter((s) => s.indicator.pane === 'sub').map((s) => s.indicator);\n let paneTop = priceH + PANE_SEPARATOR;\n for (const ind of subPanes) {\n const pH = this.paneH(ind);\n if (y >= paneTop && y < paneTop + pH) {\n this.axisDrag = {\n axis: 'subpane',\n startPos: y,\n startSize: this.subPaneScaleFactors.get(ind.name) ?? 1,\n indicatorName: ind.name,\n };\n break;\n }\n paneTop += pH + PANE_SEPARATOR;\n }\n }\n this.scheduleRender();\n return;\n }\n // Time axis touch drag — adjust visible bar count\n const timeAxisY = rect.height - this.timeAxisHeight;\n if (y >= timeAxisY) {\n e.preventDefault();\n this.axisDrag = {\n axis: 'time',\n startPos: x,\n startSize: this.viewport.endIndex - this.viewport.startIndex,\n };\n this.scheduleRender();\n return;\n }\n\n const handleHit = this.drawingManager.getHandleAtPoint(\n x,\n y,\n this.scaleManager,\n this.viewport,\n priceRange,\n chartW,\n priceH\n );\n if (handleHit) {\n e.preventDefault();\n this.drawingManager.selectDrawing(handleHit.drawing);\n this.drawingManager.startResize(handleHit.drawing, handleHit.handle.pointIndex);\n this.hideMobileDrawingFlyout();\n this.scheduleRender();\n return;\n }\n\n const bodyHit = this.drawingManager.hitTest(\n x,\n y,\n this.scaleManager,\n this.viewport,\n priceRange,\n chartW,\n priceH\n );\n if (bodyHit) {\n e.preventDefault();\n this.drawingManager.selectDrawing(bodyHit);\n this.drawingManager.startDrag(bodyHit, point);\n this._drawTouchStartXY = { x: touch.clientX, y: touch.clientY };\n this.hideMobileDrawingFlyout();\n this.scheduleRender();\n } else {\n // Tapped empty space — deselect and hide flyout\n this.drawingManager.selectDrawing(null);\n this.hideMobileDrawingFlyout();\n\n // Mobile crosshair: tap to show, tap again to dismiss\n const timeAxisY = rect.height - this.timeAxisHeight;\n const isInChartArea = x < chartW && y < timeAxisY;\n if (isInChartArea) {\n // Always record tap start — touchend decides whether it was a tap or a drag.\n // This also ensures a drag when crosshair is active moves the crosshair rather\n // than immediately dismissing it.\n this._mobileTapStartXY = { x, y };\n }\n }\n };\n\n private onDrawingTouchMove = (e: TouchEvent): void => {\n if (e.touches.length !== 1) return;\n const point = this.touchToDrawingPoint(e.touches[0]);\n this._lastDrawingTouchPoint = point;\n\n // Axis drag takes priority — handle price/time scale gestures\n if (this.axisDrag) {\n e.preventDefault();\n const touch = e.touches[0];\n const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n const tx = touch.clientX - rect.left;\n const ty = touch.clientY - rect.top;\n if (this.axisDrag.axis === 'price') {\n const delta = ty - this.axisDrag.startPos;\n this.priceScaleFactor = Math.max(\n 0.1,\n Math.min(10, this.axisDrag.startSize * Math.pow(1.005, delta))\n );\n } else if (this.axisDrag.axis === 'subpane' && this.axisDrag.indicatorName) {\n const delta = ty - this.axisDrag.startPos;\n const newFactor = Math.max(\n 0.1,\n Math.min(20, this.axisDrag.startSize * Math.pow(1.005, delta))\n );\n this.subPaneScaleFactors.set(this.axisDrag.indicatorName, newFactor);\n } else {\n const delta = tx - this.axisDrag.startPos;\n const newVisible = Math.max(\n 10,\n Math.min(500, Math.round(this.axisDrag.startSize + delta * 0.5))\n );\n const mid = (this.viewport.startIndex + this.viewport.endIndex) / 2;\n const newStart = Math.max(0, mid - newVisible / 2);\n this.viewport = { ...this.viewport, startIndex: newStart, endIndex: newStart + newVisible };\n }\n this.scheduleRender();\n return;\n }\n\n // Preview for new drawing placement (skip during first anchor gesture)\n if (this.drawingManager.isPlacing() && !this._drawTouchAnchorActive) {\n e.preventDefault();\n this.drawingManager.onMouseMove(point);\n this.scheduleRender();\n return;\n }\n\n // Drag or resize an existing drawing\n if (this.drawingManager.isDraggingDrawing() || this.drawingManager.isResizingDrawing()) {\n e.preventDefault();\n this.drawingManager.onMouseMove(point);\n this.scheduleRender();\n }\n\n // If a tap was pending but the finger moved far enough, cancel it (let PanHandler pan)\n if (!this._mobileCrosshairActive && this._mobileTapStartXY) {\n const touch = e.touches[0];\n const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n const dx = touch.clientX - rect.left - this._mobileTapStartXY.x;\n const dy = touch.clientY - rect.top - this._mobileTapStartXY.y;\n if (Math.sqrt(dx * dx + dy * dy) > 6) {\n this._mobileTapStartXY = null; // dragged — cancel pending tap\n }\n }\n\n // Move mobile crosshair with finger when active\n if (this._mobileCrosshairActive) {\n e.preventDefault();\n const touch = e.touches[0];\n const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n const x = touch.clientX - rect.left;\n const y = touch.clientY - rect.top;\n const { chartW, priceH } = this.getChartLayout();\n const priceRange = this._displayedPriceRange ?? this.getScaledPriceRange(this.viewport);\n const timeAxisY = rect.height - this.timeAxisHeight;\n if (x < chartW && y < timeAxisY) {\n const rawBarIndex = this.scaleManager.pixelToBarIndex(x, this.viewport, chartW);\n const price = this.scaleManager.pixelToPrice(y, priceRange, priceH);\n const clamped = Math.max(\n Math.floor(this.viewport.startIndex),\n Math.min(Math.ceil(this.viewport.endIndex), Math.round(rawBarIndex))\n );\n const bar = this.dataStore.all[clamped] ?? null;\n this.crosshair = { x, y, barIndex: clamped, price, bar };\n if (this.tradeButton) {\n this.tradeButton.setY(y);\n this.tradeButton.show();\n }\n this.scheduleRender();\n }\n }\n };\n\n private onDrawingTouchEnd = (_e: TouchEvent): void => {\n if (this.axisDrag) {\n this.axisDrag = null;\n this.scheduleRender();\n return;\n }\n\n const wasAnchorTouch = this._drawTouchAnchorActive;\n this._drawTouchAnchorActive = false;\n\n // Confirm point placement for 2nd+ gestures (touchend = confirm, not touchstart)\n if (!wasAnchorTouch && this.drawingManager.isPlacing() && this._lastDrawingTouchPoint) {\n this.drawingManager.onMouseDown(this._lastDrawingTouchPoint);\n this._lastDrawingTouchPoint = null;\n this.scheduleRender();\n return;\n }\n\n // End drag / resize of existing drawings\n if (this.drawingManager.isDraggingDrawing()) {\n const endTouch = _e.changedTouches[0];\n const startXY = this._drawTouchStartXY;\n this._drawTouchStartXY = null;\n this.drawingManager.endDrag();\n\n // If it was a tap (no significant movement) and a drawing is selected → show flyout\n if (endTouch && startXY && this.drawingManager.getSelectedDrawing()) {\n const dx = endTouch.clientX - startXY.x;\n const dy = endTouch.clientY - startXY.y;\n if (Math.sqrt(dx * dx + dy * dy) < 8) {\n this.showMobileDrawingFlyout(endTouch.clientX, endTouch.clientY);\n }\n }\n this.scheduleRender();\n }\n if (this.drawingManager.isResizingDrawing()) {\n this.drawingManager.endResize();\n this.scheduleRender();\n }\n\n // Mobile tap commit — only if finger didn't move far (tap, not drag)\n if (this._mobileTapStartXY) {\n const { x, y } = this._mobileTapStartXY;\n this._mobileTapStartXY = null;\n if (this._mobileCrosshairActive) {\n // Second tap → dismiss crosshair\n this._mobileCrosshairActive = false;\n this.crosshair = null;\n this.tradeButton?.hide();\n this.scheduleRender();\n } else {\n // First tap → activate crosshair\n const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n const { chartW, priceH } = this.getChartLayout();\n const priceRange = this._displayedPriceRange ?? this.getScaledPriceRange(this.viewport);\n const timeAxisY = rect.height - this.timeAxisHeight;\n if (x < chartW && y < timeAxisY) {\n this._mobileCrosshairActive = true;\n const rawBarIndex = this.scaleManager.pixelToBarIndex(x, this.viewport, chartW);\n const price = this.scaleManager.pixelToPrice(y, priceRange, priceH);\n const clamped = Math.max(\n Math.floor(this.viewport.startIndex),\n Math.min(Math.ceil(this.viewport.endIndex), Math.round(rawBarIndex))\n );\n const bar = this.dataStore.all[clamped] ?? null;\n this.crosshair = { x, y, barIndex: clamped, price, bar };\n if (this.tradeButton) {\n this.tradeButton.setY(y);\n this.tradeButton.show();\n }\n this.scheduleRender();\n }\n }\n }\n };\n\n private onCanvasClick = (e: MouseEvent): void => {\n const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n const { chartW, priceH } = this.getChartLayout();\n const priceRange = this.getScaledPriceRange(this.viewport);\n\n const rawBarIndex = this.scaleManager.pixelToBarIndex(x, this.viewport, chartW);\n const price = this.scaleManager.pixelToPrice(y, priceRange, priceH);\n const barIndex = Math.round(rawBarIndex);\n\n // Trade level inline confirm/cancel buttons — check first\n const confirmHit = hitTestTradeLevelConfirm(x, y, this.tradeLevelConfirmAreas);\n if (confirmHit) {\n if (confirmHit.action === 'confirm') this.applyPendingChanges(confirmHit.label);\n else this.revertPendingChanges(confirmHit.label);\n return;\n }\n\n // Trade/position × button — check before axis/drawing handlers\n const closedLevel = hitTestTradeLevelClose(x, y, this.tradeLevelHitAreas);\n if (closedLevel) {\n if (closedLevel.bracketType) {\n // Market draft bracket — remove immediately without confirmation\n const parentLevel = this.levels.find((l) => l.label === closedLevel.label) as\n | PendingOrderLevel\n | undefined;\n const isMarketDraftBracket =\n parentLevel?.orderType === 'market' &&\n (parentLevel?.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n if (isMarketDraftBracket) {\n const bracketKey = closedLevel.bracketType === 'stopLoss' ? 'sl' : 'tp';\n this.updateDraftOrderBracket(bracketKey, null);\n this.emitter.emit('tradeLevelEdit', {\n label: closedLevel.label,\n data: parentLevel?.data,\n type: 'pending' as const,\n changes: [\n {\n field:\n closedLevel.bracketType === 'stopLoss'\n ? 'REMOVE_SL'\n : 'REMOVE_TP',\n newPrice: 0,\n data: closedLevel.data,\n },\n ],\n });\n return;\n }\n\n // Bracket (SL/TP) removal — stage as pending so user must confirm via ✓/✗,\n // same flow as a bracket drag. Replaces any prior draft for that field.\n const field = closedLevel.bracketType; // 'stopLoss' | 'takeProfit'\n const existing = this.pendingLevelDrags.get(closedLevel.label) ?? [];\n const filtered = existing.filter((c) => c.field !== field);\n filtered.push({\n field,\n newPrice: 0,\n oldPrice: 0,\n isRemoval: true,\n bracketOrderLabel: closedLevel.bracketOrderLabel,\n });\n this.pendingLevelDrags.set(closedLevel.label, filtered);\n this.selectedTradeLabel = closedLevel.label;\n this.renderTradeLayer();\n return;\n }\n\n // Main level × — close/cancel immediately (no bracket involved)\n const isDraftOrder = closedLevel.label === this.draftOrderLabel;\n this.revertPendingChanges(closedLevel.label);\n this.pendingLevelDrags.delete(closedLevel.label);\n\n // Draft orders were never submitted — discard silently, no event\n if (isDraftOrder) return;\n\n const originalLevel = this.levels.find((l) => l.label === closedLevel.label);\n const isEntryOrder =\n originalLevel?.type === 'position' &&\n !!(originalLevel as PositionLevel).entryPriceEditable;\n const closeAction: 'CLOSED' | 'CANCELLED' =\n closedLevel.type === 'position' && !isEntryOrder ? 'CLOSED' : 'CANCELLED';\n\n this.emitter.emit('tradeLevelClose', {\n label: closedLevel.label,\n type: closedLevel.type as TradeLevelType,\n action: closeAction,\n data: closedLevel.data,\n });\n return;\n }\n\n // Trade level drag handle — check before axis/drawing handlers\n if (this.tradeDragHandler && !this.drawingManager.getActiveTool()) {\n const dragHit = hitTestTradeLevelDrag(x, y, this.tradeLevelDragAreas);\n if (dragHit) {\n const level = this.levels.find((l) => l.label === dragHit.label);\n if (level) {\n if (dragHit.isBracket) {\n this._pendingBracketOrderLabel = dragHit.bracketOrderLabel ?? null;\n this._isBracketNew = false;\n const isEntryOrder =\n (level as { entryPriceEditable?: boolean }).entryPriceEditable === true;\n const isDraft =\n (level.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n const all = this.dataStore.all;\n const marketPrice =\n isEntryOrder || isDraft ? 0 : (all[all.length - 1]?.close ?? 0);\n this.tradeDragHandler.startBracketDrag(\n level,\n dragHit.bracketType,\n dragHit.price,\n marketPrice,\n this._effectiveEntryPrice(level.label, level.price)\n );\n } else {\n this._pendingBracketOrderLabel = null;\n const isEntryOrder = (level as PositionLevel).entryPriceEditable === true;\n if (isEntryOrder) {\n // Select the level so SL/TP brackets become visible during drag,\n // and pass their prices as constraints for the drag.\n this.selectedTradeLabel = dragHit.label;\n const posLevel = level as PositionLevel;\n const allPos = this.dataStore.all;\n const mktPricePos = allPos[allPos.length - 1]?.close ?? 0;\n this.tradeDragHandler.startDrag(\n level,\n y,\n dragHit.price,\n posLevel.stopLossPrice,\n posLevel.takeProfitPrice,\n posLevel.side,\n mktPricePos,\n posLevel.orderType\n );\n } else {\n const pendingLevel = level as PendingOrderLevel;\n const allBars = this.dataStore.all;\n const mktPrice = allBars[allBars.length - 1]?.close ?? 0;\n this.tradeDragHandler.startDrag(\n level,\n y,\n dragHit.price,\n undefined,\n undefined,\n pendingLevel.side,\n mktPrice,\n (pendingLevel as { orderType?: 'limit' | 'stop' | 'market' })\n .orderType\n );\n }\n }\n this.drawCanvas.style.cursor = 'ns-resize';\n return;\n }\n }\n }\n\n // +SL / +TP add-bracket button — starts a new bracket drag from the button position\n if (this.tradeDragHandler && !this.drawingManager.getActiveTool()) {\n const addHit = hitTestTradeLevelAddBracket(x, y, this.tradeAddBracketAreas);\n if (addHit) {\n const level = this.levels.find((l) => l.label === addHit.label);\n if (level) {\n const { priceH } = this.getChartLayout();\n const priceRange = this.getScaledPriceRange(this.viewport);\n const btnCenterY = addHit.y + addHit.h / 2;\n const initialPrice = this.scaleManager.pixelToPrice(\n btnCenterY,\n priceRange,\n priceH\n );\n const isEntryOrder =\n (level as { entryPriceEditable?: boolean }).entryPriceEditable === true;\n const isDraft =\n (level.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n const all = this.dataStore.all;\n const marketPrice =\n isEntryOrder || isDraft ? 0 : (all[all.length - 1]?.close ?? 0);\n // Notify external panel to enter modify mode for committed levels\n if (!isDraft) {\n this.emitter.emit('tradeLevelEditOpen', {\n label: level.label,\n type: level.type,\n data: level.data,\n price: level.price,\n side: (level as PositionLevel | PendingOrderLevel).side,\n stopLossPrice: (level as PositionLevel).stopLossPrice,\n takeProfitPrice: (level as PositionLevel).takeProfitPrice,\n });\n }\n this._pendingBracketOrderLabel = null;\n this._isBracketNew = true;\n this.tradeDragHandler.startBracketDrag(\n level,\n addHit.bracketType,\n initialPrice,\n marketPrice,\n this._effectiveEntryPrice(level.label, level.price)\n );\n this.drawCanvas.style.cursor = 'ns-resize';\n return;\n }\n }\n }\n\n // Trade level edit (pencil) button — notify external panel to open/pre-fill\n if (!this.drawingManager.getActiveTool()) {\n const editHit = hitTestTradeLevelEdit(x, y, this.tradeLevelEditAreas);\n if (editHit) {\n const level = this.levels.find((l) => l.label === editHit.label);\n if (level) {\n this.selectedTradeLabel = level.label;\n this.renderTradeLayer();\n this.emitter.emit('tradeLevelEditOpen', {\n label: level.label,\n type: level.type,\n data: level.data,\n price: level.price,\n side: (level as PositionLevel | PendingOrderLevel).side,\n stopLossPrice: (level as PositionLevel).stopLossPrice,\n takeProfitPrice: (level as PositionLevel).takeProfitPrice,\n });\n }\n return;\n }\n }\n\n // Trade level hover — click to select (shows SL/TP brackets and enters edit mode)\n const hoverHit = hitTestTradeLevelHover(x, y, this.tradeHoverAreas);\n if (hoverHit) {\n const hasPending = this.pendingLevelDrags.has(hoverHit.label);\n // Allow deselect only when there are no pending draft changes\n if (this.selectedTradeLabel === hoverHit.label && !hasPending) {\n this.selectedTradeLabel = null;\n } else {\n this.selectedTradeLabel = hoverHit.label;\n }\n this.renderTradeLayer();\n return;\n } else if (this.selectedTradeLabel !== null) {\n // Don't deselect while there are pending draft changes — user must confirm or cancel\n if (!this.pendingLevelDrags.has(this.selectedTradeLabel)) {\n this.selectedTradeLabel = null;\n this.renderTradeLayer();\n }\n }\n\n // Axis resize — takes priority over everything\n const timeAxisY = rect.height - this.timeAxisHeight;\n if (x >= chartW) {\n if (y <= priceH) {\n // Main pane price axis: vertical drag scales the main price range\n this.axisDrag = { axis: 'price', startPos: y, startSize: this.priceScaleFactor };\n } else {\n // Sub-pane axis: find which sub-pane and scale its range independently\n const subPanes = this.activeIndicators.filter((s) => s.indicator.pane === 'sub').map((s) => s.indicator);\n let paneTop = priceH + PANE_SEPARATOR;\n for (const ind of subPanes) {\n const pH = this.paneH(ind);\n if (y >= paneTop && y < paneTop + pH) {\n this.axisDrag = {\n axis: 'subpane',\n startPos: y,\n startSize: this.subPaneScaleFactors.get(ind.name) ?? 1,\n indicatorName: ind.name,\n };\n break;\n }\n paneTop += pH + PANE_SEPARATOR;\n }\n }\n this.scheduleRender();\n return;\n }\n if (y >= timeAxisY) {\n // Time axis zone: horizontal drag adjusts visible bar count\n this.axisDrag = {\n axis: 'time',\n startPos: x,\n startSize: this.viewport.endIndex - this.viewport.startIndex,\n };\n this.scheduleRender();\n return;\n }\n\n // Separator resize — takes priority over everything\n const seps = this.getSeparatorPositions();\n const nearSep = seps.find((s) => Math.abs(y - s.y) <= 4);\n if (nearSep) {\n const ind = this.indicators.find((i) => i.name === nearSep.indicatorName);\n const currentH =\n this.paneHeightOverrides.get(nearSep.indicatorName) ??\n ind?.paneHeight ??\n SUB_PANE_HEIGHT;\n this.separatorDrag = {\n indicatorName: nearSep.indicatorName,\n startY: y,\n startH: currentH,\n };\n this.scheduleRender();\n return;\n }\n\n // Pass raw coords to drawing — pixel-perfect placement\n const consumed = this.drawingManager.onMouseDown({\n barIndex: rawBarIndex,\n price,\n });\n\n if (!consumed) {\n // Check handle first (resize), then body (drag)\n const handleHit = this.drawingManager.getHandleAtPoint(\n x,\n y,\n this.scaleManager,\n this.viewport,\n priceRange,\n chartW,\n priceH\n );\n if (handleHit) {\n this.drawingManager.selectDrawing(handleHit.drawing);\n this.drawingManager.startResize(handleHit.drawing, handleHit.handle.pointIndex);\n } else {\n const bodyHit = this.drawingManager.hitTest(\n x,\n y,\n this.scaleManager,\n this.viewport,\n priceRange,\n chartW,\n priceH\n );\n this.drawingManager.selectDrawing(bodyHit);\n if (bodyHit) {\n this.drawingManager.startDrag(bodyHit, {\n barIndex: rawBarIndex,\n price,\n });\n }\n }\n\n const bar = this.dataStore.all[barIndex] ?? null;\n this.emitter.emit('click', { x, y, barIndex, price, bar });\n }\n\n this.scheduleRender();\n };\n\n private onDoubleClick = (e: MouseEvent): void => {\n this.drawingManager.finalizePlacing();\n\n const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n const { chartW, priceH } = this.getChartLayout();\n const timeAxisY = rect.height - this.timeAxisHeight;\n\n if (x >= chartW) {\n // Double-click on price axis → reset Y\n this.resetPriceAxis();\n return;\n }\n if (y >= timeAxisY) {\n // Double-click on time axis → reset X\n this.resetTimeAxis();\n return;\n }\n\n // Double-click on a text drawing → open text editor\n const TEXT_TYPES = new Set(['text', 'callout', 'anchoredNote']);\n const selected = this.drawingManager.getSelectedDrawing();\n if (selected && TEXT_TYPES.has(selected.type)) {\n const priceRange = this.getScaledPriceRange(this.viewport);\n if (\n selected.hitTest(x, y, this.scaleManager, this.viewport, priceRange, chartW, priceH)\n ) {\n this.showTextInput(selected);\n return;\n }\n }\n\n this.scheduleRender();\n };\n\n private onKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this.pendingLevelDrags.size > 0) {\n this.revertPendingChanges();\n e.preventDefault();\n return;\n }\n const ctrlZ = (e.ctrlKey || e.metaKey) && e.key === 'z';\n const key = ctrlZ ? 'z' : e.key;\n const consumed = this.drawingManager.onKeyDown(key);\n if (consumed) {\n e.preventDefault();\n this.hideMobileDrawingFlyout();\n // Sync left bar active state after Escape\n this.leftBar?.setActiveTool(this.drawingManager.getActiveTool());\n this.drawCanvas.style.cursor = this.drawingManager.getActiveTool()\n ? 'crosshair'\n : 'default';\n this.scheduleRender();\n }\n };\n\n // ── Text drawing input ────────────────────────────────────────────────────\n\n private showTextInput(drawing: import('./core/types.js').IDrawing): void {\n if (!this.textInputEl) return;\n this.textInputDrawing = drawing;\n\n const { chartW, priceH } = this.getChartLayout();\n const priceRange = this.getScaledPriceRange(this.viewport);\n\n // Compute anchor pixel position relative to canvasWrap\n let px: number;\n let py: number;\n if (drawing.type === 'text') {\n px = this.scaleManager.xToPixel(drawing.points[0].barIndex, this.viewport, chartW);\n py = this.scaleManager.yToPixel(drawing.points[0].price, priceRange, priceH);\n } else {\n // callout / anchoredNote — use p2 (the box/badge position)\n const p = drawing.points[1] ?? drawing.points[0];\n px = this.scaleManager.xToPixel(p.barIndex, this.viewport, chartW) - 30;\n py = this.scaleManager.yToPixel(p.price, priceRange, priceH) - 10;\n }\n\n const el = this.textInputEl;\n el.value = drawing.text ?? '';\n el.style.left = `${Math.max(0, px)}px`;\n el.style.top = `${Math.max(0, py)}px`;\n el.style.display = 'block';\n\n this.drawingManager.setEditingText(true);\n el.focus();\n el.select();\n\n const commit = () => {\n el.removeEventListener('keydown', onKey);\n el.removeEventListener('blur', onBlur);\n this.commitTextInput();\n };\n const cancel = () => {\n el.removeEventListener('keydown', onKey);\n el.removeEventListener('blur', onBlur);\n this.cancelTextInput();\n };\n const onKey = (ev: KeyboardEvent) => {\n if (ev.key === 'Enter') {\n ev.preventDefault();\n commit();\n } else if (ev.key === 'Escape') {\n ev.preventDefault();\n cancel();\n }\n };\n const onBlur = () => commit();\n el.addEventListener('keydown', onKey);\n el.addEventListener('blur', onBlur, { once: true });\n }\n\n private commitTextInput(): void {\n if (!this.textInputEl || !this.textInputDrawing) return;\n this.textInputDrawing.text = this.textInputEl.value;\n this.textInputEl.style.display = 'none';\n this.textInputDrawing = null;\n this.drawingManager.setEditingText(false);\n this.drawingManager.onDrawingsChange?.();\n this.scheduleRender();\n }\n\n private cancelTextInput(): void {\n if (!this.textInputEl) return;\n this.textInputEl.style.display = 'none';\n this.textInputDrawing = null;\n this.drawingManager.setEditingText(false);\n this.scheduleRender();\n }\n\n private setDotTickActive(): void {\n if (!this.siStreamDot) return;\n if (this.tickActivityTimer !== null) clearTimeout(this.tickActivityTimer);\n this.siStreamDot.style.background = this.theme.candle.up;\n this.tickActivityTimer = setTimeout(() => {\n this.tickActivityTimer = null;\n if (this.siStreamDot)\n this.siStreamDot.style.background = this.theme.ui.stream[this.streamStatus];\n }, this.tickActivityMs);\n }\n\n private onTick = (tick: Tick): void => {\n const all = this.dataStore.all;\n if (all.length === 0) return;\n\n this.liveBidAsk = { bid: tick.bid, ask: tick.ask };\n this.setDotTickActive();\n\n const last = all[all.length - 1];\n const intervalMs = this.timeframeToMs(this.timeframe);\n\n const tickPrice = this.tickClosePriceSource === 'ask' ? tick.ask : tick.bid;\n\n if (tick.time < last.time + intervalMs) {\n // Update current bar using configured price source\n const updated: OHLCVBar = {\n ...last,\n high: Math.max(last.high, tickPrice),\n low: Math.min(last.low, tickPrice),\n close: tickPrice,\n volume: (last.volume ?? 0) + tick.volume,\n };\n all[all.length - 1] = updated;\n } else {\n // Capture before push so references stay correct\n const completedBar = last;\n // Snap new bar to the actual period boundary of the incoming tick,\n // skipping any gap (overnight, weekend, missing bars) in one step.\n const newBarTime = Math.floor(tick.time / intervalMs) * intervalMs;\n all.push({\n time: newBarTime,\n open: tickPrice,\n high: tickPrice,\n low: tickPrice,\n close: tickPrice,\n volume: tick.volume,\n });\n if (this._debug) {\n /* eslint-disable-next-line no-console */\n console.warn(\n `[tick] → NEW candle @ ${new Date(newBarTime).toISOString()}` +\n ` (closed ${new Date(completedBar.time).toISOString()})` +\n ` | total bars=${all.length}`\n );\n }\n const openingBar = all[all.length - 1];\n // Advance viewport if user is tracking the live edge (has lookahead space)\n if (this.viewport.endIndex >= all.length) {\n this.viewport = {\n ...this.viewport,\n startIndex: this.viewport.startIndex + 1,\n endIndex: this.viewport.endIndex + 1,\n };\n }\n this.emitter.emit('newBar', { completedBar, openingBar, intervalMs });\n // Re-fetch the completed candle (+ 2 neighbours) to correct tick-reconstructed OHLCV\n this.correctCompletedBar(completedBar.time, intervalMs);\n // If the new bar is more than one interval ahead of the last bar, there are missing\n // bars (e.g. system clock was behind feed time during initial load) — backfill them.\n // Start from completedBar.time (not +intervalMs) so the last loaded bar is also\n // re-fetched and corrected — it may have been captured mid-candle at load time.\n if (newBarTime > completedBar.time + intervalMs) {\n this.fillTickGap(completedBar.time, newBarTime);\n }\n }\n\n this.recomputeIndicators();\n this.scheduleRender();\n };\n\n /** Fetch bars that fall in a gap between the last historical bar and the first live bar.\n * This happens when the system clock was behind feed time during the initial data load. */\n private fillTickGap(fromTime: number, toTime: number): void {\n if (!this.dataLoader) return;\n const interval = this.timeframeToInterval(this.getBaseInterval());\n this.dataLoader({ start: new Date(fromTime), end: new Date(toTime), interval })\n .then((rawBars) => {\n const bars = this.maybeAggregate(rawBars);\n if (bars.length === 0) return;\n const all = this.dataStore.all;\n const liveBar = all[all.length - 1];\n let insertCount = 0;\n for (const bar of bars) {\n if (bar.time >= liveBar.time) continue;\n const existingIdx = all.findIndex((b) => b.time === bar.time);\n if (existingIdx !== -1) {\n // Replace — corrects bars that were captured mid-candle at load time\n all[existingIdx] = bar;\n } else {\n const insertAt = all.findIndex((b) => b.time > bar.time);\n all.splice(insertAt === -1 ? all.length - 1 : insertAt, 0, bar);\n insertCount++;\n }\n }\n if (insertCount > 0) {\n this.viewport = {\n ...this.viewport,\n startIndex: this.viewport.startIndex + insertCount,\n endIndex: this.viewport.endIndex + insertCount,\n };\n this.recomputeIndicators();\n this.scheduleRender();\n }\n })\n .catch(() => {\n /* silently ignore */\n });\n }\n\n /** Re-fetch the just-closed candle (plus 2 neighbours) via `dataLoader` to replace\n * tick-reconstructed OHLCV with authoritative exchange data. No-op if no loader. */\n private correctCompletedBar(barTime: number, intervalMs: number): void {\n if (!this.dataLoader) return;\n const start = new Date(barTime);\n const end = new Date(barTime + intervalMs * 3);\n const interval = this.timeframeToInterval(this.getBaseInterval());\n this.dataLoader({ start, end, interval })\n .then((rawBars) => {\n const bars = this.maybeAggregate(rawBars);\n if (bars.length === 0) return;\n const all = this.dataStore.all;\n const liveBarIndex = all.length - 1;\n let changed = false;\n for (const bar of bars) {\n const idx = all.findIndex((b) => b.time === bar.time);\n if (idx !== -1 && idx !== liveBarIndex) {\n all[idx] = bar;\n changed = true;\n }\n }\n if (changed) {\n this.recomputeIndicators();\n this.scheduleRender();\n }\n })\n .catch(() => {\n /* silently ignore fetch errors — tick data remains */\n });\n }\n\n /** Enable or disable verbose tick logging to the console for debugging live candle issues. */\n public setDebug(enabled: boolean): this {\n this._debug = enabled;\n return this;\n }\n\n /** Replace the bar with the given timestamp with authoritative OHLCV data.\n * Use this when you receive a corrected candle from an external source. */\n public correctBar(barTime: number, bar: OHLCVBar): void {\n const all = this.dataStore.all;\n const idx = all.findIndex((b) => b.time === barTime);\n if (idx === -1) return;\n all[idx] = bar;\n this.recomputeIndicators();\n this.scheduleRender();\n }\n\n private scrollToEnd(): void {\n if (this.scrollAnimId !== null) {\n cancelAnimationFrame(this.scrollAnimId);\n this.scrollAnimId = null;\n }\n\n const visible = this.viewport.endIndex - this.viewport.startIndex;\n const targetEnd = this.dataStore.length + LOOKAHEAD;\n const startEnd = this.viewport.endIndex;\n const startPan = this.pricePanOffset;\n const DURATION = 350; // ms\n const t0 = performance.now();\n\n const ease = (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t); // ease-in-out quad\n\n const step = (now: number) => {\n const raw = Math.min((now - t0) / DURATION, 1);\n const prog = ease(raw);\n\n const newEnd = startEnd + (targetEnd - startEnd) * prog;\n this.viewport = {\n ...this.viewport,\n startIndex: newEnd - visible,\n endIndex: newEnd,\n };\n this.pricePanOffset = startPan * (1 - prog);\n this.render();\n\n if (raw < 1) {\n this.scrollAnimId = requestAnimationFrame(step);\n } else {\n this.scrollAnimId = null;\n }\n };\n\n this.scrollAnimId = requestAnimationFrame(step);\n }\n\n private resetPriceAxis(): void {\n this.priceScaleFactor = 1.0;\n this.pricePanOffset = 0;\n this._lockedAutoFitBase = null;\n this.scheduleRender();\n }\n\n private resetTimeAxis(): void {\n const total = this.dataStore.length;\n if (total === 0) return;\n const newStart = Math.max(0, total - initialVisibleBars(this.mobileBarDivisor, this.explicitMobileDivisor) + LOOKAHEAD);\n this.viewport = { ...this.viewport, startIndex: newStart, endIndex: total + LOOKAHEAD };\n this.scheduleRender();\n }\n\n /** Reset both price and time axes to their default state. */\n resetView(): void {\n this.resetPriceAxis();\n this.resetTimeAxis();\n }\n\n private applyResetViewBtnStyles(): void {\n if (!this.resetViewBtn) return;\n this.resetViewBtn.innerHTML = iconResetView(this.theme.axisText, 16);\n Object.assign(this.resetViewBtn.style, {\n position: 'absolute',\n bottom: `${this.timeAxisHeight + 8}px`,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: '100',\n width: '32px',\n height: '32px',\n padding: '0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: this.theme.background,\n border: `1px solid ${this.theme.axisBorder}`,\n borderRadius: '50%',\n cursor: 'pointer',\n outline: 'none',\n boxShadow: '0 2px 6px rgba(0,0,0,0.25)',\n opacity: '0.75',\n transition: 'opacity 0.2s ease',\n });\n }\n\n private applyScrollToEndBtnStyles(): void {\n if (!this.scrollToEndBtn) return;\n this.scrollToEndBtn.innerHTML = iconScrollToEnd(this.theme.axisText, 16);\n Object.assign(this.scrollToEndBtn.style, {\n position: 'absolute',\n bottom: `${this.timeAxisHeight + 8}px`,\n right: `${this.priceAxisWidth + 8}px`,\n zIndex: '100',\n width: '32px',\n height: '32px',\n padding: '0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: this.theme.background,\n border: `1px solid ${this.theme.axisBorder}`,\n borderRadius: '50%',\n cursor: 'pointer',\n outline: 'none',\n boxShadow: '0 2px 6px rgba(0,0,0,0.25)',\n opacity: '0',\n pointerEvents: 'none',\n transition: 'opacity 0.2s ease',\n });\n }\n}\n","import type { IWebSocketAdapter, Tick, StreamStatus } from '../core/types.js';\n\n/**\n * Generic WebSocket adapter.\n *\n * Usage:\n * const adapter = new WebSocketAdapter('wss://feed.example.com/ticks', msg => ({\n * time: new Date(msg.T).getTime(),\n * bid: msg.B,\n * ask: msg.A,\n * volume: msg.v ?? 0,\n * }));\n * chart.connectStream(adapter);\n */\nexport class WebSocketAdapter implements IWebSocketAdapter {\n private ws: WebSocket | null = null;\n private tickCallbacks: ((tick: Tick) => void)[] = [];\n private statusCallbacks: ((status: StreamStatus) => void)[] = [];\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectDelay = 2000;\n private destroyed = false;\n\n constructor(\n private readonly url: string,\n /** Transform a raw server message into a Tick. Return null to skip. */\n private readonly transform: (msg: unknown) => Tick | null = defaultTransform,\n ) {}\n\n connect(): void {\n if (this.ws) return;\n this.destroyed = false;\n this.openSocket();\n }\n\n disconnect(): void {\n this.destroyed = true;\n if (this.reconnectTimer !== null) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.emitStatus('disconnected');\n }\n\n onTick(callback: (tick: Tick) => void): void {\n this.tickCallbacks.push(callback);\n }\n\n onStatus(callback: (status: StreamStatus) => void): void {\n this.statusCallbacks.push(callback);\n }\n\n // ── Private ───────────────────────────────────────────────────────────────\n\n private openSocket(): void {\n this.ws = new WebSocket(this.url);\n\n this.ws.addEventListener('open', () => {\n this.reconnectDelay = 2000;\n this.emitStatus('connected');\n });\n\n this.ws.addEventListener('message', (event) => {\n try {\n const raw = typeof event.data === 'string' ? JSON.parse(event.data) : event.data;\n const tick = this.transform(raw);\n if (tick) this.tickCallbacks.forEach(cb => cb(tick));\n } catch {\n // ignore malformed messages\n }\n });\n\n this.ws.addEventListener('close', () => {\n this.ws = null;\n if (!this.destroyed) {\n this.emitStatus('reconnecting');\n this.scheduleReconnect();\n }\n });\n\n this.ws.addEventListener('error', () => {\n this.ws?.close();\n });\n }\n\n private scheduleReconnect(): void {\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n if (!this.destroyed) this.openSocket();\n }, this.reconnectDelay);\n this.reconnectDelay = Math.min(this.reconnectDelay * 2, 30_000);\n }\n\n private emitStatus(status: StreamStatus): void {\n this.statusCallbacks.forEach(cb => cb(status));\n }\n}\n\n/** Default transform: expects `{ T: string, B: number, A: number }` (Centrifuge price format) */\nfunction defaultTransform(msg: unknown): Tick | null {\n if (typeof msg !== 'object' || msg === null) return null;\n const m = msg as Record<string, unknown>;\n if (typeof m.B !== 'number' || typeof m.A !== 'number') return null;\n const time = typeof m.T === 'string' ? new Date(m.T).getTime() : Date.now();\n return {\n time,\n bid: m.B as number,\n ask: m.A as number,\n volume: typeof m.volume === 'number' ? m.volume : 0,\n };\n}\n"]}