scitex 2.10.3__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.3.dist-info → scitex-2.11.0.dist-info}/METADATA +190 -73
  112. {scitex-2.10.3.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.3.dist-info → scitex-2.11.0.dist-info}/WHEEL +0 -0
  362. {scitex-2.10.3.dist-info → scitex-2.11.0.dist-info}/entry_points.txt +0 -0
  363. {scitex-2.10.3.dist-info → scitex-2.11.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,441 +0,0 @@
1
- #!/usr/bin/env python3
2
- # Timestamp: 2025-12-21
3
- # File: /home/ywatanabe/proj/scitex-code/src/scitex/fts/_fig/_dataclasses/_Theme.py
4
-
5
- """Theme - Visual aesthetics for FTS bundles."""
6
-
7
- import json
8
- from dataclasses import dataclass, field
9
- from typing import Any, Dict, List, Optional
10
-
11
- THEME_VERSION = "1.0.0"
12
-
13
-
14
- @dataclass
15
- class Colors:
16
- """Color palette configuration."""
17
-
18
- palette: List[str] = field(
19
- default_factory=lambda: ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd"]
20
- )
21
- primary: Optional[str] = None
22
- secondary: Optional[str] = None
23
- background: str = "#ffffff"
24
- text: str = "#000000"
25
- axis: str = "#333333"
26
- grid: str = "#e0e0e0"
27
-
28
- def to_dict(self) -> Dict[str, Any]:
29
- result = {
30
- "palette": self.palette,
31
- "background": self.background,
32
- "text": self.text,
33
- "axis": self.axis,
34
- "grid": self.grid,
35
- }
36
- if self.primary:
37
- result["primary"] = self.primary
38
- if self.secondary:
39
- result["secondary"] = self.secondary
40
- return result
41
-
42
- @classmethod
43
- def from_dict(cls, data: Any) -> "Colors":
44
- # Return if already a Colors instance
45
- if isinstance(data, cls):
46
- return data
47
- if not isinstance(data, dict):
48
- return cls()
49
- return cls(
50
- palette=data.get("palette", ["#1f77b4", "#ff7f0e", "#2ca02c"]),
51
- primary=data.get("primary"),
52
- secondary=data.get("secondary"),
53
- background=data.get("background", "#ffffff"),
54
- text=data.get("text", "#000000"),
55
- axis=data.get("axis", "#333333"),
56
- grid=data.get("grid", "#e0e0e0"),
57
- )
58
-
59
-
60
- @dataclass
61
- class Typography:
62
- """Typography configuration."""
63
-
64
- family: str = "sans-serif"
65
- size_pt: float = 8.0
66
- title_size_pt: float = 10.0
67
- label_size_pt: float = 8.0
68
- tick_size_pt: float = 7.0
69
-
70
- def to_dict(self) -> Dict[str, Any]:
71
- return {
72
- "family": self.family,
73
- "size_pt": self.size_pt,
74
- "title_size_pt": self.title_size_pt,
75
- "label_size_pt": self.label_size_pt,
76
- "tick_size_pt": self.tick_size_pt,
77
- }
78
-
79
- @classmethod
80
- def from_dict(cls, data: Any) -> "Typography":
81
- # Return if already a Typography instance
82
- if isinstance(data, cls):
83
- return data
84
- if not isinstance(data, dict):
85
- return cls()
86
- return cls(
87
- family=data.get("family", "sans-serif"),
88
- size_pt=data.get("size_pt", 8.0),
89
- title_size_pt=data.get("title_size_pt", data.get("title_size", 10.0)),
90
- label_size_pt=data.get("label_size_pt", data.get("label_size", 8.0)),
91
- tick_size_pt=data.get("tick_size_pt", data.get("tick_size", 7.0)),
92
- )
93
-
94
-
95
- @dataclass
96
- class Lines:
97
- """Line style configuration."""
98
-
99
- width_pt: float = 1.0
100
- style: str = "solid" # solid, dashed, dotted, dashdot
101
-
102
- def to_dict(self) -> Dict[str, Any]:
103
- return {"width_pt": self.width_pt, "style": self.style}
104
-
105
- @classmethod
106
- def from_dict(cls, data: Any) -> "Lines":
107
- if isinstance(data, cls):
108
- return data
109
- if not isinstance(data, dict):
110
- return cls()
111
- return cls(
112
- width_pt=data.get("width_pt", 1.0),
113
- style=data.get("style", "solid"),
114
- )
115
-
116
-
117
- @dataclass
118
- class Markers:
119
- """Marker style configuration."""
120
-
121
- size_pt: float = 4.0
122
- symbol: str = "circle" # circle, square, triangle, cross, diamond
123
-
124
- def to_dict(self) -> Dict[str, Any]:
125
- return {"size_pt": self.size_pt, "symbol": self.symbol}
126
-
127
- @classmethod
128
- def from_dict(cls, data: Any) -> "Markers":
129
- if isinstance(data, cls):
130
- return data
131
- if not isinstance(data, dict):
132
- return cls()
133
- return cls(
134
- size_pt=data.get("size_pt", 4.0),
135
- symbol=data.get("symbol", "circle"),
136
- )
137
-
138
-
139
- @dataclass
140
- class Grid:
141
- """Grid line configuration."""
142
-
143
- show: bool = True
144
- major_width_pt: float = 0.5
145
- minor_width_pt: float = 0.25
146
- major_alpha: float = 0.3
147
- minor_alpha: float = 0.1
148
-
149
- def to_dict(self) -> Dict[str, Any]:
150
- return {
151
- "show": self.show,
152
- "major_width_pt": self.major_width_pt,
153
- "minor_width_pt": self.minor_width_pt,
154
- "major_alpha": self.major_alpha,
155
- "minor_alpha": self.minor_alpha,
156
- }
157
-
158
- @classmethod
159
- def from_dict(cls, data: Any) -> "Grid":
160
- if isinstance(data, cls):
161
- return data
162
- if isinstance(data, bool):
163
- return cls(show=data)
164
- if not isinstance(data, dict):
165
- return cls()
166
- return cls(
167
- show=data.get("show", True),
168
- major_width_pt=data.get("major_width_pt", 0.5),
169
- minor_width_pt=data.get("minor_width_pt", 0.25),
170
- major_alpha=data.get("major_alpha", 0.3),
171
- minor_alpha=data.get("minor_alpha", 0.1),
172
- )
173
-
174
-
175
- @dataclass
176
- class TraceTheme:
177
- """Per-trace theme overrides."""
178
-
179
- trace_id: str
180
- color: Optional[str] = None
181
- line_width_pt: Optional[float] = None
182
- marker_size_pt: Optional[float] = None
183
- alpha: Optional[float] = None
184
-
185
- def to_dict(self) -> Dict[str, Any]:
186
- result = {"trace_id": self.trace_id}
187
- if self.color:
188
- result["color"] = self.color
189
- if self.line_width_pt is not None:
190
- result["line_width_pt"] = self.line_width_pt
191
- if self.marker_size_pt is not None:
192
- result["marker_size_pt"] = self.marker_size_pt
193
- if self.alpha is not None:
194
- result["alpha"] = self.alpha
195
- return result
196
-
197
- @classmethod
198
- def from_dict(cls, data: Any) -> "TraceTheme":
199
- if isinstance(data, cls):
200
- return data
201
- if not isinstance(data, dict):
202
- return cls(trace_id="trace_0")
203
- return cls(
204
- trace_id=data.get("trace_id", "trace_0"),
205
- color=data.get("color"),
206
- line_width_pt=data.get("line_width_pt"),
207
- marker_size_pt=data.get("marker_size_pt"),
208
- alpha=data.get("alpha"),
209
- )
210
-
211
-
212
- @dataclass
213
- class FigureTitle:
214
- """Figure title configuration for publications."""
215
-
216
- text: str = ""
217
- prefix: str = "Figure"
218
- number: Optional[int] = None
219
- fontsize: Optional[float] = None
220
- fontweight: str = "bold"
221
-
222
- def to_dict(self) -> Dict[str, Any]:
223
- result = {"text": self.text, "prefix": self.prefix, "fontweight": self.fontweight}
224
- if self.number is not None:
225
- result["number"] = self.number
226
- if self.fontsize is not None:
227
- result["fontsize"] = self.fontsize
228
- return result
229
-
230
- @classmethod
231
- def from_dict(cls, data: Any) -> "FigureTitle":
232
- if isinstance(data, cls):
233
- return data
234
- if not isinstance(data, dict):
235
- return cls()
236
- return cls(
237
- text=data.get("text", ""),
238
- prefix=data.get("prefix", "Figure"),
239
- number=data.get("number"),
240
- fontsize=data.get("fontsize"),
241
- fontweight=data.get("fontweight", "bold"),
242
- )
243
-
244
-
245
- @dataclass
246
- class PanelDescription:
247
- """Single panel description for captions."""
248
-
249
- label: str
250
- description: str
251
-
252
- def to_dict(self) -> Dict[str, Any]:
253
- return {"label": self.label, "description": self.description}
254
-
255
- @classmethod
256
- def from_dict(cls, data: Any) -> "PanelDescription":
257
- if isinstance(data, cls):
258
- return data
259
- if not isinstance(data, dict):
260
- return cls(label="", description="")
261
- return cls(
262
- label=data.get("label", ""),
263
- description=data.get("description", ""),
264
- )
265
-
266
-
267
- @dataclass
268
- class Caption:
269
- """Figure caption for publications."""
270
-
271
- text: str = ""
272
- panels: List[PanelDescription] = field(default_factory=list)
273
-
274
- def to_dict(self) -> Dict[str, Any]:
275
- result = {"text": self.text}
276
- if self.panels:
277
- result["panels"] = [p.to_dict() for p in self.panels]
278
- return result
279
-
280
- @classmethod
281
- def from_dict(cls, data: Any) -> "Caption":
282
- if isinstance(data, cls):
283
- return data
284
- if not isinstance(data, dict):
285
- return cls()
286
- panels = [PanelDescription.from_dict(p) for p in data.get("panels", [])]
287
- return cls(text=data.get("text", ""), panels=panels)
288
-
289
-
290
- @dataclass
291
- class PanelLabels:
292
- """Panel label styling (A, B, C, etc.)."""
293
-
294
- style: str = "uppercase" # uppercase, lowercase, numeric
295
- fontsize: float = 12.0
296
- fontweight: str = "bold"
297
- position: str = "top-left" # top-left, top-right, bottom-left, bottom-right
298
- offset_x: float = 0.02
299
- offset_y: float = 0.98
300
-
301
- def to_dict(self) -> Dict[str, Any]:
302
- return {
303
- "style": self.style,
304
- "fontsize": self.fontsize,
305
- "fontweight": self.fontweight,
306
- "position": self.position,
307
- "offset_x": self.offset_x,
308
- "offset_y": self.offset_y,
309
- }
310
-
311
- @classmethod
312
- def from_dict(cls, data: Any) -> "PanelLabels":
313
- if isinstance(data, cls):
314
- return data
315
- if not isinstance(data, dict):
316
- return cls()
317
- return cls(
318
- style=data.get("style", "uppercase"),
319
- fontsize=data.get("fontsize", 12.0),
320
- fontweight=data.get("fontweight", "bold"),
321
- position=data.get("position", "top-left"),
322
- offset_x=data.get("offset_x", 0.02),
323
- offset_y=data.get("offset_y", 0.98),
324
- )
325
-
326
-
327
- @dataclass
328
- class Theme:
329
- """Complete theme specification for an FTS bundle.
330
-
331
- Stored in canonical/theme.json.
332
- """
333
-
334
- # Core mode
335
- mode: str = "light" # "light" | "dark"
336
-
337
- # Styling components
338
- colors: Colors = field(default_factory=Colors)
339
- typography: Typography = field(default_factory=Typography)
340
- lines: Lines = field(default_factory=Lines)
341
- markers: Markers = field(default_factory=Markers)
342
- grid: Grid = field(default_factory=Grid)
343
-
344
- # Per-trace overrides
345
- traces: List[TraceTheme] = field(default_factory=list)
346
-
347
- # Publication metadata
348
- preset: Optional[str] = None # nature, science, cell, ieee, acs, minimal, presentation
349
- figure_title: Optional[FigureTitle] = None
350
- caption: Optional[Caption] = None
351
- panel_labels: Optional[PanelLabels] = None
352
-
353
- # Alias for typography (for convenience)
354
- fonts: Optional[Typography] = None
355
-
356
- # Schema metadata
357
- schema_name: str = "fts.theme"
358
- schema_version: str = THEME_VERSION
359
-
360
- def to_dict(self) -> Dict[str, Any]:
361
- result = {
362
- "mode": self.mode,
363
- "colors": self.colors.to_dict(),
364
- "typography": self.typography.to_dict(),
365
- "lines": self.lines.to_dict(),
366
- "markers": self.markers.to_dict(),
367
- "grid": self.grid.to_dict(),
368
- }
369
- if self.traces:
370
- result["traces"] = [t.to_dict() for t in self.traces]
371
- if self.preset:
372
- result["preset"] = self.preset
373
- if self.figure_title:
374
- result["figure_title"] = self.figure_title.to_dict()
375
- if self.caption:
376
- result["caption"] = self.caption.to_dict()
377
- if self.panel_labels:
378
- result["panel_labels"] = self.panel_labels.to_dict()
379
- return result
380
-
381
- def to_json(self, indent: int = 2) -> str:
382
- return json.dumps(self.to_dict(), indent=indent)
383
-
384
- @classmethod
385
- def from_dict(cls, data: Dict[str, Any]) -> "Theme":
386
- # Handle fonts as alias for typography
387
- typography_data = data.get("typography", {})
388
- fonts_data = data.get("fonts")
389
- if fonts_data and not typography_data:
390
- typography_data = fonts_data
391
-
392
- # Parse figure_title
393
- figure_title = None
394
- if "figure_title" in data and data["figure_title"]:
395
- figure_title = FigureTitle.from_dict(data["figure_title"])
396
-
397
- # Parse caption
398
- caption = None
399
- if "caption" in data and data["caption"]:
400
- caption = Caption.from_dict(data["caption"])
401
-
402
- # Parse panel_labels
403
- panel_labels = None
404
- if "panel_labels" in data and data["panel_labels"]:
405
- panel_labels = PanelLabels.from_dict(data["panel_labels"])
406
-
407
- return cls(
408
- mode=data.get("mode", "light"),
409
- colors=Colors.from_dict(data.get("colors", {})),
410
- typography=Typography.from_dict(typography_data),
411
- lines=Lines.from_dict(data.get("lines", {})),
412
- markers=Markers.from_dict(data.get("markers", {})),
413
- grid=Grid.from_dict(data.get("grid", {})),
414
- traces=[TraceTheme.from_dict(t) for t in data.get("traces", [])],
415
- preset=data.get("preset"),
416
- figure_title=figure_title,
417
- caption=caption,
418
- panel_labels=panel_labels,
419
- )
420
-
421
- @classmethod
422
- def from_json(cls, json_str: str) -> "Theme":
423
- return cls.from_dict(json.loads(json_str))
424
-
425
-
426
- __all__ = [
427
- "THEME_VERSION",
428
- "Colors",
429
- "Typography",
430
- "Lines",
431
- "Markers",
432
- "Grid",
433
- "TraceTheme",
434
- "FigureTitle",
435
- "PanelDescription",
436
- "Caption",
437
- "PanelLabels",
438
- "Theme",
439
- ]
440
-
441
- # EOF
@@ -1,52 +0,0 @@
1
- #!/usr/bin/env python3
2
- # Timestamp: 2025-12-20
3
- # File: /home/ywatanabe/proj/scitex-code/src/scitex/fsb/_dataclasses/TraceEncoding.py
4
-
5
- """TraceEncoding - Encoding for a single trace/data series."""
6
-
7
- from dataclasses import dataclass
8
- from typing import Any, Dict, Optional
9
-
10
- from ._ChannelEncoding import ChannelEncoding
11
-
12
-
13
- @dataclass
14
- class TraceEncoding:
15
- """Encoding specification for a single trace/data series."""
16
-
17
- trace_id: str
18
- data_ref: Optional[str] = None # Path to data file within bundle
19
- x: Optional[ChannelEncoding] = None
20
- y: Optional[ChannelEncoding] = None
21
- color: Optional[ChannelEncoding] = None
22
- size: Optional[ChannelEncoding] = None
23
- group: Optional[ChannelEncoding] = None
24
- label: Optional[ChannelEncoding] = None
25
-
26
- def to_dict(self) -> Dict[str, Any]:
27
- result = {"trace_id": self.trace_id}
28
- if self.data_ref:
29
- result["data_ref"] = self.data_ref
30
- for channel in ["x", "y", "color", "size", "group", "label"]:
31
- enc = getattr(self, channel)
32
- if enc:
33
- result[channel] = enc.to_dict()
34
- return result
35
-
36
- @classmethod
37
- def from_dict(cls, data: Dict[str, Any]) -> "TraceEncoding":
38
- return cls(
39
- trace_id=data.get("trace_id", "trace_0"),
40
- data_ref=data.get("data_ref"),
41
- x=ChannelEncoding.from_dict(data["x"]) if "x" in data else None,
42
- y=ChannelEncoding.from_dict(data["y"]) if "y" in data else None,
43
- color=ChannelEncoding.from_dict(data["color"]) if "color" in data else None,
44
- size=ChannelEncoding.from_dict(data["size"]) if "size" in data else None,
45
- group=ChannelEncoding.from_dict(data["group"]) if "group" in data else None,
46
- label=ChannelEncoding.from_dict(data["label"]) if "label" in data else None,
47
- )
48
-
49
-
50
- __all__ = ["TraceEncoding"]
51
-
52
- # EOF
@@ -1,47 +0,0 @@
1
- #!/usr/bin/env python3
2
- # Timestamp: 2025-12-21
3
- # File: /home/ywatanabe/proj/scitex-code/src/scitex/fts/_fig/_dataclasses/__init__.py
4
-
5
- """Figure-specific dataclasses for FTS."""
6
-
7
- from ._ChannelEncoding import ChannelEncoding
8
- from ._Encoding import ENCODING_VERSION, AxesConfig, Encoding
9
- from ._Theme import (
10
- THEME_VERSION,
11
- Caption,
12
- Colors,
13
- FigureTitle,
14
- Grid,
15
- Lines,
16
- Markers,
17
- PanelDescription,
18
- PanelLabels,
19
- Theme,
20
- TraceTheme,
21
- Typography,
22
- )
23
- from ._TraceEncoding import TraceEncoding
24
-
25
- __all__ = [
26
- # Encoding
27
- "ENCODING_VERSION",
28
- "AxesConfig",
29
- "ChannelEncoding",
30
- "TraceEncoding",
31
- "Encoding",
32
- # Theme
33
- "THEME_VERSION",
34
- "Colors",
35
- "Typography",
36
- "Lines",
37
- "Markers",
38
- "Grid",
39
- "TraceTheme",
40
- "FigureTitle",
41
- "PanelDescription",
42
- "Caption",
43
- "PanelLabels",
44
- "Theme",
45
- ]
46
-
47
- # EOF
@@ -1,104 +0,0 @@
1
- #!/usr/bin/env python3
2
- # File: ./src/scitex/vis/model/guides.py
3
- """Guide elements (lines, spans) JSON model for scitex.fig."""
4
-
5
- from dataclasses import asdict, dataclass, field
6
- from typing import Any, Dict, Optional
7
-
8
- from ._Styles import GuideStyle
9
-
10
-
11
- @dataclass
12
- class GuideModel:
13
- """
14
- Guide model for reference lines, spans, and regions.
15
-
16
- Separates structure from style properties for easier:
17
- - UI property panel generation
18
- - Style copy/paste
19
- - Batch style application
20
-
21
- Supports:
22
- - axhline, axvline: Horizontal/vertical reference lines
23
- - axhspan, axvspan: Horizontal/vertical shaded regions
24
- """
25
-
26
- # Guide type
27
- guide_type: str # "axhline", "axvline", "axhspan", "axvspan"
28
-
29
- # Position/range (structure, not style)
30
- y: Optional[float] = None # For axhline
31
- x: Optional[float] = None # For axvline
32
- ymin: Optional[float] = None # For axhspan
33
- ymax: Optional[float] = None # For axhspan
34
- xmin: Optional[float] = None # For axvspan
35
- xmax: Optional[float] = None # For axvspan
36
-
37
- # Human-readable identifiers
38
- label: Optional[str] = None
39
- guide_id: Optional[str] = None
40
-
41
- # Style properties (separated for clean UI/copy/paste)
42
- style: GuideStyle = field(default_factory=GuideStyle)
43
-
44
- def to_dict(self) -> Dict[str, Any]:
45
- """Convert to dictionary for JSON serialization."""
46
- d = asdict(self)
47
- d["style"] = self.style.to_dict()
48
- return d
49
-
50
- @classmethod
51
- def from_dict(cls, data: Dict[str, Any]) -> "GuideModel":
52
- """Create GuideModel from dictionary."""
53
- # Handle old format (backward compatibility)
54
- if "style" not in data:
55
- # Extract style properties from flat structure
56
- style_fields = GuideStyle.__annotations__.keys()
57
- style_data = {k: v for k, v in data.items() if k in style_fields}
58
- data = {k: v for k, v in data.items() if k not in style_fields}
59
- data["style"] = style_data
60
-
61
- # Extract and parse style
62
- style_data = data.pop("style", {})
63
- obj = cls(**{k: v for k, v in data.items() if k in cls.__annotations__})
64
- obj.style = GuideStyle.from_dict(style_data)
65
- return obj
66
-
67
- def validate(self) -> bool:
68
- """
69
- Validate the guide model.
70
-
71
- Returns
72
- -------
73
- bool
74
- True if valid, raises ValueError otherwise
75
- """
76
- valid_guide_types = ["axhline", "axvline", "axhspan", "axvspan"]
77
-
78
- if self.guide_type not in valid_guide_types:
79
- raise ValueError(
80
- f"Invalid guide_type: {self.guide_type}. "
81
- f"Must be one of {valid_guide_types}"
82
- )
83
-
84
- # Type-specific validation
85
- if self.guide_type == "axhline":
86
- if self.y is None:
87
- raise ValueError("axhline requires 'y' parameter")
88
-
89
- elif self.guide_type == "axvline":
90
- if self.x is None:
91
- raise ValueError("axvline requires 'x' parameter")
92
-
93
- elif self.guide_type == "axhspan":
94
- if self.ymin is None or self.ymax is None:
95
- raise ValueError("axhspan requires 'ymin' and 'ymax' parameters")
96
-
97
- elif self.guide_type == "axvspan":
98
- if self.xmin is None or self.xmax is None:
99
- raise ValueError("axvspan requires 'xmin' and 'xmax' parameters")
100
-
101
- return True
102
-
103
-
104
- # EOF