fix(ui): Enhance UI Components and Update CornerstoneJS Dependencies and resizable panels (#4938)

Co-authored-by: Joe Boccanfuso <joe.boccanfuso@radicalimaging.com>
This commit is contained in:
Alireza 2025-04-09 16:49:55 -04:00 committed by GitHub
parent c05ec1909f
commit 43bc142439
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
46 changed files with 504 additions and 467 deletions

626
bun.lock

File diff suppressed because it is too large Load Diff

View File

@ -46,8 +46,8 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.9.4",
"@cornerstonejs/core": "^3.9.4",
"@cornerstonejs/adapters": "^3.9.5",
"@cornerstonejs/core": "^3.9.5",
"@kitware/vtk.js": "32.12.0",
"react-color": "^2.19.3"
}

View File

@ -46,8 +46,8 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.9.4",
"@cornerstonejs/core": "^3.9.4",
"@cornerstonejs/adapters": "^3.9.5",
"@cornerstonejs/core": "^3.9.5",
"@kitware/vtk.js": "32.12.0",
"react-color": "^2.19.3"
}

View File

@ -46,9 +46,9 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.9.4",
"@cornerstonejs/core": "^3.9.4",
"@cornerstonejs/tools": "^3.9.4",
"@cornerstonejs/adapters": "^3.9.5",
"@cornerstonejs/core": "^3.9.5",
"@cornerstonejs/tools": "^3.9.5",
"classnames": "^2.3.2"
}
}

View File

@ -42,8 +42,8 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/core": "^3.9.4",
"@cornerstonejs/tools": "^3.9.4",
"@cornerstonejs/core": "^3.9.5",
"@cornerstonejs/tools": "^3.9.5",
"classnames": "^2.3.2"
}
}

View File

@ -1,5 +1,5 @@
import React, { useEffect, useState, useRef } from 'react';
import { useCine } from '@ohif/ui';
import { useCine } from '@ohif/ui-next';
import { useViewportGrid } from '@ohif/ui-next';
import { utilities as csUtils, volumeLoader, eventTarget, Enums, cache } from '@cornerstonejs/core';
import { utilities as cstUtils } from '@cornerstonejs/tools';

View File

@ -38,7 +38,7 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5",
"@cornerstonejs/dicom-image-loader": "^3.9.4",
"@cornerstonejs/dicom-image-loader": "^3.9.5",
"@ohif/core": "3.10.0-beta.158",
"@ohif/ui": "3.10.0-beta.158",
"dcmjs": "*",
@ -51,12 +51,12 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.9.4",
"@cornerstonejs/ai": "^3.9.4",
"@cornerstonejs/core": "^3.9.4",
"@cornerstonejs/labelmap-interpolation": "^3.9.4",
"@cornerstonejs/polymorphic-segmentation": "^3.9.4",
"@cornerstonejs/tools": "^3.9.4",
"@cornerstonejs/adapters": "^3.9.5",
"@cornerstonejs/ai": "^3.9.5",
"@cornerstonejs/core": "^3.9.5",
"@cornerstonejs/labelmap-interpolation": "^3.9.5",
"@cornerstonejs/polymorphic-segmentation": "^3.9.5",
"@cornerstonejs/tools": "^3.9.5",
"@itk-wasm/morphological-contour-interpolation": "1.1.0",
"@kitware/vtk.js": "32.12.0",
"html2canvas": "^1.4.1",

View File

@ -229,11 +229,6 @@ const ViewportWindowLevel = ({
No window level data available
</div>
)}
{isLoading && (
<div className="text-muted-foreground py-2 text-center text-sm">
Loading window level data...
</div>
)}
</PanelSection.Content>
</PanelSection>
);

View File

@ -68,7 +68,7 @@ export default function getSegmentationPanelCustomization({ commandsManager, ser
checked={useCenterAsSegmentIndex}
onCheckedChange={handleUseCenterAsSegmentIndexChange}
/>
<span className="text-base text-white">Use Center as Segment Index</span>
<span className="text-base text-white">Use center as segment index</span>
</div>
<div className="flex items-center gap-2">

View File

@ -1,4 +1,3 @@
import React from 'react';
import { DicomMetadataStore } from '@ohif/core';
/**

View File

@ -153,7 +153,7 @@ const DicomTagBrowser = ({
</Select>
</div>
{shouldShowInstanceList && (
<div className="mx-auto flex w-1/5 flex-col">
<div className="mx-auto mt-0.5 flex w-1/4 flex-col">
<span className="text-muted-foreground flex h-6 items-center text-xs">
Instance Number ({instanceNumber} of {activeDisplaySet?.images?.length})
</span>
@ -169,7 +169,7 @@ const DicomTagBrowser = ({
/>
</div>
)}
<div className="ml-auto flex w-1/3 flex-col">
<div className="ml-auto mr-1 flex w-1/3 flex-col">
<span className="text-muted-foreground flex h-6 items-center text-xs">
Search metadata
</span>

View File

@ -28,7 +28,9 @@ const useResizablePanels = (
leftPanelClosed,
setLeftPanelClosed,
rightPanelClosed,
setRightPanelClosed
setRightPanelClosed,
hasLeftPanels,
hasRightPanels
) => {
const [leftPanelExpandedWidth, setLeftPanelExpandedWidth] = useState(
panelGroupDefinition.left.initialExpandedWidth
@ -156,6 +158,8 @@ const useResizablePanels = (
rightPanelExpandedWidth,
leftResizablePanelMinimumSize,
rightResizablePanelMinimumSize,
hasLeftPanels,
hasRightPanels,
]);
/**

View File

@ -52,7 +52,9 @@ function ViewerLayout({
leftPanelClosed,
setLeftPanelClosed,
rightPanelClosed,
setRightPanelClosed
setRightPanelClosed,
hasLeftPanels,
hasRightPanels
);
const handleMouseEnter = () => {

View File

@ -1,5 +1,5 @@
import React, { useEffect, useMemo, useState } from 'react';
import { InputDialog } from '@ohif/ui-next';
import { InputDialog, cn } from '@ohif/ui-next';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@ohif/ui-next';
import { useSystem } from '@ohif/core';
@ -71,69 +71,93 @@ function ReportDialog({ dataSources, hide, onSave, onCancel }: ReportDialogProps
const showDataSourceSelect = dataSources?.length > 1;
return (
<div className="text-foreground mt-2 flex min-w-[400px] max-w-md flex-col gap-4">
<div className="flex flex-col gap-3">
<div className="text-foreground flex min-w-[400px] max-w-md flex-col">
<div className="flex flex-col gap-4">
<div className="flex gap-4">
{showDataSourceSelect && (
<div className="mt-1 w-1/2">
<div className="mb-1 pl-1 text-base">Data source</div>
<>
<div className="mt-1 w-1/2">
<div className="mb-1 pl-1 text-base">Data source</div>
<Select
value={selectedDataSource}
onValueChange={setSelectedDataSource}
>
<SelectTrigger>
<SelectValue placeholder="Select a data source" />
</SelectTrigger>
<SelectContent>
{dataSources.map(source => (
<SelectItem
key={source.value}
value={source.value}
>
{source.label}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
<div className={showDataSourceSelect ? 'mt-1 w-1/2' : 'mt-1 w-full'}>
<div className="mb-1 pl-1 text-base">Series</div>
<Select
value={selectedSeries}
onValueChange={setSelectedSeries}
>
<SelectTrigger>
<SelectValue placeholder="Select a series" />
</SelectTrigger>
<SelectContent>
{seriesOptions.map(series => (
<SelectItem
key={series.value}
value={series.value}
>
{series.label}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
</>
)}
</div>
<div className="flex items-end gap-4">
{!showDataSourceSelect && (
<div className="w-1/3">
<div className="mb-1 pl-1 text-base">Series</div>
<Select
value={selectedDataSource}
onValueChange={setSelectedDataSource}
value={selectedSeries}
onValueChange={setSelectedSeries}
>
<SelectTrigger>
<SelectValue placeholder="Select a data source" />
<SelectValue placeholder="Select a series" />
</SelectTrigger>
<SelectContent>
{dataSources.map(source => (
{seriesOptions.map(series => (
<SelectItem
key={source.value}
value={source.value}
key={series.value}
value={series.value}
>
{source.label}
{series.label}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
)}
<div className={showDataSourceSelect ? 'mt-1 w-1/2' : 'mt-1 w-full'}>
<div className="mb-1 pl-1 text-base">Series</div>
<Select
value={selectedSeries}
onValueChange={setSelectedSeries}
>
<SelectTrigger>
<SelectValue placeholder="Select a series" />
</SelectTrigger>
<SelectContent>
{seriesOptions.map(series => (
<SelectItem
key={series.value}
value={series.value}
>
{series.label}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
</div>
<div className={showDataSourceSelect ? 'flex gap-4' : ''}>
<div className="mt-4 w-full">
<InputDialog
value={reportName}
onChange={setReportName}
submitOnEnter
>
<InputDialog.Field>
<InputDialog.Input
placeholder="Report name"
disabled={!!selectedSeries}
/>
</InputDialog.Field>
</InputDialog>
</div>
<InputDialog
value={reportName}
onChange={setReportName}
submitOnEnter
className="flex-1"
>
<InputDialog.Field className="mb-0">
<InputDialog.Input
placeholder="Report name"
disabled={!!selectedSeries}
/>
</InputDialog.Field>
</InputDialog>
</div>
<div className="flex justify-end gap-2">

View File

@ -32,8 +32,8 @@
"start": "yarn run dev"
},
"peerDependencies": {
"@cornerstonejs/core": "^3.9.4",
"@cornerstonejs/tools": "^3.9.4",
"@cornerstonejs/core": "^3.9.5",
"@cornerstonejs/tools": "^3.9.5",
"@ohif/core": "3.10.0-beta.158",
"@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.158",
"@ohif/extension-default": "3.10.0-beta.158",

View File

@ -3,7 +3,7 @@ import { FooterAction } from '@ohif/ui-next';
export function UntrackSeriesModal({ hide, onConfirm, message }) {
return (
<div className="text-foreground">
<div className="text-foreground text-[13px]">
<div>
<p>{message}</p>
<p className="mt-2">

View File

@ -53,7 +53,7 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5",
"@cornerstonejs/dicom-image-loader": "^3.9.4",
"@cornerstonejs/dicom-image-loader": "^3.9.5",
"@emotion/serialize": "^1.1.3",
"@ohif/core": "3.10.0-beta.158",
"@ohif/extension-cornerstone": "3.10.0-beta.158",

View File

@ -276,7 +276,6 @@ window.config = {
console.warn('test, navigate to https://ohif.org/');
},
// whiteLabeling: {
// /* Optional: Should return a React component to be rendered in the "Logo" section of the application's Top Navigation bar */
// createLogoComponentFn: function (React) {
// return React.createElement(
// 'a',
@ -284,14 +283,13 @@ window.config = {
// target: '_self',
// rel: 'noopener noreferrer',
// className: 'text-purple-600 line-through',
// href: '/',
// href: '_X___IDC__LOGO__LINK___Y_',
// },
// React.createElement('img',
// {
// src: './assets/customLogo.svg',
// className: 'w-8 h-8',
// }
// ))
// React.createElement('img', {
// src: './Logo.svg',
// className: 'w-14 h-14',
// })
// );
// },
// },
};

View File

@ -37,8 +37,8 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5",
"@cornerstonejs/core": "^3.9.4",
"@cornerstonejs/dicom-image-loader": "^3.9.4",
"@cornerstonejs/core": "^3.9.5",
"@cornerstonejs/dicom-image-loader": "^3.9.5",
"@ohif/ui": "3.10.0-beta.158",
"cornerstone-math": "0.1.9",
"dicom-parser": "^1.8.21"

View File

@ -518,7 +518,7 @@ const WADO_IMAGE_LOADER = {
// Fallback for DX images.
// TODO: We should use the rest of the results of this function
// to update the UI somehow
const { PixelSpacing, type } = getPixelSpacingInformation(instance);
const { PixelSpacing, type } = getPixelSpacingInformation(instance) || {};
let rowPixelSpacing;
let columnPixelSpacing;

View File

@ -0,0 +1,55 @@
---
title: routerBaseName
---
## Migration Guide: Router Configuration (`routerBasename` and `PUBLIC_URL`)
**Key Changes:**
* **`routerBasename` Default Value:** The recommended default value for `routerBasename` in the configuration file (`window.config`) has changed from `'/'` to `null`.
* **New Default Behavior:** If `routerBasename` is set to `null` (or is not defined) in the configuration, the application's base path will now automatically default to the value determined by `PUBLIC_URL`.
* **Clarified Roles:**
* `routerBasename`: Explicitly defines the base path for the application's routes (e.g., `/viewer`). If `null`, it defaults to `PUBLIC_URL`.
* `PUBLIC_URL`: Primarily defines the URL prefix from which static assets (like JavaScript files, CSS, images) are loaded. It defaults to `/` if not set.
:::info
see the comprehensive guide [here](/deployment/custom-url-access)
:::
**Migration Steps:**
1. **Review `routerBasename` Configuration:**
Locate the `routerBasename` setting within your application configuration file (typically found in `platform/app/public/config/*.js`).
2. **Update `routerBasename` Based on Hosting Scenario:**
* **Scenario A: Hosting at the Root (`/`)**
If your application is served from the root domain (e.g., `https://example.com/`), it's recommended to update `routerBasename` to `null`. This aligns the routing base with the default asset loading path (`PUBLIC_URL` which defaults to `/`).
*Example Diff:*
```diff
window.config = {
- routerBasename: '/',
+ routerBasename: null,
// ... other config options
showStudyList: true,
dataSources: [ /* ... */ ],
```
*Explanation:* Setting `routerBasename: null` leverages the new default behavior. The router will use `/` as its base because `PUBLIC_URL` defaults to `/`.
* **Scenario B: Hosting at a Subpath (e.g., `/viewer/`)**
If your application is served from a subpath (e.g., `https://example.com/viewer/`), you should ensure `routerBasename` is explicitly set to that path.
*Example (No Change Needed if Already Correct):*
```diff
window.config = {
// No change needed if already set correctly for subpath hosting
routerBasename: '/viewer',
// ... other config options
showStudyList: true,
dataSources: [ /* ... */ ],
```
*Explanation:* Explicitly setting `routerBasename` ensures the application's internal routing works correctly under the `/viewer/` path.

View File

@ -34,7 +34,6 @@ export default function ComponentsList() {
<h1 className="text-foreground mb-3 text-5xl">Components</h1>
</div>
<TabsShowcase />
<ButtonShowcase />
<CheckboxShowcase />
<DataRowShowcase />

View File

@ -176,12 +176,12 @@ const [dimensionGroupNumber, setDimensionGroupNumber] = useState(1);
mode="stepper"
min={-10}
max={10}
step={0.1}
step={1}
defaultValue={0}
>
<div className="flex items-center space-x-2">
<Numeric.NumberStepper
className="w-[65px]"
className="w-[53px]"
direction="vertical"
/>
<Numeric.Label>Zoom</Numeric.Label>

View File

@ -381,8 +381,8 @@ function NumberStepper({ className, children, direction, inputWidth }: NumberSte
onChange={handleInputChange}
onBlur={handleBlur}
className={cn(
"h-6 appearance-none border-none p-0 text-center shadow-none focus:border-none focus:outline-none",
inputWidth ? inputWidth : "w-12 max-w-12"
'h-6 appearance-none border-none p-0 text-center shadow-none focus:border-none focus:outline-none',
inputWidth
)}
/>
{children}
@ -410,16 +410,16 @@ function NumberStepper({ className, children, direction, inputWidth }: NumberSte
onBlur={handleBlur}
className={cn(
'h-6 appearance-none border-none p-0 text-center shadow-none focus:border-none focus:outline-none',
inputWidth ? inputWidth : "w-12 max-w-12"
inputWidth ? inputWidth : 'max-w-12 min-w-0'
)}
/>
<div className="ml-1 flex flex-col">
<div className="ml-1 flex flex-shrink-0 flex-col">
<Button
variant="ghost"
size="icon"
onClick={() => setSingleValue(singleValue + step)}
disabled={singleValue >= max}
className="text-primary h-3 w-5 pr-px"
className="text-primary h-3 w-5"
>
<ChevronUp className="h-3 w-3" />
</Button>
@ -428,7 +428,7 @@ function NumberStepper({ className, children, direction, inputWidth }: NumberSte
size="icon"
onClick={() => setSingleValue(singleValue - step)}
disabled={singleValue <= min}
className="text-primary h-3 w-5 pr-px"
className="text-primary h-3 w-5"
>
<ChevronDown className="h-3 w-3" />
</Button>
@ -483,4 +483,4 @@ export const Numeric = {
NumberStepper,
};
export default Numeric;
export default Numeric;

View File

@ -91,7 +91,7 @@ const ViewportDialog: React.FC<ViewportDialogProps> = ({
return (
<div
ref={notificationRef}
className="border-input bg-muted mx-2 mt-2 flex flex-col rounded-md border p-2 outline-none"
className="border-input bg-muted mx-1.5 mt-2 flex flex-col rounded-md border p-2 outline-none"
data-cy={id}
onKeyDown={onKeyPress}
tabIndex={0}

View File

@ -1,6 +1,6 @@
import * as utils from './utils';
import { cn } from './utils';
export * from './components';
export * from './contextProviders';
export * as Types from './types';
export { utils };
export { utils, cn };

View File

@ -1,4 +1,5 @@
import { getToggledClassName } from './getToggledClassName';
import roundNumber from './roundNumber';
import { cn } from '../lib/utils';
export { getToggledClassName, roundNumber };
export { getToggledClassName, roundNumber, cn };

View File

@ -1393,10 +1393,10 @@
resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==
"@cornerstonejs/adapters@^3.9.4":
version "3.9.4"
resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-3.9.4.tgz#ce12eeb800618f8a6817c80129ec140f83439990"
integrity sha512-0kuGAH5dCmxHFr+PjvH/AZJqFdVXXziEZm6Etl4yOOgY9JT81N0PZj5gaFAyvTmxyHb/EWZMhWLyG0D5XGLCmQ==
"@cornerstonejs/adapters@^3.9.5":
version "3.9.5"
resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-3.9.5.tgz#9957a97d22d79747a6deb4f2b4c2a86b8fe48331"
integrity sha512-I8nPFmwNBqBwrH26w06gZfsJaHyZPN4nZC8GO7IerkVSkyYXgFEFC5iRdVuU+Kr94nWm8zPKyLqHx7hAeNudgw==
dependencies:
"@babel/runtime-corejs2" "^7.17.8"
buffer "^6.0.3"
@ -1404,10 +1404,10 @@
gl-matrix "^3.4.3"
ndarray "^1.0.19"
"@cornerstonejs/ai@^3.9.4":
version "3.9.4"
resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-3.9.4.tgz#88417a7104ab45cfd2598087fc12fcf812b3cb41"
integrity sha512-W1mYcnddsp87Wka8UTzxNwPUF/f7wietvIxyRXQd7nPwR/nDVVbB2dLiUwirihISjumb6PnHjLyHM92on55HNA==
"@cornerstonejs/ai@^3.9.5":
version "3.9.5"
resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-3.9.5.tgz#40ac983158c325f204f605385d9bd4ad125d5844"
integrity sha512-AgVPLVoYJeefPcp6tf5UNfS8qoEJc8VxrqZab6f+LybhSa2se52h+57rCB5Ihd7SziNvWyIdux7v1Iy3GiZm+g==
dependencies:
"@babel/runtime-corejs2" "^7.17.8"
buffer "^6.0.3"
@ -1443,20 +1443,20 @@
resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.5.tgz#8690b61a86fa53ef38a70eee9d665a79229517c0"
integrity sha512-MZCUy8VG0VG5Nl1l58+g+kH3LujAzLYTfJqkwpWI2gjSrGXnP6lgwyy4GmPRZWVoS40/B1LDNALK905cNWm+sg==
"@cornerstonejs/core@^3.9.4":
version "3.9.4"
resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-3.9.4.tgz#63fe5e2749b2c01b3d427e40345eeb2d8feeedc6"
integrity sha512-kHjy2Q0iCNwQQe5FAXMHUWHqkFq3mGQ5Zzl3U9B8rQ3ne+at0wHfAFeJlRbT0uMkU1gw9AOMtb/L4QBWKy4o0A==
"@cornerstonejs/core@^3.9.5":
version "3.9.5"
resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-3.9.5.tgz#b42d8b93d2862b9673963f238e56109f299ca11e"
integrity sha512-EwXeTNSlL7UnXmj8o1DigNZOsVbhtNDKT2Bbi66jhnzZQm+rTPyYeTva+FnnqvpxBb/6QqwDEJ8gwlXwV0Rk5w==
dependencies:
"@kitware/vtk.js" "32.12.1"
comlink "^4.4.1"
gl-matrix "^3.4.3"
loglevel "^1.9.2"
"@cornerstonejs/dicom-image-loader@^3.9.4":
version "3.9.4"
resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-3.9.4.tgz#5e202e57ddbcf46b946857a2cfa2a703dc9fad9d"
integrity sha512-QGWejZ+QFCquoPqmIaHWDusaX89EN24Cih/0WcVcKPs/5VGmo6wbFZzZoKLD4tDGV8HLF8FaGdJy3vTrde9lWg==
"@cornerstonejs/dicom-image-loader@^3.9.5":
version "3.9.5"
resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-3.9.5.tgz#4ba9c97e2875fe67c524788833bdf2e38154869d"
integrity sha512-g0GZNkZ6PBRCl/dvi6NoQlmpmZhuLLeI4cdiFwV0Ug81HPkHdn8FQaqgy1XPOMknLSL6sJGZsJN2l2nW5COQSA==
dependencies:
"@cornerstonejs/codec-charls" "^1.2.3"
"@cornerstonejs/codec-libjpeg-turbo-8bit" "^1.2.2"
@ -1468,25 +1468,25 @@
pako "^2.0.4"
uuid "^9.0.0"
"@cornerstonejs/labelmap-interpolation@^3.9.4":
version "3.9.4"
resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-3.9.4.tgz#8f34f7ac32254cb54ddfacdd2687fa51f8e0c1b0"
integrity sha512-D8T6itPVHF5641axmzkR3b2RjDVXWYNxm3MuQ10LMDZsqwUNL/eeqy2+0TRpPsDL/LSuX2/i+n+udohf0jdaqg==
"@cornerstonejs/labelmap-interpolation@^3.9.5":
version "3.9.5"
resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-3.9.5.tgz#159b4a9be8002d996ff8f1a5d39b0a9b90a3bbcc"
integrity sha512-U7XnaqrrEHGvH3kKdTwGiwLYaydxp5GVo0aqVvZaRDXMXfP3tbOpCfMQcqD+bv4Sh+Rr0719O5aDJ0+ENpA/MA==
dependencies:
"@itk-wasm/morphological-contour-interpolation" "1.1.0"
itk-wasm "1.0.0-b.165"
"@cornerstonejs/polymorphic-segmentation@^3.9.4":
version "3.9.4"
resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-3.9.4.tgz#a18bf58e60de1ab6d9f915a2fadc9fde5c022fd9"
integrity sha512-fXio1P4Ic7ZQmWuTELFPAA8DfG/u6l/0f21UlC6QQNrRX7aYWtOVA6fqQdcdE3bJD+iTeJNikGdEl0j05KqNqQ==
"@cornerstonejs/polymorphic-segmentation@^3.9.5":
version "3.9.5"
resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-3.9.5.tgz#d54145b90929f9e9e90f272acf5f416c28ca33e3"
integrity sha512-6ucJkb0X5CBBx00g3CzJGuLd6x4T99bPyKXa+y9Bek3jC+RyKI4vySS5RRKtQ4N59yuealZkBvV7dT0FseE8og==
dependencies:
"@icr/polyseg-wasm" "0.4.0"
"@cornerstonejs/tools@^3.9.4":
version "3.9.4"
resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-3.9.4.tgz#4a63fc350d8f45db5a2b4fcaea8b76e0893d5083"
integrity sha512-ys2blsOp6rWHjGQvMn6x0fh1Qr9Gnr5lRTjhzucAClRgt1WWFW9v9AqwPMXDS/f94m3WFT995LuBOWlxcGUZtQ==
"@cornerstonejs/tools@^3.9.5":
version "3.9.5"
resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-3.9.5.tgz#65fa00b2e20f0442cde7f0383e96253393229bcf"
integrity sha512-vdPsm4szolXmyBdDNTB1gyRCP5EEicsf+TOsTU5P6QYWR7cB+nyio7GeGK5zFQrUi0hb2a2qkVjjLQLQH9inAw==
dependencies:
"@types/offscreencanvas" "2019.7.3"
comlink "^4.4.1"