arrayview 0.28.0__tar.gz → 0.29.0__tar.gz

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 (216) hide show
  1. {arrayview-0.28.0 → arrayview-0.29.0}/PKG-INFO +1 -1
  2. {arrayview-0.28.0 → arrayview-0.29.0}/pyproject.toml +1 -1
  3. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_analysis.py +8 -2
  4. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_launcher.py +7 -5
  5. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_analysis.py +2 -0
  6. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_viewer.html +1790 -448
  7. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_vscode_extension.py +1 -1
  8. arrayview-0.29.0/src/arrayview/arrayview-opener.vsix +0 -0
  9. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_api.py +21 -0
  10. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_browser.py +14 -13
  11. arrayview-0.29.0/tests/test_view_component_integration.py +1613 -0
  12. {arrayview-0.28.0 → arrayview-0.29.0}/uv.lock +1 -1
  13. {arrayview-0.28.0 → arrayview-0.29.0}/vscode-extension/extension.js +120 -57
  14. {arrayview-0.28.0 → arrayview-0.29.0}/vscode-extension/package.json +1 -1
  15. arrayview-0.28.0/src/arrayview/arrayview-opener.vsix +0 -0
  16. arrayview-0.28.0/tests/test_view_component_integration.py +0 -730
  17. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/frontend-designer/SKILL.md +0 -0
  18. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/invocation-consistency/SKILL.md +0 -0
  19. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/modes-consistency/SKILL.md +0 -0
  20. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/SKILL.md +0 -0
  21. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/element-attributes.md +0 -0
  22. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/playwright-tests.md +0 -0
  23. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/request-mocking.md +0 -0
  24. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/running-code.md +0 -0
  25. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/session-management.md +0 -0
  26. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/storage-state.md +0 -0
  27. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/test-generation.md +0 -0
  28. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/tracing.md +0 -0
  29. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/video-recording.md +0 -0
  30. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/todo-workflow/SKILL.md +0 -0
  31. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/ui-consistency-audit/SKILL.md +0 -0
  32. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/viewer-ui-checklist/SKILL.md +0 -0
  33. {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/visual-bug-fixing/SKILL.md +0 -0
  34. {arrayview-0.28.0 → arrayview-0.29.0}/.github/copilot-instructions.md +0 -0
  35. {arrayview-0.28.0 → arrayview-0.29.0}/.github/workflows/docs.yml +0 -0
  36. {arrayview-0.28.0 → arrayview-0.29.0}/.github/workflows/python-publish.yml +0 -0
  37. {arrayview-0.28.0 → arrayview-0.29.0}/.gitignore +0 -0
  38. {arrayview-0.28.0 → arrayview-0.29.0}/.ignore +0 -0
  39. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/AGENTS.md +0 -0
  40. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/ROUTER.md +0 -0
  41. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/SETUP.md +0 -0
  42. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/SYNC.md +0 -0
  43. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/architecture.md +0 -0
  44. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/conventions.md +0 -0
  45. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/decisions.md +0 -0
  46. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/frontend.md +0 -0
  47. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/lifecycle.md +0 -0
  48. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/project-state.md +0 -0
  49. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/render-pipeline.md +0 -0
  50. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/setup.md +0 -0
  51. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/stack.md +0 -0
  52. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/INDEX.md +0 -0
  53. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/README.md +0 -0
  54. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/add-file-format.md +0 -0
  55. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/add-server-endpoint.md +0 -0
  56. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/animation-verify.md +0 -0
  57. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/debug-render.md +0 -0
  58. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/debug-vscode-extension-python.md +0 -0
  59. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/extend-compare-mode.md +0 -0
  60. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/extract-server-route-module.md +0 -0
  61. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/frontend-change.md +0 -0
  62. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/setup.sh +0 -0
  63. {arrayview-0.28.0 → arrayview-0.29.0}/.mex/sync.sh +0 -0
  64. {arrayview-0.28.0 → arrayview-0.29.0}/.opencode/opencode.json +0 -0
  65. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T18-46-49-737Z.yml +0 -0
  66. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T18-48-21-979Z.yml +0 -0
  67. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T18-51-35-665Z.yml +0 -0
  68. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-07-01-393Z.yml +0 -0
  69. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-14-37-969Z.yml +0 -0
  70. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-21-30-940Z.yml +0 -0
  71. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-23-08-126Z.yml +0 -0
  72. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-29-33-155Z.yml +0 -0
  73. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-31-25-336Z.yml +0 -0
  74. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-31-53-789Z.yml +0 -0
  75. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-39-12-257Z.yml +0 -0
  76. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-39-16-449Z.yml +0 -0
  77. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T20-15-25-513Z.yml +0 -0
  78. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T20-25-13-179Z.yml +0 -0
  79. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T20-39-01-435Z.yml +0 -0
  80. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-01-27-659Z.yml +0 -0
  81. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-01-41-283Z.yml +0 -0
  82. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-03-00-625Z.yml +0 -0
  83. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-04-12-887Z.yml +0 -0
  84. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-33-39-044Z.yml +0 -0
  85. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-38-01-530Z.yml +0 -0
  86. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-45-20-383Z.yml +0 -0
  87. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-55-11-545Z.yml +0 -0
  88. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-56-03-307Z.yml +0 -0
  89. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-56-35-733Z.yml +0 -0
  90. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-57-12-181Z.yml +0 -0
  91. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-57-37-748Z.yml +0 -0
  92. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-58-13-679Z.yml +0 -0
  93. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T22-37-23-895Z.yml +0 -0
  94. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T00-39-18-637Z.yml +0 -0
  95. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T01-41-46-243Z.yml +0 -0
  96. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T04-31-48-472Z.yml +0 -0
  97. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-14-15-632Z.yml +0 -0
  98. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-14-47-582Z.yml +0 -0
  99. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-16-23-471Z.yml +0 -0
  100. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-17-10-247Z.yml +0 -0
  101. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-18-24-707Z.yml +0 -0
  102. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-20-06-164Z.yml +0 -0
  103. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-20-28-342Z.yml +0 -0
  104. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-21-54-962Z.yml +0 -0
  105. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-22-34-666Z.yml +0 -0
  106. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-23-11-336Z.yml +0 -0
  107. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-23-36-260Z.yml +0 -0
  108. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-24-09-267Z.yml +0 -0
  109. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-24-35-434Z.yml +0 -0
  110. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-25-57-010Z.yml +0 -0
  111. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-34-48-823Z.yml +0 -0
  112. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-46-46-468Z.yml +0 -0
  113. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-48-17-930Z.yml +0 -0
  114. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-49-26-400Z.yml +0 -0
  115. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-50-31-563Z.yml +0 -0
  116. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-56-45-568Z.yml +0 -0
  117. {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/theme-dark.yml +0 -0
  118. {arrayview-0.28.0 → arrayview-0.29.0}/.python-version +0 -0
  119. {arrayview-0.28.0 → arrayview-0.29.0}/.vscode/settings.json +0 -0
  120. {arrayview-0.28.0 → arrayview-0.29.0}/AGENTS.md +0 -0
  121. {arrayview-0.28.0 → arrayview-0.29.0}/CONTRIBUTING.md +0 -0
  122. {arrayview-0.28.0 → arrayview-0.29.0}/DESIGN.md +0 -0
  123. {arrayview-0.28.0 → arrayview-0.29.0}/LICENSE +0 -0
  124. {arrayview-0.28.0 → arrayview-0.29.0}/README.md +0 -0
  125. {arrayview-0.28.0 → arrayview-0.29.0}/docs/comparing.md +0 -0
  126. {arrayview-0.28.0 → arrayview-0.29.0}/docs/configuration.md +0 -0
  127. {arrayview-0.28.0 → arrayview-0.29.0}/docs/display.md +0 -0
  128. {arrayview-0.28.0 → arrayview-0.29.0}/docs/index.md +0 -0
  129. {arrayview-0.28.0 → arrayview-0.29.0}/docs/launch-routing-refactor.md +0 -0
  130. {arrayview-0.28.0 → arrayview-0.29.0}/docs/lifecycle.md +0 -0
  131. {arrayview-0.28.0 → arrayview-0.29.0}/docs/loading.md +0 -0
  132. {arrayview-0.28.0 → arrayview-0.29.0}/docs/logo.png +0 -0
  133. {arrayview-0.28.0 → arrayview-0.29.0}/docs/measurement.md +0 -0
  134. {arrayview-0.28.0 → arrayview-0.29.0}/docs/remote.md +0 -0
  135. {arrayview-0.28.0 → arrayview-0.29.0}/docs/stylesheets/extra.css +0 -0
  136. {arrayview-0.28.0 → arrayview-0.29.0}/docs/viewing.md +0 -0
  137. {arrayview-0.28.0 → arrayview-0.29.0}/experiments/ws_tunnel_diag/ws_tunnel_diag.py +0 -0
  138. {arrayview-0.28.0 → arrayview-0.29.0}/matlab/arrayview.m +0 -0
  139. {arrayview-0.28.0 → arrayview-0.29.0}/mkdocs.yml +0 -0
  140. {arrayview-0.28.0 → arrayview-0.29.0}/plans/2026-04-14-immersive-animation.md +0 -0
  141. {arrayview-0.28.0 → arrayview-0.29.0}/plans/2026-05-07-unified-colormap-picker.md +0 -0
  142. {arrayview-0.28.0 → arrayview-0.29.0}/plans/arrayview_tool_menu_fix_prompt.md +0 -0
  143. {arrayview-0.28.0 → arrayview-0.29.0}/plans/arrayview_tool_menu_implementation_plan.md +0 -0
  144. {arrayview-0.28.0 → arrayview-0.29.0}/plans/egg-placement-mockup.html +0 -0
  145. {arrayview-0.28.0 → arrayview-0.29.0}/plans/refactoring_plan.md +0 -0
  146. {arrayview-0.28.0 → arrayview-0.29.0}/plans/roi-analysis-requirements.md +0 -0
  147. {arrayview-0.28.0 → arrayview-0.29.0}/plans/webview/LOG.md +0 -0
  148. {arrayview-0.28.0 → arrayview-0.29.0}/scripts/demo.py +0 -0
  149. {arrayview-0.28.0 → arrayview-0.29.0}/scripts/release.sh +0 -0
  150. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/ARCHITECTURE.md +0 -0
  151. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/__init__.py +0 -0
  152. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/__main__.py +0 -0
  153. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_app.py +0 -0
  154. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_codex_open.py +0 -0
  155. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_config.py +0 -0
  156. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_diff.py +0 -0
  157. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_icon.png +0 -0
  158. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_imaging.py +0 -0
  159. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_io.py +0 -0
  160. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_launch_plan.py +0 -0
  161. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_lifecycle.py +0 -0
  162. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_overlays.py +0 -0
  163. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_platform.py +0 -0
  164. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_render.py +0 -0
  165. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_export.py +0 -0
  166. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_loading.py +0 -0
  167. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_persistence.py +0 -0
  168. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_preload.py +0 -0
  169. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_query.py +0 -0
  170. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_rendering.py +0 -0
  171. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_segmentation.py +0 -0
  172. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_state.py +0 -0
  173. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_vectorfield.py +0 -0
  174. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_websocket.py +0 -0
  175. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_segmentation.py +0 -0
  176. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_server.py +0 -0
  177. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_session.py +0 -0
  178. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_shell.html +0 -0
  179. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_synthetic_mri.py +0 -0
  180. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_torch.py +0 -0
  181. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_vectorfield.py +0 -0
  182. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_vscode.py +0 -0
  183. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_vscode_browser.py +0 -0
  184. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_vscode_signal.py +0 -0
  185. {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/gsap.min.js +0 -0
  186. {arrayview-0.28.0 → arrayview-0.29.0}/tests/capture_v_animation.py +0 -0
  187. {arrayview-0.28.0 → arrayview-0.29.0}/tests/conftest.py +0 -0
  188. {arrayview-0.28.0 → arrayview-0.29.0}/tests/lifecycle_matrix.py +0 -0
  189. {arrayview-0.28.0 → arrayview-0.29.0}/tests/make_vectorfield_test_arrays.py +0 -0
  190. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_backend_shared.py +0 -0
  191. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_cli.py +0 -0
  192. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_colorbar_hover_highlight.py +0 -0
  193. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_command_reachability.py +0 -0
  194. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_config.py +0 -0
  195. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_cross_mode_parametrized.py +0 -0
  196. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_interactions.py +0 -0
  197. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_io.py +0 -0
  198. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_large_arrays.py +0 -0
  199. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_launch_plan.py +0 -0
  200. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_lifecycle_contract.py +0 -0
  201. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_loading_server.py +0 -0
  202. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_mode_consistency.py +0 -0
  203. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_mode_matrix.py +0 -0
  204. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_mode_roundtrip.py +0 -0
  205. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_nifti_meta.py +0 -0
  206. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_nifti_series.py +0 -0
  207. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_rgb_pixel_art.py +0 -0
  208. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_torch.py +0 -0
  209. {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_view_component_unit.py +0 -0
  210. {arrayview-0.28.0 → arrayview-0.29.0}/tests/ui_audit.py +0 -0
  211. {arrayview-0.28.0 → arrayview-0.29.0}/tests/v_anim_frames/.gitkeep +0 -0
  212. {arrayview-0.28.0 → arrayview-0.29.0}/tests/visual_smoke.py +0 -0
  213. {arrayview-0.28.0 → arrayview-0.29.0}/vscode-extension/AGENTS.md +0 -0
  214. {arrayview-0.28.0 → arrayview-0.29.0}/vscode-extension/LICENSE +0 -0
  215. {arrayview-0.28.0 → arrayview-0.29.0}/vscode-extension/lifecycle_helpers.js +0 -0
  216. {arrayview-0.28.0 → arrayview-0.29.0}/vscode-extension/test_lifecycle_helpers.js +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arrayview
3
- Version: 0.28.0
3
+ Version: 0.29.0
4
4
  Summary: Fast multi-dimensional array viewer
5
5
  Project-URL: Home, https://github.com/oscarvanderheide/arrayview
6
6
  Project-URL: Source, https://github.com/oscarvanderheide/arrayview
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "arrayview"
7
- version = "0.28.0"
7
+ version = "0.29.0"
8
8
  description = "Fast multi-dimensional array viewer"
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  requires-python = ">=3.12"
@@ -67,8 +67,10 @@ def _safe_float(v) -> float | None:
67
67
  return f if np.isfinite(f) else None
68
68
 
69
69
 
70
- def _histogram_payload(finite: np.ndarray, bins: int, log_bins: bool = False) -> dict:
70
+ def _histogram_payload(finite: np.ndarray, bins: int, log_bins: bool = False, exclude_zeros: bool = False) -> dict:
71
71
  """Build a histogram response from finite values."""
72
+ if exclude_zeros:
73
+ finite = finite[finite != 0]
72
74
  if finite.size == 0:
73
75
  return {"counts": [], "edges": [], "vmin": 0.0, "vmax": 1.0}
74
76
  vmin = float(finite.min())
@@ -172,6 +174,7 @@ def _volume_histogram(
172
174
  complex_mode: int = 0,
173
175
  bins: int = 64,
174
176
  qmri_role: str = "",
177
+ exclude_zeros: bool = False,
175
178
  ) -> dict:
176
179
  """Return a sampled volume histogram."""
177
180
  fixed = _parse_fixed_indices(fixed_indices)
@@ -189,6 +192,7 @@ def _volume_histogram(
189
192
  qmri_role,
190
193
  bins,
191
194
  log_bins,
195
+ exclude_zeros,
192
196
  )
193
197
  if not hasattr(session, "_volume_hist_cache"):
194
198
  session._volume_hist_cache = {}
@@ -234,7 +238,9 @@ def _volume_histogram(
234
238
  pixels.append(finite)
235
239
 
236
240
  if pixels:
237
- result = _histogram_payload(np.concatenate(pixels), bins, log_bins=log_bins)
241
+ result = _histogram_payload(
242
+ np.concatenate(pixels), bins, log_bins=log_bins, exclude_zeros=exclude_zeros
243
+ )
238
244
  else:
239
245
  result = {"counts": [], "edges": [], "vmin": 0.0, "vmax": 1.0}
240
246
  session._volume_hist_cache[cache_key] = {
@@ -1616,6 +1616,9 @@ _CLI_DAEMON_CONNECT_TIMEOUT_SECONDS = 20.0
1616
1616
  # closes. Keeping a warm idle daemon around caused native-window sessions to
1617
1617
  # appear orphaned after close.
1618
1618
  _CLI_DAEMON_IDLE_SECONDS = 0.0
1619
+ _PERSIST_DAEMON_IDLE_SECONDS = float(
1620
+ os.environ.get("ARRAYVIEW_PERSIST_IDLE_SECONDS", "1800")
1621
+ )
1619
1622
 
1620
1623
 
1621
1624
  def _join_query_values(values: _CSVValues) -> str:
@@ -2842,11 +2845,10 @@ def _serve_daemon(
2842
2845
  threading.Thread(target=_load, daemon=True).start()
2843
2846
 
2844
2847
  if persist:
2845
- try:
2846
- while True:
2847
- time.sleep(1)
2848
- except KeyboardInterrupt:
2849
- pass
2848
+ _wait_for_viewer_close(
2849
+ idle_seconds=_PERSIST_DAEMON_IDLE_SECONDS,
2850
+ connect_timeout=None,
2851
+ )
2850
2852
  else:
2851
2853
  # Transient CLI launches should stop as soon as the last viewer is
2852
2854
  # really gone, aside from the short grace period inside
@@ -465,6 +465,7 @@ def register_analysis_routes(app, get_session_or_404) -> None:
465
465
  complex_mode: int = 0,
466
466
  bins: int = 64,
467
467
  qmri_role: str = "",
468
+ exclude_zeros: int = 0,
468
469
  session=Depends(get_session_or_404),
469
470
  ):
470
471
  return _volume_histogram(
@@ -477,6 +478,7 @@ def register_analysis_routes(app, get_session_or_404) -> None:
477
478
  complex_mode,
478
479
  bins,
479
480
  qmri_role,
481
+ exclude_zeros=bool(exclude_zeros),
480
482
  )
481
483
 
482
484
  @app.get("/volume_data/{sid}")