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,851 +0,0 @@
1
- #!/usr/bin/env python3
2
- # File: ./src/scitex/vis/editor/flask_editor/templates/html.py
3
- """HTML structure for the Flask editor UI."""
4
-
5
- HTML_BODY = """
6
- <div class="container">
7
- <!-- Global Loading Overlay (visible for both single and multi-panel views) -->
8
- <div id="global-loading-overlay" class="global-loading-overlay" style="display: none;">
9
- <div class="spinner"></div>
10
- <span class="loading-text">Updating...</span>
11
- </div>
12
- <div class="preview">
13
- <!-- Panel Grid View (for multi-panel figz bundles) -->
14
- <div class="panel-grid-section" id="panel-grid-section" style="display: none;">
15
- <div class="panel-grid-header">
16
- <div class="canvas-controls">
17
- <button class="btn btn-secondary btn-sm" id="panel-debug-btn" onclick="togglePanelDebugMode()">Show Hit Regions</button>
18
- <div class="toolbar-separator"></div>
19
- <div class="download-dropdown">
20
- <button class="btn btn-primary btn-sm" onclick="toggleDownloadMenu()" id="download-btn">
21
- ⬇ Download
22
- </button>
23
- <div id="download-menu" class="download-menu">
24
- <a href="/download/png" class="download-item">PNG (300 DPI)</a>
25
- <a href="/download/svg" class="download-item">SVG (Vector)</a>
26
- <a href="/download/pdf" class="download-item">PDF</a>
27
- <div class="download-divider"></div>
28
- <a href="/download/jpeg" class="download-item">JPEG</a>
29
- <a href="/download_figz" class="download-item">FIGZ Bundle</a>
30
- </div>
31
- </div>
32
- <div class="toolbar-separator"></div>
33
- <button class="btn btn-secondary btn-sm" onclick="showShortcutHelp()" title="Keyboard Shortcuts (? or F1)">
34
- ⌨ Shortcuts
35
- </button>
36
- </div>
37
- </div>
38
- <div class="panel-canvas" id="panel-canvas">
39
- <!-- Panels will be rendered here -->
40
- </div>
41
- </div>
42
-
43
- <!-- Single-panel preview (hidden for multi-panel figz bundles) -->
44
- <div class="preview-wrapper" id="preview-wrapper">
45
- <div class="preview-header" id="preview-header" style="display: none;">
46
- <span id="current-panel-name">Panel A</span>
47
- <span id="panel-indicator"></span>
48
- </div>
49
- <div class="preview-container" id="preview-container">
50
- <img id="preview" src="" alt="Figure Preview">
51
- <svg id="hover-overlay" class="hover-overlay"></svg>
52
- <div id="loading-overlay" class="loading-overlay" style="display: none;">
53
- <div class="spinner"></div>
54
- </div>
55
- </div>
56
- <button id="debug-toggle-btn" class="debug-toggle" onclick="toggleDebugMode()">Show Hit Areas</button>
57
- </div>
58
- </div>
59
- <div class="controls">
60
- <div class="controls-header">
61
- <div>
62
- <h1>SciTeX Figure Editor</h1>
63
- <div class="filename">{{ filename }}</div>
64
- {% if panel_path %}<div class="panel-path" id="panel-path-display">Panel: {{ panel_path }}</div>{% endif %}
65
- </div>
66
- <button class="theme-toggle" onclick="toggleTheme()" title="Toggle light/dark mode">
67
- <span id="theme-icon">&#9790;</span>
68
- </button>
69
- </div>
70
-
71
- <div class="controls-body">
72
- <!-- Selected Element Section (Dynamic) -->
73
- <div class="section" id="section-selected" style="display: none;">
74
- <div class="section-header section-toggle" onclick="toggleSection(this)">
75
- <span id="selected-element-title">Selected: None</span>
76
- </div>
77
- <div class="section-content">
78
- <div id="selected-element-info" class="selected-info">
79
- <div class="element-type-badge" id="element-type-badge"></div>
80
- <div class="element-axis-info" id="element-axis-info"></div>
81
- </div>
82
-
83
- <!-- Trace/Line Properties -->
84
- <div id="selected-trace-props" class="element-props" style="display: none;">
85
- <div class="field">
86
- <label>Label</label>
87
- <input type="text" id="sel-trace-label" placeholder="Trace label">
88
- </div>
89
- <div class="field">
90
- <label>Color</label>
91
- <div class="color-field">
92
- <input type="color" id="sel-trace-color" value="#1f77b4">
93
- <input type="text" id="sel-trace-color-text" value="#1f77b4">
94
- </div>
95
- </div>
96
- <div class="field-row">
97
- <div class="field">
98
- <label>Line Width (pt)</label>
99
- <input type="number" id="sel-trace-linewidth" value="1.0" min="0.1" max="5" step="0.1">
100
- </div>
101
- <div class="field">
102
- <label>Line Style</label>
103
- <select id="sel-trace-linestyle">
104
- <option value="-">Solid</option>
105
- <option value="--">Dashed</option>
106
- <option value="-.">Dash-dot</option>
107
- <option value=":">Dotted</option>
108
- </select>
109
- </div>
110
- </div>
111
- <div class="field-row">
112
- <div class="field">
113
- <label>Marker</label>
114
- <select id="sel-trace-marker">
115
- <option value="">None</option>
116
- <option value="o">Circle</option>
117
- <option value="s">Square</option>
118
- <option value="^">Triangle</option>
119
- <option value="D">Diamond</option>
120
- <option value="x">X</option>
121
- <option value="+">Plus</option>
122
- </select>
123
- </div>
124
- <div class="field">
125
- <label>Marker Size</label>
126
- <input type="number" id="sel-trace-markersize" value="4" min="1" max="20" step="0.5">
127
- </div>
128
- </div>
129
- <div class="field">
130
- <label>Alpha (0-1)</label>
131
- <input type="range" id="sel-trace-alpha" min="0" max="1" step="0.1" value="1">
132
- </div>
133
- </div>
134
-
135
- <!-- Scatter Properties -->
136
- <div id="selected-scatter-props" class="element-props" style="display: none;">
137
- <div class="field">
138
- <label>Color</label>
139
- <div class="color-field">
140
- <input type="color" id="sel-scatter-color" value="#1f77b4">
141
- <input type="text" id="sel-scatter-color-text" value="#1f77b4">
142
- </div>
143
- </div>
144
- <div class="field-row">
145
- <div class="field">
146
- <label>Marker Size</label>
147
- <input type="number" id="sel-scatter-size" value="20" min="1" max="200" step="1">
148
- </div>
149
- <div class="field">
150
- <label>Marker</label>
151
- <select id="sel-scatter-marker">
152
- <option value="o">Circle</option>
153
- <option value="s">Square</option>
154
- <option value="^">Triangle</option>
155
- <option value="D">Diamond</option>
156
- <option value="x">X</option>
157
- </select>
158
- </div>
159
- </div>
160
- <div class="field">
161
- <label>Alpha (0-1)</label>
162
- <input type="range" id="sel-scatter-alpha" min="0" max="1" step="0.1" value="0.7">
163
- </div>
164
- <div class="field">
165
- <label>Edge Color</label>
166
- <div class="color-field">
167
- <input type="color" id="sel-scatter-edgecolor" value="#000000">
168
- <input type="text" id="sel-scatter-edgecolor-text" value="#000000">
169
- </div>
170
- </div>
171
- </div>
172
-
173
- <!-- Fill Properties -->
174
- <div id="selected-fill-props" class="element-props" style="display: none;">
175
- <div class="field">
176
- <label>Fill Color</label>
177
- <div class="color-field">
178
- <input type="color" id="sel-fill-color" value="#1f77b4">
179
- <input type="text" id="sel-fill-color-text" value="#1f77b4">
180
- </div>
181
- </div>
182
- <div class="field">
183
- <label>Alpha (0-1)</label>
184
- <input type="range" id="sel-fill-alpha" min="0" max="1" step="0.05" value="0.3">
185
- </div>
186
- </div>
187
-
188
- <!-- Bar Properties -->
189
- <div id="selected-bar-props" class="element-props" style="display: none;">
190
- <div class="field">
191
- <label>Face Color</label>
192
- <div class="color-field">
193
- <input type="color" id="sel-bar-facecolor" value="#1f77b4">
194
- <input type="text" id="sel-bar-facecolor-text" value="#1f77b4">
195
- </div>
196
- </div>
197
- <div class="field">
198
- <label>Edge Color</label>
199
- <div class="color-field">
200
- <input type="color" id="sel-bar-edgecolor" value="#000000">
201
- <input type="text" id="sel-bar-edgecolor-text" value="#000000">
202
- </div>
203
- </div>
204
- <div class="field">
205
- <label>Alpha (0-1)</label>
206
- <input type="range" id="sel-bar-alpha" min="0" max="1" step="0.1" value="1">
207
- </div>
208
- </div>
209
-
210
- <!-- Label/Text Properties -->
211
- <div id="selected-label-props" class="element-props" style="display: none;">
212
- <div class="field">
213
- <label>Text</label>
214
- <input type="text" id="sel-label-text" placeholder="Label text">
215
- </div>
216
- <div class="field-row">
217
- <div class="field">
218
- <label>Font Size (pt)</label>
219
- <input type="number" id="sel-label-fontsize" value="7" min="4" max="24" step="1">
220
- </div>
221
- <div class="field">
222
- <label>Font Weight</label>
223
- <select id="sel-label-fontweight">
224
- <option value="normal">Normal</option>
225
- <option value="bold">Bold</option>
226
- </select>
227
- </div>
228
- </div>
229
- <div class="field">
230
- <label>Color</label>
231
- <div class="color-field">
232
- <input type="color" id="sel-label-color" value="#000000">
233
- <input type="text" id="sel-label-color-text" value="#000000">
234
- </div>
235
- </div>
236
- </div>
237
-
238
- <!-- Panel Properties -->
239
- <div id="selected-panel-props" class="element-props" style="display: none;">
240
- <div class="field">
241
- <label>Panel Title</label>
242
- <input type="text" id="sel-panel-title" placeholder="Panel title">
243
- </div>
244
- <div class="field-row">
245
- <div class="field">
246
- <label>X Label</label>
247
- <input type="text" id="sel-panel-xlabel" placeholder="X axis">
248
- </div>
249
- <div class="field">
250
- <label>Y Label</label>
251
- <input type="text" id="sel-panel-ylabel" placeholder="Y axis">
252
- </div>
253
- </div>
254
- <div class="field">
255
- <label>Background Color</label>
256
- <div class="color-field">
257
- <input type="color" id="sel-panel-facecolor" value="#ffffff">
258
- <input type="text" id="sel-panel-facecolor-text" value="#ffffff">
259
- </div>
260
- </div>
261
- <label class="checkbox-field">
262
- <input type="checkbox" id="sel-panel-transparent" checked>
263
- <span>Transparent</span>
264
- </label>
265
- <label class="checkbox-field">
266
- <input type="checkbox" id="sel-panel-grid">
267
- <span>Show Grid</span>
268
- </label>
269
- </div>
270
-
271
- <!-- X-Axis Properties -->
272
- <div id="selected-xaxis-props" class="element-props" style="display: none;">
273
- <div class="field-row">
274
- <div class="field">
275
- <label>Tick Font Size (pt)</label>
276
- <input type="number" id="sel-xaxis-fontsize" value="7" min="4" max="16" step="1">
277
- </div>
278
- <div class="field">
279
- <label>Label Font Size (pt)</label>
280
- <input type="number" id="sel-xaxis-label-fontsize" value="7" min="4" max="16" step="1">
281
- </div>
282
- </div>
283
- <div class="field-row">
284
- <div class="field">
285
- <label>Tick Direction</label>
286
- <select id="sel-xaxis-direction">
287
- <option value="out">Out</option>
288
- <option value="in">In</option>
289
- <option value="inout">Both</option>
290
- </select>
291
- </div>
292
- <div class="field">
293
- <label>N Ticks</label>
294
- <input type="number" id="sel-xaxis-nticks" value="5" min="2" max="15" step="1">
295
- </div>
296
- </div>
297
- <label class="checkbox-field">
298
- <input type="checkbox" id="sel-xaxis-hide-ticks">
299
- <span>Hide Ticks</span>
300
- </label>
301
- <label class="checkbox-field">
302
- <input type="checkbox" id="sel-xaxis-hide-label">
303
- <span>Hide Label</span>
304
- </label>
305
- <label class="checkbox-field">
306
- <input type="checkbox" id="sel-xaxis-hide-spine">
307
- <span>Hide Spine</span>
308
- </label>
309
- </div>
310
-
311
- <!-- Y-Axis Properties -->
312
- <div id="selected-yaxis-props" class="element-props" style="display: none;">
313
- <div class="field-row">
314
- <div class="field">
315
- <label>Tick Font Size (pt)</label>
316
- <input type="number" id="sel-yaxis-fontsize" value="7" min="4" max="16" step="1">
317
- </div>
318
- <div class="field">
319
- <label>Label Font Size (pt)</label>
320
- <input type="number" id="sel-yaxis-label-fontsize" value="7" min="4" max="16" step="1">
321
- </div>
322
- </div>
323
- <div class="field-row">
324
- <div class="field">
325
- <label>Tick Direction</label>
326
- <select id="sel-yaxis-direction">
327
- <option value="out">Out</option>
328
- <option value="in">In</option>
329
- <option value="inout">Both</option>
330
- </select>
331
- </div>
332
- <div class="field">
333
- <label>N Ticks</label>
334
- <input type="number" id="sel-yaxis-nticks" value="5" min="2" max="15" step="1">
335
- </div>
336
- </div>
337
- <label class="checkbox-field">
338
- <input type="checkbox" id="sel-yaxis-hide-ticks">
339
- <span>Hide Ticks</span>
340
- </label>
341
- <label class="checkbox-field">
342
- <input type="checkbox" id="sel-yaxis-hide-label">
343
- <span>Hide Label</span>
344
- </label>
345
- <label class="checkbox-field">
346
- <input type="checkbox" id="sel-yaxis-hide-spine">
347
- <span>Hide Spine</span>
348
- </label>
349
- </div>
350
-
351
- <!-- Statistics (for data elements) -->
352
- <div id="selected-stats" class="element-stats" style="display: none;">
353
- <div class="stats-header">Statistics</div>
354
- <div class="stats-grid">
355
- <div class="stat-item">
356
- <span class="stat-label">N points</span>
357
- <span class="stat-value" id="stat-n">-</span>
358
- </div>
359
- <div class="stat-item">
360
- <span class="stat-label">Mean</span>
361
- <span class="stat-value" id="stat-mean">-</span>
362
- </div>
363
- <div class="stat-item">
364
- <span class="stat-label">Std</span>
365
- <span class="stat-value" id="stat-std">-</span>
366
- </div>
367
- <div class="stat-item">
368
- <span class="stat-label">Min</span>
369
- <span class="stat-value" id="stat-min">-</span>
370
- </div>
371
- <div class="stat-item">
372
- <span class="stat-label">Max</span>
373
- <span class="stat-value" id="stat-max">-</span>
374
- </div>
375
- <div class="stat-item">
376
- <span class="stat-label">Range</span>
377
- <span class="stat-value" id="stat-range">-</span>
378
- </div>
379
- </div>
380
- </div>
381
-
382
- <button class="btn btn-primary" onclick="applySelectedElementChanges()" style="margin-top: 10px;">Apply Changes</button>
383
- </div>
384
- </div>
385
-
386
- <!-- Dimensions Section (General - moved higher) -->
387
- <div class="section" id="section-dimensions">
388
- <div class="section-header section-toggle collapsed" onclick="toggleSection(this)">Dimensions</div>
389
- <div class="section-content collapsed">
390
- <div class="field" style="margin-bottom: 8px;">
391
- <label>Unit</label>
392
- <div class="unit-toggle">
393
- <button class="unit-btn active" id="unit-mm" onclick="setDimensionUnit('mm')">mm</button>
394
- <button class="unit-btn" id="unit-inch" onclick="setDimensionUnit('inch')">inch</button>
395
- </div>
396
- </div>
397
- <div class="field-row">
398
- <div class="field">
399
- <label id="fig_width_label">Width (mm)</label>
400
- <input type="number" id="fig_width" value="80" min="10" max="300" step="1">
401
- </div>
402
- <div class="field">
403
- <label id="fig_height_label">Height (mm)</label>
404
- <input type="number" id="fig_height" value="68" min="10" max="300" step="1">
405
- </div>
406
- </div>
407
- <div class="field">
408
- <label>DPI</label>
409
- <input type="number" id="dpi" value="300" min="72" max="600" step="1">
410
- </div>
411
- </div>
412
- </div>
413
-
414
- <!-- Style Section (General - moved higher) -->
415
- <div class="section" id="section-style">
416
- <div class="section-header section-toggle collapsed" onclick="toggleSection(this)">Style</div>
417
- <div class="section-content collapsed">
418
- <label class="checkbox-field">
419
- <input type="checkbox" id="grid">
420
- <span>Show Grid</span>
421
- </label>
422
- <div class="field">
423
- <label>Label Size (pt)</label>
424
- <input type="number" id="axis_fontsize" value="7" min="4" max="16" step="1">
425
- </div>
426
- <div class="field">
427
- <label>Background</label>
428
- <div class="bg-toggle">
429
- <button class="bg-btn" id="bg-white" onclick="setBackgroundType('white')" title="White background">
430
- <span class="bg-preview white"></span>
431
- <span>White</span>
432
- </button>
433
- <button class="bg-btn active" id="bg-transparent" onclick="setBackgroundType('transparent')" title="Transparent background">
434
- <span class="bg-preview transparent"></span>
435
- <span>Transparent</span>
436
- </button>
437
- <button class="bg-btn" id="bg-black" onclick="setBackgroundType('black')" title="Black background">
438
- <span class="bg-preview black"></span>
439
- <span>Black</span>
440
- </button>
441
- </div>
442
- </div>
443
- <input type="hidden" id="facecolor" value="#ffffff">
444
- <input type="hidden" id="transparent" value="true">
445
- </div>
446
- </div>
447
-
448
- <!-- Title, Labels & Caption Section -->
449
- <div class="section" id="section-labels">
450
- <div class="section-header section-toggle collapsed" onclick="toggleSection(this)">Title, Labels & Caption</div>
451
- <div class="section-content collapsed">
452
- <p class="section-hint">For multi-panel figures, select a panel to edit its labels.</p>
453
-
454
- <!-- Title row in table style -->
455
- <table class="props-table" style="width: 100%; border-collapse: collapse; margin-bottom: 8px;">
456
- <tr>
457
- <td style="width: 70px; padding: 4px 0;"><label>Title</label></td>
458
- <td style="padding: 4px 0;">
459
- <input type="text" id="title" placeholder="Figure title" style="width: 100%;">
460
- </td>
461
- <td style="width: 50px; padding: 4px 0; text-align: right;">
462
- <input type="number" id="title_fontsize" value="8" min="4" max="24" step="1" style="width: 45px;" title="Font size (pt)">
463
- </td>
464
- <td style="width: 24px; padding: 4px 0;">
465
- <label class="checkbox-field" style="margin: 0;" title="Show title">
466
- <input type="checkbox" id="show_title" checked>
467
- </label>
468
- </td>
469
- </tr>
470
- <tr>
471
- <td style="padding: 4px 0;"><label>X Label</label></td>
472
- <td style="padding: 4px 0;">
473
- <input type="text" id="xlabel" placeholder="X axis label" style="width: 100%;">
474
- </td>
475
- <td colspan="2"></td>
476
- </tr>
477
- <tr>
478
- <td style="padding: 4px 0;"><label>Y Label</label></td>
479
- <td style="padding: 4px 0;">
480
- <input type="text" id="ylabel" placeholder="Y axis label" style="width: 100%;">
481
- </td>
482
- <td colspan="2"></td>
483
- </tr>
484
- <tr>
485
- <td style="padding: 4px 0; vertical-align: top;"><label>Caption</label></td>
486
- <td style="padding: 4px 0;">
487
- <textarea id="caption" rows="2" placeholder="Figure caption..." style="width: 100%; padding: 6px; border: 1px solid var(--border-muted); border-radius: 4px; background: var(--bg-surface); color: var(--text-primary); font-size: 0.85em; resize: vertical;"></textarea>
488
- </td>
489
- <td style="padding: 4px 0; text-align: right; vertical-align: top;">
490
- <input type="number" id="caption_fontsize" value="7" min="4" max="16" step="1" style="width: 45px;" title="Font size (pt)">
491
- </td>
492
- <td style="padding: 4px 0; vertical-align: top;">
493
- <label class="checkbox-field" style="margin: 0;" title="Show caption">
494
- <input type="checkbox" id="show_caption">
495
- </label>
496
- </td>
497
- </tr>
498
- </table>
499
- </div>
500
- </div>
501
-
502
- <!-- Axis & Ticks Section (merged with Axis Limits) -->
503
- <div class="section" id="section-ticks">
504
- <div class="section-header section-toggle collapsed" onclick="toggleSection(this)">Axis & Ticks</div>
505
- <div class="section-content collapsed">
506
- <!-- Axis Limits (merged from separate section) -->
507
- <div class="subsection-header">Limits</div>
508
- <div class="field-row">
509
- <div class="field">
510
- <label>X Range</label>
511
- <div class="field-row" style="gap: 4px; margin-top: 4px;">
512
- <input type="number" id="xmin" step="any" placeholder="Min">
513
- <input type="number" id="xmax" step="any" placeholder="Max">
514
- </div>
515
- </div>
516
- <div class="field">
517
- <label>Y Range</label>
518
- <div class="field-row" style="gap: 4px; margin-top: 4px;">
519
- <input type="number" id="ymin" step="any" placeholder="Min">
520
- <input type="number" id="ymax" step="any" placeholder="Max">
521
- </div>
522
- </div>
523
- </div>
524
-
525
- <!-- Axis Tabs -->
526
- <div class="subsection-header" style="margin-top: 12px;">Tick Settings</div>
527
- <div class="axis-tabs">
528
- <button class="axis-tab active" onclick="switchAxisTab('x')" id="axis-tab-x">X</button>
529
- <button class="axis-tab" onclick="switchAxisTab('y')" id="axis-tab-y">Y</button>
530
- <button class="axis-tab" onclick="switchAxisTab('z')" id="axis-tab-z">Z</button>
531
- </div>
532
-
533
- <!-- X Axis Panel -->
534
- <div class="axis-panel" id="axis-panel-x">
535
- <div class="subsection-header">Bottom (Primary)</div>
536
- <div class="field-row">
537
- <div class="field">
538
- <label class="checkbox-field">
539
- <input type="checkbox" id="hide_x_ticks">
540
- <span>Hide</span>
541
- </label>
542
- </div>
543
- <div class="field">
544
- <label>N Ticks</label>
545
- <input type="number" id="x_n_ticks" value="4" min="2" max="10" step="1">
546
- </div>
547
- </div>
548
- <div class="field-row">
549
- <div class="field">
550
- <label>Font Size (pt)</label>
551
- <input type="number" id="x_tick_fontsize" value="7" min="4" max="16" step="1">
552
- </div>
553
- <div class="field">
554
- <label>Direction</label>
555
- <select id="x_tick_direction">
556
- <option value="out">Out</option>
557
- <option value="in">In</option>
558
- <option value="inout">Both</option>
559
- </select>
560
- </div>
561
- </div>
562
- <div class="field-row">
563
- <div class="field">
564
- <label>Length (mm)</label>
565
- <input type="number" id="x_tick_length" value="0.8" min="0.1" max="3" step="0.1">
566
- </div>
567
- <div class="field">
568
- <label>Width (mm)</label>
569
- <input type="number" id="x_tick_width" value="0.2" min="0.05" max="1" step="0.05">
570
- </div>
571
- </div>
572
- <div class="field-row">
573
- <div class="field">
574
- <label class="checkbox-field">
575
- <input type="checkbox" id="hide_bottom_spine" unchecked>
576
- <span>Hide Spine</span>
577
- </label>
578
- </div>
579
- </div>
580
-
581
- <div class="subsection-header" style="margin-top: 12px;">Top (Secondary)</div>
582
- <div class="field-row">
583
- <div class="field">
584
- <label class="checkbox-field">
585
- <input type="checkbox" id="show_x_top" unchecked>
586
- <span>Show</span>
587
- </label>
588
- </div>
589
- <div class="field">
590
- <label class="checkbox-field">
591
- <input type="checkbox" id="x_top_mirror">
592
- <span>Mirror</span>
593
- </label>
594
- </div>
595
- </div>
596
- <div class="field-row">
597
- <div class="field">
598
- <label class="checkbox-field">
599
- <input type="checkbox" id="hide_top_spine" checked>
600
- <span>Hide Spine</span>
601
- </label>
602
- </div>
603
- </div>
604
- </div>
605
-
606
- <!-- Y Axis Panel -->
607
- <div class="axis-panel" id="axis-panel-y" style="display: none;">
608
- <div class="subsection-header">Left (Primary)</div>
609
- <div class="field-row">
610
- <div class="field">
611
- <label class="checkbox-field">
612
- <input type="checkbox" id="hide_y_ticks">
613
- <span>Hide</span>
614
- </label>
615
- </div>
616
- <div class="field">
617
- <label>N Ticks</label>
618
- <input type="number" id="y_n_ticks" value="4" min="2" max="10" step="1">
619
- </div>
620
- </div>
621
- <div class="field-row">
622
- <div class="field">
623
- <label>Font Size (pt)</label>
624
- <input type="number" id="y_tick_fontsize" value="7" min="4" max="16" step="1">
625
- </div>
626
- <div class="field">
627
- <label>Direction</label>
628
- <select id="y_tick_direction">
629
- <option value="out">Out</option>
630
- <option value="in">In</option>
631
- <option value="inout">Both</option>
632
- </select>
633
- </div>
634
- </div>
635
- <div class="field-row">
636
- <div class="field">
637
- <label>Length (mm)</label>
638
- <input type="number" id="y_tick_length" value="0.8" min="0.1" max="3" step="0.1">
639
- </div>
640
- <div class="field">
641
- <label>Width (mm)</label>
642
- <input type="number" id="y_tick_width" value="0.2" min="0.05" max="1" step="0.05">
643
- </div>
644
- </div>
645
- <div class="field-row">
646
- <div class="field">
647
- <label class="checkbox-field">
648
- <input type="checkbox" id="hide_left_spine" unchecked>
649
- <span>Hide Spine</span>
650
- </label>
651
- </div>
652
- </div>
653
-
654
- <div class="subsection-header" style="margin-top: 12px;">Right (Secondary)</div>
655
- <div class="field-row">
656
- <div class="field">
657
- <label class="checkbox-field">
658
- <input type="checkbox" id="show_y_right" unchecked>
659
- <span>Show</span>
660
- </label>
661
- </div>
662
- <div class="field">
663
- <label class="checkbox-field">
664
- <input type="checkbox" id="y_right_mirror">
665
- <span>Mirror</span>
666
- </label>
667
- </div>
668
- </div>
669
- <div class="field-row">
670
- <div class="field">
671
- <label class="checkbox-field">
672
- <input type="checkbox" id="hide_right_spine" checked>
673
- <span>Hide Spine</span>
674
- </label>
675
- </div>
676
- </div>
677
- </div>
678
-
679
- <!-- Z Axis Panel (for 3D plots) -->
680
- <div class="axis-panel" id="axis-panel-z" style="display: none;">
681
- <div class="subsection-header">Z Axis (3D)</div>
682
- <div class="field-row">
683
- <div class="field">
684
- <label class="checkbox-field">
685
- <input type="checkbox" id="hide_z_ticks">
686
- <span>Hide</span>
687
- </label>
688
- </div>
689
- <div class="field">
690
- <label>N Ticks</label>
691
- <input type="number" id="z_n_ticks" value="4" min="2" max="10" step="1">
692
- </div>
693
- </div>
694
- <div class="field-row">
695
- <div class="field">
696
- <label>Font Size (pt)</label>
697
- <input type="number" id="z_tick_fontsize" value="7" min="4" max="16" step="1">
698
- </div>
699
- <div class="field">
700
- <label>Direction</label>
701
- <select id="z_tick_direction">
702
- <option value="out">Out</option>
703
- <option value="in">In</option>
704
- <option value="inout">Both</option>
705
- </select>
706
- </div>
707
- </div>
708
- <p class="section-hint">Z axis settings apply to 3D plots only.</p>
709
- </div>
710
-
711
- <!-- Common Settings -->
712
- <div class="subsection-header" style="margin-top: 12px;">Common</div>
713
- <div class="field">
714
- <label>Spine Width (mm)</label>
715
- <input type="number" id="axis_width" value="0.2" min="0.05" max="1" step="0.05">
716
- </div>
717
- </div>
718
- </div>
719
-
720
- <!-- Traces Section (Simplified for beta) -->
721
- <div class="section" id="section-traces">
722
- <div class="section-header section-toggle collapsed" onclick="toggleSection(this)">Traces</div>
723
- <div class="section-content collapsed">
724
- <p class="section-hint">Click on a trace in the preview to edit its properties.</p>
725
- <div class="traces-list" id="traces-list">
726
- <!-- Dynamically populated -->
727
- </div>
728
- </div>
729
- </div>
730
-
731
- <!-- Legend Section (Enhanced) -->
732
- <div class="section" id="section-legend">
733
- <div class="section-header section-toggle collapsed" onclick="toggleSection(this)">Legend</div>
734
- <div class="section-content collapsed">
735
- <label class="checkbox-field">
736
- <input type="checkbox" id="legend_visible" checked>
737
- <span>Show Legend</span>
738
- </label>
739
- <div class="field-row">
740
- <div class="field">
741
- <label>Position</label>
742
- <select id="legend_loc" onchange="toggleCustomLegendPosition()">
743
- <option value="best">Best (auto)</option>
744
- <option value="upper right">Upper Right</option>
745
- <option value="upper left">Upper Left</option>
746
- <option value="lower right">Lower Right</option>
747
- <option value="lower left">Lower Left</option>
748
- <option value="center right">Center Right</option>
749
- <option value="center left">Center Left</option>
750
- <option value="upper center">Upper Center</option>
751
- <option value="lower center">Lower Center</option>
752
- <option value="center">Center</option>
753
- <option value="custom">Custom...</option>
754
- </select>
755
- </div>
756
- <div class="field">
757
- <label>Columns</label>
758
- <input type="number" id="legend_ncols" value="1" min="1" max="5" step="1" title="Number of columns">
759
- </div>
760
- </div>
761
- <div id="custom-legend-coords" class="field-row" style="display: none; margin-top: 8px;">
762
- <div class="field">
763
- <label>X (0-1)</label>
764
- <input type="number" id="legend_x" value="0.95" min="0" max="1.5" step="0.01" title="X coordinate in axes fraction">
765
- </div>
766
- <div class="field">
767
- <label>Y (0-1)</label>
768
- <input type="number" id="legend_y" value="0.95" min="-0.5" max="1.5" step="0.01" title="Y coordinate in axes fraction">
769
- </div>
770
- </div>
771
- <div class="field-row" style="margin-top: 8px;">
772
- <div class="field">
773
- <label class="checkbox-field">
774
- <input type="checkbox" id="legend_frameon">
775
- <span>Show Frame</span>
776
- </label>
777
- </div>
778
- <div class="field">
779
- <label>Font Size (pt)</label>
780
- <input type="number" id="legend_fontsize" value="6" min="4" max="16" step="1">
781
- </div>
782
- </div>
783
- </div>
784
- </div>
785
-
786
- <!-- Statistics Section -->
787
- <div class="section" id="section-statistics">
788
- <div class="section-header section-toggle" onclick="toggleSection(this)">Statistics</div>
789
- <div class="section-content">
790
- <div id="stats-container">
791
- <div class="stats-loading">Loading statistics...</div>
792
- </div>
793
- <button class="btn btn-secondary" onclick="refreshStats()" style="margin-top: 8px;">Refresh Stats</button>
794
- </div>
795
- </div>
796
-
797
- <!-- Annotations Section -->
798
- <div class="section" id="section-annotations">
799
- <div class="section-header section-toggle collapsed" onclick="toggleSection(this)">Annotations</div>
800
- <div class="section-content collapsed">
801
- <div class="field">
802
- <label>Text</label>
803
- <input type="text" id="annot-text" placeholder="Annotation text">
804
- </div>
805
- <div class="field-row">
806
- <div class="field">
807
- <label>X (0-1)</label>
808
- <input type="number" id="annot-x" value="0.5" min="0" max="1" step="0.05">
809
- </div>
810
- <div class="field">
811
- <label>Y (0-1)</label>
812
- <input type="number" id="annot-y" value="0.5" min="0" max="1" step="0.05">
813
- </div>
814
- <div class="field">
815
- <label>Size</label>
816
- <input type="number" id="annot-size" value="8" min="4" max="24" step="1">
817
- </div>
818
- </div>
819
- <button class="btn btn-secondary" onclick="addAnnotation()">Add Annotation</button>
820
- <div class="annotations-list" id="annotations-list"></div>
821
- </div>
822
- </div>
823
-
824
- <!-- Actions Section -->
825
- <div class="section">
826
- <div class="section-header">Actions</div>
827
- <div class="field-row" style="align-items: center; margin-bottom: 8px;">
828
- <div class="field" style="flex: 1;">
829
- <label>Auto-Update</label>
830
- <select id="auto_update_interval" onchange="setAutoUpdateInterval()">
831
- <option value="0">Off</option>
832
- <option value="500">Hot (0.5s)</option>
833
- <option value="1000">Fast (1s)</option>
834
- <option value="2000" selected>Normal (2s)</option>
835
- <option value="5000">Slow (5s)</option>
836
- </select>
837
- </div>
838
- <button class="btn btn-cta" onclick="updatePreview(true)" style="flex: 0; margin-left: 8px;">Update Now</button>
839
- </div>
840
- <button class="btn btn-primary" onclick="saveManual()" title="Ctrl+S">Save</button>
841
- <button class="btn btn-secondary" onclick="resetOverrides()" title="Reset to original values">Reset</button>
842
- </div>
843
-
844
- <div class="status-bar" id="status">Ready</div>
845
- </div>
846
- </div>
847
- </div>
848
- """
849
-
850
-
851
- # EOF