scitex 2.7.0__py3-none-any.whl → 2.7.3__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 (297) hide show
  1. scitex/__init__.py +6 -2
  2. scitex/__version__.py +1 -1
  3. scitex/audio/README.md +52 -0
  4. scitex/audio/__init__.py +384 -0
  5. scitex/audio/__main__.py +129 -0
  6. scitex/audio/_tts.py +334 -0
  7. scitex/audio/engines/__init__.py +44 -0
  8. scitex/audio/engines/base.py +275 -0
  9. scitex/audio/engines/elevenlabs_engine.py +143 -0
  10. scitex/audio/engines/gtts_engine.py +162 -0
  11. scitex/audio/engines/pyttsx3_engine.py +131 -0
  12. scitex/audio/mcp_server.py +757 -0
  13. scitex/bridge/_helpers.py +1 -1
  14. scitex/bridge/_plt_vis.py +1 -1
  15. scitex/bridge/_stats_vis.py +1 -1
  16. scitex/dev/plt/__init__.py +272 -0
  17. scitex/dev/plt/plot_mpl_axhline.py +28 -0
  18. scitex/dev/plt/plot_mpl_axhspan.py +28 -0
  19. scitex/dev/plt/plot_mpl_axvline.py +28 -0
  20. scitex/dev/plt/plot_mpl_axvspan.py +28 -0
  21. scitex/dev/plt/plot_mpl_bar.py +29 -0
  22. scitex/dev/plt/plot_mpl_barh.py +29 -0
  23. scitex/dev/plt/plot_mpl_boxplot.py +28 -0
  24. scitex/dev/plt/plot_mpl_contour.py +31 -0
  25. scitex/dev/plt/plot_mpl_contourf.py +31 -0
  26. scitex/dev/plt/plot_mpl_errorbar.py +30 -0
  27. scitex/dev/plt/plot_mpl_eventplot.py +28 -0
  28. scitex/dev/plt/plot_mpl_fill.py +30 -0
  29. scitex/dev/plt/plot_mpl_fill_between.py +31 -0
  30. scitex/dev/plt/plot_mpl_hexbin.py +28 -0
  31. scitex/dev/plt/plot_mpl_hist.py +28 -0
  32. scitex/dev/plt/plot_mpl_hist2d.py +28 -0
  33. scitex/dev/plt/plot_mpl_imshow.py +29 -0
  34. scitex/dev/plt/plot_mpl_pcolormesh.py +31 -0
  35. scitex/dev/plt/plot_mpl_pie.py +29 -0
  36. scitex/dev/plt/plot_mpl_plot.py +29 -0
  37. scitex/dev/plt/plot_mpl_quiver.py +31 -0
  38. scitex/dev/plt/plot_mpl_scatter.py +28 -0
  39. scitex/dev/plt/plot_mpl_stackplot.py +31 -0
  40. scitex/dev/plt/plot_mpl_stem.py +29 -0
  41. scitex/dev/plt/plot_mpl_step.py +29 -0
  42. scitex/dev/plt/plot_mpl_violinplot.py +28 -0
  43. scitex/dev/plt/plot_sns_barplot.py +29 -0
  44. scitex/dev/plt/plot_sns_boxplot.py +29 -0
  45. scitex/dev/plt/plot_sns_heatmap.py +28 -0
  46. scitex/dev/plt/plot_sns_histplot.py +29 -0
  47. scitex/dev/plt/plot_sns_kdeplot.py +29 -0
  48. scitex/dev/plt/plot_sns_lineplot.py +31 -0
  49. scitex/dev/plt/plot_sns_scatterplot.py +29 -0
  50. scitex/dev/plt/plot_sns_stripplot.py +29 -0
  51. scitex/dev/plt/plot_sns_swarmplot.py +29 -0
  52. scitex/dev/plt/plot_sns_violinplot.py +29 -0
  53. scitex/dev/plt/plot_stx_bar.py +29 -0
  54. scitex/dev/plt/plot_stx_barh.py +29 -0
  55. scitex/dev/plt/plot_stx_box.py +28 -0
  56. scitex/dev/plt/plot_stx_boxplot.py +28 -0
  57. scitex/dev/plt/plot_stx_conf_mat.py +28 -0
  58. scitex/dev/plt/plot_stx_contour.py +31 -0
  59. scitex/dev/plt/plot_stx_ecdf.py +28 -0
  60. scitex/dev/plt/plot_stx_errorbar.py +30 -0
  61. scitex/dev/plt/plot_stx_fill_between.py +31 -0
  62. scitex/dev/plt/plot_stx_fillv.py +28 -0
  63. scitex/dev/plt/plot_stx_heatmap.py +28 -0
  64. scitex/dev/plt/plot_stx_image.py +28 -0
  65. scitex/dev/plt/plot_stx_imshow.py +28 -0
  66. scitex/dev/plt/plot_stx_joyplot.py +28 -0
  67. scitex/dev/plt/plot_stx_kde.py +28 -0
  68. scitex/dev/plt/plot_stx_line.py +28 -0
  69. scitex/dev/plt/plot_stx_mean_ci.py +28 -0
  70. scitex/dev/plt/plot_stx_mean_std.py +28 -0
  71. scitex/dev/plt/plot_stx_median_iqr.py +28 -0
  72. scitex/dev/plt/plot_stx_raster.py +28 -0
  73. scitex/dev/plt/plot_stx_rectangle.py +28 -0
  74. scitex/dev/plt/plot_stx_scatter.py +29 -0
  75. scitex/dev/plt/plot_stx_shaded_line.py +29 -0
  76. scitex/dev/plt/plot_stx_violin.py +28 -0
  77. scitex/dev/plt/plot_stx_violinplot.py +28 -0
  78. scitex/fig/__init__.py +352 -0
  79. scitex/{vis → fig}/backend/_parser.py +1 -1
  80. scitex/{vis → fig}/canvas.py +1 -1
  81. scitex/{vis → fig}/editor/_defaults.py +70 -5
  82. scitex/fig/editor/_edit.py +751 -0
  83. scitex/{vis → fig}/editor/_qt_editor.py +181 -1
  84. scitex/fig/editor/flask_editor/_bbox.py +1276 -0
  85. scitex/fig/editor/flask_editor/_core.py +624 -0
  86. scitex/{vis → fig}/editor/flask_editor/_plotter.py +38 -4
  87. scitex/fig/editor/flask_editor/_renderer.py +739 -0
  88. scitex/{vis → fig}/editor/flask_editor/templates/__init__.py +1 -1
  89. scitex/fig/editor/flask_editor/templates/_html.py +834 -0
  90. scitex/fig/editor/flask_editor/templates/_scripts.py +3136 -0
  91. scitex/{vis → fig}/editor/flask_editor/templates/_styles.py +625 -18
  92. scitex/{vis → fig}/io/__init__.py +13 -1
  93. scitex/fig/io/_bundle.py +973 -0
  94. scitex/{vis → fig}/io/_canvas.py +1 -1
  95. scitex/{vis → fig}/io/_data.py +1 -1
  96. scitex/{vis → fig}/io/_export.py +1 -1
  97. scitex/{vis → fig}/io/_load.py +1 -1
  98. scitex/{vis → fig}/io/_panel.py +1 -1
  99. scitex/{vis → fig}/io/_save.py +1 -1
  100. scitex/{vis → fig}/model/__init__.py +1 -1
  101. scitex/{vis → fig}/model/_annotations.py +1 -1
  102. scitex/{vis → fig}/model/_axes.py +1 -1
  103. scitex/{vis → fig}/model/_figure.py +1 -1
  104. scitex/{vis → fig}/model/_guides.py +1 -1
  105. scitex/{vis → fig}/model/_plot.py +1 -1
  106. scitex/{vis → fig}/model/_styles.py +1 -1
  107. scitex/{vis → fig}/utils/__init__.py +1 -1
  108. scitex/io/__init__.py +10 -26
  109. scitex/io/_bundle.py +434 -0
  110. scitex/io/_flush.py +5 -2
  111. scitex/io/_load.py +98 -0
  112. scitex/io/_load_modules/_H5Explorer.py +5 -2
  113. scitex/io/_load_modules/_canvas.py +2 -2
  114. scitex/io/_load_modules/_image.py +3 -4
  115. scitex/io/_load_modules/_txt.py +4 -2
  116. scitex/io/_metadata.py +34 -324
  117. scitex/io/_metadata_modules/__init__.py +46 -0
  118. scitex/io/_metadata_modules/_embed.py +70 -0
  119. scitex/io/_metadata_modules/_read.py +64 -0
  120. scitex/io/_metadata_modules/_utils.py +79 -0
  121. scitex/io/_metadata_modules/embed_metadata_jpeg.py +74 -0
  122. scitex/io/_metadata_modules/embed_metadata_pdf.py +53 -0
  123. scitex/io/_metadata_modules/embed_metadata_png.py +26 -0
  124. scitex/io/_metadata_modules/embed_metadata_svg.py +62 -0
  125. scitex/io/_metadata_modules/read_metadata_jpeg.py +57 -0
  126. scitex/io/_metadata_modules/read_metadata_pdf.py +51 -0
  127. scitex/io/_metadata_modules/read_metadata_png.py +39 -0
  128. scitex/io/_metadata_modules/read_metadata_svg.py +44 -0
  129. scitex/io/_qr_utils.py +5 -3
  130. scitex/io/_save.py +548 -30
  131. scitex/io/_save_modules/_canvas.py +3 -3
  132. scitex/io/_save_modules/_image.py +5 -9
  133. scitex/io/_save_modules/_tex.py +7 -4
  134. scitex/io/utils/h5_to_zarr.py +11 -9
  135. scitex/msword/__init__.py +255 -0
  136. scitex/msword/profiles.py +357 -0
  137. scitex/msword/reader.py +753 -0
  138. scitex/msword/utils.py +289 -0
  139. scitex/msword/writer.py +362 -0
  140. scitex/plt/__init__.py +5 -2
  141. scitex/plt/_subplots/_AxesWrapper.py +6 -6
  142. scitex/plt/_subplots/_AxisWrapper.py +15 -9
  143. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/__init__.py +36 -0
  144. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_labels.py +264 -0
  145. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_metadata.py +213 -0
  146. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_visual.py +128 -0
  147. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +59 -0
  148. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_base.py +34 -0
  149. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_scientific.py +593 -0
  150. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_statistical.py +654 -0
  151. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_stx_aliases.py +527 -0
  152. scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py +321 -0
  153. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/__init__.py +33 -0
  154. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_base.py +152 -0
  155. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +600 -0
  156. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +79 -5
  157. scitex/plt/_subplots/_FigWrapper.py +6 -6
  158. scitex/plt/_subplots/_SubplotsWrapper.py +28 -18
  159. scitex/plt/_subplots/_export_as_csv.py +35 -5
  160. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +8 -0
  161. scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +10 -21
  162. scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +18 -7
  163. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +28 -12
  164. scitex/plt/_subplots/_export_as_csv_formatters/_format_matshow.py +10 -4
  165. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_imshow.py +13 -1
  166. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +12 -2
  167. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +10 -3
  168. scitex/plt/_subplots/_export_as_csv_formatters/_format_quiver.py +10 -4
  169. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +18 -3
  170. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +44 -36
  171. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +14 -2
  172. scitex/plt/_subplots/_export_as_csv_formatters/_format_streamplot.py +11 -5
  173. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_bar.py +84 -0
  174. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_barh.py +85 -0
  175. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_conf_mat.py +14 -3
  176. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_contour.py +54 -0
  177. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_ecdf.py +14 -2
  178. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_errorbar.py +120 -0
  179. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_heatmap.py +16 -6
  180. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_image.py +29 -19
  181. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_imshow.py +63 -0
  182. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_joyplot.py +22 -5
  183. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_ci.py +18 -14
  184. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_std.py +18 -14
  185. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_median_iqr.py +18 -14
  186. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_raster.py +10 -2
  187. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter.py +51 -0
  188. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter_hist.py +18 -9
  189. scitex/plt/ax/_plot/_stx_ecdf.py +4 -2
  190. scitex/plt/gallery/_generate.py +421 -14
  191. scitex/plt/io/__init__.py +53 -0
  192. scitex/plt/io/_bundle.py +490 -0
  193. scitex/plt/io/_layered_bundle.py +1343 -0
  194. scitex/plt/styles/SCITEX_STYLE.yaml +26 -0
  195. scitex/plt/styles/__init__.py +14 -0
  196. scitex/plt/styles/presets.py +78 -0
  197. scitex/plt/utils/__init__.py +13 -1
  198. scitex/plt/utils/_collect_figure_metadata.py +10 -14
  199. scitex/plt/utils/_configure_mpl.py +6 -18
  200. scitex/plt/utils/_crop.py +32 -14
  201. scitex/plt/utils/_csv_column_naming.py +54 -0
  202. scitex/plt/utils/_figure_mm.py +116 -1
  203. scitex/plt/utils/_hitmap.py +1643 -0
  204. scitex/plt/utils/metadata/__init__.py +25 -0
  205. scitex/plt/utils/metadata/_core.py +9 -10
  206. scitex/plt/utils/metadata/_dimensions.py +6 -3
  207. scitex/plt/utils/metadata/_editable_export.py +405 -0
  208. scitex/plt/utils/metadata/_geometry_extraction.py +570 -0
  209. scitex/schema/__init__.py +109 -16
  210. scitex/schema/_canvas.py +1 -1
  211. scitex/schema/_plot.py +1015 -0
  212. scitex/schema/_stats.py +2 -2
  213. scitex/stats/__init__.py +117 -0
  214. scitex/stats/io/__init__.py +29 -0
  215. scitex/stats/io/_bundle.py +156 -0
  216. scitex/tex/__init__.py +4 -0
  217. scitex/tex/_export.py +890 -0
  218. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/METADATA +11 -1
  219. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/RECORD +238 -170
  220. scitex/io/memo.md +0 -2827
  221. scitex/plt/REQUESTS.md +0 -191
  222. scitex/plt/_subplots/TODO.md +0 -53
  223. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +0 -559
  224. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +0 -1609
  225. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +0 -447
  226. scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_between.json +0 -110
  227. scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_betweenx.json +0 -88
  228. scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fill_between.json +0 -103
  229. scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fillv.json +0 -106
  230. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/bar.json +0 -92
  231. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/barh.json +0 -92
  232. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/boxplot.json +0 -92
  233. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_bar.json +0 -84
  234. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_barh.json +0 -84
  235. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_box.json +0 -83
  236. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_boxplot.json +0 -93
  237. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violin.json +0 -91
  238. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violinplot.json +0 -91
  239. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/violinplot.json +0 -91
  240. scitex/plt/templates/research-master/scitex/vis/gallery/contour/contour.json +0 -97
  241. scitex/plt/templates/research-master/scitex/vis/gallery/contour/contourf.json +0 -98
  242. scitex/plt/templates/research-master/scitex/vis/gallery/contour/stx_contour.json +0 -84
  243. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist.json +0 -101
  244. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist2d.json +0 -96
  245. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_ecdf.json +0 -95
  246. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_joyplot.json +0 -95
  247. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_kde.json +0 -93
  248. scitex/plt/templates/research-master/scitex/vis/gallery/grid/imshow.json +0 -95
  249. scitex/plt/templates/research-master/scitex/vis/gallery/grid/matshow.json +0 -95
  250. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_conf_mat.json +0 -83
  251. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_heatmap.json +0 -92
  252. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_image.json +0 -121
  253. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_imshow.json +0 -84
  254. scitex/plt/templates/research-master/scitex/vis/gallery/line/plot.json +0 -110
  255. scitex/plt/templates/research-master/scitex/vis/gallery/line/step.json +0 -92
  256. scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_line.json +0 -95
  257. scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_shaded_line.json +0 -96
  258. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/hexbin.json +0 -95
  259. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/scatter.json +0 -95
  260. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stem.json +0 -92
  261. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stx_scatter.json +0 -84
  262. scitex/plt/templates/research-master/scitex/vis/gallery/special/pie.json +0 -94
  263. scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_raster.json +0 -109
  264. scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_rectangle.json +0 -108
  265. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/errorbar.json +0 -93
  266. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_errorbar.json +0 -84
  267. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_ci.json +0 -96
  268. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_std.json +0 -96
  269. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_median_iqr.json +0 -96
  270. scitex/plt/templates/research-master/scitex/vis/gallery/vector/quiver.json +0 -99
  271. scitex/plt/templates/research-master/scitex/vis/gallery/vector/streamplot.json +0 -100
  272. scitex/vis/__init__.py +0 -177
  273. scitex/vis/editor/_edit.py +0 -390
  274. scitex/vis/editor/flask_editor/_bbox.py +0 -529
  275. scitex/vis/editor/flask_editor/_core.py +0 -168
  276. scitex/vis/editor/flask_editor/_renderer.py +0 -393
  277. scitex/vis/editor/flask_editor/templates/_html.py +0 -513
  278. scitex/vis/editor/flask_editor/templates/_scripts.py +0 -1261
  279. /scitex/{vis → fig}/README.md +0 -0
  280. /scitex/{vis → fig}/backend/__init__.py +0 -0
  281. /scitex/{vis → fig}/backend/_export.py +0 -0
  282. /scitex/{vis → fig}/backend/_render.py +0 -0
  283. /scitex/{vis → fig}/docs/CANVAS_ARCHITECTURE.md +0 -0
  284. /scitex/{vis → fig}/editor/__init__.py +0 -0
  285. /scitex/{vis → fig}/editor/_dearpygui_editor.py +0 -0
  286. /scitex/{vis → fig}/editor/_flask_editor.py +0 -0
  287. /scitex/{vis → fig}/editor/_mpl_editor.py +0 -0
  288. /scitex/{vis → fig}/editor/_tkinter_editor.py +0 -0
  289. /scitex/{vis → fig}/editor/flask_editor/__init__.py +0 -0
  290. /scitex/{vis → fig}/editor/flask_editor/_utils.py +0 -0
  291. /scitex/{vis → fig}/io/_directory.py +0 -0
  292. /scitex/{vis → fig}/model/_plot_types.py +0 -0
  293. /scitex/{vis → fig}/utils/_defaults.py +0 -0
  294. /scitex/{vis → fig}/utils/_validate.py +0 -0
  295. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/WHEEL +0 -0
  296. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/entry_points.txt +0 -0
  297. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/licenses/LICENSE +0 -0
@@ -188,6 +188,70 @@ body {
188
188
  pointer-events: none;
189
189
  }
190
190
 
191
+ /* Debug mode - show all hit areas */
192
+ .debug-rect {
193
+ fill: rgba(255, 0, 0, 0.15);
194
+ stroke: rgba(255, 0, 0, 0.6);
195
+ stroke-width: 1;
196
+ stroke-dasharray: 4 2;
197
+ pointer-events: none;
198
+ }
199
+
200
+ .debug-rect-trace {
201
+ fill: rgba(0, 255, 0, 0.15);
202
+ stroke: rgba(0, 200, 0, 0.8);
203
+ stroke-width: 1;
204
+ stroke-dasharray: 3 2;
205
+ pointer-events: none;
206
+ }
207
+
208
+ .debug-rect-legend {
209
+ fill: rgba(255, 165, 0, 0.2);
210
+ stroke: rgba(255, 140, 0, 0.8);
211
+ stroke-width: 1;
212
+ stroke-dasharray: 3 2;
213
+ pointer-events: none;
214
+ }
215
+
216
+ .debug-label {
217
+ font-size: 8px;
218
+ fill: rgba(255, 0, 0, 0.9);
219
+ pointer-events: none;
220
+ font-family: monospace;
221
+ }
222
+
223
+ .debug-path {
224
+ fill: none;
225
+ stroke: rgba(0, 200, 0, 0.7);
226
+ stroke-width: 2;
227
+ stroke-linecap: round;
228
+ stroke-linejoin: round;
229
+ stroke-dasharray: 5 3;
230
+ pointer-events: none;
231
+ }
232
+
233
+ .debug-toggle {
234
+ position: fixed;
235
+ bottom: 10px;
236
+ right: 10px;
237
+ z-index: 1000;
238
+ padding: 8px 12px;
239
+ background: #333;
240
+ color: #fff;
241
+ border: none;
242
+ border-radius: 4px;
243
+ cursor: pointer;
244
+ font-size: 12px;
245
+ }
246
+
247
+ .debug-toggle:hover {
248
+ background: #555;
249
+ }
250
+
251
+ .debug-toggle.active {
252
+ background: #c00;
253
+ }
254
+
191
255
  .hover-scatter {
192
256
  fill: rgba(100, 180, 255, 0.7);
193
257
  stroke: rgba(100, 180, 255, 0.9);
@@ -296,7 +360,7 @@ input[type="range"]::-moz-range-thumb {
296
360
  }
297
361
 
298
362
  .controls-header {
299
- padding: 16px 20px;
363
+ padding: 12px 16px;
300
364
  border-bottom: 1px solid var(--workspace-border-subtle);
301
365
  display: flex;
302
366
  justify-content: space-between;
@@ -308,13 +372,13 @@ input[type="range"]::-moz-range-thumb {
308
372
  }
309
373
 
310
374
  .controls-header h1 {
311
- font-size: 1.1em;
375
+ font-size: 1.0em;
312
376
  font-weight: 600;
313
377
  color: var(--status-success);
314
378
  }
315
379
 
316
380
  .controls-body {
317
- padding: 0 20px 20px;
381
+ padding: 0 14px 14px;
318
382
  flex: 1;
319
383
  }
320
384
 
@@ -325,6 +389,13 @@ input[type="range"]::-moz-range-thumb {
325
389
  word-break: break-all;
326
390
  }
327
391
 
392
+ .panel-path {
393
+ font-size: 0.75em;
394
+ color: var(--text-muted);
395
+ margin-top: 2px;
396
+ opacity: 0.8;
397
+ }
398
+
328
399
  /* Theme toggle */
329
400
  .theme-toggle {
330
401
  background: transparent;
@@ -349,31 +420,31 @@ input[type="range"]::-moz-range-thumb {
349
420
  * Section Headers
350
421
  * ============================================================================= */
351
422
  .section {
352
- margin-top: 16px;
423
+ margin-top: 10px;
353
424
  }
354
425
 
355
426
  .section-header {
356
- font-size: 0.75em;
427
+ font-size: 0.72em;
357
428
  font-weight: 600;
358
429
  text-transform: uppercase;
359
430
  letter-spacing: 0.5px;
360
431
  color: var(--text-inverse);
361
432
  background: var(--status-success);
362
- padding: 8px 12px;
433
+ padding: 6px 10px;
363
434
  border-radius: 4px;
364
- margin-bottom: 12px;
435
+ margin-bottom: 8px;
365
436
  }
366
437
 
367
438
  /* =============================================================================
368
439
  * Form Fields
369
440
  * ============================================================================= */
370
- .field { margin-bottom: 12px; }
441
+ .field { margin-bottom: 8px; }
371
442
 
372
443
  .field label {
373
444
  display: block;
374
- font-size: 0.8em;
445
+ font-size: 0.78em;
375
446
  font-weight: 500;
376
- margin-bottom: 4px;
447
+ margin-bottom: 3px;
377
448
  color: var(--text-secondary);
378
449
  }
379
450
 
@@ -381,12 +452,12 @@ input[type="range"]::-moz-range-thumb {
381
452
  .field input[type="number"],
382
453
  .field select {
383
454
  width: 100%;
384
- padding: 8px 10px;
455
+ padding: 5px 8px;
385
456
  border: 1px solid var(--border-muted);
386
457
  border-radius: 4px;
387
458
  background: var(--bg-surface);
388
459
  color: var(--text-primary);
389
- font-size: 0.85em;
460
+ font-size: 0.82em;
390
461
  transition: border-color 0.2s;
391
462
  }
392
463
 
@@ -408,18 +479,18 @@ input[type="range"]::-moz-range-thumb {
408
479
 
409
480
  .field-row {
410
481
  display: flex;
411
- gap: 10px;
482
+ gap: 8px;
412
483
  }
413
484
 
414
- .field-row .field { flex: 1; }
485
+ .field-row .field { flex: 1; margin-bottom: 0; }
415
486
 
416
487
  /* Checkbox styling */
417
488
  .checkbox-field {
418
489
  display: flex;
419
490
  align-items: center;
420
- gap: 8px;
491
+ gap: 6px;
421
492
  cursor: pointer;
422
- padding: 6px 0;
493
+ padding: 4px 0;
423
494
  }
424
495
 
425
496
  .checkbox-field input[type="checkbox"] {
@@ -466,6 +537,17 @@ input[type="range"]::-moz-range-thumb {
466
537
 
467
538
  .trace-item:last-child { border-bottom: none; }
468
539
 
540
+ .trace-item-highlight {
541
+ background: var(--status-success);
542
+ color: var(--text-inverse);
543
+ animation: traceHighlightFade 1.5s ease-out forwards;
544
+ }
545
+
546
+ @keyframes traceHighlightFade {
547
+ 0% { background: var(--status-success); }
548
+ 100% { background: var(--bg-muted); }
549
+ }
550
+
469
551
  .trace-color {
470
552
  width: 24px;
471
553
  height: 24px;
@@ -525,8 +607,8 @@ input[type="range"]::-moz-range-thumb {
525
607
  * ============================================================================= */
526
608
  .btn {
527
609
  width: 100%;
528
- padding: 10px 16px;
529
- margin-top: 8px;
610
+ padding: 7px 12px;
611
+ margin-top: 6px;
530
612
  border: none;
531
613
  border-radius: 4px;
532
614
  cursor: pointer;
@@ -660,6 +742,65 @@ input[type="range"]::-moz-range-thumb {
660
742
  background: #000000;
661
743
  }
662
744
 
745
+ /* =============================================================================
746
+ * Section Hints
747
+ * ============================================================================= */
748
+ .section-hint {
749
+ font-size: 0.75em;
750
+ color: var(--text-muted);
751
+ font-style: italic;
752
+ margin-bottom: 10px;
753
+ padding: 6px 8px;
754
+ background: var(--bg-muted);
755
+ border-radius: 4px;
756
+ border-left: 2px solid var(--border-default);
757
+ }
758
+
759
+ /* =============================================================================
760
+ * Element Statistics
761
+ * ============================================================================= */
762
+ .element-stats {
763
+ margin-top: 12px;
764
+ padding: 10px;
765
+ background: var(--bg-muted);
766
+ border-radius: 4px;
767
+ border: 1px solid var(--border-muted);
768
+ }
769
+
770
+ .stats-header {
771
+ font-size: 0.8em;
772
+ font-weight: 600;
773
+ color: var(--text-secondary);
774
+ margin-bottom: 8px;
775
+ text-transform: uppercase;
776
+ letter-spacing: 0.5px;
777
+ }
778
+
779
+ .stats-grid {
780
+ display: grid;
781
+ grid-template-columns: repeat(3, 1fr);
782
+ gap: 8px;
783
+ }
784
+
785
+ .stat-item {
786
+ display: flex;
787
+ flex-direction: column;
788
+ gap: 2px;
789
+ }
790
+
791
+ .stat-label {
792
+ font-size: 0.7em;
793
+ color: var(--text-muted);
794
+ text-transform: uppercase;
795
+ }
796
+
797
+ .stat-value {
798
+ font-size: 0.85em;
799
+ font-weight: 500;
800
+ color: var(--text-primary);
801
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
802
+ }
803
+
663
804
  /* =============================================================================
664
805
  * Status Bar
665
806
  * ============================================================================= */
@@ -733,6 +874,472 @@ input[type="range"]::-moz-range-thumb {
733
874
  .annotations-list::-webkit-scrollbar-thumb:hover {
734
875
  background: var(--text-muted);
735
876
  }
877
+
878
+ /* =============================================================================
879
+ * Statistics Section
880
+ * ============================================================================= */
881
+ #stats-container {
882
+ font-family: 'JetBrains Mono', 'Fira Code', 'Monaco', monospace;
883
+ font-size: 11px;
884
+ line-height: 1.5;
885
+ }
886
+
887
+ .stats-loading {
888
+ color: var(--text-muted);
889
+ font-style: italic;
890
+ padding: 10px;
891
+ text-align: center;
892
+ }
893
+
894
+ .stats-empty {
895
+ color: var(--text-muted);
896
+ padding: 10px;
897
+ text-align: center;
898
+ background: var(--bg-muted);
899
+ border-radius: 4px;
900
+ }
901
+
902
+ .stats-card {
903
+ background: var(--bg-surface);
904
+ border: 1px solid var(--workspace-border-subtle);
905
+ border-radius: 6px;
906
+ padding: 12px;
907
+ margin-bottom: 10px;
908
+ }
909
+
910
+ .stats-card-header {
911
+ display: flex;
912
+ justify-content: space-between;
913
+ align-items: center;
914
+ margin-bottom: 8px;
915
+ padding-bottom: 8px;
916
+ border-bottom: 1px solid var(--workspace-border-subtle);
917
+ }
918
+
919
+ .stats-card-title {
920
+ font-weight: 600;
921
+ font-size: 12px;
922
+ color: var(--text-primary);
923
+ }
924
+
925
+ .stats-significance {
926
+ display: inline-block;
927
+ padding: 2px 8px;
928
+ border-radius: 4px;
929
+ font-weight: bold;
930
+ font-size: 11px;
931
+ }
932
+
933
+ .stats-significance.sig-high {
934
+ background: #dcfce7;
935
+ color: #166534;
936
+ }
937
+
938
+ .stats-significance.sig-medium {
939
+ background: #fef9c3;
940
+ color: #854d0e;
941
+ }
942
+
943
+ .stats-significance.sig-low {
944
+ background: #fee2e2;
945
+ color: #991b1b;
946
+ }
947
+
948
+ .stats-significance.sig-ns {
949
+ background: var(--bg-muted);
950
+ color: var(--text-muted);
951
+ }
952
+
953
+ .stats-row {
954
+ display: flex;
955
+ justify-content: space-between;
956
+ padding: 3px 0;
957
+ }
958
+
959
+ .stats-label {
960
+ color: var(--text-secondary);
961
+ }
962
+
963
+ .stats-value {
964
+ font-weight: 500;
965
+ color: var(--text-primary);
966
+ }
967
+
968
+ .stats-groups {
969
+ display: grid;
970
+ grid-template-columns: 1fr 1fr;
971
+ gap: 8px;
972
+ margin-top: 8px;
973
+ padding-top: 8px;
974
+ border-top: 1px dashed var(--workspace-border-subtle);
975
+ }
976
+
977
+ .stats-group {
978
+ background: var(--bg-muted);
979
+ padding: 8px;
980
+ border-radius: 4px;
981
+ font-size: 10px;
982
+ }
983
+
984
+ .stats-group-name {
985
+ font-weight: 600;
986
+ margin-bottom: 4px;
987
+ color: var(--text-primary);
988
+ }
989
+
990
+ .stats-correction-badge {
991
+ display: inline-block;
992
+ background: var(--color-cta);
993
+ color: white;
994
+ padding: 2px 6px;
995
+ border-radius: 3px;
996
+ font-size: 9px;
997
+ margin-left: 6px;
998
+ }
999
+
1000
+ .stats-summary-header {
1001
+ background: var(--scitex-01);
1002
+ color: var(--text-inverse);
1003
+ padding: 10px 12px;
1004
+ border-radius: 6px 6px 0 0;
1005
+ font-weight: 600;
1006
+ margin-bottom: 0;
1007
+ }
1008
+
1009
+ .stats-summary-body {
1010
+ background: var(--bg-surface);
1011
+ border: 1px solid var(--scitex-01);
1012
+ border-top: none;
1013
+ border-radius: 0 0 6px 6px;
1014
+ padding: 12px;
1015
+ }
1016
+
1017
+ /* =============================================================================
1018
+ * Subsection Headers (for grouped controls like X/Y axis settings)
1019
+ * ============================================================================= */
1020
+ .subsection-header {
1021
+ font-size: 0.68em;
1022
+ font-weight: 600;
1023
+ text-transform: uppercase;
1024
+ letter-spacing: 0.3px;
1025
+ color: var(--text-secondary);
1026
+ padding: 4px 6px;
1027
+ margin-bottom: 6px;
1028
+ margin-top: 8px;
1029
+ background: var(--bg-muted);
1030
+ border-left: 2px solid var(--status-success);
1031
+ border-radius: 0 4px 4px 0;
1032
+ }
1033
+
1034
+ .subsection-header:first-child {
1035
+ margin-top: 0;
1036
+ }
1037
+
1038
+ /* =============================================================================
1039
+ * Axis Tabs (for X/Y/Z axis switching)
1040
+ * ============================================================================= */
1041
+ .axis-tabs {
1042
+ display: flex;
1043
+ gap: 3px;
1044
+ margin-bottom: 8px;
1045
+ background: var(--bg-muted);
1046
+ padding: 3px;
1047
+ border-radius: 6px;
1048
+ }
1049
+
1050
+ .axis-tab {
1051
+ flex: 1;
1052
+ padding: 4px 8px;
1053
+ border: none;
1054
+ background: transparent;
1055
+ color: var(--text-secondary);
1056
+ font-size: 0.8em;
1057
+ font-weight: 600;
1058
+ cursor: pointer;
1059
+ border-radius: 4px;
1060
+ transition: all 0.15s ease;
1061
+ }
1062
+
1063
+ .axis-tab:hover {
1064
+ background: var(--bg-surface);
1065
+ color: var(--text-primary);
1066
+ }
1067
+
1068
+ .axis-tab.active {
1069
+ background: var(--scitex-01);
1070
+ color: var(--bg-primary);
1071
+ }
1072
+
1073
+ .axis-panel {
1074
+ animation: fadeIn 0.15s ease;
1075
+ }
1076
+
1077
+ @keyframes fadeIn {
1078
+ from { opacity: 0; }
1079
+ to { opacity: 1; }
1080
+ }
1081
+
1082
+ /* =============================================================================
1083
+ * Loading Spinner Overlay
1084
+ * ============================================================================= */
1085
+ .loading-overlay {
1086
+ position: absolute;
1087
+ top: 0;
1088
+ left: 0;
1089
+ right: 0;
1090
+ bottom: 0;
1091
+ background: rgba(0, 0, 0, 0.3);
1092
+ display: flex;
1093
+ align-items: center;
1094
+ justify-content: center;
1095
+ z-index: 100;
1096
+ border-radius: 8px;
1097
+ }
1098
+
1099
+ .spinner {
1100
+ width: 40px;
1101
+ height: 40px;
1102
+ border: 3px solid var(--scitex-06);
1103
+ border-top: 3px solid var(--status-success);
1104
+ border-radius: 50%;
1105
+ animation: spin 0.8s linear infinite;
1106
+ }
1107
+
1108
+ @keyframes spin {
1109
+ 0% { transform: rotate(0deg); }
1110
+ 100% { transform: rotate(360deg); }
1111
+ }
1112
+
1113
+ /* =============================================================================
1114
+ * Panel Grid View (for multi-panel figz bundles)
1115
+ * ============================================================================= */
1116
+ .panel-grid-section {
1117
+ width: 100%;
1118
+ margin-bottom: 20px;
1119
+ background: var(--workspace-bg-elevated);
1120
+ border-radius: 8px;
1121
+ padding: 16px;
1122
+ box-shadow: 0 2px 8px rgba(0,0,0,0.1);
1123
+ }
1124
+
1125
+ .panel-grid-header {
1126
+ display: flex;
1127
+ justify-content: space-between;
1128
+ align-items: center;
1129
+ margin-bottom: 12px;
1130
+ }
1131
+
1132
+ .panel-grid-header h3 {
1133
+ font-size: 1em;
1134
+ font-weight: 600;
1135
+ color: var(--text-primary);
1136
+ margin: 0;
1137
+ }
1138
+
1139
+ .panel-grid {
1140
+ display: grid;
1141
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
1142
+ gap: 12px;
1143
+ }
1144
+
1145
+ .panel-card {
1146
+ background: var(--preview-bg);
1147
+ background-size: 16px 16px;
1148
+ background-position: 0 0, 0 8px, 8px -8px, -8px 0px;
1149
+ border-radius: 6px;
1150
+ overflow: hidden;
1151
+ cursor: pointer;
1152
+ transition: all 0.2s ease;
1153
+ border: 2px solid transparent;
1154
+ position: relative;
1155
+ }
1156
+
1157
+ .panel-card:hover {
1158
+ border-color: var(--color-cta);
1159
+ transform: translateY(-2px);
1160
+ box-shadow: 0 4px 12px rgba(0,0,0,0.15);
1161
+ }
1162
+
1163
+ .panel-card.active {
1164
+ border-color: var(--status-success);
1165
+ box-shadow: 0 0 0 2px var(--status-success);
1166
+ }
1167
+
1168
+ .panel-card img {
1169
+ width: 100%;
1170
+ height: auto;
1171
+ display: block;
1172
+ }
1173
+
1174
+ .panel-card-container {
1175
+ position: relative;
1176
+ display: inline-block;
1177
+ width: 100%;
1178
+ }
1179
+
1180
+ .panel-card-overlay {
1181
+ position: absolute;
1182
+ top: 0;
1183
+ left: 0;
1184
+ pointer-events: none;
1185
+ z-index: 5;
1186
+ }
1187
+
1188
+ .panel-card-label {
1189
+ position: absolute;
1190
+ top: 6px;
1191
+ left: 6px;
1192
+ background: rgba(0,0,0,0.7);
1193
+ color: white;
1194
+ padding: 3px 8px;
1195
+ border-radius: 4px;
1196
+ font-size: 0.75em;
1197
+ font-weight: 600;
1198
+ }
1199
+
1200
+ .panel-card-loading {
1201
+ display: flex;
1202
+ align-items: center;
1203
+ justify-content: center;
1204
+ min-height: 120px;
1205
+ color: var(--text-muted);
1206
+ font-size: 0.85em;
1207
+ }
1208
+
1209
+ /* Panel Navigation Header */
1210
+ .preview-header {
1211
+ display: flex;
1212
+ justify-content: space-between;
1213
+ align-items: center;
1214
+ padding: 8px 12px;
1215
+ background: var(--workspace-bg-elevated);
1216
+ border-radius: 8px 8px 0 0;
1217
+ border-bottom: 1px solid var(--workspace-border-subtle);
1218
+ }
1219
+
1220
+ #current-panel-name {
1221
+ font-weight: 600;
1222
+ color: var(--text-primary);
1223
+ font-size: 0.9em;
1224
+ }
1225
+
1226
+ .panel-nav {
1227
+ display: flex;
1228
+ align-items: center;
1229
+ gap: 8px;
1230
+ }
1231
+
1232
+ #panel-indicator {
1233
+ font-size: 0.8em;
1234
+ color: var(--text-muted);
1235
+ min-width: 50px;
1236
+ text-align: center;
1237
+ }
1238
+
1239
+ .btn-sm {
1240
+ padding: 4px 10px;
1241
+ font-size: 0.8em;
1242
+ width: auto;
1243
+ margin: 0;
1244
+ }
1245
+
1246
+ /* Preview area adjustments when panel header is visible */
1247
+ .preview-wrapper:has(.preview-header:not([style*="display: none"])) {
1248
+ border-radius: 0 0 8px 8px;
1249
+ }
1250
+
1251
+ .preview {
1252
+ flex-direction: column;
1253
+ align-items: stretch;
1254
+ padding: 20px;
1255
+ overflow-y: auto;
1256
+ }
1257
+
1258
+ .preview > .preview-wrapper {
1259
+ flex-shrink: 0;
1260
+ }
1261
+
1262
+ /* =============================================================================
1263
+ * Draggable Panel Canvas
1264
+ * ============================================================================= */
1265
+ .panel-canvas {
1266
+ position: relative;
1267
+ min-height: 400px;
1268
+ background: var(--workspace-bg-secondary);
1269
+ border: 2px dashed var(--workspace-border-default);
1270
+ border-radius: 8px;
1271
+ overflow: hidden;
1272
+ }
1273
+
1274
+ .panel-canvas-item {
1275
+ position: absolute;
1276
+ cursor: move;
1277
+ user-select: none;
1278
+ transition: box-shadow 0.2s;
1279
+ background: var(--preview-bg);
1280
+ background-size: 16px 16px;
1281
+ background-position: 0 0, 0 8px, 8px -8px, -8px 0px;
1282
+ border-radius: 6px;
1283
+ overflow: hidden;
1284
+ border: 2px solid transparent;
1285
+ }
1286
+
1287
+ .panel-canvas-item:hover {
1288
+ box-shadow: 0 4px 12px rgba(0,0,0,0.2);
1289
+ z-index: 10;
1290
+ }
1291
+
1292
+ .panel-canvas-item.dragging {
1293
+ box-shadow: 0 8px 24px rgba(0,0,0,0.3);
1294
+ z-index: 100;
1295
+ opacity: 0.9;
1296
+ }
1297
+
1298
+ .panel-canvas-item.active {
1299
+ border-color: var(--status-success);
1300
+ }
1301
+
1302
+ .panel-canvas-item img {
1303
+ width: 100%;
1304
+ height: 100%;
1305
+ object-fit: contain;
1306
+ pointer-events: none;
1307
+ }
1308
+
1309
+ .panel-canvas-label {
1310
+ position: absolute;
1311
+ top: 4px;
1312
+ left: 4px;
1313
+ background: rgba(0,0,0,0.7);
1314
+ color: white;
1315
+ padding: 2px 6px;
1316
+ border-radius: 3px;
1317
+ font-size: 0.7em;
1318
+ font-weight: 600;
1319
+ pointer-events: none;
1320
+ }
1321
+
1322
+ .panel-canvas-resize {
1323
+ position: absolute;
1324
+ bottom: 0;
1325
+ right: 0;
1326
+ width: 16px;
1327
+ height: 16px;
1328
+ cursor: se-resize;
1329
+ background: linear-gradient(135deg, transparent 50%, var(--color-cta) 50%);
1330
+ border-radius: 0 0 4px 0;
1331
+ }
1332
+
1333
+ .canvas-controls {
1334
+ display: flex;
1335
+ gap: 8px;
1336
+ margin-bottom: 8px;
1337
+ }
1338
+
1339
+ .canvas-controls button {
1340
+ padding: 4px 12px;
1341
+ font-size: 0.8em;
1342
+ }
736
1343
  """
737
1344
 
738
1345