@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,60 @@
1
+ .cell-viewer-app .ant-radio-button-wrapper-disabled,
2
+ .cell-viewer-app .ant-btn[disabled]{
3
+ color:rgb(110, 110, 110);
4
+ }
5
+ .cell-viewer-app .control-panel-holder{
6
+ overflow:visible;
7
+ }
8
+
9
+ .cell-viewer-wrapper{
10
+ overflow-y:hidden;
11
+ }
12
+
13
+ .cell-viewer-wrapper .ant-layout-content{
14
+ position:relative;
15
+ }
16
+
17
+ .cell-viewer-wrapper .ant-progress,
18
+ .cell-viewer-wrapper .ant-progress-line{
19
+ position:absolute;
20
+ }
21
+
22
+ .cell-viewer-wrapper .ant-progress{
23
+ background-color:white;
24
+ z-index:20;
25
+ }
26
+
27
+ .cell-viewer-wrapper .ant-progress-status-active .ant-progress-bg::before{
28
+ position:absolute;
29
+ top:0;
30
+ bottom:0;
31
+ right:50%;
32
+ left:0;
33
+ width:50%;
34
+ background:rgb(49, 49, 49);
35
+ background:linear-gradient(90deg, #313131 0%, #868686 520%, #313131 100%);
36
+ opacity:0.6;
37
+ -webkit-animation:ant-progress-active 2.4s cubic-bezier(0.45, 0.05, 0.55, 0.95) infinite;
38
+ animation:ant-progress-active 2.4s cubic-bezier(0.45, 0.05, 0.55, 0.95) infinite;
39
+ content:"";
40
+ }
41
+
42
+ @-webkit-keyframes ant-progress-active{
43
+ from{
44
+ left:-50%;
45
+ }
46
+
47
+ to{
48
+ left:100%;
49
+ }
50
+ }
51
+
52
+ @keyframes ant-progress-active{
53
+ from{
54
+ left:-50%;
55
+ }
56
+
57
+ to{
58
+ left:100%;
59
+ }
60
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,285 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
3
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
4
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
5
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
6
+ 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."); }
7
+ 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; } }
8
+ 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; }
9
+ 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; } }
10
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
11
+ import { CaretRightOutlined, PauseOutlined } from "@ant-design/icons";
12
+ import { Button, Tooltip } from "antd";
13
+ import React, { useCallback, useEffect, useState } from "react";
14
+ import { activeAxisMap } from "../../shared/types";
15
+ import NumericInput from "../shared/NumericInput";
16
+ import SmarterSlider from "../shared/SmarterSlider";
17
+ import "./styles.css";
18
+ var AXES = ["x", "y", "z"];
19
+ /** A single slider row, with a slider, one or two spinbox inputs, and a max value */
20
+ var SliderRow = function SliderRow(_ref) {
21
+ var label = _ref.label,
22
+ vals = _ref.vals,
23
+ _ref$valsReadout = _ref.valsReadout,
24
+ valsReadout = _ref$valsReadout === void 0 ? vals : _ref$valsReadout,
25
+ max = _ref.max,
26
+ onSlide = _ref.onSlide,
27
+ _ref$onChange = _ref.onChange,
28
+ _onChange = _ref$onChange === void 0 ? onSlide : _ref$onChange,
29
+ onStart = _ref.onStart,
30
+ onEnd = _ref.onEnd;
31
+ var isRange = vals.length > 1;
32
+ // If slider is a range, handles represent slice *edges*: the range around only the max slice is [max-1, max], e.g.
33
+ // If slider is not a range, handle represents 0-indexed slices: last slice is at max-1
34
+ var inputMax = isRange ? max : max - 1;
35
+ return /*#__PURE__*/React.createElement("span", {
36
+ className: "axis-slider-container"
37
+ }, /*#__PURE__*/React.createElement("span", {
38
+ className: "slider-name"
39
+ }, label), inputMax === 0 ? /*#__PURE__*/React.createElement("i", null, "No values to adjust") : /*#__PURE__*/React.createElement("span", {
40
+ className: "axis-slider"
41
+ }, /*#__PURE__*/React.createElement(SmarterSlider, {
42
+ className: isRange ? "" : "slider-single-handle",
43
+ connect: true,
44
+ range: {
45
+ min: 0,
46
+ max: inputMax
47
+ },
48
+ start: vals,
49
+ step: 1,
50
+ margin: 1,
51
+ behaviour: "drag",
52
+ pips: {
53
+ mode: "positions",
54
+ values: [25, 50, 75],
55
+ density: 25,
56
+ format: {
57
+ // remove labels from pips
58
+ to: function to() {
59
+ return "";
60
+ }
61
+ }
62
+ }
63
+ // round slider output to nearest slice; assume any string inputs represent ints
64
+ ,
65
+ format: {
66
+ to: Math.round,
67
+ from: parseInt
68
+ },
69
+ onSlide: onSlide,
70
+ onChange: _onChange,
71
+ onStart: onStart,
72
+ onEnd: onEnd
73
+ })), inputMax > 0 && /*#__PURE__*/React.createElement("span", {
74
+ className: "slider-values"
75
+ }, /*#__PURE__*/React.createElement(NumericInput, {
76
+ max: inputMax,
77
+ value: valsReadout[0],
78
+ onChange: function onChange(value) {
79
+ return _onChange === null || _onChange === void 0 ? void 0 : _onChange(isRange ? [value, vals[1]] : [value]);
80
+ }
81
+ }), isRange && /*#__PURE__*/React.createElement(React.Fragment, null, " , ", /*#__PURE__*/React.createElement(NumericInput, {
82
+ max: inputMax,
83
+ value: valsReadout[1],
84
+ onChange: function onChange(value) {
85
+ return _onChange === null || _onChange === void 0 ? void 0 : _onChange([vals[0], value]);
86
+ }
87
+ })), " / ", max - 1));
88
+ };
89
+ /** Wrapper around `SliderRow` that adds a play button and accounts for the case where not all of an axis is loaded */
90
+ var PlaySliderRow = function PlaySliderRow(props) {
91
+ // In partially-loaded axes, stores the displayed value of the slider while the user is sliding it
92
+ var _useState = useState(props.val),
93
+ _useState2 = _slicedToArray(_useState, 2),
94
+ valReadout = _useState2[0],
95
+ setValReadout = _useState2[1];
96
+ // Tracks when the user is sliding the slider and `valReadout` may have to sub in for props
97
+ var _useState3 = useState(false),
98
+ _useState4 = _slicedToArray(_useState3, 2),
99
+ sliderHeld = _useState4[0],
100
+ setSliderHeld = _useState4[1];
101
+ var wrappedOnChange = useCallback(function (_ref2) {
102
+ var _props$onChange;
103
+ var _ref3 = _slicedToArray(_ref2, 1),
104
+ val = _ref3[0];
105
+ return (_props$onChange = props.onChange) === null || _props$onChange === void 0 ? void 0 : _props$onChange.call(props, val);
106
+ }, [props.onChange]);
107
+ var wrappedSetValReadout = useCallback(function (_ref4) {
108
+ var _ref5 = _slicedToArray(_ref4, 1),
109
+ val = _ref5[0];
110
+ return setValReadout(val);
111
+ }, []);
112
+ var wrappedOnStart = useCallback(function () {
113
+ var _props$onStart;
114
+ setValReadout(props.val);
115
+ setSliderHeld(true);
116
+ (_props$onStart = props.onStart) === null || _props$onStart === void 0 || _props$onStart.call(props);
117
+ }, [props.onStart]);
118
+ var wrappedOnEnd = useCallback(function () {
119
+ var _props$onEnd;
120
+ setSliderHeld(false);
121
+ (_props$onEnd = props.onEnd) === null || _props$onEnd === void 0 || _props$onEnd.call(props);
122
+ }, [props.onEnd]);
123
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(SliderRow, {
124
+ label: props.label,
125
+ vals: [props.val],
126
+ valsReadout: props.updateWhileSliding || !sliderHeld ? undefined : [valReadout],
127
+ max: props.max,
128
+ onSlide: props.updateWhileSliding ? wrappedOnChange : wrappedSetValReadout,
129
+ onChange: props.updateWhileSliding ? undefined : wrappedOnChange,
130
+ onStart: wrappedOnStart,
131
+ onEnd: wrappedOnEnd
132
+ }), props.max > 1 && /*#__PURE__*/React.createElement(Tooltip, {
133
+ placement: "top",
134
+ title: "Play through sequence",
135
+ trigger: ["hover", "focus"]
136
+ }, /*#__PURE__*/React.createElement(Button, {
137
+ className: "slider-play-button",
138
+ onClick: function onClick() {
139
+ return props.onTogglePlayback(!props.playing);
140
+ },
141
+ icon: props.playing ? /*#__PURE__*/React.createElement(PauseOutlined, null) : /*#__PURE__*/React.createElement(CaretRightOutlined, null),
142
+ "aria-label": (props.playing ? "Pause " : "Play ") + props.label
143
+ })));
144
+ };
145
+ var AxisClipSliders = function AxisClipSliders(props) {
146
+ var activeAxis = activeAxisMap[props.mode];
147
+ var pauseOnInput = function pauseOnInput(axis) {
148
+ // Pause on slider input unless user is scrubbing along the playing axis (playback is held while this is happening)
149
+ if (!props.playControls.playHolding || props.playingAxis !== axis) {
150
+ props.playControls.pause();
151
+ }
152
+ };
153
+ var updateRegion = function updateRegion(axis, minval, maxval) {
154
+ pauseOnInput(axis);
155
+ var changeViewerSetting = props.changeViewerSetting,
156
+ numSlices = props.numSlices;
157
+ // get a value from 0-1
158
+ var max = numSlices[axis];
159
+ var start = minval / max;
160
+ var end = maxval / max;
161
+ changeViewerSetting("region", _defineProperty({}, axis, [start, end]));
162
+ };
163
+ var updateSlice = function updateSlice(axis, slice) {
164
+ pauseOnInput(axis);
165
+ props.changeViewerSetting("slice", _defineProperty({}, axis, slice / props.numSlices[axis]));
166
+ };
167
+ var updateTime = function updateTime(time) {
168
+ pauseOnInput("t");
169
+ props.changeViewerSetting("time", time);
170
+ };
171
+
172
+ // Pause when view mode or volume size has changed
173
+ useEffect(function () {
174
+ return props.playControls.pause();
175
+ }, [props.mode, props.image]);
176
+ var handlePlayPause = function handlePlayPause(axis, willPlay) {
177
+ if (willPlay) {
178
+ props.playControls.play(axis);
179
+ } else {
180
+ props.playControls.pause();
181
+ }
182
+ };
183
+ var create2dAxisSlider = function create2dAxisSlider(axis) {
184
+ var numSlices = props.numSlices[axis];
185
+ var numSlicesLoaded = props.numSlicesLoaded[axis];
186
+ return /*#__PURE__*/React.createElement("div", {
187
+ key: axis + numSlices + numSlicesLoaded,
188
+ className: "slider-row slider-".concat(axis)
189
+ }, /*#__PURE__*/React.createElement(PlaySliderRow, {
190
+ label: axis.toUpperCase(),
191
+ val: Math.round(props.slices[axis] * numSlices),
192
+ max: numSlices,
193
+ onChange: function onChange(val) {
194
+ return updateSlice(axis, val);
195
+ },
196
+ onStart: function onStart() {
197
+ return props.playControls.startHold(axis);
198
+ },
199
+ onEnd: function onEnd() {
200
+ return props.playControls.endHold();
201
+ },
202
+ playing: props.playingAxis === axis,
203
+ onTogglePlayback: function onTogglePlayback(willPlay) {
204
+ return handlePlayPause(axis, willPlay);
205
+ },
206
+ updateWhileSliding: numSlices === numSlicesLoaded
207
+ }));
208
+ };
209
+ var create3dAxisSlider = function create3dAxisSlider(axis) {
210
+ var numSlices = props.numSlices[axis];
211
+ if (numSlices === 1) {
212
+ return null;
213
+ }
214
+ var region = props.region[axis];
215
+ return /*#__PURE__*/React.createElement("div", {
216
+ key: axis + numSlices + "3d",
217
+ className: "slider-row slider-".concat(axis)
218
+ }, /*#__PURE__*/React.createElement(SliderRow, {
219
+ label: axis.toUpperCase(),
220
+ vals: [Math.round(region[0] * numSlices), Math.round(region[1] * numSlices)],
221
+ max: numSlices,
222
+ onSlide: function onSlide(values) {
223
+ return updateRegion(axis, values[0], values[1]);
224
+ },
225
+ onStart: function onStart() {
226
+ return props.playControls.startHold(axis);
227
+ },
228
+ onEnd: function onEnd() {
229
+ return props.playControls.endHold();
230
+ }
231
+ }));
232
+ };
233
+ return /*#__PURE__*/React.createElement("div", {
234
+ className: activeAxis ? "clip-sliders clip-sliders-2d" : "clip-sliders"
235
+ }, /*#__PURE__*/React.createElement("span", {
236
+ className: "slider-group"
237
+ }, /*#__PURE__*/React.createElement("h4", {
238
+ className: "slider-group-title"
239
+ }, "ROI"), /*#__PURE__*/React.createElement("span", {
240
+ className: "slider-group-rows"
241
+ }, activeAxis ? create2dAxisSlider(activeAxis) : AXES.map(create3dAxisSlider))), props.numTimesteps > 1 && /*#__PURE__*/React.createElement("span", {
242
+ className: "slider-group"
243
+ }, /*#__PURE__*/React.createElement("h4", {
244
+ className: "slider-group-title"
245
+ }, "Time"), /*#__PURE__*/React.createElement("span", {
246
+ className: "slider-group-rows"
247
+ }, /*#__PURE__*/React.createElement("div", {
248
+ className: "slider-row slider-t"
249
+ }, /*#__PURE__*/React.createElement(PlaySliderRow, {
250
+ label: "",
251
+ val: props.time,
252
+ max: props.numTimesteps,
253
+ playing: props.playingAxis === "t",
254
+ onTogglePlayback: function onTogglePlayback(willPlay) {
255
+ return handlePlayPause("t", willPlay);
256
+ },
257
+ onChange: function onChange(time) {
258
+ return updateTime(time);
259
+ },
260
+ onStart: function onStart() {
261
+ return props.playControls.startHold("t");
262
+ },
263
+ onEnd: function onEnd() {
264
+ return props.playControls.endHold();
265
+ }
266
+ })))), props.numScenes > 1 && /*#__PURE__*/React.createElement("span", {
267
+ className: "slider-group"
268
+ }, /*#__PURE__*/React.createElement("h4", {
269
+ className: "slider-group-title"
270
+ }, "Scene"), /*#__PURE__*/React.createElement("span", {
271
+ className: "slider-group-rows"
272
+ }, /*#__PURE__*/React.createElement("div", {
273
+ className: "slider-row slider-scene"
274
+ }, /*#__PURE__*/React.createElement(SliderRow, {
275
+ label: "",
276
+ vals: [props.scene],
277
+ max: props.numScenes,
278
+ onChange: function onChange(_ref6) {
279
+ var _ref7 = _slicedToArray(_ref6, 1),
280
+ scene = _ref7[0];
281
+ return props.changeViewerSetting("scene", scene);
282
+ }
283
+ })))));
284
+ };
285
+ export default AxisClipSliders;
@@ -0,0 +1,257 @@
1
+ .clip-sliders{
2
+ --w-group-title:50px;
3
+ --w-axis-slider:480px;
4
+ --w-name:10px;
5
+ --w-values-3d:160px;
6
+ --w-values-2d:100px;
7
+ --w-play-button:28px;
8
+
9
+ --color-x:#ff4d4d;
10
+ --color-y:#61d900;
11
+ --color-z:#0099ff;
12
+ }
13
+
14
+ .clip-sliders .noUi-horizontal .noUi-handle{
15
+ box-shadow:none;
16
+ cursor:pointer;
17
+ pointer-events:inherit;
18
+ background-color:#a0a0a0;
19
+ top:0px;
20
+ left:100%;
21
+ z-index:1;
22
+ width:8px;
23
+ height:8px;
24
+ border:none;
25
+ border-radius:0;
26
+ transform:translate(-50%, calc(-100% - 4px));
27
+ }
28
+
29
+ .clip-sliders .noUi-handle::before{
30
+ display:none;
31
+ content:none;
32
+ }
33
+
34
+ .clip-sliders .noUi-handle::after{
35
+ background-color:inherit;
36
+ width:8px;
37
+ height:8px;
38
+ top:0;
39
+ left:0;
40
+ transform:matrix(0.5, 0.5, -0.5, 0.5, 0, 4);
41
+ content:"";
42
+ }
43
+
44
+ .clip-sliders .noUi-touch-area{
45
+ padding:8px;
46
+ margin-top:-4px;
47
+ margin-left:-4px;
48
+ }
49
+
50
+ .clip-sliders .noUi-connect{
51
+ background-color:#a0a0a0;
52
+ }
53
+
54
+ .clip-sliders .noUi-target.noUi-ltr.noUi-horizontal{
55
+ background-color:#a0a0a0;
56
+ }
57
+
58
+ .clip-sliders .noUi-horizontal{
59
+ height:2px;
60
+ }
61
+
62
+ .clip-sliders .noUi-target{
63
+ border:none;
64
+ box-shadow:none;
65
+ }
66
+
67
+ .clip-sliders .noUi-tooltip{
68
+ border:none;
69
+ background-color:transparent;
70
+ color:inherit;
71
+ font-size:10px;
72
+ top:calc(100% + 3px);
73
+ }
74
+
75
+ .clip-sliders{
76
+ max-width:calc(var(--w-group-title) + var(--w-axis-slider) + var(--w-name) + var(--w-values-3d) + 80px);
77
+ position:relative;
78
+ margin:auto;
79
+ left:0;
80
+ right:0;
81
+ padding:0 25px;
82
+ }
83
+
84
+ .clip-sliders .slider-group{
85
+ display:flex;
86
+ flex-wrap:nowrap;
87
+ }
88
+
89
+ .clip-sliders .slider-group:not(:last-child){
90
+ margin-bottom:8px;
91
+ }
92
+
93
+ .clip-sliders .slider-group .slider-group-title{
94
+ flex:0 0 var(--w-group-title);
95
+ margin:0;
96
+ }
97
+
98
+ .clip-sliders .slider-group .slider-group-rows{
99
+ flex:1 1 auto;
100
+ }
101
+
102
+ .clip-sliders .slider-row{
103
+ display:flex;
104
+ flex-wrap:wrap;
105
+ color:#bfbfbf;
106
+ margin-bottom:6px;
107
+ }
108
+
109
+ .clip-sliders .slider-row.slider-x .slider-name{
110
+ color:var(--color-x);
111
+ }
112
+
113
+ .clip-sliders .slider-row.slider-x .noUi-handle{
114
+ background-color:var(--color-x) !important;
115
+ }
116
+
117
+ .clip-sliders .slider-row.slider-y .slider-name{
118
+ color:var(--color-y);
119
+ }
120
+
121
+ .clip-sliders .slider-row.slider-y .noUi-handle{
122
+ background-color:var(--color-y) !important;
123
+ }
124
+
125
+ .clip-sliders .slider-row.slider-z .slider-name{
126
+ color:var(--color-z);
127
+ }
128
+
129
+ .clip-sliders .slider-row.slider-z .noUi-handle{
130
+ background-color:var(--color-z) !important;
131
+ }
132
+
133
+ .clip-sliders .slider-row.slider-t .slider-values{
134
+ flex:0 0 var(--w-values-2d);
135
+ }
136
+
137
+ .clip-sliders .axis-slider-container{
138
+ display:flex;
139
+ flex:1 1 auto;
140
+ align-items:center;
141
+ }
142
+
143
+ .clip-sliders .axis-slider{
144
+ flex:1 1 var(--w-axis-slider);
145
+ max-width:var(--w-axis-slider);
146
+ margin-top:0.5em;
147
+ }
148
+
149
+ .clip-sliders .slider-name,
150
+ .clip-sliders .slider-play-buttons{
151
+ margin-right:14px;
152
+ white-space:nowrap;
153
+ }
154
+
155
+ .clip-sliders .slider-name{
156
+ flex:0 0 var(--w-name);
157
+ font-weight:bold;
158
+ }
159
+
160
+ .clip-sliders .slider-values{
161
+ flex:0 0 var(--w-values-3d);
162
+ max-width:var(--w-values-3d);
163
+ margin-left:18px;
164
+ white-space:nowrap;
165
+ }
166
+
167
+ .clip-sliders .slider-play-buttons{
168
+ margin-top:2px;
169
+ }
170
+
171
+ .clip-sliders.clip-sliders-2d{
172
+ max-width:calc(
173
+ var(--w-group-title) + var(--w-axis-slider) + var(--w-name) + var(--w-values-2d) + var(--w-play-button) + 80px
174
+ );
175
+ }
176
+
177
+ .clip-sliders.clip-sliders-2d .slider-values{
178
+ flex:0 0 var(--w-values-2d);
179
+ }
180
+
181
+ .clip-sliders.clip-sliders-2d .axis-slider-container{
182
+ flex:0 1 calc(var(--w-axis-slider) + var(--w-name) + var(--w-values-2d) + 30px);
183
+ }
184
+
185
+ .clip-sliders .noUi-target{
186
+ height:3px;
187
+ background-color:rgba(160, 160, 160, 0.4) !important;
188
+ }
189
+
190
+ .clip-sliders .noUi-handle{
191
+ transform:translate(-50%, calc(-100% - 4px));
192
+ }
193
+
194
+ .clip-sliders .slider-single-handle .noUi-handle::before{
195
+ content:"";
196
+ display:block;
197
+ height:4px;
198
+ width:4px;
199
+ left:2px;
200
+ top:11px;
201
+ border-radius:50%;
202
+ background-color:#a0a0a0;
203
+ }
204
+
205
+ .clip-sliders .noUi-handle::after{
206
+ box-shadow:4px 4px 3px 0 rgba(0, 0, 0, 0.2);
207
+ }
208
+
209
+ .clip-sliders .noUi-pips{
210
+ padding:0;
211
+ height:0;
212
+ top:2px;
213
+ }
214
+
215
+ .clip-sliders .noUi-pips .noUi-marker-normal{
216
+ display:none;
217
+ }
218
+
219
+ .clip-sliders .noUi-pips .noUi-marker-large{
220
+ background-color:#4b4b4b;
221
+ height:9px;
222
+ bottom:-4px;
223
+ }
224
+
225
+ .clip-sliders .ant-btn.slider-play-button{
226
+ line-height:1;
227
+ height:23px;
228
+ width:var(--w-play-button);
229
+ color:#bfbfbf;
230
+ border-color:#4b4b4b !important;
231
+ background-color:transparent;
232
+ }
233
+
234
+ .clip-sliders .ant-btn.slider-play-button:hover{
235
+ background-color:rgba(160, 160, 160, 0.4);
236
+ }
237
+
238
+ .clip-sliders .ant-btn.slider-play-button:hover,
239
+ .clip-sliders .ant-btn.slider-play-button:focus{
240
+ color:white;
241
+ }
242
+
243
+ .clip-sliders .ant-btn.slider-play-button[ant-click-animating-without-extra-node="true"]::after{
244
+ box-shadow:none !important;
245
+ background-color:#aeacae;
246
+ }
247
+
248
+ @media only screen and (max-width: 500px){
249
+ .clip-sliders .slider-group{
250
+ display:none;
251
+ }
252
+
253
+ .clip-sliders::after{
254
+ content:"ROI clipping is not available at this size. Please try again with a larger viewport.";
255
+ font-style:italic;
256
+ }
257
+ }
@@ -0,0 +1,70 @@
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 { Button, Drawer } from "antd";
8
+ import React, { useEffect, useState } from "react";
9
+ import ViewerIcon from "../shared/ViewerIcon";
10
+ import "./styles.css";
11
+ var BottomPanel = function BottomPanel(_ref) {
12
+ var children = _ref.children,
13
+ title = _ref.title,
14
+ height = _ref.height,
15
+ onVisibleChange = _ref.onVisibleChange,
16
+ onVisibleChangeEnd = _ref.onVisibleChangeEnd;
17
+ var _useState = useState(true),
18
+ _useState2 = _slicedToArray(_useState, 2),
19
+ isVisible = _useState2[0],
20
+ setIsVisible = _useState2[1];
21
+
22
+ // Call `onVisibleChange` on mount
23
+ useEffect(function () {
24
+ onVisibleChange === null || onVisibleChange === void 0 || onVisibleChange(isVisible);
25
+ if (!isVisible) {
26
+ onVisibleChangeEnd === null || onVisibleChangeEnd === void 0 || onVisibleChangeEnd(isVisible);
27
+ }
28
+ }, []);
29
+
30
+ // Treat changes in height as a change in visibility if the panel is open
31
+ useEffect(function () {
32
+ onVisibleChange === null || onVisibleChange === void 0 || onVisibleChange(isVisible);
33
+ window.setTimeout(function () {
34
+ return onVisibleChangeEnd === null || onVisibleChangeEnd === void 0 ? void 0 : onVisibleChangeEnd(isVisible);
35
+ }, 300);
36
+ }, [height]);
37
+ var toggleDrawer = function toggleDrawer() {
38
+ setIsVisible(!isVisible);
39
+ if (onVisibleChange) {
40
+ onVisibleChange(!isVisible);
41
+ }
42
+ };
43
+ var optionsButton = /*#__PURE__*/React.createElement(Button, {
44
+ className: "options-button",
45
+ size: "small",
46
+ onClick: toggleDrawer
47
+ }, title || "Options", /*#__PURE__*/React.createElement(ViewerIcon, {
48
+ type: "closePanel",
49
+ className: "button-arrow",
50
+ style: {
51
+ fontSize: "15px"
52
+ }
53
+ }));
54
+ return /*#__PURE__*/React.createElement("div", {
55
+ className: "bottom-panel"
56
+ }, /*#__PURE__*/React.createElement(Drawer, {
57
+ className: "drawer",
58
+ placement: "bottom",
59
+ closable: false,
60
+ getContainer: false,
61
+ open: isVisible,
62
+ mask: false,
63
+ title: optionsButton,
64
+ afterOpenChange: onVisibleChangeEnd,
65
+ height: height !== null && height !== void 0 ? height : 190
66
+ }, /*#__PURE__*/React.createElement("div", {
67
+ className: "drawer-body-wrapper"
68
+ }, children)));
69
+ };
70
+ export default BottomPanel;