@forgecharts/sdk 1.2.1 → 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/dist/Omne-YBWT34SS.png +0 -0
  2. package/dist/Rithmic-CDB4YQEZ.png +0 -0
  3. package/dist/api/DrawingManager.d.ts +1 -1
  4. package/dist/api/DrawingManager.d.ts.map +1 -1
  5. package/dist/api/IndicatorDAG.d.ts +22 -0
  6. package/dist/api/IndicatorDAG.d.ts.map +1 -1
  7. package/dist/api/IndicatorRegistry.d.ts +6 -0
  8. package/dist/api/IndicatorRegistry.d.ts.map +1 -1
  9. package/dist/api/LayoutManager.d.ts +3 -1
  10. package/dist/api/LayoutManager.d.ts.map +1 -1
  11. package/dist/api/ReferenceAPI.d.ts +5 -0
  12. package/dist/api/ReferenceAPI.d.ts.map +1 -1
  13. package/dist/api/TChart.d.ts +69 -0
  14. package/dist/api/TChart.d.ts.map +1 -1
  15. package/dist/api/drawing tools/fib gann menu/fibChannel.d.ts +4 -0
  16. package/dist/api/drawing tools/fib gann menu/fibChannel.d.ts.map +1 -0
  17. package/dist/api/drawing tools/fib gann menu/fibCircles.d.ts +4 -0
  18. package/dist/api/drawing tools/fib gann menu/fibCircles.d.ts.map +1 -0
  19. package/dist/api/drawing tools/fib gann menu/fibRetracement.d.ts.map +1 -1
  20. package/dist/api/drawing tools/fib gann menu/fibSpeedResistanceArcs.d.ts +4 -0
  21. package/dist/api/drawing tools/fib gann menu/fibSpeedResistanceArcs.d.ts.map +1 -0
  22. package/dist/api/drawing tools/fib gann menu/fibSpeedResistanceFan.d.ts +4 -0
  23. package/dist/api/drawing tools/fib gann menu/fibSpeedResistanceFan.d.ts.map +1 -0
  24. package/dist/api/drawing tools/fib gann menu/fibSpiral.d.ts +4 -0
  25. package/dist/api/drawing tools/fib gann menu/fibSpiral.d.ts.map +1 -0
  26. package/dist/api/drawing tools/fib gann menu/fibTimeZone.d.ts +4 -0
  27. package/dist/api/drawing tools/fib gann menu/fibTimeZone.d.ts.map +1 -0
  28. package/dist/api/drawing tools/fib gann menu/fibWedge.d.ts +4 -0
  29. package/dist/api/drawing tools/fib gann menu/fibWedge.d.ts.map +1 -0
  30. package/dist/api/drawing tools/fib gann menu/gannBox.d.ts +4 -0
  31. package/dist/api/drawing tools/fib gann menu/gannBox.d.ts.map +1 -0
  32. package/dist/api/drawing tools/fib gann menu/gannFan.d.ts +4 -0
  33. package/dist/api/drawing tools/fib gann menu/gannFan.d.ts.map +1 -0
  34. package/dist/api/drawing tools/fib gann menu/gannSquare.d.ts +4 -0
  35. package/dist/api/drawing tools/fib gann menu/gannSquare.d.ts.map +1 -0
  36. package/dist/api/drawing tools/fib gann menu/gannSquareFixed.d.ts +4 -0
  37. package/dist/api/drawing tools/fib gann menu/gannSquareFixed.d.ts.map +1 -0
  38. package/dist/api/drawing tools/fib gann menu/pitchfan.d.ts +4 -0
  39. package/dist/api/drawing tools/fib gann menu/pitchfan.d.ts.map +1 -0
  40. package/dist/api/drawing tools/fib gann menu/trendBasedFibExtension.d.ts +4 -0
  41. package/dist/api/drawing tools/fib gann menu/trendBasedFibExtension.d.ts.map +1 -0
  42. package/dist/api/drawing tools/fib gann menu/trendBasedFibTime.d.ts +4 -0
  43. package/dist/api/drawing tools/fib gann menu/trendBasedFibTime.d.ts.map +1 -0
  44. package/dist/api/drawing tools/shapes menu/anchoredText.d.ts +7 -0
  45. package/dist/api/drawing tools/shapes menu/anchoredText.d.ts.map +1 -0
  46. package/dist/api/drawing tools/shapes menu/arc.d.ts +8 -0
  47. package/dist/api/drawing tools/shapes menu/arc.d.ts.map +1 -0
  48. package/dist/api/drawing tools/shapes menu/arrow.d.ts +4 -0
  49. package/dist/api/drawing tools/shapes menu/arrow.d.ts.map +1 -0
  50. package/dist/api/drawing tools/shapes menu/arrowDown.d.ts +7 -0
  51. package/dist/api/drawing tools/shapes menu/arrowDown.d.ts.map +1 -0
  52. package/dist/api/drawing tools/shapes menu/arrowUp.d.ts +7 -0
  53. package/dist/api/drawing tools/shapes menu/arrowUp.d.ts.map +1 -0
  54. package/dist/api/drawing tools/shapes menu/callout.d.ts +7 -0
  55. package/dist/api/drawing tools/shapes menu/callout.d.ts.map +1 -0
  56. package/dist/api/drawing tools/shapes menu/dateRange.d.ts +4 -0
  57. package/dist/api/drawing tools/shapes menu/dateRange.d.ts.map +1 -0
  58. package/dist/api/drawing tools/shapes menu/ellipse.d.ts +4 -0
  59. package/dist/api/drawing tools/shapes menu/ellipse.d.ts.map +1 -0
  60. package/dist/api/drawing tools/shapes menu/longPosition.d.ts +4 -0
  61. package/dist/api/drawing tools/shapes menu/longPosition.d.ts.map +1 -0
  62. package/dist/api/drawing tools/shapes menu/priceLabel.d.ts +7 -0
  63. package/dist/api/drawing tools/shapes menu/priceLabel.d.ts.map +1 -0
  64. package/dist/api/drawing tools/shapes menu/priceRange.d.ts +4 -0
  65. package/dist/api/drawing tools/shapes menu/priceRange.d.ts.map +1 -0
  66. package/dist/api/drawing tools/shapes menu/shortPosition.d.ts +4 -0
  67. package/dist/api/drawing tools/shapes menu/shortPosition.d.ts.map +1 -0
  68. package/dist/api/drawing tools/shapes menu/triangle.d.ts +4 -0
  69. package/dist/api/drawing tools/shapes menu/triangle.d.ts.map +1 -0
  70. package/dist/core/Chart.d.ts +29 -2
  71. package/dist/core/Chart.d.ts.map +1 -1
  72. package/dist/core/CoordTransform.d.ts.map +1 -1
  73. package/dist/core/Crosshair.d.ts +2 -0
  74. package/dist/core/Crosshair.d.ts.map +1 -1
  75. package/dist/core/IndicatorEngine.d.ts +15 -0
  76. package/dist/core/IndicatorEngine.d.ts.map +1 -1
  77. package/dist/core/InteractionManager.d.ts +55 -2
  78. package/dist/core/InteractionManager.d.ts.map +1 -1
  79. package/dist/core/PriceScale.d.ts +2 -0
  80. package/dist/core/PriceScale.d.ts.map +1 -1
  81. package/dist/core/Series.d.ts.map +1 -1
  82. package/dist/core/TimeScale.d.ts +52 -1
  83. package/dist/core/TimeScale.d.ts.map +1 -1
  84. package/dist/core/indicatorStyles.d.ts +37 -0
  85. package/dist/core/indicatorStyles.d.ts.map +1 -0
  86. package/dist/datafeed/DatafeedConnector.d.ts +27 -0
  87. package/dist/datafeed/DatafeedConnector.d.ts.map +1 -1
  88. package/dist/engine/CandleEngine.d.ts +2 -0
  89. package/dist/engine/CandleEngine.d.ts.map +1 -1
  90. package/dist/forgecharts.css +2029 -132
  91. package/dist/forgescript/ast.d.ts +71 -4
  92. package/dist/forgescript/ast.d.ts.map +1 -1
  93. package/dist/forgescript/builtins/collections.d.ts +56 -0
  94. package/dist/forgescript/builtins/collections.d.ts.map +1 -0
  95. package/dist/forgescript/builtins/drawing.d.ts +57 -0
  96. package/dist/forgescript/builtins/drawing.d.ts.map +1 -0
  97. package/dist/forgescript/builtins/udt.d.ts +30 -0
  98. package/dist/forgescript/builtins/udt.d.ts.map +1 -0
  99. package/dist/forgescript/conversion/index.d.ts +16 -9
  100. package/dist/forgescript/conversion/index.d.ts.map +1 -1
  101. package/dist/forgescript/conversion/types.d.ts +10 -54
  102. package/dist/forgescript/conversion/types.d.ts.map +1 -1
  103. package/dist/forgescript/conversion/validation.d.ts.map +1 -1
  104. package/dist/forgescript/datasets/DatasetStore.d.ts +65 -0
  105. package/dist/forgescript/datasets/DatasetStore.d.ts.map +1 -0
  106. package/dist/forgescript/datasets/parseDataset.d.ts +32 -0
  107. package/dist/forgescript/datasets/parseDataset.d.ts.map +1 -0
  108. package/dist/forgescript/parser.d.ts +19 -1
  109. package/dist/forgescript/parser.d.ts.map +1 -1
  110. package/dist/forgescript/runtime.d.ts +125 -104
  111. package/dist/forgescript/runtime.d.ts.map +1 -1
  112. package/dist/index.d.ts +14 -7
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js +21487 -8016
  115. package/dist/index.js.map +1 -1
  116. package/dist/internal.d.ts +2 -0
  117. package/dist/internal.d.ts.map +1 -1
  118. package/dist/internal.js +19599 -6869
  119. package/dist/internal.js.map +1 -1
  120. package/dist/licensing/ChartRuntimeResolver.d.ts +134 -124
  121. package/dist/licensing/ChartRuntimeResolver.d.ts.map +1 -1
  122. package/dist/licensing/LicenseManager.d.ts.map +1 -1
  123. package/dist/licensing/__tests__/ChartRuntimeResolver.test.d.ts +2 -0
  124. package/dist/licensing/__tests__/ChartRuntimeResolver.test.d.ts.map +1 -1
  125. package/dist/licensing/licenseTypes.d.ts +56 -15
  126. package/dist/licensing/licenseTypes.d.ts.map +1 -1
  127. package/dist/node.d.ts +57 -0
  128. package/dist/node.d.ts.map +1 -0
  129. package/dist/pixi/PixiBenchmark.d.ts +56 -0
  130. package/dist/pixi/PixiBenchmark.d.ts.map +1 -0
  131. package/dist/pixi/PixiCandlestickRenderer.d.ts +19 -6
  132. package/dist/pixi/PixiCandlestickRenderer.d.ts.map +1 -1
  133. package/dist/pixi/PixiChart.d.ts +108 -2
  134. package/dist/pixi/PixiChart.d.ts.map +1 -1
  135. package/dist/pixi/PixiCrosshairRenderer.d.ts +10 -0
  136. package/dist/pixi/PixiCrosshairRenderer.d.ts.map +1 -1
  137. package/dist/pixi/PixiDrawingRenderer.d.ts +17 -5
  138. package/dist/pixi/PixiDrawingRenderer.d.ts.map +1 -1
  139. package/dist/pixi/PixiGridRenderer.d.ts +18 -2
  140. package/dist/pixi/PixiGridRenderer.d.ts.map +1 -1
  141. package/dist/pixi/PixiHistogramRenderer.d.ts +17 -0
  142. package/dist/pixi/PixiHistogramRenderer.d.ts.map +1 -0
  143. package/dist/pixi/PixiIndicatorRenderer.d.ts +35 -0
  144. package/dist/pixi/PixiIndicatorRenderer.d.ts.map +1 -0
  145. package/dist/pixi/PixiLastPriceRenderer.d.ts +33 -0
  146. package/dist/pixi/PixiLastPriceRenderer.d.ts.map +1 -0
  147. package/dist/pixi/PixiLayerManager.d.ts.map +1 -1
  148. package/dist/pixi/PixiLineRenderer.d.ts +19 -0
  149. package/dist/pixi/PixiLineRenderer.d.ts.map +1 -0
  150. package/dist/pixi/PixiTradingRenderer.d.ts +100 -0
  151. package/dist/pixi/PixiTradingRenderer.d.ts.map +1 -0
  152. package/dist/pixi/snap.d.ts +38 -0
  153. package/dist/pixi/snap.d.ts.map +1 -0
  154. package/dist/react/agent/AgentFAB.d.ts +21 -0
  155. package/dist/react/agent/AgentFAB.d.ts.map +1 -0
  156. package/dist/react/agent/AgentProvider.d.ts +15 -0
  157. package/dist/react/agent/AgentProvider.d.ts.map +1 -0
  158. package/dist/react/agent/AgentUIBus.d.ts +118 -0
  159. package/dist/react/agent/AgentUIBus.d.ts.map +1 -0
  160. package/dist/react/agent/AssistantPanel.d.ts +13 -0
  161. package/dist/react/agent/AssistantPanel.d.ts.map +1 -0
  162. package/dist/react/agent/CommandDispatcher.d.ts +81 -0
  163. package/dist/react/agent/CommandDispatcher.d.ts.map +1 -0
  164. package/dist/react/agent/VoiceInput.d.ts +36 -0
  165. package/dist/react/agent/VoiceInput.d.ts.map +1 -0
  166. package/dist/react/agent/contractUtils.d.ts +31 -0
  167. package/dist/react/agent/contractUtils.d.ts.map +1 -0
  168. package/dist/react/agent/index.d.ts +18 -0
  169. package/dist/react/agent/index.d.ts.map +1 -0
  170. package/dist/react/agent/useAgent.d.ts +81 -0
  171. package/dist/react/agent/useAgent.d.ts.map +1 -0
  172. package/dist/react/canvas/ChartCanvas.d.ts +55 -0
  173. package/dist/react/canvas/ChartCanvas.d.ts.map +1 -1
  174. package/dist/react/canvas/ChartContextMenu.d.ts +1 -1
  175. package/dist/react/canvas/ChartContextMenu.d.ts.map +1 -1
  176. package/dist/react/canvas/ChartSettingsDialog.d.ts +80 -2
  177. package/dist/react/canvas/ChartSettingsDialog.d.ts.map +1 -1
  178. package/dist/react/canvas/ContractSwitchDialog.d.ts +22 -0
  179. package/dist/react/canvas/ContractSwitchDialog.d.ts.map +1 -0
  180. package/dist/react/canvas/DrawingPropertiesDialog.d.ts +23 -0
  181. package/dist/react/canvas/DrawingPropertiesDialog.d.ts.map +1 -0
  182. package/dist/react/canvas/IndicatorLabel.d.ts +11 -3
  183. package/dist/react/canvas/IndicatorLabel.d.ts.map +1 -1
  184. package/dist/react/canvas/IndicatorPane.d.ts +1 -1
  185. package/dist/react/canvas/IndicatorPane.d.ts.map +1 -1
  186. package/dist/react/canvas/PointerOverlay.d.ts +6 -3
  187. package/dist/react/canvas/PointerOverlay.d.ts.map +1 -1
  188. package/dist/react/canvas/PositionPropertiesDialog.d.ts +22 -0
  189. package/dist/react/canvas/PositionPropertiesDialog.d.ts.map +1 -0
  190. package/dist/react/canvas/TableOverlay.d.ts +1 -1
  191. package/dist/react/canvas/TableOverlay.d.ts.map +1 -1
  192. package/dist/react/canvas/toolbars/LeftToolbar.d.ts +9 -2
  193. package/dist/react/canvas/toolbars/LeftToolbar.d.ts.map +1 -1
  194. package/dist/react/hooks/useBrokerEvents.d.ts +9 -0
  195. package/dist/react/hooks/useBrokerEvents.d.ts.map +1 -1
  196. package/dist/react/hooks/useChartCapabilities.d.ts.map +1 -1
  197. package/dist/react/hooks/usePanelDrag.d.ts +2 -0
  198. package/dist/react/hooks/usePanelDrag.d.ts.map +1 -0
  199. package/dist/react/index.d.ts +3 -0
  200. package/dist/react/index.d.ts.map +1 -1
  201. package/dist/react/index.js +25769 -10541
  202. package/dist/react/index.js.map +1 -1
  203. package/dist/react/internal.js +32838 -15641
  204. package/dist/react/internal.js.map +1 -1
  205. package/dist/react/shell/DatasetImportPanel.d.ts +14 -0
  206. package/dist/react/shell/DatasetImportPanel.d.ts.map +1 -0
  207. package/dist/react/shell/DatasetManagerDrawer.d.ts +20 -0
  208. package/dist/react/shell/DatasetManagerDrawer.d.ts.map +1 -0
  209. package/dist/react/shell/DepthOfMarketPanel.d.ts +18 -0
  210. package/dist/react/shell/DepthOfMarketPanel.d.ts.map +1 -0
  211. package/dist/react/shell/DocsEditor.d.ts +17 -0
  212. package/dist/react/shell/DocsEditor.d.ts.map +1 -0
  213. package/dist/react/shell/ManagedAppShell.d.ts +27 -0
  214. package/dist/react/shell/ManagedAppShell.d.ts.map +1 -1
  215. package/dist/react/shell/OrderEntryPanel.d.ts +21 -1
  216. package/dist/react/shell/OrderEntryPanel.d.ts.map +1 -1
  217. package/dist/react/shell/ScriptDrawer.d.ts +7 -1
  218. package/dist/react/shell/ScriptDrawer.d.ts.map +1 -1
  219. package/dist/react/shell/ScriptSettings.d.ts +26 -0
  220. package/dist/react/shell/ScriptSettings.d.ts.map +1 -0
  221. package/dist/react/shell/TradeDrawer.d.ts +8 -1
  222. package/dist/react/shell/TradeDrawer.d.ts.map +1 -1
  223. package/dist/react/shell/WatchlistDrawer.d.ts +2 -1
  224. package/dist/react/shell/WatchlistDrawer.d.ts.map +1 -1
  225. package/dist/react/shell/useDepthSubscription.d.ts +12 -0
  226. package/dist/react/shell/useDepthSubscription.d.ts.map +1 -0
  227. package/dist/react/shell/useWatchlistQuotes.d.ts +6 -0
  228. package/dist/react/shell/useWatchlistQuotes.d.ts.map +1 -1
  229. package/dist/react/workspace/BottomTradingPanel.d.ts +78 -0
  230. package/dist/react/workspace/BottomTradingPanel.d.ts.map +1 -0
  231. package/dist/react/workspace/ChartWorkspace.d.ts +64 -1
  232. package/dist/react/workspace/ChartWorkspace.d.ts.map +1 -1
  233. package/dist/react/workspace/FloatingPanel.d.ts +1 -1
  234. package/dist/react/workspace/FloatingPanel.d.ts.map +1 -1
  235. package/dist/react/workspace/GridChartContainer.d.ts +40 -0
  236. package/dist/react/workspace/GridChartContainer.d.ts.map +1 -0
  237. package/dist/react/workspace/GridSyncContext.d.ts +32 -0
  238. package/dist/react/workspace/GridSyncContext.d.ts.map +1 -0
  239. package/dist/react/workspace/GridTemplates.d.ts +16 -0
  240. package/dist/react/workspace/GridTemplates.d.ts.map +1 -0
  241. package/dist/react/workspace/IndicatorsDialog.d.ts +5 -1
  242. package/dist/react/workspace/IndicatorsDialog.d.ts.map +1 -1
  243. package/dist/react/workspace/LayoutMenu.d.ts +1 -1
  244. package/dist/react/workspace/LayoutMenu.d.ts.map +1 -1
  245. package/dist/react/workspace/LayoutTemplateSelector.d.ts +16 -0
  246. package/dist/react/workspace/LayoutTemplateSelector.d.ts.map +1 -0
  247. package/dist/react/workspace/SymbolSearchDialog.d.ts +1 -1
  248. package/dist/react/workspace/SymbolSearchDialog.d.ts.map +1 -1
  249. package/dist/react/workspace/TabBar.d.ts +4 -1
  250. package/dist/react/workspace/TabBar.d.ts.map +1 -1
  251. package/dist/react/workspace/toolbars/BottomToolbar.d.ts +7 -1
  252. package/dist/react/workspace/toolbars/BottomToolbar.d.ts.map +1 -1
  253. package/dist/react/workspace/toolbars/RightToolbar.d.ts +10 -1
  254. package/dist/react/workspace/toolbars/RightToolbar.d.ts.map +1 -1
  255. package/dist/react/workspace/toolbars/TopToolbar.d.ts +36 -2
  256. package/dist/react/workspace/toolbars/TopToolbar.d.ts.map +1 -1
  257. package/dist/renderers/CandlestickRenderer.d.ts.map +1 -1
  258. package/dist/services/BarPrefetchCache.d.ts +39 -0
  259. package/dist/services/BarPrefetchCache.d.ts.map +1 -0
  260. package/dist/theme/colors.d.ts.map +1 -1
  261. package/dist/trading/UnmanagedIngestion.d.ts +39 -12
  262. package/dist/trading/UnmanagedIngestion.d.ts.map +1 -1
  263. package/dist/trading/tradingTypes.d.ts +11 -2
  264. package/dist/trading/tradingTypes.d.ts.map +1 -1
  265. package/dist/types/ChartBackend.d.ts +67 -0
  266. package/dist/types/ChartBackend.d.ts.map +1 -0
  267. package/package.json +2 -2
  268. package/dist/forgescript/__tests__/ai-response-parser.test.d.ts +0 -2
  269. package/dist/forgescript/__tests__/ai-response-parser.test.d.ts.map +0 -1
  270. package/dist/forgescript/__tests__/orchestrator.test.d.ts +0 -2
  271. package/dist/forgescript/__tests__/orchestrator.test.d.ts.map +0 -1
  272. package/dist/forgescript/__tests__/pine-transpiler.test.d.ts +0 -2
  273. package/dist/forgescript/__tests__/pine-transpiler.test.d.ts.map +0 -1
  274. package/dist/forgescript/conversion/ai-conversion-agent.d.ts +0 -41
  275. package/dist/forgescript/conversion/ai-conversion-agent.d.ts.map +0 -1
  276. package/dist/forgescript/conversion/conversion-orchestrator.d.ts +0 -44
  277. package/dist/forgescript/conversion/conversion-orchestrator.d.ts.map +0 -1
  278. package/dist/forgescript/conversion/prompts/index.d.ts +0 -17
  279. package/dist/forgescript/conversion/prompts/index.d.ts.map +0 -1
  280. package/dist/forgescript/pine/PineCompiler.d.ts +0 -38
  281. package/dist/forgescript/pine/PineCompiler.d.ts.map +0 -1
  282. package/dist/forgescript/pine/diagnostics.d.ts +0 -20
  283. package/dist/forgescript/pine/diagnostics.d.ts.map +0 -1
  284. package/dist/forgescript/pine/index.d.ts +0 -8
  285. package/dist/forgescript/pine/index.d.ts.map +0 -1
  286. package/dist/forgescript/pine/pine-ast.d.ts +0 -190
  287. package/dist/forgescript/pine/pine-ast.d.ts.map +0 -1
  288. package/dist/forgescript/pine/pine-lexer.d.ts +0 -41
  289. package/dist/forgescript/pine/pine-lexer.d.ts.map +0 -1
  290. package/dist/forgescript/pine/pine-parser.d.ts +0 -108
  291. package/dist/forgescript/pine/pine-parser.d.ts.map +0 -1
  292. package/dist/forgescript/pine/pine-transpiler.d.ts +0 -40
  293. package/dist/forgescript/pine/pine-transpiler.d.ts.map +0 -1
@@ -439,16 +439,9 @@ button.active { background: var(--toolbar-hover); color: var(--accent); }
439
439
  height: 30px;
440
440
  }
441
441
 
442
- /* Force cursor hidden for the chart container in crosshair mode.
443
- The canvas element itself is excluded so JS-set axis resize cursors (ns-resize, ew-resize)
444
- can still show through when the pointer is over an axis. */
445
- .chart-crosshair-mode {
446
- cursor: none !important;
447
- }
448
- /* Apply to all children EXCEPT the interactive overlay canvas which controls axis cursors */
449
- .chart-crosshair-mode *:not(canvas) {
450
- cursor: none !important;
451
- }
442
+ /* Crosshair mode cursor hiding is controlled entirely by InteractionManager._setCursor()
443
+ which already hides the native cursor in the plot area while allowing axis resize cursors
444
+ (ns-resize, ew-resize) and pointer cursors to show through. No CSS override needed. */
452
445
 
453
446
  /* Other tool star badge — overlaid in top-right corner */
454
447
  .dt-other-tool-wrap {
@@ -709,7 +702,33 @@ button.active { background: var(--toolbar-hover); color: var(--accent); }
709
702
  }
710
703
  .tf-star-btn:hover { background: rgba(128,128,128,0.15); }
711
704
 
712
- /* ── Layout dropdown ─────────────────────────────────────────────────────── */
705
+ /* ── Roll-rule dropdown (continuous contract picker) ─────────────────────── */
706
+ .roll-dropdown {
707
+ position: absolute;
708
+ top: calc(100% + 6px);
709
+ left: 0;
710
+ min-width: 150px;
711
+ background: var(--toolbar-bg);
712
+ border: 1px solid var(--border);
713
+ border-radius: 8px;
714
+ padding: 4px 0;
715
+ z-index: 1001;
716
+ box-shadow: 0 8px 24px rgba(0,0,0,0.35);
717
+ }
718
+ .roll-dropdown-item {
719
+ display: block;
720
+ width: 100%;
721
+ text-align: left;
722
+ padding: 7px 14px;
723
+ font-size: 12.5px;
724
+ color: var(--text);
725
+ background: transparent;
726
+ border: none;
727
+ cursor: pointer;
728
+ }
729
+ .roll-dropdown-item:hover { background: var(--toolbar-hover); }
730
+ .roll-dropdown-item.active { background: var(--accent); color: #fff; }
731
+
713
732
  .layout-menu-root { position: relative; }
714
733
 
715
734
  .layout-dropdown {
@@ -1018,6 +1037,67 @@ button.active { background: var(--toolbar-hover); color: var(--accent); }
1018
1037
  .ind-tab:hover { color: var(--text); }
1019
1038
  .ind-tab.active { color: var(--primary); border-bottom-color: var(--primary); font-weight: 600; }
1020
1039
 
1040
+ /* source tabs (Built-In | Community | Store) */
1041
+ .ind-source-tabs {
1042
+ display: flex;
1043
+ gap: 0;
1044
+ padding: 0 6px;
1045
+ border-bottom: 1px solid var(--border);
1046
+ flex-shrink: 0;
1047
+ background: var(--toolbar-bg);
1048
+ }
1049
+ .ind-source-tab {
1050
+ display: inline-flex;
1051
+ align-items: center;
1052
+ gap: 6px;
1053
+ background: none;
1054
+ border: none;
1055
+ border-bottom: 2px solid transparent;
1056
+ color: var(--text-muted);
1057
+ cursor: pointer;
1058
+ font-size: 13px;
1059
+ font-family: inherit;
1060
+ font-weight: 500;
1061
+ padding: 10px 16px 9px;
1062
+ white-space: nowrap;
1063
+ transition: color 0.12s, border-color 0.12s, background 0.12s;
1064
+ }
1065
+ .ind-source-tab:hover {
1066
+ color: var(--text);
1067
+ background: var(--toolbar-hover);
1068
+ }
1069
+ .ind-source-tab.active {
1070
+ color: var(--primary);
1071
+ border-bottom-color: var(--primary);
1072
+ font-weight: 600;
1073
+ }
1074
+ .ind-source-tab svg {
1075
+ flex-shrink: 0;
1076
+ opacity: 0.7;
1077
+ }
1078
+ .ind-source-tab.active svg {
1079
+ opacity: 1;
1080
+ stroke: var(--primary);
1081
+ }
1082
+
1083
+ /* store price badge */
1084
+ .ind-list-price {
1085
+ flex-shrink: 0;
1086
+ font-size: 12px;
1087
+ font-weight: 700;
1088
+ color: var(--success);
1089
+ padding: 2px 8px;
1090
+ border-radius: 4px;
1091
+ background: var(--success-bg);
1092
+ white-space: nowrap;
1093
+ }
1094
+
1095
+ /* community free badge */
1096
+ .ind-list-badge.community {
1097
+ color: var(--success);
1098
+ background: var(--success-bg);
1099
+ }
1100
+
1021
1101
  /* list */
1022
1102
  .ind-list-wrap {
1023
1103
  flex: 1;
@@ -1300,6 +1380,48 @@ button.active { background: var(--toolbar-hover); color: var(--accent); }
1300
1380
  .sym-row:hover { background: var(--toolbar-hover); }
1301
1381
  .sym-row.active { background: var(--primary-bg); }
1302
1382
  .sym-row + .sym-row { border-top: 1px solid var(--border); }
1383
+
1384
+ /* Grouped parent row (continuous contract with expand toggle) */
1385
+ .sym-group-parent {
1386
+ position: relative;
1387
+ display: flex;
1388
+ align-items: stretch;
1389
+ }
1390
+ .sym-group-parent .sym-row {
1391
+ flex: 1;
1392
+ min-width: 0;
1393
+ }
1394
+ .sym-group-parent + .sym-group-parent .sym-row,
1395
+ .sym-group-parent + .sym-row,
1396
+ .sym-row + .sym-group-parent .sym-row { border-top: 1px solid var(--border); }
1397
+
1398
+ /* Expand/collapse chevron button */
1399
+ .sym-expand-btn {
1400
+ display: flex;
1401
+ align-items: center;
1402
+ justify-content: center;
1403
+ width: 30px;
1404
+ background: none;
1405
+ border: none;
1406
+ cursor: pointer;
1407
+ color: var(--text-muted);
1408
+ padding: 0;
1409
+ flex-shrink: 0;
1410
+ border-left: 1px solid var(--border);
1411
+ }
1412
+ .sym-expand-btn:hover { background: var(--toolbar-hover); color: var(--text); }
1413
+
1414
+ /* Indented child contract rows */
1415
+ .sym-row-child {
1416
+ padding-left: 38px;
1417
+ background: var(--bg-secondary, rgba(0,0,0,.04));
1418
+ }
1419
+ .sym-row-child + .sym-row-child { border-top: 1px solid var(--border); }
1420
+ .sym-row-child .sym-row-icon {
1421
+ width: 24px;
1422
+ height: 24px;
1423
+ font-size: 11px;
1424
+ }
1303
1425
  .sym-row-icon {
1304
1426
  width: 30px;
1305
1427
  height: 30px;
@@ -1343,6 +1465,22 @@ button.active { background: var(--toolbar-hover); color: var(--accent); }
1343
1465
  text-overflow: ellipsis;
1344
1466
  max-width: 280px;
1345
1467
  }
1468
+ .sym-row-dates {
1469
+ font-size: 10px;
1470
+ color: var(--text-muted);
1471
+ opacity: 0.7;
1472
+ white-space: nowrap;
1473
+ }
1474
+ .sym-row-expired {
1475
+ opacity: 0.5;
1476
+ }
1477
+ .sym-expired-tag {
1478
+ color: #e57373;
1479
+ font-weight: 600;
1480
+ font-size: 9px;
1481
+ letter-spacing: 0.3px;
1482
+ margin-left: 4px;
1483
+ }
1346
1484
  .sym-row-badge {
1347
1485
  font-size: 10px;
1348
1486
  color: var(--text-muted);
@@ -1406,6 +1544,7 @@ select {
1406
1544
  background: var(--toolbar-bg);
1407
1545
  border-radius: 8px;
1408
1546
  flex-shrink: 0;
1547
+ position: relative;
1409
1548
  }
1410
1549
 
1411
1550
  .bottom-bar-left {
@@ -1609,6 +1748,7 @@ select {
1609
1748
 
1610
1749
  .script-drawer {
1611
1750
  flex-shrink: 0;
1751
+ align-self: stretch;
1612
1752
  position: relative;
1613
1753
  display: flex;
1614
1754
  flex-direction: column;
@@ -1621,10 +1761,10 @@ select {
1621
1761
 
1622
1762
  .script-drawer-resize {
1623
1763
  position: absolute;
1624
- left: 0;
1764
+ left: -3px;
1625
1765
  top: 0;
1626
1766
  bottom: 0;
1627
- width: 5px;
1767
+ width: 8px;
1628
1768
  cursor: col-resize;
1629
1769
  z-index: 10;
1630
1770
  border-radius: 8px 0 0 8px;
@@ -1632,7 +1772,7 @@ select {
1632
1772
  .script-drawer-resize:hover,
1633
1773
  .script-drawer-resize:active {
1634
1774
  background: var(--accent);
1635
- opacity: 0.25;
1775
+ opacity: 0.35;
1636
1776
  }
1637
1777
 
1638
1778
  .script-drawer-header {
@@ -1864,6 +2004,23 @@ select {
1864
2004
  font-weight: 600;
1865
2005
  }
1866
2006
 
2007
+ .script-lang-tab-help {
2008
+ flex: 0 0 auto;
2009
+ display: flex;
2010
+ align-items: center;
2011
+ gap: 4px;
2012
+ padding: 0 10px;
2013
+ background: none;
2014
+ border: none !important;
2015
+ border-bottom: 2px solid transparent !important;
2016
+ color: var(--text-muted);
2017
+ font-size: 11px;
2018
+ cursor: pointer;
2019
+ transition: color 0.12s;
2020
+ margin-left: auto;
2021
+ }
2022
+ .script-lang-tab-help:hover { color: var(--text); }
2023
+
1867
2024
  /* Reference section */
1868
2025
  .script-ref-section {
1869
2026
  border-bottom: 1px solid var(--border);
@@ -2128,6 +2285,30 @@ select {
2128
2285
  flex-shrink: 0;
2129
2286
  }
2130
2287
 
2288
+ /* ── request.security() multi-timeframe warning banner ──────────────── */
2289
+ .script-security-warning {
2290
+ display: flex;
2291
+ align-items: flex-start;
2292
+ gap: 8px;
2293
+ margin: 0 0 8px;
2294
+ padding: 8px 10px;
2295
+ background: rgba(255, 152, 0, 0.12);
2296
+ border: 1px solid rgba(255, 152, 0, 0.4);
2297
+ border-radius: 5px;
2298
+ font-size: 11px;
2299
+ line-height: 1.5;
2300
+ color: var(--text-primary, #e0e0e0);
2301
+ }
2302
+ .script-security-warning svg { color: #ff9800; margin-top: 1px; }
2303
+ .script-security-warning strong { color: #ff9800; }
2304
+ .script-security-warning code {
2305
+ font-family: monospace;
2306
+ font-size: 10px;
2307
+ background: rgba(255,255,255,0.07);
2308
+ padding: 1px 3px;
2309
+ border-radius: 3px;
2310
+ }
2311
+
2131
2312
  .script-conversion-ok {
2132
2313
  display: flex;
2133
2314
  align-items: center;
@@ -2282,102 +2463,317 @@ select {
2282
2463
  }
2283
2464
 
2284
2465
  /* ── AI Chat (multi-turn conversation) ───────────────────────────────── */
2285
- .script-chat-section {
2466
+
2467
+ /* -- Dataset Import Panel -------------------------------------------------- */
2468
+ .dataset-panel {
2286
2469
  border-top: 1px solid var(--border, #333);
2287
- padding: 6px 10px 8px;
2288
- display: flex;
2289
- flex-direction: column;
2290
- gap: 4px;
2291
2470
  flex-shrink: 0;
2292
2471
  }
2293
- .script-chat-label {
2472
+ .dataset-panel-toggle {
2294
2473
  display: flex;
2295
2474
  align-items: center;
2296
- gap: 5px;
2297
- font-size: 11px;
2298
- font-weight: 600;
2475
+ gap: 7px;
2476
+ width: 100%;
2477
+ padding: 8px 14px;
2478
+ background: none;
2479
+ border: none;
2299
2480
  color: var(--text-muted, #888);
2481
+ font-size: 11.5px;
2482
+ font-weight: 600;
2300
2483
  text-transform: uppercase;
2301
- letter-spacing: 0.3px;
2302
- margin-bottom: 2px;
2484
+ letter-spacing: 0.4px;
2485
+ cursor: pointer;
2486
+ text-align: left;
2487
+ transition: color 0.12s, background 0.12s;
2303
2488
  }
2304
- .script-chat-history {
2305
- max-height: 180px;
2306
- overflow-y: auto;
2489
+ .dataset-panel-toggle:hover {
2490
+ color: var(--text, #e0e0e0);
2491
+ background: var(--toolbar-hover, rgba(255,255,255,0.04));
2492
+ }
2493
+ .dataset-panel-body {
2494
+ padding: 0 14px 12px;
2307
2495
  display: flex;
2308
2496
  flex-direction: column;
2309
- gap: 6px;
2310
- padding: 2px 0;
2311
- scrollbar-width: thin;
2497
+ gap: 10px;
2312
2498
  }
2313
- .script-chat-msg {
2314
- font-size: 11.5px;
2315
- line-height: 1.45;
2499
+ .dataset-list {
2500
+ display: flex;
2501
+ flex-direction: column;
2502
+ gap: 4px;
2316
2503
  }
2317
- .script-chat-msg-role {
2318
- font-size: 10px;
2319
- font-weight: 700;
2504
+ .dataset-list-label {
2505
+ font-size: 10.5px;
2506
+ font-weight: 600;
2507
+ color: var(--text-muted, #888);
2320
2508
  text-transform: uppercase;
2321
- letter-spacing: 0.3px;
2322
- margin-bottom: 1px;
2323
- }
2324
- .script-chat-user .script-chat-msg-role { color: var(--accent, #42a5f5); }
2325
- .script-chat-assistant .script-chat-msg-role { color: var(--up, #26a69a); }
2326
- .script-chat-msg-body {
2327
- color: var(--text, #ccc);
2328
- white-space: pre-wrap;
2329
- word-break: break-word;
2330
- }
2331
- .script-chat-code-applied {
2332
- margin-top: 3px;
2333
- font-size: 10px;
2334
- color: var(--up, #26a69a);
2335
- font-style: italic;
2509
+ letter-spacing: 0.4px;
2510
+ margin-bottom: 2px;
2336
2511
  }
2337
- .script-chat-input-row {
2512
+ .dataset-list-item {
2338
2513
  display: flex;
2339
- gap: 4px;
2514
+ align-items: center;
2515
+ gap: 8px;
2516
+ padding: 5px 8px;
2517
+ background: var(--toolbar-hover, rgba(255,255,255,0.04));
2518
+ border-radius: 5px;
2519
+ border: 1px solid var(--border, #333);
2340
2520
  }
2341
- .script-chat-input {
2521
+ .dataset-list-item-info {
2342
2522
  flex: 1;
2343
- background: var(--bg-secondary);
2344
- border: 1px solid var(--border);
2345
- border-radius: 4px;
2346
- color: var(--text);
2347
- padding: 5px 8px;
2348
- font-size: 12px;
2349
- font-family: inherit;
2350
- outline: none;
2523
+ display: flex;
2524
+ flex-direction: column;
2525
+ gap: 1px;
2526
+ min-width: 0;
2351
2527
  }
2352
- .script-chat-input:focus {
2353
- border-color: var(--accent, #42a5f5);
2528
+ .dataset-list-item-name {
2529
+ font-size: 12px;
2530
+ font-weight: 600;
2531
+ color: var(--text, #e0e0e0);
2532
+ white-space: nowrap;
2533
+ overflow: hidden;
2534
+ text-overflow: ellipsis;
2354
2535
  }
2355
- .script-chat-input:disabled {
2356
- opacity: 0.5;
2536
+ .dataset-list-item-meta {
2537
+ font-size: 10.5px;
2538
+ color: var(--text-muted, #888);
2539
+ white-space: nowrap;
2540
+ overflow: hidden;
2541
+ text-overflow: ellipsis;
2357
2542
  }
2358
- .script-chat-send {
2359
- padding: 4px 10px;
2360
- background: var(--primary);
2361
- color: #fff;
2543
+ .dataset-remove-btn {
2544
+ flex-shrink: 0;
2545
+ display: flex;
2546
+ align-items: center;
2547
+ justify-content: center;
2548
+ width: 20px;
2549
+ height: 20px;
2550
+ background: none;
2362
2551
  border: none;
2363
- border-radius: 4px;
2364
- font-size: 14px;
2365
- font-weight: 700;
2552
+ color: var(--text-muted, #888);
2366
2553
  cursor: pointer;
2367
- line-height: 1;
2554
+ border-radius: 3px;
2555
+ transition: color 0.12s, background 0.12s;
2368
2556
  }
2369
- .script-chat-send:hover:not(:disabled) { opacity: 0.85; }
2370
- .script-chat-send:disabled { opacity: 0.4; cursor: default; }
2371
-
2372
- /* ── Screenshot dropdown ─────────────────────────────────────────────────── */
2373
- .ss-dropdown {
2374
- position: absolute;
2375
- top: calc(100% + 6px);
2376
- right: 0;
2377
- min-width: 170px;
2378
- background: var(--toolbar-bg);
2379
- border: 1px solid var(--border);
2380
- border-radius: 8px;
2557
+ .dataset-remove-btn:hover {
2558
+ color: var(--down, #ef5350);
2559
+ background: rgba(239,83,80,0.1);
2560
+ }
2561
+ .dataset-form {
2562
+ display: flex;
2563
+ flex-direction: column;
2564
+ gap: 7px;
2565
+ }
2566
+ .dataset-form-label {
2567
+ font-size: 10.5px;
2568
+ font-weight: 600;
2569
+ color: var(--text-muted, #888);
2570
+ text-transform: uppercase;
2571
+ letter-spacing: 0.4px;
2572
+ }
2573
+ .dataset-name-input {
2574
+ width: 100%;
2575
+ padding: 6px 10px;
2576
+ background: var(--bg, #1a1a1a);
2577
+ color: var(--text, #e0e0e0);
2578
+ border: 1px solid var(--border, #333);
2579
+ border-radius: 5px;
2580
+ font-size: 12px;
2581
+ outline: none;
2582
+ box-sizing: border-box;
2583
+ transition: border-color 0.12s;
2584
+ }
2585
+ .dataset-name-input:focus { border-color: var(--primary, #2196f3); }
2586
+ .dataset-name-input::placeholder { color: var(--text-muted, #888); }
2587
+ .dataset-upload-row {
2588
+ display: flex;
2589
+ align-items: center;
2590
+ gap: 8px;
2591
+ }
2592
+ .dataset-upload-btn {
2593
+ display: inline-flex;
2594
+ align-items: center;
2595
+ gap: 5px;
2596
+ padding: 5px 10px;
2597
+ background: var(--toolbar-hover, rgba(255,255,255,0.06));
2598
+ color: var(--text, #e0e0e0);
2599
+ border: 1px solid var(--border, #333);
2600
+ border-radius: 5px;
2601
+ font-size: 11.5px;
2602
+ font-weight: 500;
2603
+ cursor: pointer;
2604
+ transition: background 0.12s, border-color 0.12s;
2605
+ white-space: nowrap;
2606
+ }
2607
+ .dataset-upload-btn:hover {
2608
+ background: var(--primary, #2196f3);
2609
+ border-color: var(--primary, #2196f3);
2610
+ color: #fff;
2611
+ }
2612
+ .dataset-upload-hint {
2613
+ font-size: 11px;
2614
+ color: var(--text-muted, #888);
2615
+ }
2616
+ .dataset-paste-area {
2617
+ width: 100%;
2618
+ padding: 8px 10px;
2619
+ background: var(--bg, #1a1a1a);
2620
+ color: var(--text, #e0e0e0);
2621
+ border: 1px solid var(--border, #333);
2622
+ border-radius: 5px;
2623
+ font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
2624
+ font-size: 11px;
2625
+ line-height: 1.5;
2626
+ resize: vertical;
2627
+ outline: none;
2628
+ box-sizing: border-box;
2629
+ transition: border-color 0.12s;
2630
+ }
2631
+ .dataset-paste-area:focus { border-color: var(--primary, #2196f3); }
2632
+ .dataset-paste-area::placeholder { color: var(--text-muted, #888); opacity: 0.7; }
2633
+ .dataset-preview {
2634
+ display: flex;
2635
+ align-items: flex-start;
2636
+ gap: 6px;
2637
+ font-size: 11.5px;
2638
+ color: var(--up, #26a69a);
2639
+ line-height: 1.5;
2640
+ }
2641
+ .dataset-error {
2642
+ display: flex;
2643
+ align-items: flex-start;
2644
+ gap: 6px;
2645
+ font-size: 11.5px;
2646
+ color: var(--down, #ef5350);
2647
+ line-height: 1.5;
2648
+ }
2649
+ .dataset-register-btn {
2650
+ display: inline-flex;
2651
+ align-items: center;
2652
+ justify-content: center;
2653
+ padding: 6px 14px;
2654
+ background: var(--primary, #2196f3);
2655
+ color: #fff;
2656
+ border: none;
2657
+ border-radius: 5px;
2658
+ font-size: 12.5px;
2659
+ font-weight: 600;
2660
+ cursor: pointer;
2661
+ transition: opacity 0.12s;
2662
+ align-self: flex-start;
2663
+ }
2664
+ .dataset-register-btn:hover:not(:disabled) { opacity: 0.85; }
2665
+ .dataset-register-btn:disabled { opacity: 0.35; cursor: default; }
2666
+ .dataset-usage-hint {
2667
+ font-size: 11px;
2668
+ color: var(--text-muted, #888);
2669
+ line-height: 1.6;
2670
+ }
2671
+ .dataset-usage-hint code {
2672
+ background: var(--toolbar-hover, rgba(255,255,255,0.06));
2673
+ border: 1px solid var(--border, #333);
2674
+ border-radius: 3px;
2675
+ padding: 1px 5px;
2676
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
2677
+ font-size: 10.5px;
2678
+ color: var(--primary, #2196f3);
2679
+ }
2680
+
2681
+ .script-chat-section {
2682
+ border-top: 1px solid var(--border, #333);
2683
+ padding: 6px 10px 8px;
2684
+ display: flex;
2685
+ flex-direction: column;
2686
+ gap: 4px;
2687
+ flex-shrink: 0;
2688
+ }
2689
+ .script-chat-label {
2690
+ display: flex;
2691
+ align-items: center;
2692
+ gap: 5px;
2693
+ font-size: 11px;
2694
+ font-weight: 600;
2695
+ color: var(--text-muted, #888);
2696
+ text-transform: uppercase;
2697
+ letter-spacing: 0.3px;
2698
+ margin-bottom: 2px;
2699
+ }
2700
+ .script-chat-history {
2701
+ max-height: 180px;
2702
+ overflow-y: auto;
2703
+ display: flex;
2704
+ flex-direction: column;
2705
+ gap: 6px;
2706
+ padding: 2px 0;
2707
+ scrollbar-width: thin;
2708
+ }
2709
+ .script-chat-msg {
2710
+ font-size: 11.5px;
2711
+ line-height: 1.45;
2712
+ }
2713
+ .script-chat-msg-role {
2714
+ font-size: 10px;
2715
+ font-weight: 700;
2716
+ text-transform: uppercase;
2717
+ letter-spacing: 0.3px;
2718
+ margin-bottom: 1px;
2719
+ }
2720
+ .script-chat-user .script-chat-msg-role { color: var(--accent, #42a5f5); }
2721
+ .script-chat-assistant .script-chat-msg-role { color: var(--up, #26a69a); }
2722
+ .script-chat-msg-body {
2723
+ color: var(--text, #ccc);
2724
+ white-space: pre-wrap;
2725
+ word-break: break-word;
2726
+ }
2727
+ .script-chat-code-applied {
2728
+ margin-top: 3px;
2729
+ font-size: 10px;
2730
+ color: var(--up, #26a69a);
2731
+ font-style: italic;
2732
+ }
2733
+ .script-chat-input-row {
2734
+ display: flex;
2735
+ gap: 4px;
2736
+ }
2737
+ .script-chat-input {
2738
+ flex: 1;
2739
+ background: var(--bg-secondary);
2740
+ border: 1px solid var(--border);
2741
+ border-radius: 4px;
2742
+ color: var(--text);
2743
+ padding: 5px 8px;
2744
+ font-size: 12px;
2745
+ font-family: inherit;
2746
+ outline: none;
2747
+ }
2748
+ .script-chat-input:focus {
2749
+ border-color: var(--accent, #42a5f5);
2750
+ }
2751
+ .script-chat-input:disabled {
2752
+ opacity: 0.5;
2753
+ }
2754
+ .script-chat-send {
2755
+ padding: 4px 10px;
2756
+ background: var(--primary);
2757
+ color: #fff;
2758
+ border: none;
2759
+ border-radius: 4px;
2760
+ font-size: 14px;
2761
+ font-weight: 700;
2762
+ cursor: pointer;
2763
+ line-height: 1;
2764
+ }
2765
+ .script-chat-send:hover:not(:disabled) { opacity: 0.85; }
2766
+ .script-chat-send:disabled { opacity: 0.4; cursor: default; }
2767
+
2768
+ /* ── Screenshot dropdown ─────────────────────────────────────────────────── */
2769
+ .ss-dropdown {
2770
+ position: absolute;
2771
+ top: calc(100% + 6px);
2772
+ right: 0;
2773
+ min-width: 170px;
2774
+ background: var(--toolbar-bg);
2775
+ border: 1px solid var(--border);
2776
+ border-radius: 8px;
2381
2777
  padding: 4px 0;
2382
2778
  z-index: 1001;
2383
2779
  box-shadow: 0 8px 24px rgba(0,0,0,0.35);
@@ -2627,6 +3023,46 @@ select {
2627
3023
  font-family: monospace;
2628
3024
  min-width: 56px;
2629
3025
  }
3026
+ .csettings-range-wrap {
3027
+ display: flex;
3028
+ align-items: center;
3029
+ gap: 10px;
3030
+ }
3031
+ .csettings-range-input {
3032
+ -webkit-appearance: none;
3033
+ appearance: none;
3034
+ width: 120px;
3035
+ height: 4px;
3036
+ border-radius: 2px;
3037
+ background: var(--border, #333);
3038
+ outline: none;
3039
+ cursor: pointer;
3040
+ }
3041
+ .csettings-range-input::-webkit-slider-thumb {
3042
+ -webkit-appearance: none;
3043
+ appearance: none;
3044
+ width: 14px;
3045
+ height: 14px;
3046
+ border-radius: 50%;
3047
+ background: var(--primary, #2196f3);
3048
+ border: none;
3049
+ cursor: pointer;
3050
+ }
3051
+ .csettings-range-input::-moz-range-thumb {
3052
+ width: 14px;
3053
+ height: 14px;
3054
+ border-radius: 50%;
3055
+ background: var(--primary, #2196f3);
3056
+ border: none;
3057
+ cursor: pointer;
3058
+ }
3059
+ .csettings-range-value {
3060
+ font-size: 12px;
3061
+ color: var(--text-muted, #888);
3062
+ font-family: monospace;
3063
+ min-width: 36px;
3064
+ text-align: right;
3065
+ }
2630
3066
  .csettings-toggle {
2631
3067
  position: relative;
2632
3068
  display: inline-flex;
@@ -2666,11 +3102,57 @@ select {
2666
3102
  transform: translateX(16px);
2667
3103
  background: #fff;
2668
3104
  }
3105
+
3106
+ /* ── Symbol section additions ─────────────── */
3107
+ .csettings-group-title {
3108
+ font-size: 11px;
3109
+ font-weight: 600;
3110
+ text-transform: uppercase;
3111
+ letter-spacing: 0.5px;
3112
+ color: var(--text-muted, #888);
3113
+ padding-bottom: 4px;
3114
+ margin-bottom: 4px;
3115
+ border-bottom: 1px solid var(--border);
3116
+ }
3117
+ .csettings-color-pair {
3118
+ display: flex;
3119
+ align-items: center;
3120
+ gap: 6px;
3121
+ }
3122
+ .csettings-inline-check {
3123
+ display: inline-flex;
3124
+ align-items: center;
3125
+ gap: 6px;
3126
+ cursor: pointer;
3127
+ font-size: 13px;
3128
+ color: var(--text, #e0e0e0);
3129
+ }
3130
+ .csettings-inline-check input[type="checkbox"] {
3131
+ width: 14px;
3132
+ height: 14px;
3133
+ accent-color: var(--primary, #2196f3);
3134
+ cursor: pointer;
3135
+ }
3136
+ .csettings-select {
3137
+ padding: 4px 8px;
3138
+ font-size: 13px;
3139
+ font-family: inherit;
3140
+ border: 1px solid var(--border);
3141
+ border-radius: 4px;
3142
+ background: var(--bg-surface, #1e1e1e);
3143
+ color: var(--text, #e0e0e0);
3144
+ cursor: pointer;
3145
+ min-width: 120px;
3146
+ }
3147
+ .csettings-select:focus {
3148
+ outline: none;
3149
+ border-color: var(--primary, #2196f3);
3150
+ }
3151
+
2669
3152
  .csettings-footer {
2670
3153
  display: flex;
2671
3154
  align-items: center;
2672
- justify-content: flex-end;
2673
- gap: 8px;
3155
+ justify-content: space-between;
2674
3156
  padding: 12px 18px;
2675
3157
  border-top: 1px solid var(--border);
2676
3158
  flex-shrink: 0;
@@ -2702,7 +3184,148 @@ select {
2702
3184
  background: #1976d2;
2703
3185
  }
2704
3186
 
2705
- [data-theme="light"] .chart-ctx-menu,
3187
+ /* ── Template dropdown ─────────────────────────────────────── */
3188
+ .csettings-template-area {
3189
+ position: relative;
3190
+ }
3191
+ .csettings-template-btn {
3192
+ display: flex;
3193
+ align-items: center;
3194
+ gap: 4px;
3195
+ padding: 5px 10px;
3196
+ background: none;
3197
+ border: 1px solid var(--border);
3198
+ border-radius: 4px;
3199
+ color: var(--text-muted, #888);
3200
+ font-size: 13px;
3201
+ font-family: inherit;
3202
+ cursor: pointer;
3203
+ transition: border-color 0.15s, color 0.15s;
3204
+ }
3205
+ .csettings-template-btn:hover {
3206
+ border-color: var(--text-muted);
3207
+ color: var(--text, #fff);
3208
+ }
3209
+ .csettings-template-caret {
3210
+ font-size: 10px;
3211
+ margin-left: 2px;
3212
+ }
3213
+ .csettings-template-menu {
3214
+ position: absolute;
3215
+ bottom: calc(100% + 6px);
3216
+ left: 0;
3217
+ min-width: 200px;
3218
+ background: var(--bg-elevated, #23262b);
3219
+ border: 1px solid var(--border);
3220
+ border-radius: 6px;
3221
+ box-shadow: 0 4px 16px rgba(0,0,0,0.35);
3222
+ z-index: 100;
3223
+ padding: 4px 0;
3224
+ }
3225
+ .csettings-template-menu-item {
3226
+ display: block;
3227
+ width: 100%;
3228
+ padding: 7px 14px;
3229
+ background: none;
3230
+ border: none;
3231
+ color: var(--text, #fff);
3232
+ font-size: 13px;
3233
+ font-family: inherit;
3234
+ text-align: left;
3235
+ cursor: pointer;
3236
+ }
3237
+ .csettings-template-menu-item:hover {
3238
+ background: var(--hover-bg, rgba(255,255,255,0.06));
3239
+ }
3240
+ .csettings-template-divider {
3241
+ height: 1px;
3242
+ background: var(--border);
3243
+ margin: 4px 0;
3244
+ }
3245
+ .csettings-template-menu-row {
3246
+ display: flex;
3247
+ align-items: center;
3248
+ justify-content: space-between;
3249
+ padding: 0 4px 0 0;
3250
+ }
3251
+ .csettings-template-menu-row .csettings-template-menu-item {
3252
+ flex: 1;
3253
+ min-width: 0;
3254
+ overflow: hidden;
3255
+ text-overflow: ellipsis;
3256
+ white-space: nowrap;
3257
+ }
3258
+ .csettings-template-menu-delete {
3259
+ flex-shrink: 0;
3260
+ display: flex;
3261
+ align-items: center;
3262
+ justify-content: center;
3263
+ width: 24px;
3264
+ height: 24px;
3265
+ background: none;
3266
+ border: none;
3267
+ border-radius: 4px;
3268
+ color: var(--text-muted, #888);
3269
+ font-size: 14px;
3270
+ cursor: pointer;
3271
+ }
3272
+ .csettings-template-menu-delete:hover {
3273
+ background: var(--hover-bg, rgba(255,255,255,0.06));
3274
+ color: #e53935;
3275
+ }
3276
+ .csettings-footer-actions {
3277
+ display: flex;
3278
+ align-items: center;
3279
+ gap: 8px;
3280
+ }
3281
+
3282
+ /* ── Save template dialog ──────────────────────────────────── */
3283
+ .csettings-save-backdrop {
3284
+ position: fixed;
3285
+ inset: 0;
3286
+ background: rgba(0,0,0,0.45);
3287
+ display: flex;
3288
+ align-items: center;
3289
+ justify-content: center;
3290
+ z-index: 10100;
3291
+ }
3292
+ .csettings-save-dialog {
3293
+ background: var(--bg-elevated, #23262b);
3294
+ border: 1px solid var(--border);
3295
+ border-radius: 8px;
3296
+ padding: 20px 24px;
3297
+ min-width: 320px;
3298
+ box-shadow: 0 8px 32px rgba(0,0,0,0.45);
3299
+ }
3300
+ .csettings-save-title {
3301
+ font-size: 15px;
3302
+ font-weight: 600;
3303
+ color: var(--text, #fff);
3304
+ margin-bottom: 14px;
3305
+ }
3306
+ .csettings-save-input {
3307
+ width: 100%;
3308
+ padding: 7px 10px;
3309
+ border: 1px solid var(--border);
3310
+ border-radius: 4px;
3311
+ background: var(--bg, #181a1e);
3312
+ color: var(--text, #fff);
3313
+ font-size: 13px;
3314
+ font-family: inherit;
3315
+ outline: none;
3316
+ margin-bottom: 16px;
3317
+ box-sizing: border-box;
3318
+ }
3319
+ .csettings-save-input:focus {
3320
+ border-color: var(--primary, #2196f3);
3321
+ }
3322
+ .csettings-save-actions {
3323
+ display: flex;
3324
+ justify-content: flex-end;
3325
+ gap: 8px;
3326
+ }
3327
+
3328
+ [data-theme="light"] .chart-ctx-menu,
2706
3329
  [data-theme="light"] .csettings-dialog {
2707
3330
  border-color: var(--border);
2708
3331
  box-shadow: 0 8px 24px rgba(0,0,0,0.12);
@@ -2710,9 +3333,30 @@ select {
2710
3333
  [data-theme="light"] .csettings-nav-item.is-active {
2711
3334
  background: var(--primary-bg);
2712
3335
  }
3336
+ [data-theme="light"] .csettings-select {
3337
+ background: #ffffff;
3338
+ color: #1a1a1a;
3339
+ border-color: #ccc;
3340
+ }
3341
+ [data-theme="light"] .csettings-save-input {
3342
+ background: #ffffff;
3343
+ color: #1a1a1a;
3344
+ border-color: #ccc;
3345
+ }
3346
+ [data-theme="light"] .csettings-save-dialog {
3347
+ background: #ffffff;
3348
+ border-color: #ddd;
3349
+ }
3350
+ [data-theme="light"] .csettings-template-menu {
3351
+ background: #ffffff;
3352
+ border-color: #ddd;
3353
+ }
3354
+ [data-theme="light"] .csettings-range-input {
3355
+ background: #ddd;
3356
+ }
2713
3357
 
2714
3358
 
2715
- /* ── Watchlist Drawer ────────────────────────────────────────────────────────── */
3359
+ /* Watchlist Drawer */
2716
3360
  :root {
2717
3361
  --wl-up: #26a641;
2718
3362
  --wl-down: #f85149;
@@ -2823,7 +3467,7 @@ select {
2823
3467
  /* Column headers */
2824
3468
  .wl-col-headers {
2825
3469
  display: grid;
2826
- grid-template-columns: 16px 1fr var(--wl-last, 70px) var(--wl-chg, 70px) var(--wl-pct, 60px) var(--wl-vol, 52px);
3470
+ grid-template-columns: 16px var(--wl-sym, 120px) var(--wl-last, 70px) var(--wl-chg, 70px) var(--wl-pct, 60px) var(--wl-vol, 52px);
2827
3471
  gap: 0;
2828
3472
  padding: 4px 10px 4px 6px;
2829
3473
  border-bottom: 1px solid var(--border);
@@ -2838,7 +3482,13 @@ select {
2838
3482
  position: relative;
2839
3483
  user-select: none;
2840
3484
  }
2841
- .wl-col-last, .wl-col-chg, .wl-col-pct, .wl-col-vol { text-align: right; }
3485
+ .wl-col-symbol, .wl-col-last, .wl-col-chg, .wl-col-pct, .wl-col-vol {
3486
+ text-align: center;
3487
+ }
3488
+ .wl-col-last, .wl-col-chg, .wl-col-pct, .wl-col-vol {
3489
+ border-left: 1px solid var(--border);
3490
+ padding-left: 4px;
3491
+ }
2842
3492
 
2843
3493
  /* Column resize handle — sits on the right edge of each numeric header cell */
2844
3494
  .wl-col-resize {
@@ -2935,7 +3585,7 @@ select {
2935
3585
  /* Symbol row */
2936
3586
  .wl-row {
2937
3587
  display: grid;
2938
- grid-template-columns: 16px 1fr var(--wl-last, 70px) var(--wl-chg, 70px) var(--wl-pct, 60px) var(--wl-vol, 52px) auto;
3588
+ grid-template-columns: 16px var(--wl-sym, 120px) var(--wl-last, 70px) var(--wl-chg, 70px) var(--wl-pct, 60px) var(--wl-vol, 52px) auto;
2939
3589
  align-items: center;
2940
3590
  gap: 0;
2941
3591
  padding: 5px 10px 5px 6px;
@@ -2980,7 +3630,7 @@ select {
2980
3630
  font-size: 12.5px;
2981
3631
  font-weight: 600;
2982
3632
  color: var(--text);
2983
- padding-left: 18px;
3633
+ text-align: center;
2984
3634
  overflow: hidden;
2985
3635
  text-overflow: ellipsis;
2986
3636
  white-space: nowrap;
@@ -2988,9 +3638,11 @@ select {
2988
3638
 
2989
3639
  .wl-last, .wl-change, .wl-pct, .wl-vol, .wl-no-data {
2990
3640
  font-size: 11.5px;
2991
- text-align: right;
3641
+ text-align: center;
2992
3642
  color: var(--text-muted);
2993
3643
  font-variant-numeric: tabular-nums;
3644
+ border-left: 1px solid var(--border);
3645
+ padding-left: 4px;
2994
3646
  }
2995
3647
 
2996
3648
  .wl-last { color: var(--text); }
@@ -3276,7 +3928,7 @@ select {
3276
3928
  }
3277
3929
 
3278
3930
  .broker-tile-connect {
3279
- margin-top: 2px;
3931
+ margin-top: 0;
3280
3932
  padding: 5px 0;
3281
3933
  font-size: 11px;
3282
3934
  font-weight: 500;
@@ -3306,12 +3958,38 @@ select {
3306
3958
  background: rgba(38, 166, 154, 0.1);
3307
3959
  }
3308
3960
 
3309
- /* Action row — wraps Start Trading + Disconnect when connected */
3961
+ /* Action column outer wrapper for all action buttons on a broker card */
3962
+ .broker-tile-action-col {
3963
+ display: flex;
3964
+ flex-direction: column;
3965
+ gap: 4px;
3966
+ margin-top: 8px;
3967
+ }
3968
+
3969
+ /* Action row — wraps Start Trading + Disconnect when connected */
3310
3970
  .broker-tile-action-row {
3311
3971
  display: flex;
3312
3972
  flex-direction: column;
3313
3973
  gap: 6px;
3314
- margin-top: 8px;
3974
+ }
3975
+
3976
+ /* “Use different credentials” subtle link below the main actions */
3977
+ .broker-tile-new-creds {
3978
+ background: none;
3979
+ border: none;
3980
+ padding: 2px 0;
3981
+ font-size: 10px;
3982
+ color: var(--text-muted);
3983
+ cursor: pointer;
3984
+ text-align: center;
3985
+ text-decoration: underline;
3986
+ text-underline-offset: 2px;
3987
+ opacity: 0.7;
3988
+ transition: opacity 0.15s, color 0.15s;
3989
+ }
3990
+ .broker-tile-new-creds:hover {
3991
+ opacity: 1;
3992
+ color: var(--color-accent, #60a5fa);
3315
3993
  }
3316
3994
  .broker-tile-disconnect {
3317
3995
  display: flex;
@@ -3415,6 +4093,49 @@ select {
3415
4093
  padding: 16px 20px 24px;
3416
4094
  }
3417
4095
 
4096
+ /* Rithmic branding block at top of connect form */
4097
+ .bcf-rithmic-brand {
4098
+ display: flex;
4099
+ flex-direction: column;
4100
+ align-items: center;
4101
+ gap: 8px;
4102
+ padding: 16px 0 20px;
4103
+ border-bottom: 1px solid var(--border);
4104
+ margin-bottom: 20px;
4105
+ text-align: center;
4106
+ }
4107
+ .bcf-rithmic-logo {
4108
+ height: 40px;
4109
+ display: flex;
4110
+ align-items: center;
4111
+ justify-content: center;
4112
+ }
4113
+ .bcf-rithmic-logo img {
4114
+ max-height: 40px;
4115
+ max-width: 160px;
4116
+ object-fit: contain;
4117
+ }
4118
+ .bcf-rithmic-logo-fallback {
4119
+ font-size: 13px;
4120
+ font-weight: 600;
4121
+ color: var(--text-muted);
4122
+ letter-spacing: 0.02em;
4123
+ }
4124
+ /* Hide fallback text when the image loads successfully */
4125
+ .bcf-rithmic-logo img + .bcf-rithmic-logo-fallback {
4126
+ display: none;
4127
+ }
4128
+ .bcf-rithmic-copyright {
4129
+ font-size: 10px;
4130
+ color: var(--text-muted);
4131
+ opacity: 0.7;
4132
+ margin: 0;
4133
+ line-height: 1.4;
4134
+ }
4135
+ .bcf-rithmic-copyright + .bcf-rithmic-copyright {
4136
+ margin-top: 3px;
4137
+ }
4138
+
3418
4139
  .bcf-section-label {
3419
4140
  font-size: 10px;
3420
4141
  font-weight: 700;
@@ -3519,6 +4240,36 @@ select {
3519
4240
  }
3520
4241
  .bcf-btn-back:hover { background: var(--toolbar-hover); }
3521
4242
 
4243
+ /* Saved-credentials notice bar */
4244
+ .bcf-saved-notice {
4245
+ display: flex;
4246
+ align-items: center;
4247
+ gap: 6px;
4248
+ padding: 7px 10px;
4249
+ margin-bottom: 14px;
4250
+ font-size: 11px;
4251
+ color: var(--text-muted);
4252
+ background: rgba(255,255,255,0.04);
4253
+ border: 1px solid var(--border-subtle, rgba(255,255,255,0.08));
4254
+ border-radius: 5px;
4255
+ }
4256
+ .bcf-saved-notice strong { color: var(--text-primary, #e2e8f0); }
4257
+
4258
+ /* Inline link-style button (no background) */
4259
+ .bcf-link-btn {
4260
+ background: none;
4261
+ border: none;
4262
+ padding: 0;
4263
+ margin-left: auto;
4264
+ font-size: 11px;
4265
+ color: var(--color-accent, #60a5fa);
4266
+ cursor: pointer;
4267
+ text-decoration: underline;
4268
+ text-underline-offset: 2px;
4269
+ white-space: nowrap;
4270
+ }
4271
+ .bcf-link-btn:hover { color: var(--color-accent-hover, #93c5fd); }
4272
+
3522
4273
  /* API-level error banner */
3523
4274
  .bcf-api-error {
3524
4275
  margin: 10px 0 4px;
@@ -3622,6 +4373,21 @@ select {
3622
4373
  animation: oep-slide-in 0.2s cubic-bezier(0.4, 0, 0.2, 1);
3623
4374
  }
3624
4375
 
4376
+ .oep-resize-handle {
4377
+ position: absolute;
4378
+ right: 0;
4379
+ top: 0;
4380
+ bottom: 0;
4381
+ width: 5px;
4382
+ cursor: col-resize;
4383
+ z-index: 10;
4384
+ }
4385
+ .oep-resize-handle:hover,
4386
+ .oep-resize-handle:active {
4387
+ background: var(--accent);
4388
+ opacity: 0.25;
4389
+ }
4390
+
3625
4391
  @keyframes oep-slide-in {
3626
4392
  from { opacity: 0; transform: translateX(16px); }
3627
4393
  to { opacity: 1; transform: translateX(0); }
@@ -4061,49 +4827,158 @@ select {
4061
4827
  border-radius: 5px;
4062
4828
  cursor: pointer;
4063
4829
  }
4064
- .oep-preset-cancel-btn:hover {
4065
- color: var(--text);
4066
- border-color: var(--text-muted);
4067
- }
4068
4830
 
4069
- /* ── Position management buttons ── */
4070
- .oep-pos-row {
4071
- display: flex;
4072
- gap: 6px;
4073
- margin-bottom: 6px;
4831
+ /* ─── ContractSwitchDialog ────────────────────────────────────────────────── */
4832
+
4833
+ .cswitch-backdrop {
4834
+ position: fixed;
4835
+ inset: 0;
4836
+ z-index: 10001;
4074
4837
  }
4075
- .oep-pos-btn {
4838
+ .cswitch-popup {
4839
+ position: fixed;
4840
+ background: var(--toolbar-bg, #141414);
4841
+ border: 1px solid var(--border);
4842
+ border-radius: 10px;
4843
+ box-shadow: var(--shadow-dialog);
4844
+ min-width: 320px;
4845
+ max-width: 420px;
4846
+ width: max-content;
4847
+ transform: translate(-50%, -100%) translateY(-12px);
4848
+ overflow: visible;
4849
+ }
4850
+ .cswitch-header {
4076
4851
  display: flex;
4077
4852
  align-items: center;
4078
- justify-content: center;
4079
- gap: 5px;
4080
- padding: 6px 8px;
4853
+ gap: 8px;
4854
+ padding: 10px 14px;
4855
+ border-bottom: 1px solid var(--border);
4856
+ }
4857
+ .cswitch-title {
4858
+ font-size: 13px;
4859
+ font-weight: 600;
4860
+ color: #00BCD4;
4861
+ }
4862
+ .cswitch-date {
4081
4863
  font-size: 11px;
4082
- font-weight: 500;
4083
- border-radius: 6px;
4864
+ color: var(--text-muted, #888);
4865
+ margin-left: auto;
4866
+ }
4867
+ .cswitch-close {
4868
+ background: none;
4869
+ border: none;
4870
+ color: var(--text-muted, #888);
4871
+ font-size: 14px;
4084
4872
  cursor: pointer;
4085
- transition: background 0.12s, border-color 0.12s, color 0.12s;
4086
- white-space: nowrap;
4873
+ padding: 2px 4px;
4874
+ border-radius: 4px;
4875
+ line-height: 1;
4876
+ margin-left: 4px;
4087
4877
  }
4088
- .oep-pos-btn:disabled {
4089
- opacity: 0.38;
4090
- cursor: not-allowed;
4091
- pointer-events: none;
4878
+ .cswitch-close:hover {
4879
+ color: var(--text, #fff);
4880
+ background: var(--toolbar-hover);
4092
4881
  }
4093
- /* Full-width standalone buttons */
4094
- .oep-pos-btn--close,
4095
- .oep-pos-btn--flatten {
4096
- width: 100%;
4097
- margin-bottom: 6px;
4882
+ .cswitch-body {
4883
+ display: flex;
4884
+ align-items: stretch;
4885
+ padding: 10px;
4886
+ gap: 8px;
4098
4887
  }
4099
- /* Half-width pair buttons */
4100
- .oep-pos-row .oep-pos-btn {
4888
+ .cswitch-contract {
4101
4889
  flex: 1;
4102
- margin-bottom: 0;
4103
- }
4104
-
4105
- .oep-pos-btn--close {
4106
- color: #ef5350;
4890
+ display: flex;
4891
+ flex-direction: column;
4892
+ align-items: center;
4893
+ gap: 4px;
4894
+ padding: 10px 8px;
4895
+ background: var(--bg, #0a0a0a);
4896
+ border: 1px solid var(--border);
4897
+ border-radius: 8px;
4898
+ cursor: pointer;
4899
+ transition: border-color 0.15s, background 0.15s;
4900
+ color: inherit;
4901
+ font-family: inherit;
4902
+ }
4903
+ .cswitch-contract:hover {
4904
+ border-color: #00BCD4;
4905
+ background: rgba(0,188,212,0.08);
4906
+ }
4907
+ .cswitch-direction {
4908
+ font-size: 10px;
4909
+ text-transform: uppercase;
4910
+ letter-spacing: 0.05em;
4911
+ color: var(--text-muted, #888);
4912
+ }
4913
+ .cswitch-symbol {
4914
+ font-size: 14px;
4915
+ font-weight: 600;
4916
+ color: var(--text, #fff);
4917
+ white-space: nowrap;
4918
+ }
4919
+ .cswitch-label {
4920
+ font-size: 11px;
4921
+ color: var(--text-muted, #888);
4922
+ }
4923
+ .cswitch-arrow {
4924
+ display: flex;
4925
+ align-items: center;
4926
+ font-size: 16px;
4927
+ color: #00BCD4;
4928
+ flex-shrink: 0;
4929
+ }
4930
+
4931
+ .oep-preset-cancel-btn:hover {
4932
+ color: var(--text);
4933
+ border-color: var(--text-muted);
4934
+ }
4935
+
4936
+ /* ── Position management buttons ── */
4937
+ .oep-pos-row {
4938
+ display: flex;
4939
+ gap: 6px;
4940
+ margin-bottom: 6px;
4941
+ }
4942
+ .oep-pos-btn {
4943
+ display: flex;
4944
+ align-items: center;
4945
+ justify-content: center;
4946
+ gap: 5px;
4947
+ padding: 6px 8px;
4948
+ font-size: 11px;
4949
+ font-weight: 500;
4950
+ border-radius: 6px;
4951
+ cursor: pointer;
4952
+ transition: background 0.12s, border-color 0.12s, color 0.12s, transform 0.08s;
4953
+ white-space: nowrap;
4954
+ user-select: none;
4955
+ }
4956
+ .oep-pos-btn:active:not(:disabled) {
4957
+ transform: scale(0.95);
4958
+ }
4959
+ .oep-pos-btn:focus-visible {
4960
+ outline: 2px solid rgba(100, 149, 237, 0.7);
4961
+ outline-offset: 1px;
4962
+ }
4963
+ .oep-pos-btn:disabled {
4964
+ opacity: 0.38;
4965
+ cursor: not-allowed;
4966
+ pointer-events: none;
4967
+ }
4968
+ /* Full-width standalone buttons */
4969
+ .oep-pos-btn--close,
4970
+ .oep-pos-btn--flatten {
4971
+ width: 100%;
4972
+ margin-bottom: 6px;
4973
+ }
4974
+ /* Half-width pair buttons */
4975
+ .oep-pos-row .oep-pos-btn {
4976
+ flex: 1;
4977
+ margin-bottom: 0;
4978
+ }
4979
+
4980
+ .oep-pos-btn--close {
4981
+ color: #ef5350;
4107
4982
  background: rgba(239, 83, 80, 0.06);
4108
4983
  border: 1px solid rgba(239, 83, 80, 0.3);
4109
4984
  }
@@ -4111,6 +4986,10 @@ select {
4111
4986
  background: rgba(239, 83, 80, 0.14);
4112
4987
  border-color: #ef5350;
4113
4988
  }
4989
+ .oep-pos-btn--close:active:not(:disabled) {
4990
+ background: rgba(239, 83, 80, 0.25);
4991
+ border-color: #e53935;
4992
+ }
4114
4993
  .oep-pos-btn--cancel {
4115
4994
  color: var(--text-muted);
4116
4995
  background: var(--shelf-bg);
@@ -4121,6 +5000,11 @@ select {
4121
5000
  border-color: rgba(239, 83, 80, 0.5);
4122
5001
  background: rgba(239, 83, 80, 0.06);
4123
5002
  }
5003
+ .oep-pos-btn--cancel:active:not(:disabled) {
5004
+ color: #e53935;
5005
+ background: rgba(239, 83, 80, 0.16);
5006
+ border-color: #ef5350;
5007
+ }
4124
5008
  .oep-pos-btn--reverse {
4125
5009
  color: var(--text-muted);
4126
5010
  background: var(--shelf-bg);
@@ -4131,6 +5015,11 @@ select {
4131
5015
  border-color: var(--text-muted);
4132
5016
  background: rgba(128, 128, 128, 0.08);
4133
5017
  }
5018
+ .oep-pos-btn--reverse:active:not(:disabled) {
5019
+ color: var(--text);
5020
+ background: rgba(128, 128, 128, 0.18);
5021
+ border-color: var(--text);
5022
+ }
4134
5023
  .oep-pos-btn--flatten {
4135
5024
  color: var(--text-muted);
4136
5025
  background: var(--shelf-bg);
@@ -4141,3 +5030,1011 @@ select {
4141
5030
  border-color: var(--text-muted);
4142
5031
  background: rgba(128, 128, 128, 0.08);
4143
5032
  }
5033
+ .oep-pos-btn--flatten:active:not(:disabled) {
5034
+ color: var(--text);
5035
+ background: rgba(128, 128, 128, 0.18);
5036
+ border-color: var(--text);
5037
+ }
5038
+
5039
+ /* ─── Position Properties Dialog ────────────────────────────────────────── */
5040
+
5041
+ .pos-dialog-backdrop {
5042
+ position: fixed;
5043
+ inset: 0;
5044
+ z-index: 9999;
5045
+ background: rgba(0, 0, 0, 0.5);
5046
+ display: flex;
5047
+ align-items: center;
5048
+ justify-content: center;
5049
+ }
5050
+ .pos-dialog {
5051
+ background: #1e222d;
5052
+ border: 1px solid #363a45;
5053
+ border-radius: 8px;
5054
+ width: 320px;
5055
+ max-height: 90vh;
5056
+ display: flex;
5057
+ flex-direction: column;
5058
+ color: #d1d4dc;
5059
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
5060
+ font-size: 13px;
5061
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
5062
+ }
5063
+ .pos-dialog-header {
5064
+ display: flex;
5065
+ align-items: center;
5066
+ justify-content: space-between;
5067
+ padding: 12px 16px;
5068
+ border-bottom: 1px solid #363a45;
5069
+ }
5070
+ .pos-dialog-title {
5071
+ font-size: 15px;
5072
+ font-weight: 600;
5073
+ color: #fff;
5074
+ }
5075
+ .pos-dialog-close {
5076
+ background: none;
5077
+ border: none;
5078
+ color: #787b86;
5079
+ font-size: 16px;
5080
+ cursor: pointer;
5081
+ padding: 2px 6px;
5082
+ border-radius: 4px;
5083
+ }
5084
+ .pos-dialog-close:hover {
5085
+ color: #d1d4dc;
5086
+ background: rgba(255, 255, 255, 0.06);
5087
+ }
5088
+ .pos-dialog-tabs {
5089
+ display: flex;
5090
+ gap: 0;
5091
+ border-bottom: 1px solid #363a45;
5092
+ padding: 0 16px;
5093
+ }
5094
+ .pos-dialog-tab {
5095
+ background: none;
5096
+ border: none;
5097
+ color: #787b86;
5098
+ font-size: 13px;
5099
+ padding: 8px 12px;
5100
+ cursor: pointer;
5101
+ border-bottom: 2px solid transparent;
5102
+ margin-bottom: -1px;
5103
+ }
5104
+ .pos-dialog-tab.is-active {
5105
+ color: #2196f3;
5106
+ border-bottom-color: #2196f3;
5107
+ }
5108
+ .pos-dialog-body {
5109
+ padding: 12px 16px;
5110
+ overflow-y: auto;
5111
+ flex: 1;
5112
+ }
5113
+ .pos-dialog-row {
5114
+ display: flex;
5115
+ align-items: center;
5116
+ justify-content: space-between;
5117
+ margin-bottom: 8px;
5118
+ }
5119
+ .pos-dialog-label {
5120
+ flex-shrink: 0;
5121
+ color: #787b86;
5122
+ font-size: 12px;
5123
+ min-width: 90px;
5124
+ }
5125
+ .pos-dialog-inputs {
5126
+ display: flex;
5127
+ align-items: center;
5128
+ gap: 6px;
5129
+ flex: 1;
5130
+ justify-content: flex-end;
5131
+ }
5132
+ .pos-dialog-input {
5133
+ width: 100px;
5134
+ background: #131722;
5135
+ border: 1px solid #363a45;
5136
+ border-radius: 4px;
5137
+ color: #d1d4dc;
5138
+ font-size: 13px;
5139
+ padding: 4px 8px;
5140
+ text-align: right;
5141
+ outline: none;
5142
+ }
5143
+ .pos-dialog-input:focus {
5144
+ border-color: #2196f3;
5145
+ }
5146
+ .pos-dialog-select {
5147
+ background: #131722;
5148
+ border: 1px solid #363a45;
5149
+ border-radius: 4px;
5150
+ color: #d1d4dc;
5151
+ font-size: 12px;
5152
+ padding: 4px 6px;
5153
+ outline: none;
5154
+ cursor: pointer;
5155
+ }
5156
+ .pos-dialog-select:focus {
5157
+ border-color: #2196f3;
5158
+ }
5159
+ .pos-dialog-section-label {
5160
+ color: #787b86;
5161
+ font-size: 11px;
5162
+ font-weight: 600;
5163
+ letter-spacing: 0.5px;
5164
+ text-transform: uppercase;
5165
+ margin: 12px 0 6px;
5166
+ padding-top: 8px;
5167
+ border-top: 1px solid #2a2e39;
5168
+ }
5169
+ .pos-dialog-summary {
5170
+ margin-top: 12px;
5171
+ padding-top: 8px;
5172
+ border-top: 1px solid #2a2e39;
5173
+ }
5174
+ .pos-dialog-summary-row {
5175
+ display: flex;
5176
+ justify-content: space-between;
5177
+ font-size: 12px;
5178
+ color: #787b86;
5179
+ margin-bottom: 4px;
5180
+ }
5181
+ .pos-dialog-summary-val {
5182
+ color: #d1d4dc;
5183
+ }
5184
+ .pos-dialog-profit {
5185
+ color: #26a69a;
5186
+ }
5187
+ .pos-dialog-profit .pos-dialog-summary-val {
5188
+ color: #26a69a;
5189
+ }
5190
+ .pos-dialog-loss {
5191
+ color: #ef5350;
5192
+ }
5193
+ .pos-dialog-loss .pos-dialog-summary-val {
5194
+ color: #ef5350;
5195
+ }
5196
+ .pos-dialog-footer {
5197
+ display: flex;
5198
+ justify-content: flex-end;
5199
+ gap: 8px;
5200
+ padding: 12px 16px;
5201
+ border-top: 1px solid #363a45;
5202
+ }
5203
+ .pos-dialog-btn {
5204
+ border: none;
5205
+ border-radius: 4px;
5206
+ padding: 6px 16px;
5207
+ font-size: 13px;
5208
+ cursor: pointer;
5209
+ }
5210
+ .pos-dialog-btn--ghost {
5211
+ background: transparent;
5212
+ color: #787b86;
5213
+ }
5214
+ .pos-dialog-btn--ghost:hover {
5215
+ color: #d1d4dc;
5216
+ background: rgba(255, 255, 255, 0.06);
5217
+ }
5218
+ .pos-dialog-btn--primary {
5219
+ background: #2196f3;
5220
+ color: #fff;
5221
+ }
5222
+ .pos-dialog-btn--primary:hover {
5223
+ background: #1e88e5;
5224
+ }
5225
+
5226
+ /* -- Drawing Properties Dialog ------------------------------------------------ */
5227
+ .dprop-backdrop {
5228
+ position: fixed;
5229
+ inset: 0;
5230
+ z-index: 9999;
5231
+ background: rgba(0, 0, 0, 0.5);
5232
+ display: flex;
5233
+ align-items: center;
5234
+ justify-content: center;
5235
+ }
5236
+ .dprop-dialog {
5237
+ background: #1e222d;
5238
+ border: 1px solid #363a45;
5239
+ border-radius: 8px;
5240
+ width: 320px;
5241
+ max-height: 90vh;
5242
+ display: flex;
5243
+ flex-direction: column;
5244
+ color: #d1d4dc;
5245
+ font-size: 13px;
5246
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
5247
+ outline: none;
5248
+ }
5249
+ .dprop-header {
5250
+ display: flex;
5251
+ align-items: center;
5252
+ justify-content: space-between;
5253
+ padding: 12px 16px;
5254
+ border-bottom: 1px solid #363a45;
5255
+ }
5256
+ .dprop-title { font-size: 15px; font-weight: 600; color: #fff; }
5257
+ .dprop-close {
5258
+ background: none; border: none; color: #787b86;
5259
+ font-size: 16px; cursor: pointer; padding: 2px 6px; border-radius: 4px;
5260
+ }
5261
+ .dprop-close:hover { color: #d1d4dc; background: rgba(255,255,255,0.06); }
5262
+ .dprop-tabs {
5263
+ display: flex; border-bottom: 1px solid #363a45; padding: 0 16px;
5264
+ }
5265
+ .dprop-tab {
5266
+ background: none; border: none; color: #787b86; font-size: 13px;
5267
+ padding: 8px 12px; cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px;
5268
+ }
5269
+ .dprop-tab.is-active { color: #2196f3; border-bottom-color: #2196f3; }
5270
+ .dprop-body { padding: 12px 16px; overflow-y: auto; flex: 1; }
5271
+ .dprop-section-label {
5272
+ color: #787b86; font-size: 11px; font-weight: 600; letter-spacing: 0.5px;
5273
+ text-transform: uppercase; margin: 12px 0 6px; padding-top: 8px; border-top: 1px solid #2a2e39;
5274
+ }
5275
+ .dprop-section-label:first-child { margin-top: 0; padding-top: 0; border-top: none; }
5276
+ .dprop-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
5277
+ .dprop-label { flex-shrink: 0; color: #787b86; font-size: 12px; min-width: 80px; }
5278
+ .dprop-inputs { display: flex; align-items: center; gap: 8px; flex: 1; justify-content: flex-end; }
5279
+ .dprop-color {
5280
+ width: 28px; height: 24px; border: 1px solid #363a45;
5281
+ border-radius: 4px; padding: 1px; background: #131722; cursor: pointer;
5282
+ }
5283
+ .dprop-color-val { font-size: 11px; color: #787b86; font-family: monospace; min-width: 60px; }
5284
+ .dprop-range { flex: 1; accent-color: #2196f3; cursor: pointer; }
5285
+ .dprop-range-val { font-size: 12px; color: #d1d4dc; min-width: 32px; text-align: right; }
5286
+ .dprop-input {
5287
+ width: 90px; background: #131722; border: 1px solid #363a45;
5288
+ border-radius: 4px; color: #d1d4dc; font-size: 13px; padding: 4px 8px;
5289
+ text-align: right; outline: none;
5290
+ }
5291
+ .dprop-input--wide { width: 140px; }
5292
+ .dprop-input:focus { border-color: #2196f3; }
5293
+ .dprop-unit { font-size: 12px; color: #787b86; min-width: 16px; }
5294
+ .dprop-time-label { font-size: 11px; color: #787b86; text-align: right; }
5295
+ .dprop-text-area-wrap { margin-bottom: 8px; }
5296
+ .dprop-textarea {
5297
+ width: 100%; background: #131722; border: 1px solid #363a45;
5298
+ border-radius: 4px; color: #d1d4dc; font-size: 13px; font-family: inherit;
5299
+ padding: 8px; resize: vertical; outline: none; box-sizing: border-box;
5300
+ }
5301
+ .dprop-textarea:focus { border-color: #2196f3; }
5302
+ .dprop-footer {
5303
+ display: flex; justify-content: flex-end; gap: 8px;
5304
+ padding: 12px 16px; border-top: 1px solid #363a45;
5305
+ }
5306
+ .dprop-btn { border: none; border-radius: 4px; padding: 6px 16px; font-size: 13px; cursor: pointer; }
5307
+ .dprop-btn--ghost { background: transparent; color: #787b86; }
5308
+ .dprop-btn--ghost:hover { color: #d1d4dc; background: rgba(255,255,255,0.06); }
5309
+ .dprop-btn--primary { background: #2196f3; color: #fff; }
5310
+ .dprop-btn--primary:hover { background: #1e88e5; }
5311
+ [data-theme="light"] .dprop-dialog { background: #fff; border-color: #e0e3eb; color: #131722; }
5312
+ [data-theme="light"] .dprop-header { border-bottom-color: #e0e3eb; }
5313
+ [data-theme="light"] .dprop-title { color: #131722; }
5314
+ [data-theme="light"] .dprop-close:hover { background: rgba(0,0,0,0.06); }
5315
+ [data-theme="light"] .dprop-tabs { border-bottom-color: #e0e3eb; }
5316
+ [data-theme="light"] .dprop-section-label { border-top-color: #e0e3eb; }
5317
+ [data-theme="light"] .dprop-color { background: #f0f3fa; border-color: #e0e3eb; }
5318
+ [data-theme="light"] .dprop-input { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5319
+ [data-theme="light"] .dprop-textarea { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5320
+ [data-theme="light"] .dprop-footer { border-top-color: #e0e3eb; }
5321
+ [data-theme="light"] .dprop-btn--ghost:hover { background: rgba(0,0,0,0.06); color: #131722; }
5322
+
5323
+
5324
+ /* Script Manager — Main Tabs */
5325
+ .script-main-tabs { display: flex; flex-shrink: 0; border-bottom: 1px solid #363a45; background: #1a1d29; }
5326
+ .script-main-tab { flex: 1; padding: 8px 4px; font-size: 12px; font-weight: 500; background: transparent; border: none; color: #787b86; cursor: pointer; transition: color 0.15s, border-bottom 0.15s; border-bottom: 2px solid transparent; }
5327
+ .script-main-tab:hover { color: #d1d4dc; }
5328
+ .script-main-tab.active { color: #2196f3; border-bottom-color: #2196f3; }
5329
+ [data-theme="light"] .script-main-tabs { background: #f8f9fd; border-bottom-color: #e0e3eb; }
5330
+ [data-theme="light"] .script-main-tab { color: #787b86; }
5331
+ [data-theme="light"] .script-main-tab:hover { color: #131722; }
5332
+ [data-theme="light"] .script-main-tab.active { color: #2196f3; }
5333
+
5334
+ /* Dataset Manager Drawer */
5335
+ .dsm-root { display: flex; flex-direction: column; flex: 1; overflow: hidden; }
5336
+ .dsm-header { display: flex; align-items: center; gap: 8px; padding: 10px 14px; border-bottom: 1px solid #363a45; flex-shrink: 0; }
5337
+ .dsm-title { font-size: 13px; font-weight: 600; color: #d1d4dc; flex: 1; }
5338
+ .dsm-back-btn { background: transparent; border: none; color: #787b86; font-size: 12px; cursor: pointer; padding: 2px 6px; border-radius: 4px; }
5339
+ .dsm-back-btn:hover { color: #d1d4dc; background: rgba(255,255,255,0.06); }
5340
+ .dsm-new-btn { background: #2196f3; border: none; color: #fff; font-size: 12px; cursor: pointer; padding: 4px 10px; border-radius: 4px; }
5341
+ .dsm-new-btn:hover { background: #1e88e5; }
5342
+ .dsm-error { padding: 8px 14px; background: rgba(239,83,80,0.12); color: #ef5350; font-size: 12px; }
5343
+ .dsm-empty { padding: 24px 14px; text-align: center; color: #787b86; font-size: 13px; }
5344
+ .dsm-loading { padding: 24px 14px; text-align: center; color: #787b86; font-size: 13px; }
5345
+ .dsm-list { overflow-y: auto; flex: 1; padding: 8px 0; }
5346
+ .dsm-list-item { padding: 10px 14px; border-bottom: 1px solid #2a2d3a; transition: background 0.1s; }
5347
+ .dsm-list-item:hover { background: rgba(255,255,255,0.03); }
5348
+ .dsm-list-item-header { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
5349
+ .dsm-list-item-name { font-size: 13px; font-weight: 600; color: #d1d4dc; flex: 1; }
5350
+ .dsm-status { font-size: 10px; padding: 2px 6px; border-radius: 10px; font-weight: 500; }
5351
+ .dsm-status--ready { background: rgba(38,166,154,0.18); color: #26a69a; }
5352
+ .dsm-status--pending { background: rgba(255,152,0,0.18); color: #ff9800; }
5353
+ .dsm-status--processing { background: rgba(33,150,243,0.18); color: #2196f3; }
5354
+ .dsm-status--failed { background: rgba(239,83,80,0.18); color: #ef5350; }
5355
+ .dsm-list-item-cols { display: flex; flex-wrap: wrap; gap: 4px; margin-bottom: 6px; }
5356
+ .dsm-col-tag { font-size: 10px; padding: 2px 6px; border-radius: 4px; font-family: monospace; }
5357
+ .dsm-col-tag--time { background: rgba(33,150,243,0.18); color: #2196f3; }
5358
+ .dsm-col-tag--number, .dsm-col-tag--percentage, .dsm-col-tag--price { background: rgba(38,166,154,0.18); color: #26a69a; }
5359
+ .dsm-col-tag--integer { background: rgba(102,187,106,0.18); color: #66bb6a; }
5360
+ .dsm-col-tag--text { background: rgba(171,71,188,0.18); color: #ab47bc; }
5361
+ .dsm-col-tag--boolean { background: rgba(255,152,0,0.18); color: #ff9800; }
5362
+ .dsm-col-tag--date, .dsm-col-tag--timestamp { background: rgba(239,83,80,0.18); color: #ef5350; }
5363
+ .dsm-ingest-error { font-size: 11px; color: #ef5350; margin-bottom: 4px; }
5364
+ .dsm-list-item-actions { display: flex; gap: 6px; }
5365
+ .dsm-action-btn { font-size: 11px; padding: 3px 8px; border-radius: 4px; cursor: pointer; background: rgba(255,255,255,0.06); border: 1px solid #363a45; color: #d1d4dc; }
5366
+ .dsm-action-btn:hover { background: rgba(255,255,255,0.1); }
5367
+ .dsm-action-btn--primary { color: #2196f3; border-color: rgba(33,150,243,0.4); font-weight: 600; }
5368
+ .dsm-action-btn--primary:hover { background: rgba(33,150,243,0.12); border-color: #2196f3; }
5369
+ .dsm-action-btn--danger { color: #ef5350; border-color: rgba(239,83,80,0.3); }
5370
+ .dsm-action-btn--danger:hover { background: rgba(239,83,80,0.12); }
5371
+ .dsm-designer { overflow-y: auto; flex: 1; padding: 14px; display: flex; flex-direction: column; gap: 6px; }
5372
+ .dsm-label { font-size: 11px; font-weight: 600; color: #787b86; text-transform: uppercase; letter-spacing: 0.5px; margin-top: 8px; }
5373
+ .dsm-input { width: 100%; background: #131722; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 13px; padding: 6px 8px; outline: none; box-sizing: border-box; }
5374
+ .dsm-input:focus { border-color: #2196f3; }
5375
+ .dsm-hint { font-size: 11px; color: #787b86; margin: 0; }
5376
+ .dsm-col-locked { display: flex; align-items: center; gap: 8px; padding: 4px 0; }
5377
+ .dsm-col-row { display: flex; align-items: center; gap: 6px; margin-bottom: 4px; }
5378
+ .dsm-col-name { flex: 1; }
5379
+ .dsm-select { background: #131722; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 12px; padding: 6px 4px; outline: none; }
5380
+ .dsm-select:focus { border-color: #2196f3; }
5381
+ .dsm-nullable-label { font-size: 11px; color: #787b86; display: flex; align-items: center; gap: 4px; white-space: nowrap; }
5382
+ .dsm-remove-col-btn { background: transparent; border: none; color: #787b86; cursor: pointer; font-size: 12px; padding: 4px; border-radius: 4px; }
5383
+ .dsm-remove-col-btn:hover { color: #ef5350; background: rgba(239,83,80,0.1); }
5384
+ .dsm-add-col-btn { background: transparent; border: 1px dashed #363a45; color: #787b86; border-radius: 4px; padding: 5px 10px; font-size: 12px; cursor: pointer; align-self: flex-start; }
5385
+ .dsm-add-col-btn:hover { border-color: #2196f3; color: #2196f3; }
5386
+ .dsm-file-input { display: none; }
5387
+ .dsm-upload-btn { background: rgba(255,255,255,0.06); border: 1px solid #363a45; color: #d1d4dc; border-radius: 4px; padding: 6px 12px; font-size: 12px; cursor: pointer; align-self: flex-start; }
5388
+ .dsm-upload-btn:hover { background: rgba(255,255,255,0.1); }
5389
+ .dsm-preview { margin-top: 8px; }
5390
+ .dsm-preview-label { font-size: 11px; color: #787b86; margin-bottom: 4px; }
5391
+ .dsm-preview-table-wrap { overflow-x: auto; border-radius: 4px; border: 1px solid #363a45; }
5392
+ .dsm-preview-table { width: 100%; border-collapse: collapse; font-size: 11px; font-family: monospace; }
5393
+ .dsm-preview-table th { background: #1a1d29; color: #787b86; padding: 4px 8px; text-align: left; border-bottom: 1px solid #363a45; }
5394
+ .dsm-preview-table td { color: #d1d4dc; padding: 3px 8px; border-bottom: 1px solid #2a2d3a; }
5395
+ .dsm-save-btn { margin-top: 12px; background: #2196f3; border: none; color: #fff !important; border-radius: 4px; padding: 8px 16px; font-size: 13px; font-weight: 600; cursor: pointer; align-self: flex-start; opacity: 1; }
5396
+ .dsm-save-btn:hover { background: #1976d2; }
5397
+ .dsm-save-btn:disabled { opacity: 0.5; cursor: not-allowed; }
5398
+ .dsm-usage { overflow-y: auto; flex: 1; padding: 14px; display: flex; flex-direction: column; gap: 12px; }
5399
+ .dsm-usage-intro { font-size: 13px; color: #d1d4dc; margin: 0; }
5400
+ .dsm-usage-code-wrap { position: relative; }
5401
+ .dsm-usage-code { background: #131722; border: 1px solid #363a45; border-radius: 4px; padding: 12px; font-size: 12px; font-family: monospace; color: #d1d4dc; white-space: pre-wrap; margin: 0; }
5402
+ .dsm-copy-btn { position: absolute; top: 6px; right: 6px; background: rgba(255,255,255,0.08); border: 1px solid #363a45; color: #d1d4dc; border-radius: 4px; padding: 3px 8px; font-size: 11px; cursor: pointer; }
5403
+ .dsm-copy-btn:hover { background: rgba(255,255,255,0.14); }
5404
+ .dsm-usage-cols { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
5405
+ .dsm-usage-col-label { font-size: 11px; color: #787b86; }
5406
+ .dsm-col-type { opacity: 0.6; font-size: 9px; }
5407
+ [data-theme="light"] .dsm-header { border-bottom-color: #e0e3eb; }
5408
+ [data-theme="light"] .dsm-title { color: #131722; }
5409
+ [data-theme="light"] .dsm-list-item { border-bottom-color: #e0e3eb; }
5410
+ [data-theme="light"] .dsm-list-item:hover { background: rgba(0,0,0,0.02); }
5411
+ [data-theme="light"] .dsm-list-item-name { color: #131722; }
5412
+ [data-theme="light"] .dsm-input { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5413
+ [data-theme="light"] .dsm-select { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5414
+ [data-theme="light"] .dsm-usage-code { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5415
+ [data-theme="light"] .dsm-preview-table th { background: #f0f3fa; color: #787b86; border-bottom-color: #e0e3eb; }
5416
+ [data-theme="light"] .dsm-preview-table td { color: #131722; border-bottom-color: #e0e3eb; }
5417
+ [data-theme="light"] .dsm-preview-table-wrap { border-color: #e0e3eb; }
5418
+ [data-theme="light"] .dsm-action-btn { background: rgba(0,0,0,0.04); border-color: #e0e3eb; color: #131722; }
5419
+ [data-theme="light"] .dsm-action-btn--primary { color: #2196f3; border-color: rgba(33,150,243,0.4); }
5420
+ [data-theme="light"] .dsm-action-btn--primary:hover { background: rgba(33,150,243,0.08); }
5421
+ [data-theme="light"] .dsm-save-btn { background: #2196f3; color: #fff !important; border: none; }
5422
+ [data-theme="light"] .dsm-save-btn:hover { background: #1976d2; }
5423
+ [data-theme="light"] .dsm-add-col-btn { color: #2196f3; border-color: #c8d6e5; }
5424
+ [data-theme="light"] .dsm-add-col-btn:hover { border-color: #2196f3; }
5425
+ [data-theme="light"] .dsm-back-btn { color: #2196f3; }
5426
+ [data-theme="light"] .dsm-new-btn { background: #2196f3; color: #fff; }
5427
+ [data-theme="light"] .dsm-hint { color: #787b86; }
5428
+ [data-theme="light"] .dsm-col-row { border-color: #e0e3eb; }
5429
+ [data-theme="light"] .dsm-nullable-label { color: #434651; }
5430
+ [data-theme="light"] .dsm-remove-col-btn { color: #787b86; }
5431
+ [data-theme="light"] .dsm-remove-col-btn:hover { color: #ef5350; }
5432
+
5433
+ /* Docs Editor */
5434
+ .docs-editor-root { display: flex; flex-direction: column; flex: 1; overflow: hidden; }
5435
+ .docs-toolbar { display: flex; align-items: center; gap: 6px; flex-shrink: 0; padding: 8px 12px; border-bottom: 1px solid #363a45; background: #1a1d29; }
5436
+ .docs-tab-btn { background: transparent; border: none; color: #787b86; font-size: 12px; cursor: pointer; padding: 4px 10px; border-radius: 4px; }
5437
+ .docs-tab-btn:hover { color: #d1d4dc; background: rgba(255,255,255,0.06); }
5438
+ .docs-tab-btn.active { color: #2196f3; background: rgba(33,150,243,0.12); }
5439
+ .docs-template-btn { background: transparent; border: 1px dashed #363a45; color: #787b86; font-size: 11px; cursor: pointer; padding: 3px 8px; border-radius: 4px; }
5440
+ .docs-template-btn:hover { border-color: #2196f3; color: #2196f3; }
5441
+ .docs-error { font-size: 11px; color: #ef5350; }
5442
+ .docs-saved { font-size: 11px; color: #26a69a; }
5443
+ .docs-save-btn { background: #2196f3; border: none; color: #fff; border-radius: 4px; padding: 5px 12px; font-size: 12px; cursor: pointer; }
5444
+ .docs-save-btn:hover { background: #1e88e5; }
5445
+ .docs-save-btn:disabled { opacity: 0.5; cursor: not-allowed; }
5446
+ .docs-panes { flex: 1; overflow: hidden; display: flex; }
5447
+ .docs-textarea { flex: 1; background: #131722; border: none; color: #d1d4dc; font-size: 13px; font-family: monospace; padding: 14px; resize: none; outline: none; line-height: 1.6; }
5448
+ .docs-rendered { flex: 1; overflow-y: auto; padding: 14px 18px; color: #d1d4dc; font-size: 13px; line-height: 1.7; }
5449
+ .docs-rendered h1 { font-size: 18px; color: #d1d4dc; margin: 0 0 12px; border-bottom: 1px solid #363a45; padding-bottom: 6px; }
5450
+ .docs-rendered h2 { font-size: 15px; color: #d1d4dc; margin: 18px 0 8px; }
5451
+ .docs-rendered h3 { font-size: 13px; color: #d1d4dc; margin: 14px 0 6px; }
5452
+ .docs-rendered p { margin: 0 0 10px; }
5453
+ .docs-rendered ul { margin: 0 0 10px; padding-left: 20px; }
5454
+ .docs-rendered li { margin-bottom: 4px; }
5455
+ .docs-rendered hr { border: none; border-top: 1px solid #363a45; margin: 14px 0; }
5456
+ .docs-rendered strong { color: #d1d4dc; }
5457
+ .docs-rendered em { color: #b0b3c1; }
5458
+ .docs-code-block { background: #131722; border: 1px solid #363a45; border-radius: 4px; padding: 10px 12px; font-size: 12px; font-family: monospace; overflow-x: auto; margin: 8px 0; }
5459
+ .docs-inline-code { background: rgba(255,255,255,0.08); border-radius: 3px; padding: 1px 5px; font-size: 12px; font-family: monospace; color: #ab47bc; }
5460
+ .docs-empty { padding: 24px 14px; text-align: center; color: #787b86; font-size: 13px; }
5461
+ .docs-loading { padding: 24px 14px; text-align: center; color: #787b86; font-size: 13px; }
5462
+ .docs-viewer { overflow-y: auto; flex: 1; padding: 14px 18px; }
5463
+ [data-theme="light"] .docs-toolbar { background: #f8f9fd; border-bottom-color: #e0e3eb; }
5464
+ [data-theme="light"] .docs-save-btn { background: #2196f3; color: #fff !important; border: none; }
5465
+ [data-theme="light"] .docs-save-btn:hover { background: #1976d2; }
5466
+ [data-theme="light"] .docs-tab-btn { color: #787b86; }
5467
+ [data-theme="light"] .docs-tab-btn:hover { color: #131722; background: rgba(0,0,0,0.04); }
5468
+ [data-theme="light"] .docs-textarea { background: #fff; color: #131722; }
5469
+ [data-theme="light"] .docs-rendered { color: #131722; }
5470
+ [data-theme="light"] .docs-rendered h1, [data-theme="light"] .docs-rendered h2, [data-theme="light"] .docs-rendered h3 { color: #131722; border-bottom-color: #e0e3eb; }
5471
+ [data-theme="light"] .docs-rendered hr { border-top-color: #e0e3eb; }
5472
+ [data-theme="light"] .docs-code-block { background: #f0f3fa; border-color: #e0e3eb; }
5473
+ [data-theme="light"] .docs-inline-code { background: rgba(0,0,0,0.06); }
5474
+
5475
+ /* Script Settings Panel */
5476
+ .ss-root { overflow-y: auto; flex: 1; padding: 14px; display: flex; flex-direction: column; gap: 0; }
5477
+ .ss-section { margin-bottom: 18px; }
5478
+ .ss-section-label { font-size: 11px; font-weight: 600; color: #787b86; text-transform: uppercase; letter-spacing: 0.5px; display: block; margin-bottom: 6px; }
5479
+ .ss-input { width: 100%; background: #131722; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 13px; padding: 7px 10px; outline: none; box-sizing: border-box; }
5480
+ .ss-input:focus { border-color: #2196f3; }
5481
+ .ss-vis-group { display: flex; gap: 0; border-radius: 4px; overflow: hidden; border: 1px solid #363a45; }
5482
+ .ss-vis-btn { flex: 1; background: transparent; border: none; color: #787b86; font-size: 12px; padding: 7px 4px; cursor: pointer; transition: background 0.15s, color 0.15s; border-right: 1px solid #363a45; }
5483
+ .ss-vis-btn:last-child { border-right: none; }
5484
+ .ss-vis-btn:hover { background: rgba(255,255,255,0.06); color: #d1d4dc; }
5485
+ .ss-vis-btn.active { background: rgba(33,150,243,0.18); color: #2196f3; font-weight: 600; }
5486
+ .ss-vis-desc { font-size: 11px; color: #787b86; margin: 6px 0 0; }
5487
+ .ss-price-row { display: flex; gap: 6px; }
5488
+ .ss-currency-select { background: #131722; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 13px; padding: 7px 6px; outline: none; }
5489
+ .ss-price-input { flex: 1; background: #131722; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 13px; padding: 7px 10px; outline: none; }
5490
+ .ss-price-input:focus { border-color: #2196f3; }
5491
+ .ss-hint { font-size: 11px; color: #787b86; margin: 4px 0 0; }
5492
+ .ss-slider { width: 100%; accent-color: #2196f3; margin-top: 4px; }
5493
+ .ss-footer { display: flex; align-items: center; gap: 10px; padding-top: 8px; border-top: 1px solid #363a45; margin-top: auto; }
5494
+ .ss-error { font-size: 11px; color: #ef5350; flex: 1; }
5495
+ .ss-saved { font-size: 11px; color: #26a69a; flex: 1; }
5496
+ .ss-save-btn { background: #2196f3; border: none; color: #fff; border-radius: 4px; padding: 7px 16px; font-size: 13px; cursor: pointer; margin-left: auto; }
5497
+ .ss-save-btn:hover { background: #1e88e5; }
5498
+ .ss-save-btn:disabled { opacity: 0.5; cursor: not-allowed; }
5499
+ .ss-empty, .ss-loading { padding: 24px 14px; text-align: center; color: #787b86; font-size: 13px; }
5500
+ .ss-viewer { padding: 14px; display: flex; flex-direction: column; gap: 10px; }
5501
+ .ss-row { display: flex; align-items: center; gap: 10px; }
5502
+ .ss-label { font-size: 12px; color: #787b86; min-width: 80px; }
5503
+ .ss-value { font-size: 13px; color: #d1d4dc; }
5504
+ .ss-badge { font-size: 11px; padding: 2px 8px; border-radius: 10px; font-weight: 500; }
5505
+ .ss-badge--private { background: rgba(120,123,134,0.18); color: #787b86; }
5506
+ .ss-badge--public { background: rgba(38,166,154,0.18); color: #26a69a; }
5507
+ .ss-badge--for-sale { background: rgba(255,152,0,0.18); color: #ff9800; }
5508
+ [data-theme="light"] .ss-input { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5509
+ [data-theme="light"] .ss-currency-select { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5510
+ [data-theme="light"] .ss-price-input { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5511
+ [data-theme="light"] .ss-vis-group { border-color: #e0e3eb; }
5512
+ [data-theme="light"] .ss-vis-btn { color: #787b86; border-right-color: #e0e3eb; }
5513
+ [data-theme="light"] .ss-vis-btn:hover { background: rgba(0,0,0,0.04); color: #131722; }
5514
+ [data-theme="light"] .ss-footer { border-top-color: #e0e3eb; }
5515
+ [data-theme="light"] .ss-save-btn { background: #2196f3; color: #fff !important; border: none; }
5516
+ [data-theme="light"] .ss-save-btn:hover { background: #1976d2; }
5517
+ [data-theme="light"] .ss-value { color: #131722; }
5518
+
5519
+
5520
+ /* ═══════════════════════════════════════════════════════════════════════════
5521
+ Script Manager — Main Tabs (Code / Datasets / Docs / Settings)
5522
+ ═══════════════════════════════════════════════════════════════════════════ */
5523
+
5524
+ .script-main-tabs { display: flex; border-bottom: 1px solid #363a45; background: #1e222d; flex-shrink: 0; }
5525
+ .script-main-tab { flex: 1; padding: 8px 4px; font-size: 12px; font-weight: 500; color: #787b86; background: transparent; border: none; border-bottom: 2px solid transparent; cursor: pointer; transition: color 0.15s, border-color 0.15s; white-space: nowrap; }
5526
+ .script-main-tab:hover { color: #d1d4dc; }
5527
+ .script-main-tab.active { color: #2196f3; border-bottom-color: #2196f3; }
5528
+ [data-theme="light"] .script-main-tabs { background: #f0f3fa; border-bottom-color: #e0e3eb; }
5529
+ [data-theme="light"] .script-main-tab { color: #787b86; }
5530
+ [data-theme="light"] .script-main-tab:hover { color: #131722; }
5531
+ [data-theme="light"] .script-main-tab.active { color: #2196f3; }
5532
+
5533
+ /* ═══════════════════════════════════════════════════════════════════════════
5534
+ Dataset Manager Drawer
5535
+ ═══════════════════════════════════════════════════════════════════════════ */
5536
+
5537
+ .dsm-root { display: flex; flex-direction: column; flex: 1; overflow: hidden; background: #131722; }
5538
+ .dsm-header { display: flex; align-items: center; gap: 8px; padding: 10px 14px; border-bottom: 1px solid #363a45; flex-shrink: 0; }
5539
+ .dsm-title { font-size: 13px; font-weight: 600; color: #d1d4dc; flex: 1; }
5540
+ .dsm-back-btn { font-size: 12px; color: #787b86; background: none; border: none; cursor: pointer; padding: 0; }
5541
+ .dsm-back-btn:hover { color: #d1d4dc; }
5542
+ .dsm-new-btn { font-size: 12px; color: #2196f3; background: none; border: 1px solid #2196f3; border-radius: 4px; padding: 4px 10px; cursor: pointer; }
5543
+ .dsm-new-btn:hover { background: rgba(33,150,243,0.12); }
5544
+ .dsm-error { background: rgba(239,83,80,0.15); color: #ef5350; font-size: 12px; padding: 8px 14px; border-bottom: 1px solid rgba(239,83,80,0.3); }
5545
+ .dsm-loading, .dsm-empty { padding: 24px 16px; color: #787b86; font-size: 13px; text-align: center; }
5546
+ .dsm-empty strong { color: #d1d4dc; }
5547
+ .dsm-list { flex: 1; overflow-y: auto; padding: 8px 0; }
5548
+ .dsm-list-item { padding: 10px 14px; border-bottom: 1px solid #2a2e39; }
5549
+ .dsm-list-item:last-child { border-bottom: none; }
5550
+ .dsm-list-item-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 6px; }
5551
+ .dsm-list-item-name { font-size: 13px; font-weight: 600; color: #d1d4dc; font-family: monospace; }
5552
+ .dsm-status { font-size: 11px; padding: 2px 7px; border-radius: 10px; font-weight: 500; }
5553
+ .dsm-status--ready { background: rgba(38,166,154,0.15); color: #26a69a; }
5554
+ .dsm-status--pending, .dsm-status--processing { background: rgba(255,167,38,0.15); color: #ffa726; }
5555
+ .dsm-status--failed { background: rgba(239,83,80,0.15); color: #ef5350; }
5556
+ .dsm-list-item-cols { display: flex; flex-wrap: wrap; gap: 4px; margin-bottom: 6px; }
5557
+ .dsm-col-tag { font-size: 10px; padding: 2px 6px; border-radius: 3px; font-family: monospace; background: #2a2e39; color: #787b86; }
5558
+ .dsm-col-tag--time { background: rgba(33,150,243,0.15); color: #2196f3; }
5559
+ .dsm-col-tag--number, .dsm-col-tag--percentage, .dsm-col-tag--price { background: rgba(38,166,154,0.12); color: #26a69a; }
5560
+ .dsm-col-tag--integer { background: rgba(102,187,106,0.12); color: #66bb6a; }
5561
+ .dsm-col-tag--text { background: rgba(171,71,188,0.12); color: #ab47bc; }
5562
+ .dsm-col-tag--boolean { background: rgba(255,167,38,0.12); color: #ffa726; }
5563
+ .dsm-col-tag--date, .dsm-col-tag--timestamp { background: rgba(239,83,80,0.12); color: #ef5350; }
5564
+ .dsm-ingest-error { font-size: 11px; color: #ef5350; margin-bottom: 4px; }
5565
+ .dsm-list-item-actions { display: flex; gap: 6px; }
5566
+ .dsm-action-btn { font-size: 11px; padding: 3px 10px; border-radius: 4px; cursor: pointer; background: transparent; border: 1px solid #363a45; color: #787b86; }
5567
+ .dsm-action-btn:hover { color: #d1d4dc; border-color: #787b86; }
5568
+ .dsm-action-btn--primary { color: #2196f3; border-color: rgba(33,150,243,0.4); font-weight: 600; }
5569
+ .dsm-action-btn--primary:hover { background: rgba(33,150,243,0.12); border-color: #2196f3; }
5570
+ .dsm-action-btn--danger { border-color: rgba(239,83,80,0.4); color: #ef5350; }
5571
+ .dsm-action-btn--danger:hover { background: rgba(239,83,80,0.1); border-color: #ef5350; }
5572
+ .dsm-designer { flex: 1; overflow-y: auto; padding: 14px; display: flex; flex-direction: column; gap: 6px; }
5573
+ .dsm-label { font-size: 11px; font-weight: 600; color: #787b86; text-transform: uppercase; letter-spacing: 0.04em; }
5574
+ .dsm-input { width: 100%; background: #1e222d; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 13px; padding: 6px 10px; outline: none; box-sizing: border-box; }
5575
+ .dsm-input:focus { border-color: #2196f3; }
5576
+ .dsm-hint { font-size: 11px; color: #787b86; margin: 0; }
5577
+ .dsm-col-locked { display: flex; align-items: center; gap: 8px; padding: 4px 0; }
5578
+ .dsm-col-row { display: flex; align-items: center; gap: 6px; margin-bottom: 4px; }
5579
+ .dsm-col-name { flex: 1; }
5580
+ .dsm-select { background: #1e222d; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 12px; padding: 5px 6px; outline: none; }
5581
+ .dsm-select:focus { border-color: #2196f3; }
5582
+ .dsm-nullable-label { font-size: 11px; color: #787b86; display: flex; align-items: center; gap: 4px; white-space: nowrap; }
5583
+ .dsm-remove-col-btn { background: none; border: none; color: #ef5350; cursor: pointer; font-size: 13px; padding: 0 4px; }
5584
+ .dsm-add-col-btn { font-size: 12px; color: #2196f3; background: none; border: 1px dashed #363a45; border-radius: 4px; padding: 5px 10px; cursor: pointer; align-self: flex-start; }
5585
+ .dsm-add-col-btn:hover { border-color: #2196f3; }
5586
+ .dsm-file-input { display: none; }
5587
+ .dsm-upload-btn { font-size: 12px; color: #d1d4dc; background: #1e222d; border: 1px solid #363a45; border-radius: 4px; padding: 7px 14px; cursor: pointer; text-align: left; }
5588
+ .dsm-upload-btn:hover { border-color: #787b86; }
5589
+ .dsm-preview { margin-top: 8px; }
5590
+ .dsm-preview-label { font-size: 11px; color: #787b86; margin-bottom: 4px; }
5591
+ .dsm-preview-table-wrap { overflow-x: auto; }
5592
+ .dsm-preview-table { border-collapse: collapse; font-size: 11px; width: 100%; }
5593
+ .dsm-preview-table th { background: #1e222d; color: #787b86; padding: 4px 8px; border: 1px solid #363a45; font-weight: 600; }
5594
+ .dsm-preview-table td { color: #d1d4dc; padding: 3px 8px; border: 1px solid #2a2e39; }
5595
+ .dsm-save-btn { margin-top: 12px; padding: 8px 18px; background: #2196f3; color: #fff; border: none; border-radius: 4px; font-size: 13px; font-weight: 600; cursor: pointer; align-self: flex-start; }
5596
+ .dsm-save-btn:hover { background: #1e88e5; }
5597
+ .dsm-save-btn:disabled { opacity: 0.5; cursor: not-allowed; }
5598
+
5599
+ /* ── Step indicator ── */
5600
+ .dsm-steps { display: flex; align-items: center; gap: 8px; padding: 10px 0 4px; margin-bottom: 4px; }
5601
+ .dsm-step { font-size: 12px; font-weight: 600; color: #787b86; }
5602
+ .dsm-step--active { color: #2196f3; }
5603
+ .dsm-step--done { color: #4caf50; }
5604
+ .dsm-step--upcoming { color: #4a4f60; }
5605
+ .dsm-step-sep { font-size: 12px; color: #4a4f60; }
5606
+
5607
+ /* ── Importer ── */
5608
+ .dsm-importer { flex: 1; overflow-y: auto; padding: 14px; display: flex; flex-direction: column; gap: 8px; }
5609
+ .dsm-schema-summary { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; padding: 8px 10px; background: rgba(33,150,243,0.06); border: 1px solid rgba(33,150,243,0.18); border-radius: 5px; }
5610
+ .dsm-schema-summary-label { font-size: 11px; color: #787b86; flex-shrink: 0; }
5611
+ .dsm-template-section { display: flex; flex-direction: column; gap: 6px; padding: 10px 12px; background: rgba(255,255,255,0.03); border: 1px solid #2a2e39; border-radius: 5px; }
5612
+ .dsm-template-desc { font-size: 12px; color: #9598a1; line-height: 1.5; }
5613
+ .dsm-template-btn { align-self: flex-start; padding: 6px 14px; background: transparent; border: 1px solid #2196f3; color: #2196f3; border-radius: 4px; font-size: 12px; font-weight: 600; cursor: pointer; }
5614
+ .dsm-template-btn:hover { background: rgba(33,150,243,0.1); }
5615
+ .dsm-col-unknown { color: #f44336 !important; }
5616
+ .dsm-import-actions { display: flex; align-items: center; gap: 12px; margin-top: 4px; }
5617
+ .dsm-skip-btn { background: none; border: none; color: #787b86; font-size: 12px; cursor: pointer; padding: 4px 0; text-decoration: underline; text-underline-offset: 2px; }
5618
+ .dsm-skip-btn:hover { color: #d1d4dc; }
5619
+ [data-theme="light"] .dsm-schema-summary { background: rgba(33,150,243,0.05); border-color: rgba(33,150,243,0.2); }
5620
+ [data-theme="light"] .dsm-template-section { background: #f8f9fb; border-color: #e0e3eb; }
5621
+
5622
+ .dsm-usage { flex: 1; overflow-y: auto; padding: 14px; display: flex; flex-direction: column; gap: 12px; }
5623
+ .dsm-usage-intro { font-size: 13px; color: #d1d4dc; margin: 0; }
5624
+ .dsm-usage-code-wrap { position: relative; }
5625
+ .dsm-usage-code { background: #1e222d; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 12px; font-family: monospace; padding: 12px; white-space: pre-wrap; margin: 0; }
5626
+ .dsm-copy-btn { position: absolute; top: 8px; right: 8px; font-size: 11px; padding: 3px 8px; background: #363a45; color: #d1d4dc; border: none; border-radius: 3px; cursor: pointer; }
5627
+ .dsm-copy-btn:hover { background: #2196f3; color: #fff; }
5628
+ .dsm-usage-cols { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
5629
+ .dsm-usage-col-label { font-size: 11px; color: #787b86; }
5630
+ .dsm-col-type { font-size: 10px; opacity: 0.7; }
5631
+ [data-theme="light"] .dsm-root { background: #fff; }
5632
+ [data-theme="light"] .dsm-header { border-bottom-color: #e0e3eb; }
5633
+ [data-theme="light"] .dsm-title { color: #131722; }
5634
+ [data-theme="light"] .dsm-list-item { border-bottom-color: #e0e3eb; }
5635
+ [data-theme="light"] .dsm-list-item-name { color: #131722; }
5636
+ [data-theme="light"] .dsm-col-tag { background: #f0f3fa; color: #787b86; }
5637
+ [data-theme="light"] .dsm-input { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5638
+ [data-theme="light"] .dsm-select { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5639
+ [data-theme="light"] .dsm-usage-code { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5640
+ [data-theme="light"] .dsm-save-btn { background: #2196f3; color: #fff !important; border: none; }
5641
+ [data-theme="light"] .dsm-save-btn:hover { background: #1976d2; }
5642
+ [data-theme="light"] .dsm-add-col-btn { color: #2196f3; border-color: #c8d6e5; }
5643
+ [data-theme="light"] .dsm-back-btn { color: #2196f3; }
5644
+ [data-theme="light"] .dsm-new-btn { background: #2196f3; color: #fff; }
5645
+ [data-theme="light"] .dsm-hint { color: #787b86; }
5646
+ [data-theme="light"] .dsm-nullable-label { color: #434651; }
5647
+
5648
+ /* ═══════════════════════════════════════════════════════════════════════════
5649
+ Docs Editor
5650
+ ═══════════════════════════════════════════════════════════════════════════ */
5651
+
5652
+ .docs-editor-root { display: flex; flex-direction: column; flex: 1; overflow: hidden; }
5653
+ .docs-toolbar { display: flex; align-items: center; gap: 6px; padding: 8px 12px; border-bottom: 1px solid #363a45; flex-shrink: 0; background: #1e222d; }
5654
+ .docs-tab-btn { font-size: 12px; padding: 4px 10px; border-radius: 4px; cursor: pointer; background: transparent; border: 1px solid transparent; color: #787b86; }
5655
+ .docs-tab-btn:hover { color: #d1d4dc; }
5656
+ .docs-tab-btn.active { border-color: #363a45; color: #d1d4dc; background: #131722; }
5657
+ .docs-template-btn { font-size: 12px; color: #2196f3; background: none; border: none; cursor: pointer; padding: 0 4px; }
5658
+ .docs-template-btn:hover { text-decoration: underline; }
5659
+ .docs-error { font-size: 11px; color: #ef5350; }
5660
+ .docs-saved { font-size: 11px; color: #26a69a; }
5661
+ .docs-save-btn { font-size: 12px; padding: 5px 14px; background: #2196f3; color: #fff; border: none; border-radius: 4px; cursor: pointer; }
5662
+ .docs-save-btn:hover { background: #1e88e5; }
5663
+ .docs-save-btn:disabled { opacity: 0.5; cursor: not-allowed; }
5664
+ .docs-panes { flex: 1; overflow: hidden; }
5665
+ .docs-textarea { width: 100%; height: 100%; background: #131722; border: none; outline: none; color: #d1d4dc; font-size: 13px; font-family: 'SFMono-Regular', Consolas, monospace; padding: 14px; resize: none; box-sizing: border-box; line-height: 1.6; }
5666
+ .docs-rendered { flex: 1; overflow-y: auto; padding: 16px 20px; color: #d1d4dc; font-size: 13px; line-height: 1.7; }
5667
+ .docs-rendered h1 { font-size: 18px; margin: 0 0 12px; color: #d1d4dc; }
5668
+ .docs-rendered h2 { font-size: 15px; margin: 20px 0 8px; color: #d1d4dc; border-bottom: 1px solid #363a45; padding-bottom: 4px; }
5669
+ .docs-rendered h3 { font-size: 13px; margin: 14px 0 6px; color: #d1d4dc; }
5670
+ .docs-rendered p { margin: 0 0 10px; }
5671
+ .docs-rendered ul { margin: 0 0 10px; padding-left: 20px; }
5672
+ .docs-rendered li { margin-bottom: 4px; }
5673
+ .docs-rendered hr { border: none; border-top: 1px solid #363a45; margin: 16px 0; }
5674
+ .docs-rendered strong { color: #d1d4dc; }
5675
+ .docs-code-block { background: #1e222d; border: 1px solid #363a45; border-radius: 4px; padding: 10px 12px; font-size: 12px; overflow-x: auto; margin: 8px 0; }
5676
+ .docs-inline-code { background: #1e222d; border: 1px solid #363a45; border-radius: 3px; padding: 1px 5px; font-size: 11px; font-family: monospace; }
5677
+ .docs-viewer { flex: 1; overflow-y: auto; }
5678
+ .docs-empty, .docs-loading { padding: 24px 16px; color: #787b86; font-size: 13px; text-align: center; }
5679
+ [data-theme="light"] .docs-toolbar { background: #f0f3fa; border-bottom-color: #e0e3eb; }
5680
+ [data-theme="light"] .docs-tab-btn.active { background: #fff; border-color: #e0e3eb; color: #131722; }
5681
+ [data-theme="light"] .docs-textarea { background: #fff; color: #131722; }
5682
+ [data-theme="light"] .docs-rendered { color: #131722; }
5683
+ [data-theme="light"] .docs-rendered h1, [data-theme="light"] .docs-rendered h2, [data-theme="light"] .docs-rendered h3 { color: #131722; }
5684
+ [data-theme="light"] .docs-rendered h2 { border-bottom-color: #e0e3eb; }
5685
+ [data-theme="light"] .docs-code-block { background: #f0f3fa; border-color: #e0e3eb; }
5686
+ [data-theme="light"] .docs-inline-code { background: #f0f3fa; border-color: #e0e3eb; }
5687
+
5688
+ /* ═══════════════════════════════════════════════════════════════════════════
5689
+ Script Settings
5690
+ ═══════════════════════════════════════════════════════════════════════════ */
5691
+
5692
+ .ss-root { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 4px; }
5693
+ .ss-section { margin-bottom: 16px; }
5694
+ .ss-section-label { display: block; font-size: 11px; font-weight: 600; color: #787b86; text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 6px; }
5695
+ .ss-input { width: 100%; background: #1e222d; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 13px; padding: 7px 10px; outline: none; box-sizing: border-box; }
5696
+ .ss-input:focus { border-color: #2196f3; }
5697
+ .ss-vis-group { display: flex; gap: 6px; margin-bottom: 6px; }
5698
+ .ss-vis-btn { flex: 1; padding: 7px 4px; font-size: 12px; font-weight: 500; background: #1e222d; border: 1px solid #363a45; border-radius: 4px; color: #787b86; cursor: pointer; }
5699
+ .ss-vis-btn:hover { color: #d1d4dc; border-color: #787b86; }
5700
+ .ss-vis-btn.active { background: rgba(33,150,243,0.12); border-color: #2196f3; color: #2196f3; }
5701
+ .ss-vis-desc { font-size: 12px; color: #787b86; margin: 0; }
5702
+ .ss-price-row { display: flex; gap: 8px; margin-bottom: 6px; }
5703
+ .ss-currency-select { background: #1e222d; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 13px; padding: 6px 8px; outline: none; }
5704
+ .ss-price-input { flex: 1; background: #1e222d; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 13px; padding: 6px 10px; outline: none; }
5705
+ .ss-price-input:focus { border-color: #2196f3; }
5706
+ .ss-hint { font-size: 11px; color: #787b86; margin: 0; }
5707
+ .ss-slider { width: 100%; accent-color: #2196f3; }
5708
+ .ss-footer { display: flex; align-items: center; gap: 10px; padding-top: 8px; border-top: 1px solid #363a45; margin-top: auto; }
5709
+ .ss-error { font-size: 12px; color: #ef5350; flex: 1; }
5710
+ .ss-saved { font-size: 12px; color: #26a69a; flex: 1; }
5711
+ .ss-save-btn { padding: 7px 18px; background: #2196f3; color: #fff; border: none; border-radius: 4px; font-size: 13px; font-weight: 600; cursor: pointer; }
5712
+ .ss-save-btn:hover { background: #1e88e5; }
5713
+ .ss-save-btn:disabled { opacity: 0.5; cursor: not-allowed; }
5714
+ .ss-viewer { padding: 16px; display: flex; flex-direction: column; gap: 10px; }
5715
+ .ss-row { display: flex; align-items: center; gap: 10px; }
5716
+ .ss-label { font-size: 12px; color: #787b86; }
5717
+ .ss-value { font-size: 13px; color: #d1d4dc; }
5718
+ .ss-badge { font-size: 11px; padding: 2px 8px; border-radius: 10px; font-weight: 600; }
5719
+ .ss-badge--private { background: rgba(120,123,134,0.15); color: #787b86; }
5720
+ .ss-badge--public { background: rgba(38,166,154,0.15); color: #26a69a; }
5721
+ .ss-badge--for_sale { background: rgba(255,167,38,0.15); color: #ffa726; }
5722
+ .ss-empty, .ss-loading { padding: 24px 16px; color: #787b86; font-size: 13px; text-align: center; }
5723
+ [data-theme="light"] .ss-root { background: #fff; }
5724
+ [data-theme="light"] .ss-input { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5725
+ [data-theme="light"] .ss-vis-btn { background: #f0f3fa; border-color: #e0e3eb; color: #787b86; }
5726
+ [data-theme="light"] .ss-vis-btn:hover { color: #131722; }
5727
+ [data-theme="light"] .ss-currency-select { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5728
+ [data-theme="light"] .ss-price-input { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5729
+ [data-theme="light"] .ss-footer { border-top-color: #e0e3eb; }
5730
+ [data-theme="light"] .ss-save-btn { background: #2196f3; color: #fff !important; border: none; }
5731
+ [data-theme="light"] .ss-save-btn:hover { background: #1976d2; }
5732
+
5733
+ /* ── Agent UI Bus animations ─────────────────────────────────────────────── */
5734
+ @keyframes agent-pulse {
5735
+ 0%, 100% { opacity: 1; transform: scale(1); }
5736
+ 50% { opacity: 0.4; transform: scale(0.7); }
5737
+ }
5738
+
5739
+ @keyframes agent-highlight-flash {
5740
+ 0% { background: rgba(138,180,248,0.25); }
5741
+ 100% { background: transparent; }
5742
+ }
5743
+
5744
+ .agent-highlight {
5745
+ animation: agent-highlight-flash 1.2s ease-out forwards;
5746
+ }
5747
+
5748
+ /* ── Agent drawer (inline panel like WatchlistDrawer) ──────────────────── */
5749
+ .agent-drawer {
5750
+ width: 340px;
5751
+ flex-shrink: 0;
5752
+ position: relative;
5753
+ display: flex;
5754
+ flex-direction: column;
5755
+ background: var(--toolbar-bg);
5756
+ border: 1px solid var(--border);
5757
+ border-radius: 8px;
5758
+ overflow: hidden;
5759
+ min-height: 0;
5760
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
5761
+ font-size: 13px;
5762
+ }
5763
+
5764
+ .agent-resize-handle {
5765
+ position: absolute;
5766
+ left: 0;
5767
+ top: 0;
5768
+ bottom: 0;
5769
+ width: 5px;
5770
+ cursor: col-resize;
5771
+ z-index: 10;
5772
+ }
5773
+ .agent-resize-handle:hover,
5774
+ .agent-resize-handle:active {
5775
+ background: var(--accent);
5776
+ opacity: 0.25;
5777
+ }
5778
+
5779
+ .agent-drawer-header {
5780
+ display: flex;
5781
+ align-items: center;
5782
+ justify-content: space-between;
5783
+ padding: 10px 12px;
5784
+ border-bottom: 1px solid var(--border);
5785
+ background: var(--toolbar-bg);
5786
+ flex-shrink: 0;
5787
+ }
5788
+
5789
+ .agent-drawer-title {
5790
+ display: flex;
5791
+ align-items: center;
5792
+ gap: 6px;
5793
+ font-weight: 600;
5794
+ font-size: 13px;
5795
+ color: var(--text, #e0e0e0);
5796
+ }
5797
+
5798
+ .agent-drawer-close {
5799
+ width: 24px;
5800
+ height: 24px;
5801
+ border: none;
5802
+ background: none;
5803
+ cursor: pointer;
5804
+ color: var(--text-muted, #888);
5805
+ display: flex;
5806
+ align-items: center;
5807
+ justify-content: center;
5808
+ border-radius: 4px;
5809
+ padding: 0;
5810
+ }
5811
+ .agent-drawer-close:hover { background: var(--hover-bg, rgba(255,255,255,0.07)); color: var(--text, #e0e0e0); }
5812
+
5813
+ .agent-deep-toggle {
5814
+ display: flex;
5815
+ align-items: center;
5816
+ gap: 5px;
5817
+ font-size: 11px;
5818
+ color: var(--text-muted, #888);
5819
+ cursor: pointer;
5820
+ user-select: none;
5821
+ }
5822
+ .agent-deep-toggle input { cursor: pointer; accent-color: #06b6d4; }
5823
+
5824
+ .agent-error-banner {
5825
+ padding: 8px 12px;
5826
+ background: rgba(239, 68, 68, 0.12);
5827
+ border-bottom: 1px solid rgba(239, 68, 68, 0.25);
5828
+ color: #f87171;
5829
+ font-size: 12px;
5830
+ flex-shrink: 0;
5831
+ }
5832
+
5833
+ .agent-messages {
5834
+ flex: 1;
5835
+ overflow-y: auto;
5836
+ padding: 12px;
5837
+ display: flex;
5838
+ flex-direction: column;
5839
+ gap: 8px;
5840
+ min-height: 0;
5841
+ }
5842
+
5843
+ .agent-empty-state {
5844
+ display: flex;
5845
+ flex-direction: column;
5846
+ align-items: center;
5847
+ justify-content: center;
5848
+ flex: 1;
5849
+ text-align: center;
5850
+ color: var(--text-muted, #777);
5851
+ padding: 32px 16px;
5852
+ gap: 8px;
5853
+ }
5854
+
5855
+ .agent-message {
5856
+ display: flex;
5857
+ }
5858
+ .agent-message.user { justify-content: flex-end; }
5859
+ .agent-message.assistant { justify-content: flex-start; }
5860
+
5861
+ .agent-message-bubble {
5862
+ max-width: 85%;
5863
+ padding: 8px 12px;
5864
+ border-radius: 10px;
5865
+ font-size: 13px;
5866
+ line-height: 1.5;
5867
+ word-break: break-word;
5868
+ }
5869
+ .agent-message.user .agent-message-bubble {
5870
+ background: #06b6d4;
5871
+ color: #fff;
5872
+ border-radius: 10px 10px 2px 10px;
5873
+ }
5874
+ .agent-message.assistant .agent-message-bubble {
5875
+ background: var(--surface-2, rgba(255,255,255,0.06));
5876
+ color: var(--text, #e0e0e0);
5877
+ border-radius: 10px 10px 10px 2px;
5878
+ }
5879
+
5880
+ .agent-tool-call {
5881
+ margin: 3px 0;
5882
+ padding: 6px 10px;
5883
+ background: var(--surface-2, rgba(255,255,255,0.04));
5884
+ border-left: 2px solid #06b6d4;
5885
+ border-radius: 0 4px 4px 0;
5886
+ }
5887
+
5888
+ .agent-approval-card {
5889
+ margin: 6px 0;
5890
+ padding: 10px 12px;
5891
+ background: rgba(245, 158, 11, 0.12);
5892
+ border: 1px solid rgba(245, 158, 11, 0.4);
5893
+ border-radius: 6px;
5894
+ color: var(--text);
5895
+ }
5896
+
5897
+ /* Use .agent-drawer specificity to beat the global `button { background: transparent }` reset */
5898
+ .agent-drawer .agent-approval-btn {
5899
+ display: inline-flex;
5900
+ align-items: center;
5901
+ justify-content: center;
5902
+ flex: 1;
5903
+ padding: 6px 12px;
5904
+ border: none;
5905
+ border-radius: 4px;
5906
+ cursor: pointer;
5907
+ font-size: 12px;
5908
+ font-weight: 600;
5909
+ transition: background 0.15s, opacity 0.15s;
5910
+ }
5911
+ .agent-drawer .agent-approval-approve,
5912
+ .agent-drawer .agent-approval-approve:hover,
5913
+ [data-theme="light"] .agent-drawer .agent-approval-approve,
5914
+ [data-theme="light"] .agent-drawer .agent-approval-approve:hover {
5915
+ background: #16a34a !important;
5916
+ color: #fff !important;
5917
+ }
5918
+ .agent-drawer .agent-approval-approve:hover { opacity: 0.88; }
5919
+
5920
+ .agent-drawer .agent-approval-reject,
5921
+ .agent-drawer .agent-approval-reject:hover,
5922
+ [data-theme="light"] .agent-drawer .agent-approval-reject,
5923
+ [data-theme="light"] .agent-drawer .agent-approval-reject:hover {
5924
+ background: #dc2626 !important;
5925
+ color: #fff !important;
5926
+ }
5927
+ .agent-drawer .agent-approval-reject:hover { opacity: 0.88; }
5928
+
5929
+ .agent-input-area {
5930
+ padding: 10px 12px;
5931
+ border-top: 1px solid var(--border);
5932
+ background: var(--toolbar-bg);
5933
+ flex-shrink: 0;
5934
+ }
5935
+
5936
+ .agent-input {
5937
+ flex: 1;
5938
+ padding: 7px 10px;
5939
+ background: var(--surface-2, rgba(255,255,255,0.06));
5940
+ border: 1px solid var(--border);
5941
+ border-radius: 6px;
5942
+ color: var(--text, #e0e0e0);
5943
+ font-size: 13px;
5944
+ font-family: inherit;
5945
+ resize: none;
5946
+ line-height: 1.4;
5947
+ outline: none;
5948
+ }
5949
+ .agent-input:focus { border-color: #06b6d4; box-shadow: 0 0 0 2px rgba(6,182,212,0.15); }
5950
+ .agent-input::placeholder { color: var(--text-muted, #666); }
5951
+ .agent-input:disabled { opacity: 0.5; }
5952
+
5953
+ /* Beat the global button reset with .agent-drawer specificity */
5954
+ .agent-drawer .agent-send-btn,
5955
+ .agent-drawer .agent-send-btn:hover,
5956
+ [data-theme="light"] .agent-drawer .agent-send-btn,
5957
+ [data-theme="light"] .agent-drawer .agent-send-btn:hover {
5958
+ width: 32px;
5959
+ height: 32px;
5960
+ background: #06b6d4 !important;
5961
+ color: #fff !important;
5962
+ border: none;
5963
+ border-radius: 6px;
5964
+ cursor: pointer;
5965
+ display: flex;
5966
+ align-items: center;
5967
+ justify-content: center;
5968
+ flex-shrink: 0;
5969
+ align-self: flex-end;
5970
+ transition: background 0.15s;
5971
+ }
5972
+ .agent-drawer .agent-send-btn:hover:not(:disabled) { background: #0891b2 !important; }
5973
+ .agent-drawer .agent-send-btn:disabled { opacity: 0.4; cursor: not-allowed; }
5974
+
5975
+ /* ── Light mode overrides for agent drawer ──────────────────────────────── */
5976
+ [data-theme="light"] .agent-drawer {
5977
+ background: #ffffff;
5978
+ border-color: #e2e8f0;
5979
+ }
5980
+ [data-theme="light"] .agent-drawer-header {
5981
+ background: #f8fafc;
5982
+ border-bottom-color: #e2e8f0;
5983
+ }
5984
+ [data-theme="light"] .agent-drawer-title { color: #1e293b; }
5985
+ [data-theme="light"] .agent-drawer-close { color: #64748b; }
5986
+ [data-theme="light"] .agent-drawer-close:hover { background: rgba(0,0,0,0.06); color: #1e293b; }
5987
+ [data-theme="light"] .agent-deep-toggle { color: #64748b; }
5988
+ [data-theme="light"] .agent-messages { background: #ffffff; }
5989
+ [data-theme="light"] .agent-message.assistant .agent-message-bubble {
5990
+ background: #f1f5f9;
5991
+ color: #1e293b;
5992
+ }
5993
+ [data-theme="light"] .agent-message.user .agent-message-bubble {
5994
+ background: #06b6d4;
5995
+ color: #fff;
5996
+ }
5997
+ [data-theme="light"] .agent-tool-call {
5998
+ background: #f8fafc;
5999
+ border-left-color: #06b6d4;
6000
+ }
6001
+ [data-theme="light"] .agent-approval-card {
6002
+ background: rgba(245, 158, 11, 0.08);
6003
+ border-color: rgba(245, 158, 11, 0.35);
6004
+ color: #92400e;
6005
+ }
6006
+ [data-theme="light"] .agent-input-area {
6007
+ background: #ffffff;
6008
+ border-top-color: #e2e8f0;
6009
+ }
6010
+ [data-theme="light"] .agent-input {
6011
+ background: #f1f5f9;
6012
+ border-color: #cbd5e1;
6013
+ color: #1e293b;
6014
+ }
6015
+ [data-theme="light"] .agent-input:focus { border-color: #06b6d4; }
6016
+ [data-theme="light"] .agent-input::placeholder { color: #94a3b8; }
6017
+ [data-theme="light"] .agent-empty-state { color: #94a3b8; }
6018
+ [data-theme="light"] .agent-error-banner {
6019
+ background: rgba(239, 68, 68, 0.08);
6020
+ border-bottom-color: rgba(239, 68, 68, 0.2);
6021
+ color: #b91c1c;
6022
+ }
6023
+
6024
+ @keyframes agent-blink {
6025
+ 0%, 100% { opacity: 1; }
6026
+ 50% { opacity: 0; }
6027
+ }
6028
+
6029
+ /* ── Agent toolbar button ring animation ────────────────────────────────── */
6030
+ @keyframes agent-ring-pulse {
6031
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(6, 182, 212, 0.6); }
6032
+ 50% { box-shadow: 0 0 0 4px rgba(6, 182, 212, 0); }
6033
+ }
6034
+
6035
+ .agent-toolbar-btn {
6036
+ position: relative;
6037
+ }
6038
+ .agent-toolbar-btn:not(.is-active) {
6039
+ animation: agent-ring-pulse 2.4s ease-in-out infinite;
6040
+ }