diff --git a/.scripts/cs3d-set-version.mjs b/.scripts/cs3d-set-version.mjs index 01d8da342..bfd803e25 100644 --- a/.scripts/cs3d-set-version.mjs +++ b/.scripts/cs3d-set-version.mjs @@ -110,8 +110,9 @@ for (const pkgPath of pkgPaths) { changes += updateDeps(pkg.resolutions, version); if (changes > 0) { - // Preserve original formatting (detect indent) - const indent = content.match(/^(\s+)/m)?.[1] || ' '; + // Preserve original formatting (detect indent — restrict to spaces/tabs so + // we don't accidentally capture a CRLF newline as part of the indent string) + const indent = content.match(/^([ \t]+)/m)?.[1] || ' '; writeFileSync(pkgPath, JSON.stringify(pkg, null, indent) + '\n'); const rel = pkgPath.replace(rootDir + '/', '').replace(rootDir + '\\', ''); console.log(` Updated ${rel} (${changes} packages)`); diff --git a/addOns/package.json b/addOns/package.json index 931e844ae..8c62ce3a2 100644 --- a/addOns/package.json +++ b/addOns/package.json @@ -31,7 +31,7 @@ "@babel/plugin-transform-regenerator": "7.28.1", "@babel/plugin-transform-runtime": "7.28.0", "@babel/plugin-transform-typescript": "7.28.0", - "@babel/preset-env": "7.28.0", + "@babel/preset-env": "7.29.5", "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.1" }, diff --git a/bun.lock b/bun.lock index 0e66443c8..b5aeb37a5 100644 --- a/bun.lock +++ b/bun.lock @@ -50,7 +50,7 @@ }, "addOns/externals/devDependencies": { "name": "@externals/devDependencies", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", "@kitware/vtk.js": "34.15.1", @@ -131,22 +131,22 @@ }, "addOns/externals/dicom-microscopy-viewer": { "name": "@externals/dicom-microscopy-viewer", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "dicom-microscopy-viewer": "0.48.17", }, }, "extensions/cornerstone": { "name": "@ohif/extension-cornerstone", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.22.3", - "@cornerstonejs/ai": "4.22.3", - "@cornerstonejs/core": "4.22.3", - "@cornerstonejs/labelmap-interpolation": "4.22.3", - "@cornerstonejs/polymorphic-segmentation": "4.22.3", - "@cornerstonejs/tools": "4.22.3", + "@cornerstonejs/adapters": "4.22.8", + "@cornerstonejs/ai": "4.22.8", + "@cornerstonejs/core": "4.22.8", + "@cornerstonejs/labelmap-interpolation": "4.22.8", + "@cornerstonejs/polymorphic-segmentation": "4.22.8", + "@cornerstonejs/tools": "4.22.8", "@icr/polyseg-wasm": "0.4.0", "@itk-wasm/morphological-contour-interpolation": "1.1.0", "@kitware/vtk.js": "34.15.1", @@ -164,9 +164,9 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", - "@cornerstonejs/dicom-image-loader": "4.22.3", - "@ohif/core": "3.13.0-beta.68", - "@ohif/ui": "3.13.0-beta.68", + "@cornerstonejs/dicom-image-loader": "4.22.8", + "@ohif/core": "3.13.0-beta.74", + "@ohif/ui": "3.13.0-beta.74", "dcmjs": "0.49.4", "dicom-parser": "1.8.21", "hammerjs": "2.0.8", @@ -178,18 +178,18 @@ }, "extensions/cornerstone-dicom-pmap": { "name": "@ohif/extension-cornerstone-dicom-pmap", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.22.3", - "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/adapters": "4.22.8", + "@cornerstonejs/core": "4.22.8", "@kitware/vtk.js": "34.15.1", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.68", - "@ohif/extension-cornerstone": "3.13.0-beta.68", - "@ohif/extension-default": "3.13.0-beta.68", - "@ohif/i18n": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/extension-cornerstone": "3.13.0-beta.74", + "@ohif/extension-default": "3.13.0-beta.74", + "@ohif/i18n": "3.13.0-beta.74", "prop-types": "15.8.1", "react": "18.3.1", "react-dom": "18.3.1", @@ -200,15 +200,15 @@ }, "extensions/cornerstone-dicom-rt": { "name": "@ohif/extension-cornerstone-dicom-rt", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.68", - "@ohif/extension-cornerstone": "3.13.0-beta.68", - "@ohif/extension-default": "3.13.0-beta.68", - "@ohif/i18n": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/extension-cornerstone": "3.13.0-beta.74", + "@ohif/extension-default": "3.13.0-beta.74", + "@ohif/i18n": "3.13.0-beta.74", "prop-types": "15.8.1", "react": "18.3.1", "react-dom": "18.3.1", @@ -219,18 +219,18 @@ }, "extensions/cornerstone-dicom-seg": { "name": "@ohif/extension-cornerstone-dicom-seg", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.22.3", - "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/adapters": "4.22.8", + "@cornerstonejs/core": "4.22.8", "@kitware/vtk.js": "34.15.1", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.68", - "@ohif/extension-cornerstone": "3.13.0-beta.68", - "@ohif/extension-default": "3.13.0-beta.68", - "@ohif/i18n": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/extension-cornerstone": "3.13.0-beta.74", + "@ohif/extension-default": "3.13.0-beta.74", + "@ohif/i18n": "3.13.0-beta.74", "prop-types": "15.8.1", "react": "18.3.1", "react-dom": "18.3.1", @@ -241,19 +241,19 @@ }, "extensions/cornerstone-dicom-sr": { "name": "@ohif/extension-cornerstone-dicom-sr", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.22.3", - "@cornerstonejs/core": "4.22.3", - "@cornerstonejs/tools": "4.22.3", + "@cornerstonejs/adapters": "4.22.8", + "@cornerstonejs/core": "4.22.8", + "@cornerstonejs/tools": "4.22.8", "classnames": "2.5.1", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.68", - "@ohif/extension-cornerstone": "3.13.0-beta.68", - "@ohif/extension-measurement-tracking": "3.13.0-beta.68", - "@ohif/ui": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/extension-cornerstone": "3.13.0-beta.74", + "@ohif/extension-measurement-tracking": "3.13.0-beta.74", + "@ohif/ui": "3.13.0-beta.74", "dcmjs": "0.49.4", "dicom-parser": "1.8.21", "hammerjs": "2.0.8", @@ -263,19 +263,19 @@ }, "extensions/cornerstone-dynamic-volume": { "name": "@ohif/extension-cornerstone-dynamic-volume", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.22.3", - "@cornerstonejs/tools": "4.22.3", + "@cornerstonejs/core": "4.22.8", + "@cornerstonejs/tools": "4.22.8", "classnames": "2.5.1", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.68", - "@ohif/extension-cornerstone": "3.13.0-beta.68", - "@ohif/extension-default": "3.13.0-beta.68", - "@ohif/i18n": "3.13.0-beta.68", - "@ohif/ui": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/extension-cornerstone": "3.13.0-beta.74", + "@ohif/extension-default": "3.13.0-beta.74", + "@ohif/i18n": "3.13.0-beta.74", + "@ohif/ui": "3.13.0-beta.74", "dcmjs": "0.49.4", "dicom-parser": "1.8.21", "hammerjs": "2.0.8", @@ -285,7 +285,7 @@ }, "extensions/default": { "name": "@ohif/extension-default", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/calculate-suv": "1.1.0", @@ -294,8 +294,8 @@ "react-color": "2.19.3", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.68", - "@ohif/i18n": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/i18n": "3.13.0-beta.74", "dcmjs": "0.49.4", "dicomweb-client": "0.10.4", "prop-types": "15.8.1", @@ -309,7 +309,7 @@ }, "extensions/dicom-microscopy": { "name": "@ohif/extension-dicom-microscopy", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/codec-charls": "1.2.3", @@ -320,10 +320,10 @@ "mathjs": "12.4.3", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.68", - "@ohif/extension-default": "3.13.0-beta.68", - "@ohif/i18n": "3.13.0-beta.68", - "@ohif/ui": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/extension-default": "3.13.0-beta.74", + "@ohif/i18n": "3.13.0-beta.74", + "@ohif/ui": "3.13.0-beta.74", "prop-types": "15.8.1", "react": "18.3.1", "react-dom": "18.3.1", @@ -334,14 +334,14 @@ }, "extensions/dicom-pdf": { "name": "@ohif/extension-dicom-pdf", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.68", - "@ohif/ui": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/ui": "3.13.0-beta.74", "dcmjs": "0.49.4", "dicom-parser": "1.8.21", "hammerjs": "2.0.8", @@ -351,14 +351,14 @@ }, "extensions/dicom-video": { "name": "@ohif/extension-dicom-video", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.68", - "@ohif/ui": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/ui": "3.13.0-beta.74", "dcmjs": "0.49.4", "dicom-parser": "1.8.21", "hammerjs": "2.0.8", @@ -368,20 +368,20 @@ }, "extensions/measurement-tracking": { "name": "@ohif/extension-measurement-tracking", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", - "@ohif/ui": "3.13.0-beta.68", + "@ohif/ui": "3.13.0-beta.74", "@xstate/react": "3.2.2", "xstate": "4.38.3", }, "peerDependencies": { - "@cornerstonejs/core": "4.22.3", - "@cornerstonejs/tools": "4.22.3", - "@ohif/core": "3.13.0-beta.68", - "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.68", - "@ohif/extension-default": "3.13.0-beta.68", - "@ohif/ui": "3.13.0-beta.68", + "@cornerstonejs/core": "4.22.8", + "@cornerstonejs/tools": "4.22.8", + "@ohif/core": "3.13.0-beta.74", + "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.74", + "@ohif/extension-default": "3.13.0-beta.74", + "@ohif/ui": "3.13.0-beta.74", "classnames": "2.5.1", "dcmjs": "0.49.4", "lodash.debounce": "4.0.8", @@ -394,14 +394,14 @@ }, "extensions/test-extension": { "name": "@ohif/extension-test", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.68", - "@ohif/ui": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/ui": "3.13.0-beta.74", "dcmjs": "0.49.4", "dicom-parser": "1.8.21", "hammerjs": "2.0.8", @@ -411,7 +411,7 @@ }, "extensions/tmtv": { "name": "@ohif/extension-tmtv", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", "classnames": "2.5.1", @@ -428,16 +428,16 @@ }, "extensions/usAnnotation": { "name": "@ohif/extension-ultrasound-pleura-bline", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.22.3", - "@cornerstonejs/tools": "4.22.3", - "@ohif/core": "3.13.0-beta.68", - "@ohif/extension-cornerstone": "3.13.0-beta.68", - "@ohif/extension-default": "3.13.0-beta.68", - "@ohif/i18n": "3.13.0-beta.68", - "@ohif/ui-next": "3.13.0-beta.68", + "@cornerstonejs/core": "4.22.8", + "@cornerstonejs/tools": "4.22.8", + "@ohif/core": "3.13.0-beta.74", + "@ohif/extension-cornerstone": "3.13.0-beta.74", + "@ohif/extension-default": "3.13.0-beta.74", + "@ohif/i18n": "3.13.0-beta.74", + "@ohif/ui-next": "3.13.0-beta.74", }, "devDependencies": { "@babel/core": "7.28.0", @@ -450,7 +450,7 @@ "@babel/plugin-transform-regenerator": "7.28.1", "@babel/plugin-transform-runtime": "7.28.0", "@babel/plugin-transform-typescript": "7.28.0", - "@babel/preset-env": "7.28.0", + "@babel/preset-env": "7.29.5", "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.1", "@svgr/webpack": "8.1.0", @@ -476,7 +476,7 @@ }, "modes/basic": { "name": "@ohif/mode-basic", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", }, @@ -485,19 +485,19 @@ "webpack-merge": "5.10.0", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.68", - "@ohif/extension-cornerstone": "3.13.0-beta.68", - "@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.68", - "@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.68", - "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.68", - "@ohif/extension-default": "3.13.0-beta.68", - "@ohif/extension-dicom-pdf": "3.13.0-beta.68", - "@ohif/extension-dicom-video": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/extension-cornerstone": "3.13.0-beta.74", + "@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.74", + "@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.74", + "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.74", + "@ohif/extension-default": "3.13.0-beta.74", + "@ohif/extension-dicom-pdf": "3.13.0-beta.74", + "@ohif/extension-dicom-video": "3.13.0-beta.74", }, }, "modes/basic-dev-mode": { "name": "@ohif/mode-basic-dev-mode", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -507,17 +507,17 @@ "webpack-merge": "5.10.0", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.68", - "@ohif/extension-cornerstone": "3.13.0-beta.68", - "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.68", - "@ohif/extension-default": "3.13.0-beta.68", - "@ohif/extension-dicom-pdf": "3.13.0-beta.68", - "@ohif/extension-dicom-video": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/extension-cornerstone": "3.13.0-beta.74", + "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.74", + "@ohif/extension-default": "3.13.0-beta.74", + "@ohif/extension-dicom-pdf": "3.13.0-beta.74", + "@ohif/extension-dicom-video": "3.13.0-beta.74", }, }, "modes/basic-test-mode": { "name": "@ohif/mode-test", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -527,19 +527,19 @@ "webpack-merge": "5.10.0", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.68", - "@ohif/extension-cornerstone": "3.13.0-beta.68", - "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.68", - "@ohif/extension-default": "3.13.0-beta.68", - "@ohif/extension-dicom-pdf": "3.13.0-beta.68", - "@ohif/extension-dicom-video": "3.13.0-beta.68", - "@ohif/extension-measurement-tracking": "3.13.0-beta.68", - "@ohif/extension-test": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/extension-cornerstone": "3.13.0-beta.74", + "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.74", + "@ohif/extension-default": "3.13.0-beta.74", + "@ohif/extension-dicom-pdf": "3.13.0-beta.74", + "@ohif/extension-dicom-video": "3.13.0-beta.74", + "@ohif/extension-measurement-tracking": "3.13.0-beta.74", + "@ohif/extension-test": "3.13.0-beta.74", }, }, "modes/longitudinal": { "name": "@ohif/mode-longitudinal", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -549,33 +549,33 @@ "webpack-merge": "5.10.0", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.68", - "@ohif/extension-cornerstone": "3.13.0-beta.68", - "@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.68", - "@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.68", - "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.68", - "@ohif/extension-default": "3.13.0-beta.68", - "@ohif/extension-dicom-pdf": "3.13.0-beta.68", - "@ohif/extension-dicom-video": "3.13.0-beta.68", - "@ohif/extension-measurement-tracking": "3.13.0-beta.68", - "@ohif/mode-basic": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/extension-cornerstone": "3.13.0-beta.74", + "@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.74", + "@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.74", + "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.74", + "@ohif/extension-default": "3.13.0-beta.74", + "@ohif/extension-dicom-pdf": "3.13.0-beta.74", + "@ohif/extension-dicom-video": "3.13.0-beta.74", + "@ohif/extension-measurement-tracking": "3.13.0-beta.74", + "@ohif/mode-basic": "3.13.0-beta.74", }, }, "modes/microscopy": { "name": "@ohif/mode-microscopy", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.68", - "@ohif/extension-dicom-microscopy": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/extension-dicom-microscopy": "3.13.0-beta.74", }, }, "modes/preclinical-4d": { "name": "@ohif/mode-preclinical-4d", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", }, @@ -594,7 +594,7 @@ }, "modes/segmentation": { "name": "@ohif/mode-segmentation", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -609,7 +609,7 @@ "@babel/plugin-transform-regenerator": "7.28.1", "@babel/plugin-transform-runtime": "7.28.0", "@babel/plugin-transform-typescript": "7.28.0", - "@babel/preset-env": "7.28.0", + "@babel/preset-env": "7.29.5", "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.1", "@svgr/webpack": "8.1.0", @@ -623,20 +623,20 @@ "webpack-merge": "5.10.0", }, "peerDependencies": { - "@ohif/core": "3.13.0-beta.68", - "@ohif/extension-cornerstone": "3.13.0-beta.68", - "@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.68", - "@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.68", - "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.68", - "@ohif/extension-default": "3.13.0-beta.68", - "@ohif/extension-dicom-pdf": "3.13.0-beta.68", - "@ohif/extension-dicom-video": "3.13.0-beta.68", - "@ohif/mode-basic": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/extension-cornerstone": "3.13.0-beta.74", + "@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.74", + "@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.74", + "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.74", + "@ohif/extension-default": "3.13.0-beta.74", + "@ohif/extension-dicom-pdf": "3.13.0-beta.74", + "@ohif/extension-dicom-video": "3.13.0-beta.74", + "@ohif/mode-basic": "3.13.0-beta.74", }, }, "modes/tmtv": { "name": "@ohif/mode-tmtv", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", "i18next": "17.3.1", @@ -657,14 +657,14 @@ }, "modes/usAnnotation": { "name": "@ohif/mode-ultrasound-pleura-bline", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.22.3", - "@cornerstonejs/tools": "4.22.3", - "@ohif/core": "3.13.0-beta.68", - "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.68", - "@ohif/extension-ultrasound-pleura-bline": "3.13.0-beta.68", + "@cornerstonejs/core": "4.22.8", + "@cornerstonejs/tools": "4.22.8", + "@ohif/core": "3.13.0-beta.74", + "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.74", + "@ohif/extension-ultrasound-pleura-bline": "3.13.0-beta.74", "i18next": "17.3.1", }, "devDependencies": { @@ -677,7 +677,7 @@ "@babel/plugin-transform-regenerator": "7.28.1", "@babel/plugin-transform-runtime": "7.28.0", "@babel/plugin-transform-typescript": "7.28.0", - "@babel/preset-env": "7.28.0", + "@babel/preset-env": "7.29.5", "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.1", "@svgr/webpack": "8.1.0", @@ -693,34 +693,34 @@ }, "platform/app": { "name": "@ohif/app", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", "@cornerstonejs/codec-charls": "1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", - "@cornerstonejs/dicom-image-loader": "4.22.3", + "@cornerstonejs/dicom-image-loader": "4.22.8", "@emotion/serialize": "1.3.3", - "@ohif/core": "3.13.0-beta.68", - "@ohif/extension-cornerstone": "3.13.0-beta.68", - "@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.68", - "@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.68", - "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.68", - "@ohif/extension-default": "3.13.0-beta.68", - "@ohif/extension-dicom-microscopy": "3.13.0-beta.68", - "@ohif/extension-dicom-pdf": "3.13.0-beta.68", - "@ohif/extension-dicom-video": "3.13.0-beta.68", - "@ohif/extension-test": "3.13.0-beta.68", - "@ohif/extension-ultrasound-pleura-bline": "3.13.0-beta.68", - "@ohif/i18n": "3.13.0-beta.68", - "@ohif/mode-basic-dev-mode": "3.13.0-beta.68", - "@ohif/mode-longitudinal": "3.13.0-beta.68", - "@ohif/mode-microscopy": "3.13.0-beta.68", - "@ohif/mode-test": "3.13.0-beta.68", - "@ohif/mode-ultrasound-pleura-bline": "3.13.0-beta.68", - "@ohif/ui": "3.13.0-beta.68", - "@ohif/ui-next": "3.13.0-beta.68", + "@ohif/core": "3.13.0-beta.74", + "@ohif/extension-cornerstone": "3.13.0-beta.74", + "@ohif/extension-cornerstone-dicom-rt": "3.13.0-beta.74", + "@ohif/extension-cornerstone-dicom-seg": "3.13.0-beta.74", + "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.74", + "@ohif/extension-default": "3.13.0-beta.74", + "@ohif/extension-dicom-microscopy": "3.13.0-beta.74", + "@ohif/extension-dicom-pdf": "3.13.0-beta.74", + "@ohif/extension-dicom-video": "3.13.0-beta.74", + "@ohif/extension-test": "3.13.0-beta.74", + "@ohif/extension-ultrasound-pleura-bline": "3.13.0-beta.74", + "@ohif/i18n": "3.13.0-beta.74", + "@ohif/mode-basic-dev-mode": "3.13.0-beta.74", + "@ohif/mode-longitudinal": "3.13.0-beta.74", + "@ohif/mode-microscopy": "3.13.0-beta.74", + "@ohif/mode-test": "3.13.0-beta.74", + "@ohif/mode-ultrasound-pleura-bline": "3.13.0-beta.74", + "@ohif/ui": "3.13.0-beta.74", + "@ohif/ui-next": "3.13.0-beta.74", "@svgr/webpack": "8.1.0", "@types/react": "18.3.23", "classnames": "2.5.1", @@ -772,7 +772,7 @@ }, "platform/cli": { "name": "@ohif/cli", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "bin": { "ohif-cli": "src/index.js", }, @@ -796,7 +796,7 @@ }, "platform/core": { "name": "@ohif/core", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", "dcmjs": "0.49.4", @@ -821,16 +821,16 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", - "@cornerstonejs/core": "4.22.3", - "@cornerstonejs/dicom-image-loader": "4.22.3", - "@ohif/ui": "3.13.0-beta.68", + "@cornerstonejs/core": "4.22.8", + "@cornerstonejs/dicom-image-loader": "4.22.8", + "@ohif/ui": "3.13.0-beta.74", "cornerstone-math": "0.1.10", "dicom-parser": "1.8.21", }, }, "platform/i18n": { "name": "@ohif/i18n", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@babel/runtime": "7.28.2", "i18next-locize-backend": "2.2.2", @@ -855,7 +855,7 @@ }, "platform/ui": { "name": "@ohif/ui", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@testing-library/react": "13.4.0", "browser-detect": "0.2.28", @@ -905,7 +905,7 @@ }, "platform/ui-next": { "name": "@ohif/ui-next", - "version": "3.13.0-beta.68", + "version": "3.13.0-beta.74", "dependencies": { "@radix-ui/react-accordion": "1.2.11", "@radix-ui/react-checkbox": "1.3.2", @@ -1245,9 +1245,9 @@ "@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="], - "@cornerstonejs/adapters": ["@cornerstonejs/adapters@4.22.3", "", { "dependencies": { "@babel/runtime-corejs2": "7.26.10", "buffer": "6.0.3", "dcmjs": "0.49.4", "gl-matrix": "3.4.3", "ndarray": "1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "4.22.3", "@cornerstonejs/tools": "4.22.3" } }, "sha512-58TaTUl7AmLARnKApfz9c5IWzIaPPewH8sjD0BxKu5PeVHSRSlKX7jH4pv1akapIbDqXBEW6unb45kLmm6u7dg=="], + "@cornerstonejs/adapters": ["@cornerstonejs/adapters@4.22.8", "", { "dependencies": { "@babel/runtime-corejs2": "7.26.10", "buffer": "6.0.3", "dcmjs": "0.49.4", "gl-matrix": "3.4.3", "ndarray": "1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "4.22.8", "@cornerstonejs/tools": "4.22.8" } }, "sha512-WUphdrsQVGqUN5KPt75FN4a7/tL49k41eCLa5fW8FmhNoi/NkmCPlr91z0ixf07P2dMtzv/eSmJ3IZI6W+FIrw=="], - "@cornerstonejs/ai": ["@cornerstonejs/ai@4.22.3", "", { "dependencies": { "@babel/runtime-corejs2": "7.26.10", "buffer": "6.0.3", "dcmjs": "0.49.4", "gl-matrix": "3.4.3", "lodash.clonedeep": "4.5.0", "ndarray": "1.0.19", "onnxruntime-common": "1.17.1", "onnxruntime-web": "1.17.1" }, "peerDependencies": { "@cornerstonejs/core": "4.22.3", "@cornerstonejs/tools": "4.22.3" } }, "sha512-NhRcQISjcDCp7rWCK9hGmCgsS36XKyT4AsCBgXuG7iU3ghI77j5kt9sUdqi0M4lRYLYZ1XMrFSDjNDCwFP+eYg=="], + "@cornerstonejs/ai": ["@cornerstonejs/ai@4.22.8", "", { "dependencies": { "@babel/runtime-corejs2": "7.26.10", "buffer": "6.0.3", "dcmjs": "0.49.4", "gl-matrix": "3.4.3", "lodash.clonedeep": "4.5.0", "ndarray": "1.0.19", "onnxruntime-common": "1.17.1", "onnxruntime-web": "1.17.1" }, "peerDependencies": { "@cornerstonejs/core": "4.22.8", "@cornerstonejs/tools": "4.22.8" } }, "sha512-rN/7nicjphDsOWqPGTzbq/BTJD8dy2r7XW4P46FnyEPRmO8KVisTOvHaEEu3EklMVqvodbRzigW73kO1mh7eNw=="], "@cornerstonejs/calculate-suv": ["@cornerstonejs/calculate-suv@1.1.0", "", {}, "sha512-Q9XraiDJif9aMFArD2iEuDO/HXbcRVCqB7KfaHgDrdTTjgDFovS91Psbdim7crypRSvE6dh/+HKeFNHdvNkA6w=="], @@ -1259,15 +1259,15 @@ "@cornerstonejs/codec-openjph": ["@cornerstonejs/codec-openjph@2.4.7", "", {}, "sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w=="], - "@cornerstonejs/core": ["@cornerstonejs/core@4.22.3", "", { "dependencies": { "@kitware/vtk.js": "34.15.1", "comlink": "4.4.2", "gl-matrix": "3.4.3", "loglevel": "1.9.2" } }, "sha512-oxLcg24ER3HHSAEsz3iG7+cb2oHnVSzt7H8EeRtK69e6Ztjl6XkEmXeAbbJypm2QYIkPYb3oJb6zWeYOz1NtYw=="], + "@cornerstonejs/core": ["@cornerstonejs/core@4.22.8", "", { "dependencies": { "@kitware/vtk.js": "34.15.1", "comlink": "4.4.2", "gl-matrix": "3.4.3", "loglevel": "1.9.2" } }, "sha512-GOv8sTwV3hqhZpAYSFH/yhNj15TgcWh364ndIegT29g87FURHu8Ql9cF6irOamAuehJ3YKfbPxUZzqiXtfyPDg=="], - "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@4.22.3", "", { "dependencies": { "@cornerstonejs/codec-charls": "1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", "comlink": "4.4.2", "dicom-parser": "1.8.21", "jpeg-lossless-decoder-js": "2.1.2", "pako": "2.1.0", "uuid": "9.0.1" }, "peerDependencies": { "@cornerstonejs/core": "4.22.3" } }, "sha512-TVPSc3PUvy2I6+ZnWX8B2uqJZ5onUd/+e+m/BfeEdZC51GMhC4VfTmqOwOjWDNDyO35ZA9j1mqk8iIJzDpqoeA=="], + "@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@4.22.8", "", { "dependencies": { "@cornerstonejs/codec-charls": "1.2.3", "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", "comlink": "4.4.2", "dicom-parser": "1.8.21", "jpeg-lossless-decoder-js": "2.1.2", "pako": "2.1.0", "uuid": "9.0.1" }, "peerDependencies": { "@cornerstonejs/core": "4.22.8" } }, "sha512-3Bb3xJiO9ddDCeT/wHL8R0G1t8W4+aYY8N9YGV+eMUI1WTkRES3WH3N7U8EtjLYXKqfc15NIEe78Otf2qS+CgQ=="], - "@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@4.22.3", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "4.22.3", "@cornerstonejs/tools": "4.22.3", "@kitware/vtk.js": "34.15.1" } }, "sha512-ngschi2EKr+47LWbbTiu6tt3aw4e7yp0mVCDXwJm1Z2eyugemiiAQvOT77EKSBZ//L2fAZR3Edr+qJFzPa5KUw=="], + "@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@4.22.8", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "4.22.8", "@cornerstonejs/tools": "4.22.8", "@kitware/vtk.js": "34.15.1" } }, "sha512-GKr123lPCr6Tl3GDOFMjm0m+gexDvAJjYYGshCcSx6/pT6PT30ALRXi0pXXdcGr1kbk9SKEMM1uzxFLXJs6uIQ=="], - "@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@4.22.3", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "4.22.3", "@cornerstonejs/tools": "4.22.3", "@kitware/vtk.js": "34.15.1" } }, "sha512-JNmtLbuwY8de3uwFf1YqySp5wt2BCT6kpg9gcoDNMmNxGDo0uT5yph1Muh+24sG7WDaoRwyzAEvG11h9NHgoqw=="], + "@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@4.22.8", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "4.22.8", "@cornerstonejs/tools": "4.22.8", "@kitware/vtk.js": "34.15.1" } }, "sha512-cLliz/E4BjKKw7rnyYvDprc8BK011LwaCwvWv6h9iUGWm2j72NhsRLf2jdcpEav3wyUJtWDHlvXO3QBzlHHW0A=="], - "@cornerstonejs/tools": ["@cornerstonejs/tools@4.22.3", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "4.4.2", "lodash.get": "4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "4.22.3", "@kitware/vtk.js": "34.15.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", "d3-array": "3.2.4", "d3-interpolate": "3.0.1", "gl-matrix": "3.4.3" } }, "sha512-2XQmUesRWiqWTh3xGnLsQ6qqKI55vSVV4UqGXiPxnMcf6azDfEhcJO8JJCH1VXaDa89jxLBdZUDehUnb0UsIxA=="], + "@cornerstonejs/tools": ["@cornerstonejs/tools@4.22.8", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "4.4.2", "lodash.get": "4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "4.22.8", "@kitware/vtk.js": "34.15.1", "@types/d3-array": "3.2.1", "@types/d3-interpolate": "3.0.4", "d3-array": "3.2.4", "d3-interpolate": "3.0.1", "gl-matrix": "3.4.3" } }, "sha512-vDTMIOJ+oZJyPixg/iQbYNM9XFz2Ud+VGMAf6mAP3LhpH7ofCh0Phkf9BtJiCjKT+IQqloFSvWjy6aoLd8KNJA=="], "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], @@ -5581,12 +5581,6 @@ "@ohif/app/copy-webpack-plugin": ["copy-webpack-plugin@10.2.4", "", { "dependencies": { "fast-glob": "^3.2.7", "glob-parent": "^6.0.1", "globby": "^12.0.2", "normalize-path": "^3.0.0", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg=="], - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env": ["@babel/preset-env@7.28.0", "", { "dependencies": { "@babel/compat-data": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-import-assertions": "^7.27.1", "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", "@babel/plugin-transform-block-scoping": "^7.28.0", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.27.1", "@babel/plugin-transform-classes": "^7.28.0", "@babel/plugin-transform-computed-properties": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/plugin-transform-exponentiation-operator": "^7.27.1", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", "@babel/plugin-transform-json-strings": "^7.27.1", "@babel/plugin-transform-literals": "^7.27.1", "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-modules-systemjs": "^7.27.1", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", "@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", "@babel/plugin-transform-regenerator": "^7.28.0", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", "@babel/plugin-transform-spread": "^7.27.1", "@babel/plugin-transform-sticky-regex": "^7.27.1", "@babel/plugin-transform-template-literals": "^7.27.1", "@babel/plugin-transform-typeof-symbol": "^7.27.1", "@babel/plugin-transform-unicode-escapes": "^7.27.1", "@babel/plugin-transform-unicode-property-regex": "^7.27.1", "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg=="], - - "@ohif/mode-segmentation/@babel/preset-env": ["@babel/preset-env@7.28.0", "", { "dependencies": { "@babel/compat-data": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-import-assertions": "^7.27.1", "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", "@babel/plugin-transform-block-scoping": "^7.28.0", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.27.1", "@babel/plugin-transform-classes": "^7.28.0", "@babel/plugin-transform-computed-properties": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/plugin-transform-exponentiation-operator": "^7.27.1", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", "@babel/plugin-transform-json-strings": "^7.27.1", "@babel/plugin-transform-literals": "^7.27.1", "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-modules-systemjs": "^7.27.1", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", "@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", "@babel/plugin-transform-regenerator": "^7.28.0", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", "@babel/plugin-transform-spread": "^7.27.1", "@babel/plugin-transform-sticky-regex": "^7.27.1", "@babel/plugin-transform-template-literals": "^7.27.1", "@babel/plugin-transform-typeof-symbol": "^7.27.1", "@babel/plugin-transform-unicode-escapes": "^7.27.1", "@babel/plugin-transform-unicode-property-regex": "^7.27.1", "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env": ["@babel/preset-env@7.28.0", "", { "dependencies": { "@babel/compat-data": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-import-assertions": "^7.27.1", "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", "@babel/plugin-transform-block-scoping": "^7.28.0", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.27.1", "@babel/plugin-transform-classes": "^7.28.0", "@babel/plugin-transform-computed-properties": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/plugin-transform-exponentiation-operator": "^7.27.1", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", "@babel/plugin-transform-json-strings": "^7.27.1", "@babel/plugin-transform-literals": "^7.27.1", "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-modules-systemjs": "^7.27.1", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", "@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", "@babel/plugin-transform-regenerator": "^7.28.0", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", "@babel/plugin-transform-spread": "^7.27.1", "@babel/plugin-transform-sticky-regex": "^7.27.1", "@babel/plugin-transform-template-literals": "^7.27.1", "@babel/plugin-transform-typeof-symbol": "^7.27.1", "@babel/plugin-transform-unicode-escapes": "^7.27.1", "@babel/plugin-transform-unicode-property-regex": "^7.27.1", "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg=="], - "@protobufjs/fetch/@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], "@rollup/plugin-node-resolve/deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], @@ -6669,180 +6663,6 @@ "@ohif/app/copy-webpack-plugin/globby": ["globby@12.2.0", "", { "dependencies": { "array-union": "^3.0.1", "dir-glob": "^3.0.1", "fast-glob": "^3.2.7", "ignore": "^5.1.9", "merge2": "^1.4.1", "slash": "^4.0.0" } }, "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA=="], - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/compat-data": ["@babel/compat-data@7.28.0", "", {}, "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-bugfix-firefox-class-in-computed-class-key": ["@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ["@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-syntax-import-assertions": ["@babel/plugin-syntax-import-assertions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-async-generator-functions": ["@babel/plugin-transform-async-generator-functions@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-async-to-generator": ["@babel/plugin-transform-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-class-static-block": ["@babel/plugin-transform-class-static-block@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-classes": ["@babel/plugin-transform-classes@7.28.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-computed-properties": ["@babel/plugin-transform-computed-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/template": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-dotall-regex": ["@babel/plugin-transform-dotall-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-duplicate-named-capturing-groups-regex": ["@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-explicit-resource-management": ["@babel/plugin-transform-explicit-resource-management@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-exponentiation-operator": ["@babel/plugin-transform-exponentiation-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-json-strings": ["@babel/plugin-transform-json-strings@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-named-capturing-groups-regex": ["@babel/plugin-transform-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-nullish-coalescing-operator": ["@babel/plugin-transform-nullish-coalescing-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-numeric-separator": ["@babel/plugin-transform-numeric-separator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-optional-catch-binding": ["@babel/plugin-transform-optional-catch-binding@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-regexp-modifiers": ["@babel/plugin-transform-regexp-modifiers@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-spread": ["@babel/plugin-transform-spread@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-unicode-property-regex": ["@babel/plugin-transform-unicode-property-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-unicode-sets-regex": ["@babel/plugin-transform-unicode-sets-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/core-js-compat": ["core-js-compat@3.44.0", "", { "dependencies": { "browserslist": "^4.25.1" } }, "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA=="], - - "@ohif/extension-ultrasound-pleura-bline/@babel/preset-env/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/compat-data": ["@babel/compat-data@7.28.0", "", {}, "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-bugfix-firefox-class-in-computed-class-key": ["@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ["@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-syntax-import-assertions": ["@babel/plugin-syntax-import-assertions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-async-generator-functions": ["@babel/plugin-transform-async-generator-functions@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-async-to-generator": ["@babel/plugin-transform-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-class-static-block": ["@babel/plugin-transform-class-static-block@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-classes": ["@babel/plugin-transform-classes@7.28.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-computed-properties": ["@babel/plugin-transform-computed-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/template": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-dotall-regex": ["@babel/plugin-transform-dotall-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-duplicate-named-capturing-groups-regex": ["@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-explicit-resource-management": ["@babel/plugin-transform-explicit-resource-management@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-exponentiation-operator": ["@babel/plugin-transform-exponentiation-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-json-strings": ["@babel/plugin-transform-json-strings@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-named-capturing-groups-regex": ["@babel/plugin-transform-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-nullish-coalescing-operator": ["@babel/plugin-transform-nullish-coalescing-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-numeric-separator": ["@babel/plugin-transform-numeric-separator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-optional-catch-binding": ["@babel/plugin-transform-optional-catch-binding@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-regexp-modifiers": ["@babel/plugin-transform-regexp-modifiers@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-spread": ["@babel/plugin-transform-spread@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-unicode-property-regex": ["@babel/plugin-transform-unicode-property-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q=="], - - "@ohif/mode-segmentation/@babel/preset-env/@babel/plugin-transform-unicode-sets-regex": ["@babel/plugin-transform-unicode-sets-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw=="], - - "@ohif/mode-segmentation/@babel/preset-env/core-js-compat": ["core-js-compat@3.44.0", "", { "dependencies": { "browserslist": "^4.25.1" } }, "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA=="], - - "@ohif/mode-segmentation/@babel/preset-env/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/compat-data": ["@babel/compat-data@7.28.0", "", {}, "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-bugfix-firefox-class-in-computed-class-key": ["@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ["@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-syntax-import-assertions": ["@babel/plugin-syntax-import-assertions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-async-generator-functions": ["@babel/plugin-transform-async-generator-functions@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-async-to-generator": ["@babel/plugin-transform-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-class-static-block": ["@babel/plugin-transform-class-static-block@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-classes": ["@babel/plugin-transform-classes@7.28.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-computed-properties": ["@babel/plugin-transform-computed-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/template": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-dotall-regex": ["@babel/plugin-transform-dotall-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-duplicate-named-capturing-groups-regex": ["@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-explicit-resource-management": ["@babel/plugin-transform-explicit-resource-management@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-exponentiation-operator": ["@babel/plugin-transform-exponentiation-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-json-strings": ["@babel/plugin-transform-json-strings@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-named-capturing-groups-regex": ["@babel/plugin-transform-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-nullish-coalescing-operator": ["@babel/plugin-transform-nullish-coalescing-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-numeric-separator": ["@babel/plugin-transform-numeric-separator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-optional-catch-binding": ["@babel/plugin-transform-optional-catch-binding@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-regexp-modifiers": ["@babel/plugin-transform-regexp-modifiers@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-spread": ["@babel/plugin-transform-spread@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-unicode-property-regex": ["@babel/plugin-transform-unicode-property-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/@babel/plugin-transform-unicode-sets-regex": ["@babel/plugin-transform-unicode-sets-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/core-js-compat": ["core-js-compat@3.44.0", "", { "dependencies": { "browserslist": "^4.25.1" } }, "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA=="], - - "@ohif/mode-ultrasound-pleura-bline/@babel/preset-env/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@rspack/binding-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="], "@sigstore/sign/make-fetch-happen/minipass-fetch": ["minipass-fetch@5.0.1", "", { "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^2.0.0", "minizlib": "^3.0.1" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "sha512-yHK8pb0iCGat0lDrs/D6RZmCdaBT64tULXjdxjSMAqoDi18Q3qKEUTHypHQZQd9+FYpIS+lkvpq6C/R6SbUeRw=="], diff --git a/extensions/cornerstone-dicom-pmap/package.json b/extensions/cornerstone-dicom-pmap/package.json index 69f719eff..9e37cd72e 100644 --- a/extensions/cornerstone-dicom-pmap/package.json +++ b/extensions/cornerstone-dicom-pmap/package.json @@ -46,8 +46,8 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.22.3", - "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/adapters": "4.22.8", + "@cornerstonejs/core": "4.22.8", "@kitware/vtk.js": "34.15.1" } } diff --git a/extensions/cornerstone-dicom-seg/package.json b/extensions/cornerstone-dicom-seg/package.json index 86f267e59..b888cabce 100644 --- a/extensions/cornerstone-dicom-seg/package.json +++ b/extensions/cornerstone-dicom-seg/package.json @@ -46,8 +46,8 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.22.3", - "@cornerstonejs/core": "4.22.3", + "@cornerstonejs/adapters": "4.22.8", + "@cornerstonejs/core": "4.22.8", "@kitware/vtk.js": "34.15.1" } } diff --git a/extensions/cornerstone-dicom-sr/package.json b/extensions/cornerstone-dicom-sr/package.json index d87a21582..dc2fb1474 100644 --- a/extensions/cornerstone-dicom-sr/package.json +++ b/extensions/cornerstone-dicom-sr/package.json @@ -46,9 +46,9 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.22.3", - "@cornerstonejs/core": "4.22.3", - "@cornerstonejs/tools": "4.22.3", + "@cornerstonejs/adapters": "4.22.8", + "@cornerstonejs/core": "4.22.8", + "@cornerstonejs/tools": "4.22.8", "classnames": "2.5.1" } } diff --git a/extensions/cornerstone-dynamic-volume/package.json b/extensions/cornerstone-dynamic-volume/package.json index 1b6535d41..728827409 100644 --- a/extensions/cornerstone-dynamic-volume/package.json +++ b/extensions/cornerstone-dynamic-volume/package.json @@ -42,8 +42,8 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.22.3", - "@cornerstonejs/tools": "4.22.3", + "@cornerstonejs/core": "4.22.8", + "@cornerstonejs/tools": "4.22.8", "classnames": "2.5.1" } } diff --git a/extensions/cornerstone/package.json b/extensions/cornerstone/package.json index 9ac9371c6..5f38b1d5f 100644 --- a/extensions/cornerstone/package.json +++ b/extensions/cornerstone/package.json @@ -40,7 +40,7 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", - "@cornerstonejs/dicom-image-loader": "4.22.3", + "@cornerstonejs/dicom-image-loader": "4.22.8", "@ohif/core": "3.13.0-beta.74", "@ohif/ui": "3.13.0-beta.74", "dcmjs": "0.49.4", @@ -53,12 +53,12 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/adapters": "4.22.3", - "@cornerstonejs/ai": "4.22.3", - "@cornerstonejs/core": "4.22.3", - "@cornerstonejs/labelmap-interpolation": "4.22.3", - "@cornerstonejs/polymorphic-segmentation": "4.22.3", - "@cornerstonejs/tools": "4.22.3", + "@cornerstonejs/adapters": "4.22.8", + "@cornerstonejs/ai": "4.22.8", + "@cornerstonejs/core": "4.22.8", + "@cornerstonejs/labelmap-interpolation": "4.22.8", + "@cornerstonejs/polymorphic-segmentation": "4.22.8", + "@cornerstonejs/tools": "4.22.8", "@icr/polyseg-wasm": "0.4.0", "@itk-wasm/morphological-contour-interpolation": "1.1.0", "@kitware/vtk.js": "34.15.1", diff --git a/extensions/measurement-tracking/package.json b/extensions/measurement-tracking/package.json index a0f5fd522..226447b82 100644 --- a/extensions/measurement-tracking/package.json +++ b/extensions/measurement-tracking/package.json @@ -32,8 +32,8 @@ "start": "yarn run dev" }, "peerDependencies": { - "@cornerstonejs/core": "4.22.3", - "@cornerstonejs/tools": "4.22.3", + "@cornerstonejs/core": "4.22.8", + "@cornerstonejs/tools": "4.22.8", "@ohif/core": "3.13.0-beta.74", "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.74", "@ohif/extension-default": "3.13.0-beta.74", diff --git a/extensions/usAnnotation/package.json b/extensions/usAnnotation/package.json index fc2a5069a..dca040b29 100644 --- a/extensions/usAnnotation/package.json +++ b/extensions/usAnnotation/package.json @@ -42,8 +42,8 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.22.3", - "@cornerstonejs/tools": "4.22.3", + "@cornerstonejs/core": "4.22.8", + "@cornerstonejs/tools": "4.22.8", "@ohif/core": "3.13.0-beta.74", "@ohif/extension-cornerstone": "3.13.0-beta.74", "@ohif/extension-default": "3.13.0-beta.74", @@ -61,7 +61,7 @@ "@babel/plugin-transform-regenerator": "7.28.1", "@babel/plugin-transform-runtime": "7.28.0", "@babel/plugin-transform-typescript": "7.28.0", - "@babel/preset-env": "7.28.0", + "@babel/preset-env": "7.29.5", "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.1", "@svgr/webpack": "8.1.0", diff --git a/modes/segmentation/package.json b/modes/segmentation/package.json index 8bd44d380..461b2e79c 100644 --- a/modes/segmentation/package.json +++ b/modes/segmentation/package.json @@ -59,7 +59,7 @@ "@babel/plugin-transform-regenerator": "7.28.1", "@babel/plugin-transform-runtime": "7.28.0", "@babel/plugin-transform-typescript": "7.28.0", - "@babel/preset-env": "7.28.0", + "@babel/preset-env": "7.29.5", "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.1", "@svgr/webpack": "8.1.0", diff --git a/modes/usAnnotation/package.json b/modes/usAnnotation/package.json index 0efa65d13..01b35fadd 100644 --- a/modes/usAnnotation/package.json +++ b/modes/usAnnotation/package.json @@ -34,8 +34,8 @@ }, "dependencies": { "@babel/runtime": "7.28.2", - "@cornerstonejs/core": "4.22.3", - "@cornerstonejs/tools": "4.22.3", + "@cornerstonejs/core": "4.22.8", + "@cornerstonejs/tools": "4.22.8", "@ohif/core": "3.13.0-beta.74", "@ohif/extension-cornerstone-dicom-sr": "3.13.0-beta.74", "@ohif/extension-ultrasound-pleura-bline": "3.13.0-beta.74", @@ -51,7 +51,7 @@ "@babel/plugin-transform-regenerator": "7.28.1", "@babel/plugin-transform-runtime": "7.28.0", "@babel/plugin-transform-typescript": "7.28.0", - "@babel/preset-env": "7.28.0", + "@babel/preset-env": "7.29.5", "@babel/preset-react": "7.27.1", "@babel/preset-typescript": "7.27.1", "@svgr/webpack": "8.1.0", diff --git a/platform/app/package.json b/platform/app/package.json index 03a66f0b6..d70ea4a4f 100644 --- a/platform/app/package.json +++ b/platform/app/package.json @@ -54,7 +54,7 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", - "@cornerstonejs/dicom-image-loader": "4.22.3", + "@cornerstonejs/dicom-image-loader": "4.22.8", "@emotion/serialize": "1.3.3", "@ohif/core": "3.13.0-beta.74", "@ohif/extension-cornerstone": "3.13.0-beta.74", diff --git a/platform/cli/templates/extension/dependencies.json b/platform/cli/templates/extension/dependencies.json index a3172fdf9..1044db68f 100644 --- a/platform/cli/templates/extension/dependencies.json +++ b/platform/cli/templates/extension/dependencies.json @@ -41,7 +41,7 @@ "@babel/plugin-transform-regenerator": "^7.16.7", "@babel/plugin-transform-runtime": "7.28.0", "@babel/plugin-transform-typescript": "^7.28.0", - "@babel/preset-env": "7.28.0", + "@babel/preset-env": "7.29.5", "@babel/preset-react": "^7.27.1", "@babel/preset-typescript": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", diff --git a/platform/cli/templates/mode/dependencies.json b/platform/cli/templates/mode/dependencies.json index c3678897c..aba8a197e 100644 --- a/platform/cli/templates/mode/dependencies.json +++ b/platform/cli/templates/mode/dependencies.json @@ -32,7 +32,7 @@ "@babel/plugin-transform-regenerator": "^7.16.7", "@babel/plugin-transform-runtime": "7.28.0", "@babel/plugin-transform-typescript": "^7.28.0", - "@babel/preset-env": "7.28.0", + "@babel/preset-env": "7.29.5", "@babel/preset-react": "^7.27.1", "@babel/preset-typescript": "^7.27.1", "babel-loader": "^8.0.0-beta.4", diff --git a/platform/core/package.json b/platform/core/package.json index b69ab4417..de7d9e30b 100644 --- a/platform/core/package.json +++ b/platform/core/package.json @@ -37,8 +37,8 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2", "@cornerstonejs/codec-openjpeg": "1.3.0", "@cornerstonejs/codec-openjph": "2.4.7", - "@cornerstonejs/core": "4.22.3", - "@cornerstonejs/dicom-image-loader": "4.22.3", + "@cornerstonejs/core": "4.22.8", + "@cornerstonejs/dicom-image-loader": "4.22.8", "@ohif/ui": "3.13.0-beta.74", "cornerstone-math": "0.1.10", "dicom-parser": "1.8.21" diff --git a/platform/docs/docs/migration-guide/3p12-to-3p13/playwright-viewport-screenshots.md b/platform/docs/docs/migration-guide/3p12-to-3p13/playwright-viewport-screenshots.md new file mode 100644 index 000000000..563d50fc3 --- /dev/null +++ b/platform/docs/docs/migration-guide/3p12-to-3p13/playwright-viewport-screenshots.md @@ -0,0 +1,80 @@ +--- +sidebar_position: 3 +sidebar_label: Playwright Viewport Screenshots +title: Playwright viewport screenshot scope +--- + +# Playwright viewport screenshot scope + +Playwright tests whose assertions concern the viewport (rendering, overlays, +measurements, segmentations, etc.) should scope `checkForScreenshot` to the +viewport itself — or, at most, the entire viewport grid. They should **not** +capture the surrounding OHIF UI (toolbar, side panels, study browser, header, +etc.). + +## Why + +Full-page screenshots that include the app chrome are fragile and noisy: + +- Any unrelated UI tweak (toolbar layout, panel styling, icon changes, + measurement-panel rows, button states) regenerates the baseline and forces + unrelated screenshot churn across the test suite. +- Diffs become harder to read — a small viewport regression hides inside a + screenshot dominated by chrome. +- Tests that are nominally about viewport behavior end up gated on UI state + that has nothing to do with the feature under test. + +Scoping the screenshot to the viewport (or viewport grid) keeps baselines +stable, makes failures meaningful, and aligns the screenshot with what the +test is actually asserting. + +## Migration + +Pass a viewport-scoped locator as the second argument to `checkForScreenshot`: + +- **Single viewport** — use `activeViewport.pane` (from + `viewportPageObject.active`). +- **Whole viewport grid** (e.g. MPR, 3D-four-up, or any test concerned with + multi-viewport layout) — use `viewportPageObject.grid`. + +Avoid passing `page` as the locator for viewport-focused tests — that captures +the full page including all of the OHIF chrome. + +**Before — full-page screenshot includes chrome:** + +```ts +await checkForScreenshot( + page, + page, + screenShotPaths.length.lengthDisplayedCorrectly +); +``` + +**After — single viewport:** + +```ts +const activeViewport = await viewportPageObject.active; +// ... interact with the viewport ... + +await checkForScreenshot( + page, + activeViewport.pane, + screenShotPaths.length.lengthDisplayedCorrectly +); +``` + +**After — viewport grid (multi-viewport layouts):** + +```ts +await mainToolbarPageObject.layoutSelection.MPR.click(); + +await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.mpr.mprDisplayedCorrectly +); +``` + +If a test legitimately needs to assert on chrome (panel content, toolbar +state, measurement-row text), prefer a targeted locator for that element +rather than a full-page screenshot that incidentally includes the viewport. diff --git a/platform/ui-next/src/components/DataRow/DataRow.tsx b/platform/ui-next/src/components/DataRow/DataRow.tsx index 82458e42d..1f4fa00c5 100644 --- a/platform/ui-next/src/components/DataRow/DataRow.tsx +++ b/platform/ui-next/src/components/DataRow/DataRow.tsx @@ -182,6 +182,7 @@ const DataRowComponent = React.forwardRef(
); } @@ -190,6 +191,7 @@ const DataRowComponent = React.forwardRef(
{indentation} {cleanText} @@ -197,14 +199,17 @@ const DataRowComponent = React.forwardRef( ); }; - const renderDetails = (details: string[]) => { + const renderDetails = (details: string[], variant: 'primary' | 'secondary') => { const visibleLines = details.slice(0, 4); const hiddenLines = details.slice(4); return ( -
+
{visibleLines.map((line, lineIndex) => renderDetailText(line, line.startsWith(' ') ? 1 : 0) @@ -418,12 +423,15 @@ const DataRowComponent = React.forwardRef( {/* Details Section */} {details && (details.primary?.length > 0 || details.secondary?.length > 0) && ( -
+
- {details.primary?.length > 0 && renderDetails(details.primary)} + {details.primary?.length > 0 && renderDetails(details.primary, 'primary')} {details.secondary?.length > 0 && (
- {renderDetails(details.secondary)} + {renderDetails(details.secondary, 'secondary')}
)}
diff --git a/platform/ui-next/src/components/MeasurementTable/MeasurementTable.tsx b/platform/ui-next/src/components/MeasurementTable/MeasurementTable.tsx index 5806ccc29..527973f71 100644 --- a/platform/ui-next/src/components/MeasurementTable/MeasurementTable.tsx +++ b/platform/ui-next/src/components/MeasurementTable/MeasurementTable.tsx @@ -107,26 +107,28 @@ const Row = ({ item, index }: RowProps) => { const { uid } = item; return ( - onAction(e, 'removeMeasurement', uid)} - onSelect={e => onAction(e, 'jumpToMeasurement', uid)} - onRename={e => onAction(e, 'renameMeasurement', uid)} - onToggleVisibility={e => onAction(e, 'toggleVisibilityMeasurement', uid)} - onToggleLocked={e => onAction(e, 'toggleLockMeasurement', uid)} - onColor={e => onAction(e, 'changeMeasurementColor', uid)} - disableEditing={disableEditing} - isVisible={item.isVisible} - isLocked={item.isLocked} - > - {item.isUnmapped && } - +
+ onAction(e, 'removeMeasurement', uid)} + onSelect={e => onAction(e, 'jumpToMeasurement', uid)} + onRename={e => onAction(e, 'renameMeasurement', uid)} + onToggleVisibility={e => onAction(e, 'toggleVisibilityMeasurement', uid)} + onToggleLocked={e => onAction(e, 'toggleLockMeasurement', uid)} + onColor={e => onAction(e, 'changeMeasurementColor', uid)} + disableEditing={disableEditing} + isVisible={item.isVisible} + isLocked={item.isLocked} + > + {item.isUnmapped && } + +
); }; diff --git a/tests/3DFourUp.spec.ts b/tests/3DFourUp.spec.ts index 4e58fb916..a9cff3500 100644 --- a/tests/3DFourUp.spec.ts +++ b/tests/3DFourUp.spec.ts @@ -15,7 +15,11 @@ test.beforeEach(async ({ page }) => { }); test.describe('3D four up Test', async () => { - test('should render 3D four up correctly.', async ({ page, mainToolbarPageObject }) => { + test('should render 3D four up correctly.', async ({ + page, + mainToolbarPageObject, + viewportPageObject, + }) => { await mainToolbarPageObject.layoutSelection.threeDFourUp.click(); await attemptAction(() => reduce3DViewportSize(page), 10, 100); @@ -24,7 +28,7 @@ test.describe('3D four up Test', async () => { await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.threeDFourUp.threeDFourUpDisplayedCorrectly ); }); diff --git a/tests/3DMain.spec.ts b/tests/3DMain.spec.ts index 7ebe9b120..25c1587f4 100644 --- a/tests/3DMain.spec.ts +++ b/tests/3DMain.spec.ts @@ -15,10 +15,18 @@ test.beforeEach(async ({ page }) => { }); test.describe('3D main Test', async () => { - test('should render 3D main correctly.', async ({ page, mainToolbarPageObject }) => { + test('should render 3D main correctly.', async ({ + page, + mainToolbarPageObject, + viewportPageObject, + }) => { await mainToolbarPageObject.layoutSelection.threeDMain.click(); await attemptAction(() => reduce3DViewportSize(page), 10, 100); await waitForViewportsRendered(page); - await checkForScreenshot(page, page, screenShotPaths.threeDMain.threeDMainDisplayedCorrectly); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.threeDMain.threeDMainDisplayedCorrectly + ); }); }); diff --git a/tests/3DOnly.spec.ts b/tests/3DOnly.spec.ts index 81c06b0de..000ddb348 100644 --- a/tests/3DOnly.spec.ts +++ b/tests/3DOnly.spec.ts @@ -15,14 +15,18 @@ test.beforeEach(async ({ page }) => { }); test.describe('3D only Test', async () => { - test('should render 3D only correctly.', async ({ page, mainToolbarPageObject }) => { + test('should render 3D only correctly.', async ({ + page, + mainToolbarPageObject, + viewportPageObject, + }) => { await mainToolbarPageObject.layoutSelection.threeDOnly.click(); await attemptAction(() => reduce3DViewportSize(page), 10, 100); await waitForViewportsRendered(page); // Use a 4 percent diff pixel ratio to account for slight color differences in the 3D viewport await checkForScreenshot({ page, - locator: page, + locator: viewportPageObject.grid, screenshotPath: screenShotPaths.threeDOnly.threeDOnlyDisplayedCorrectly, maxDiffPixelRatio: 0.04, }); diff --git a/tests/3DPrimary.spec.ts b/tests/3DPrimary.spec.ts index bf41c1f01..5bd2e3f67 100644 --- a/tests/3DPrimary.spec.ts +++ b/tests/3DPrimary.spec.ts @@ -15,14 +15,18 @@ test.beforeEach(async ({ page }) => { }); test.describe('3D primary Test', async () => { - test('should render 3D primary correctly.', async ({ page, mainToolbarPageObject }) => { + test('should render 3D primary correctly.', async ({ + page, + mainToolbarPageObject, + viewportPageObject, + }) => { await mainToolbarPageObject.layoutSelection.threeDPrimary.click(); await attemptAction(() => reduce3DViewportSize(page), 10, 100); await waitForViewportsRendered(page); await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.threeDPrimary.threeDPrimaryDisplayedCorrectly ); }); diff --git a/tests/Angle.spec.ts b/tests/Angle.spec.ts index dae950dc9..0a0c2c3db 100644 --- a/tests/Angle.spec.ts +++ b/tests/Angle.spec.ts @@ -20,5 +20,10 @@ test('should display the angle tool', async ({ { x: 550, y: 300 }, ]); await DOMOverlayPageObject.viewport.measurementTracking.confirm.click(); - await checkForScreenshot(page, page, screenShotPaths.angle.angleDisplayedCorrectly); + + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.angle.angleDisplayedCorrectly + ); }); diff --git a/tests/AxialPrimary.spec.ts b/tests/AxialPrimary.spec.ts index 31c1b4bf2..789b3d8ee 100644 --- a/tests/AxialPrimary.spec.ts +++ b/tests/AxialPrimary.spec.ts @@ -7,11 +7,16 @@ test.beforeEach(async ({ page }) => { }); test.describe('Axial Primary Test', async () => { - test('should render Axial Primary correctly.', async ({ page, mainToolbarPageObject }) => { + test('should render Axial Primary correctly.', async ({ + page, + mainToolbarPageObject, + viewportPageObject, + }) => { await mainToolbarPageObject.layoutSelection.axialPrimary.click(); + await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.axialPrimary.axialPrimaryDisplayedCorrectly ); }); diff --git a/tests/Bidirectional.spec.ts b/tests/Bidirectional.spec.ts index e4d103566..c6a75a7dd 100644 --- a/tests/Bidirectional.spec.ts +++ b/tests/Bidirectional.spec.ts @@ -19,9 +19,10 @@ test('should display the bidirectional tool', async ({ { x: 515, y: 339 }, ]); await DOMOverlayPageObject.viewport.measurementTracking.confirm.click(); + await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.bidirectional.bidirectionalDisplayedCorrectly ); }); diff --git a/tests/Circle.spec.ts b/tests/Circle.spec.ts index 3db30f90b..21b340e9f 100644 --- a/tests/Circle.spec.ts +++ b/tests/Circle.spec.ts @@ -19,5 +19,9 @@ test('should display the circle tool', async ({ { x: 488, y: 247 }, ]); await DOMOverlayPageObject.viewport.measurementTracking.confirm.click(); - await checkForScreenshot(page, page, screenShotPaths.circle.circleDisplayedCorrectly); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.circle.circleDisplayedCorrectly + ); }); diff --git a/tests/CobbAngle.spec.ts b/tests/CobbAngle.spec.ts index cb760c969..7fe0f8e98 100644 --- a/tests/CobbAngle.spec.ts +++ b/tests/CobbAngle.spec.ts @@ -21,5 +21,10 @@ test('should display the cobb angle tool', async ({ { x: 625, y: 291 }, ]); await DOMOverlayPageObject.viewport.measurementTracking.confirm.click(); - await checkForScreenshot(page, page, screenShotPaths.cobbangle.cobbangleDisplayedCorrectly); + + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.cobbangle.cobbangleDisplayedCorrectly + ); }); diff --git a/tests/ContextMenu.spec.ts b/tests/ContextMenu.spec.ts index c93146a3a..b9fae9f08 100644 --- a/tests/ContextMenu.spec.ts +++ b/tests/ContextMenu.spec.ts @@ -21,13 +21,17 @@ test('should the context menu completely on screen and is not clipped for a poin await DOMOverlayPageObject.viewport.measurementTracking.confirm.click(); - await checkForScreenshot(page, page, screenShotPaths.contextMenu.preContextMenuNearBottomEdge); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.contextMenu.preContextMenuNearBottomEdge + ); await activeViewport.normalizedClickAt([{ x: 0.55, y: 0.98 }], 'right'); await checkForScreenshot({ page, - locator: page, + locator: viewportPageObject.grid, screenshotPath: screenShotPaths.contextMenu.contextMenuNearBottomEdgeNotClipped, }); }); diff --git a/tests/Ellipse.spec.ts b/tests/Ellipse.spec.ts index 03c7c80d8..678c43379 100644 --- a/tests/Ellipse.spec.ts +++ b/tests/Ellipse.spec.ts @@ -19,5 +19,10 @@ test('should display the ellipse tool', async ({ { x: 508, y: 281 }, ]); await DOMOverlayPageObject.viewport.measurementTracking.confirm.click(); - await checkForScreenshot(page, page, screenShotPaths.ellipse.ellipseDisplayedCorrectly); + + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.ellipse.ellipseDisplayedCorrectly + ); }); diff --git a/tests/FlipHorizontal.spec.ts b/tests/FlipHorizontal.spec.ts index c81f49684..7fa40d3e0 100644 --- a/tests/FlipHorizontal.spec.ts +++ b/tests/FlipHorizontal.spec.ts @@ -6,11 +6,16 @@ test.beforeEach(async ({ page }) => { await visitStudy(page, studyInstanceUID, mode, 2000); }); -test('should flip the image horizontally', async ({ page, mainToolbarPageObject }) => { +test('should flip the image horizontally', async ({ + page, + mainToolbarPageObject, + viewportPageObject, +}) => { await mainToolbarPageObject.moreTools.flipHorizontal.click(); + await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.flipHorizontal.flipHorizontalDisplayedCorrectly ); }); diff --git a/tests/FreehandROI.spec.ts b/tests/FreehandROI.spec.ts index 735ee833b..929fe2d6d 100644 --- a/tests/FreehandROI.spec.ts +++ b/tests/FreehandROI.spec.ts @@ -1,4 +1,10 @@ -import { expect, test, visitStudy, subscribeToMeasurementAdded } from './utils'; +import { + expect, + getAnnotationStats, + subscribeToMeasurementAdded, + test, + visitStudy, +} from './utils'; test.beforeEach(async ({ page }) => { const studyInstanceUID = '1.3.6.1.4.1.25403.345050719074.3824.20170125095438.5'; @@ -32,3 +38,70 @@ test('should not fire MEASUREMENT_ADDED when clicking the annotation text', asyn await measurementAdded.unsubscribe(); } }); + +test('rectangle and freehand at identical coordinates should yield comparable area', async ({ + page, + DOMOverlayPageObject, + mainToolbarPageObject, + rightPanelPageObject, + viewportPageObject, +}) => { + // Open measurements panel first — needed later for the delete action, and + // opening up-front means both shapes are drawn against the same viewport + // layout (so normalized coords don't shift between draws). + await rightPanelPageObject.toggle(); + await rightPanelPageObject.measurementsPanel.select(); + + const activeViewport = await viewportPageObject.active; + + // End on the left edge just shy of the start so cornerstone3D's proximity- + // close triggers via the standard mouseup path (which fires + // ANNOTATION_COMPLETED). Ending at the start point would enter interactive close- + // preview mode and suppress the completion event; ending further away + // would draw a diagonal that distorts the rectangular shape. + const corners = [ + { x: 0.3, y: 0.3 }, + { x: 0.55, y: 0.3 }, + { x: 0.55, y: 0.55 }, + { x: 0.3, y: 0.55 }, + { x: 0.3, y: 0.31 }, + ]; + const [topLeft, , bottomRight] = corners; + + await mainToolbarPageObject.measurementTools.rectangleROI.click(); + await activeViewport.normalizedClickAt([topLeft, bottomRight]); + await DOMOverlayPageObject.viewport.measurementTracking.confirm.click(); + + const rectangles = await getAnnotationStats(page, { toolName: 'RectangleROI' }); + const rectArea = rectangles[0].firstTargetStats!.area as number; + const rectRow = rightPanelPageObject.measurementsPanel.panel.nthMeasurement(0); + const rectSvgLines = activeViewport.getSvgAnnotationStatTextLines(rectangles[0].annotationUID); + await expect(rectSvgLines.nth(0)).toHaveText(`Area: ${Math.round(rectArea)} mm²`); + await expect(rectRow.stats.primary.lines.nth(0)).toHaveText(`${Math.round(rectArea)} mm²`); + + // Remove the rectangle so the freehand can drag through the same coords + // without grabbing the rectangle's handles. + await rectRow.actions.delete(); + + await mainToolbarPageObject.measurementTools.freehandROI.click(); + await activeViewport.normalizedPathDragAt({ + path: corners, + config: { steps: 20, delay: 30 }, + }); + + const freehands = await getAnnotationStats(page, { toolName: 'PlanarFreehandROI' }); + const freehandArea = freehands[0].firstTargetStats!.area as number; + const freehandRow = rightPanelPageObject.measurementsPanel.panel.nthMeasurement(0); + const freehandSvgLines = activeViewport.getSvgAnnotationStatTextLines(freehands[0].annotationUID); + await expect(freehandSvgLines.nth(0)).toHaveText(`Area: ${Math.round(freehandArea)} mm²`); + await expect(freehandRow.stats.primary.lines.nth(0)).toHaveText(`${Math.round(freehandArea)} mm²`); + + const pctDiff = (Math.abs(rectArea - freehandArea) / rectArea) * 100; + console.log( + `Rectangle: ${rectArea.toFixed(2)} mm² | ` + + `Freehand: ${freehandArea.toFixed(2)} mm² | ` + + `diff: ${pctDiff.toFixed(2)}%` + ); + + expect(pctDiff).toBeLessThan(1); +}); diff --git a/tests/Invert.spec.ts b/tests/Invert.spec.ts index f6bfaf573..1c3c27a5e 100644 --- a/tests/Invert.spec.ts +++ b/tests/Invert.spec.ts @@ -12,8 +12,12 @@ test.beforeEach(async ({ page }) => { await visitStudy(page, studyInstanceUID, mode, 2000); }); -test('should invert the image', async ({ page, mainToolbarPageObject }) => { +test('should invert the image', async ({ page, mainToolbarPageObject, viewportPageObject }) => { await mainToolbarPageObject.moreTools.invert.click(); await waitForViewportsRendered(page); - await checkForScreenshot(page, page, screenShotPaths.invert.invertDisplayedCorrectly); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.invert.invertDisplayedCorrectly + ); }); diff --git a/tests/JumpToMeasurementMPR.spec.ts b/tests/JumpToMeasurementMPR.spec.ts index 577401863..0ba0477ed 100644 --- a/tests/JumpToMeasurementMPR.spec.ts +++ b/tests/JumpToMeasurementMPR.spec.ts @@ -54,7 +54,11 @@ test('should hydrate in MPR correctly', async ({ await DOMOverlayPageObject.viewport.measurementTracking.confirm.click(); // scroll away - await checkForScreenshot(page, page, screenShotPaths.jumpToMeasurementMPR.initialDraw); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.jumpToMeasurementMPR.initialDraw + ); // Focus on the canvas first, then use mouse wheel to scroll away await page.evaluate(() => { @@ -78,11 +82,19 @@ test('should hydrate in MPR correctly', async ({ await page.waitForTimeout(5000); - await checkForScreenshot(page, page, screenShotPaths.jumpToMeasurementMPR.scrollAway); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.jumpToMeasurementMPR.scrollAway + ); await rightPanelPageObject.measurementsPanel.panel.nthMeasurement(0).click(); - await checkForScreenshot(page, page, screenShotPaths.jumpToMeasurementMPR.jumpToMeasurementStack); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.jumpToMeasurementMPR.jumpToMeasurementStack + ); await mainToolbarPageObject.layoutSelection.MPR.click(); @@ -93,19 +105,27 @@ test('should hydrate in MPR correctly', async ({ await page.waitForTimeout(3000); - await checkForScreenshot(page, page, screenShotPaths.jumpToMeasurementMPR.jumpInMPR); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.jumpToMeasurementMPR.jumpInMPR + ); await leftPanelPageObject.loadSeriesByDescription('Lung 3.0 CE'); await page.waitForTimeout(5000); - await checkForScreenshot(page, page, screenShotPaths.jumpToMeasurementMPR.changeSeriesInMPR); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.jumpToMeasurementMPR.changeSeriesInMPR + ); await rightPanelPageObject.measurementsPanel.panel.nthMeasurement(0).click(); await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.jumpToMeasurementMPR.jumpToMeasurementAfterSeriesChange ); }); diff --git a/tests/LabelMapSegLocking.spec.ts b/tests/LabelMapSegLocking.spec.ts index b681f3c60..79427ae83 100644 --- a/tests/LabelMapSegLocking.spec.ts +++ b/tests/LabelMapSegLocking.spec.ts @@ -38,7 +38,11 @@ test('should prevent editing of label map segmentations when panelSegmentation.d // navigate to the 12th image and ensure the correct overlay is displayed await press({ page, key: 'ArrowDown', nTimes: 11 }); - await checkForScreenshot(page, page, screenShotPaths.labelMapSegLocking.globalLockedSegPreEdit); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.labelMapSegLocking.globalLockedSegPreEdit + ); // Attempt to erase the segmentations. await rightPanelPageObject.labelMapSegmentationPanel.tools.eraser.click(); @@ -61,7 +65,11 @@ test('should prevent editing of label map segmentations when panelSegmentation.d end: { x: 1.0, y: 0.75 }, }); - await checkForScreenshot(page, page, screenShotPaths.labelMapSegLocking.globalLockedSegPostEdit); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.labelMapSegLocking.globalLockedSegPostEdit + ); }); test('should allow editing of label map segmentations when panelSegmentation.disableEditing is false', async ({ @@ -89,7 +97,11 @@ test('should allow editing of label map segmentations when panelSegmentation.dis // navigate to the 12th image and ensure the correct overlay is displayed await press({ page, key: 'ArrowDown', nTimes: 11 }); - await checkForScreenshot(page, page, screenShotPaths.labelMapSegLocking.globalUnlockedSegPreEdit); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.labelMapSegLocking.globalUnlockedSegPreEdit + ); // Attempt to erase the segmentations. await rightPanelPageObject.labelMapSegmentationPanel.tools.eraser.click(); @@ -114,7 +126,7 @@ test('should allow editing of label map segmentations when panelSegmentation.dis await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.labelMapSegLocking.globalUnlockedSegPostEdit ); }); diff --git a/tests/Length.spec.ts b/tests/Length.spec.ts index 48074e8cf..e9e2af692 100644 --- a/tests/Length.spec.ts +++ b/tests/Length.spec.ts @@ -19,5 +19,10 @@ test('should display the length tool', async ({ { x: 544, y: 232 }, ]); await DOMOverlayPageObject.viewport.measurementTracking.confirm.click(); - await checkForScreenshot(page, page, screenShotPaths.length.lengthDisplayedCorrectly); + + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.length.lengthDisplayedCorrectly + ); }); diff --git a/tests/Livewire.spec.ts b/tests/Livewire.spec.ts index cce917d00..378a0e74f 100644 --- a/tests/Livewire.spec.ts +++ b/tests/Livewire.spec.ts @@ -1,4 +1,11 @@ -import { checkForScreenshot, screenShotPaths, test, visitStudy, expect } from './utils'; +import { + checkForScreenshot, + expect, + getAnnotationStats, + screenShotPaths, + test, + visitStudy, +} from './utils'; import { press } from './utils/keyboardUtils'; test.beforeEach(async ({ page }) => { @@ -24,7 +31,23 @@ test('should display the livewire tool', async ({ { x: 383, y: 461 }, ]); await DOMOverlayPageObject.viewport.measurementTracking.confirm.click(); - await checkForScreenshot(page, page, screenShotPaths.livewire.livewireDisplayedCorrectly); + + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.livewire.livewireDisplayedCorrectly + ); + + const livewires = await getAnnotationStats(page, { toolName: 'LivewireContour' }); + expect(livewires.length).toBeGreaterThan(0); + + const stats = livewires[0].firstTargetStats!; + expect(stats.areaUnit).toBe('mm²'); + expect(Math.round(stats.area as number)).toBe(28906); + + const lines = activeViewport.getSvgAnnotationStatTextLines(livewires[0].annotationUID); + await expect(lines).toHaveCount(1); + await expect(lines.nth(0)).toHaveText('Area: 28906 mm²'); }); test('should restore viewport interactivity after deleting an in-progress Livewire annotation via context menu', async ({ diff --git a/tests/MPR.spec.ts b/tests/MPR.spec.ts index 53aae6433..ccfd3de83 100644 --- a/tests/MPR.spec.ts +++ b/tests/MPR.spec.ts @@ -7,8 +7,17 @@ test.beforeEach(async ({ page }) => { }); test.describe('MPR Test', async () => { - test('should render MPR correctly.', async ({ page, mainToolbarPageObject }) => { + test('should render MPR correctly.', async ({ + page, + mainToolbarPageObject, + viewportPageObject, + }) => { await mainToolbarPageObject.layoutSelection.MPR.click(); - await checkForScreenshot(page, page, screenShotPaths.mpr.mprDisplayedCorrectly); + + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.mpr.mprDisplayedCorrectly + ); }); }); diff --git a/tests/MPRThenRTOverlayNoHydration.spec.ts b/tests/MPRThenRTOverlayNoHydration.spec.ts index 1125273e7..55ed2adf5 100644 --- a/tests/MPRThenRTOverlayNoHydration.spec.ts +++ b/tests/MPRThenRTOverlayNoHydration.spec.ts @@ -25,7 +25,7 @@ test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay me await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.mprThenRTOverlayNoHydration.mprPreRTOverlayNoHydration ); @@ -48,6 +48,7 @@ test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay me await checkForScreenshot({ page, + locator: viewportPageObject.grid, screenshotPath: screenShotPaths.mprThenRTOverlayNoHydration.mprPostRTOverlayNoHydration, normalizedClip: { x: 0, y: 0, width: 1.0, height: 0.75 }, // clip to avoid any popups concerning surface creation and clipping }); diff --git a/tests/MPRThenSEGOverlayNoHydration.spec.ts b/tests/MPRThenSEGOverlayNoHydration.spec.ts index 69186f882..7ba075eaa 100644 --- a/tests/MPRThenSEGOverlayNoHydration.spec.ts +++ b/tests/MPRThenSEGOverlayNoHydration.spec.ts @@ -21,7 +21,7 @@ test('should launch MPR with unhydrated SEG chosen from the data overlay menu', await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.mprThenSEGOverlayNoHydration.mprPreSEGOverlayNoHydration ); @@ -42,7 +42,7 @@ test('should launch MPR with unhydrated SEG chosen from the data overlay menu', await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.mprThenSEGOverlayNoHydration.mprPostSEGOverlayNoHydration ); }); diff --git a/tests/MeasurementPanel.spec.ts b/tests/MeasurementPanel.spec.ts index 1ca7ed827..2a0e5cd90 100644 --- a/tests/MeasurementPanel.spec.ts +++ b/tests/MeasurementPanel.spec.ts @@ -69,15 +69,15 @@ test('checks if measurement item can be relabeled under Measurements panel', asy // Open measurement panel confirm default empty await rightPanelPageObject.measurementsPanel.select(); - const measurementRow = rightPanelPageObject.measurementsPanel.panel.nthMeasurement(0).locator; - await expect(measurementRow).toContainText('(empty)'); + const measurementRow = rightPanelPageObject.measurementsPanel.panel.nthMeasurement(0); + await expect(measurementRow.title).toHaveText('(empty)'); // Expand and click rename await rightPanelPageObject.measurementsPanel.panel.nthMeasurement(0).actions.rename(relabelText); // Check dialog closed and renamed await expect(DOMOverlayPageObject.dialog.input.locator).toBeHidden(); - await expect(measurementRow).toContainText(relabelText); + await expect(measurementRow.title).toHaveText(relabelText); }); test('checks if measurement item can be relabeled through the context menu on the viewport', async ({ @@ -98,8 +98,8 @@ test('checks if measurement item can be relabeled through the context menu on th // Open measurement panel confirm default empty await rightPanelPageObject.measurementsPanel.select(); - const measurementRow = rightPanelPageObject.measurementsPanel.panel.nthMeasurement(0).locator; - await expect(measurementRow).toContainText('(empty)'); + const measurementRow = rightPanelPageObject.measurementsPanel.panel.nthMeasurement(0); + await expect(measurementRow.title).toHaveText('(empty)'); // Right click and click rename await page.waitForTimeout(200); // small delay for context menu @@ -117,7 +117,7 @@ test('checks if measurement item can be relabeled through the context menu on th // Check dialog closed and renamed await expect(DOMOverlayPageObject.dialog.title).toBeHidden(); - await expect(measurementRow).toContainText(relabelText); + await expect(measurementRow.title).toHaveText(relabelText); }); test('checks if image would jump when clicked on a measurement item', async ({ diff --git a/tests/MultipleSegmentationDataOverlays.spec.ts b/tests/MultipleSegmentationDataOverlays.spec.ts index fb7830ced..a9b08c59c 100644 --- a/tests/MultipleSegmentationDataOverlays.spec.ts +++ b/tests/MultipleSegmentationDataOverlays.spec.ts @@ -49,6 +49,7 @@ test('should display multiple segmentation overlays (both SEG and RT)', async ({ await checkForScreenshot({ page, + locator: viewportPageObject.grid, screenshotPath: screenShotPaths.multipleSegmentationDataOverlays.threeSegOverlaysInOverlayMenu, }); @@ -58,6 +59,7 @@ test('should display multiple segmentation overlays (both SEG and RT)', async ({ await checkForScreenshot({ page, + locator: viewportPageObject.grid, screenshotPath: screenShotPaths.multipleSegmentationDataOverlays.threeSegOverlaysInOverlayMenu, }); @@ -70,6 +72,7 @@ test('should display multiple segmentation overlays (both SEG and RT)', async ({ await checkForScreenshot({ page, + locator: viewportPageObject.grid, screenshotPath: screenShotPaths.multipleSegmentationDataOverlays.overlaysDisplayed, }); @@ -85,6 +88,7 @@ test('should display multiple segmentation overlays (both SEG and RT)', async ({ await checkForScreenshot({ page, + locator: viewportPageObject.grid, screenshotPath: screenShotPaths.multipleSegmentationDataOverlays.overlaySEGsAndRTDisplayed, }); @@ -94,6 +98,7 @@ test('should display multiple segmentation overlays (both SEG and RT)', async ({ await checkForScreenshot({ page, + locator: viewportPageObject.grid, screenshotPath: screenShotPaths.multipleSegmentationDataOverlays.overlaySEGsAndRTDisplayed, }); }); diff --git a/tests/Probe.spec.ts b/tests/Probe.spec.ts index 2ccfd2a76..50d7ce3bd 100644 --- a/tests/Probe.spec.ts +++ b/tests/Probe.spec.ts @@ -16,5 +16,10 @@ test('should display the probe tool', async ({ const activeViewport = await viewportPageObject.active; await activeViewport.clickAt([{ x: 550, y: 200 }]); await DOMOverlayPageObject.viewport.measurementTracking.confirm.click(); - await checkForScreenshot(page, page, screenShotPaths.probe.probeDisplayedCorrectly); + + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.probe.probeDisplayedCorrectly + ); }); diff --git a/tests/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts b/tests/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts index d36484588..69cd3df5f 100644 --- a/tests/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts +++ b/tests/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts @@ -12,7 +12,8 @@ test('should overlay an unhydrated RTSTRUCT over a display set that the RTSTRUCT page, viewportPageObject, }) => { - const dataOverlayPageObject = (await viewportPageObject.getById('default')).overlayMenu.dataOverlay; + const dataOverlayPageObject = (await viewportPageObject.getById('default')).overlayMenu + .dataOverlay; await dataOverlayPageObject.toggle(); await dataOverlayPageObject.addSegmentation('Contours on PET'); @@ -26,7 +27,7 @@ test('should overlay an unhydrated RTSTRUCT over a display set that the RTSTRUCT await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.rtDataOverlayForUnreferencedDisplaySetNoHydration.overlayFirstImage ); @@ -37,7 +38,7 @@ test('should overlay an unhydrated RTSTRUCT over a display set that the RTSTRUCT await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.rtDataOverlayForUnreferencedDisplaySetNoHydration.overlayMiddleImage ); }); diff --git a/tests/RTDataOverlayNoHydrationThenMPR.spec.ts b/tests/RTDataOverlayNoHydrationThenMPR.spec.ts index 8d272be19..04e3a4010 100644 --- a/tests/RTDataOverlayNoHydrationThenMPR.spec.ts +++ b/tests/RTDataOverlayNoHydrationThenMPR.spec.ts @@ -37,7 +37,7 @@ test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay me await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.rtDataOverlayNoHydrationThenMPR.rtDataOverlayNoHydrationPreMPR ); @@ -47,7 +47,7 @@ test('should launch MPR with unhydrated RTSTRUCT chosen from the data overlay me await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.rtDataOverlayNoHydrationThenMPR.rtDataOverlayNoHydrationPostMPR ); diff --git a/tests/RTHydration.spec.ts b/tests/RTHydration.spec.ts index 25a67183a..bb489af1f 100644 --- a/tests/RTHydration.spec.ts +++ b/tests/RTHydration.spec.ts @@ -11,17 +11,30 @@ test('should hydrate RT reports correctly', async ({ DOMOverlayPageObject, leftPanelPageObject, rightPanelPageObject, + viewportPageObject, }) => { await rightPanelPageObject.toggle(); await leftPanelPageObject.loadSeriesByModality('RTSTRUCT'); await page.waitForTimeout(5000); - await checkForScreenshot(page, page, screenShotPaths.rtHydration.rtPreHydration); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.rtHydration.rtPreHydration + ); await DOMOverlayPageObject.viewport.segmentationHydration.yes.click(); await page.waitForTimeout(5000); - await checkForScreenshot(page, page, screenShotPaths.rtHydration.rtPostHydration); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.rtHydration.rtPostHydration + ); await rightPanelPageObject.labelMapSegmentationPanel.panel.segmentByText('Small Sphere').click(); await page.waitForTimeout(5000); - await checkForScreenshot(page, page, screenShotPaths.rtHydration.rtJumpToStructure); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.rtHydration.rtJumpToStructure + ); }); diff --git a/tests/RTHydration2.spec.ts b/tests/RTHydration2.spec.ts index 431f054bc..1425e444b 100644 --- a/tests/RTHydration2.spec.ts +++ b/tests/RTHydration2.spec.ts @@ -11,11 +11,16 @@ test('should hydrate RT reports correctly', async ({ DOMOverlayPageObject, leftPanelPageObject, rightPanelPageObject, + viewportPageObject, }) => { await rightPanelPageObject.toggle(); await leftPanelPageObject.loadSeriesByModality('RTSTRUCT'); - await checkForScreenshot(page, page, screenShotPaths.rtHydration2.rtPreHydration); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.rtHydration2.rtPreHydration + ); // wait for 3 seconds await page.evaluate(() => { // Access cornerstone directly from the window object @@ -40,5 +45,9 @@ test('should hydrate RT reports correctly', async ({ // should preserve zoom and pan and scroll position after hydration await DOMOverlayPageObject.viewport.segmentationHydration.yes.click(); - await checkForScreenshot(page, page, screenShotPaths.rtHydration.rtPostHydration); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.rtHydration.rtPostHydration + ); }); diff --git a/tests/RTHydrationFromMPR.spec.ts b/tests/RTHydrationFromMPR.spec.ts index 5814dac2e..a803652f0 100644 --- a/tests/RTHydrationFromMPR.spec.ts +++ b/tests/RTHydrationFromMPR.spec.ts @@ -12,6 +12,7 @@ test('should hydrate an RTSTRUCT from MPR', async ({ leftPanelPageObject, mainToolbarPageObject, rightPanelPageObject, + viewportPageObject, }) => { await rightPanelPageObject.toggle(); @@ -19,25 +20,37 @@ test('should hydrate an RTSTRUCT from MPR', async ({ await page.waitForTimeout(10000); - await checkForScreenshot(page, page, screenShotPaths.rtHydrationFromMPR.mprBeforeRT); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.rtHydrationFromMPR.mprBeforeRT + ); await leftPanelPageObject.loadSeriesByModality('RTSTRUCT'); await page.waitForTimeout(5000); - await checkForScreenshot(page, page, screenShotPaths.rtHydrationFromMPR.mprAfterRT); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.rtHydrationFromMPR.mprAfterRT + ); await DOMOverlayPageObject.viewport.segmentationHydration.yes.click(); await page.waitForTimeout(5000); - await checkForScreenshot(page, page, screenShotPaths.rtHydrationFromMPR.mprAfterRTHydrated); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.rtHydrationFromMPR.mprAfterRTHydrated + ); await mainToolbarPageObject.layoutSelection.axialPrimary.click(); await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.rtHydrationFromMPR.mprAfterRTHydratedAfterLayoutChange ); }); diff --git a/tests/RTHydrationThenMPR.spec.ts b/tests/RTHydrationThenMPR.spec.ts index e8bd33475..9b5c86ec2 100644 --- a/tests/RTHydrationThenMPR.spec.ts +++ b/tests/RTHydrationThenMPR.spec.ts @@ -12,6 +12,7 @@ test('should hydrate an RTSTRUCT and then launch MPR', async ({ leftPanelPageObject, mainToolbarPageObject, rightPanelPageObject, + viewportPageObject, }) => { await rightPanelPageObject.toggle(); await leftPanelPageObject.loadSeriesByModality('RTSTRUCT'); @@ -20,7 +21,11 @@ test('should hydrate an RTSTRUCT and then launch MPR', async ({ await page.waitForTimeout(5000); - await checkForScreenshot(page, page, screenShotPaths.rtHydrationThenMPR.rtPostHydration); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.rtHydrationThenMPR.rtPostHydration + ); await mainToolbarPageObject.layoutSelection.axialPrimary.click(); @@ -28,7 +33,7 @@ test('should hydrate an RTSTRUCT and then launch MPR', async ({ await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.rtHydrationThenMPR.rtPostHydrationMPRAxialPrimary ); }); diff --git a/tests/RTNoHydrationThenMPR.spec.ts b/tests/RTNoHydrationThenMPR.spec.ts index 9d2345002..1cf681885 100644 --- a/tests/RTNoHydrationThenMPR.spec.ts +++ b/tests/RTNoHydrationThenMPR.spec.ts @@ -11,17 +11,26 @@ test('should launch MPR with unhydrated RTSTRUCT', async ({ leftPanelPageObject, mainToolbarPageObject, rightPanelPageObject, + viewportPageObject, }) => { await rightPanelPageObject.toggle(); await leftPanelPageObject.loadSeriesByModality('RTSTRUCT'); await page.waitForTimeout(5000); - await checkForScreenshot(page, page, screenShotPaths.rtNoHydrationThenMPR.rtNoHydrationPreMPR); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.rtNoHydrationThenMPR.rtNoHydrationPreMPR + ); await mainToolbarPageObject.layoutSelection.MPR.click(); await page.waitForTimeout(5000); - await checkForScreenshot(page, page, screenShotPaths.rtNoHydrationThenMPR.rtNoHydrationPostMPR); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.rtNoHydrationThenMPR.rtNoHydrationPostMPR + ); }); diff --git a/tests/Rectangle.spec.ts b/tests/Rectangle.spec.ts index 4d06f6cad..de55d27a1 100644 --- a/tests/Rectangle.spec.ts +++ b/tests/Rectangle.spec.ts @@ -19,5 +19,10 @@ test('should display the rectangle tool', async ({ { x: 591, y: 217 }, ]); await DOMOverlayPageObject.viewport.measurementTracking.confirm.click(); - await checkForScreenshot(page, page, screenShotPaths.rectangle.rectangleDisplayedCorrectly); + + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.rectangle.rectangleDisplayedCorrectly + ); }); diff --git a/tests/Reset.spec.ts b/tests/Reset.spec.ts index e6adaf109..000a4c6e8 100644 --- a/tests/Reset.spec.ts +++ b/tests/Reset.spec.ts @@ -6,9 +6,18 @@ test.beforeEach(async ({ page }) => { await visitStudy(page, studyInstanceUID, mode, 2000); }); -test('should reset the image to its original state', async ({ page, mainToolbarPageObject }) => { +test('should reset the image to its original state', async ({ + page, + mainToolbarPageObject, + viewportPageObject, +}) => { await mainToolbarPageObject.moreTools.rotateRight.click(); await mainToolbarPageObject.moreTools.invert.click(); await mainToolbarPageObject.moreTools.reset.click(); - await checkForScreenshot(page, page, screenShotPaths.reset.resetDisplayedCorrectly); + + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.reset.resetDisplayedCorrectly + ); }); diff --git a/tests/RotateRight.spec.ts b/tests/RotateRight.spec.ts index 6198b7619..d7352d640 100644 --- a/tests/RotateRight.spec.ts +++ b/tests/RotateRight.spec.ts @@ -6,7 +6,16 @@ test.beforeEach(async ({ page }) => { await visitStudy(page, studyInstanceUID, mode, 2000); }); -test('should rotate the image to the right', async ({ page, mainToolbarPageObject }) => { +test('should rotate the image to the right', async ({ + page, + mainToolbarPageObject, + viewportPageObject, +}) => { await mainToolbarPageObject.moreTools.rotateRight.click(); - await checkForScreenshot(page, page, screenShotPaths.rotateRight.rotateRightDisplayedCorrectly); + + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.rotateRight.rotateRightDisplayedCorrectly + ); }); diff --git a/tests/SEGDataOverlayNoHydrationThenMPR.spec.ts b/tests/SEGDataOverlayNoHydrationThenMPR.spec.ts index 5f1de2183..a8a2bc9f6 100644 --- a/tests/SEGDataOverlayNoHydrationThenMPR.spec.ts +++ b/tests/SEGDataOverlayNoHydrationThenMPR.spec.ts @@ -14,7 +14,8 @@ test('should launch MPR with unhydrated SEG chosen from the data overlay menu', viewportPageObject, }) => { await rightPanelPageObject.toggle(); - const dataOverlayPageObject = (await viewportPageObject.getById('default')).overlayMenu.dataOverlay; + const dataOverlayPageObject = (await viewportPageObject.getById('default')).overlayMenu + .dataOverlay; await dataOverlayPageObject.toggle(); await dataOverlayPageObject.addSegmentation('Segmentation'); @@ -28,7 +29,7 @@ test('should launch MPR with unhydrated SEG chosen from the data overlay menu', await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.segDataOverlayNoHydrationThenMPR.segDataOverlayNoHydrationPreMPR ); @@ -38,7 +39,7 @@ test('should launch MPR with unhydrated SEG chosen from the data overlay menu', await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.segDataOverlayNoHydrationThenMPR.segDataOverlayNoHydrationPostMPR ); diff --git a/tests/SEGHydration.spec.ts b/tests/SEGHydration.spec.ts index 069f2808f..0b23e3d7a 100644 --- a/tests/SEGHydration.spec.ts +++ b/tests/SEGHydration.spec.ts @@ -11,12 +11,17 @@ test('should hydrate SEG reports correctly', async ({ DOMOverlayPageObject, leftPanelPageObject, rightPanelPageObject, + viewportPageObject, }) => { await rightPanelPageObject.toggle(); await leftPanelPageObject.loadSeriesByDescription('SEG'); await page.waitForTimeout(5000); - await checkForScreenshot(page, page, screenShotPaths.segHydration.segPreHydration); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.segHydration.segPreHydration + ); await page.evaluate(() => { // Access cornerstone directly from the window object @@ -40,5 +45,9 @@ test('should hydrate SEG reports correctly', async ({ await DOMOverlayPageObject.viewport.segmentationHydration.yes.click(); await page.waitForTimeout(5000); - await checkForScreenshot(page, page, screenShotPaths.segHydration.segPostHydration); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.segHydration.segPostHydration + ); }); diff --git a/tests/SEGHydrationFrom3DFourUp.spec.ts b/tests/SEGHydrationFrom3DFourUp.spec.ts index 51db1d1af..78259e584 100644 --- a/tests/SEGHydrationFrom3DFourUp.spec.ts +++ b/tests/SEGHydrationFrom3DFourUp.spec.ts @@ -35,9 +35,10 @@ test.describe('3D four up SEG hydration', async () => { screenShotPaths.segHydrationFrom3DFourUp.threeDFourUpBeforeSEG ); + let viewportRenderCycle = waitForViewportRenderCycle(page); await leftPanelPageObject.loadSeriesByDescription('SEG'); - await waitForViewportsRendered(page); + await viewportRenderCycle; await checkForScreenshot( page, @@ -49,7 +50,7 @@ test.describe('3D four up SEG hydration', async () => { // High rendered timeout needed: layout has 4 viewports (3D volume + MPR planes + SEG overlays), // which can take significantly longer time to fully render - const viewportRenderCycle = waitForViewportRenderCycle(page, { renderedTimeout: 180000 }); + viewportRenderCycle = waitForViewportRenderCycle(page, { renderedTimeout: 180000 }); await DOMOverlayPageObject.viewport.segmentationHydration.yes.click(); diff --git a/tests/SEGHydrationThenMPR.spec.ts b/tests/SEGHydrationThenMPR.spec.ts index acdd5b4a4..5204b0637 100644 --- a/tests/SEGHydrationThenMPR.spec.ts +++ b/tests/SEGHydrationThenMPR.spec.ts @@ -12,6 +12,7 @@ test('should properly display MPR for MR', async ({ leftPanelPageObject, mainToolbarPageObject, rightPanelPageObject, + viewportPageObject, }) => { await rightPanelPageObject.toggle(); await leftPanelPageObject.loadSeriesByDescription('SEG'); @@ -19,14 +20,18 @@ test('should properly display MPR for MR', async ({ await DOMOverlayPageObject.viewport.segmentationHydration.yes.click(); await page.waitForTimeout(5000); - await checkForScreenshot(page, page, screenShotPaths.segHydrationThenMPR.segPostHydration); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.segHydrationThenMPR.segPostHydration + ); await mainToolbarPageObject.layoutSelection.axialPrimary.click(); await page.waitForTimeout(5000); await checkForScreenshot( page, - page, + viewportPageObject.grid, screenShotPaths.segHydrationThenMPR.segPostHydrationMPRAxialPrimary ); }); diff --git a/tests/SEGNoHydrationThenMPR.spec.ts b/tests/SEGNoHydrationThenMPR.spec.ts index 5bb936728..5e3950d0c 100644 --- a/tests/SEGNoHydrationThenMPR.spec.ts +++ b/tests/SEGNoHydrationThenMPR.spec.ts @@ -11,17 +11,26 @@ test('should launch MPR with unhydrated SEG', async ({ leftPanelPageObject, mainToolbarPageObject, rightPanelPageObject, + viewportPageObject, }) => { await rightPanelPageObject.toggle(); await leftPanelPageObject.loadSeriesByDescription('SEG'); await page.waitForTimeout(5000); - await checkForScreenshot(page, page, screenShotPaths.segNoHydrationThenMPR.segNoHydrationPreMPR); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.segNoHydrationThenMPR.segNoHydrationPreMPR + ); await mainToolbarPageObject.layoutSelection.MPR.click(); await page.waitForTimeout(5000); - await checkForScreenshot(page, page, screenShotPaths.segNoHydrationThenMPR.segNoHydrationPostMPR); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.segNoHydrationThenMPR.segNoHydrationPostMPR + ); }); diff --git a/tests/SRHydration.spec.ts b/tests/SRHydration.spec.ts index 10408da50..455f07443 100644 --- a/tests/SRHydration.spec.ts +++ b/tests/SRHydration.spec.ts @@ -11,12 +11,17 @@ test('should hydrate SR reports correctly', async ({ DOMOverlayPageObject, leftPanelPageObject, rightPanelPageObject, + viewportPageObject, }) => { await rightPanelPageObject.toggle(); await rightPanelPageObject.measurementsPanel.select(); await leftPanelPageObject.loadSeriesByModality('SR'); await page.waitForTimeout(2000); - await checkForScreenshot(page, page, screenShotPaths.srHydration.srPreHydration); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.srHydration.srPreHydration + ); await page.evaluate(() => { // Access cornerstone directly from the window object @@ -39,7 +44,11 @@ test('should hydrate SR reports correctly', async ({ await DOMOverlayPageObject.viewport.segmentationHydration.yes.click(); await page.waitForTimeout(2000); - await checkForScreenshot(page, page, screenShotPaths.srHydration.srPostHydration); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.srHydration.srPostHydration + ); await page.evaluate(() => { // Access cornerstone directly from the window object @@ -62,5 +71,9 @@ test('should hydrate SR reports correctly', async ({ await rightPanelPageObject.measurementsPanel.panel.nthMeasurement(0).click(); - await checkForScreenshot(page, page, screenShotPaths.srHydration.srJumpToMeasurement); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.srHydration.srJumpToMeasurement + ); }); diff --git a/tests/Scoord3dProbe.spec.ts b/tests/Scoord3dProbe.spec.ts index ad2c999a6..4cbfd4ed0 100644 --- a/tests/Scoord3dProbe.spec.ts +++ b/tests/Scoord3dProbe.spec.ts @@ -1,5 +1,14 @@ +import { Locator } from '@playwright/test'; import { checkForScreenshot, expect, screenShotPaths, test, visitStudy } from './utils'; +async function expectNonEmptyDetailLines(lines: Locator) { + const lineCount = await lines.count(); + expect(lineCount).toBeGreaterThan(0); + for (let lineIndex = 0; lineIndex < lineCount; lineIndex++) { + await expect(lines.nth(lineIndex)).not.toBeEmpty(); + } +} + test.beforeEach(async ({ page }) => { const studyInstanceUID = '1.3.6.1.4.1.14519.5.2.1.7310.5101.860473186348887719777907797922'; const mode = 'viewer'; @@ -92,19 +101,13 @@ test('should hydrate SCOORD3D probe measurements correctly', async ({ ); // Verify the measurements list has the correct probe measurements - const measurementRows = page.getByTestId('data-row'); - const rowCount = await measurementRows.count(); - expect(await rightPanelPageObject.measurementsPanel.panel.getMeasurementCount()).toBeGreaterThan( - 0 - ); + expect(await rightPanelPageObject.measurementsPanel.panel.rows).not.toHaveCount(0); + const rowCount = await rightPanelPageObject.measurementsPanel.panel.getMeasurementCount(); - // Verify that the measurements are probe measurements (not other types) for (let i = 0; i < rowCount; i++) { - const measurementText = await rightPanelPageObject.measurementsPanel.panel - .nthMeasurement(i) - .locator.textContent(); - // Probe measurements should be present, verify they're not other measurement types - expect(measurementText).toBeTruthy(); + const measurement = rightPanelPageObject.measurementsPanel.panel.nthMeasurement(i); + await expect(measurement.title).not.toBeEmpty(); + await expectNonEmptyDetailLines(measurement.stats.primary.lines); } // Test jumping to a specific measurement by scrolling and clicking @@ -199,10 +202,8 @@ test('should display SCOORD3D probe measurements correctly', async ({ // Verify that the measurements are probe measurements (not other types like rectangle) for (let i = 0; i < rowCount; i++) { - const measurementText = await rightPanelPageObject.measurementsPanel.panel - .nthMeasurement(i) - .locator.textContent(); - // Probe measurements should be present, verify they're not other measurement types - expect(measurementText).toBeTruthy(); + const measurement = rightPanelPageObject.measurementsPanel.panel.nthMeasurement(i); + await expect(measurement.title).not.toBeEmpty(); + await expectNonEmptyDetailLines(measurement.stats.primary.lines); } }); diff --git a/tests/ScoordRectangle.spec.ts b/tests/ScoordRectangle.spec.ts index b7f92ad7b..b025eaa12 100644 --- a/tests/ScoordRectangle.spec.ts +++ b/tests/ScoordRectangle.spec.ts @@ -1,4 +1,21 @@ -import { checkForScreenshot, expect, screenShotPaths, test, visitStudy } from './utils'; +import type { Locator } from '@playwright/test'; + +import { + checkForScreenshot, + expect, + getAnnotationStats, + screenShotPaths, + test, + visitStudy, +} from './utils'; + +async function expectNonEmptyDetailLines(lines: Locator) { + const lineCount = await lines.count(); + expect(lineCount).toBeGreaterThan(0); + for (let lineIndex = 0; lineIndex < lineCount; lineIndex++) { + await expect(lines.nth(lineIndex)).not.toBeEmpty(); + } +} test.beforeEach(async ({ page }) => { const studyInstanceUID = '1.2.840.113654.2.55.242841386983064378162007136685545369722'; @@ -96,13 +113,11 @@ test('should hydrate SCOORD rectangle measurements correctly', async ({ const rowCount = await rightPanelPageObject.measurementsPanel.panel.getMeasurementCount(); expect(rowCount).toBeGreaterThan(0); - // Verify that the measurements are rectangle measurements (not other types) for (let i = 0; i < rowCount; i++) { - const measurementText = await rightPanelPageObject.measurementsPanel.panel - .nthMeasurement(i) - .locator.textContent(); - // Rectangle measurements should be present, verify they're not other measurement types - expect(measurementText).toBeTruthy(); + const measurement = rightPanelPageObject.measurementsPanel.panel.nthMeasurement(i); + await expect(measurement.title).not.toBeEmpty(); + await expectNonEmptyDetailLines(measurement.stats.primary.lines); + await expectNonEmptyDetailLines(measurement.stats.secondary.lines); } // Test jumping to a specific measurement by scrolling and clicking @@ -195,12 +210,38 @@ test('should display SCOORD rectangle measurements correctly', async ({ const rowCount = await rightPanelPageObject.measurementsPanel.panel.getMeasurementCount(); expect(rowCount).toBeGreaterThan(0); - // Verify that the measurements are rectangle measurements (not other types like probe) + const firstMeasurement = rightPanelPageObject.measurementsPanel.panel.nthMeasurement(0); + const expectedFirstPrimaryDetailLines = ['276 mm²', 'Max: 598 HU', 'Lung structure']; + await expect(firstMeasurement.stats.primary.lines).toHaveCount( + expectedFirstPrimaryDetailLines.length + ); + for (let lineIndex = 0; lineIndex < expectedFirstPrimaryDetailLines.length; lineIndex++) { + await expect(firstMeasurement.stats.primary.lines.nth(lineIndex)).toHaveText( + expectedFirstPrimaryDetailLines[lineIndex] + ); + } + + // Assert against the source-of-truth cachedStats on the cornerstone annotation, + // independent of UI label formatting. Values should match the displayed labels + // after rounding ("276 mm²", "Max: 598 HU"). + const rectangles = await getAnnotationStats(page, { toolName: 'RectangleROI' }); + expect(rectangles.length).toBeGreaterThan(0); + + const stats = rectangles[0].firstTargetStats!; + expect(stats.areaUnit).toBe('mm²'); + expect(Math.round(stats.area as number)).toBe(276); + expect(Math.round(stats.max as number)).toBe(598); + expect(stats.Modality).toBe('CT'); + expect(stats.modalityUnit).toBe('HU'); + + const lines = activeViewport.getSvgAnnotationStatTextLines(rectangles[0].annotationUID); + await expect(lines).toHaveCount(5); + await expect(lines.nth(0)).toHaveText('Area: 276 mm²'); + for (let i = 0; i < rowCount; i++) { - const measurementText = await rightPanelPageObject.measurementsPanel.panel - .nthMeasurement(i) - .locator.textContent(); - // Rectangle measurements should be present, verify they're not other measurement types - expect(measurementText).toBeTruthy(); + const measurement = rightPanelPageObject.measurementsPanel.panel.nthMeasurement(i); + await expect(measurement.title).not.toBeEmpty(); + await expectNonEmptyDetailLines(measurement.stats.primary.lines); + await expectNonEmptyDetailLines(measurement.stats.secondary.lines); } }); diff --git a/tests/Spline.spec.ts b/tests/Spline.spec.ts index 70356d25f..7e77423cf 100644 --- a/tests/Spline.spec.ts +++ b/tests/Spline.spec.ts @@ -1,4 +1,11 @@ -import { checkForScreenshot, screenShotPaths, test, visitStudy, expect } from './utils'; +import { + checkForScreenshot, + expect, + getAnnotationStats, + screenShotPaths, + test, + visitStudy, +} from './utils'; import { press } from './utils/keyboardUtils'; test.beforeEach(async ({ page }) => { @@ -24,7 +31,22 @@ test('should display the spline tool', async ({ { x: 383, y: 461 }, ]); await DOMOverlayPageObject.viewport.measurementTracking.confirm.click(); - await checkForScreenshot(page, page, screenShotPaths.spline.splineDisplayedCorrectly); + await checkForScreenshot( + page, + viewportPageObject.grid, + screenShotPaths.spline.splineDisplayedCorrectly + ); + + const splines = await getAnnotationStats(page, { toolName: 'SplineROI' }); + expect(splines.length).toBeGreaterThan(0); + + const stats = splines[0].firstTargetStats!; + expect(stats.areaUnit).toBe('mm²'); + expect(Math.round(stats.area as number)).toBe(38811); + + const lines = activeViewport.getSvgAnnotationStatTextLines(splines[0].annotationUID); + await expect(lines).toHaveCount(1); + await expect(lines.nth(0)).toHaveText('Area: 38811 mm²'); }); test('should restore viewport interactivity after deleting an in-progress Spline annotation via context menu', async ({ diff --git a/tests/pages/RightPanelPageObject.ts b/tests/pages/RightPanelPageObject.ts index 842cf4913..9ca2afb98 100644 --- a/tests/pages/RightPanelPageObject.ts +++ b/tests/pages/RightPanelPageObject.ts @@ -112,30 +112,58 @@ export class RightPanelPageObject { get measurementsPanel() { const page = this.page; - const getMeasurementByIdx = (index: number) => this.getPanelRowByIdx(index); - const getMeasurementByText = (text: string) => this.getPanelRowByText(text); - const menuButton = page.getByTestId('trackedMeasurements-btn'); + const trackedMeasurementsPanel = page.getByTestId('trackedMeasurements-panel').last(); + const measurementTableRows = trackedMeasurementsPanel.locator( + '[data-cy^="measurement-table-row-"]' + ); + const getMeasurementStatsAt = (index: number) => { + const dataRow = trackedMeasurementsPanel + .getByTestId(`measurement-table-row-${index}`) + .getByTestId('data-row'); + const locator = dataRow.locator('..').getByTestId('data-row-details'); + const primaryLocator = locator.getByTestId('data-row-details-primary'); + const secondaryLocator = locator.getByTestId('data-row-details-secondary'); + return { + locator, + primary: { + locator: primaryLocator, + lines: primaryLocator.getByTestId('data-row-detail-line'), + }, + secondary: { + locator: secondaryLocator, + lines: secondaryLocator.getByTestId('data-row-detail-line'), + }, + }; + }; + const getMeasurementDataRowAt = (index: number) => { + const rowWrapper = trackedMeasurementsPanel.getByTestId(`measurement-table-row-${index}`); + const dataRow = rowWrapper.getByTestId('data-row'); + const row = this.getPanelRowDataObject(rowWrapper); + // Selection highlight (bg-popover) is on the inner DataRow, not the measurement-table-row wrapper + return { + ...row, + locator: dataRow, + stats: getMeasurementStatsAt(index), + }; + }; + const trackedMeasurementsMenu = page.getByTestId('trackedMeasurements-btn'); return { - menuButton, panel: { deleteAll: async () => { await page.getByRole('button', { name: 'Delete' }).click(); }, getMeasurementCount: async () => { - return await page.getByTestId('data-row').count(); + return await measurementTableRows.count(); }, - rows: page.getByTestId('data-row'), - locator: page.getByTestId('trackedMeasurements-panel').last(), + rows: measurementTableRows, + locator: trackedMeasurementsPanel, nthMeasurement(index: number) { - return getMeasurementByIdx(index); - }, - measurementByText(text: string) { - return getMeasurementByText(text); + return getMeasurementDataRowAt(index); }, }, select: async () => { - await menuButton.click(); + await trackedMeasurementsMenu.click(); }, }; } @@ -414,7 +442,6 @@ export class RightPanelPageObject { get microscopyPanel() { const page = this.page; const getMeasurementByIdx = (index: number) => this.getPanelRowByIdx(index); - const getMeasurementByText = (text: string) => this.getPanelRowByText(text); return { locator: page.getByTestId('measurements-panel'), @@ -424,9 +451,6 @@ export class RightPanelPageObject { nthMeasurement(index: number) { return getMeasurementByIdx(index); }, - measurementByText(text: string) { - return getMeasurementByText(text); - }, }; } } diff --git a/tests/pages/ViewportPageObject.ts b/tests/pages/ViewportPageObject.ts index 4e6e67e23..16396b4fc 100644 --- a/tests/pages/ViewportPageObject.ts +++ b/tests/pages/ViewportPageObject.ts @@ -5,12 +5,13 @@ import { simulateDoubleClickOnElement, simulateNormalizedClicksOnElement, simulateNormalizedDragOnElement, + simulateNormalizedPathDragOnElement, } from '../utils'; import { DataOverlayPageObject } from './DataOverlayPageObject'; import { DOMOverlayPageObject } from './DOMOverlayPageObject'; import { MagnifyGlassPageObject } from './MagnifyGlassPageObject'; -type SvgInnerElement = 'circle' | 'path' | 'd' | 'line'; +type SvgInnerElement = 'circle' | 'path' | 'd' | 'line' | 'g'; type NormalizedDragParams = { start: { x: number; y: number }; @@ -18,6 +19,11 @@ type NormalizedDragParams = { config?: { button?: 'left' | 'right' | 'middle'; delay?: number; steps?: number }; }; +type NormalizedPathDragParams = { + path: { x: number; y: number }[]; + config?: { button?: 'left' | 'right' | 'middle'; delay?: number; steps?: number }; +}; + export interface IOverlayText { get windowLevel(): Locator; get instanceNumber(): Locator; @@ -56,6 +62,7 @@ export interface IViewportPageObject { button?: 'left' | 'right' | 'middle' ) => Promise; normalizedDragAt: (params: NormalizedDragParams) => Promise; + normalizedPathDragAt: (params: NormalizedPathDragParams) => Promise; orientationMarkers: { topMid: Locator; leftMid: Locator; @@ -81,6 +88,7 @@ export interface IViewportPageObject { }; pane: Locator; svg: (innerElement?: SvgInnerElement) => Locator; + getSvgAnnotationStatTextLines: (uid: string) => Locator; navigationArrows: { locator: Locator; prev: { @@ -297,6 +305,15 @@ export class ViewportPageObject { steps: params.config?.steps, }); }, + normalizedPathDragAt: async (params: NormalizedPathDragParams) => { + await simulateNormalizedPathDragOnElement({ + locator: viewport, + path: params.path, + button: params.config?.button, + delay: params.config?.delay, + steps: params.config?.steps, + }); + }, orientationMarkers: this.getOrientationMarkers(viewport), overlayText: this.getOverlayText(viewport), overlayMenu: await this.getOverlayMenu(viewport), @@ -304,6 +321,11 @@ export class ViewportPageObject { svg: (innerElement?: SvgInnerElement) => { return this.getSvg(viewport, innerElement); }, + getSvgAnnotationStatTextLines: (uid: string) => { + return this.getSvg(viewport) + .locator(`g[data-annotation-uid="${uid}"]`) + .locator('tspan'); + }, navigationArrows: this.getNavigationArrows(viewport), sliceNavigation: this.getSliceNavigation(viewport), magnifyGlass: new MagnifyGlassPageObject(this.page, viewport), diff --git a/tests/screenshots/chromium/3DFourUp.spec.ts/threeDFourUpDisplayedCorrectly.png b/tests/screenshots/chromium/3DFourUp.spec.ts/threeDFourUpDisplayedCorrectly.png index 4eae60e2c..9bc84ce18 100644 Binary files a/tests/screenshots/chromium/3DFourUp.spec.ts/threeDFourUpDisplayedCorrectly.png and b/tests/screenshots/chromium/3DFourUp.spec.ts/threeDFourUpDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/3DMain.spec.ts/threeDMainDisplayedCorrectly.png b/tests/screenshots/chromium/3DMain.spec.ts/threeDMainDisplayedCorrectly.png index f9299fd48..b52a7b753 100644 Binary files a/tests/screenshots/chromium/3DMain.spec.ts/threeDMainDisplayedCorrectly.png and b/tests/screenshots/chromium/3DMain.spec.ts/threeDMainDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/3DOnly.spec.ts/threeDOnlyDisplayedCorrectly.png b/tests/screenshots/chromium/3DOnly.spec.ts/threeDOnlyDisplayedCorrectly.png index 7a8e5297f..2e497ad6b 100644 Binary files a/tests/screenshots/chromium/3DOnly.spec.ts/threeDOnlyDisplayedCorrectly.png and b/tests/screenshots/chromium/3DOnly.spec.ts/threeDOnlyDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/3DPrimary.spec.ts/threeDPrimaryDisplayedCorrectly.png b/tests/screenshots/chromium/3DPrimary.spec.ts/threeDPrimaryDisplayedCorrectly.png index 1b4ecf8e5..031948228 100644 Binary files a/tests/screenshots/chromium/3DPrimary.spec.ts/threeDPrimaryDisplayedCorrectly.png and b/tests/screenshots/chromium/3DPrimary.spec.ts/threeDPrimaryDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/Angle.spec.ts/angleDisplayedCorrectly.png b/tests/screenshots/chromium/Angle.spec.ts/angleDisplayedCorrectly.png index 8d2ceadf6..9cf545421 100644 Binary files a/tests/screenshots/chromium/Angle.spec.ts/angleDisplayedCorrectly.png and b/tests/screenshots/chromium/Angle.spec.ts/angleDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/ArrowAnnotate.spec.ts/arrowAnnotateDisplayedCorrectly0.png b/tests/screenshots/chromium/ArrowAnnotate.spec.ts/arrowAnnotateDisplayedCorrectly0.png index 79daa4968..2c9b0bbb5 100644 Binary files a/tests/screenshots/chromium/ArrowAnnotate.spec.ts/arrowAnnotateDisplayedCorrectly0.png and b/tests/screenshots/chromium/ArrowAnnotate.spec.ts/arrowAnnotateDisplayedCorrectly0.png differ diff --git a/tests/screenshots/chromium/ArrowAnnotate.spec.ts/arrowAnnotateDisplayedCorrectly1.png b/tests/screenshots/chromium/ArrowAnnotate.spec.ts/arrowAnnotateDisplayedCorrectly1.png index 0b0d55689..de6f8b5ce 100644 Binary files a/tests/screenshots/chromium/ArrowAnnotate.spec.ts/arrowAnnotateDisplayedCorrectly1.png and b/tests/screenshots/chromium/ArrowAnnotate.spec.ts/arrowAnnotateDisplayedCorrectly1.png differ diff --git a/tests/screenshots/chromium/ArrowAnnotate.spec.ts/arrowAnnotateDisplayedCorrectly2.png b/tests/screenshots/chromium/ArrowAnnotate.spec.ts/arrowAnnotateDisplayedCorrectly2.png index 290f97d32..e9c302fb4 100644 Binary files a/tests/screenshots/chromium/ArrowAnnotate.spec.ts/arrowAnnotateDisplayedCorrectly2.png and b/tests/screenshots/chromium/ArrowAnnotate.spec.ts/arrowAnnotateDisplayedCorrectly2.png differ diff --git a/tests/screenshots/chromium/AxialPrimary.spec.ts/axialPrimaryDisplayedCorrectly.png b/tests/screenshots/chromium/AxialPrimary.spec.ts/axialPrimaryDisplayedCorrectly.png index 5e9195f09..054b19d4e 100644 Binary files a/tests/screenshots/chromium/AxialPrimary.spec.ts/axialPrimaryDisplayedCorrectly.png and b/tests/screenshots/chromium/AxialPrimary.spec.ts/axialPrimaryDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/Bidirectional.spec.ts/bidirectionalDisplayedCorrectly.png b/tests/screenshots/chromium/Bidirectional.spec.ts/bidirectionalDisplayedCorrectly.png index dbdcdb0fa..61390a853 100644 Binary files a/tests/screenshots/chromium/Bidirectional.spec.ts/bidirectionalDisplayedCorrectly.png and b/tests/screenshots/chromium/Bidirectional.spec.ts/bidirectionalDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/Circle.spec.ts/circleDisplayedCorrectly.png b/tests/screenshots/chromium/Circle.spec.ts/circleDisplayedCorrectly.png index 42d21cd66..29bcf4b78 100644 Binary files a/tests/screenshots/chromium/Circle.spec.ts/circleDisplayedCorrectly.png and b/tests/screenshots/chromium/Circle.spec.ts/circleDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/CobbAngle.spec.ts/cobbangleDisplayedCorrectly.png b/tests/screenshots/chromium/CobbAngle.spec.ts/cobbangleDisplayedCorrectly.png index 1e4169c8a..2d143d862 100644 Binary files a/tests/screenshots/chromium/CobbAngle.spec.ts/cobbangleDisplayedCorrectly.png and b/tests/screenshots/chromium/CobbAngle.spec.ts/cobbangleDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/ContextMenu.spec.ts/contextMenuNearBottomEdgeNotClipped.png b/tests/screenshots/chromium/ContextMenu.spec.ts/contextMenuNearBottomEdgeNotClipped.png index f00bb836a..2f216fd86 100644 Binary files a/tests/screenshots/chromium/ContextMenu.spec.ts/contextMenuNearBottomEdgeNotClipped.png and b/tests/screenshots/chromium/ContextMenu.spec.ts/contextMenuNearBottomEdgeNotClipped.png differ diff --git a/tests/screenshots/chromium/ContextMenu.spec.ts/preContextMenuNearBottomEdge.png b/tests/screenshots/chromium/ContextMenu.spec.ts/preContextMenuNearBottomEdge.png index 7288c676a..8c52f7ee5 100644 Binary files a/tests/screenshots/chromium/ContextMenu.spec.ts/preContextMenuNearBottomEdge.png and b/tests/screenshots/chromium/ContextMenu.spec.ts/preContextMenuNearBottomEdge.png differ diff --git a/tests/screenshots/chromium/Crosshairs.spec.ts/crosshairsNewDisplayset.png b/tests/screenshots/chromium/Crosshairs.spec.ts/crosshairsNewDisplayset.png deleted file mode 100644 index 4f4889a80..000000000 Binary files a/tests/screenshots/chromium/Crosshairs.spec.ts/crosshairsNewDisplayset.png and /dev/null differ diff --git a/tests/screenshots/chromium/Crosshairs.spec.ts/crosshairsRendered.png b/tests/screenshots/chromium/Crosshairs.spec.ts/crosshairsRendered.png deleted file mode 100644 index bb88b78e8..000000000 Binary files a/tests/screenshots/chromium/Crosshairs.spec.ts/crosshairsRendered.png and /dev/null differ diff --git a/tests/screenshots/chromium/Crosshairs.spec.ts/crosshairsResetToolbar.png b/tests/screenshots/chromium/Crosshairs.spec.ts/crosshairsResetToolbar.png deleted file mode 100644 index 13ac98e45..000000000 Binary files a/tests/screenshots/chromium/Crosshairs.spec.ts/crosshairsResetToolbar.png and /dev/null differ diff --git a/tests/screenshots/chromium/Crosshairs.spec.ts/crosshairsRotated.png b/tests/screenshots/chromium/Crosshairs.spec.ts/crosshairsRotated.png deleted file mode 100644 index 98b97f3ee..000000000 Binary files a/tests/screenshots/chromium/Crosshairs.spec.ts/crosshairsRotated.png and /dev/null differ diff --git a/tests/screenshots/chromium/Crosshairs.spec.ts/crosshairsSlabThickness.png b/tests/screenshots/chromium/Crosshairs.spec.ts/crosshairsSlabThickness.png deleted file mode 100644 index b0af30da1..000000000 Binary files a/tests/screenshots/chromium/Crosshairs.spec.ts/crosshairsSlabThickness.png and /dev/null differ diff --git a/tests/screenshots/chromium/DataOverlayMenu.spec.ts/noOverlay.png b/tests/screenshots/chromium/DataOverlayMenu.spec.ts/noOverlay.png index 3e2a7211c..66d160553 100644 Binary files a/tests/screenshots/chromium/DataOverlayMenu.spec.ts/noOverlay.png and b/tests/screenshots/chromium/DataOverlayMenu.spec.ts/noOverlay.png differ diff --git a/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlay2d-tta-nnU-Net-Segmentation.png b/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlay2d-tta-nnU-Net-Segmentation.png index 3a342c3a1..77f33aede 100644 Binary files a/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlay2d-tta-nnU-Net-Segmentation.png and b/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlay2d-tta-nnU-Net-Segmentation.png differ diff --git a/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlayMenuWith2d-tta-nnU-Net-SegmentationSelected.png b/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlayMenuWith2d-tta-nnU-Net-SegmentationSelected.png index 963bb1e0c..7dc163bed 100644 Binary files a/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlayMenuWith2d-tta-nnU-Net-SegmentationSelected.png and b/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlayMenuWith2d-tta-nnU-Net-SegmentationSelected.png differ diff --git a/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlayMenuWithSegmentationOverlaysRemoved.png b/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlayMenuWithSegmentationOverlaysRemoved.png index e4639caae..1576b01fb 100644 Binary files a/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlayMenuWithSegmentationOverlaysRemoved.png and b/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlayMenuWithSegmentationOverlaysRemoved.png differ diff --git a/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlayMenuWithSegmentationSelected.png b/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlayMenuWithSegmentationSelected.png index 11efd272b..09504bdb7 100644 Binary files a/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlayMenuWithSegmentationSelected.png and b/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlayMenuWithSegmentationSelected.png differ diff --git a/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlaySegmentation.png b/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlaySegmentation.png index d999ca2b4..70c1d8320 100644 Binary files a/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlaySegmentation.png and b/tests/screenshots/chromium/DataOverlayMenu.spec.ts/overlaySegmentation.png differ diff --git a/tests/screenshots/chromium/DicomTagBrowser.spec.ts/dicomTagBrowserDisplayedCorrectly.png b/tests/screenshots/chromium/DicomTagBrowser.spec.ts/dicomTagBrowserDisplayedCorrectly.png index 2e7b60ef7..5f80dfa3d 100644 Binary files a/tests/screenshots/chromium/DicomTagBrowser.spec.ts/dicomTagBrowserDisplayedCorrectly.png and b/tests/screenshots/chromium/DicomTagBrowser.spec.ts/dicomTagBrowserDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/Ellipse.spec.ts/ellipseDisplayedCorrectly.png b/tests/screenshots/chromium/Ellipse.spec.ts/ellipseDisplayedCorrectly.png index 4c9cd9fc4..554cc4b0d 100644 Binary files a/tests/screenshots/chromium/Ellipse.spec.ts/ellipseDisplayedCorrectly.png and b/tests/screenshots/chromium/Ellipse.spec.ts/ellipseDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/FlipHorizontal.spec.ts/flipHorizontalDisplayedCorrectly.png b/tests/screenshots/chromium/FlipHorizontal.spec.ts/flipHorizontalDisplayedCorrectly.png index 44f4b2db7..917aea446 100644 Binary files a/tests/screenshots/chromium/FlipHorizontal.spec.ts/flipHorizontalDisplayedCorrectly.png and b/tests/screenshots/chromium/FlipHorizontal.spec.ts/flipHorizontalDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/Invert.spec.ts/invertDisplayedCorrectly.png b/tests/screenshots/chromium/Invert.spec.ts/invertDisplayedCorrectly.png index b8e4cfaeb..37eaaf43d 100644 Binary files a/tests/screenshots/chromium/Invert.spec.ts/invertDisplayedCorrectly.png and b/tests/screenshots/chromium/Invert.spec.ts/invertDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-changeSeriesInMPR.png b/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-changeSeriesInMPR.png index ac4d354c8..49899bda7 100644 Binary files a/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-changeSeriesInMPR.png and b/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-changeSeriesInMPR.png differ diff --git a/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-initialDraw.png b/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-initialDraw.png index 069b7a11a..a07c2a4f0 100644 Binary files a/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-initialDraw.png and b/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-initialDraw.png differ diff --git a/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-jumpInMPR.png b/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-jumpInMPR.png index e97603f0c..bebdbc933 100644 Binary files a/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-jumpInMPR.png and b/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-jumpInMPR.png differ diff --git a/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-jumpToMeasurementAfterSeriesChange.png b/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-jumpToMeasurementAfterSeriesChange.png index dd44ab4e6..50df3ac15 100644 Binary files a/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-jumpToMeasurementAfterSeriesChange.png and b/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-jumpToMeasurementAfterSeriesChange.png differ diff --git a/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-jumpToMeasurementStack.png b/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-jumpToMeasurementStack.png index 56636f40e..a07c2a4f0 100644 Binary files a/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-jumpToMeasurementStack.png and b/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-jumpToMeasurementStack.png differ diff --git a/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-scrollAway.png b/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-scrollAway.png index 2b1a35bbe..a60b3382a 100644 Binary files a/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-scrollAway.png and b/tests/screenshots/chromium/JumpToMeasurementMPR.spec.ts/jumpToMeasurementMPR-scrollAway.png differ diff --git a/tests/screenshots/chromium/LabelMapSegLocking.spec.ts/lockedSegPostEdit.png b/tests/screenshots/chromium/LabelMapSegLocking.spec.ts/lockedSegPostEdit.png index d388290dc..a2e30cdb6 100644 Binary files a/tests/screenshots/chromium/LabelMapSegLocking.spec.ts/lockedSegPostEdit.png and b/tests/screenshots/chromium/LabelMapSegLocking.spec.ts/lockedSegPostEdit.png differ diff --git a/tests/screenshots/chromium/LabelMapSegLocking.spec.ts/lockedSegPreEdit.png b/tests/screenshots/chromium/LabelMapSegLocking.spec.ts/lockedSegPreEdit.png index 6e71fb984..d6909ca71 100644 Binary files a/tests/screenshots/chromium/LabelMapSegLocking.spec.ts/lockedSegPreEdit.png and b/tests/screenshots/chromium/LabelMapSegLocking.spec.ts/lockedSegPreEdit.png differ diff --git a/tests/screenshots/chromium/LabelMapSegLocking.spec.ts/unlockedSegPostEdit.png b/tests/screenshots/chromium/LabelMapSegLocking.spec.ts/unlockedSegPostEdit.png index 2c85a9200..3b59e94f3 100644 Binary files a/tests/screenshots/chromium/LabelMapSegLocking.spec.ts/unlockedSegPostEdit.png and b/tests/screenshots/chromium/LabelMapSegLocking.spec.ts/unlockedSegPostEdit.png differ diff --git a/tests/screenshots/chromium/LabelMapSegLocking.spec.ts/unlockedSegPreEdit.png b/tests/screenshots/chromium/LabelMapSegLocking.spec.ts/unlockedSegPreEdit.png index 5e89bb478..d6909ca71 100644 Binary files a/tests/screenshots/chromium/LabelMapSegLocking.spec.ts/unlockedSegPreEdit.png and b/tests/screenshots/chromium/LabelMapSegLocking.spec.ts/unlockedSegPreEdit.png differ diff --git a/tests/screenshots/chromium/Length.spec.ts/lengthDisplayedCorrectly.png b/tests/screenshots/chromium/Length.spec.ts/lengthDisplayedCorrectly.png index 13882384c..1335df6a3 100644 Binary files a/tests/screenshots/chromium/Length.spec.ts/lengthDisplayedCorrectly.png and b/tests/screenshots/chromium/Length.spec.ts/lengthDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/Livewire.spec.ts/livewireDisplayedCorrectly.png b/tests/screenshots/chromium/Livewire.spec.ts/livewireDisplayedCorrectly.png index ce440a4a2..c9e54a54e 100644 Binary files a/tests/screenshots/chromium/Livewire.spec.ts/livewireDisplayedCorrectly.png and b/tests/screenshots/chromium/Livewire.spec.ts/livewireDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/MPR.spec.ts/mprDisplayedCorrectly.png b/tests/screenshots/chromium/MPR.spec.ts/mprDisplayedCorrectly.png index 9a479a25a..304eee74d 100644 Binary files a/tests/screenshots/chromium/MPR.spec.ts/mprDisplayedCorrectly.png and b/tests/screenshots/chromium/MPR.spec.ts/mprDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/MPRThenRTOverlayNoHydration.spec.ts/mprPostRTOverlayNoHydration.png b/tests/screenshots/chromium/MPRThenRTOverlayNoHydration.spec.ts/mprPostRTOverlayNoHydration.png index 78dad925f..68e6713b6 100644 Binary files a/tests/screenshots/chromium/MPRThenRTOverlayNoHydration.spec.ts/mprPostRTOverlayNoHydration.png and b/tests/screenshots/chromium/MPRThenRTOverlayNoHydration.spec.ts/mprPostRTOverlayNoHydration.png differ diff --git a/tests/screenshots/chromium/MPRThenRTOverlayNoHydration.spec.ts/mprPreRTOverlayNoHydration.png b/tests/screenshots/chromium/MPRThenRTOverlayNoHydration.spec.ts/mprPreRTOverlayNoHydration.png index d16558fda..d968c3a5a 100644 Binary files a/tests/screenshots/chromium/MPRThenRTOverlayNoHydration.spec.ts/mprPreRTOverlayNoHydration.png and b/tests/screenshots/chromium/MPRThenRTOverlayNoHydration.spec.ts/mprPreRTOverlayNoHydration.png differ diff --git a/tests/screenshots/chromium/MPRThenSEGOverlayNoHydration.spec.ts/mprPostSEGOverlayNoHydration.png b/tests/screenshots/chromium/MPRThenSEGOverlayNoHydration.spec.ts/mprPostSEGOverlayNoHydration.png index f497059f5..444d4a0fe 100644 Binary files a/tests/screenshots/chromium/MPRThenSEGOverlayNoHydration.spec.ts/mprPostSEGOverlayNoHydration.png and b/tests/screenshots/chromium/MPRThenSEGOverlayNoHydration.spec.ts/mprPostSEGOverlayNoHydration.png differ diff --git a/tests/screenshots/chromium/MPRThenSEGOverlayNoHydration.spec.ts/mprPreSEGOverlayNoHydration.png b/tests/screenshots/chromium/MPRThenSEGOverlayNoHydration.spec.ts/mprPreSEGOverlayNoHydration.png index 1710c1e2d..a353dad40 100644 Binary files a/tests/screenshots/chromium/MPRThenSEGOverlayNoHydration.spec.ts/mprPreSEGOverlayNoHydration.png and b/tests/screenshots/chromium/MPRThenSEGOverlayNoHydration.spec.ts/mprPreSEGOverlayNoHydration.png differ diff --git a/tests/screenshots/chromium/MultipleSegmentationDataOverlays.spec.ts/overlaySEGsAndRTDisplayed.png b/tests/screenshots/chromium/MultipleSegmentationDataOverlays.spec.ts/overlaySEGsAndRTDisplayed.png index a48771083..e50a17cc5 100644 Binary files a/tests/screenshots/chromium/MultipleSegmentationDataOverlays.spec.ts/overlaySEGsAndRTDisplayed.png and b/tests/screenshots/chromium/MultipleSegmentationDataOverlays.spec.ts/overlaySEGsAndRTDisplayed.png differ diff --git a/tests/screenshots/chromium/MultipleSegmentationDataOverlays.spec.ts/overlaysDisplayed.png b/tests/screenshots/chromium/MultipleSegmentationDataOverlays.spec.ts/overlaysDisplayed.png index ebccf2c02..86b6ce11c 100644 Binary files a/tests/screenshots/chromium/MultipleSegmentationDataOverlays.spec.ts/overlaysDisplayed.png and b/tests/screenshots/chromium/MultipleSegmentationDataOverlays.spec.ts/overlaysDisplayed.png differ diff --git a/tests/screenshots/chromium/MultipleSegmentationDataOverlays.spec.ts/threeSegOverlaysInOverlayMenu.png b/tests/screenshots/chromium/MultipleSegmentationDataOverlays.spec.ts/threeSegOverlaysInOverlayMenu.png index 03596ba41..57085b514 100644 Binary files a/tests/screenshots/chromium/MultipleSegmentationDataOverlays.spec.ts/threeSegOverlaysInOverlayMenu.png and b/tests/screenshots/chromium/MultipleSegmentationDataOverlays.spec.ts/threeSegOverlaysInOverlayMenu.png differ diff --git a/tests/screenshots/chromium/Probe.spec.ts/probeDisplayedCorrectly.png b/tests/screenshots/chromium/Probe.spec.ts/probeDisplayedCorrectly.png index 6cf4a4e3a..35b43f9fd 100644 Binary files a/tests/screenshots/chromium/Probe.spec.ts/probeDisplayedCorrectly.png and b/tests/screenshots/chromium/Probe.spec.ts/probeDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayFirstImage.png b/tests/screenshots/chromium/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayFirstImage.png index 865f392fb..1532fcdef 100644 Binary files a/tests/screenshots/chromium/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayFirstImage.png and b/tests/screenshots/chromium/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayFirstImage.png differ diff --git a/tests/screenshots/chromium/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayMiddleImage.png b/tests/screenshots/chromium/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayMiddleImage.png index b9f59a95f..5c2f3ef93 100644 Binary files a/tests/screenshots/chromium/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayMiddleImage.png and b/tests/screenshots/chromium/RTDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayMiddleImage.png differ diff --git a/tests/screenshots/chromium/RTDataOverlayNoHydrationThenMPR.spec.ts/rtDataOverlayNoHydrationPostMpr.png b/tests/screenshots/chromium/RTDataOverlayNoHydrationThenMPR.spec.ts/rtDataOverlayNoHydrationPostMpr.png index 8d12b49e5..d8af93931 100644 Binary files a/tests/screenshots/chromium/RTDataOverlayNoHydrationThenMPR.spec.ts/rtDataOverlayNoHydrationPostMpr.png and b/tests/screenshots/chromium/RTDataOverlayNoHydrationThenMPR.spec.ts/rtDataOverlayNoHydrationPostMpr.png differ diff --git a/tests/screenshots/chromium/RTDataOverlayNoHydrationThenMPR.spec.ts/rtDataOverlayNoHydrationPreMpr.png b/tests/screenshots/chromium/RTDataOverlayNoHydrationThenMPR.spec.ts/rtDataOverlayNoHydrationPreMpr.png index b3c51c6c3..2f3c4fca9 100644 Binary files a/tests/screenshots/chromium/RTDataOverlayNoHydrationThenMPR.spec.ts/rtDataOverlayNoHydrationPreMpr.png and b/tests/screenshots/chromium/RTDataOverlayNoHydrationThenMPR.spec.ts/rtDataOverlayNoHydrationPreMpr.png differ diff --git a/tests/screenshots/chromium/RTHydration.spec.ts/rtJumpToStructure.png b/tests/screenshots/chromium/RTHydration.spec.ts/rtJumpToStructure.png index afc09d1f5..00729d567 100644 Binary files a/tests/screenshots/chromium/RTHydration.spec.ts/rtJumpToStructure.png and b/tests/screenshots/chromium/RTHydration.spec.ts/rtJumpToStructure.png differ diff --git a/tests/screenshots/chromium/RTHydration.spec.ts/rtPostHydration.png b/tests/screenshots/chromium/RTHydration.spec.ts/rtPostHydration.png index 3c068854d..fa7966793 100644 Binary files a/tests/screenshots/chromium/RTHydration.spec.ts/rtPostHydration.png and b/tests/screenshots/chromium/RTHydration.spec.ts/rtPostHydration.png differ diff --git a/tests/screenshots/chromium/RTHydration.spec.ts/rtPreHydration.png b/tests/screenshots/chromium/RTHydration.spec.ts/rtPreHydration.png index 02a8f103d..17a9bd29e 100644 Binary files a/tests/screenshots/chromium/RTHydration.spec.ts/rtPreHydration.png and b/tests/screenshots/chromium/RTHydration.spec.ts/rtPreHydration.png differ diff --git a/tests/screenshots/chromium/RTHydration2.spec.ts/rtPostHydration.png b/tests/screenshots/chromium/RTHydration2.spec.ts/rtPostHydration.png index d0c12f0d3..15882e197 100644 Binary files a/tests/screenshots/chromium/RTHydration2.spec.ts/rtPostHydration.png and b/tests/screenshots/chromium/RTHydration2.spec.ts/rtPostHydration.png differ diff --git a/tests/screenshots/chromium/RTHydration2.spec.ts/rtPreHydration.png b/tests/screenshots/chromium/RTHydration2.spec.ts/rtPreHydration.png index 048000368..75b26d11c 100644 Binary files a/tests/screenshots/chromium/RTHydration2.spec.ts/rtPreHydration.png and b/tests/screenshots/chromium/RTHydration2.spec.ts/rtPreHydration.png differ diff --git a/tests/screenshots/chromium/RTHydrationDisableConfirmation.spec.ts/firstLoadPostHydration.png b/tests/screenshots/chromium/RTHydrationDisableConfirmation.spec.ts/firstLoadPostHydration.png index 07f0c4f5f..4b01d0fb4 100644 Binary files a/tests/screenshots/chromium/RTHydrationDisableConfirmation.spec.ts/firstLoadPostHydration.png and b/tests/screenshots/chromium/RTHydrationDisableConfirmation.spec.ts/firstLoadPostHydration.png differ diff --git a/tests/screenshots/chromium/RTHydrationDisableConfirmation.spec.ts/secondLoadPostHydration.png b/tests/screenshots/chromium/RTHydrationDisableConfirmation.spec.ts/secondLoadPostHydration.png index 5b8e51197..f8f491fc1 100644 Binary files a/tests/screenshots/chromium/RTHydrationDisableConfirmation.spec.ts/secondLoadPostHydration.png and b/tests/screenshots/chromium/RTHydrationDisableConfirmation.spec.ts/secondLoadPostHydration.png differ diff --git a/tests/screenshots/chromium/RTHydrationDisableConfirmation.spec.ts/viewportAfterFirstDelete.png b/tests/screenshots/chromium/RTHydrationDisableConfirmation.spec.ts/viewportAfterFirstDelete.png index c9ea47000..e4f679cb4 100644 Binary files a/tests/screenshots/chromium/RTHydrationDisableConfirmation.spec.ts/viewportAfterFirstDelete.png and b/tests/screenshots/chromium/RTHydrationDisableConfirmation.spec.ts/viewportAfterFirstDelete.png differ diff --git a/tests/screenshots/chromium/RTHydrationDisableConfirmation.spec.ts/viewportAfterSecondDelete.png b/tests/screenshots/chromium/RTHydrationDisableConfirmation.spec.ts/viewportAfterSecondDelete.png index 6f1eae8fe..e4f679cb4 100644 Binary files a/tests/screenshots/chromium/RTHydrationDisableConfirmation.spec.ts/viewportAfterSecondDelete.png and b/tests/screenshots/chromium/RTHydrationDisableConfirmation.spec.ts/viewportAfterSecondDelete.png differ diff --git a/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRT.png b/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRT.png index 952d0fc3c..85be6188c 100644 Binary files a/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRT.png and b/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRT.png differ diff --git a/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRTHydrated.png b/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRTHydrated.png index 382f1ac7a..d10422c49 100644 Binary files a/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRTHydrated.png and b/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRTHydrated.png differ diff --git a/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRTHydratedAfterLayoutChange.png b/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRTHydratedAfterLayoutChange.png index 149f14961..503f0e3c3 100644 Binary files a/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRTHydratedAfterLayoutChange.png and b/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprAfterRTHydratedAfterLayoutChange.png differ diff --git a/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprBeforeRT.png b/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprBeforeRT.png index 95cd41623..4767dde49 100644 Binary files a/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprBeforeRT.png and b/tests/screenshots/chromium/RTHydrationFromMPR.spec.ts/mprBeforeRT.png differ diff --git a/tests/screenshots/chromium/RTHydrationThenMPR.spec.ts/rtPostHydration.png b/tests/screenshots/chromium/RTHydrationThenMPR.spec.ts/rtPostHydration.png index 76d0e0004..c287fa1e3 100644 Binary files a/tests/screenshots/chromium/RTHydrationThenMPR.spec.ts/rtPostHydration.png and b/tests/screenshots/chromium/RTHydrationThenMPR.spec.ts/rtPostHydration.png differ diff --git a/tests/screenshots/chromium/RTHydrationThenMPR.spec.ts/rtPostHydrationMPRAxialPrimary.png b/tests/screenshots/chromium/RTHydrationThenMPR.spec.ts/rtPostHydrationMPRAxialPrimary.png index de3496537..2cfd58bb2 100644 Binary files a/tests/screenshots/chromium/RTHydrationThenMPR.spec.ts/rtPostHydrationMPRAxialPrimary.png and b/tests/screenshots/chromium/RTHydrationThenMPR.spec.ts/rtPostHydrationMPRAxialPrimary.png differ diff --git a/tests/screenshots/chromium/RTNoHydrationThenMPR.spec.ts/rtNoHydrationPostMpr.png b/tests/screenshots/chromium/RTNoHydrationThenMPR.spec.ts/rtNoHydrationPostMpr.png index ee47404e6..706d2e444 100644 Binary files a/tests/screenshots/chromium/RTNoHydrationThenMPR.spec.ts/rtNoHydrationPostMpr.png and b/tests/screenshots/chromium/RTNoHydrationThenMPR.spec.ts/rtNoHydrationPostMpr.png differ diff --git a/tests/screenshots/chromium/RTNoHydrationThenMPR.spec.ts/rtNoHydrationPreMpr.png b/tests/screenshots/chromium/RTNoHydrationThenMPR.spec.ts/rtNoHydrationPreMpr.png index 2b7579152..559786883 100644 Binary files a/tests/screenshots/chromium/RTNoHydrationThenMPR.spec.ts/rtNoHydrationPreMpr.png and b/tests/screenshots/chromium/RTNoHydrationThenMPR.spec.ts/rtNoHydrationPreMpr.png differ diff --git a/tests/screenshots/chromium/Rectangle.spec.ts/rectangleDisplayedCorrectly.png b/tests/screenshots/chromium/Rectangle.spec.ts/rectangleDisplayedCorrectly.png index 4ed158d61..b8f6b7d98 100644 Binary files a/tests/screenshots/chromium/Rectangle.spec.ts/rectangleDisplayedCorrectly.png and b/tests/screenshots/chromium/Rectangle.spec.ts/rectangleDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/Reset.spec.ts/resetDisplayedCorrectly.png b/tests/screenshots/chromium/Reset.spec.ts/resetDisplayedCorrectly.png index 353416961..ae700623d 100644 Binary files a/tests/screenshots/chromium/Reset.spec.ts/resetDisplayedCorrectly.png and b/tests/screenshots/chromium/Reset.spec.ts/resetDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/RotateRight.spec.ts/rotateRightDisplayedCorrectly.png b/tests/screenshots/chromium/RotateRight.spec.ts/rotateRightDisplayedCorrectly.png index 6e670d3ed..63c5e16e4 100644 Binary files a/tests/screenshots/chromium/RotateRight.spec.ts/rotateRightDisplayedCorrectly.png and b/tests/screenshots/chromium/RotateRight.spec.ts/rotateRightDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayFirstImage.png b/tests/screenshots/chromium/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayFirstImage.png index e4fd6ea00..408126841 100644 Binary files a/tests/screenshots/chromium/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayFirstImage.png and b/tests/screenshots/chromium/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayFirstImage.png differ diff --git a/tests/screenshots/chromium/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayMiddleImage.png b/tests/screenshots/chromium/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayMiddleImage.png index 1bdbc77fb..58eb045d2 100644 Binary files a/tests/screenshots/chromium/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayMiddleImage.png and b/tests/screenshots/chromium/SEGDataOverlayForUnreferencedDisplaySetNoHydration.spec.ts/overlayMiddleImage.png differ diff --git a/tests/screenshots/chromium/SEGDataOverlayNoHydrationThenMPR.spec.ts/segDataOverlayNoHydrationPostMpr.png b/tests/screenshots/chromium/SEGDataOverlayNoHydrationThenMPR.spec.ts/segDataOverlayNoHydrationPostMpr.png index 3c4e078c6..86f91ed84 100644 Binary files a/tests/screenshots/chromium/SEGDataOverlayNoHydrationThenMPR.spec.ts/segDataOverlayNoHydrationPostMpr.png and b/tests/screenshots/chromium/SEGDataOverlayNoHydrationThenMPR.spec.ts/segDataOverlayNoHydrationPostMpr.png differ diff --git a/tests/screenshots/chromium/SEGDataOverlayNoHydrationThenMPR.spec.ts/segDataOverlayNoHydrationPreMpr.png b/tests/screenshots/chromium/SEGDataOverlayNoHydrationThenMPR.spec.ts/segDataOverlayNoHydrationPreMpr.png index aee462ed7..3a42950e7 100644 Binary files a/tests/screenshots/chromium/SEGDataOverlayNoHydrationThenMPR.spec.ts/segDataOverlayNoHydrationPreMpr.png and b/tests/screenshots/chromium/SEGDataOverlayNoHydrationThenMPR.spec.ts/segDataOverlayNoHydrationPreMpr.png differ diff --git a/tests/screenshots/chromium/SEGDrawingToolsResizing.spec.ts/brushTool.png b/tests/screenshots/chromium/SEGDrawingToolsResizing.spec.ts/brushTool.png index 6a53ee8e1..d595c66c2 100644 Binary files a/tests/screenshots/chromium/SEGDrawingToolsResizing.spec.ts/brushTool.png and b/tests/screenshots/chromium/SEGDrawingToolsResizing.spec.ts/brushTool.png differ diff --git a/tests/screenshots/chromium/SEGDrawingToolsResizing.spec.ts/eraserTool.png b/tests/screenshots/chromium/SEGDrawingToolsResizing.spec.ts/eraserTool.png index c1b0ee2f7..f33c0c0a6 100644 Binary files a/tests/screenshots/chromium/SEGDrawingToolsResizing.spec.ts/eraserTool.png and b/tests/screenshots/chromium/SEGDrawingToolsResizing.spec.ts/eraserTool.png differ diff --git a/tests/screenshots/chromium/SEGHydration.spec.ts/segPostHydration.png b/tests/screenshots/chromium/SEGHydration.spec.ts/segPostHydration.png index f3f5dc080..229fed8cb 100644 Binary files a/tests/screenshots/chromium/SEGHydration.spec.ts/segPostHydration.png and b/tests/screenshots/chromium/SEGHydration.spec.ts/segPostHydration.png differ diff --git a/tests/screenshots/chromium/SEGHydration.spec.ts/segPreHydration.png b/tests/screenshots/chromium/SEGHydration.spec.ts/segPreHydration.png index f1bcacb23..992a0d2fb 100644 Binary files a/tests/screenshots/chromium/SEGHydration.spec.ts/segPreHydration.png and b/tests/screenshots/chromium/SEGHydration.spec.ts/segPreHydration.png differ diff --git a/tests/screenshots/chromium/SEGHydrationFrom3DFourUp.spec.ts/threeDFourUpAfterSEG.png b/tests/screenshots/chromium/SEGHydrationFrom3DFourUp.spec.ts/threeDFourUpAfterSEG.png index 5d39dd116..d052ed322 100644 Binary files a/tests/screenshots/chromium/SEGHydrationFrom3DFourUp.spec.ts/threeDFourUpAfterSEG.png and b/tests/screenshots/chromium/SEGHydrationFrom3DFourUp.spec.ts/threeDFourUpAfterSEG.png differ diff --git a/tests/screenshots/chromium/SEGHydrationFrom3DFourUp.spec.ts/threeDFourUpAfterSegHydrated.png b/tests/screenshots/chromium/SEGHydrationFrom3DFourUp.spec.ts/threeDFourUpAfterSegHydrated.png index 2b0f2c248..c355f9c50 100644 Binary files a/tests/screenshots/chromium/SEGHydrationFrom3DFourUp.spec.ts/threeDFourUpAfterSegHydrated.png and b/tests/screenshots/chromium/SEGHydrationFrom3DFourUp.spec.ts/threeDFourUpAfterSegHydrated.png differ diff --git a/tests/screenshots/chromium/SEGHydrationFrom3DFourUp.spec.ts/threeDFourUpBeforeSEG.png b/tests/screenshots/chromium/SEGHydrationFrom3DFourUp.spec.ts/threeDFourUpBeforeSEG.png index e1ec19403..e23700251 100644 Binary files a/tests/screenshots/chromium/SEGHydrationFrom3DFourUp.spec.ts/threeDFourUpBeforeSEG.png and b/tests/screenshots/chromium/SEGHydrationFrom3DFourUp.spec.ts/threeDFourUpBeforeSEG.png differ diff --git a/tests/screenshots/chromium/SEGHydrationFromMPR.spec.ts/mprAfterSEG.png b/tests/screenshots/chromium/SEGHydrationFromMPR.spec.ts/mprAfterSEG.png index 1cbd07b2d..678d23c5b 100644 Binary files a/tests/screenshots/chromium/SEGHydrationFromMPR.spec.ts/mprAfterSEG.png and b/tests/screenshots/chromium/SEGHydrationFromMPR.spec.ts/mprAfterSEG.png differ diff --git a/tests/screenshots/chromium/SEGHydrationFromMPR.spec.ts/mprAfterSegHydrated.png b/tests/screenshots/chromium/SEGHydrationFromMPR.spec.ts/mprAfterSegHydrated.png index 03e0e1d0a..dc25bf722 100644 Binary files a/tests/screenshots/chromium/SEGHydrationFromMPR.spec.ts/mprAfterSegHydrated.png and b/tests/screenshots/chromium/SEGHydrationFromMPR.spec.ts/mprAfterSegHydrated.png differ diff --git a/tests/screenshots/chromium/SEGHydrationFromMPR.spec.ts/mprAfterSegHydratedAfterLayoutChange.png b/tests/screenshots/chromium/SEGHydrationFromMPR.spec.ts/mprAfterSegHydratedAfterLayoutChange.png index 64db9256c..70217e997 100644 Binary files a/tests/screenshots/chromium/SEGHydrationFromMPR.spec.ts/mprAfterSegHydratedAfterLayoutChange.png and b/tests/screenshots/chromium/SEGHydrationFromMPR.spec.ts/mprAfterSegHydratedAfterLayoutChange.png differ diff --git a/tests/screenshots/chromium/SEGHydrationFromMPR.spec.ts/mprBeforeSEG.png b/tests/screenshots/chromium/SEGHydrationFromMPR.spec.ts/mprBeforeSEG.png index 9539fe7a9..73d4d7fd2 100644 Binary files a/tests/screenshots/chromium/SEGHydrationFromMPR.spec.ts/mprBeforeSEG.png and b/tests/screenshots/chromium/SEGHydrationFromMPR.spec.ts/mprBeforeSEG.png differ diff --git a/tests/screenshots/chromium/SEGHydrationThenMPR.spec.ts/segPostHydration.png b/tests/screenshots/chromium/SEGHydrationThenMPR.spec.ts/segPostHydration.png index e74aebe38..bb380f785 100644 Binary files a/tests/screenshots/chromium/SEGHydrationThenMPR.spec.ts/segPostHydration.png and b/tests/screenshots/chromium/SEGHydrationThenMPR.spec.ts/segPostHydration.png differ diff --git a/tests/screenshots/chromium/SEGHydrationThenMPR.spec.ts/segPostHydrationMPRAxialPrimary.png b/tests/screenshots/chromium/SEGHydrationThenMPR.spec.ts/segPostHydrationMPRAxialPrimary.png index 6f1f19522..c95c457ff 100644 Binary files a/tests/screenshots/chromium/SEGHydrationThenMPR.spec.ts/segPostHydrationMPRAxialPrimary.png and b/tests/screenshots/chromium/SEGHydrationThenMPR.spec.ts/segPostHydrationMPRAxialPrimary.png differ diff --git a/tests/screenshots/chromium/SEGNoHydrationThenMPR.spec.ts/segNoHydrationPostMpr.png b/tests/screenshots/chromium/SEGNoHydrationThenMPR.spec.ts/segNoHydrationPostMpr.png index d8aeb9b53..e87d540ec 100644 Binary files a/tests/screenshots/chromium/SEGNoHydrationThenMPR.spec.ts/segNoHydrationPostMpr.png and b/tests/screenshots/chromium/SEGNoHydrationThenMPR.spec.ts/segNoHydrationPostMpr.png differ diff --git a/tests/screenshots/chromium/SEGNoHydrationThenMPR.spec.ts/segNoHydrationPreMpr.png b/tests/screenshots/chromium/SEGNoHydrationThenMPR.spec.ts/segNoHydrationPreMpr.png index 40009b658..8a6f854c2 100644 Binary files a/tests/screenshots/chromium/SEGNoHydrationThenMPR.spec.ts/segNoHydrationPreMpr.png and b/tests/screenshots/chromium/SEGNoHydrationThenMPR.spec.ts/segNoHydrationPreMpr.png differ diff --git a/tests/screenshots/chromium/SRHydration.spec.ts/srJumpToMeasurement.png b/tests/screenshots/chromium/SRHydration.spec.ts/srJumpToMeasurement.png index d2a799c99..8a99e37f7 100644 Binary files a/tests/screenshots/chromium/SRHydration.spec.ts/srJumpToMeasurement.png and b/tests/screenshots/chromium/SRHydration.spec.ts/srJumpToMeasurement.png differ diff --git a/tests/screenshots/chromium/SRHydration.spec.ts/srPostHydration.png b/tests/screenshots/chromium/SRHydration.spec.ts/srPostHydration.png index eb7799c81..7441565a5 100644 Binary files a/tests/screenshots/chromium/SRHydration.spec.ts/srPostHydration.png and b/tests/screenshots/chromium/SRHydration.spec.ts/srPostHydration.png differ diff --git a/tests/screenshots/chromium/SRHydration.spec.ts/srPreHydration.png b/tests/screenshots/chromium/SRHydration.spec.ts/srPreHydration.png index f825856b7..6b4ea8bf1 100644 Binary files a/tests/screenshots/chromium/SRHydration.spec.ts/srPreHydration.png and b/tests/screenshots/chromium/SRHydration.spec.ts/srPreHydration.png differ diff --git a/tests/screenshots/chromium/Scoord3dProbe.spec.ts/scoord3dProbeDisplayedCorrectly.png b/tests/screenshots/chromium/Scoord3dProbe.spec.ts/scoord3dProbeDisplayedCorrectly.png index 97459321d..4944ffe93 100644 Binary files a/tests/screenshots/chromium/Scoord3dProbe.spec.ts/scoord3dProbeDisplayedCorrectly.png and b/tests/screenshots/chromium/Scoord3dProbe.spec.ts/scoord3dProbeDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/Scoord3dProbe.spec.ts/scoord3dProbeJumpToMeasurement.png b/tests/screenshots/chromium/Scoord3dProbe.spec.ts/scoord3dProbeJumpToMeasurement.png index da1b7fbfe..90fad7e72 100644 Binary files a/tests/screenshots/chromium/Scoord3dProbe.spec.ts/scoord3dProbeJumpToMeasurement.png and b/tests/screenshots/chromium/Scoord3dProbe.spec.ts/scoord3dProbeJumpToMeasurement.png differ diff --git a/tests/screenshots/chromium/Scoord3dProbe.spec.ts/scoord3dProbePostHydration.png b/tests/screenshots/chromium/Scoord3dProbe.spec.ts/scoord3dProbePostHydration.png index 1af2482ac..7923ee718 100644 Binary files a/tests/screenshots/chromium/Scoord3dProbe.spec.ts/scoord3dProbePostHydration.png and b/tests/screenshots/chromium/Scoord3dProbe.spec.ts/scoord3dProbePostHydration.png differ diff --git a/tests/screenshots/chromium/Scoord3dProbe.spec.ts/scoord3dProbePreHydration.png b/tests/screenshots/chromium/Scoord3dProbe.spec.ts/scoord3dProbePreHydration.png index f844ffdc8..3b84ddbd8 100644 Binary files a/tests/screenshots/chromium/Scoord3dProbe.spec.ts/scoord3dProbePreHydration.png and b/tests/screenshots/chromium/Scoord3dProbe.spec.ts/scoord3dProbePreHydration.png differ diff --git a/tests/screenshots/chromium/ScoordRectangle.spec.ts/scoordRectangleDisplayedCorrectly.png b/tests/screenshots/chromium/ScoordRectangle.spec.ts/scoordRectangleDisplayedCorrectly.png index a6e467034..ab0ce4e26 100644 Binary files a/tests/screenshots/chromium/ScoordRectangle.spec.ts/scoordRectangleDisplayedCorrectly.png and b/tests/screenshots/chromium/ScoordRectangle.spec.ts/scoordRectangleDisplayedCorrectly.png differ diff --git a/tests/screenshots/chromium/ScoordRectangle.spec.ts/scoordRectangleJumpToMeasurement.png b/tests/screenshots/chromium/ScoordRectangle.spec.ts/scoordRectangleJumpToMeasurement.png index bbe9ec490..9ef099444 100644 Binary files a/tests/screenshots/chromium/ScoordRectangle.spec.ts/scoordRectangleJumpToMeasurement.png and b/tests/screenshots/chromium/ScoordRectangle.spec.ts/scoordRectangleJumpToMeasurement.png differ diff --git a/tests/screenshots/chromium/ScoordRectangle.spec.ts/scoordRectanglePostHydration.png b/tests/screenshots/chromium/ScoordRectangle.spec.ts/scoordRectanglePostHydration.png index b6863fbd0..fb8a8c459 100644 Binary files a/tests/screenshots/chromium/ScoordRectangle.spec.ts/scoordRectanglePostHydration.png and b/tests/screenshots/chromium/ScoordRectangle.spec.ts/scoordRectanglePostHydration.png differ diff --git a/tests/screenshots/chromium/ScoordRectangle.spec.ts/scoordRectanglePreHydration.png b/tests/screenshots/chromium/ScoordRectangle.spec.ts/scoordRectanglePreHydration.png index 3a767eb6b..de648f15f 100644 Binary files a/tests/screenshots/chromium/ScoordRectangle.spec.ts/scoordRectanglePreHydration.png and b/tests/screenshots/chromium/ScoordRectangle.spec.ts/scoordRectanglePreHydration.png differ diff --git a/tests/screenshots/chromium/Spline.spec.ts/splineDisplayedCorrectly.png b/tests/screenshots/chromium/Spline.spec.ts/splineDisplayedCorrectly.png index e48ff7e11..dcfd5920f 100644 Binary files a/tests/screenshots/chromium/Spline.spec.ts/splineDisplayedCorrectly.png and b/tests/screenshots/chromium/Spline.spec.ts/splineDisplayedCorrectly.png differ diff --git a/tests/utils/getAnnotationStats.ts b/tests/utils/getAnnotationStats.ts new file mode 100644 index 000000000..ad948989b --- /dev/null +++ b/tests/utils/getAnnotationStats.ts @@ -0,0 +1,64 @@ +type TargetStats = Record; + +type AnnotationStats = { + annotationUID: string; + toolName: string; + referencedImageId?: string; + FrameOfReferenceUID?: string; + cachedStats: Record; + targetIds: string[]; + firstTargetStats: TargetStats | undefined; +}; + +type Options = { + toolName?: string | string[]; + attempts?: number; + intervalMs?: number; +}; + +const getAnnotationStats = async (page, options: Options = {}): Promise => { + const { toolName, attempts = 20, intervalMs = 500 } = options; + + const toolNames = + toolName === undefined ? undefined : Array.isArray(toolName) ? toolName : [toolName]; + + for (let i = 0; i < attempts; i++) { + const results: AnnotationStats[] = await page.evaluate( + ({ toolNames }) => { + const cornerstoneTools = (window as any).cornerstoneTools; + const all = cornerstoneTools?.annotation?.state?.getAllAnnotations?.() ?? []; + + return all + .filter(a => !toolNames || toolNames.includes(a?.metadata?.toolName)) + .map(a => { + const cachedStats = a?.data?.cachedStats ?? {}; + const targetIds = Object.keys(cachedStats); + return { + annotationUID: a.annotationUID, + toolName: a.metadata?.toolName, + referencedImageId: a.metadata?.referencedImageId, + FrameOfReferenceUID: a.metadata?.FrameOfReferenceUID, + cachedStats, + targetIds, + firstTargetStats: targetIds.length ? cachedStats[targetIds[0]] : undefined, + }; + }); + }, + { toolNames } + ); + + const populated = results.filter(r => r.targetIds.length > 0); + if (populated.length > 0) { + return populated; + } + + await new Promise(resolve => setTimeout(resolve, intervalMs)); + } + + throw new Error( + `No annotations${toolNames ? ` for tool(s) ${toolNames.join(',')}` : ''} with populated cachedStats found` + ); +}; + +export { getAnnotationStats }; +export type { AnnotationStats, TargetStats }; diff --git a/tests/utils/index.ts b/tests/utils/index.ts index fe37bcb32..87221c371 100644 --- a/tests/utils/index.ts +++ b/tests/utils/index.ts @@ -11,11 +11,15 @@ import { simulateNormalizedClickOnElement, simulateNormalizedClicksOnElement, } from './simulateClicksOnElement'; -import { simulateNormalizedDragOnElement } from './simulateDragOnElement'; +import { + simulateNormalizedDragOnElement, + simulateNormalizedPathDragOnElement, +} from './simulateDragOnElement'; import { reduce3DViewportSize } from './reduce3DviewportSize'; import { getMousePosition, initializeMousePositionTracker } from './mouseUtils'; import { getSUV } from './getSUV'; import { getTMTVModalityUnit } from './getTMTVModalityUnit'; +import { getAnnotationStats } from './getAnnotationStats'; import { clearAllAnnotations } from './clearAllAnnotations'; import { scrollVolumeViewport } from './scrollVolumeViewport'; import { attemptAction } from './attemptAction'; @@ -41,11 +45,13 @@ export { simulateNormalizedClickOnElement, simulateNormalizedClicksOnElement, simulateNormalizedDragOnElement, + simulateNormalizedPathDragOnElement, reduce3DViewportSize, getMousePosition, initializeMousePositionTracker, getSUV, getTMTVModalityUnit, + getAnnotationStats, clearAllAnnotations, scrollVolumeViewport, attemptAction, diff --git a/tests/utils/screenShotPaths.ts b/tests/utils/screenShotPaths.ts index 65f209550..bdab7e700 100644 --- a/tests/utils/screenShotPaths.ts +++ b/tests/utils/screenShotPaths.ts @@ -186,13 +186,6 @@ const screenShotPaths = { secondLoadPostHydration: 'secondLoadPostHydration.png', viewportAfterSecondDelete: 'viewportAfterSecondDelete.png', }, - crosshairs: { - crosshairsRendered: 'crosshairsRendered.png', - crosshairsRotated: 'crosshairsRotated.png', - crosshairsSlabThickness: 'crosshairsSlabThickness.png', - crosshairsResetToolbar: 'crosshairsResetToolbar.png', - crosshairsNewDisplayset: 'crosshairsNewDisplayset.png', - }, tmtvRendering: { tmtvDisplayedCorrectly: 'tmtvDisplayedCorrectly.png', }, diff --git a/tests/utils/simulateDragOnElement.ts b/tests/utils/simulateDragOnElement.ts index ac67e2336..70a472dd2 100644 --- a/tests/utils/simulateDragOnElement.ts +++ b/tests/utils/simulateDragOnElement.ts @@ -1,14 +1,80 @@ import { Locator } from 'playwright'; /** - * Simulates a drag operation on an element using normalized coordinates. + * Simulates a continuous drag along a multi-point path on an element, using + * coordinates normalized to the element's bounding box. + * + * mousedown fires at path[0]; the cursor smooth-moves through every subsequent + * point in one stroke; mouseup fires at path[last] (unless mouseUp is false). * * @param locator - The locator to drag on. - * @param start - The start point with x and y coordinates, normalized to the element's bounding box. - * @param end - The end point with x and y coordinates, normalized to the element's bounding box. - * @param button - The mouse button to use for the drag (default is 'left'). - * @param delay - Milliseconds between steps (default is 50). - * @param steps - Number of intermediate positions for smooth dragging (default is 5). + * @param path - Points (normalized to the element's bbox) describing the stroke. + * @param button - The mouse button to use for the drag (default 'left'). + * @param delay - Milliseconds between intermediate moves (default 50). + * @param steps - Number of intermediate positions per segment (default 10). + * @param mouseUp - Whether to release the button at path[last] (default true). + */ +export async function simulateNormalizedPathDragOnElement({ + locator, + path, + button = 'left', + delay = 50, + steps = 10, + mouseUp = true, +}: { + locator: Locator; + path: { x: number; y: number }[]; + button?: 'left' | 'right' | 'middle'; + delay?: number; + steps?: number; + mouseUp?: boolean; +}) { + if (path.length < 2) { + throw new Error('Path must contain at least 2 points'); + } + + const bBox = await locator.boundingBox(); + if (!bBox) { + throw new Error('Element bounding box not found'); + } + + const page = locator.page(); + const absPath = path.map(p => ({ + x: bBox.x + p.x * bBox.width, + y: bBox.y + p.y * bBox.height, + })); + + await page.mouse.move(absPath[0].x, absPath[0].y); + await page.mouse.down({ button }); + + for (let segIdx = 1; segIdx < absPath.length; segIdx++) { + const from = absPath[segIdx - 1]; + const to = absPath[segIdx]; + const deltaX = (to.x - from.x) / steps; + const deltaY = (to.y - from.y) / steps; + for (let i = 1; i <= steps; i++) { + if (delay > 0) { + await page.waitForTimeout(delay); + } + await page.mouse.move(from.x + deltaX * i, from.y + deltaY * i); + } + } + + if (mouseUp) { + await page.mouse.up({ button }); + } +} + +/** + * Simulates a drag operation on an element using normalized coordinates. + * Thin wrapper over simulateNormalizedPathDragOnElement with a 2-point path. + * + * @param locator - The locator to drag on. + * @param start - The start point, normalized to the element's bounding box. + * @param end - The end point, normalized to the element's bounding box. + * @param button - The mouse button to use for the drag (default 'left'). + * @param delay - Milliseconds between steps (default 50). + * @param steps - Number of intermediate positions for smooth dragging (default 10). */ export async function simulateNormalizedDragOnElement({ locator, @@ -27,45 +93,12 @@ export async function simulateNormalizedDragOnElement({ steps?: number; mouseUp?: boolean; }) { - const bBox = await locator.boundingBox(); - if (!bBox) { - throw new Error('Element bounding box not found'); - } - - const startPosition = { - x: bBox.x + start.x * bBox.width, - y: bBox.y + start.y * bBox.height, - }; - const endPosition = { - x: bBox.x + end.x * bBox.width, - y: bBox.y + end.y * bBox.height, - }; - - // Get the page from the locator context - const page = locator.page(); - - await page.mouse.move(startPosition.x, startPosition.y); - - // Start drag - await page.mouse.down({ button }); - - // Calculate intermediate positions for smooth dragging - const deltaX = (endPosition.x - startPosition.x) / steps; - const deltaY = (endPosition.y - startPosition.y) / steps; - - // Move through intermediate positions - for (let i = 1; i <= steps; i++) { - const currentX = startPosition.x + deltaX * i; - const currentY = startPosition.y + deltaY * i; - // Add delay if specified - if (delay > 0) { - await page.waitForTimeout(delay); - } - await page.mouse.move(currentX, currentY); - } - - // End drag - if (mouseUp) { - await page.mouse.up({ button }); - } + await simulateNormalizedPathDragOnElement({ + locator, + path: [start, end], + button, + delay, + steps, + mouseUp, + }); } diff --git a/yarn.lock b/yarn.lock index 954f58bed..fe06486d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -42,7 +42,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.5.tgz#7d0658ec1a8420fc866d1df1b03bea0e79934c82" integrity sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg== -"@babel/compat-data@^7.27.7", "@babel/compat-data@^7.28.0": +"@babel/compat-data@^7.27.7": version "7.28.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.0.tgz#9fc6fd58c2a6a15243cd13983224968392070790" integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== @@ -761,15 +761,6 @@ "@babel/helper-remap-async-to-generator" "^7.27.1" "@babel/traverse" "^7.27.1" -"@babel/plugin-transform-async-generator-functions@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz#1276e6c7285ab2cd1eccb0bc7356b7a69ff842c2" - integrity sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-remap-async-to-generator" "^7.27.1" - "@babel/traverse" "^7.28.0" - "@babel/plugin-transform-async-generator-functions@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz#63ed829820298f0bf143d5a4a68fb8c06ffd742f" @@ -811,13 +802,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-block-scoping@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz#e7c50cbacc18034f210b93defa89638666099451" - integrity sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-transform-block-scoping@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz#e1ef5633448c24e76346125c2534eeb359699a99" @@ -869,18 +853,6 @@ "@babel/traverse" "^7.27.1" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz#12fa46cffc32a6e084011b650539e880add8a0f8" - integrity sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-globals" "^7.28.0" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" - "@babel/traverse" "^7.28.0" - "@babel/plugin-transform-classes@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz#8f6fb79ba3703978e701ce2a97e373aae7dda4b7" @@ -978,14 +950,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-explicit-resource-management@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz#45be6211b778dbf4b9d54c4e8a2b42fa72e09a1a" - integrity sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.28.0" - "@babel/plugin-transform-explicit-resource-management@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz#dd6788f982c8b77e86779d1d029591e39d9d8be7" @@ -1175,7 +1139,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.28.6" -"@babel/plugin-transform-object-rest-spread@7.28.0", "@babel/plugin-transform-object-rest-spread@^7.28.0": +"@babel/plugin-transform-object-rest-spread@7.28.0": version "7.28.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz#d23021857ffd7cd809f54d624299b8086402ed8d" integrity sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA== @@ -1361,13 +1325,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-regenerator@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.0.tgz#f19ca3558f7121924fc4ba6cd2afe3a5cdac89b1" - integrity sha512-LOAozRVbqxEVjSKfhGnuLoE4Kz4Oc5UJzuvFUhSsQzdCdaAQu06mG8zDv2GFSerM62nImUZ7K92vxnQcLSDlCQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-transform-regenerator@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz#dec237cec1b93330876d6da9992c4abd42c9d18b" @@ -1546,82 +1503,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.28.5" "@babel/helper-plugin-utils" "^7.28.6" -"@babel/preset-env@7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.28.0.tgz#d23a6bc17b43227d11db77081a0779c706b5569c" - integrity sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg== - dependencies: - "@babel/compat-data" "^7.28.0" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.27.1" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.27.1" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions" "^7.27.1" - "@babel/plugin-syntax-import-attributes" "^7.27.1" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.27.1" - "@babel/plugin-transform-async-generator-functions" "^7.28.0" - "@babel/plugin-transform-async-to-generator" "^7.27.1" - "@babel/plugin-transform-block-scoped-functions" "^7.27.1" - "@babel/plugin-transform-block-scoping" "^7.28.0" - "@babel/plugin-transform-class-properties" "^7.27.1" - "@babel/plugin-transform-class-static-block" "^7.27.1" - "@babel/plugin-transform-classes" "^7.28.0" - "@babel/plugin-transform-computed-properties" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.28.0" - "@babel/plugin-transform-dotall-regex" "^7.27.1" - "@babel/plugin-transform-duplicate-keys" "^7.27.1" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.27.1" - "@babel/plugin-transform-dynamic-import" "^7.27.1" - "@babel/plugin-transform-explicit-resource-management" "^7.28.0" - "@babel/plugin-transform-exponentiation-operator" "^7.27.1" - "@babel/plugin-transform-export-namespace-from" "^7.27.1" - "@babel/plugin-transform-for-of" "^7.27.1" - "@babel/plugin-transform-function-name" "^7.27.1" - "@babel/plugin-transform-json-strings" "^7.27.1" - "@babel/plugin-transform-literals" "^7.27.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.27.1" - "@babel/plugin-transform-member-expression-literals" "^7.27.1" - "@babel/plugin-transform-modules-amd" "^7.27.1" - "@babel/plugin-transform-modules-commonjs" "^7.27.1" - "@babel/plugin-transform-modules-systemjs" "^7.27.1" - "@babel/plugin-transform-modules-umd" "^7.27.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.27.1" - "@babel/plugin-transform-new-target" "^7.27.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.27.1" - "@babel/plugin-transform-numeric-separator" "^7.27.1" - "@babel/plugin-transform-object-rest-spread" "^7.28.0" - "@babel/plugin-transform-object-super" "^7.27.1" - "@babel/plugin-transform-optional-catch-binding" "^7.27.1" - "@babel/plugin-transform-optional-chaining" "^7.27.1" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/plugin-transform-private-methods" "^7.27.1" - "@babel/plugin-transform-private-property-in-object" "^7.27.1" - "@babel/plugin-transform-property-literals" "^7.27.1" - "@babel/plugin-transform-regenerator" "^7.28.0" - "@babel/plugin-transform-regexp-modifiers" "^7.27.1" - "@babel/plugin-transform-reserved-words" "^7.27.1" - "@babel/plugin-transform-shorthand-properties" "^7.27.1" - "@babel/plugin-transform-spread" "^7.27.1" - "@babel/plugin-transform-sticky-regex" "^7.27.1" - "@babel/plugin-transform-template-literals" "^7.27.1" - "@babel/plugin-transform-typeof-symbol" "^7.27.1" - "@babel/plugin-transform-unicode-escapes" "^7.27.1" - "@babel/plugin-transform-unicode-property-regex" "^7.27.1" - "@babel/plugin-transform-unicode-regex" "^7.27.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.27.1" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.14" - babel-plugin-polyfill-corejs3 "^0.13.0" - babel-plugin-polyfill-regenerator "^0.6.5" - core-js-compat "^3.43.0" - semver "^6.3.1" - "@babel/preset-env@7.29.5": version "7.29.5" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.29.5.tgz#c48b7ed94582c8b685e21b8b42de8633ec289268" @@ -2026,10 +1907,10 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cornerstonejs/adapters@4.22.3": - version "4.22.3" - resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-4.22.3.tgz#8d2d9246706fa7b9f72e2472b9a2fc9419d700ed" - integrity sha512-58TaTUl7AmLARnKApfz9c5IWzIaPPewH8sjD0BxKu5PeVHSRSlKX7jH4pv1akapIbDqXBEW6unb45kLmm6u7dg== +"@cornerstonejs/adapters@4.22.8": + version "4.22.8" + resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-4.22.8.tgz#31d12e82fbf108adebb6a9dea8690e7423b68f32" + integrity sha512-WUphdrsQVGqUN5KPt75FN4a7/tL49k41eCLa5fW8FmhNoi/NkmCPlr91z0ixf07P2dMtzv/eSmJ3IZI6W+FIrw== dependencies: "@babel/runtime-corejs2" "7.26.10" buffer "6.0.3" @@ -2037,10 +1918,10 @@ gl-matrix "3.4.3" ndarray "1.0.19" -"@cornerstonejs/ai@4.22.3": - version "4.22.3" - resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-4.22.3.tgz#a8f7d8ae05cef79dd9d8bafbfcc789e2f5dbc893" - integrity sha512-NhRcQISjcDCp7rWCK9hGmCgsS36XKyT4AsCBgXuG7iU3ghI77j5kt9sUdqi0M4lRYLYZ1XMrFSDjNDCwFP+eYg== +"@cornerstonejs/ai@4.22.8": + version "4.22.8" + resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-4.22.8.tgz#0c621965f74c825ec80c08da63a436bb3da414af" + integrity sha512-rN/7nicjphDsOWqPGTzbq/BTJD8dy2r7XW4P46FnyEPRmO8KVisTOvHaEEu3EklMVqvodbRzigW73kO1mh7eNw== dependencies: "@babel/runtime-corejs2" "7.26.10" buffer "6.0.3" @@ -2076,20 +1957,20 @@ resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.7.tgz#784394d05d8cf735640e9c3baa206535ee8e0376" integrity sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w== -"@cornerstonejs/core@4.22.3": - version "4.22.3" - resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-4.22.3.tgz#0532a7ffba163a8738c289d044ce04bc950479e3" - integrity sha512-oxLcg24ER3HHSAEsz3iG7+cb2oHnVSzt7H8EeRtK69e6Ztjl6XkEmXeAbbJypm2QYIkPYb3oJb6zWeYOz1NtYw== +"@cornerstonejs/core@4.22.8": + version "4.22.8" + resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-4.22.8.tgz#5ff9c8106c37e5009941c148338596eb744943d7" + integrity sha512-GOv8sTwV3hqhZpAYSFH/yhNj15TgcWh364ndIegT29g87FURHu8Ql9cF6irOamAuehJ3YKfbPxUZzqiXtfyPDg== dependencies: "@kitware/vtk.js" "34.15.1" comlink "4.4.2" gl-matrix "3.4.3" loglevel "1.9.2" -"@cornerstonejs/dicom-image-loader@4.22.3": - version "4.22.3" - resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-4.22.3.tgz#f3d91191cb27d840a9aa49b6c78d0b1f3634acc0" - integrity sha512-TVPSc3PUvy2I6+ZnWX8B2uqJZ5onUd/+e+m/BfeEdZC51GMhC4VfTmqOwOjWDNDyO35ZA9j1mqk8iIJzDpqoeA== +"@cornerstonejs/dicom-image-loader@4.22.8": + version "4.22.8" + resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-4.22.8.tgz#3b70a713a96293a408a8d5c43358ada68aaea692" + integrity sha512-3Bb3xJiO9ddDCeT/wHL8R0G1t8W4+aYY8N9YGV+eMUI1WTkRES3WH3N7U8EtjLYXKqfc15NIEe78Otf2qS+CgQ== dependencies: "@cornerstonejs/codec-charls" "1.2.3" "@cornerstonejs/codec-libjpeg-turbo-8bit" "1.2.2" @@ -2101,25 +1982,25 @@ pako "2.1.0" uuid "9.0.1" -"@cornerstonejs/labelmap-interpolation@4.22.3": - version "4.22.3" - resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-4.22.3.tgz#7c01448cb0c02f47ca7e95db836153c0169d0200" - integrity sha512-ngschi2EKr+47LWbbTiu6tt3aw4e7yp0mVCDXwJm1Z2eyugemiiAQvOT77EKSBZ//L2fAZR3Edr+qJFzPa5KUw== +"@cornerstonejs/labelmap-interpolation@4.22.8": + version "4.22.8" + resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-4.22.8.tgz#f2460283325cde38f13e57039c12e6eba5aca6db" + integrity sha512-GKr123lPCr6Tl3GDOFMjm0m+gexDvAJjYYGshCcSx6/pT6PT30ALRXi0pXXdcGr1kbk9SKEMM1uzxFLXJs6uIQ== dependencies: "@itk-wasm/morphological-contour-interpolation" "1.1.0" itk-wasm "1.0.0-b.165" -"@cornerstonejs/polymorphic-segmentation@4.22.3": - version "4.22.3" - resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-4.22.3.tgz#41f3eb0848a03de4ec4a4034be7f2989c543b94d" - integrity sha512-JNmtLbuwY8de3uwFf1YqySp5wt2BCT6kpg9gcoDNMmNxGDo0uT5yph1Muh+24sG7WDaoRwyzAEvG11h9NHgoqw== +"@cornerstonejs/polymorphic-segmentation@4.22.8": + version "4.22.8" + resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-4.22.8.tgz#4d5930458abf3921929bf2db9f622fb5bbce437f" + integrity sha512-cLliz/E4BjKKw7rnyYvDprc8BK011LwaCwvWv6h9iUGWm2j72NhsRLf2jdcpEav3wyUJtWDHlvXO3QBzlHHW0A== dependencies: "@icr/polyseg-wasm" "0.4.0" -"@cornerstonejs/tools@4.22.3": - version "4.22.3" - resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-4.22.3.tgz#45e2f7bb60c29fc545da525765f8708dac5202a6" - integrity sha512-2XQmUesRWiqWTh3xGnLsQ6qqKI55vSVV4UqGXiPxnMcf6azDfEhcJO8JJCH1VXaDa89jxLBdZUDehUnb0UsIxA== +"@cornerstonejs/tools@4.22.8": + version "4.22.8" + resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-4.22.8.tgz#e34c5359a3dee9a809361c7d3ee335d8a9e51e1a" + integrity sha512-vDTMIOJ+oZJyPixg/iQbYNM9XFz2Ud+VGMAf6mAP3LhpH7ofCh0Phkf9BtJiCjKT+IQqloFSvWjy6aoLd8KNJA== dependencies: "@types/offscreencanvas" "2019.7.3" comlink "4.4.2"