@aics/vole-app 3.1.1 → 3.2.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 (22) hide show
  1. package/es/aics-image-viewer/components/App/ChannelUpdater.js +17 -7
  2. package/es/aics-image-viewer/components/ChannelsWidget.js +81 -13
  3. package/es/aics-image-viewer/components/ChannelsWidgetRow/index.js +35 -20
  4. package/es/aics-image-viewer/components/ChannelsWidgetRow/styles.css +26 -14
  5. package/es/aics-image-viewer/components/{ColorPicker.js → ColorPicker/index.js} +16 -43
  6. package/es/aics-image-viewer/components/ColorPicker/styles.css +17 -0
  7. package/es/aics-image-viewer/components/ControlPanel/index.js +24 -7
  8. package/es/aics-image-viewer/components/ControlPanel/styles.css +70 -17
  9. package/es/aics-image-viewer/components/CustomizeWidget.js +6 -13
  10. package/es/aics-image-viewer/components/GlobalVolumeControls.js +1 -2
  11. package/es/aics-image-viewer/components/useVolume.js +9 -1
  12. package/es/aics-image-viewer/shared/constants.js +4 -1
  13. package/es/aics-image-viewer/shared/utils/sceneStore.js +9 -1
  14. package/es/aics-image-viewer/shared/utils/test/urlParsing.test.js +19 -3
  15. package/es/aics-image-viewer/shared/utils/urlParsing.js +22 -4
  16. package/es/aics-image-viewer/state/store.js +3 -1
  17. package/es/aics-image-viewer/state/test/reset.test.js +2 -0
  18. package/package.json +2 -2
  19. package/type-declarations/aics-image-viewer/components/{ColorPicker.d.ts → ColorPicker/index.d.ts} +2 -1
  20. package/type-declarations/aics-image-viewer/shared/constants.d.ts +1 -1
  21. package/type-declarations/aics-image-viewer/shared/utils/urlParsing.d.ts +7 -1
  22. package/type-declarations/aics-image-viewer/state/types.d.ts +2 -0
@@ -13,8 +13,9 @@ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length)
13
13
  import { Lut } from "@aics/vole-core";
14
14
  import { useEffect } from "react";
15
15
  import { useShallow } from "zustand/shallow";
16
+ import { SINGLE_CHANNEL_MODE_COLOR } from "../../shared/constants";
16
17
  import { binIndexedControlPointsToLut, rampToControlPoints } from "../../shared/utils/controlPointsToLut";
17
- import { useViewerState } from "../../state/store";
18
+ import { select, useViewerState } from "../../state/store";
18
19
  /**
19
20
  * A component that doesn't render anything, but reacts to the provided `ChannelState`
20
21
  * and keeps it in sync with the viewer.
@@ -28,6 +29,8 @@ var ChannelUpdater = function ChannelUpdater(_ref) {
28
29
  return state.channelSettings[index];
29
30
  });
30
31
  var channelState = useViewerState(channelStateSelector);
32
+ var singleChannelMode = useViewerState(select("singleChannelMode"));
33
+ var singleChannelIndex = useViewerState(select("singleChannelIndex"));
31
34
  var volumeEnabled = channelState.volumeEnabled,
32
35
  isosurfaceEnabled = channelState.isosurfaceEnabled,
33
36
  isovalue = channelState.isovalue,
@@ -50,17 +53,23 @@ var ChannelUpdater = function ChannelUpdater(_ref) {
50
53
  // enable/disable channel can't be dependent on channel load state because it may trigger the channel to load
51
54
  useEffect(function () {
52
55
  if (image) {
53
- view3d.setVolumeChannelEnabled(image, index, volumeEnabled);
56
+ var enabled = volumeEnabled;
57
+ if (singleChannelMode) {
58
+ // if this is the focused channel in single-channel mode, enable volume unless *only* isosurface is enabled
59
+ enabled = index === singleChannelIndex && !(!volumeEnabled && isosurfaceEnabled);
60
+ }
61
+ view3d.setVolumeChannelEnabled(image, index, enabled);
54
62
  view3d.updateLuts(image);
55
63
  }
56
- }, [image, volumeEnabled, index, view3d]);
64
+ }, [image, volumeEnabled, index, view3d, singleChannelMode, singleChannelIndex, isosurfaceEnabled]);
57
65
  useEffect(function () {
58
66
  if (image) {
67
+ var enabled = isosurfaceEnabled && (!singleChannelMode || singleChannelIndex === index);
59
68
  view3d.setVolumeChannelOptions(image, index, {
60
- isosurfaceEnabled: isosurfaceEnabled
69
+ isosurfaceEnabled: enabled
61
70
  });
62
71
  }
63
- }, [image, isosurfaceEnabled, index, view3d]);
72
+ }, [image, isosurfaceEnabled, index, view3d, singleChannelMode, singleChannelIndex]);
64
73
  useImageEffect(function (currentImage) {
65
74
  return view3d.setVolumeChannelOptions(currentImage, index, {
66
75
  isovalue: isovalue
@@ -72,11 +81,12 @@ var ChannelUpdater = function ChannelUpdater(_ref) {
72
81
  });
73
82
  }, [opacity, index, view3d]);
74
83
  useImageEffect(function (currentImage) {
84
+ var finalColor = singleChannelMode ? SINGLE_CHANNEL_MODE_COLOR : color;
75
85
  view3d.setVolumeChannelOptions(currentImage, index, {
76
- color: color
86
+ color: finalColor
77
87
  });
78
88
  view3d.updateLuts(currentImage);
79
- }, [color, index, view3d]);
89
+ }, [color, index, view3d, singleChannelMode]);
80
90
  var controlPoints = channelState.controlPoints,
81
91
  ramp = channelState.ramp,
82
92
  useControlPoints = channelState.useControlPoints;
@@ -1,13 +1,17 @@
1
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 _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
6
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
7
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
8
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
2
9
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
3
10
  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."); }
4
11
  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; } }
5
12
  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; }
6
13
  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; } }
7
14
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
8
- 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; }
9
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
10
- 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); }
11
15
  import { Collapse, List } from "antd";
12
16
  import React from "react";
13
17
  import { useShallow } from "zustand/shallow";
@@ -37,6 +41,66 @@ var ChannelsWidget = function ChannelsWidget(props) {
37
41
  var volumeEnabled = useViewerState(selectVolumeEnabled);
38
42
  var isosurfaceEnabled = useViewerState(selectIsosurfaceEnabled);
39
43
  var channelNames = useViewerState(selectNames);
44
+ var singleChannelMode = useViewerState(select("singleChannelMode"));
45
+ var singleChannelIndex = useViewerState(select("singleChannelIndex"));
46
+ var changeViewerSetting = useViewerState(select("changeViewerSetting"));
47
+ var _React$useState = React.useState([Object.keys(channelGroupedByType)[0]]),
48
+ _React$useState2 = _slicedToArray(_React$useState, 2),
49
+ openGroups = _React$useState2[0],
50
+ setOpenGroups = _React$useState2[1];
51
+ var collapseClass = singleChannelMode ? "single-channel-mode" : "";
52
+
53
+ // Switch between channels in single-channel mode with arrow keys
54
+ React.useEffect(function () {
55
+ if (singleChannelMode) {
56
+ var handleKeyPress = function handleKeyPress(_ref2) {
57
+ var key = _ref2.key;
58
+ // We only care about arrow keys!
59
+ if (!(key === "ArrowUp" || key === "ArrowDown" || key === "ArrowLeft" || key === "ArrowRight")) {
60
+ return;
61
+ }
62
+
63
+ // Only navigate with arrow keys if no unrelated input element has focus
64
+ // (special case for checkboxes: they don't use arrow keys, and the user just clicked one to enter this mode)
65
+ var _document = document,
66
+ activeEl = _document.activeElement,
67
+ body = _document.body;
68
+ if (activeEl !== body && !(activeEl instanceof HTMLInputElement && activeEl.type === "checkbox")) {
69
+ return;
70
+ }
71
+
72
+ // Channels appear in the order determined by grouping props, not index order
73
+ var channelGroups = Object.values(channelGroupedByType);
74
+ var channelOrder = channelGroups.flat();
75
+ var currentIndex = channelOrder.indexOf(singleChannelIndex);
76
+ var delta = key === "ArrowUp" || key === "ArrowLeft" ? -1 : 1;
77
+ var nextIndex = (currentIndex + channelOrder.length + delta) % channelOrder.length;
78
+ changeViewerSetting("singleChannelIndex", channelOrder[nextIndex]);
79
+
80
+ // Which group is the new channel in?
81
+ var nextGroupIndex = 0;
82
+ var accumulator = 0;
83
+ while (accumulator + channelGroups[nextGroupIndex].length <= nextIndex) {
84
+ accumulator += channelGroups[nextGroupIndex].length;
85
+ nextGroupIndex += 1;
86
+ }
87
+
88
+ // If the new channel is in a closed group, open it
89
+ var nextGroupName = Object.keys(channelGroupedByType)[nextGroupIndex];
90
+ setOpenGroups(function (currentOpenGroups) {
91
+ if (!currentOpenGroups.includes(nextGroupName)) {
92
+ return [].concat(_toConsumableArray(currentOpenGroups), [nextGroupName]);
93
+ }
94
+ return currentOpenGroups;
95
+ });
96
+ };
97
+ window.addEventListener("keydown", handleKeyPress);
98
+ return function () {
99
+ return window.removeEventListener("keydown", handleKeyPress);
100
+ };
101
+ }
102
+ return undefined;
103
+ }, [singleChannelMode, singleChannelIndex, channelGroupedByType, changeViewerSetting]);
40
104
  var createCheckboxHandler = function createCheckboxHandler(key) {
41
105
  return function (value, channelArray) {
42
106
  changeChannelSetting(channelArray, _defineProperty({}, key, value));
@@ -45,6 +109,9 @@ var ChannelsWidget = function ChannelsWidget(props) {
45
109
  var showVolumes = createCheckboxHandler("volumeEnabled");
46
110
  var showSurfaces = createCheckboxHandler("isosurfaceEnabled");
47
111
  var renderVisibilityControls = function renderVisibilityControls(channelArray) {
112
+ if (singleChannelMode) {
113
+ return null;
114
+ }
48
115
  var volChecked = [];
49
116
  var isoChecked = [];
50
117
  channelArray.forEach(function (channelIndex) {
@@ -81,16 +148,15 @@ var ChannelsWidget = function ChannelsWidget(props) {
81
148
  saveIsosurface: props.saveIsosurface
82
149
  }) : null;
83
150
  };
84
- var firstKey = Object.keys(channelGroupedByType)[0];
85
- var rows = channelDataChannels && Object.entries(channelGroupedByType).filter(function (_ref2) {
86
- var _ref3 = _slicedToArray(_ref2, 2),
87
- key = _ref3[0],
88
- channelArray = _ref3[1];
151
+ var rows = channelDataChannels && Object.entries(channelGroupedByType).filter(function (_ref3) {
152
+ var _ref4 = _slicedToArray(_ref3, 2),
153
+ key = _ref4[0],
154
+ channelArray = _ref4[1];
89
155
  return channelArray.length > 0 && (!filterFunc || filterFunc(key));
90
- }).map(function (_ref4) {
91
- var _ref5 = _slicedToArray(_ref4, 2),
92
- key = _ref5[0],
93
- channelArray = _ref5[1];
156
+ }).map(function (_ref5) {
157
+ var _ref6 = _slicedToArray(_ref5, 2),
158
+ key = _ref6[0],
159
+ channelArray = _ref6[1];
94
160
  var children = /*#__PURE__*/React.createElement(List, {
95
161
  itemLayout: "horizontal",
96
162
  dataSource: channelArray,
@@ -104,9 +170,11 @@ var ChannelsWidget = function ChannelsWidget(props) {
104
170
  };
105
171
  });
106
172
  return /*#__PURE__*/React.createElement(Collapse, {
173
+ className: collapseClass,
107
174
  bordered: false,
108
- defaultActiveKey: firstKey,
109
175
  items: rows,
176
+ activeKey: openGroups,
177
+ onChange: setOpenGroups,
110
178
  collapsible: "icon"
111
179
  });
112
180
  };
@@ -15,15 +15,25 @@ import "./styles.css";
15
15
  var ChannelsWidgetRow = function ChannelsWidgetRow(props) {
16
16
  var index = props.index,
17
17
  saveIsosurface = props.saveIsosurface;
18
- var _useState = useState(false),
19
- _useState2 = _slicedToArray(_useState, 2),
20
- controlsOpen = _useState2[0],
21
- setControlsOpen = _useState2[1];
22
18
  var changeChannelSetting = useViewerState(select("changeChannelSetting"));
19
+ var changeViewerSetting = useViewerState(select("changeViewerSetting"));
23
20
  var channelState = useViewerState(function (_ref) {
24
21
  var channelSettings = _ref.channelSettings;
25
22
  return channelSettings[props.index];
26
23
  });
24
+ var singleChannelMode = useViewerState(select("singleChannelMode"));
25
+ var singleChannelIndex = useViewerState(select("singleChannelIndex"));
26
+ var _useState = useState(false),
27
+ _useState2 = _slicedToArray(_useState, 2),
28
+ _controlsOpen = _useState2[0],
29
+ setControlsOpen = _useState2[1];
30
+ // Don't show controls in single-channel mode
31
+ var controlsOpen = _controlsOpen && !singleChannelMode;
32
+ var onClickChannel = useCallback(function () {
33
+ if (singleChannelMode) {
34
+ changeViewerSetting("singleChannelIndex", index);
35
+ }
36
+ }, [singleChannelMode, changeViewerSetting, index]);
27
37
  var changeSettingForThisChannel = useCallback(function (value) {
28
38
  return changeChannelSetting(index, value);
29
39
  }, [changeChannelSetting, index]);
@@ -58,7 +68,12 @@ var ChannelsWidgetRow = function ChannelsWidgetRow(props) {
58
68
  width: 18
59
69
  });
60
70
  };
61
- var visibilityControls = /*#__PURE__*/React.createElement("div", {
71
+ var thisChannelOnly = singleChannelMode && singleChannelIndex === index;
72
+ var visibilityControls = singleChannelMode ? /*#__PURE__*/React.createElement("div", {
73
+ className: "channel-visibility-controls".concat(thisChannelOnly ? " single-channel" : "")
74
+ }, /*#__PURE__*/React.createElement("span", {
75
+ className: "single-channel-text"
76
+ }, thisChannelOnly ? "Showing this volume only" : "")) : /*#__PURE__*/React.createElement("div", {
62
77
  className: "channel-visibility-controls"
63
78
  }, /*#__PURE__*/React.createElement(Checkbox, {
64
79
  checked: channelState.volumeEnabled,
@@ -79,7 +94,16 @@ var ChannelsWidgetRow = function ChannelsWidgetRow(props) {
79
94
  title: "Open channel settings",
80
95
  type: "text"
81
96
  }));
82
- var createTFEditor = function createTFEditor() {
97
+ var renderControls = function renderControls() {
98
+ var showEditor = singleChannelMode ? singleChannelIndex === index : channelState.volumeEnabled || channelState.isosurfaceEnabled;
99
+ if (!showEditor) {
100
+ return /*#__PURE__*/React.createElement("h4", {
101
+ style: {
102
+ fontStyle: "italic"
103
+ }
104
+ }, "Not currently visible");
105
+ }
106
+
83
107
  // TODO this is most of `channelState`... should `TfEditor` just get `channelState`?
84
108
  var controlPoints = channelState.controlPoints,
85
109
  colorizeEnabled = channelState.colorizeEnabled,
@@ -105,25 +129,16 @@ var ChannelsWidgetRow = function ChannelsWidgetRow(props) {
105
129
  keepIntensityRange: channelState.keepIntensityRange,
106
130
  isovalue: isovalue,
107
131
  opacity: channelState.opacity,
108
- volumeEnabled: channelState.volumeEnabled,
109
- isosurfaceEnabled: channelState.isosurfaceEnabled,
132
+ volumeEnabled: singleChannelMode ? singleChannelIndex === index : channelState.volumeEnabled,
133
+ isosurfaceEnabled: channelState.isosurfaceEnabled && !singleChannelMode,
110
134
  saveIsosurface: saveThisIsosurface
111
135
  });
112
136
  };
113
- var renderControls = function renderControls() {
114
- if (!channelState.volumeEnabled && !channelState.isosurfaceEnabled) {
115
- return /*#__PURE__*/React.createElement("h4", {
116
- style: {
117
- fontStyle: "italic"
118
- }
119
- }, "Not currently visible");
120
- }
121
- return /*#__PURE__*/React.createElement(React.Fragment, null, (channelState.volumeEnabled || channelState.isosurfaceEnabled) && createTFEditor());
122
- };
123
- var rowClass = controlsOpen ? "channel-row" : "channel-row controls-closed";
137
+ var rowClass = "channel-row".concat(controlsOpen ? "" : " controls-closed").concat(thisChannelOnly ? " single-channel" : "");
124
138
  return /*#__PURE__*/React.createElement(List.Item, {
125
139
  key: index,
126
- className: rowClass
140
+ className: rowClass,
141
+ onClick: onClickChannel
127
142
  }, /*#__PURE__*/React.createElement(List.Item.Meta, {
128
143
  title: props.name,
129
144
  avatar: createColorPicker()
@@ -1,25 +1,23 @@
1
- .channel-rows-list .ant-list-item.channel-row{
2
- padding:22px 0;
3
- border-bottom:1px solid var(--color-controlpanel-border);
4
- flex-flow:row wrap;
5
- }
6
-
7
- .channel-rows-list .ant-list-item.channel-row .ant-list-item-meta-title,
8
- .channel-rows-list .ant-list-item.channel-row .ant-checkbox-wrapper{
1
+ .control-panel-content .ant-list-item.channel-row .ant-list-item-meta-title,
2
+ .control-panel-content .ant-list-item.channel-row .ant-checkbox-wrapper{
9
3
  color:var(--color-controlpanel-text);
10
4
  }
11
5
 
12
- .channel-rows-list .ant-list-item.channel-row .ant-btn-text{
6
+ .control-panel-content .ant-list-item.channel-row .ant-list-item-meta{
7
+ align-items:center;
8
+ }
9
+
10
+ .control-panel-content .ant-list-item.channel-row .ant-btn-text{
13
11
  color:var(--color-button-icon-activated-text);
14
12
  transition:color 0.3s;
15
13
  }
16
14
 
17
- .channel-rows-list .ant-list-item.channel-row .ant-btn-text:hover,
18
- .channel-rows-list .ant-list-item.channel-row .ant-btn-text:focus-visible{
15
+ .control-panel-content .ant-list-item.channel-row .ant-btn-text:hover,
16
+ .control-panel-content .ant-list-item.channel-row .ant-btn-text:focus-visible{
19
17
  color:var(--color-button-tertiary-hover-text) !important;
20
18
  }
21
19
 
22
- .channel-rows-list .ant-list-item.channel-row .button-row{
20
+ .control-panel-content .ant-list-item.channel-row .button-row{
23
21
  margin-top:16px;
24
22
  display:flex;
25
23
  justify-content:start;
@@ -27,10 +25,24 @@
27
25
  gap:5px;
28
26
  }
29
27
 
30
- .channel-rows-list .ant-list-item.channel-row .button-row .ant-btn.ant-btn-sm{
28
+ .control-panel-content .ant-list-item.channel-row .button-row .ant-btn.ant-btn-sm{
31
29
  padding:12px 8px;
32
30
  }
33
31
 
34
- .channel-rows-list .ant-list-item.channel-row.controls-closed .ant-btn-text:not(:focus-visible){
32
+ .control-panel-content .ant-list-item.channel-row.controls-closed .ant-btn-text:not(:focus-visible){
35
33
  color:var(--color-controlpanel-text);
36
34
  }
35
+
36
+ .control-panel-content .ant-list-item.channel-row.single-channel{
37
+ background-color:var(--color-button-primary-bg);
38
+ }
39
+
40
+ .control-panel-content .ant-list-item.channel-row.single-channel .channel-visibility-controls,
41
+ .control-panel-content .ant-list-item.channel-row.single-channel .ant-list-item-meta-title{
42
+ color:var(--color-button-primary-text);
43
+ font-weight:600;
44
+ }
45
+
46
+ .control-panel-content .ant-list-item.channel-row.single-channel .color-picker .color-picker-swatch{
47
+ border-color:var(--color-button-primary-text);
48
+ }
@@ -1,9 +1,3 @@
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 ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
- 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; }
5
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
6
- 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); }
7
1
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
8
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."); }
9
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; } }
@@ -13,6 +7,8 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
13
7
  import { map } from "lodash";
14
8
  import React from "react";
15
9
  import { SketchPicker } from "react-color";
10
+ import "./styles.css";
11
+
16
12
  // if there are fewer than this many screen pixels below the swatch but more above, open above the swatch
17
13
  var OPEN_ABOVE_MARGIN = 310;
18
14
  var DEFAULT_COLOR = {
@@ -61,29 +57,31 @@ var ColorPicker = function ColorPicker(props) {
61
57
  }, [props.color]);
62
58
  var width = props.width || 36;
63
59
  var popoverDirectionStyle = openAboveSwatch ? {
64
- bottom: "21px"
60
+ bottom: "18px"
65
61
  } : {
66
- top: "0px"
62
+ top: "3px"
67
63
  };
68
- return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
69
- style: STYLES.swatch,
70
- ref: swatchRef,
71
- onClick: handleClick
64
+ return /*#__PURE__*/React.createElement("div", {
65
+ className: "color-picker"
72
66
  }, /*#__PURE__*/React.createElement("div", {
73
- style: _objectSpread(_objectSpread({}, STYLES.color), {}, {
67
+ ref: swatchRef,
68
+ onClick: handleClick,
69
+ className: "color-picker-swatch",
70
+ style: {
74
71
  width: "".concat(width, "px"),
75
72
  background: "rgba(".concat(map(currentColor, function (ele) {
76
73
  return ele;
77
74
  }), ")")
78
- })
79
- })), /*#__PURE__*/React.createElement("div", {
75
+ }
76
+ }), /*#__PURE__*/React.createElement("div", {
80
77
  style: {
81
78
  position: "absolute"
82
79
  }
83
80
  }, isOpen ? /*#__PURE__*/React.createElement("div", {
84
- style: _objectSpread(_objectSpread({}, STYLES.popover), popoverDirectionStyle)
81
+ className: "color-picker-popover",
82
+ style: popoverDirectionStyle
85
83
  }, /*#__PURE__*/React.createElement("div", {
86
- style: STYLES.cover,
84
+ className: "color-picker-cover",
87
85
  onClick: handleClose
88
86
  }), /*#__PURE__*/React.createElement(SketchPicker, {
89
87
  color: currentColor,
@@ -92,29 +90,4 @@ var ColorPicker = function ColorPicker(props) {
92
90
  disableAlpha: props.disableAlpha
93
91
  })) : null));
94
92
  };
95
- export default ColorPicker;
96
- var STYLES = {
97
- color: {
98
- height: "14px",
99
- margin: "3px",
100
- borderRadius: "2px"
101
- },
102
- swatch: {
103
- borderRadius: "3px",
104
- border: "1px solid var(--color-controlpanel-border)",
105
- display: "inline-block",
106
- cursor: "pointer",
107
- verticalAlign: "middle"
108
- },
109
- popover: {
110
- position: "absolute",
111
- zIndex: "9999"
112
- },
113
- cover: {
114
- position: "fixed",
115
- top: "0px",
116
- right: "0px",
117
- bottom: "0px",
118
- left: "0px"
119
- }
120
- };
93
+ export default ColorPicker;
@@ -0,0 +1,17 @@
1
+ .color-picker .color-picker-swatch{
2
+ height:15px;
3
+ border-radius:3px;
4
+ border:1px solid var(--color-controlpanel-border);
5
+ cursor:pointer;
6
+ }
7
+ .color-picker .color-picker-popover{
8
+ position:absolute;
9
+ z-index:9999;
10
+ }
11
+ .color-picker .color-picker-cover{
12
+ position:fixed;
13
+ top:0;
14
+ right:0;
15
+ bottom:0;
16
+ left:0;
17
+ }
@@ -9,7 +9,7 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
9
9
  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; }
10
10
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
11
11
  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); }
12
- import { Button, Collapse, Dropdown, Flex, Tooltip } from "antd";
12
+ import { Button, Checkbox, Collapse, Dropdown, Flex, Tooltip } from "antd";
13
13
  import React from "react";
14
14
  import { PRESET_COLOR_MAP } from "../../shared/constants";
15
15
  import { select, useViewerState } from "../../state/store";
@@ -25,7 +25,7 @@ var ControlTab = /*#__PURE__*/function (ControlTab) {
25
25
  ControlTab[ControlTab["Metadata"] = 2] = "Metadata";
26
26
  return ControlTab;
27
27
  }(ControlTab || {});
28
- var ControlTabNames = _defineProperty(_defineProperty(_defineProperty({}, ControlTab.Channels, "Channel Settings"), ControlTab.Advanced, "Advanced Settings"), ControlTab.Metadata, "Metadata");
28
+ var ControlTabNames = _defineProperty(_defineProperty(_defineProperty({}, ControlTab.Channels, "Channel settings"), ControlTab.Advanced, "Advanced settings"), ControlTab.Metadata, "Metadata");
29
29
  function ControlPanel(props) {
30
30
  var _React$useState = React.useState(ControlTab.Channels),
31
31
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -36,6 +36,8 @@ function ControlPanel(props) {
36
36
  props.setCollapsed(false);
37
37
  };
38
38
  var resetToDefaultViewerState = useViewerState(select("resetToDefaultViewerState"));
39
+ var singleChannelMode = useViewerState(select("singleChannelMode"));
40
+ var changeViewerSetting = useViewerState(select("changeViewerSetting"));
39
41
  var controlPanelContainerRef = React.useRef(null);
40
42
  var getDropdownContainer = controlPanelContainerRef.current ? function () {
41
43
  return controlPanelContainerRef.current;
@@ -50,7 +52,7 @@ function ControlPanel(props) {
50
52
  var key = _ref.key;
51
53
  return props.onApplyColorPresets(PRESET_COLOR_MAP[key].colors);
52
54
  };
53
- var renderColorPresetsDropdown = function renderColorPresetsDropdown() {
55
+ var renderChannelSettingsHeader = function renderChannelSettingsHeader() {
54
56
  var dropDownMenuProps = {
55
57
  items: PRESET_COLOR_MAP.map(function (preset, index) {
56
58
  return {
@@ -60,8 +62,9 @@ function ControlPanel(props) {
60
62
  }),
61
63
  onClick: makeTurnOnPresetFn
62
64
  };
65
+ var singleChannelTitle = singleChannelMode ? "Turn off single channel mode" : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", null, "Turn on single channel mode"), /*#__PURE__*/React.createElement("div", null, "Use arrow keys to navigate"));
63
66
  return /*#__PURE__*/React.createElement("div", {
64
- className: "color-presets-dropdown"
67
+ className: "channel-settings-header"
65
68
  }, /*#__PURE__*/React.createElement(Dropdown, {
66
69
  trigger: ["click"],
67
70
  menu: dropDownMenuProps,
@@ -78,7 +81,21 @@ function ControlPanel(props) {
78
81
  style: {
79
82
  fontSize: "14px"
80
83
  }
81
- })))));
84
+ })))), /*#__PURE__*/React.createElement("div", {
85
+ style: {
86
+ alignSelf: "end",
87
+ width: "40%"
88
+ }
89
+ }, /*#__PURE__*/React.createElement(Tooltip, {
90
+ title: singleChannelTitle
91
+ }, /*#__PURE__*/React.createElement(Checkbox, {
92
+ name: "Single channel mode",
93
+ checked: singleChannelMode,
94
+ onChange: function onChange(_ref2) {
95
+ var target = _ref2.target;
96
+ return changeViewerSetting("singleChannelMode", target.checked);
97
+ }
98
+ }, "Single channel mode"))));
82
99
  };
83
100
  var renderTab = function renderTab(thisTab, icon) {
84
101
  return /*#__PURE__*/React.createElement(Tooltip, _extends({
@@ -164,8 +181,8 @@ function ControlPanel(props) {
164
181
  }
165
182
  }, /*#__PURE__*/React.createElement("h2", {
166
183
  className: "control-panel-title"
167
- }, ControlTabNames[tab]), visibleControls.colorPresetsDropdown && tab === ControlTab.Channels && renderColorPresetsDropdown(), hasImage && /*#__PURE__*/React.createElement("div", {
168
- className: "channel-rows-list"
184
+ }, ControlTabNames[tab]), visibleControls.colorPresetsDropdown && tab === ControlTab.Channels && renderChannelSettingsHeader(), hasImage && /*#__PURE__*/React.createElement("div", {
185
+ className: "control-panel-content"
169
186
  }, tab === ControlTab.Channels && /*#__PURE__*/React.createElement(ChannelsWidget, {
170
187
  channelDataChannels: props.channelDataChannels,
171
188
  channelGroupedByType: props.channelGroupedByType,
@@ -8,6 +8,10 @@
8
8
  border-right:1px solid var(--color-controlpanel-border);
9
9
  }
10
10
 
11
+ .control-panel-col-container .ant-checkbox-wrapper{
12
+ align-items:center;
13
+ }
14
+
11
15
  .control-panel-col-container .control-panel-tab-col{
12
16
  text-align:center;
13
17
  }
@@ -64,38 +68,47 @@
64
68
  font-size:1.4em;
65
69
  }
66
70
 
67
- .control-panel-col-container .control-panel-col .color-presets-dropdown{
71
+ .control-panel-col-container .control-panel-col .channel-settings-header{
68
72
  margin:0 16px 16px;
73
+ display:flex;
74
+ justify-content:space-between;
69
75
  }
70
76
 
71
- .control-panel-col-container .control-panel-col .channel-rows-list{
72
- border-top:1px solid var(--color-controlpanel-border);
73
- }
74
-
75
- .control-panel-col-container .control-panel-col .channel-rows-list .ant-list-item-meta{
76
- align-items:center;
77
+ .control-panel-col-container .control-panel-col .channel-settings-header .ant-checkbox-wrapper{
78
+ color:var(--color-controlpanel-text);
77
79
  }
78
80
 
79
- .control-panel-col-container .control-panel-col .channel-rows-list .ant-list-item-meta .ant-list-item-meta-title{
80
- margin:0;
81
- }
81
+ .control-panel-col-container .control-panel-col .ant-checkbox-wrapper:hover .ant-checkbox-inner{
82
+ border-color:white;
83
+ }
82
84
 
83
- .control-panel-col-container .control-panel-col .channel-rows-list .ant-checkbox-wrapper:hover .ant-checkbox-inner{
84
- border-color:white;
85
+ .control-panel-col-container .control-panel-col .control-panel-content{
86
+ border-top:1px solid var(--color-controlpanel-border);
87
+ }
88
+
89
+ .control-panel-col-container .control-panel-col .control-panel-content .ant-list-item-meta .ant-list-item-meta-title{
90
+ margin:0;
85
91
  }
86
92
 
87
- .control-panel-col-container .control-panel-col .channel-rows-list .channel-visibility-controls,
88
- .control-panel-col-container .control-panel-col .channel-rows-list .ant-collapse-extra{
93
+ .control-panel-col-container .control-panel-col .control-panel-content .channel-visibility-controls,
94
+ .control-panel-col-container .control-panel-col .control-panel-content .ant-collapse-extra{
89
95
  width:40%;
90
96
  display:flex;
91
97
  }
92
98
 
93
- .control-panel-col-container .control-panel-col .channel-rows-list .channel-visibility-controls .ant-checkbox-wrapper, .control-panel-col-container .control-panel-col .channel-rows-list .ant-collapse-extra .ant-checkbox-wrapper{
99
+ .control-panel-col-container .control-panel-col .control-panel-content .channel-visibility-controls .ant-checkbox-wrapper,
100
+ .control-panel-col-container .control-panel-col .control-panel-content .channel-visibility-controls .single-channel-text,
101
+ .control-panel-col-container .control-panel-col .control-panel-content .ant-collapse-extra .ant-checkbox-wrapper,
102
+ .control-panel-col-container .control-panel-col .control-panel-content .ant-collapse-extra .single-channel-text{
94
103
  flex:4;
95
104
  }
96
105
 
97
- .control-panel-col-container .control-panel-col .channel-rows-list .ant-collapse-content-box{
98
- padding:0 16px;
106
+ .control-panel-col-container .control-panel-col .control-panel-content .channel-visibility-controls .single-channel-text{
107
+ font-size:11px;
108
+ }
109
+
110
+ .control-panel-col-container .control-panel-col .control-panel-content .ant-collapse-content-box{
111
+ padding:0;
99
112
  }
100
113
 
101
114
  .control-panel-col-container .control-panel-col .ant-collapse{
@@ -107,6 +120,46 @@
107
120
  background-color:var(--color-controlpanel-section-bg);
108
121
  }
109
122
 
123
+ .control-panel-col-container .control-panel-col .ant-collapse.single-channel-mode .ant-list{
124
+ cursor:pointer;
125
+ }
126
+
127
+ .control-panel-col-container .control-panel-col .ant-collapse .ant-collapse-item:not(.ant-collapse-item-active):last-child{
128
+ border-bottom:1px solid var(--color-controlpanel-border);
129
+ }
130
+
131
+ .control-panel-col-container .control-panel-col .ant-list-item,
132
+ .control-panel-col-container .control-panel-col .color-picker-row{
133
+ padding:0 16px;
134
+ border-bottom:none;
135
+ display:flex;
136
+ flex-flow:row wrap;
137
+ color:var(--color-controlpanel-text);
138
+ }
139
+
140
+ .control-panel-col-container .control-panel-col .ant-list-item::after, .control-panel-col-container .control-panel-col .color-picker-row::after{
141
+ content:"";
142
+ margin-top:22px;
143
+ width:100%;
144
+ border-bottom:1px solid var(--color-controlpanel-border);
145
+ }
146
+
147
+ .control-panel-col-container .control-panel-col .ant-list-item{
148
+ padding-top:22px;
149
+ }
150
+
151
+ .control-panel-col-container .control-panel-col .ant-list-item::after{
152
+ margin-top:22px;
153
+ }
154
+
155
+ .control-panel-col-container .control-panel-col .color-picker-row{
156
+ padding-top:16px;
157
+ }
158
+
159
+ .control-panel-col-container .control-panel-col .color-picker-row::after{
160
+ margin-top:16px;
161
+ }
162
+
110
163
  .control-panel-col-container .control-panel-col .noUi-horizontal .noUi-handle{
111
164
  box-shadow:none;
112
165
  cursor:pointer;
@@ -7,9 +7,13 @@ var ColorPickerRow = function ColorPickerRow(_ref) {
7
7
  _onColorChange = _ref.onColorChange,
8
8
  children = _ref.children;
9
9
  return /*#__PURE__*/React.createElement("div", {
10
- style: STYLES.colorPickerRow
10
+ className: "color-picker-row"
11
11
  }, /*#__PURE__*/React.createElement("span", {
12
- style: STYLES.colorPicker
12
+ style: {
13
+ marginRight: "16px",
14
+ display: "flex",
15
+ alignItems: "center"
16
+ }
13
17
  }, /*#__PURE__*/React.createElement(ColorPicker, {
14
18
  color: colorArrayToObject(color),
15
19
  onColorChange: function onColorChange(color) {
@@ -36,15 +40,4 @@ var CustomizeWidget = function CustomizeWidget(props) {
36
40
  }
37
41
  }, "Bounding box color", !showBoundingBox && /*#__PURE__*/React.createElement("i", null, " - bounding box turned off")));
38
42
  };
39
- var STYLES = {
40
- colorPickerRow: {
41
- padding: "14px 0",
42
- display: "flex",
43
- borderBottom: "1px solid #6e6e6e",
44
- color: "var(--color-controlpanel-text)"
45
- },
46
- colorPicker: {
47
- marginRight: "16px"
48
- }
49
- };
50
43
  export default CustomizeWidget;
@@ -24,8 +24,7 @@ var GlobalVolumeControls = function GlobalVolumeControls(props) {
24
24
  var showControls = props.visibleControls;
25
25
  return /*#__PURE__*/React.createElement("div", {
26
26
  style: {
27
- paddingTop: 18,
28
- paddingBottom: 22
27
+ padding: "18px 16px 22px"
29
28
  }
30
29
  }, showControls.alphaMaskSlider && createSliderRow("mask cell", maskAlpha, 100, "maskAlpha"), showControls.brightnessSlider && createSliderRow("brightness", brightness, 100, "brightness"), showControls.densitySlider && createSliderRow("density", density, 100, "density"), showControls.levelsSliders && createSliderRow("levels", levels, 255, "levels"), showControls.interpolationControl && /*#__PURE__*/React.createElement(SliderRow, {
31
30
  label: "interpolate",
@@ -1,5 +1,13 @@
1
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 _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
2
+ function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
3
+ function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
4
+ function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
5
+ function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
6
+ function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise); }
7
+ function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); }
8
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
9
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
10
+ function _OverloadYield(e, d) { this.v = e, this.k = d; }
3
11
  function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
4
12
  function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
5
13
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -25,7 +25,8 @@ export var
25
25
  LEVELS_SLIDER_DEFAULT = [35.0, 140.0, 255.0],
26
26
  INTERPOLATION_ENABLED_DEFAULT = true,
27
27
  OTHER_CHANNEL_KEY = "Other",
28
- SINGLE_GROUP_CHANNEL_KEY = "Channels";
28
+ SINGLE_GROUP_CHANNEL_KEY = "Channels",
29
+ SINGLE_CHANNEL_MODE_COLOR = [255, 255, 255];
29
30
  export var TFEDITOR_DEFAULT_COLOR = [255, 255, 255];
30
31
  export var TFEDITOR_MAX_BIN = 255;
31
32
  export var CACHE_MAX_SIZE = 1000000000;
@@ -163,6 +164,8 @@ export var getDefaultViewerState = function getDefaultViewerState() {
163
164
  },
164
165
  time: 0,
165
166
  scene: 0,
167
+ singleChannelMode: false,
168
+ singleChannelIndex: 0,
166
169
  // Do not override camera position, target, etc. by default;
167
170
  // instead, let the viewer apply default camera settings based on the view mode.
168
171
  // This prevents a bug where the camera's position and view mode are set to
@@ -1,4 +1,12 @@
1
- function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
1
+ function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
2
+ function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
3
+ function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
4
+ function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
5
+ function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise); }
6
+ function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); }
7
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
8
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
9
+ function _OverloadYield(e, d) { this.v = e, this.k = d; }
2
10
  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); }
3
11
  function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
4
12
  function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
@@ -1,6 +1,14 @@
1
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
2
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
3
- function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
3
+ function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
4
+ function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
5
+ function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
6
+ function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
7
+ function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise); }
8
+ function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); }
9
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
10
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
11
+ function _OverloadYield(e, d) { this.v = e, this.k = d; }
4
12
  function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
5
13
  function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
6
14
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
@@ -428,7 +436,9 @@ describe("Viewer state", function () {
428
436
  },
429
437
  time: 0,
430
438
  scene: 0,
431
- cameraState: undefined
439
+ cameraState: undefined,
440
+ singleChannelMode: false,
441
+ singleChannelIndex: 0
432
442
  };
433
443
  var SERIALIZED_DEFAULT_VIEWER_STATE = {
434
444
  mode: "volumetric",
@@ -447,7 +457,9 @@ describe("Viewer state", function () {
447
457
  reg: "0:1,0:1,0:1",
448
458
  slice: "0.5,0.5,0.5",
449
459
  t: "0",
450
- scene: "0"
460
+ scene: "0",
461
+ scm: "0",
462
+ sci: "0"
451
463
  };
452
464
  var CUSTOM_VIEWER_STATE = {
453
465
  renderMode: RenderMode.pathTrace,
@@ -475,6 +487,8 @@ describe("Viewer state", function () {
475
487
  },
476
488
  time: 100,
477
489
  scene: 3,
490
+ singleChannelMode: true,
491
+ singleChannelIndex: 3,
478
492
  cameraState: {
479
493
  position: [-1.05, -4, 45],
480
494
  target: [0, 0, 0],
@@ -501,6 +515,8 @@ describe("Viewer state", function () {
501
515
  slice: "0.25,0.75,0.5",
502
516
  t: "100",
503
517
  scene: "3",
518
+ scm: "1",
519
+ sci: "3",
504
520
  cam: "pos:-1.05:-4:45,tar:0:0:0,up:0:1:0,ort:3.534,fov:43.5"
505
521
  };
506
522
  describe("serializeViewerState", function () {
@@ -1,6 +1,14 @@
1
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
- var _ViewerChannelSetting, _ViewerChannelSetting2, _ViewerChannelSetting3, _ViewerChannelSetting4, _ViewerChannelSetting5, _ViewerChannelSetting6, _ViewerChannelSetting7, _ViewerChannelSetting8, _ViewerChannelSetting9, _ViewerChannelSetting10, _ViewerChannelSetting11, _ViewerChannelSetting12, _ViewerChannelSetting13, _ViewerChannelSetting14, _ViewerStateKeys$View, _ViewerStateKeys$Mode, _ViewerStateKeys$Mask, _ViewerStateKeys$Imag, _ViewerStateKeys$Axes, _ViewerStateKeys$Boun, _ViewerStateKeys$Boun2, _ViewerStateKeys$Back, _ViewerStateKeys$Auto, _ViewerStateKeys$Brig, _ViewerStateKeys$Dens, _ViewerStateKeys$Leve, _ViewerStateKeys$Inte, _ViewerStateKeys$Regi, _ViewerStateKeys$Slic, _ViewerStateKeys$Time, _ViewerStateKeys$Scen, _ViewerStateKeys$Came;
3
- function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
2
+ var _ViewerChannelSetting, _ViewerChannelSetting2, _ViewerChannelSetting3, _ViewerChannelSetting4, _ViewerChannelSetting5, _ViewerChannelSetting6, _ViewerChannelSetting7, _ViewerChannelSetting8, _ViewerChannelSetting9, _ViewerChannelSetting10, _ViewerChannelSetting11, _ViewerChannelSetting12, _ViewerChannelSetting13, _ViewerChannelSetting14, _ViewerStateKeys$View, _ViewerStateKeys$Mode, _ViewerStateKeys$Mask, _ViewerStateKeys$Imag, _ViewerStateKeys$Axes, _ViewerStateKeys$Boun, _ViewerStateKeys$Sing, _ViewerStateKeys$Sing2, _ViewerStateKeys$Boun2, _ViewerStateKeys$Back, _ViewerStateKeys$Auto, _ViewerStateKeys$Brig, _ViewerStateKeys$Dens, _ViewerStateKeys$Leve, _ViewerStateKeys$Inte, _ViewerStateKeys$Regi, _ViewerStateKeys$Slic, _ViewerStateKeys$Time, _ViewerStateKeys$Scen, _ViewerStateKeys$Came;
3
+ function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
4
+ function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
5
+ function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
6
+ function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
7
+ function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise); }
8
+ function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); }
9
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
10
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
11
+ function _OverloadYield(e, d) { this.v = e, this.k = d; }
4
12
  function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
5
13
  function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
6
14
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -103,6 +111,8 @@ export var ViewerStateKeys = /*#__PURE__*/function (ViewerStateKeys) {
103
111
  ViewerStateKeys["Time"] = "t";
104
112
  ViewerStateKeys["Scene"] = "scene";
105
113
  ViewerStateKeys["CameraState"] = "cam";
114
+ ViewerStateKeys["SingleChannelMode"] = "scm";
115
+ ViewerStateKeys["SingleChannelIndex"] = "sci";
106
116
  return ViewerStateKeys;
107
117
  }({});
108
118
  export var CameraTransformKeys = /*#__PURE__*/function (CameraTransformKeys) {
@@ -249,6 +259,8 @@ _ViewerStateKeys$Mask = ViewerStateKeys.Mask;
249
259
  _ViewerStateKeys$Imag = ViewerStateKeys.Image;
250
260
  _ViewerStateKeys$Axes = ViewerStateKeys.Axes;
251
261
  _ViewerStateKeys$Boun = ViewerStateKeys.BoundingBox;
262
+ _ViewerStateKeys$Sing = ViewerStateKeys.SingleChannelMode;
263
+ _ViewerStateKeys$Sing2 = ViewerStateKeys.SingleChannelIndex;
252
264
  _ViewerStateKeys$Boun2 = ViewerStateKeys.BoundingBoxColor;
253
265
  _ViewerStateKeys$Back = ViewerStateKeys.BackgroundColor;
254
266
  _ViewerStateKeys$Auto = ViewerStateKeys.Autorotate;
@@ -279,6 +291,10 @@ export var ViewerStateParams = /*#__PURE__*/_createClass(function ViewerStatePar
279
291
  _defineProperty(this, _ViewerStateKeys$Axes, undefined);
280
292
  /** Whether to show the bounding box. "1" is enabled. Disabled by default. */
281
293
  _defineProperty(this, _ViewerStateKeys$Boun, undefined);
294
+ /** Whether single-channel mode is active. "1" is active. Inactive by default. */
295
+ _defineProperty(this, _ViewerStateKeys$Sing, undefined);
296
+ /** If single-channel mode is active, which channel index is shown. Defaults to 0. */
297
+ _defineProperty(this, _ViewerStateKeys$Sing2, undefined);
282
298
  /** The color of the bounding box, as a 6-digit hex color. */
283
299
  _defineProperty(this, _ViewerStateKeys$Boun2, undefined);
284
300
  /** The background color, as a 6-digit hex color. */
@@ -934,6 +950,8 @@ export function deserializeViewerState(params) {
934
950
  time: parseStringInt(params[ViewerStateKeys.Time], 0, Number.POSITIVE_INFINITY),
935
951
  scene: parseStringInt(params[ViewerStateKeys.Scene], 0, Number.POSITIVE_INFINITY),
936
952
  renderMode: parseStringEnum(params[ViewerStateKeys.Mode], RenderMode),
953
+ singleChannelMode: parseStringBoolean(params[ViewerStateKeys.SingleChannelMode]),
954
+ singleChannelIndex: parseStringInt(params[ViewerStateKeys.SingleChannelIndex], 0, Number.POSITIVE_INFINITY),
937
955
  cameraState: parseCameraState(params[ViewerStateKeys.CameraState])
938
956
  };
939
957
 
@@ -965,11 +983,11 @@ export function deserializeViewerState(params) {
965
983
  * @returns A `ViewerStateParams` object with the serialized parameters. Undefined values are removed.
966
984
  */
967
985
  export function serializeViewerState(state, removeDefaults) {
968
- var _state$maskAlpha, _state$brightness, _state$density, _state$levels, _state$time, _state$scene, _result;
986
+ var _state$maskAlpha, _state$brightness, _state$density, _state$levels, _state$time, _state$scene, _state$singleChannelI, _result;
969
987
  if (removeDefaults) {
970
988
  state = removeMatchingProperties(state, getDefaultViewerState());
971
989
  }
972
- var result = (_result = {}, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_result, ViewerStateKeys.Mode, state.renderMode), ViewerStateKeys.Mask, (_state$maskAlpha = state.maskAlpha) === null || _state$maskAlpha === void 0 ? void 0 : _state$maskAlpha.toString()), ViewerStateKeys.Image, state.imageType), ViewerStateKeys.Axes, serializeBoolean(state.showAxes)), ViewerStateKeys.BoundingBox, serializeBoolean(state.showBoundingBox)), ViewerStateKeys.BoundingBoxColor, state.boundingBoxColor && colorArrayToHex(state.boundingBoxColor)), ViewerStateKeys.BackgroundColor, state.backgroundColor && colorArrayToHex(state.backgroundColor)), ViewerStateKeys.Autorotate, serializeBoolean(state.autorotate)), ViewerStateKeys.Brightness, (_state$brightness = state.brightness) === null || _state$brightness === void 0 ? void 0 : _state$brightness.toString()), ViewerStateKeys.Density, (_state$density = state.density) === null || _state$density === void 0 ? void 0 : _state$density.toString()), _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_result, ViewerStateKeys.Interpolation, serializeBoolean(state.interpolationEnabled)), ViewerStateKeys.Region, state.region && serializeRegion(state.region)), ViewerStateKeys.Slice, state.slice && serializeSlice(state.slice)), ViewerStateKeys.Levels, (_state$levels = state.levels) === null || _state$levels === void 0 ? void 0 : _state$levels.join(",")), ViewerStateKeys.Time, (_state$time = state.time) === null || _state$time === void 0 ? void 0 : _state$time.toString()), ViewerStateKeys.Scene, (_state$scene = state.scene) === null || _state$scene === void 0 ? void 0 : _state$scene.toString()), ViewerStateKeys.CameraState, state.cameraState && serializeCameraState(state.cameraState, removeDefaults, state.viewMode)));
990
+ var result = (_result = {}, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_result, ViewerStateKeys.Mode, state.renderMode), ViewerStateKeys.Mask, (_state$maskAlpha = state.maskAlpha) === null || _state$maskAlpha === void 0 ? void 0 : _state$maskAlpha.toString()), ViewerStateKeys.Image, state.imageType), ViewerStateKeys.Axes, serializeBoolean(state.showAxes)), ViewerStateKeys.BoundingBox, serializeBoolean(state.showBoundingBox)), ViewerStateKeys.BoundingBoxColor, state.boundingBoxColor && colorArrayToHex(state.boundingBoxColor)), ViewerStateKeys.BackgroundColor, state.backgroundColor && colorArrayToHex(state.backgroundColor)), ViewerStateKeys.Autorotate, serializeBoolean(state.autorotate)), ViewerStateKeys.Brightness, (_state$brightness = state.brightness) === null || _state$brightness === void 0 ? void 0 : _state$brightness.toString()), ViewerStateKeys.Density, (_state$density = state.density) === null || _state$density === void 0 ? void 0 : _state$density.toString()), _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_result, ViewerStateKeys.Interpolation, serializeBoolean(state.interpolationEnabled)), ViewerStateKeys.Region, state.region && serializeRegion(state.region)), ViewerStateKeys.Slice, state.slice && serializeSlice(state.slice)), ViewerStateKeys.Levels, (_state$levels = state.levels) === null || _state$levels === void 0 ? void 0 : _state$levels.join(",")), ViewerStateKeys.Time, (_state$time = state.time) === null || _state$time === void 0 ? void 0 : _state$time.toString()), ViewerStateKeys.Scene, (_state$scene = state.scene) === null || _state$scene === void 0 ? void 0 : _state$scene.toString()), ViewerStateKeys.SingleChannelMode, serializeBoolean(state.singleChannelMode)), ViewerStateKeys.SingleChannelIndex, (_state$singleChannelI = state.singleChannelIndex) === null || _state$singleChannelI === void 0 ? void 0 : _state$singleChannelI.toString()), ViewerStateKeys.CameraState, state.cameraState && serializeCameraState(state.cameraState, removeDefaults, state.viewMode)));
973
991
  var viewModeToViewParam = _defineProperty(_defineProperty(_defineProperty(_defineProperty({}, ViewMode.threeD, "3D"), ViewMode.xy, "Z"), ViewMode.xz, "Y"), ViewMode.yz, "X");
974
992
  result[ViewerStateKeys.View] = state.viewMode && viewModeToViewParam[state.viewMode];
975
993
  return removeUndefinedProperties(result);
@@ -75,7 +75,9 @@ export var selectViewerSettings = function selectViewerSettings(store) {
75
75
  slice: store.slice,
76
76
  time: store.time,
77
77
  scene: store.scene,
78
- cameraState: store.cameraState
78
+ cameraState: store.cameraState,
79
+ singleChannelMode: store.singleChannelMode,
80
+ singleChannelIndex: store.singleChannelIndex
79
81
  };
80
82
  };
81
83
 
@@ -38,6 +38,8 @@ var arbitraryViewerState = function arbitraryViewerState() {
38
38
  },
39
39
  time: 12,
40
40
  scene: 3,
41
+ singleChannelMode: true,
42
+ singleChannelIndex: 3,
41
43
  cameraState: undefined
42
44
  };
43
45
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aics/vole-app",
3
- "version": "3.1.1",
3
+ "version": "3.2.0",
4
4
  "description": "web view of cell volume images",
5
5
  "main": "es/index.js",
6
6
  "module": "es/index.js",
@@ -45,7 +45,7 @@
45
45
  "author": "Megan Riel-Mehan",
46
46
  "license": "ISC",
47
47
  "dependencies": {
48
- "@aics/vole-core": "^4.5.0",
48
+ "@aics/vole-core": "^4.6.4",
49
49
  "@ant-design/icons": "^5.2.5",
50
50
  "@fortawesome/fontawesome-svg-core": "^6.5.2",
51
51
  "@fortawesome/free-solid-svg-icons": "^6.5.2",
@@ -1,5 +1,6 @@
1
1
  import React from "react";
2
- import type { ColorObject } from "../shared/utils/colorRepresentations";
2
+ import type { ColorObject } from "../../shared/utils/colorRepresentations";
3
+ import "./styles.css";
3
4
  type ColorChangeHandler = (currentColor: ColorObject, prevColor?: ColorObject, idx?: number) => void;
4
5
  interface ColorPickerProps {
5
6
  color: ColorObject;
@@ -5,7 +5,7 @@ import type { AxisName } from "./types";
5
5
  import type { ColorArray } from "./utils/colorRepresentations";
6
6
  import type { ViewerChannelSettings } from "./utils/viewerChannelSettings";
7
7
  export declare const // Control panel will automatically close if viewport is less than this width
8
- CONTROL_PANEL_CLOSE_WIDTH = 970, CLIPPING_PANEL_HEIGHT_DEFAULT = 200, CLIPPING_PANEL_HEIGHT_TALL = 235, BACKGROUND_COLOR_DEFAULT: ColorArray, BOUNDING_BOX_COLOR_DEFAULT: ColorArray, AXIS_MARGIN_DEFAULT: [number, number], SCALE_BAR_MARGIN_DEFAULT: [number, number], LUT_MIN_PERCENTILE = 0.5, LUT_MAX_PERCENTILE = 0.983, ALPHA_MASK_SLIDER_DEFAULT = 0, BRIGHTNESS_SLIDER_LEVEL_DEFAULT = 70, DENSITY_SLIDER_LEVEL_DEFAULT = 50, LEVELS_SLIDER_DEFAULT: ColorArray, INTERPOLATION_ENABLED_DEFAULT = true, OTHER_CHANNEL_KEY = "Other", SINGLE_GROUP_CHANNEL_KEY = "Channels";
8
+ CONTROL_PANEL_CLOSE_WIDTH = 970, CLIPPING_PANEL_HEIGHT_DEFAULT = 200, CLIPPING_PANEL_HEIGHT_TALL = 235, BACKGROUND_COLOR_DEFAULT: ColorArray, BOUNDING_BOX_COLOR_DEFAULT: ColorArray, AXIS_MARGIN_DEFAULT: [number, number], SCALE_BAR_MARGIN_DEFAULT: [number, number], LUT_MIN_PERCENTILE = 0.5, LUT_MAX_PERCENTILE = 0.983, ALPHA_MASK_SLIDER_DEFAULT = 0, BRIGHTNESS_SLIDER_LEVEL_DEFAULT = 70, DENSITY_SLIDER_LEVEL_DEFAULT = 50, LEVELS_SLIDER_DEFAULT: ColorArray, INTERPOLATION_ENABLED_DEFAULT = true, OTHER_CHANNEL_KEY = "Other", SINGLE_GROUP_CHANNEL_KEY = "Channels", SINGLE_CHANNEL_MODE_COLOR: ColorArray;
9
9
  export declare const TFEDITOR_DEFAULT_COLOR: ColorArray;
10
10
  export declare const TFEDITOR_MAX_BIN = 255;
11
11
  export declare const CACHE_MAX_SIZE = 1000000000;
@@ -48,7 +48,9 @@ export declare enum ViewerStateKeys {
48
48
  Slice = "slice",
49
49
  Time = "t",
50
50
  Scene = "scene",
51
- CameraState = "cam"
51
+ CameraState = "cam",
52
+ SingleChannelMode = "scm",
53
+ SingleChannelIndex = "sci"
52
54
  }
53
55
  export declare enum CameraTransformKeys {
54
56
  /** Camera position in 3D coordinates. */
@@ -194,6 +196,10 @@ export declare class ViewerStateParams {
194
196
  [ViewerStateKeys.Axes]?: string;
195
197
  /** Whether to show the bounding box. "1" is enabled. Disabled by default. */
196
198
  [ViewerStateKeys.BoundingBox]?: string;
199
+ /** Whether single-channel mode is active. "1" is active. Inactive by default. */
200
+ [ViewerStateKeys.SingleChannelMode]?: string;
201
+ /** If single-channel mode is active, which channel index is shown. Defaults to 0. */
202
+ [ViewerStateKeys.SingleChannelIndex]?: string;
197
203
  /** The color of the bounding box, as a 6-digit hex color. */
198
204
  [ViewerStateKeys.BoundingBoxColor]?: string;
199
205
  /** The background color, as a 6-digit hex color. */
@@ -22,6 +22,8 @@ export type ViewerState = {
22
22
  time: number;
23
23
  scene: number;
24
24
  cameraState: Partial<CameraState> | undefined;
25
+ singleChannelMode: boolean;
26
+ singleChannelIndex: number;
25
27
  };
26
28
  export type ChannelState = {
27
29
  name: string;