@aics/vole-app 2.14.0 → 3.1.1

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 (81) hide show
  1. package/es/Globals.d.js +0 -0
  2. package/es/aics-image-viewer/components/App/ChannelUpdater.js +21 -3
  3. package/es/aics-image-viewer/components/App/index.js +184 -198
  4. package/es/aics-image-viewer/components/CellViewerCanvasWrapper/index.js +10 -9
  5. package/es/aics-image-viewer/components/ChannelsWidget.js +35 -22
  6. package/es/aics-image-viewer/components/ChannelsWidgetRow/index.js +26 -52
  7. package/es/aics-image-viewer/components/ChannelsWidgetRow/styles.css +0 -6
  8. package/es/aics-image-viewer/components/ColorPicker.js +1 -1
  9. package/es/aics-image-viewer/components/ControlPanel/index.js +5 -4
  10. package/es/aics-image-viewer/components/CustomizeWidget.js +12 -8
  11. package/es/aics-image-viewer/components/ErrorAlert/index.js +4 -4
  12. package/es/aics-image-viewer/components/GlobalVolumeControls.js +15 -12
  13. package/es/aics-image-viewer/components/StyleProvider/index.js +4 -2
  14. package/es/aics-image-viewer/components/TfEditor/index.js +304 -154
  15. package/es/aics-image-viewer/components/TfEditor/styles.css +53 -31
  16. package/es/aics-image-viewer/components/Toolbar/DownloadButton.js +1 -1
  17. package/es/aics-image-viewer/components/Toolbar/index.js +18 -16
  18. package/es/aics-image-viewer/components/shared/SharedCheckBox.js +1 -1
  19. package/es/aics-image-viewer/components/shared/SliderRow/index.js +8 -3
  20. package/es/aics-image-viewer/components/shared/SliderRow/styles.css +7 -0
  21. package/es/aics-image-viewer/components/shared/SmarterSlider.js +1 -1
  22. package/es/aics-image-viewer/components/shared/ViewerIcon.js +1 -1
  23. package/es/aics-image-viewer/components/useVolume.js +59 -58
  24. package/es/aics-image-viewer/shared/constants.js +2 -2
  25. package/es/aics-image-viewer/shared/utils/controlPointsToLut.js +57 -24
  26. package/es/aics-image-viewer/shared/utils/sceneStore.js +5 -3
  27. package/es/aics-image-viewer/shared/utils/storage.js +238 -0
  28. package/es/aics-image-viewer/shared/utils/test/storage.test.js +264 -0
  29. package/es/aics-image-viewer/shared/utils/test/urlParsing.test.js +240 -108
  30. package/es/aics-image-viewer/shared/utils/test/viewerChannelSettings.test.js +1 -1
  31. package/es/aics-image-viewer/shared/utils/urlParsing.js +278 -153
  32. package/es/aics-image-viewer/shared/utils/viewerState.js +4 -24
  33. package/es/aics-image-viewer/state/reset.js +111 -0
  34. package/es/aics-image-viewer/state/store.js +90 -0
  35. package/es/aics-image-viewer/state/subscribers.js +153 -0
  36. package/es/aics-image-viewer/state/test/reset.test.js +247 -0
  37. package/es/aics-image-viewer/state/util.js +71 -0
  38. package/es/index.js +3 -3
  39. package/package.json +18 -11
  40. package/type-declarations/aics-image-viewer/components/App/ChannelUpdater.d.ts +2 -4
  41. package/type-declarations/aics-image-viewer/components/App/types.d.ts +3 -3
  42. package/type-declarations/aics-image-viewer/components/AxisClipSliders/index.d.ts +6 -6
  43. package/type-declarations/aics-image-viewer/components/CellViewerCanvasWrapper/index.d.ts +5 -14
  44. package/type-declarations/aics-image-viewer/components/ChannelsWidget.d.ts +3 -6
  45. package/type-declarations/aics-image-viewer/components/ChannelsWidgetRow/index.d.ts +3 -6
  46. package/type-declarations/aics-image-viewer/components/ColorPicker.d.ts +1 -1
  47. package/type-declarations/aics-image-viewer/components/ControlPanel/index.d.ts +6 -7
  48. package/type-declarations/aics-image-viewer/components/CustomizeWidget.d.ts +2 -8
  49. package/type-declarations/aics-image-viewer/components/ErrorAlert/index.d.ts +4 -0
  50. package/type-declarations/aics-image-viewer/components/GlobalVolumeControls.d.ts +2 -9
  51. package/type-declarations/aics-image-viewer/components/MetadataViewer/index.d.ts +1 -1
  52. package/type-declarations/aics-image-viewer/components/StyleProvider/index.d.ts +1 -1
  53. package/type-declarations/aics-image-viewer/components/TfEditor/index.d.ts +10 -3
  54. package/type-declarations/aics-image-viewer/components/Toolbar/index.d.ts +3 -12
  55. package/type-declarations/aics-image-viewer/components/shared/SliderRow/index.d.ts +2 -1
  56. package/type-declarations/aics-image-viewer/components/shared/SmarterSlider.d.ts +1 -1
  57. package/type-declarations/aics-image-viewer/components/shared/ViewerIcon.d.ts +1 -1
  58. package/type-declarations/aics-image-viewer/components/useVolume.d.ts +7 -4
  59. package/type-declarations/aics-image-viewer/shared/constants.d.ts +5 -5
  60. package/type-declarations/aics-image-viewer/shared/types.d.ts +1 -1
  61. package/type-declarations/aics-image-viewer/shared/utils/controlPointsToLut.d.ts +9 -5
  62. package/type-declarations/aics-image-viewer/shared/utils/firebase/index.d.ts +1 -1
  63. package/type-declarations/aics-image-viewer/shared/utils/hooks.d.ts +1 -1
  64. package/type-declarations/aics-image-viewer/shared/utils/playControls.d.ts +1 -1
  65. package/type-declarations/aics-image-viewer/shared/utils/sceneStore.d.ts +8 -4
  66. package/type-declarations/aics-image-viewer/shared/utils/storage.d.ts +15 -0
  67. package/type-declarations/aics-image-viewer/shared/utils/urlParsing.d.ts +94 -31
  68. package/type-declarations/aics-image-viewer/shared/utils/viewerChannelSettings.d.ts +39 -1
  69. package/type-declarations/aics-image-viewer/shared/utils/viewerState.d.ts +3 -6
  70. package/type-declarations/aics-image-viewer/state/reset.d.ts +29 -0
  71. package/type-declarations/aics-image-viewer/state/store.d.ts +30 -0
  72. package/type-declarations/aics-image-viewer/state/subscribers.d.ts +4 -0
  73. package/type-declarations/aics-image-viewer/state/types.d.ts +46 -0
  74. package/type-declarations/aics-image-viewer/state/util.d.ts +8 -0
  75. package/type-declarations/index.d.ts +4 -4
  76. package/es/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.js +0 -163
  77. package/es/aics-image-viewer/components/ViewerStateProvider/index.js +0 -259
  78. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.d.ts +0 -34
  79. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/index.d.ts +0 -33
  80. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/types.d.ts +0 -107
  81. /package/es/aics-image-viewer/{components/ViewerStateProvider → state}/types.js +0 -0
@@ -0,0 +1,71 @@
1
+ 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; }
2
+ 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; }
3
+ 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; }
4
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
5
+ 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); }
6
+ 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); }
7
+ import { RenderMode, ViewMode } from "../shared/enums";
8
+
9
+ // TODO move back to a new `types` module (?)
10
+
11
+ var isRecord = function isRecord(val) {
12
+ return _typeof(val) === "object" && val !== null && !Array.isArray(val);
13
+ };
14
+ var VIEWER_SETTINGS_CHANGE_HANDLERS = {
15
+ // Do not allow path trace render mode in 2D view modes
16
+ viewMode: function viewMode(_viewMode, _ref) {
17
+ var renderMode = _ref.renderMode;
18
+ var switchToVolumetric = _viewMode !== ViewMode.threeD && renderMode === RenderMode.pathTrace;
19
+ return {
20
+ viewMode: _viewMode,
21
+ renderMode: switchToVolumetric ? RenderMode.volumetric : renderMode
22
+ };
23
+ },
24
+ // Don't switch to path trace rendering in any view mode other than 3d; if we do switch, turn off autorotate
25
+ renderMode: function renderMode(_renderMode, _ref2) {
26
+ var viewMode = _ref2.viewMode,
27
+ autorotate = _ref2.autorotate;
28
+ var willPathtrace = _renderMode === RenderMode.pathTrace;
29
+ if (willPathtrace && viewMode !== ViewMode.threeD) {
30
+ return {};
31
+ }
32
+ return {
33
+ renderMode: _renderMode,
34
+ autorotate: autorotate && !willPathtrace
35
+ };
36
+ },
37
+ // Do not allow autorotate while in pathtrace mode (button should be disabled, but this provides extra security)
38
+ autorotate: function autorotate(_autorotate, _ref3) {
39
+ var renderMode = _ref3.renderMode;
40
+ return {
41
+ autorotate: _autorotate && renderMode !== RenderMode.pathTrace
42
+ };
43
+ }
44
+ };
45
+
46
+ /**
47
+ * Accepts a `key` and a new (potentially partial) `value` for a single field of `ViewerState`, & returns a fragment of
48
+ * `ViewerState` that can safely be merged into `currentState` to apply that value without creating an illegal state.
49
+ */
50
+ export var validateStateValue = function validateStateValue(currentState, key, value) {
51
+ var changeHandler = VIEWER_SETTINGS_CHANGE_HANDLERS[key];
52
+ if (changeHandler) {
53
+ // some settings have custom change handlers to avoid creating illegal states; if this one has one, call it
54
+ return changeHandler(value, currentState);
55
+ } else {
56
+ // if not, merge the new value to the current one (if applicable) and return
57
+ var currentValue = currentState[key];
58
+ var nextValue = isRecord(currentValue) && isRecord(value) ? _objectSpread(_objectSpread({}, currentValue), value) : value;
59
+ return _defineProperty({}, key, nextValue);
60
+ }
61
+ };
62
+
63
+ /** Ensures a fragment of `ViewerState` can be safely merged into `currentState` without creating an illegal state. */
64
+ export var validateState = function validateState(currentState, newState) {
65
+ var validated = {};
66
+ for (var _i = 0, _arr = Object.keys(newState); _i < _arr.length; _i++) {
67
+ var key = _arr[_i];
68
+ Object.assign(validated, validateStateValue(currentState, key, newState[key]));
69
+ }
70
+ return validated;
71
+ };
package/es/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { parseViewerUrlParams } from "./aics-image-viewer/shared/utils/urlParsing";
2
1
  import ImageViewerApp from "./aics-image-viewer/components/App";
3
- import ViewerStateProvider from "./aics-image-viewer/components/ViewerStateProvider";
2
+ export { addViewerParamsFromMessage, parseViewerUrlParams } from "./aics-image-viewer/shared/utils/urlParsing";
3
+ export { writeMetadata, writeScenes } from "./aics-image-viewer/shared/utils/storage";
4
4
  export { ViewMode, RenderMode, ImageType } from "./aics-image-viewer/shared/enums";
5
- export { ImageViewerApp, ViewerStateProvider, parseViewerUrlParams };
5
+ export { ImageViewerApp };
package/package.json CHANGED
@@ -1,8 +1,7 @@
1
1
  {
2
2
  "name": "@aics/vole-app",
3
- "version": "2.14.0",
3
+ "version": "3.1.1",
4
4
  "description": "web view of cell volume images",
5
- "repository": "github:allen-cell-animated/vole-app",
6
5
  "main": "es/index.js",
7
6
  "module": "es/index.js",
8
7
  "browser": "es/index.js",
@@ -17,6 +16,10 @@
17
16
  "registry": "https://registry.npmjs.org/",
18
17
  "access": "public"
19
18
  },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/allen-cell-animated/vole-app.git"
22
+ },
20
23
  "scripts": {
21
24
  "start": "webpack serve --config webpack.dev.js --env env=dev",
22
25
  "gh-build-nightly": "webpack --config webpack.dev.js --env env=production basename=/vole-app/",
@@ -36,12 +39,13 @@
36
39
  "postpublish-patch": "git push origin main",
37
40
  "prepare": "cross-env DEPLOYMENT_ENV=production npm run build",
38
41
  "predeploy": "cross-env DEPLOYMENT_ENV=production npm run dev",
39
- "deploy": "gh-pages -d imageviewer -t true"
42
+ "deploy": "gh-pages -d imageviewer -t true",
43
+ "checks": "npm run lint && npm run typeCheck && npm run test"
40
44
  },
41
45
  "author": "Megan Riel-Mehan",
42
46
  "license": "ISC",
43
47
  "dependencies": {
44
- "@aics/vole-core": "^4.1.0",
48
+ "@aics/vole-core": "^4.5.0",
45
49
  "@ant-design/icons": "^5.2.5",
46
50
  "@fortawesome/fontawesome-svg-core": "^6.5.2",
47
51
  "@fortawesome/free-solid-svg-icons": "^6.5.2",
@@ -54,7 +58,9 @@
54
58
  "react-color": "^2.19.3",
55
59
  "react-router-dom": "^6.26.2",
56
60
  "styled-components": "^6.1.13",
57
- "usehooks-ts": "^3.1.0"
61
+ "usehooks-ts": "^3.1.0",
62
+ "uuid": "^13.0.0",
63
+ "zustand": "^5.0.6"
58
64
  },
59
65
  "peerDependencies": {
60
66
  "antd": "^5.16.2",
@@ -73,14 +79,14 @@
73
79
  "@trivago/prettier-plugin-sort-imports": "^4.3.0",
74
80
  "@types/color-string": "^1.5.2",
75
81
  "@types/d3": "^7.4.3",
76
- "@types/jest": "^27.4.0",
82
+ "@types/jest": "^29.5.14",
77
83
  "@types/lodash": "^4.14.185",
78
84
  "@types/react": "^18.x",
79
85
  "@types/react-color": "^3.0.12",
80
86
  "@types/react-dom": "^18.x",
81
87
  "@types/three": "^0.171.0",
82
- "@typescript-eslint/eslint-plugin": "^5.31.0",
83
- "@typescript-eslint/parser": "^5.31.0",
88
+ "@typescript-eslint/eslint-plugin": "^8.46.2",
89
+ "@typescript-eslint/parser": "^8.46.2",
84
90
  "antd": "^5.16.2",
85
91
  "axios": "^0.21.1",
86
92
  "babel-loader": "^8.2.2",
@@ -99,7 +105,8 @@
99
105
  "firebase": "^7.x",
100
106
  "gh-pages": "^4.0.0",
101
107
  "html-webpack-plugin": "^5.3.2",
102
- "jest": "^27.0.6",
108
+ "jest": "^29.7.0",
109
+ "jest-environment-jsdom": "^30.2.0",
103
110
  "mini-css-extract-plugin": "^2.9.1",
104
111
  "morgan": "^1.9.1",
105
112
  "npm-run-all": "^4.1.5",
@@ -119,8 +126,8 @@
119
126
  "react-dom": "^18.3.1",
120
127
  "resolve-url-loader": "^5.0.0",
121
128
  "style-loader": "^4.0.0",
122
- "ts-jest": "^27.1.2",
123
- "typescript": "^4.3.5",
129
+ "ts-jest": "^29.4.6",
130
+ "typescript": "^5.9.3",
124
131
  "url-loader": "^4.1.1",
125
132
  "webpack": "^5.89.0",
126
133
  "webpack-cli": "^4.7.2",
@@ -1,9 +1,7 @@
1
- import { View3d, Volume } from "@aics/vole-core";
2
- import React from "react";
3
- import { ChannelState } from "../ViewerStateProvider/types";
1
+ import { type View3d, type Volume } from "@aics/vole-core";
2
+ import type React from "react";
4
3
  interface ChannelUpdaterProps {
5
4
  index: number;
6
- channelState: ChannelState;
7
5
  view3d: View3d;
8
6
  image: Volume | null;
9
7
  version: number;
@@ -1,8 +1,8 @@
1
1
  import type { RawArrayData, RawArrayInfo, View3d, Volume } from "@aics/vole-core";
2
- import { MutableRefObject } from "react";
2
+ import type { MutableRefObject } from "react";
3
3
  import type { MetadataRecord } from "../../shared/types";
4
4
  import type { ViewerChannelSettings } from "../../shared/utils/viewerChannelSettings";
5
- import type { ViewerState } from "../ViewerStateProvider/types";
5
+ import type { ViewerState } from "../../state/types";
6
6
  /** `typeof useEffect`, but the effect handler takes a `Volume` as an argument */
7
7
  export type UseImageEffectType = (effect: (image: Volume) => void | (() => void), deps: React.DependencyList) => void;
8
8
  type ControlNames = "alphaMaskSlider" | "autoRotateButton" | "axisClipSliders" | "brightnessSlider" | "backgroundColorPicker" | "boundingBoxColorPicker" | "colorPresetsDropdown" | "densitySlider" | "levelsSliders" | "interpolationControl" | "saveSurfaceButtons" | "fovCellSwitchControls" | "viewModeRadioButtons" | "resetCameraButton" | "showAxesButton" | "showBoundingBoxButton" | "metadataViewer";
@@ -37,7 +37,7 @@ export interface AppProps {
37
37
  translation: [number, number, number];
38
38
  rotation: [number, number, number];
39
39
  };
40
- metadata?: MetadataRecord | MetadataRecord[];
40
+ metadata?: MetadataRecord | (MetadataRecord | undefined)[];
41
41
  view3dRef?: MutableRefObject<View3d | null>;
42
42
  metadataFormatter?: (metadata: MetadataRecord) => MetadataRecord;
43
43
  onControlPanelToggle?: (collapsed: boolean) => void;
@@ -1,14 +1,14 @@
1
- import { Volume } from "@aics/vole-core";
1
+ import type { Volume } from "@aics/vole-core";
2
2
  import React from "react";
3
- import { ViewMode } from "../../shared/enums";
4
- import { AxisName, PerAxis } from "../../shared/types";
5
- import PlayControls from "../../shared/utils/playControls";
6
- import { ViewerSettingUpdater } from "../ViewerStateProvider/types";
3
+ import type { ViewMode } from "../../shared/enums";
4
+ import { type AxisName, type PerAxis } from "../../shared/types";
5
+ import type PlayControls from "../../shared/utils/playControls";
6
+ import type { ViewerStateActions } from "../../state/store";
7
7
  import "./styles.css";
8
8
  type AxisClipSlidersProps = {
9
9
  mode: ViewMode;
10
10
  image: Volume | null;
11
- changeViewerSetting: ViewerSettingUpdater;
11
+ changeViewerSetting: ViewerStateActions["changeViewerSetting"];
12
12
  numSlices: PerAxis<number>;
13
13
  numSlicesLoaded: PerAxis<number>;
14
14
  numScenes: number;
@@ -1,9 +1,7 @@
1
- import { View3d, Volume } from "@aics/vole-core";
1
+ import type { View3d, Volume } from "@aics/vole-core";
2
2
  import React from "react";
3
- import { ViewMode } from "../../shared/enums";
4
- import { AxisName, PerAxis } from "../../shared/types";
5
- import PlayControls from "../../shared/utils/playControls";
6
- import { ViewerSettingUpdater } from "../ViewerStateProvider/types";
3
+ import type { AxisName, PerAxis } from "../../shared/types";
4
+ import type PlayControls from "../../shared/utils/playControls";
7
5
  import "./styles.css";
8
6
  type ViewerWrapperProps = {
9
7
  view3d: View3d;
@@ -21,13 +19,6 @@ type ViewerWrapperProps = {
21
19
  };
22
20
  clippingPanelOpen?: boolean;
23
21
  onClippingPanelOpenChange?: (visible: boolean) => void;
24
- autorotate: boolean;
25
- viewMode: ViewMode;
26
- region: PerAxis<[number, number]>;
27
- slice: PerAxis<number>;
28
- time: number;
29
- scene: number;
30
- changeViewerSetting: ViewerSettingUpdater;
31
22
  };
32
- declare const _default: React.FC<Omit<ViewerWrapperProps, "viewMode" | "autorotate" | "region" | "slice" | "time" | "scene" | "changeViewerSetting">>;
33
- export default _default;
23
+ declare const ViewerWrapper: React.FC<ViewerWrapperProps>;
24
+ export default ViewerWrapper;
@@ -1,9 +1,8 @@
1
- import { Channel } from "@aics/vole-core";
1
+ import type { Channel } from "@aics/vole-core";
2
2
  import React from "react";
3
3
  import type { IsosurfaceFormat } from "../shared/types";
4
4
  import type { ColorArray, ColorObject } from "../shared/utils/colorRepresentations";
5
5
  import type { ChannelGrouping, ViewerChannelSettings } from "../shared/utils/viewerChannelSettings";
6
- import type { ChannelSettingUpdater, ChannelState } from "./ViewerStateProvider/types";
7
6
  export type ChannelsWidgetProps = {
8
7
  channelDataChannels: Channel[] | undefined;
9
8
  channelGroupedByType: ChannelGrouping;
@@ -12,8 +11,6 @@ export type ChannelsWidgetProps = {
12
11
  onApplyColorPresets: (presets: ColorArray[]) => void;
13
12
  filterFunc?: (key: string) => boolean;
14
13
  onColorChangeComplete?: (newRGB: ColorObject, oldRGB?: ColorObject, index?: number) => void;
15
- channelSettings: ChannelState[];
16
- changeChannelSetting: ChannelSettingUpdater;
17
14
  };
18
- declare const _default: React.FC<Omit<ChannelsWidgetProps, "channelSettings" | "changeChannelSetting">>;
19
- export default _default;
15
+ declare const ChannelsWidget: React.FC<ChannelsWidgetProps>;
16
+ export default ChannelsWidget;
@@ -1,15 +1,12 @@
1
- import { Channel } from "@aics/vole-core";
1
+ import type { Channel } from "@aics/vole-core";
2
2
  import React from "react";
3
- import { IsosurfaceFormat } from "../../shared/types";
4
- import { ColorObject } from "../../shared/utils/colorRepresentations";
5
- import { type ChannelSettingUpdater, type ChannelState } from "../ViewerStateProvider/types";
3
+ import type { IsosurfaceFormat } from "../../shared/types";
4
+ import { type ColorObject } from "../../shared/utils/colorRepresentations";
6
5
  import "./styles.css";
7
6
  interface ChannelsWidgetRowProps {
8
7
  index: number;
9
8
  name: string;
10
- channelState: ChannelState;
11
9
  channelDataForChannel: Channel;
12
- changeChannelSetting: ChannelSettingUpdater;
13
10
  saveIsosurface: (channelIndex: number, type: IsosurfaceFormat) => void;
14
11
  onColorChangeComplete?: (newRGB: ColorObject, oldRGB?: ColorObject, index?: number) => void;
15
12
  }
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { ColorObject } from "../shared/utils/colorRepresentations";
2
+ import type { ColorObject } from "../shared/utils/colorRepresentations";
3
3
  type ColorChangeHandler = (currentColor: ColorObject, prevColor?: ColorObject, idx?: number) => void;
4
4
  interface ColorPickerProps {
5
5
  color: ColorObject;
@@ -1,8 +1,8 @@
1
1
  import React from "react";
2
- import { MetadataRecord } from "../../shared/types";
2
+ import type { MetadataRecord } from "../../shared/types";
3
3
  import ChannelsWidget from "../ChannelsWidget";
4
- import CustomizeWidget, { CustomizeWidgetProps } from "../CustomizeWidget";
5
- import GlobalVolumeControls, { GlobalVolumeControlsProps } from "../GlobalVolumeControls";
4
+ import CustomizeWidget, { type CustomizeWidgetProps } from "../CustomizeWidget";
5
+ import GlobalVolumeControls, { type GlobalVolumeControlsProps } from "../GlobalVolumeControls";
6
6
  import "./styles.css";
7
7
  type PropsOf<T> = T extends React.ComponentType<infer P> ? P : never;
8
8
  interface ControlPanelProps extends PropsOf<typeof ChannelsWidget>, PropsOf<typeof GlobalVolumeControls>, PropsOf<typeof CustomizeWidget> {
@@ -11,10 +11,9 @@ interface ControlPanelProps extends PropsOf<typeof ChannelsWidget>, PropsOf<type
11
11
  colorPresetsDropdown: boolean;
12
12
  metadataViewer: boolean;
13
13
  };
14
- getMetadata: () => MetadataRecord;
14
+ metadata: MetadataRecord;
15
15
  collapsed: boolean;
16
16
  setCollapsed: (value: boolean) => void;
17
- resetToDefaultViewerState: () => void;
18
17
  }
19
- declare const _default: React.FC<Omit<ControlPanelProps, "resetToDefaultViewerState">>;
20
- export default _default;
18
+ declare function ControlPanel(props: ControlPanelProps): React.ReactElement;
19
+ export default ControlPanel;
@@ -1,15 +1,9 @@
1
1
  import React from "react";
2
- import { ColorArray } from "../shared/utils/colorRepresentations";
3
- import { ViewerSettingUpdater } from "./ViewerStateProvider/types";
4
2
  export interface CustomizeWidgetProps {
5
3
  visibleControls: {
6
4
  backgroundColorPicker: boolean;
7
5
  boundingBoxColorPicker: boolean;
8
6
  };
9
- showBoundingBox: boolean;
10
- backgroundColor: ColorArray;
11
- boundingBoxColor: ColorArray;
12
- changeViewerSetting: ViewerSettingUpdater;
13
7
  }
14
- declare const _default: React.FC<Omit<CustomizeWidgetProps, "showBoundingBox" | "boundingBoxColor" | "backgroundColor" | "changeViewerSetting">>;
15
- export default _default;
8
+ declare const CustomizeWidget: React.FC<CustomizeWidgetProps>;
9
+ export default CustomizeWidget;
@@ -1,5 +1,9 @@
1
1
  import React from "react";
2
2
  import "./styles.css";
3
+ export type ErrorAlertDescription = {
4
+ title: string;
5
+ description: React.ReactNode;
6
+ };
3
7
  export type ErrorAlertProps = {
4
8
  errors: unknown;
5
9
  /** The number of times we've seen an error of the type that is currently being displayed before */
@@ -1,5 +1,4 @@
1
1
  import React from "react";
2
- import { ViewerSettingUpdater } from "./ViewerStateProvider/types";
3
2
  export interface GlobalVolumeControlsProps {
4
3
  imageName: string | undefined;
5
4
  pixelSize: [number, number, number];
@@ -10,12 +9,6 @@ export interface GlobalVolumeControlsProps {
10
9
  levelsSliders: boolean;
11
10
  interpolationControl: boolean;
12
11
  };
13
- maskAlpha: number;
14
- brightness: number;
15
- density: number;
16
- levels: [number, number, number];
17
- interpolationEnabled: boolean;
18
- changeViewerSetting: ViewerSettingUpdater;
19
12
  }
20
- declare const _default: React.FC<Omit<GlobalVolumeControlsProps, "maskAlpha" | "brightness" | "density" | "levels" | "interpolationEnabled" | "changeViewerSetting">>;
21
- export default _default;
13
+ declare const GlobalVolumeControls: React.FC<GlobalVolumeControlsProps>;
14
+ export default GlobalVolumeControls;
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { MetadataRecord } from "../../shared/types";
2
+ import type { MetadataRecord } from "../../shared/types";
3
3
  import "./styles.css";
4
4
  declare const MetadataViewer: React.FC<{
5
5
  metadata: MetadataRecord;
@@ -1,4 +1,4 @@
1
- import { PropsWithChildren, ReactElement } from "react";
1
+ import type { PropsWithChildren, ReactElement } from "react";
2
2
  /**
3
3
  * Provides CSS variables and global styling for the image viewer.
4
4
  */
@@ -1,21 +1,28 @@
1
- import { Channel, ControlPoint } from "@aics/vole-core";
1
+ import { type Channel, type ControlPoint } from "@aics/vole-core";
2
2
  import "nouislider/distribute/nouislider.css";
3
3
  import React from "react";
4
- import type { SingleChannelSettingUpdater } from "../ViewerStateProvider/types";
4
+ import type { IsosurfaceFormat } from "../../shared/types";
5
+ import type { ChannelState } from "../../state/types";
5
6
  import "./styles.css";
6
7
  type TfEditorProps = {
7
8
  id: string;
8
9
  width: number;
9
10
  height: number;
10
11
  channelData: Channel;
11
- changeChannelSetting: SingleChannelSettingUpdater;
12
+ changeChannelSetting: (value: Partial<ChannelState>) => void;
13
+ volumeEnabled: boolean;
14
+ isosurfaceEnabled: boolean;
12
15
  colorizeEnabled: boolean;
13
16
  colorizeAlpha: number;
14
17
  useControlPoints: boolean;
15
18
  controlPoints: ControlPoint[];
16
19
  ramp: [number, number];
20
+ isovalue: number;
21
+ opacity: number;
17
22
  plotMin: number;
18
23
  plotMax: number;
24
+ keepIntensityRange: boolean;
25
+ saveIsosurface: (format: IsosurfaceFormat) => void;
19
26
  };
20
27
  declare const TfEditor: React.FC<TfEditorProps>;
21
28
  export default TfEditor;
@@ -1,6 +1,4 @@
1
1
  import React from "react";
2
- import { ImageType, RenderMode, ViewMode } from "../../shared/enums";
3
- import { ViewerSettingUpdater } from "../ViewerStateProvider/types";
4
2
  import "./styles.css";
5
3
  type ToolbarProps = {
6
4
  cellDownloadHref: string;
@@ -10,6 +8,7 @@ type ToolbarProps = {
10
8
  canPathTrace: boolean;
11
9
  resetCamera: () => void;
12
10
  downloadScreenshot: () => void;
11
+ resetToSavedViewerState: () => void;
13
12
  visibleControls: {
14
13
  autoRotateButton: boolean;
15
14
  viewModeRadioButtons: boolean;
@@ -18,14 +17,6 @@ type ToolbarProps = {
18
17
  showAxesButton: boolean;
19
18
  showBoundingBoxButton: boolean;
20
19
  };
21
- imageType: ImageType;
22
- renderMode: RenderMode;
23
- viewMode: ViewMode;
24
- autorotate: boolean;
25
- showAxes: boolean;
26
- showBoundingBox: boolean;
27
- changeViewerSetting: ViewerSettingUpdater;
28
- resetToSavedViewerState: () => void;
29
20
  };
30
- declare const _default: React.FC<Omit<ToolbarProps, "viewMode" | "renderMode" | "imageType" | "showAxes" | "showBoundingBox" | "autorotate" | "resetToSavedViewerState" | "changeViewerSetting">>;
31
- export default _default;
21
+ declare const Toolbar: React.FC<ToolbarProps>;
22
+ export default Toolbar;
@@ -1,11 +1,12 @@
1
+ import type { NouisliderProps } from "nouislider-react";
1
2
  import React from "react";
2
- import { NouisliderProps } from "nouislider-react";
3
3
  import "./styles.css";
4
4
  type SliderRowProps = {
5
5
  label: React.ReactNode;
6
6
  start?: number | number[];
7
7
  step?: number;
8
8
  formatInteger?: boolean;
9
+ min?: number;
9
10
  max?: number;
10
11
  onUpdate?: NouisliderProps["onUpdate"];
11
12
  onChange?: NouisliderProps["onChange"];
@@ -1,5 +1,5 @@
1
+ import { type NouisliderProps } from "nouislider-react";
1
2
  import React from "react";
2
- import { NouisliderProps } from "nouislider-react";
3
3
  /** A wrapper around `Nouislider` that prevents updates while the slider is being dragged. */
4
4
  declare const SmarterSlider: React.FC<NouisliderProps>;
5
5
  export default SmarterSlider;
@@ -1,5 +1,5 @@
1
+ import type { IconComponentProps } from "@ant-design/icons/lib/components/Icon";
1
2
  import React from "react";
2
- import { IconComponentProps } from "@ant-design/icons/lib/components/Icon";
3
3
  import ICONS from "../../assets/icons";
4
4
  type ViewerIconProps = {
5
5
  type: keyof typeof ICONS;
@@ -1,10 +1,13 @@
1
- import { RawArrayLoaderOptions, View3d, Volume } from "@aics/vole-core";
2
- import { AxisName } from "../shared/types";
1
+ import { type RawArrayLoaderOptions, type View3d, type Volume } from "@aics/vole-core";
2
+ import type { AxisName } from "../shared/types";
3
3
  import PlayControls from "../shared/utils/playControls";
4
- import { ChannelGrouping } from "../shared/utils/viewerChannelSettings";
4
+ import type { ChannelGrouping, ViewerChannelSettings } from "../shared/utils/viewerChannelSettings";
5
5
  export type UseVolumeOptions = {
6
- /** Callback for when the volume is created. */
6
+ viewerChannelSettings?: ViewerChannelSettings;
7
+ /** Callback called just once when the volume is created. */
7
8
  onCreateImage?: (image: Volume) => void;
9
+ /** Callback called on any scene change, including the initial image load. */
10
+ onChangeScene?: (image: Volume, sceneIndex: number) => void;
8
11
  /** Callback for when a single channel of the volume has loaded. */
9
12
  onChannelLoaded?: (image: Volume, channelIndex: number, isInitialLoad: boolean) => void;
10
13
  /** Callback for when image loading encounters an error. */
@@ -1,11 +1,11 @@
1
1
  import { type CameraState, type Channel, PrefetchDirection } from "@aics/vole-core";
2
- import { ChannelState, ViewerState } from "../components/ViewerStateProvider/types";
2
+ import type { ChannelState, ViewerState } from "../state/types";
3
3
  import { ViewMode } from "./enums";
4
- import { AxisName } from "./types";
5
- import { ColorArray } from "./utils/colorRepresentations";
6
- import { ViewerChannelSettings } from "./utils/viewerChannelSettings";
4
+ import type { AxisName } from "./types";
5
+ import type { ColorArray } from "./utils/colorRepresentations";
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, ISOSURFACE_OPACITY_SLIDER_MAX = 255, 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";
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;
@@ -1,4 +1,4 @@
1
- import { CSSProperties } from "react";
1
+ import type { CSSProperties } from "react";
2
2
  import { ViewMode } from "./enums";
3
3
  export type AxisName = "x" | "y" | "z";
4
4
  export type PerAxis<T> = Record<AxisName, T>;
@@ -1,6 +1,12 @@
1
- import { Channel, ControlPoint, Histogram, Lut, Volume } from "@aics/vole-core";
2
- import { ViewerChannelSetting, ViewerChannelSettings } from "./viewerChannelSettings";
3
- export declare function controlPointsToLut(controlPoints: ControlPoint[]): Lut;
1
+ import { type ControlPoint, type Histogram, Lut, type Volume } from "@aics/vole-core";
2
+ import { type ViewerChannelSetting, type ViewerChannelSettings } from "./viewerChannelSettings";
3
+ /**
4
+ * @param {Object[]} controlPoints - array of `{x:number, opacity:number,
5
+ * color:string}`, where `x` is a histogram bin index.
6
+ * @returns {Uint8Array} array of length 256*4 representing the rgba values of
7
+ * the gradient
8
+ */
9
+ export declare function binIndexedControlPointsToLut(controlPoints: ControlPoint[]): Lut;
4
10
  /** Returns a default lookup table based on a min/max percentile of the current volume's data. */
5
11
  export declare function getDefaultLut(histogram: Histogram): Lut;
6
12
  /**
@@ -54,5 +60,3 @@ export declare function initializeLut(aimg: Volume, channelIndex: number, channe
54
60
  };
55
61
  export declare function controlPointsToRamp(controlPoints: ControlPoint[]): [number, number];
56
62
  export declare function rampToControlPoints([min, max]: [number, number]): ControlPoint[];
57
- /** Remaps an array of control points from an old range (as a 2-tuple) to a new one (extracted from a `Channel`) */
58
- export declare function remapControlPointsForChannel(controlPoints: ControlPoint[], oldRange: [number, number] | undefined, { rawMin, rawMax }: Channel): ControlPoint[];
@@ -1,4 +1,4 @@
1
- import { DocumentData, FirebaseFirestore } from "@firebase/firestore-types";
1
+ import type { DocumentData, FirebaseFirestore } from "@firebase/firestore-types";
2
2
  export interface DatasetMetaData {
3
3
  name: string;
4
4
  version: string;
@@ -1,4 +1,4 @@
1
- import { MutableRefObject } from "react";
1
+ import { type MutableRefObject } from "react";
2
2
  /**
3
3
  * Wraps a setter function and keeps a ref updated to follow the set value. Useful for making the most up-to-date value
4
4
  * of some state accessible to a closure that might be called after the value is updated.
@@ -1,4 +1,4 @@
1
- import { AxisName } from "../types";
1
+ import type { AxisName } from "../types";
2
2
  type PlayAxisName = AxisName | "t";
3
3
  export default class PlayControls {
4
4
  playingAxis: PlayAxisName | null;
@@ -1,5 +1,9 @@
1
- import { LoadSpec, PerChannelCallback, PrefetchDirection, RawArrayLoaderOptions, Volume, VolumeLoaderContext } from "@aics/vole-core";
2
- import { ThreadableVolumeLoader } from "@aics/vole-core/es/types/loaders/IVolumeLoader";
1
+ import type { LoadSpec, PrefetchDirection, RawArrayLoaderOptions, Volume, VolumeLoaderContext } from "@aics/vole-core";
2
+ import type { ThreadableVolumeLoader } from "@aics/vole-core/es/types/loaders/IVolumeLoader";
3
+ export type LoadSceneOptions = {
4
+ onCreateScene?: (volume: Volume, sceneIndex: number) => void;
5
+ onChannelLoaded?: (volume: Volume, channelIndex: number) => void;
6
+ };
3
7
  export default class SceneStore {
4
8
  context: VolumeLoaderContext;
5
9
  loaders: (ThreadableVolumeLoader | undefined)[];
@@ -10,8 +14,8 @@ export default class SceneStore {
10
14
  constructor(context: VolumeLoaderContext, paths: (string | string[] | RawArrayLoaderOptions)[]);
11
15
  /** Get the loader associated with the given scene index, or create it if it doesn't exist */
12
16
  private getLoader;
13
- loadScene(scene: number, image: Volume, loadSpec?: LoadSpec, onChannelLoaded?: PerChannelCallback): Promise<void>;
14
- createVolume(scene: number, loadSpec: LoadSpec, onChannelLoaded?: PerChannelCallback): Promise<Volume>;
17
+ loadScene(scene: number, image: Volume, loadSpec?: LoadSpec, options?: LoadSceneOptions): Promise<void>;
18
+ createVolume(scene: number, loadSpec: LoadSpec, onChannelLoaded?: (volume: Volume, channelIndex: number) => void): Promise<Volume>;
15
19
  syncMultichannelLoading(sync: boolean): void;
16
20
  setPrefetchPriority(priority: PrefetchDirection[]): void;
17
21
  }
@@ -0,0 +1,15 @@
1
+ import type { MetadataRecord } from "../types";
2
+ /**
3
+ * Writes a bundle of metadata records keyed by image URL to local storage.
4
+ *
5
+ * Returns `true` if all records fit into local storage, or `false` if at least one did not.
6
+ */
7
+ export declare function writeMetadata(meta: Record<string, MetadataRecord>): boolean;
8
+ /**
9
+ * Writes a scene `url` to local storage at the given `key`.
10
+ *
11
+ * Returns `false` if the entry did not fit in local storage, or `true` if it did.
12
+ */
13
+ export declare function writeScenes(key: string, url: string): boolean;
14
+ export declare function readStoredMetadata(scenes: (string | string[])[], skipCacheUpdate?: boolean): (MetadataRecord | undefined)[];
15
+ export declare function readStoredScenes(key: string, skipCacheUpdate?: boolean): string | undefined;