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