@aics/vole-app 2.11.0

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 (135) hide show
  1. package/LICENSE +33 -0
  2. package/LICENSE.txt +26 -0
  3. package/README.md +45 -0
  4. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.eot +0 -0
  5. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.js +2337 -0
  6. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.svg +604 -0
  7. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.ttf +0 -0
  8. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.woff +0 -0
  9. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.woff2 +0 -0
  10. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.eot +0 -0
  11. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.js +2336 -0
  12. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.svg +604 -0
  13. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.ttf +0 -0
  14. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.woff +0 -0
  15. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.woff2 +0 -0
  16. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.eot +0 -0
  17. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.js +2337 -0
  18. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.svg +604 -0
  19. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.ttf +0 -0
  20. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.woff +0 -0
  21. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.woff2 +0 -0
  22. package/es/aics-image-viewer/assets/icons/axes.js +20 -0
  23. package/es/aics-image-viewer/assets/icons/boundingBox.js +18 -0
  24. package/es/aics-image-viewer/assets/icons/camera.js +15 -0
  25. package/es/aics-image-viewer/assets/icons/channels.js +15 -0
  26. package/es/aics-image-viewer/assets/icons/closePanel.js +18 -0
  27. package/es/aics-image-viewer/assets/icons/download.js +17 -0
  28. package/es/aics-image-viewer/assets/icons/dropdownArrow.js +15 -0
  29. package/es/aics-image-viewer/assets/icons/index.js +24 -0
  30. package/es/aics-image-viewer/assets/icons/metadata.js +15 -0
  31. package/es/aics-image-viewer/assets/icons/preferences.js +15 -0
  32. package/es/aics-image-viewer/assets/icons/resetView.js +16 -0
  33. package/es/aics-image-viewer/assets/icons/svg.d.js +0 -0
  34. package/es/aics-image-viewer/assets/icons/turnTable.js +18 -0
  35. package/es/aics-image-viewer/assets/styles/animatedEllipsis.css +21 -0
  36. package/es/aics-image-viewer/assets/styles/globals.css +35 -0
  37. package/es/aics-image-viewer/assets/styles/noui-slider-override.css +1 -0
  38. package/es/aics-image-viewer/assets/styles/variables.css +1 -0
  39. package/es/aics-image-viewer/components/App/ChannelUpdater.js +96 -0
  40. package/es/aics-image-viewer/components/App/index.js +849 -0
  41. package/es/aics-image-viewer/components/App/styles.css +60 -0
  42. package/es/aics-image-viewer/components/App/types.js +1 -0
  43. package/es/aics-image-viewer/components/AxisClipSliders/index.js +285 -0
  44. package/es/aics-image-viewer/components/AxisClipSliders/styles.css +257 -0
  45. package/es/aics-image-viewer/components/BottomPanel/index.js +70 -0
  46. package/es/aics-image-viewer/components/BottomPanel/styles.css +85 -0
  47. package/es/aics-image-viewer/components/CellViewerCanvasWrapper/index.js +113 -0
  48. package/es/aics-image-viewer/components/CellViewerCanvasWrapper/styles.css +12 -0
  49. package/es/aics-image-viewer/components/ChannelsWidget.js +100 -0
  50. package/es/aics-image-viewer/components/ChannelsWidgetRow/index.js +158 -0
  51. package/es/aics-image-viewer/components/ChannelsWidgetRow/styles.css +38 -0
  52. package/es/aics-image-viewer/components/ColorPicker.js +120 -0
  53. package/es/aics-image-viewer/components/ControlPanel/index.js +180 -0
  54. package/es/aics-image-viewer/components/ControlPanel/styles.css +169 -0
  55. package/es/aics-image-viewer/components/CustomizeWidget.js +46 -0
  56. package/es/aics-image-viewer/components/ErrorAlert/index.js +144 -0
  57. package/es/aics-image-viewer/components/ErrorAlert/styles.css +22 -0
  58. package/es/aics-image-viewer/components/GlobalVolumeControls.js +38 -0
  59. package/es/aics-image-viewer/components/MetadataViewer/index.js +99 -0
  60. package/es/aics-image-viewer/components/MetadataViewer/styles.css +81 -0
  61. package/es/aics-image-viewer/components/StyleProvider/index.js +210 -0
  62. package/es/aics-image-viewer/components/TfEditor/index.js +584 -0
  63. package/es/aics-image-viewer/components/TfEditor/styles.css +88 -0
  64. package/es/aics-image-viewer/components/Toolbar/DownloadButton.js +55 -0
  65. package/es/aics-image-viewer/components/Toolbar/ViewModeRadioButtons.js +22 -0
  66. package/es/aics-image-viewer/components/Toolbar/index.js +274 -0
  67. package/es/aics-image-viewer/components/Toolbar/styles.css +241 -0
  68. package/es/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.js +160 -0
  69. package/es/aics-image-viewer/components/ViewerStateProvider/index.js +261 -0
  70. package/es/aics-image-viewer/components/ViewerStateProvider/types.js +1 -0
  71. package/es/aics-image-viewer/components/shared/NumericInput/index.js +147 -0
  72. package/es/aics-image-viewer/components/shared/NumericInput/styles.css +64 -0
  73. package/es/aics-image-viewer/components/shared/SharedCheckBox.js +17 -0
  74. package/es/aics-image-viewer/components/shared/SliderRow/index.js +31 -0
  75. package/es/aics-image-viewer/components/shared/SliderRow/styles.css +19 -0
  76. package/es/aics-image-viewer/components/shared/SmarterSlider.js +40 -0
  77. package/es/aics-image-viewer/components/shared/ViewerIcon.js +22 -0
  78. package/es/aics-image-viewer/shared/colorPalette.js +19 -0
  79. package/es/aics-image-viewer/shared/constants.js +164 -0
  80. package/es/aics-image-viewer/shared/enums.js +18 -0
  81. package/es/aics-image-viewer/shared/types.js +6 -0
  82. package/es/aics-image-viewer/shared/utils/colorRepresentations.js +16 -0
  83. package/es/aics-image-viewer/shared/utils/controlPointsToLut.js +182 -0
  84. package/es/aics-image-viewer/shared/utils/hooks.js +51 -0
  85. package/es/aics-image-viewer/shared/utils/httpClient.js +57 -0
  86. package/es/aics-image-viewer/shared/utils/playControls.js +97 -0
  87. package/es/aics-image-viewer/shared/utils/sceneStore.js +140 -0
  88. package/es/aics-image-viewer/shared/utils/sliderValuesToImageValues.js +36 -0
  89. package/es/aics-image-viewer/shared/utils/test/viewerChannelSettings.test.js +132 -0
  90. package/es/aics-image-viewer/shared/utils/utilsService.js +54 -0
  91. package/es/aics-image-viewer/shared/utils/viewerChannelSettings.js +152 -0
  92. package/es/aics-image-viewer/shared/utils/viewerState.js +69 -0
  93. package/es/aics-image-viewer/shared/utils/webgl-debug.js +1103 -0
  94. package/es/index.js +4 -0
  95. package/package.json +130 -0
  96. package/type-declarations/aics-image-viewer/assets/icons/index.d.ts +14 -0
  97. package/type-declarations/aics-image-viewer/components/App/ChannelUpdater.d.ts +16 -0
  98. package/type-declarations/aics-image-viewer/components/App/index.d.ts +6 -0
  99. package/type-declarations/aics-image-viewer/components/App/types.d.ts +45 -0
  100. package/type-declarations/aics-image-viewer/components/AxisClipSliders/index.d.ts +24 -0
  101. package/type-declarations/aics-image-viewer/components/BottomPanel/index.d.ts +11 -0
  102. package/type-declarations/aics-image-viewer/components/CellViewerCanvasWrapper/index.d.ts +33 -0
  103. package/type-declarations/aics-image-viewer/components/ChannelsWidget.d.ts +19 -0
  104. package/type-declarations/aics-image-viewer/components/ChannelsWidgetRow/index.d.ts +17 -0
  105. package/type-declarations/aics-image-viewer/components/ColorPicker.d.ts +13 -0
  106. package/type-declarations/aics-image-viewer/components/ControlPanel/index.d.ts +20 -0
  107. package/type-declarations/aics-image-viewer/components/CustomizeWidget.d.ts +15 -0
  108. package/type-declarations/aics-image-viewer/components/ErrorAlert/index.d.ts +12 -0
  109. package/type-declarations/aics-image-viewer/components/GlobalVolumeControls.d.ts +21 -0
  110. package/type-declarations/aics-image-viewer/components/MetadataViewer/index.d.ts +7 -0
  111. package/type-declarations/aics-image-viewer/components/StyleProvider/index.d.ts +5 -0
  112. package/type-declarations/aics-image-viewer/components/TfEditor/index.d.ts +19 -0
  113. package/type-declarations/aics-image-viewer/components/Toolbar/DownloadButton.d.ts +8 -0
  114. package/type-declarations/aics-image-viewer/components/Toolbar/ViewModeRadioButtons.d.ts +8 -0
  115. package/type-declarations/aics-image-viewer/components/Toolbar/index.d.ts +31 -0
  116. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.d.ts +34 -0
  117. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/index.d.ts +33 -0
  118. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/types.d.ts +105 -0
  119. package/type-declarations/aics-image-viewer/components/shared/NumericInput/index.d.ts +19 -0
  120. package/type-declarations/aics-image-viewer/components/shared/SharedCheckBox.d.ts +9 -0
  121. package/type-declarations/aics-image-viewer/components/shared/SliderRow/index.d.ts +17 -0
  122. package/type-declarations/aics-image-viewer/components/shared/SmarterSlider.d.ts +5 -0
  123. package/type-declarations/aics-image-viewer/components/shared/ViewerIcon.d.ts +9 -0
  124. package/type-declarations/aics-image-viewer/shared/constants.d.ts +40 -0
  125. package/type-declarations/aics-image-viewer/shared/enums.d.ts +15 -0
  126. package/type-declarations/aics-image-viewer/shared/types.d.ts +15 -0
  127. package/type-declarations/aics-image-viewer/shared/utils/colorRepresentations.d.ts +10 -0
  128. package/type-declarations/aics-image-viewer/shared/utils/controlPointsToLut.d.ts +53 -0
  129. package/type-declarations/aics-image-viewer/shared/utils/hooks.d.ts +14 -0
  130. package/type-declarations/aics-image-viewer/shared/utils/playControls.d.ts +27 -0
  131. package/type-declarations/aics-image-viewer/shared/utils/sceneStore.d.ts +17 -0
  132. package/type-declarations/aics-image-viewer/shared/utils/sliderValuesToImageValues.d.ts +10 -0
  133. package/type-declarations/aics-image-viewer/shared/utils/viewerChannelSettings.d.ts +46 -0
  134. package/type-declarations/aics-image-viewer/shared/utils/viewerState.d.ts +10 -0
  135. package/type-declarations/index.d.ts +7 -0
@@ -0,0 +1,55 @@
1
+ import React from "react";
2
+ import { Dropdown, Button, Tooltip } from "antd";
3
+ import ViewerIcon from "../shared/ViewerIcon";
4
+ var DownloadButton = function DownloadButton(_ref) {
5
+ var fovDownloadHref = _ref.fovDownloadHref,
6
+ cellDownloadHref = _ref.cellDownloadHref,
7
+ hasFov = _ref.hasFov;
8
+ if (hasFov) {
9
+ var menu = {
10
+ className: "download-dropdown",
11
+ items: [{
12
+ key: "1",
13
+ label: /*#__PURE__*/React.createElement("a", {
14
+ href: cellDownloadHref
15
+ }, /*#__PURE__*/React.createElement(ViewerIcon, {
16
+ type: "download"
17
+ }), " Segmented cell")
18
+ }, {
19
+ key: "2",
20
+ label: /*#__PURE__*/React.createElement("a", {
21
+ href: fovDownloadHref
22
+ }, /*#__PURE__*/React.createElement(ViewerIcon, {
23
+ type: "download"
24
+ }), " Full field image")
25
+ }]
26
+ };
27
+ return /*#__PURE__*/React.createElement(Tooltip, {
28
+ trigger: ["hover", "focus"],
29
+ placement: "bottom",
30
+ title: "Download volume data"
31
+ }, /*#__PURE__*/React.createElement(Dropdown, {
32
+ menu: menu,
33
+ placement: "bottomRight",
34
+ trigger: ["click"]
35
+ }, /*#__PURE__*/React.createElement(Button, {
36
+ className: "ant-btn-icon-only btn-borderless"
37
+ }, /*#__PURE__*/React.createElement(ViewerIcon, {
38
+ type: "download"
39
+ }))));
40
+ } else if (cellDownloadHref) {
41
+ return /*#__PURE__*/React.createElement(Tooltip, {
42
+ trigger: ["hover", "focus"],
43
+ placement: "bottom",
44
+ title: "Download volume data"
45
+ }, /*#__PURE__*/React.createElement(Button, {
46
+ className: "ant-btn-icon-only btn-borderless",
47
+ href: cellDownloadHref
48
+ }, /*#__PURE__*/React.createElement(ViewerIcon, {
49
+ type: "download"
50
+ })));
51
+ } else {
52
+ return null;
53
+ }
54
+ };
55
+ export default DownloadButton;
@@ -0,0 +1,22 @@
1
+ import React from "react";
2
+ import { Radio } from "antd";
3
+ import { ViewMode } from "../../shared/enums";
4
+ var viewModes = [ViewMode.threeD, ViewMode.xy, ViewMode.xz, ViewMode.yz];
5
+ var ViewModeRadioButtons = function ViewModeRadioButtons(props) {
6
+ var onChangeButton = function onChangeButton(_ref) {
7
+ var target = _ref.target;
8
+ if (props.mode !== target.value) {
9
+ props.onViewModeChange(target.value);
10
+ }
11
+ };
12
+ return /*#__PURE__*/React.createElement(Radio.Group, {
13
+ onChange: onChangeButton,
14
+ value: props.mode.toString()
15
+ }, viewModes.map(function (mode, index) {
16
+ return /*#__PURE__*/React.createElement(Radio.Button, {
17
+ key: index,
18
+ value: mode.toString()
19
+ }, mode);
20
+ }));
21
+ };
22
+ export default ViewModeRadioButtons;
@@ -0,0 +1,274 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
7
+ import { UndoOutlined } from "@ant-design/icons";
8
+ import { Button, Radio, Select, Tooltip } from "antd";
9
+ import { debounce } from "lodash";
10
+ import React from "react";
11
+ import ViewModeRadioButtons from "./ViewModeRadioButtons";
12
+ import DownloadButton from "./DownloadButton";
13
+ import { connectToViewerState } from "../ViewerStateProvider";
14
+ import { ImageType, RenderMode, ViewMode } from "../../shared/enums";
15
+ import ViewerIcon from "../shared/ViewerIcon";
16
+ import "./styles.css";
17
+ var RESIZE_DEBOUNCE_DELAY = 50;
18
+ var visuallyHiddenStyle = {
19
+ position: "absolute",
20
+ width: "1px",
21
+ height: "1px",
22
+ padding: "0",
23
+ margin: "-1px",
24
+ overflow: "hidden",
25
+ clip: "rect(0, 0, 0, 0)",
26
+ whiteSpace: "nowrap",
27
+ borderWidth: "0"
28
+ };
29
+ var Toolbar = function Toolbar(props) {
30
+ var containerRef = React.useRef(null);
31
+ var barRef = React.useRef(null);
32
+ var leftRef = React.useRef(null);
33
+ var rightRef = React.useRef(null);
34
+ var centerRef = React.useRef(null);
35
+ var _React$useState = React.useState(false),
36
+ _React$useState2 = _slicedToArray(_React$useState, 2),
37
+ scrollMode = _React$useState2[0],
38
+ setScrollMode = _React$useState2[1];
39
+ var _React$useState3 = React.useState(false),
40
+ _React$useState4 = _slicedToArray(_React$useState3, 2),
41
+ showScrollBtnLeft = _React$useState4[0],
42
+ setScrollBtnLeft = _React$useState4[1];
43
+ var _React$useState5 = React.useState(false),
44
+ _React$useState6 = _slicedToArray(_React$useState5, 2),
45
+ showScrollBtnRight = _React$useState6[0],
46
+ setScrollBtnRight = _React$useState6[1];
47
+
48
+ // Scroll buttons are only visible when toolbar can be scrolled in that direction.
49
+ // This may change on either scroll or resize.
50
+ var checkScrollBtnVisible = React.useCallback(function () {
51
+ var barEl = barRef.current;
52
+ if (!barEl) {
53
+ return;
54
+ }
55
+ setScrollBtnLeft(barEl.scrollLeft > 0);
56
+ setScrollBtnRight(barEl.scrollLeft < barEl.scrollWidth - barEl.clientWidth);
57
+ }, []);
58
+ var checkSize = React.useCallback(debounce(function () {
59
+ if (!leftRef.current || !centerRef.current || !rightRef.current || !barRef.current) {
60
+ return;
61
+ }
62
+ var leftRect = leftRef.current.getBoundingClientRect();
63
+ var centerRect = centerRef.current.getBoundingClientRect();
64
+ var rightRect = rightRef.current.getBoundingClientRect();
65
+
66
+ // when calculating width required to leave scroll mode, add a bit of extra width to ensure that triggers
67
+ // for entering and leaving scroll mode never overlap (causing toolbar to rapidly switch when resizing)
68
+ var SCROLL_OFF_EXTRA_WIDTH = 15;
69
+ if (scrollMode) {
70
+ // Leave scroll mode if there is enough space for centered controls not to overlap left/right-aligned ones
71
+ var barWidth = barRef.current.getBoundingClientRect().width;
72
+ var requiredWidth = Math.max(leftRect.width, rightRect.width) * 2 + centerRect.width + SCROLL_OFF_EXTRA_WIDTH;
73
+ if (barWidth > requiredWidth) {
74
+ setScrollMode(false);
75
+ }
76
+ } else {
77
+ // Enter scroll mode if centered controls are overlapping either left/right-aligned ones
78
+ if (leftRect.right > centerRect.left || centerRect.right > rightRect.left) {
79
+ setScrollMode(true);
80
+ }
81
+ }
82
+ checkScrollBtnVisible();
83
+ }, RESIZE_DEBOUNCE_DELAY), [scrollMode, checkScrollBtnVisible]);
84
+ React.useEffect(checkSize, []);
85
+ React.useEffect(function () {
86
+ window.addEventListener("resize", checkSize);
87
+ return function () {
88
+ return window.removeEventListener("resize", checkSize);
89
+ };
90
+ }, [checkSize]);
91
+ var scrollX = function scrollX(amount) {
92
+ return barRef.current.scrollLeft += amount;
93
+ };
94
+
95
+ // Translate vertical scrolling into horizontal scrolling
96
+ var wheelHandler = function wheelHandler(e) {
97
+ e.preventDefault();
98
+ if (e.deltaY === 0) {
99
+ return;
100
+ }
101
+ scrollX(e.deltaY);
102
+ };
103
+ var toggleAxis = function toggleAxis() {
104
+ return props.changeViewerSetting("showAxes", !props.showAxes);
105
+ };
106
+ var toggleBoundingBox = function toggleBoundingBox() {
107
+ return props.changeViewerSetting("showBoundingBox", !props.showBoundingBox);
108
+ };
109
+ // TODO remove ant-btn-icon-only hack when upgrading antd
110
+ var classForToggleBtn = function classForToggleBtn(active) {
111
+ return "ant-btn-icon-only btn-borderless" + (active ? " btn-active" : "");
112
+ };
113
+ var changeViewerSetting = props.changeViewerSetting,
114
+ resetToSavedViewerState = props.resetToSavedViewerState,
115
+ visibleControls = props.visibleControls,
116
+ showAxes = props.showAxes,
117
+ showBoundingBox = props.showBoundingBox,
118
+ autorotate = props.autorotate;
119
+ var twoDMode = props.viewMode !== ViewMode.threeD;
120
+ var renderGroup1 = visibleControls.viewModeRadioButtons || visibleControls.resetCameraButton || visibleControls.autoRotateButton;
121
+ var renderGroup4 = visibleControls.showAxesButton || visibleControls.showBoundingBoxButton;
122
+ var axesToggleTitle = showAxes ? "Hide axes" : "Show axes";
123
+ var boundingBoxToggleTitle = showBoundingBox ? "Hide bounding box" : "Show bounding box";
124
+ var turntableToggleTitle = autorotate ? "Turn off turntable" : "Turn on turntable";
125
+ var getPopupContainer = containerRef.current ? function () {
126
+ return containerRef.current;
127
+ } : undefined;
128
+ return /*#__PURE__*/React.createElement("div", {
129
+ className: "viewer-toolbar-container".concat(scrollMode ? " viewer-toolbar-scroll" : ""),
130
+ ref: containerRef
131
+ }, /*#__PURE__*/React.createElement("div", {
132
+ className: "viewer-toolbar-scroll-left",
133
+ style: {
134
+ display: showScrollBtnLeft ? "flex" : "none"
135
+ },
136
+ onClick: function onClick() {
137
+ return scrollX(-100);
138
+ }
139
+ }, /*#__PURE__*/React.createElement(ViewerIcon, {
140
+ type: "closePanel",
141
+ style: {
142
+ fontSize: "12px",
143
+ transform: "rotate(180deg)"
144
+ }
145
+ })), /*#__PURE__*/React.createElement("div", {
146
+ className: "viewer-toolbar",
147
+ ref: barRef,
148
+ onWheel: wheelHandler,
149
+ onScroll: checkScrollBtnVisible
150
+ }, /*#__PURE__*/React.createElement("div", {
151
+ className: "viewer-toolbar-left",
152
+ ref: leftRef
153
+ }, /*#__PURE__*/React.createElement(Tooltip, {
154
+ placement: "bottom",
155
+ title: "Reset to initial settings",
156
+ trigger: ["focus", "hover"]
157
+ }, /*#__PURE__*/React.createElement(Button, {
158
+ className: "ant-btn-icon-only btn-borderless",
159
+ onClick: resetToSavedViewerState
160
+ }, /*#__PURE__*/React.createElement(UndoOutlined, null), /*#__PURE__*/React.createElement("span", {
161
+ style: visuallyHiddenStyle
162
+ }, "Reset to initial settings")))), /*#__PURE__*/React.createElement("div", {
163
+ className: "viewer-toolbar-center",
164
+ ref: centerRef
165
+ }, renderGroup1 && /*#__PURE__*/React.createElement("div", {
166
+ className: "viewer-toolbar-group"
167
+ }, visibleControls.viewModeRadioButtons && /*#__PURE__*/React.createElement(ViewModeRadioButtons, {
168
+ mode: props.viewMode,
169
+ onViewModeChange: function onViewModeChange(newMode) {
170
+ return changeViewerSetting("viewMode", newMode);
171
+ }
172
+ }), visibleControls.resetCameraButton && /*#__PURE__*/React.createElement(Tooltip, {
173
+ placement: "bottom",
174
+ title: "Reset camera"
175
+ }, /*#__PURE__*/React.createElement(Button, {
176
+ className: "ant-btn-icon-only btn-borderless",
177
+ onClick: props.resetCamera
178
+ }, /*#__PURE__*/React.createElement(ViewerIcon, {
179
+ type: "resetView"
180
+ }))), visibleControls.autoRotateButton && /*#__PURE__*/React.createElement(Tooltip, {
181
+ placement: "bottom",
182
+ title: turntableToggleTitle
183
+ }, /*#__PURE__*/React.createElement(Button, {
184
+ className: classForToggleBtn(autorotate && !twoDMode),
185
+ disabled: twoDMode || props.renderMode === RenderMode.pathTrace,
186
+ onClick: function onClick() {
187
+ return changeViewerSetting("autorotate", !autorotate);
188
+ }
189
+ }, /*#__PURE__*/React.createElement(ViewerIcon, {
190
+ type: "turnTable"
191
+ })))), visibleControls.fovCellSwitchControls && props.hasCellId && props.hasParentImage && /*#__PURE__*/React.createElement("div", {
192
+ className: "viewer-toolbar-group"
193
+ }, /*#__PURE__*/React.createElement(Radio.Group, {
194
+ value: props.imageType,
195
+ onChange: function onChange(_ref) {
196
+ var target = _ref.target;
197
+ return changeViewerSetting("imageType", target.value);
198
+ }
199
+ }, /*#__PURE__*/React.createElement(Radio.Button, {
200
+ value: ImageType.segmentedCell
201
+ }, "Single cell"), /*#__PURE__*/React.createElement(Radio.Button, {
202
+ value: ImageType.fullField
203
+ }, "Full field"))), /*#__PURE__*/React.createElement("div", {
204
+ className: "viewer-toolbar-group"
205
+ }, /*#__PURE__*/React.createElement(Select, {
206
+ className: "select-render-setting",
207
+ popupClassName: "viewer-toolbar-dropdown",
208
+ value: props.renderMode,
209
+ onChange: function onChange(value) {
210
+ return changeViewerSetting("renderMode", value);
211
+ },
212
+ getPopupContainer: getPopupContainer
213
+ }, /*#__PURE__*/React.createElement(Select.Option, {
214
+ value: RenderMode.volumetric,
215
+ key: RenderMode.volumetric
216
+ }, "Volumetric"), props.canPathTrace && /*#__PURE__*/React.createElement(Select.Option, {
217
+ value: RenderMode.pathTrace,
218
+ key: RenderMode.pathTrace,
219
+ disabled: twoDMode
220
+ }, "Path trace"), /*#__PURE__*/React.createElement(Select.Option, {
221
+ value: RenderMode.maxProject,
222
+ key: RenderMode.maxProject
223
+ }, "Max project"))), renderGroup4 && /*#__PURE__*/React.createElement("div", {
224
+ className: "viewer-toolbar-group"
225
+ }, visibleControls.showAxesButton && /*#__PURE__*/React.createElement(Tooltip, {
226
+ placement: "bottom",
227
+ title: axesToggleTitle
228
+ }, /*#__PURE__*/React.createElement(Button, {
229
+ className: classForToggleBtn(showAxes),
230
+ onClick: toggleAxis
231
+ }, /*#__PURE__*/React.createElement(ViewerIcon, {
232
+ type: "axes"
233
+ }))), visibleControls.showBoundingBoxButton && /*#__PURE__*/React.createElement(Tooltip, {
234
+ placement: "bottom",
235
+ title: boundingBoxToggleTitle
236
+ }, /*#__PURE__*/React.createElement(Button, {
237
+ className: classForToggleBtn(showBoundingBox),
238
+ onClick: toggleBoundingBox
239
+ }, /*#__PURE__*/React.createElement(ViewerIcon, {
240
+ type: "boundingBox"
241
+ }))))), /*#__PURE__*/React.createElement("div", {
242
+ className: "viewer-toolbar-right viewer-toolbar-group",
243
+ ref: rightRef
244
+ }, /*#__PURE__*/React.createElement(Tooltip, {
245
+ placement: "bottom",
246
+ title: "Download"
247
+ }, /*#__PURE__*/React.createElement(DownloadButton, {
248
+ cellDownloadHref: props.cellDownloadHref,
249
+ fovDownloadHref: props.fovDownloadHref,
250
+ hasFov: props.hasCellId && props.hasParentImage
251
+ })), /*#__PURE__*/React.createElement(Tooltip, {
252
+ placement: "bottom",
253
+ title: "Screenshot"
254
+ }, /*#__PURE__*/React.createElement(Button, {
255
+ className: "ant-btn-icon-only btn-borderless",
256
+ onClick: props.downloadScreenshot
257
+ }, /*#__PURE__*/React.createElement(ViewerIcon, {
258
+ type: "camera"
259
+ }))))), /*#__PURE__*/React.createElement("div", {
260
+ className: "viewer-toolbar-scroll-right",
261
+ style: {
262
+ display: showScrollBtnRight ? "flex" : "none"
263
+ },
264
+ onClick: function onClick() {
265
+ return scrollX(100);
266
+ }
267
+ }, /*#__PURE__*/React.createElement(ViewerIcon, {
268
+ type: "closePanel",
269
+ style: {
270
+ fontSize: "12px"
271
+ }
272
+ })));
273
+ };
274
+ export default connectToViewerState(Toolbar, ["imageType", "renderMode", "viewMode", "autorotate", "showAxes", "showBoundingBox", "changeViewerSetting", "resetToSavedViewerState"]);
@@ -0,0 +1,241 @@
1
+ .viewer-toolbar-container{
2
+ position:absolute;
3
+ width:100%;
4
+ z-index:250;
5
+ }
6
+
7
+ .viewer-toolbar-container .viewer-toolbar-scroll-left,
8
+ .viewer-toolbar-container .viewer-toolbar-scroll-right{
9
+ height:100%;
10
+ width:18px;
11
+ justify-content:center;
12
+ align-items:center;
13
+ background-color:rgba(75, 75, 75, 0.85);
14
+ display:none;
15
+ position:absolute;
16
+ top:0;
17
+ z-index:255;
18
+ transition:color 0.3s;
19
+ }
20
+
21
+ .viewer-toolbar-container .viewer-toolbar-scroll-left:hover, .viewer-toolbar-container .viewer-toolbar-scroll-right:hover{
22
+ color:white;
23
+ }
24
+
25
+ .viewer-toolbar-container .viewer-toolbar-scroll-left{
26
+ left:0;
27
+ }
28
+
29
+ .viewer-toolbar-container .viewer-toolbar-scroll-right{
30
+ right:0;
31
+ }
32
+
33
+ .viewer-toolbar-container.viewer-toolbar-scroll{
34
+ border-bottom:1px solid var(--color-layout-dividers);
35
+ }
36
+
37
+ .viewer-toolbar-container.viewer-toolbar-scroll .viewer-toolbar-scroll-left,
38
+ .viewer-toolbar-container.viewer-toolbar-scroll .viewer-toolbar-scroll-right{
39
+ display:flex;
40
+ }
41
+
42
+ .viewer-toolbar-container.viewer-toolbar-scroll .viewer-toolbar{
43
+ white-space:nowrap;
44
+ justify-content:normal;
45
+
46
+ overflow-x:scroll;
47
+ scrollbar-width:none;
48
+ }
49
+
50
+ .viewer-toolbar-container.viewer-toolbar-scroll .viewer-toolbar::-webkit-scrollbar{
51
+ display:none;
52
+ }
53
+
54
+ .viewer-toolbar-container.viewer-toolbar-scroll .viewer-toolbar .viewer-toolbar-left{
55
+ position:static;
56
+ margin-left:15px;
57
+ }
58
+
59
+ .viewer-toolbar-container.viewer-toolbar-scroll .viewer-toolbar .viewer-toolbar-right{
60
+ position:static;
61
+ margin-right:15px;
62
+ }
63
+
64
+ .viewer-toolbar{
65
+ padding:12px;
66
+ text-align:center;
67
+ display:flex;
68
+ flex-direction:row;
69
+ justify-content:space-around;
70
+ }
71
+
72
+ .viewer-toolbar > div{
73
+ display:flex;
74
+ flex-direction:row;
75
+ align-items:center;
76
+ vertical-align:middle;
77
+ }
78
+
79
+ .viewer-toolbar .viewer-toolbar-left,
80
+ .viewer-toolbar .viewer-toolbar-right{
81
+ position:absolute;
82
+ }
83
+
84
+ .viewer-toolbar .viewer-toolbar-left:not(:empty), .viewer-toolbar .viewer-toolbar-right:not(:empty){
85
+ padding:0 12px;
86
+ }
87
+
88
+ .viewer-toolbar .viewer-toolbar-left{
89
+ left:0;
90
+ }
91
+
92
+ .viewer-toolbar .viewer-toolbar-right{
93
+ right:0;
94
+ }
95
+
96
+ .viewer-toolbar .viewer-toolbar-group{
97
+ display:flex;
98
+ flex-direction:row;
99
+ align-items:center;
100
+ vertical-align:middle;
101
+ }
102
+
103
+ .viewer-toolbar .viewer-toolbar-group:not(:last-child){
104
+ margin-right:14px;
105
+ }
106
+
107
+ .viewer-toolbar .viewer-toolbar-group > :not(:last-child){
108
+ margin-right:6px;
109
+ }
110
+
111
+ .viewer-toolbar .ant-btn-icon-only{
112
+ padding-bottom:4px;
113
+ padding-left:1px;
114
+ }
115
+
116
+ .viewer-toolbar .btn-borderless{
117
+ background-color:var(--color-toolbar-button-bg);
118
+ border-color:transparent;
119
+ color:var(--color-text-body);
120
+ }
121
+
122
+ .viewer-toolbar .btn-active{
123
+ color:var(--color-button-icon-activated-text);
124
+ background-color:var(--color-button-icon-activated-bg);
125
+ border:1px solid var(--color-button-icon-activated-outline);
126
+ }
127
+
128
+ .viewer-toolbar .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-disabled){
129
+ background-color:black;
130
+ box-shadow:-1px 0px 0px 0px transparent;
131
+ transition-property:color, background-color, border-color, box-shadow;
132
+ }
133
+
134
+ .viewer-toolbar .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-disabled).ant-radio-button-wrapper-checked,
135
+ .viewer-toolbar .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-disabled):hover{
136
+ outline:none;
137
+ color:white;
138
+ border-color:#aeacae;
139
+ }
140
+
141
+ .viewer-toolbar .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-disabled).ant-radio-button-wrapper-checked:not(:first-child), .viewer-toolbar .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-disabled):hover:not(:first-child){
142
+ box-shadow:-1px 0px 0px 0px #aeacae;
143
+ }
144
+
145
+ .viewer-toolbar .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-disabled).ant-radio-button-wrapper-checked{
146
+ background-color:#4b4b4b;
147
+ }
148
+
149
+ .viewer-toolbar .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-disabled):hover{
150
+ background-color:#aa88ed;
151
+ color:white;
152
+ }
153
+
154
+ .viewer-toolbar .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-disabled):focus-within{
155
+ outline:none;
156
+ }
157
+
158
+ .viewer-toolbar .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-disabled)::before{
159
+ content:none;
160
+ }
161
+
162
+ .viewer-toolbar.viewer-toolbar .ant-select.select-render-setting{
163
+ min-width:120px;
164
+ }
165
+
166
+ .viewer-toolbar.viewer-toolbar .ant-select.select-render-setting .ant-select-selection-item,
167
+ .viewer-toolbar.viewer-toolbar .ant-select.select-render-setting .ant-select-arrow{
168
+ color:var(--color-button-tertiary-text);
169
+ transition:all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
170
+ }
171
+
172
+ .viewer-toolbar.viewer-toolbar .ant-select.select-render-setting .ant-select-selector{
173
+ border-color:#aeacae;
174
+ box-shadow:none;
175
+ background-color:var(--color-toolbar-button-bg);
176
+ }
177
+
178
+ .viewer-toolbar .ant-select.select-render-setting:hover:not(:disabled) .ant-select-selector,
179
+ .viewer-toolbar .ant-select.select-render-setting:hover:not(:disabled) .ant-select-arrow,
180
+ .viewer-toolbar .ant-select.select-render-setting:hover:not(:disabled) .ant-select-selection-item,
181
+ .viewer-toolbar .ant-select.select-render-setting:focus-visible:not(:disabled) .ant-select-selector,
182
+ .viewer-toolbar .ant-select.select-render-setting:focus-visible:not(:disabled) .ant-select-arrow,
183
+ .viewer-toolbar .ant-select.select-render-setting:focus-visible:not(:disabled) .ant-select-selection-item,
184
+ .viewer-toolbar.viewer-toolbar.viewer-toolbar .ant-select-open .ant-select-selector,
185
+ .viewer-toolbar.viewer-toolbar.viewer-toolbar .ant-select-open .ant-select-arrow,
186
+ .viewer-toolbar.viewer-toolbar.viewer-toolbar .ant-select-open .ant-select-selection-item{
187
+ color:var(--color-button-tertiary-hover-text);
188
+ outline-color:var(--color-button-tertiary-hover-outline);
189
+ }
190
+
191
+ .viewer-toolbar-dropdown .ant-select-dropdown-menu-item-active{
192
+ transition-property:background-color, color;
193
+ }
194
+
195
+ .viewer-toolbar-dropdown .ant-select-dropdown-menu-item-disabled,
196
+ .viewer-toolbar-dropdown .ant-select-dropdown-menu-item-disabled:hover{
197
+ color:#6e6e6e;
198
+ }
199
+
200
+ .viewer-toolbar-dropdown .ant-select-dropdown-menu-item-active:not(.ant-select-dropdown-menu-item-disabled){
201
+ background-color:transparent;
202
+ color:white;
203
+ }
204
+
205
+ .viewer-toolbar-dropdown .ant-select-dropdown-menu-item-active:not(.ant-select-dropdown-menu-item-disabled).ant-select-dropdown-menu-item-selected{
206
+ background-color:#4b4b4b;
207
+ }
208
+
209
+ .viewer-toolbar-dropdown .ant-select-dropdown-menu-item:hover:not(.ant-select-dropdown-menu-item-disabled){
210
+ background-color:#f6f0ff;
211
+ color:#4b4b4b;
212
+ }
213
+
214
+ @supports selector(:has(:focus-visible)){
215
+ .viewer-toolbar .ant-select-selection:focus-visible,
216
+ .viewer-toolbar .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-disabled):has(:focus-visible),
217
+ .viewer-toolbar .btn-borderless:focus-visible{
218
+ background-color:#aa88ed !important;
219
+ color:white !important;
220
+ }
221
+
222
+ .viewer-toolbar .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-disabled):has(:focus-visible){
223
+ outline:none;
224
+ border-color:#aeacae;
225
+ }
226
+
227
+ .viewer-toolbar .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-disabled):has(:focus-visible):not(:first-child){
228
+ box-shadow:-1px 0px 0px 0px #aeacae;
229
+ }
230
+ }
231
+
232
+ @supports not (selector(:has(:focus-visible))){
233
+ .viewer-toolbar .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-disabled):focus-within{
234
+ outline:none;
235
+ border-color:#aeacae;
236
+ }
237
+
238
+ .viewer-toolbar .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-disabled):focus-within:not(:first-child){
239
+ box-shadow:-1px 0px 0px 0px #aeacae;
240
+ }
241
+ }