diff --git a/extensions/cornerstone-dicom-seg/package.json b/extensions/cornerstone-dicom-seg/package.json index caec2b9eb..b70fac1f3 100644 --- a/extensions/cornerstone-dicom-seg/package.json +++ b/extensions/cornerstone-dicom-seg/package.json @@ -46,8 +46,8 @@ }, "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^1.74.6", - "@cornerstonejs/core": "^1.74.6", + "@cornerstonejs/adapters": "^1.74.7", + "@cornerstonejs/core": "^1.74.7", "@kitware/vtk.js": "30.4.1", "react-color": "^2.19.3" } diff --git a/extensions/cornerstone-dicom-sr/package.json b/extensions/cornerstone-dicom-sr/package.json index 5f3571387..c1454051d 100644 --- a/extensions/cornerstone-dicom-sr/package.json +++ b/extensions/cornerstone-dicom-sr/package.json @@ -46,9 +46,9 @@ }, "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^1.74.6", - "@cornerstonejs/core": "^1.74.6", - "@cornerstonejs/tools": "^1.74.6", + "@cornerstonejs/adapters": "^1.74.7", + "@cornerstonejs/core": "^1.74.7", + "@cornerstonejs/tools": "^1.74.7", "classnames": "^2.3.2" } } diff --git a/extensions/cornerstone-dynamic-volume/package.json b/extensions/cornerstone-dynamic-volume/package.json index 48ce0e6f9..b09b2dde3 100644 --- a/extensions/cornerstone-dynamic-volume/package.json +++ b/extensions/cornerstone-dynamic-volume/package.json @@ -42,9 +42,9 @@ }, "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/core": "^1.74.6", - "@cornerstonejs/streaming-image-volume-loader": "^1.74.6", - "@cornerstonejs/tools": "^1.74.6", + "@cornerstonejs/core": "^1.74.7", + "@cornerstonejs/streaming-image-volume-loader": "^1.74.7", + "@cornerstonejs/tools": "^1.74.7", "classnames": "^2.3.2" } } diff --git a/extensions/cornerstone/package.json b/extensions/cornerstone/package.json index e482f2878..eeed1e716 100644 --- a/extensions/cornerstone/package.json +++ b/extensions/cornerstone/package.json @@ -38,7 +38,7 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.2", - "@cornerstonejs/dicom-image-loader": "^1.74.6", + "@cornerstonejs/dicom-image-loader": "^1.74.7", "@icr/polyseg-wasm": "^0.4.0", "@ohif/core": "3.8.0", "@ohif/ui": "3.8.0", @@ -55,10 +55,10 @@ }, "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^1.74.6", - "@cornerstonejs/core": "^1.74.6", - "@cornerstonejs/streaming-image-volume-loader": "^1.74.6", - "@cornerstonejs/tools": "^1.74.6", + "@cornerstonejs/adapters": "^1.74.7", + "@cornerstonejs/core": "^1.74.7", + "@cornerstonejs/streaming-image-volume-loader": "^1.74.7", + "@cornerstonejs/tools": "^1.74.7", "@icr/polyseg-wasm": "^0.4.0", "@kitware/vtk.js": "30.4.1", "html2canvas": "^1.4.1", diff --git a/extensions/default/src/Toolbar/ToolbarLayoutSelector.tsx b/extensions/default/src/Toolbar/ToolbarLayoutSelector.tsx index 771b7d6b9..b2ed1c96f 100644 --- a/extensions/default/src/Toolbar/ToolbarLayoutSelector.tsx +++ b/extensions/default/src/Toolbar/ToolbarLayoutSelector.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState, useCallback } from 'react'; +import React, { useEffect, useState, useCallback, useRef } from 'react'; import PropTypes from 'prop-types'; import { LayoutSelector as OHIFLayoutSelector, ToolbarButton, LayoutPreset } from '@ohif/ui'; @@ -134,22 +134,30 @@ function LayoutSelector({ ...rest }: withAppTypes) { const [isOpen, setIsOpen] = useState(false); + const dropdownRef = useRef(null); const { customizationService } = servicesManager.services; const commonPresets = customizationService.get('commonPresets') || defaultCommonPresets; const advancedPresets = customizationService.get('advancedPresets') || generateAdvancedPresets({ servicesManager }); - const closeOnOutsideClick = () => { - if (isOpen) { + const closeOnOutsideClick = event => { + if (isOpen && dropdownRef.current) { setIsOpen(false); } }; useEffect(() => { - window.addEventListener('click', closeOnOutsideClick); + if (!isOpen) { + return; + } + + setTimeout(() => { + window.addEventListener('click', closeOnOutsideClick); + }, 0); return () => { window.removeEventListener('click', closeOnOutsideClick); + dropdownRef.current = null; }; }, [isOpen]); @@ -169,7 +177,10 @@ function LayoutSelector({ disableToolTip={tooltipDisabled} dropdownContent={ DropdownContent !== null && ( -
+
Common
diff --git a/extensions/measurement-tracking/package.json b/extensions/measurement-tracking/package.json index 09c66db5d..c8a1bb40f 100644 --- a/extensions/measurement-tracking/package.json +++ b/extensions/measurement-tracking/package.json @@ -32,8 +32,8 @@ "start": "yarn run dev" }, "peerDependencies": { - "@cornerstonejs/core": "^1.74.6", - "@cornerstonejs/tools": "^1.74.6", + "@cornerstonejs/core": "^1.74.7", + "@cornerstonejs/tools": "^1.74.7", "@ohif/core": "3.8.0", "@ohif/extension-cornerstone-dicom-sr": "3.8.0", "@ohif/ui": "3.8.0", diff --git a/modes/longitudinal/src/initToolGroups.js b/modes/longitudinal/src/initToolGroups.js index 983f1f56a..9acdd39bc 100644 --- a/modes/longitudinal/src/initToolGroups.js +++ b/modes/longitudinal/src/initToolGroups.js @@ -65,7 +65,12 @@ function initDefaultToolGroup( { toolName: toolNames.Magnify }, { toolName: toolNames.SegmentationDisplay }, { toolName: toolNames.CalibrationLine }, - + { + toolName: toolNames.PlanarFreehandContourSegmentation, + configuration: { + displayOnePointAsCrosshairs: true, + }, + }, { toolName: toolNames.UltrasoundDirectional }, { toolName: toolNames.PlanarFreehandROI }, { toolName: toolNames.SplineROI }, @@ -136,6 +141,12 @@ function initSRToolGroup(extensionManager, toolGroupService) { { toolName: SRToolNames.SRCircleROI }, { toolName: SRToolNames.SRPlanarFreehandROI }, { toolName: SRToolNames.SRRectangleROI }, + { + toolName: SRToolNames.SRPlanarFreehandContourSegmentation, + configuration: { + displayOnePointAsCrosshairs: true, + }, + }, ], enabled: [ { @@ -210,12 +221,23 @@ function initMPRToolGroup(extensionManager, toolGroupService, commandsManager, m { toolName: toolNames.CobbAngle }, { toolName: toolNames.PlanarFreehandROI }, { toolName: toolNames.SegmentationDisplay }, + { + toolName: toolNames.PlanarFreehandContourSegmentation, + configuration: { + displayOnePointAsCrosshairs: true, + }, + }, ], disabled: [ { toolName: toolNames.Crosshairs, configuration: { - viewportIndicators: false, + viewportIndicators: true, + viewportIndicatorsConfig: { + circleRadius: 5, + xOffset: 0.95, + yOffset: 0.05, + }, disableOnPassive: true, autoPan: { enabled: false, diff --git a/modes/preclinical-4d/src/index.tsx b/modes/preclinical-4d/src/index.tsx index 6a14b5db2..209e30fc0 100644 --- a/modes/preclinical-4d/src/index.tsx +++ b/modes/preclinical-4d/src/index.tsx @@ -55,7 +55,7 @@ function modeFactory({ modeConfiguration }) { const { toolNames, Enums } = utilityModule.exports; measurementService.clearMeasurements(); - initToolGroups({ toolNames, Enums, toolGroupService, commandsManager }); + initToolGroups({ toolNames, Enums, toolGroupService, commandsManager, servicesManager }); toolbarService.addButtons([...toolbarButtons, ...segmentationButtons]); toolbarService.createButtonSection('secondary', ['ProgressDropdown']); diff --git a/modes/preclinical-4d/src/initToolGroups.tsx b/modes/preclinical-4d/src/initToolGroups.tsx index 9a6457618..e477c7feb 100644 --- a/modes/preclinical-4d/src/initToolGroups.tsx +++ b/modes/preclinical-4d/src/initToolGroups.tsx @@ -5,7 +5,20 @@ const toolGroupIds = { CT: 'dynamic4D-ct', }; -function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager) { +const colours = { + 'viewport-0': 'rgb(200, 0, 0)', + 'viewport-1': 'rgb(200, 200, 0)', + 'viewport-2': 'rgb(0, 200, 0)', +}; + +const colorsByOrientation = { + axial: 'rgb(200, 0, 0)', + sagittal: 'rgb(200, 200, 0)', + coronal: 'rgb(0, 200, 0)', +}; + +function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager, servicesManager) { + const { cornerstoneViewportService } = servicesManager.services; const tools = { active: [ { @@ -94,12 +107,31 @@ function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager) { { toolName: toolNames.Crosshairs, configuration: { - viewportIndicators: false, + viewportIndicators: true, + viewportIndicatorsConfig: { + circleRadius: 5, + xOffset: 0.95, + yOffset: 0.05, + }, disableOnPassive: true, autoPan: { enabled: false, panSize: 10, }, + getReferenceLineColor: viewportId => { + const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId); + const viewportOptions = viewportInfo?.viewportOptions; + if (viewportOptions) { + return ( + colours[viewportOptions.id] || + colorsByOrientation[viewportOptions.orientation] || + '#0c0' + ); + } else { + console.warn('missing viewport?', viewportId); + return '#0c0'; + } + }, }, }, ], @@ -123,8 +155,8 @@ function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager) { toolGroupService.createToolGroupAndAddTools(toolGroupIds.default, tools); } -function initToolGroups({ toolNames, Enums, toolGroupService, commandsManager }) { - _initToolGroups(toolNames, Enums, toolGroupService, commandsManager); +function initToolGroups({ toolNames, Enums, toolGroupService, commandsManager, servicesManager }) { + _initToolGroups(toolNames, Enums, toolGroupService, commandsManager, servicesManager); } export { initToolGroups as default, toolGroupIds }; diff --git a/modes/segmentation/src/initToolGroups.ts b/modes/segmentation/src/initToolGroups.ts index 540edf01d..02e84d14f 100644 --- a/modes/segmentation/src/initToolGroups.ts +++ b/modes/segmentation/src/initToolGroups.ts @@ -1,3 +1,15 @@ +const colours = { + 'viewport-0': 'rgb(200, 0, 0)', + 'viewport-1': 'rgb(200, 200, 0)', + 'viewport-2': 'rgb(0, 200, 0)', +}; + +const colorsByOrientation = { + axial: 'rgb(200, 0, 0)', + sagittal: 'rgb(200, 200, 0)', + coronal: 'rgb(0, 200, 0)', +}; + function createTools(utilityModule) { const { toolNames, Enums } = utilityModule.exports; return { @@ -94,17 +106,38 @@ function initMPRToolGroup(extensionManager, toolGroupService, commandsManager) { const utilityModule = extensionManager.getModuleEntry( '@ohif/extension-cornerstone.utilityModule.tools' ); + const servicesManager = extensionManager._servicesManager; + const { cornerstoneViewportService } = servicesManager.services; const tools = createTools(utilityModule); tools.disabled.push( { toolName: utilityModule.exports.toolNames.Crosshairs, configuration: { - viewportIndicators: false, + viewportIndicators: true, + viewportIndicatorsConfig: { + circleRadius: 5, + xOffset: 0.95, + yOffset: 0.05, + }, disableOnPassive: true, autoPan: { enabled: false, panSize: 10, }, + getReferenceLineColor: viewportId => { + const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId); + const viewportOptions = viewportInfo?.viewportOptions; + if (viewportOptions) { + return ( + colours[viewportOptions.id] || + colorsByOrientation[viewportOptions.orientation] || + '#0c0' + ); + } else { + console.warn('missing viewport?', viewportId); + return '#0c0'; + } + }, }, }, { toolName: utilityModule.exports.toolNames.ReferenceLines } diff --git a/modes/tmtv/src/index.ts b/modes/tmtv/src/index.ts index 2b3753897..c9774551d 100644 --- a/modes/tmtv/src/index.ts +++ b/modes/tmtv/src/index.ts @@ -63,7 +63,7 @@ function modeFactory({ modeConfiguration }) { const { toolNames, Enums } = utilityModule.exports; // Init Default and SR ToolGroups - initToolGroups(toolNames, Enums, toolGroupService, commandsManager); + initToolGroups(toolNames, Enums, toolGroupService, commandsManager, null, servicesManager); const { unsubscribe } = toolGroupService.subscribe( toolGroupService.EVENTS.VIEWPORT_ADDED, diff --git a/modes/tmtv/src/initToolGroups.js b/modes/tmtv/src/initToolGroups.js index 0a972f289..c062fd811 100644 --- a/modes/tmtv/src/initToolGroups.js +++ b/modes/tmtv/src/initToolGroups.js @@ -6,7 +6,14 @@ export const toolGroupIds = { default: 'default', }; -function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager, modeLabelConfig) { +function _initToolGroups( + toolNames, + Enums, + toolGroupService, + commandsManager, + modeLabelConfig, + servicesManager +) { const tools = { active: [ { @@ -125,7 +132,12 @@ function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager, mo { toolName: toolNames.Crosshairs, configuration: { - viewportIndicators: false, + viewportIndicators: true, + viewportIndicatorsConfig: { + circleRadius: 5, + xOffset: 0.95, + yOffset: 0.05, + }, disableOnPassive: true, autoPan: { enabled: false, @@ -178,8 +190,22 @@ function _initToolGroups(toolNames, Enums, toolGroupService, commandsManager, mo toolGroupService.createToolGroupAndAddTools(toolGroupIds.MIP, mipTools); } -function initToolGroups(toolNames, Enums, toolGroupService, commandsManager, modeLabelConfig) { - _initToolGroups(toolNames, Enums, toolGroupService, commandsManager, modeLabelConfig); +function initToolGroups( + toolNames, + Enums, + toolGroupService, + commandsManager, + modeLabelConfig, + servicesManager +) { + _initToolGroups( + toolNames, + Enums, + toolGroupService, + commandsManager, + modeLabelConfig, + servicesManager + ); } export default initToolGroups; diff --git a/platform/app/package.json b/platform/app/package.json index 894e0b383..76fdeee4d 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.2.2", "@cornerstonejs/codec-openjph": "^2.4.5", - "@cornerstonejs/dicom-image-loader": "^1.74.6", + "@cornerstonejs/dicom-image-loader": "^1.74.7", "@emotion/serialize": "^1.1.3", "@ohif/core": "3.8.0", "@ohif/extension-cornerstone": "3.8.0", diff --git a/platform/app/public/config/default.js b/platform/app/public/config/default.js index 88f7b872e..f3c38f280 100644 --- a/platform/app/public/config/default.js +++ b/platform/app/public/config/default.js @@ -1,4 +1,5 @@ -window.config = { +/** @type {import('@ohif/core').OHIFConfig} */ +const config = { routerBasename: '/', // whiteLabeling: {}, extensions: [], @@ -232,3 +233,5 @@ window.config = { }, ], }; + +window.config = config; diff --git a/platform/core/package.json b/platform/core/package.json index 5130d41d2..5a36fce0e 100644 --- a/platform/core/package.json +++ b/platform/core/package.json @@ -37,7 +37,7 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.2", - "@cornerstonejs/dicom-image-loader": "^1.74.6", + "@cornerstonejs/dicom-image-loader": "^1.74.7", "@ohif/ui": "3.8.0", "cornerstone-math": "0.1.9", "dicom-parser": "^1.8.21" diff --git a/platform/core/src/index.ts b/platform/core/src/index.ts index d548e6e7b..465cfe2f9 100644 --- a/platform/core/src/index.ts +++ b/platform/core/src/index.ts @@ -13,7 +13,6 @@ import defaults from './defaults'; import * as Types from './types'; import * as Enums from './enums'; import { useToolbar } from './hooks/useToolbar'; - import { CineService, UIDialogService, diff --git a/yarn.lock b/yarn.lock index c8b03a61c..a7cbd040c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2086,7 +2086,7 @@ "@docusaurus/theme-search-algolia" "2.4.3" "@docusaurus/types" "2.4.3" -"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": +"@docusaurus/react-loadable@5.5.2": version "5.5.2" resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== @@ -17743,6 +17743,14 @@ react-loadable-ssr-addon-v5-slorber@^1.0.1: dependencies: "@babel/runtime" "^7.10.3" +"react-loadable@npm:@docusaurus/react-loadable@5.5.2": + version "5.5.2" + resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + react-modal@3.11.2: version "3.11.2" resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.11.2.tgz#bad911976d4add31aa30dba8a41d11e21c4ac8a4" @@ -19533,7 +19541,7 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -19551,6 +19559,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -19646,7 +19663,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -19674,6 +19691,13 @@ strip-ansi@^5.1.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.0, strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -21717,7 +21741,7 @@ worker-loader@3.0.8, worker-loader@^3.0.8: loader-utils "^2.0.0" schema-utils "^3.0.0" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -21743,6 +21767,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"