@forgecharts/sdk 1.2.1 → 1.2.3

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 (235) hide show
  1. package/dist/api/DrawingManager.d.ts +1 -1
  2. package/dist/api/DrawingManager.d.ts.map +1 -1
  3. package/dist/api/LayoutManager.d.ts +2 -1
  4. package/dist/api/LayoutManager.d.ts.map +1 -1
  5. package/dist/api/ReferenceAPI.d.ts +5 -0
  6. package/dist/api/ReferenceAPI.d.ts.map +1 -1
  7. package/dist/api/TChart.d.ts +40 -0
  8. package/dist/api/TChart.d.ts.map +1 -1
  9. package/dist/api/drawing tools/fib gann menu/fibChannel.d.ts +4 -0
  10. package/dist/api/drawing tools/fib gann menu/fibChannel.d.ts.map +1 -0
  11. package/dist/api/drawing tools/fib gann menu/fibCircles.d.ts +4 -0
  12. package/dist/api/drawing tools/fib gann menu/fibCircles.d.ts.map +1 -0
  13. package/dist/api/drawing tools/fib gann menu/fibRetracement.d.ts.map +1 -1
  14. package/dist/api/drawing tools/fib gann menu/fibSpeedResistanceArcs.d.ts +4 -0
  15. package/dist/api/drawing tools/fib gann menu/fibSpeedResistanceArcs.d.ts.map +1 -0
  16. package/dist/api/drawing tools/fib gann menu/fibSpeedResistanceFan.d.ts +4 -0
  17. package/dist/api/drawing tools/fib gann menu/fibSpeedResistanceFan.d.ts.map +1 -0
  18. package/dist/api/drawing tools/fib gann menu/fibSpiral.d.ts +4 -0
  19. package/dist/api/drawing tools/fib gann menu/fibSpiral.d.ts.map +1 -0
  20. package/dist/api/drawing tools/fib gann menu/fibTimeZone.d.ts +4 -0
  21. package/dist/api/drawing tools/fib gann menu/fibTimeZone.d.ts.map +1 -0
  22. package/dist/api/drawing tools/fib gann menu/fibWedge.d.ts +4 -0
  23. package/dist/api/drawing tools/fib gann menu/fibWedge.d.ts.map +1 -0
  24. package/dist/api/drawing tools/fib gann menu/gannBox.d.ts +4 -0
  25. package/dist/api/drawing tools/fib gann menu/gannBox.d.ts.map +1 -0
  26. package/dist/api/drawing tools/fib gann menu/gannFan.d.ts +4 -0
  27. package/dist/api/drawing tools/fib gann menu/gannFan.d.ts.map +1 -0
  28. package/dist/api/drawing tools/fib gann menu/gannSquare.d.ts +4 -0
  29. package/dist/api/drawing tools/fib gann menu/gannSquare.d.ts.map +1 -0
  30. package/dist/api/drawing tools/fib gann menu/gannSquareFixed.d.ts +4 -0
  31. package/dist/api/drawing tools/fib gann menu/gannSquareFixed.d.ts.map +1 -0
  32. package/dist/api/drawing tools/fib gann menu/pitchfan.d.ts +4 -0
  33. package/dist/api/drawing tools/fib gann menu/pitchfan.d.ts.map +1 -0
  34. package/dist/api/drawing tools/fib gann menu/trendBasedFibExtension.d.ts +4 -0
  35. package/dist/api/drawing tools/fib gann menu/trendBasedFibExtension.d.ts.map +1 -0
  36. package/dist/api/drawing tools/fib gann menu/trendBasedFibTime.d.ts +4 -0
  37. package/dist/api/drawing tools/fib gann menu/trendBasedFibTime.d.ts.map +1 -0
  38. package/dist/api/drawing tools/shapes menu/anchoredText.d.ts +7 -0
  39. package/dist/api/drawing tools/shapes menu/anchoredText.d.ts.map +1 -0
  40. package/dist/api/drawing tools/shapes menu/arc.d.ts +8 -0
  41. package/dist/api/drawing tools/shapes menu/arc.d.ts.map +1 -0
  42. package/dist/api/drawing tools/shapes menu/arrow.d.ts +4 -0
  43. package/dist/api/drawing tools/shapes menu/arrow.d.ts.map +1 -0
  44. package/dist/api/drawing tools/shapes menu/arrowDown.d.ts +7 -0
  45. package/dist/api/drawing tools/shapes menu/arrowDown.d.ts.map +1 -0
  46. package/dist/api/drawing tools/shapes menu/arrowUp.d.ts +7 -0
  47. package/dist/api/drawing tools/shapes menu/arrowUp.d.ts.map +1 -0
  48. package/dist/api/drawing tools/shapes menu/callout.d.ts +7 -0
  49. package/dist/api/drawing tools/shapes menu/callout.d.ts.map +1 -0
  50. package/dist/api/drawing tools/shapes menu/dateRange.d.ts +4 -0
  51. package/dist/api/drawing tools/shapes menu/dateRange.d.ts.map +1 -0
  52. package/dist/api/drawing tools/shapes menu/ellipse.d.ts +4 -0
  53. package/dist/api/drawing tools/shapes menu/ellipse.d.ts.map +1 -0
  54. package/dist/api/drawing tools/shapes menu/longPosition.d.ts +4 -0
  55. package/dist/api/drawing tools/shapes menu/longPosition.d.ts.map +1 -0
  56. package/dist/api/drawing tools/shapes menu/priceLabel.d.ts +7 -0
  57. package/dist/api/drawing tools/shapes menu/priceLabel.d.ts.map +1 -0
  58. package/dist/api/drawing tools/shapes menu/priceRange.d.ts +4 -0
  59. package/dist/api/drawing tools/shapes menu/priceRange.d.ts.map +1 -0
  60. package/dist/api/drawing tools/shapes menu/shortPosition.d.ts +4 -0
  61. package/dist/api/drawing tools/shapes menu/shortPosition.d.ts.map +1 -0
  62. package/dist/api/drawing tools/shapes menu/triangle.d.ts +4 -0
  63. package/dist/api/drawing tools/shapes menu/triangle.d.ts.map +1 -0
  64. package/dist/core/Chart.d.ts +21 -2
  65. package/dist/core/Chart.d.ts.map +1 -1
  66. package/dist/core/CoordTransform.d.ts.map +1 -1
  67. package/dist/core/Crosshair.d.ts +2 -0
  68. package/dist/core/Crosshair.d.ts.map +1 -1
  69. package/dist/core/InteractionManager.d.ts +36 -2
  70. package/dist/core/InteractionManager.d.ts.map +1 -1
  71. package/dist/core/PriceScale.d.ts +2 -0
  72. package/dist/core/PriceScale.d.ts.map +1 -1
  73. package/dist/core/TimeScale.d.ts +52 -1
  74. package/dist/core/TimeScale.d.ts.map +1 -1
  75. package/dist/datafeed/DatafeedConnector.d.ts +4 -0
  76. package/dist/datafeed/DatafeedConnector.d.ts.map +1 -1
  77. package/dist/forgecharts.css +1938 -111
  78. package/dist/forgescript/ast.d.ts +71 -4
  79. package/dist/forgescript/ast.d.ts.map +1 -1
  80. package/dist/forgescript/builtins/collections.d.ts +56 -0
  81. package/dist/forgescript/builtins/collections.d.ts.map +1 -0
  82. package/dist/forgescript/builtins/drawing.d.ts +57 -0
  83. package/dist/forgescript/builtins/drawing.d.ts.map +1 -0
  84. package/dist/forgescript/builtins/udt.d.ts +30 -0
  85. package/dist/forgescript/builtins/udt.d.ts.map +1 -0
  86. package/dist/forgescript/conversion/index.d.ts +16 -9
  87. package/dist/forgescript/conversion/index.d.ts.map +1 -1
  88. package/dist/forgescript/conversion/types.d.ts +10 -54
  89. package/dist/forgescript/conversion/types.d.ts.map +1 -1
  90. package/dist/forgescript/conversion/validation.d.ts.map +1 -1
  91. package/dist/forgescript/datasets/DatasetStore.d.ts +65 -0
  92. package/dist/forgescript/datasets/DatasetStore.d.ts.map +1 -0
  93. package/dist/forgescript/datasets/parseDataset.d.ts +32 -0
  94. package/dist/forgescript/datasets/parseDataset.d.ts.map +1 -0
  95. package/dist/forgescript/parser.d.ts +19 -1
  96. package/dist/forgescript/parser.d.ts.map +1 -1
  97. package/dist/forgescript/runtime.d.ts +119 -104
  98. package/dist/forgescript/runtime.d.ts.map +1 -1
  99. package/dist/index.d.ts +3 -5
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +12034 -6683
  102. package/dist/index.js.map +1 -1
  103. package/dist/internal.d.ts +2 -0
  104. package/dist/internal.d.ts.map +1 -1
  105. package/dist/internal.js +13494 -8884
  106. package/dist/internal.js.map +1 -1
  107. package/dist/licensing/licenseTypes.d.ts +1 -0
  108. package/dist/licensing/licenseTypes.d.ts.map +1 -1
  109. package/dist/pixi/PixiBenchmark.d.ts +56 -0
  110. package/dist/pixi/PixiBenchmark.d.ts.map +1 -0
  111. package/dist/pixi/PixiCandlestickRenderer.d.ts +5 -6
  112. package/dist/pixi/PixiCandlestickRenderer.d.ts.map +1 -1
  113. package/dist/pixi/PixiChart.d.ts +100 -2
  114. package/dist/pixi/PixiChart.d.ts.map +1 -1
  115. package/dist/pixi/PixiCrosshairRenderer.d.ts +10 -0
  116. package/dist/pixi/PixiCrosshairRenderer.d.ts.map +1 -1
  117. package/dist/pixi/PixiDrawingRenderer.d.ts +17 -5
  118. package/dist/pixi/PixiDrawingRenderer.d.ts.map +1 -1
  119. package/dist/pixi/PixiGridRenderer.d.ts +16 -2
  120. package/dist/pixi/PixiGridRenderer.d.ts.map +1 -1
  121. package/dist/pixi/PixiHistogramRenderer.d.ts +17 -0
  122. package/dist/pixi/PixiHistogramRenderer.d.ts.map +1 -0
  123. package/dist/pixi/PixiIndicatorRenderer.d.ts +31 -0
  124. package/dist/pixi/PixiIndicatorRenderer.d.ts.map +1 -0
  125. package/dist/pixi/PixiLastPriceRenderer.d.ts +33 -0
  126. package/dist/pixi/PixiLastPriceRenderer.d.ts.map +1 -0
  127. package/dist/pixi/PixiLayerManager.d.ts.map +1 -1
  128. package/dist/pixi/PixiLineRenderer.d.ts +19 -0
  129. package/dist/pixi/PixiLineRenderer.d.ts.map +1 -0
  130. package/dist/pixi/PixiTradingRenderer.d.ts +46 -0
  131. package/dist/pixi/PixiTradingRenderer.d.ts.map +1 -0
  132. package/dist/react/agent/AgentFAB.d.ts +20 -0
  133. package/dist/react/agent/AgentFAB.d.ts.map +1 -0
  134. package/dist/react/agent/AgentProvider.d.ts +15 -0
  135. package/dist/react/agent/AgentProvider.d.ts.map +1 -0
  136. package/dist/react/agent/AgentUIBus.d.ts +111 -0
  137. package/dist/react/agent/AgentUIBus.d.ts.map +1 -0
  138. package/dist/react/agent/AssistantPanel.d.ts +12 -0
  139. package/dist/react/agent/AssistantPanel.d.ts.map +1 -0
  140. package/dist/react/agent/CommandDispatcher.d.ts +77 -0
  141. package/dist/react/agent/CommandDispatcher.d.ts.map +1 -0
  142. package/dist/react/agent/VoiceInput.d.ts +36 -0
  143. package/dist/react/agent/VoiceInput.d.ts.map +1 -0
  144. package/dist/react/agent/index.d.ts +18 -0
  145. package/dist/react/agent/index.d.ts.map +1 -0
  146. package/dist/react/agent/useAgent.d.ts +81 -0
  147. package/dist/react/agent/useAgent.d.ts.map +1 -0
  148. package/dist/react/canvas/ChartCanvas.d.ts +45 -0
  149. package/dist/react/canvas/ChartCanvas.d.ts.map +1 -1
  150. package/dist/react/canvas/ChartSettingsDialog.d.ts +80 -2
  151. package/dist/react/canvas/ChartSettingsDialog.d.ts.map +1 -1
  152. package/dist/react/canvas/ContractSwitchDialog.d.ts +22 -0
  153. package/dist/react/canvas/ContractSwitchDialog.d.ts.map +1 -0
  154. package/dist/react/canvas/DrawingPropertiesDialog.d.ts +23 -0
  155. package/dist/react/canvas/DrawingPropertiesDialog.d.ts.map +1 -0
  156. package/dist/react/canvas/IndicatorPane.d.ts.map +1 -1
  157. package/dist/react/canvas/PointerOverlay.d.ts +6 -3
  158. package/dist/react/canvas/PointerOverlay.d.ts.map +1 -1
  159. package/dist/react/canvas/PositionPropertiesDialog.d.ts +22 -0
  160. package/dist/react/canvas/PositionPropertiesDialog.d.ts.map +1 -0
  161. package/dist/react/canvas/toolbars/LeftToolbar.d.ts +6 -1
  162. package/dist/react/canvas/toolbars/LeftToolbar.d.ts.map +1 -1
  163. package/dist/react/hooks/useBrokerEvents.d.ts +9 -0
  164. package/dist/react/hooks/useBrokerEvents.d.ts.map +1 -1
  165. package/dist/react/hooks/usePanelDrag.d.ts +2 -0
  166. package/dist/react/hooks/usePanelDrag.d.ts.map +1 -0
  167. package/dist/react/index.d.ts +3 -0
  168. package/dist/react/index.d.ts.map +1 -1
  169. package/dist/react/index.js +16158 -4468
  170. package/dist/react/index.js.map +1 -1
  171. package/dist/react/internal.js +23373 -10757
  172. package/dist/react/internal.js.map +1 -1
  173. package/dist/react/shell/DatasetImportPanel.d.ts +2 -0
  174. package/dist/react/shell/DatasetImportPanel.d.ts.map +1 -0
  175. package/dist/react/shell/DatasetManagerDrawer.d.ts +10 -0
  176. package/dist/react/shell/DatasetManagerDrawer.d.ts.map +1 -0
  177. package/dist/react/shell/DocsEditor.d.ts +10 -0
  178. package/dist/react/shell/DocsEditor.d.ts.map +1 -0
  179. package/dist/react/shell/ManagedAppShell.d.ts +27 -0
  180. package/dist/react/shell/ManagedAppShell.d.ts.map +1 -1
  181. package/dist/react/shell/OrderEntryPanel.d.ts +6 -1
  182. package/dist/react/shell/OrderEntryPanel.d.ts.map +1 -1
  183. package/dist/react/shell/ScriptDrawer.d.ts.map +1 -1
  184. package/dist/react/shell/ScriptSettings.d.ts +20 -0
  185. package/dist/react/shell/ScriptSettings.d.ts.map +1 -0
  186. package/dist/react/shell/TradeDrawer.d.ts.map +1 -1
  187. package/dist/react/shell/WatchlistDrawer.d.ts.map +1 -1
  188. package/dist/react/workspace/BottomTradingPanel.d.ts +75 -0
  189. package/dist/react/workspace/BottomTradingPanel.d.ts.map +1 -0
  190. package/dist/react/workspace/ChartWorkspace.d.ts +35 -1
  191. package/dist/react/workspace/ChartWorkspace.d.ts.map +1 -1
  192. package/dist/react/workspace/IndicatorsDialog.d.ts +5 -1
  193. package/dist/react/workspace/IndicatorsDialog.d.ts.map +1 -1
  194. package/dist/react/workspace/SymbolSearchDialog.d.ts.map +1 -1
  195. package/dist/react/workspace/toolbars/BottomToolbar.d.ts +3 -1
  196. package/dist/react/workspace/toolbars/BottomToolbar.d.ts.map +1 -1
  197. package/dist/react/workspace/toolbars/RightToolbar.d.ts +5 -1
  198. package/dist/react/workspace/toolbars/RightToolbar.d.ts.map +1 -1
  199. package/dist/react/workspace/toolbars/TopToolbar.d.ts +20 -1
  200. package/dist/react/workspace/toolbars/TopToolbar.d.ts.map +1 -1
  201. package/dist/renderers/CandlestickRenderer.d.ts.map +1 -1
  202. package/dist/theme/colors.d.ts.map +1 -1
  203. package/dist/trading/UnmanagedIngestion.d.ts +39 -12
  204. package/dist/trading/UnmanagedIngestion.d.ts.map +1 -1
  205. package/dist/trading/tradingTypes.d.ts +11 -2
  206. package/dist/trading/tradingTypes.d.ts.map +1 -1
  207. package/dist/types/ChartBackend.d.ts +61 -0
  208. package/dist/types/ChartBackend.d.ts.map +1 -0
  209. package/package.json +2 -2
  210. package/dist/forgescript/__tests__/ai-response-parser.test.d.ts +0 -2
  211. package/dist/forgescript/__tests__/ai-response-parser.test.d.ts.map +0 -1
  212. package/dist/forgescript/__tests__/orchestrator.test.d.ts +0 -2
  213. package/dist/forgescript/__tests__/orchestrator.test.d.ts.map +0 -1
  214. package/dist/forgescript/__tests__/pine-transpiler.test.d.ts +0 -2
  215. package/dist/forgescript/__tests__/pine-transpiler.test.d.ts.map +0 -1
  216. package/dist/forgescript/conversion/ai-conversion-agent.d.ts +0 -41
  217. package/dist/forgescript/conversion/ai-conversion-agent.d.ts.map +0 -1
  218. package/dist/forgescript/conversion/conversion-orchestrator.d.ts +0 -44
  219. package/dist/forgescript/conversion/conversion-orchestrator.d.ts.map +0 -1
  220. package/dist/forgescript/conversion/prompts/index.d.ts +0 -17
  221. package/dist/forgescript/conversion/prompts/index.d.ts.map +0 -1
  222. package/dist/forgescript/pine/PineCompiler.d.ts +0 -38
  223. package/dist/forgescript/pine/PineCompiler.d.ts.map +0 -1
  224. package/dist/forgescript/pine/diagnostics.d.ts +0 -20
  225. package/dist/forgescript/pine/diagnostics.d.ts.map +0 -1
  226. package/dist/forgescript/pine/index.d.ts +0 -8
  227. package/dist/forgescript/pine/index.d.ts.map +0 -1
  228. package/dist/forgescript/pine/pine-ast.d.ts +0 -190
  229. package/dist/forgescript/pine/pine-ast.d.ts.map +0 -1
  230. package/dist/forgescript/pine/pine-lexer.d.ts +0 -41
  231. package/dist/forgescript/pine/pine-lexer.d.ts.map +0 -1
  232. package/dist/forgescript/pine/pine-parser.d.ts +0 -108
  233. package/dist/forgescript/pine/pine-parser.d.ts.map +0 -1
  234. package/dist/forgescript/pine/pine-transpiler.d.ts +0 -40
  235. 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);
@@ -1609,6 +1747,7 @@ select {
1609
1747
 
1610
1748
  .script-drawer {
1611
1749
  flex-shrink: 0;
1750
+ align-self: stretch;
1612
1751
  position: relative;
1613
1752
  display: flex;
1614
1753
  flex-direction: column;
@@ -1621,10 +1760,10 @@ select {
1621
1760
 
1622
1761
  .script-drawer-resize {
1623
1762
  position: absolute;
1624
- left: 0;
1763
+ left: -3px;
1625
1764
  top: 0;
1626
1765
  bottom: 0;
1627
- width: 5px;
1766
+ width: 8px;
1628
1767
  cursor: col-resize;
1629
1768
  z-index: 10;
1630
1769
  border-radius: 8px 0 0 8px;
@@ -1632,7 +1771,7 @@ select {
1632
1771
  .script-drawer-resize:hover,
1633
1772
  .script-drawer-resize:active {
1634
1773
  background: var(--accent);
1635
- opacity: 0.25;
1774
+ opacity: 0.35;
1636
1775
  }
1637
1776
 
1638
1777
  .script-drawer-header {
@@ -2128,6 +2267,30 @@ select {
2128
2267
  flex-shrink: 0;
2129
2268
  }
2130
2269
 
2270
+ /* ── request.security() multi-timeframe warning banner ──────────────── */
2271
+ .script-security-warning {
2272
+ display: flex;
2273
+ align-items: flex-start;
2274
+ gap: 8px;
2275
+ margin: 0 0 8px;
2276
+ padding: 8px 10px;
2277
+ background: rgba(255, 152, 0, 0.12);
2278
+ border: 1px solid rgba(255, 152, 0, 0.4);
2279
+ border-radius: 5px;
2280
+ font-size: 11px;
2281
+ line-height: 1.5;
2282
+ color: var(--text-primary, #e0e0e0);
2283
+ }
2284
+ .script-security-warning svg { color: #ff9800; margin-top: 1px; }
2285
+ .script-security-warning strong { color: #ff9800; }
2286
+ .script-security-warning code {
2287
+ font-family: monospace;
2288
+ font-size: 10px;
2289
+ background: rgba(255,255,255,0.07);
2290
+ padding: 1px 3px;
2291
+ border-radius: 3px;
2292
+ }
2293
+
2131
2294
  .script-conversion-ok {
2132
2295
  display: flex;
2133
2296
  align-items: center;
@@ -2282,115 +2445,330 @@ select {
2282
2445
  }
2283
2446
 
2284
2447
  /* ── AI Chat (multi-turn conversation) ───────────────────────────────── */
2285
- .script-chat-section {
2448
+
2449
+ /* -- Dataset Import Panel -------------------------------------------------- */
2450
+ .dataset-panel {
2286
2451
  border-top: 1px solid var(--border, #333);
2287
- padding: 6px 10px 8px;
2288
- display: flex;
2289
- flex-direction: column;
2290
- gap: 4px;
2291
2452
  flex-shrink: 0;
2292
2453
  }
2293
- .script-chat-label {
2454
+ .dataset-panel-toggle {
2294
2455
  display: flex;
2295
2456
  align-items: center;
2296
- gap: 5px;
2297
- font-size: 11px;
2298
- font-weight: 600;
2457
+ gap: 7px;
2458
+ width: 100%;
2459
+ padding: 8px 14px;
2460
+ background: none;
2461
+ border: none;
2299
2462
  color: var(--text-muted, #888);
2463
+ font-size: 11.5px;
2464
+ font-weight: 600;
2300
2465
  text-transform: uppercase;
2301
- letter-spacing: 0.3px;
2302
- margin-bottom: 2px;
2466
+ letter-spacing: 0.4px;
2467
+ cursor: pointer;
2468
+ text-align: left;
2469
+ transition: color 0.12s, background 0.12s;
2303
2470
  }
2304
- .script-chat-history {
2305
- max-height: 180px;
2306
- overflow-y: auto;
2471
+ .dataset-panel-toggle:hover {
2472
+ color: var(--text, #e0e0e0);
2473
+ background: var(--toolbar-hover, rgba(255,255,255,0.04));
2474
+ }
2475
+ .dataset-panel-body {
2476
+ padding: 0 14px 12px;
2307
2477
  display: flex;
2308
2478
  flex-direction: column;
2309
- gap: 6px;
2310
- padding: 2px 0;
2311
- scrollbar-width: thin;
2479
+ gap: 10px;
2312
2480
  }
2313
- .script-chat-msg {
2314
- font-size: 11.5px;
2315
- line-height: 1.45;
2481
+ .dataset-list {
2482
+ display: flex;
2483
+ flex-direction: column;
2484
+ gap: 4px;
2316
2485
  }
2317
- .script-chat-msg-role {
2318
- font-size: 10px;
2319
- font-weight: 700;
2486
+ .dataset-list-label {
2487
+ font-size: 10.5px;
2488
+ font-weight: 600;
2489
+ color: var(--text-muted, #888);
2320
2490
  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;
2491
+ letter-spacing: 0.4px;
2492
+ margin-bottom: 2px;
2336
2493
  }
2337
- .script-chat-input-row {
2494
+ .dataset-list-item {
2338
2495
  display: flex;
2339
- gap: 4px;
2496
+ align-items: center;
2497
+ gap: 8px;
2498
+ padding: 5px 8px;
2499
+ background: var(--toolbar-hover, rgba(255,255,255,0.04));
2500
+ border-radius: 5px;
2501
+ border: 1px solid var(--border, #333);
2340
2502
  }
2341
- .script-chat-input {
2503
+ .dataset-list-item-info {
2342
2504
  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;
2505
+ display: flex;
2506
+ flex-direction: column;
2507
+ gap: 1px;
2508
+ min-width: 0;
2351
2509
  }
2352
- .script-chat-input:focus {
2353
- border-color: var(--accent, #42a5f5);
2510
+ .dataset-list-item-name {
2511
+ font-size: 12px;
2512
+ font-weight: 600;
2513
+ color: var(--text, #e0e0e0);
2514
+ white-space: nowrap;
2515
+ overflow: hidden;
2516
+ text-overflow: ellipsis;
2354
2517
  }
2355
- .script-chat-input:disabled {
2356
- opacity: 0.5;
2518
+ .dataset-list-item-meta {
2519
+ font-size: 10.5px;
2520
+ color: var(--text-muted, #888);
2521
+ white-space: nowrap;
2522
+ overflow: hidden;
2523
+ text-overflow: ellipsis;
2357
2524
  }
2358
- .script-chat-send {
2359
- padding: 4px 10px;
2360
- background: var(--primary);
2361
- color: #fff;
2525
+ .dataset-remove-btn {
2526
+ flex-shrink: 0;
2527
+ display: flex;
2528
+ align-items: center;
2529
+ justify-content: center;
2530
+ width: 20px;
2531
+ height: 20px;
2532
+ background: none;
2362
2533
  border: none;
2363
- border-radius: 4px;
2364
- font-size: 14px;
2365
- font-weight: 700;
2534
+ color: var(--text-muted, #888);
2366
2535
  cursor: pointer;
2367
- line-height: 1;
2536
+ border-radius: 3px;
2537
+ transition: color 0.12s, background 0.12s;
2368
2538
  }
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;
2381
- padding: 4px 0;
2382
- z-index: 1001;
2383
- box-shadow: 0 8px 24px rgba(0,0,0,0.35);
2539
+ .dataset-remove-btn:hover {
2540
+ color: var(--down, #ef5350);
2541
+ background: rgba(239,83,80,0.1);
2384
2542
  }
2385
- .ss-dropdown-item {
2543
+ .dataset-form {
2386
2544
  display: flex;
2387
- align-items: center;
2388
- gap: 8px;
2389
- width: 100%;
2390
- padding: 8px 14px;
2391
- font-size: 13px;
2392
- color: var(--text);
2393
- background: transparent;
2545
+ flex-direction: column;
2546
+ gap: 7px;
2547
+ }
2548
+ .dataset-form-label {
2549
+ font-size: 10.5px;
2550
+ font-weight: 600;
2551
+ color: var(--text-muted, #888);
2552
+ text-transform: uppercase;
2553
+ letter-spacing: 0.4px;
2554
+ }
2555
+ .dataset-name-input {
2556
+ width: 100%;
2557
+ padding: 6px 10px;
2558
+ background: var(--bg, #1a1a1a);
2559
+ color: var(--text, #e0e0e0);
2560
+ border: 1px solid var(--border, #333);
2561
+ border-radius: 5px;
2562
+ font-size: 12px;
2563
+ outline: none;
2564
+ box-sizing: border-box;
2565
+ transition: border-color 0.12s;
2566
+ }
2567
+ .dataset-name-input:focus { border-color: var(--primary, #2196f3); }
2568
+ .dataset-name-input::placeholder { color: var(--text-muted, #888); }
2569
+ .dataset-upload-row {
2570
+ display: flex;
2571
+ align-items: center;
2572
+ gap: 8px;
2573
+ }
2574
+ .dataset-upload-btn {
2575
+ display: inline-flex;
2576
+ align-items: center;
2577
+ gap: 5px;
2578
+ padding: 5px 10px;
2579
+ background: var(--toolbar-hover, rgba(255,255,255,0.06));
2580
+ color: var(--text, #e0e0e0);
2581
+ border: 1px solid var(--border, #333);
2582
+ border-radius: 5px;
2583
+ font-size: 11.5px;
2584
+ font-weight: 500;
2585
+ cursor: pointer;
2586
+ transition: background 0.12s, border-color 0.12s;
2587
+ white-space: nowrap;
2588
+ }
2589
+ .dataset-upload-btn:hover {
2590
+ background: var(--primary, #2196f3);
2591
+ border-color: var(--primary, #2196f3);
2592
+ color: #fff;
2593
+ }
2594
+ .dataset-upload-hint {
2595
+ font-size: 11px;
2596
+ color: var(--text-muted, #888);
2597
+ }
2598
+ .dataset-paste-area {
2599
+ width: 100%;
2600
+ padding: 8px 10px;
2601
+ background: var(--bg, #1a1a1a);
2602
+ color: var(--text, #e0e0e0);
2603
+ border: 1px solid var(--border, #333);
2604
+ border-radius: 5px;
2605
+ font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
2606
+ font-size: 11px;
2607
+ line-height: 1.5;
2608
+ resize: vertical;
2609
+ outline: none;
2610
+ box-sizing: border-box;
2611
+ transition: border-color 0.12s;
2612
+ }
2613
+ .dataset-paste-area:focus { border-color: var(--primary, #2196f3); }
2614
+ .dataset-paste-area::placeholder { color: var(--text-muted, #888); opacity: 0.7; }
2615
+ .dataset-preview {
2616
+ display: flex;
2617
+ align-items: flex-start;
2618
+ gap: 6px;
2619
+ font-size: 11.5px;
2620
+ color: var(--up, #26a69a);
2621
+ line-height: 1.5;
2622
+ }
2623
+ .dataset-error {
2624
+ display: flex;
2625
+ align-items: flex-start;
2626
+ gap: 6px;
2627
+ font-size: 11.5px;
2628
+ color: var(--down, #ef5350);
2629
+ line-height: 1.5;
2630
+ }
2631
+ .dataset-register-btn {
2632
+ display: inline-flex;
2633
+ align-items: center;
2634
+ justify-content: center;
2635
+ padding: 6px 14px;
2636
+ background: var(--primary, #2196f3);
2637
+ color: #fff;
2638
+ border: none;
2639
+ border-radius: 5px;
2640
+ font-size: 12.5px;
2641
+ font-weight: 600;
2642
+ cursor: pointer;
2643
+ transition: opacity 0.12s;
2644
+ align-self: flex-start;
2645
+ }
2646
+ .dataset-register-btn:hover:not(:disabled) { opacity: 0.85; }
2647
+ .dataset-register-btn:disabled { opacity: 0.35; cursor: default; }
2648
+ .dataset-usage-hint {
2649
+ font-size: 11px;
2650
+ color: var(--text-muted, #888);
2651
+ line-height: 1.6;
2652
+ }
2653
+ .dataset-usage-hint code {
2654
+ background: var(--toolbar-hover, rgba(255,255,255,0.06));
2655
+ border: 1px solid var(--border, #333);
2656
+ border-radius: 3px;
2657
+ padding: 1px 5px;
2658
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
2659
+ font-size: 10.5px;
2660
+ color: var(--primary, #2196f3);
2661
+ }
2662
+
2663
+ .script-chat-section {
2664
+ border-top: 1px solid var(--border, #333);
2665
+ padding: 6px 10px 8px;
2666
+ display: flex;
2667
+ flex-direction: column;
2668
+ gap: 4px;
2669
+ flex-shrink: 0;
2670
+ }
2671
+ .script-chat-label {
2672
+ display: flex;
2673
+ align-items: center;
2674
+ gap: 5px;
2675
+ font-size: 11px;
2676
+ font-weight: 600;
2677
+ color: var(--text-muted, #888);
2678
+ text-transform: uppercase;
2679
+ letter-spacing: 0.3px;
2680
+ margin-bottom: 2px;
2681
+ }
2682
+ .script-chat-history {
2683
+ max-height: 180px;
2684
+ overflow-y: auto;
2685
+ display: flex;
2686
+ flex-direction: column;
2687
+ gap: 6px;
2688
+ padding: 2px 0;
2689
+ scrollbar-width: thin;
2690
+ }
2691
+ .script-chat-msg {
2692
+ font-size: 11.5px;
2693
+ line-height: 1.45;
2694
+ }
2695
+ .script-chat-msg-role {
2696
+ font-size: 10px;
2697
+ font-weight: 700;
2698
+ text-transform: uppercase;
2699
+ letter-spacing: 0.3px;
2700
+ margin-bottom: 1px;
2701
+ }
2702
+ .script-chat-user .script-chat-msg-role { color: var(--accent, #42a5f5); }
2703
+ .script-chat-assistant .script-chat-msg-role { color: var(--up, #26a69a); }
2704
+ .script-chat-msg-body {
2705
+ color: var(--text, #ccc);
2706
+ white-space: pre-wrap;
2707
+ word-break: break-word;
2708
+ }
2709
+ .script-chat-code-applied {
2710
+ margin-top: 3px;
2711
+ font-size: 10px;
2712
+ color: var(--up, #26a69a);
2713
+ font-style: italic;
2714
+ }
2715
+ .script-chat-input-row {
2716
+ display: flex;
2717
+ gap: 4px;
2718
+ }
2719
+ .script-chat-input {
2720
+ flex: 1;
2721
+ background: var(--bg-secondary);
2722
+ border: 1px solid var(--border);
2723
+ border-radius: 4px;
2724
+ color: var(--text);
2725
+ padding: 5px 8px;
2726
+ font-size: 12px;
2727
+ font-family: inherit;
2728
+ outline: none;
2729
+ }
2730
+ .script-chat-input:focus {
2731
+ border-color: var(--accent, #42a5f5);
2732
+ }
2733
+ .script-chat-input:disabled {
2734
+ opacity: 0.5;
2735
+ }
2736
+ .script-chat-send {
2737
+ padding: 4px 10px;
2738
+ background: var(--primary);
2739
+ color: #fff;
2740
+ border: none;
2741
+ border-radius: 4px;
2742
+ font-size: 14px;
2743
+ font-weight: 700;
2744
+ cursor: pointer;
2745
+ line-height: 1;
2746
+ }
2747
+ .script-chat-send:hover:not(:disabled) { opacity: 0.85; }
2748
+ .script-chat-send:disabled { opacity: 0.4; cursor: default; }
2749
+
2750
+ /* ── Screenshot dropdown ─────────────────────────────────────────────────── */
2751
+ .ss-dropdown {
2752
+ position: absolute;
2753
+ top: calc(100% + 6px);
2754
+ right: 0;
2755
+ min-width: 170px;
2756
+ background: var(--toolbar-bg);
2757
+ border: 1px solid var(--border);
2758
+ border-radius: 8px;
2759
+ padding: 4px 0;
2760
+ z-index: 1001;
2761
+ box-shadow: 0 8px 24px rgba(0,0,0,0.35);
2762
+ }
2763
+ .ss-dropdown-item {
2764
+ display: flex;
2765
+ align-items: center;
2766
+ gap: 8px;
2767
+ width: 100%;
2768
+ padding: 8px 14px;
2769
+ font-size: 13px;
2770
+ color: var(--text);
2771
+ background: transparent;
2394
2772
  border: none;
2395
2773
  cursor: pointer;
2396
2774
  text-align: left;
@@ -2627,6 +3005,46 @@ select {
2627
3005
  font-family: monospace;
2628
3006
  min-width: 56px;
2629
3007
  }
3008
+ .csettings-range-wrap {
3009
+ display: flex;
3010
+ align-items: center;
3011
+ gap: 10px;
3012
+ }
3013
+ .csettings-range-input {
3014
+ -webkit-appearance: none;
3015
+ appearance: none;
3016
+ width: 120px;
3017
+ height: 4px;
3018
+ border-radius: 2px;
3019
+ background: var(--border, #333);
3020
+ outline: none;
3021
+ cursor: pointer;
3022
+ }
3023
+ .csettings-range-input::-webkit-slider-thumb {
3024
+ -webkit-appearance: none;
3025
+ appearance: none;
3026
+ width: 14px;
3027
+ height: 14px;
3028
+ border-radius: 50%;
3029
+ background: var(--primary, #2196f3);
3030
+ border: none;
3031
+ cursor: pointer;
3032
+ }
3033
+ .csettings-range-input::-moz-range-thumb {
3034
+ width: 14px;
3035
+ height: 14px;
3036
+ border-radius: 50%;
3037
+ background: var(--primary, #2196f3);
3038
+ border: none;
3039
+ cursor: pointer;
3040
+ }
3041
+ .csettings-range-value {
3042
+ font-size: 12px;
3043
+ color: var(--text-muted, #888);
3044
+ font-family: monospace;
3045
+ min-width: 36px;
3046
+ text-align: right;
3047
+ }
2630
3048
  .csettings-toggle {
2631
3049
  position: relative;
2632
3050
  display: inline-flex;
@@ -2666,22 +3084,68 @@ select {
2666
3084
  transform: translateX(16px);
2667
3085
  background: #fff;
2668
3086
  }
2669
- .csettings-footer {
3087
+
3088
+ /* ── Symbol section additions ─────────────── */
3089
+ .csettings-group-title {
3090
+ font-size: 11px;
3091
+ font-weight: 600;
3092
+ text-transform: uppercase;
3093
+ letter-spacing: 0.5px;
3094
+ color: var(--text-muted, #888);
3095
+ padding-bottom: 4px;
3096
+ margin-bottom: 4px;
3097
+ border-bottom: 1px solid var(--border);
3098
+ }
3099
+ .csettings-color-pair {
2670
3100
  display: flex;
2671
3101
  align-items: center;
2672
- justify-content: flex-end;
2673
- gap: 8px;
2674
- padding: 12px 18px;
2675
- border-top: 1px solid var(--border);
2676
- flex-shrink: 0;
3102
+ gap: 6px;
2677
3103
  }
2678
- .csettings-btn {
2679
- padding: 6px 18px;
2680
- border-radius: 6px;
3104
+ .csettings-inline-check {
3105
+ display: inline-flex;
3106
+ align-items: center;
3107
+ gap: 6px;
3108
+ cursor: pointer;
2681
3109
  font-size: 13px;
2682
- font-family: inherit;
3110
+ color: var(--text, #e0e0e0);
3111
+ }
3112
+ .csettings-inline-check input[type="checkbox"] {
3113
+ width: 14px;
3114
+ height: 14px;
3115
+ accent-color: var(--primary, #2196f3);
2683
3116
  cursor: pointer;
2684
- transition: background 0.15s, border-color 0.15s;
3117
+ }
3118
+ .csettings-select {
3119
+ padding: 4px 8px;
3120
+ font-size: 13px;
3121
+ font-family: inherit;
3122
+ border: 1px solid var(--border);
3123
+ border-radius: 4px;
3124
+ background: var(--bg-surface, #1e1e1e);
3125
+ color: var(--text, #e0e0e0);
3126
+ cursor: pointer;
3127
+ min-width: 120px;
3128
+ }
3129
+ .csettings-select:focus {
3130
+ outline: none;
3131
+ border-color: var(--primary, #2196f3);
3132
+ }
3133
+
3134
+ .csettings-footer {
3135
+ display: flex;
3136
+ align-items: center;
3137
+ justify-content: space-between;
3138
+ padding: 12px 18px;
3139
+ border-top: 1px solid var(--border);
3140
+ flex-shrink: 0;
3141
+ }
3142
+ .csettings-btn {
3143
+ padding: 6px 18px;
3144
+ border-radius: 6px;
3145
+ font-size: 13px;
3146
+ font-family: inherit;
3147
+ cursor: pointer;
3148
+ transition: background 0.15s, border-color 0.15s;
2685
3149
  }
2686
3150
  .csettings-btn--ghost {
2687
3151
  background: none;
@@ -2702,6 +3166,147 @@ select {
2702
3166
  background: #1976d2;
2703
3167
  }
2704
3168
 
3169
+ /* ── Template dropdown ─────────────────────────────────────── */
3170
+ .csettings-template-area {
3171
+ position: relative;
3172
+ }
3173
+ .csettings-template-btn {
3174
+ display: flex;
3175
+ align-items: center;
3176
+ gap: 4px;
3177
+ padding: 5px 10px;
3178
+ background: none;
3179
+ border: 1px solid var(--border);
3180
+ border-radius: 4px;
3181
+ color: var(--text-muted, #888);
3182
+ font-size: 13px;
3183
+ font-family: inherit;
3184
+ cursor: pointer;
3185
+ transition: border-color 0.15s, color 0.15s;
3186
+ }
3187
+ .csettings-template-btn:hover {
3188
+ border-color: var(--text-muted);
3189
+ color: var(--text, #fff);
3190
+ }
3191
+ .csettings-template-caret {
3192
+ font-size: 10px;
3193
+ margin-left: 2px;
3194
+ }
3195
+ .csettings-template-menu {
3196
+ position: absolute;
3197
+ bottom: calc(100% + 6px);
3198
+ left: 0;
3199
+ min-width: 200px;
3200
+ background: var(--bg-elevated, #23262b);
3201
+ border: 1px solid var(--border);
3202
+ border-radius: 6px;
3203
+ box-shadow: 0 4px 16px rgba(0,0,0,0.35);
3204
+ z-index: 100;
3205
+ padding: 4px 0;
3206
+ }
3207
+ .csettings-template-menu-item {
3208
+ display: block;
3209
+ width: 100%;
3210
+ padding: 7px 14px;
3211
+ background: none;
3212
+ border: none;
3213
+ color: var(--text, #fff);
3214
+ font-size: 13px;
3215
+ font-family: inherit;
3216
+ text-align: left;
3217
+ cursor: pointer;
3218
+ }
3219
+ .csettings-template-menu-item:hover {
3220
+ background: var(--hover-bg, rgba(255,255,255,0.06));
3221
+ }
3222
+ .csettings-template-divider {
3223
+ height: 1px;
3224
+ background: var(--border);
3225
+ margin: 4px 0;
3226
+ }
3227
+ .csettings-template-menu-row {
3228
+ display: flex;
3229
+ align-items: center;
3230
+ justify-content: space-between;
3231
+ padding: 0 4px 0 0;
3232
+ }
3233
+ .csettings-template-menu-row .csettings-template-menu-item {
3234
+ flex: 1;
3235
+ min-width: 0;
3236
+ overflow: hidden;
3237
+ text-overflow: ellipsis;
3238
+ white-space: nowrap;
3239
+ }
3240
+ .csettings-template-menu-delete {
3241
+ flex-shrink: 0;
3242
+ display: flex;
3243
+ align-items: center;
3244
+ justify-content: center;
3245
+ width: 24px;
3246
+ height: 24px;
3247
+ background: none;
3248
+ border: none;
3249
+ border-radius: 4px;
3250
+ color: var(--text-muted, #888);
3251
+ font-size: 14px;
3252
+ cursor: pointer;
3253
+ }
3254
+ .csettings-template-menu-delete:hover {
3255
+ background: var(--hover-bg, rgba(255,255,255,0.06));
3256
+ color: #e53935;
3257
+ }
3258
+ .csettings-footer-actions {
3259
+ display: flex;
3260
+ align-items: center;
3261
+ gap: 8px;
3262
+ }
3263
+
3264
+ /* ── Save template dialog ──────────────────────────────────── */
3265
+ .csettings-save-backdrop {
3266
+ position: fixed;
3267
+ inset: 0;
3268
+ background: rgba(0,0,0,0.45);
3269
+ display: flex;
3270
+ align-items: center;
3271
+ justify-content: center;
3272
+ z-index: 10100;
3273
+ }
3274
+ .csettings-save-dialog {
3275
+ background: var(--bg-elevated, #23262b);
3276
+ border: 1px solid var(--border);
3277
+ border-radius: 8px;
3278
+ padding: 20px 24px;
3279
+ min-width: 320px;
3280
+ box-shadow: 0 8px 32px rgba(0,0,0,0.45);
3281
+ }
3282
+ .csettings-save-title {
3283
+ font-size: 15px;
3284
+ font-weight: 600;
3285
+ color: var(--text, #fff);
3286
+ margin-bottom: 14px;
3287
+ }
3288
+ .csettings-save-input {
3289
+ width: 100%;
3290
+ padding: 7px 10px;
3291
+ border: 1px solid var(--border);
3292
+ border-radius: 4px;
3293
+ background: var(--bg, #181a1e);
3294
+ color: var(--text, #fff);
3295
+ font-size: 13px;
3296
+ font-family: inherit;
3297
+ outline: none;
3298
+ margin-bottom: 16px;
3299
+ box-sizing: border-box;
3300
+ }
3301
+ .csettings-save-input:focus {
3302
+ border-color: var(--primary, #2196f3);
3303
+ }
3304
+ .csettings-save-actions {
3305
+ display: flex;
3306
+ justify-content: flex-end;
3307
+ gap: 8px;
3308
+ }
3309
+
2705
3310
  [data-theme="light"] .chart-ctx-menu,
2706
3311
  [data-theme="light"] .csettings-dialog {
2707
3312
  border-color: var(--border);
@@ -2710,9 +3315,30 @@ select {
2710
3315
  [data-theme="light"] .csettings-nav-item.is-active {
2711
3316
  background: var(--primary-bg);
2712
3317
  }
3318
+ [data-theme="light"] .csettings-select {
3319
+ background: #ffffff;
3320
+ color: #1a1a1a;
3321
+ border-color: #ccc;
3322
+ }
3323
+ [data-theme="light"] .csettings-save-input {
3324
+ background: #ffffff;
3325
+ color: #1a1a1a;
3326
+ border-color: #ccc;
3327
+ }
3328
+ [data-theme="light"] .csettings-save-dialog {
3329
+ background: #ffffff;
3330
+ border-color: #ddd;
3331
+ }
3332
+ [data-theme="light"] .csettings-template-menu {
3333
+ background: #ffffff;
3334
+ border-color: #ddd;
3335
+ }
3336
+ [data-theme="light"] .csettings-range-input {
3337
+ background: #ddd;
3338
+ }
2713
3339
 
2714
3340
 
2715
- /* ── Watchlist Drawer ────────────────────────────────────────────────────────── */
3341
+ /* Watchlist Drawer */
2716
3342
  :root {
2717
3343
  --wl-up: #26a641;
2718
3344
  --wl-down: #f85149;
@@ -3415,6 +4041,46 @@ select {
3415
4041
  padding: 16px 20px 24px;
3416
4042
  }
3417
4043
 
4044
+ /* Rithmic branding block at top of connect form */
4045
+ .bcf-rithmic-brand {
4046
+ display: flex;
4047
+ flex-direction: column;
4048
+ align-items: center;
4049
+ gap: 8px;
4050
+ padding: 16px 0 20px;
4051
+ border-bottom: 1px solid var(--border);
4052
+ margin-bottom: 20px;
4053
+ text-align: center;
4054
+ }
4055
+ .bcf-rithmic-logo {
4056
+ height: 40px;
4057
+ display: flex;
4058
+ align-items: center;
4059
+ justify-content: center;
4060
+ }
4061
+ .bcf-rithmic-logo img {
4062
+ max-height: 40px;
4063
+ max-width: 160px;
4064
+ object-fit: contain;
4065
+ }
4066
+ .bcf-rithmic-logo-fallback {
4067
+ font-size: 13px;
4068
+ font-weight: 600;
4069
+ color: var(--text-muted);
4070
+ letter-spacing: 0.02em;
4071
+ }
4072
+ /* Hide fallback text when the image loads successfully */
4073
+ .bcf-rithmic-logo img + .bcf-rithmic-logo-fallback {
4074
+ display: none;
4075
+ }
4076
+ .bcf-rithmic-copyright {
4077
+ font-size: 10px;
4078
+ color: var(--text-muted);
4079
+ opacity: 0.7;
4080
+ margin: 0;
4081
+ line-height: 1.4;
4082
+ }
4083
+
3418
4084
  .bcf-section-label {
3419
4085
  font-size: 10px;
3420
4086
  font-weight: 700;
@@ -4061,6 +4727,107 @@ select {
4061
4727
  border-radius: 5px;
4062
4728
  cursor: pointer;
4063
4729
  }
4730
+
4731
+ /* ─── ContractSwitchDialog ────────────────────────────────────────────────── */
4732
+
4733
+ .cswitch-backdrop {
4734
+ position: fixed;
4735
+ inset: 0;
4736
+ z-index: 10001;
4737
+ }
4738
+ .cswitch-popup {
4739
+ position: fixed;
4740
+ background: var(--toolbar-bg, #141414);
4741
+ border: 1px solid var(--border);
4742
+ border-radius: 10px;
4743
+ box-shadow: var(--shadow-dialog);
4744
+ min-width: 320px;
4745
+ max-width: 420px;
4746
+ width: max-content;
4747
+ transform: translate(-50%, -100%) translateY(-12px);
4748
+ overflow: visible;
4749
+ }
4750
+ .cswitch-header {
4751
+ display: flex;
4752
+ align-items: center;
4753
+ gap: 8px;
4754
+ padding: 10px 14px;
4755
+ border-bottom: 1px solid var(--border);
4756
+ }
4757
+ .cswitch-title {
4758
+ font-size: 13px;
4759
+ font-weight: 600;
4760
+ color: #00BCD4;
4761
+ }
4762
+ .cswitch-date {
4763
+ font-size: 11px;
4764
+ color: var(--text-muted, #888);
4765
+ margin-left: auto;
4766
+ }
4767
+ .cswitch-close {
4768
+ background: none;
4769
+ border: none;
4770
+ color: var(--text-muted, #888);
4771
+ font-size: 14px;
4772
+ cursor: pointer;
4773
+ padding: 2px 4px;
4774
+ border-radius: 4px;
4775
+ line-height: 1;
4776
+ margin-left: 4px;
4777
+ }
4778
+ .cswitch-close:hover {
4779
+ color: var(--text, #fff);
4780
+ background: var(--toolbar-hover);
4781
+ }
4782
+ .cswitch-body {
4783
+ display: flex;
4784
+ align-items: stretch;
4785
+ padding: 10px;
4786
+ gap: 8px;
4787
+ }
4788
+ .cswitch-contract {
4789
+ flex: 1;
4790
+ display: flex;
4791
+ flex-direction: column;
4792
+ align-items: center;
4793
+ gap: 4px;
4794
+ padding: 10px 8px;
4795
+ background: var(--bg, #0a0a0a);
4796
+ border: 1px solid var(--border);
4797
+ border-radius: 8px;
4798
+ cursor: pointer;
4799
+ transition: border-color 0.15s, background 0.15s;
4800
+ color: inherit;
4801
+ font-family: inherit;
4802
+ }
4803
+ .cswitch-contract:hover {
4804
+ border-color: #00BCD4;
4805
+ background: rgba(0,188,212,0.08);
4806
+ }
4807
+ .cswitch-direction {
4808
+ font-size: 10px;
4809
+ text-transform: uppercase;
4810
+ letter-spacing: 0.05em;
4811
+ color: var(--text-muted, #888);
4812
+ }
4813
+ .cswitch-symbol {
4814
+ font-size: 14px;
4815
+ font-weight: 600;
4816
+ color: var(--text, #fff);
4817
+ white-space: nowrap;
4818
+ }
4819
+ .cswitch-label {
4820
+ font-size: 11px;
4821
+ color: var(--text-muted, #888);
4822
+ }
4823
+ .cswitch-arrow {
4824
+ display: flex;
4825
+ align-items: center;
4826
+ font-size: 16px;
4827
+ color: #00BCD4;
4828
+ flex-shrink: 0;
4829
+ }
4830
+
4064
4831
  .oep-preset-cancel-btn:hover {
4065
4832
  color: var(--text);
4066
4833
  border-color: var(--text-muted);
@@ -4082,8 +4849,16 @@ select {
4082
4849
  font-weight: 500;
4083
4850
  border-radius: 6px;
4084
4851
  cursor: pointer;
4085
- transition: background 0.12s, border-color 0.12s, color 0.12s;
4852
+ transition: background 0.12s, border-color 0.12s, color 0.12s, transform 0.08s;
4086
4853
  white-space: nowrap;
4854
+ user-select: none;
4855
+ }
4856
+ .oep-pos-btn:active:not(:disabled) {
4857
+ transform: scale(0.95);
4858
+ }
4859
+ .oep-pos-btn:focus-visible {
4860
+ outline: 2px solid rgba(100, 149, 237, 0.7);
4861
+ outline-offset: 1px;
4087
4862
  }
4088
4863
  .oep-pos-btn:disabled {
4089
4864
  opacity: 0.38;
@@ -4111,6 +4886,10 @@ select {
4111
4886
  background: rgba(239, 83, 80, 0.14);
4112
4887
  border-color: #ef5350;
4113
4888
  }
4889
+ .oep-pos-btn--close:active:not(:disabled) {
4890
+ background: rgba(239, 83, 80, 0.25);
4891
+ border-color: #e53935;
4892
+ }
4114
4893
  .oep-pos-btn--cancel {
4115
4894
  color: var(--text-muted);
4116
4895
  background: var(--shelf-bg);
@@ -4121,6 +4900,11 @@ select {
4121
4900
  border-color: rgba(239, 83, 80, 0.5);
4122
4901
  background: rgba(239, 83, 80, 0.06);
4123
4902
  }
4903
+ .oep-pos-btn--cancel:active:not(:disabled) {
4904
+ color: #e53935;
4905
+ background: rgba(239, 83, 80, 0.16);
4906
+ border-color: #ef5350;
4907
+ }
4124
4908
  .oep-pos-btn--reverse {
4125
4909
  color: var(--text-muted);
4126
4910
  background: var(--shelf-bg);
@@ -4131,6 +4915,11 @@ select {
4131
4915
  border-color: var(--text-muted);
4132
4916
  background: rgba(128, 128, 128, 0.08);
4133
4917
  }
4918
+ .oep-pos-btn--reverse:active:not(:disabled) {
4919
+ color: var(--text);
4920
+ background: rgba(128, 128, 128, 0.18);
4921
+ border-color: var(--text);
4922
+ }
4134
4923
  .oep-pos-btn--flatten {
4135
4924
  color: var(--text-muted);
4136
4925
  background: var(--shelf-bg);
@@ -4141,3 +4930,1041 @@ select {
4141
4930
  border-color: var(--text-muted);
4142
4931
  background: rgba(128, 128, 128, 0.08);
4143
4932
  }
4933
+ .oep-pos-btn--flatten:active:not(:disabled) {
4934
+ color: var(--text);
4935
+ background: rgba(128, 128, 128, 0.18);
4936
+ border-color: var(--text);
4937
+ }
4938
+
4939
+ /* ─── Order Entry Footer (trading panel toggle) ─────────────────────────── */
4940
+
4941
+ .oep-footer {
4942
+ padding: 6px 10px 8px;
4943
+ border-top: 1px solid var(--border);
4944
+ display: flex;
4945
+ align-items: center;
4946
+ justify-content: center;
4947
+ }
4948
+
4949
+ .oep-footer-btn {
4950
+ display: inline-flex;
4951
+ align-items: center;
4952
+ gap: 5px;
4953
+ padding: 4px 10px;
4954
+ border: none;
4955
+ border-radius: 4px;
4956
+ background: transparent;
4957
+ color: var(--text-muted);
4958
+ font-size: 11px;
4959
+ cursor: pointer;
4960
+ transition: color 0.12s, background 0.12s;
4961
+ white-space: nowrap;
4962
+ }
4963
+
4964
+ .oep-footer-btn:hover {
4965
+ color: var(--text);
4966
+ background: rgba(255, 255, 255, 0.06);
4967
+ }
4968
+
4969
+ .oep-footer-btn.active {
4970
+ color: var(--accent, #2962ff);
4971
+ background: rgba(41, 98, 255, 0.1);
4972
+ }
4973
+
4974
+ .oep-footer-btn--help {
4975
+ margin-left: auto;
4976
+ color: var(--text-muted);
4977
+ }
4978
+
4979
+ .oep-footer-btn--help:hover {
4980
+ color: var(--primary, #2196f3);
4981
+ background: rgba(33, 150, 243, 0.08);
4982
+ }
4983
+
4984
+ /* ─── Position Properties Dialog ────────────────────────────────────────── */
4985
+
4986
+ .pos-dialog-backdrop {
4987
+ position: fixed;
4988
+ inset: 0;
4989
+ z-index: 9999;
4990
+ background: rgba(0, 0, 0, 0.5);
4991
+ display: flex;
4992
+ align-items: center;
4993
+ justify-content: center;
4994
+ }
4995
+ .pos-dialog {
4996
+ background: #1e222d;
4997
+ border: 1px solid #363a45;
4998
+ border-radius: 8px;
4999
+ width: 320px;
5000
+ max-height: 90vh;
5001
+ display: flex;
5002
+ flex-direction: column;
5003
+ color: #d1d4dc;
5004
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
5005
+ font-size: 13px;
5006
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
5007
+ }
5008
+ .pos-dialog-header {
5009
+ display: flex;
5010
+ align-items: center;
5011
+ justify-content: space-between;
5012
+ padding: 12px 16px;
5013
+ border-bottom: 1px solid #363a45;
5014
+ }
5015
+ .pos-dialog-title {
5016
+ font-size: 15px;
5017
+ font-weight: 600;
5018
+ color: #fff;
5019
+ }
5020
+ .pos-dialog-close {
5021
+ background: none;
5022
+ border: none;
5023
+ color: #787b86;
5024
+ font-size: 16px;
5025
+ cursor: pointer;
5026
+ padding: 2px 6px;
5027
+ border-radius: 4px;
5028
+ }
5029
+ .pos-dialog-close:hover {
5030
+ color: #d1d4dc;
5031
+ background: rgba(255, 255, 255, 0.06);
5032
+ }
5033
+ .pos-dialog-tabs {
5034
+ display: flex;
5035
+ gap: 0;
5036
+ border-bottom: 1px solid #363a45;
5037
+ padding: 0 16px;
5038
+ }
5039
+ .pos-dialog-tab {
5040
+ background: none;
5041
+ border: none;
5042
+ color: #787b86;
5043
+ font-size: 13px;
5044
+ padding: 8px 12px;
5045
+ cursor: pointer;
5046
+ border-bottom: 2px solid transparent;
5047
+ margin-bottom: -1px;
5048
+ }
5049
+ .pos-dialog-tab.is-active {
5050
+ color: #2196f3;
5051
+ border-bottom-color: #2196f3;
5052
+ }
5053
+ .pos-dialog-body {
5054
+ padding: 12px 16px;
5055
+ overflow-y: auto;
5056
+ flex: 1;
5057
+ }
5058
+ .pos-dialog-row {
5059
+ display: flex;
5060
+ align-items: center;
5061
+ justify-content: space-between;
5062
+ margin-bottom: 8px;
5063
+ }
5064
+ .pos-dialog-label {
5065
+ flex-shrink: 0;
5066
+ color: #787b86;
5067
+ font-size: 12px;
5068
+ min-width: 90px;
5069
+ }
5070
+ .pos-dialog-inputs {
5071
+ display: flex;
5072
+ align-items: center;
5073
+ gap: 6px;
5074
+ flex: 1;
5075
+ justify-content: flex-end;
5076
+ }
5077
+ .pos-dialog-input {
5078
+ width: 100px;
5079
+ background: #131722;
5080
+ border: 1px solid #363a45;
5081
+ border-radius: 4px;
5082
+ color: #d1d4dc;
5083
+ font-size: 13px;
5084
+ padding: 4px 8px;
5085
+ text-align: right;
5086
+ outline: none;
5087
+ }
5088
+ .pos-dialog-input:focus {
5089
+ border-color: #2196f3;
5090
+ }
5091
+ .pos-dialog-select {
5092
+ background: #131722;
5093
+ border: 1px solid #363a45;
5094
+ border-radius: 4px;
5095
+ color: #d1d4dc;
5096
+ font-size: 12px;
5097
+ padding: 4px 6px;
5098
+ outline: none;
5099
+ cursor: pointer;
5100
+ }
5101
+ .pos-dialog-select:focus {
5102
+ border-color: #2196f3;
5103
+ }
5104
+ .pos-dialog-section-label {
5105
+ color: #787b86;
5106
+ font-size: 11px;
5107
+ font-weight: 600;
5108
+ letter-spacing: 0.5px;
5109
+ text-transform: uppercase;
5110
+ margin: 12px 0 6px;
5111
+ padding-top: 8px;
5112
+ border-top: 1px solid #2a2e39;
5113
+ }
5114
+ .pos-dialog-summary {
5115
+ margin-top: 12px;
5116
+ padding-top: 8px;
5117
+ border-top: 1px solid #2a2e39;
5118
+ }
5119
+ .pos-dialog-summary-row {
5120
+ display: flex;
5121
+ justify-content: space-between;
5122
+ font-size: 12px;
5123
+ color: #787b86;
5124
+ margin-bottom: 4px;
5125
+ }
5126
+ .pos-dialog-summary-val {
5127
+ color: #d1d4dc;
5128
+ }
5129
+ .pos-dialog-profit {
5130
+ color: #26a69a;
5131
+ }
5132
+ .pos-dialog-profit .pos-dialog-summary-val {
5133
+ color: #26a69a;
5134
+ }
5135
+ .pos-dialog-loss {
5136
+ color: #ef5350;
5137
+ }
5138
+ .pos-dialog-loss .pos-dialog-summary-val {
5139
+ color: #ef5350;
5140
+ }
5141
+ .pos-dialog-footer {
5142
+ display: flex;
5143
+ justify-content: flex-end;
5144
+ gap: 8px;
5145
+ padding: 12px 16px;
5146
+ border-top: 1px solid #363a45;
5147
+ }
5148
+ .pos-dialog-btn {
5149
+ border: none;
5150
+ border-radius: 4px;
5151
+ padding: 6px 16px;
5152
+ font-size: 13px;
5153
+ cursor: pointer;
5154
+ }
5155
+ .pos-dialog-btn--ghost {
5156
+ background: transparent;
5157
+ color: #787b86;
5158
+ }
5159
+ .pos-dialog-btn--ghost:hover {
5160
+ color: #d1d4dc;
5161
+ background: rgba(255, 255, 255, 0.06);
5162
+ }
5163
+ .pos-dialog-btn--primary {
5164
+ background: #2196f3;
5165
+ color: #fff;
5166
+ }
5167
+ .pos-dialog-btn--primary:hover {
5168
+ background: #1e88e5;
5169
+ }
5170
+
5171
+ /* -- Drawing Properties Dialog ------------------------------------------------ */
5172
+ .dprop-backdrop {
5173
+ position: fixed;
5174
+ inset: 0;
5175
+ z-index: 9999;
5176
+ background: rgba(0, 0, 0, 0.5);
5177
+ display: flex;
5178
+ align-items: center;
5179
+ justify-content: center;
5180
+ }
5181
+ .dprop-dialog {
5182
+ background: #1e222d;
5183
+ border: 1px solid #363a45;
5184
+ border-radius: 8px;
5185
+ width: 320px;
5186
+ max-height: 90vh;
5187
+ display: flex;
5188
+ flex-direction: column;
5189
+ color: #d1d4dc;
5190
+ font-size: 13px;
5191
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
5192
+ outline: none;
5193
+ }
5194
+ .dprop-header {
5195
+ display: flex;
5196
+ align-items: center;
5197
+ justify-content: space-between;
5198
+ padding: 12px 16px;
5199
+ border-bottom: 1px solid #363a45;
5200
+ }
5201
+ .dprop-title { font-size: 15px; font-weight: 600; color: #fff; }
5202
+ .dprop-close {
5203
+ background: none; border: none; color: #787b86;
5204
+ font-size: 16px; cursor: pointer; padding: 2px 6px; border-radius: 4px;
5205
+ }
5206
+ .dprop-close:hover { color: #d1d4dc; background: rgba(255,255,255,0.06); }
5207
+ .dprop-tabs {
5208
+ display: flex; border-bottom: 1px solid #363a45; padding: 0 16px;
5209
+ }
5210
+ .dprop-tab {
5211
+ background: none; border: none; color: #787b86; font-size: 13px;
5212
+ padding: 8px 12px; cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px;
5213
+ }
5214
+ .dprop-tab.is-active { color: #2196f3; border-bottom-color: #2196f3; }
5215
+ .dprop-body { padding: 12px 16px; overflow-y: auto; flex: 1; }
5216
+ .dprop-section-label {
5217
+ color: #787b86; font-size: 11px; font-weight: 600; letter-spacing: 0.5px;
5218
+ text-transform: uppercase; margin: 12px 0 6px; padding-top: 8px; border-top: 1px solid #2a2e39;
5219
+ }
5220
+ .dprop-section-label:first-child { margin-top: 0; padding-top: 0; border-top: none; }
5221
+ .dprop-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
5222
+ .dprop-label { flex-shrink: 0; color: #787b86; font-size: 12px; min-width: 80px; }
5223
+ .dprop-inputs { display: flex; align-items: center; gap: 8px; flex: 1; justify-content: flex-end; }
5224
+ .dprop-color {
5225
+ width: 28px; height: 24px; border: 1px solid #363a45;
5226
+ border-radius: 4px; padding: 1px; background: #131722; cursor: pointer;
5227
+ }
5228
+ .dprop-color-val { font-size: 11px; color: #787b86; font-family: monospace; min-width: 60px; }
5229
+ .dprop-range { flex: 1; accent-color: #2196f3; cursor: pointer; }
5230
+ .dprop-range-val { font-size: 12px; color: #d1d4dc; min-width: 32px; text-align: right; }
5231
+ .dprop-input {
5232
+ width: 90px; background: #131722; border: 1px solid #363a45;
5233
+ border-radius: 4px; color: #d1d4dc; font-size: 13px; padding: 4px 8px;
5234
+ text-align: right; outline: none;
5235
+ }
5236
+ .dprop-input--wide { width: 140px; }
5237
+ .dprop-input:focus { border-color: #2196f3; }
5238
+ .dprop-unit { font-size: 12px; color: #787b86; min-width: 16px; }
5239
+ .dprop-time-label { font-size: 11px; color: #787b86; text-align: right; }
5240
+ .dprop-text-area-wrap { margin-bottom: 8px; }
5241
+ .dprop-textarea {
5242
+ width: 100%; background: #131722; border: 1px solid #363a45;
5243
+ border-radius: 4px; color: #d1d4dc; font-size: 13px; font-family: inherit;
5244
+ padding: 8px; resize: vertical; outline: none; box-sizing: border-box;
5245
+ }
5246
+ .dprop-textarea:focus { border-color: #2196f3; }
5247
+ .dprop-footer {
5248
+ display: flex; justify-content: flex-end; gap: 8px;
5249
+ padding: 12px 16px; border-top: 1px solid #363a45;
5250
+ }
5251
+ .dprop-btn { border: none; border-radius: 4px; padding: 6px 16px; font-size: 13px; cursor: pointer; }
5252
+ .dprop-btn--ghost { background: transparent; color: #787b86; }
5253
+ .dprop-btn--ghost:hover { color: #d1d4dc; background: rgba(255,255,255,0.06); }
5254
+ .dprop-btn--primary { background: #2196f3; color: #fff; }
5255
+ .dprop-btn--primary:hover { background: #1e88e5; }
5256
+ [data-theme="light"] .dprop-dialog { background: #fff; border-color: #e0e3eb; color: #131722; }
5257
+ [data-theme="light"] .dprop-header { border-bottom-color: #e0e3eb; }
5258
+ [data-theme="light"] .dprop-title { color: #131722; }
5259
+ [data-theme="light"] .dprop-close:hover { background: rgba(0,0,0,0.06); }
5260
+ [data-theme="light"] .dprop-tabs { border-bottom-color: #e0e3eb; }
5261
+ [data-theme="light"] .dprop-section-label { border-top-color: #e0e3eb; }
5262
+ [data-theme="light"] .dprop-color { background: #f0f3fa; border-color: #e0e3eb; }
5263
+ [data-theme="light"] .dprop-input { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5264
+ [data-theme="light"] .dprop-textarea { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5265
+ [data-theme="light"] .dprop-footer { border-top-color: #e0e3eb; }
5266
+ [data-theme="light"] .dprop-btn--ghost:hover { background: rgba(0,0,0,0.06); color: #131722; }
5267
+
5268
+
5269
+ /* Script Manager — Main Tabs */
5270
+ .script-main-tabs { display: flex; flex-shrink: 0; border-bottom: 1px solid #363a45; background: #1a1d29; }
5271
+ .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; }
5272
+ .script-main-tab:hover { color: #d1d4dc; }
5273
+ .script-main-tab.active { color: #2196f3; border-bottom-color: #2196f3; }
5274
+ [data-theme="light"] .script-main-tabs { background: #f8f9fd; border-bottom-color: #e0e3eb; }
5275
+ [data-theme="light"] .script-main-tab { color: #787b86; }
5276
+ [data-theme="light"] .script-main-tab:hover { color: #131722; }
5277
+ [data-theme="light"] .script-main-tab.active { color: #2196f3; }
5278
+
5279
+ /* Dataset Manager Drawer */
5280
+ .dsm-root { display: flex; flex-direction: column; flex: 1; overflow: hidden; }
5281
+ .dsm-header { display: flex; align-items: center; gap: 8px; padding: 10px 14px; border-bottom: 1px solid #363a45; flex-shrink: 0; }
5282
+ .dsm-title { font-size: 13px; font-weight: 600; color: #d1d4dc; flex: 1; }
5283
+ .dsm-back-btn { background: transparent; border: none; color: #787b86; font-size: 12px; cursor: pointer; padding: 2px 6px; border-radius: 4px; }
5284
+ .dsm-back-btn:hover { color: #d1d4dc; background: rgba(255,255,255,0.06); }
5285
+ .dsm-new-btn { background: #2196f3; border: none; color: #fff; font-size: 12px; cursor: pointer; padding: 4px 10px; border-radius: 4px; }
5286
+ .dsm-new-btn:hover { background: #1e88e5; }
5287
+ .dsm-error { padding: 8px 14px; background: rgba(239,83,80,0.12); color: #ef5350; font-size: 12px; }
5288
+ .dsm-empty { padding: 24px 14px; text-align: center; color: #787b86; font-size: 13px; }
5289
+ .dsm-loading { padding: 24px 14px; text-align: center; color: #787b86; font-size: 13px; }
5290
+ .dsm-list { overflow-y: auto; flex: 1; padding: 8px 0; }
5291
+ .dsm-list-item { padding: 10px 14px; border-bottom: 1px solid #2a2d3a; transition: background 0.1s; }
5292
+ .dsm-list-item:hover { background: rgba(255,255,255,0.03); }
5293
+ .dsm-list-item-header { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
5294
+ .dsm-list-item-name { font-size: 13px; font-weight: 600; color: #d1d4dc; flex: 1; }
5295
+ .dsm-status { font-size: 10px; padding: 2px 6px; border-radius: 10px; font-weight: 500; }
5296
+ .dsm-status--ready { background: rgba(38,166,154,0.18); color: #26a69a; }
5297
+ .dsm-status--pending { background: rgba(255,152,0,0.18); color: #ff9800; }
5298
+ .dsm-status--processing { background: rgba(33,150,243,0.18); color: #2196f3; }
5299
+ .dsm-status--failed { background: rgba(239,83,80,0.18); color: #ef5350; }
5300
+ .dsm-list-item-cols { display: flex; flex-wrap: wrap; gap: 4px; margin-bottom: 6px; }
5301
+ .dsm-col-tag { font-size: 10px; padding: 2px 6px; border-radius: 4px; font-family: monospace; }
5302
+ .dsm-col-tag--time { background: rgba(33,150,243,0.18); color: #2196f3; }
5303
+ .dsm-col-tag--number, .dsm-col-tag--percentage, .dsm-col-tag--price { background: rgba(38,166,154,0.18); color: #26a69a; }
5304
+ .dsm-col-tag--integer { background: rgba(102,187,106,0.18); color: #66bb6a; }
5305
+ .dsm-col-tag--text { background: rgba(171,71,188,0.18); color: #ab47bc; }
5306
+ .dsm-col-tag--boolean { background: rgba(255,152,0,0.18); color: #ff9800; }
5307
+ .dsm-col-tag--date, .dsm-col-tag--timestamp { background: rgba(239,83,80,0.18); color: #ef5350; }
5308
+ .dsm-ingest-error { font-size: 11px; color: #ef5350; margin-bottom: 4px; }
5309
+ .dsm-list-item-actions { display: flex; gap: 6px; }
5310
+ .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; }
5311
+ .dsm-action-btn:hover { background: rgba(255,255,255,0.1); }
5312
+ .dsm-action-btn--primary { color: #2196f3; border-color: rgba(33,150,243,0.4); font-weight: 600; }
5313
+ .dsm-action-btn--primary:hover { background: rgba(33,150,243,0.12); border-color: #2196f3; }
5314
+ .dsm-action-btn--danger { color: #ef5350; border-color: rgba(239,83,80,0.3); }
5315
+ .dsm-action-btn--danger:hover { background: rgba(239,83,80,0.12); }
5316
+ .dsm-designer { overflow-y: auto; flex: 1; padding: 14px; display: flex; flex-direction: column; gap: 6px; }
5317
+ .dsm-label { font-size: 11px; font-weight: 600; color: #787b86; text-transform: uppercase; letter-spacing: 0.5px; margin-top: 8px; }
5318
+ .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; }
5319
+ .dsm-input:focus { border-color: #2196f3; }
5320
+ .dsm-hint { font-size: 11px; color: #787b86; margin: 0; }
5321
+ .dsm-col-locked { display: flex; align-items: center; gap: 8px; padding: 4px 0; }
5322
+ .dsm-col-row { display: flex; align-items: center; gap: 6px; margin-bottom: 4px; }
5323
+ .dsm-col-name { flex: 1; }
5324
+ .dsm-select { background: #131722; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 12px; padding: 6px 4px; outline: none; }
5325
+ .dsm-select:focus { border-color: #2196f3; }
5326
+ .dsm-nullable-label { font-size: 11px; color: #787b86; display: flex; align-items: center; gap: 4px; white-space: nowrap; }
5327
+ .dsm-remove-col-btn { background: transparent; border: none; color: #787b86; cursor: pointer; font-size: 12px; padding: 4px; border-radius: 4px; }
5328
+ .dsm-remove-col-btn:hover { color: #ef5350; background: rgba(239,83,80,0.1); }
5329
+ .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; }
5330
+ .dsm-add-col-btn:hover { border-color: #2196f3; color: #2196f3; }
5331
+ .dsm-file-input { display: none; }
5332
+ .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; }
5333
+ .dsm-upload-btn:hover { background: rgba(255,255,255,0.1); }
5334
+ .dsm-preview { margin-top: 8px; }
5335
+ .dsm-preview-label { font-size: 11px; color: #787b86; margin-bottom: 4px; }
5336
+ .dsm-preview-table-wrap { overflow-x: auto; border-radius: 4px; border: 1px solid #363a45; }
5337
+ .dsm-preview-table { width: 100%; border-collapse: collapse; font-size: 11px; font-family: monospace; }
5338
+ .dsm-preview-table th { background: #1a1d29; color: #787b86; padding: 4px 8px; text-align: left; border-bottom: 1px solid #363a45; }
5339
+ .dsm-preview-table td { color: #d1d4dc; padding: 3px 8px; border-bottom: 1px solid #2a2d3a; }
5340
+ .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; }
5341
+ .dsm-save-btn:hover { background: #1976d2; }
5342
+ .dsm-save-btn:disabled { opacity: 0.5; cursor: not-allowed; }
5343
+ .dsm-usage { overflow-y: auto; flex: 1; padding: 14px; display: flex; flex-direction: column; gap: 12px; }
5344
+ .dsm-usage-intro { font-size: 13px; color: #d1d4dc; margin: 0; }
5345
+ .dsm-usage-code-wrap { position: relative; }
5346
+ .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; }
5347
+ .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; }
5348
+ .dsm-copy-btn:hover { background: rgba(255,255,255,0.14); }
5349
+ .dsm-usage-cols { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
5350
+ .dsm-usage-col-label { font-size: 11px; color: #787b86; }
5351
+ .dsm-col-type { opacity: 0.6; font-size: 9px; }
5352
+ [data-theme="light"] .dsm-header { border-bottom-color: #e0e3eb; }
5353
+ [data-theme="light"] .dsm-title { color: #131722; }
5354
+ [data-theme="light"] .dsm-list-item { border-bottom-color: #e0e3eb; }
5355
+ [data-theme="light"] .dsm-list-item:hover { background: rgba(0,0,0,0.02); }
5356
+ [data-theme="light"] .dsm-list-item-name { color: #131722; }
5357
+ [data-theme="light"] .dsm-input { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5358
+ [data-theme="light"] .dsm-select { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5359
+ [data-theme="light"] .dsm-usage-code { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5360
+ [data-theme="light"] .dsm-preview-table th { background: #f0f3fa; color: #787b86; border-bottom-color: #e0e3eb; }
5361
+ [data-theme="light"] .dsm-preview-table td { color: #131722; border-bottom-color: #e0e3eb; }
5362
+ [data-theme="light"] .dsm-preview-table-wrap { border-color: #e0e3eb; }
5363
+ [data-theme="light"] .dsm-action-btn { background: rgba(0,0,0,0.04); border-color: #e0e3eb; color: #131722; }
5364
+ [data-theme="light"] .dsm-action-btn--primary { color: #2196f3; border-color: rgba(33,150,243,0.4); }
5365
+ [data-theme="light"] .dsm-action-btn--primary:hover { background: rgba(33,150,243,0.08); }
5366
+ [data-theme="light"] .dsm-save-btn { background: #2196f3; color: #fff !important; border: none; }
5367
+ [data-theme="light"] .dsm-save-btn:hover { background: #1976d2; }
5368
+ [data-theme="light"] .dsm-add-col-btn { color: #2196f3; border-color: #c8d6e5; }
5369
+ [data-theme="light"] .dsm-add-col-btn:hover { border-color: #2196f3; }
5370
+ [data-theme="light"] .dsm-back-btn { color: #2196f3; }
5371
+ [data-theme="light"] .dsm-new-btn { background: #2196f3; color: #fff; }
5372
+ [data-theme="light"] .dsm-hint { color: #787b86; }
5373
+ [data-theme="light"] .dsm-col-row { border-color: #e0e3eb; }
5374
+ [data-theme="light"] .dsm-nullable-label { color: #434651; }
5375
+ [data-theme="light"] .dsm-remove-col-btn { color: #787b86; }
5376
+ [data-theme="light"] .dsm-remove-col-btn:hover { color: #ef5350; }
5377
+
5378
+ /* Docs Editor */
5379
+ .docs-editor-root { display: flex; flex-direction: column; flex: 1; overflow: hidden; }
5380
+ .docs-toolbar { display: flex; align-items: center; gap: 6px; flex-shrink: 0; padding: 8px 12px; border-bottom: 1px solid #363a45; background: #1a1d29; }
5381
+ .docs-tab-btn { background: transparent; border: none; color: #787b86; font-size: 12px; cursor: pointer; padding: 4px 10px; border-radius: 4px; }
5382
+ .docs-tab-btn:hover { color: #d1d4dc; background: rgba(255,255,255,0.06); }
5383
+ .docs-tab-btn.active { color: #2196f3; background: rgba(33,150,243,0.12); }
5384
+ .docs-template-btn { background: transparent; border: 1px dashed #363a45; color: #787b86; font-size: 11px; cursor: pointer; padding: 3px 8px; border-radius: 4px; }
5385
+ .docs-template-btn:hover { border-color: #2196f3; color: #2196f3; }
5386
+ .docs-error { font-size: 11px; color: #ef5350; }
5387
+ .docs-saved { font-size: 11px; color: #26a69a; }
5388
+ .docs-save-btn { background: #2196f3; border: none; color: #fff; border-radius: 4px; padding: 5px 12px; font-size: 12px; cursor: pointer; }
5389
+ .docs-save-btn:hover { background: #1e88e5; }
5390
+ .docs-save-btn:disabled { opacity: 0.5; cursor: not-allowed; }
5391
+ .docs-panes { flex: 1; overflow: hidden; display: flex; }
5392
+ .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; }
5393
+ .docs-rendered { flex: 1; overflow-y: auto; padding: 14px 18px; color: #d1d4dc; font-size: 13px; line-height: 1.7; }
5394
+ .docs-rendered h1 { font-size: 18px; color: #d1d4dc; margin: 0 0 12px; border-bottom: 1px solid #363a45; padding-bottom: 6px; }
5395
+ .docs-rendered h2 { font-size: 15px; color: #d1d4dc; margin: 18px 0 8px; }
5396
+ .docs-rendered h3 { font-size: 13px; color: #d1d4dc; margin: 14px 0 6px; }
5397
+ .docs-rendered p { margin: 0 0 10px; }
5398
+ .docs-rendered ul { margin: 0 0 10px; padding-left: 20px; }
5399
+ .docs-rendered li { margin-bottom: 4px; }
5400
+ .docs-rendered hr { border: none; border-top: 1px solid #363a45; margin: 14px 0; }
5401
+ .docs-rendered strong { color: #d1d4dc; }
5402
+ .docs-rendered em { color: #b0b3c1; }
5403
+ .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; }
5404
+ .docs-inline-code { background: rgba(255,255,255,0.08); border-radius: 3px; padding: 1px 5px; font-size: 12px; font-family: monospace; color: #ab47bc; }
5405
+ .docs-empty { padding: 24px 14px; text-align: center; color: #787b86; font-size: 13px; }
5406
+ .docs-loading { padding: 24px 14px; text-align: center; color: #787b86; font-size: 13px; }
5407
+ .docs-viewer { overflow-y: auto; flex: 1; padding: 14px 18px; }
5408
+ [data-theme="light"] .docs-toolbar { background: #f8f9fd; border-bottom-color: #e0e3eb; }
5409
+ [data-theme="light"] .docs-save-btn { background: #2196f3; color: #fff !important; border: none; }
5410
+ [data-theme="light"] .docs-save-btn:hover { background: #1976d2; }
5411
+ [data-theme="light"] .docs-tab-btn { color: #787b86; }
5412
+ [data-theme="light"] .docs-tab-btn:hover { color: #131722; background: rgba(0,0,0,0.04); }
5413
+ [data-theme="light"] .docs-textarea { background: #fff; color: #131722; }
5414
+ [data-theme="light"] .docs-rendered { color: #131722; }
5415
+ [data-theme="light"] .docs-rendered h1, [data-theme="light"] .docs-rendered h2, [data-theme="light"] .docs-rendered h3 { color: #131722; border-bottom-color: #e0e3eb; }
5416
+ [data-theme="light"] .docs-rendered hr { border-top-color: #e0e3eb; }
5417
+ [data-theme="light"] .docs-code-block { background: #f0f3fa; border-color: #e0e3eb; }
5418
+ [data-theme="light"] .docs-inline-code { background: rgba(0,0,0,0.06); }
5419
+
5420
+ /* Script Settings Panel */
5421
+ .ss-root { overflow-y: auto; flex: 1; padding: 14px; display: flex; flex-direction: column; gap: 0; }
5422
+ .ss-section { margin-bottom: 18px; }
5423
+ .ss-section-label { font-size: 11px; font-weight: 600; color: #787b86; text-transform: uppercase; letter-spacing: 0.5px; display: block; margin-bottom: 6px; }
5424
+ .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; }
5425
+ .ss-input:focus { border-color: #2196f3; }
5426
+ .ss-vis-group { display: flex; gap: 0; border-radius: 4px; overflow: hidden; border: 1px solid #363a45; }
5427
+ .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; }
5428
+ .ss-vis-btn:last-child { border-right: none; }
5429
+ .ss-vis-btn:hover { background: rgba(255,255,255,0.06); color: #d1d4dc; }
5430
+ .ss-vis-btn.active { background: rgba(33,150,243,0.18); color: #2196f3; font-weight: 600; }
5431
+ .ss-vis-desc { font-size: 11px; color: #787b86; margin: 6px 0 0; }
5432
+ .ss-price-row { display: flex; gap: 6px; }
5433
+ .ss-currency-select { background: #131722; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 13px; padding: 7px 6px; outline: none; }
5434
+ .ss-price-input { flex: 1; background: #131722; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 13px; padding: 7px 10px; outline: none; }
5435
+ .ss-price-input:focus { border-color: #2196f3; }
5436
+ .ss-hint { font-size: 11px; color: #787b86; margin: 4px 0 0; }
5437
+ .ss-slider { width: 100%; accent-color: #2196f3; margin-top: 4px; }
5438
+ .ss-footer { display: flex; align-items: center; gap: 10px; padding-top: 8px; border-top: 1px solid #363a45; margin-top: auto; }
5439
+ .ss-error { font-size: 11px; color: #ef5350; flex: 1; }
5440
+ .ss-saved { font-size: 11px; color: #26a69a; flex: 1; }
5441
+ .ss-save-btn { background: #2196f3; border: none; color: #fff; border-radius: 4px; padding: 7px 16px; font-size: 13px; cursor: pointer; margin-left: auto; }
5442
+ .ss-save-btn:hover { background: #1e88e5; }
5443
+ .ss-save-btn:disabled { opacity: 0.5; cursor: not-allowed; }
5444
+ .ss-empty, .ss-loading { padding: 24px 14px; text-align: center; color: #787b86; font-size: 13px; }
5445
+ .ss-viewer { padding: 14px; display: flex; flex-direction: column; gap: 10px; }
5446
+ .ss-row { display: flex; align-items: center; gap: 10px; }
5447
+ .ss-label { font-size: 12px; color: #787b86; min-width: 80px; }
5448
+ .ss-value { font-size: 13px; color: #d1d4dc; }
5449
+ .ss-badge { font-size: 11px; padding: 2px 8px; border-radius: 10px; font-weight: 500; }
5450
+ .ss-badge--private { background: rgba(120,123,134,0.18); color: #787b86; }
5451
+ .ss-badge--public { background: rgba(38,166,154,0.18); color: #26a69a; }
5452
+ .ss-badge--for-sale { background: rgba(255,152,0,0.18); color: #ff9800; }
5453
+ [data-theme="light"] .ss-input { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5454
+ [data-theme="light"] .ss-currency-select { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5455
+ [data-theme="light"] .ss-price-input { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5456
+ [data-theme="light"] .ss-vis-group { border-color: #e0e3eb; }
5457
+ [data-theme="light"] .ss-vis-btn { color: #787b86; border-right-color: #e0e3eb; }
5458
+ [data-theme="light"] .ss-vis-btn:hover { background: rgba(0,0,0,0.04); color: #131722; }
5459
+ [data-theme="light"] .ss-footer { border-top-color: #e0e3eb; }
5460
+ [data-theme="light"] .ss-save-btn { background: #2196f3; color: #fff !important; border: none; }
5461
+ [data-theme="light"] .ss-save-btn:hover { background: #1976d2; }
5462
+ [data-theme="light"] .ss-value { color: #131722; }
5463
+
5464
+
5465
+ /* ═══════════════════════════════════════════════════════════════════════════
5466
+ Script Manager — Main Tabs (Code / Datasets / Docs / Settings)
5467
+ ═══════════════════════════════════════════════════════════════════════════ */
5468
+
5469
+ .script-main-tabs { display: flex; border-bottom: 1px solid #363a45; background: #1e222d; flex-shrink: 0; }
5470
+ .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; }
5471
+ .script-main-tab:hover { color: #d1d4dc; }
5472
+ .script-main-tab.active { color: #2196f3; border-bottom-color: #2196f3; }
5473
+ [data-theme="light"] .script-main-tabs { background: #f0f3fa; border-bottom-color: #e0e3eb; }
5474
+ [data-theme="light"] .script-main-tab { color: #787b86; }
5475
+ [data-theme="light"] .script-main-tab:hover { color: #131722; }
5476
+ [data-theme="light"] .script-main-tab.active { color: #2196f3; }
5477
+
5478
+ /* ═══════════════════════════════════════════════════════════════════════════
5479
+ Dataset Manager Drawer
5480
+ ═══════════════════════════════════════════════════════════════════════════ */
5481
+
5482
+ .dsm-root { display: flex; flex-direction: column; flex: 1; overflow: hidden; background: #131722; }
5483
+ .dsm-header { display: flex; align-items: center; gap: 8px; padding: 10px 14px; border-bottom: 1px solid #363a45; flex-shrink: 0; }
5484
+ .dsm-title { font-size: 13px; font-weight: 600; color: #d1d4dc; flex: 1; }
5485
+ .dsm-back-btn { font-size: 12px; color: #787b86; background: none; border: none; cursor: pointer; padding: 0; }
5486
+ .dsm-back-btn:hover { color: #d1d4dc; }
5487
+ .dsm-new-btn { font-size: 12px; color: #2196f3; background: none; border: 1px solid #2196f3; border-radius: 4px; padding: 4px 10px; cursor: pointer; }
5488
+ .dsm-new-btn:hover { background: rgba(33,150,243,0.12); }
5489
+ .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); }
5490
+ .dsm-loading, .dsm-empty { padding: 24px 16px; color: #787b86; font-size: 13px; text-align: center; }
5491
+ .dsm-empty strong { color: #d1d4dc; }
5492
+ .dsm-list { flex: 1; overflow-y: auto; padding: 8px 0; }
5493
+ .dsm-list-item { padding: 10px 14px; border-bottom: 1px solid #2a2e39; }
5494
+ .dsm-list-item:last-child { border-bottom: none; }
5495
+ .dsm-list-item-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 6px; }
5496
+ .dsm-list-item-name { font-size: 13px; font-weight: 600; color: #d1d4dc; font-family: monospace; }
5497
+ .dsm-status { font-size: 11px; padding: 2px 7px; border-radius: 10px; font-weight: 500; }
5498
+ .dsm-status--ready { background: rgba(38,166,154,0.15); color: #26a69a; }
5499
+ .dsm-status--pending, .dsm-status--processing { background: rgba(255,167,38,0.15); color: #ffa726; }
5500
+ .dsm-status--failed { background: rgba(239,83,80,0.15); color: #ef5350; }
5501
+ .dsm-list-item-cols { display: flex; flex-wrap: wrap; gap: 4px; margin-bottom: 6px; }
5502
+ .dsm-col-tag { font-size: 10px; padding: 2px 6px; border-radius: 3px; font-family: monospace; background: #2a2e39; color: #787b86; }
5503
+ .dsm-col-tag--time { background: rgba(33,150,243,0.15); color: #2196f3; }
5504
+ .dsm-col-tag--number, .dsm-col-tag--percentage, .dsm-col-tag--price { background: rgba(38,166,154,0.12); color: #26a69a; }
5505
+ .dsm-col-tag--integer { background: rgba(102,187,106,0.12); color: #66bb6a; }
5506
+ .dsm-col-tag--text { background: rgba(171,71,188,0.12); color: #ab47bc; }
5507
+ .dsm-col-tag--boolean { background: rgba(255,167,38,0.12); color: #ffa726; }
5508
+ .dsm-col-tag--date, .dsm-col-tag--timestamp { background: rgba(239,83,80,0.12); color: #ef5350; }
5509
+ .dsm-ingest-error { font-size: 11px; color: #ef5350; margin-bottom: 4px; }
5510
+ .dsm-list-item-actions { display: flex; gap: 6px; }
5511
+ .dsm-action-btn { font-size: 11px; padding: 3px 10px; border-radius: 4px; cursor: pointer; background: transparent; border: 1px solid #363a45; color: #787b86; }
5512
+ .dsm-action-btn:hover { color: #d1d4dc; border-color: #787b86; }
5513
+ .dsm-action-btn--primary { color: #2196f3; border-color: rgba(33,150,243,0.4); font-weight: 600; }
5514
+ .dsm-action-btn--primary:hover { background: rgba(33,150,243,0.12); border-color: #2196f3; }
5515
+ .dsm-action-btn--danger { border-color: rgba(239,83,80,0.4); color: #ef5350; }
5516
+ .dsm-action-btn--danger:hover { background: rgba(239,83,80,0.1); border-color: #ef5350; }
5517
+ .dsm-designer { flex: 1; overflow-y: auto; padding: 14px; display: flex; flex-direction: column; gap: 6px; }
5518
+ .dsm-label { font-size: 11px; font-weight: 600; color: #787b86; text-transform: uppercase; letter-spacing: 0.04em; }
5519
+ .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; }
5520
+ .dsm-input:focus { border-color: #2196f3; }
5521
+ .dsm-hint { font-size: 11px; color: #787b86; margin: 0; }
5522
+ .dsm-col-locked { display: flex; align-items: center; gap: 8px; padding: 4px 0; }
5523
+ .dsm-col-row { display: flex; align-items: center; gap: 6px; margin-bottom: 4px; }
5524
+ .dsm-col-name { flex: 1; }
5525
+ .dsm-select { background: #1e222d; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 12px; padding: 5px 6px; outline: none; }
5526
+ .dsm-select:focus { border-color: #2196f3; }
5527
+ .dsm-nullable-label { font-size: 11px; color: #787b86; display: flex; align-items: center; gap: 4px; white-space: nowrap; }
5528
+ .dsm-remove-col-btn { background: none; border: none; color: #ef5350; cursor: pointer; font-size: 13px; padding: 0 4px; }
5529
+ .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; }
5530
+ .dsm-add-col-btn:hover { border-color: #2196f3; }
5531
+ .dsm-file-input { display: none; }
5532
+ .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; }
5533
+ .dsm-upload-btn:hover { border-color: #787b86; }
5534
+ .dsm-preview { margin-top: 8px; }
5535
+ .dsm-preview-label { font-size: 11px; color: #787b86; margin-bottom: 4px; }
5536
+ .dsm-preview-table-wrap { overflow-x: auto; }
5537
+ .dsm-preview-table { border-collapse: collapse; font-size: 11px; width: 100%; }
5538
+ .dsm-preview-table th { background: #1e222d; color: #787b86; padding: 4px 8px; border: 1px solid #363a45; font-weight: 600; }
5539
+ .dsm-preview-table td { color: #d1d4dc; padding: 3px 8px; border: 1px solid #2a2e39; }
5540
+ .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; }
5541
+ .dsm-save-btn:hover { background: #1e88e5; }
5542
+ .dsm-save-btn:disabled { opacity: 0.5; cursor: not-allowed; }
5543
+
5544
+ /* ── Step indicator ── */
5545
+ .dsm-steps { display: flex; align-items: center; gap: 8px; padding: 10px 0 4px; margin-bottom: 4px; }
5546
+ .dsm-step { font-size: 12px; font-weight: 600; color: #787b86; }
5547
+ .dsm-step--active { color: #2196f3; }
5548
+ .dsm-step--done { color: #4caf50; }
5549
+ .dsm-step--upcoming { color: #4a4f60; }
5550
+ .dsm-step-sep { font-size: 12px; color: #4a4f60; }
5551
+
5552
+ /* ── Importer ── */
5553
+ .dsm-importer { flex: 1; overflow-y: auto; padding: 14px; display: flex; flex-direction: column; gap: 8px; }
5554
+ .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; }
5555
+ .dsm-schema-summary-label { font-size: 11px; color: #787b86; flex-shrink: 0; }
5556
+ .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; }
5557
+ .dsm-template-desc { font-size: 12px; color: #9598a1; line-height: 1.5; }
5558
+ .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; }
5559
+ .dsm-template-btn:hover { background: rgba(33,150,243,0.1); }
5560
+ .dsm-col-unknown { color: #f44336 !important; }
5561
+ .dsm-import-actions { display: flex; align-items: center; gap: 12px; margin-top: 4px; }
5562
+ .dsm-skip-btn { background: none; border: none; color: #787b86; font-size: 12px; cursor: pointer; padding: 4px 0; text-decoration: underline; text-underline-offset: 2px; }
5563
+ .dsm-skip-btn:hover { color: #d1d4dc; }
5564
+ [data-theme="light"] .dsm-schema-summary { background: rgba(33,150,243,0.05); border-color: rgba(33,150,243,0.2); }
5565
+ [data-theme="light"] .dsm-template-section { background: #f8f9fb; border-color: #e0e3eb; }
5566
+
5567
+ .dsm-usage { flex: 1; overflow-y: auto; padding: 14px; display: flex; flex-direction: column; gap: 12px; }
5568
+ .dsm-usage-intro { font-size: 13px; color: #d1d4dc; margin: 0; }
5569
+ .dsm-usage-code-wrap { position: relative; }
5570
+ .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; }
5571
+ .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; }
5572
+ .dsm-copy-btn:hover { background: #2196f3; color: #fff; }
5573
+ .dsm-usage-cols { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
5574
+ .dsm-usage-col-label { font-size: 11px; color: #787b86; }
5575
+ .dsm-col-type { font-size: 10px; opacity: 0.7; }
5576
+ [data-theme="light"] .dsm-root { background: #fff; }
5577
+ [data-theme="light"] .dsm-header { border-bottom-color: #e0e3eb; }
5578
+ [data-theme="light"] .dsm-title { color: #131722; }
5579
+ [data-theme="light"] .dsm-list-item { border-bottom-color: #e0e3eb; }
5580
+ [data-theme="light"] .dsm-list-item-name { color: #131722; }
5581
+ [data-theme="light"] .dsm-col-tag { background: #f0f3fa; color: #787b86; }
5582
+ [data-theme="light"] .dsm-input { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5583
+ [data-theme="light"] .dsm-select { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5584
+ [data-theme="light"] .dsm-usage-code { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5585
+ [data-theme="light"] .dsm-save-btn { background: #2196f3; color: #fff !important; border: none; }
5586
+ [data-theme="light"] .dsm-save-btn:hover { background: #1976d2; }
5587
+ [data-theme="light"] .dsm-add-col-btn { color: #2196f3; border-color: #c8d6e5; }
5588
+ [data-theme="light"] .dsm-back-btn { color: #2196f3; }
5589
+ [data-theme="light"] .dsm-new-btn { background: #2196f3; color: #fff; }
5590
+ [data-theme="light"] .dsm-hint { color: #787b86; }
5591
+ [data-theme="light"] .dsm-nullable-label { color: #434651; }
5592
+
5593
+ /* ═══════════════════════════════════════════════════════════════════════════
5594
+ Docs Editor
5595
+ ═══════════════════════════════════════════════════════════════════════════ */
5596
+
5597
+ .docs-editor-root { display: flex; flex-direction: column; flex: 1; overflow: hidden; }
5598
+ .docs-toolbar { display: flex; align-items: center; gap: 6px; padding: 8px 12px; border-bottom: 1px solid #363a45; flex-shrink: 0; background: #1e222d; }
5599
+ .docs-tab-btn { font-size: 12px; padding: 4px 10px; border-radius: 4px; cursor: pointer; background: transparent; border: 1px solid transparent; color: #787b86; }
5600
+ .docs-tab-btn:hover { color: #d1d4dc; }
5601
+ .docs-tab-btn.active { border-color: #363a45; color: #d1d4dc; background: #131722; }
5602
+ .docs-template-btn { font-size: 12px; color: #2196f3; background: none; border: none; cursor: pointer; padding: 0 4px; }
5603
+ .docs-template-btn:hover { text-decoration: underline; }
5604
+ .docs-error { font-size: 11px; color: #ef5350; }
5605
+ .docs-saved { font-size: 11px; color: #26a69a; }
5606
+ .docs-save-btn { font-size: 12px; padding: 5px 14px; background: #2196f3; color: #fff; border: none; border-radius: 4px; cursor: pointer; }
5607
+ .docs-save-btn:hover { background: #1e88e5; }
5608
+ .docs-save-btn:disabled { opacity: 0.5; cursor: not-allowed; }
5609
+ .docs-panes { flex: 1; overflow: hidden; }
5610
+ .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; }
5611
+ .docs-rendered { flex: 1; overflow-y: auto; padding: 16px 20px; color: #d1d4dc; font-size: 13px; line-height: 1.7; }
5612
+ .docs-rendered h1 { font-size: 18px; margin: 0 0 12px; color: #d1d4dc; }
5613
+ .docs-rendered h2 { font-size: 15px; margin: 20px 0 8px; color: #d1d4dc; border-bottom: 1px solid #363a45; padding-bottom: 4px; }
5614
+ .docs-rendered h3 { font-size: 13px; margin: 14px 0 6px; color: #d1d4dc; }
5615
+ .docs-rendered p { margin: 0 0 10px; }
5616
+ .docs-rendered ul { margin: 0 0 10px; padding-left: 20px; }
5617
+ .docs-rendered li { margin-bottom: 4px; }
5618
+ .docs-rendered hr { border: none; border-top: 1px solid #363a45; margin: 16px 0; }
5619
+ .docs-rendered strong { color: #d1d4dc; }
5620
+ .docs-code-block { background: #1e222d; border: 1px solid #363a45; border-radius: 4px; padding: 10px 12px; font-size: 12px; overflow-x: auto; margin: 8px 0; }
5621
+ .docs-inline-code { background: #1e222d; border: 1px solid #363a45; border-radius: 3px; padding: 1px 5px; font-size: 11px; font-family: monospace; }
5622
+ .docs-viewer { flex: 1; overflow-y: auto; }
5623
+ .docs-empty, .docs-loading { padding: 24px 16px; color: #787b86; font-size: 13px; text-align: center; }
5624
+ [data-theme="light"] .docs-toolbar { background: #f0f3fa; border-bottom-color: #e0e3eb; }
5625
+ [data-theme="light"] .docs-tab-btn.active { background: #fff; border-color: #e0e3eb; color: #131722; }
5626
+ [data-theme="light"] .docs-textarea { background: #fff; color: #131722; }
5627
+ [data-theme="light"] .docs-rendered { color: #131722; }
5628
+ [data-theme="light"] .docs-rendered h1, [data-theme="light"] .docs-rendered h2, [data-theme="light"] .docs-rendered h3 { color: #131722; }
5629
+ [data-theme="light"] .docs-rendered h2 { border-bottom-color: #e0e3eb; }
5630
+ [data-theme="light"] .docs-code-block { background: #f0f3fa; border-color: #e0e3eb; }
5631
+ [data-theme="light"] .docs-inline-code { background: #f0f3fa; border-color: #e0e3eb; }
5632
+
5633
+ /* ═══════════════════════════════════════════════════════════════════════════
5634
+ Script Settings
5635
+ ═══════════════════════════════════════════════════════════════════════════ */
5636
+
5637
+ .ss-root { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 4px; }
5638
+ .ss-section { margin-bottom: 16px; }
5639
+ .ss-section-label { display: block; font-size: 11px; font-weight: 600; color: #787b86; text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 6px; }
5640
+ .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; }
5641
+ .ss-input:focus { border-color: #2196f3; }
5642
+ .ss-vis-group { display: flex; gap: 6px; margin-bottom: 6px; }
5643
+ .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; }
5644
+ .ss-vis-btn:hover { color: #d1d4dc; border-color: #787b86; }
5645
+ .ss-vis-btn.active { background: rgba(33,150,243,0.12); border-color: #2196f3; color: #2196f3; }
5646
+ .ss-vis-desc { font-size: 12px; color: #787b86; margin: 0; }
5647
+ .ss-price-row { display: flex; gap: 8px; margin-bottom: 6px; }
5648
+ .ss-currency-select { background: #1e222d; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 13px; padding: 6px 8px; outline: none; }
5649
+ .ss-price-input { flex: 1; background: #1e222d; border: 1px solid #363a45; border-radius: 4px; color: #d1d4dc; font-size: 13px; padding: 6px 10px; outline: none; }
5650
+ .ss-price-input:focus { border-color: #2196f3; }
5651
+ .ss-hint { font-size: 11px; color: #787b86; margin: 0; }
5652
+ .ss-slider { width: 100%; accent-color: #2196f3; }
5653
+ .ss-footer { display: flex; align-items: center; gap: 10px; padding-top: 8px; border-top: 1px solid #363a45; margin-top: auto; }
5654
+ .ss-error { font-size: 12px; color: #ef5350; flex: 1; }
5655
+ .ss-saved { font-size: 12px; color: #26a69a; flex: 1; }
5656
+ .ss-save-btn { padding: 7px 18px; background: #2196f3; color: #fff; border: none; border-radius: 4px; font-size: 13px; font-weight: 600; cursor: pointer; }
5657
+ .ss-save-btn:hover { background: #1e88e5; }
5658
+ .ss-save-btn:disabled { opacity: 0.5; cursor: not-allowed; }
5659
+ .ss-viewer { padding: 16px; display: flex; flex-direction: column; gap: 10px; }
5660
+ .ss-row { display: flex; align-items: center; gap: 10px; }
5661
+ .ss-label { font-size: 12px; color: #787b86; }
5662
+ .ss-value { font-size: 13px; color: #d1d4dc; }
5663
+ .ss-badge { font-size: 11px; padding: 2px 8px; border-radius: 10px; font-weight: 600; }
5664
+ .ss-badge--private { background: rgba(120,123,134,0.15); color: #787b86; }
5665
+ .ss-badge--public { background: rgba(38,166,154,0.15); color: #26a69a; }
5666
+ .ss-badge--for_sale { background: rgba(255,167,38,0.15); color: #ffa726; }
5667
+ .ss-empty, .ss-loading { padding: 24px 16px; color: #787b86; font-size: 13px; text-align: center; }
5668
+ [data-theme="light"] .ss-root { background: #fff; }
5669
+ [data-theme="light"] .ss-input { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5670
+ [data-theme="light"] .ss-vis-btn { background: #f0f3fa; border-color: #e0e3eb; color: #787b86; }
5671
+ [data-theme="light"] .ss-vis-btn:hover { color: #131722; }
5672
+ [data-theme="light"] .ss-currency-select { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5673
+ [data-theme="light"] .ss-price-input { background: #f0f3fa; border-color: #e0e3eb; color: #131722; }
5674
+ [data-theme="light"] .ss-footer { border-top-color: #e0e3eb; }
5675
+ [data-theme="light"] .ss-save-btn { background: #2196f3; color: #fff !important; border: none; }
5676
+ [data-theme="light"] .ss-save-btn:hover { background: #1976d2; }
5677
+
5678
+ /* ── Agent UI Bus animations ─────────────────────────────────────────────── */
5679
+ @keyframes agent-pulse {
5680
+ 0%, 100% { opacity: 1; transform: scale(1); }
5681
+ 50% { opacity: 0.4; transform: scale(0.7); }
5682
+ }
5683
+
5684
+ @keyframes agent-highlight-flash {
5685
+ 0% { background: rgba(138,180,248,0.25); }
5686
+ 100% { background: transparent; }
5687
+ }
5688
+
5689
+ .agent-highlight {
5690
+ animation: agent-highlight-flash 1.2s ease-out forwards;
5691
+ }
5692
+
5693
+ /* ── Agent drawer (inline panel like WatchlistDrawer) ──────────────────── */
5694
+ .agent-drawer {
5695
+ width: 340px;
5696
+ flex-shrink: 0;
5697
+ position: relative;
5698
+ display: flex;
5699
+ flex-direction: column;
5700
+ background: var(--toolbar-bg);
5701
+ border: 1px solid var(--border);
5702
+ border-radius: 8px;
5703
+ overflow: hidden;
5704
+ min-height: 0;
5705
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
5706
+ font-size: 13px;
5707
+ }
5708
+
5709
+ .agent-drawer-header {
5710
+ display: flex;
5711
+ align-items: center;
5712
+ justify-content: space-between;
5713
+ padding: 10px 12px;
5714
+ border-bottom: 1px solid var(--border);
5715
+ background: var(--toolbar-bg);
5716
+ flex-shrink: 0;
5717
+ }
5718
+
5719
+ .agent-drawer-title {
5720
+ display: flex;
5721
+ align-items: center;
5722
+ gap: 6px;
5723
+ font-weight: 600;
5724
+ font-size: 13px;
5725
+ color: var(--text, #e0e0e0);
5726
+ }
5727
+
5728
+ .agent-drawer-close {
5729
+ width: 24px;
5730
+ height: 24px;
5731
+ border: none;
5732
+ background: none;
5733
+ cursor: pointer;
5734
+ color: var(--text-muted, #888);
5735
+ display: flex;
5736
+ align-items: center;
5737
+ justify-content: center;
5738
+ border-radius: 4px;
5739
+ padding: 0;
5740
+ }
5741
+ .agent-drawer-close:hover { background: var(--hover-bg, rgba(255,255,255,0.07)); color: var(--text, #e0e0e0); }
5742
+
5743
+ .agent-deep-toggle {
5744
+ display: flex;
5745
+ align-items: center;
5746
+ gap: 5px;
5747
+ font-size: 11px;
5748
+ color: var(--text-muted, #888);
5749
+ cursor: pointer;
5750
+ user-select: none;
5751
+ }
5752
+ .agent-deep-toggle input { cursor: pointer; accent-color: #06b6d4; }
5753
+
5754
+ .agent-error-banner {
5755
+ padding: 8px 12px;
5756
+ background: rgba(239, 68, 68, 0.12);
5757
+ border-bottom: 1px solid rgba(239, 68, 68, 0.25);
5758
+ color: #f87171;
5759
+ font-size: 12px;
5760
+ flex-shrink: 0;
5761
+ }
5762
+
5763
+ .agent-messages {
5764
+ flex: 1;
5765
+ overflow-y: auto;
5766
+ padding: 12px;
5767
+ display: flex;
5768
+ flex-direction: column;
5769
+ gap: 8px;
5770
+ min-height: 0;
5771
+ }
5772
+
5773
+ .agent-empty-state {
5774
+ display: flex;
5775
+ flex-direction: column;
5776
+ align-items: center;
5777
+ justify-content: center;
5778
+ flex: 1;
5779
+ text-align: center;
5780
+ color: var(--text-muted, #777);
5781
+ padding: 32px 16px;
5782
+ gap: 8px;
5783
+ }
5784
+
5785
+ .agent-message {
5786
+ display: flex;
5787
+ }
5788
+ .agent-message.user { justify-content: flex-end; }
5789
+ .agent-message.assistant { justify-content: flex-start; }
5790
+
5791
+ .agent-message-bubble {
5792
+ max-width: 85%;
5793
+ padding: 8px 12px;
5794
+ border-radius: 10px;
5795
+ font-size: 13px;
5796
+ line-height: 1.5;
5797
+ word-break: break-word;
5798
+ }
5799
+ .agent-message.user .agent-message-bubble {
5800
+ background: #06b6d4;
5801
+ color: #fff;
5802
+ border-radius: 10px 10px 2px 10px;
5803
+ }
5804
+ .agent-message.assistant .agent-message-bubble {
5805
+ background: var(--surface-2, rgba(255,255,255,0.06));
5806
+ color: var(--text, #e0e0e0);
5807
+ border-radius: 10px 10px 10px 2px;
5808
+ }
5809
+
5810
+ .agent-tool-call {
5811
+ margin: 3px 0;
5812
+ padding: 6px 10px;
5813
+ background: var(--surface-2, rgba(255,255,255,0.04));
5814
+ border-left: 2px solid #06b6d4;
5815
+ border-radius: 0 4px 4px 0;
5816
+ }
5817
+
5818
+ .agent-approval-card {
5819
+ margin: 6px 0;
5820
+ padding: 10px 12px;
5821
+ background: rgba(245, 158, 11, 0.12);
5822
+ border: 1px solid rgba(245, 158, 11, 0.4);
5823
+ border-radius: 6px;
5824
+ color: var(--text);
5825
+ }
5826
+
5827
+ /* Use .agent-drawer specificity to beat the global `button { background: transparent }` reset */
5828
+ .agent-drawer .agent-approval-btn {
5829
+ display: inline-flex;
5830
+ align-items: center;
5831
+ justify-content: center;
5832
+ flex: 1;
5833
+ padding: 6px 12px;
5834
+ border: none;
5835
+ border-radius: 4px;
5836
+ cursor: pointer;
5837
+ font-size: 12px;
5838
+ font-weight: 600;
5839
+ transition: background 0.15s, opacity 0.15s;
5840
+ }
5841
+ .agent-drawer .agent-approval-approve,
5842
+ .agent-drawer .agent-approval-approve:hover,
5843
+ [data-theme="light"] .agent-drawer .agent-approval-approve,
5844
+ [data-theme="light"] .agent-drawer .agent-approval-approve:hover {
5845
+ background: #16a34a !important;
5846
+ color: #fff !important;
5847
+ }
5848
+ .agent-drawer .agent-approval-approve:hover { opacity: 0.88; }
5849
+
5850
+ .agent-drawer .agent-approval-reject,
5851
+ .agent-drawer .agent-approval-reject:hover,
5852
+ [data-theme="light"] .agent-drawer .agent-approval-reject,
5853
+ [data-theme="light"] .agent-drawer .agent-approval-reject:hover {
5854
+ background: #dc2626 !important;
5855
+ color: #fff !important;
5856
+ }
5857
+ .agent-drawer .agent-approval-reject:hover { opacity: 0.88; }
5858
+
5859
+ .agent-input-area {
5860
+ padding: 10px 12px;
5861
+ border-top: 1px solid var(--border);
5862
+ background: var(--toolbar-bg);
5863
+ flex-shrink: 0;
5864
+ }
5865
+
5866
+ .agent-input {
5867
+ flex: 1;
5868
+ padding: 7px 10px;
5869
+ background: var(--surface-2, rgba(255,255,255,0.06));
5870
+ border: 1px solid var(--border);
5871
+ border-radius: 6px;
5872
+ color: var(--text, #e0e0e0);
5873
+ font-size: 13px;
5874
+ font-family: inherit;
5875
+ resize: none;
5876
+ line-height: 1.4;
5877
+ outline: none;
5878
+ }
5879
+ .agent-input:focus { border-color: #06b6d4; box-shadow: 0 0 0 2px rgba(6,182,212,0.15); }
5880
+ .agent-input::placeholder { color: var(--text-muted, #666); }
5881
+ .agent-input:disabled { opacity: 0.5; }
5882
+
5883
+ /* Beat the global button reset with .agent-drawer specificity */
5884
+ .agent-drawer .agent-send-btn,
5885
+ .agent-drawer .agent-send-btn:hover,
5886
+ [data-theme="light"] .agent-drawer .agent-send-btn,
5887
+ [data-theme="light"] .agent-drawer .agent-send-btn:hover {
5888
+ width: 32px;
5889
+ height: 32px;
5890
+ background: #06b6d4 !important;
5891
+ color: #fff !important;
5892
+ border: none;
5893
+ border-radius: 6px;
5894
+ cursor: pointer;
5895
+ display: flex;
5896
+ align-items: center;
5897
+ justify-content: center;
5898
+ flex-shrink: 0;
5899
+ align-self: flex-end;
5900
+ transition: background 0.15s;
5901
+ }
5902
+ .agent-drawer .agent-send-btn:hover:not(:disabled) { background: #0891b2 !important; }
5903
+ .agent-drawer .agent-send-btn:disabled { opacity: 0.4; cursor: not-allowed; }
5904
+
5905
+ /* ── Light mode overrides for agent drawer ──────────────────────────────── */
5906
+ [data-theme="light"] .agent-drawer {
5907
+ background: #ffffff;
5908
+ border-color: #e2e8f0;
5909
+ }
5910
+ [data-theme="light"] .agent-drawer-header {
5911
+ background: #f8fafc;
5912
+ border-bottom-color: #e2e8f0;
5913
+ }
5914
+ [data-theme="light"] .agent-drawer-title { color: #1e293b; }
5915
+ [data-theme="light"] .agent-drawer-close { color: #64748b; }
5916
+ [data-theme="light"] .agent-drawer-close:hover { background: rgba(0,0,0,0.06); color: #1e293b; }
5917
+ [data-theme="light"] .agent-deep-toggle { color: #64748b; }
5918
+ [data-theme="light"] .agent-messages { background: #ffffff; }
5919
+ [data-theme="light"] .agent-message.assistant .agent-message-bubble {
5920
+ background: #f1f5f9;
5921
+ color: #1e293b;
5922
+ }
5923
+ [data-theme="light"] .agent-message.user .agent-message-bubble {
5924
+ background: #06b6d4;
5925
+ color: #fff;
5926
+ }
5927
+ [data-theme="light"] .agent-tool-call {
5928
+ background: #f8fafc;
5929
+ border-left-color: #06b6d4;
5930
+ }
5931
+ [data-theme="light"] .agent-approval-card {
5932
+ background: rgba(245, 158, 11, 0.08);
5933
+ border-color: rgba(245, 158, 11, 0.35);
5934
+ color: #92400e;
5935
+ }
5936
+ [data-theme="light"] .agent-input-area {
5937
+ background: #ffffff;
5938
+ border-top-color: #e2e8f0;
5939
+ }
5940
+ [data-theme="light"] .agent-input {
5941
+ background: #f1f5f9;
5942
+ border-color: #cbd5e1;
5943
+ color: #1e293b;
5944
+ }
5945
+ [data-theme="light"] .agent-input:focus { border-color: #06b6d4; }
5946
+ [data-theme="light"] .agent-input::placeholder { color: #94a3b8; }
5947
+ [data-theme="light"] .agent-empty-state { color: #94a3b8; }
5948
+ [data-theme="light"] .agent-error-banner {
5949
+ background: rgba(239, 68, 68, 0.08);
5950
+ border-bottom-color: rgba(239, 68, 68, 0.2);
5951
+ color: #b91c1c;
5952
+ }
5953
+
5954
+ @keyframes agent-blink {
5955
+ 0%, 100% { opacity: 1; }
5956
+ 50% { opacity: 0; }
5957
+ }
5958
+
5959
+ /* ── Agent toolbar button ring animation ────────────────────────────────── */
5960
+ @keyframes agent-ring-pulse {
5961
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(6, 182, 212, 0.6); }
5962
+ 50% { box-shadow: 0 0 0 4px rgba(6, 182, 212, 0); }
5963
+ }
5964
+
5965
+ .agent-toolbar-btn {
5966
+ position: relative;
5967
+ }
5968
+ .agent-toolbar-btn:not(.is-active) {
5969
+ animation: agent-ring-pulse 2.4s ease-in-out infinite;
5970
+ }