@tradecanvas/chart 0.4.0 → 0.6.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 +120 -9
- package/dist/Chart-CrrTKx3r.js +1027 -0
- package/dist/Chart-CrrTKx3r.js.map +1 -0
- package/dist/Chart-DoR8L8Uk.cjs +2 -0
- package/dist/Chart-DoR8L8Uk.cjs.map +1 -0
- package/dist/Chart.d.ts +22 -8
- package/dist/Chart.d.ts.map +1 -1
- package/dist/charts/ChartTypeStrategy.d.ts +18 -0
- package/dist/charts/ChartTypeStrategy.d.ts.map +1 -0
- package/dist/charts/IndicatorPriceRange.d.ts +16 -0
- package/dist/charts/IndicatorPriceRange.d.ts.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -1010
- package/dist/index.js.map +1 -1
- package/dist/state/AutoSaveScheduler.d.ts +26 -0
- package/dist/state/AutoSaveScheduler.d.ts.map +1 -0
- package/dist/widget/ChartWidget.d.ts +43 -0
- package/dist/widget/ChartWidget.d.ts.map +1 -0
- package/dist/widget/WidgetDrawingSidebar.d.ts +19 -0
- package/dist/widget/WidgetDrawingSidebar.d.ts.map +1 -0
- package/dist/widget/WidgetDropdown.d.ts +18 -0
- package/dist/widget/WidgetDropdown.d.ts.map +1 -0
- package/dist/widget/WidgetSettings.d.ts +25 -0
- package/dist/widget/WidgetSettings.d.ts.map +1 -0
- package/dist/widget/WidgetStatusBar.d.ts +15 -0
- package/dist/widget/WidgetStatusBar.d.ts.map +1 -0
- package/dist/widget/WidgetStyles.d.ts +9 -0
- package/dist/widget/WidgetStyles.d.ts.map +1 -0
- package/dist/widget/WidgetToolbar.d.ts +22 -0
- package/dist/widget/WidgetToolbar.d.ts.map +1 -0
- package/dist/widget/icons.d.ts +2 -0
- package/dist/widget/icons.d.ts.map +1 -0
- package/dist/widget/index.cjs +740 -0
- package/dist/widget/index.cjs.map +1 -0
- package/dist/widget/index.d.ts +3 -0
- package/dist/widget/index.d.ts.map +1 -0
- package/dist/widget/index.js +1058 -0
- package/dist/widget/index.js.map +1 -0
- package/dist/widget/types.d.ts +105 -0
- package/dist/widget/types.d.ts.map +1 -0
- package/dist/widget/widgetConfig.d.ts +16 -0
- package/dist/widget/widgetConfig.d.ts.map +1 -0
- package/package.json +14 -4
|
@@ -0,0 +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/ChartWidget.ts"],"sourcesContent":["import type { ChartType, DrawingToolType, TimeFrame } from '@tradecanvas/commons';\nimport type { IndicatorDef, DrawingToolGroupDef, ChartSettingsState } from './types.js';\n\nexport const TIMEFRAMES: { label: string; value: TimeFrame }[] = [\n { label: '1m', value: '1m' },\n { label: '5m', value: '5m' },\n { label: '15m', value: '15m' },\n { label: '1H', value: '1h' },\n { label: '4H', value: '4h' },\n { label: '1D', value: '1d' },\n];\n\nexport const CHART_TYPES: { label: string; value: ChartType }[] = [\n { label: 'Candlestick', value: 'candlestick' },\n { label: 'Line', value: 'line' },\n { label: 'Area', value: 'area' },\n { label: 'Bar', value: 'bar' },\n { label: 'Heikin-Ashi', value: 'heikinAshi' },\n { label: 'Hollow Candle', value: 'hollowCandle' },\n { label: 'Baseline', value: 'baseline' },\n];\n\nexport const DRAWING_TOOL_GROUPS: DrawingToolGroupDef[] = [\n {\n label: 'Lines',\n tools: [\n { label: 'Trend Line', value: 'trendLine' as DrawingToolType },\n { label: 'Ray', value: 'ray' as DrawingToolType },\n { label: 'Extended Line', value: 'extendedLine' as DrawingToolType },\n ],\n },\n {\n label: 'Horizontal/Vertical',\n tools: [\n { label: 'Horizontal Line', value: 'horizontalLine' as DrawingToolType },\n { label: 'Vertical Line', value: 'verticalLine' as DrawingToolType },\n ],\n },\n {\n label: 'Channels',\n tools: [\n { label: 'Parallel Channel', value: 'parallelChannel' as DrawingToolType },\n { label: 'Regression Channel', value: 'regressionChannel' as DrawingToolType },\n ],\n },\n {\n label: 'Fibonacci',\n tools: [\n { label: 'Fib Retracement', value: 'fibRetracement' as DrawingToolType },\n { label: 'Fib Extension', value: 'fibExtension' as DrawingToolType },\n ],\n },\n {\n label: 'Shapes',\n tools: [\n { label: 'Rectangle', value: 'rectangle' as DrawingToolType },\n { label: 'Ellipse', value: 'ellipse' as DrawingToolType },\n { label: 'Triangle', value: 'triangle' as DrawingToolType },\n ],\n },\n {\n label: 'Gann & Advanced',\n tools: [\n { label: 'Pitchfork', value: 'pitchfork' as DrawingToolType },\n { label: 'Gann Fan', value: 'gannFan' as DrawingToolType },\n { label: 'Gann Box', value: 'gannBox' as DrawingToolType },\n { label: 'Elliott Wave', value: 'elliottWave' as DrawingToolType },\n ],\n },\n {\n label: 'Measure',\n tools: [\n { label: 'Price Range', value: 'priceRange' as DrawingToolType },\n { label: 'Date Range', value: 'dateRange' as DrawingToolType },\n { label: 'Measure', value: 'measure' as DrawingToolType },\n ],\n },\n {\n label: 'Annotation',\n tools: [\n { label: 'Text', value: 'text' as DrawingToolType },\n { label: 'Arrow', value: 'arrow' as DrawingToolType },\n ],\n },\n];\n\nexport const INDICATORS: IndicatorDef[] = [\n { id: 'sma', name: 'SMA', type: 'overlay' },\n { id: 'ema', name: 'EMA', type: 'overlay' },\n { id: 'bb', name: 'Bollinger Bands', type: 'overlay' },\n { id: 'vwap', name: 'VWAP', type: 'overlay' },\n { id: 'ichimoku', name: 'Ichimoku Cloud', type: 'overlay' },\n { id: 'psar', name: 'Parabolic SAR', type: 'overlay' },\n { id: 'supertrend', name: 'Supertrend', type: 'overlay' },\n { id: 'keltner', name: 'Keltner Channel', type: 'overlay' },\n { id: 'donchian', name: 'Donchian Channel', type: 'overlay' },\n { id: 'rsi', name: 'RSI', type: 'panel' },\n { id: 'macd', name: 'MACD', type: 'panel' },\n { id: 'stochastic', name: 'Stochastic', type: 'panel' },\n { id: 'atr', name: 'ATR', type: 'panel' },\n { id: 'adx', name: 'ADX', type: 'panel' },\n { id: 'obv', name: 'OBV', type: 'panel' },\n { id: 'williamsR', name: 'Williams %R', type: 'panel' },\n { id: 'cci', name: 'CCI', type: 'panel' },\n { id: 'mfi', name: 'MFI', type: 'panel' },\n { id: 'roc', name: 'ROC', type: 'panel' },\n { id: 'tsi', name: 'TSI', type: 'panel' },\n { id: 'cmf', name: 'CMF', type: 'panel' },\n { id: 'aroon', name: 'Aroon', type: 'panel' },\n { id: 'stddev', name: 'Std Deviation', type: 'panel' },\n { id: 'vroc', name: 'Volume ROC', type: 'panel' },\n { id: 'ad', name: 'Acc/Dist', type: 'panel' },\n { id: 'volumeProfile', name: 'Volume Profile', type: 'panel' },\n];\n\nexport const POPULAR_INDICATORS = [\n 'sma', 'ema', 'bb', 'rsi', 'macd', 'stochastic',\n 'vwap', 'atr', 'obv', 'ichimoku',\n];\n\nexport const DEFAULT_SYMBOLS = [\n 'BTCUSDT', 'ETHUSDT', 'SOLUSDT', 'BNBUSDT',\n];\n\nexport const DEFAULT_SETTINGS: ChartSettingsState = {\n candleUpColor: '#26A69A',\n candleDownColor: '#EF5350',\n candleUpWick: '#26A69A',\n candleDownWick: '#EF5350',\n backgroundColor: '#131722',\n gridColor: '#1E222D',\n gridVisible: true,\n volumeVisible: true,\n legendVisible: true,\n barCountdown: true,\n logScale: false,\n autoScale: true,\n crosshairMode: 'magnet',\n numberLocale: 'en-US',\n};\n","import widgetCss from './WidgetStyles.css?raw';\n\nlet refCount = 0;\nconst STYLE_ID = 'tcw-styles';\n\n/**\n * Inject the widget stylesheet into `document.head`. Reference-counted so\n * multiple `ChartWidget` instances share the same `<style>` tag and the last\n * to detach removes it. CSS lives in a sibling `.css` file and is inlined at\n * build time via Vite's `?raw` query — consumers see a plain string at runtime.\n */\nexport function injectWidgetStyles(): void {\n refCount++;\n if (refCount > 1) return;\n if (document.getElementById(STYLE_ID)) return;\n\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = widgetCss;\n document.head.appendChild(style);\n}\n\nexport function removeWidgetStyles(): void {\n refCount--;\n if (refCount > 0) return;\n\n const style = document.getElementById(STYLE_ID);\n if (style) {\n style.remove();\n }\n}\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, 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';\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 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\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. 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 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 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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/widget/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|