scitex 2.10.3__py3-none-any.whl → 2.13.0__py3-none-any.whl

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 (504) hide show
  1. scitex/__init__.py +1 -4
  2. scitex/__main__.py +24 -5
  3. scitex/__version__.py +1 -1
  4. scitex/_install_guide.py +14 -2
  5. scitex/_optional_deps.py +33 -0
  6. scitex/ai/classification/reporters/_ClassificationReporter.py +1 -1
  7. scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +2 -2
  8. scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +2 -2
  9. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +2 -2
  10. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +2 -2
  11. scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +2 -2
  12. scitex/ai/classification/timeseries/_normalize_timestamp.py +1 -1
  13. scitex/ai/metrics/_calc_seizure_prediction_metrics.py +1 -1
  14. scitex/ai/plt/_plot_feature_importance.py +1 -1
  15. scitex/ai/plt/_plot_learning_curve.py +1 -1
  16. scitex/ai/plt/_plot_optuna_study.py +1 -1
  17. scitex/ai/plt/_plot_pre_rec_curve.py +1 -1
  18. scitex/ai/plt/_plot_roc_curve.py +1 -1
  19. scitex/ai/plt/_stx_conf_mat.py +1 -1
  20. scitex/ai/training/_LearningCurveLogger.py +1 -1
  21. scitex/audio/mcp_server.py +38 -8
  22. scitex/bridge/_figrecipe.py +1 -1
  23. scitex/bridge/_helpers.py +1 -1
  24. scitex/bridge/_plt_vis.py +1 -1
  25. scitex/bridge/_stats_plt.py +1 -1
  26. scitex/bridge/_stats_vis.py +2 -2
  27. scitex/browser/automation/CookieHandler.py +1 -1
  28. scitex/browser/core/BrowserMixin.py +1 -1
  29. scitex/browser/core/ChromeProfileManager.py +1 -1
  30. scitex/browser/debugging/_browser_logger.py +1 -1
  31. scitex/browser/debugging/_highlight_element.py +1 -1
  32. scitex/browser/debugging/_show_grid.py +1 -1
  33. scitex/browser/interaction/click_center.py +1 -1
  34. scitex/browser/interaction/click_with_fallbacks.py +1 -1
  35. scitex/browser/interaction/close_popups.py +1 -1
  36. scitex/browser/interaction/fill_with_fallbacks.py +1 -1
  37. scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +1 -1
  38. scitex/browser/pdf/detect_chrome_pdf_viewer.py +1 -1
  39. scitex/browser/stealth/HumanBehavior.py +1 -1
  40. scitex/browser/stealth/StealthManager.py +1 -1
  41. scitex/{fig → canvas}/__init__.py +84 -96
  42. scitex/canvas/_mcp_handlers.py +372 -0
  43. scitex/canvas/_mcp_tool_schemas.py +219 -0
  44. scitex/{fig → canvas}/backend/_parser.py +1 -1
  45. scitex/{fig → canvas}/canvas.py +13 -14
  46. scitex/{fts/_fig/_editor → canvas/editor}/_defaults.py +2 -2
  47. scitex/{fig → canvas}/editor/edit/__init__.py +11 -14
  48. scitex/{fig → canvas}/editor/edit/bundle_resolver.py +56 -48
  49. scitex/{fig → canvas}/editor/edit/editor_launcher.py +79 -26
  50. scitex/{fts/_fig/_editor/_cui/_panel_loader.py → canvas/editor/edit/panel_loader.py} +8 -8
  51. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_bbox.py +2 -1
  52. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_core.py +84 -84
  53. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_renderer.py +7 -6
  54. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/static/css/features/canvas.css +2 -2
  55. scitex/{fig → canvas}/editor/flask_editor/static/css/features/panel-grid.css +1 -1
  56. scitex/{fig → canvas}/editor/flask_editor/static/js/core/api.js +3 -4
  57. scitex/{fig → canvas}/editor/flask_editor/static/js/editor/preview.js +5 -5
  58. scitex/{fig → canvas}/editor/flask_editor/templates/_html.py +3 -3
  59. scitex/{fig → canvas}/editor/flask_editor/templates/_scripts.py +10 -10
  60. scitex/{fig → canvas}/editor/flask_editor/templates/_styles.py +3 -3
  61. scitex/{fig → canvas}/io/__init__.py +32 -38
  62. scitex/{fig → canvas}/io/_bundle.py +217 -154
  63. scitex/{fig → canvas}/io/_canvas.py +1 -1
  64. scitex/{fig → canvas}/io/_data.py +1 -1
  65. scitex/{fig → canvas}/io/_export.py +1 -1
  66. scitex/{fig → canvas}/io/_load.py +1 -1
  67. scitex/{fig → canvas}/io/_panel.py +1 -1
  68. scitex/{fig → canvas}/io/_save.py +1 -1
  69. scitex/canvas/mcp_server.py +151 -0
  70. scitex/{fig → canvas}/model/__init__.py +1 -1
  71. scitex/{fig → canvas}/model/_annotations.py +1 -1
  72. scitex/{fig → canvas}/model/_axes.py +1 -1
  73. scitex/{fig → canvas}/model/_figure.py +1 -1
  74. scitex/{fig → canvas}/model/_guides.py +1 -1
  75. scitex/{fig → canvas}/model/_plot.py +1 -1
  76. scitex/{fig → canvas}/model/_styles.py +1 -1
  77. scitex/{fig → canvas}/utils/__init__.py +1 -1
  78. scitex/capture/mcp_server.py +41 -12
  79. scitex/cli/audio.py +233 -0
  80. scitex/cli/capture.py +307 -0
  81. scitex/cli/convert.py +10 -6
  82. scitex/cli/main.py +27 -4
  83. scitex/cli/repro.py +233 -0
  84. scitex/cli/resource.py +240 -0
  85. scitex/cli/stats.py +325 -0
  86. scitex/cli/template.py +236 -0
  87. scitex/cli/tex.py +286 -0
  88. scitex/cli/web.py +11 -12
  89. scitex/dev/__init__.py +3 -0
  90. scitex/dev/_pyproject.py +405 -0
  91. scitex/dev/plt/__init__.py +2 -2
  92. scitex/dev/plt/mpl/get_dir_ax.py +1 -1
  93. scitex/dev/plt/mpl/get_signatures.py +1 -1
  94. scitex/dev/plt/mpl/get_signatures_details.py +1 -1
  95. scitex/diagram/README.md +7 -7
  96. scitex/diagram/_mcp_handlers.py +400 -0
  97. scitex/diagram/_mcp_tool_schemas.py +157 -0
  98. scitex/diagram/mcp_server.py +151 -0
  99. scitex/dsp/_demo_sig.py +51 -5
  100. scitex/dsp/_mne.py +13 -2
  101. scitex/dsp/_modulation_index.py +15 -3
  102. scitex/dsp/_pac.py +23 -5
  103. scitex/dsp/_psd.py +16 -4
  104. scitex/dsp/_resample.py +24 -4
  105. scitex/dsp/_transform.py +16 -3
  106. scitex/dsp/add_noise.py +15 -1
  107. scitex/dsp/norm.py +17 -2
  108. scitex/dsp/reference.py +17 -1
  109. scitex/dsp/utils/_differential_bandpass_filters.py +20 -2
  110. scitex/dsp/utils/_zero_pad.py +18 -4
  111. scitex/dt/_normalize_timestamp.py +1 -1
  112. scitex/git/_session.py +1 -1
  113. scitex/io/__init__.py +7 -19
  114. scitex/io/_load.py +15 -19
  115. scitex/io/_load_modules/_canvas.py +2 -2
  116. scitex/io/_load_modules/_con.py +17 -6
  117. scitex/io/_load_modules/_eeg.py +28 -13
  118. scitex/io/_load_modules/_optuna.py +21 -63
  119. scitex/io/_load_modules/_torch.py +11 -3
  120. scitex/io/_save.py +11 -16
  121. scitex/io/_save_modules/__init__.py +6 -10
  122. scitex/io/_save_modules/_canvas.py +3 -3
  123. scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +13 -2
  124. scitex/io/_save_modules/_plot_bundle.py +112 -0
  125. scitex/io/_save_modules/{_pltz_stx.py → _plot_scitex.py} +7 -7
  126. scitex/io/_save_modules/_stx_bundle.py +16 -16
  127. scitex/io/_save_modules/_torch.py +11 -3
  128. scitex/io/bundle/README.md +89 -80
  129. scitex/{fts/_bundle/_FTS.py → io/bundle/_Bundle.py} +197 -95
  130. scitex/io/bundle/__init__.py +67 -35
  131. scitex/{fts/_bundle → io/bundle}/_children.py +32 -40
  132. scitex/io/bundle/_core.py +184 -97
  133. scitex/{fts/_bundle/_dataclasses/_Node.py → io/bundle/_dataclasses/_Spec.py} +29 -23
  134. scitex/{fts/_bundle/_dataclasses/_NodeRefs.py → io/bundle/_dataclasses/_SpecRefs.py} +6 -6
  135. scitex/{fts/_bundle → io/bundle}/_dataclasses/__init__.py +4 -4
  136. scitex/{fts/_bundle → io/bundle}/_loader.py +19 -19
  137. scitex/io/bundle/_manifest.py +99 -0
  138. scitex/{fts/_bundle → io/bundle}/_mpl_helpers.py +119 -28
  139. scitex/io/bundle/_nested.py +113 -100
  140. scitex/{fts/_bundle → io/bundle}/_saver.py +13 -14
  141. scitex/{fts/_bundle → io/bundle}/_storage.py +3 -3
  142. scitex/io/bundle/_types.py +41 -16
  143. scitex/{fts/_bundle → io/bundle}/_validation.py +20 -18
  144. scitex/io/bundle/_zip.py +21 -31
  145. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_backend/_parser.py +1 -1
  146. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Annotations.py +1 -1
  147. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Axes.py +1 -1
  148. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Figure.py +1 -1
  149. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Guides.py +1 -1
  150. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Plot.py +1 -1
  151. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Styles.py +1 -1
  152. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_utils/_plot_layout.py +1 -1
  153. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/__init__.py +1 -1
  154. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/_app.py +1 -1
  155. scitex/{fts/_tables → io/bundle/kinds/_table}/_latex/_export.py +1 -1
  156. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_figure_exporter.py +1 -1
  157. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_table_exporter.py +1 -1
  158. scitex/io/bundle/schemas/__init__.py +30 -0
  159. scitex/mcp_server.py +159 -0
  160. scitex/parallel/_run.py +5 -4
  161. scitex/path/_find.py +60 -83
  162. scitex/path/_get_module_path.py +23 -21
  163. scitex/path/_get_spath.py +6 -27
  164. scitex/path/_getsize.py +23 -9
  165. scitex/path/_increment_version.py +31 -38
  166. scitex/path/_mk_spath.py +26 -29
  167. scitex/path/_path.py +5 -12
  168. scitex/path/_split.py +27 -15
  169. scitex/path/_this_path.py +23 -9
  170. scitex/plt/_mcp_handlers.py +361 -0
  171. scitex/plt/_mcp_tool_schemas.py +169 -0
  172. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +2 -1
  173. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +2 -2
  174. scitex/plt/gallery/_generate.py +76 -50
  175. scitex/plt/io/__init__.py +17 -19
  176. scitex/plt/io/_bundle.py +99 -52
  177. scitex/plt/io/_layered_bundle.py +303 -168
  178. scitex/plt/mcp_server.py +205 -0
  179. scitex/plt/utils/_csv_column_naming.py +250 -118
  180. scitex/repro/README_RandomStateManager.md +3 -3
  181. scitex/repro/_RandomStateManager.py +14 -14
  182. scitex/repro/_gen_ID.py +1 -1
  183. scitex/repro/_gen_timestamp.py +1 -1
  184. scitex/repro/_hash_array.py +4 -4
  185. scitex/schema/__init__.py +69 -73
  186. scitex/schema/_canvas.py +1 -1
  187. scitex/schema/_stats.py +2 -2
  188. scitex/scholar/__main__.py +24 -2
  189. scitex/scholar/_mcp_handlers.py +685 -0
  190. scitex/scholar/_mcp_tool_schemas.py +339 -0
  191. scitex/scholar/docs/template.py +1 -1
  192. scitex/scholar/examples/07_storage_integration.py +1 -1
  193. scitex/scholar/impact_factor/jcr/ImpactFactorJCREngine.py +1 -1
  194. scitex/scholar/impact_factor/jcr/build_database.py +1 -1
  195. scitex/scholar/mcp_server.py +315 -0
  196. scitex/scholar/pdf_download/ScholarPDFDownloader.py +1 -1
  197. scitex/scholar/pipelines/ScholarPipelineBibTeX.py +1 -1
  198. scitex/scholar/pipelines/ScholarPipelineParallel.py +1 -1
  199. scitex/scholar/pipelines/ScholarPipelineSingle.py +1 -1
  200. scitex/scholar/storage/PaperIO.py +1 -1
  201. scitex/session/README.md +4 -4
  202. scitex/session/__init__.py +1 -1
  203. scitex/session/_decorator.py +9 -9
  204. scitex/session/_lifecycle.py +5 -5
  205. scitex/session/template.py +1 -1
  206. scitex/stats/__init__.py +30 -33
  207. scitex/stats/__main__.py +281 -0
  208. scitex/stats/_mcp_handlers.py +1191 -0
  209. scitex/stats/_mcp_tool_schemas.py +384 -0
  210. scitex/stats/_schema.py +1 -1
  211. scitex/stats/correct/_correct_bonferroni.py +1 -1
  212. scitex/stats/correct/_correct_fdr.py +1 -1
  213. scitex/stats/correct/_correct_fdr_.py +1 -1
  214. scitex/stats/correct/_correct_holm.py +1 -1
  215. scitex/stats/correct/_correct_sidak.py +1 -1
  216. scitex/stats/effect_sizes/_cliffs_delta.py +1 -1
  217. scitex/stats/effect_sizes/_cohens_d.py +1 -1
  218. scitex/stats/effect_sizes/_epsilon_squared.py +1 -1
  219. scitex/stats/effect_sizes/_eta_squared.py +1 -1
  220. scitex/stats/effect_sizes/_prob_superiority.py +1 -1
  221. scitex/stats/io/__init__.py +10 -11
  222. scitex/stats/io/_bundle.py +16 -16
  223. scitex/stats/mcp_server.py +405 -0
  224. scitex/stats/posthoc/_dunnett.py +1 -1
  225. scitex/stats/posthoc/_games_howell.py +1 -1
  226. scitex/stats/posthoc/_tukey_hsd.py +1 -1
  227. scitex/stats/power/_power.py +1 -1
  228. scitex/stats/utils/_effect_size.py +1 -1
  229. scitex/stats/utils/_formatters.py +1 -1
  230. scitex/stats/utils/_power.py +1 -1
  231. scitex/template/_mcp_handlers.py +259 -0
  232. scitex/template/_mcp_tool_schemas.py +112 -0
  233. scitex/template/mcp_server.py +186 -0
  234. scitex/utils/_verify_scitex_format.py +2 -2
  235. scitex/utils/template.py +1 -1
  236. scitex/web/__init__.py +12 -11
  237. scitex/web/_scraping.py +26 -265
  238. scitex/web/download_images.py +316 -0
  239. scitex/writer/Writer.py +1 -1
  240. scitex/writer/_clone_writer_project.py +1 -1
  241. scitex/writer/_validate_tree_structures.py +1 -1
  242. scitex/writer/dataclasses/config/_WriterConfig.py +1 -1
  243. scitex/writer/dataclasses/contents/_ManuscriptContents.py +1 -1
  244. scitex/writer/dataclasses/core/_Document.py +1 -1
  245. scitex/writer/dataclasses/core/_DocumentSection.py +1 -1
  246. scitex/writer/dataclasses/results/_CompilationResult.py +1 -1
  247. scitex/writer/dataclasses/results/_LaTeXIssue.py +1 -1
  248. scitex/writer/utils/.legacy_git_retry.py +7 -5
  249. scitex/writer/utils/_parse_latex_logs.py +1 -1
  250. scitex-2.13.0.dist-info/METADATA +1231 -0
  251. {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/RECORD +376 -470
  252. scitex-2.13.0.dist-info/entry_points.txt +11 -0
  253. scitex/fig/editor/_defaults.py +0 -300
  254. scitex/fig/editor/edit/panel_loader.py +0 -232
  255. scitex/fig/editor/flask_editor/_bbox.py +0 -1299
  256. scitex/fig/editor/flask_editor/_core.py +0 -1429
  257. scitex/fig/editor/flask_editor/_renderer.py +0 -813
  258. scitex/fig/editor/flask_editor/static/css/features/canvas.css +0 -176
  259. scitex/fts/README.md +0 -262
  260. scitex/fts/TODO.md +0 -66
  261. scitex/fts/__init__.py +0 -90
  262. scitex/fts/_bundle/README_IN_BUNDLE.md +0 -102
  263. scitex/fts/_bundle/__init__.py +0 -38
  264. scitex/fts/_bundle/_utils/__init__.py +0 -55
  265. scitex/fts/_bundle/_utils/_const.py +0 -26
  266. scitex/fts/_bundle/_utils/_errors.py +0 -73
  267. scitex/fts/_bundle/_utils/_generate.py +0 -21
  268. scitex/fts/_bundle/_utils/_types.py +0 -76
  269. scitex/fts/_bundle/_zipbundle.py +0 -165
  270. scitex/fts/_fig/__init__.py +0 -22
  271. scitex/fts/_fig/_backend/_parser.py +0 -188
  272. scitex/fts/_fig/_editor/__init__.py +0 -14
  273. scitex/fts/_fig/_editor/_cui/__init__.py +0 -33
  274. scitex/fts/_fig/_editor/_cui/_backend_detector.py +0 -39
  275. scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +0 -366
  276. scitex/fts/_fig/_editor/_cui/_editor_launcher.py +0 -175
  277. scitex/fts/_fig/_editor/_cui/_manual_handler.py +0 -52
  278. scitex/fts/_fig/_editor/_cui/_path_resolver.py +0 -66
  279. scitex/fts/_fig/_editor/_gui/__init__.py +0 -11
  280. scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +0 -20
  281. scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +0 -664
  282. scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +0 -79
  283. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +0 -41
  284. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +0 -16
  285. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +0 -85
  286. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +0 -217
  287. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +0 -93
  288. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +0 -57
  289. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +0 -112
  290. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +0 -59
  291. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +0 -212
  292. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +0 -190
  293. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +0 -59
  294. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +0 -45
  295. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +0 -95
  296. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +0 -101
  297. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +0 -138
  298. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +0 -31
  299. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +0 -7
  300. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +0 -56
  301. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +0 -78
  302. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +0 -314
  303. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +0 -107
  304. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +0 -54
  305. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +0 -172
  306. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +0 -258
  307. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +0 -48
  308. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +0 -71
  309. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +0 -288
  310. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +0 -143
  311. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +0 -245
  312. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +0 -992
  313. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +0 -339
  314. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +0 -286
  315. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +0 -371
  316. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +0 -293
  317. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +0 -426
  318. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +0 -152
  319. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +0 -265
  320. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +0 -184
  321. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +0 -57
  322. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +0 -100
  323. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +0 -34
  324. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +0 -124
  325. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +0 -851
  326. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +0 -4932
  327. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +0 -1657
  328. scitex/fts/_fig/_editor/_gui/_flask_editor.py +0 -36
  329. scitex/fts/_fig/_models/_Annotations.py +0 -115
  330. scitex/fts/_fig/_models/_Axes.py +0 -152
  331. scitex/fts/_fig/_models/_Figure.py +0 -138
  332. scitex/fts/_fig/_models/_Plot.py +0 -123
  333. scitex/fts/_fig/_utils/_plot_layout.py +0 -397
  334. scitex/fts/_kinds/_figure/_composite.py +0 -345
  335. scitex/fts/_kinds/_plot/_backend/__init__.py +0 -53
  336. scitex/fts/_kinds/_plot/_backend/_export.py +0 -165
  337. scitex/fts/_kinds/_plot/_backend/_render.py +0 -538
  338. scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +0 -46
  339. scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +0 -82
  340. scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +0 -441
  341. scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +0 -52
  342. scitex/fts/_kinds/_plot/_dataclasses/__init__.py +0 -47
  343. scitex/fts/_kinds/_plot/_models/_Guides.py +0 -104
  344. scitex/fts/_kinds/_plot/_models/_Styles.py +0 -245
  345. scitex/fts/_kinds/_plot/_models/__init__.py +0 -80
  346. scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +0 -156
  347. scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +0 -43
  348. scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +0 -38
  349. scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +0 -36
  350. scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +0 -60
  351. scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +0 -30
  352. scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +0 -61
  353. scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +0 -57
  354. scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +0 -30
  355. scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +0 -121
  356. scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +0 -36
  357. scitex/fts/_kinds/_plot/_utils/__init__.py +0 -129
  358. scitex/fts/_kinds/_plot/_utils/_auto_layout.py +0 -127
  359. scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +0 -111
  360. scitex/fts/_kinds/_plot/_utils/_const_sizes.py +0 -48
  361. scitex/fts/_kinds/_plot/_utils/_convert_coords.py +0 -77
  362. scitex/fts/_kinds/_plot/_utils/_get_template.py +0 -178
  363. scitex/fts/_kinds/_plot/_utils/_normalize.py +0 -73
  364. scitex/fts/_kinds/_plot/_utils/_validate.py +0 -197
  365. scitex/fts/_kinds/_table/_latex/_export.py +0 -279
  366. scitex/fts/_stats/__init__.py +0 -48
  367. scitex/fts/_stats/_dataclasses/_Stats.py +0 -423
  368. scitex/fts/_stats/_dataclasses/__init__.py +0 -48
  369. scitex/fts/_tables/__init__.py +0 -65
  370. scitex/fts/_tables/_latex/__init__.py +0 -93
  371. scitex/fts/_tables/_latex/_editor/__init__.py +0 -11
  372. scitex/fts/_tables/_latex/_editor/_app.py +0 -725
  373. scitex/fts/_tables/_latex/_figure_exporter.py +0 -153
  374. scitex/fts/_tables/_latex/_stats_formatter.py +0 -274
  375. scitex/fts/_tables/_latex/_table_exporter.py +0 -362
  376. scitex/fts/_tables/_latex/_utils.py +0 -369
  377. scitex/fts/_tables/_latex/_validator.py +0 -445
  378. scitex/io/_save_modules/_pltz_bundle.py +0 -356
  379. scitex-2.10.3.dist-info/METADATA +0 -952
  380. scitex-2.10.3.dist-info/entry_points.txt +0 -2
  381. /scitex/{fig → canvas}/README.md +0 -0
  382. /scitex/{fig → canvas}/backend/__init__.py +0 -0
  383. /scitex/{fig → canvas}/backend/_export.py +0 -0
  384. /scitex/{fig → canvas}/backend/_render.py +0 -0
  385. /scitex/{fig → canvas}/docs/CANVAS_ARCHITECTURE.md +0 -0
  386. /scitex/{fig → canvas}/editor/__init__.py +0 -0
  387. /scitex/{fig → canvas}/editor/_dearpygui_editor.py +0 -0
  388. /scitex/{fig → canvas}/editor/_flask_editor.py +0 -0
  389. /scitex/{fig → canvas}/editor/_mpl_editor.py +0 -0
  390. /scitex/{fig → canvas}/editor/_qt_editor.py +0 -0
  391. /scitex/{fig → canvas}/editor/_tkinter_editor.py +0 -0
  392. /scitex/{fig → canvas}/editor/edit/backend_detector.py +0 -0
  393. /scitex/{fig → canvas}/editor/edit/manual_handler.py +0 -0
  394. /scitex/{fig → canvas}/editor/edit/path_resolver.py +0 -0
  395. /scitex/{fig → canvas}/editor/flask_editor/__init__.py +0 -0
  396. /scitex/{fig → canvas}/editor/flask_editor/_plotter.py +0 -0
  397. /scitex/{fig → canvas}/editor/flask_editor/_utils.py +0 -0
  398. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/reset.css +0 -0
  399. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/typography.css +0 -0
  400. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/variables.css +0 -0
  401. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/buttons.css +0 -0
  402. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/context-menu.css +0 -0
  403. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/dropdown.css +0 -0
  404. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/forms.css +0 -0
  405. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/modal.css +0 -0
  406. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/sections.css +0 -0
  407. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/element-inspector.css +0 -0
  408. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/loading.css +0 -0
  409. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/overlay.css +0 -0
  410. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/selection.css +0 -0
  411. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/statistics.css +0 -0
  412. /scitex/{fig → canvas}/editor/flask_editor/static/css/index.css +0 -0
  413. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/container.css +0 -0
  414. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/controls.css +0 -0
  415. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/preview.css +0 -0
  416. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/axis.js +0 -0
  417. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/basic.js +0 -0
  418. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/distribute.js +0 -0
  419. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/canvas.js +0 -0
  420. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/dragging.js +0 -0
  421. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/resize.js +0 -0
  422. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/selection.js +0 -0
  423. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/state.js +0 -0
  424. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/utils.js +0 -0
  425. /scitex/{fig → canvas}/editor/flask_editor/static/js/dev/element-inspector.js +0 -0
  426. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/bbox.js +0 -0
  427. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/element-drag.js +0 -0
  428. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/overlay.js +0 -0
  429. /scitex/{fig → canvas}/editor/flask_editor/static/js/main.js +0 -0
  430. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/context-menu.js +0 -0
  431. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/keyboard.js +0 -0
  432. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/controls.js +0 -0
  433. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/download.js +0 -0
  434. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/help.js +0 -0
  435. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/theme.js +0 -0
  436. /scitex/{fig → canvas}/editor/flask_editor/templates/__init__.py +0 -0
  437. /scitex/{fig → canvas}/io/_directory.py +0 -0
  438. /scitex/{fig → canvas}/model/_plot_types.py +0 -0
  439. /scitex/{fig → canvas}/utils/_defaults.py +0 -0
  440. /scitex/{fig → canvas}/utils/_validate.py +0 -0
  441. /scitex/{fts/_bundle → io/bundle}/_conversion/__init__.py +0 -0
  442. /scitex/{fts/_bundle → io/bundle}/_conversion/_bundle2dict.py +0 -0
  443. /scitex/{fts/_bundle → io/bundle}/_conversion/_dict2bundle.py +0 -0
  444. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_Axes.py +0 -0
  445. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_BBox.py +0 -0
  446. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_ColumnDef.py +0 -0
  447. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataFormat.py +0 -0
  448. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataInfo.py +0 -0
  449. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataSource.py +0 -0
  450. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_SizeMM.py +0 -0
  451. /scitex/{fts/_bundle → io/bundle}/_extractors/__init__.py +0 -0
  452. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_bar.py +0 -0
  453. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_line.py +0 -0
  454. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_scatter.py +0 -0
  455. /scitex/{fts/_kinds → io/bundle/kinds}/__init__.py +0 -0
  456. /scitex/{fts/_kinds → io/bundle/kinds}/_figure/__init__.py +0 -0
  457. /scitex/{fts/_fig → io/bundle/kinds/_figure}/_composite.py +0 -0
  458. /scitex/{fts/_kinds → io/bundle/kinds}/_plot/__init__.py +0 -0
  459. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/__init__.py +0 -0
  460. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_export.py +0 -0
  461. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_render.py +0 -0
  462. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_ChannelEncoding.py +0 -0
  463. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Encoding.py +0 -0
  464. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Theme.py +0 -0
  465. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_TraceEncoding.py +0 -0
  466. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/__init__.py +0 -0
  467. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/__init__.py +0 -0
  468. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/__init__.py +0 -0
  469. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_bar.py +0 -0
  470. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_box.py +0 -0
  471. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_distribution.py +0 -0
  472. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_errorbar.py +0 -0
  473. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_histogram.py +0 -0
  474. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_image.py +0 -0
  475. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_line.py +0 -0
  476. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_scatter.py +0 -0
  477. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_seaborn.py +0 -0
  478. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_violin.py +0 -0
  479. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/__init__.py +0 -0
  480. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_auto_layout.py +0 -0
  481. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_calc_bounds.py +0 -0
  482. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_const_sizes.py +0 -0
  483. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_convert_coords.py +0 -0
  484. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_get_template.py +0 -0
  485. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_normalize.py +0 -0
  486. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_validate.py +0 -0
  487. /scitex/{fts/_kinds → io/bundle/kinds}/_shape/__init__.py +0 -0
  488. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/__init__.py +0 -0
  489. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/_Stats.py +0 -0
  490. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/__init__.py +0 -0
  491. /scitex/{fts/_kinds → io/bundle/kinds}/_table/__init__.py +0 -0
  492. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/__init__.py +0 -0
  493. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_stats_formatter.py +0 -0
  494. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_utils.py +0 -0
  495. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_validator.py +0 -0
  496. /scitex/{fts/_kinds → io/bundle/kinds}/_text/__init__.py +0 -0
  497. /scitex/{fts/_schemas → io/bundle/schemas}/data_info.schema.json +0 -0
  498. /scitex/{fts/_schemas → io/bundle/schemas}/encoding.schema.json +0 -0
  499. /scitex/{fts/_schemas → io/bundle/schemas}/node.schema.json +0 -0
  500. /scitex/{fts/_schemas → io/bundle/schemas}/render_manifest.schema.json +0 -0
  501. /scitex/{fts/_schemas → io/bundle/schemas}/stats.schema.json +0 -0
  502. /scitex/{fts/_schemas → io/bundle/schemas}/theme.schema.json +0 -0
  503. {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/WHEEL +0 -0
  504. {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,1657 +0,0 @@
1
- #!/usr/bin/env python3
2
- # File: ./src/scitex/vis/editor/flask_editor/templates/styles.py
3
- """CSS styles for the Flask editor UI.
4
-
5
- DEPRECATED: This inline CSS module is kept for fallback compatibility only.
6
- The CSS has been modularized into static/css/ directory:
7
- - static/css/index.css (main entry point with @imports)
8
- - static/css/base/ (variables, reset, typography)
9
- - static/css/layout/ (container, preview, controls)
10
- - static/css/components/ (buttons, forms, sections, dropdown, modal, context-menu)
11
- - static/css/features/ (canvas, panel-grid, selection, overlay, loading, statistics)
12
-
13
- To use static files (recommended):
14
- Set USE_STATIC_FILES = True in templates/__init__.py
15
-
16
- To use this inline version (fallback):
17
- Set USE_STATIC_FILES = False in templates/__init__.py
18
- """
19
-
20
- CSS_STYLES = """
21
- /* =============================================================================
22
- * SciTeX Color System - Based on scitex-cloud/static/shared/css
23
- * ============================================================================= */
24
- :root, [data-theme="light"] {
25
- /* Brand colors (light mode) */
26
- --scitex-01: #1a2a40;
27
- --scitex-02: #34495e;
28
- --scitex-03: #506b7a;
29
- --scitex-04: #6c8ba0;
30
- --scitex-05: #8fa4b0;
31
- --scitex-06: #b5c7d1;
32
- --scitex-07: #d4e1e8;
33
- --white: #fafbfc;
34
- --gray-subtle: #f6f8fa;
35
-
36
- /* Semantic tokens */
37
- --text-primary: var(--scitex-01);
38
- --text-secondary: var(--scitex-02);
39
- --text-muted: var(--scitex-04);
40
- --text-inverse: var(--white);
41
-
42
- --bg-page: #fefefe;
43
- --bg-surface: var(--white);
44
- --bg-muted: var(--gray-subtle);
45
-
46
- --border-default: var(--scitex-05);
47
- --border-muted: var(--scitex-06);
48
-
49
- /* Workspace colors */
50
- --workspace-bg-primary: #f8f9fa;
51
- --workspace-bg-secondary: #f3f4f6;
52
- --workspace-bg-tertiary: #ebedef;
53
- --workspace-bg-elevated: #ffffff;
54
- --workspace-border-subtle: #e0e4e8;
55
- --workspace-border-default: #b5c7d1;
56
-
57
- /* Status */
58
- --status-success: #4a9b7e;
59
- --status-warning: #b8956a;
60
- --status-error: #a67373;
61
-
62
- /* CTA */
63
- --color-cta: #3b82f6;
64
- --color-cta-hover: #2563eb;
65
-
66
- /* Preview background (checkered for transparency) */
67
- --preview-bg: linear-gradient(45deg, #e0e0e0 25%, transparent 25%),
68
- linear-gradient(-45deg, #e0e0e0 25%, transparent 25%),
69
- linear-gradient(45deg, transparent 75%, #e0e0e0 75%),
70
- linear-gradient(-45deg, transparent 75%, #e0e0e0 75%);
71
- }
72
-
73
- [data-theme="dark"] {
74
- /* Semantic tokens (dark mode) */
75
- --text-primary: var(--scitex-07);
76
- --text-secondary: var(--scitex-05);
77
- --text-muted: var(--scitex-04);
78
- --text-inverse: var(--scitex-01);
79
-
80
- --bg-page: #0f1419;
81
- --bg-surface: var(--scitex-01);
82
- --bg-muted: var(--scitex-02);
83
-
84
- --border-default: var(--scitex-03);
85
- --border-muted: var(--scitex-02);
86
-
87
- /* Workspace colors */
88
- --workspace-bg-primary: #0d0d0d;
89
- --workspace-bg-secondary: #151515;
90
- --workspace-bg-tertiary: #1a1a1a;
91
- --workspace-bg-elevated: #1f1f1f;
92
- --workspace-border-subtle: #1a1a1a;
93
- --workspace-border-default: #3a3a3a;
94
-
95
- /* Status */
96
- --status-success: #6ba89a;
97
- --status-warning: #d4a87a;
98
- --status-error: #c08888;
99
-
100
- /* Preview background (darker checkered) */
101
- --preview-bg: linear-gradient(45deg, #2a2a2a 25%, transparent 25%),
102
- linear-gradient(-45deg, #2a2a2a 25%, transparent 25%),
103
- linear-gradient(45deg, transparent 75%, #2a2a2a 75%),
104
- linear-gradient(-45deg, transparent 75%, #2a2a2a 75%);
105
- }
106
-
107
- /* =============================================================================
108
- * Base Styles
109
- * ============================================================================= */
110
- * { box-sizing: border-box; margin: 0; padding: 0; }
111
-
112
- body {
113
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
114
- background: var(--workspace-bg-primary);
115
- color: var(--text-primary);
116
- transition: background 0.3s, color 0.3s;
117
- }
118
-
119
- .container { display: flex; height: 100vh; }
120
-
121
- /* =============================================================================
122
- * Preview Panel
123
- * ============================================================================= */
124
- .preview {
125
- flex: 2;
126
- padding: 20px;
127
- display: flex;
128
- align-items: center;
129
- justify-content: center;
130
- background: var(--workspace-bg-secondary);
131
- }
132
-
133
- .preview-wrapper {
134
- background: var(--preview-bg);
135
- background-size: 20px 20px;
136
- background-position: 0 0, 0 10px, 10px -10px, -10px 0px;
137
- border-radius: 8px;
138
- padding: 10px;
139
- box-shadow: 0 4px 20px rgba(0,0,0,0.15);
140
- }
141
-
142
- .preview img {
143
- max-width: 100%;
144
- max-height: calc(100vh - 80px);
145
- display: block;
146
- }
147
-
148
- /* Hover overlay for interactive selection */
149
- .preview-container {
150
- position: relative;
151
- display: inline-block;
152
- }
153
-
154
- .hover-overlay {
155
- position: absolute;
156
- top: 0;
157
- left: 0;
158
- pointer-events: none;
159
- }
160
-
161
- /* Color-neutral hover/selection: white outline with glow works with any element color */
162
- .hover-rect {
163
- fill: none;
164
- stroke: rgba(255, 255, 255, 0.9);
165
- stroke-width: 2;
166
- pointer-events: none;
167
- filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.5)) drop-shadow(0 0 1px rgba(255, 255, 255, 0.8));
168
- }
169
-
170
- .selected-rect {
171
- fill: none;
172
- stroke: rgba(255, 255, 255, 1);
173
- stroke-width: 2;
174
- stroke-dasharray: 4 2;
175
- pointer-events: none;
176
- filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.7)) drop-shadow(0 0 2px rgba(255, 255, 255, 1));
177
- }
178
-
179
- .hover-label {
180
- font-size: 10px;
181
- fill: rgba(255, 255, 255, 0.9);
182
- pointer-events: none;
183
- filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.8));
184
- }
185
-
186
- .selected-label {
187
- font-size: 10px;
188
- fill: rgba(255, 255, 255, 1);
189
- pointer-events: none;
190
- filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.9));
191
- }
192
-
193
- .hover-path {
194
- fill: none;
195
- stroke: rgba(255, 255, 255, 0.9);
196
- stroke-width: 6;
197
- stroke-linecap: round;
198
- stroke-linejoin: round;
199
- pointer-events: none;
200
- filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.6));
201
- }
202
-
203
- .selected-path {
204
- fill: none;
205
- stroke: rgba(255, 255, 255, 1);
206
- stroke-width: 6;
207
- stroke-linecap: round;
208
- stroke-linejoin: round;
209
- stroke-dasharray: 8 4;
210
- pointer-events: none;
211
- filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.7));
212
- }
213
-
214
- /* Debug mode - show all hit areas */
215
- .debug-rect {
216
- fill: rgba(255, 0, 0, 0.15);
217
- stroke: rgba(255, 0, 0, 0.6);
218
- stroke-width: 1;
219
- stroke-dasharray: 4 2;
220
- pointer-events: none;
221
- }
222
-
223
- .debug-rect-trace {
224
- fill: rgba(0, 255, 0, 0.15);
225
- stroke: rgba(0, 200, 0, 0.8);
226
- stroke-width: 1;
227
- stroke-dasharray: 3 2;
228
- pointer-events: none;
229
- }
230
-
231
- .debug-rect-legend {
232
- fill: rgba(255, 165, 0, 0.2);
233
- stroke: rgba(255, 140, 0, 0.8);
234
- stroke-width: 1;
235
- stroke-dasharray: 3 2;
236
- pointer-events: none;
237
- }
238
-
239
- .debug-label {
240
- font-size: 8px;
241
- fill: rgba(255, 0, 0, 0.9);
242
- pointer-events: none;
243
- font-family: monospace;
244
- }
245
-
246
- .debug-path {
247
- fill: none;
248
- stroke: rgba(0, 200, 0, 0.7);
249
- stroke-width: 2;
250
- stroke-linecap: round;
251
- stroke-linejoin: round;
252
- stroke-dasharray: 5 3;
253
- pointer-events: none;
254
- }
255
-
256
- .debug-toggle {
257
- position: fixed;
258
- bottom: 10px;
259
- right: 10px;
260
- z-index: 1000;
261
- padding: 8px 12px;
262
- background: #333;
263
- color: #fff;
264
- border: none;
265
- border-radius: 4px;
266
- cursor: pointer;
267
- font-size: 12px;
268
- }
269
-
270
- .debug-toggle:hover {
271
- background: #555;
272
- }
273
-
274
- .debug-toggle.active {
275
- background: #c00;
276
- }
277
-
278
- /* Hover scatter: White ring around points */
279
- .hover-scatter {
280
- fill: none;
281
- stroke: rgba(255, 255, 255, 0.9);
282
- stroke-width: 3;
283
- pointer-events: none;
284
- filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.6));
285
- }
286
-
287
- /* Selected scatter: Dashed white ring */
288
- .selected-scatter {
289
- fill: none;
290
- stroke: rgba(255, 255, 255, 1);
291
- stroke-width: 3;
292
- stroke-dasharray: 3 2;
293
- pointer-events: none;
294
- filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.7));
295
- }
296
-
297
- /* =============================================================================
298
- * Selected Element Panel
299
- * ============================================================================= */
300
- #section-selected {
301
- border: 2px solid var(--accent-muted);
302
- background: var(--bg-secondary);
303
- }
304
-
305
- #section-selected .section-header {
306
- background: var(--accent-muted);
307
- color: var(--text-primary);
308
- font-weight: 600;
309
- }
310
-
311
- .selected-info {
312
- display: flex;
313
- align-items: center;
314
- gap: 10px;
315
- margin-bottom: 12px;
316
- padding: 8px;
317
- background: var(--bg-primary);
318
- border-radius: 4px;
319
- }
320
-
321
- .element-type-badge {
322
- padding: 4px 10px;
323
- border-radius: 12px;
324
- font-size: 11px;
325
- font-weight: 600;
326
- text-transform: uppercase;
327
- }
328
-
329
- .element-type-badge.trace { background: #3498db; color: white; }
330
- .element-type-badge.scatter { background: #e74c3c; color: white; }
331
- .element-type-badge.fill { background: #9b59b6; color: white; }
332
- .element-type-badge.bar { background: #f39c12; color: white; }
333
- .element-type-badge.label { background: #2ecc71; color: white; }
334
- .element-type-badge.panel { background: #34495e; color: white; }
335
- .element-type-badge.legend { background: #1abc9c; color: white; }
336
-
337
- .element-axis-info {
338
- font-size: 12px;
339
- color: var(--text-secondary);
340
- }
341
-
342
- .element-props {
343
- border-top: 1px solid var(--border-color);
344
- padding-top: 12px;
345
- margin-top: 8px;
346
- }
347
-
348
- /* Range slider styling */
349
- input[type="range"] {
350
- width: 100%;
351
- height: 6px;
352
- border-radius: 3px;
353
- background: var(--bg-tertiary);
354
- outline: none;
355
- -webkit-appearance: none;
356
- }
357
-
358
- input[type="range"]::-webkit-slider-thumb {
359
- -webkit-appearance: none;
360
- width: 16px;
361
- height: 16px;
362
- border-radius: 50%;
363
- background: var(--accent);
364
- cursor: pointer;
365
- }
366
-
367
- input[type="range"]::-moz-range-thumb {
368
- width: 16px;
369
- height: 16px;
370
- border-radius: 50%;
371
- background: var(--accent);
372
- cursor: pointer;
373
- border: none;
374
- }
375
-
376
- /* =============================================================================
377
- * Controls Panel
378
- * ============================================================================= */
379
- .controls {
380
- flex: 1;
381
- min-width: 320px;
382
- max-width: 420px;
383
- background: var(--workspace-bg-elevated);
384
- border-left: 1px solid var(--workspace-border-default);
385
- overflow-y: auto;
386
- display: flex;
387
- flex-direction: column;
388
- }
389
-
390
- .controls-header {
391
- padding: 12px 16px;
392
- border-bottom: 1px solid var(--workspace-border-subtle);
393
- display: flex;
394
- justify-content: space-between;
395
- align-items: center;
396
- background: var(--bg-surface);
397
- position: sticky;
398
- top: 0;
399
- z-index: 10;
400
- }
401
-
402
- .controls-header h1 {
403
- font-size: 1.0em;
404
- font-weight: 600;
405
- color: var(--status-success);
406
- }
407
-
408
- .controls-body {
409
- padding: 0 14px 14px;
410
- flex: 1;
411
- }
412
-
413
- .filename {
414
- font-size: 0.8em;
415
- color: var(--text-muted);
416
- margin-top: 4px;
417
- word-break: break-all;
418
- }
419
-
420
- .panel-path {
421
- font-size: 0.75em;
422
- color: var(--text-muted);
423
- margin-top: 2px;
424
- opacity: 0.8;
425
- }
426
-
427
- /* Theme toggle */
428
- .theme-toggle {
429
- background: transparent;
430
- border: 1px solid var(--border-muted);
431
- color: var(--text-secondary);
432
- cursor: pointer;
433
- font-size: 16px;
434
- padding: 6px 10px;
435
- border-radius: 6px;
436
- transition: all 0.2s;
437
- display: flex;
438
- align-items: center;
439
- gap: 6px;
440
- }
441
-
442
- .theme-toggle:hover {
443
- background: var(--bg-muted);
444
- border-color: var(--border-default);
445
- }
446
-
447
- /* =============================================================================
448
- * Section Headers
449
- * ============================================================================= */
450
- .section {
451
- margin-top: 10px;
452
- }
453
-
454
- .section-header {
455
- font-size: 0.72em;
456
- font-weight: 600;
457
- text-transform: uppercase;
458
- letter-spacing: 0.5px;
459
- color: var(--text-inverse);
460
- background: var(--status-success);
461
- padding: 6px 10px;
462
- border-radius: 4px;
463
- margin-bottom: 8px;
464
- }
465
-
466
- /* =============================================================================
467
- * Form Fields
468
- * ============================================================================= */
469
- .field { margin-bottom: 8px; }
470
-
471
- .field label {
472
- display: block;
473
- font-size: 0.78em;
474
- font-weight: 500;
475
- margin-bottom: 3px;
476
- color: var(--text-secondary);
477
- }
478
-
479
- .field input[type="text"],
480
- .field input[type="number"],
481
- .field select {
482
- width: 100%;
483
- padding: 5px 8px;
484
- border: 1px solid var(--border-muted);
485
- border-radius: 4px;
486
- background: var(--bg-surface);
487
- color: var(--text-primary);
488
- font-size: 0.82em;
489
- transition: border-color 0.2s;
490
- }
491
-
492
- .field input:focus,
493
- .field select:focus {
494
- outline: none;
495
- border-color: var(--status-success);
496
- }
497
-
498
- .field input[type="color"] {
499
- width: 40px;
500
- height: 32px;
501
- padding: 2px;
502
- border: 1px solid var(--border-muted);
503
- border-radius: 4px;
504
- cursor: pointer;
505
- background: var(--bg-surface);
506
- }
507
-
508
- .field-row {
509
- display: flex;
510
- gap: 8px;
511
- }
512
-
513
- .field-row .field { flex: 1; margin-bottom: 0; }
514
-
515
- /* Checkbox styling */
516
- .checkbox-field {
517
- display: flex;
518
- align-items: center;
519
- gap: 6px;
520
- cursor: pointer;
521
- padding: 4px 0;
522
- }
523
-
524
- .checkbox-field input[type="checkbox"] {
525
- width: 16px;
526
- height: 16px;
527
- accent-color: var(--status-success);
528
- }
529
-
530
- .checkbox-field span {
531
- font-size: 0.85em;
532
- color: var(--text-primary);
533
- }
534
-
535
- /* Color field with input */
536
- .color-field {
537
- display: flex;
538
- align-items: center;
539
- gap: 8px;
540
- }
541
-
542
- .color-field input[type="text"] {
543
- flex: 1;
544
- }
545
-
546
- /* =============================================================================
547
- * Traces Section
548
- * ============================================================================= */
549
- .traces-list {
550
- max-height: 200px;
551
- overflow-y: auto;
552
- border: 1px solid var(--border-muted);
553
- border-radius: 4px;
554
- background: var(--bg-muted);
555
- }
556
-
557
- .trace-item {
558
- display: flex;
559
- align-items: center;
560
- gap: 8px;
561
- padding: 8px 10px;
562
- border-bottom: 1px solid var(--border-muted);
563
- font-size: 0.85em;
564
- }
565
-
566
- .trace-item:last-child { border-bottom: none; }
567
-
568
- .trace-item-highlight {
569
- background: var(--status-success);
570
- color: var(--text-inverse);
571
- animation: traceHighlightFade 1.5s ease-out forwards;
572
- }
573
-
574
- @keyframes traceHighlightFade {
575
- 0% { background: var(--status-success); }
576
- 100% { background: var(--bg-muted); }
577
- }
578
-
579
- .trace-color {
580
- width: 24px;
581
- height: 24px;
582
- border-radius: 4px;
583
- border: 1px solid var(--border-default);
584
- cursor: pointer;
585
- }
586
-
587
- .trace-label {
588
- flex: 1;
589
- color: var(--text-primary);
590
- }
591
-
592
- .trace-style select {
593
- padding: 4px 6px;
594
- font-size: 0.8em;
595
- border: 1px solid var(--border-muted);
596
- border-radius: 3px;
597
- background: var(--bg-surface);
598
- color: var(--text-primary);
599
- }
600
-
601
- /* =============================================================================
602
- * Annotations
603
- * ============================================================================= */
604
- .annotations-list {
605
- margin-top: 10px;
606
- max-height: 120px;
607
- overflow-y: auto;
608
- }
609
-
610
- .annotation-item {
611
- display: flex;
612
- justify-content: space-between;
613
- align-items: center;
614
- padding: 6px 10px;
615
- background: var(--bg-muted);
616
- border-radius: 4px;
617
- margin-bottom: 5px;
618
- font-size: 0.85em;
619
- }
620
-
621
- .annotation-item span { color: var(--text-primary); }
622
-
623
- .annotation-item button {
624
- padding: 3px 8px;
625
- font-size: 0.75em;
626
- background: var(--status-error);
627
- border: none;
628
- border-radius: 3px;
629
- color: white;
630
- cursor: pointer;
631
- }
632
-
633
- /* =============================================================================
634
- * Buttons
635
- * ============================================================================= */
636
- .btn {
637
- width: 100%;
638
- padding: 7px 12px;
639
- margin-top: 6px;
640
- border: none;
641
- border-radius: 4px;
642
- cursor: pointer;
643
- font-size: 0.9em;
644
- font-weight: 500;
645
- transition: all 0.2s;
646
- }
647
-
648
- .btn-primary {
649
- background: var(--status-success);
650
- color: white;
651
- }
652
-
653
- .btn-primary:hover {
654
- filter: brightness(1.1);
655
- }
656
-
657
- .btn-secondary {
658
- background: var(--bg-muted);
659
- color: var(--text-primary);
660
- border: 1px solid var(--border-muted);
661
- }
662
-
663
- .btn-secondary:hover {
664
- background: var(--workspace-bg-tertiary);
665
- }
666
-
667
- .btn-cta {
668
- background: var(--color-cta);
669
- color: white;
670
- }
671
-
672
- .btn-cta:hover {
673
- background: var(--color-cta-hover);
674
- }
675
-
676
- /* =============================================================================
677
- * Unit Toggle
678
- * ============================================================================= */
679
- .unit-toggle {
680
- display: flex;
681
- gap: 0;
682
- border-radius: 4px;
683
- overflow: hidden;
684
- border: 1px solid var(--border-default);
685
- }
686
-
687
- .unit-btn {
688
- padding: 4px 12px;
689
- font-size: 0.8em;
690
- font-weight: 500;
691
- border: none;
692
- background: var(--bg-muted);
693
- color: var(--text-muted);
694
- cursor: pointer;
695
- transition: all 0.15s;
696
- }
697
-
698
- .unit-btn:first-child {
699
- border-right: 1px solid var(--border-default);
700
- }
701
-
702
- .unit-btn:hover {
703
- background: var(--bg-surface);
704
- color: var(--text-secondary);
705
- }
706
-
707
- .unit-btn.active {
708
- background: var(--color-cta);
709
- color: white;
710
- }
711
-
712
- /* =============================================================================
713
- * Background Type Toggle
714
- * ============================================================================= */
715
- .bg-toggle {
716
- display: flex;
717
- gap: 6px;
718
- }
719
-
720
- .bg-btn {
721
- display: flex;
722
- flex-direction: column;
723
- align-items: center;
724
- gap: 4px;
725
- padding: 6px 10px;
726
- font-size: 0.75em;
727
- border: 1px solid var(--border-default);
728
- border-radius: 4px;
729
- background: var(--bg-muted);
730
- color: var(--text-muted);
731
- cursor: pointer;
732
- transition: all 0.15s;
733
- flex: 1;
734
- }
735
-
736
- .bg-btn:hover {
737
- background: var(--bg-surface);
738
- color: var(--text-secondary);
739
- }
740
-
741
- .bg-btn.active {
742
- border-color: var(--color-cta);
743
- background: var(--bg-surface);
744
- color: var(--text-primary);
745
- box-shadow: 0 0 0 1px var(--color-cta);
746
- }
747
-
748
- .bg-preview {
749
- width: 20px;
750
- height: 14px;
751
- border-radius: 2px;
752
- border: 1px solid var(--border-default);
753
- }
754
-
755
- .bg-preview.white {
756
- background: #ffffff;
757
- }
758
-
759
- .bg-preview.transparent {
760
- background: linear-gradient(45deg, #ccc 25%, transparent 25%),
761
- linear-gradient(-45deg, #ccc 25%, transparent 25%),
762
- linear-gradient(45deg, transparent 75%, #ccc 75%),
763
- linear-gradient(-45deg, transparent 75%, #ccc 75%);
764
- background-size: 8px 8px;
765
- background-position: 0 0, 0 4px, 4px -4px, -4px 0px;
766
- background-color: #fff;
767
- }
768
-
769
- .bg-preview.black {
770
- background: #000000;
771
- }
772
-
773
- /* =============================================================================
774
- * Section Hints
775
- * ============================================================================= */
776
- .section-hint {
777
- font-size: 0.75em;
778
- color: var(--text-muted);
779
- font-style: italic;
780
- margin-bottom: 10px;
781
- padding: 6px 8px;
782
- background: var(--bg-muted);
783
- border-radius: 4px;
784
- border-left: 2px solid var(--border-default);
785
- }
786
-
787
- /* =============================================================================
788
- * Element Statistics
789
- * ============================================================================= */
790
- .element-stats {
791
- margin-top: 12px;
792
- padding: 10px;
793
- background: var(--bg-muted);
794
- border-radius: 4px;
795
- border: 1px solid var(--border-muted);
796
- }
797
-
798
- .stats-header {
799
- font-size: 0.8em;
800
- font-weight: 600;
801
- color: var(--text-secondary);
802
- margin-bottom: 8px;
803
- text-transform: uppercase;
804
- letter-spacing: 0.5px;
805
- }
806
-
807
- .stats-grid {
808
- display: grid;
809
- grid-template-columns: repeat(3, 1fr);
810
- gap: 8px;
811
- }
812
-
813
- .stat-item {
814
- display: flex;
815
- flex-direction: column;
816
- gap: 2px;
817
- }
818
-
819
- .stat-label {
820
- font-size: 0.7em;
821
- color: var(--text-muted);
822
- text-transform: uppercase;
823
- }
824
-
825
- .stat-value {
826
- font-size: 0.85em;
827
- font-weight: 500;
828
- color: var(--text-primary);
829
- font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
830
- }
831
-
832
- /* =============================================================================
833
- * Status Bar
834
- * ============================================================================= */
835
- .status-bar {
836
- margin-top: 16px;
837
- padding: 10px 12px;
838
- border-radius: 4px;
839
- background: var(--bg-muted);
840
- font-size: 0.8em;
841
- color: var(--text-secondary);
842
- border-left: 3px solid var(--status-success);
843
- }
844
-
845
- .status-bar.error {
846
- border-left-color: var(--status-error);
847
- }
848
-
849
- /* =============================================================================
850
- * Collapsible Sections
851
- * ============================================================================= */
852
- .section-toggle {
853
- cursor: pointer;
854
- display: flex;
855
- align-items: center;
856
- gap: 8px;
857
- }
858
-
859
- .section-toggle::before {
860
- content: "\\25BC";
861
- font-size: 0.7em;
862
- transition: transform 0.2s;
863
- }
864
-
865
- .section-toggle.collapsed::before {
866
- transform: rotate(-90deg);
867
- }
868
-
869
- .section-content {
870
- overflow: hidden;
871
- transition: max-height 0.3s ease;
872
- }
873
-
874
- .section-content.collapsed {
875
- max-height: 0 !important;
876
- }
877
-
878
- /* =============================================================================
879
- * Scrollbar Styling
880
- * ============================================================================= */
881
- .controls::-webkit-scrollbar,
882
- .traces-list::-webkit-scrollbar,
883
- .annotations-list::-webkit-scrollbar {
884
- width: 6px;
885
- }
886
-
887
- .controls::-webkit-scrollbar-track,
888
- .traces-list::-webkit-scrollbar-track,
889
- .annotations-list::-webkit-scrollbar-track {
890
- background: var(--bg-muted);
891
- }
892
-
893
- .controls::-webkit-scrollbar-thumb,
894
- .traces-list::-webkit-scrollbar-thumb,
895
- .annotations-list::-webkit-scrollbar-thumb {
896
- background: var(--border-default);
897
- border-radius: 3px;
898
- }
899
-
900
- .controls::-webkit-scrollbar-thumb:hover,
901
- .traces-list::-webkit-scrollbar-thumb:hover,
902
- .annotations-list::-webkit-scrollbar-thumb:hover {
903
- background: var(--text-muted);
904
- }
905
-
906
- /* =============================================================================
907
- * Statistics Section
908
- * ============================================================================= */
909
- #stats-container {
910
- font-family: 'JetBrains Mono', 'Fira Code', 'Monaco', monospace;
911
- font-size: 11px;
912
- line-height: 1.5;
913
- }
914
-
915
- .stats-loading {
916
- color: var(--text-muted);
917
- font-style: italic;
918
- padding: 10px;
919
- text-align: center;
920
- }
921
-
922
- .stats-empty {
923
- color: var(--text-muted);
924
- padding: 10px;
925
- text-align: center;
926
- background: var(--bg-muted);
927
- border-radius: 4px;
928
- }
929
-
930
- .stats-card {
931
- background: var(--bg-surface);
932
- border: 1px solid var(--workspace-border-subtle);
933
- border-radius: 6px;
934
- padding: 12px;
935
- margin-bottom: 10px;
936
- }
937
-
938
- .stats-card-header {
939
- display: flex;
940
- justify-content: space-between;
941
- align-items: center;
942
- margin-bottom: 8px;
943
- padding-bottom: 8px;
944
- border-bottom: 1px solid var(--workspace-border-subtle);
945
- }
946
-
947
- .stats-card-title {
948
- font-weight: 600;
949
- font-size: 12px;
950
- color: var(--text-primary);
951
- }
952
-
953
- .stats-significance {
954
- display: inline-block;
955
- padding: 2px 8px;
956
- border-radius: 4px;
957
- font-weight: bold;
958
- font-size: 11px;
959
- }
960
-
961
- .stats-significance.sig-high {
962
- background: #dcfce7;
963
- color: #166534;
964
- }
965
-
966
- .stats-significance.sig-medium {
967
- background: #fef9c3;
968
- color: #854d0e;
969
- }
970
-
971
- .stats-significance.sig-low {
972
- background: #fee2e2;
973
- color: #991b1b;
974
- }
975
-
976
- .stats-significance.sig-ns {
977
- background: var(--bg-muted);
978
- color: var(--text-muted);
979
- }
980
-
981
- .stats-row {
982
- display: flex;
983
- justify-content: space-between;
984
- padding: 3px 0;
985
- }
986
-
987
- .stats-label {
988
- color: var(--text-secondary);
989
- }
990
-
991
- .stats-value {
992
- font-weight: 500;
993
- color: var(--text-primary);
994
- }
995
-
996
- .stats-groups {
997
- display: grid;
998
- grid-template-columns: 1fr 1fr;
999
- gap: 8px;
1000
- margin-top: 8px;
1001
- padding-top: 8px;
1002
- border-top: 1px dashed var(--workspace-border-subtle);
1003
- }
1004
-
1005
- .stats-group {
1006
- background: var(--bg-muted);
1007
- padding: 8px;
1008
- border-radius: 4px;
1009
- font-size: 10px;
1010
- }
1011
-
1012
- .stats-group-name {
1013
- font-weight: 600;
1014
- margin-bottom: 4px;
1015
- color: var(--text-primary);
1016
- }
1017
-
1018
- .stats-correction-badge {
1019
- display: inline-block;
1020
- background: var(--color-cta);
1021
- color: white;
1022
- padding: 2px 6px;
1023
- border-radius: 3px;
1024
- font-size: 9px;
1025
- margin-left: 6px;
1026
- }
1027
-
1028
- .stats-summary-header {
1029
- background: var(--scitex-01);
1030
- color: var(--text-inverse);
1031
- padding: 10px 12px;
1032
- border-radius: 6px 6px 0 0;
1033
- font-weight: 600;
1034
- margin-bottom: 0;
1035
- }
1036
-
1037
- .stats-summary-body {
1038
- background: var(--bg-surface);
1039
- border: 1px solid var(--scitex-01);
1040
- border-top: none;
1041
- border-radius: 0 0 6px 6px;
1042
- padding: 12px;
1043
- }
1044
-
1045
- /* =============================================================================
1046
- * Subsection Headers (for grouped controls like X/Y axis settings)
1047
- * ============================================================================= */
1048
- .subsection-header {
1049
- font-size: 0.68em;
1050
- font-weight: 600;
1051
- text-transform: uppercase;
1052
- letter-spacing: 0.3px;
1053
- color: var(--text-secondary);
1054
- padding: 4px 6px;
1055
- margin-bottom: 6px;
1056
- margin-top: 8px;
1057
- background: var(--bg-muted);
1058
- border-left: 2px solid var(--status-success);
1059
- border-radius: 0 4px 4px 0;
1060
- }
1061
-
1062
- .subsection-header:first-child {
1063
- margin-top: 0;
1064
- }
1065
-
1066
- /* =============================================================================
1067
- * Axis Tabs (for X/Y/Z axis switching)
1068
- * ============================================================================= */
1069
- .axis-tabs {
1070
- display: flex;
1071
- gap: 3px;
1072
- margin-bottom: 8px;
1073
- background: var(--bg-muted);
1074
- padding: 3px;
1075
- border-radius: 6px;
1076
- }
1077
-
1078
- .axis-tab {
1079
- flex: 1;
1080
- padding: 4px 8px;
1081
- border: none;
1082
- background: transparent;
1083
- color: var(--text-secondary);
1084
- font-size: 0.8em;
1085
- font-weight: 600;
1086
- cursor: pointer;
1087
- border-radius: 4px;
1088
- transition: all 0.15s ease;
1089
- }
1090
-
1091
- .axis-tab:hover {
1092
- background: var(--bg-surface);
1093
- color: var(--text-primary);
1094
- }
1095
-
1096
- .axis-tab.active {
1097
- background: var(--scitex-01);
1098
- color: var(--bg-primary);
1099
- }
1100
-
1101
- .axis-panel {
1102
- animation: fadeIn 0.15s ease;
1103
- }
1104
-
1105
- @keyframes fadeIn {
1106
- from { opacity: 0; }
1107
- to { opacity: 1; }
1108
- }
1109
-
1110
- /* =============================================================================
1111
- * Loading Spinner Overlay
1112
- * ============================================================================= */
1113
- .loading-overlay {
1114
- position: absolute;
1115
- top: 0;
1116
- left: 0;
1117
- right: 0;
1118
- bottom: 0;
1119
- background: rgba(0, 0, 0, 0.3);
1120
- display: flex;
1121
- align-items: center;
1122
- justify-content: center;
1123
- z-index: 100;
1124
- border-radius: 8px;
1125
- }
1126
-
1127
- /* Global loading overlay - non-intrusive top bar style */
1128
- .global-loading-overlay {
1129
- position: fixed;
1130
- top: 0;
1131
- left: 0;
1132
- width: 100%;
1133
- height: 36px;
1134
- background: var(--workspace-bg-elevated);
1135
- border-bottom: 1px solid var(--workspace-border-default);
1136
- display: flex;
1137
- align-items: center;
1138
- justify-content: center;
1139
- z-index: 9999;
1140
- gap: 8px;
1141
- box-shadow: 0 2px 8px rgba(0,0,0,0.1);
1142
- }
1143
-
1144
- .global-loading-overlay .loading-text {
1145
- color: var(--text-secondary);
1146
- font-size: 12px;
1147
- font-weight: 500;
1148
- }
1149
-
1150
- .spinner {
1151
- width: 16px;
1152
- height: 16px;
1153
- border: 2px solid var(--scitex-06);
1154
- border-top: 2px solid var(--status-success);
1155
- border-radius: 50%;
1156
- animation: spin 0.6s linear infinite;
1157
- }
1158
-
1159
- .spinner-small {
1160
- width: 14px;
1161
- height: 14px;
1162
- border-width: 2px;
1163
- }
1164
-
1165
- @keyframes spin {
1166
- 0% { transform: rotate(0deg); }
1167
- 100% { transform: rotate(360deg); }
1168
- }
1169
-
1170
- /* =============================================================================
1171
- * Panel Grid View (for multi-panel figz bundles)
1172
- * ============================================================================= */
1173
- .panel-grid-section {
1174
- width: 100%;
1175
- margin-bottom: 20px;
1176
- background: var(--workspace-bg-elevated);
1177
- border-radius: 8px;
1178
- padding: 16px;
1179
- box-shadow: 0 2px 8px rgba(0,0,0,0.1);
1180
- }
1181
-
1182
- .panel-grid-header {
1183
- display: flex;
1184
- justify-content: space-between;
1185
- align-items: center;
1186
- margin-bottom: 12px;
1187
- }
1188
-
1189
- .panel-grid-header h3 {
1190
- font-size: 1em;
1191
- font-weight: 600;
1192
- color: var(--text-primary);
1193
- margin: 0;
1194
- }
1195
-
1196
- .panel-grid {
1197
- display: grid;
1198
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
1199
- gap: 12px;
1200
- }
1201
-
1202
- .panel-card {
1203
- background: var(--preview-bg);
1204
- background-size: 16px 16px;
1205
- background-position: 0 0, 0 8px, 8px -8px, -8px 0px;
1206
- border-radius: 6px;
1207
- overflow: hidden;
1208
- cursor: pointer;
1209
- transition: all 0.2s ease;
1210
- border: 2px solid transparent;
1211
- position: relative;
1212
- }
1213
-
1214
- .panel-card:hover {
1215
- border-color: var(--color-cta);
1216
- transform: translateY(-2px);
1217
- box-shadow: 0 4px 12px rgba(0,0,0,0.15);
1218
- }
1219
-
1220
- .panel-card.active {
1221
- border-color: var(--status-success);
1222
- box-shadow: 0 0 0 2px var(--status-success);
1223
- }
1224
-
1225
- .panel-card img {
1226
- width: 100%;
1227
- height: auto;
1228
- display: block;
1229
- }
1230
-
1231
- /* Dark mode: invert plot colors for visibility */
1232
- [data-theme="dark"] .panel-card img,
1233
- [data-theme="dark"] .panel-canvas-item img,
1234
- [data-theme="dark"] .preview-wrapper img {
1235
- filter: invert(0.88) hue-rotate(180deg);
1236
- }
1237
-
1238
- .panel-card-container {
1239
- position: relative;
1240
- display: inline-block;
1241
- width: 100%;
1242
- }
1243
-
1244
- .panel-card-overlay {
1245
- position: absolute;
1246
- top: 0;
1247
- left: 0;
1248
- pointer-events: none;
1249
- z-index: 5;
1250
- }
1251
-
1252
- .panel-card-label {
1253
- position: absolute;
1254
- top: 6px;
1255
- left: 6px;
1256
- background: rgba(0,0,0,0.7);
1257
- color: white;
1258
- padding: 3px 8px;
1259
- border-radius: 4px;
1260
- font-size: 0.75em;
1261
- font-weight: 600;
1262
- }
1263
-
1264
- .panel-card-loading {
1265
- display: flex;
1266
- align-items: center;
1267
- justify-content: center;
1268
- min-height: 120px;
1269
- color: var(--text-muted);
1270
- font-size: 0.85em;
1271
- }
1272
-
1273
- /* Panel Navigation Header */
1274
- .preview-header {
1275
- display: flex;
1276
- justify-content: space-between;
1277
- align-items: center;
1278
- padding: 8px 12px;
1279
- background: var(--workspace-bg-elevated);
1280
- border-radius: 8px 8px 0 0;
1281
- border-bottom: 1px solid var(--workspace-border-subtle);
1282
- }
1283
-
1284
- #current-panel-name {
1285
- font-weight: 600;
1286
- color: var(--text-primary);
1287
- font-size: 0.9em;
1288
- }
1289
-
1290
- .panel-nav {
1291
- display: flex;
1292
- align-items: center;
1293
- gap: 8px;
1294
- }
1295
-
1296
- #panel-indicator {
1297
- font-size: 0.8em;
1298
- color: var(--text-muted);
1299
- min-width: 50px;
1300
- text-align: center;
1301
- }
1302
-
1303
- .btn-sm {
1304
- padding: 4px 10px;
1305
- font-size: 0.8em;
1306
- width: auto;
1307
- margin: 0;
1308
- }
1309
-
1310
- /* Preview area adjustments when panel header is visible */
1311
- .preview-wrapper:has(.preview-header:not([style*="display: none"])) {
1312
- border-radius: 0 0 8px 8px;
1313
- }
1314
-
1315
- .preview {
1316
- flex-direction: column;
1317
- align-items: stretch;
1318
- padding: 20px;
1319
- overflow-y: auto;
1320
- }
1321
-
1322
- .preview > .preview-wrapper {
1323
- flex-shrink: 0;
1324
- }
1325
-
1326
- /* =============================================================================
1327
- * Unified Panel Canvas (matches figz export layout)
1328
- * Exactly matches SciTeX Cloud's .plot-preview-area styling
1329
- * ============================================================================= */
1330
- .panel-canvas {
1331
- position: relative;
1332
- min-height: 400px;
1333
- /* White background with grid pattern - exact match to SciTeX Cloud */
1334
- background: #ffffff;
1335
- background-image:
1336
- linear-gradient(0deg, transparent 23px, #e5e5e5 23px),
1337
- linear-gradient(90deg, transparent 23px, #e5e5e5 23px);
1338
- background-size: 24px 24px;
1339
- border-radius: 8px;
1340
- overflow: visible; /* Allow panels to extend slightly if needed */
1341
- }
1342
-
1343
- /* Dark mode: dark canvas background for eye comfort */
1344
- [data-theme="dark"] .panel-canvas,
1345
- .dark-mode .panel-canvas {
1346
- background: #1a1a1a;
1347
- background-image:
1348
- linear-gradient(0deg, transparent 23px, #2a2a2a 23px),
1349
- linear-gradient(90deg, transparent 23px, #2a2a2a 23px);
1350
- background-size: 24px 24px;
1351
- }
1352
-
1353
- /* Hide grid when toggled off (G key) */
1354
- .panel-canvas.hide-grid {
1355
- background-image: none !important;
1356
- }
1357
-
1358
- /* Unified canvas - panels appear as single figure matching figz export */
1359
- .panel-canvas-item {
1360
- position: absolute;
1361
- user-select: none;
1362
- background: transparent;
1363
- overflow: visible;
1364
- border: none;
1365
- cursor: grab; /* Indicate draggability */
1366
- }
1367
-
1368
- .panel-canvas-item:hover {
1369
- z-index: 10;
1370
- }
1371
-
1372
- .panel-canvas-item:active {
1373
- cursor: grabbing;
1374
- }
1375
-
1376
- .panel-canvas-item.active {
1377
- outline: 2px solid var(--status-success);
1378
- outline-offset: 2px;
1379
- }
1380
-
1381
- .panel-canvas-item .panel-card-container {
1382
- width: 100%;
1383
- height: 100%;
1384
- position: relative;
1385
- }
1386
-
1387
- .panel-canvas-item img {
1388
- width: 100%;
1389
- height: 100%;
1390
- object-fit: contain; /* Preserve aspect ratio - never distort figures */
1391
- pointer-events: none;
1392
- display: block;
1393
- }
1394
-
1395
- .panel-canvas-label {
1396
- position: absolute;
1397
- top: 4px;
1398
- left: 4px;
1399
- background: rgba(0,0,0,0.6);
1400
- color: white;
1401
- padding: 2px 6px;
1402
- border-radius: 3px;
1403
- font-size: 0.65em;
1404
- font-weight: 600;
1405
- cursor: move;
1406
- opacity: 1; /* Show by default */
1407
- transition: opacity 0.2s, background 0.2s;
1408
- z-index: 5;
1409
- }
1410
-
1411
- .panel-canvas-item:hover .panel-canvas-label {
1412
- opacity: 1;
1413
- background: rgba(0,0,0,0.8); /* Slightly darker on hover */
1414
- }
1415
-
1416
- /* Drag handle for panel repositioning */
1417
- .panel-drag-handle {
1418
- position: absolute;
1419
- top: 4px;
1420
- right: 4px;
1421
- background: rgba(0,0,0,0.5);
1422
- color: white;
1423
- padding: 2px 4px;
1424
- border-radius: 3px;
1425
- font-size: 0.7em;
1426
- cursor: move;
1427
- opacity: 0;
1428
- transition: opacity 0.2s, background 0.2s;
1429
- z-index: 5;
1430
- user-select: none;
1431
- }
1432
-
1433
- .panel-canvas-item:hover .panel-drag-handle {
1434
- opacity: 1;
1435
- }
1436
-
1437
- .panel-drag-handle:hover {
1438
- background: rgba(0,0,0,0.8);
1439
- }
1440
-
1441
- .panel-drag-handle:active {
1442
- background: var(--accent-primary);
1443
- }
1444
-
1445
- /* Position indicator while dragging */
1446
- .panel-position-indicator {
1447
- position: absolute;
1448
- bottom: 4px;
1449
- left: 4px;
1450
- background: rgba(0,0,0,0.7);
1451
- color: #4fc3f7;
1452
- padding: 2px 6px;
1453
- border-radius: 3px;
1454
- font-size: 0.6em;
1455
- font-family: monospace;
1456
- pointer-events: none;
1457
- opacity: 0;
1458
- transition: opacity 0.3s;
1459
- z-index: 5;
1460
- }
1461
-
1462
- /* Dragging state */
1463
- .panel-canvas-item.dragging {
1464
- opacity: 0.85;
1465
- z-index: 100;
1466
- box-shadow: 0 8px 24px rgba(0,0,0,0.3);
1467
- outline: 2px dashed var(--accent-primary);
1468
- outline-offset: 2px;
1469
- cursor: grabbing;
1470
- }
1471
-
1472
- .panel-canvas-item.dragging .panel-position-indicator {
1473
- opacity: 1;
1474
- }
1475
-
1476
- .canvas-controls {
1477
- display: flex;
1478
- gap: 8px;
1479
- margin-bottom: 8px;
1480
- align-items: center;
1481
- }
1482
-
1483
- .canvas-controls button {
1484
- padding: 4px 12px;
1485
- font-size: 0.8em;
1486
- }
1487
-
1488
- /* Toolbar separator */
1489
- .toolbar-separator {
1490
- width: 1px;
1491
- height: 24px;
1492
- background: #555;
1493
- margin: 0 4px;
1494
- }
1495
-
1496
- /* Download dropdown in toolbar */
1497
- .download-dropdown {
1498
- position: relative;
1499
- display: inline-block;
1500
- }
1501
-
1502
- .download-dropdown #download-btn {
1503
- background: #4a90d9;
1504
- border: none;
1505
- color: white;
1506
- padding: 4px 12px;
1507
- font-size: 0.8em;
1508
- border-radius: 3px;
1509
- cursor: pointer;
1510
- }
1511
-
1512
- .download-dropdown #download-btn:hover {
1513
- background: #5a9fe9;
1514
- }
1515
-
1516
- #download-menu {
1517
- display: none;
1518
- position: absolute;
1519
- top: 100%;
1520
- left: 0;
1521
- background: #2a2a2a;
1522
- border: 1px solid #444;
1523
- border-radius: 4px;
1524
- min-width: 160px;
1525
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
1526
- z-index: 1000;
1527
- margin-top: 4px;
1528
- padding: 4px 0;
1529
- }
1530
-
1531
- .download-item {
1532
- display: block;
1533
- padding: 8px 12px;
1534
- color: #ddd;
1535
- text-decoration: none;
1536
- font-size: 0.85em;
1537
- transition: background 0.15s;
1538
- white-space: nowrap;
1539
- }
1540
-
1541
- .download-item:hover {
1542
- background: #3a3a3a;
1543
- color: #fff;
1544
- }
1545
-
1546
- .download-divider {
1547
- height: 1px;
1548
- background: #444;
1549
- margin: 4px 0;
1550
- }
1551
-
1552
- /* =============================================================================
1553
- Context Menu (Right-Click)
1554
- ============================================================================= */
1555
- .context-menu {
1556
- position: fixed;
1557
- background: var(--bg-secondary, #2a2a2a);
1558
- border: 1px solid var(--border-color, #444);
1559
- border-radius: 6px;
1560
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
1561
- min-width: 200px;
1562
- z-index: 10000;
1563
- padding: 4px 0;
1564
- font-size: 13px;
1565
- }
1566
-
1567
- .context-menu-item {
1568
- display: flex;
1569
- align-items: center;
1570
- padding: 8px 12px;
1571
- cursor: pointer;
1572
- color: var(--text-primary, #ddd);
1573
- transition: background 0.1s;
1574
- position: relative;
1575
- }
1576
-
1577
- .context-menu-item:hover:not(.disabled) {
1578
- background: var(--accent-primary, #4a90d9);
1579
- color: #fff;
1580
- }
1581
-
1582
- .context-menu-item.disabled {
1583
- color: var(--text-muted, #666);
1584
- cursor: not-allowed;
1585
- }
1586
-
1587
- .context-menu-icon {
1588
- width: 20px;
1589
- margin-right: 8px;
1590
- text-align: center;
1591
- font-size: 14px;
1592
- }
1593
-
1594
- .context-menu-shortcut {
1595
- margin-left: auto;
1596
- font-size: 11px;
1597
- color: var(--text-muted, #888);
1598
- padding-left: 16px;
1599
- }
1600
-
1601
- .context-menu-item:hover:not(.disabled) .context-menu-shortcut {
1602
- color: rgba(255, 255, 255, 0.7);
1603
- }
1604
-
1605
- .context-menu-arrow {
1606
- margin-left: auto;
1607
- font-size: 10px;
1608
- color: var(--text-muted, #888);
1609
- }
1610
-
1611
- .context-menu-divider {
1612
- height: 1px;
1613
- background: var(--border-color, #444);
1614
- margin: 4px 0;
1615
- }
1616
-
1617
- /* Submenu */
1618
- .context-menu-submenu {
1619
- position: relative;
1620
- }
1621
-
1622
- .context-submenu {
1623
- display: none;
1624
- position: absolute;
1625
- left: 100%;
1626
- top: 0;
1627
- background: var(--bg-secondary, #2a2a2a);
1628
- border: 1px solid var(--border-color, #444);
1629
- border-radius: 6px;
1630
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
1631
- min-width: 150px;
1632
- padding: 4px 0;
1633
- }
1634
-
1635
- .context-menu-submenu:hover > .context-submenu {
1636
- display: block;
1637
- }
1638
-
1639
- .context-submenu .context-menu-item {
1640
- padding: 6px 12px;
1641
- }
1642
-
1643
- /* Panel selection styling */
1644
- .panel-canvas-item.active {
1645
- outline: 3px solid var(--accent-primary, #4a90d9);
1646
- outline-offset: 2px;
1647
- z-index: 100;
1648
- }
1649
-
1650
- .panel-canvas-item:hover:not(.active) {
1651
- outline: 2px dashed var(--accent-secondary, #6ab04c);
1652
- outline-offset: 2px;
1653
- }
1654
- """
1655
-
1656
-
1657
- # EOF