@ohif/app 3.13.0-beta.121 → 3.13.0-beta.123

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 (48) hide show
  1. package/dist/{1206.bundle.e04ca1efe6f987ba.js → 1206.bundle.8ca95ea92d278d25.js} +1 -1
  2. package/dist/{1602.bundle.4b753c5f05c22071.js → 1602.bundle.adc9c42f3f0cee10.js} +4 -4
  3. package/dist/{2493.bundle.f3b6a64d158365da.js → 2493.bundle.d16ea70ddcc1fb6b.js} +68 -12
  4. package/dist/{7231.bundle.1063d727ad99108a.js → 2623.bundle.983a376f7b7e86a5.js} +142 -33
  5. package/dist/{3330.bundle.b1297ef8c94e5440.js → 3330.bundle.1b8bc8f7c4071336.js} +46 -2
  6. package/dist/{3500.bundle.ba1a8fe6005447be.js → 3500.bundle.642aa0112968cf71.js} +1 -1
  7. package/dist/{3568.bundle.45dc681ef6890166.js → 3568.bundle.9aa4b4b27294ff6d.js} +41 -10
  8. package/dist/{3760.bundle.cfe49d20e6a29953.js → 3760.bundle.5e5d19b9f8d56cae.js} +4 -4
  9. package/dist/{5189.bundle.ea191ea99047fd6f.js → 5189.bundle.fc73612f2e198892.js} +2 -2
  10. package/dist/{5448.bundle.5686ebb99c379f64.js → 5448.bundle.316b091e38440aef.js} +1 -1
  11. package/dist/{5910.bundle.0f19608f3e76859b.js → 5910.bundle.d9cbcbb62ddd6638.js} +2 -2
  12. package/dist/{6495.bundle.a6764fdb8c0c252f.js → 6495.bundle.5ad5a10d2c9dcba1.js} +48 -3
  13. package/dist/{7248.bundle.5adba26c3591ab03.js → 7248.bundle.1b52f19fbd2bbc40.js} +28 -10
  14. package/dist/{7499.bundle.1b824fb1c3d9938b.js → 7499.bundle.e958878c66174ab0.js} +74 -29
  15. package/dist/{781.bundle.8317fbb14b5fc160.js → 781.bundle.f6fa3ab2b8ec22a5.js} +106 -47
  16. package/dist/{8423.bundle.884545a446ec1b71.js → 8423.bundle.d9be5db38ca5b9cd.js} +2 -2
  17. package/dist/{5642.bundle.98e17a4413db6ef1.js → 8478.bundle.163d258bf75a0aed.js} +32847 -7919
  18. package/dist/{8668.bundle.0e47f7231aa07da2.js → 8668.bundle.e254939790f776e2.js} +44 -0
  19. package/dist/{8832.bundle.7e4d2e03edaf6125.js → 8832.bundle.62e66fad140b5182.js} +3 -3
  20. package/dist/{2343.bundle.6bb1c41a0c23c387.js → 89.bundle.fe29d1712fd47341.js} +16340 -1013
  21. package/dist/{899.bundle.50c16f860acbc848.js → 899.bundle.b012ed530e343897.js} +2 -2
  22. package/dist/{9068.bundle.95f1e638ef694ea9.js → 9068.bundle.13173c70d4f33cf0.js} +2 -2
  23. package/dist/{9415.bundle.8ae772df11b43623.js → 9415.bundle.3044caa6fbf3e331.js} +2 -2
  24. package/dist/app-config.js +16 -0
  25. package/dist/{app.bundle.19807b66b97eef1c.js → app.bundle.ce26bd25f1b2d6eb.js} +297 -44
  26. package/dist/{compute.bundle.9cc3697d07fbb082.js → compute.bundle.690de60973ccebc4.js} +1 -1
  27. package/dist/index.html +1 -1
  28. package/dist/{polySeg.bundle.a526954fc2fed311.js → polySeg.bundle.369c7996934b22e3.js} +1 -1
  29. package/dist/sw.js +1 -1
  30. package/package.json +6 -6
  31. package/dist/8432.bundle.7d5ebe1ed1610bc3.js +0 -24931
  32. package/dist/8595.css +0 -2
  33. package/dist/9402.bundle.e566ac372cd263ab.js +0 -13041
  34. /package/dist/{100.bundle.18576d13e84cf65d.js → 100.bundle.a747be7c54b03050.js} +0 -0
  35. /package/dist/{1180.bundle.71384bae9915f7ef.js → 1180.bundle.12decb70e347ab18.js} +0 -0
  36. /package/dist/{1483.bundle.0856e89556f39a44.js → 1483.bundle.5d7cb3b2c8339993.js} +0 -0
  37. /package/dist/{7231.css → 2623.css} +0 -0
  38. /package/dist/{2779.bundle.c9e19f9d340f49dd.js → 2779.bundle.50f6254deda46e49.js} +0 -0
  39. /package/dist/{4556.bundle.c21eb013145d11cb.js → 4556.bundle.1ea04fd48fc5d2ca.js} +0 -0
  40. /package/dist/{4683.bundle.00b9ec64ffdac536.js → 4683.bundle.b560312b5eebd925.js} +0 -0
  41. /package/dist/{5696.bundle.1166a7d20afd2ec1.js → 5696.bundle.78c7e21c71846f7b.js} +0 -0
  42. /package/dist/{6749.bundle.46d07e206a29a04c.js → 6749.bundle.87258a158729e73d.js} +0 -0
  43. /package/dist/{8492.bundle.b2d1f0d9d97eeb99.js → 8492.bundle.1dbc1691c7db0e87.js} +0 -0
  44. /package/dist/{9116.bundle.b5fe63fa3d55bd70.js → 9116.bundle.3173fbc0a9246402.js} +0 -0
  45. /package/dist/{9290.bundle.e11c9ec528de238f.js → 9290.bundle.e84eec85a00eb7a1.js} +0 -0
  46. /package/dist/{9383.bundle.ec44c452ccc23e93.js → 9383.bundle.885123e100c1b477.js} +0 -0
  47. /package/dist/{9437.bundle.e32fbfe63bfc0e72.js → 9437.bundle.dabd58171e5f91e9.js} +0 -0
  48. /package/dist/{9560.bundle.517f0ef7ee3a20bf.js → 9560.bundle.4c9bc48e09c0bae1.js} +0 -0
@@ -9,7 +9,7 @@ __webpack_require__.d(__webpack_exports__, {
9
9
  /* import */ var prop_types__rspack_import_1 = __webpack_require__(97598);
10
10
  /* import */ var prop_types__rspack_import_1_default = /*#__PURE__*/__webpack_require__.n(prop_types__rspack_import_1);
11
11
  /* import */ var _ohif_ui_next__rspack_import_2 = __webpack_require__(39987);
12
- /* import */ var _ohif_extension_cornerstone__rspack_import_3 = __webpack_require__(86714);
12
+ /* import */ var _ohif_extension_cornerstone__rspack_import_3 = __webpack_require__(75609);
13
13
  /* import */ var _cornerstonejs_tools__rspack_import_4 = __webpack_require__(55526);
14
14
  /* import */ var _getContextModule__rspack_import_5 = __webpack_require__(28835);
15
15
  /* import */ var _cornerstonejs_core__rspack_import_6 = __webpack_require__(88479);
@@ -1114,10 +1114,10 @@ function WorkflowPanel({
1114
1114
 
1115
1115
 
1116
1116
 
1117
- // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 147 modules
1118
- var default_src = __webpack_require__(7825);
1119
- // EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 200 modules
1120
- var cornerstone_src = __webpack_require__(86714);
1117
+ // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 148 modules
1118
+ var default_src = __webpack_require__(50904);
1119
+ // EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 211 modules
1120
+ var cornerstone_src = __webpack_require__(75609);
1121
1121
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dynamic-volume/src/panels/DynamicExport.tsx
1122
1122
 
1123
1123
 
@@ -34559,11 +34559,24 @@ class DefaultPlanarDataProvider {
34559
34559
  const imageIds = imageVolume.imageIds
34560
34560
  ? imageVolume.imageIds
34561
34561
  : dataSet.imageIds;
34562
+ let volumeInitialImageIdIndex = initialImageIdIndex;
34563
+ if (initialImageIdIndex !== undefined && imageIds !== dataSet.imageIds) {
34564
+ const requestedImageId = dataSet.imageIds[initialImageIdIndex];
34565
+ const remappedIndex = imageIds.indexOf(requestedImageId);
34566
+ if (remappedIndex >= 0) {
34567
+ volumeInitialImageIdIndex = remappedIndex;
34568
+ }
34569
+ else {
34570
+ console.warn(`[PlanarViewport] initialImageIdIndex remap failed: imageId ` +
34571
+ `"${requestedImageId}" not found in the volume imageIds; ` +
34572
+ `using the original index ${initialImageIdIndex}`);
34573
+ }
34574
+ }
34562
34575
  return {
34563
34576
  id: dataId,
34564
34577
  type: 'image',
34565
34578
  imageIds,
34566
- initialImageIdIndex,
34579
+ initialImageIdIndex: volumeInitialImageIdIndex,
34567
34580
  acquisitionOrientation: options.acquisitionOrientation,
34568
34581
  imageData: dataSet.imageData,
34569
34582
  imageVolume,
@@ -38838,6 +38851,7 @@ function getPlanarResolvedViewForReference(args) {
38838
38851
 
38839
38852
 
38840
38853
 
38854
+
38841
38855
  class PlanarViewReferenceController {
38842
38856
  constructor(host) {
38843
38857
  this.host = host;
@@ -39086,7 +39100,7 @@ class PlanarViewReferenceController {
39086
39100
  const effectiveViewPlaneNormal = refViewPlaneNormal ?? currentViewPlaneNormal;
39087
39101
  const isOppositeNormal = !shouldReorient &&
39088
39102
  this.areNormalsOpposite(currentViewPlaneNormal, effectiveViewPlaneNormal);
39089
- const nextImageIdIndex = this.resolveVolumeReferenceImageIdIndex(referenceContext, normalizedViewRef, effectiveViewPlaneNormal, isOppositeNormal);
39103
+ const sliceTarget = this.resolveVolumeReferenceSliceTarget(referenceContext, normalizedViewRef, effectiveViewPlaneNormal, isOppositeNormal);
39090
39104
  const viewStatePatch = {};
39091
39105
  if (shouldReorient && refViewPlaneNormal) {
39092
39106
  viewStatePatch.orientation = {
@@ -39099,8 +39113,9 @@ class PlanarViewReferenceController {
39099
39113
  };
39100
39114
  }
39101
39115
  const sliceWorldPoint = normalizedViewRef.cameraFocalPoint ??
39102
- (typeof nextImageIdIndex === 'number'
39103
- ? this.host.getVolumeSliceWorldPointForImageIdIndex(nextImageIdIndex)
39116
+ sliceTarget?.sliceWorldPoint ??
39117
+ (typeof sliceTarget?.imageIdIndex === 'number'
39118
+ ? this.host.getVolumeSliceWorldPointForImageIdIndex(sliceTarget.imageIdIndex)
39104
39119
  : undefined);
39105
39120
  if (sliceWorldPoint) {
39106
39121
  viewStatePatch.slice = {
@@ -39178,7 +39193,7 @@ class PlanarViewReferenceController {
39178
39193
  (!planeRestriction.inPlaneVector2 ||
39179
39194
  (0,utilities_isEqual/* ["default"] */.Ay)(0, esm/* .vec3.dot */.eR.Om(viewPlaneNormal, planeRestriction.inPlaneVector2))));
39180
39195
  }
39181
- resolveVolumeReferenceImageIdIndex(referenceContext, viewRef, effectiveViewPlaneNormal, isOppositeNormal) {
39196
+ resolveVolumeReferenceSliceTarget(referenceContext, viewRef, effectiveViewPlaneNormal, isOppositeNormal) {
39182
39197
  const { rendering } = referenceContext;
39183
39198
  if (rendering.renderMode !== types/* .ActorRenderMode.CPU_VOLUME */.T.CPU_VOLUME &&
39184
39199
  rendering.renderMode !== types/* .ActorRenderMode.VTK_VOLUME_SLICE */.T.VTK_VOLUME_SLICE) {
@@ -39192,21 +39207,35 @@ class PlanarViewReferenceController {
39192
39207
  const targetSliceIndex = isOppositeNormal
39193
39208
  ? maxImageIdIndex - viewRef.sliceIndex
39194
39209
  : viewRef.sliceIndex;
39195
- return Math.min(Math.max(0, targetSliceIndex), maxImageIdIndex);
39210
+ return {
39211
+ imageIdIndex: Math.min(Math.max(0, targetSliceIndex), maxImageIdIndex),
39212
+ };
39196
39213
  }
39197
39214
  const referencedImageIndex = this.findImageIdIndexByReference(imageIds, viewRef.referencedImageId, viewRef.referencedImageURI);
39198
39215
  if (typeof referencedImageIndex === 'number') {
39199
- return referencedImageIndex;
39216
+ return this.toVolumeSliceTarget(rendering.imageVolume, referencedImageIndex);
39200
39217
  }
39201
39218
  const targetPoint = viewRef.cameraFocalPoint ?? viewRef.planeRestriction?.point;
39202
39219
  if (targetPoint) {
39203
39220
  const referencedImageId = (0,getClosestImageId/* ["default"] */.A)(rendering.imageVolume, targetPoint, effectiveViewPlaneNormal);
39204
- return this.findImageIdIndexByReference(imageIds, referencedImageId);
39221
+ const closestImageIndex = this.findImageIdIndexByReference(imageIds, referencedImageId);
39222
+ if (typeof closestImageIndex === 'number') {
39223
+ return this.toVolumeSliceTarget(rendering.imageVolume, closestImageIndex);
39224
+ }
39225
+ return;
39205
39226
  }
39206
39227
  if (typeof viewRef.sliceIndex === 'number') {
39207
- return Math.min(Math.max(0, viewRef.sliceIndex), maxImageIdIndex);
39228
+ return {
39229
+ imageIdIndex: Math.min(Math.max(0, viewRef.sliceIndex), maxImageIdIndex),
39230
+ };
39208
39231
  }
39209
39232
  }
39233
+ toVolumeSliceTarget(imageVolume, imageIdListIndex) {
39234
+ const sliceWorldPoint = (0,planarSliceBasis/* .getVolumeImageIdIndexWorldPoint */.xH)(imageVolume, imageIdListIndex);
39235
+ return sliceWorldPoint
39236
+ ? { sliceWorldPoint }
39237
+ : { imageIdIndex: imageIdListIndex };
39238
+ }
39210
39239
  getImageIdsForReferenceContext(referenceContext) {
39211
39240
  return (referenceContext.data.imageVolume?.imageIds ||
39212
39241
  referenceContext.data.imageIds);
@@ -40309,6 +40338,15 @@ class PlanarViewport extends GenericViewport/* ["default"] */.A {
40309
40338
  const initialImageIdIndex = orientation === enums.OrientationAxis.ACQUISITION
40310
40339
  ? planarData.initialImageIdIndex
40311
40340
  : undefined;
40341
+ if (typeof initialImageIdIndex === 'number') {
40342
+ const sliceWorldPoint = (0,planarSliceBasis/* .getVolumeImageIdIndexWorldPoint */.xH)(planarData.imageVolume, initialImageIdIndex);
40343
+ if (sliceWorldPoint) {
40344
+ return {
40345
+ kind: 'volumePoint',
40346
+ sliceWorldPoint,
40347
+ };
40348
+ }
40349
+ }
40312
40350
  const { sliceBasis } = createSliceBasis({
40313
40351
  canvasHeight: height,
40314
40352
  canvasWidth: width,
@@ -41861,6 +41899,7 @@ __webpack_require__.d(__webpack_exports__, {
41861
41899
  vu: () => (/* binding */ createPlanarCpuVolumeSliceBasis),
41862
41900
  IY: () => (/* binding */ createPlanarImageSliceBasis),
41863
41901
  P8: () => (/* binding */ createPlanarVolumeSliceBasis),
41902
+ xH: () => (/* binding */ getVolumeImageIdIndexWorldPoint),
41864
41903
  Dn: () => (/* binding */ resolvePlanarVolumeImageIdIndex),
41865
41904
  LK: () => (/* binding */ shouldUsePlanarCpuVolumeSliceBasis)
41866
41905
  });
@@ -42068,6 +42107,23 @@ function getGeometricImageVolumeCenter(imageVolume, viewPlaneNormal) {
42068
42107
  }
42069
42108
  return esm/* .vec3.scale */.eR.hs(center, center, 1 / corners.length);
42070
42109
  }
42110
+ function getVolumeImageIdIndexWorldPoint(imageVolume, imageIdIndex) {
42111
+ const imageData = imageVolume?.imageData;
42112
+ if (!imageData) {
42113
+ return;
42114
+ }
42115
+ const dimensions = imageData.getDimensions();
42116
+ const flatToGroupLocal = imageVolume.flatImageIdIndexToImageIdIndex;
42117
+ const groupLocalIndex = typeof flatToGroupLocal === 'function'
42118
+ ? flatToGroupLocal.call(imageVolume, Math.max(0, imageIdIndex))
42119
+ : imageIdIndex;
42120
+ const k = Math.min(Math.max(0, groupLocalIndex), dimensions[2] - 1);
42121
+ return imageData.indexToWorld([
42122
+ (dimensions[0] - 1) / 2,
42123
+ (dimensions[1] - 1) / 2,
42124
+ k,
42125
+ ]);
42126
+ }
42071
42127
  function getSliceMetrics(args) {
42072
42128
  const { imageVolume, viewPlaneNormal } = args;
42073
42129
  const corners = buildImageVolumeCorners(imageVolume);
@@ -81342,7 +81398,7 @@ function worldToImageCoords(imageId, worldCoords) {
81342
81398
  },
81343
81399
  22202() {
81344
81400
  "use strict";
81345
- const version = '5.4.13';
81401
+ const version = '5.4.17';
81346
81402
 
81347
81403
 
81348
81404
  },
@@ -82115,7 +82171,7 @@ const TransferSyntaxes = {
82115
82171
 
82116
82172
 
82117
82173
  ;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/metadata/dist/esm/version.js
82118
- const version = '5.4.13';
82174
+ const version = '5.4.17';
82119
82175
 
82120
82176
  ;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/metadata/dist/esm/metaData.js
82121
82177
 
@@ -96438,7 +96494,7 @@ __webpack_require__.d(logging_namespaceObject, {
96438
96494
 
96439
96495
 
96440
96496
  ;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/utils/dist/esm/version.js
96441
- const version = '5.4.13';
96497
+ const version = '5.4.17';
96442
96498
 
96443
96499
  ;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/utils/dist/esm/utilities/object/asArray.js
96444
96500
  function asArray(item) {
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
- (globalThis["rspackChunk"] = globalThis["rspackChunk"] || []).push([[7231], {
3
- 3538(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
2
+ (globalThis["rspackChunk"] = globalThis["rspackChunk"] || []).push([[2623], {
3
+ 27074(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
4
4
  // ESM COMPAT FLAG
5
5
  __webpack_require__.r(__webpack_exports__);
6
6
 
@@ -27,12 +27,74 @@ var prop_types = __webpack_require__(97598);
27
27
  var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
28
28
  // EXTERNAL MODULE: ../../../extensions/cornerstone/src/utils/getLegacyViewportType.ts
29
29
  var getLegacyViewportType = __webpack_require__(50342);
30
+ ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/utils/viewportDataShape.ts
31
+
32
+
33
+ /**
34
+ * Pre-mount classification of a viewport's bound data (viewportData from
35
+ * CornerstoneCacheService), for code that runs before — or independently of —
36
+ * a live viewport instance (overlays, scrollbars). Native ("next") viewports
37
+ * collapse stack/volume onto a single PLANAR_NEXT viewportType, so these
38
+ * helpers classify by the persisted dataShapeType and the data shape itself
39
+ * (imageIds = stack, volume/volumeId = volume) instead of the runtime type.
40
+ *
41
+ * For classification of a LIVE viewport instance, use
42
+ * `getViewportAdapter(viewport).getShape()` instead.
43
+ */
44
+
45
+ /** The primary (non-overlay) datum of a viewportData. */
46
+ function getPrimaryViewportDatum(viewportData) {
47
+ return Array.isArray(viewportData?.data) ? viewportData.data[0] : viewportData?.data;
48
+ }
49
+
50
+ /** True when the primary datum is volume-shaped (volume/volumeId present). */
51
+ function isVolumeViewportData(viewportData) {
52
+ const firstData = getPrimaryViewportDatum(viewportData);
53
+ return !!(firstData && (firstData.volume || firstData.volumeId));
54
+ }
55
+
56
+ /**
57
+ * The stack/volume shape a viewportData was built for, transparent across the
58
+ * native type collapse: the persisted dataShapeType when present (set by
59
+ * CornerstoneCacheService on the native path), else the legacy viewportType.
60
+ */
61
+ function getViewportDataShapeType(viewportData) {
62
+ return viewportData?.dataShapeType ?? viewportData?.viewportType;
63
+ }
64
+
65
+ /**
66
+ * The slice-navigation event for this viewport's content. Resolved from the
67
+ * legacy viewportType when it is meaningful, else from the bound data shape —
68
+ * which is known immediately, unlike a runtime content-mode check that may not
69
+ * be ready while a native viewport is still binding. Native viewports emit the
70
+ * same STACK_NEW_IMAGE / VOLUME_NEW_IMAGE events as legacy.
71
+ */
72
+ function getSliceEventName(viewportData) {
73
+ const {
74
+ viewportType
75
+ } = viewportData;
76
+ const firstData = getPrimaryViewportDatum(viewportData);
77
+ return viewportType === esm.Enums.ViewportType.STACK && esm.Enums.Events.STACK_NEW_IMAGE || viewportType === esm.Enums.ViewportType.ORTHOGRAPHIC && esm.Enums.Events.VOLUME_NEW_IMAGE || isVolumeViewportData(viewportData) && esm.Enums.Events.VOLUME_NEW_IMAGE || firstData?.imageIds && esm.Enums.Events.STACK_NEW_IMAGE || esm.Enums.Events.IMAGE_RENDERED;
78
+ }
79
+
80
+ /**
81
+ * The slice count for a viewport. `viewport.getNumberOfSlices()` can be
82
+ * premature while a native viewport is still binding its data (it returns 1
83
+ * until then). For an image stack the count is known from the bound data, so
84
+ * prefer that and only fall back to the viewport for volume/MPR (where the
85
+ * count depends on orientation).
86
+ */
87
+ function getViewportSliceCount(viewportData, viewport) {
88
+ const firstData = getPrimaryViewportDatum(viewportData);
89
+ return !isVolumeViewportData(viewportData) && firstData?.imageIds?.length || viewport.getNumberOfSlices();
90
+ }
30
91
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/Viewport/Overlays/ViewportImageScrollbar.tsx
31
92
 
32
93
 
33
94
 
34
95
 
35
96
 
97
+
36
98
  function CornerstoneImageScrollbar({
37
99
  viewportData,
38
100
  viewportId,
@@ -76,9 +138,9 @@ function CornerstoneImageScrollbar({
76
138
  }
77
139
  try {
78
140
  const imageIndex = viewport.getCurrentImageIdIndex();
79
- const numberOfSlices = viewport.getNumberOfSlices();
141
+ const numberOfSlices = getViewportSliceCount(viewportData, viewport);
80
142
  setImageSliceData({
81
- imageIndex: imageIndex,
143
+ imageIndex,
82
144
  numberOfSlices
83
145
  });
84
146
  } catch (error) {
@@ -89,10 +151,7 @@ function CornerstoneImageScrollbar({
89
151
  if (!viewportData) {
90
152
  return;
91
153
  }
92
- const {
93
- viewportType
94
- } = viewportData;
95
- const eventId = viewportType === esm.Enums.ViewportType.STACK && esm.Enums.Events.STACK_NEW_IMAGE || viewportType === esm.Enums.ViewportType.ORTHOGRAPHIC && esm.Enums.Events.VOLUME_NEW_IMAGE || esm.Enums.Events.IMAGE_RENDERED;
154
+ const eventId = getSliceEventName(viewportData);
96
155
  const updateIndex = event => {
97
156
  const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
98
157
  if (!viewport || (0,getLegacyViewportType/* .isVolume3DViewportType */.Ov)(viewport)) {
@@ -132,6 +191,8 @@ CornerstoneImageScrollbar.propTypes = {
132
191
  servicesManager: (prop_types_default()).object.isRequired
133
192
  };
134
193
  /* export default */ const ViewportImageScrollbar = (CornerstoneImageScrollbar);
194
+ // EXTERNAL MODULE: ../../../extensions/cornerstone/src/services/ViewportService/adapter/index.ts + 3 modules
195
+ var ViewportService_adapter = __webpack_require__(71166);
135
196
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/Viewport/Overlays/ViewportSliceProgressScrollbar/helpers.ts
136
197
 
137
198
 
@@ -156,11 +217,18 @@ function isProgressFullMode(viewportData, viewport) {
156
217
  if (!viewportData || !viewport || (0,getLegacyViewportType/* .isVolume3DViewportType */.Ov)(viewport)) {
157
218
  return false;
158
219
  }
159
- if (viewportData.viewportType === esm.Enums.ViewportType.STACK) {
220
+
221
+ // A stack renders the full progress UI; an acquisition-plane volume is the
222
+ // volume-mode equivalent. The adapter classifies both lanes (legacy by
223
+ // viewport type / isInAcquisitionPlane; native by content mode + view-state
224
+ // orientation, since PLANAR_NEXT collapses the runtime type).
225
+ const adapter = (0,ViewportService_adapter/* .getViewportAdapter */.qU)(viewport);
226
+ const shape = adapter.getShape();
227
+ if (shape === 'stack') {
160
228
  return true;
161
229
  }
162
- if (viewportData.viewportType === esm.Enums.ViewportType.ORTHOGRAPHIC) {
163
- return !!viewport.isInAcquisitionPlane?.();
230
+ if (shape === 'volume') {
231
+ return adapter.isInAcquisitionPlane();
164
232
  }
165
233
  return false;
166
234
  }
@@ -174,6 +242,7 @@ function getImageIdFromCacheEvent(event) {
174
242
 
175
243
 
176
244
 
245
+
177
246
  function useProgressScrollbarMode({
178
247
  viewportData,
179
248
  viewportId,
@@ -242,23 +311,51 @@ function useViewportSliceSync({
242
311
  if (!viewportData) {
243
312
  return;
244
313
  }
245
- const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
246
- if (viewport && !(0,getLegacyViewportType/* .isVolume3DViewportType */.Ov)(viewport)) {
314
+
315
+ // Last values we pushed, so re-seeding on camera changes does not churn React
316
+ // state on pure pan/zoom (which keep the slice geometry unchanged).
317
+ const lastSlice = {
318
+ imageIndex: -1,
319
+ numberOfSlices: -1
320
+ };
321
+ const pushSliceData = (imageIndex, numberOfSlices) => {
322
+ if (imageIndex === lastSlice.imageIndex && numberOfSlices === lastSlice.numberOfSlices) {
323
+ return;
324
+ }
325
+ lastSlice.imageIndex = imageIndex;
326
+ lastSlice.numberOfSlices = numberOfSlices;
327
+ setImageSliceData({
328
+ imageIndex,
329
+ numberOfSlices
330
+ });
331
+ };
332
+
333
+ // Seeds the shared slice state from the live viewport. Re-run on the initial
334
+ // effect and on camera/orientation changes (below).
335
+ const syncFromViewport = () => {
336
+ const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
337
+ if (!viewport || (0,getLegacyViewportType/* .isVolume3DViewportType */.Ov)(viewport)) {
338
+ return;
339
+ }
247
340
  try {
248
341
  const currentImageIndex = viewport.getCurrentImageIdIndex();
249
- const currentNumberOfSlices = viewport.getNumberOfSlices();
250
- setImageSliceData({
251
- imageIndex: currentImageIndex,
252
- numberOfSlices: currentNumberOfSlices
253
- });
342
+ const currentNumberOfSlices = getViewportSliceCount(viewportData, viewport);
343
+ pushSliceData(currentImageIndex, currentNumberOfSlices);
254
344
  } catch (error) {
255
345
  console.warn(error);
256
346
  }
257
- }
258
- const {
259
- viewportType
260
- } = viewportData;
261
- const eventId = viewportType === esm.Enums.ViewportType.STACK && esm.Enums.Events.STACK_NEW_IMAGE || viewportType === esm.Enums.ViewportType.ORTHOGRAPHIC && esm.Enums.Events.VOLUME_NEW_IMAGE || esm.Enums.Events.IMAGE_RENDERED;
347
+ };
348
+ syncFromViewport();
349
+
350
+ // A post-mount camera carry (e.g. the layout-selector MPR protocol restoring
351
+ // the prior stack slice onto the freshly-mounted volume viewport) moves the
352
+ // camera and fires its slice events synchronously during the mount — before
353
+ // these listeners attach and around the initial seed above — so the scrollbar
354
+ // can latch the mount-time index instead of the carried slice. Re-seed once on
355
+ // the next frame, after the mount+carry settles; pushSliceData makes it a
356
+ // no-op when nothing changed (no churn/flicker).
357
+ const reseedRaf = requestAnimationFrame(syncFromViewport);
358
+ const eventId = getSliceEventName(viewportData);
262
359
  const updateIndex = event => {
263
360
  const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
264
361
  if (!viewport || (0,getLegacyViewportType/* .isVolume3DViewportType */.Ov)(viewport)) {
@@ -269,14 +366,20 @@ function useViewportSliceSync({
269
366
  return;
270
367
  }
271
368
  const nextNumberOfSlices = viewport.getNumberOfSlices();
272
- setImageSliceData({
273
- imageIndex: nextImageIndex,
274
- numberOfSlices: nextNumberOfSlices
275
- });
369
+ pushSliceData(nextImageIndex, nextNumberOfSlices);
276
370
  };
277
371
  element.addEventListener(eventId, updateIndex);
372
+ // Native ("next") viewports keep the same viewportData across a stack->volume
373
+ // transition or an orientation change, so this effect does not re-run and the
374
+ // slice-navigation event above may not fire until the first scroll, leaving the
375
+ // scrollbar unseeded (or stale, with a now-wrong slice count). CAMERA_MODIFIED
376
+ // fires on those orientation/geometry changes, so re-seed from the viewport
377
+ // then; the pushSliceData guard makes pan/zoom (same geometry) a no-op.
378
+ element.addEventListener(esm.Enums.Events.CAMERA_MODIFIED, syncFromViewport);
278
379
  return () => {
380
+ cancelAnimationFrame(reseedRaf);
279
381
  element.removeEventListener(eventId, updateIndex);
382
+ element.removeEventListener(esm.Enums.Events.CAMERA_MODIFIED, syncFromViewport);
280
383
  };
281
384
  }, [viewportData, element, viewportId, cornerstoneViewportService, setImageSliceData]);
282
385
  }
@@ -674,6 +777,8 @@ var hooks = __webpack_require__(2242);
674
777
 
675
778
 
676
779
 
780
+
781
+
677
782
  const EPSILON = 1e-4;
678
783
  const {
679
784
  formatPN,
@@ -850,7 +955,7 @@ function getDisplaySets(viewportData, displaySetService) {
850
955
  }
851
956
  const getInstanceNumber = (viewportData, viewportId, imageIndex, cornerstoneViewportService) => {
852
957
  let instanceNumber;
853
- switch (viewportData.viewportType) {
958
+ switch (getViewportDataShapeType(viewportData)) {
854
959
  case esm.Enums.ViewportType.STACK:
855
960
  instanceNumber = _getInstanceNumberFromStack(viewportData, imageIndex);
856
961
  break;
@@ -901,10 +1006,10 @@ function _getInstanceNumberFromVolume(viewportData, viewportId, cornerstoneViewp
901
1006
  if (!cornerstoneViewport) {
902
1007
  return;
903
1008
  }
904
- const camera = cornerstoneViewport.getCamera();
905
- const {
906
- viewPlaneNormal
907
- } = camera;
1009
+ const viewPlaneNormal = (0,ViewportService_adapter/* .getViewportAdapter */.qU)(cornerstoneViewport).getViewPlaneNormal();
1010
+ if (!viewPlaneNormal) {
1011
+ return;
1012
+ }
908
1013
  // checking if camera is looking at the acquisition plane (defined by the direction on the volume)
909
1014
 
910
1015
  const scanAxisNormal = direction.slice(6, 9);
@@ -1055,6 +1160,7 @@ var classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);
1055
1160
 
1056
1161
 
1057
1162
 
1163
+
1058
1164
  const {
1059
1165
  getOrientationStringLPS,
1060
1166
  invertOrientationStringLPS
@@ -1094,7 +1200,10 @@ function ViewportOrientationMarkers({
1094
1200
  console.log(`ViewportOrientationMarkers :: No viewport (${viewportId})`);
1095
1201
  return '';
1096
1202
  }
1097
- if (viewportData.viewportType === 'stack') {
1203
+
1204
+ // Use the persisted data shape, not viewportType: a native stack reports
1205
+ // PLANAR_NEXT, which would skip this synthetic-IOP default-cosine guard.
1206
+ if (getViewportDataShapeType(viewportData) === esm.Enums.ViewportType.STACK) {
1098
1207
  const imageIndex = imageSliceData.imageIndex;
1099
1208
  const imageId = viewportData.data[0].imageIds?.[imageIndex];
1100
1209
 
@@ -8252,7 +8252,7 @@ const onSegmentationDataModified = function (evt) {
8252
8252
  if (representationData.Labelmap) {
8253
8253
  onLabelmapSegmentationDataModified(evt);
8254
8254
  }
8255
- triggerSegmentationRenderBySegmentationId(segmentationId);
8255
+ triggerSegmentationRenderForModified(segmentationId);
8256
8256
  };
8257
8257
  /* export default */ const segmentation_segmentationDataModifiedEventListener = ((/* unused pure expression or super */ null && (onSegmentationDataModified)));
8258
8258
 
@@ -10217,7 +10217,7 @@ var COLOR_LUT = __webpack_require__(69501);
10217
10217
 
10218
10218
 
10219
10219
  ;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/version.js
10220
- const version = '5.4.13';
10220
+ const version = '5.4.17';
10221
10221
 
10222
10222
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/utilities/viewportPresentation.js
10223
10223
  var viewportPresentation = __webpack_require__(88299);
@@ -36585,6 +36585,50 @@ function triggerSegmentationRender(viewportId) {
36585
36585
  function triggerSegmentationRenderBySegmentationId(segmentationId) {
36586
36586
  segmentationRenderingEngine.renderSegmentation(segmentationId);
36587
36587
  }
36588
+ const DEFERRED_SEGMENTATION_RENDER_DELAY_MS = 240;
36589
+ const deferredSegmentationRenderTimers = new Map();
36590
+ function isProjectionHeavySegmentationViewport(viewport) {
36591
+ const blendMode = viewport.getBlendMode?.();
36592
+ if (blendMode === Enums.BlendModes.LABELMAP_EDGE_PROJECTION_BLEND) {
36593
+ return true;
36594
+ }
36595
+ const planarViewport = viewport;
36596
+ if (typeof planarViewport.getDisplaySetPresentation !== 'function') {
36597
+ return false;
36598
+ }
36599
+ const dataIds = [];
36600
+ const sourceDataId = planarViewport.getSourceDataId?.();
36601
+ if (sourceDataId) {
36602
+ dataIds.push(sourceDataId);
36603
+ }
36604
+ planarViewport.getActors?.().forEach((actorEntry) => {
36605
+ if (actorEntry.representationUID) {
36606
+ dataIds.push(String(actorEntry.representationUID));
36607
+ }
36608
+ });
36609
+ return dataIds.some((dataId) => (planarViewport.getDisplaySetPresentation(dataId)?.slabThickness ?? 0) > 0);
36610
+ }
36611
+ function triggerSegmentationRenderForModified(segmentationId) {
36612
+ const viewportIds = segmentationRenderingEngine._getViewportIdsForSegmentation(segmentationId);
36613
+ viewportIds.forEach((viewportId) => {
36614
+ const { viewport } = getEnabledElementByViewportId(viewportId) || {};
36615
+ if (!viewport) {
36616
+ return;
36617
+ }
36618
+ if (!isProjectionHeavySegmentationViewport(viewport)) {
36619
+ segmentationRenderingEngine.renderSegmentationsForViewport(viewportId);
36620
+ return;
36621
+ }
36622
+ const existingTimer = deferredSegmentationRenderTimers.get(viewportId);
36623
+ if (existingTimer !== undefined) {
36624
+ clearTimeout(existingTimer);
36625
+ }
36626
+ deferredSegmentationRenderTimers.set(viewportId, setTimeout(() => {
36627
+ deferredSegmentationRenderTimers.delete(viewportId);
36628
+ segmentationRenderingEngine.renderSegmentationsForViewport(viewportId);
36629
+ }, DEFERRED_SEGMENTATION_RENDER_DELAY_MS));
36630
+ });
36631
+ }
36588
36632
  const segmentationRenderingEngine = new SegmentationRenderingEngine();
36589
36633
 
36590
36634
 
@@ -641,7 +641,7 @@ function _extends() { return _extends = Object.assign ? Object.assign.bind() : f
641
641
 
642
642
 
643
643
  const Component = /*#__PURE__*/react.lazy(() => {
644
- return Promise.all(/* import() */ [__webpack_require__.e(8432), __webpack_require__.e(5642), __webpack_require__.e(9402), __webpack_require__.e(2343), __webpack_require__.e(5910)]).then(__webpack_require__.bind(__webpack_require__, 67329));
644
+ return Promise.all(/* import() */ [__webpack_require__.e(8478), __webpack_require__.e(89), __webpack_require__.e(5910)]).then(__webpack_require__.bind(__webpack_require__, 67329));
645
645
  });
646
646
  const OHIFCornerstoneRTViewport = props => {
647
647
  return /*#__PURE__*/react.createElement(react.Suspense, {