@ohif/app 3.8.0-beta.66 → 3.8.0-beta.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/{121.bundle.fda405f29003c308ce09.js → 121.bundle.a8fc45e3d88d0a8b82a8.js} +52 -75
  2. package/dist/{155.bundle.e9fdaa40010cc784f389.js → 155.bundle.7b87a2dbfaf2c36326bd.js} +7 -16
  3. package/dist/{188.bundle.67df9790c453b185fe1d.js → 188.bundle.022af4c804b855ca2f60.js} +2 -2
  4. package/dist/{638.bundle.4d7da6fe507df0000718.js → 2.bundle.962c8d8b57c4f94324b4.js} +46 -15
  5. package/dist/{295.bundle.57700cd41fd87e1521b4.js → 295.bundle.41d7b63be6a7d726b87e.js} +75 -86
  6. package/dist/{41.bundle.b7bf03502ac3e2ddca35.js → 41.bundle.ad4a012883642620e839.js} +16 -45
  7. package/dist/425.bundle.057226d5a1a2d7dcc391.js +2957 -0
  8. package/dist/425.css +2 -0
  9. package/dist/{448.bundle.0061f5280490e1a1aa88.js → 448.bundle.1d9b1b7379fba9b8e70b.js} +5 -5
  10. package/dist/{530.bundle.72d9812f117036615a38.js → 530.bundle.632dcb0d4f5266058c8b.js} +41 -67
  11. package/dist/{544.bundle.c3009e245ceb1554c70a.js → 544.bundle.df7870b43d7aa1faed39.js} +4 -4
  12. package/dist/{559.bundle.bb2c52834fb372399002.js → 559.bundle.54fea45a10d3aa002764.js} +4 -4
  13. package/dist/{889.bundle.edf546d8738c22b94be5.js → 574.bundle.3020ab733b8f07ec50a5.js} +1005 -49
  14. package/dist/{594.bundle.483843d38640164a9aca.js → 594.bundle.fad610af7dae0c2fb048.js} +4 -4
  15. package/dist/{701.bundle.285943aebfc0efe2b4f1.js → 595.bundle.dc733f6e58d41260ba40.js} +960 -61
  16. package/dist/{699.bundle.62990e46c235ab4785db.js → 699.bundle.78297d5204cdd274d097.js} +18 -25
  17. package/dist/{724.bundle.83a4176860f750353c0b.js → 724.bundle.171eb7665e96ac0ad109.js} +13 -71
  18. package/dist/{862.bundle.999931264956ced59b33.js → 862.bundle.27cb716917daad6afddc.js} +64 -83
  19. package/dist/{270.bundle.d7d6957c20f95c675b32.js → 889.bundle.43bac729645dcd445d23.js} +5 -5
  20. package/dist/{90.bundle.49b20161b4f864100085.js → 90.bundle.5e1e4b60b575b5be1369.js} +15 -25
  21. package/dist/{905.bundle.88010c612e910657883d.js → 905.bundle.a18b495f0a6769c5aff6.js} +2 -2
  22. package/dist/{907.bundle.1206d58ae62d26beaf30.js → 907.bundle.bec0deb8a4af3b4885a4.js} +2 -2
  23. package/dist/{961.bundle.b4d84dd80e4e1113de27.js → 961.bundle.2dd02c92ec591fec7924.js} +2 -2
  24. package/dist/{app.bundle.81c01fc2e11fa9b6ccb8.js → app.bundle.b36fed4fdc5235c8fd31.js} +2446 -745
  25. package/dist/app.bundle.css +6 -4
  26. package/dist/assets/images/CT-AAA.png +0 -0
  27. package/dist/assets/images/CT-AAA2.png +0 -0
  28. package/dist/assets/images/CT-Air.png +0 -0
  29. package/dist/assets/images/CT-Bone.png +0 -0
  30. package/dist/assets/images/CT-Bones.png +0 -0
  31. package/dist/assets/images/CT-Cardiac.png +0 -0
  32. package/dist/assets/images/CT-Cardiac2.png +0 -0
  33. package/dist/assets/images/CT-Cardiac3.png +0 -0
  34. package/dist/assets/images/CT-Chest-Contrast-Enhanced.png +0 -0
  35. package/dist/assets/images/CT-Chest-Vessels.png +0 -0
  36. package/dist/assets/images/CT-Coronary-Arteries-2.png +0 -0
  37. package/dist/assets/images/CT-Coronary-Arteries-3.png +0 -0
  38. package/dist/assets/images/CT-Coronary-Arteries.png +0 -0
  39. package/dist/assets/images/CT-Cropped-Volume-Bone.png +0 -0
  40. package/dist/assets/images/CT-Fat.png +0 -0
  41. package/dist/assets/images/CT-Liver-Vasculature.png +0 -0
  42. package/dist/assets/images/CT-Lung.png +0 -0
  43. package/dist/assets/images/CT-MIP.png +0 -0
  44. package/dist/assets/images/CT-Muscle.png +0 -0
  45. package/dist/assets/images/CT-Pulmonary-Arteries.png +0 -0
  46. package/dist/assets/images/CT-Soft-Tissue.png +0 -0
  47. package/dist/assets/images/DTI-FA-Brain.png +0 -0
  48. package/dist/assets/images/MR-Angio.png +0 -0
  49. package/dist/assets/images/MR-Default.png +0 -0
  50. package/dist/assets/images/MR-MIP.png +0 -0
  51. package/dist/assets/images/MR-T2-Brain.png +0 -0
  52. package/dist/assets/images/VolumeRendering.png +0 -0
  53. package/dist/index.html +1 -1
  54. package/dist/{polySeg.bundle.a97fc68de7599f9a9fdc.js → polySeg.bundle.e7b4c29fb9173e8567b8.js} +1 -1
  55. package/dist/sw.js +1 -1
  56. package/package.json +17 -17
  57. package/dist/339.bundle.526cede81f0a9bb248e6.js +0 -2591
  58. /package/dist/{164.bundle.3f877a2272b773332317.js → 164.bundle.6a75d9824ed0e87afd36.js} +0 -0
  59. /package/dist/{191.bundle.509480b6972209d2567c.js → 191.bundle.7d89c921abefd1140d50.js} +0 -0
  60. /package/dist/{638.css → 2.css} +0 -0
  61. /package/dist/{290.bundle.8b4d7dfbc7cfe418a0f1.js → 290.bundle.952de53057f98e2c5ef0.js} +0 -0
  62. /package/dist/{342.bundle.17ec05907f93624fd494.js → 342.bundle.6e49f63ea7cea4645c0a.js} +0 -0
  63. /package/dist/{504.bundle.6d203e80d4bd8a823059.js → 504.bundle.993d7e2dec36257d4ce4.js} +0 -0
  64. /package/dist/{889.css → 574.css} +0 -0
  65. /package/dist/{701.css → 595.css} +0 -0
@@ -19,10 +19,8 @@ var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
19
19
  var react = __webpack_require__(41766);
20
20
  // EXTERNAL MODULE: ../../../node_modules/react-i18next/dist/es/index.js + 15 modules
21
21
  var es = __webpack_require__(80619);
22
- // EXTERNAL MODULE: ../../core/src/index.ts + 67 modules
23
- var src = __webpack_require__(78198);
24
- // EXTERNAL MODULE: ../../ui/src/index.js + 497 modules
25
- var ui_src = __webpack_require__(58046);
22
+ // EXTERNAL MODULE: ../../ui/src/index.js + 521 modules
23
+ var src = __webpack_require__(59134);
26
24
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/utils/initSEGToolGroup.ts
27
25
  function createSEGToolGroupAndAddTools(ToolGroupService, customizationService, toolGroupId) {
28
26
  const {
@@ -66,11 +64,11 @@ function _askHydrate(uiViewportDialogService, viewportId) {
66
64
  return new Promise(function (resolve, reject) {
67
65
  const message = 'Do you want to open this Segmentation?';
68
66
  const actions = [{
69
- type: ui_src/* ButtonEnums.type */.Ny.NW.secondary,
67
+ type: src/* ButtonEnums.type */.Ny.NW.secondary,
70
68
  text: 'No',
71
69
  value: RESPONSE.CANCEL
72
70
  }, {
73
- type: ui_src/* ButtonEnums.type */.Ny.NW.primary,
71
+ type: src/* ButtonEnums.type */.Ny.NW.primary,
74
72
  text: 'Yes',
75
73
  value: RESPONSE.HYDRATE_SEG
76
74
  }];
@@ -102,37 +100,39 @@ function _getStatusComponent({
102
100
  }) {
103
101
  let ToolTipMessage = null;
104
102
  let StatusIcon = null;
105
- const {
106
- t
107
- } = (0,es/* useTranslation */.Bd)('Common');
108
- const loadStr = t('LOAD');
109
103
  switch (isHydrated) {
110
104
  case true:
111
- StatusIcon = () => /*#__PURE__*/react.createElement(ui_src/* Icon */.In, {
105
+ StatusIcon = () => /*#__PURE__*/react.createElement(src/* Icon */.In, {
112
106
  name: "status-alert"
113
107
  });
114
108
  ToolTipMessage = () => /*#__PURE__*/react.createElement("div", null, "This Segmentation is loaded in the segmentation panel");
115
109
  break;
116
110
  case false:
117
- StatusIcon = () => /*#__PURE__*/react.createElement(ui_src/* Icon */.In, {
111
+ StatusIcon = () => /*#__PURE__*/react.createElement(src/* Icon */.In, {
118
112
  className: "text-aqua-pale",
119
113
  name: "status-untracked"
120
114
  });
121
115
  ToolTipMessage = () => /*#__PURE__*/react.createElement("div", null, "Click LOAD to load segmentation.");
122
116
  }
123
- const StatusArea = () => /*#__PURE__*/react.createElement("div", {
124
- className: "flex h-6 cursor-default text-sm leading-6 text-white"
125
- }, /*#__PURE__*/react.createElement("div", {
126
- className: "bg-customgray-100 flex min-w-[45px] items-center rounded-l-xl rounded-r p-1"
127
- }, /*#__PURE__*/react.createElement(StatusIcon, null), /*#__PURE__*/react.createElement("span", {
128
- className: "ml-1"
129
- }, "SEG")), !isHydrated && /*#__PURE__*/react.createElement("div", {
130
- className: "bg-primary-main hover:bg-primary-light ml-1 cursor-pointer rounded px-1.5 hover:text-black"
131
- // Using onMouseUp here because onClick is not working when the viewport is not active and is styled with pointer-events:none
132
- ,
133
- onMouseUp: onStatusClick
134
- }, loadStr));
135
- return /*#__PURE__*/react.createElement(react.Fragment, null, ToolTipMessage && /*#__PURE__*/react.createElement(ui_src/* Tooltip */.m_, {
117
+ const StatusArea = () => {
118
+ const {
119
+ t
120
+ } = (0,es/* useTranslation */.Bd)('Common');
121
+ const loadStr = t('LOAD');
122
+ return /*#__PURE__*/react.createElement("div", {
123
+ className: "flex h-6 cursor-default text-sm leading-6 text-white"
124
+ }, /*#__PURE__*/react.createElement("div", {
125
+ className: "bg-customgray-100 flex min-w-[45px] items-center rounded-l-xl rounded-r p-1"
126
+ }, /*#__PURE__*/react.createElement(StatusIcon, null), /*#__PURE__*/react.createElement("span", {
127
+ className: "ml-1"
128
+ }, "SEG")), !isHydrated && /*#__PURE__*/react.createElement("div", {
129
+ className: "bg-primary-main hover:bg-primary-light ml-1 cursor-pointer rounded px-1.5 hover:text-black"
130
+ // Using onMouseUp here because onClick is not working when the viewport is not active and is styled with pointer-events:none
131
+ ,
132
+ onMouseUp: onStatusClick
133
+ }, loadStr));
134
+ };
135
+ return /*#__PURE__*/react.createElement(react.Fragment, null, ToolTipMessage && /*#__PURE__*/react.createElement(src/* Tooltip */.m_, {
136
136
  content: /*#__PURE__*/react.createElement(ToolTipMessage, null),
137
137
  position: "bottom-left"
138
138
  }, /*#__PURE__*/react.createElement(StatusArea, null)), !ToolTipMessage && /*#__PURE__*/react.createElement(StatusArea, null));
@@ -146,17 +146,12 @@ function _extends() { _extends = Object.assign ? Object.assign.bind() : function
146
146
 
147
147
 
148
148
 
149
-
150
- const {
151
- formatDate
152
- } = src.utils;
153
149
  const SEG_TOOLGROUP_BASE_NAME = 'SEGToolGroup';
154
150
  function OHIFCornerstoneSEGViewport(props) {
155
151
  const {
156
152
  children,
157
153
  displaySets,
158
154
  viewportOptions,
159
- viewportLabel,
160
155
  servicesManager,
161
156
  extensionManager,
162
157
  commandsManager
@@ -170,7 +165,8 @@ function OHIFCornerstoneSEGViewport(props) {
170
165
  toolGroupService,
171
166
  segmentationService,
172
167
  uiNotificationService,
173
- customizationService
168
+ customizationService,
169
+ viewportActionCornersService
174
170
  } = servicesManager.services;
175
171
  const toolGroupId = `${SEG_TOOLGROUP_BASE_NAME}-${viewportId}`;
176
172
 
@@ -179,7 +175,7 @@ function OHIFCornerstoneSEGViewport(props) {
179
175
  throw new Error('SEG viewport should only have a single display set');
180
176
  }
181
177
  const segDisplaySet = displaySets[0];
182
- const [viewportGrid, viewportGridService] = (0,ui_src/* useViewportGrid */.ih)();
178
+ const [viewportGrid, viewportGridService] = (0,src/* useViewportGrid */.ih)();
183
179
 
184
180
  // States
185
181
  const [selectedSegment, setSelectedSegment] = (0,react.useState)(1);
@@ -252,7 +248,6 @@ function OHIFCornerstoneSEGViewport(props) {
252
248
  }));
253
249
  }, [viewportId, segDisplaySet, toolGroupId]);
254
250
  const onSegmentChange = (0,react.useCallback)(direction => {
255
- direction = direction === 'left' ? -1 : 1;
256
251
  const segmentationId = segDisplaySet.displaySetInstanceUID;
257
252
  const segmentation = segmentationService.getSegmentation(segmentationId);
258
253
  const {
@@ -360,6 +355,51 @@ function OHIFCornerstoneSEGViewport(props) {
360
355
  referencedDisplaySetRef.current = null;
361
356
  };
362
357
  }, [segDisplaySet]);
358
+ const hydrateSEGDisplaySet = (0,react.useCallback)(({
359
+ segDisplaySet,
360
+ viewportId
361
+ }) => {
362
+ commandsManager.runCommand('loadSegmentationDisplaySetsForViewport', {
363
+ displaySets: [segDisplaySet],
364
+ viewportId
365
+ });
366
+ }, [commandsManager]);
367
+ const onStatusClick = (0,react.useCallback)(async () => {
368
+ // Before hydrating a SEG and make it added to all viewports in the grid
369
+ // that share the same frameOfReferenceUID, we need to store the viewport grid
370
+ // presentation state, so that we can restore it after hydrating the SEG. This is
371
+ // required if the user has changed the viewport (other viewport than SEG viewport)
372
+ // presentation state (w/l and invert) and then opens the SEG. If we don't store
373
+ // the presentation state, the viewport will be reset to the default presentation
374
+ storePresentationState();
375
+ const isHydrated = await hydrateSEGDisplaySet({
376
+ segDisplaySet,
377
+ viewportId
378
+ });
379
+ setIsHydrated(isHydrated);
380
+ }, [hydrateSEGDisplaySet, segDisplaySet, storePresentationState, viewportId]);
381
+ (0,react.useEffect)(() => {
382
+ viewportActionCornersService.setComponents([{
383
+ viewportId,
384
+ id: 'viewportStatusComponent',
385
+ component: _getStatusComponent({
386
+ isHydrated,
387
+ onStatusClick
388
+ }),
389
+ indexPriority: -100,
390
+ location: viewportActionCornersService.LOCATIONS.topLeft
391
+ }, {
392
+ viewportId,
393
+ id: 'viewportActionArrowsComponent',
394
+ component: /*#__PURE__*/react.createElement(src/* ViewportActionArrows */.$I, {
395
+ key: "actionArrows",
396
+ onArrowsClick: onSegmentChange,
397
+ className: viewportId === activeViewportId ? 'visible' : 'invisible group-hover:visible'
398
+ }),
399
+ indexPriority: 0,
400
+ location: viewportActionCornersService.LOCATIONS.topRight
401
+ }]);
402
+ }, [activeViewportId, isHydrated, onSegmentChange, onStatusClick, viewportActionCornersService, viewportId]);
363
403
 
364
404
  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
365
405
  let childrenWithProps = null;
@@ -385,60 +425,9 @@ function OHIFCornerstoneSEGViewport(props) {
385
425
  SeriesDescription,
386
426
  SpacingBetweenSlices
387
427
  } = referencedDisplaySetRef.current.metadata;
388
- const hydrateSEGDisplaySet = ({
389
- segDisplaySet,
390
- viewportId
391
- }) => {
392
- commandsManager.runCommand('loadSegmentationDisplaySetsForViewport', {
393
- displaySets: [segDisplaySet],
394
- viewportId
395
- });
396
- };
397
- const onStatusClick = async () => {
398
- // Before hydrating a SEG and make it added to all viewports in the grid
399
- // that share the same frameOfReferenceUID, we need to store the viewport grid
400
- // presentation state, so that we can restore it after hydrating the SEG. This is
401
- // required if the user has changed the viewport (other viewport than SEG viewport)
402
- // presentation state (w/l and invert) and then opens the SEG. If we don't store
403
- // the presentation state, the viewport will be reset to the default presentation
404
- storePresentationState();
405
- const isHydrated = await hydrateSEGDisplaySet({
406
- segDisplaySet,
407
- viewportId
408
- });
409
- setIsHydrated(isHydrated);
410
- };
411
- return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement(ui_src/* ViewportActionBar */.cS, {
412
- onDoubleClick: evt => {
413
- evt.stopPropagation();
414
- evt.preventDefault();
415
- },
416
- onArrowsClick: onSegmentChange,
417
- getStatusComponent: () => {
418
- return _getStatusComponent({
419
- isHydrated,
420
- onStatusClick
421
- });
422
- },
423
- studyData: {
424
- label: viewportLabel,
425
- useAltStyling: true,
426
- studyDate: formatDate(StudyDate),
427
- seriesDescription: `SEG Viewport ${SeriesDescription}`,
428
- patientInformation: {
429
- patientName: PatientName ? src/* default.utils */.Ay.utils.formatPN(PatientName.Alphabetic) : '',
430
- patientSex: PatientSex || '',
431
- patientAge: PatientAge || '',
432
- MRN: PatientID || '',
433
- thickness: SliceThickness ? src.utils.roundNumber(SliceThickness, 2) : '',
434
- thicknessUnits: SliceThickness !== undefined ? 'mm' : '',
435
- spacing: SpacingBetweenSlices !== undefined ? src.utils.roundNumber(SpacingBetweenSlices, 2) : '',
436
- scanner: ManufacturerModelName || ''
437
- }
438
- }
439
- }), /*#__PURE__*/react.createElement("div", {
428
+ return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("div", {
440
429
  className: "relative flex h-full w-full flex-row overflow-hidden"
441
- }, segIsLoading && /*#__PURE__*/react.createElement(ui_src/* LoadingIndicatorTotalPercent */.pT, {
430
+ }, segIsLoading && /*#__PURE__*/react.createElement(src/* LoadingIndicatorTotalPercent */.pT, {
442
431
  className: "h-full w-full",
443
432
  totalNumbers: processingProgress.totalSegments,
444
433
  percentComplete: processingProgress.percentComplete,
@@ -15,8 +15,8 @@ __webpack_require__.d(__webpack_exports__, {
15
15
  toolbarButtons: () => (/* reexport */ src_toolbarButtons)
16
16
  });
17
17
 
18
- // EXTERNAL MODULE: ../../core/src/index.ts + 67 modules
19
- var src = __webpack_require__(78198);
18
+ // EXTERNAL MODULE: ../../core/src/index.ts + 68 modules
19
+ var src = __webpack_require__(85073);
20
20
  // EXTERNAL MODULE: ../../../node_modules/i18next/dist/esm/i18next.js
21
21
  var i18next = __webpack_require__(92344);
22
22
  ;// CONCATENATED MODULE: ../../../modes/longitudinal/package.json
@@ -268,8 +268,6 @@ function initToolGroups(extensionManager, toolGroupService, commandsManager) {
268
268
  initVolume3DToolGroup(extensionManager, toolGroupService);
269
269
  }
270
270
  /* harmony default export */ const src_initToolGroups = (initToolGroups);
271
- // EXTERNAL MODULE: ../../ui/src/index.js + 497 modules
272
- var ui_src = __webpack_require__(58046);
273
271
  ;// CONCATENATED MODULE: ../../../modes/longitudinal/src/toolbarButtons.ts
274
272
  // TODO: torn, can either bake this here; or have to create a whole new button type
275
273
  // Only ways that you can pass in a custom React component for render :l
@@ -281,27 +279,6 @@ const {
281
279
  const {
282
280
  createButton
283
281
  } = src.ToolbarService;
284
-
285
- /**
286
- *
287
- * @param {*} preset - preset number (from above import)
288
- * @param {*} title
289
- * @param {*} subtitle
290
- */
291
- function _createWwwcPreset(preset, title, subtitle) {
292
- return {
293
- id: preset.toString(),
294
- title,
295
- subtitle,
296
- commands: [{
297
- commandName: 'setWindowLevel',
298
- commandOptions: {
299
- ...windowLevelPresets[preset]
300
- },
301
- context: 'CORNERSTONE'
302
- }]
303
- };
304
- }
305
282
  const setToolActiveToolbar = {
306
283
  commandName: 'setToolActiveToolbar',
307
284
  commandOptions: {
@@ -374,27 +351,15 @@ const toolbarButtons = [{
374
351
  evaluate: 'evaluate.cornerstoneTool'
375
352
  }
376
353
  },
377
- // Window Level + Presets...
354
+ // Window Level
378
355
  {
379
356
  id: 'WindowLevel',
380
- uiType: 'ohif.splitButton',
357
+ uiType: 'ohif.radioGroup',
381
358
  props: {
382
- groupId: 'WindowLevel',
383
- primary: createButton({
384
- id: 'WindowLevel',
385
- icon: 'tool-window-level',
386
- label: 'Window Level',
387
- tooltip: 'Window Level',
388
- commands: setToolActiveToolbar,
389
- evaluate: 'evaluate.cornerstoneTool'
390
- }),
391
- secondary: {
392
- icon: 'chevron-down',
393
- label: 'W/L Manual',
394
- tooltip: 'W/L Presets'
395
- },
396
- renderer: ui_src/* WindowLevelMenuItem */.d4,
397
- items: [_createWwwcPreset(1, 'Soft tissue', '400 / 40'), _createWwwcPreset(2, 'Lung', '1500 / -600'), _createWwwcPreset(3, 'Liver', '150 / 90'), _createWwwcPreset(4, 'Bone', '2500 / 480'), _createWwwcPreset(5, 'Brain', '80 / 40')]
359
+ icon: 'tool-window-level',
360
+ label: 'Window Level',
361
+ commands: setToolActiveToolbar,
362
+ evaluate: 'evaluate.cornerstoneTool'
398
363
  }
399
364
  },
400
365
  // Pan...
@@ -416,7 +381,10 @@ const toolbarButtons = [{
416
381
  icon: 'tool-3d-rotate',
417
382
  label: '3D Rotate',
418
383
  commands: setToolActiveToolbar,
419
- evaluate: 'evaluate.cornerstoneTool'
384
+ evaluate: {
385
+ name: 'evaluate.cornerstoneTool',
386
+ disabledText: 'Select a 3D viewport to enable this tool'
387
+ }
420
388
  }
421
389
  }, {
422
390
  id: 'Capture',
@@ -448,7 +416,10 @@ const toolbarButtons = [{
448
416
  toolGroupIds: ['mpr']
449
417
  }
450
418
  },
451
- evaluate: 'evaluate.cornerstoneTool'
419
+ evaluate: {
420
+ name: 'evaluate.cornerstoneTool',
421
+ disabledText: 'Select an MPR viewport to enable this tool'
422
+ }
452
423
  }
453
424
  }];
454
425
  /* harmony default export */ const src_toolbarButtons = (toolbarButtons);