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,258 +0,0 @@
1
- /**
2
- * Panel Dragging
3
- * Handles drag-and-drop for panel repositioning in canvas view
4
- */
5
-
6
- // ============================================================================
7
- // Panel Drag Initialization
8
- // ============================================================================
9
- function initPanelDrag(item, panelName) {
10
- const handle = item.querySelector('.panel-drag-handle');
11
- const label = item.querySelector('.panel-canvas-label');
12
-
13
- // Drag from handle (always works)
14
- if (handle) {
15
- handle.addEventListener('mousedown', (e) => {
16
- e.preventDefault();
17
- e.stopPropagation();
18
- startPanelDrag(e, item, panelName);
19
- });
20
- }
21
-
22
- // Also allow dragging from panel label
23
- if (label) {
24
- label.addEventListener('mousedown', (e) => {
25
- e.preventDefault();
26
- e.stopPropagation();
27
- startPanelDrag(e, item, panelName);
28
- });
29
- }
30
-
31
- // Allow dragging from anywhere on the panel (except interactive elements)
32
- // This enables intuitive drag behavior while preserving element selection
33
- item.addEventListener('mousedown', (e) => {
34
- // Skip if clicking on interactive elements (legends, text paths, etc.)
35
- if (isInteractiveElement(e.target)) return;
36
-
37
- // Skip if clicking on drag handle or label (already handled above)
38
- if (e.target === handle || e.target === label) return;
39
-
40
- // Start drag from anywhere else on the panel
41
- startPanelDrag(e, item, panelName);
42
- });
43
-
44
- // Set cursor to indicate draggability
45
- item.style.cursor = 'move';
46
- }
47
-
48
- // ============================================================================
49
- // Panel Drag Start
50
- // ============================================================================
51
- function startPanelDrag(e, item, name) {
52
- e.preventDefault();
53
-
54
- // Handle selection based on Ctrl key
55
- const isCtrlPressed = e.ctrlKey || e.metaKey;
56
- const wasAlreadySelected = item.classList.contains('selected');
57
-
58
- if (isCtrlPressed) {
59
- // Ctrl+Click: toggle this panel's selection (add/remove from multi-select)
60
- item.classList.toggle('selected');
61
- } else if (!wasAlreadySelected) {
62
- // Regular click on unselected panel: select only this one
63
- deselectAllPanels();
64
- item.classList.add('selected');
65
- }
66
- // If clicking on already-selected panel without Ctrl:
67
- // Don't change selection yet - could be start of multi-panel drag
68
- // Selection will be finalized in stopPanelDrag based on hasMoved
69
-
70
- // Collect all selected panels for group dragging
71
- const selectedItems = Array.from(document.querySelectorAll('.panel-canvas-item.selected'));
72
- if (selectedItems.length === 0) {
73
- // If somehow nothing selected, select the clicked item
74
- item.classList.add('selected');
75
- selectedItems.push(item);
76
- }
77
-
78
- // Store drag state for all selected panels
79
- draggedPanel = {
80
- primaryItem: item,
81
- primaryName: name,
82
- selectedItems: selectedItems,
83
- startX: e.clientX,
84
- startY: e.clientY,
85
- hasMoved: false, // Track if actual drag occurred
86
- wasAlreadySelected, // Track initial selection state for click handling
87
- isCtrlPressed, // Track if Ctrl was pressed
88
- startPositions: selectedItems.map(el => ({
89
- item: el,
90
- name: el.dataset.panelName,
91
- x: parseFloat(el.style.left) || 0,
92
- y: parseFloat(el.style.top) || 0
93
- }))
94
- };
95
-
96
- document.addEventListener('mousemove', onPanelDrag);
97
- document.addEventListener('mouseup', stopPanelDrag);
98
-
99
- // Show position indicator for primary panel
100
- updatePositionIndicator(name,
101
- panelPositions[name]?.x || 0,
102
- panelPositions[name]?.y || 0
103
- );
104
- }
105
-
106
- // ============================================================================
107
- // Panel Drag Move
108
- // ============================================================================
109
- function onPanelDrag(e) {
110
- if (!draggedPanel) return;
111
-
112
- // Calculate delta from drag start
113
- const dx = e.clientX - draggedPanel.startX;
114
- const dy = e.clientY - draggedPanel.startY;
115
-
116
- // Mark as moved if we've actually dragged (threshold: 3px)
117
- if (Math.abs(dx) > 3 || Math.abs(dy) > 3) {
118
- draggedPanel.hasMoved = true;
119
- }
120
-
121
- // Snap to grid (optional: 5mm grid)
122
- const gridSize = 5 * canvasScale; // 5mm grid
123
- const snappedDx = Math.round(dx / gridSize) * gridSize;
124
- const snappedDy = Math.round(dy / gridSize) * gridSize;
125
-
126
- // Move all selected panels by the same delta
127
- draggedPanel.startPositions.forEach(({item, name, x, y}) => {
128
- const newX = x + snappedDx;
129
- const newY = y + snappedDy;
130
-
131
- // Constrain to canvas bounds (allow slight negative for edge alignment)
132
- const constrainedX = Math.max(-10, newX);
133
- const constrainedY = Math.max(-10, newY);
134
-
135
- // Update pixel positions
136
- item.style.left = constrainedX + 'px';
137
- item.style.top = constrainedY + 'px';
138
-
139
- panelPositions[name] = {
140
- ...panelPositions[name],
141
- x: constrainedX,
142
- y: constrainedY
143
- };
144
-
145
- // Update mm positions
146
- panelLayoutMm[name] = {
147
- ...panelLayoutMm[name],
148
- x_mm: constrainedX / canvasScale,
149
- y_mm: constrainedY / canvasScale
150
- };
151
- });
152
-
153
- // Show position indicator for primary panel
154
- const primaryPos = panelPositions[draggedPanel.primaryName];
155
- if (primaryPos) {
156
- updatePositionIndicator(draggedPanel.primaryName, primaryPos.x, primaryPos.y);
157
- }
158
-
159
- // Mark layout as modified
160
- layoutModified = true;
161
- }
162
-
163
- // ============================================================================
164
- // Panel Drag Stop
165
- // ============================================================================
166
- function stopPanelDrag() {
167
- if (draggedPanel) {
168
- // Handle click (no movement) on already-selected panel without Ctrl:
169
- // Finalize selection to only the clicked panel
170
- if (!draggedPanel.hasMoved && draggedPanel.wasAlreadySelected && !draggedPanel.isCtrlPressed) {
171
- // This was a simple click on an already-selected panel
172
- // Deselect all others, keep only the clicked panel selected
173
- deselectAllPanels();
174
- draggedPanel.primaryItem.classList.add('selected');
175
- }
176
-
177
- // Reset cursor for all selected panels
178
- draggedPanel.selectedItems.forEach(item => {
179
- item.style.cursor = 'move';
180
- });
181
-
182
- draggedPanel = null;
183
- document.removeEventListener('mousemove', onPanelDrag);
184
- document.removeEventListener('mouseup', stopPanelDrag);
185
-
186
- // Update canvas size if panel moved outside
187
- updateCanvasSize();
188
-
189
- // Hide position indicator after a delay
190
- setTimeout(() => {
191
- const indicator = document.getElementById('position-indicator');
192
- if (indicator) {
193
- indicator.style.display = 'none';
194
- }
195
- }, 1000);
196
-
197
- // Auto-save layout
198
- if (layoutModified) {
199
- saveLayout();
200
- }
201
- }
202
- }
203
-
204
- // ============================================================================
205
- // Position Indicator
206
- // ============================================================================
207
- function updatePositionIndicator(panelName, x, y) {
208
- let indicator = document.getElementById('position-indicator');
209
- if (!indicator) {
210
- indicator = document.createElement('div');
211
- indicator.id = 'position-indicator';
212
- indicator.style.cssText = `
213
- position: fixed;
214
- bottom: 20px;
215
- right: 20px;
216
- background: rgba(0, 0, 0, 0.8);
217
- color: white;
218
- padding: 8px 12px;
219
- border-radius: 4px;
220
- font-family: monospace;
221
- font-size: 12px;
222
- z-index: 10000;
223
- pointer-events: none;
224
- `;
225
- document.body.appendChild(indicator);
226
- }
227
-
228
- const xMm = (x / canvasScale).toFixed(1);
229
- const yMm = (y / canvasScale).toFixed(1);
230
- indicator.textContent = `${panelName}: x=${xMm}mm, y=${yMm}mm`;
231
- indicator.style.display = 'block';
232
- }
233
-
234
- // ============================================================================
235
- // Manual Layout Save
236
- // ============================================================================
237
- function saveLayoutManually() {
238
- if (layoutModified) {
239
- saveLayout();
240
- } else {
241
- setStatus('No changes to save');
242
- }
243
- }
244
-
245
- // ============================================================================
246
- // Legacy Drag Functions (for backward compatibility)
247
- // ============================================================================
248
- function startDrag(e, item, name) {
249
- startPanelDrag(e, item, name);
250
- }
251
-
252
- function onDrag(e) {
253
- onPanelDrag(e);
254
- }
255
-
256
- function stopDrag() {
257
- stopPanelDrag();
258
- }
@@ -1,48 +0,0 @@
1
- /**
2
- * Panel Resizing
3
- * Handles panel resize operations in canvas view
4
- */
5
-
6
- // ============================================================================
7
- // Resize Start
8
- // ============================================================================
9
- function startResize(e, item, name) {
10
- e.preventDefault();
11
- e.stopPropagation();
12
-
13
- resizingPanel = {item, name, startX: e.clientX, startY: e.clientY};
14
- document.addEventListener('mousemove', onResize);
15
- document.addEventListener('mouseup', stopResize);
16
- }
17
-
18
- // ============================================================================
19
- // Resize Move
20
- // ============================================================================
21
- function onResize(e) {
22
- if (!resizingPanel) return;
23
-
24
- const dx = e.clientX - resizingPanel.startX;
25
- const dy = e.clientY - resizingPanel.startY;
26
-
27
- const pos = panelPositions[resizingPanel.name];
28
- pos.width = Math.max(100, pos.width + dx);
29
- pos.height = Math.max(100, pos.height + dy);
30
-
31
- resizingPanel.item.style.width = pos.width + 'px';
32
- resizingPanel.item.style.height = pos.height + 'px';
33
-
34
- resizingPanel.startX = e.clientX;
35
- resizingPanel.startY = e.clientY;
36
- }
37
-
38
- // ============================================================================
39
- // Resize Stop
40
- // ============================================================================
41
- function stopResize() {
42
- if (resizingPanel) {
43
- resizingPanel = null;
44
- document.removeEventListener('mousemove', onResize);
45
- document.removeEventListener('mouseup', stopResize);
46
- layoutModified = true;
47
- }
48
- }
@@ -1,71 +0,0 @@
1
- /**
2
- * Panel Selection
3
- * Handles panel selection and multi-selection in canvas view
4
- */
5
-
6
- // ============================================================================
7
- // Select All Panels
8
- // ============================================================================
9
- function selectAllPanels() {
10
- document.querySelectorAll('.panel-canvas-item').forEach(item => {
11
- item.classList.add('selected');
12
- });
13
- }
14
-
15
- // ============================================================================
16
- // Deselect All Panels
17
- // ============================================================================
18
- function deselectAllPanels() {
19
- document.querySelectorAll('.panel-canvas-item').forEach(item => {
20
- item.classList.remove('selected');
21
- });
22
-
23
- // Also clear element selection in single-panel view
24
- selectedElement = null;
25
- hoveredElement = null;
26
- updateOverlay();
27
- }
28
-
29
- // ============================================================================
30
- // Get Selected Panels
31
- // ============================================================================
32
- function getSelectedPanels() {
33
- const selectedItems = document.querySelectorAll('.panel-canvas-item.selected');
34
- return Array.from(selectedItems).map(item => ({
35
- item: item,
36
- name: item.dataset.panelName,
37
- pos: panelPositions[item.dataset.panelName]
38
- }));
39
- }
40
-
41
- // ============================================================================
42
- // Toggle Panel Selection
43
- // ============================================================================
44
- function togglePanelSelection(panelName) {
45
- const item = document.querySelector(`.panel-canvas-item[data-panel-name="${panelName}"]`);
46
- if (item) {
47
- item.classList.toggle('selected');
48
- }
49
- }
50
-
51
- // ============================================================================
52
- // Select Single Panel
53
- // ============================================================================
54
- function selectPanel(panelName, clearOthers = true) {
55
- if (clearOthers) {
56
- deselectAllPanels();
57
- }
58
-
59
- const item = document.querySelector(`.panel-canvas-item[data-panel-name="${panelName}"]`);
60
- if (item) {
61
- item.classList.add('selected');
62
- }
63
- }
64
-
65
- // ============================================================================
66
- // Check if Panel is Selected
67
- // ============================================================================
68
- function isPanelSelected(panelName) {
69
- const item = document.querySelector(`.panel-canvas-item[data-panel-name="${panelName}"]`);
70
- return item ? item.classList.contains('selected') : false;
71
- }
@@ -1,288 +0,0 @@
1
- /**
2
- * API Communication
3
- * Handles all server requests for preview, update, save, etc.
4
- */
5
-
6
- // ============================================================================
7
- // Preview and Update API
8
- // ============================================================================
9
- function updatePreview() {
10
- const data = collectOverrides();
11
-
12
- // Skip auto-update if showing original preview (user hasn't explicitly requested update)
13
- if (isShowingOriginalPreview) {
14
- return;
15
- }
16
-
17
- setStatus('Updating preview...');
18
-
19
- // Preserve current selection to restore after update
20
- const prevSelectedElement = selectedElement;
21
-
22
- fetch('/update', {
23
- method: 'POST',
24
- headers: {'Content-Type': 'application/json'},
25
- body: JSON.stringify(data)
26
- })
27
- .then(r => r.json())
28
- .then(result => {
29
- // Remove SVG wrapper if exists, show img element for re-rendered preview
30
- const svgWrapper = document.getElementById('preview-svg-wrapper');
31
- if (svgWrapper) {
32
- svgWrapper.style.display = 'none';
33
- }
34
- document.getElementById('preview').style.display = 'block';
35
-
36
- // Mark that we're no longer showing original preview
37
- isShowingOriginalPreview = false;
38
-
39
- if (result.image) {
40
- document.getElementById('preview').src = 'data:image/png;base64,' + result.image;
41
-
42
- // Store schema v0.3 metadata if available
43
- if (result.schema_meta) {
44
- schemaMeta = result.schema_meta;
45
- }
46
- }
47
- elementBboxes = result.bboxes || {};
48
- imgSize = result.img_size || {width: 0, height: 0};
49
- setStatus('Preview updated');
50
-
51
- // Restore selection if the element still exists in the new bboxes
52
- if (prevSelectedElement && elementBboxes[prevSelectedElement]) {
53
- selectedElement = prevSelectedElement;
54
- updateOverlay();
55
- } else {
56
- selectedElement = null;
57
- updateOverlay();
58
- }
59
- })
60
- .catch(err => {
61
- setStatus('Error updating preview: ' + err, true);
62
- });
63
- }
64
-
65
- // ============================================================================
66
- // Save API
67
- // ============================================================================
68
- function saveToBundle() {
69
- const data = collectOverrides();
70
- setStatus('Saving...');
71
- return fetch('/save', {
72
- method: 'POST',
73
- headers: {'Content-Type': 'application/json'},
74
- body: JSON.stringify(data)
75
- })
76
- .then(r => r.json())
77
- .then(result => {
78
- setStatus(result.status || 'Saved successfully');
79
- })
80
- .catch(err => {
81
- setStatus('Error saving: ' + err, true);
82
- throw err;
83
- });
84
- }
85
-
86
- // ============================================================================
87
- // Export API
88
- // ============================================================================
89
- function exportToFormat(format) {
90
- const data = collectOverrides();
91
- setStatus('Exporting to ' + format + '...');
92
-
93
- // First export to bundle
94
- fetch('/export', {
95
- method: 'POST',
96
- headers: {'Content-Type': 'application/json'},
97
- body: JSON.stringify({...data, format: format})
98
- })
99
- .then(r => r.json())
100
- .then(result => {
101
- setStatus(result.status || 'Exported successfully');
102
- // Then trigger download
103
- downloadFile(result.path, format);
104
- })
105
- .catch(err => {
106
- setStatus('Error exporting: ' + err, true);
107
- });
108
- }
109
-
110
- function downloadFile(path, format) {
111
- const filename = path.split('/').pop();
112
- fetch('/download/' + filename)
113
- .then(r => r.blob())
114
- .then(blob => {
115
- const url = URL.createObjectURL(blob);
116
- const a = document.createElement('a');
117
- a.href = url;
118
- a.download = filename;
119
- a.click();
120
- URL.revokeObjectURL(url);
121
- });
122
- }
123
-
124
- // ============================================================================
125
- // Panel API (Multi-panel figures)
126
- // ============================================================================
127
-
128
- // Helper to normalize panel names for comparison (strip .pltz extensions)
129
- function normalizePanelName(name) {
130
- if (typeof name !== 'string') return '';
131
- return name.replace('.pltz.d', '').replace('.pltz', '');
132
- }
133
-
134
- function loadPanelForEditing(panelName) {
135
- setStatus('Loading panel ' + panelName + '...');
136
-
137
- // Find panel index from panel name
138
- // Handle both formats: array of strings ["A", "B"] or array of objects [{name: "A"}, ...]
139
- // Also handle extension mismatches (e.g., "A" vs "A.pltz")
140
- let panelIndex = -1;
141
- const normalizedSearch = normalizePanelName(panelName);
142
-
143
- if (panelData && panelData.panels) {
144
- panelIndex = panelData.panels.findIndex(p => {
145
- // Check if it's a string or an object with name property
146
- if (typeof p === 'string') {
147
- return normalizePanelName(p) === normalizedSearch;
148
- } else if (p && p.name) {
149
- return normalizePanelName(p.name) === normalizedSearch;
150
- }
151
- return false;
152
- });
153
- }
154
-
155
- if (panelIndex === -1) {
156
- setStatus('Panel not found: ' + panelName, true);
157
- return Promise.reject(new Error('Panel not found: ' + panelName));
158
- }
159
-
160
- return fetch('/switch_panel/' + panelIndex)
161
- .then(r => r.json())
162
- .then(result => {
163
- if (result.error) {
164
- throw new Error(result.error);
165
- }
166
-
167
- // Update panel state
168
- currentPanelIndex = panelIndex;
169
-
170
- // Update preview image
171
- if (result.image) {
172
- document.getElementById('preview').src = 'data:image/png;base64,' + result.image;
173
- }
174
-
175
- // Update bboxes and overlays
176
- elementBboxes = result.bboxes || {};
177
- imgSize = result.img_size || {width: 0, height: 0};
178
-
179
- // Sync bboxes cache
180
- panelBboxesCache[panelName] = {bboxes: elementBboxes, imgSize: imgSize};
181
-
182
- // Update overrides
183
- if (result.overrides) {
184
- overrides = result.overrides;
185
- }
186
-
187
- // Select the element that was clicked
188
- if (result.selected_element) {
189
- selectedElement = result.selected_element;
190
- }
191
-
192
- // Scroll to section and show properties
193
- scrollToSection(selectedElement);
194
-
195
- // Keep unified canvas view only - don't show single-panel preview
196
- showingPanelGrid = true;
197
- // Update panel path display in right panel header
198
- const panelPath = document.getElementById('current-panel-path');
199
- if (panelPath) {
200
- panelPath.textContent = panelName || 'Single Panel';
201
- }
202
-
203
- setStatus('Panel loaded');
204
- return result;
205
- })
206
- .catch(err => {
207
- setStatus('Error loading panel: ' + err, true);
208
- throw err;
209
- });
210
- }
211
-
212
- // ============================================================================
213
- // Layout Save API
214
- // ============================================================================
215
- function saveLayout() {
216
- const data = {
217
- layout: panelLayoutMm,
218
- overrides: overrides
219
- };
220
-
221
- setStatus('Saving layout...');
222
-
223
- return fetch('/save_layout', {
224
- method: 'POST',
225
- headers: {'Content-Type': 'application/json'},
226
- body: JSON.stringify(data)
227
- })
228
- .then(r => r.json())
229
- .then(result => {
230
- setStatus('Layout saved');
231
- layoutModified = false;
232
- })
233
- .catch(err => {
234
- setStatus('Error saving layout: ' + err, true);
235
- throw err;
236
- });
237
- }
238
-
239
- // ============================================================================
240
- // Element Position Update API
241
- // ============================================================================
242
- function updateElementPosition(panelName, elementName, position) {
243
- const data = {
244
- panel_name: panelName,
245
- element_name: elementName,
246
- position: position,
247
- overrides: overrides
248
- };
249
-
250
- return fetch('/save_element_position', {
251
- method: 'POST',
252
- headers: {'Content-Type': 'application/json'},
253
- body: JSON.stringify(data)
254
- })
255
- .then(r => r.json())
256
- .then(result => {
257
- setStatus('Element position updated');
258
- // Reload panel to show updated position
259
- return loadPanelForEditing(panelName);
260
- })
261
- .catch(err => {
262
- setStatus('Error updating element position: ' + err, true);
263
- throw err;
264
- });
265
- }
266
-
267
- // ============================================================================
268
- // Auto-Update Scheduling
269
- // ============================================================================
270
- function scheduleUpdate() {
271
- clearTimeout(updateTimer);
272
- updateTimer = setTimeout(updatePreview, DEBOUNCE_DELAY);
273
- }
274
-
275
- function setAutoUpdateInterval() {
276
- if (autoUpdateIntervalId) {
277
- clearInterval(autoUpdateIntervalId);
278
- autoUpdateIntervalId = null;
279
- }
280
-
281
- const intervalMs = parseInt(document.getElementById('auto_update_interval').value);
282
- if (intervalMs > 0) {
283
- autoUpdateIntervalId = setInterval(() => {
284
- updatePreview();
285
- }, intervalMs);
286
- }
287
- }
288
-