@ohif/app 3.13.0-beta.1 → 3.13.0-beta.11

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 (33) hide show
  1. package/dist/{147.bundle.37d627289453cb6c3937.js → 147.bundle.dca316a851f246b3add7.js} +2 -2
  2. package/dist/{1730.bundle.2171f9af9b7acd748fff.js → 1730.bundle.cc4074375671b0cb54ef.js} +2 -2
  3. package/dist/{1933.bundle.a7678889451d60a82a07.js → 1933.bundle.da11601456ce662609ea.js} +5 -4
  4. package/dist/{2701.bundle.12bd01a80a9f8ea4cd94.js → 2701.bundle.ec41d99d12e54f550e17.js} +1 -1
  5. package/dist/{3081.bundle.50b69741bf1434d300f2.js → 3081.bundle.305b8f64956d0e65d783.js} +35 -14
  6. package/dist/{4775.bundle.47f0c78a2fee3f9bd9ee.js → 4775.bundle.fa6427b611bbc5e9bf76.js} +17 -18
  7. package/dist/{5802.bundle.3bf5e6b3ab330a594a47.js → 5802.bundle.783100f1bd99eab393c9.js} +69 -12
  8. package/dist/5802.css +1 -1
  9. package/dist/{7159.bundle.a5991a5d4f0dd8f1c95f.js → 7159.bundle.fb9df255868960f69765.js} +4 -2
  10. package/dist/{8305.bundle.a60669c0f354619dd27f.js → 8305.bundle.d89a671892e3a0f5ebac.js} +1 -1
  11. package/dist/{8583.bundle.01ae8da221fd90cea8d9.js → 8583.bundle.4770c4dcdc8f97c28214.js} +3 -4
  12. package/dist/{9195.bundle.83393d905543339ec1f1.js → 9195.bundle.0b29324a400fce3c1ca4.js} +25 -29
  13. package/dist/{app.bundle.3e2ed5e1778a140eeab8.js → app.bundle.297079b7125933606288.js} +141 -108
  14. package/dist/app.bundle.css +3 -3
  15. package/dist/index.html +1 -1
  16. package/dist/sw.js +1 -1
  17. package/package.json +20 -20
  18. /package/dist/{1403.bundle.62a98c96636630ed28f3.js → 1403.bundle.1b10dc2a05a87c10868b.js} +0 -0
  19. /package/dist/{1459.bundle.2803fc2614db570d961a.js → 1459.bundle.6fcfece644aacdf8f9b7.js} +0 -0
  20. /package/dist/{2018.bundle.8b599c27f54098e1c1df.js → 2018.bundle.c597c4f1cabdba321042.js} +0 -0
  21. /package/dist/{213.bundle.fc35f21b5d89e71114eb.js → 213.bundle.5a2ff7243f21d6eb4522.js} +0 -0
  22. /package/dist/{2424.bundle.f3068323d8e589055c5e.js → 2424.bundle.d2e20434b8641cac9750.js} +0 -0
  23. /package/dist/{3461.bundle.4b339b553887bfaeb5f5.js → 3461.bundle.7ef1fa7cb1dae5b1561f.js} +0 -0
  24. /package/dist/{4819.bundle.53a472c6337556868474.js → 4819.bundle.667d19de858f1740dc5e.js} +0 -0
  25. /package/dist/{5028.bundle.5f94e61c9497f2c744e4.js → 5028.bundle.27c2055a09dfff635a5f.js} +0 -0
  26. /package/dist/{5457.bundle.8b62119a694923ea2615.js → 5457.bundle.2dfc3fe79d06c66c4241.js} +0 -0
  27. /package/dist/{5485.bundle.a7f35b2f18dfaf544f61.js → 5485.bundle.6edff61247d59a5e5d77.js} +0 -0
  28. /package/dist/{6027.bundle.d4b22e25cdf15786ad1f.js → 6027.bundle.e075f2c30bb5394c9e3f.js} +0 -0
  29. /package/dist/{6163.bundle.6a0b53bcc790bd6138b4.js → 6163.bundle.49735d597cfa4a4b3b6a.js} +0 -0
  30. /package/dist/{7639.bundle.5504b3cbe814c7cf29bd.js → 7639.bundle.815af4b3e29bd39611a7.js} +0 -0
  31. /package/dist/{85.bundle.091ab9d579b1d54f85c5.js → 85.bundle.d7cf0b989341dad0973f.js} +0 -0
  32. /package/dist/{8558.bundle.054d23882813d9c95a09.js → 8558.bundle.01d4f686ea8b95e1b235.js} +0 -0
  33. /package/dist/{9927.bundle.e11bc961681793c5f105.js → 9927.bundle.425d635a6291bebce7de.js} +0 -0
@@ -767,7 +767,7 @@ function ViewportImageSliceLoadingIndicator({
767
767
  }, /*#__PURE__*/react.createElement("div", {
768
768
  className: "transparent flex h-full w-full items-center justify-center"
769
769
  }, /*#__PURE__*/react.createElement("p", {
770
- className: "text-primary-light text-xl font-light"
770
+ className: "text-highlight text-xl font-light"
771
771
  }, /*#__PURE__*/react.createElement("h4", null, "Error Loading Image"), /*#__PURE__*/react.createElement("p", null, "An error has occurred."), /*#__PURE__*/react.createElement("p", null, error)))));
772
772
  }
773
773
  if (loading) {
@@ -780,7 +780,7 @@ function ViewportImageSliceLoadingIndicator({
780
780
  }, /*#__PURE__*/react.createElement("div", {
781
781
  className: "transparent flex h-full w-full items-center justify-center"
782
782
  }, /*#__PURE__*/react.createElement("p", {
783
- className: "text-primary-light text-xl font-light"
783
+ className: "text-highlight text-xl font-light"
784
784
  }, "Loading...")))
785
785
  );
786
786
  }
@@ -1384,7 +1384,7 @@ function DynamicDataPanel({
1384
1384
  tab
1385
1385
  }) {
1386
1386
  return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("div", {
1387
- className: "flex flex-col text-white",
1387
+ className: "text-foreground flex flex-col",
1388
1388
  "data-cy": 'dynamic-volume-panel'
1389
1389
  }, /*#__PURE__*/react.createElement(PanelGenerateImage, {
1390
1390
  commandsManager: commandsManager,
@@ -1400,7 +1400,7 @@ function WorkflowPanel({
1400
1400
  const ProgressDropdownWithService = servicesManager.services.customizationService.getCustomization('progressDropdownWithServiceComponent');
1401
1401
  return /*#__PURE__*/React.createElement("div", {
1402
1402
  "data-cy": 'workflow-panel',
1403
- className: "bg-secondary-dark mb-1 px-3 py-4"
1403
+ className: "bg-popover mb-1 px-3 py-4"
1404
1404
  }, /*#__PURE__*/React.createElement("div", {
1405
1405
  className: "mb-1"
1406
1406
  }, "Workflow"), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(ProgressDropdownWithService, {
@@ -2692,12 +2692,13 @@ const extension = {
2692
2692
  handleHeight: true,
2693
2693
  handleWidth: true
2694
2694
  });
2695
+ const setViewportActive = (0,react.useCallback)(viewportId => {
2696
+ viewportGridService.setActiveViewportId(viewportId);
2697
+ }, [viewportGridService]);
2695
2698
  return /*#__PURE__*/react.createElement(MicroscopyViewport, _extends({
2696
2699
  key: displaySetsKey,
2697
2700
  activeViewportId: activeViewportId,
2698
- setViewportActive: viewportId => {
2699
- viewportGridService.setActiveViewportId(viewportId);
2700
- },
2701
+ setViewportActive: setViewportActive,
2701
2702
  viewportData: viewportOptions,
2702
2703
  resizeRef: resizeRef
2703
2704
  }, props));
@@ -2734,7 +2735,7 @@ const extension = {
2734
2735
  });
2735
2736
  return {
2736
2737
  disabled: false,
2737
- className: isPrimaryActive ? '!text-black bg-primary-light' : '!text-common-bright hover:!bg-primary-dark hover:!text-primary-light',
2738
+ className: isPrimaryActive ? '!text-black bg-highlight' : '!text-foreground/80 hover:!bg-muted hover:!text-highlight',
2738
2739
  // Todo: isActive right now is used for nested buttons where the primary
2739
2740
  // button needs to be fully rounded (vs partial rounded) when active
2740
2741
  // otherwise it does not have any other use
@@ -497,7 +497,7 @@ function OHIFCornerstoneSRTextViewport(props) {
497
497
  const displaySet = displaySets[0];
498
498
  const instance = displaySet.instances[0];
499
499
  return /*#__PURE__*/react.createElement("div", {
500
- className: "relative flex h-full w-full flex-col overflow-auto p-4 text-white"
500
+ className: "text-foreground relative flex h-full w-full flex-col overflow-auto p-4"
501
501
  }, /*#__PURE__*/react.createElement("div", null, /*#__PURE__*/react.createElement(OHIFCornerstoneSRContainer, {
502
502
  container: instance
503
503
  })));
@@ -6089,6 +6089,10 @@ const connectMeasurementServiceToTools = ({
6089
6089
 
6090
6090
 
6091
6091
  function _getVolumeFromViewport(viewport) {
6092
+ // Handle non-volume viewports that don't have getAllVolumeIds
6093
+ if (!viewport?.getAllVolumeIds) {
6094
+ return null;
6095
+ }
6092
6096
  const volumeIds = viewport.getAllVolumeIds();
6093
6097
  const volumes = volumeIds.map(id => esm.cache.getVolume(id));
6094
6098
  const dynamicVolume = volumes.find(volume => volume.isDynamicVolume());
@@ -8620,7 +8624,7 @@ const DicomUploadProgressItem = /*#__PURE__*/(0,react.memo)(({
8620
8624
  }, /*#__PURE__*/react.createElement("div", {
8621
8625
  className: "flex w-6 shrink-0 items-center justify-center"
8622
8626
  }, getStatusIcon()), /*#__PURE__*/react.createElement("div", {
8623
- className: "overflow-hidden text-ellipsis whitespace-nowrap text-white"
8627
+ className: "text-foreground overflow-hidden text-ellipsis whitespace-nowrap"
8624
8628
  }, dicomFileUploader.getFileName())), failedReason && /*#__PURE__*/react.createElement("div", {
8625
8629
  className: "pl-10"
8626
8630
  }, failedReason)), /*#__PURE__*/react.createElement("div", {
@@ -8862,7 +8866,7 @@ function DicomUploadProgress({
8862
8866
  }, [numFilesCompleted]);
8863
8867
  const getNumCompletedAndTimeRemainingComponent = () => {
8864
8868
  return /*#__PURE__*/react.createElement("div", {
8865
- className: "bg-muted flex h-14 items-center px-1 pb-4 text-lg text-white"
8869
+ className: "bg-muted text-foreground flex h-14 items-center px-1 pb-4 text-lg"
8866
8870
  }, numFilesCompleted === dicomFileUploaderArr.length ? /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("span", {
8867
8871
  className: NO_WRAP_ELLIPSIS_CLASS_NAMES
8868
8872
  }, `${dicomFileUploaderArr.length} ${dicomFileUploaderArr.length > 1 ? 'files' : 'file'} completed.`), /*#__PURE__*/react.createElement(ui_next_src/* Button */.$nd, {
@@ -15919,7 +15923,7 @@ function ViewportOrientationMenu({
15919
15923
  }) : null), /*#__PURE__*/react.createElement("div", {
15920
15924
  className: "flex-1 text-left"
15921
15925
  }, "Acquisition")), /*#__PURE__*/react.createElement("div", {
15922
- className: "mx-1 my-2 border-t border-white/20"
15926
+ className: "border-input mx-1 my-2 border-t"
15923
15927
  }), /*#__PURE__*/react.createElement(ui_next_src/* Button */.$nd, {
15924
15928
  variant: "ghost",
15925
15929
  className: "flex h-7 w-full flex-shrink-0 items-center justify-start self-stretch px-1 py-0",
@@ -17406,9 +17410,9 @@ function ModalityLoadBadge({
17406
17410
  if (!statusInfo.isHydrated) {
17407
17411
  return /*#__PURE__*/react.createElement("div", {
17408
17412
  "data-cy": `ModalityLoadBadge-${viewportId}`,
17409
- className: "flex h-6 cursor-default text-sm leading-6 text-white"
17413
+ className: "text-foreground flex h-6 cursor-default text-sm leading-6"
17410
17414
  }, /*#__PURE__*/react.createElement("div", {
17411
- className: "bg-customgray-100 flex min-w-[45px] items-center rounded-l-xl rounded-r p-1"
17415
+ className: "bg-popover flex min-w-[45px] items-center rounded-l-xl rounded-r p-1"
17412
17416
  }, /*#__PURE__*/react.createElement(StatusIcon, null), /*#__PURE__*/react.createElement("span", {
17413
17417
  className: "ml-1"
17414
17418
  }, statusInfo.type)), statusInfo.type !== 'SR' && /*#__PURE__*/react.createElement(ui_next_src/* ViewportActionButton */.N8H, {
@@ -24339,12 +24343,12 @@ function DefaultAccordion(props) {
24339
24343
  if (!allChildren || !groups) {
24340
24344
  return null;
24341
24345
  }
24342
- if (Boolean(asChild)) {
24346
+ if (asChild) {
24343
24347
  return /*#__PURE__*/react.cloneElement(props.children, props);
24344
24348
  }
24345
24349
  return /*#__PURE__*/react.createElement(ui_next_src/* Accordion */.nD3, {
24346
24350
  type: grouping.type || 'multiple',
24347
- className: "text-white",
24351
+ className: "text-foreground",
24348
24352
  defaultValue: defaultValue
24349
24353
  }, [...groups.entries()].map(([key, group]) => {
24350
24354
  return /*#__PURE__*/react.createElement(ui_next_src/* AccordionItem */.AsP, {
@@ -24822,7 +24826,7 @@ function PanelMeasurement(props) {
24822
24826
  return EmptyComponent ? /*#__PURE__*/react.createElement(EmptyComponent, {
24823
24827
  items: displayMeasurements
24824
24828
  }) : /*#__PURE__*/react.createElement("span", {
24825
- className: "text-white"
24829
+ className: "text-foreground"
24826
24830
  }, "No Measurements");
24827
24831
  }
24828
24832
  if (children) {
@@ -25438,6 +25442,9 @@ const setUpAnnotationEventHandlers = () => {
25438
25442
  };
25439
25443
  return [annotationInterpolationProcessCompletedUnsubscribe];
25440
25444
  };
25445
+ // EXTERNAL MODULE: ../../../node_modules/immutability-helper/index.js
25446
+ var immutability_helper = __webpack_require__(1752);
25447
+ var immutability_helper_default = /*#__PURE__*/__webpack_require__.n(immutability_helper);
25441
25448
  ;// ../../../extensions/cornerstone/src/components/MeasurementsMenu.tsx
25442
25449
 
25443
25450
 
@@ -25802,6 +25809,7 @@ function src_extends() { return src_extends = Object.assign ? Object.assign.bind
25802
25809
 
25803
25810
 
25804
25811
 
25812
+
25805
25813
 
25806
25814
 
25807
25815
  const {
@@ -25815,7 +25823,7 @@ const OHIFCornerstoneViewport = props => {
25815
25823
  fallback: /*#__PURE__*/react.createElement("div", null, "Loading...")
25816
25824
  }, /*#__PURE__*/react.createElement(Component, props));
25817
25825
  };
25818
- const stackRetrieveOptions = {
25826
+ const DEFAULT_STACK_RETRIEVE_OPTIONS = {
25819
25827
  retrieveOptions: {
25820
25828
  single: {
25821
25829
  streaming: true,
@@ -25823,6 +25831,11 @@ const stackRetrieveOptions = {
25823
25831
  }
25824
25832
  }
25825
25833
  };
25834
+
25835
+ /** Normalize to immutability-helper spec: plain object → $merge, otherwise use as-is. */
25836
+ const toUpdateSpec = obj => obj != null && typeof obj === 'object' && Object.keys(obj).some(k => k.startsWith('$')) ? obj : {
25837
+ $merge: obj ?? {}
25838
+ };
25826
25839
  const unsubscriptions = [];
25827
25840
  /**
25828
25841
  *
@@ -25834,7 +25847,8 @@ const cornerstoneExtension = {
25834
25847
  id: id,
25835
25848
  onModeEnter: ({
25836
25849
  servicesManager,
25837
- commandsManager
25850
+ commandsManager,
25851
+ extensionManager
25838
25852
  }) => {
25839
25853
  const {
25840
25854
  cornerstoneViewportService,
@@ -25861,10 +25875,17 @@ const cornerstoneExtension = {
25861
25875
  // This interleaves images and replicates them for low-resolution depth volume
25862
25876
  // reconstruction, which progressively improves
25863
25877
  imageRetrieveMetadataProvider.add('volume', esm.ProgressiveRetrieveImages.interleavedRetrieveStages);
25864
- // The default stack loading option is to progressive load HTJ2K images
25865
- // There are other possible options, but these need more thought about
25866
- // how to define them.
25867
- imageRetrieveMetadataProvider.add('stack', stackRetrieveOptions);
25878
+
25879
+ /**
25880
+ * Stack retrieve options: read from active data source configuration.
25881
+ * Pass an immutability-helper spec (e.g. { $merge: {...} } or { $set: {...} }) in
25882
+ * stackRetrieveOptions to customize. Plain object is treated as $merge for backward compat.
25883
+ * Set streaming: false for uncompressed DICOM that requires full file before decode.
25884
+ */
25885
+ const sourceConfig = extensionManager?.getActiveDataSource?.()?.[0]?.getConfig?.() ?? {};
25886
+ const config = sourceConfig.stackRetrieveOptions ?? {};
25887
+ const stackOptions = immutability_helper_default()(DEFAULT_STACK_RETRIEVE_OPTIONS, toUpdateSpec(config));
25888
+ imageRetrieveMetadataProvider.add('stack', stackOptions);
25868
25889
  },
25869
25890
  getPanelModule: src_getPanelModule,
25870
25891
  onModeExit: ({
@@ -511,7 +511,7 @@ function USAnnotationPanel() {
511
511
  /**
512
512
  * Render helpers so the JSX doesn’t become spaghetti. */
513
513
  const renderWorkflowToggles = () => /*#__PURE__*/react.createElement(ui_next_src/* PanelSection */.aUM.Content, null, /*#__PURE__*/react.createElement("div", {
514
- className: "space-y-3 p-2 text-sm text-white"
514
+ className: "text-foreground space-y-3 p-2 text-sm"
515
515
  }, /*#__PURE__*/react.createElement("div", {
516
516
  className: "flex items-center"
517
517
  }, /*#__PURE__*/react.createElement(ui_next_src/* Switch */.dOG, {
@@ -572,13 +572,12 @@ function USAnnotationPanel() {
572
572
  }, /*#__PURE__*/react.createElement(ui_next_src/* Switch */.dOG, {
573
573
  id: "show-overlay-switch",
574
574
  checked: showOverlay,
575
- onCheckedChange: () => setShowOverlayCommand(!showOverlay),
576
- className: "data-[state=checked]:bg-blue-500"
575
+ onCheckedChange: () => setShowOverlayCommand(!showOverlay)
577
576
  }), /*#__PURE__*/react.createElement("label", {
578
577
  htmlFor: "show-overlay-switch",
579
- className: "cursor-pointer text-blue-300"
578
+ className: "text-muted-foreground cursor-pointer"
580
579
  }, t('Show Overlay'))), /*#__PURE__*/react.createElement("hr", {
581
- className: "border-t border-gray-800"
580
+ className: "border-input/50 border-t"
582
581
  })));
583
582
  const renderAnnotatedFrames = () => /*#__PURE__*/react.createElement(ui_next_src/* ScrollArea */.FKN, {
584
583
  className: "h-full"
@@ -601,40 +600,40 @@ function USAnnotationPanel() {
601
600
  }, /*#__PURE__*/react.createElement("table", {
602
601
  className: "w-full border-collapse text-sm"
603
602
  }, /*#__PURE__*/react.createElement("thead", null, /*#__PURE__*/react.createElement("tr", {
604
- className: "border-b border-blue-900 text-blue-300"
603
+ className: "text-muted-foreground border-input/50 border-b"
605
604
  }, /*#__PURE__*/react.createElement("th", null), /*#__PURE__*/react.createElement("th", {
606
- className: "py-2 px-3 text-left"
605
+ className: "py-2 px-2 text-left font-normal"
607
606
  }, t('Frame')), /*#__PURE__*/react.createElement("th", {
608
- className: "py-2 px-3 text-center"
607
+ className: "py-2 px-2 text-center font-normal"
609
608
  }, t('Pleura lines')), /*#__PURE__*/react.createElement("th", {
610
- className: "py-2 px-3 text-center"
609
+ className: "py-2 px-2 text-center font-normal"
611
610
  }, t('B-lines')), /*#__PURE__*/react.createElement("th", {
612
611
  className: "w-10"
613
612
  }))), /*#__PURE__*/react.createElement("tbody", null, annotatedFrames.map(item => /*#__PURE__*/react.createElement("tr", {
614
613
  key: item.frame,
615
- className: `border-b border-blue-900 ${item.frame === 5 ? 'bg-cyan-800 bg-opacity-30' : ''}`,
614
+ className: `border-input/50 border-b ${item.frame === 5 ? 'bg-cyan-800 bg-opacity-30' : ''}`,
616
615
  onClick: () => handleRowClick(item),
617
616
  style: {
618
617
  cursor: 'pointer'
619
618
  }
620
619
  }, /*#__PURE__*/react.createElement("td", {
621
- className: "py-3 px-3"
620
+ className: "py-2 px-2"
622
621
  }, item.index), /*#__PURE__*/react.createElement("td", {
623
- className: "py-3 px-3"
622
+ className: "py-2 px-2"
624
623
  }, item.frame + 1), /*#__PURE__*/react.createElement("td", {
625
- className: "py-3 px-3 text-center"
624
+ className: "py-2 px-2 text-center"
626
625
  }, item.pleura), /*#__PURE__*/react.createElement("td", {
627
- className: "py-3 px-3 text-center"
626
+ className: "py-2 px-2 text-center"
628
627
  }, item.bLine), /*#__PURE__*/react.createElement("td", {
629
- className: "py-3 px-3 text-right"
628
+ className: "py-2 px-2 text-right"
630
629
  }, item.frame === 5 && /*#__PURE__*/react.createElement("div", {
631
630
  className: "flex items-center justify-end"
632
631
  }, /*#__PURE__*/react.createElement(ui_next_src/* Button */.$nd, {
633
632
  variant: "ghost",
634
- className: "p-0 text-blue-300"
633
+ className: "p-0"
635
634
  }, /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.EyeVisible, null)), /*#__PURE__*/react.createElement(ui_next_src/* Button */.$nd, {
636
635
  variant: "ghost",
637
- className: "ml-2 p-0 text-blue-300"
636
+ className: "ml-2 p-0"
638
637
  }, /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.More, null)))))))))));
639
638
  const updateAnnotatedFrames = () => {
640
639
  const activeViewportId = viewportGridService.getActiveViewportId();
@@ -699,7 +698,7 @@ function USAnnotationPanel() {
699
698
  * ──────────────────────────────────────────────────────
700
699
  * 🖼 Final Render */
701
700
  return /*#__PURE__*/react.createElement("div", {
702
- className: "h-full bg-black text-white",
701
+ className: "text-foreground h-full bg-black",
703
702
  style: {
704
703
  minWidth: 240,
705
704
  maxWidth: 480,
@@ -153,10 +153,10 @@ const generateFromConfig = ({
153
153
  bottomLeft = [],
154
154
  bottomRight = []
155
155
  } = overlayData ?? {};
156
- const topLeftClass = 'top-viewport left-viewport text-primary-light';
157
- const topRightClass = 'top-viewport right-viewport-scrollbar text-primary-light';
158
- const bottomRightClass = 'bottom-viewport right-viewport-scrollbar text-primary-light';
159
- const bottomLeftClass = 'bottom-viewport left-viewport text-primary-light';
156
+ const topLeftClass = 'top-viewport left-viewport text-highlight';
157
+ const topRightClass = 'top-viewport right-viewport-scrollbar text-highlight';
158
+ const bottomRightClass = 'bottom-viewport right-viewport-scrollbar text-highlight';
159
+ const bottomLeftClass = 'bottom-viewport left-viewport text-highlight';
160
160
  const overlay = 'absolute pointer-events-none microscopy-viewport-overlay';
161
161
  return /*#__PURE__*/react.createElement(react.Fragment, null, topLeft && topLeft.length > 0 && /*#__PURE__*/react.createElement("div", {
162
162
  "data-cy": 'viewport-overlay-top-left',
@@ -241,14 +241,20 @@ var dcmjs_es = __webpack_require__(5842);
241
241
 
242
242
 
243
243
 
244
- function DicomMicroscopyViewport({
244
+
245
+ // This component is wrapped with React.memo and uses a custom areEqual comparison
246
+ // function to prevent unnecessary re-renders when props are semantically identical
247
+ // (e.g. `displaySets` reference changes, but the content is the same).
248
+ // Note: If this component starts depending on additional props,
249
+ // update `areEqual` accordingly.
250
+ const DicomMicroscopyViewport = /*#__PURE__*/react.memo(({
245
251
  activeViewportId,
246
252
  setViewportActive,
247
253
  displaySets,
248
254
  viewportId,
249
255
  dataSource,
250
256
  resizeRef
251
- }) {
257
+ }) => {
252
258
  const {
253
259
  servicesManager,
254
260
  extensionManager
@@ -395,20 +401,23 @@ function DicomMicroscopyViewport({
395
401
  console.log('Loading viewer metadata', smDisplaySet);
396
402
  await loadViewer(smDisplaySet.others);
397
403
  if (displaySet.isOverlayDisplaySet && !displaySet.isLoaded && !displaySet.isLoading) {
398
- displaySet.load(smDisplaySet);
404
+ const referencedDisplaySet = displaySet.getSourceDisplaySet();
405
+ displaySet.load(referencedDisplaySet);
399
406
  }
400
407
  }, [dataSource, extensionManager, microscopyService, servicesManager, viewportId]);
401
408
  (0,react.useEffect)(() => {
402
- const displaySet = displaySets[0];
403
- installOpenLayersRenderer(container.current, displaySet).then(() => {
404
- setIsLoaded(true);
405
- });
409
+ if (!viewer) {
410
+ const displaySet = displaySets[0];
411
+ installOpenLayersRenderer(container.current, displaySet).then(() => {
412
+ setIsLoaded(true);
413
+ });
414
+ }
406
415
  return () => {
407
416
  if (viewer) {
408
417
  microscopyService.removeViewer(viewer);
409
418
  }
410
419
  };
411
- }, []);
420
+ }, [viewer]);
412
421
  (0,react.useEffect)(() => {
413
422
  const displaySet = displaySets[0];
414
423
  microscopyService.clearAnnotations();
@@ -464,7 +473,55 @@ function DicomMicroscopyViewport({
464
473
  }), isLoaded ? null : /*#__PURE__*/react.createElement(LoadingIndicatorProgress, {
465
474
  className: 'h-full w-full bg-black'
466
475
  }));
476
+ }, areEqual);
477
+
478
+ // Check if the props are the same
479
+ function areEqual(prevProps, nextProps) {
480
+ if (prevProps.setViewportActive !== nextProps.setViewportActive) {
481
+ return false;
482
+ }
483
+ if (prevProps.resizeRef !== nextProps.resizeRef) {
484
+ return false;
485
+ }
486
+ if (prevProps.viewportId !== nextProps.viewportId) {
487
+ return false;
488
+ }
489
+ if (prevProps.activeViewportId !== nextProps.activeViewportId) {
490
+ return false;
491
+ }
492
+ if (prevProps.dataSource !== nextProps.dataSource) {
493
+ return false;
494
+ }
495
+ const prevDisplaySets = prevProps.displaySets;
496
+ const nextDisplaySets = nextProps.displaySets;
497
+ if (prevDisplaySets.length !== nextDisplaySets.length) {
498
+ return false;
499
+ }
500
+
501
+ // Check if the displaySets are the same
502
+ for (let i = 0; i < prevDisplaySets.length; i++) {
503
+ const prevDisplaySet = prevDisplaySets[i];
504
+ const foundDisplaySet = nextDisplaySets.find(nextDisplaySet => nextDisplaySet.displaySetInstanceUID === prevDisplaySet.displaySetInstanceUID);
505
+ if (!foundDisplaySet) {
506
+ return false;
507
+ }
508
+ // Check if the displaySet's images are the same
509
+ if (foundDisplaySet.images?.length !== prevDisplaySet.images?.length) {
510
+ return false;
511
+ }
512
+
513
+ // Check if the displaySet's imageIds are the same
514
+ if (foundDisplaySet.images?.length) {
515
+ for (let j = 0; j < foundDisplaySet.images.length; j++) {
516
+ if (foundDisplaySet.images[j].imageId !== prevDisplaySet.images[j].imageId) {
517
+ return false;
518
+ }
519
+ }
520
+ }
521
+ }
522
+ return true;
467
523
  }
524
+ DicomMicroscopyViewport.displayName = 'DicomMicroscopyViewport';
468
525
  /* harmony default export */ const src_DicomMicroscopyViewport = (DicomMicroscopyViewport);
469
526
 
470
527
  /***/ })
package/dist/5802.css CHANGED
@@ -1,2 +1,2 @@
1
1
  .DicomMicroscopyViewer{--ol-partial-background-color:#7f7f7fb3;--ol-foreground-color:#000;--ol-subtle-foreground-color:#000;--ol-subtle-background-color:#4e4e4e80;-webkit-user-select:none;-moz-user-select:none; -ms-user-select:none; user-select:none}.DicomMicroscopyViewer .ol-box{background-color:var(--ol-partial-background-color);border:1.5px solid var(--ol-background-color);border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box}.DicomMicroscopyViewer .ol-mouse-position{position:absolute;right:8px;top:8px}.DicomMicroscopyViewer .ol-scale-line{background:var(--ol-partial-background-color);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute}.DicomMicroscopyViewer .ol-scale-line-inner{border:1px solid var(--ol-subtle-foreground-color);border-top:none;color:var(--ol-foreground-color);font-size:10px;margin:1px;text-align:center;-webkit-transition:all .25s;transition:all .25s;will-change:contents,width}.DicomMicroscopyViewer .ol-scale-bar{bottom:8px;left:8px;position:absolute}.DicomMicroscopyViewer .ol-scale-bar-inner{display:-webkit-box;display:-ms-flexbox;display:flex}.DicomMicroscopyViewer .ol-scale-step-marker{background-color:var(--ol-foreground-color);float:right;height:15px;width:1px;z-index:10}.DicomMicroscopyViewer .ol-scale-step-text{bottom:-5px;font-size:10px;z-index:11}.DicomMicroscopyViewer .ol-scale-step-text,.DicomMicroscopyViewer .ol-scale-text{color:var(--ol-foreground-color);position:absolute;text-shadow:-1.5px 0 var(--ol-partial-background-color),0 1.5px var(--ol-partial-background-color),1.5px 0 var(--ol-partial-background-color),0 -1.5px var(--ol-partial-background-color)}.DicomMicroscopyViewer .ol-scale-text{bottom:25px;font-size:12px;text-align:center}.DicomMicroscopyViewer .ol-scale-singlebar{border:1px solid var(--ol-foreground-color);-webkit-box-sizing:border-box;box-sizing:border-box;height:10px;position:relative;z-index:9}.DicomMicroscopyViewer .ol-scale-singlebar-even{background-color:var(--ol-subtle-foreground-color)}.DicomMicroscopyViewer .ol-scale-singlebar-odd{background-color:var(--ol-background-color)}.DicomMicroscopyViewer .ol-unsupported{display:none}.DicomMicroscopyViewer .ol-unselectable,.DicomMicroscopyViewer .ol-viewport{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none; -ms-user-select:none; user-select:none}.DicomMicroscopyViewer .ol-viewport canvas{all:unset}.DicomMicroscopyViewer .ol-selectable{-webkit-touch-callout:default;-webkit-user-select:text;-moz-user-select:text; -ms-user-select:text; user-select:text}.DicomMicroscopyViewer .ol-grabbing{cursor:-webkit-grabbing;cursor:grabbing}.DicomMicroscopyViewer .ol-grab{cursor:move;cursor:-webkit-grab;cursor:grab}.DicomMicroscopyViewer .ol-control{background-color:var(--ol-subtle-background-color);border-radius:4px;position:absolute}.DicomMicroscopyViewer .ol-zoom{left:.5em;top:.5em}.DicomMicroscopyViewer .ol-rotate{right:.5em;top:.5em;-webkit-transition:opacity .25s linear,visibility 0s linear;transition:opacity .25s linear,visibility 0s linear}.DicomMicroscopyViewer .ol-rotate.ol-hidden{opacity:0;-webkit-transition:opacity .25s linear,visibility 0s linear .25s;transition:opacity .25s linear,visibility 0s linear .25s;visibility:hidden}.DicomMicroscopyViewer .ol-zoom-extent{left:.5em;top:4.643em}.DicomMicroscopyViewer .ol-full-screen{right:.5em;top:.5em}.DicomMicroscopyViewer .ol-control button{background-color:var(--ol-background-color);border:none;border-radius:2px;color:var(--ol-subtle-foreground-color);display:block;font-size:inherit;font-weight:700;height:1.375em;line-height:.4em;margin:1px;padding:0;text-align:center;text-decoration:none;width:1.375em}.DicomMicroscopyViewer .ol-control button::-moz-focus-inner{border:none;padding:0}.DicomMicroscopyViewer .ol-zoom-extent button{line-height:1.4em}.DicomMicroscopyViewer .ol-compass{display:block;font-weight:400;will-change:transform}.DicomMicroscopyViewer .ol-touch .ol-control button{font-size:1.5em}.DicomMicroscopyViewer .ol-touch .ol-zoom-extent{top:5.5em}.DicomMicroscopyViewer .ol-control button:focus,.DicomMicroscopyViewer .ol-control button:hover{color:var(--ol-foreground-color);outline:1px solid var(--ol-subtle-foreground-color);text-decoration:none}.DicomMicroscopyViewer .ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0}.DicomMicroscopyViewer .ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px}.DicomMicroscopyViewer .ol-attribution{-webkit-box-align:center;-ms-flex-align:center;align-items:center;bottom:.5em;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-flow:row-reverse;flex-flow:row-reverse;max-width:calc(100% - 1.3em);right:.5em;text-align:right}.DicomMicroscopyViewer .ol-attribution a{color:var(--ol-subtle-foreground-color);text-decoration:none}.DicomMicroscopyViewer .ol-attribution ul{color:var(--ol-foreground-color);font-size:12px;margin:0;padding:1px .5em;text-shadow:0 0 2px var(--ol-background-color)}.DicomMicroscopyViewer .ol-attribution li{display:inline;list-style:none}.DicomMicroscopyViewer .ol-attribution li:not(:last-child):after{content:" "}.DicomMicroscopyViewer .ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle}.DicomMicroscopyViewer .ol-attribution button{-ms-flex-negative:0;flex-shrink:0}.DicomMicroscopyViewer .ol-attribution.ol-collapsed ul{display:none}.DicomMicroscopyViewer .ol-attribution:not(.ol-collapsed){background:var(--ol-partial-background-color)}.DicomMicroscopyViewer .ol-attribution.ol-uncollapsible{border-radius:4px 0 0;bottom:0;right:0}.DicomMicroscopyViewer .ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em}.DicomMicroscopyViewer .ol-attribution.ol-uncollapsible button{display:none}.DicomMicroscopyViewer .ol-zoomslider{height:200px;left:.5em;top:4.5em}.DicomMicroscopyViewer .ol-zoomslider button{height:10px;position:relative}.DicomMicroscopyViewer .ol-touch .ol-zoomslider{top:5.5em}.DicomMicroscopyViewer .ol-overviewmap{bottom:.5em;left:.5em}.DicomMicroscopyViewer .ol-overviewmap.ol-uncollapsible{border-radius:0 4px 0 0;bottom:0;left:0}.DicomMicroscopyViewer .ol-overviewmap .ol-overviewmap-map,.DicomMicroscopyViewer .ol-overviewmap button{display:block}.DicomMicroscopyViewer .ol-overviewmap .ol-overviewmap-map{border:1px solid var(--ol-subtle-foreground-color);height:150px;width:150px}.DicomMicroscopyViewer .ol-overviewmap:not(.ol-collapsed) button{bottom:0;left:0;position:absolute}.DicomMicroscopyViewer .ol-overviewmap.ol-collapsed .ol-overviewmap-map,.DicomMicroscopyViewer .ol-overviewmap.ol-uncollapsible button{display:none}.DicomMicroscopyViewer .ol-overviewmap:not(.ol-collapsed){background:var(--ol-subtle-background-color)}.DicomMicroscopyViewer .ol-overviewmap-box{border:.5px dotted var(--ol-subtle-foreground-color)}.DicomMicroscopyViewer .ol-overviewmap .ol-overviewmap-box:hover{cursor:move}@layout-header-background: #007ea3;@primary-color: #007ea3;@processing-color: #8cb8c6;@success-color: #3f9c35;@warning-color: #eeaf30;@error-color: #96172e;@font-size-base: 14px;.DicomMicroscopyViewer .ol-tooltip{font-size:16px!important}
2
- .DicomMicroscopyViewer .OpenLayersOverlay{display:block!important;height:100%;pointer-events:none!important;width:100%}.DicomMicroscopyViewer .text-primary-light{color:#ff0;font-size:14px;font-weight:400}.DicomMicroscopyViewer .text-primary-light span{max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.DicomMicroscopyViewer .absolute{position:absolute}.DicomMicroscopyViewer .flex{display:-webkit-box;display:-ms-flexbox;display:flex}.DicomMicroscopyViewer .flex-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.DicomMicroscopyViewer .flex-col{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.DicomMicroscopyViewer .pointer-events-none{pointer-events:none}.DicomMicroscopyViewer .left-viewport-scrollbar{left:.5rem}.DicomMicroscopyViewer .right-viewport-scrollbar{right:1.3rem}.DicomMicroscopyViewer .top-viewport{top:.5rem}.DicomMicroscopyViewer .bottom-viewport{bottom:.5rem}.DicomMicroscopyViewer .bottom-viewport.left-viewport{bottom:.5rem;left:calc(.5rem + 250px)}.DicomMicroscopyViewer .right-viewport-scrollbar .flex{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:end}.DicomMicroscopyViewer .microscopy-viewport-overlay{background:#00000080;max-width:40%;padding:.5rem 1rem}.DicomMicroscopyViewer .microscopy-viewport-overlay .flex{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.DicomMicroscopyViewer .top-viewport .flex span:not(.font-light){-ms-flex-negative:0;flex-shrink:0}
2
+ .DicomMicroscopyViewer .OpenLayersOverlay{display:block!important;height:100%;pointer-events:none!important;width:100%}.DicomMicroscopyViewer .text-highlight{color:#ff0;font-size:14px;font-weight:400}.DicomMicroscopyViewer .text-highlight span{max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.DicomMicroscopyViewer .absolute{position:absolute}.DicomMicroscopyViewer .flex{display:-webkit-box;display:-ms-flexbox;display:flex}.DicomMicroscopyViewer .flex-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.DicomMicroscopyViewer .flex-col{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.DicomMicroscopyViewer .pointer-events-none{pointer-events:none}.DicomMicroscopyViewer .left-viewport-scrollbar{left:.5rem}.DicomMicroscopyViewer .right-viewport-scrollbar{right:1.3rem}.DicomMicroscopyViewer .top-viewport{top:.5rem}.DicomMicroscopyViewer .bottom-viewport{bottom:.5rem}.DicomMicroscopyViewer .bottom-viewport.left-viewport{bottom:.5rem;left:calc(.5rem + 250px)}.DicomMicroscopyViewer .right-viewport-scrollbar .flex{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:end}.DicomMicroscopyViewer .microscopy-viewport-overlay{background:#00000080;max-width:40%;padding:.5rem 1rem}.DicomMicroscopyViewer .microscopy-viewport-overlay .flex{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.DicomMicroscopyViewer .top-viewport .flex span:not(.font-light){-ms-flex-negative:0;flex-shrink:0}
@@ -61,11 +61,13 @@ function OHIFCornerstonePdfViewport({
61
61
  load();
62
62
  }, [renderedUrl]);
63
63
  return /*#__PURE__*/react.createElement("div", {
64
- className: "bg-primary-black h-full w-full text-white",
64
+ className: "bg-primary-black text-foreground h-full w-full",
65
65
  onClick: makePdfScrollable,
66
66
  ref: el => {
67
67
  viewportElementRef.current = el;
68
- if (el) viewportRef.register(el);
68
+ if (el) {
69
+ viewportRef.register(el);
70
+ }
69
71
  },
70
72
  "data-viewport-id": viewportId
71
73
  }, /*#__PURE__*/react.createElement("object", {
@@ -850,7 +850,7 @@ function LogicalContourOperationOptions() {
850
850
  name: icon
851
851
  }));
852
852
  }))), /*#__PURE__*/react.createElement("div", null, t(operation.label))), /*#__PURE__*/react.createElement("div", {
853
- className: "bg-primary-dark flex h-[62px] w-[88px] items-center justify-center rounded-lg"
853
+ className: "bg-muted flex h-[62px] w-[88px] items-center justify-center rounded-lg"
854
854
  }, /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.ByName, {
855
855
  name: operation.helperIcon
856
856
  }))), /*#__PURE__*/react.createElement(SegmentSelector, {
@@ -900,7 +900,7 @@ function PanelPetSUV() {
900
900
  }, /*#__PURE__*/react.createElement(ui_next_src/* PanelSection */.aUM, {
901
901
  defaultOpen: true
902
902
  }, /*#__PURE__*/react.createElement(ui_next_src/* PanelSection */.aUM.Header, null, t('Patient Information')), /*#__PURE__*/react.createElement(ui_next_src/* PanelSection */.aUM.Content, null, /*#__PURE__*/react.createElement("div", {
903
- className: "bg-primary-dark flex flex-col gap-3 p-2"
903
+ className: "bg-muted flex flex-col gap-3 p-2"
904
904
  }, /*#__PURE__*/react.createElement(InputRow, null, /*#__PURE__*/react.createElement(InputRow.Label, null, t('Patient Sex')), /*#__PURE__*/react.createElement(InputRow.Input, {
905
905
  value: metadata.PatientSex || '',
906
906
  onChange: e => {
@@ -1070,7 +1070,7 @@ function PanelRoiThresholdSegmentation() {
1070
1070
  }, /*#__PURE__*/react.createElement("div", {
1071
1071
  className: "invisible-scrollbar overflow-y-auto overflow-x-hidden"
1072
1072
  }, /*#__PURE__*/react.createElement("div", {
1073
- className: "bg-secondary-dark flex items-baseline justify-between px-2 py-1"
1073
+ className: "bg-popover flex items-baseline justify-between px-2 py-1"
1074
1074
  }, /*#__PURE__*/react.createElement("div", {
1075
1075
  className: "py-1"
1076
1076
  }, /*#__PURE__*/react.createElement("span", {
@@ -1083,7 +1083,6 @@ function PanelRoiThresholdSegmentation() {
1083
1083
  dataCY: "exportTmtvCsvReport",
1084
1084
  size: "sm",
1085
1085
  variant: "ghost",
1086
- className: "text-blue-500",
1087
1086
  onClick: handleExportCSV
1088
1087
  }, /*#__PURE__*/react.createElement("span", {
1089
1088
  className: "pl-1"
@@ -1997,7 +1996,7 @@ function ROIThresholdConfiguration({
1997
1996
  });
1998
1997
  };
1999
1998
  return /*#__PURE__*/react.createElement("div", {
2000
- className: "bg-primary-dark flex flex-col space-y-4 p-px"
1999
+ className: "bg-muted flex flex-col space-y-4 p-px"
2001
2000
  }, /*#__PURE__*/react.createElement("div", {
2002
2001
  className: "flex items-end space-x-3"
2003
2002
  }, /*#__PURE__*/react.createElement("div", {