@tradecanvas/chart 0.8.2 → 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.
- package/README.md +86 -4
- package/dist/Chart.d.ts +11 -0
- package/dist/Chart.d.ts.map +1 -1
- package/dist/{Chart-Cn_TSMO7.js → DragDropImporter-6QOjnfSj.js} +361 -85
- package/dist/DragDropImporter-6QOjnfSj.js.map +1 -0
- package/dist/DragDropImporter-CQ3EarQn.cjs +2 -0
- package/dist/DragDropImporter-CQ3EarQn.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -26
- package/dist/index.js.map +1 -1
- package/dist/io/DragDropImporter.d.ts +34 -0
- package/dist/io/DragDropImporter.d.ts.map +1 -0
- package/dist/io/index.d.ts +5 -0
- package/dist/io/index.d.ts.map +1 -0
- package/dist/io/parseOHLCV.d.ts +21 -0
- package/dist/io/parseOHLCV.d.ts.map +1 -0
- package/dist/widget/ChartWidget.d.ts +46 -1
- package/dist/widget/ChartWidget.d.ts.map +1 -1
- package/dist/widget/WidgetHotkeySheet.d.ts +20 -0
- package/dist/widget/WidgetHotkeySheet.d.ts.map +1 -0
- package/dist/widget/WidgetReplayBar.d.ts +41 -0
- package/dist/widget/WidgetReplayBar.d.ts.map +1 -0
- package/dist/widget/WidgetSettings.d.ts.map +1 -1
- package/dist/widget/WidgetSymbolSearch.d.ts +32 -0
- package/dist/widget/WidgetSymbolSearch.d.ts.map +1 -0
- package/dist/widget/WidgetToolbar.d.ts.map +1 -1
- package/dist/widget/WidgetWatchlist.d.ts +39 -0
- package/dist/widget/WidgetWatchlist.d.ts.map +1 -0
- package/dist/widget/index.cjs +1455 -877
- package/dist/widget/index.cjs.map +1 -1
- package/dist/widget/index.js +695 -92
- package/dist/widget/index.js.map +1 -1
- package/dist/widget/types.d.ts +19 -0
- package/dist/widget/types.d.ts.map +1 -1
- package/dist/widget/widgetConfig.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/Chart-Br_N-BCL.cjs +0 -2
- package/dist/Chart-Br_N-BCL.cjs.map +0 -1
- package/dist/Chart-Cn_TSMO7.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","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.cjs","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 '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''',\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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"}
|