@tradecanvas/chart 0.7.0 → 0.8.1
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/dist/Chart-Br_N-BCL.cjs +2 -0
- package/dist/Chart-Br_N-BCL.cjs.map +1 -0
- package/dist/{Chart-BodmeuC5.js → Chart-Cn_TSMO7.js} +59 -46
- package/dist/Chart-Cn_TSMO7.js.map +1 -0
- package/dist/Chart.d.ts.map +1 -1
- package/dist/charts/ChartTypeStrategy.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +8 -5
- package/dist/index.js.map +1 -1
- package/dist/widget/index.cjs +1 -1
- package/dist/widget/index.cjs.map +1 -1
- package/dist/widget/index.js +5 -1
- package/dist/widget/index.js.map +1 -1
- package/dist/widget/widgetConfig.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/Chart-0R7hFD6z.cjs +0 -2
- package/dist/Chart-0R7hFD6z.cjs.map +0 -1
- package/dist/Chart-BodmeuC5.js.map +0 -1
package/dist/widget/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/widget/widgetConfig.ts","../../src/widget/WidgetStyles.css?raw","../../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: '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","export default \"/* === TradeCanvas Widget Styles === */\\r\\n\\r\\n.tcw-root {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;\\r\\n font-size: 13px;\\r\\n color: #d1d4dc;\\r\\n background: #131722;\\r\\n position: relative;\\r\\n overflow: hidden;\\r\\n\\r\\n /* Dark theme tokens (default) */\\r\\n --tcw-bg: #131722;\\r\\n --tcw-bg-elevated: #1E222D;\\r\\n --tcw-border: #2A2E39;\\r\\n --tcw-text: #d1d4dc;\\r\\n --tcw-text-dim: #b2b5be;\\r\\n --tcw-text-muted: #787b86;\\r\\n --tcw-accent: #2962ff;\\r\\n --tcw-accent-dim: rgba(41,98,255,0.15);\\r\\n --tcw-accent-glow: rgba(41,98,255,0.12);\\r\\n --tcw-red: #ef5350;\\r\\n --tcw-green: #26a69a;\\r\\n --tcw-transition: 0.15s ease;\\r\\n --tcw-radius-lg: 8px;\\r\\n --tcw-font-mono: 'SF Mono', 'Fira Code', 'Consolas', monospace;\\r\\n --tcw-hover-bg: rgba(255,255,255,0.04);\\r\\n}\\r\\n\\r\\n.tcw-root[data-tcw-theme=\\\"light\\\"] {\\r\\n color: #131722;\\r\\n background: #ffffff;\\r\\n\\r\\n --tcw-bg: #ffffff;\\r\\n --tcw-bg-elevated: #f0f3fa;\\r\\n --tcw-border: #e0e3eb;\\r\\n --tcw-text: #131722;\\r\\n --tcw-text-dim: #434651;\\r\\n --tcw-text-muted: #787b86;\\r\\n --tcw-accent: #2962ff;\\r\\n --tcw-accent-dim: rgba(41,98,255,0.1);\\r\\n --tcw-accent-glow: rgba(41,98,255,0.08);\\r\\n --tcw-red: #ef5350;\\r\\n --tcw-green: #26a69a;\\r\\n --tcw-hover-bg: rgba(0,0,0,0.04);\\r\\n}\\r\\n\\r\\n/* === Toolbar === */\\r\\n\\r\\n.tcw-toolbar {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 0;\\r\\n padding: 0 12px;\\r\\n height: 40px;\\r\\n border-bottom: 1px solid var(--tcw-border);\\r\\n background: var(--tcw-bg-elevated);\\r\\n flex-shrink: 0;\\r\\n position: relative;\\r\\n z-index: 20;\\r\\n}\\r\\n\\r\\n.tcw-toolbar-symbol {\\r\\n font-size: 13px;\\r\\n font-weight: 700;\\r\\n color: var(--tcw-text);\\r\\n padding: 0 10px;\\r\\n white-space: nowrap;\\r\\n letter-spacing: -0.01em;\\r\\n cursor: pointer;\\r\\n border: none;\\r\\n background: none;\\r\\n font-family: inherit;\\r\\n}\\r\\n\\r\\n.tcw-toolbar-sep {\\r\\n width: 1px;\\r\\n height: 20px;\\r\\n background: var(--tcw-border);\\r\\n flex-shrink: 0;\\r\\n}\\r\\n\\r\\n.tcw-toolbar-group {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 2px;\\r\\n padding: 0 8px;\\r\\n}\\r\\n\\r\\n.tcw-toolbar-spacer {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.tcw-btn {\\r\\n padding: 4px 8px;\\r\\n font-size: 12px;\\r\\n font-family: inherit;\\r\\n border: none;\\r\\n border-radius: 4px;\\r\\n background: transparent;\\r\\n color: var(--tcw-text-dim);\\r\\n cursor: pointer;\\r\\n transition: all var(--tcw-transition);\\r\\n white-space: nowrap;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.tcw-btn:hover {\\r\\n background: var(--tcw-hover-bg);\\r\\n color: var(--tcw-text);\\r\\n}\\r\\n\\r\\n.tcw-btn.tcw-active {\\r\\n background: var(--tcw-accent);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.tcw-btn-icon {\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n font-family: inherit;\\r\\n border: none;\\r\\n border-radius: 4px;\\r\\n background: transparent;\\r\\n color: var(--tcw-text-muted);\\r\\n cursor: pointer;\\r\\n transition: all var(--tcw-transition);\\r\\n line-height: 1;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.tcw-btn-icon:hover {\\r\\n background: var(--tcw-hover-bg);\\r\\n color: var(--tcw-text);\\r\\n}\\r\\n\\r\\n.tcw-badge-count {\\r\\n font-size: 10px;\\r\\n color: var(--tcw-accent);\\r\\n background: var(--tcw-accent-dim);\\r\\n padding: 0 4px;\\r\\n border-radius: 8px;\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.tcw-indicator-chips {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 4px;\\r\\n padding: 0 4px;\\r\\n flex-wrap: nowrap;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.tcw-indicator-chip {\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n gap: 4px;\\r\\n padding: 2px 6px 2px 8px;\\r\\n font-size: 11px;\\r\\n font-weight: 500;\\r\\n background: var(--tcw-accent-dim);\\r\\n color: var(--tcw-accent);\\r\\n border-radius: 4px;\\r\\n white-space: nowrap;\\r\\n line-height: 1.4;\\r\\n}\\r\\n\\r\\n.tcw-chip-remove {\\r\\n cursor: pointer;\\r\\n opacity: 0.6;\\r\\n padding: 0 2px;\\r\\n transition: opacity var(--tcw-transition);\\r\\n border: none;\\r\\n background: none;\\r\\n color: inherit;\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.tcw-chip-remove:hover {\\r\\n opacity: 1;\\r\\n}\\r\\n\\r\\n/* === Dropdown === */\\r\\n\\r\\n.tcw-dropdown-trigger {\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n gap: 4px;\\r\\n padding: 4px 8px;\\r\\n font-size: 12px;\\r\\n font-family: inherit;\\r\\n border: none;\\r\\n border-radius: 4px;\\r\\n background: transparent;\\r\\n color: var(--tcw-text-dim);\\r\\n cursor: pointer;\\r\\n transition: all var(--tcw-transition);\\r\\n white-space: nowrap;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.tcw-dropdown-trigger:hover {\\r\\n background: var(--tcw-hover-bg);\\r\\n color: var(--tcw-text);\\r\\n}\\r\\n\\r\\n.tcw-dropdown {\\r\\n position: absolute;\\r\\n top: 100%;\\r\\n margin-top: 4px;\\r\\n background: var(--tcw-bg-elevated);\\r\\n border: 1px solid var(--tcw-border);\\r\\n border-radius: var(--tcw-radius-lg);\\r\\n box-shadow: 0 8px 32px rgba(0,0,0,0.4);\\r\\n z-index: 50;\\r\\n padding: 4px 0;\\r\\n max-height: 400px;\\r\\n overflow-y: auto;\\r\\n}\\r\\n\\r\\n.tcw-dropdown-item {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n padding: 6px 12px;\\r\\n font-size: 12px;\\r\\n color: var(--tcw-text-dim);\\r\\n cursor: pointer;\\r\\n transition: background var(--tcw-transition), color var(--tcw-transition);\\r\\n width: 100%;\\r\\n border: none;\\r\\n background: none;\\r\\n font-family: inherit;\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.tcw-dropdown-item:hover {\\r\\n background: var(--tcw-hover-bg);\\r\\n color: var(--tcw-text);\\r\\n}\\r\\n\\r\\n.tcw-dropdown-item.tcw-active {\\r\\n color: var(--tcw-accent);\\r\\n}\\r\\n\\r\\n.tcw-dropdown-label {\\r\\n text-transform: uppercase;\\r\\n font-size: 10px;\\r\\n color: var(--tcw-text-muted);\\r\\n letter-spacing: 0.05em;\\r\\n padding: 6px 12px;\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.tcw-dropdown-divider {\\r\\n border-top: 1px solid var(--tcw-border);\\r\\n margin: 4px 0;\\r\\n}\\r\\n\\r\\n.tcw-tag {\\r\\n font-size: 10px;\\r\\n color: var(--tcw-text-muted);\\r\\n padding: 1px 5px;\\r\\n border-radius: 3px;\\r\\n background: var(--tcw-hover-bg);\\r\\n}\\r\\n\\r\\n/* === Body === */\\r\\n\\r\\n.tcw-body {\\r\\n display: flex;\\r\\n flex: 1;\\r\\n min-height: 0;\\r\\n}\\r\\n\\r\\n.tcw-chart-container {\\r\\n flex: 1;\\r\\n min-width: 0;\\r\\n min-height: 0;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n/* === Sidebar === */\\r\\n\\r\\n.tcw-sidebar {\\r\\n width: 36px;\\r\\n flex-shrink: 0;\\r\\n background: var(--tcw-bg-elevated);\\r\\n border-right: 1px solid var(--tcw-border);\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n align-items: center;\\r\\n padding: 4px 0;\\r\\n overflow: visible;\\r\\n}\\r\\n\\r\\n.tcw-tool-group-wrap {\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.tcw-sidebar-btn {\\r\\n width: 36px;\\r\\n height: 32px;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n border: none;\\r\\n background: transparent;\\r\\n color: var(--tcw-text-muted);\\r\\n cursor: pointer;\\r\\n font-family: inherit;\\r\\n transition: all var(--tcw-transition);\\r\\n position: relative;\\r\\n flex-shrink: 0;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.tcw-sidebar-btn:hover {\\r\\n color: var(--tcw-text);\\r\\n background: var(--tcw-hover-bg);\\r\\n}\\r\\n\\r\\n.tcw-sidebar-btn.tcw-active {\\r\\n color: var(--tcw-accent);\\r\\n background: var(--tcw-accent-glow);\\r\\n}\\r\\n\\r\\n.tcw-sidebar-btn.tcw-danger:hover {\\r\\n color: var(--tcw-red);\\r\\n background: rgba(239,68,68,0.1);\\r\\n}\\r\\n\\r\\n.tcw-multi-dot {\\r\\n position: absolute;\\r\\n bottom: 2px;\\r\\n right: 2px;\\r\\n width: 4px;\\r\\n height: 4px;\\r\\n border-radius: 50%;\\r\\n background: var(--tcw-text-muted);\\r\\n}\\r\\n\\r\\n.tcw-sidebar-divider {\\r\\n width: 20px;\\r\\n height: 1px;\\r\\n background: var(--tcw-border);\\r\\n margin: 4px 0;\\r\\n flex-shrink: 0;\\r\\n}\\r\\n\\r\\n.tcw-sidebar-spacer {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n/* === Flyout === */\\r\\n\\r\\n.tcw-flyout {\\r\\n position: absolute;\\r\\n left: 100%;\\r\\n top: 0;\\r\\n margin-left: 2px;\\r\\n min-width: 160px;\\r\\n background: var(--tcw-bg-elevated);\\r\\n border: 1px solid var(--tcw-border);\\r\\n border-radius: var(--tcw-radius-lg);\\r\\n box-shadow: 0 8px 32px rgba(0,0,0,0.4);\\r\\n z-index: 30;\\r\\n padding: 4px 0;\\r\\n}\\r\\n\\r\\n.tcw-flyout-header {\\r\\n text-transform: uppercase;\\r\\n font-size: 10px;\\r\\n color: var(--tcw-text-muted);\\r\\n letter-spacing: 0.05em;\\r\\n padding: 6px 12px;\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.tcw-flyout-item {\\r\\n padding: 6px 12px;\\r\\n font-size: 12px;\\r\\n color: var(--tcw-text-dim);\\r\\n cursor: pointer;\\r\\n width: 100%;\\r\\n display: block;\\r\\n border: none;\\r\\n background: none;\\r\\n text-align: left;\\r\\n font-family: inherit;\\r\\n transition: background var(--tcw-transition), color var(--tcw-transition);\\r\\n}\\r\\n\\r\\n.tcw-flyout-item:hover {\\r\\n background: var(--tcw-hover-bg);\\r\\n color: var(--tcw-text);\\r\\n}\\r\\n\\r\\n.tcw-flyout-item.tcw-active {\\r\\n color: var(--tcw-accent);\\r\\n}\\r\\n\\r\\n/* === Modal === */\\r\\n\\r\\n.tcw-modal-backdrop {\\r\\n position: fixed;\\r\\n inset: 0;\\r\\n background: rgba(0,0,0,0.5);\\r\\n backdrop-filter: blur(4px);\\r\\n -webkit-backdrop-filter: blur(4px);\\r\\n z-index: 100;\\r\\n}\\r\\n\\r\\n.tcw-modal {\\r\\n position: fixed;\\r\\n z-index: 101;\\r\\n top: 50%;\\r\\n left: 50%;\\r\\n transform: translate(-50%, -50%);\\r\\n background: var(--tcw-bg-elevated);\\r\\n border: 1px solid var(--tcw-border);\\r\\n border-radius: var(--tcw-radius-lg);\\r\\n width: 480px;\\r\\n max-width: 90vw;\\r\\n max-height: 80vh;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n box-shadow: 0 24px 64px rgba(0,0,0,0.5);\\r\\n}\\r\\n\\r\\n.tcw-modal-header {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n padding: 16px 20px;\\r\\n border-bottom: 1px solid var(--tcw-border);\\r\\n}\\r\\n\\r\\n.tcw-modal-header h3 {\\r\\n font-size: 15px;\\r\\n font-weight: 600;\\r\\n margin: 0;\\r\\n color: var(--tcw-text);\\r\\n}\\r\\n\\r\\n.tcw-modal-close {\\r\\n width: 28px;\\r\\n height: 28px;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n border: none;\\r\\n background: transparent;\\r\\n color: var(--tcw-text-muted);\\r\\n cursor: pointer;\\r\\n border-radius: 4px;\\r\\n transition: all var(--tcw-transition);\\r\\n}\\r\\n\\r\\n.tcw-modal-close:hover {\\r\\n background: var(--tcw-hover-bg);\\r\\n color: var(--tcw-text);\\r\\n}\\r\\n\\r\\n.tcw-modal-tabs {\\r\\n display: flex;\\r\\n gap: 0;\\r\\n padding: 0 20px;\\r\\n border-bottom: 1px solid var(--tcw-border);\\r\\n}\\r\\n\\r\\n.tcw-modal-tab {\\r\\n padding: 10px 16px;\\r\\n font-size: 12px;\\r\\n font-weight: 500;\\r\\n color: var(--tcw-text-muted);\\r\\n border: none;\\r\\n background: none;\\r\\n cursor: pointer;\\r\\n border-bottom: 2px solid transparent;\\r\\n margin-bottom: -1px;\\r\\n transition: color var(--tcw-transition);\\r\\n font-family: inherit;\\r\\n text-transform: capitalize;\\r\\n}\\r\\n\\r\\n.tcw-modal-tab:hover {\\r\\n color: var(--tcw-text-dim);\\r\\n}\\r\\n\\r\\n.tcw-modal-tab.tcw-active {\\r\\n color: var(--tcw-accent);\\r\\n border-bottom-color: var(--tcw-accent);\\r\\n}\\r\\n\\r\\n.tcw-modal-body {\\r\\n padding: 20px;\\r\\n overflow-y: auto;\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.tcw-settings-section {\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n.tcw-settings-section:last-child {\\r\\n margin-bottom: 0;\\r\\n}\\r\\n\\r\\n.tcw-settings-section-title {\\r\\n font-size: 11px;\\r\\n font-weight: 600;\\r\\n text-transform: uppercase;\\r\\n letter-spacing: 0.05em;\\r\\n color: var(--tcw-text-muted);\\r\\n margin-bottom: 12px;\\r\\n}\\r\\n\\r\\n.tcw-settings-row {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n padding: 8px 0;\\r\\n}\\r\\n\\r\\n.tcw-settings-row + .tcw-settings-row {\\r\\n border-top: 1px solid rgba(255,255,255,0.03);\\r\\n}\\r\\n\\r\\n.tcw-root[data-tcw-theme=\\\"light\\\"] .tcw-settings-row + .tcw-settings-row {\\r\\n border-top: 1px solid rgba(0,0,0,0.04);\\r\\n}\\r\\n\\r\\n.tcw-settings-label {\\r\\n font-size: 13px;\\r\\n color: var(--tcw-text-dim);\\r\\n}\\r\\n\\r\\n.tcw-color-picker-wrap {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 6px;\\r\\n}\\r\\n\\r\\n.tcw-color-picker-wrap input[type='color'] {\\r\\n width: 28px;\\r\\n height: 28px;\\r\\n border: 1px solid var(--tcw-border);\\r\\n border-radius: 4px;\\r\\n background: none;\\r\\n cursor: pointer;\\r\\n padding: 2px;\\r\\n}\\r\\n\\r\\n.tcw-color-picker-wrap input[type='color']::-webkit-color-swatch-wrapper {\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.tcw-color-picker-wrap input[type='color']::-webkit-color-swatch {\\r\\n border: none;\\r\\n border-radius: 2px;\\r\\n}\\r\\n\\r\\n.tcw-color-hex {\\r\\n font-size: 11px;\\r\\n font-family: var(--tcw-font-mono);\\r\\n color: var(--tcw-text-muted);\\r\\n min-width: 60px;\\r\\n}\\r\\n\\r\\n.tcw-toggle {\\r\\n width: 36px;\\r\\n height: 20px;\\r\\n background: rgba(255,255,255,0.1);\\r\\n border-radius: 10px;\\r\\n position: relative;\\r\\n cursor: pointer;\\r\\n transition: background var(--tcw-transition);\\r\\n border: none;\\r\\n padding: 0;\\r\\n flex-shrink: 0;\\r\\n}\\r\\n\\r\\n.tcw-toggle::after {\\r\\n content: '';\\r\\n position: absolute;\\r\\n top: 2px;\\r\\n left: 2px;\\r\\n width: 16px;\\r\\n height: 16px;\\r\\n border-radius: 50%;\\r\\n background: var(--tcw-text-muted);\\r\\n transition: all var(--tcw-transition);\\r\\n}\\r\\n\\r\\n.tcw-toggle.tcw-on {\\r\\n background: var(--tcw-accent);\\r\\n}\\r\\n\\r\\n.tcw-toggle.tcw-on::after {\\r\\n left: 18px;\\r\\n background: white;\\r\\n}\\r\\n\\r\\n.tcw-root[data-tcw-theme=\\\"light\\\"] .tcw-toggle {\\r\\n background: rgba(0,0,0,0.1);\\r\\n}\\r\\n\\r\\n.tcw-root[data-tcw-theme=\\\"light\\\"] .tcw-toggle::after {\\r\\n background: #888;\\r\\n}\\r\\n\\r\\n.tcw-root[data-tcw-theme=\\\"light\\\"] .tcw-toggle.tcw-on {\\r\\n background: var(--tcw-accent);\\r\\n}\\r\\n\\r\\n.tcw-root[data-tcw-theme=\\\"light\\\"] .tcw-toggle.tcw-on::after {\\r\\n background: white;\\r\\n}\\r\\n\\r\\n.tcw-settings-select {\\r\\n padding: 4px 8px;\\r\\n font-size: 12px;\\r\\n font-family: inherit;\\r\\n background: var(--tcw-bg);\\r\\n border: 1px solid var(--tcw-border);\\r\\n border-radius: 4px;\\r\\n color: var(--tcw-text);\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.tcw-modal-footer {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n padding: 12px 20px;\\r\\n border-top: 1px solid var(--tcw-border);\\r\\n}\\r\\n\\r\\n.tcw-reset-link {\\r\\n font-size: 12px;\\r\\n color: var(--tcw-text-muted);\\r\\n cursor: pointer;\\r\\n border: none;\\r\\n background: none;\\r\\n font-family: inherit;\\r\\n text-decoration: underline;\\r\\n text-underline-offset: 2px;\\r\\n transition: color var(--tcw-transition);\\r\\n}\\r\\n\\r\\n.tcw-reset-link:hover {\\r\\n color: var(--tcw-text-dim);\\r\\n}\\r\\n\\r\\n.tcw-done-btn {\\r\\n padding: 6px 16px;\\r\\n font-size: 12px;\\r\\n font-weight: 500;\\r\\n background: var(--tcw-accent);\\r\\n color: white;\\r\\n border: none;\\r\\n border-radius: 4px;\\r\\n cursor: pointer;\\r\\n font-family: inherit;\\r\\n transition: background var(--tcw-transition);\\r\\n}\\r\\n\\r\\n.tcw-done-btn:hover {\\r\\n background: #2563eb;\\r\\n}\\r\\n\\r\\n/* === Status Bar === */\\r\\n\\r\\n.tcw-statusbar {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n padding: 6px 16px;\\r\\n border-top: 1px solid var(--tcw-border);\\r\\n background: var(--tcw-bg-elevated);\\r\\n font-size: 11px;\\r\\n color: var(--tcw-text-muted);\\r\\n flex-shrink: 0;\\r\\n}\\r\\n\\r\\n.tcw-status-indicator {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 6px;\\r\\n}\\r\\n\\r\\n.tcw-status-dot {\\r\\n width: 6px;\\r\\n height: 6px;\\r\\n border-radius: 50%;\\r\\n background: var(--tcw-text-muted);\\r\\n transition: background 0.3s;\\r\\n}\\r\\n\\r\\n.tcw-status-dot.tcw-connected {\\r\\n background: var(--tcw-green);\\r\\n}\\r\\n\\r\\n.tcw-status-dot.tcw-error {\\r\\n background: var(--tcw-red);\\r\\n}\\r\\n\\r\\n/* === Command Palette === */\\r\\n\\r\\n.tcw-cmd-palette {\\r\\n position: fixed;\\r\\n z-index: 102;\\r\\n top: 20%;\\r\\n left: 50%;\\r\\n transform: translateX(-50%);\\r\\n background: var(--tcw-bg-elevated);\\r\\n border: 1px solid var(--tcw-border);\\r\\n border-radius: var(--tcw-radius-lg);\\r\\n width: 520px;\\r\\n max-width: 90vw;\\r\\n max-height: 60vh;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n box-shadow: 0 24px 64px rgba(0,0,0,0.5);\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.tcw-cmd-header {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n padding: 12px 16px;\\r\\n border-bottom: 1px solid var(--tcw-border);\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.tcw-cmd-icon {\\r\\n font-size: 18px;\\r\\n color: var(--tcw-text-muted);\\r\\n flex-shrink: 0;\\r\\n}\\r\\n\\r\\n.tcw-cmd-input {\\r\\n flex: 1;\\r\\n background: none;\\r\\n border: none;\\r\\n outline: none;\\r\\n font-size: 14px;\\r\\n font-family: inherit;\\r\\n color: var(--tcw-text);\\r\\n caret-color: var(--tcw-accent);\\r\\n}\\r\\n\\r\\n.tcw-cmd-input::placeholder {\\r\\n color: var(--tcw-text-muted);\\r\\n}\\r\\n\\r\\n.tcw-cmd-hint {\\r\\n font-size: 10px;\\r\\n color: var(--tcw-text-muted);\\r\\n border: 1px solid var(--tcw-border);\\r\\n padding: 2px 6px;\\r\\n border-radius: 3px;\\r\\n flex-shrink: 0;\\r\\n}\\r\\n\\r\\n.tcw-cmd-list {\\r\\n overflow-y: auto;\\r\\n flex: 1;\\r\\n padding: 4px 0;\\r\\n max-height: 360px;\\r\\n}\\r\\n\\r\\n.tcw-cmd-category {\\r\\n text-transform: uppercase;\\r\\n font-size: 10px;\\r\\n color: var(--tcw-text-muted);\\r\\n letter-spacing: 0.05em;\\r\\n padding: 8px 16px 4px;\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.tcw-cmd-item {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n padding: 8px 16px;\\r\\n font-size: 13px;\\r\\n color: var(--tcw-text-dim);\\r\\n cursor: pointer;\\r\\n width: 100%;\\r\\n border: none;\\r\\n background: none;\\r\\n font-family: inherit;\\r\\n text-align: left;\\r\\n transition: background 80ms ease;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.tcw-cmd-item:hover,\\r\\n.tcw-cmd-item.tcw-selected {\\r\\n background: var(--tcw-hover-bg);\\r\\n color: var(--tcw-text);\\r\\n}\\r\\n\\r\\n.tcw-cmd-item.tcw-active .tcw-cmd-item-label {\\r\\n color: var(--tcw-accent);\\r\\n}\\r\\n\\r\\n.tcw-cmd-item-label {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.tcw-cmd-check {\\r\\n color: var(--tcw-accent);\\r\\n font-size: 14px;\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n.tcw-cmd-kbd {\\r\\n font-size: 10px;\\r\\n font-family: var(--tcw-font-mono);\\r\\n color: var(--tcw-text-muted);\\r\\n background: var(--tcw-bg);\\r\\n border: 1px solid var(--tcw-border);\\r\\n padding: 1px 5px;\\r\\n border-radius: 3px;\\r\\n}\\r\\n\\r\\n.tcw-cmd-empty {\\r\\n padding: 24px 16px;\\r\\n text-align: center;\\r\\n color: var(--tcw-text-muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.tcw-cmd-footer {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 16px;\\r\\n padding: 8px 16px;\\r\\n border-top: 1px solid var(--tcw-border);\\r\\n font-size: 11px;\\r\\n color: var(--tcw-text-muted);\\r\\n}\\r\\n\\r\\n/* === Responsive === */\\r\\n\\r\\n@media (max-width: 768px) {\\r\\n .tcw-toolbar {\\r\\n padding: 0 8px;\\r\\n height: 36px;\\r\\n }\\r\\n .tcw-toolbar-sep {\\r\\n display: none;\\r\\n }\\r\\n .tcw-indicator-chips {\\r\\n display: none;\\r\\n }\\r\\n .tcw-sidebar {\\r\\n width: 32px;\\r\\n }\\r\\n .tcw-sidebar-btn {\\r\\n width: 32px;\\r\\n height: 28px;\\r\\n }\\r\\n}\\r\\n\"","import widgetCss from './WidgetStyles.css?raw';\r\n\r\nlet refCount = 0;\r\nconst STYLE_ID = 'tcw-styles';\r\n\r\n/**\r\n * Inject the widget stylesheet into `document.head`. Reference-counted so\r\n * multiple `ChartWidget` instances share the same `<style>` tag and the last\r\n * to detach removes it. CSS lives in a sibling `.css` file and is inlined at\r\n * build time via Vite's `?raw` query — consumers see a plain string at runtime.\r\n */\r\nexport function injectWidgetStyles(): void {\r\n refCount++;\r\n if (refCount > 1) return;\r\n if (document.getElementById(STYLE_ID)) return;\r\n\r\n const style = document.createElement('style');\r\n style.id = STYLE_ID;\r\n style.textContent = widgetCss;\r\n document.head.appendChild(style);\r\n}\r\n\r\nexport function removeWidgetStyles(): void {\r\n refCount--;\r\n if (refCount > 0) return;\r\n\r\n const style = document.getElementById(STYLE_ID);\r\n if (style) {\r\n style.remove();\r\n }\r\n}\r\n","const ICON_PATHS: Record<string, string> = {\n cursor: '<path d=\"M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z\"/><path d=\"M13 13l6 6\"/>',\n trendingUp: '<polyline points=\"22 7 13.5 15.5 8.5 10.5 2 17\"/><polyline points=\"16 7 22 7 22 13\"/>',\n minus: '<path d=\"M5 12h14\"/>',\n penLine: '<path d=\"M12 20h9\"/><path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\"/>',\n hash: '<line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"9\"/><line x1=\"4\" y1=\"15\" x2=\"20\" y2=\"15\"/><line x1=\"10\" y1=\"3\" x2=\"8\" y2=\"21\"/><line x1=\"16\" y1=\"3\" x2=\"14\" y2=\"21\"/>',\n square: '<rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/>',\n gitBranch: '<line x1=\"6\" y1=\"3\" x2=\"6\" y2=\"15\"/><circle cx=\"18\" cy=\"6\" r=\"3\"/><circle cx=\"6\" cy=\"18\" r=\"3\"/><path d=\"M18 9a9 9 0 0 1-9 9\"/>',\n ruler: '<path d=\"M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z\"/><path d=\"m14.5 12.5 2-2\"/><path d=\"m11.5 9.5 2-2\"/><path d=\"m8.5 6.5 2-2\"/><path d=\"m17.5 15.5 2-2\"/>',\n type: '<polyline points=\"4 7 4 4 20 4 20 7\"/><line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\"/><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"/>',\n magnet: '<path d=\"m6 15-4-4 6.75-6.77a7.79 7.79 0 0 1 11 11L13 22l-4-4 6.39-6.36a2.14 2.14 0 0 0-3-3L6 15\"/><path d=\"m5 8 4 4\"/><path d=\"m12 15 4 4\"/>',\n undo: '<path d=\"M3 7v6h6\"/><path d=\"M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13\"/>',\n redo: '<path d=\"M21 7v6h-6\"/><path d=\"M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3L21 13\"/>',\n trash: '<path d=\"M3 6h18\"/><path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\"/><path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\"/><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"/><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"/>',\n camera: '<path d=\"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z\"/><circle cx=\"12\" cy=\"13\" r=\"3\"/>',\n settings: '<path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\n moon: '<path d=\"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\"/>',\n sun: '<circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2\"/><path d=\"M12 20v2\"/><path d=\"m4.93 4.93 1.41 1.41\"/><path d=\"m17.66 17.66 1.41 1.41\"/><path d=\"M2 12h2\"/><path d=\"M20 12h2\"/><path d=\"m6.34 17.66-1.41 1.41\"/><path d=\"m19.07 4.93-1.41 1.41\"/>',\n chevronDown: '<path d=\"m6 9 6 6 6-6\"/>',\n chevronUp: '<path d=\"m18 15-6-6-6 6\"/>',\n barChart: '<line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"10\"/><line x1=\"18\" y1=\"20\" x2=\"18\" y2=\"4\"/><line x1=\"6\" y1=\"20\" x2=\"6\" y2=\"16\"/>',\n x: '<path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/>',\n play: '<polygon points=\"6 3 20 12 6 21 6 3\"/>',\n pause: '<rect width=\"4\" height=\"16\" x=\"6\" y=\"4\"/><rect width=\"4\" height=\"16\" x=\"14\" y=\"4\"/>',\n stop: '<rect width=\"14\" height=\"14\" x=\"5\" y=\"5\" rx=\"1\"/>',\n receipt: '<path d=\"M4 2v20l2-1 2 1 2-1 2 1 2-1 2 1 2-1 2 1V2l-2 1-2-1-2 1-2-1-2 1-2-1-2 1Z\"/><path d=\"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8\"/><path d=\"M12 17.5v-11\"/>',\n};\n\nexport function createIcon(name: string, size = 14): string {\n const paths = ICON_PATHS[name];\n if (!paths) return '';\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${paths}</svg>`;\n}\n","export class WidgetDropdown {\n private trigger: HTMLElement;\n private panel: HTMLDivElement;\n private _isOpen = false;\n private onOutsideClick: (e: MouseEvent) => void;\n private onEscapeKey: (e: KeyboardEvent) => void;\n private onTriggerClick: () => void;\n\n constructor(trigger: HTMLElement, config: { width?: string; align?: 'left' | 'right' } = {}) {\n this.trigger = trigger;\n\n this.panel = document.createElement('div');\n this.panel.className = 'tcw-dropdown';\n this.panel.style.width = config.width ?? '200px';\n if (config.align === 'right') {\n this.panel.style.right = '0';\n } else {\n this.panel.style.left = '0';\n }\n this.panel.style.display = 'none';\n\n // Position relative to trigger\n trigger.style.position = 'relative';\n trigger.appendChild(this.panel);\n\n this.onTriggerClick = () => {\n if (this._isOpen) {\n this.close();\n } else {\n this.open();\n }\n };\n\n this.onOutsideClick = (e: MouseEvent) => {\n if (!this.trigger.contains(e.target as Node)) {\n this.close();\n }\n };\n\n this.onEscapeKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.close();\n }\n };\n\n trigger.addEventListener('click', this.onTriggerClick);\n }\n\n setContent(html: string): void {\n this.panel.innerHTML = html;\n }\n\n open(): void {\n if (this._isOpen) return;\n this._isOpen = true;\n this.panel.style.display = '';\n document.addEventListener('mousedown', this.onOutsideClick);\n document.addEventListener('keydown', this.onEscapeKey);\n }\n\n close(): void {\n if (!this._isOpen) return;\n this._isOpen = false;\n this.panel.style.display = 'none';\n document.removeEventListener('mousedown', this.onOutsideClick);\n document.removeEventListener('keydown', this.onEscapeKey);\n }\n\n isOpen(): boolean {\n return this._isOpen;\n }\n\n destroy(): void {\n this.trigger.removeEventListener('click', this.onTriggerClick);\n document.removeEventListener('mousedown', this.onOutsideClick);\n document.removeEventListener('keydown', this.onEscapeKey);\n this.panel.remove();\n }\n}\n","import type { ChartType } from '@tradecanvas/commons';\nimport type { ToolbarConfig, ToolbarCallbacks, WidgetState, ActiveIndicator } from './types.js';\nimport { createIcon } from './icons.js';\nimport { WidgetDropdown } from './WidgetDropdown.js';\n\nexport class WidgetToolbar {\n private config: ToolbarConfig;\n private callbacks: ToolbarCallbacks;\n private el: HTMLDivElement;\n private chartTypeDropdown: WidgetDropdown | null = null;\n private indicatorDropdown: WidgetDropdown | null = null;\n private tfButtons: HTMLButtonElement[] = [];\n private chipsContainer: HTMLDivElement | null = null;\n private themeBtn: HTMLButtonElement | null = null;\n\n constructor(host: HTMLElement, config: ToolbarConfig, callbacks: ToolbarCallbacks) {\n this.config = config;\n this.callbacks = callbacks;\n this.el = document.createElement('div');\n this.el.className = 'tcw-toolbar';\n this.build();\n host.appendChild(this.el);\n }\n\n private build(): void {\n const { config, callbacks, el } = this;\n\n // Symbol button\n const symbolBtn = document.createElement('button');\n symbolBtn.className = 'tcw-toolbar-symbol';\n symbolBtn.dataset.role = 'symbol';\n symbolBtn.addEventListener('click', callbacks.onSymbolClick);\n el.appendChild(symbolBtn);\n el.appendChild(this.sep());\n\n // Timeframes\n const tfGroup = document.createElement('div');\n tfGroup.className = 'tcw-toolbar-group';\n for (const tf of config.timeframes) {\n const btn = document.createElement('button');\n btn.className = 'tcw-btn';\n btn.textContent = tf.label;\n btn.dataset.tf = tf.value;\n btn.addEventListener('click', () => callbacks.onTimeframe(tf.value));\n tfGroup.appendChild(btn);\n this.tfButtons.push(btn);\n }\n el.appendChild(tfGroup);\n el.appendChild(this.sep());\n\n // Chart type dropdown\n const ctWrap = document.createElement('div');\n ctWrap.style.position = 'relative';\n ctWrap.style.display = 'inline-flex';\n\n const ctTrigger = document.createElement('button');\n ctTrigger.className = 'tcw-dropdown-trigger';\n ctTrigger.dataset.role = 'charttype';\n ctWrap.appendChild(ctTrigger);\n el.appendChild(ctWrap);\n\n this.chartTypeDropdown = new WidgetDropdown(ctWrap, { width: '160px' });\n this.buildChartTypeMenu();\n\n el.appendChild(this.sep());\n\n // Indicators dropdown\n const indWrap = document.createElement('div');\n indWrap.style.position = 'relative';\n indWrap.style.display = 'inline-flex';\n\n const indTrigger = document.createElement('button');\n indTrigger.className = 'tcw-dropdown-trigger';\n indTrigger.dataset.role = 'indicators';\n indWrap.appendChild(indTrigger);\n el.appendChild(indWrap);\n\n this.indicatorDropdown = new WidgetDropdown(indWrap, { width: '280px' });\n this.buildIndicatorMenu();\n\n // Indicator chips\n this.chipsContainer = document.createElement('div');\n this.chipsContainer.className = 'tcw-indicator-chips';\n el.appendChild(this.chipsContainer);\n\n // Spacer\n el.appendChild(this.spacer());\n\n // Right side buttons\n const screenshotBtn = this.iconBtn('camera', 'Screenshot', callbacks.onScreenshot);\n el.appendChild(screenshotBtn);\n\n const settingsBtn = this.iconBtn('settings', 'Chart Settings', callbacks.onSettings);\n el.appendChild(settingsBtn);\n\n this.themeBtn = this.iconBtn('moon', 'Toggle theme', callbacks.onToggleTheme);\n this.themeBtn.dataset.role = 'theme';\n el.appendChild(this.themeBtn);\n }\n\n private buildChartTypeMenu(): void {\n if (!this.chartTypeDropdown) return;\n const items = this.config.chartTypes.map(ct =>\n `<button class=\"tcw-dropdown-item\" data-ct=\"${ct.value}\">${ct.label}</button>`\n ).join('');\n this.chartTypeDropdown.setContent(items);\n\n // Attach events to items after content set\n const panel = this.chartTypeDropdown['panel'] as HTMLDivElement;\n panel.querySelectorAll('.tcw-dropdown-item').forEach((btn) => {\n btn.addEventListener('click', (e) => {\n const value = (e.currentTarget as HTMLElement).dataset.ct as ChartType;\n this.callbacks.onChartType(value);\n this.chartTypeDropdown?.close();\n });\n });\n }\n\n private buildIndicatorMenu(): void {\n if (!this.indicatorDropdown) return;\n const { indicators, popularIndicatorIds } = this.config;\n\n const popular = indicators.filter(d => popularIndicatorIds.includes(d.id));\n const other = indicators.filter(d => !popularIndicatorIds.includes(d.id));\n\n let html = '<div class=\"tcw-dropdown-label\">Popular</div>';\n for (const ind of popular) {\n html += `<button class=\"tcw-dropdown-item\" data-ind=\"${ind.id}\"><span>${ind.name}</span><span class=\"tcw-tag\">${ind.type}</span></button>`;\n }\n html += '<div class=\"tcw-dropdown-divider\"></div>';\n html += '<div class=\"tcw-dropdown-label\">All</div>';\n for (const ind of other) {\n html += `<button class=\"tcw-dropdown-item\" data-ind=\"${ind.id}\"><span>${ind.name}</span><span class=\"tcw-tag\">${ind.type}</span></button>`;\n }\n\n this.indicatorDropdown.setContent(html);\n\n const panel = this.indicatorDropdown['panel'] as HTMLDivElement;\n panel.querySelectorAll('.tcw-dropdown-item[data-ind]').forEach((btn) => {\n btn.addEventListener('click', (e) => {\n const id = (e.currentTarget as HTMLElement).dataset.ind!;\n this.callbacks.onAddIndicator(id);\n });\n });\n }\n\n update(state: WidgetState): void {\n // Symbol\n const symbolBtn = this.el.querySelector('[data-role=\"symbol\"]') as HTMLButtonElement | null;\n if (symbolBtn) symbolBtn.textContent = state.symbol;\n\n // Timeframe buttons\n for (const btn of this.tfButtons) {\n btn.classList.toggle('tcw-active', btn.dataset.tf === state.timeframe);\n }\n\n // Chart type trigger label\n const ctTrigger = this.el.querySelector('[data-role=\"charttype\"]') as HTMLElement | null;\n if (ctTrigger) {\n const label = this.config.chartTypes.find(t => t.value === state.chartType)?.label ?? 'Candles';\n ctTrigger.innerHTML = `${createIcon('barChart', 14)} ${label} ${createIcon('chevronDown', 12)}`;\n }\n\n // Indicator trigger + badge\n const indTrigger = this.el.querySelector('[data-role=\"indicators\"]') as HTMLElement | null;\n if (indTrigger) {\n const count = state.activeIndicators.size;\n let inner = `${createIcon('trendingUp', 14)} Indicators`;\n if (count > 0) {\n inner += ` <span class=\"tcw-badge-count\">${count}</span>`;\n }\n indTrigger.innerHTML = inner;\n }\n\n // Chips\n if (this.chipsContainer) {\n const activeList = this.getActiveIndicatorList(state);\n this.chipsContainer.innerHTML = '';\n for (const ind of activeList) {\n const chip = document.createElement('div');\n chip.className = 'tcw-indicator-chip';\n\n const label = document.createElement('span');\n label.textContent = ind.label;\n chip.appendChild(label);\n\n const removeBtn = document.createElement('button');\n removeBtn.className = 'tcw-chip-remove';\n removeBtn.innerHTML = createIcon('x', 10);\n removeBtn.addEventListener('click', () => this.callbacks.onRemoveIndicator(ind.instanceId));\n chip.appendChild(removeBtn);\n\n this.chipsContainer.appendChild(chip);\n }\n }\n\n // Theme toggle icon\n if (this.themeBtn) {\n this.themeBtn.innerHTML = state.isDark ? createIcon('moon', 14) : createIcon('sun', 14);\n }\n }\n\n private getActiveIndicatorList(state: WidgetState): ActiveIndicator[] {\n const result: ActiveIndicator[] = [];\n for (const [id, instanceId] of state.activeIndicators.entries()) {\n result.push({ instanceId, id, label: id.toUpperCase() });\n }\n return result;\n }\n\n private sep(): HTMLSpanElement {\n const s = document.createElement('span');\n s.className = 'tcw-toolbar-sep';\n return s;\n }\n\n private spacer(): HTMLSpanElement {\n const s = document.createElement('span');\n s.className = 'tcw-toolbar-spacer';\n return s;\n }\n\n private iconBtn(icon: string, title: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = 'tcw-btn-icon';\n btn.title = title;\n btn.innerHTML = createIcon(icon, 14);\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n destroy(): void {\n this.chartTypeDropdown?.destroy();\n this.indicatorDropdown?.destroy();\n this.el.remove();\n }\n}\n","import type { SidebarConfig, SidebarCallbacks, WidgetState } from './types.js';\nimport { createIcon } from './icons.js';\n\nconst GROUP_ICONS = [\n 'trendingUp', 'minus', 'penLine', 'hash', 'square', 'gitBranch', 'ruler', 'type',\n];\n\nexport class WidgetDrawingSidebar {\n private config: SidebarConfig;\n private callbacks: SidebarCallbacks;\n private el: HTMLDivElement;\n private groupWraps: HTMLDivElement[] = [];\n private groupButtons: HTMLButtonElement[] = [];\n private cursorBtn: HTMLButtonElement | null = null;\n private magnetBtn: HTMLButtonElement | null = null;\n private flyoutEl: HTMLDivElement | null = null;\n\n constructor(host: HTMLElement, config: SidebarConfig, callbacks: SidebarCallbacks) {\n this.config = config;\n this.callbacks = callbacks;\n this.el = document.createElement('div');\n this.el.className = 'tcw-sidebar';\n this.build();\n host.appendChild(this.el);\n }\n\n private build(): void {\n const { config, callbacks, el } = this;\n\n // Cursor button\n this.cursorBtn = document.createElement('button');\n this.cursorBtn.className = 'tcw-sidebar-btn';\n this.cursorBtn.title = 'Cursor';\n this.cursorBtn.innerHTML = createIcon('cursor', 14);\n this.cursorBtn.addEventListener('click', callbacks.onCancelDrawing);\n el.appendChild(this.cursorBtn);\n\n el.appendChild(this.divider());\n\n // Tool groups\n config.drawingToolGroups.forEach((group, idx) => {\n const wrap = document.createElement('div');\n wrap.className = 'tcw-tool-group-wrap';\n\n const btn = document.createElement('button');\n btn.className = 'tcw-sidebar-btn';\n btn.title = group.label;\n btn.innerHTML = createIcon(GROUP_ICONS[idx] ?? 'square', 14);\n\n if (group.tools.length > 1) {\n const dot = document.createElement('span');\n dot.className = 'tcw-multi-dot';\n btn.appendChild(dot);\n }\n\n btn.addEventListener('click', () => callbacks.onDrawingTool(group.tools[0].value));\n wrap.appendChild(btn);\n\n // Flyout events via JS (not CSS hover)\n wrap.addEventListener('mouseenter', () => this.showFlyout(idx));\n wrap.addEventListener('mouseleave', () => this.hideFlyout());\n\n el.appendChild(wrap);\n this.groupWraps.push(wrap);\n this.groupButtons.push(btn);\n });\n\n // Spacer\n const spacer = document.createElement('div');\n spacer.className = 'tcw-sidebar-spacer';\n el.appendChild(spacer);\n\n el.appendChild(this.divider());\n\n // Bottom tools\n this.magnetBtn = document.createElement('button');\n this.magnetBtn.className = 'tcw-sidebar-btn';\n this.magnetBtn.title = 'Magnet';\n this.magnetBtn.innerHTML = createIcon('magnet', 14);\n this.magnetBtn.addEventListener('click', callbacks.onToggleMagnet);\n el.appendChild(this.magnetBtn);\n\n const undoBtn = document.createElement('button');\n undoBtn.className = 'tcw-sidebar-btn';\n undoBtn.title = 'Undo';\n undoBtn.innerHTML = createIcon('undo', 14);\n undoBtn.addEventListener('click', callbacks.onUndo);\n el.appendChild(undoBtn);\n\n const redoBtn = document.createElement('button');\n redoBtn.className = 'tcw-sidebar-btn';\n redoBtn.title = 'Redo';\n redoBtn.innerHTML = createIcon('redo', 14);\n redoBtn.addEventListener('click', callbacks.onRedo);\n el.appendChild(redoBtn);\n\n const clearBtn = document.createElement('button');\n clearBtn.className = 'tcw-sidebar-btn tcw-danger';\n clearBtn.title = 'Clear all';\n clearBtn.innerHTML = createIcon('trash', 14);\n clearBtn.addEventListener('click', callbacks.onClearDrawings);\n el.appendChild(clearBtn);\n }\n\n private showFlyout(idx: number): void {\n const group = this.config.drawingToolGroups[idx];\n if (!group || group.tools.length <= 1) return;\n\n this.hideFlyout();\n\n const flyout = document.createElement('div');\n flyout.className = 'tcw-flyout';\n\n const header = document.createElement('div');\n header.className = 'tcw-flyout-header';\n header.textContent = group.label;\n flyout.appendChild(header);\n\n for (const tool of group.tools) {\n const item = document.createElement('button');\n item.className = 'tcw-flyout-item';\n item.textContent = tool.label;\n item.dataset.toolValue = tool.value;\n item.addEventListener('click', () => {\n this.callbacks.onDrawingTool(tool.value);\n this.hideFlyout();\n });\n flyout.appendChild(item);\n }\n\n this.flyoutEl = flyout;\n this.groupWraps[idx].appendChild(flyout);\n }\n\n private hideFlyout(): void {\n if (this.flyoutEl) {\n this.flyoutEl.remove();\n this.flyoutEl = null;\n }\n }\n\n update(state: WidgetState): void {\n // Cursor active\n if (this.cursorBtn) {\n this.cursorBtn.classList.toggle('tcw-active', state.activeTool === null);\n }\n\n // Group buttons\n const { drawingToolGroups } = this.config;\n for (let i = 0; i < drawingToolGroups.length; i++) {\n const isActive = drawingToolGroups[i].tools.some(t => t.value === state.activeTool);\n this.groupButtons[i].classList.toggle('tcw-active', isActive);\n }\n\n // Flyout items\n if (this.flyoutEl) {\n this.flyoutEl.querySelectorAll('.tcw-flyout-item').forEach((item) => {\n const el = item as HTMLElement;\n el.classList.toggle('tcw-active', el.dataset.toolValue === state.activeTool);\n });\n }\n\n // Magnet\n if (this.magnetBtn) {\n this.magnetBtn.classList.toggle('tcw-active', state.magnetEnabled);\n this.magnetBtn.title = state.magnetEnabled ? 'Magnet ON' : 'Magnet OFF';\n }\n }\n\n private divider(): HTMLDivElement {\n const d = document.createElement('div');\n d.className = 'tcw-sidebar-divider';\n return d;\n }\n\n destroy(): void {\n this.hideFlyout();\n this.el.remove();\n }\n}\n","import type { ChartSettingsState, SettingsCallbacks } from './types.js';\nimport { createIcon } from './icons.js';\n\ntype Tab = 'style' | 'display' | 'scale';\nconst TABS: Tab[] = ['style', 'display', 'scale'];\n\nexport class WidgetSettings {\n private callbacks: SettingsCallbacks;\n private backdrop: HTMLDivElement | null = null;\n private modal: HTMLDivElement | null = null;\n private currentTab: Tab = 'style';\n private currentSettings: ChartSettingsState | null = null;\n private bodyEl: HTMLDivElement | null = null;\n private tabButtons: HTMLButtonElement[] = [];\n\n constructor(callbacks: SettingsCallbacks) {\n this.callbacks = callbacks;\n }\n\n open(currentSettings: ChartSettingsState): void {\n this.currentSettings = { ...currentSettings };\n this.currentTab = 'style';\n this.buildModal();\n }\n\n close(): void {\n this.backdrop?.remove();\n this.modal?.remove();\n this.backdrop = null;\n this.modal = null;\n this.bodyEl = null;\n this.tabButtons = [];\n }\n\n private buildModal(): void {\n // Backdrop\n this.backdrop = document.createElement('div');\n this.backdrop.className = 'tcw-modal-backdrop';\n this.backdrop.addEventListener('click', () => {\n this.callbacks.onClose();\n this.close();\n });\n document.body.appendChild(this.backdrop);\n\n // Modal\n this.modal = document.createElement('div');\n this.modal.className = 'tcw-modal';\n\n // Header\n const header = document.createElement('div');\n header.className = 'tcw-modal-header';\n const h3 = document.createElement('h3');\n h3.textContent = 'Chart Settings';\n header.appendChild(h3);\n const closeBtn = document.createElement('button');\n closeBtn.className = 'tcw-modal-close';\n closeBtn.innerHTML = createIcon('x', 16);\n closeBtn.addEventListener('click', () => {\n this.callbacks.onClose();\n this.close();\n });\n header.appendChild(closeBtn);\n this.modal.appendChild(header);\n\n // Tabs\n const tabsEl = document.createElement('div');\n tabsEl.className = 'tcw-modal-tabs';\n this.tabButtons = [];\n for (const tab of TABS) {\n const btn = document.createElement('button');\n btn.className = 'tcw-modal-tab';\n btn.textContent = tab;\n btn.dataset.tab = tab;\n if (tab === this.currentTab) btn.classList.add('tcw-active');\n btn.addEventListener('click', () => {\n this.currentTab = tab;\n this.tabButtons.forEach(b => b.classList.toggle('tcw-active', b.dataset.tab === tab));\n this.renderTabContent();\n });\n tabsEl.appendChild(btn);\n this.tabButtons.push(btn);\n }\n this.modal.appendChild(tabsEl);\n\n // Body\n this.bodyEl = document.createElement('div');\n this.bodyEl.className = 'tcw-modal-body';\n this.modal.appendChild(this.bodyEl);\n this.renderTabContent();\n\n // Footer\n const footer = document.createElement('div');\n footer.className = 'tcw-modal-footer';\n const resetBtn = document.createElement('button');\n resetBtn.className = 'tcw-reset-link';\n resetBtn.textContent = 'Reset to defaults';\n resetBtn.addEventListener('click', () => this.callbacks.onReset());\n footer.appendChild(resetBtn);\n const doneBtn = document.createElement('button');\n doneBtn.className = 'tcw-done-btn';\n doneBtn.textContent = 'Done';\n doneBtn.addEventListener('click', () => {\n this.callbacks.onClose();\n this.close();\n });\n footer.appendChild(doneBtn);\n this.modal.appendChild(footer);\n\n document.body.appendChild(this.modal);\n\n // Escape key\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n document.removeEventListener('keydown', onKeyDown);\n this.callbacks.onClose();\n this.close();\n }\n };\n document.addEventListener('keydown', onKeyDown);\n }\n\n private renderTabContent(): void {\n if (!this.bodyEl || !this.currentSettings) return;\n this.bodyEl.innerHTML = '';\n\n switch (this.currentTab) {\n case 'style':\n this.renderStyleTab();\n break;\n case 'display':\n this.renderDisplayTab();\n break;\n case 'scale':\n this.renderScaleTab();\n break;\n }\n }\n\n private renderStyleTab(): void {\n if (!this.bodyEl || !this.currentSettings) return;\n const s = this.currentSettings;\n\n // Candle Colors\n const candleSection = this.section('Candle Colors');\n candleSection.appendChild(this.colorRow('Up Body', s.candleUpColor, (v) => this.patch({ candleUpColor: v })));\n candleSection.appendChild(this.colorRow('Down Body', s.candleDownColor, (v) => this.patch({ candleDownColor: v })));\n candleSection.appendChild(this.colorRow('Up Wick', s.candleUpWick, (v) => this.patch({ candleUpWick: v })));\n candleSection.appendChild(this.colorRow('Down Wick', s.candleDownWick, (v) => this.patch({ candleDownWick: v })));\n this.bodyEl.appendChild(candleSection);\n\n // Background\n const bgSection = this.section('Background');\n bgSection.appendChild(this.colorRow('Background', s.backgroundColor, (v) => this.patch({ backgroundColor: v })));\n bgSection.appendChild(this.colorRow('Grid', s.gridColor, (v) => this.patch({ gridColor: v })));\n this.bodyEl.appendChild(bgSection);\n }\n\n private renderDisplayTab(): void {\n if (!this.bodyEl || !this.currentSettings) return;\n const s = this.currentSettings;\n\n const section = this.section();\n section.appendChild(this.toggleRow('Grid Lines', s.gridVisible, (v) => this.patch({ gridVisible: v })));\n section.appendChild(this.toggleRow('Volume', s.volumeVisible, (v) => this.patch({ volumeVisible: v })));\n section.appendChild(this.toggleRow('OHLC Legend', s.legendVisible, (v) => this.patch({ legendVisible: v })));\n section.appendChild(this.toggleRow('Bar Countdown', s.barCountdown, (v) => this.patch({ barCountdown: v })));\n\n // Crosshair mode\n section.appendChild(this.selectRow('Crosshair Mode', s.crosshairMode, [\n { label: 'Magnet', value: 'magnet' },\n { label: 'Normal', value: 'normal' },\n { label: 'Hidden', value: 'hidden' },\n ], (v) => this.patch({ crosshairMode: v as ChartSettingsState['crosshairMode'] })));\n\n // Number locale\n section.appendChild(this.selectRow('Number Locale', s.numberLocale, [\n { label: 'en-US (65,234.00)', value: 'en-US' },\n { label: 'de-DE (65.234,00)', value: 'de-DE' },\n { label: 'fr-FR (65 234,00)', value: 'fr-FR' },\n { label: 'vi-VN (65.234,00)', value: 'vi-VN' },\n { label: 'en-IN (65,234.00)', value: 'en-IN' },\n { label: 'ja-JP (65,234.00)', value: 'ja-JP' },\n ], (v) => this.patch({ numberLocale: v })));\n\n this.bodyEl.appendChild(section);\n }\n\n private renderScaleTab(): void {\n if (!this.bodyEl || !this.currentSettings) return;\n const s = this.currentSettings;\n\n const section = this.section();\n section.appendChild(this.toggleRow('Auto Scale', s.autoScale, (v) => this.patch({ autoScale: v })));\n section.appendChild(this.toggleRow('Log Scale', s.logScale, (v) => this.patch({ logScale: v })));\n this.bodyEl.appendChild(section);\n }\n\n private patch(partial: Partial<ChartSettingsState>): void {\n if (this.currentSettings) {\n Object.assign(this.currentSettings, partial);\n }\n this.callbacks.onChange(partial);\n }\n\n private section(title?: string): HTMLDivElement {\n const div = document.createElement('div');\n div.className = 'tcw-settings-section';\n if (title) {\n const t = document.createElement('div');\n t.className = 'tcw-settings-section-title';\n t.textContent = title;\n div.appendChild(t);\n }\n return div;\n }\n\n private colorRow(label: string, value: string, onChange: (v: string) => void): HTMLDivElement {\n const row = document.createElement('div');\n row.className = 'tcw-settings-row';\n\n const lbl = document.createElement('span');\n lbl.className = 'tcw-settings-label';\n lbl.textContent = label;\n row.appendChild(lbl);\n\n const wrap = document.createElement('div');\n wrap.className = 'tcw-color-picker-wrap';\n\n const input = document.createElement('input');\n input.type = 'color';\n input.value = value;\n\n const hex = document.createElement('span');\n hex.className = 'tcw-color-hex';\n hex.textContent = value;\n\n input.addEventListener('input', () => {\n hex.textContent = input.value;\n onChange(input.value);\n });\n\n wrap.appendChild(input);\n wrap.appendChild(hex);\n row.appendChild(wrap);\n return row;\n }\n\n private toggleRow(label: string, value: boolean, onChange: (v: boolean) => void): HTMLDivElement {\n const row = document.createElement('div');\n row.className = 'tcw-settings-row';\n\n const lbl = document.createElement('span');\n lbl.className = 'tcw-settings-label';\n lbl.textContent = label;\n row.appendChild(lbl);\n\n const toggle = document.createElement('button');\n toggle.className = `tcw-toggle${value ? ' tcw-on' : ''}`;\n toggle.addEventListener('click', () => {\n const newVal = !toggle.classList.contains('tcw-on');\n toggle.classList.toggle('tcw-on', newVal);\n onChange(newVal);\n });\n row.appendChild(toggle);\n return row;\n }\n\n private selectRow(\n label: string,\n value: string,\n options: { label: string; value: string }[],\n onChange: (v: string) => void,\n ): HTMLDivElement {\n const row = document.createElement('div');\n row.className = 'tcw-settings-row';\n\n const lbl = document.createElement('span');\n lbl.className = 'tcw-settings-label';\n lbl.textContent = label;\n row.appendChild(lbl);\n\n const select = document.createElement('select');\n select.className = 'tcw-settings-select';\n for (const opt of options) {\n const o = document.createElement('option');\n o.value = opt.value;\n o.textContent = opt.label;\n if (opt.value === value) o.selected = true;\n select.appendChild(o);\n }\n select.addEventListener('change', () => onChange(select.value));\n row.appendChild(select);\n return row;\n }\n\n destroy(): void {\n this.close();\n }\n}\n","export class WidgetStatusBar {\n private el: HTMLDivElement;\n private dotEl: HTMLSpanElement;\n private messageEl: HTMLSpanElement;\n private infoEl: HTMLSpanElement;\n\n constructor(host: HTMLElement) {\n this.el = document.createElement('div');\n this.el.className = 'tcw-statusbar';\n\n const indicator = document.createElement('div');\n indicator.className = 'tcw-status-indicator';\n\n this.dotEl = document.createElement('span');\n this.dotEl.className = 'tcw-status-dot';\n indicator.appendChild(this.dotEl);\n\n this.messageEl = document.createElement('span');\n indicator.appendChild(this.messageEl);\n\n this.el.appendChild(indicator);\n\n this.infoEl = document.createElement('span');\n this.el.appendChild(this.infoEl);\n\n host.appendChild(this.el);\n }\n\n update(state: { connectionState: string; message: string; symbol: string; timeframe: string }): void {\n this.dotEl.className = 'tcw-status-dot';\n if (state.connectionState === 'connected') {\n this.dotEl.classList.add('tcw-connected');\n } else if (state.connectionState === 'error') {\n this.dotEl.classList.add('tcw-error');\n }\n\n this.messageEl.textContent = state.message;\n this.infoEl.textContent = `${state.symbol} ${state.timeframe}`;\n }\n\n destroy(): void {\n this.el.remove();\n }\n}\n","import type { ChartType, DrawingToolType, TimeFrame } from '@tradecanvas/commons';\n\nexport interface CommandItem {\n id: string;\n label: string;\n category: 'indicator' | 'chartType' | 'drawing' | 'timeframe' | 'action';\n shortcut?: string;\n active?: boolean;\n}\n\nexport interface CommandPaletteCallbacks {\n onIndicator: (id: string) => void;\n onChartType: (type: ChartType) => void;\n onDrawingTool: (tool: DrawingToolType) => void;\n onTimeframe: (tf: TimeFrame) => void;\n onAction: (id: string) => void;\n onClose: () => void;\n}\n\nexport class WidgetCommandPalette {\n private backdrop: HTMLDivElement | null = null;\n private modal: HTMLDivElement | null = null;\n private input: HTMLInputElement | null = null;\n private list: HTMLDivElement | null = null;\n private items: CommandItem[] = [];\n private filtered: CommandItem[] = [];\n private selectedIndex = 0;\n private callbacks: CommandPaletteCallbacks;\n private boundKeydown: (e: KeyboardEvent) => void;\n\n constructor(callbacks: CommandPaletteCallbacks) {\n this.callbacks = callbacks;\n this.boundKeydown = this.handleKeydown.bind(this);\n }\n\n open(items: CommandItem[]): void {\n if (this.backdrop) return;\n this.items = items;\n this.filtered = items;\n this.selectedIndex = 0;\n\n this.backdrop = document.createElement('div');\n this.backdrop.className = 'tcw-modal-backdrop';\n this.backdrop.addEventListener('click', () => this.close());\n\n this.modal = document.createElement('div');\n this.modal.className = 'tcw-cmd-palette';\n\n const header = document.createElement('div');\n header.className = 'tcw-cmd-header';\n\n const searchIcon = document.createElement('span');\n searchIcon.className = 'tcw-cmd-icon';\n searchIcon.textContent = '⌕';\n header.appendChild(searchIcon);\n\n this.input = document.createElement('input');\n this.input.className = 'tcw-cmd-input';\n this.input.type = 'text';\n this.input.placeholder = 'Search indicators, chart types, tools...';\n this.input.addEventListener('input', () => this.filter());\n header.appendChild(this.input);\n\n const hint = document.createElement('span');\n hint.className = 'tcw-cmd-hint';\n hint.textContent = 'ESC';\n header.appendChild(hint);\n\n this.modal.appendChild(header);\n\n this.list = document.createElement('div');\n this.list.className = 'tcw-cmd-list';\n this.modal.appendChild(this.list);\n\n const footer = document.createElement('div');\n footer.className = 'tcw-cmd-footer';\n footer.innerHTML = '<span>↑↓ Navigate</span><span>⏎ Select</span><span>Esc Close</span>';\n this.modal.appendChild(footer);\n\n document.body.appendChild(this.backdrop);\n document.body.appendChild(this.modal);\n\n this.renderList();\n this.input.focus();\n document.addEventListener('keydown', this.boundKeydown);\n }\n\n close(): void {\n document.removeEventListener('keydown', this.boundKeydown);\n this.backdrop?.remove();\n this.modal?.remove();\n this.backdrop = null;\n this.modal = null;\n this.input = null;\n this.list = null;\n this.callbacks.onClose();\n }\n\n isOpen(): boolean {\n return this.backdrop !== null;\n }\n\n private filter(): void {\n const query = this.input?.value.toLowerCase().trim() ?? '';\n if (!query) {\n this.filtered = this.items;\n } else {\n this.filtered = this.items.filter(item =>\n item.label.toLowerCase().includes(query) ||\n item.category.toLowerCase().includes(query) ||\n item.id.toLowerCase().includes(query),\n );\n }\n this.selectedIndex = 0;\n this.renderList();\n }\n\n private renderList(): void {\n if (!this.list) return;\n this.list.innerHTML = '';\n\n if (this.filtered.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'tcw-cmd-empty';\n empty.textContent = 'No results found';\n this.list.appendChild(empty);\n return;\n }\n\n let currentCategory = '';\n for (let i = 0; i < this.filtered.length; i++) {\n const item = this.filtered[i];\n\n if (item.category !== currentCategory) {\n currentCategory = item.category;\n const label = document.createElement('div');\n label.className = 'tcw-cmd-category';\n label.textContent = this.categoryLabel(currentCategory);\n this.list.appendChild(label);\n }\n\n const row = document.createElement('button');\n row.className = 'tcw-cmd-item';\n if (i === this.selectedIndex) row.classList.add('tcw-selected');\n if (item.active) row.classList.add('tcw-active');\n row.dataset.index = String(i);\n\n const nameSpan = document.createElement('span');\n nameSpan.className = 'tcw-cmd-item-label';\n nameSpan.textContent = item.label;\n row.appendChild(nameSpan);\n\n if (item.active) {\n const check = document.createElement('span');\n check.className = 'tcw-cmd-check';\n check.textContent = '✓';\n row.appendChild(check);\n }\n\n if (item.shortcut) {\n const kbd = document.createElement('kbd');\n kbd.className = 'tcw-cmd-kbd';\n kbd.textContent = item.shortcut;\n row.appendChild(kbd);\n }\n\n row.addEventListener('click', () => this.select(i));\n row.addEventListener('mouseenter', () => {\n this.selectedIndex = i;\n this.updateSelection();\n });\n\n this.list.appendChild(row);\n }\n }\n\n private updateSelection(): void {\n if (!this.list) return;\n const items = this.list.querySelectorAll('.tcw-cmd-item');\n items.forEach((el, i) => {\n el.classList.toggle('tcw-selected', i === this.selectedIndex);\n });\n items[this.selectedIndex]?.scrollIntoView({ block: 'nearest' });\n }\n\n private select(index: number): void {\n const item = this.filtered[index];\n if (!item) return;\n\n switch (item.category) {\n case 'indicator':\n this.callbacks.onIndicator(item.id);\n break;\n case 'chartType':\n this.callbacks.onChartType(item.id as ChartType);\n break;\n case 'drawing':\n this.callbacks.onDrawingTool(item.id as DrawingToolType);\n break;\n case 'timeframe':\n this.callbacks.onTimeframe(item.id as TimeFrame);\n break;\n case 'action':\n this.callbacks.onAction(item.id);\n break;\n }\n this.close();\n }\n\n private handleKeydown(e: KeyboardEvent): void {\n switch (e.key) {\n case 'Escape':\n e.preventDefault();\n this.close();\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (this.filtered.length > 0) {\n this.selectedIndex = (this.selectedIndex + 1) % this.filtered.length;\n this.updateSelection();\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (this.filtered.length > 0) {\n this.selectedIndex = (this.selectedIndex - 1 + this.filtered.length) % this.filtered.length;\n this.updateSelection();\n }\n break;\n case 'Enter':\n e.preventDefault();\n this.select(this.selectedIndex);\n break;\n }\n }\n\n private categoryLabel(cat: string): string {\n switch (cat) {\n case 'indicator': return 'Indicators';\n case 'chartType': return 'Chart Types';\n case 'drawing': return 'Drawing Tools';\n case 'timeframe': return 'Timeframes';\n case 'action': return 'Actions';\n default: return cat;\n }\n }\n\n destroy(): void {\n this.close();\n }\n}\n","import type { ChartType, DrawingToolType, Theme, TimeFrame } from '@tradecanvas/commons';\nimport { Chart } from '../Chart.js';\nimport { DARK_THEME, LIGHT_THEME } from '@tradecanvas/commons';\nimport type { ChartWidgetOptions, WidgetState, ChartSettingsState } from './types.js';\nimport { TIMEFRAMES, CHART_TYPES, INDICATORS, POPULAR_INDICATORS, DRAWING_TOOL_GROUPS, DEFAULT_SYMBOLS, DEFAULT_SETTINGS } from './widgetConfig.js';\nimport { injectWidgetStyles, removeWidgetStyles } from './WidgetStyles.js';\nimport { WidgetToolbar } from './WidgetToolbar.js';\nimport { WidgetDrawingSidebar } from './WidgetDrawingSidebar.js';\nimport { WidgetSettings } from './WidgetSettings.js';\nimport { WidgetStatusBar } from './WidgetStatusBar.js';\nimport { WidgetCommandPalette } from './WidgetCommandPalette.js';\nimport type { CommandItem } from './WidgetCommandPalette.js';\n\nexport class ChartWidget {\n private chart: Chart;\n private state: WidgetState;\n private toolbar: WidgetToolbar | null = null;\n private sidebar: WidgetDrawingSidebar | null = null;\n private settings: WidgetSettings | null = null;\n private statusBar: WidgetStatusBar | null = null;\n private commandPalette: WidgetCommandPalette | null = null;\n private root: HTMLDivElement;\n private chartContainer: HTMLDivElement;\n private destroyed = false;\n private options: ChartWidgetOptions;\n private symbolIndex = 0;\n private symbols: string[];\n private settingsState: ChartSettingsState;\n private adapter: import('@tradecanvas/commons').DataAdapter | null = null;\n private boundGlobalKeydown: ((e: KeyboardEvent) => void) | null = null;\n\n constructor(container: HTMLElement, options: ChartWidgetOptions = {}) {\n this.options = options;\n this.symbols = options.symbols ?? DEFAULT_SYMBOLS;\n this.settingsState = { ...DEFAULT_SETTINGS };\n\n // Resolve theme\n const isDark = this.resolveIsDark(options.theme);\n const resolvedTheme = this.resolveTheme(options.theme);\n\n // Initialize state\n this.state = {\n symbol: options.symbol ?? this.symbols[0] ?? 'BTCUSDT',\n timeframe: options.timeframe ?? '5m',\n chartType: options.chartOptions?.chartType ?? 'candlestick',\n isDark,\n activeIndicators: new Map(),\n activeTool: null,\n magnetEnabled: true,\n connectionState: 'connecting',\n connectionMessage: 'Connecting...',\n };\n\n // Set symbol index\n const sIdx = this.symbols.indexOf(this.state.symbol);\n if (sIdx >= 0) this.symbolIndex = sIdx;\n\n // 1. Inject styles\n injectWidgetStyles();\n\n // 2. Create DOM skeleton\n this.root = document.createElement('div');\n this.root.className = 'tcw-root';\n this.root.dataset.tcwTheme = isDark ? 'dark' : 'light';\n container.appendChild(this.root);\n\n // 3. Create toolbar\n if (options.toolbar !== false) {\n this.toolbar = new WidgetToolbar(\n this.root,\n {\n symbols: this.symbols,\n timeframes: options.timeframes\n ? TIMEFRAMES.filter(tf => (options.timeframes as TimeFrame[]).includes(tf.value))\n : TIMEFRAMES,\n chartTypes: options.chartTypes\n ? CHART_TYPES.filter(ct => (options.chartTypes as ChartType[]).includes(ct.value))\n : CHART_TYPES,\n indicators: INDICATORS,\n popularIndicatorIds: POPULAR_INDICATORS,\n },\n {\n onSymbolClick: () => this.handleSymbolClick(),\n onTimeframe: (tf) => this.handleTimeframe(tf),\n onChartType: (type) => this.handleChartType(type),\n onAddIndicator: (id) => this.handleAddIndicator(id),\n onRemoveIndicator: (iid) => this.handleRemoveIndicator(iid),\n onScreenshot: () => this.chart.screenshot(),\n onSettings: () => this.openSettings(),\n onToggleTheme: () => this.handleToggleTheme(),\n },\n );\n }\n\n // 4. Create body\n const body = document.createElement('div');\n body.className = 'tcw-body';\n\n if (options.drawingTools !== false) {\n this.sidebar = new WidgetDrawingSidebar(\n body,\n { drawingToolGroups: DRAWING_TOOL_GROUPS },\n {\n onDrawingTool: (tool) => this.handleDrawingTool(tool),\n onCancelDrawing: () => this.handleCancelDrawing(),\n onToggleMagnet: () => this.handleToggleMagnet(),\n onUndo: () => this.chart.undo(),\n onRedo: () => this.chart.redo(),\n onClearDrawings: () => {\n this.chart.clearDrawings();\n this.state = { ...this.state, activeTool: null };\n this.updateUI();\n },\n },\n );\n }\n\n this.chartContainer = document.createElement('div');\n this.chartContainer.className = 'tcw-chart-container';\n body.appendChild(this.chartContainer);\n this.root.appendChild(body);\n\n // 5. Create chart\n this.chart = new Chart(this.chartContainer, {\n chartType: this.state.chartType,\n theme: resolvedTheme,\n autoScale: true,\n crosshair: { mode: 'magnet' },\n features: {\n drawings: true,\n drawingMagnet: true,\n drawingUndoRedo: true,\n indicators: true,\n trading: options.trading !== false,\n tradingContextMenu: options.trading !== false,\n volume: true,\n legend: true,\n crosshair: true,\n keyboard: true,\n screenshot: true,\n alerts: true,\n barCountdown: true,\n logScale: true,\n watermark: true,\n },\n ...options.chartOptions,\n });\n\n // 6. Create status bar\n if (options.statusBar !== false) {\n this.statusBar = new WidgetStatusBar(this.root);\n }\n\n // 7. Create settings (lazy, not appended until opened)\n if (options.settings !== false) {\n this.settings = new WidgetSettings({\n onChange: (patch) => this.applySettings(patch),\n onReset: () => this.resetSettings(),\n onClose: () => {},\n });\n }\n\n // 8. Command palette\n this.commandPalette = new WidgetCommandPalette({\n onIndicator: (id) => this.handleAddIndicator(id),\n onChartType: (type) => this.handleChartType(type),\n onDrawingTool: (tool) => this.handleDrawingTool(tool),\n onTimeframe: (tf) => this.handleTimeframe(tf),\n onAction: (id) => this.handleAction(id),\n onClose: () => {},\n });\n\n this.boundGlobalKeydown = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'k') {\n e.preventDefault();\n this.toggleCommandPalette();\n }\n };\n document.addEventListener('keydown', this.boundGlobalKeydown);\n\n // 9. Connect stream\n if (options.adapter) {\n this.adapter = options.adapter;\n this.connectStream();\n }\n\n // Initial UI update\n this.updateUI();\n\n // 9. Fire onReady\n options.onReady?.(this.chart);\n }\n\n // --- Public API ---\n\n async setSymbol(symbol: string): Promise<void> {\n this.state = { ...this.state, symbol };\n const idx = this.symbols.indexOf(symbol);\n if (idx >= 0) this.symbolIndex = idx;\n this.options.onSymbolChange?.(symbol);\n this.updateUI();\n if (this.adapter) {\n await this.connectStream();\n }\n }\n\n async setTimeframe(tf: TimeFrame): Promise<void> {\n this.state = { ...this.state, timeframe: tf };\n this.options.onTimeframeChange?.(tf);\n this.updateUI();\n if (this.adapter) {\n await this.connectStream();\n }\n }\n\n setTheme(theme: import('@tradecanvas/commons').ThemeName | Theme): void {\n const isDark = this.resolveIsDark(theme);\n const resolved = this.resolveTheme(theme);\n this.state = { ...this.state, isDark };\n this.root.dataset.tcwTheme = isDark ? 'dark' : 'light';\n this.chart.setTheme(resolved);\n this.updateUI();\n }\n\n getChart(): Chart {\n return this.chart;\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n\n if (this.boundGlobalKeydown) {\n document.removeEventListener('keydown', this.boundGlobalKeydown);\n }\n this.commandPalette?.destroy();\n this.toolbar?.destroy();\n this.sidebar?.destroy();\n this.settings?.destroy();\n this.statusBar?.destroy();\n this.chart.destroy();\n this.root.remove();\n removeWidgetStyles();\n }\n\n // --- Internal handlers ---\n\n private handleSymbolClick(): void {\n this.symbolIndex = (this.symbolIndex + 1) % this.symbols.length;\n const symbol = this.symbols[this.symbolIndex];\n this.state = { ...this.state, symbol };\n this.options.onSymbolChange?.(symbol);\n this.updateUI();\n if (this.adapter) {\n this.connectStream();\n }\n }\n\n private handleTimeframe(tf: TimeFrame): void {\n this.state = { ...this.state, timeframe: tf };\n this.options.onTimeframeChange?.(tf);\n this.updateUI();\n if (this.adapter) {\n this.connectStream();\n }\n }\n\n private handleChartType(type: ChartType): void {\n this.state = { ...this.state, chartType: type };\n this.chart.setChartType(type);\n this.updateUI();\n }\n\n private handleAddIndicator(indId: string): void {\n if (this.state.activeIndicators.has(indId)) {\n // Toggle off\n const instanceId = this.state.activeIndicators.get(indId)!;\n this.chart.removeIndicator(instanceId);\n const next = new Map(this.state.activeIndicators);\n next.delete(indId);\n this.state = { ...this.state, activeIndicators: next };\n } else {\n const instanceId = this.chart.addIndicator(indId);\n if (instanceId) {\n const next = new Map(this.state.activeIndicators);\n next.set(indId, instanceId);\n this.state = { ...this.state, activeIndicators: next };\n }\n }\n this.updateUI();\n }\n\n private handleRemoveIndicator(instanceId: string): void {\n this.chart.removeIndicator(instanceId);\n const next = new Map(this.state.activeIndicators);\n for (const [id, iid] of next.entries()) {\n if (iid === instanceId) {\n next.delete(id);\n break;\n }\n }\n this.state = { ...this.state, activeIndicators: next };\n this.updateUI();\n }\n\n private toggleCommandPalette(): void {\n if (this.commandPalette?.isOpen()) {\n this.commandPalette.close();\n return;\n }\n this.commandPalette?.open(this.buildCommandItems());\n }\n\n private buildCommandItems(): CommandItem[] {\n const items: CommandItem[] = [];\n\n for (const ind of INDICATORS) {\n items.push({\n id: ind.id,\n label: ind.name,\n category: 'indicator',\n active: this.state.activeIndicators.has(ind.id),\n });\n }\n\n for (const ct of CHART_TYPES) {\n items.push({\n id: ct.value,\n label: ct.label,\n category: 'chartType',\n active: this.state.chartType === ct.value,\n });\n }\n\n for (const group of DRAWING_TOOL_GROUPS) {\n for (const tool of group.tools) {\n items.push({\n id: tool.value,\n label: tool.label,\n category: 'drawing',\n active: this.state.activeTool === tool.value,\n });\n }\n }\n\n for (const tf of TIMEFRAMES) {\n items.push({\n id: tf.value,\n label: tf.label,\n category: 'timeframe',\n active: this.state.timeframe === tf.value,\n });\n }\n\n items.push(\n { id: 'screenshot', label: 'Screenshot', category: 'action', shortcut: '' },\n { id: 'toggleTheme', label: 'Toggle Theme', category: 'action' },\n { id: 'settings', label: 'Settings', category: 'action' },\n { id: 'clearDrawings', label: 'Clear All Drawings', category: 'action' },\n );\n\n return items;\n }\n\n private handleAction(id: string): void {\n switch (id) {\n case 'screenshot':\n this.chart.screenshot();\n break;\n case 'toggleTheme':\n this.handleToggleTheme();\n break;\n case 'settings':\n this.openSettings();\n break;\n case 'clearDrawings':\n this.chart.clearDrawings();\n this.state = { ...this.state, activeTool: null };\n this.updateUI();\n break;\n }\n }\n\n private handleDrawingTool(tool: DrawingToolType): void {\n this.state = { ...this.state, activeTool: tool };\n this.chart.setDrawingTool(tool);\n this.updateUI();\n }\n\n private handleCancelDrawing(): void {\n this.state = { ...this.state, activeTool: null };\n this.chart.setDrawingTool(null);\n this.updateUI();\n }\n\n private handleToggleMagnet(): void {\n const magnetEnabled = !this.state.magnetEnabled;\n this.state = { ...this.state, magnetEnabled };\n this.chart.setDrawingMagnet(magnetEnabled);\n this.updateUI();\n }\n\n private handleToggleTheme(): void {\n const isDark = !this.state.isDark;\n this.state = { ...this.state, isDark };\n this.root.dataset.tcwTheme = isDark ? 'dark' : 'light';\n this.chart.setTheme(isDark ? DARK_THEME : LIGHT_THEME);\n this.chart.setWatermark(this.state.symbol.replace('USDT', ' / USDT'), {\n fontSize: 48,\n color: isDark ? 'rgba(255,255,255,0.03)' : 'rgba(0,0,0,0.03)',\n });\n this.updateUI();\n }\n\n private openSettings(): void {\n this.settings?.open(this.settingsState);\n }\n\n private applySettings(patch: Partial<ChartSettingsState>): void {\n this.settingsState = { ...this.settingsState, ...patch };\n\n if (patch.gridVisible !== undefined) this.chart.setGridVisible(patch.gridVisible);\n if (patch.volumeVisible !== undefined) this.chart.setVolumeVisible(patch.volumeVisible);\n if (patch.crosshairMode !== undefined) this.chart.setCrosshairMode(patch.crosshairMode);\n if (patch.autoScale !== undefined) this.chart.setAutoScale(patch.autoScale);\n if (patch.logScale !== undefined) this.chart.setLogScale(patch.logScale);\n if (patch.numberLocale !== undefined) this.chart.setNumberLocale(patch.numberLocale);\n\n // Apply theme colors\n const currentTheme = this.chart.getTheme();\n const themeUpdate = { ...currentTheme } as Record<string, unknown>;\n let themeChanged = false;\n\n if (patch.candleUpColor !== undefined) { themeUpdate.candleUp = patch.candleUpColor; themeChanged = true; }\n if (patch.candleDownColor !== undefined) { themeUpdate.candleDown = patch.candleDownColor; themeChanged = true; }\n if (patch.candleUpWick !== undefined) { themeUpdate.candleUpWick = patch.candleUpWick; themeChanged = true; }\n if (patch.candleDownWick !== undefined) { themeUpdate.candleDownWick = patch.candleDownWick; themeChanged = true; }\n if (patch.backgroundColor !== undefined) { themeUpdate.background = patch.backgroundColor; themeChanged = true; }\n if (patch.gridColor !== undefined) { themeUpdate.grid = patch.gridColor; themeChanged = true; }\n\n if (themeChanged) {\n this.chart.setTheme(themeUpdate as unknown as Theme);\n }\n }\n\n private resetSettings(): void {\n this.settingsState = { ...DEFAULT_SETTINGS };\n this.applySettings(this.settingsState);\n }\n\n private async connectStream(): Promise<void> {\n if (!this.adapter) return;\n\n this.state = {\n ...this.state,\n connectionState: 'connecting',\n connectionMessage: 'Connecting...',\n };\n this.updateUI();\n\n try {\n this.chart.disconnectStream();\n await this.chart.connect({\n adapter: this.adapter,\n symbol: this.state.symbol,\n timeframe: this.state.timeframe,\n historyLimit: this.options.historyLimit ?? 500,\n });\n\n this.chart.setWatermark(this.state.symbol.replace('USDT', ' / USDT'), {\n fontSize: 48,\n color: this.state.isDark ? 'rgba(255,255,255,0.03)' : 'rgba(0,0,0,0.03)',\n });\n\n this.state = {\n ...this.state,\n connectionState: 'connected',\n connectionMessage: 'Live',\n };\n } catch (err: unknown) {\n this.state = {\n ...this.state,\n connectionState: 'error',\n connectionMessage: err instanceof Error ? err.message : 'Connection failed',\n };\n }\n\n this.updateUI();\n }\n\n private updateUI(): void {\n this.toolbar?.update(this.state);\n this.sidebar?.update(this.state);\n this.statusBar?.update({\n connectionState: this.state.connectionState,\n message: this.state.connectionMessage,\n symbol: this.state.symbol,\n timeframe: this.state.timeframe,\n });\n }\n\n private resolveIsDark(theme?: import('@tradecanvas/commons').ThemeName | Theme): boolean {\n if (theme === undefined || theme === 'dark') return true;\n if (theme === 'light') return false;\n // If it's a Theme object, check background color\n if (typeof theme === 'object' && theme.background) {\n return this.isColorDark(theme.background);\n }\n return true;\n }\n\n private resolveTheme(theme?: import('@tradecanvas/commons').ThemeName | Theme): Theme {\n if (theme === undefined || theme === 'dark') return DARK_THEME;\n if (theme === 'light') return LIGHT_THEME;\n if (typeof theme === 'object') return theme as Theme;\n return DARK_THEME;\n }\n\n private isColorDark(color: string): boolean {\n // Simple heuristic: if it starts with # and R+G+B < 384 (half of 768)\n if (color.startsWith('#') && color.length >= 7) {\n const r = parseInt(color.slice(1, 3), 16);\n const g = parseInt(color.slice(3, 5), 16);\n const b = parseInt(color.slice(5, 7), 16);\n return (r + g + b) < 384;\n }\n return true;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/widget/widgetConfig.ts","../../src/widget/WidgetStyles.ts","../../src/widget/icons.ts","../../src/widget/WidgetDropdown.ts","../../src/widget/WidgetToolbar.ts","../../src/widget/WidgetDrawingSidebar.ts","../../src/widget/WidgetSettings.ts","../../src/widget/WidgetStatusBar.ts","../../src/widget/WidgetCommandPalette.ts","../../src/widget/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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widgetConfig.d.ts","sourceRoot":"","sources":["../../src/widget/widgetConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAmB,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAExF,eAAO,MAAM,UAAU,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,EAO3D,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"widgetConfig.d.ts","sourceRoot":"","sources":["../../src/widget/widgetConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAmB,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAExF,eAAO,MAAM,UAAU,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,EAO3D,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,EAa5D,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,mBAAmB,EA8DpD,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,YAAY,EAkCpC,CAAC;AAEF,eAAO,MAAM,kBAAkB,UAG9B,CAAC;AAEF,eAAO,MAAM,eAAe,UAE3B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,kBAe9B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tradecanvas/chart",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "High-performance canvas trading chart with built-in indicators, drawing tools, and real-time streaming. Zero external dependencies.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
"README.md"
|
|
48
48
|
],
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@tradecanvas/
|
|
51
|
-
"@tradecanvas/
|
|
50
|
+
"@tradecanvas/commons": "0.8.1",
|
|
51
|
+
"@tradecanvas/core": "0.8.1"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"vitest": "^2.1.8"
|