PRs closed between 2026-09-09 and 2026-09-23: 25 merged, 3 closed without merging.
Merged
The npm publish allowlist is now derived from the typescript release group in nx.json, so @niivue/uikit gets published and nv-ohif becomes installable from npm. (@hanayik ) (fix(release): derive the npm publish allowlist from the nx.json release group #209 )
Scroll wheel and pinch now step the clip plane by a fixed notch, restoring the 0.6-series clip gestures that had regressed. (@neurolabusc ) (fix(niivue): wheel steps the clip plane by a fixed notch, as 0.6 did #208 )
New PEN_SHAPE enum and drawPenShape property add a circular pen for 2D drawing, eraser and slide raster paths. (@hanayik , carrying @MohannadEhabBarakat 's Add circular pen shape option and update drawing app tests #63 ) (feat(niivue): circular pen shape option #207 )
Follow-ups for per-axis crosshair colors: regenerated ipyniivue bindings, setter JSDoc for codegen, and an "Axis colors" checkbox demo. (@hanayik ) (chore(niivue): follow-ups for per-axis crosshair colors (#62) #206 )
Orthogonal slices added as a third 3D volume render mode, also fixing mirrored matcap shading and restoring smooth gradient normals. (@neurolabusc ) (feat(niivue): orthogonal slices as a third volume render mode #196 )
New chunkStreamIdle and chunkStreamProgress events tell hosts when a chunked volume has finished streaming, replacing polling. (@hanayik , carrying @stebo85 's feat(niivue): emit chunkStreamIdle when streaming settles #171 ) (feat(niivue): emit chunkStreamIdle when streaming settles #195 )
New CT colormaps with a live demo page that also shows running NiiVue in a web worker. (@neurolabusc ) (CT colormaps #194 )
Opt-in V hotkey cycles view modes, and hotkeys now only reach the viewer under the pointer and ignore text inputs. (@neurolabusc ) (feat(control): optional V hotkey to cycle the view; scope hotkeys to the viewer under the pointer #193 )
Ray-march shader is now specialized per draw with compile-time flags, bringing WebGL2 3D performance in line with 0.62. (@neurolabusc ) (perf(render): specialize the volume ray-march shader per draw #192 )
The devicePixelRatio constructor option now actually takes effect. (@neurolabusc ) (fix(niivue): honour the devicePixelRatio option #191 )
Regenerated ipyniivue Python bindings to pick up the new wheel zoom anchor, pan-follows-crosshair, and single-view fill options. (@cdrake ) (chore(ipyniivue): regenerate the transport artifacts #189 )
3D volume opacity now fades linearly by applying backOpacity once to the accumulated result instead of every sample. (@neurolabusc ) (fix(render): fade the background by its accumulated alpha, not per sample #187 )
Release preview comments now post from a workflow_run job so PRs from forks get them. (@cdrake ) (ci: post the release preview from a workflow_run so fork PRs get it #186 )
New public addMeasurement, removeMeasurement, getMeasurements and pickMeasurement methods plus a measurementRemoved event, so apps no longer reach into the model to drive measurements. (@stebo85 ) (feat(niivue): programmatic measurement add, remove, list and pick #172 )
Original chunk streaming idle/progress events PR, superseded and merged via feat(niivue): emit chunkStreamIdle when streaming settles #195 . (@stebo85 ) (feat(niivue): emit chunkStreamIdle when streaming settles #171 )
New public screen-space projection API (clientToCanvas and friends) so hosts can draw HTML/SVG overlays without reaching into internals. (@stebo85 ) (feat(niivue): screen-space projection API for external overlays #170 )
Opt-in isPanFollowingCrosshair keeps the crosshair visible when zoomed 2D views move it programmatically. (@stebo85 ) (feat(niivue): opt-in pan follows crosshair when zoomed #169 )
Multi-LOD focus generalized from an isotropic ball to per-axis radii and bounds-shaped reserve regions. (@stebo85 ) (feat(niivue): bounds-shaped and per-axis multi-LOD focus #168 )
Unlit chunked volumes use a 1x1x1 placeholder gradient texture, halving their resident GPU memory. (@stebo85 ) (fix(niivue): use a 1x1x1 placeholder gradient for unlit chunked volumes #167 )
Opt-in wheelZoomAnchor: 'pointer' zooms 2D slices about the mouse position, slide-viewer style. (@stebo85 ) (feat(niivue): optional pointer-anchored 2D wheel zoom #166 )
Custom layout tiles can opt in to fill: true to fill their pane instead of letterboxing. (@stebo85 ) (feat(niivue): let a custom layout tile fill its pane #165 )
NVChunkedVolume.refocus() and related setters now return promises that resolve when the plan swap is applied, plus whenRefocusIdle(). (@stebo85 ) (feat(niivue): resolve NVChunkedVolume refocus when the plan swap applies #164 )
SlideTileSource.fetchTileBytes accepts an AbortSignal so superseded whole-slide tile fetches are cancelled. (@stebo85 ) (feat(niivue): pass an AbortSignal to SlideTileSource.fetchTileBytes #163 )
New crosshairPan drag mode: click to place the crosshair, drag to pan, aimed at touch and trackpad users. (@stebo85 ) (feat(niivue): add crosshairPan drag mode #161 )
Opt-in crosshairColorPerAxis tints each crosshair segment by the world axis it extends along, in 2D tiles, the 3D view and mosaic cross lines on both backends. (@yosukey ) (feat(niivue): add per-axis crosshair colors #62 )
Closed without merging
Contributors
@neurolabusc , @stebo85 , @cdrake , @hanayik , @yosukey , @MohannadEhabBarakat , @disini
PRs closed between 2026-09-09 and 2026-09-23: 25 merged, 3 closed without merging.
Merged
typescriptrelease group innx.json, so@niivue/uikitgets published andnv-ohifbecomes installable from npm. (@hanayik) (fix(release): derive the npm publish allowlist from the nx.json release group #209)PEN_SHAPEenum anddrawPenShapeproperty add a circular pen for 2D drawing, eraser and slide raster paths. (@hanayik, carrying @MohannadEhabBarakat's Add circular pen shape option and update drawing app tests #63) (feat(niivue): circular pen shape option #207)chunkStreamIdleandchunkStreamProgressevents tell hosts when a chunked volume has finished streaming, replacing polling. (@hanayik, carrying @stebo85's feat(niivue): emit chunkStreamIdle when streaming settles #171) (feat(niivue): emit chunkStreamIdle when streaming settles #195)devicePixelRatioconstructor option now actually takes effect. (@neurolabusc) (fix(niivue): honour the devicePixelRatio option #191)backOpacityonce to the accumulated result instead of every sample. (@neurolabusc) (fix(render): fade the background by its accumulated alpha, not per sample #187)workflow_runjob so PRs from forks get them. (@cdrake) (ci: post the release preview from a workflow_run so fork PRs get it #186)addMeasurement,removeMeasurement,getMeasurementsandpickMeasurementmethods plus ameasurementRemovedevent, so apps no longer reach into the model to drive measurements. (@stebo85) (feat(niivue): programmatic measurement add, remove, list and pick #172)clientToCanvasand friends) so hosts can draw HTML/SVG overlays without reaching into internals. (@stebo85) (feat(niivue): screen-space projection API for external overlays #170)isPanFollowingCrosshairkeeps the crosshair visible when zoomed 2D views move it programmatically. (@stebo85) (feat(niivue): opt-in pan follows crosshair when zoomed #169)wheelZoomAnchor: 'pointer'zooms 2D slices about the mouse position, slide-viewer style. (@stebo85) (feat(niivue): optional pointer-anchored 2D wheel zoom #166)fill: trueto fill their pane instead of letterboxing. (@stebo85) (feat(niivue): let a custom layout tile fill its pane #165)NVChunkedVolume.refocus()and related setters now return promises that resolve when the plan swap is applied, pluswhenRefocusIdle(). (@stebo85) (feat(niivue): resolve NVChunkedVolume refocus when the plan swap applies #164)SlideTileSource.fetchTileBytesaccepts anAbortSignalso superseded whole-slide tile fetches are cancelled. (@stebo85) (feat(niivue): pass an AbortSignal to SlideTileSource.fetchTileBytes #163)crosshairPandrag mode: click to place the crosshair, drag to pan, aimed at touch and trackpad users. (@stebo85) (feat(niivue): add crosshairPan drag mode #161)crosshairColorPerAxistints each crosshair segment by the world axis it extends along, in 2D tiles, the 3D view and mosaic cross lines on both backends. (@yosukey) (feat(niivue): add per-axis crosshair colors #62)Closed without merging
Contributors
@neurolabusc, @stebo85, @cdrake, @hanayik, @yosukey, @MohannadEhabBarakat, @disini