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,265 +0,0 @@
1
- /**
2
- * Keyboard Shortcuts
3
- * Handles all keyboard shortcuts for the editor
4
- */
5
-
6
- // ============================================================================
7
- // Main Keyboard Event Handler
8
- // ============================================================================
9
- document.addEventListener('keydown', (e) => {
10
- const key = e.key.toLowerCase();
11
- const isCtrl = e.ctrlKey || e.metaKey;
12
- const isShift = e.shiftKey;
13
- const isAlt = e.altKey;
14
-
15
- // Don't capture shortcuts when typing in inputs
16
- if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA' || e.target.tagName === 'SELECT') {
17
- return;
18
- }
19
-
20
- // =========================================================================
21
- // Multi-key shortcut mode (Alt+A → alignment, Alt+Shift+A → axis alignment)
22
- // =========================================================================
23
- if (shortcutMode === 'align') {
24
- e.preventDefault();
25
- handleAlignShortcut(key, isShift);
26
- shortcutMode = null;
27
- return;
28
- }
29
-
30
- if (shortcutMode === 'alignByAxis') {
31
- e.preventDefault();
32
- handleAlignByAxisShortcut(key);
33
- shortcutMode = null;
34
- return;
35
- }
36
-
37
- // =========================================================================
38
- // Basic Operations
39
- // =========================================================================
40
-
41
- // Ctrl+S: Save
42
- if (isCtrl && key === 's') {
43
- e.preventDefault();
44
- saveToBundle();
45
- return;
46
- }
47
-
48
- // Ctrl+Z: Undo
49
- if (isCtrl && !isShift && key === 'z') {
50
- e.preventDefault();
51
- undoLastChange();
52
- return;
53
- }
54
-
55
- // Ctrl+Y or Ctrl+Shift+Z: Redo
56
- if ((isCtrl && key === 'y') || (isCtrl && isShift && key === 'z')) {
57
- e.preventDefault();
58
- redoLastChange();
59
- return;
60
- }
61
-
62
- // Delete: Remove selected element override
63
- if (key === 'delete' || key === 'backspace') {
64
- if (selectedElement && !isCtrl) {
65
- e.preventDefault();
66
- deleteSelectedOverride();
67
- return;
68
- }
69
- }
70
-
71
- // =========================================================================
72
- // Panel/Element Movement (Arrow keys)
73
- // =========================================================================
74
-
75
- // Arrow keys: Move selected panel by 1mm (or 5mm with Shift)
76
- if (['arrowup', 'arrowdown', 'arrowleft', 'arrowright'].includes(key)) {
77
- e.preventDefault();
78
- const amount = isShift ? 5 : 1; // 5mm or 1mm
79
- moveSelectedPanel(key.replace('arrow', ''), amount);
80
- return;
81
- }
82
-
83
- // =========================================================================
84
- // View Controls
85
- // =========================================================================
86
-
87
- // + or =: Zoom in
88
- if ((key === '+' || key === '=') && !isCtrl) {
89
- e.preventDefault();
90
- zoomCanvas(1.1);
91
- return;
92
- }
93
-
94
- // -: Zoom out
95
- if (key === '-' && !isCtrl) {
96
- e.preventDefault();
97
- zoomCanvas(0.9);
98
- return;
99
- }
100
-
101
- // 0: Fit to window
102
- if (key === '0' && !isCtrl) {
103
- e.preventDefault();
104
- fitCanvasToWindow();
105
- return;
106
- }
107
-
108
- // Ctrl++ : Increase canvas size
109
- if (isCtrl && (key === '+' || key === '=')) {
110
- e.preventDefault();
111
- resizeCanvas(1.1);
112
- return;
113
- }
114
-
115
- // Ctrl+- : Decrease canvas size
116
- if (isCtrl && key === '-') {
117
- e.preventDefault();
118
- resizeCanvas(0.9);
119
- return;
120
- }
121
-
122
- // =========================================================================
123
- // Alignment Modes (Alt+A → basic, Alt+Shift+A → by axis)
124
- // =========================================================================
125
- if (isAlt && isShift && key === 'a') {
126
- // Alt+Shift+A: Align by Axis (scientific alignment based on plot axes)
127
- e.preventDefault();
128
- shortcutMode = 'alignByAxis';
129
- setStatus('Align by Axis: L=Y-Axis(left) R=Right T=Top B=X-Axis(bottom) C=Center-H M=Center-V S=Stack', false);
130
- setTimeout(() => {
131
- if (shortcutMode === 'alignByAxis') {
132
- shortcutMode = null;
133
- setStatus('Ready', false);
134
- }
135
- }, 3000);
136
- return;
137
- }
138
- if (isAlt && !isShift && key === 'a') {
139
- // Alt+A: Basic alignment (by bounding box)
140
- e.preventDefault();
141
- shortcutMode = 'align';
142
- setStatus('Alignment mode: L=Left R=Right T=Top B=Bottom C=Center H=DistH V=DistV', false);
143
- setTimeout(() => {
144
- if (shortcutMode === 'align') {
145
- shortcutMode = null;
146
- setStatus('Ready', false);
147
- }
148
- }, 3000);
149
- return;
150
- }
151
-
152
- // =========================================================================
153
- // Arrange (Alt+F, Alt+B)
154
- // =========================================================================
155
- if (isAlt && key === 'f') {
156
- e.preventDefault();
157
- bringPanelToFront();
158
- return;
159
- }
160
-
161
- if (isAlt && key === 'b') {
162
- e.preventDefault();
163
- sendPanelToBack();
164
- return;
165
- }
166
-
167
- // =========================================================================
168
- // Escape: Deselect/Cancel mode
169
- // =========================================================================
170
- if (key === 'escape') {
171
- e.preventDefault();
172
- deselectAllPanels();
173
- shortcutMode = null;
174
- return;
175
- }
176
-
177
- // =========================================================================
178
- // G: Toggle grid visibility
179
- // =========================================================================
180
- if (key === 'g' && !isCtrl && !isAlt) {
181
- e.preventDefault();
182
- toggleGridVisibility();
183
- return;
184
- }
185
-
186
- // =========================================================================
187
- // Ctrl+A: Select all panels
188
- // =========================================================================
189
- if (isCtrl && key === 'a') {
190
- e.preventDefault();
191
- selectAllPanels();
192
- return;
193
- }
194
-
195
- // =========================================================================
196
- // Help (? or F1)
197
- // =========================================================================
198
- if (key === '?' || key === 'f1') {
199
- e.preventDefault();
200
- showShortcutHelp();
201
- return;
202
- }
203
- });
204
-
205
- // ============================================================================
206
- // Undo/Redo Functions
207
- // ============================================================================
208
- function undoLastChange() {
209
- if (undoStack.length === 0) {
210
- setStatus('Nothing to undo', true);
211
- return;
212
- }
213
-
214
- const prevState = undoStack.pop();
215
- redoStack.push({...overrides});
216
- overrides = prevState;
217
- updatePreview();
218
- setStatus('Undone');
219
- }
220
-
221
- function redoLastChange() {
222
- if (redoStack.length === 0) {
223
- setStatus('Nothing to redo', true);
224
- return;
225
- }
226
-
227
- const nextState = redoStack.pop();
228
- undoStack.push({...overrides});
229
- overrides = nextState;
230
- updatePreview();
231
- setStatus('Redone');
232
- }
233
-
234
- function saveUndoState() {
235
- undoStack.push({...overrides});
236
- redoStack = []; // Clear redo stack on new change
237
- }
238
-
239
- // ============================================================================
240
- // Delete Override
241
- // ============================================================================
242
- function deleteSelectedOverride() {
243
- if (!selectedElement) return;
244
-
245
- // Remove from element_overrides
246
- if (overrides.element_overrides && overrides.element_overrides[selectedElement]) {
247
- delete overrides.element_overrides[selectedElement];
248
- setStatus(`Deleted override for ${selectedElement}`);
249
- updatePreview();
250
- }
251
- }
252
-
253
- // ============================================================================
254
- // Grid Visibility Toggle
255
- // ============================================================================
256
- function toggleGridVisibility() {
257
- gridVisible = !gridVisible;
258
- const canvas = document.getElementById('panel-canvas');
259
- if (canvas) {
260
- canvas.style.backgroundImage = gridVisible ?
261
- 'linear-gradient(rgba(128,128,128,0.1) 1px, transparent 1px), linear-gradient(90deg, rgba(128,128,128,0.1) 1px, transparent 1px)' :
262
- 'none';
263
- }
264
- setStatus(`Grid ${gridVisible ? 'visible' : 'hidden'}`);
265
- }
@@ -1,184 +0,0 @@
1
- /**
2
- * Controls Panel
3
- * Handles all form controls and data collection
4
- */
5
-
6
- // ============================================================================
7
- // Collect Overrides from Form
8
- // ============================================================================
9
- function collectOverrides() {
10
- const o = {};
11
-
12
- // Labels - Title
13
- const title = document.getElementById('title')?.value;
14
- if (title) o.title = title;
15
- o.show_title = document.getElementById('show_title')?.checked;
16
- o.title_fontsize = parseInt(document.getElementById('title_fontsize')?.value) || 8;
17
-
18
- // Labels - Caption
19
- const caption = document.getElementById('caption')?.value;
20
- if (caption) o.caption = caption;
21
- o.show_caption = document.getElementById('show_caption')?.checked;
22
- o.caption_fontsize = parseInt(document.getElementById('caption_fontsize')?.value) || 7;
23
-
24
- // Labels - Axis
25
- const xlabel = document.getElementById('xlabel')?.value;
26
- const ylabel = document.getElementById('ylabel')?.value;
27
- if (xlabel) o.xlabel = xlabel;
28
- if (ylabel) o.ylabel = ylabel;
29
-
30
- // Axis limits
31
- const xmin = document.getElementById('xmin')?.value;
32
- const xmax = document.getElementById('xmax')?.value;
33
- if (xmin !== '' && xmax !== '') o.xlim = [parseFloat(xmin), parseFloat(xmax)];
34
-
35
- const ymin = document.getElementById('ymin')?.value;
36
- const ymax = document.getElementById('ymax')?.value;
37
- if (ymin !== '' && ymax !== '') o.ylim = [parseFloat(ymin), parseFloat(ymax)];
38
-
39
- // Traces
40
- o.traces = traces;
41
-
42
- // Legend
43
- o.legend_visible = document.getElementById('legend_visible')?.checked;
44
- o.legend_loc = document.getElementById('legend_loc')?.value;
45
- o.legend_frameon = document.getElementById('legend_frameon')?.checked;
46
- o.legend_fontsize = parseInt(document.getElementById('legend_fontsize')?.value) || 6;
47
- o.legend_ncols = parseInt(document.getElementById('legend_ncols')?.value) || 1;
48
- o.legend_x = parseFloat(document.getElementById('legend_x')?.value) || 0.95;
49
- o.legend_y = parseFloat(document.getElementById('legend_y')?.value) || 0.95;
50
-
51
- // Axis and Ticks - X Axis (Bottom)
52
- o.x_n_ticks = parseInt(document.getElementById('x_n_ticks')?.value) || 4;
53
- o.hide_x_ticks = document.getElementById('hide_x_ticks')?.checked;
54
- o.x_tick_fontsize = parseInt(document.getElementById('x_tick_fontsize')?.value) || 7;
55
- o.x_tick_direction = document.getElementById('x_tick_direction')?.value;
56
- o.x_tick_length = parseFloat(document.getElementById('x_tick_length')?.value) || 0.8;
57
- o.x_tick_width = parseFloat(document.getElementById('x_tick_width')?.value) || 0.2;
58
-
59
- // X Axis (Top)
60
- o.show_x_top = document.getElementById('show_x_top')?.checked;
61
- o.x_top_mirror = document.getElementById('x_top_mirror')?.checked;
62
-
63
- // Y Axis (Left)
64
- o.y_n_ticks = parseInt(document.getElementById('y_n_ticks')?.value) || 4;
65
- o.hide_y_ticks = document.getElementById('hide_y_ticks')?.checked;
66
- o.y_tick_fontsize = parseInt(document.getElementById('y_tick_fontsize')?.value) || 7;
67
- o.y_tick_direction = document.getElementById('y_tick_direction')?.value;
68
- o.y_tick_length = parseFloat(document.getElementById('y_tick_length')?.value) || 0.8;
69
- o.y_tick_width = parseFloat(document.getElementById('y_tick_width')?.value) || 0.2;
70
-
71
- // Y Axis (Right)
72
- o.show_y_right = document.getElementById('show_y_right')?.checked;
73
- o.y_right_mirror = document.getElementById('y_right_mirror')?.checked;
74
-
75
- // Spines
76
- o.hide_bottom_spine = document.getElementById('hide_bottom_spine')?.checked;
77
- o.hide_left_spine = document.getElementById('hide_left_spine')?.checked;
78
-
79
- // Z Axis (3D)
80
- o.hide_z_ticks = document.getElementById('hide_z_ticks')?.checked;
81
- o.z_n_ticks = parseInt(document.getElementById('z_n_ticks')?.value) || 4;
82
- o.z_tick_fontsize = parseInt(document.getElementById('z_tick_fontsize')?.value) || 7;
83
- o.z_tick_direction = document.getElementById('z_tick_direction')?.value;
84
-
85
- // Style
86
- o.grid = document.getElementById('grid')?.checked;
87
- o.hide_top_spine = document.getElementById('hide_top_spine')?.checked;
88
- o.hide_right_spine = document.getElementById('hide_right_spine')?.checked;
89
- o.axis_width = parseFloat(document.getElementById('axis_width')?.value) || 0.2;
90
- o.axis_fontsize = parseInt(document.getElementById('axis_fontsize')?.value) || 7;
91
- o.facecolor = document.getElementById('facecolor')?.value;
92
- o.transparent = document.getElementById('transparent')?.value === 'true';
93
-
94
- // Dimensions (always in inches for matplotlib)
95
- o.fig_size = getFigSizeInches();
96
- o.dpi = parseInt(document.getElementById('dpi')?.value) || 300;
97
-
98
- // Annotations
99
- o.annotations = overrides.annotations || [];
100
-
101
- // Element-specific overrides (per-element styles)
102
- if (overrides.element_overrides) {
103
- o.element_overrides = overrides.element_overrides;
104
- }
105
-
106
- return o;
107
- }
108
-
109
- // ============================================================================
110
- // Update Controls from Overrides
111
- // ============================================================================
112
- function updateControlsFromOverrides() {
113
- // This function updates the form fields from the overrides object
114
- // (Would be populated from the server data)
115
- }
116
-
117
- // ============================================================================
118
- // Axis Tab Switching
119
- // ============================================================================
120
- function switchAxisTab(axis) {
121
- // Update tab buttons
122
- document.querySelectorAll('.axis-tab-btn').forEach(btn => {
123
- btn.classList.toggle('active', btn.dataset.axis === axis);
124
- });
125
-
126
- // Update panels
127
- document.querySelectorAll('.axis-panel').forEach(panel => {
128
- panel.style.display = panel.dataset.axis === axis ? 'block' : 'none';
129
- });
130
- }
131
-
132
- // ============================================================================
133
- // Custom Legend Position Toggle
134
- // ============================================================================
135
- function toggleCustomLegendPosition() {
136
- const customPos = document.getElementById('legend-custom-position');
137
- const legendLoc = document.getElementById('legend_loc');
138
- if (customPos && legendLoc) {
139
- customPos.style.display = legendLoc.value === 'custom' ? 'block' : 'none';
140
- }
141
- }
142
-
143
- // ============================================================================
144
- // Background Type Toggle
145
- // ============================================================================
146
- function setBackgroundType(type) {
147
- backgroundType = type;
148
-
149
- // Update hidden inputs for collectOverrides
150
- const transparentInput = document.getElementById('transparent');
151
- const facecolorInput = document.getElementById('facecolor');
152
-
153
- if (type === 'white') {
154
- if (transparentInput) transparentInput.value = 'false';
155
- if (facecolorInput) facecolorInput.value = 'white';
156
- } else if (type === 'black') {
157
- if (transparentInput) transparentInput.value = 'false';
158
- if (facecolorInput) facecolorInput.value = 'black';
159
- } else {
160
- // transparent
161
- if (transparentInput) transparentInput.value = 'true';
162
- if (facecolorInput) facecolorInput.value = 'none';
163
- }
164
-
165
- // Update button states
166
- document.querySelectorAll('.background-btn').forEach(btn => {
167
- btn.classList.toggle('active', btn.dataset.type === type);
168
- });
169
-
170
- // Trigger update only after initialization
171
- if (!initializingBackground) {
172
- scheduleUpdate();
173
- }
174
- }
175
-
176
- // ============================================================================
177
- // Reset Overrides
178
- // ============================================================================
179
- function resetOverrides() {
180
- if (confirm('Reset all settings to defaults?')) {
181
- overrides = {};
182
- updatePreview();
183
- }
184
- }
@@ -1,57 +0,0 @@
1
- /**
2
- * Download Menu
3
- * Handles file download functionality
4
- */
5
-
6
- // ============================================================================
7
- // Toggle Download Menu
8
- // ============================================================================
9
- function toggleDownloadMenu() {
10
- const menu = document.getElementById('download-menu');
11
- if (menu.style.display === 'block') {
12
- menu.style.display = 'none';
13
- document.removeEventListener('click', closeDownloadMenuOnClickOutside);
14
- } else {
15
- menu.style.display = 'block';
16
- // Close when clicking outside
17
- setTimeout(() => {
18
- document.addEventListener('click', closeDownloadMenuOnClickOutside);
19
- }, 0);
20
- }
21
- }
22
-
23
- function closeDownloadMenuOnClickOutside(e) {
24
- const menu = document.getElementById('download-menu');
25
- const btn = document.getElementById('download-btn');
26
- if (menu && btn && !menu.contains(e.target) && !btn.contains(e.target)) {
27
- menu.style.display = 'none';
28
- document.removeEventListener('click', closeDownloadMenuOnClickOutside);
29
- }
30
- }
31
-
32
- // ============================================================================
33
- // Download Handlers
34
- // ============================================================================
35
- function downloadAs(format) {
36
- saveToBundle().then(() => {
37
- // First export to bundle
38
- const data = collectOverrides();
39
- data.format = format;
40
-
41
- fetch('/export', {
42
- method: 'POST',
43
- headers: {'Content-Type': 'application/json'},
44
- body: JSON.stringify(data)
45
- })
46
- .then(r => r.json())
47
- .then(result => {
48
- // Then trigger download
49
- const filename = result.path.split('/').pop();
50
- window.location.href = '/download/' + filename;
51
- toggleDownloadMenu();
52
- })
53
- .catch(err => {
54
- setStatus('Error exporting: ' + err, true);
55
- });
56
- });
57
- }
@@ -1,100 +0,0 @@
1
- /**
2
- * Help System
3
- * Keyboard shortcut help dialog
4
- */
5
-
6
- // ============================================================================
7
- // Show Shortcut Help
8
- // ============================================================================
9
- function showShortcutHelp() {
10
- const helpHtml = `
11
- <div id="shortcut-help-overlay" style="position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.7); z-index: 10000; display: flex; justify-content: center; align-items: center;" onclick="this.remove();">
12
- <div style="background: var(--bg-primary); padding: 30px; border-radius: 8px; max-width: 600px; max-height: 80vh; overflow-y: auto;" onclick="event.stopPropagation();">
13
- <h2 style="margin-top: 0;">Keyboard Shortcuts</h2>
14
-
15
- <h3>Basic Operations</h3>
16
- <table style="width: 100%; margin-bottom: 20px;">
17
- <tr><td><kbd>Ctrl</kbd>+<kbd>S</kbd></td><td>Save changes</td></tr>
18
- <tr><td><kbd>Ctrl</kbd>+<kbd>Z</kbd></td><td>Undo</td></tr>
19
- <tr><td><kbd>Ctrl</kbd>+<kbd>Y</kbd></td><td>Redo</td></tr>
20
- <tr><td><kbd>Delete</kbd></td><td>Remove selected override</td></tr>
21
- <tr><td><kbd>Esc</kbd></td><td>Deselect all</td></tr>
22
- </table>
23
-
24
- <h3>Panel Movement</h3>
25
- <table style="width: 100%; margin-bottom: 20px;">
26
- <tr><td><kbd>Arrow Keys</kbd></td><td>Move panel by 1mm</td></tr>
27
- <tr><td><kbd>Shift</kbd>+<kbd>Arrows</kbd></td><td>Move panel by 5mm</td></tr>
28
- </table>
29
-
30
- <h3>View Controls</h3>
31
- <table style="width: 100%; margin-bottom: 20px;">
32
- <tr><td><kbd>+</kbd> / <kbd>=</kbd></td><td>Zoom in</td></tr>
33
- <tr><td><kbd>-</kbd></td><td>Zoom out</td></tr>
34
- <tr><td><kbd>0</kbd></td><td>Fit to window</td></tr>
35
- <tr><td><kbd>G</kbd></td><td>Toggle grid</td></tr>
36
- </table>
37
-
38
- <h3>Alignment (Basic)</h3>
39
- <table style="width: 100%; margin-bottom: 20px;">
40
- <tr><td><kbd>Alt</kbd>+<kbd>A</kbd> then <kbd>L</kbd></td><td>Align left</td></tr>
41
- <tr><td><kbd>Alt</kbd>+<kbd>A</kbd> then <kbd>R</kbd></td><td>Align right</td></tr>
42
- <tr><td><kbd>Alt</kbd>+<kbd>A</kbd> then <kbd>T</kbd></td><td>Align top</td></tr>
43
- <tr><td><kbd>Alt</kbd>+<kbd>A</kbd> then <kbd>B</kbd></td><td>Align bottom</td></tr>
44
- <tr><td><kbd>Alt</kbd>+<kbd>A</kbd> then <kbd>C</kbd></td><td>Center horizontally</td></tr>
45
- <tr><td><kbd>Alt</kbd>+<kbd>A</kbd> then <kbd>M</kbd></td><td>Center vertically</td></tr>
46
- </table>
47
-
48
- <h3>Alignment (By Axis)</h3>
49
- <table style="width: 100%; margin-bottom: 20px;">
50
- <tr><td><kbd>Alt</kbd>+<kbd>Shift</kbd>+<kbd>A</kbd> then <kbd>L</kbd></td><td>Align by Y-axis (left)</td></tr>
51
- <tr><td><kbd>Alt</kbd>+<kbd>Shift</kbd>+<kbd>A</kbd> then <kbd>B</kbd></td><td>Align by X-axis (bottom)</td></tr>
52
- <tr><td><kbd>Alt</kbd>+<kbd>Shift</kbd>+<kbd>A</kbd> then <kbd>S</kbd></td><td>Stack vertically</td></tr>
53
- </table>
54
-
55
- <h3>Selection</h3>
56
- <table style="width: 100%; margin-bottom: 20px;">
57
- <tr><td><kbd>Ctrl</kbd>+<kbd>A</kbd></td><td>Select all panels</td></tr>
58
- <tr><td><kbd>Ctrl</kbd>+<kbd>Click</kbd></td><td>Toggle panel selection</td></tr>
59
- </table>
60
-
61
- <h3>Arrange</h3>
62
- <table style="width: 100%; margin-bottom: 20px;">
63
- <tr><td><kbd>Alt</kbd>+<kbd>F</kbd></td><td>Bring to front</td></tr>
64
- <tr><td><kbd>Alt</kbd>+<kbd>B</kbd></td><td>Send to back</td></tr>
65
- </table>
66
-
67
- <h3>Developer Tools</h3>
68
- <table style="width: 100%; margin-bottom: 20px;">
69
- <tr><td><kbd>Alt</kbd>+<kbd>I</kbd></td><td>Toggle element inspector</td></tr>
70
- <tr><td><kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>I</kbd></td><td>Rectangle selection mode</td></tr>
71
- <tr><td><kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>I</kbd></td><td>Copy console logs</td></tr>
72
- </table>
73
-
74
- <button onclick="this.closest('#shortcut-help-overlay').remove()" style="margin-top: 20px;">Close</button>
75
- </div>
76
- </div>
77
- `;
78
-
79
- // Remove existing help if any
80
- const existing = document.getElementById('shortcut-help-overlay');
81
- if (existing) existing.remove();
82
-
83
- // Add to DOM
84
- document.body.insertAdjacentHTML('beforeend', helpHtml);
85
- }
86
-
87
- // Add kbd styling
88
- const kbdStyle = document.createElement('style');
89
- kbdStyle.textContent = `
90
- kbd {
91
- background: var(--bg-tertiary, #333);
92
- border: 1px solid var(--border-color, #555);
93
- border-radius: 3px;
94
- padding: 2px 6px;
95
- font-family: monospace;
96
- font-size: 0.85em;
97
- margin-right: 8px;
98
- }
99
- `;
100
- document.head.appendChild(kbdStyle);
@@ -1,34 +0,0 @@
1
- /**
2
- * Theme Management
3
- * Dark/light theme toggle
4
- */
5
-
6
- // ============================================================================
7
- // Theme Toggle
8
- // ============================================================================
9
- function toggleTheme() {
10
- document.body.classList.toggle('dark-theme');
11
- const isDark = document.body.classList.contains('dark-theme');
12
-
13
- // Save theme preference
14
- localStorage.setItem('theme', isDark ? 'dark' : 'light');
15
-
16
- // Re-render single panel preview with dark/light mode colors (if visible)
17
- if (!showingPanelGrid) {
18
- updatePreview();
19
- }
20
- }
21
-
22
- // ============================================================================
23
- // Initialize Theme
24
- // ============================================================================
25
- function initializeTheme() {
26
- // Load saved theme
27
- const savedTheme = localStorage.getItem('theme');
28
- if (savedTheme === 'dark') {
29
- document.body.classList.add('dark-theme');
30
- }
31
- }
32
-
33
- // Initialize on load
34
- document.addEventListener('DOMContentLoaded', initializeTheme);