arrayview 0.27.0__tar.gz → 0.27.2__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.27.0 → arrayview-0.27.2}/PKG-INFO +1 -1
  2. {arrayview-0.27.0 → arrayview-0.27.2}/docs/viewing.md +4 -0
  3. {arrayview-0.27.0 → arrayview-0.27.2}/pyproject.toml +1 -1
  4. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_routes_rendering.py +3 -0
  5. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_routes_websocket.py +3 -0
  6. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_stdio_server.py +3 -0
  7. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_synthetic_mri.py +18 -1
  8. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_viewer.html +806 -84
  9. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_api.py +55 -0
  10. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_view_component_integration.py +79 -0
  11. {arrayview-0.27.0 → arrayview-0.27.2}/tests/visual_smoke.py +11 -1
  12. {arrayview-0.27.0 → arrayview-0.27.2}/uv.lock +1 -1
  13. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/frontend-designer/SKILL.md +0 -0
  14. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/invocation-consistency/SKILL.md +0 -0
  15. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/modes-consistency/SKILL.md +0 -0
  16. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/playwright-cli/SKILL.md +0 -0
  17. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/playwright-cli/references/element-attributes.md +0 -0
  18. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/playwright-cli/references/playwright-tests.md +0 -0
  19. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/playwright-cli/references/request-mocking.md +0 -0
  20. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/playwright-cli/references/running-code.md +0 -0
  21. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/playwright-cli/references/session-management.md +0 -0
  22. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/playwright-cli/references/storage-state.md +0 -0
  23. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/playwright-cli/references/test-generation.md +0 -0
  24. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/playwright-cli/references/tracing.md +0 -0
  25. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/playwright-cli/references/video-recording.md +0 -0
  26. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/todo-workflow/SKILL.md +0 -0
  27. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/ui-consistency-audit/SKILL.md +0 -0
  28. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/viewer-ui-checklist/SKILL.md +0 -0
  29. {arrayview-0.27.0 → arrayview-0.27.2}/.agents/skills/visual-bug-fixing/SKILL.md +0 -0
  30. {arrayview-0.27.0 → arrayview-0.27.2}/.github/copilot-instructions.md +0 -0
  31. {arrayview-0.27.0 → arrayview-0.27.2}/.github/workflows/docs.yml +0 -0
  32. {arrayview-0.27.0 → arrayview-0.27.2}/.github/workflows/python-publish.yml +0 -0
  33. {arrayview-0.27.0 → arrayview-0.27.2}/.gitignore +0 -0
  34. {arrayview-0.27.0 → arrayview-0.27.2}/.ignore +0 -0
  35. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/AGENTS.md +0 -0
  36. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/ROUTER.md +0 -0
  37. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/SETUP.md +0 -0
  38. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/SYNC.md +0 -0
  39. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/context/architecture.md +0 -0
  40. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/context/conventions.md +0 -0
  41. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/context/decisions.md +0 -0
  42. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/context/frontend.md +0 -0
  43. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/context/lifecycle.md +0 -0
  44. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/context/project-state.md +0 -0
  45. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/context/render-pipeline.md +0 -0
  46. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/context/setup.md +0 -0
  47. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/context/stack.md +0 -0
  48. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/patterns/INDEX.md +0 -0
  49. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/patterns/README.md +0 -0
  50. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/patterns/add-file-format.md +0 -0
  51. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/patterns/add-server-endpoint.md +0 -0
  52. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/patterns/animation-verify.md +0 -0
  53. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/patterns/debug-render.md +0 -0
  54. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/patterns/debug-vscode-extension-python.md +0 -0
  55. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/patterns/extend-compare-mode.md +0 -0
  56. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/patterns/extract-server-route-module.md +0 -0
  57. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/patterns/frontend-change.md +0 -0
  58. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/setup.sh +0 -0
  59. {arrayview-0.27.0 → arrayview-0.27.2}/.mex/sync.sh +0 -0
  60. {arrayview-0.27.0 → arrayview-0.27.2}/.opencode/opencode.json +0 -0
  61. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T18-46-49-737Z.yml +0 -0
  62. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T18-48-21-979Z.yml +0 -0
  63. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T18-51-35-665Z.yml +0 -0
  64. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T19-07-01-393Z.yml +0 -0
  65. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T19-14-37-969Z.yml +0 -0
  66. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T19-21-30-940Z.yml +0 -0
  67. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T19-23-08-126Z.yml +0 -0
  68. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T19-29-33-155Z.yml +0 -0
  69. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T19-31-25-336Z.yml +0 -0
  70. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T19-31-53-789Z.yml +0 -0
  71. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T19-39-12-257Z.yml +0 -0
  72. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T19-39-16-449Z.yml +0 -0
  73. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T20-15-25-513Z.yml +0 -0
  74. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T20-25-13-179Z.yml +0 -0
  75. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T20-39-01-435Z.yml +0 -0
  76. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T21-01-27-659Z.yml +0 -0
  77. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T21-01-41-283Z.yml +0 -0
  78. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T21-03-00-625Z.yml +0 -0
  79. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T21-04-12-887Z.yml +0 -0
  80. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T21-33-39-044Z.yml +0 -0
  81. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T21-38-01-530Z.yml +0 -0
  82. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T21-45-20-383Z.yml +0 -0
  83. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T21-55-11-545Z.yml +0 -0
  84. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T21-56-03-307Z.yml +0 -0
  85. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T21-56-35-733Z.yml +0 -0
  86. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T21-57-12-181Z.yml +0 -0
  87. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T21-57-37-748Z.yml +0 -0
  88. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T21-58-13-679Z.yml +0 -0
  89. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-06T22-37-23-895Z.yml +0 -0
  90. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T00-39-18-637Z.yml +0 -0
  91. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T01-41-46-243Z.yml +0 -0
  92. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T04-31-48-472Z.yml +0 -0
  93. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-14-15-632Z.yml +0 -0
  94. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-14-47-582Z.yml +0 -0
  95. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-16-23-471Z.yml +0 -0
  96. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-17-10-247Z.yml +0 -0
  97. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-18-24-707Z.yml +0 -0
  98. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-20-06-164Z.yml +0 -0
  99. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-20-28-342Z.yml +0 -0
  100. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-21-54-962Z.yml +0 -0
  101. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-22-34-666Z.yml +0 -0
  102. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-23-11-336Z.yml +0 -0
  103. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-23-36-260Z.yml +0 -0
  104. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-24-09-267Z.yml +0 -0
  105. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-24-35-434Z.yml +0 -0
  106. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-25-57-010Z.yml +0 -0
  107. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-34-48-823Z.yml +0 -0
  108. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-46-46-468Z.yml +0 -0
  109. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-48-17-930Z.yml +0 -0
  110. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-49-26-400Z.yml +0 -0
  111. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-50-31-563Z.yml +0 -0
  112. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/page-2026-05-07T12-56-45-568Z.yml +0 -0
  113. {arrayview-0.27.0 → arrayview-0.27.2}/.playwright-cli/theme-dark.yml +0 -0
  114. {arrayview-0.27.0 → arrayview-0.27.2}/.python-version +0 -0
  115. {arrayview-0.27.0 → arrayview-0.27.2}/.vscode/settings.json +0 -0
  116. {arrayview-0.27.0 → arrayview-0.27.2}/AGENTS.md +0 -0
  117. {arrayview-0.27.0 → arrayview-0.27.2}/CONTRIBUTING.md +0 -0
  118. {arrayview-0.27.0 → arrayview-0.27.2}/DESIGN.md +0 -0
  119. {arrayview-0.27.0 → arrayview-0.27.2}/LICENSE +0 -0
  120. {arrayview-0.27.0 → arrayview-0.27.2}/README.md +0 -0
  121. {arrayview-0.27.0 → arrayview-0.27.2}/docs/comparing.md +0 -0
  122. {arrayview-0.27.0 → arrayview-0.27.2}/docs/configuration.md +0 -0
  123. {arrayview-0.27.0 → arrayview-0.27.2}/docs/display.md +0 -0
  124. {arrayview-0.27.0 → arrayview-0.27.2}/docs/index.md +0 -0
  125. {arrayview-0.27.0 → arrayview-0.27.2}/docs/launch-routing-refactor.md +0 -0
  126. {arrayview-0.27.0 → arrayview-0.27.2}/docs/lifecycle.md +0 -0
  127. {arrayview-0.27.0 → arrayview-0.27.2}/docs/loading.md +0 -0
  128. {arrayview-0.27.0 → arrayview-0.27.2}/docs/logo.png +0 -0
  129. {arrayview-0.27.0 → arrayview-0.27.2}/docs/measurement.md +0 -0
  130. {arrayview-0.27.0 → arrayview-0.27.2}/docs/remote.md +0 -0
  131. {arrayview-0.27.0 → arrayview-0.27.2}/docs/stylesheets/extra.css +0 -0
  132. {arrayview-0.27.0 → arrayview-0.27.2}/matlab/arrayview.m +0 -0
  133. {arrayview-0.27.0 → arrayview-0.27.2}/mkdocs.yml +0 -0
  134. {arrayview-0.27.0 → arrayview-0.27.2}/plans/2026-04-14-immersive-animation.md +0 -0
  135. {arrayview-0.27.0 → arrayview-0.27.2}/plans/2026-05-07-unified-colormap-picker.md +0 -0
  136. {arrayview-0.27.0 → arrayview-0.27.2}/plans/arrayview_tool_menu_fix_prompt.md +0 -0
  137. {arrayview-0.27.0 → arrayview-0.27.2}/plans/arrayview_tool_menu_implementation_plan.md +0 -0
  138. {arrayview-0.27.0 → arrayview-0.27.2}/plans/egg-placement-mockup.html +0 -0
  139. {arrayview-0.27.0 → arrayview-0.27.2}/plans/refactoring_plan.md +0 -0
  140. {arrayview-0.27.0 → arrayview-0.27.2}/plans/roi-analysis-requirements.md +0 -0
  141. {arrayview-0.27.0 → arrayview-0.27.2}/plans/webview/LOG.md +0 -0
  142. {arrayview-0.27.0 → arrayview-0.27.2}/scripts/demo.py +0 -0
  143. {arrayview-0.27.0 → arrayview-0.27.2}/scripts/release.sh +0 -0
  144. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/ARCHITECTURE.md +0 -0
  145. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/__init__.py +0 -0
  146. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/__main__.py +0 -0
  147. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_analysis.py +0 -0
  148. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_app.py +0 -0
  149. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_codex_open.py +0 -0
  150. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_config.py +0 -0
  151. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_diff.py +0 -0
  152. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_icon.png +0 -0
  153. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_imaging.py +0 -0
  154. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_io.py +0 -0
  155. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_launch_plan.py +0 -0
  156. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_launcher.py +0 -0
  157. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_lifecycle.py +0 -0
  158. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_overlays.py +0 -0
  159. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_platform.py +0 -0
  160. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_render.py +0 -0
  161. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_routes_analysis.py +0 -0
  162. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_routes_export.py +0 -0
  163. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_routes_loading.py +0 -0
  164. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_routes_persistence.py +0 -0
  165. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_routes_preload.py +0 -0
  166. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_routes_query.py +0 -0
  167. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_routes_segmentation.py +0 -0
  168. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_routes_state.py +0 -0
  169. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_routes_vectorfield.py +0 -0
  170. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_segmentation.py +0 -0
  171. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_server.py +0 -0
  172. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_session.py +0 -0
  173. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_shell.html +0 -0
  174. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_torch.py +0 -0
  175. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_vectorfield.py +0 -0
  176. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_vscode.py +0 -0
  177. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_vscode_browser.py +0 -0
  178. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_vscode_extension.py +0 -0
  179. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_vscode_shm.py +0 -0
  180. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/_vscode_signal.py +0 -0
  181. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/arrayview-opener.vsix +0 -0
  182. {arrayview-0.27.0 → arrayview-0.27.2}/src/arrayview/gsap.min.js +0 -0
  183. {arrayview-0.27.0 → arrayview-0.27.2}/tests/capture_v_animation.py +0 -0
  184. {arrayview-0.27.0 → arrayview-0.27.2}/tests/conftest.py +0 -0
  185. {arrayview-0.27.0 → arrayview-0.27.2}/tests/lifecycle_matrix.py +0 -0
  186. {arrayview-0.27.0 → arrayview-0.27.2}/tests/make_vectorfield_test_arrays.py +0 -0
  187. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_backend_shared.py +0 -0
  188. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_browser.py +0 -0
  189. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_cli.py +0 -0
  190. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_colorbar_hover_highlight.py +0 -0
  191. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_command_reachability.py +0 -0
  192. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_config.py +0 -0
  193. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_cross_mode_parametrized.py +0 -0
  194. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_interactions.py +0 -0
  195. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_io.py +0 -0
  196. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_large_arrays.py +0 -0
  197. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_launch_plan.py +0 -0
  198. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_lifecycle_contract.py +0 -0
  199. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_loading_server.py +0 -0
  200. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_mode_consistency.py +0 -0
  201. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_mode_entry_batching.py +0 -0
  202. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_mode_matrix.py +0 -0
  203. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_mode_roundtrip.py +0 -0
  204. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_nifti_meta.py +0 -0
  205. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_rgb_pixel_art.py +0 -0
  206. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_stdio_server.py +0 -0
  207. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_torch.py +0 -0
  208. {arrayview-0.27.0 → arrayview-0.27.2}/tests/test_view_component_unit.py +0 -0
  209. {arrayview-0.27.0 → arrayview-0.27.2}/tests/ui_audit.py +0 -0
  210. {arrayview-0.27.0 → arrayview-0.27.2}/tests/v_anim_frames/.gitkeep +0 -0
  211. {arrayview-0.27.0 → arrayview-0.27.2}/vscode-extension/AGENTS.md +0 -0
  212. {arrayview-0.27.0 → arrayview-0.27.2}/vscode-extension/LICENSE +0 -0
  213. {arrayview-0.27.0 → arrayview-0.27.2}/vscode-extension/extension.js +0 -0
  214. {arrayview-0.27.0 → arrayview-0.27.2}/vscode-extension/lifecycle_helpers.js +0 -0
  215. {arrayview-0.27.0 → arrayview-0.27.2}/vscode-extension/package.json +0 -0
  216. {arrayview-0.27.0 → arrayview-0.27.2}/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.27.0
3
+ Version: 0.27.2
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
@@ -38,6 +38,10 @@ Rendered as direct color via `--rgb` on the CLI or `rgb=True` in Python. The fir
38
38
 
39
39
  `m` — cycles through magnitude, phase, real, and imaginary parts for complex-valued arrays.
40
40
 
41
+ ## qMRI
42
+
43
+ `q` — opens qMRI for a parameter dimension. Hold Alt/Option while qMRI is active to choose quantitative parameters and synthesised contrasts. Synthetic contrasts show TE/TR/TI sliders below each pane when available.
44
+
41
45
  ## Navigation
42
46
 
43
47
  Scroll through slices. `/` opens the tool launcher for ortho, compare, qMRI, ROI, segmentation, FFT, projections, and overlays. The direct keys still work. `0` resets the zoom. `?` shows the full key guide.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "arrayview"
7
- version = "0.27.0"
7
+ version = "0.27.2"
8
8
  description = "Fast multi-dimensional array viewer"
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  requires-python = ">=3.12"
@@ -25,6 +25,7 @@ from arrayview._render import (
25
25
  )
26
26
  from arrayview._session import HEAVY_OP_LIMIT_BYTES, SESSIONS
27
27
  from arrayview._synthetic_mri import (
28
+ _qmri_adjust_vmin_vmax,
28
29
  qmri_display_slice,
29
30
  render_qmri_mosaic_rgba,
30
31
  synthetic_qmri_slice,
@@ -256,6 +257,8 @@ def register_rendering_routes(app, *, get_session_or_404) -> None:
256
257
  vmin_override=vmin_override,
257
258
  vmax_override=vmax_override,
258
259
  )
260
+ if qmri_role:
261
+ vmin, vmax = _qmri_adjust_vmin_vmax(vmin, vmax, qmri_role)
259
262
  render_ms = (time.perf_counter() - render_t0) * 1000.0
260
263
  encode_t0 = time.perf_counter()
261
264
  img = _pil_image().fromarray(rgba[:, :, :3], mode="RGB")
@@ -31,6 +31,7 @@ from arrayview._session import (
31
31
  )
32
32
  from arrayview._vectorfield import _compute_vfield_arrows
33
33
  from arrayview._synthetic_mri import (
34
+ _qmri_adjust_vmin_vmax,
34
35
  qmri_display_slice,
35
36
  render_qmri_mosaic_rgba,
36
37
  synthetic_qmri_slice,
@@ -319,6 +320,8 @@ def register_websocket_routes(app) -> None:
319
320
  vmin_override=vmin_override,
320
321
  vmax_override=vmax_override,
321
322
  )
323
+ if qmri_role:
324
+ vmin, vmax = _qmri_adjust_vmin_vmax(vmin, vmax, qmri_role)
322
325
 
323
326
  overlay_sid = msg.get("overlay_sid")
324
327
  overlay_colors = msg.get("overlay_colors")
@@ -52,6 +52,7 @@ from arrayview._render import (
52
52
  )
53
53
  from arrayview._session import SESSIONS, Session
54
54
  from arrayview._synthetic_mri import (
55
+ _qmri_adjust_vmin_vmax,
55
56
  qmri_display_slice,
56
57
  render_qmri_mosaic_rgba,
57
58
  synthetic_qmri_slice,
@@ -638,6 +639,8 @@ def _build_slice_payload(msg: dict) -> bytes:
638
639
  session, raw, complex_mode, dr, log_scale,
639
640
  vmin_override=vmin_override, vmax_override=vmax_override,
640
641
  )
642
+ if qmri_role:
643
+ vmin, vmax = _qmri_adjust_vmin_vmax(vmin, vmax, qmri_role)
641
644
 
642
645
  # Overlay compositing
643
646
  overlay_sid = msg.get("overlay_sid")
@@ -48,7 +48,8 @@ def normalize_relaxation_ms(data: np.ndarray, role: str | None = None) -> np.nda
48
48
  if finite.size == 0:
49
49
  return arr
50
50
  central = float(np.nanmedian(finite))
51
- if 0.0 < central <= 5.0:
51
+ seconds_threshold = 10.0 if role == "t1" else 5.0
52
+ if 0.0 < central <= seconds_threshold:
52
53
  return (arr * np.float32(1000.0)).astype(np.float32)
53
54
  return arr
54
55
 
@@ -145,6 +146,21 @@ def synthetic_window(data: np.ndarray, contrast: str) -> tuple[float, float]:
145
146
  return vmin, vmax
146
147
 
147
148
 
149
+ def _qmri_adjust_vmin_vmax(vmin: float, vmax: float, role: str) -> tuple[float, float]:
150
+ """Adjust vmin/vmax for display according to qMRI role conventions."""
151
+ if not role:
152
+ return vmin, vmax
153
+ if role in ("t1", "t2"):
154
+ return 0.0, float(int(np.ceil(vmax)))
155
+ if role == "pd":
156
+ return 0.0, vmax
157
+ if role == "b1":
158
+ return round(float(vmin), 2), round(float(vmax), 2)
159
+ if role == "phase":
160
+ return -3.14, 3.14
161
+ return vmin, vmax
162
+
163
+
148
164
  def render_qmri_mosaic_rgba(
149
165
  session,
150
166
  dim_x: int,
@@ -174,6 +190,7 @@ def render_qmri_mosaic_rgba(
174
190
  else:
175
191
  vmin = float(np.percentile(all_data, 1))
176
192
  vmax = float(np.percentile(all_data, 99))
193
+ vmin, vmax = _qmri_adjust_vmin_vmax(vmin, vmax, role)
177
194
  grid, _, _ = _build_mosaic_grid(
178
195
  all_data, session.shape[dim_z], cols=mosaic_cols
179
196
  ) if mosaic_cols is not None else _build_mosaic_grid(all_data, session.shape[dim_z])