@tradecanvas/chart 0.8.1 → 0.9.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.
Files changed (42) hide show
  1. package/README.md +223 -48
  2. package/dist/Chart.d.ts +11 -0
  3. package/dist/Chart.d.ts.map +1 -1
  4. package/dist/{Chart-Cn_TSMO7.js → DragDropImporter-6QOjnfSj.js} +361 -85
  5. package/dist/DragDropImporter-6QOjnfSj.js.map +1 -0
  6. package/dist/DragDropImporter-CQ3EarQn.cjs +2 -0
  7. package/dist/DragDropImporter-CQ3EarQn.cjs.map +1 -0
  8. package/dist/index.cjs +1 -1
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +26 -26
  13. package/dist/index.js.map +1 -1
  14. package/dist/io/DragDropImporter.d.ts +34 -0
  15. package/dist/io/DragDropImporter.d.ts.map +1 -0
  16. package/dist/io/index.d.ts +5 -0
  17. package/dist/io/index.d.ts.map +1 -0
  18. package/dist/io/parseOHLCV.d.ts +21 -0
  19. package/dist/io/parseOHLCV.d.ts.map +1 -0
  20. package/dist/widget/ChartWidget.d.ts +46 -1
  21. package/dist/widget/ChartWidget.d.ts.map +1 -1
  22. package/dist/widget/WidgetHotkeySheet.d.ts +20 -0
  23. package/dist/widget/WidgetHotkeySheet.d.ts.map +1 -0
  24. package/dist/widget/WidgetReplayBar.d.ts +41 -0
  25. package/dist/widget/WidgetReplayBar.d.ts.map +1 -0
  26. package/dist/widget/WidgetSettings.d.ts.map +1 -1
  27. package/dist/widget/WidgetSymbolSearch.d.ts +32 -0
  28. package/dist/widget/WidgetSymbolSearch.d.ts.map +1 -0
  29. package/dist/widget/WidgetToolbar.d.ts.map +1 -1
  30. package/dist/widget/WidgetWatchlist.d.ts +39 -0
  31. package/dist/widget/WidgetWatchlist.d.ts.map +1 -0
  32. package/dist/widget/index.cjs +1455 -877
  33. package/dist/widget/index.cjs.map +1 -1
  34. package/dist/widget/index.js +695 -92
  35. package/dist/widget/index.js.map +1 -1
  36. package/dist/widget/types.d.ts +19 -0
  37. package/dist/widget/types.d.ts.map +1 -1
  38. package/dist/widget/widgetConfig.d.ts.map +1 -1
  39. package/package.json +3 -3
  40. package/dist/Chart-Br_N-BCL.cjs +0 -2
  41. package/dist/Chart-Br_N-BCL.cjs.map +0 -1
  42. package/dist/Chart-Cn_TSMO7.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/widget/widgetConfig.ts","../../src/widget/WidgetStyles.ts","../../src/widget/icons.ts","../../src/widget/WidgetDropdown.ts","../../src/widget/WidgetToolbar.ts","../../src/widget/WidgetDrawingSidebar.ts","../../src/widget/WidgetSettings.ts","../../src/widget/WidgetStatusBar.ts","../../src/widget/WidgetCommandPalette.ts","../../src/widget/ChartWidget.ts"],"sourcesContent":["import type { ChartType, DrawingToolType, TimeFrame } from '@tradecanvas/commons';\r\nimport type { IndicatorDef, DrawingToolGroupDef, ChartSettingsState } from './types.js';\r\n\r\nexport const TIMEFRAMES: { label: string; value: TimeFrame }[] = [\r\n { label: '1m', value: '1m' },\r\n { label: '5m', value: '5m' },\r\n { label: '15m', value: '15m' },\r\n { label: '1H', value: '1h' },\r\n { label: '4H', value: '4h' },\r\n { label: '1D', value: '1d' },\r\n];\r\n\r\nexport const CHART_TYPES: { label: string; value: ChartType }[] = [\r\n { label: 'Candlestick', value: 'candlestick' },\r\n { label: 'Line', value: 'line' },\r\n { label: 'Area', value: 'area' },\r\n { label: 'Bar', value: 'bar' },\r\n { label: 'Heikin-Ashi', value: 'heikinAshi' },\r\n { label: 'Hollow Candle', value: 'hollowCandle' },\r\n { label: 'Baseline', value: 'baseline' },\r\n { label: 'Volume Candles', value: 'volumeCandles' },\r\n { label: 'Equivolume', value: 'equivolume' },\r\n { label: 'HLC Area', value: 'hlcArea' },\r\n { label: 'Step Line', value: 'stepLine' },\r\n { label: 'Line + Markers', value: 'lineWithMarkers' },\r\n];\r\n\r\nexport const DRAWING_TOOL_GROUPS: DrawingToolGroupDef[] = [\r\n {\r\n label: 'Lines',\r\n tools: [\r\n { label: 'Trend Line', value: 'trendLine' as DrawingToolType },\r\n { label: 'Ray', value: 'ray' as DrawingToolType },\r\n { label: 'Extended Line', value: 'extendedLine' as DrawingToolType },\r\n ],\r\n },\r\n {\r\n label: 'Horizontal/Vertical',\r\n tools: [\r\n { label: 'Horizontal Line', value: 'horizontalLine' as DrawingToolType },\r\n { label: 'Vertical Line', value: 'verticalLine' as DrawingToolType },\r\n ],\r\n },\r\n {\r\n label: 'Channels',\r\n tools: [\r\n { label: 'Parallel Channel', value: 'parallelChannel' as DrawingToolType },\r\n { label: 'Regression Channel', value: 'regressionChannel' as DrawingToolType },\r\n ],\r\n },\r\n {\r\n label: 'Fibonacci',\r\n tools: [\r\n { label: 'Fib Retracement', value: 'fibRetracement' as DrawingToolType },\r\n { label: 'Fib Extension', value: 'fibExtension' as DrawingToolType },\r\n ],\r\n },\r\n {\r\n label: 'Shapes',\r\n tools: [\r\n { label: 'Rectangle', value: 'rectangle' as DrawingToolType },\r\n { label: 'Ellipse', value: 'ellipse' as DrawingToolType },\r\n { label: 'Triangle', value: 'triangle' as DrawingToolType },\r\n ],\r\n },\r\n {\r\n label: 'Gann & Advanced',\r\n tools: [\r\n { label: 'Pitchfork', value: 'pitchfork' as DrawingToolType },\r\n { label: 'Gann Fan', value: 'gannFan' as DrawingToolType },\r\n { label: 'Gann Box', value: 'gannBox' as DrawingToolType },\r\n { label: 'Elliott Wave', value: 'elliottWave' as DrawingToolType },\r\n ],\r\n },\r\n {\r\n label: 'Measure',\r\n tools: [\r\n { label: 'Price Range', value: 'priceRange' as DrawingToolType },\r\n { label: 'Date Range', value: 'dateRange' as DrawingToolType },\r\n { label: 'Measure', value: 'measure' as DrawingToolType },\r\n ],\r\n },\r\n {\r\n label: 'Annotation',\r\n tools: [\r\n { label: 'Text', value: 'text' as DrawingToolType },\r\n { label: 'Arrow', value: 'arrow' as DrawingToolType },\r\n ],\r\n },\r\n];\r\n\r\nexport const INDICATORS: IndicatorDef[] = [\r\n { id: 'sma', name: 'SMA', type: 'overlay' },\r\n { id: 'ema', name: 'EMA', type: 'overlay' },\r\n { id: 'hma', name: 'Hull MA', type: 'overlay' },\r\n { id: 'bb', name: 'Bollinger Bands', type: 'overlay' },\r\n { id: 'vwap', name: 'VWAP', type: 'overlay' },\r\n { id: 'avwap', name: 'Anchored VWAP', type: 'overlay' },\r\n { id: 'ichimoku', name: 'Ichimoku Cloud', type: 'overlay' },\r\n { id: 'psar', name: 'Parabolic SAR', type: 'overlay' },\r\n { id: 'supertrend', name: 'Supertrend', type: 'overlay' },\r\n { id: 'keltner', name: 'Keltner Channel', type: 'overlay' },\r\n { id: 'donchian', name: 'Donchian Channel', type: 'overlay' },\r\n { id: 'pivots', name: 'Pivot Points', type: 'overlay' },\r\n { id: 'zigzag', name: 'ZigZag', type: 'overlay' },\r\n { id: 'lrc', name: 'Linear Regression Channel', type: 'overlay' },\r\n { id: 'rsi', name: 'RSI', type: 'panel' },\r\n { id: 'macd', name: 'MACD', type: 'panel' },\r\n { id: 'stochastic', name: 'Stochastic', type: 'panel' },\r\n { id: 'atr', name: 'ATR', type: 'panel' },\r\n { id: 'adx', name: 'ADX', type: 'panel' },\r\n { id: 'obv', name: 'OBV', type: 'panel' },\r\n { id: 'williamsR', name: 'Williams %R', type: 'panel' },\r\n { id: 'cci', name: 'CCI', type: 'panel' },\r\n { id: 'mfi', name: 'MFI', type: 'panel' },\r\n { id: 'roc', name: 'ROC', type: 'panel' },\r\n { id: 'tsi', name: 'TSI', type: 'panel' },\r\n { id: 'cmf', name: 'CMF', type: 'panel' },\r\n { id: 'aroon', name: 'Aroon', type: 'panel' },\r\n { id: 'stddev', name: 'Std Deviation', type: 'panel' },\r\n { id: 'vroc', name: 'Volume ROC', type: 'panel' },\r\n { id: 'ad', name: 'Acc/Dist', type: 'panel' },\r\n { id: 'ao', name: 'Awesome Oscillator', type: 'panel' },\r\n { id: 'chaikinOsc', name: 'Chaikin Oscillator', type: 'panel' },\r\n { id: 'volumeProfile', name: 'Volume Profile', type: 'panel' },\r\n];\r\n\r\nexport const POPULAR_INDICATORS = [\r\n 'sma', 'ema', 'bb', 'rsi', 'macd', 'stochastic',\r\n 'vwap', 'atr', 'obv', 'ichimoku',\r\n];\r\n\r\nexport const DEFAULT_SYMBOLS = [\r\n 'BTCUSDT', 'ETHUSDT', 'SOLUSDT', 'BNBUSDT',\r\n];\r\n\r\nexport const DEFAULT_SETTINGS: ChartSettingsState = {\r\n candleUpColor: '#26A69A',\r\n candleDownColor: '#EF5350',\r\n candleUpWick: '#26A69A',\r\n candleDownWick: '#EF5350',\r\n backgroundColor: '#131722',\r\n gridColor: '#1E222D',\r\n gridVisible: true,\r\n volumeVisible: true,\r\n legendVisible: true,\r\n barCountdown: true,\r\n logScale: false,\r\n autoScale: true,\r\n crosshairMode: 'magnet',\r\n numberLocale: 'en-US',\r\n};\r\n","import widgetCss from './WidgetStyles.css?raw';\r\n\r\nlet refCount = 0;\r\nconst STYLE_ID = 'tcw-styles';\r\n\r\n/**\r\n * Inject the widget stylesheet into `document.head`. Reference-counted so\r\n * multiple `ChartWidget` instances share the same `<style>` tag and the last\r\n * to detach removes it. CSS lives in a sibling `.css` file and is inlined at\r\n * build time via Vite's `?raw` query — consumers see a plain string at runtime.\r\n */\r\nexport function injectWidgetStyles(): void {\r\n refCount++;\r\n if (refCount > 1) return;\r\n if (document.getElementById(STYLE_ID)) return;\r\n\r\n const style = document.createElement('style');\r\n style.id = STYLE_ID;\r\n style.textContent = widgetCss;\r\n document.head.appendChild(style);\r\n}\r\n\r\nexport function removeWidgetStyles(): void {\r\n refCount--;\r\n if (refCount > 0) return;\r\n\r\n const style = document.getElementById(STYLE_ID);\r\n if (style) {\r\n style.remove();\r\n }\r\n}\r\n","const ICON_PATHS: Record<string, string> = {\n cursor: '<path d=\"M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z\"/><path d=\"M13 13l6 6\"/>',\n trendingUp: '<polyline points=\"22 7 13.5 15.5 8.5 10.5 2 17\"/><polyline points=\"16 7 22 7 22 13\"/>',\n minus: '<path d=\"M5 12h14\"/>',\n penLine: '<path d=\"M12 20h9\"/><path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\"/>',\n hash: '<line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"9\"/><line x1=\"4\" y1=\"15\" x2=\"20\" y2=\"15\"/><line x1=\"10\" y1=\"3\" x2=\"8\" y2=\"21\"/><line x1=\"16\" y1=\"3\" x2=\"14\" y2=\"21\"/>',\n square: '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/>',\n gitBranch: '<line x1=\"6\" y1=\"3\" x2=\"6\" y2=\"15\"/><circle cx=\"18\" cy=\"6\" r=\"3\"/><circle cx=\"6\" cy=\"18\" r=\"3\"/><path d=\"M18 9a9 9 0 0 1-9 9\"/>',\n ruler: '<path d=\"M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z\"/><path d=\"m14.5 12.5 2-2\"/><path d=\"m11.5 9.5 2-2\"/><path d=\"m8.5 6.5 2-2\"/><path d=\"m17.5 15.5 2-2\"/>',\n type: '<polyline points=\"4 7 4 4 20 4 20 7\"/><line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\"/><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"/>',\n magnet: '<path d=\"m6 15-4-4 6.75-6.77a7.79 7.79 0 0 1 11 11L13 22l-4-4 6.39-6.36a2.14 2.14 0 0 0-3-3L6 15\"/><path d=\"m5 8 4 4\"/><path d=\"m12 15 4 4\"/>',\n undo: '<path d=\"M3 7v6h6\"/><path d=\"M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13\"/>',\n redo: '<path d=\"M21 7v6h-6\"/><path d=\"M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3L21 13\"/>',\n trash: '<path d=\"M3 6h18\"/><path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\"/><path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\"/><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"/><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"/>',\n camera: '<path d=\"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z\"/><circle cx=\"12\" cy=\"13\" r=\"3\"/>',\n settings: '<path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\n moon: '<path d=\"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\"/>',\n sun: '<circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2\"/><path d=\"M12 20v2\"/><path d=\"m4.93 4.93 1.41 1.41\"/><path d=\"m17.66 17.66 1.41 1.41\"/><path d=\"M2 12h2\"/><path d=\"M20 12h2\"/><path d=\"m6.34 17.66-1.41 1.41\"/><path d=\"m19.07 4.93-1.41 1.41\"/>',\n chevronDown: '<path d=\"m6 9 6 6 6-6\"/>',\n chevronUp: '<path d=\"m18 15-6-6-6 6\"/>',\n barChart: '<line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"10\"/><line x1=\"18\" y1=\"20\" x2=\"18\" y2=\"4\"/><line x1=\"6\" y1=\"20\" x2=\"6\" y2=\"16\"/>',\n x: '<path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/>',\n play: '<polygon points=\"6 3 20 12 6 21 6 3\"/>',\n pause: '<rect width=\"4\" height=\"16\" x=\"6\" y=\"4\"/><rect width=\"4\" height=\"16\" x=\"14\" y=\"4\"/>',\n stop: '<rect width=\"14\" height=\"14\" x=\"5\" y=\"5\" rx=\"1\"/>',\n receipt: '<path d=\"M4 2v20l2-1 2 1 2-1 2 1 2-1 2 1 2-1 2 1V2l-2 1-2-1-2 1-2-1-2 1-2-1-2 1Z\"/><path d=\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\"/><path d=\"M12 17.5v-11\"/>',\n};\n\nexport function createIcon(name: string, size = 14): string {\n const paths = ICON_PATHS[name];\n if (!paths) return '';\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${paths}</svg>`;\n}\n","export class WidgetDropdown {\n private trigger: HTMLElement;\n private panel: HTMLDivElement;\n private _isOpen = false;\n private onOutsideClick: (e: MouseEvent) => void;\n private onEscapeKey: (e: KeyboardEvent) => void;\n private onTriggerClick: () => void;\n\n constructor(trigger: HTMLElement, config: { width?: string; align?: 'left' | 'right' } = {}) {\n this.trigger = trigger;\n\n this.panel = document.createElement('div');\n this.panel.className = 'tcw-dropdown';\n this.panel.style.width = config.width ?? '200px';\n if (config.align === 'right') {\n this.panel.style.right = '0';\n } else {\n this.panel.style.left = '0';\n }\n this.panel.style.display = 'none';\n\n // Position relative to trigger\n trigger.style.position = 'relative';\n trigger.appendChild(this.panel);\n\n this.onTriggerClick = () => {\n if (this._isOpen) {\n this.close();\n } else {\n this.open();\n }\n };\n\n this.onOutsideClick = (e: MouseEvent) => {\n if (!this.trigger.contains(e.target as Node)) {\n this.close();\n }\n };\n\n this.onEscapeKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.close();\n }\n };\n\n trigger.addEventListener('click', this.onTriggerClick);\n }\n\n setContent(html: string): void {\n this.panel.innerHTML = html;\n }\n\n open(): void {\n if (this._isOpen) return;\n this._isOpen = true;\n this.panel.style.display = '';\n document.addEventListener('mousedown', this.onOutsideClick);\n document.addEventListener('keydown', this.onEscapeKey);\n }\n\n close(): void {\n if (!this._isOpen) return;\n this._isOpen = false;\n this.panel.style.display = 'none';\n document.removeEventListener('mousedown', this.onOutsideClick);\n document.removeEventListener('keydown', this.onEscapeKey);\n }\n\n isOpen(): boolean {\n return this._isOpen;\n }\n\n destroy(): void {\n this.trigger.removeEventListener('click', this.onTriggerClick);\n document.removeEventListener('mousedown', this.onOutsideClick);\n document.removeEventListener('keydown', this.onEscapeKey);\n this.panel.remove();\n }\n}\n","import type { ChartType } from '@tradecanvas/commons';\nimport type { ToolbarConfig, ToolbarCallbacks, WidgetState, ActiveIndicator } from './types.js';\nimport { createIcon } from './icons.js';\nimport { WidgetDropdown } from './WidgetDropdown.js';\n\nexport class WidgetToolbar {\n private config: ToolbarConfig;\n private callbacks: ToolbarCallbacks;\n private el: HTMLDivElement;\n private chartTypeDropdown: WidgetDropdown | null = null;\n private indicatorDropdown: WidgetDropdown | null = null;\n private tfButtons: HTMLButtonElement[] = [];\n private chipsContainer: HTMLDivElement | null = null;\n private themeBtn: HTMLButtonElement | null = null;\n\n constructor(host: HTMLElement, config: ToolbarConfig, callbacks: ToolbarCallbacks) {\n this.config = config;\n this.callbacks = callbacks;\n this.el = document.createElement('div');\n this.el.className = 'tcw-toolbar';\n this.build();\n host.appendChild(this.el);\n }\n\n private build(): void {\n const { config, callbacks, el } = this;\n\n // Symbol button\n const symbolBtn = document.createElement('button');\n symbolBtn.className = 'tcw-toolbar-symbol';\n symbolBtn.dataset.role = 'symbol';\n symbolBtn.addEventListener('click', callbacks.onSymbolClick);\n el.appendChild(symbolBtn);\n el.appendChild(this.sep());\n\n // Timeframes\n const tfGroup = document.createElement('div');\n tfGroup.className = 'tcw-toolbar-group';\n for (const tf of config.timeframes) {\n const btn = document.createElement('button');\n btn.className = 'tcw-btn';\n btn.textContent = tf.label;\n btn.dataset.tf = tf.value;\n btn.addEventListener('click', () => callbacks.onTimeframe(tf.value));\n tfGroup.appendChild(btn);\n this.tfButtons.push(btn);\n }\n el.appendChild(tfGroup);\n el.appendChild(this.sep());\n\n // Chart type dropdown\n const ctWrap = document.createElement('div');\n ctWrap.style.position = 'relative';\n ctWrap.style.display = 'inline-flex';\n\n const ctTrigger = document.createElement('button');\n ctTrigger.className = 'tcw-dropdown-trigger';\n ctTrigger.dataset.role = 'charttype';\n ctWrap.appendChild(ctTrigger);\n el.appendChild(ctWrap);\n\n this.chartTypeDropdown = new WidgetDropdown(ctWrap, { width: '160px' });\n this.buildChartTypeMenu();\n\n el.appendChild(this.sep());\n\n // Indicators dropdown\n const indWrap = document.createElement('div');\n indWrap.style.position = 'relative';\n indWrap.style.display = 'inline-flex';\n\n const indTrigger = document.createElement('button');\n indTrigger.className = 'tcw-dropdown-trigger';\n indTrigger.dataset.role = 'indicators';\n indWrap.appendChild(indTrigger);\n el.appendChild(indWrap);\n\n this.indicatorDropdown = new WidgetDropdown(indWrap, { width: '280px' });\n this.buildIndicatorMenu();\n\n // Indicator chips\n this.chipsContainer = document.createElement('div');\n this.chipsContainer.className = 'tcw-indicator-chips';\n el.appendChild(this.chipsContainer);\n\n // Spacer\n el.appendChild(this.spacer());\n\n // Right side buttons\n const screenshotBtn = this.iconBtn('camera', 'Screenshot', callbacks.onScreenshot);\n el.appendChild(screenshotBtn);\n\n const settingsBtn = this.iconBtn('settings', 'Chart Settings', callbacks.onSettings);\n el.appendChild(settingsBtn);\n\n this.themeBtn = this.iconBtn('moon', 'Toggle theme', callbacks.onToggleTheme);\n this.themeBtn.dataset.role = 'theme';\n el.appendChild(this.themeBtn);\n }\n\n private buildChartTypeMenu(): void {\n if (!this.chartTypeDropdown) return;\n const items = this.config.chartTypes.map(ct =>\n `<button class=\"tcw-dropdown-item\" data-ct=\"${ct.value}\">${ct.label}</button>`\n ).join('');\n this.chartTypeDropdown.setContent(items);\n\n // Attach events to items after content set\n const panel = this.chartTypeDropdown['panel'] as HTMLDivElement;\n panel.querySelectorAll('.tcw-dropdown-item').forEach((btn) => {\n btn.addEventListener('click', (e) => {\n const value = (e.currentTarget as HTMLElement).dataset.ct as ChartType;\n this.callbacks.onChartType(value);\n this.chartTypeDropdown?.close();\n });\n });\n }\n\n private buildIndicatorMenu(): void {\n if (!this.indicatorDropdown) return;\n const { indicators, popularIndicatorIds } = this.config;\n\n const popular = indicators.filter(d => popularIndicatorIds.includes(d.id));\n const other = indicators.filter(d => !popularIndicatorIds.includes(d.id));\n\n let html = '<div class=\"tcw-dropdown-label\">Popular</div>';\n for (const ind of popular) {\n html += `<button class=\"tcw-dropdown-item\" data-ind=\"${ind.id}\"><span>${ind.name}</span><span class=\"tcw-tag\">${ind.type}</span></button>`;\n }\n html += '<div class=\"tcw-dropdown-divider\"></div>';\n html += '<div class=\"tcw-dropdown-label\">All</div>';\n for (const ind of other) {\n html += `<button class=\"tcw-dropdown-item\" data-ind=\"${ind.id}\"><span>${ind.name}</span><span class=\"tcw-tag\">${ind.type}</span></button>`;\n }\n\n this.indicatorDropdown.setContent(html);\n\n const panel = this.indicatorDropdown['panel'] as HTMLDivElement;\n panel.querySelectorAll('.tcw-dropdown-item[data-ind]').forEach((btn) => {\n btn.addEventListener('click', (e) => {\n const id = (e.currentTarget as HTMLElement).dataset.ind!;\n this.callbacks.onAddIndicator(id);\n });\n });\n }\n\n update(state: WidgetState): void {\n // Symbol\n const symbolBtn = this.el.querySelector('[data-role=\"symbol\"]') as HTMLButtonElement | null;\n if (symbolBtn) symbolBtn.textContent = state.symbol;\n\n // Timeframe buttons\n for (const btn of this.tfButtons) {\n btn.classList.toggle('tcw-active', btn.dataset.tf === state.timeframe);\n }\n\n // Chart type trigger label\n const ctTrigger = this.el.querySelector('[data-role=\"charttype\"]') as HTMLElement | null;\n if (ctTrigger) {\n const label = this.config.chartTypes.find(t => t.value === state.chartType)?.label ?? 'Candles';\n ctTrigger.innerHTML = `${createIcon('barChart', 14)} ${label} ${createIcon('chevronDown', 12)}`;\n }\n\n // Indicator trigger + badge\n const indTrigger = this.el.querySelector('[data-role=\"indicators\"]') as HTMLElement | null;\n if (indTrigger) {\n const count = state.activeIndicators.size;\n let inner = `${createIcon('trendingUp', 14)} Indicators`;\n if (count > 0) {\n inner += ` <span class=\"tcw-badge-count\">${count}</span>`;\n }\n indTrigger.innerHTML = inner;\n }\n\n // Chips\n if (this.chipsContainer) {\n const activeList = this.getActiveIndicatorList(state);\n this.chipsContainer.innerHTML = '';\n for (const ind of activeList) {\n const chip = document.createElement('div');\n chip.className = 'tcw-indicator-chip';\n\n const label = document.createElement('span');\n label.textContent = ind.label;\n chip.appendChild(label);\n\n const removeBtn = document.createElement('button');\n removeBtn.className = 'tcw-chip-remove';\n removeBtn.innerHTML = createIcon('x', 10);\n removeBtn.addEventListener('click', () => this.callbacks.onRemoveIndicator(ind.instanceId));\n chip.appendChild(removeBtn);\n\n this.chipsContainer.appendChild(chip);\n }\n }\n\n // Theme toggle icon\n if (this.themeBtn) {\n this.themeBtn.innerHTML = state.isDark ? createIcon('moon', 14) : createIcon('sun', 14);\n }\n }\n\n private getActiveIndicatorList(state: WidgetState): ActiveIndicator[] {\n const result: ActiveIndicator[] = [];\n for (const [id, instanceId] of state.activeIndicators.entries()) {\n result.push({ instanceId, id, label: id.toUpperCase() });\n }\n return result;\n }\n\n private sep(): HTMLSpanElement {\n const s = document.createElement('span');\n s.className = 'tcw-toolbar-sep';\n return s;\n }\n\n private spacer(): HTMLSpanElement {\n const s = document.createElement('span');\n s.className = 'tcw-toolbar-spacer';\n return s;\n }\n\n private iconBtn(icon: string, title: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = 'tcw-btn-icon';\n btn.title = title;\n btn.innerHTML = createIcon(icon, 14);\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n destroy(): void {\n this.chartTypeDropdown?.destroy();\n this.indicatorDropdown?.destroy();\n this.el.remove();\n }\n}\n","import type { SidebarConfig, SidebarCallbacks, WidgetState } from './types.js';\nimport { createIcon } from './icons.js';\n\nconst GROUP_ICONS = [\n 'trendingUp', 'minus', 'penLine', 'hash', 'square', 'gitBranch', 'ruler', 'type',\n];\n\nexport class WidgetDrawingSidebar {\n private config: SidebarConfig;\n private callbacks: SidebarCallbacks;\n private el: HTMLDivElement;\n private groupWraps: HTMLDivElement[] = [];\n private groupButtons: HTMLButtonElement[] = [];\n private cursorBtn: HTMLButtonElement | null = null;\n private magnetBtn: HTMLButtonElement | null = null;\n private flyoutEl: HTMLDivElement | null = null;\n\n constructor(host: HTMLElement, config: SidebarConfig, callbacks: SidebarCallbacks) {\n this.config = config;\n this.callbacks = callbacks;\n this.el = document.createElement('div');\n this.el.className = 'tcw-sidebar';\n this.build();\n host.appendChild(this.el);\n }\n\n private build(): void {\n const { config, callbacks, el } = this;\n\n // Cursor button\n this.cursorBtn = document.createElement('button');\n this.cursorBtn.className = 'tcw-sidebar-btn';\n this.cursorBtn.title = 'Cursor';\n this.cursorBtn.innerHTML = createIcon('cursor', 14);\n this.cursorBtn.addEventListener('click', callbacks.onCancelDrawing);\n el.appendChild(this.cursorBtn);\n\n el.appendChild(this.divider());\n\n // Tool groups\n config.drawingToolGroups.forEach((group, idx) => {\n const wrap = document.createElement('div');\n wrap.className = 'tcw-tool-group-wrap';\n\n const btn = document.createElement('button');\n btn.className = 'tcw-sidebar-btn';\n btn.title = group.label;\n btn.innerHTML = createIcon(GROUP_ICONS[idx] ?? 'square', 14);\n\n if (group.tools.length > 1) {\n const dot = document.createElement('span');\n dot.className = 'tcw-multi-dot';\n btn.appendChild(dot);\n }\n\n btn.addEventListener('click', () => callbacks.onDrawingTool(group.tools[0].value));\n wrap.appendChild(btn);\n\n // Flyout events via JS (not CSS hover)\n wrap.addEventListener('mouseenter', () => this.showFlyout(idx));\n wrap.addEventListener('mouseleave', () => this.hideFlyout());\n\n el.appendChild(wrap);\n this.groupWraps.push(wrap);\n this.groupButtons.push(btn);\n });\n\n // Spacer\n const spacer = document.createElement('div');\n spacer.className = 'tcw-sidebar-spacer';\n el.appendChild(spacer);\n\n el.appendChild(this.divider());\n\n // Bottom tools\n this.magnetBtn = document.createElement('button');\n this.magnetBtn.className = 'tcw-sidebar-btn';\n this.magnetBtn.title = 'Magnet';\n this.magnetBtn.innerHTML = createIcon('magnet', 14);\n this.magnetBtn.addEventListener('click', callbacks.onToggleMagnet);\n el.appendChild(this.magnetBtn);\n\n const undoBtn = document.createElement('button');\n undoBtn.className = 'tcw-sidebar-btn';\n undoBtn.title = 'Undo';\n undoBtn.innerHTML = createIcon('undo', 14);\n undoBtn.addEventListener('click', callbacks.onUndo);\n el.appendChild(undoBtn);\n\n const redoBtn = document.createElement('button');\n redoBtn.className = 'tcw-sidebar-btn';\n redoBtn.title = 'Redo';\n redoBtn.innerHTML = createIcon('redo', 14);\n redoBtn.addEventListener('click', callbacks.onRedo);\n el.appendChild(redoBtn);\n\n const clearBtn = document.createElement('button');\n clearBtn.className = 'tcw-sidebar-btn tcw-danger';\n clearBtn.title = 'Clear all';\n clearBtn.innerHTML = createIcon('trash', 14);\n clearBtn.addEventListener('click', callbacks.onClearDrawings);\n el.appendChild(clearBtn);\n }\n\n private showFlyout(idx: number): void {\n const group = this.config.drawingToolGroups[idx];\n if (!group || group.tools.length <= 1) return;\n\n this.hideFlyout();\n\n const flyout = document.createElement('div');\n flyout.className = 'tcw-flyout';\n\n const header = document.createElement('div');\n header.className = 'tcw-flyout-header';\n header.textContent = group.label;\n flyout.appendChild(header);\n\n for (const tool of group.tools) {\n const item = document.createElement('button');\n item.className = 'tcw-flyout-item';\n item.textContent = tool.label;\n item.dataset.toolValue = tool.value;\n item.addEventListener('click', () => {\n this.callbacks.onDrawingTool(tool.value);\n this.hideFlyout();\n });\n flyout.appendChild(item);\n }\n\n this.flyoutEl = flyout;\n this.groupWraps[idx].appendChild(flyout);\n }\n\n private hideFlyout(): void {\n if (this.flyoutEl) {\n this.flyoutEl.remove();\n this.flyoutEl = null;\n }\n }\n\n update(state: WidgetState): void {\n // Cursor active\n if (this.cursorBtn) {\n this.cursorBtn.classList.toggle('tcw-active', state.activeTool === null);\n }\n\n // Group buttons\n const { drawingToolGroups } = this.config;\n for (let i = 0; i < drawingToolGroups.length; i++) {\n const isActive = drawingToolGroups[i].tools.some(t => t.value === state.activeTool);\n this.groupButtons[i].classList.toggle('tcw-active', isActive);\n }\n\n // Flyout items\n if (this.flyoutEl) {\n this.flyoutEl.querySelectorAll('.tcw-flyout-item').forEach((item) => {\n const el = item as HTMLElement;\n el.classList.toggle('tcw-active', el.dataset.toolValue === state.activeTool);\n });\n }\n\n // Magnet\n if (this.magnetBtn) {\n this.magnetBtn.classList.toggle('tcw-active', state.magnetEnabled);\n this.magnetBtn.title = state.magnetEnabled ? 'Magnet ON' : 'Magnet OFF';\n }\n }\n\n private divider(): HTMLDivElement {\n const d = document.createElement('div');\n d.className = 'tcw-sidebar-divider';\n return d;\n }\n\n destroy(): void {\n this.hideFlyout();\n this.el.remove();\n }\n}\n","import type { ChartSettingsState, SettingsCallbacks } from './types.js';\nimport { createIcon } from './icons.js';\n\ntype Tab = 'style' | 'display' | 'scale';\nconst TABS: Tab[] = ['style', 'display', 'scale'];\n\nexport class WidgetSettings {\n private callbacks: SettingsCallbacks;\n private backdrop: HTMLDivElement | null = null;\n private modal: HTMLDivElement | null = null;\n private currentTab: Tab = 'style';\n private currentSettings: ChartSettingsState | null = null;\n private bodyEl: HTMLDivElement | null = null;\n private tabButtons: HTMLButtonElement[] = [];\n\n constructor(callbacks: SettingsCallbacks) {\n this.callbacks = callbacks;\n }\n\n open(currentSettings: ChartSettingsState): void {\n this.currentSettings = { ...currentSettings };\n this.currentTab = 'style';\n this.buildModal();\n }\n\n close(): void {\n this.backdrop?.remove();\n this.modal?.remove();\n this.backdrop = null;\n this.modal = null;\n this.bodyEl = null;\n this.tabButtons = [];\n }\n\n private buildModal(): void {\n // Backdrop\n this.backdrop = document.createElement('div');\n this.backdrop.className = 'tcw-modal-backdrop';\n this.backdrop.addEventListener('click', () => {\n this.callbacks.onClose();\n this.close();\n });\n document.body.appendChild(this.backdrop);\n\n // Modal\n this.modal = document.createElement('div');\n this.modal.className = 'tcw-modal';\n\n // Header\n const header = document.createElement('div');\n header.className = 'tcw-modal-header';\n const h3 = document.createElement('h3');\n h3.textContent = 'Chart Settings';\n header.appendChild(h3);\n const closeBtn = document.createElement('button');\n closeBtn.className = 'tcw-modal-close';\n closeBtn.innerHTML = createIcon('x', 16);\n closeBtn.addEventListener('click', () => {\n this.callbacks.onClose();\n this.close();\n });\n header.appendChild(closeBtn);\n this.modal.appendChild(header);\n\n // Tabs\n const tabsEl = document.createElement('div');\n tabsEl.className = 'tcw-modal-tabs';\n this.tabButtons = [];\n for (const tab of TABS) {\n const btn = document.createElement('button');\n btn.className = 'tcw-modal-tab';\n btn.textContent = tab;\n btn.dataset.tab = tab;\n if (tab === this.currentTab) btn.classList.add('tcw-active');\n btn.addEventListener('click', () => {\n this.currentTab = tab;\n this.tabButtons.forEach(b => b.classList.toggle('tcw-active', b.dataset.tab === tab));\n this.renderTabContent();\n });\n tabsEl.appendChild(btn);\n this.tabButtons.push(btn);\n }\n this.modal.appendChild(tabsEl);\n\n // Body\n this.bodyEl = document.createElement('div');\n this.bodyEl.className = 'tcw-modal-body';\n this.modal.appendChild(this.bodyEl);\n this.renderTabContent();\n\n // Footer\n const footer = document.createElement('div');\n footer.className = 'tcw-modal-footer';\n const resetBtn = document.createElement('button');\n resetBtn.className = 'tcw-reset-link';\n resetBtn.textContent = 'Reset to defaults';\n resetBtn.addEventListener('click', () => this.callbacks.onReset());\n footer.appendChild(resetBtn);\n const doneBtn = document.createElement('button');\n doneBtn.className = 'tcw-done-btn';\n doneBtn.textContent = 'Done';\n doneBtn.addEventListener('click', () => {\n this.callbacks.onClose();\n this.close();\n });\n footer.appendChild(doneBtn);\n this.modal.appendChild(footer);\n\n document.body.appendChild(this.modal);\n\n // Escape key\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n document.removeEventListener('keydown', onKeyDown);\n this.callbacks.onClose();\n this.close();\n }\n };\n document.addEventListener('keydown', onKeyDown);\n }\n\n private renderTabContent(): void {\n if (!this.bodyEl || !this.currentSettings) return;\n this.bodyEl.innerHTML = '';\n\n switch (this.currentTab) {\n case 'style':\n this.renderStyleTab();\n break;\n case 'display':\n this.renderDisplayTab();\n break;\n case 'scale':\n this.renderScaleTab();\n break;\n }\n }\n\n private renderStyleTab(): void {\n if (!this.bodyEl || !this.currentSettings) return;\n const s = this.currentSettings;\n\n // Candle Colors\n const candleSection = this.section('Candle Colors');\n candleSection.appendChild(this.colorRow('Up Body', s.candleUpColor, (v) => this.patch({ candleUpColor: v })));\n candleSection.appendChild(this.colorRow('Down Body', s.candleDownColor, (v) => this.patch({ candleDownColor: v })));\n candleSection.appendChild(this.colorRow('Up Wick', s.candleUpWick, (v) => this.patch({ candleUpWick: v })));\n candleSection.appendChild(this.colorRow('Down Wick', s.candleDownWick, (v) => this.patch({ candleDownWick: v })));\n this.bodyEl.appendChild(candleSection);\n\n // Background\n const bgSection = this.section('Background');\n bgSection.appendChild(this.colorRow('Background', s.backgroundColor, (v) => this.patch({ backgroundColor: v })));\n bgSection.appendChild(this.colorRow('Grid', s.gridColor, (v) => this.patch({ gridColor: v })));\n this.bodyEl.appendChild(bgSection);\n }\n\n private renderDisplayTab(): void {\n if (!this.bodyEl || !this.currentSettings) return;\n const s = this.currentSettings;\n\n const section = this.section();\n section.appendChild(this.toggleRow('Grid Lines', s.gridVisible, (v) => this.patch({ gridVisible: v })));\n section.appendChild(this.toggleRow('Volume', s.volumeVisible, (v) => this.patch({ volumeVisible: v })));\n section.appendChild(this.toggleRow('OHLC Legend', s.legendVisible, (v) => this.patch({ legendVisible: v })));\n section.appendChild(this.toggleRow('Bar Countdown', s.barCountdown, (v) => this.patch({ barCountdown: v })));\n\n // Crosshair mode\n section.appendChild(this.selectRow('Crosshair Mode', s.crosshairMode, [\n { label: 'Magnet', value: 'magnet' },\n { label: 'Normal', value: 'normal' },\n { label: 'Hidden', value: 'hidden' },\n ], (v) => this.patch({ crosshairMode: v as ChartSettingsState['crosshairMode'] })));\n\n // Number locale\n section.appendChild(this.selectRow('Number Locale', s.numberLocale, [\n { label: 'en-US (65,234.00)', value: 'en-US' },\n { label: 'de-DE (65.234,00)', value: 'de-DE' },\n { label: 'fr-FR (65 234,00)', value: 'fr-FR' },\n { label: 'vi-VN (65.234,00)', value: 'vi-VN' },\n { label: 'en-IN (65,234.00)', value: 'en-IN' },\n { label: 'ja-JP (65,234.00)', value: 'ja-JP' },\n ], (v) => this.patch({ numberLocale: v })));\n\n this.bodyEl.appendChild(section);\n }\n\n private renderScaleTab(): void {\n if (!this.bodyEl || !this.currentSettings) return;\n const s = this.currentSettings;\n\n const section = this.section();\n section.appendChild(this.toggleRow('Auto Scale', s.autoScale, (v) => this.patch({ autoScale: v })));\n section.appendChild(this.toggleRow('Log Scale', s.logScale, (v) => this.patch({ logScale: v })));\n this.bodyEl.appendChild(section);\n }\n\n private patch(partial: Partial<ChartSettingsState>): void {\n if (this.currentSettings) {\n Object.assign(this.currentSettings, partial);\n }\n this.callbacks.onChange(partial);\n }\n\n private section(title?: string): HTMLDivElement {\n const div = document.createElement('div');\n div.className = 'tcw-settings-section';\n if (title) {\n const t = document.createElement('div');\n t.className = 'tcw-settings-section-title';\n t.textContent = title;\n div.appendChild(t);\n }\n return div;\n }\n\n private colorRow(label: string, value: string, onChange: (v: string) => void): HTMLDivElement {\n const row = document.createElement('div');\n row.className = 'tcw-settings-row';\n\n const lbl = document.createElement('span');\n lbl.className = 'tcw-settings-label';\n lbl.textContent = label;\n row.appendChild(lbl);\n\n const wrap = document.createElement('div');\n wrap.className = 'tcw-color-picker-wrap';\n\n const input = document.createElement('input');\n input.type = 'color';\n input.value = value;\n\n const hex = document.createElement('span');\n hex.className = 'tcw-color-hex';\n hex.textContent = value;\n\n input.addEventListener('input', () => {\n hex.textContent = input.value;\n onChange(input.value);\n });\n\n wrap.appendChild(input);\n wrap.appendChild(hex);\n row.appendChild(wrap);\n return row;\n }\n\n private toggleRow(label: string, value: boolean, onChange: (v: boolean) => void): HTMLDivElement {\n const row = document.createElement('div');\n row.className = 'tcw-settings-row';\n\n const lbl = document.createElement('span');\n lbl.className = 'tcw-settings-label';\n lbl.textContent = label;\n row.appendChild(lbl);\n\n const toggle = document.createElement('button');\n toggle.className = `tcw-toggle${value ? ' tcw-on' : ''}`;\n toggle.addEventListener('click', () => {\n const newVal = !toggle.classList.contains('tcw-on');\n toggle.classList.toggle('tcw-on', newVal);\n onChange(newVal);\n });\n row.appendChild(toggle);\n return row;\n }\n\n private selectRow(\n label: string,\n value: string,\n options: { label: string; value: string }[],\n onChange: (v: string) => void,\n ): HTMLDivElement {\n const row = document.createElement('div');\n row.className = 'tcw-settings-row';\n\n const lbl = document.createElement('span');\n lbl.className = 'tcw-settings-label';\n lbl.textContent = label;\n row.appendChild(lbl);\n\n const select = document.createElement('select');\n select.className = 'tcw-settings-select';\n for (const opt of options) {\n const o = document.createElement('option');\n o.value = opt.value;\n o.textContent = opt.label;\n if (opt.value === value) o.selected = true;\n select.appendChild(o);\n }\n select.addEventListener('change', () => onChange(select.value));\n row.appendChild(select);\n return row;\n }\n\n destroy(): void {\n this.close();\n }\n}\n","export class WidgetStatusBar {\n private el: HTMLDivElement;\n private dotEl: HTMLSpanElement;\n private messageEl: HTMLSpanElement;\n private infoEl: HTMLSpanElement;\n\n constructor(host: HTMLElement) {\n this.el = document.createElement('div');\n this.el.className = 'tcw-statusbar';\n\n const indicator = document.createElement('div');\n indicator.className = 'tcw-status-indicator';\n\n this.dotEl = document.createElement('span');\n this.dotEl.className = 'tcw-status-dot';\n indicator.appendChild(this.dotEl);\n\n this.messageEl = document.createElement('span');\n indicator.appendChild(this.messageEl);\n\n this.el.appendChild(indicator);\n\n this.infoEl = document.createElement('span');\n this.el.appendChild(this.infoEl);\n\n host.appendChild(this.el);\n }\n\n update(state: { connectionState: string; message: string; symbol: string; timeframe: string }): void {\n this.dotEl.className = 'tcw-status-dot';\n if (state.connectionState === 'connected') {\n this.dotEl.classList.add('tcw-connected');\n } else if (state.connectionState === 'error') {\n this.dotEl.classList.add('tcw-error');\n }\n\n this.messageEl.textContent = state.message;\n this.infoEl.textContent = `${state.symbol} ${state.timeframe}`;\n }\n\n destroy(): void {\n this.el.remove();\n }\n}\n","import type { ChartType, DrawingToolType, TimeFrame } from '@tradecanvas/commons';\n\nexport interface CommandItem {\n id: string;\n label: string;\n category: 'indicator' | 'chartType' | 'drawing' | 'timeframe' | 'action';\n shortcut?: string;\n active?: boolean;\n}\n\nexport interface CommandPaletteCallbacks {\n onIndicator: (id: string) => void;\n onChartType: (type: ChartType) => void;\n onDrawingTool: (tool: DrawingToolType) => void;\n onTimeframe: (tf: TimeFrame) => void;\n onAction: (id: string) => void;\n onClose: () => void;\n}\n\nexport class WidgetCommandPalette {\n private backdrop: HTMLDivElement | null = null;\n private modal: HTMLDivElement | null = null;\n private input: HTMLInputElement | null = null;\n private list: HTMLDivElement | null = null;\n private items: CommandItem[] = [];\n private filtered: CommandItem[] = [];\n private selectedIndex = 0;\n private callbacks: CommandPaletteCallbacks;\n private boundKeydown: (e: KeyboardEvent) => void;\n\n constructor(callbacks: CommandPaletteCallbacks) {\n this.callbacks = callbacks;\n this.boundKeydown = this.handleKeydown.bind(this);\n }\n\n open(items: CommandItem[]): void {\n if (this.backdrop) return;\n this.items = items;\n this.filtered = items;\n this.selectedIndex = 0;\n\n this.backdrop = document.createElement('div');\n this.backdrop.className = 'tcw-modal-backdrop';\n this.backdrop.addEventListener('click', () => this.close());\n\n this.modal = document.createElement('div');\n this.modal.className = 'tcw-cmd-palette';\n\n const header = document.createElement('div');\n header.className = 'tcw-cmd-header';\n\n const searchIcon = document.createElement('span');\n searchIcon.className = 'tcw-cmd-icon';\n searchIcon.textContent = '⌕';\n header.appendChild(searchIcon);\n\n this.input = document.createElement('input');\n this.input.className = 'tcw-cmd-input';\n this.input.type = 'text';\n this.input.placeholder = 'Search indicators, chart types, tools...';\n this.input.addEventListener('input', () => this.filter());\n header.appendChild(this.input);\n\n const hint = document.createElement('span');\n hint.className = 'tcw-cmd-hint';\n hint.textContent = 'ESC';\n header.appendChild(hint);\n\n this.modal.appendChild(header);\n\n this.list = document.createElement('div');\n this.list.className = 'tcw-cmd-list';\n this.modal.appendChild(this.list);\n\n const footer = document.createElement('div');\n footer.className = 'tcw-cmd-footer';\n footer.innerHTML = '<span>↑↓ Navigate</span><span>⏎ Select</span><span>Esc Close</span>';\n this.modal.appendChild(footer);\n\n document.body.appendChild(this.backdrop);\n document.body.appendChild(this.modal);\n\n this.renderList();\n this.input.focus();\n document.addEventListener('keydown', this.boundKeydown);\n }\n\n close(): void {\n document.removeEventListener('keydown', this.boundKeydown);\n this.backdrop?.remove();\n this.modal?.remove();\n this.backdrop = null;\n this.modal = null;\n this.input = null;\n this.list = null;\n this.callbacks.onClose();\n }\n\n isOpen(): boolean {\n return this.backdrop !== null;\n }\n\n private filter(): void {\n const query = this.input?.value.toLowerCase().trim() ?? '';\n if (!query) {\n this.filtered = this.items;\n } else {\n this.filtered = this.items.filter(item =>\n item.label.toLowerCase().includes(query) ||\n item.category.toLowerCase().includes(query) ||\n item.id.toLowerCase().includes(query),\n );\n }\n this.selectedIndex = 0;\n this.renderList();\n }\n\n private renderList(): void {\n if (!this.list) return;\n this.list.innerHTML = '';\n\n if (this.filtered.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'tcw-cmd-empty';\n empty.textContent = 'No results found';\n this.list.appendChild(empty);\n return;\n }\n\n let currentCategory = '';\n for (let i = 0; i < this.filtered.length; i++) {\n const item = this.filtered[i];\n\n if (item.category !== currentCategory) {\n currentCategory = item.category;\n const label = document.createElement('div');\n label.className = 'tcw-cmd-category';\n label.textContent = this.categoryLabel(currentCategory);\n this.list.appendChild(label);\n }\n\n const row = document.createElement('button');\n row.className = 'tcw-cmd-item';\n if (i === this.selectedIndex) row.classList.add('tcw-selected');\n if (item.active) row.classList.add('tcw-active');\n row.dataset.index = String(i);\n\n const nameSpan = document.createElement('span');\n nameSpan.className = 'tcw-cmd-item-label';\n nameSpan.textContent = item.label;\n row.appendChild(nameSpan);\n\n if (item.active) {\n const check = document.createElement('span');\n check.className = 'tcw-cmd-check';\n check.textContent = '✓';\n row.appendChild(check);\n }\n\n if (item.shortcut) {\n const kbd = document.createElement('kbd');\n kbd.className = 'tcw-cmd-kbd';\n kbd.textContent = item.shortcut;\n row.appendChild(kbd);\n }\n\n row.addEventListener('click', () => this.select(i));\n row.addEventListener('mouseenter', () => {\n this.selectedIndex = i;\n this.updateSelection();\n });\n\n this.list.appendChild(row);\n }\n }\n\n private updateSelection(): void {\n if (!this.list) return;\n const items = this.list.querySelectorAll('.tcw-cmd-item');\n items.forEach((el, i) => {\n el.classList.toggle('tcw-selected', i === this.selectedIndex);\n });\n items[this.selectedIndex]?.scrollIntoView({ block: 'nearest' });\n }\n\n private select(index: number): void {\n const item = this.filtered[index];\n if (!item) return;\n\n switch (item.category) {\n case 'indicator':\n this.callbacks.onIndicator(item.id);\n break;\n case 'chartType':\n this.callbacks.onChartType(item.id as ChartType);\n break;\n case 'drawing':\n this.callbacks.onDrawingTool(item.id as DrawingToolType);\n break;\n case 'timeframe':\n this.callbacks.onTimeframe(item.id as TimeFrame);\n break;\n case 'action':\n this.callbacks.onAction(item.id);\n break;\n }\n this.close();\n }\n\n private handleKeydown(e: KeyboardEvent): void {\n switch (e.key) {\n case 'Escape':\n e.preventDefault();\n this.close();\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (this.filtered.length > 0) {\n this.selectedIndex = (this.selectedIndex + 1) % this.filtered.length;\n this.updateSelection();\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (this.filtered.length > 0) {\n this.selectedIndex = (this.selectedIndex - 1 + this.filtered.length) % this.filtered.length;\n this.updateSelection();\n }\n break;\n case 'Enter':\n e.preventDefault();\n this.select(this.selectedIndex);\n break;\n }\n }\n\n private categoryLabel(cat: string): string {\n switch (cat) {\n case 'indicator': return 'Indicators';\n case 'chartType': return 'Chart Types';\n case 'drawing': return 'Drawing Tools';\n case 'timeframe': return 'Timeframes';\n case 'action': return 'Actions';\n default: return cat;\n }\n }\n\n destroy(): void {\n this.close();\n }\n}\n","import type { ChartType, DrawingToolType, Theme, TimeFrame } from '@tradecanvas/commons';\nimport { Chart } from '../Chart.js';\nimport { DARK_THEME, LIGHT_THEME } from '@tradecanvas/commons';\nimport type { ChartWidgetOptions, WidgetState, ChartSettingsState } from './types.js';\nimport { TIMEFRAMES, CHART_TYPES, INDICATORS, POPULAR_INDICATORS, DRAWING_TOOL_GROUPS, DEFAULT_SYMBOLS, DEFAULT_SETTINGS } from './widgetConfig.js';\nimport { injectWidgetStyles, removeWidgetStyles } from './WidgetStyles.js';\nimport { WidgetToolbar } from './WidgetToolbar.js';\nimport { WidgetDrawingSidebar } from './WidgetDrawingSidebar.js';\nimport { WidgetSettings } from './WidgetSettings.js';\nimport { WidgetStatusBar } from './WidgetStatusBar.js';\nimport { WidgetCommandPalette } from './WidgetCommandPalette.js';\nimport type { CommandItem } from './WidgetCommandPalette.js';\n\nexport class ChartWidget {\n private chart: Chart;\n private state: WidgetState;\n private toolbar: WidgetToolbar | null = null;\n private sidebar: WidgetDrawingSidebar | null = null;\n private settings: WidgetSettings | null = null;\n private statusBar: WidgetStatusBar | null = null;\n private commandPalette: WidgetCommandPalette | null = null;\n private root: HTMLDivElement;\n private chartContainer: HTMLDivElement;\n private destroyed = false;\n private options: ChartWidgetOptions;\n private symbolIndex = 0;\n private symbols: string[];\n private settingsState: ChartSettingsState;\n private adapter: import('@tradecanvas/commons').DataAdapter | null = null;\n private boundGlobalKeydown: ((e: KeyboardEvent) => void) | null = null;\n\n constructor(container: HTMLElement, options: ChartWidgetOptions = {}) {\n this.options = options;\n this.symbols = options.symbols ?? DEFAULT_SYMBOLS;\n this.settingsState = { ...DEFAULT_SETTINGS };\n\n // Resolve theme\n const isDark = this.resolveIsDark(options.theme);\n const resolvedTheme = this.resolveTheme(options.theme);\n\n // Initialize state\n this.state = {\n symbol: options.symbol ?? this.symbols[0] ?? 'BTCUSDT',\n timeframe: options.timeframe ?? '5m',\n chartType: options.chartOptions?.chartType ?? 'candlestick',\n isDark,\n activeIndicators: new Map(),\n activeTool: null,\n magnetEnabled: true,\n connectionState: 'connecting',\n connectionMessage: 'Connecting...',\n };\n\n // Set symbol index\n const sIdx = this.symbols.indexOf(this.state.symbol);\n if (sIdx >= 0) this.symbolIndex = sIdx;\n\n // 1. Inject styles\n injectWidgetStyles();\n\n // 2. Create DOM skeleton\n this.root = document.createElement('div');\n this.root.className = 'tcw-root';\n this.root.dataset.tcwTheme = isDark ? 'dark' : 'light';\n container.appendChild(this.root);\n\n // 3. Create toolbar\n if (options.toolbar !== false) {\n this.toolbar = new WidgetToolbar(\n this.root,\n {\n symbols: this.symbols,\n timeframes: options.timeframes\n ? TIMEFRAMES.filter(tf => (options.timeframes as TimeFrame[]).includes(tf.value))\n : TIMEFRAMES,\n chartTypes: options.chartTypes\n ? CHART_TYPES.filter(ct => (options.chartTypes as ChartType[]).includes(ct.value))\n : CHART_TYPES,\n indicators: INDICATORS,\n popularIndicatorIds: POPULAR_INDICATORS,\n },\n {\n onSymbolClick: () => this.handleSymbolClick(),\n onTimeframe: (tf) => this.handleTimeframe(tf),\n onChartType: (type) => this.handleChartType(type),\n onAddIndicator: (id) => this.handleAddIndicator(id),\n onRemoveIndicator: (iid) => this.handleRemoveIndicator(iid),\n onScreenshot: () => this.chart.screenshot(),\n onSettings: () => this.openSettings(),\n onToggleTheme: () => this.handleToggleTheme(),\n },\n );\n }\n\n // 4. Create body\n const body = document.createElement('div');\n body.className = 'tcw-body';\n\n if (options.drawingTools !== false) {\n this.sidebar = new WidgetDrawingSidebar(\n body,\n { drawingToolGroups: DRAWING_TOOL_GROUPS },\n {\n onDrawingTool: (tool) => this.handleDrawingTool(tool),\n onCancelDrawing: () => this.handleCancelDrawing(),\n onToggleMagnet: () => this.handleToggleMagnet(),\n onUndo: () => this.chart.undo(),\n onRedo: () => this.chart.redo(),\n onClearDrawings: () => {\n this.chart.clearDrawings();\n this.state = { ...this.state, activeTool: null };\n this.updateUI();\n },\n },\n );\n }\n\n this.chartContainer = document.createElement('div');\n this.chartContainer.className = 'tcw-chart-container';\n body.appendChild(this.chartContainer);\n this.root.appendChild(body);\n\n // 5. Create chart\n this.chart = new Chart(this.chartContainer, {\n chartType: this.state.chartType,\n theme: resolvedTheme,\n autoScale: true,\n crosshair: { mode: 'magnet' },\n features: {\n drawings: true,\n drawingMagnet: true,\n drawingUndoRedo: true,\n indicators: true,\n trading: options.trading !== false,\n tradingContextMenu: options.trading !== false,\n volume: true,\n legend: true,\n crosshair: true,\n keyboard: true,\n screenshot: true,\n alerts: true,\n barCountdown: true,\n logScale: true,\n watermark: true,\n },\n ...options.chartOptions,\n });\n\n // 6. Create status bar\n if (options.statusBar !== false) {\n this.statusBar = new WidgetStatusBar(this.root);\n }\n\n // 7. Create settings (lazy, not appended until opened)\n if (options.settings !== false) {\n this.settings = new WidgetSettings({\n onChange: (patch) => this.applySettings(patch),\n onReset: () => this.resetSettings(),\n onClose: () => {},\n });\n }\n\n // 8. Command palette\n this.commandPalette = new WidgetCommandPalette({\n onIndicator: (id) => this.handleAddIndicator(id),\n onChartType: (type) => this.handleChartType(type),\n onDrawingTool: (tool) => this.handleDrawingTool(tool),\n onTimeframe: (tf) => this.handleTimeframe(tf),\n onAction: (id) => this.handleAction(id),\n onClose: () => {},\n });\n\n this.boundGlobalKeydown = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'k') {\n e.preventDefault();\n this.toggleCommandPalette();\n }\n };\n document.addEventListener('keydown', this.boundGlobalKeydown);\n\n // 9. Connect stream\n if (options.adapter) {\n this.adapter = options.adapter;\n this.connectStream();\n }\n\n // Initial UI update\n this.updateUI();\n\n // 9. Fire onReady\n options.onReady?.(this.chart);\n }\n\n // --- Public API ---\n\n async setSymbol(symbol: string): Promise<void> {\n this.state = { ...this.state, symbol };\n const idx = this.symbols.indexOf(symbol);\n if (idx >= 0) this.symbolIndex = idx;\n this.options.onSymbolChange?.(symbol);\n this.updateUI();\n if (this.adapter) {\n await this.connectStream();\n }\n }\n\n async setTimeframe(tf: TimeFrame): Promise<void> {\n this.state = { ...this.state, timeframe: tf };\n this.options.onTimeframeChange?.(tf);\n this.updateUI();\n if (this.adapter) {\n await this.connectStream();\n }\n }\n\n setTheme(theme: import('@tradecanvas/commons').ThemeName | Theme): void {\n const isDark = this.resolveIsDark(theme);\n const resolved = this.resolveTheme(theme);\n this.state = { ...this.state, isDark };\n this.root.dataset.tcwTheme = isDark ? 'dark' : 'light';\n this.chart.setTheme(resolved);\n this.updateUI();\n }\n\n getChart(): Chart {\n return this.chart;\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n\n if (this.boundGlobalKeydown) {\n document.removeEventListener('keydown', this.boundGlobalKeydown);\n }\n this.commandPalette?.destroy();\n this.toolbar?.destroy();\n this.sidebar?.destroy();\n this.settings?.destroy();\n this.statusBar?.destroy();\n this.chart.destroy();\n this.root.remove();\n removeWidgetStyles();\n }\n\n // --- Internal handlers ---\n\n private handleSymbolClick(): void {\n this.symbolIndex = (this.symbolIndex + 1) % this.symbols.length;\n const symbol = this.symbols[this.symbolIndex];\n this.state = { ...this.state, symbol };\n this.options.onSymbolChange?.(symbol);\n this.updateUI();\n if (this.adapter) {\n this.connectStream();\n }\n }\n\n private handleTimeframe(tf: TimeFrame): void {\n this.state = { ...this.state, timeframe: tf };\n this.options.onTimeframeChange?.(tf);\n this.updateUI();\n if (this.adapter) {\n this.connectStream();\n }\n }\n\n private handleChartType(type: ChartType): void {\n this.state = { ...this.state, chartType: type };\n this.chart.setChartType(type);\n this.updateUI();\n }\n\n private handleAddIndicator(indId: string): void {\n if (this.state.activeIndicators.has(indId)) {\n // Toggle off\n const instanceId = this.state.activeIndicators.get(indId)!;\n this.chart.removeIndicator(instanceId);\n const next = new Map(this.state.activeIndicators);\n next.delete(indId);\n this.state = { ...this.state, activeIndicators: next };\n } else {\n const instanceId = this.chart.addIndicator(indId);\n if (instanceId) {\n const next = new Map(this.state.activeIndicators);\n next.set(indId, instanceId);\n this.state = { ...this.state, activeIndicators: next };\n }\n }\n this.updateUI();\n }\n\n private handleRemoveIndicator(instanceId: string): void {\n this.chart.removeIndicator(instanceId);\n const next = new Map(this.state.activeIndicators);\n for (const [id, iid] of next.entries()) {\n if (iid === instanceId) {\n next.delete(id);\n break;\n }\n }\n this.state = { ...this.state, activeIndicators: next };\n this.updateUI();\n }\n\n private toggleCommandPalette(): void {\n if (this.commandPalette?.isOpen()) {\n this.commandPalette.close();\n return;\n }\n this.commandPalette?.open(this.buildCommandItems());\n }\n\n private buildCommandItems(): CommandItem[] {\n const items: CommandItem[] = [];\n\n for (const ind of INDICATORS) {\n items.push({\n id: ind.id,\n label: ind.name,\n category: 'indicator',\n active: this.state.activeIndicators.has(ind.id),\n });\n }\n\n for (const ct of CHART_TYPES) {\n items.push({\n id: ct.value,\n label: ct.label,\n category: 'chartType',\n active: this.state.chartType === ct.value,\n });\n }\n\n for (const group of DRAWING_TOOL_GROUPS) {\n for (const tool of group.tools) {\n items.push({\n id: tool.value,\n label: tool.label,\n category: 'drawing',\n active: this.state.activeTool === tool.value,\n });\n }\n }\n\n for (const tf of TIMEFRAMES) {\n items.push({\n id: tf.value,\n label: tf.label,\n category: 'timeframe',\n active: this.state.timeframe === tf.value,\n });\n }\n\n items.push(\n { id: 'screenshot', label: 'Screenshot', category: 'action', shortcut: '' },\n { id: 'toggleTheme', label: 'Toggle Theme', category: 'action' },\n { id: 'settings', label: 'Settings', category: 'action' },\n { id: 'clearDrawings', label: 'Clear All Drawings', category: 'action' },\n );\n\n return items;\n }\n\n private handleAction(id: string): void {\n switch (id) {\n case 'screenshot':\n this.chart.screenshot();\n break;\n case 'toggleTheme':\n this.handleToggleTheme();\n break;\n case 'settings':\n this.openSettings();\n break;\n case 'clearDrawings':\n this.chart.clearDrawings();\n this.state = { ...this.state, activeTool: null };\n this.updateUI();\n break;\n }\n }\n\n private handleDrawingTool(tool: DrawingToolType): void {\n this.state = { ...this.state, activeTool: tool };\n this.chart.setDrawingTool(tool);\n this.updateUI();\n }\n\n private handleCancelDrawing(): void {\n this.state = { ...this.state, activeTool: null };\n this.chart.setDrawingTool(null);\n this.updateUI();\n }\n\n private handleToggleMagnet(): void {\n const magnetEnabled = !this.state.magnetEnabled;\n this.state = { ...this.state, magnetEnabled };\n this.chart.setDrawingMagnet(magnetEnabled);\n this.updateUI();\n }\n\n private handleToggleTheme(): void {\n const isDark = !this.state.isDark;\n this.state = { ...this.state, isDark };\n this.root.dataset.tcwTheme = isDark ? 'dark' : 'light';\n this.chart.setTheme(isDark ? DARK_THEME : LIGHT_THEME);\n this.chart.setWatermark(this.state.symbol.replace('USDT', ' / USDT'), {\n fontSize: 48,\n color: isDark ? 'rgba(255,255,255,0.03)' : 'rgba(0,0,0,0.03)',\n });\n this.updateUI();\n }\n\n private openSettings(): void {\n this.settings?.open(this.settingsState);\n }\n\n private applySettings(patch: Partial<ChartSettingsState>): void {\n this.settingsState = { ...this.settingsState, ...patch };\n\n if (patch.gridVisible !== undefined) this.chart.setGridVisible(patch.gridVisible);\n if (patch.volumeVisible !== undefined) this.chart.setVolumeVisible(patch.volumeVisible);\n if (patch.crosshairMode !== undefined) this.chart.setCrosshairMode(patch.crosshairMode);\n if (patch.autoScale !== undefined) this.chart.setAutoScale(patch.autoScale);\n if (patch.logScale !== undefined) this.chart.setLogScale(patch.logScale);\n if (patch.numberLocale !== undefined) this.chart.setNumberLocale(patch.numberLocale);\n\n // Apply theme colors\n const currentTheme = this.chart.getTheme();\n const themeUpdate = { ...currentTheme } as Record<string, unknown>;\n let themeChanged = false;\n\n if (patch.candleUpColor !== undefined) { themeUpdate.candleUp = patch.candleUpColor; themeChanged = true; }\n if (patch.candleDownColor !== undefined) { themeUpdate.candleDown = patch.candleDownColor; themeChanged = true; }\n if (patch.candleUpWick !== undefined) { themeUpdate.candleUpWick = patch.candleUpWick; themeChanged = true; }\n if (patch.candleDownWick !== undefined) { themeUpdate.candleDownWick = patch.candleDownWick; themeChanged = true; }\n if (patch.backgroundColor !== undefined) { themeUpdate.background = patch.backgroundColor; themeChanged = true; }\n if (patch.gridColor !== undefined) { themeUpdate.grid = patch.gridColor; themeChanged = true; }\n\n if (themeChanged) {\n this.chart.setTheme(themeUpdate as unknown as Theme);\n }\n }\n\n private resetSettings(): void {\n this.settingsState = { ...DEFAULT_SETTINGS };\n this.applySettings(this.settingsState);\n }\n\n private async connectStream(): Promise<void> {\n if (!this.adapter) return;\n\n this.state = {\n ...this.state,\n connectionState: 'connecting',\n connectionMessage: 'Connecting...',\n };\n this.updateUI();\n\n try {\n this.chart.disconnectStream();\n await this.chart.connect({\n adapter: this.adapter,\n symbol: this.state.symbol,\n timeframe: this.state.timeframe,\n historyLimit: this.options.historyLimit ?? 500,\n });\n\n this.chart.setWatermark(this.state.symbol.replace('USDT', ' / USDT'), {\n fontSize: 48,\n color: this.state.isDark ? 'rgba(255,255,255,0.03)' : 'rgba(0,0,0,0.03)',\n });\n\n this.state = {\n ...this.state,\n connectionState: 'connected',\n connectionMessage: 'Live',\n };\n } catch (err: unknown) {\n this.state = {\n ...this.state,\n connectionState: 'error',\n connectionMessage: err instanceof Error ? err.message : 'Connection failed',\n };\n }\n\n this.updateUI();\n }\n\n private updateUI(): void {\n this.toolbar?.update(this.state);\n this.sidebar?.update(this.state);\n this.statusBar?.update({\n connectionState: this.state.connectionState,\n message: this.state.connectionMessage,\n symbol: this.state.symbol,\n timeframe: this.state.timeframe,\n });\n }\n\n private resolveIsDark(theme?: import('@tradecanvas/commons').ThemeName | Theme): boolean {\n if (theme === undefined || theme === 'dark') return true;\n if (theme === 'light') return false;\n // If it's a Theme object, check background color\n if (typeof theme === 'object' && theme.background) {\n return this.isColorDark(theme.background);\n }\n return true;\n }\n\n private resolveTheme(theme?: import('@tradecanvas/commons').ThemeName | Theme): Theme {\n if (theme === undefined || theme === 'dark') return DARK_THEME;\n if (theme === 'light') return LIGHT_THEME;\n if (typeof theme === 'object') return theme as Theme;\n return DARK_THEME;\n }\n\n private isColorDark(color: string): boolean {\n // Simple heuristic: if it starts with # and R+G+B < 384 (half of 768)\n if (color.startsWith('#') && color.length >= 7) {\n const r = parseInt(color.slice(1, 3), 16);\n const g = parseInt(color.slice(3, 5), 16);\n const b = parseInt(color.slice(5, 7), 16);\n return (r + g + b) < 384;\n }\n return true;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/widget/widgetConfig.ts","../../src/widget/WidgetStyles.ts","../../src/widget/icons.ts","../../src/widget/WidgetDropdown.ts","../../src/widget/WidgetToolbar.ts","../../src/widget/WidgetDrawingSidebar.ts","../../src/widget/WidgetSettings.ts","../../src/widget/WidgetStatusBar.ts","../../src/widget/WidgetCommandPalette.ts","../../src/widget/WidgetSymbolSearch.ts","../../src/widget/WidgetHotkeySheet.ts","../../src/widget/WidgetReplayBar.ts","../../src/widget/WidgetWatchlist.ts","../../src/widget/ChartWidget.ts"],"sourcesContent":["import type { ChartType, DrawingToolType, TimeFrame } from '@tradecanvas/commons';\r\nimport type { IndicatorDef, DrawingToolGroupDef, ChartSettingsState } from './types.js';\r\n\r\nexport const TIMEFRAMES: { label: string; value: TimeFrame }[] = [\r\n { label: '1m', value: '1m' },\r\n { label: '5m', value: '5m' },\r\n { label: '15m', value: '15m' },\r\n { label: '1H', value: '1h' },\r\n { label: '4H', value: '4h' },\r\n { label: '1D', value: '1d' },\r\n];\r\n\r\nexport const CHART_TYPES: { label: string; value: ChartType }[] = [\r\n { label: 'Candlestick', value: 'candlestick' },\r\n { label: 'Line', value: 'line' },\r\n { label: 'Area', value: 'area' },\r\n { label: 'Bar', value: 'bar' },\r\n { label: 'Heikin-Ashi', value: 'heikinAshi' },\r\n { label: 'Hollow Candle', value: 'hollowCandle' },\r\n { label: 'Baseline', value: 'baseline' },\r\n { label: 'Volume Candles', value: 'volumeCandles' },\r\n { label: 'Equivolume', value: 'equivolume' },\r\n { label: 'HLC Area', value: 'hlcArea' },\r\n { label: 'Step Line', value: 'stepLine' },\r\n { label: 'Line + Markers', value: 'lineWithMarkers' },\r\n];\r\n\r\nexport const DRAWING_TOOL_GROUPS: DrawingToolGroupDef[] = [\r\n {\r\n label: 'Lines',\r\n tools: [\r\n { label: 'Trend Line', value: 'trendLine' as DrawingToolType },\r\n { label: 'Ray', value: 'ray' as DrawingToolType },\r\n { label: 'Extended Line', value: 'extendedLine' as DrawingToolType },\r\n ],\r\n },\r\n {\r\n label: 'Horizontal/Vertical',\r\n tools: [\r\n { label: 'Horizontal Line', value: 'horizontalLine' as DrawingToolType },\r\n { label: 'Vertical Line', value: 'verticalLine' as DrawingToolType },\r\n ],\r\n },\r\n {\r\n label: 'Channels',\r\n tools: [\r\n { label: 'Parallel Channel', value: 'parallelChannel' as DrawingToolType },\r\n { label: 'Regression Channel', value: 'regressionChannel' as DrawingToolType },\r\n ],\r\n },\r\n {\r\n label: 'Fibonacci',\r\n tools: [\r\n { label: 'Fib Retracement', value: 'fibRetracement' as DrawingToolType },\r\n { label: 'Fib Extension', value: 'fibExtension' as DrawingToolType },\r\n ],\r\n },\r\n {\r\n label: 'Shapes',\r\n tools: [\r\n { label: 'Rectangle', value: 'rectangle' as DrawingToolType },\r\n { label: 'Ellipse', value: 'ellipse' as DrawingToolType },\r\n { label: 'Triangle', value: 'triangle' as DrawingToolType },\r\n ],\r\n },\r\n {\r\n label: 'Gann & Advanced',\r\n tools: [\r\n { label: 'Pitchfork', value: 'pitchfork' as DrawingToolType },\r\n { label: 'Gann Fan', value: 'gannFan' as DrawingToolType },\r\n { label: 'Gann Box', value: 'gannBox' as DrawingToolType },\r\n { label: 'Elliott Wave', value: 'elliottWave' as DrawingToolType },\r\n ],\r\n },\r\n {\r\n label: 'Measure',\r\n tools: [\r\n { label: 'Price Range', value: 'priceRange' as DrawingToolType },\r\n { label: 'Date Range', value: 'dateRange' as DrawingToolType },\r\n { label: 'Measure', value: 'measure' as DrawingToolType },\r\n ],\r\n },\r\n {\r\n label: 'Annotation',\r\n tools: [\r\n { label: 'Text', value: 'text' as DrawingToolType },\r\n { label: 'Arrow', value: 'arrow' as DrawingToolType },\r\n ],\r\n },\r\n];\r\n\r\nexport const INDICATORS: IndicatorDef[] = [\r\n { id: 'sma', name: 'SMA', type: 'overlay' },\r\n { id: 'ema', name: 'EMA', type: 'overlay' },\r\n { id: 'hma', name: 'Hull MA', type: 'overlay' },\r\n { id: 'bb', name: 'Bollinger Bands', type: 'overlay' },\r\n { id: 'vwap', name: 'VWAP', type: 'overlay' },\r\n { id: 'avwap', name: 'Anchored VWAP', type: 'overlay' },\r\n { id: 'ichimoku', name: 'Ichimoku Cloud', type: 'overlay' },\r\n { id: 'psar', name: 'Parabolic SAR', type: 'overlay' },\r\n { id: 'supertrend', name: 'Supertrend', type: 'overlay' },\r\n { id: 'keltner', name: 'Keltner Channel', type: 'overlay' },\r\n { id: 'donchian', name: 'Donchian Channel', type: 'overlay' },\r\n { id: 'pivots', name: 'Pivot Points', type: 'overlay' },\r\n { id: 'zigzag', name: 'ZigZag', type: 'overlay' },\r\n { id: 'lrc', name: 'Linear Regression Channel', type: 'overlay' },\r\n { id: 'rsi', name: 'RSI', type: 'panel' },\r\n { id: 'macd', name: 'MACD', type: 'panel' },\r\n { id: 'stochastic', name: 'Stochastic', type: 'panel' },\r\n { id: 'atr', name: 'ATR', type: 'panel' },\r\n { id: 'adx', name: 'ADX', type: 'panel' },\r\n { id: 'obv', name: 'OBV', type: 'panel' },\r\n { id: 'williamsR', name: 'Williams %R', type: 'panel' },\r\n { id: 'cci', name: 'CCI', type: 'panel' },\r\n { id: 'mfi', name: 'MFI', type: 'panel' },\r\n { id: 'roc', name: 'ROC', type: 'panel' },\r\n { id: 'tsi', name: 'TSI', type: 'panel' },\r\n { id: 'cmf', name: 'CMF', type: 'panel' },\r\n { id: 'aroon', name: 'Aroon', type: 'panel' },\r\n { id: 'stddev', name: 'Std Deviation', type: 'panel' },\r\n { id: 'vroc', name: 'Volume ROC', type: 'panel' },\r\n { id: 'ad', name: 'Acc/Dist', type: 'panel' },\r\n { id: 'ao', name: 'Awesome Oscillator', type: 'panel' },\r\n { id: 'chaikinOsc', name: 'Chaikin Oscillator', type: 'panel' },\r\n { id: 'volumeProfile', name: 'Volume Profile', type: 'panel' },\r\n];\r\n\r\nexport const POPULAR_INDICATORS = [\r\n 'sma', 'ema', 'bb', 'rsi', 'macd', 'stochastic',\r\n 'vwap', 'atr', 'obv', 'ichimoku',\r\n];\r\n\r\nexport const DEFAULT_SYMBOLS = [\r\n 'BTCUSDT', 'ETHUSDT', 'SOLUSDT', 'BNBUSDT',\r\n];\r\n\r\nexport const DEFAULT_SETTINGS: ChartSettingsState = {\r\n candleUpColor: '#26A69A',\r\n candleDownColor: '#EF5350',\r\n candleUpWick: '#26A69A',\r\n candleDownWick: '#EF5350',\r\n backgroundColor: '#131722',\r\n gridColor: '#1E222D',\r\n gridVisible: true,\r\n volumeVisible: true,\r\n volumeProfileVisible: false,\r\n legendVisible: true,\r\n barCountdown: true,\r\n logScale: false,\r\n autoScale: true,\r\n crosshairMode: 'magnet',\r\n numberLocale: 'en-US',\r\n};\r\n","import widgetCss from './WidgetStyles.css?raw';\r\n\r\nlet refCount = 0;\r\nconst STYLE_ID = 'tcw-styles';\r\n\r\n/**\r\n * Inject the widget stylesheet into `document.head`. Reference-counted so\r\n * multiple `ChartWidget` instances share the same `<style>` tag and the last\r\n * to detach removes it. CSS lives in a sibling `.css` file and is inlined at\r\n * build time via Vite's `?raw` query — consumers see a plain string at runtime.\r\n */\r\nexport function injectWidgetStyles(): void {\r\n refCount++;\r\n if (refCount > 1) return;\r\n if (document.getElementById(STYLE_ID)) return;\r\n\r\n const style = document.createElement('style');\r\n style.id = STYLE_ID;\r\n style.textContent = widgetCss;\r\n document.head.appendChild(style);\r\n}\r\n\r\nexport function removeWidgetStyles(): void {\r\n refCount--;\r\n if (refCount > 0) return;\r\n\r\n const style = document.getElementById(STYLE_ID);\r\n if (style) {\r\n style.remove();\r\n }\r\n}\r\n","const ICON_PATHS: Record<string, string> = {\n cursor: '<path d=\"M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z\"/><path d=\"M13 13l6 6\"/>',\n trendingUp: '<polyline points=\"22 7 13.5 15.5 8.5 10.5 2 17\"/><polyline points=\"16 7 22 7 22 13\"/>',\n minus: '<path d=\"M5 12h14\"/>',\n penLine: '<path d=\"M12 20h9\"/><path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\"/>',\n hash: '<line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"9\"/><line x1=\"4\" y1=\"15\" x2=\"20\" y2=\"15\"/><line x1=\"10\" y1=\"3\" x2=\"8\" y2=\"21\"/><line x1=\"16\" y1=\"3\" x2=\"14\" y2=\"21\"/>',\n square: '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/>',\n gitBranch: '<line x1=\"6\" y1=\"3\" x2=\"6\" y2=\"15\"/><circle cx=\"18\" cy=\"6\" r=\"3\"/><circle cx=\"6\" cy=\"18\" r=\"3\"/><path d=\"M18 9a9 9 0 0 1-9 9\"/>',\n ruler: '<path d=\"M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z\"/><path d=\"m14.5 12.5 2-2\"/><path d=\"m11.5 9.5 2-2\"/><path d=\"m8.5 6.5 2-2\"/><path d=\"m17.5 15.5 2-2\"/>',\n type: '<polyline points=\"4 7 4 4 20 4 20 7\"/><line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\"/><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"/>',\n magnet: '<path d=\"m6 15-4-4 6.75-6.77a7.79 7.79 0 0 1 11 11L13 22l-4-4 6.39-6.36a2.14 2.14 0 0 0-3-3L6 15\"/><path d=\"m5 8 4 4\"/><path d=\"m12 15 4 4\"/>',\n undo: '<path d=\"M3 7v6h6\"/><path d=\"M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13\"/>',\n redo: '<path d=\"M21 7v6h-6\"/><path d=\"M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3L21 13\"/>',\n trash: '<path d=\"M3 6h18\"/><path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\"/><path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\"/><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"/><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"/>',\n camera: '<path d=\"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z\"/><circle cx=\"12\" cy=\"13\" r=\"3\"/>',\n settings: '<path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\n moon: '<path d=\"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\"/>',\n sun: '<circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2\"/><path d=\"M12 20v2\"/><path d=\"m4.93 4.93 1.41 1.41\"/><path d=\"m17.66 17.66 1.41 1.41\"/><path d=\"M2 12h2\"/><path d=\"M20 12h2\"/><path d=\"m6.34 17.66-1.41 1.41\"/><path d=\"m19.07 4.93-1.41 1.41\"/>',\n chevronDown: '<path d=\"m6 9 6 6 6-6\"/>',\n chevronUp: '<path d=\"m18 15-6-6-6 6\"/>',\n barChart: '<line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"10\"/><line x1=\"18\" y1=\"20\" x2=\"18\" y2=\"4\"/><line x1=\"6\" y1=\"20\" x2=\"6\" y2=\"16\"/>',\n x: '<path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/>',\n play: '<polygon points=\"6 3 20 12 6 21 6 3\"/>',\n pause: '<rect width=\"4\" height=\"16\" x=\"6\" y=\"4\"/><rect width=\"4\" height=\"16\" x=\"14\" y=\"4\"/>',\n stop: '<rect width=\"14\" height=\"14\" x=\"5\" y=\"5\" rx=\"1\"/>',\n receipt: '<path d=\"M4 2v20l2-1 2 1 2-1 2 1 2-1 2 1 2-1 2 1V2l-2 1-2-1-2 1-2-1-2 1-2-1-2 1Z\"/><path d=\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\"/><path d=\"M12 17.5v-11\"/>',\n};\n\nexport function createIcon(name: string, size = 14): string {\n const paths = ICON_PATHS[name];\n if (!paths) return '';\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${paths}</svg>`;\n}\n","export class WidgetDropdown {\n private trigger: HTMLElement;\n private panel: HTMLDivElement;\n private _isOpen = false;\n private onOutsideClick: (e: MouseEvent) => void;\n private onEscapeKey: (e: KeyboardEvent) => void;\n private onTriggerClick: () => void;\n\n constructor(trigger: HTMLElement, config: { width?: string; align?: 'left' | 'right' } = {}) {\n this.trigger = trigger;\n\n this.panel = document.createElement('div');\n this.panel.className = 'tcw-dropdown';\n this.panel.style.width = config.width ?? '200px';\n if (config.align === 'right') {\n this.panel.style.right = '0';\n } else {\n this.panel.style.left = '0';\n }\n this.panel.style.display = 'none';\n\n // Position relative to trigger\n trigger.style.position = 'relative';\n trigger.appendChild(this.panel);\n\n this.onTriggerClick = () => {\n if (this._isOpen) {\n this.close();\n } else {\n this.open();\n }\n };\n\n this.onOutsideClick = (e: MouseEvent) => {\n if (!this.trigger.contains(e.target as Node)) {\n this.close();\n }\n };\n\n this.onEscapeKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.close();\n }\n };\n\n trigger.addEventListener('click', this.onTriggerClick);\n }\n\n setContent(html: string): void {\n this.panel.innerHTML = html;\n }\n\n open(): void {\n if (this._isOpen) return;\n this._isOpen = true;\n this.panel.style.display = '';\n document.addEventListener('mousedown', this.onOutsideClick);\n document.addEventListener('keydown', this.onEscapeKey);\n }\n\n close(): void {\n if (!this._isOpen) return;\n this._isOpen = false;\n this.panel.style.display = 'none';\n document.removeEventListener('mousedown', this.onOutsideClick);\n document.removeEventListener('keydown', this.onEscapeKey);\n }\n\n isOpen(): boolean {\n return this._isOpen;\n }\n\n destroy(): void {\n this.trigger.removeEventListener('click', this.onTriggerClick);\n document.removeEventListener('mousedown', this.onOutsideClick);\n document.removeEventListener('keydown', this.onEscapeKey);\n this.panel.remove();\n }\n}\n","import type { ChartType } from '@tradecanvas/commons';\nimport type { ToolbarConfig, ToolbarCallbacks, WidgetState, ActiveIndicator } from './types.js';\nimport { createIcon } from './icons.js';\nimport { WidgetDropdown } from './WidgetDropdown.js';\n\nexport class WidgetToolbar {\n private config: ToolbarConfig;\n private callbacks: ToolbarCallbacks;\n private el: HTMLDivElement;\n private chartTypeDropdown: WidgetDropdown | null = null;\n private indicatorDropdown: WidgetDropdown | null = null;\n private tfButtons: HTMLButtonElement[] = [];\n private chipsContainer: HTMLDivElement | null = null;\n private themeBtn: HTMLButtonElement | null = null;\n\n constructor(host: HTMLElement, config: ToolbarConfig, callbacks: ToolbarCallbacks) {\n this.config = config;\n this.callbacks = callbacks;\n this.el = document.createElement('div');\n this.el.className = 'tcw-toolbar';\n this.build();\n host.appendChild(this.el);\n }\n\n private build(): void {\n const { config, callbacks, el } = this;\n\n // Symbol button\n const symbolBtn = document.createElement('button');\n symbolBtn.className = 'tcw-toolbar-symbol';\n symbolBtn.dataset.role = 'symbol';\n symbolBtn.addEventListener('click', callbacks.onSymbolClick);\n el.appendChild(symbolBtn);\n el.appendChild(this.sep());\n\n // Timeframes\n const tfGroup = document.createElement('div');\n tfGroup.className = 'tcw-toolbar-group';\n for (const tf of config.timeframes) {\n const btn = document.createElement('button');\n btn.className = 'tcw-btn';\n btn.textContent = tf.label;\n btn.dataset.tf = tf.value;\n btn.addEventListener('click', () => callbacks.onTimeframe(tf.value));\n tfGroup.appendChild(btn);\n this.tfButtons.push(btn);\n }\n el.appendChild(tfGroup);\n el.appendChild(this.sep());\n\n // Chart type dropdown\n const ctWrap = document.createElement('div');\n ctWrap.style.position = 'relative';\n ctWrap.style.display = 'inline-flex';\n\n const ctTrigger = document.createElement('button');\n ctTrigger.className = 'tcw-dropdown-trigger';\n ctTrigger.dataset.role = 'charttype';\n ctWrap.appendChild(ctTrigger);\n el.appendChild(ctWrap);\n\n this.chartTypeDropdown = new WidgetDropdown(ctWrap, { width: '160px' });\n this.buildChartTypeMenu();\n\n el.appendChild(this.sep());\n\n // Indicators dropdown\n const indWrap = document.createElement('div');\n indWrap.style.position = 'relative';\n indWrap.style.display = 'inline-flex';\n\n const indTrigger = document.createElement('button');\n indTrigger.className = 'tcw-dropdown-trigger';\n indTrigger.dataset.role = 'indicators';\n indWrap.appendChild(indTrigger);\n el.appendChild(indWrap);\n\n this.indicatorDropdown = new WidgetDropdown(indWrap, { width: '280px' });\n this.buildIndicatorMenu();\n\n // Indicator chips\n this.chipsContainer = document.createElement('div');\n this.chipsContainer.className = 'tcw-indicator-chips';\n el.appendChild(this.chipsContainer);\n\n // Spacer\n el.appendChild(this.spacer());\n\n // Right side buttons\n if (callbacks.onToggleReplay) {\n const replayBtn = this.iconBtn('play', 'Bar replay', callbacks.onToggleReplay);\n replayBtn.dataset.role = 'replay';\n el.appendChild(replayBtn);\n }\n\n const screenshotBtn = this.iconBtn('camera', 'Screenshot', callbacks.onScreenshot);\n el.appendChild(screenshotBtn);\n\n const settingsBtn = this.iconBtn('settings', 'Chart Settings', callbacks.onSettings);\n el.appendChild(settingsBtn);\n\n this.themeBtn = this.iconBtn('moon', 'Toggle theme', callbacks.onToggleTheme);\n this.themeBtn.dataset.role = 'theme';\n el.appendChild(this.themeBtn);\n }\n\n private buildChartTypeMenu(): void {\n if (!this.chartTypeDropdown) return;\n const items = this.config.chartTypes.map(ct =>\n `<button class=\"tcw-dropdown-item\" data-ct=\"${ct.value}\">${ct.label}</button>`\n ).join('');\n this.chartTypeDropdown.setContent(items);\n\n // Attach events to items after content set\n const panel = this.chartTypeDropdown['panel'] as HTMLDivElement;\n panel.querySelectorAll('.tcw-dropdown-item').forEach((btn) => {\n btn.addEventListener('click', (e) => {\n const value = (e.currentTarget as HTMLElement).dataset.ct as ChartType;\n this.callbacks.onChartType(value);\n this.chartTypeDropdown?.close();\n });\n });\n }\n\n private buildIndicatorMenu(): void {\n if (!this.indicatorDropdown) return;\n const { indicators, popularIndicatorIds } = this.config;\n\n const popular = indicators.filter(d => popularIndicatorIds.includes(d.id));\n const other = indicators.filter(d => !popularIndicatorIds.includes(d.id));\n\n let html = '<div class=\"tcw-dropdown-label\">Popular</div>';\n for (const ind of popular) {\n html += `<button class=\"tcw-dropdown-item\" data-ind=\"${ind.id}\"><span>${ind.name}</span><span class=\"tcw-tag\">${ind.type}</span></button>`;\n }\n html += '<div class=\"tcw-dropdown-divider\"></div>';\n html += '<div class=\"tcw-dropdown-label\">All</div>';\n for (const ind of other) {\n html += `<button class=\"tcw-dropdown-item\" data-ind=\"${ind.id}\"><span>${ind.name}</span><span class=\"tcw-tag\">${ind.type}</span></button>`;\n }\n\n this.indicatorDropdown.setContent(html);\n\n const panel = this.indicatorDropdown['panel'] as HTMLDivElement;\n panel.querySelectorAll('.tcw-dropdown-item[data-ind]').forEach((btn) => {\n btn.addEventListener('click', (e) => {\n const id = (e.currentTarget as HTMLElement).dataset.ind!;\n this.callbacks.onAddIndicator(id);\n });\n });\n }\n\n update(state: WidgetState): void {\n // Symbol\n const symbolBtn = this.el.querySelector('[data-role=\"symbol\"]') as HTMLButtonElement | null;\n if (symbolBtn) symbolBtn.textContent = state.symbol;\n\n // Timeframe buttons\n for (const btn of this.tfButtons) {\n btn.classList.toggle('tcw-active', btn.dataset.tf === state.timeframe);\n }\n\n // Chart type trigger label\n const ctTrigger = this.el.querySelector('[data-role=\"charttype\"]') as HTMLElement | null;\n if (ctTrigger) {\n const label = this.config.chartTypes.find(t => t.value === state.chartType)?.label ?? 'Candles';\n ctTrigger.innerHTML = `${createIcon('barChart', 14)} ${label} ${createIcon('chevronDown', 12)}`;\n }\n\n // Indicator trigger + badge\n const indTrigger = this.el.querySelector('[data-role=\"indicators\"]') as HTMLElement | null;\n if (indTrigger) {\n const count = state.activeIndicators.size;\n let inner = `${createIcon('trendingUp', 14)} Indicators`;\n if (count > 0) {\n inner += ` <span class=\"tcw-badge-count\">${count}</span>`;\n }\n indTrigger.innerHTML = inner;\n }\n\n // Chips\n if (this.chipsContainer) {\n const activeList = this.getActiveIndicatorList(state);\n this.chipsContainer.innerHTML = '';\n for (const ind of activeList) {\n const chip = document.createElement('div');\n chip.className = 'tcw-indicator-chip';\n\n const label = document.createElement('span');\n label.textContent = ind.label;\n chip.appendChild(label);\n\n const removeBtn = document.createElement('button');\n removeBtn.className = 'tcw-chip-remove';\n removeBtn.innerHTML = createIcon('x', 10);\n removeBtn.addEventListener('click', () => this.callbacks.onRemoveIndicator(ind.instanceId));\n chip.appendChild(removeBtn);\n\n this.chipsContainer.appendChild(chip);\n }\n }\n\n // Theme toggle icon\n if (this.themeBtn) {\n this.themeBtn.innerHTML = state.isDark ? createIcon('moon', 14) : createIcon('sun', 14);\n }\n }\n\n private getActiveIndicatorList(state: WidgetState): ActiveIndicator[] {\n const result: ActiveIndicator[] = [];\n for (const [id, instanceId] of state.activeIndicators.entries()) {\n result.push({ instanceId, id, label: id.toUpperCase() });\n }\n return result;\n }\n\n private sep(): HTMLSpanElement {\n const s = document.createElement('span');\n s.className = 'tcw-toolbar-sep';\n return s;\n }\n\n private spacer(): HTMLSpanElement {\n const s = document.createElement('span');\n s.className = 'tcw-toolbar-spacer';\n return s;\n }\n\n private iconBtn(icon: string, title: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = 'tcw-btn-icon';\n btn.title = title;\n btn.innerHTML = createIcon(icon, 14);\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n destroy(): void {\n this.chartTypeDropdown?.destroy();\n this.indicatorDropdown?.destroy();\n this.el.remove();\n }\n}\n","import type { SidebarConfig, SidebarCallbacks, WidgetState } from './types.js';\nimport { createIcon } from './icons.js';\n\nconst GROUP_ICONS = [\n 'trendingUp', 'minus', 'penLine', 'hash', 'square', 'gitBranch', 'ruler', 'type',\n];\n\nexport class WidgetDrawingSidebar {\n private config: SidebarConfig;\n private callbacks: SidebarCallbacks;\n private el: HTMLDivElement;\n private groupWraps: HTMLDivElement[] = [];\n private groupButtons: HTMLButtonElement[] = [];\n private cursorBtn: HTMLButtonElement | null = null;\n private magnetBtn: HTMLButtonElement | null = null;\n private flyoutEl: HTMLDivElement | null = null;\n\n constructor(host: HTMLElement, config: SidebarConfig, callbacks: SidebarCallbacks) {\n this.config = config;\n this.callbacks = callbacks;\n this.el = document.createElement('div');\n this.el.className = 'tcw-sidebar';\n this.build();\n host.appendChild(this.el);\n }\n\n private build(): void {\n const { config, callbacks, el } = this;\n\n // Cursor button\n this.cursorBtn = document.createElement('button');\n this.cursorBtn.className = 'tcw-sidebar-btn';\n this.cursorBtn.title = 'Cursor';\n this.cursorBtn.innerHTML = createIcon('cursor', 14);\n this.cursorBtn.addEventListener('click', callbacks.onCancelDrawing);\n el.appendChild(this.cursorBtn);\n\n el.appendChild(this.divider());\n\n // Tool groups\n config.drawingToolGroups.forEach((group, idx) => {\n const wrap = document.createElement('div');\n wrap.className = 'tcw-tool-group-wrap';\n\n const btn = document.createElement('button');\n btn.className = 'tcw-sidebar-btn';\n btn.title = group.label;\n btn.innerHTML = createIcon(GROUP_ICONS[idx] ?? 'square', 14);\n\n if (group.tools.length > 1) {\n const dot = document.createElement('span');\n dot.className = 'tcw-multi-dot';\n btn.appendChild(dot);\n }\n\n btn.addEventListener('click', () => callbacks.onDrawingTool(group.tools[0].value));\n wrap.appendChild(btn);\n\n // Flyout events via JS (not CSS hover)\n wrap.addEventListener('mouseenter', () => this.showFlyout(idx));\n wrap.addEventListener('mouseleave', () => this.hideFlyout());\n\n el.appendChild(wrap);\n this.groupWraps.push(wrap);\n this.groupButtons.push(btn);\n });\n\n // Spacer\n const spacer = document.createElement('div');\n spacer.className = 'tcw-sidebar-spacer';\n el.appendChild(spacer);\n\n el.appendChild(this.divider());\n\n // Bottom tools\n this.magnetBtn = document.createElement('button');\n this.magnetBtn.className = 'tcw-sidebar-btn';\n this.magnetBtn.title = 'Magnet';\n this.magnetBtn.innerHTML = createIcon('magnet', 14);\n this.magnetBtn.addEventListener('click', callbacks.onToggleMagnet);\n el.appendChild(this.magnetBtn);\n\n const undoBtn = document.createElement('button');\n undoBtn.className = 'tcw-sidebar-btn';\n undoBtn.title = 'Undo';\n undoBtn.innerHTML = createIcon('undo', 14);\n undoBtn.addEventListener('click', callbacks.onUndo);\n el.appendChild(undoBtn);\n\n const redoBtn = document.createElement('button');\n redoBtn.className = 'tcw-sidebar-btn';\n redoBtn.title = 'Redo';\n redoBtn.innerHTML = createIcon('redo', 14);\n redoBtn.addEventListener('click', callbacks.onRedo);\n el.appendChild(redoBtn);\n\n const clearBtn = document.createElement('button');\n clearBtn.className = 'tcw-sidebar-btn tcw-danger';\n clearBtn.title = 'Clear all';\n clearBtn.innerHTML = createIcon('trash', 14);\n clearBtn.addEventListener('click', callbacks.onClearDrawings);\n el.appendChild(clearBtn);\n }\n\n private showFlyout(idx: number): void {\n const group = this.config.drawingToolGroups[idx];\n if (!group || group.tools.length <= 1) return;\n\n this.hideFlyout();\n\n const flyout = document.createElement('div');\n flyout.className = 'tcw-flyout';\n\n const header = document.createElement('div');\n header.className = 'tcw-flyout-header';\n header.textContent = group.label;\n flyout.appendChild(header);\n\n for (const tool of group.tools) {\n const item = document.createElement('button');\n item.className = 'tcw-flyout-item';\n item.textContent = tool.label;\n item.dataset.toolValue = tool.value;\n item.addEventListener('click', () => {\n this.callbacks.onDrawingTool(tool.value);\n this.hideFlyout();\n });\n flyout.appendChild(item);\n }\n\n this.flyoutEl = flyout;\n this.groupWraps[idx].appendChild(flyout);\n }\n\n private hideFlyout(): void {\n if (this.flyoutEl) {\n this.flyoutEl.remove();\n this.flyoutEl = null;\n }\n }\n\n update(state: WidgetState): void {\n // Cursor active\n if (this.cursorBtn) {\n this.cursorBtn.classList.toggle('tcw-active', state.activeTool === null);\n }\n\n // Group buttons\n const { drawingToolGroups } = this.config;\n for (let i = 0; i < drawingToolGroups.length; i++) {\n const isActive = drawingToolGroups[i].tools.some(t => t.value === state.activeTool);\n this.groupButtons[i].classList.toggle('tcw-active', isActive);\n }\n\n // Flyout items\n if (this.flyoutEl) {\n this.flyoutEl.querySelectorAll('.tcw-flyout-item').forEach((item) => {\n const el = item as HTMLElement;\n el.classList.toggle('tcw-active', el.dataset.toolValue === state.activeTool);\n });\n }\n\n // Magnet\n if (this.magnetBtn) {\n this.magnetBtn.classList.toggle('tcw-active', state.magnetEnabled);\n this.magnetBtn.title = state.magnetEnabled ? 'Magnet ON' : 'Magnet OFF';\n }\n }\n\n private divider(): HTMLDivElement {\n const d = document.createElement('div');\n d.className = 'tcw-sidebar-divider';\n return d;\n }\n\n destroy(): void {\n this.hideFlyout();\n this.el.remove();\n }\n}\n","import type { ChartSettingsState, SettingsCallbacks } from './types.js';\nimport { createIcon } from './icons.js';\n\ntype Tab = 'style' | 'display' | 'scale';\nconst TABS: Tab[] = ['style', 'display', 'scale'];\n\nexport class WidgetSettings {\n private callbacks: SettingsCallbacks;\n private backdrop: HTMLDivElement | null = null;\n private modal: HTMLDivElement | null = null;\n private currentTab: Tab = 'style';\n private currentSettings: ChartSettingsState | null = null;\n private bodyEl: HTMLDivElement | null = null;\n private tabButtons: HTMLButtonElement[] = [];\n\n constructor(callbacks: SettingsCallbacks) {\n this.callbacks = callbacks;\n }\n\n open(currentSettings: ChartSettingsState): void {\n this.currentSettings = { ...currentSettings };\n this.currentTab = 'style';\n this.buildModal();\n }\n\n close(): void {\n this.backdrop?.remove();\n this.modal?.remove();\n this.backdrop = null;\n this.modal = null;\n this.bodyEl = null;\n this.tabButtons = [];\n }\n\n private buildModal(): void {\n // Backdrop\n this.backdrop = document.createElement('div');\n this.backdrop.className = 'tcw-modal-backdrop';\n this.backdrop.addEventListener('click', () => {\n this.callbacks.onClose();\n this.close();\n });\n document.body.appendChild(this.backdrop);\n\n // Modal\n this.modal = document.createElement('div');\n this.modal.className = 'tcw-modal';\n\n // Header\n const header = document.createElement('div');\n header.className = 'tcw-modal-header';\n const h3 = document.createElement('h3');\n h3.textContent = 'Chart Settings';\n header.appendChild(h3);\n const closeBtn = document.createElement('button');\n closeBtn.className = 'tcw-modal-close';\n closeBtn.innerHTML = createIcon('x', 16);\n closeBtn.addEventListener('click', () => {\n this.callbacks.onClose();\n this.close();\n });\n header.appendChild(closeBtn);\n this.modal.appendChild(header);\n\n // Tabs\n const tabsEl = document.createElement('div');\n tabsEl.className = 'tcw-modal-tabs';\n this.tabButtons = [];\n for (const tab of TABS) {\n const btn = document.createElement('button');\n btn.className = 'tcw-modal-tab';\n btn.textContent = tab;\n btn.dataset.tab = tab;\n if (tab === this.currentTab) btn.classList.add('tcw-active');\n btn.addEventListener('click', () => {\n this.currentTab = tab;\n this.tabButtons.forEach(b => b.classList.toggle('tcw-active', b.dataset.tab === tab));\n this.renderTabContent();\n });\n tabsEl.appendChild(btn);\n this.tabButtons.push(btn);\n }\n this.modal.appendChild(tabsEl);\n\n // Body\n this.bodyEl = document.createElement('div');\n this.bodyEl.className = 'tcw-modal-body';\n this.modal.appendChild(this.bodyEl);\n this.renderTabContent();\n\n // Footer\n const footer = document.createElement('div');\n footer.className = 'tcw-modal-footer';\n const resetBtn = document.createElement('button');\n resetBtn.className = 'tcw-reset-link';\n resetBtn.textContent = 'Reset to defaults';\n resetBtn.addEventListener('click', () => this.callbacks.onReset());\n footer.appendChild(resetBtn);\n const doneBtn = document.createElement('button');\n doneBtn.className = 'tcw-done-btn';\n doneBtn.textContent = 'Done';\n doneBtn.addEventListener('click', () => {\n this.callbacks.onClose();\n this.close();\n });\n footer.appendChild(doneBtn);\n this.modal.appendChild(footer);\n\n document.body.appendChild(this.modal);\n\n // Escape key\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n document.removeEventListener('keydown', onKeyDown);\n this.callbacks.onClose();\n this.close();\n }\n };\n document.addEventListener('keydown', onKeyDown);\n }\n\n private renderTabContent(): void {\n if (!this.bodyEl || !this.currentSettings) return;\n this.bodyEl.innerHTML = '';\n\n switch (this.currentTab) {\n case 'style':\n this.renderStyleTab();\n break;\n case 'display':\n this.renderDisplayTab();\n break;\n case 'scale':\n this.renderScaleTab();\n break;\n }\n }\n\n private renderStyleTab(): void {\n if (!this.bodyEl || !this.currentSettings) return;\n const s = this.currentSettings;\n\n // Candle Colors\n const candleSection = this.section('Candle Colors');\n candleSection.appendChild(this.colorRow('Up Body', s.candleUpColor, (v) => this.patch({ candleUpColor: v })));\n candleSection.appendChild(this.colorRow('Down Body', s.candleDownColor, (v) => this.patch({ candleDownColor: v })));\n candleSection.appendChild(this.colorRow('Up Wick', s.candleUpWick, (v) => this.patch({ candleUpWick: v })));\n candleSection.appendChild(this.colorRow('Down Wick', s.candleDownWick, (v) => this.patch({ candleDownWick: v })));\n this.bodyEl.appendChild(candleSection);\n\n // Background\n const bgSection = this.section('Background');\n bgSection.appendChild(this.colorRow('Background', s.backgroundColor, (v) => this.patch({ backgroundColor: v })));\n bgSection.appendChild(this.colorRow('Grid', s.gridColor, (v) => this.patch({ gridColor: v })));\n this.bodyEl.appendChild(bgSection);\n }\n\n private renderDisplayTab(): void {\n if (!this.bodyEl || !this.currentSettings) return;\n const s = this.currentSettings;\n\n const section = this.section();\n section.appendChild(this.toggleRow('Grid Lines', s.gridVisible, (v) => this.patch({ gridVisible: v })));\n section.appendChild(this.toggleRow('Volume', s.volumeVisible, (v) => this.patch({ volumeVisible: v })));\n section.appendChild(this.toggleRow('Volume Profile', s.volumeProfileVisible, (v) => this.patch({ volumeProfileVisible: v })));\n section.appendChild(this.toggleRow('OHLC Legend', s.legendVisible, (v) => this.patch({ legendVisible: v })));\n section.appendChild(this.toggleRow('Bar Countdown', s.barCountdown, (v) => this.patch({ barCountdown: v })));\n\n // Crosshair mode\n section.appendChild(this.selectRow('Crosshair Mode', s.crosshairMode, [\n { label: 'Magnet', value: 'magnet' },\n { label: 'Normal', value: 'normal' },\n { label: 'Hidden', value: 'hidden' },\n ], (v) => this.patch({ crosshairMode: v as ChartSettingsState['crosshairMode'] })));\n\n // Number locale\n section.appendChild(this.selectRow('Number Locale', s.numberLocale, [\n { label: 'en-US (65,234.00)', value: 'en-US' },\n { label: 'de-DE (65.234,00)', value: 'de-DE' },\n { label: 'fr-FR (65 234,00)', value: 'fr-FR' },\n { label: 'vi-VN (65.234,00)', value: 'vi-VN' },\n { label: 'en-IN (65,234.00)', value: 'en-IN' },\n { label: 'ja-JP (65,234.00)', value: 'ja-JP' },\n ], (v) => this.patch({ numberLocale: v })));\n\n this.bodyEl.appendChild(section);\n }\n\n private renderScaleTab(): void {\n if (!this.bodyEl || !this.currentSettings) return;\n const s = this.currentSettings;\n\n const section = this.section();\n section.appendChild(this.toggleRow('Auto Scale', s.autoScale, (v) => this.patch({ autoScale: v })));\n section.appendChild(this.toggleRow('Log Scale', s.logScale, (v) => this.patch({ logScale: v })));\n this.bodyEl.appendChild(section);\n }\n\n private patch(partial: Partial<ChartSettingsState>): void {\n if (this.currentSettings) {\n Object.assign(this.currentSettings, partial);\n }\n this.callbacks.onChange(partial);\n }\n\n private section(title?: string): HTMLDivElement {\n const div = document.createElement('div');\n div.className = 'tcw-settings-section';\n if (title) {\n const t = document.createElement('div');\n t.className = 'tcw-settings-section-title';\n t.textContent = title;\n div.appendChild(t);\n }\n return div;\n }\n\n private colorRow(label: string, value: string, onChange: (v: string) => void): HTMLDivElement {\n const row = document.createElement('div');\n row.className = 'tcw-settings-row';\n\n const lbl = document.createElement('span');\n lbl.className = 'tcw-settings-label';\n lbl.textContent = label;\n row.appendChild(lbl);\n\n const wrap = document.createElement('div');\n wrap.className = 'tcw-color-picker-wrap';\n\n const input = document.createElement('input');\n input.type = 'color';\n input.value = value;\n\n const hex = document.createElement('span');\n hex.className = 'tcw-color-hex';\n hex.textContent = value;\n\n input.addEventListener('input', () => {\n hex.textContent = input.value;\n onChange(input.value);\n });\n\n wrap.appendChild(input);\n wrap.appendChild(hex);\n row.appendChild(wrap);\n return row;\n }\n\n private toggleRow(label: string, value: boolean, onChange: (v: boolean) => void): HTMLDivElement {\n const row = document.createElement('div');\n row.className = 'tcw-settings-row';\n\n const lbl = document.createElement('span');\n lbl.className = 'tcw-settings-label';\n lbl.textContent = label;\n row.appendChild(lbl);\n\n const toggle = document.createElement('button');\n toggle.className = `tcw-toggle${value ? ' tcw-on' : ''}`;\n toggle.addEventListener('click', () => {\n const newVal = !toggle.classList.contains('tcw-on');\n toggle.classList.toggle('tcw-on', newVal);\n onChange(newVal);\n });\n row.appendChild(toggle);\n return row;\n }\n\n private selectRow(\n label: string,\n value: string,\n options: { label: string; value: string }[],\n onChange: (v: string) => void,\n ): HTMLDivElement {\n const row = document.createElement('div');\n row.className = 'tcw-settings-row';\n\n const lbl = document.createElement('span');\n lbl.className = 'tcw-settings-label';\n lbl.textContent = label;\n row.appendChild(lbl);\n\n const select = document.createElement('select');\n select.className = 'tcw-settings-select';\n for (const opt of options) {\n const o = document.createElement('option');\n o.value = opt.value;\n o.textContent = opt.label;\n if (opt.value === value) o.selected = true;\n select.appendChild(o);\n }\n select.addEventListener('change', () => onChange(select.value));\n row.appendChild(select);\n return row;\n }\n\n destroy(): void {\n this.close();\n }\n}\n","export class WidgetStatusBar {\n private el: HTMLDivElement;\n private dotEl: HTMLSpanElement;\n private messageEl: HTMLSpanElement;\n private infoEl: HTMLSpanElement;\n\n constructor(host: HTMLElement) {\n this.el = document.createElement('div');\n this.el.className = 'tcw-statusbar';\n\n const indicator = document.createElement('div');\n indicator.className = 'tcw-status-indicator';\n\n this.dotEl = document.createElement('span');\n this.dotEl.className = 'tcw-status-dot';\n indicator.appendChild(this.dotEl);\n\n this.messageEl = document.createElement('span');\n indicator.appendChild(this.messageEl);\n\n this.el.appendChild(indicator);\n\n this.infoEl = document.createElement('span');\n this.el.appendChild(this.infoEl);\n\n host.appendChild(this.el);\n }\n\n update(state: { connectionState: string; message: string; symbol: string; timeframe: string }): void {\n this.dotEl.className = 'tcw-status-dot';\n if (state.connectionState === 'connected') {\n this.dotEl.classList.add('tcw-connected');\n } else if (state.connectionState === 'error') {\n this.dotEl.classList.add('tcw-error');\n }\n\n this.messageEl.textContent = state.message;\n this.infoEl.textContent = `${state.symbol} ${state.timeframe}`;\n }\n\n destroy(): void {\n this.el.remove();\n }\n}\n","import type { ChartType, DrawingToolType, TimeFrame } from '@tradecanvas/commons';\n\nexport interface CommandItem {\n id: string;\n label: string;\n category: 'indicator' | 'chartType' | 'drawing' | 'timeframe' | 'action';\n shortcut?: string;\n active?: boolean;\n}\n\nexport interface CommandPaletteCallbacks {\n onIndicator: (id: string) => void;\n onChartType: (type: ChartType) => void;\n onDrawingTool: (tool: DrawingToolType) => void;\n onTimeframe: (tf: TimeFrame) => void;\n onAction: (id: string) => void;\n onClose: () => void;\n}\n\nexport class WidgetCommandPalette {\n private backdrop: HTMLDivElement | null = null;\n private modal: HTMLDivElement | null = null;\n private input: HTMLInputElement | null = null;\n private list: HTMLDivElement | null = null;\n private items: CommandItem[] = [];\n private filtered: CommandItem[] = [];\n private selectedIndex = 0;\n private callbacks: CommandPaletteCallbacks;\n private boundKeydown: (e: KeyboardEvent) => void;\n\n constructor(callbacks: CommandPaletteCallbacks) {\n this.callbacks = callbacks;\n this.boundKeydown = this.handleKeydown.bind(this);\n }\n\n open(items: CommandItem[]): void {\n if (this.backdrop) return;\n this.items = items;\n this.filtered = items;\n this.selectedIndex = 0;\n\n this.backdrop = document.createElement('div');\n this.backdrop.className = 'tcw-modal-backdrop';\n this.backdrop.addEventListener('click', () => this.close());\n\n this.modal = document.createElement('div');\n this.modal.className = 'tcw-cmd-palette';\n\n const header = document.createElement('div');\n header.className = 'tcw-cmd-header';\n\n const searchIcon = document.createElement('span');\n searchIcon.className = 'tcw-cmd-icon';\n searchIcon.textContent = '⌕';\n header.appendChild(searchIcon);\n\n this.input = document.createElement('input');\n this.input.className = 'tcw-cmd-input';\n this.input.type = 'text';\n this.input.placeholder = 'Search indicators, chart types, tools...';\n this.input.addEventListener('input', () => this.filter());\n header.appendChild(this.input);\n\n const hint = document.createElement('span');\n hint.className = 'tcw-cmd-hint';\n hint.textContent = 'ESC';\n header.appendChild(hint);\n\n this.modal.appendChild(header);\n\n this.list = document.createElement('div');\n this.list.className = 'tcw-cmd-list';\n this.modal.appendChild(this.list);\n\n const footer = document.createElement('div');\n footer.className = 'tcw-cmd-footer';\n footer.innerHTML = '<span>↑↓ Navigate</span><span>⏎ Select</span><span>Esc Close</span>';\n this.modal.appendChild(footer);\n\n document.body.appendChild(this.backdrop);\n document.body.appendChild(this.modal);\n\n this.renderList();\n this.input.focus();\n document.addEventListener('keydown', this.boundKeydown);\n }\n\n close(): void {\n document.removeEventListener('keydown', this.boundKeydown);\n this.backdrop?.remove();\n this.modal?.remove();\n this.backdrop = null;\n this.modal = null;\n this.input = null;\n this.list = null;\n this.callbacks.onClose();\n }\n\n isOpen(): boolean {\n return this.backdrop !== null;\n }\n\n private filter(): void {\n const query = this.input?.value.toLowerCase().trim() ?? '';\n if (!query) {\n this.filtered = this.items;\n } else {\n this.filtered = this.items.filter(item =>\n item.label.toLowerCase().includes(query) ||\n item.category.toLowerCase().includes(query) ||\n item.id.toLowerCase().includes(query),\n );\n }\n this.selectedIndex = 0;\n this.renderList();\n }\n\n private renderList(): void {\n if (!this.list) return;\n this.list.innerHTML = '';\n\n if (this.filtered.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'tcw-cmd-empty';\n empty.textContent = 'No results found';\n this.list.appendChild(empty);\n return;\n }\n\n let currentCategory = '';\n for (let i = 0; i < this.filtered.length; i++) {\n const item = this.filtered[i];\n\n if (item.category !== currentCategory) {\n currentCategory = item.category;\n const label = document.createElement('div');\n label.className = 'tcw-cmd-category';\n label.textContent = this.categoryLabel(currentCategory);\n this.list.appendChild(label);\n }\n\n const row = document.createElement('button');\n row.className = 'tcw-cmd-item';\n if (i === this.selectedIndex) row.classList.add('tcw-selected');\n if (item.active) row.classList.add('tcw-active');\n row.dataset.index = String(i);\n\n const nameSpan = document.createElement('span');\n nameSpan.className = 'tcw-cmd-item-label';\n nameSpan.textContent = item.label;\n row.appendChild(nameSpan);\n\n if (item.active) {\n const check = document.createElement('span');\n check.className = 'tcw-cmd-check';\n check.textContent = '✓';\n row.appendChild(check);\n }\n\n if (item.shortcut) {\n const kbd = document.createElement('kbd');\n kbd.className = 'tcw-cmd-kbd';\n kbd.textContent = item.shortcut;\n row.appendChild(kbd);\n }\n\n row.addEventListener('click', () => this.select(i));\n row.addEventListener('mouseenter', () => {\n this.selectedIndex = i;\n this.updateSelection();\n });\n\n this.list.appendChild(row);\n }\n }\n\n private updateSelection(): void {\n if (!this.list) return;\n const items = this.list.querySelectorAll('.tcw-cmd-item');\n items.forEach((el, i) => {\n el.classList.toggle('tcw-selected', i === this.selectedIndex);\n });\n items[this.selectedIndex]?.scrollIntoView({ block: 'nearest' });\n }\n\n private select(index: number): void {\n const item = this.filtered[index];\n if (!item) return;\n\n switch (item.category) {\n case 'indicator':\n this.callbacks.onIndicator(item.id);\n break;\n case 'chartType':\n this.callbacks.onChartType(item.id as ChartType);\n break;\n case 'drawing':\n this.callbacks.onDrawingTool(item.id as DrawingToolType);\n break;\n case 'timeframe':\n this.callbacks.onTimeframe(item.id as TimeFrame);\n break;\n case 'action':\n this.callbacks.onAction(item.id);\n break;\n }\n this.close();\n }\n\n private handleKeydown(e: KeyboardEvent): void {\n switch (e.key) {\n case 'Escape':\n e.preventDefault();\n this.close();\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (this.filtered.length > 0) {\n this.selectedIndex = (this.selectedIndex + 1) % this.filtered.length;\n this.updateSelection();\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (this.filtered.length > 0) {\n this.selectedIndex = (this.selectedIndex - 1 + this.filtered.length) % this.filtered.length;\n this.updateSelection();\n }\n break;\n case 'Enter':\n e.preventDefault();\n this.select(this.selectedIndex);\n break;\n }\n }\n\n private categoryLabel(cat: string): string {\n switch (cat) {\n case 'indicator': return 'Indicators';\n case 'chartType': return 'Chart Types';\n case 'drawing': return 'Drawing Tools';\n case 'timeframe': return 'Timeframes';\n case 'action': return 'Actions';\n default: return cat;\n }\n }\n\n destroy(): void {\n this.close();\n }\n}\n","/**\n * Lightweight fuzzy symbol picker. Reuses the command-palette CSS for visual\n * consistency. Scoring is a cheap subsequence match — good enough for symbol\n * lists in the low thousands without pulling in a fuzzy-search dependency.\n */\nexport interface SymbolSearchCallbacks {\n onPick: (symbol: string) => void;\n onClose: () => void;\n}\n\ninterface ScoredSymbol {\n symbol: string;\n score: number;\n}\n\nexport class WidgetSymbolSearch {\n private backdrop: HTMLDivElement | null = null;\n private modal: HTMLDivElement | null = null;\n private input: HTMLInputElement | null = null;\n private list: HTMLDivElement | null = null;\n private symbols: string[] = [];\n private current: string = '';\n private filtered: ScoredSymbol[] = [];\n private selectedIndex = 0;\n private callbacks: SymbolSearchCallbacks;\n private boundKeydown: (e: KeyboardEvent) => void;\n\n constructor(callbacks: SymbolSearchCallbacks) {\n this.callbacks = callbacks;\n this.boundKeydown = this.handleKeydown.bind(this);\n }\n\n open(symbols: string[], current: string): void {\n if (this.backdrop) return;\n this.symbols = symbols;\n this.current = current;\n this.filtered = symbols.map(s => ({ symbol: s, score: 0 }));\n this.selectedIndex = Math.max(0, symbols.indexOf(current));\n\n this.backdrop = document.createElement('div');\n this.backdrop.className = 'tcw-modal-backdrop';\n this.backdrop.addEventListener('click', () => this.close());\n\n this.modal = document.createElement('div');\n this.modal.className = 'tcw-cmd-palette';\n\n const header = document.createElement('div');\n header.className = 'tcw-cmd-header';\n\n const icon = document.createElement('span');\n icon.className = 'tcw-cmd-icon';\n icon.innerHTML = svgSearch();\n header.appendChild(icon);\n\n this.input = document.createElement('input');\n this.input.className = 'tcw-cmd-input';\n this.input.type = 'text';\n this.input.placeholder = 'Search symbol… (e.g. BTC, ETH, AAPL)';\n this.input.autocomplete = 'off';\n this.input.spellcheck = false;\n this.input.addEventListener('input', () => this.filter());\n header.appendChild(this.input);\n\n const hint = document.createElement('span');\n hint.className = 'tcw-cmd-hint';\n hint.textContent = 'ESC';\n header.appendChild(hint);\n\n this.modal.appendChild(header);\n\n this.list = document.createElement('div');\n this.list.className = 'tcw-cmd-list';\n this.modal.appendChild(this.list);\n\n const footer = document.createElement('div');\n footer.className = 'tcw-cmd-footer';\n footer.innerHTML = '<span>↑↓ Navigate</span><span>⏎ Open</span><span>Esc Close</span>';\n this.modal.appendChild(footer);\n\n document.body.appendChild(this.backdrop);\n document.body.appendChild(this.modal);\n\n this.renderList();\n this.input.focus();\n document.addEventListener('keydown', this.boundKeydown);\n }\n\n close(): void {\n document.removeEventListener('keydown', this.boundKeydown);\n this.backdrop?.remove();\n this.modal?.remove();\n this.backdrop = null;\n this.modal = null;\n this.input = null;\n this.list = null;\n this.callbacks.onClose();\n }\n\n isOpen(): boolean {\n return this.backdrop !== null;\n }\n\n destroy(): void {\n this.close();\n }\n\n private filter(): void {\n const q = (this.input?.value ?? '').toUpperCase().trim();\n if (!q) {\n this.filtered = this.symbols.map(s => ({ symbol: s, score: 0 }));\n } else {\n this.filtered = this.symbols\n .map(s => ({ symbol: s, score: scoreMatch(s.toUpperCase(), q) }))\n .filter(r => r.score > 0)\n .sort((a, b) => b.score - a.score);\n }\n this.selectedIndex = 0;\n this.renderList();\n }\n\n private renderList(): void {\n if (!this.list) return;\n this.list.innerHTML = '';\n\n if (this.filtered.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'tcw-cmd-empty';\n empty.textContent = 'No symbols match';\n this.list.appendChild(empty);\n return;\n }\n\n const query = (this.input?.value ?? '').toUpperCase().trim();\n for (let i = 0; i < this.filtered.length; i++) {\n const { symbol } = this.filtered[i];\n const row = document.createElement('button');\n row.className = 'tcw-cmd-item';\n if (i === this.selectedIndex) row.classList.add('tcw-selected');\n if (symbol === this.current) row.classList.add('tcw-active');\n\n const label = document.createElement('span');\n label.className = 'tcw-cmd-item-label';\n label.innerHTML = highlight(symbol, query);\n row.appendChild(label);\n\n if (symbol === this.current) {\n const check = document.createElement('span');\n check.className = 'tcw-cmd-check';\n check.textContent = '✓';\n row.appendChild(check);\n }\n\n row.addEventListener('click', () => this.pick(i));\n row.addEventListener('mouseenter', () => {\n this.selectedIndex = i;\n this.updateSelection();\n });\n\n this.list.appendChild(row);\n }\n }\n\n private updateSelection(): void {\n if (!this.list) return;\n const items = this.list.querySelectorAll('.tcw-cmd-item');\n items.forEach((el, i) => el.classList.toggle('tcw-selected', i === this.selectedIndex));\n items[this.selectedIndex]?.scrollIntoView({ block: 'nearest' });\n }\n\n private pick(index: number): void {\n const entry = this.filtered[index];\n if (!entry) return;\n this.callbacks.onPick(entry.symbol);\n this.close();\n }\n\n private handleKeydown(e: KeyboardEvent): void {\n switch (e.key) {\n case 'Escape':\n e.preventDefault();\n this.close();\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (this.filtered.length > 0) {\n this.selectedIndex = (this.selectedIndex + 1) % this.filtered.length;\n this.updateSelection();\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (this.filtered.length > 0) {\n this.selectedIndex = (this.selectedIndex - 1 + this.filtered.length) % this.filtered.length;\n this.updateSelection();\n }\n break;\n case 'Enter':\n e.preventDefault();\n this.pick(this.selectedIndex);\n break;\n }\n }\n}\n\n/**\n * Cheap fuzzy score:\n * exact match → 1000\n * starts-with → 500 + tighter-prefix bonus\n * subsequence match → 100 − gap penalty\n * no match → 0\n */\nfunction scoreMatch(symbol: string, query: string): number {\n if (symbol === query) return 1000;\n if (symbol.startsWith(query)) return 500 + (50 - Math.min(50, symbol.length - query.length));\n if (symbol.includes(query)) return 200 + (50 - Math.min(50, symbol.length - query.length));\n\n let qi = 0;\n let lastIdx = -1;\n let gapPenalty = 0;\n for (let i = 0; i < symbol.length && qi < query.length; i++) {\n if (symbol[i] === query[qi]) {\n if (lastIdx >= 0) gapPenalty += i - lastIdx - 1;\n lastIdx = i;\n qi++;\n }\n }\n if (qi < query.length) return 0;\n return 100 - Math.min(99, gapPenalty);\n}\n\nfunction highlight(symbol: string, query: string): string {\n if (!query) return escapeHtml(symbol);\n const upper = symbol.toUpperCase();\n let out = '';\n let qi = 0;\n for (let i = 0; i < symbol.length; i++) {\n if (qi < query.length && upper[i] === query[qi]) {\n out += `<mark style=\"background:transparent;color:var(--tcw-accent);font-weight:700\">${escapeHtml(symbol[i])}</mark>`;\n qi++;\n } else {\n out += escapeHtml(symbol[i]);\n }\n }\n return out;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"']/g, ch => ({\n '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;',\n } as Record<string, string>)[ch]);\n}\n\nfunction svgSearch(): string {\n return '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"m21 21-4.3-4.3\"/></svg>';\n}\n","/**\n * Keyboard-shortcut reference sheet. Bound to `?` (and `Shift+/`). Surfaces\n * shortcuts so users discover the widget's hidden interaction model — a\n * premium-feel detail TradingView, Linear, Figma, etc. all ship.\n */\nexport interface HotkeySheetCallbacks {\n onClose: () => void;\n}\n\ninterface HotkeyEntry {\n keys: string[];\n label: string;\n}\n\ninterface HotkeyGroup {\n title: string;\n entries: HotkeyEntry[];\n}\n\nconst isMac =\n typeof navigator !== 'undefined' && /mac|iphone|ipad|ipod/i.test(navigator.platform || navigator.userAgent);\nconst mod = isMac ? '⌘' : 'Ctrl';\n\nconst GROUPS: HotkeyGroup[] = [\n {\n title: 'Search & navigation',\n entries: [\n { keys: [mod, 'K'], label: 'Command palette' },\n { keys: [mod, 'P'], label: 'Symbol search' },\n { keys: ['?'], label: 'Show this sheet' },\n ],\n },\n {\n title: 'Chart manipulation',\n entries: [\n { keys: ['Shift', 'Drag'], label: 'Measure tool (bars × price Δ)' },\n { keys: ['Drag', 'Price axis'], label: 'Compress / expand vertical scale' },\n { keys: ['Drag', 'Time axis'], label: 'Zoom time axis' },\n { keys: ['Double-click', 'Price axis'], label: 'Re-enable auto-scale' },\n { keys: ['Double-click', 'Time axis'], label: 'Fit content' },\n { keys: ['Scroll'], label: 'Zoom around cursor' },\n ],\n },\n {\n title: 'Keyboard',\n entries: [\n { keys: ['←', '→'], label: 'Pan one bar' },\n { keys: ['+', '−'], label: 'Zoom in / out' },\n { keys: ['Home'], label: 'Scroll to start' },\n { keys: ['End'], label: 'Scroll to end (live edge)' },\n { keys: ['F'], label: 'Fit content' },\n ],\n },\n {\n title: 'Drawing',\n entries: [\n { keys: [mod, 'Z'], label: 'Undo' },\n { keys: [mod, 'Shift', 'Z'], label: 'Redo' },\n { keys: ['Esc'], label: 'Cancel active drawing' },\n ],\n },\n];\n\nexport class WidgetHotkeySheet {\n private backdrop: HTMLDivElement | null = null;\n private modal: HTMLDivElement | null = null;\n private callbacks: HotkeySheetCallbacks;\n private boundKeydown: (e: KeyboardEvent) => void;\n\n constructor(callbacks: HotkeySheetCallbacks) {\n this.callbacks = callbacks;\n this.boundKeydown = (e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n this.close();\n }\n };\n }\n\n open(): void {\n if (this.backdrop) return;\n\n this.backdrop = document.createElement('div');\n this.backdrop.className = 'tcw-modal-backdrop';\n this.backdrop.addEventListener('click', () => this.close());\n\n this.modal = document.createElement('div');\n this.modal.className = 'tcw-modal tcw-hotkey-sheet';\n this.modal.style.width = '640px';\n\n const header = document.createElement('div');\n header.className = 'tcw-modal-header';\n header.innerHTML = '<h3>Keyboard shortcuts</h3>';\n const closeBtn = document.createElement('button');\n closeBtn.className = 'tcw-modal-close';\n closeBtn.setAttribute('aria-label', 'Close');\n closeBtn.innerHTML = '×';\n closeBtn.addEventListener('click', () => this.close());\n header.appendChild(closeBtn);\n this.modal.appendChild(header);\n\n const body = document.createElement('div');\n body.className = 'tcw-modal-body';\n\n const grid = document.createElement('div');\n grid.className = 'tcw-hotkey-grid';\n\n for (const group of GROUPS) {\n const section = document.createElement('section');\n section.className = 'tcw-hotkey-section';\n const title = document.createElement('div');\n title.className = 'tcw-settings-section-title';\n title.textContent = group.title;\n section.appendChild(title);\n\n for (const entry of group.entries) {\n const row = document.createElement('div');\n row.className = 'tcw-hotkey-row';\n\n const keys = document.createElement('div');\n keys.className = 'tcw-hotkey-keys';\n for (let i = 0; i < entry.keys.length; i++) {\n if (i > 0) {\n const plus = document.createElement('span');\n plus.className = 'tcw-hotkey-sep';\n plus.textContent = '+';\n keys.appendChild(plus);\n }\n const kbd = document.createElement('kbd');\n kbd.className = 'tcw-cmd-kbd';\n kbd.textContent = entry.keys[i];\n keys.appendChild(kbd);\n }\n row.appendChild(keys);\n\n const label = document.createElement('span');\n label.className = 'tcw-hotkey-label';\n label.textContent = entry.label;\n row.appendChild(label);\n\n section.appendChild(row);\n }\n\n grid.appendChild(section);\n }\n\n body.appendChild(grid);\n this.modal.appendChild(body);\n\n const footer = document.createElement('div');\n footer.className = 'tcw-modal-footer';\n footer.innerHTML = '<span style=\"font-size:11px;color:var(--tcw-text-muted)\">Press ? anytime to show this sheet</span>';\n const ok = document.createElement('button');\n ok.className = 'tcw-done-btn';\n ok.textContent = 'Got it';\n ok.addEventListener('click', () => this.close());\n footer.appendChild(ok);\n this.modal.appendChild(footer);\n\n document.body.appendChild(this.backdrop);\n document.body.appendChild(this.modal);\n\n document.addEventListener('keydown', this.boundKeydown);\n }\n\n close(): void {\n document.removeEventListener('keydown', this.boundKeydown);\n this.backdrop?.remove();\n this.modal?.remove();\n this.backdrop = null;\n this.modal = null;\n this.callbacks.onClose();\n }\n\n isOpen(): boolean {\n return this.backdrop !== null;\n }\n\n destroy(): void {\n this.close();\n }\n}\n","/**\n * Replay scrubber bar — surfaces the chart's existing replay engine as a\n * visible bottom-of-chart control. Mounts under the chart container, owns\n * its own lifecycle, and reports user intent up via callbacks (no chart\n * coupling — the host calls chart.replay() / replayPause() / etc.).\n */\nexport interface ReplayBarCallbacks {\n onPlay: () => void;\n onPause: () => void;\n onStop: () => void;\n onStepBack: () => void;\n onStepForward: () => void;\n onSeek: (index: number) => void;\n onSpeedChange: (barsPerSecond: number) => void;\n onClose: () => void;\n}\n\nexport type ReplayBarState = 'playing' | 'paused' | 'stopped';\n\nconst SPEEDS = [0.5, 1, 2, 5, 10, 20, 50, 100];\n\nexport class WidgetReplayBar {\n private root: HTMLDivElement | null = null;\n private scrubber: HTMLInputElement | null = null;\n private progressLabel: HTMLSpanElement | null = null;\n private playBtn: HTMLButtonElement | null = null;\n private state: ReplayBarState = 'stopped';\n private total = 0;\n private speed = 5;\n private callbacks: ReplayBarCallbacks;\n\n constructor(callbacks: ReplayBarCallbacks) {\n this.callbacks = callbacks;\n }\n\n mount(host: HTMLElement, opts: { total: number; speed?: number }): void {\n if (this.root) return;\n this.total = Math.max(0, opts.total);\n this.speed = opts.speed ?? 5;\n this.state = 'paused';\n\n this.root = document.createElement('div');\n this.root.className = 'tcw-replay-bar';\n this.root.innerHTML = this.markup();\n\n host.appendChild(this.root);\n this.wireEvents();\n this.syncUi();\n }\n\n unmount(): void {\n this.root?.remove();\n this.root = null;\n this.scrubber = null;\n this.progressLabel = null;\n this.playBtn = null;\n this.state = 'stopped';\n }\n\n isMounted(): boolean {\n return this.root !== null;\n }\n\n setState(state: ReplayBarState): void {\n this.state = state;\n this.syncUi();\n }\n\n setProgress(current: number, total: number): void {\n this.total = total;\n if (this.scrubber) {\n this.scrubber.max = String(Math.max(0, total - 1));\n this.scrubber.value = String(current);\n }\n if (this.progressLabel) {\n this.progressLabel.textContent = `${current + 1} / ${total}`;\n }\n }\n\n destroy(): void {\n this.unmount();\n }\n\n private markup(): string {\n const speeds = SPEEDS.map(s => `<option value=\"${s}\"${s === this.speed ? ' selected' : ''}>${s}× bars/s</option>`).join('');\n return `\n <button class=\"tcw-replay-btn\" data-act=\"close\" title=\"Exit replay\" aria-label=\"Exit replay\">${svgX()}</button>\n <button class=\"tcw-replay-btn\" data-act=\"stepBack\" title=\"Step back\" aria-label=\"Step back\">${svgStepBack()}</button>\n <button class=\"tcw-replay-btn tcw-replay-play\" data-act=\"play\" title=\"Play / pause\" aria-label=\"Play / pause\">${svgPlay()}</button>\n <button class=\"tcw-replay-btn\" data-act=\"stepForward\" title=\"Step forward\" aria-label=\"Step forward\">${svgStepForward()}</button>\n <input type=\"range\" class=\"tcw-replay-scrubber\" data-act=\"seek\" min=\"0\" max=\"${Math.max(0, this.total - 1)}\" value=\"0\" step=\"1\" />\n <span class=\"tcw-replay-progress\" data-tcw=\"progress\">1 / ${this.total}</span>\n <select class=\"tcw-replay-speed\" data-act=\"speed\">${speeds}</select>\n `;\n }\n\n private wireEvents(): void {\n if (!this.root) return;\n this.scrubber = this.root.querySelector('input[data-act=\"seek\"]');\n this.progressLabel = this.root.querySelector('[data-tcw=\"progress\"]');\n this.playBtn = this.root.querySelector('button[data-act=\"play\"]');\n\n this.root.querySelector('[data-act=\"close\"]')?.addEventListener('click', () => this.callbacks.onClose());\n this.root.querySelector('[data-act=\"stepBack\"]')?.addEventListener('click', () => this.callbacks.onStepBack());\n this.root.querySelector('[data-act=\"stepForward\"]')?.addEventListener('click', () => this.callbacks.onStepForward());\n this.playBtn?.addEventListener('click', () => {\n if (this.state === 'playing') {\n this.callbacks.onPause();\n } else {\n this.callbacks.onPlay();\n }\n });\n this.scrubber?.addEventListener('input', () => {\n const idx = Number(this.scrubber!.value);\n this.callbacks.onSeek(idx);\n });\n (this.root.querySelector('[data-act=\"speed\"]') as HTMLSelectElement | null)?.addEventListener('change', (e) => {\n const v = Number((e.target as HTMLSelectElement).value);\n this.speed = v;\n this.callbacks.onSpeedChange(v);\n });\n }\n\n private syncUi(): void {\n if (!this.playBtn) return;\n this.playBtn.innerHTML = this.state === 'playing' ? svgPause() : svgPlay();\n this.playBtn.title = this.state === 'playing' ? 'Pause' : 'Play';\n }\n}\n\nfunction svgPlay(): string {\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M8 5v14l11-7L8 5z\"/></svg>';\n}\nfunction svgPause(): string {\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 5h4v14H6zM14 5h4v14h-4z\"/></svg>';\n}\nfunction svgStepBack(): string {\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6 6h2v12H6zM20 6L9 12l11 6V6z\"/></svg>';\n}\nfunction svgStepForward(): string {\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M4 6l11 6L4 18V6zM16 6h2v12h-2z\"/></svg>';\n}\nfunction svgX(): string {\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>';\n}\n","/**\n * Watchlist sidebar — vertical list of symbols, each with last price, %\n * change, and a mini sparkline. Clicking switches the chart's symbol.\n *\n * The widget tracks the *active* symbol's price/spark automatically from the\n * live stream. For non-active symbols, the host can push data via\n * `setEntry(symbol, …)` so the row reflects whatever the app already has.\n */\nexport interface WatchlistEntry {\n symbol: string;\n lastPrice?: number;\n /** Reference price for % calc (usually session open or 24h-ago close). */\n refPrice?: number;\n /** Recent close samples for the sparkline — last point is the live price. */\n sparkline?: number[];\n}\n\nexport interface WatchlistCallbacks {\n onSelect: (symbol: string) => void;\n}\n\nexport class WidgetWatchlist {\n private el: HTMLDivElement;\n private listEl: HTMLDivElement;\n private rowMap = new Map<string, {\n row: HTMLDivElement;\n priceEl: HTMLSpanElement;\n changeEl: HTMLSpanElement;\n sparkCanvas: HTMLCanvasElement;\n }>();\n private entries = new Map<string, WatchlistEntry>();\n private active: string | null = null;\n private callbacks: WatchlistCallbacks;\n\n constructor(host: HTMLElement, symbols: string[], callbacks: WatchlistCallbacks) {\n this.callbacks = callbacks;\n\n this.el = document.createElement('div');\n this.el.className = 'tcw-watchlist';\n\n const header = document.createElement('div');\n header.className = 'tcw-watchlist-header';\n header.textContent = 'Watchlist';\n this.el.appendChild(header);\n\n this.listEl = document.createElement('div');\n this.listEl.className = 'tcw-watchlist-list';\n this.el.appendChild(this.listEl);\n\n for (const symbol of symbols) {\n this.entries.set(symbol, { symbol });\n this.appendRow(symbol);\n }\n\n host.appendChild(this.el);\n }\n\n /** Replace the symbol set. Rows are diff'd so DOM churn is minimal. */\n setSymbols(symbols: string[]): void {\n const next = new Set(symbols);\n for (const sym of this.rowMap.keys()) {\n if (!next.has(sym)) this.removeRow(sym);\n }\n for (const sym of symbols) {\n if (!this.rowMap.has(sym)) {\n this.entries.set(sym, this.entries.get(sym) ?? { symbol: sym });\n this.appendRow(sym);\n }\n }\n }\n\n setActive(symbol: string): void {\n if (this.active === symbol) return;\n if (this.active && this.rowMap.has(this.active)) {\n this.rowMap.get(this.active)!.row.classList.remove('tcw-watchlist-active');\n }\n this.active = symbol;\n const cur = this.rowMap.get(symbol);\n if (cur) cur.row.classList.add('tcw-watchlist-active');\n }\n\n /** Push a price tick into a row. The widget calls this automatically for\n * the active symbol. Apps can call it for the rest. */\n setEntry(symbol: string, patch: Partial<WatchlistEntry>): void {\n const prev = this.entries.get(symbol) ?? { symbol };\n const next = { ...prev, ...patch };\n this.entries.set(symbol, next);\n this.renderRow(symbol);\n }\n\n destroy(): void {\n this.el.remove();\n this.rowMap.clear();\n this.entries.clear();\n }\n\n private appendRow(symbol: string): void {\n const row = document.createElement('div');\n row.className = 'tcw-watchlist-row';\n row.tabIndex = 0;\n\n const label = document.createElement('div');\n label.className = 'tcw-watchlist-symbol';\n label.textContent = formatSymbol(symbol);\n\n const spark = document.createElement('canvas');\n spark.className = 'tcw-watchlist-spark';\n spark.width = 64;\n spark.height = 22;\n\n const right = document.createElement('div');\n right.className = 'tcw-watchlist-stats';\n const priceEl = document.createElement('span');\n priceEl.className = 'tcw-watchlist-price';\n priceEl.textContent = '—';\n const changeEl = document.createElement('span');\n changeEl.className = 'tcw-watchlist-change';\n changeEl.textContent = '';\n right.appendChild(priceEl);\n right.appendChild(changeEl);\n\n row.appendChild(label);\n row.appendChild(spark);\n row.appendChild(right);\n\n row.addEventListener('click', () => this.callbacks.onSelect(symbol));\n row.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.callbacks.onSelect(symbol);\n }\n });\n\n this.listEl.appendChild(row);\n this.rowMap.set(symbol, { row, priceEl, changeEl, sparkCanvas: spark });\n if (symbol === this.active) row.classList.add('tcw-watchlist-active');\n }\n\n private removeRow(symbol: string): void {\n const ref = this.rowMap.get(symbol);\n if (!ref) return;\n ref.row.remove();\n this.rowMap.delete(symbol);\n }\n\n private renderRow(symbol: string): void {\n const ref = this.rowMap.get(symbol);\n const entry = this.entries.get(symbol);\n if (!ref || !entry) return;\n\n if (entry.lastPrice !== undefined) {\n ref.priceEl.textContent = formatPrice(entry.lastPrice);\n }\n\n if (entry.lastPrice !== undefined && entry.refPrice !== undefined && entry.refPrice !== 0) {\n const diff = entry.lastPrice - entry.refPrice;\n const pct = (diff / entry.refPrice) * 100;\n const sign = diff >= 0 ? '+' : '';\n ref.changeEl.textContent = `${sign}${pct.toFixed(2)}%`;\n ref.changeEl.className = `tcw-watchlist-change ${diff >= 0 ? 'tcw-up' : 'tcw-down'}`;\n } else {\n ref.changeEl.textContent = '';\n }\n\n if (entry.sparkline && entry.sparkline.length >= 2) {\n drawSparkline(ref.sparkCanvas, entry.sparkline, entry.refPrice ?? entry.sparkline[0]);\n }\n }\n}\n\nfunction formatSymbol(symbol: string): string {\n // Add a / separator for typical crypto pair suffixes; leaves stock tickers\n // (AAPL, NVDA) alone.\n for (const quote of ['USDT', 'USD', 'BTC', 'ETH', 'EUR']) {\n if (symbol.length > quote.length && symbol.endsWith(quote)) {\n return symbol.slice(0, -quote.length) + '/' + quote;\n }\n }\n return symbol;\n}\n\nfunction formatPrice(v: number): string {\n if (v === 0) return '0';\n const abs = Math.abs(v);\n if (abs >= 1000) return v.toFixed(2);\n if (abs >= 1) return v.toFixed(4);\n return v.toPrecision(4);\n}\n\nfunction drawSparkline(canvas: HTMLCanvasElement, samples: number[], ref: number): void {\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n const dpr = window.devicePixelRatio || 1;\n if (canvas.width !== canvas.clientWidth * dpr) {\n canvas.width = (canvas.clientWidth || 64) * dpr;\n canvas.height = (canvas.clientHeight || 22) * dpr;\n }\n const w = canvas.width;\n const h = canvas.height;\n\n let lo = Infinity, hi = -Infinity;\n for (const v of samples) {\n if (v < lo) lo = v;\n if (v > hi) hi = v;\n }\n const span = Math.max(hi - lo, 1e-9);\n const last = samples[samples.length - 1];\n const up = last >= ref;\n const color = up ? '#26a17b' : '#f23645';\n\n ctx.clearRect(0, 0, w, h);\n ctx.lineWidth = 1.4 * dpr;\n ctx.strokeStyle = color;\n ctx.beginPath();\n const step = w / (samples.length - 1);\n for (let i = 0; i < samples.length; i++) {\n const x = i * step;\n const y = h - ((samples[i] - lo) / span) * (h - 4) - 2;\n if (i === 0) ctx.moveTo(x, y); else ctx.lineTo(x, y);\n }\n ctx.stroke();\n}\n","import type { ChartType, DrawingToolType, Theme, TimeFrame } from '@tradecanvas/commons';\nimport { Chart } from '../Chart.js';\nimport { DARK_THEME, LIGHT_THEME } from '@tradecanvas/commons';\nimport type { ChartWidgetOptions, WidgetState, ChartSettingsState } from './types.js';\nimport { TIMEFRAMES, CHART_TYPES, INDICATORS, POPULAR_INDICATORS, DRAWING_TOOL_GROUPS, DEFAULT_SYMBOLS, DEFAULT_SETTINGS } from './widgetConfig.js';\nimport { injectWidgetStyles, removeWidgetStyles } from './WidgetStyles.js';\nimport { WidgetToolbar } from './WidgetToolbar.js';\nimport { WidgetDrawingSidebar } from './WidgetDrawingSidebar.js';\nimport { WidgetSettings } from './WidgetSettings.js';\nimport { WidgetStatusBar } from './WidgetStatusBar.js';\nimport { WidgetCommandPalette } from './WidgetCommandPalette.js';\nimport { WidgetSymbolSearch } from './WidgetSymbolSearch.js';\nimport { WidgetHotkeySheet } from './WidgetHotkeySheet.js';\nimport { WidgetReplayBar } from './WidgetReplayBar.js';\nimport { WidgetWatchlist, type WatchlistEntry } from './WidgetWatchlist.js';\nimport { DragDropImporter } from '../io/index.js';\nimport type { DataSeries } from '@tradecanvas/commons';\nimport type { CommandItem } from './WidgetCommandPalette.js';\n\nexport class ChartWidget {\n private chart: Chart;\n private state: WidgetState;\n private toolbar: WidgetToolbar | null = null;\n private sidebar: WidgetDrawingSidebar | null = null;\n private settings: WidgetSettings | null = null;\n private statusBar: WidgetStatusBar | null = null;\n private commandPalette: WidgetCommandPalette | null = null;\n private symbolSearch: WidgetSymbolSearch | null = null;\n private hotkeySheet: WidgetHotkeySheet | null = null;\n private replayBar: WidgetReplayBar | null = null;\n private dragDrop: DragDropImporter | null = null;\n private watchlist: WidgetWatchlist | null = null;\n private watchlistSparkBuffer = new Map<string, number[]>();\n private sessionRefPrice: number | null = null;\n private watchlistInterval: ReturnType<typeof setInterval> | null = null;\n private replayOriginalData: DataSeries | null = null;\n private replayPollInterval: ReturnType<typeof setInterval> | null = null;\n private replaySpeed = 5;\n private layoutKeyPrefix: string | null = null;\n private layoutDebounceMs = 1500;\n private activeLayoutKey: string | null = null;\n private root: HTMLDivElement;\n private chartContainer: HTMLDivElement;\n private destroyed = false;\n private options: ChartWidgetOptions;\n private symbols: string[];\n private settingsState: ChartSettingsState;\n private adapter: import('@tradecanvas/commons').DataAdapter | null = null;\n private boundGlobalKeydown: ((e: KeyboardEvent) => void) | null = null;\n\n constructor(container: HTMLElement, options: ChartWidgetOptions = {}) {\n this.options = options;\n this.symbols = options.symbols ?? DEFAULT_SYMBOLS;\n this.settingsState = { ...DEFAULT_SETTINGS };\n\n // Resolve layout persistence config. Treated as opt-in — defaults to\n // `false` so existing apps don't suddenly start writing to localStorage.\n if (options.persistLayouts) {\n const cfg = options.persistLayouts === true ? {} : options.persistLayouts;\n this.layoutKeyPrefix = cfg.keyPrefix ?? 'tcw:layout:';\n this.layoutDebounceMs = cfg.debounceMs ?? 1500;\n }\n\n // Resolve theme\n const isDark = this.resolveIsDark(options.theme);\n const resolvedTheme = this.resolveTheme(options.theme);\n\n // Initialize state\n this.state = {\n symbol: options.symbol ?? this.symbols[0] ?? 'BTCUSDT',\n timeframe: options.timeframe ?? '5m',\n chartType: options.chartOptions?.chartType ?? 'candlestick',\n isDark,\n activeIndicators: new Map(),\n activeTool: null,\n magnetEnabled: true,\n connectionState: 'connecting',\n connectionMessage: 'Connecting...',\n };\n\n\n // 1. Inject styles\n injectWidgetStyles();\n\n // 2. Create DOM skeleton\n this.root = document.createElement('div');\n this.root.className = 'tcw-root';\n this.root.dataset.tcwTheme = isDark ? 'dark' : 'light';\n container.appendChild(this.root);\n\n // 3. Create toolbar\n if (options.toolbar !== false) {\n this.toolbar = new WidgetToolbar(\n this.root,\n {\n symbols: this.symbols,\n timeframes: options.timeframes\n ? TIMEFRAMES.filter(tf => (options.timeframes as TimeFrame[]).includes(tf.value))\n : TIMEFRAMES,\n chartTypes: options.chartTypes\n ? CHART_TYPES.filter(ct => (options.chartTypes as ChartType[]).includes(ct.value))\n : CHART_TYPES,\n indicators: INDICATORS,\n popularIndicatorIds: POPULAR_INDICATORS,\n },\n {\n onSymbolClick: () => this.handleSymbolClick(),\n onTimeframe: (tf) => this.handleTimeframe(tf),\n onChartType: (type) => this.handleChartType(type),\n onAddIndicator: (id) => this.handleAddIndicator(id),\n onRemoveIndicator: (iid) => this.handleRemoveIndicator(iid),\n onScreenshot: () => this.chart.screenshot(),\n onSettings: () => this.openSettings(),\n onToggleTheme: () => this.handleToggleTheme(),\n onToggleReplay: () => this.toggleReplay(),\n },\n );\n }\n\n // 4. Create body\n const body = document.createElement('div');\n body.className = 'tcw-body';\n\n if (options.drawingTools !== false) {\n this.sidebar = new WidgetDrawingSidebar(\n body,\n { drawingToolGroups: DRAWING_TOOL_GROUPS },\n {\n onDrawingTool: (tool) => this.handleDrawingTool(tool),\n onCancelDrawing: () => this.handleCancelDrawing(),\n onToggleMagnet: () => this.handleToggleMagnet(),\n onUndo: () => this.chart.undo(),\n onRedo: () => this.chart.redo(),\n onClearDrawings: () => {\n this.chart.clearDrawings();\n this.state = { ...this.state, activeTool: null };\n this.updateUI();\n },\n },\n );\n }\n\n this.chartContainer = document.createElement('div');\n this.chartContainer.className = 'tcw-chart-container';\n body.appendChild(this.chartContainer);\n\n // Watchlist sidebar (right side). Appended AFTER the chart container so\n // it sits to the right of the canvas in the flexbox row.\n if (options.watchlist) {\n this.watchlist = new WidgetWatchlist(body, this.symbols, {\n onSelect: (sym) => { void this.setSymbol(sym); },\n });\n this.watchlist.setActive(this.state.symbol);\n }\n\n this.root.appendChild(body);\n\n // 5. Create chart\n this.chart = new Chart(this.chartContainer, {\n chartType: this.state.chartType,\n theme: resolvedTheme,\n autoScale: true,\n crosshair: { mode: 'magnet' },\n features: {\n drawings: true,\n drawingMagnet: true,\n drawingUndoRedo: true,\n indicators: true,\n trading: options.trading !== false,\n tradingContextMenu: options.trading !== false,\n volume: true,\n legend: true,\n crosshair: true,\n keyboard: true,\n screenshot: true,\n alerts: true,\n barCountdown: true,\n logScale: true,\n watermark: true,\n },\n ...options.chartOptions,\n });\n\n // Drag-and-drop CSV / JSON onto the chart container — instant data load.\n // Opt-out via `dragDropImport: false`. The adapter (live stream) keeps\n // running but the next bar update will append to whatever we just\n // loaded — that's the expected behavior when overlaying historical data.\n if (options.dragDropImport !== false) {\n this.dragDrop = new DragDropImporter(this.chartContainer, {\n onData: (data, result, file) => {\n this.chart.setData(data);\n this.toast(`Loaded ${result.data.length} bars from ${file.name}` + (result.skipped > 0 ? ` (${result.skipped} skipped)` : ''));\n },\n onError: (err, file) => {\n this.toast(`${file.name}: ${err.message}`, 'error');\n },\n });\n this.dragDrop.attach();\n }\n\n // 6. Create status bar\n if (options.statusBar !== false) {\n this.statusBar = new WidgetStatusBar(this.root);\n }\n\n // 7. Create settings (lazy, not appended until opened)\n if (options.settings !== false) {\n this.settings = new WidgetSettings({\n onChange: (patch) => this.applySettings(patch),\n onReset: () => this.resetSettings(),\n onClose: () => {},\n });\n }\n\n // 8a. Symbol search\n this.symbolSearch = new WidgetSymbolSearch({\n onPick: (sym) => { void this.setSymbol(sym); },\n onClose: () => {},\n });\n this.hotkeySheet = new WidgetHotkeySheet({ onClose: () => {} });\n\n // 8b. Command palette\n this.commandPalette = new WidgetCommandPalette({\n onIndicator: (id) => this.handleAddIndicator(id),\n onChartType: (type) => this.handleChartType(type),\n onDrawingTool: (tool) => this.handleDrawingTool(tool),\n onTimeframe: (tf) => this.handleTimeframe(tf),\n onAction: (id) => this.handleAction(id),\n onClose: () => {},\n });\n\n this.boundGlobalKeydown = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'k') {\n e.preventDefault();\n this.toggleCommandPalette();\n } else if ((e.ctrlKey || e.metaKey) && (e.key === 'p' || e.key === 'P')) {\n // Ctrl/Cmd+P → symbol search (matches Bloomberg / many trading UIs)\n e.preventDefault();\n this.symbolSearch?.open(this.symbols, this.state.symbol);\n } else if (e.key === '?' && !e.ctrlKey && !e.metaKey && !e.altKey) {\n // Only fire when the user isn't typing into an input.\n const active = document.activeElement as HTMLElement | null;\n if (active && (active.tagName === 'INPUT' || active.tagName === 'TEXTAREA' || active.isContentEditable)) return;\n e.preventDefault();\n this.hotkeySheet?.open();\n }\n };\n document.addEventListener('keydown', this.boundGlobalKeydown);\n\n // 9. Connect stream\n if (options.adapter) {\n this.adapter = options.adapter;\n this.connectStream();\n }\n\n // Watchlist live-update loop. 1s cadence keeps DOM churn low while still\n // feeling responsive; for sub-second visual response, apps can call\n // `setWatchlistEntry` directly from their own WebSocket.\n if (this.watchlist) {\n this.watchlistInterval = setInterval(() => this.tickWatchlist(), 1000);\n }\n\n // Initial UI update\n this.updateUI();\n\n // 9. Fire onReady\n options.onReady?.(this.chart);\n }\n\n // --- Public API ---\n\n /** Replace the searchable symbol catalog. Does not change the active symbol. */\n setSymbols(symbols: string[]): void {\n this.symbols = symbols;\n this.watchlist?.setSymbols(symbols);\n }\n\n async setSymbol(symbol: string): Promise<void> {\n // Flush the outgoing symbol's layout BEFORE switching state, so the\n // saved snapshot reflects what the user actually saw under that ticker.\n this.flushActiveLayout();\n this.state = { ...this.state, symbol };\n this.sessionRefPrice = null;\n this.options.onSymbolChange?.(symbol);\n this.updateUI();\n this.watchlist?.setActive(symbol);\n if (this.adapter) {\n await this.connectStream();\n }\n }\n\n /**\n * Push an entry into the watchlist (e.g., from your own WebSocket).\n * Call with the symbols you care about; the active symbol is updated\n * automatically from the chart's live data.\n */\n setWatchlistEntry(symbol: string, entry: Partial<WatchlistEntry>): void {\n this.watchlist?.setEntry(symbol, entry);\n }\n\n private tickWatchlist(): void {\n if (!this.watchlist) return;\n const data = this.chart.getData();\n if (data.length === 0) return;\n const last = data[data.length - 1];\n // Reference price: first bar of the loaded slice — that's the closest\n // approximation of \"session open\" without timezone bookkeeping. Apps\n // that need true session-open can override via `setWatchlistEntry`.\n if (this.sessionRefPrice === null) {\n this.sessionRefPrice = data[0].open;\n }\n\n const buf = this.watchlistSparkBuffer.get(this.state.symbol) ?? [];\n buf.push(last.close);\n if (buf.length > 40) buf.shift();\n this.watchlistSparkBuffer.set(this.state.symbol, buf);\n\n this.watchlist.setEntry(this.state.symbol, {\n lastPrice: last.close,\n refPrice: this.sessionRefPrice,\n sparkline: buf.slice(),\n });\n }\n\n async setTimeframe(tf: TimeFrame): Promise<void> {\n this.state = { ...this.state, timeframe: tf };\n this.options.onTimeframeChange?.(tf);\n this.updateUI();\n if (this.adapter) {\n await this.connectStream();\n }\n }\n\n setTheme(theme: import('@tradecanvas/commons').ThemeName | Theme): void {\n const isDark = this.resolveIsDark(theme);\n const resolved = this.resolveTheme(theme);\n this.state = { ...this.state, isDark };\n this.root.dataset.tcwTheme = isDark ? 'dark' : 'light';\n this.chart.setTheme(resolved);\n this.updateUI();\n }\n\n getChart(): Chart {\n return this.chart;\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n\n if (this.boundGlobalKeydown) {\n document.removeEventListener('keydown', this.boundGlobalKeydown);\n }\n this.flushActiveLayout();\n this.commandPalette?.destroy();\n this.symbolSearch?.destroy();\n this.hotkeySheet?.destroy();\n if (this.replayPollInterval) clearInterval(this.replayPollInterval);\n this.replayBar?.destroy();\n this.dragDrop?.detach();\n if (this.watchlistInterval) clearInterval(this.watchlistInterval);\n this.watchlist?.destroy();\n this.toolbar?.destroy();\n this.sidebar?.destroy();\n this.settings?.destroy();\n this.statusBar?.destroy();\n this.chart.destroy();\n this.root.remove();\n removeWidgetStyles();\n }\n\n // --- Internal handlers ---\n\n private handleSymbolClick(): void {\n // Opens the fuzzy search modal. The cycle-through behaviour the toolbar\n // used to do is gone — a real search scales past 3-4 symbols and matches\n // user expectations from TradingView, Bloomberg, etc.\n this.symbolSearch?.open(this.symbols, this.state.symbol);\n }\n\n private handleTimeframe(tf: TimeFrame): void {\n this.state = { ...this.state, timeframe: tf };\n this.options.onTimeframeChange?.(tf);\n this.updateUI();\n if (this.adapter) {\n this.connectStream();\n }\n }\n\n private handleChartType(type: ChartType): void {\n this.state = { ...this.state, chartType: type };\n this.chart.setChartType(type);\n this.updateUI();\n }\n\n private handleAddIndicator(indId: string): void {\n if (this.state.activeIndicators.has(indId)) {\n // Toggle off\n const instanceId = this.state.activeIndicators.get(indId)!;\n this.chart.removeIndicator(instanceId);\n const next = new Map(this.state.activeIndicators);\n next.delete(indId);\n this.state = { ...this.state, activeIndicators: next };\n } else {\n const instanceId = this.chart.addIndicator(indId);\n if (instanceId) {\n const next = new Map(this.state.activeIndicators);\n next.set(indId, instanceId);\n this.state = { ...this.state, activeIndicators: next };\n }\n }\n this.updateUI();\n }\n\n private handleRemoveIndicator(instanceId: string): void {\n this.chart.removeIndicator(instanceId);\n const next = new Map(this.state.activeIndicators);\n for (const [id, iid] of next.entries()) {\n if (iid === instanceId) {\n next.delete(id);\n break;\n }\n }\n this.state = { ...this.state, activeIndicators: next };\n this.updateUI();\n }\n\n private toggleCommandPalette(): void {\n if (this.commandPalette?.isOpen()) {\n this.commandPalette.close();\n return;\n }\n this.commandPalette?.open(this.buildCommandItems());\n }\n\n private buildCommandItems(): CommandItem[] {\n const items: CommandItem[] = [];\n\n for (const ind of INDICATORS) {\n items.push({\n id: ind.id,\n label: ind.name,\n category: 'indicator',\n active: this.state.activeIndicators.has(ind.id),\n });\n }\n\n for (const ct of CHART_TYPES) {\n items.push({\n id: ct.value,\n label: ct.label,\n category: 'chartType',\n active: this.state.chartType === ct.value,\n });\n }\n\n for (const group of DRAWING_TOOL_GROUPS) {\n for (const tool of group.tools) {\n items.push({\n id: tool.value,\n label: tool.label,\n category: 'drawing',\n active: this.state.activeTool === tool.value,\n });\n }\n }\n\n for (const tf of TIMEFRAMES) {\n items.push({\n id: tf.value,\n label: tf.label,\n category: 'timeframe',\n active: this.state.timeframe === tf.value,\n });\n }\n\n items.push(\n { id: 'screenshot', label: 'Screenshot', category: 'action', shortcut: '' },\n { id: 'toggleTheme', label: 'Toggle Theme', category: 'action' },\n { id: 'settings', label: 'Settings', category: 'action' },\n { id: 'clearDrawings', label: 'Clear All Drawings', category: 'action' },\n );\n\n return items;\n }\n\n private handleAction(id: string): void {\n switch (id) {\n case 'screenshot':\n this.chart.screenshot();\n break;\n case 'toggleTheme':\n this.handleToggleTheme();\n break;\n case 'settings':\n this.openSettings();\n break;\n case 'clearDrawings':\n this.chart.clearDrawings();\n this.state = { ...this.state, activeTool: null };\n this.updateUI();\n break;\n }\n }\n\n private handleDrawingTool(tool: DrawingToolType): void {\n this.state = { ...this.state, activeTool: tool };\n this.chart.setDrawingTool(tool);\n this.updateUI();\n }\n\n private handleCancelDrawing(): void {\n this.state = { ...this.state, activeTool: null };\n this.chart.setDrawingTool(null);\n this.updateUI();\n }\n\n private handleToggleMagnet(): void {\n const magnetEnabled = !this.state.magnetEnabled;\n this.state = { ...this.state, magnetEnabled };\n this.chart.setDrawingMagnet(magnetEnabled);\n this.updateUI();\n }\n\n private handleToggleTheme(): void {\n const isDark = !this.state.isDark;\n this.state = { ...this.state, isDark };\n this.root.dataset.tcwTheme = isDark ? 'dark' : 'light';\n this.chart.setTheme(isDark ? DARK_THEME : LIGHT_THEME);\n this.chart.setWatermark(this.state.symbol.replace('USDT', ' / USDT'), {\n fontSize: 48,\n color: isDark ? 'rgba(255,255,255,0.03)' : 'rgba(0,0,0,0.03)',\n });\n this.updateUI();\n }\n\n private openSettings(): void {\n this.settings?.open(this.settingsState);\n }\n\n // --- Toast ---\n\n /**\n * Show a transient toast inside the widget. Auto-dismisses after 3.5s.\n * Used by the drag-drop importer for success / failure feedback, but\n * exposed so apps can post their own (e.g. \"alert triggered at 64,200\").\n */\n toast(message: string, kind: 'info' | 'error' = 'info'): void {\n const el = document.createElement('div');\n el.className = `tcw-toast ${kind === 'error' ? 'tcw-toast-error' : ''}`;\n el.textContent = message;\n this.root.appendChild(el);\n // Trigger CSS transition on next frame\n requestAnimationFrame(() => el.classList.add('tcw-toast-in'));\n setTimeout(() => {\n el.classList.remove('tcw-toast-in');\n el.addEventListener('transitionend', () => el.remove(), { once: true });\n // Hard timeout in case transitionend doesn't fire (display:none, etc.)\n setTimeout(() => el.remove(), 400);\n }, 3500);\n }\n\n // --- Layout persistence ---\n\n /**\n * Wipe the layout saved for `symbol` (or the active symbol if omitted).\n * Useful as an \"Reset layout\" command in user-facing menus.\n */\n clearSavedLayout(symbol?: string): void {\n if (!this.layoutKeyPrefix) return;\n const target = symbol ?? this.state.symbol;\n try {\n localStorage.removeItem(this.layoutKeyPrefix + target);\n } catch { /* localStorage may be unavailable (private mode, SSR, etc.) */ }\n }\n\n private applySymbolLayout(symbol: string): void {\n if (!this.layoutKeyPrefix) return;\n const key = this.layoutKeyPrefix + symbol;\n this.activeLayoutKey = key;\n\n try {\n // Best-effort load. If parsing or any restore step throws, we silently\n // fall back to a fresh layout — a corrupted layout shouldn't break the\n // chart.\n const ok = this.chart.loadStateFromStorage(key);\n if (ok) this.rebuildActiveIndicatorsMapFromChart();\n } catch { /* swallow — layout will be rebuilt from user actions */ }\n\n // Wire chart-level auto-save so any further drawing/indicator change\n // flushes itself into this symbol's slot.\n this.chart.setAutoSave(key, this.layoutDebounceMs);\n }\n\n private flushActiveLayout(): void {\n if (!this.activeLayoutKey) return;\n try { this.chart.saveState(this.activeLayoutKey); } catch { /* same */ }\n this.chart.disableAutoSave();\n this.activeLayoutKey = null;\n }\n\n /**\n * After loading a layout, the chart restores indicator instances but our\n * `state.activeIndicators` map (used to render the chip strip) is stale.\n * Rebuild it from the live `getActiveIndicators` list.\n */\n private rebuildActiveIndicatorsMapFromChart(): void {\n const next = new Map<string, string>();\n for (const a of this.chart.getActiveIndicators()) {\n next.set(a.id, a.instanceId);\n }\n this.state = { ...this.state, activeIndicators: next };\n this.updateUI();\n }\n\n // --- Replay ---\n\n private toggleReplay(): void {\n if (this.replayBar?.isMounted()) {\n this.exitReplay();\n } else {\n this.enterReplay();\n }\n }\n\n private enterReplay(): void {\n const data = this.chart.getData();\n if (data.length < 2) return;\n\n // Snapshot full series so we can restore it on exit. The chart's\n // dataManager gets mutated to slices during replay.\n this.replayOriginalData = data.slice();\n\n // Mount the scrubber bar inside the chart container so it floats above the\n // canvas. It owns its own absolute positioning via the .tcw-replay-bar CSS.\n this.replayBar = new WidgetReplayBar({\n onPlay: () => {\n if (this.chart.getReplayState() === 'paused') {\n this.chart.replayResume();\n } else {\n this.chart.replay({ speed: this.replaySpeed, interval: 200 });\n }\n this.replayBar?.setState('playing');\n },\n onPause: () => {\n this.chart.replayPause();\n this.replayBar?.setState('paused');\n },\n onStop: () => {\n this.chart.replayStop();\n this.replayBar?.setState('paused');\n },\n onStepBack: () => {\n const p = this.chart.getReplayProgress();\n if (this.chart.getReplayState() === 'playing') this.chart.replayPause();\n this.chart.replaySeek(Math.max(0, p.current - 1));\n this.replayBar?.setState('paused');\n },\n onStepForward: () => {\n const p = this.chart.getReplayProgress();\n if (this.chart.getReplayState() === 'playing') this.chart.replayPause();\n this.chart.replaySeek(Math.min(p.total - 1, p.current + 1));\n this.replayBar?.setState('paused');\n },\n onSeek: (idx) => {\n if (this.chart.getReplayState() === 'playing') this.chart.replayPause();\n this.chart.replaySeek(idx);\n this.replayBar?.setState('paused');\n },\n onSpeedChange: (s) => {\n this.replaySpeed = s;\n this.chart.setReplaySpeed(s);\n },\n onClose: () => this.exitReplay(),\n });\n this.replayBar.mount(this.chartContainer, { total: data.length, speed: this.replaySpeed });\n\n // Boot replay paused at bar 1 so the user sees a starting state. Then\n // start polling progress for the scrubber — cheap, runs at 200ms.\n this.chart.replay({ speed: this.replaySpeed, interval: 200, startIndex: 1 });\n this.chart.replayPause();\n this.replayBar.setState('paused');\n\n this.replayPollInterval = setInterval(() => {\n if (!this.replayBar?.isMounted()) return;\n const p = this.chart.getReplayProgress();\n this.replayBar.setProgress(p.current, p.total);\n const state = this.chart.getReplayState();\n if (state === 'stopped') {\n this.replayBar.setState('paused');\n } else {\n this.replayBar.setState(state);\n }\n }, 150);\n }\n\n private exitReplay(): void {\n if (this.replayPollInterval) {\n clearInterval(this.replayPollInterval);\n this.replayPollInterval = null;\n }\n this.chart.replayStop();\n this.replayBar?.unmount();\n this.replayBar = null;\n if (this.replayOriginalData) {\n this.chart.setData(this.replayOriginalData);\n this.replayOriginalData = null;\n }\n }\n\n private applySettings(patch: Partial<ChartSettingsState>): void {\n this.settingsState = { ...this.settingsState, ...patch };\n\n if (patch.gridVisible !== undefined) this.chart.setGridVisible(patch.gridVisible);\n if (patch.volumeVisible !== undefined) this.chart.setVolumeVisible(patch.volumeVisible);\n if (patch.volumeProfileVisible !== undefined) this.chart.setVolumeProfileVisible(patch.volumeProfileVisible);\n if (patch.crosshairMode !== undefined) this.chart.setCrosshairMode(patch.crosshairMode);\n if (patch.autoScale !== undefined) this.chart.setAutoScale(patch.autoScale);\n if (patch.logScale !== undefined) this.chart.setLogScale(patch.logScale);\n if (patch.numberLocale !== undefined) this.chart.setNumberLocale(patch.numberLocale);\n\n // Apply theme colors\n const currentTheme = this.chart.getTheme();\n const themeUpdate = { ...currentTheme } as Record<string, unknown>;\n let themeChanged = false;\n\n if (patch.candleUpColor !== undefined) { themeUpdate.candleUp = patch.candleUpColor; themeChanged = true; }\n if (patch.candleDownColor !== undefined) { themeUpdate.candleDown = patch.candleDownColor; themeChanged = true; }\n if (patch.candleUpWick !== undefined) { themeUpdate.candleUpWick = patch.candleUpWick; themeChanged = true; }\n if (patch.candleDownWick !== undefined) { themeUpdate.candleDownWick = patch.candleDownWick; themeChanged = true; }\n if (patch.backgroundColor !== undefined) { themeUpdate.background = patch.backgroundColor; themeChanged = true; }\n if (patch.gridColor !== undefined) { themeUpdate.grid = patch.gridColor; themeChanged = true; }\n\n if (themeChanged) {\n this.chart.setTheme(themeUpdate as unknown as Theme);\n }\n }\n\n private resetSettings(): void {\n this.settingsState = { ...DEFAULT_SETTINGS };\n this.applySettings(this.settingsState);\n }\n\n private async connectStream(): Promise<void> {\n if (!this.adapter) return;\n\n this.state = {\n ...this.state,\n connectionState: 'connecting',\n connectionMessage: 'Connecting...',\n };\n this.updateUI();\n\n try {\n this.chart.disconnectStream();\n await this.chart.connect({\n adapter: this.adapter,\n symbol: this.state.symbol,\n timeframe: this.state.timeframe,\n historyLimit: this.options.historyLimit ?? 500,\n });\n\n this.chart.setWatermark(this.state.symbol.replace('USDT', ' / USDT'), {\n fontSize: 48,\n color: this.state.isDark ? 'rgba(255,255,255,0.03)' : 'rgba(0,0,0,0.03)',\n });\n\n // Re-apply per-symbol layout (indicators, drawings, chart type) after\n // the new history is in. Doing this *after* connect ensures indicators\n // recalculate against the loaded data, not the previous symbol's data.\n this.applySymbolLayout(this.state.symbol);\n\n this.state = {\n ...this.state,\n connectionState: 'connected',\n connectionMessage: 'Live',\n };\n } catch (err: unknown) {\n this.state = {\n ...this.state,\n connectionState: 'error',\n connectionMessage: err instanceof Error ? err.message : 'Connection failed',\n };\n }\n\n this.updateUI();\n }\n\n private updateUI(): void {\n this.toolbar?.update(this.state);\n this.sidebar?.update(this.state);\n this.statusBar?.update({\n connectionState: this.state.connectionState,\n message: this.state.connectionMessage,\n symbol: this.state.symbol,\n timeframe: this.state.timeframe,\n });\n }\n\n private resolveIsDark(theme?: import('@tradecanvas/commons').ThemeName | Theme): boolean {\n if (theme === undefined || theme === 'dark') return true;\n if (theme === 'light') return false;\n // If it's a Theme object, check background color\n if (typeof theme === 'object' && theme.background) {\n return this.isColorDark(theme.background);\n }\n return true;\n }\n\n private resolveTheme(theme?: import('@tradecanvas/commons').ThemeName | Theme): Theme {\n if (theme === undefined || theme === 'dark') return DARK_THEME;\n if (theme === 'light') return LIGHT_THEME;\n if (typeof theme === 'object') return theme as Theme;\n return DARK_THEME;\n }\n\n private isColorDark(color: string): boolean {\n // Simple heuristic: if it starts with # and R+G+B < 384 (half of 768)\n if (color.startsWith('#') && color.length >= 7) {\n const r = parseInt(color.slice(1, 3), 16);\n const g = parseInt(color.slice(3, 5), 16);\n const b = parseInt(color.slice(5, 7), 16);\n return (r + g + b) < 384;\n }\n return true;\n }\n}\n"],"mappings":"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"}