scitex 2.10.2__py3-none-any.whl → 2.11.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 (363) hide show
  1. scitex/__init__.py +1 -4
  2. scitex/__version__.py +1 -1
  3. scitex/_install_guide.py +14 -2
  4. scitex/bridge/_figrecipe.py +1 -1
  5. scitex/bridge/_helpers.py +1 -1
  6. scitex/bridge/_plt_vis.py +1 -1
  7. scitex/bridge/_stats_plt.py +1 -1
  8. scitex/bridge/_stats_vis.py +2 -2
  9. scitex/{fig → canvas}/__init__.py +84 -96
  10. scitex/{fig → canvas}/backend/_parser.py +1 -1
  11. scitex/{fig → canvas}/canvas.py +13 -14
  12. scitex/{fts/_fig/_editor → canvas/editor}/_defaults.py +2 -2
  13. scitex/{fig → canvas}/editor/edit/__init__.py +11 -14
  14. scitex/{fig → canvas}/editor/edit/bundle_resolver.py +56 -48
  15. scitex/{fig → canvas}/editor/edit/editor_launcher.py +79 -26
  16. scitex/{fts/_fig/_editor/_cui/_panel_loader.py → canvas/editor/edit/panel_loader.py} +8 -8
  17. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_bbox.py +2 -1
  18. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_core.py +84 -84
  19. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_renderer.py +7 -6
  20. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/static/css/features/canvas.css +2 -2
  21. scitex/{fig → canvas}/editor/flask_editor/static/css/features/panel-grid.css +1 -1
  22. scitex/{fig → canvas}/editor/flask_editor/static/js/core/api.js +3 -4
  23. scitex/{fig → canvas}/editor/flask_editor/static/js/editor/preview.js +5 -5
  24. scitex/{fig → canvas}/editor/flask_editor/templates/_html.py +3 -3
  25. scitex/{fig → canvas}/editor/flask_editor/templates/_scripts.py +10 -10
  26. scitex/{fig → canvas}/editor/flask_editor/templates/_styles.py +3 -3
  27. scitex/{fig → canvas}/io/__init__.py +32 -38
  28. scitex/{fig → canvas}/io/_bundle.py +217 -154
  29. scitex/{fig → canvas}/io/_canvas.py +1 -1
  30. scitex/{fig → canvas}/io/_data.py +1 -1
  31. scitex/{fig → canvas}/io/_export.py +1 -1
  32. scitex/{fig → canvas}/io/_load.py +1 -1
  33. scitex/{fig → canvas}/io/_panel.py +1 -1
  34. scitex/{fig → canvas}/io/_save.py +1 -1
  35. scitex/{fig → canvas}/model/__init__.py +1 -1
  36. scitex/{fig → canvas}/model/_annotations.py +1 -1
  37. scitex/{fig → canvas}/model/_axes.py +1 -1
  38. scitex/{fig → canvas}/model/_figure.py +1 -1
  39. scitex/{fig → canvas}/model/_guides.py +1 -1
  40. scitex/{fig → canvas}/model/_plot.py +1 -1
  41. scitex/{fig → canvas}/model/_styles.py +1 -1
  42. scitex/{fig → canvas}/utils/__init__.py +1 -1
  43. scitex/cli/convert.py +10 -6
  44. scitex/diagram/README.md +7 -7
  45. scitex/io/__init__.py +7 -19
  46. scitex/io/_load.py +15 -19
  47. scitex/io/_load_modules/_canvas.py +2 -2
  48. scitex/io/_load_modules/_con.py +5 -5
  49. scitex/io/_load_modules/_eeg.py +16 -12
  50. scitex/io/_save.py +11 -16
  51. scitex/io/_save_modules/__init__.py +6 -10
  52. scitex/io/_save_modules/_canvas.py +3 -3
  53. scitex/io/_save_modules/_plot_bundle.py +112 -0
  54. scitex/io/_save_modules/{_pltz_stx.py → _plot_scitex.py} +7 -7
  55. scitex/io/_save_modules/_stx_bundle.py +16 -16
  56. scitex/io/bundle/README.md +89 -80
  57. scitex/{fts/_bundle/_FTS.py → io/bundle/_Bundle.py} +197 -95
  58. scitex/io/bundle/__init__.py +67 -35
  59. scitex/{fts/_bundle → io/bundle}/_children.py +32 -40
  60. scitex/io/bundle/_core.py +184 -97
  61. scitex/{fts/_bundle/_dataclasses/_Node.py → io/bundle/_dataclasses/_Spec.py} +29 -23
  62. scitex/{fts/_bundle/_dataclasses/_NodeRefs.py → io/bundle/_dataclasses/_SpecRefs.py} +6 -6
  63. scitex/{fts/_bundle → io/bundle}/_dataclasses/__init__.py +4 -4
  64. scitex/{fts/_bundle → io/bundle}/_loader.py +19 -19
  65. scitex/io/bundle/_manifest.py +99 -0
  66. scitex/{fts/_bundle → io/bundle}/_mpl_helpers.py +119 -28
  67. scitex/io/bundle/_nested.py +113 -100
  68. scitex/{fts/_bundle → io/bundle}/_saver.py +13 -14
  69. scitex/{fts/_bundle → io/bundle}/_storage.py +3 -3
  70. scitex/io/bundle/_types.py +41 -16
  71. scitex/{fts/_bundle → io/bundle}/_validation.py +20 -18
  72. scitex/io/bundle/_zip.py +21 -31
  73. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_backend/_parser.py +1 -1
  74. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Annotations.py +1 -1
  75. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Axes.py +1 -1
  76. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Figure.py +1 -1
  77. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Guides.py +1 -1
  78. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Plot.py +1 -1
  79. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Styles.py +1 -1
  80. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_utils/_plot_layout.py +1 -1
  81. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/__init__.py +1 -1
  82. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/_app.py +1 -1
  83. scitex/{fts/_tables → io/bundle/kinds/_table}/_latex/_export.py +1 -1
  84. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_figure_exporter.py +1 -1
  85. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_table_exporter.py +1 -1
  86. scitex/io/bundle/schemas/__init__.py +30 -0
  87. scitex/parallel/_run.py +5 -4
  88. scitex/path/_find.py +60 -83
  89. scitex/path/_get_module_path.py +23 -21
  90. scitex/path/_get_spath.py +6 -27
  91. scitex/path/_getsize.py +23 -9
  92. scitex/path/_increment_version.py +31 -38
  93. scitex/path/_mk_spath.py +26 -29
  94. scitex/path/_path.py +5 -12
  95. scitex/path/_split.py +27 -15
  96. scitex/path/_this_path.py +23 -9
  97. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +2 -1
  98. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +2 -2
  99. scitex/plt/gallery/_generate.py +76 -50
  100. scitex/plt/io/__init__.py +17 -19
  101. scitex/plt/io/_bundle.py +99 -52
  102. scitex/plt/io/_layered_bundle.py +303 -168
  103. scitex/plt/utils/_csv_column_naming.py +250 -118
  104. scitex/schema/__init__.py +69 -73
  105. scitex/schema/_canvas.py +1 -1
  106. scitex/schema/_stats.py +2 -2
  107. scitex/stats/__init__.py +30 -33
  108. scitex/stats/_schema.py +1 -1
  109. scitex/stats/io/__init__.py +10 -11
  110. scitex/stats/io/_bundle.py +16 -16
  111. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/METADATA +191 -72
  112. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/RECORD +237 -360
  113. scitex/fig/editor/_defaults.py +0 -300
  114. scitex/fig/editor/edit/panel_loader.py +0 -232
  115. scitex/fig/editor/flask_editor/_bbox.py +0 -1299
  116. scitex/fig/editor/flask_editor/_core.py +0 -1429
  117. scitex/fig/editor/flask_editor/_renderer.py +0 -813
  118. scitex/fig/editor/flask_editor/static/css/features/canvas.css +0 -176
  119. scitex/fts/README.md +0 -262
  120. scitex/fts/TODO.md +0 -66
  121. scitex/fts/__init__.py +0 -90
  122. scitex/fts/_bundle/README_IN_BUNDLE.md +0 -102
  123. scitex/fts/_bundle/__init__.py +0 -38
  124. scitex/fts/_bundle/_utils/__init__.py +0 -55
  125. scitex/fts/_bundle/_utils/_const.py +0 -26
  126. scitex/fts/_bundle/_utils/_errors.py +0 -73
  127. scitex/fts/_bundle/_utils/_generate.py +0 -21
  128. scitex/fts/_bundle/_utils/_types.py +0 -76
  129. scitex/fts/_bundle/_zipbundle.py +0 -165
  130. scitex/fts/_fig/__init__.py +0 -22
  131. scitex/fts/_fig/_backend/_parser.py +0 -188
  132. scitex/fts/_fig/_editor/__init__.py +0 -14
  133. scitex/fts/_fig/_editor/_cui/__init__.py +0 -33
  134. scitex/fts/_fig/_editor/_cui/_backend_detector.py +0 -39
  135. scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +0 -366
  136. scitex/fts/_fig/_editor/_cui/_editor_launcher.py +0 -175
  137. scitex/fts/_fig/_editor/_cui/_manual_handler.py +0 -52
  138. scitex/fts/_fig/_editor/_cui/_path_resolver.py +0 -66
  139. scitex/fts/_fig/_editor/_gui/__init__.py +0 -11
  140. scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +0 -20
  141. scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +0 -664
  142. scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +0 -79
  143. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +0 -41
  144. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +0 -16
  145. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +0 -85
  146. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +0 -217
  147. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +0 -93
  148. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +0 -57
  149. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +0 -112
  150. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +0 -59
  151. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +0 -212
  152. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +0 -190
  153. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +0 -59
  154. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +0 -45
  155. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +0 -95
  156. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +0 -101
  157. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +0 -138
  158. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +0 -31
  159. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +0 -7
  160. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +0 -56
  161. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +0 -78
  162. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +0 -314
  163. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +0 -107
  164. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +0 -54
  165. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +0 -172
  166. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +0 -258
  167. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +0 -48
  168. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +0 -71
  169. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +0 -288
  170. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +0 -143
  171. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +0 -245
  172. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +0 -992
  173. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +0 -339
  174. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +0 -286
  175. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +0 -371
  176. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +0 -293
  177. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +0 -426
  178. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +0 -152
  179. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +0 -265
  180. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +0 -184
  181. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +0 -57
  182. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +0 -100
  183. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +0 -34
  184. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +0 -124
  185. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +0 -851
  186. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +0 -4932
  187. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +0 -1657
  188. scitex/fts/_fig/_editor/_gui/_flask_editor.py +0 -36
  189. scitex/fts/_fig/_models/_Annotations.py +0 -115
  190. scitex/fts/_fig/_models/_Axes.py +0 -152
  191. scitex/fts/_fig/_models/_Figure.py +0 -138
  192. scitex/fts/_fig/_models/_Plot.py +0 -123
  193. scitex/fts/_fig/_utils/_plot_layout.py +0 -397
  194. scitex/fts/_kinds/_figure/_composite.py +0 -345
  195. scitex/fts/_kinds/_plot/_backend/__init__.py +0 -53
  196. scitex/fts/_kinds/_plot/_backend/_export.py +0 -165
  197. scitex/fts/_kinds/_plot/_backend/_render.py +0 -538
  198. scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +0 -46
  199. scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +0 -82
  200. scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +0 -441
  201. scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +0 -52
  202. scitex/fts/_kinds/_plot/_dataclasses/__init__.py +0 -47
  203. scitex/fts/_kinds/_plot/_models/_Guides.py +0 -104
  204. scitex/fts/_kinds/_plot/_models/_Styles.py +0 -245
  205. scitex/fts/_kinds/_plot/_models/__init__.py +0 -80
  206. scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +0 -156
  207. scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +0 -43
  208. scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +0 -38
  209. scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +0 -36
  210. scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +0 -60
  211. scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +0 -30
  212. scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +0 -61
  213. scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +0 -57
  214. scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +0 -30
  215. scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +0 -121
  216. scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +0 -36
  217. scitex/fts/_kinds/_plot/_utils/__init__.py +0 -129
  218. scitex/fts/_kinds/_plot/_utils/_auto_layout.py +0 -127
  219. scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +0 -111
  220. scitex/fts/_kinds/_plot/_utils/_const_sizes.py +0 -48
  221. scitex/fts/_kinds/_plot/_utils/_convert_coords.py +0 -77
  222. scitex/fts/_kinds/_plot/_utils/_get_template.py +0 -178
  223. scitex/fts/_kinds/_plot/_utils/_normalize.py +0 -73
  224. scitex/fts/_kinds/_plot/_utils/_validate.py +0 -197
  225. scitex/fts/_kinds/_table/_latex/_export.py +0 -279
  226. scitex/fts/_stats/__init__.py +0 -48
  227. scitex/fts/_stats/_dataclasses/_Stats.py +0 -423
  228. scitex/fts/_stats/_dataclasses/__init__.py +0 -48
  229. scitex/fts/_tables/__init__.py +0 -65
  230. scitex/fts/_tables/_latex/__init__.py +0 -93
  231. scitex/fts/_tables/_latex/_editor/__init__.py +0 -11
  232. scitex/fts/_tables/_latex/_editor/_app.py +0 -725
  233. scitex/fts/_tables/_latex/_figure_exporter.py +0 -153
  234. scitex/fts/_tables/_latex/_stats_formatter.py +0 -274
  235. scitex/fts/_tables/_latex/_table_exporter.py +0 -362
  236. scitex/fts/_tables/_latex/_utils.py +0 -369
  237. scitex/fts/_tables/_latex/_validator.py +0 -445
  238. scitex/io/_save_modules/_pltz_bundle.py +0 -356
  239. /scitex/{fig → canvas}/README.md +0 -0
  240. /scitex/{fig → canvas}/backend/__init__.py +0 -0
  241. /scitex/{fig → canvas}/backend/_export.py +0 -0
  242. /scitex/{fig → canvas}/backend/_render.py +0 -0
  243. /scitex/{fig → canvas}/docs/CANVAS_ARCHITECTURE.md +0 -0
  244. /scitex/{fig → canvas}/editor/__init__.py +0 -0
  245. /scitex/{fig → canvas}/editor/_dearpygui_editor.py +0 -0
  246. /scitex/{fig → canvas}/editor/_flask_editor.py +0 -0
  247. /scitex/{fig → canvas}/editor/_mpl_editor.py +0 -0
  248. /scitex/{fig → canvas}/editor/_qt_editor.py +0 -0
  249. /scitex/{fig → canvas}/editor/_tkinter_editor.py +0 -0
  250. /scitex/{fig → canvas}/editor/edit/backend_detector.py +0 -0
  251. /scitex/{fig → canvas}/editor/edit/manual_handler.py +0 -0
  252. /scitex/{fig → canvas}/editor/edit/path_resolver.py +0 -0
  253. /scitex/{fig → canvas}/editor/flask_editor/__init__.py +0 -0
  254. /scitex/{fig → canvas}/editor/flask_editor/_plotter.py +0 -0
  255. /scitex/{fig → canvas}/editor/flask_editor/_utils.py +0 -0
  256. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/reset.css +0 -0
  257. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/typography.css +0 -0
  258. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/variables.css +0 -0
  259. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/buttons.css +0 -0
  260. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/context-menu.css +0 -0
  261. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/dropdown.css +0 -0
  262. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/forms.css +0 -0
  263. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/modal.css +0 -0
  264. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/sections.css +0 -0
  265. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/element-inspector.css +0 -0
  266. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/loading.css +0 -0
  267. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/overlay.css +0 -0
  268. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/selection.css +0 -0
  269. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/statistics.css +0 -0
  270. /scitex/{fig → canvas}/editor/flask_editor/static/css/index.css +0 -0
  271. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/container.css +0 -0
  272. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/controls.css +0 -0
  273. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/preview.css +0 -0
  274. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/axis.js +0 -0
  275. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/basic.js +0 -0
  276. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/distribute.js +0 -0
  277. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/canvas.js +0 -0
  278. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/dragging.js +0 -0
  279. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/resize.js +0 -0
  280. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/selection.js +0 -0
  281. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/state.js +0 -0
  282. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/utils.js +0 -0
  283. /scitex/{fig → canvas}/editor/flask_editor/static/js/dev/element-inspector.js +0 -0
  284. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/bbox.js +0 -0
  285. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/element-drag.js +0 -0
  286. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/overlay.js +0 -0
  287. /scitex/{fig → canvas}/editor/flask_editor/static/js/main.js +0 -0
  288. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/context-menu.js +0 -0
  289. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/keyboard.js +0 -0
  290. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/controls.js +0 -0
  291. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/download.js +0 -0
  292. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/help.js +0 -0
  293. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/theme.js +0 -0
  294. /scitex/{fig → canvas}/editor/flask_editor/templates/__init__.py +0 -0
  295. /scitex/{fig → canvas}/io/_directory.py +0 -0
  296. /scitex/{fig → canvas}/model/_plot_types.py +0 -0
  297. /scitex/{fig → canvas}/utils/_defaults.py +0 -0
  298. /scitex/{fig → canvas}/utils/_validate.py +0 -0
  299. /scitex/{fts/_bundle → io/bundle}/_conversion/__init__.py +0 -0
  300. /scitex/{fts/_bundle → io/bundle}/_conversion/_bundle2dict.py +0 -0
  301. /scitex/{fts/_bundle → io/bundle}/_conversion/_dict2bundle.py +0 -0
  302. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_Axes.py +0 -0
  303. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_BBox.py +0 -0
  304. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_ColumnDef.py +0 -0
  305. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataFormat.py +0 -0
  306. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataInfo.py +0 -0
  307. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataSource.py +0 -0
  308. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_SizeMM.py +0 -0
  309. /scitex/{fts/_bundle → io/bundle}/_extractors/__init__.py +0 -0
  310. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_bar.py +0 -0
  311. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_line.py +0 -0
  312. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_scatter.py +0 -0
  313. /scitex/{fts/_kinds → io/bundle/kinds}/__init__.py +0 -0
  314. /scitex/{fts/_kinds → io/bundle/kinds}/_figure/__init__.py +0 -0
  315. /scitex/{fts/_fig → io/bundle/kinds/_figure}/_composite.py +0 -0
  316. /scitex/{fts/_kinds → io/bundle/kinds}/_plot/__init__.py +0 -0
  317. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/__init__.py +0 -0
  318. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_export.py +0 -0
  319. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_render.py +0 -0
  320. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_ChannelEncoding.py +0 -0
  321. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Encoding.py +0 -0
  322. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Theme.py +0 -0
  323. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_TraceEncoding.py +0 -0
  324. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/__init__.py +0 -0
  325. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/__init__.py +0 -0
  326. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/__init__.py +0 -0
  327. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_bar.py +0 -0
  328. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_box.py +0 -0
  329. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_distribution.py +0 -0
  330. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_errorbar.py +0 -0
  331. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_histogram.py +0 -0
  332. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_image.py +0 -0
  333. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_line.py +0 -0
  334. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_scatter.py +0 -0
  335. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_seaborn.py +0 -0
  336. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_violin.py +0 -0
  337. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/__init__.py +0 -0
  338. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_auto_layout.py +0 -0
  339. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_calc_bounds.py +0 -0
  340. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_const_sizes.py +0 -0
  341. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_convert_coords.py +0 -0
  342. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_get_template.py +0 -0
  343. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_normalize.py +0 -0
  344. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_validate.py +0 -0
  345. /scitex/{fts/_kinds → io/bundle/kinds}/_shape/__init__.py +0 -0
  346. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/__init__.py +0 -0
  347. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/_Stats.py +0 -0
  348. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/__init__.py +0 -0
  349. /scitex/{fts/_kinds → io/bundle/kinds}/_table/__init__.py +0 -0
  350. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/__init__.py +0 -0
  351. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_stats_formatter.py +0 -0
  352. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_utils.py +0 -0
  353. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_validator.py +0 -0
  354. /scitex/{fts/_kinds → io/bundle/kinds}/_text/__init__.py +0 -0
  355. /scitex/{fts/_schemas → io/bundle/schemas}/data_info.schema.json +0 -0
  356. /scitex/{fts/_schemas → io/bundle/schemas}/encoding.schema.json +0 -0
  357. /scitex/{fts/_schemas → io/bundle/schemas}/node.schema.json +0 -0
  358. /scitex/{fts/_schemas → io/bundle/schemas}/render_manifest.schema.json +0 -0
  359. /scitex/{fts/_schemas → io/bundle/schemas}/stats.schema.json +0 -0
  360. /scitex/{fts/_schemas → io/bundle/schemas}/theme.schema.json +0 -0
  361. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/WHEEL +0 -0
  362. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/entry_points.txt +0 -0
  363. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/licenses/LICENSE +0 -0
@@ -3,27 +3,31 @@
3
3
  # Timestamp: "2025-12-14 (ywatanabe)"
4
4
  # File: /home/ywatanabe/proj/scitex-code/src/scitex/fig/editor/edit/bundle_resolver.py
5
5
 
6
- """Bundle path resolution for .pltz and .figz formats."""
6
+ """Bundle path resolution for .plot and .figure formats."""
7
7
 
8
8
  import json as json_module
9
9
  import tempfile
10
10
  import zipfile
11
11
  from pathlib import Path
12
- from typing import Optional, Tuple, Dict, Any
12
+ from typing import Any, Dict, Optional, Tuple
13
13
 
14
- __all__ = ["resolve_pltz_bundle", "resolve_figz_bundle", "resolve_layered_pltz_bundle"]
14
+ __all__ = [
15
+ "resolve_plot_bundle",
16
+ "resolve_figure_bundle",
17
+ "resolve_layered_plot_bundle",
18
+ ]
15
19
 
16
20
 
17
- def resolve_figz_bundle(path: Path, panel_index: int = 0) -> Tuple:
21
+ def resolve_figure_bundle(path: Path, panel_index: int = 0) -> Tuple:
18
22
  """
19
- Resolve paths from a .figz bundle (multi-panel figure).
23
+ Resolve paths from a .figure bundle (multi-panel figure).
20
24
 
21
- Uses in-memory zip reading for .pltz panels - no disk extraction.
25
+ Uses in-memory zip reading for .plot panels - no disk extraction.
22
26
 
23
27
  Parameters
24
28
  ----------
25
29
  path : Path
26
- Path to .figz bundle (.figz or .figz.d)
30
+ Path to .figure bundle (.figure or .figure)
27
31
  panel_index : int, optional
28
32
  Index of panel to open (default: 0 for first panel)
29
33
 
@@ -33,41 +37,41 @@ def resolve_figz_bundle(path: Path, panel_index: int = 0) -> Tuple:
33
37
  (json_path, csv_path, png_path, hitmap_path, bundle_spec, panel_info)
34
38
  """
35
39
  spath = str(path)
36
- figz_is_zip = False
40
+ figure_is_zip = False
37
41
 
38
42
  # Handle ZIP vs directory for figz
39
- if spath.endswith('.figz') and not spath.endswith('.figz.d'):
40
- figz_is_zip = True
43
+ if spath.endswith(".figure") and not spath.endswith(".figure"):
44
+ figure_is_zip = True
41
45
  if not path.exists():
42
- raise FileNotFoundError(f"Figz bundle not found: {path}")
43
- # For figz zip, extract to access nested pltz
44
- temp_dir = tempfile.mkdtemp(prefix='scitex_edit_figz_')
45
- with zipfile.ZipFile(path, 'r') as zf:
46
+ raise FileNotFoundError(f"Figure bundle not found: {path}")
47
+ # For figure zip, extract to access nested pltz
48
+ temp_dir = tempfile.mkdtemp(prefix="scitex_edit_figure_")
49
+ with zipfile.ZipFile(path, "r") as zf:
46
50
  zf.extractall(temp_dir)
47
51
  bundle_dir = Path(temp_dir)
48
52
  for item in bundle_dir.iterdir():
49
- if item.is_dir() and str(item).endswith('.figz.d'):
53
+ if item.is_dir() and str(item).endswith(".figure"):
50
54
  bundle_dir = item
51
55
  break
52
56
  else:
53
57
  bundle_dir = Path(path)
54
58
  if not bundle_dir.exists():
55
- raise FileNotFoundError(f"Figz bundle directory not found: {bundle_dir}")
59
+ raise FileNotFoundError(f"Figure bundle directory not found: {bundle_dir}")
56
60
 
57
- # Find nested pltz bundles
61
+ # Find nested plot bundles
58
62
  panel_paths = []
59
63
  panel_is_zip = []
60
64
 
61
65
  for item in sorted(bundle_dir.iterdir(), key=lambda x: x.name):
62
- if item.is_dir() and str(item).endswith('.pltz.d'):
66
+ if item.is_dir() and str(item).endswith(".plot"):
63
67
  panel_paths.append(str(item))
64
68
  panel_is_zip.append(False)
65
- elif item.is_file() and str(item).endswith('.pltz'):
69
+ elif item.is_file() and str(item).endswith(".plot"):
66
70
  panel_paths.append(str(item))
67
71
  panel_is_zip.append(True)
68
72
 
69
73
  if not panel_paths:
70
- raise FileNotFoundError(f"No .pltz panels found in figz bundle: {bundle_dir}")
74
+ raise FileNotFoundError(f"No .plot panels found in figure bundle: {bundle_dir}")
71
75
 
72
76
  # Validate panel index
73
77
  if panel_index < 0 or panel_index >= len(panel_paths):
@@ -77,7 +81,7 @@ def resolve_figz_bundle(path: Path, panel_index: int = 0) -> Tuple:
77
81
  panel_name = Path(selected_panel_path).name
78
82
  print(f"Opening panel: {panel_name}")
79
83
  if len(panel_paths) > 1:
80
- print(f" (Figz contains {len(panel_paths)} panels)")
84
+ print(f" (Figure contains {len(panel_paths)} panels)")
81
85
 
82
86
  # Build panel info
83
87
  panel_names = [Path(p).name for p in panel_paths]
@@ -86,19 +90,21 @@ def resolve_figz_bundle(path: Path, panel_index: int = 0) -> Tuple:
86
90
  "panel_paths": panel_paths,
87
91
  "panel_is_zip": panel_is_zip,
88
92
  "current_index": panel_index,
89
- "figz_dir": str(bundle_dir),
90
- "figz_is_zip": figz_is_zip,
91
- "bundle_path": str(path) if figz_is_zip else None, # Original figz zip path for export/download
93
+ "figure_dir": str(bundle_dir),
94
+ "figure_is_zip": figure_is_zip,
95
+ "bundle_path": (
96
+ str(path) if figure_is_zip else None
97
+ ), # Original figure zip path for export/download
92
98
  }
93
99
 
94
100
  # Resolve the selected panel
95
- result = resolve_pltz_bundle(Path(selected_panel_path))
101
+ result = resolve_plot_bundle(Path(selected_panel_path))
96
102
  return result + (panel_info,)
97
103
 
98
104
 
99
- def resolve_pltz_bundle(path: Path) -> Tuple:
105
+ def resolve_plot_bundle(path: Path) -> Tuple:
100
106
  """
101
- Resolve paths from a .pltz bundle (directory or ZIP).
107
+ Resolve paths from a .plot bundle (directory or ZIP).
102
108
 
103
109
  Supports both:
104
110
  - Legacy format (single {basename}.json)
@@ -107,7 +113,7 @@ def resolve_pltz_bundle(path: Path) -> Tuple:
107
113
  Parameters
108
114
  ----------
109
115
  path : Path
110
- Path to .pltz bundle (.pltz or .pltz.d)
116
+ Path to .plot bundle (.plot or .plot)
111
117
 
112
118
  Returns
113
119
  -------
@@ -117,15 +123,15 @@ def resolve_pltz_bundle(path: Path) -> Tuple:
117
123
  spath = str(path)
118
124
 
119
125
  # Handle ZIP vs directory
120
- if spath.endswith('.pltz') and not spath.endswith('.pltz.d'):
126
+ if spath.endswith(".plot") and not spath.endswith(".plot"):
121
127
  if not path.exists():
122
128
  raise FileNotFoundError(f"Bundle not found: {path}")
123
- temp_dir = tempfile.mkdtemp(prefix='scitex_edit_')
124
- with zipfile.ZipFile(path, 'r') as zf:
129
+ temp_dir = tempfile.mkdtemp(prefix="scitex_edit_")
130
+ with zipfile.ZipFile(path, "r") as zf:
125
131
  zf.extractall(temp_dir)
126
132
  bundle_dir = Path(temp_dir)
127
133
  for item in bundle_dir.iterdir():
128
- if item.is_dir() and str(item).endswith('.pltz.d'):
134
+ if item.is_dir() and str(item).endswith(".plot"):
129
135
  bundle_dir = item
130
136
  break
131
137
  else:
@@ -136,7 +142,7 @@ def resolve_pltz_bundle(path: Path) -> Tuple:
136
142
  # Check if this is a layered bundle (v2.0)
137
143
  spec_path = bundle_dir / "spec.json"
138
144
  if spec_path.exists():
139
- return resolve_layered_pltz_bundle(bundle_dir)
145
+ return resolve_layered_plot_bundle(bundle_dir)
140
146
 
141
147
  # === Legacy format ===
142
148
  json_path = None
@@ -148,15 +154,17 @@ def resolve_pltz_bundle(path: Path) -> Tuple:
148
154
 
149
155
  for f in bundle_dir.iterdir():
150
156
  name = f.name
151
- if name.endswith('.json') and not name.endswith('.manual.json'):
157
+ if name.endswith(".json") and not name.endswith(".manual.json"):
152
158
  json_path = f
153
- elif name.endswith('.csv'):
159
+ elif name.endswith(".csv"):
154
160
  csv_path = f
155
- elif name.endswith('_hitmap.png'):
161
+ elif name.endswith("_hitmap.png"):
156
162
  hitmap_path = f
157
- elif name.endswith('.svg') and '_hitmap' not in name:
163
+ elif name.endswith(".svg") and "_hitmap" not in name:
158
164
  svg_path = f
159
- elif name.endswith('.png') and '_hitmap' not in name and '_overview' not in name:
165
+ elif (
166
+ name.endswith(".png") and "_hitmap" not in name and "_overview" not in name
167
+ ):
160
168
  png_path = f
161
169
 
162
170
  # Prefer SVG for display
@@ -164,7 +172,7 @@ def resolve_pltz_bundle(path: Path) -> Tuple:
164
172
  png_path = svg_path
165
173
 
166
174
  if json_path and json_path.exists():
167
- with open(json_path, 'r') as f:
175
+ with open(json_path, "r") as f:
168
176
  bundle_spec = json_module.load(f)
169
177
 
170
178
  return (
@@ -176,12 +184,12 @@ def resolve_pltz_bundle(path: Path) -> Tuple:
176
184
  )
177
185
 
178
186
 
179
- def resolve_layered_pltz_bundle(bundle_dir: Path) -> Tuple:
187
+ def resolve_layered_plot_bundle(bundle_dir: Path) -> Tuple:
180
188
  """
181
- Resolve paths from a layered .pltz bundle (v2.0 format).
189
+ Resolve paths from a layered .plot bundle (v2.0 format).
182
190
 
183
191
  Layered format structure:
184
- plot.pltz.d/
192
+ plot.plot/
185
193
  spec.json # Semantic
186
194
  style.json # Appearance
187
195
  {basename}.csv # Data
@@ -191,16 +199,16 @@ def resolve_layered_pltz_bundle(bundle_dir: Path) -> Tuple:
191
199
  Parameters
192
200
  ----------
193
201
  bundle_dir : Path
194
- Path to .pltz.d bundle directory.
202
+ Path to .plot bundle directory.
195
203
 
196
204
  Returns
197
205
  -------
198
206
  tuple
199
207
  (json_path, csv_path, png_path, hitmap_path, bundle_spec)
200
208
  """
201
- from scitex.plt.io import load_layered_pltz_bundle
209
+ from scitex.plt.io import load_layered_plot_bundle
202
210
 
203
- bundle_data = load_layered_pltz_bundle(bundle_dir)
211
+ bundle_data = load_layered_plot_bundle(bundle_dir)
204
212
  spec_path = bundle_dir / "spec.json"
205
213
  csv_path = None
206
214
  png_path = None
@@ -216,11 +224,11 @@ def resolve_layered_pltz_bundle(bundle_dir: Path) -> Tuple:
216
224
  if exports_dir.exists():
217
225
  for f in exports_dir.iterdir():
218
226
  name = f.name
219
- if name.endswith('_hitmap.png'):
227
+ if name.endswith("_hitmap.png"):
220
228
  hitmap_path = f
221
- elif name.endswith('.svg') and '_hitmap' not in name:
229
+ elif name.endswith(".svg") and "_hitmap" not in name:
222
230
  png_path = f
223
- elif name.endswith('.png') and '_hitmap' not in name and png_path is None:
231
+ elif name.endswith(".png") and "_hitmap" not in name and png_path is None:
224
232
  png_path = f
225
233
 
226
234
  bundle_spec = bundle_data.get("merged", {})
@@ -6,11 +6,11 @@
6
6
  """Main edit function for launching visual editor."""
7
7
 
8
8
  from pathlib import Path
9
- from typing import Union, Literal
9
+ from typing import Literal, Union
10
10
 
11
- from .backend_detector import print_available_backends, detect_best_backend
11
+ from .backend_detector import detect_best_backend, print_available_backends
12
+ from .bundle_resolver import resolve_figure_bundle, resolve_plot_bundle
12
13
  from .path_resolver import resolve_figure_paths
13
- from .bundle_resolver import resolve_pltz_bundle, resolve_figz_bundle
14
14
 
15
15
  __all__ = ["edit"]
16
16
 
@@ -28,9 +28,9 @@ def edit(
28
28
  ----------
29
29
  path : str or Path
30
30
  Path to figure file. Can be:
31
- - .pltz.d directory bundle (recommended for hitmap selection)
32
- - .pltz ZIP bundle
33
- - .figz or .figz.d multi-panel bundle
31
+ - .plot directory bundle (recommended for hitmap selection)
32
+ - .plot ZIP bundle
33
+ - .figure multi-panel bundle
34
34
  - JSON file (figure.json or figure.manual.json)
35
35
  - CSV file (figure.csv) - for data-only start
36
36
  - PNG file (figure.png)
@@ -60,8 +60,8 @@ def edit(
60
60
  panel_info = None
61
61
 
62
62
  # Resolve paths based on input type
63
- json_path, csv_path, png_path, hitmap_path, bundle_spec, panel_info = _resolve_paths(
64
- path, spath, parent_str
63
+ json_path, csv_path, png_path, hitmap_path, bundle_spec, panel_info = (
64
+ _resolve_paths(path, spath, parent_str)
65
65
  )
66
66
 
67
67
  if not json_path.exists():
@@ -111,17 +111,31 @@ def _resolve_paths(path: Path, spath: str, parent_str: str) -> tuple:
111
111
  hitmap_path = None
112
112
  bundle_spec = None
113
113
 
114
- # Check if this is a .figz bundle (multi-panel figure)
115
- if spath.endswith('.figz.d') or spath.endswith('.figz'):
116
- json_path, csv_path, png_path, hitmap_path, bundle_spec, panel_info = resolve_figz_bundle(path)
117
- # Check if this is a .pltz bundle
118
- elif spath.endswith('.pltz.d') or spath.endswith('.pltz') or parent_str.endswith('.pltz.d'):
119
- bundle_path = path.parent if parent_str.endswith('.pltz.d') else path
120
- json_path, csv_path, png_path, hitmap_path, bundle_spec = resolve_pltz_bundle(bundle_path)
121
- # Check if file is inside a .figz.d
122
- elif parent_str.endswith('.figz.d') or (path.parent.parent and str(path.parent.parent).endswith('.figz.d')):
123
- figz_path = path.parent if parent_str.endswith('.figz.d') else path.parent.parent
124
- json_path, csv_path, png_path, hitmap_path, bundle_spec, panel_info = resolve_figz_bundle(figz_path)
114
+ # Check if this is a .figure bundle (multi-panel figure)
115
+ if spath.endswith(".figure") or spath.endswith(".figure"):
116
+ json_path, csv_path, png_path, hitmap_path, bundle_spec, panel_info = (
117
+ resolve_figure_bundle(path)
118
+ )
119
+ # Check if this is a .plot bundle
120
+ elif (
121
+ spath.endswith(".plot")
122
+ or spath.endswith(".plot")
123
+ or parent_str.endswith(".plot")
124
+ ):
125
+ bundle_path = path.parent if parent_str.endswith(".plot") else path
126
+ json_path, csv_path, png_path, hitmap_path, bundle_spec = resolve_plot_bundle(
127
+ bundle_path
128
+ )
129
+ # Check if file is inside a .figure
130
+ elif parent_str.endswith(".figure") or (
131
+ path.parent.parent and str(path.parent.parent).endswith(".figure")
132
+ ):
133
+ figure_path = (
134
+ path.parent if parent_str.endswith(".figure") else path.parent.parent
135
+ )
136
+ json_path, csv_path, png_path, hitmap_path, bundle_spec, panel_info = (
137
+ resolve_figure_bundle(figure_path)
138
+ )
125
139
  else:
126
140
  # Standard file paths
127
141
  json_path, csv_path, png_path = resolve_figure_paths(path)
@@ -143,11 +157,28 @@ def _launch_backend(
143
157
  ) -> None:
144
158
  """Launch the specified editor backend."""
145
159
  if backend == "flask":
146
- _launch_flask(json_path, metadata, csv_data, png_path, hitmap_path, manual_overrides, port, panel_info)
160
+ _launch_flask(
161
+ json_path,
162
+ metadata,
163
+ csv_data,
164
+ png_path,
165
+ hitmap_path,
166
+ manual_overrides,
167
+ port,
168
+ panel_info,
169
+ )
147
170
  elif backend == "dearpygui":
148
171
  _launch_dearpygui(json_path, metadata, csv_data, png_path, manual_overrides)
149
172
  elif backend == "qt":
150
- _launch_qt(json_path, metadata, csv_data, png_path, manual_overrides, hitmap_path, bundle_spec)
173
+ _launch_qt(
174
+ json_path,
175
+ metadata,
176
+ csv_data,
177
+ png_path,
178
+ manual_overrides,
179
+ hitmap_path,
180
+ bundle_spec,
181
+ )
151
182
  elif backend == "tkinter":
152
183
  _launch_tkinter(json_path, metadata, csv_data, manual_overrides)
153
184
  elif backend == "mpl":
@@ -159,10 +190,20 @@ def _launch_backend(
159
190
  )
160
191
 
161
192
 
162
- def _launch_flask(json_path, metadata, csv_data, png_path, hitmap_path, manual_overrides, port, panel_info):
193
+ def _launch_flask(
194
+ json_path,
195
+ metadata,
196
+ csv_data,
197
+ png_path,
198
+ hitmap_path,
199
+ manual_overrides,
200
+ port,
201
+ panel_info,
202
+ ):
163
203
  """Launch Flask web editor."""
164
204
  try:
165
205
  from .._flask_editor import WebEditor
206
+
166
207
  editor = WebEditor(
167
208
  json_path=json_path,
168
209
  metadata=metadata,
@@ -175,13 +216,16 @@ def _launch_flask(json_path, metadata, csv_data, png_path, hitmap_path, manual_o
175
216
  )
176
217
  editor.run()
177
218
  except ImportError as e:
178
- raise ImportError("Flask backend requires Flask. Install with: pip install flask") from e
219
+ raise ImportError(
220
+ "Flask backend requires Flask. Install with: pip install flask"
221
+ ) from e
179
222
 
180
223
 
181
224
  def _launch_dearpygui(json_path, metadata, csv_data, png_path, manual_overrides):
182
225
  """Launch DearPyGui editor."""
183
226
  try:
184
227
  from .._dearpygui_editor import DearPyGuiEditor
228
+
185
229
  editor = DearPyGuiEditor(
186
230
  json_path=json_path,
187
231
  metadata=metadata,
@@ -191,13 +235,18 @@ def _launch_dearpygui(json_path, metadata, csv_data, png_path, manual_overrides)
191
235
  )
192
236
  editor.run()
193
237
  except ImportError as e:
194
- raise ImportError("DearPyGui backend requires dearpygui. Install with: pip install dearpygui") from e
238
+ raise ImportError(
239
+ "DearPyGui backend requires dearpygui. Install with: pip install dearpygui"
240
+ ) from e
195
241
 
196
242
 
197
- def _launch_qt(json_path, metadata, csv_data, png_path, manual_overrides, hitmap_path, bundle_spec):
243
+ def _launch_qt(
244
+ json_path, metadata, csv_data, png_path, manual_overrides, hitmap_path, bundle_spec
245
+ ):
198
246
  """Launch Qt editor."""
199
247
  try:
200
248
  from .._qt_editor import QtEditor
249
+
201
250
  editor = QtEditor(
202
251
  json_path=json_path,
203
252
  metadata=metadata,
@@ -209,12 +258,15 @@ def _launch_qt(json_path, metadata, csv_data, png_path, manual_overrides, hitmap
209
258
  )
210
259
  editor.run()
211
260
  except ImportError as e:
212
- raise ImportError("Qt backend requires PyQt5/PyQt6 or PySide2/PySide6. Install with: pip install PyQt6") from e
261
+ raise ImportError(
262
+ "Qt backend requires PyQt5/PyQt6 or PySide2/PySide6. Install with: pip install PyQt6"
263
+ ) from e
213
264
 
214
265
 
215
266
  def _launch_tkinter(json_path, metadata, csv_data, manual_overrides):
216
267
  """Launch Tkinter editor."""
217
268
  from .._tkinter_editor import TkinterEditor
269
+
218
270
  editor = TkinterEditor(
219
271
  json_path=json_path,
220
272
  metadata=metadata,
@@ -227,6 +279,7 @@ def _launch_tkinter(json_path, metadata, csv_data, manual_overrides):
227
279
  def _launch_mpl(json_path, metadata, csv_data, manual_overrides):
228
280
  """Launch matplotlib editor."""
229
281
  from .._mpl_editor import MplEditor
282
+
230
283
  editor = MplEditor(
231
284
  json_path=json_path,
232
285
  metadata=metadata,
@@ -16,14 +16,14 @@ def load_panel_data(
16
16
  panel_path: Union[Path, str], is_zip: bool = None
17
17
  ) -> Optional[Dict[str, Any]]:
18
18
  """
19
- Load panel data from either a .pltz.d directory or a .pltz zip file.
19
+ Load panel data from either a .plot directory or a .plot.zip file.
20
20
 
21
21
  Handles both formats transparently using in-memory reading for zips.
22
22
 
23
23
  Parameters
24
24
  ----------
25
25
  panel_path : Path or str
26
- Path to .pltz.d directory or .pltz zip file
26
+ Path to .plot directory or .plot.zip file
27
27
  is_zip : bool, optional
28
28
  If True, treat as zip file. If False, treat as directory.
29
29
  If None, auto-detect based on path suffix and existence.
@@ -41,7 +41,7 @@ def load_panel_data(
41
41
  # Auto-detect if not specified
42
42
  if is_zip is None:
43
43
  spath = str(panel_path)
44
- if spath.endswith(".pltz") and not spath.endswith(".pltz.d"):
44
+ if spath.endswith(".plot.zip"):
45
45
  is_zip = panel_path.is_file()
46
46
  else:
47
47
  is_zip = False
@@ -53,10 +53,10 @@ def load_panel_data(
53
53
 
54
54
 
55
55
  def _load_from_zip(panel_path: Path) -> Optional[Dict[str, Any]]:
56
- """Load panel data from a .pltz zip file."""
56
+ """Load panel data from a .plot.zip file."""
57
57
  from PIL import Image
58
58
 
59
- from scitex.fts import FTS as ZipBundle
59
+ from scitex.io.bundle import ZipBundle
60
60
 
61
61
  if not panel_path.exists():
62
62
  return None
@@ -134,7 +134,7 @@ def _load_from_zip(panel_path: Path) -> Optional[Dict[str, Any]]:
134
134
 
135
135
 
136
136
  def _load_from_directory(panel_path: Path) -> Optional[Dict[str, Any]]:
137
- """Load panel data from a .pltz.d directory."""
137
+ """Load panel data from a .plot directory."""
138
138
 
139
139
  panel_dir = panel_path
140
140
  if not panel_dir.exists():
@@ -151,9 +151,9 @@ def _load_from_directory(panel_path: Path) -> Optional[Dict[str, Any]]:
151
151
  def _load_layered_directory(panel_dir: Path) -> Dict[str, Any]:
152
152
  """Load panel data from layered format directory."""
153
153
  import scitex as stx
154
- from scitex.plt.io import load_layered_pltz_bundle
154
+ from scitex.plt.io import load_layered_plot_bundle
155
155
 
156
- bundle_data = load_layered_pltz_bundle(panel_dir)
156
+ bundle_data = load_layered_plot_bundle(panel_dir)
157
157
  metadata = bundle_data.get("merged", {})
158
158
 
159
159
  # Find CSV
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
2
3
  # File: ./src/scitex/vis/editor/flask_editor/bbox.py
3
4
  """Bounding box extraction for figure elements.
4
5
 
@@ -1002,7 +1003,7 @@ def extract_bboxes_from_metadata(
1002
1003
  "ax_id": ax_id,
1003
1004
  }
1004
1005
 
1005
- # Extract from traces array (pltz spec format)
1006
+ # Extract from traces array (plot spec format)
1006
1007
  traces = metadata.get("traces", [])
1007
1008
  if isinstance(traces, list):
1008
1009
  for i, trace in enumerate(traces):