@aics/vole-app 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/LICENSE +33 -0
  2. package/LICENSE.txt +26 -0
  3. package/README.md +45 -0
  4. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.eot +0 -0
  5. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.js +2337 -0
  6. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.svg +604 -0
  7. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.ttf +0 -0
  8. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.woff +0 -0
  9. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.woff2 +0 -0
  10. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.eot +0 -0
  11. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.js +2336 -0
  12. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.svg +604 -0
  13. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.ttf +0 -0
  14. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.woff +0 -0
  15. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.woff2 +0 -0
  16. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.eot +0 -0
  17. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.js +2337 -0
  18. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.svg +604 -0
  19. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.ttf +0 -0
  20. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.woff +0 -0
  21. package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.woff2 +0 -0
  22. package/es/aics-image-viewer/assets/icons/axes.js +20 -0
  23. package/es/aics-image-viewer/assets/icons/boundingBox.js +18 -0
  24. package/es/aics-image-viewer/assets/icons/camera.js +15 -0
  25. package/es/aics-image-viewer/assets/icons/channels.js +15 -0
  26. package/es/aics-image-viewer/assets/icons/closePanel.js +18 -0
  27. package/es/aics-image-viewer/assets/icons/download.js +17 -0
  28. package/es/aics-image-viewer/assets/icons/dropdownArrow.js +15 -0
  29. package/es/aics-image-viewer/assets/icons/index.js +24 -0
  30. package/es/aics-image-viewer/assets/icons/metadata.js +15 -0
  31. package/es/aics-image-viewer/assets/icons/preferences.js +15 -0
  32. package/es/aics-image-viewer/assets/icons/resetView.js +16 -0
  33. package/es/aics-image-viewer/assets/icons/svg.d.js +0 -0
  34. package/es/aics-image-viewer/assets/icons/turnTable.js +18 -0
  35. package/es/aics-image-viewer/assets/styles/animatedEllipsis.css +21 -0
  36. package/es/aics-image-viewer/assets/styles/globals.css +35 -0
  37. package/es/aics-image-viewer/assets/styles/noui-slider-override.css +1 -0
  38. package/es/aics-image-viewer/assets/styles/variables.css +1 -0
  39. package/es/aics-image-viewer/components/App/ChannelUpdater.js +96 -0
  40. package/es/aics-image-viewer/components/App/index.js +849 -0
  41. package/es/aics-image-viewer/components/App/styles.css +60 -0
  42. package/es/aics-image-viewer/components/App/types.js +1 -0
  43. package/es/aics-image-viewer/components/AxisClipSliders/index.js +285 -0
  44. package/es/aics-image-viewer/components/AxisClipSliders/styles.css +257 -0
  45. package/es/aics-image-viewer/components/BottomPanel/index.js +70 -0
  46. package/es/aics-image-viewer/components/BottomPanel/styles.css +85 -0
  47. package/es/aics-image-viewer/components/CellViewerCanvasWrapper/index.js +113 -0
  48. package/es/aics-image-viewer/components/CellViewerCanvasWrapper/styles.css +12 -0
  49. package/es/aics-image-viewer/components/ChannelsWidget.js +100 -0
  50. package/es/aics-image-viewer/components/ChannelsWidgetRow/index.js +158 -0
  51. package/es/aics-image-viewer/components/ChannelsWidgetRow/styles.css +38 -0
  52. package/es/aics-image-viewer/components/ColorPicker.js +120 -0
  53. package/es/aics-image-viewer/components/ControlPanel/index.js +180 -0
  54. package/es/aics-image-viewer/components/ControlPanel/styles.css +169 -0
  55. package/es/aics-image-viewer/components/CustomizeWidget.js +46 -0
  56. package/es/aics-image-viewer/components/ErrorAlert/index.js +144 -0
  57. package/es/aics-image-viewer/components/ErrorAlert/styles.css +22 -0
  58. package/es/aics-image-viewer/components/GlobalVolumeControls.js +38 -0
  59. package/es/aics-image-viewer/components/MetadataViewer/index.js +99 -0
  60. package/es/aics-image-viewer/components/MetadataViewer/styles.css +81 -0
  61. package/es/aics-image-viewer/components/StyleProvider/index.js +210 -0
  62. package/es/aics-image-viewer/components/TfEditor/index.js +584 -0
  63. package/es/aics-image-viewer/components/TfEditor/styles.css +88 -0
  64. package/es/aics-image-viewer/components/Toolbar/DownloadButton.js +55 -0
  65. package/es/aics-image-viewer/components/Toolbar/ViewModeRadioButtons.js +22 -0
  66. package/es/aics-image-viewer/components/Toolbar/index.js +274 -0
  67. package/es/aics-image-viewer/components/Toolbar/styles.css +241 -0
  68. package/es/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.js +160 -0
  69. package/es/aics-image-viewer/components/ViewerStateProvider/index.js +261 -0
  70. package/es/aics-image-viewer/components/ViewerStateProvider/types.js +1 -0
  71. package/es/aics-image-viewer/components/shared/NumericInput/index.js +147 -0
  72. package/es/aics-image-viewer/components/shared/NumericInput/styles.css +64 -0
  73. package/es/aics-image-viewer/components/shared/SharedCheckBox.js +17 -0
  74. package/es/aics-image-viewer/components/shared/SliderRow/index.js +31 -0
  75. package/es/aics-image-viewer/components/shared/SliderRow/styles.css +19 -0
  76. package/es/aics-image-viewer/components/shared/SmarterSlider.js +40 -0
  77. package/es/aics-image-viewer/components/shared/ViewerIcon.js +22 -0
  78. package/es/aics-image-viewer/shared/colorPalette.js +19 -0
  79. package/es/aics-image-viewer/shared/constants.js +164 -0
  80. package/es/aics-image-viewer/shared/enums.js +18 -0
  81. package/es/aics-image-viewer/shared/types.js +6 -0
  82. package/es/aics-image-viewer/shared/utils/colorRepresentations.js +16 -0
  83. package/es/aics-image-viewer/shared/utils/controlPointsToLut.js +182 -0
  84. package/es/aics-image-viewer/shared/utils/hooks.js +51 -0
  85. package/es/aics-image-viewer/shared/utils/httpClient.js +57 -0
  86. package/es/aics-image-viewer/shared/utils/playControls.js +97 -0
  87. package/es/aics-image-viewer/shared/utils/sceneStore.js +140 -0
  88. package/es/aics-image-viewer/shared/utils/sliderValuesToImageValues.js +36 -0
  89. package/es/aics-image-viewer/shared/utils/test/viewerChannelSettings.test.js +132 -0
  90. package/es/aics-image-viewer/shared/utils/utilsService.js +54 -0
  91. package/es/aics-image-viewer/shared/utils/viewerChannelSettings.js +152 -0
  92. package/es/aics-image-viewer/shared/utils/viewerState.js +69 -0
  93. package/es/aics-image-viewer/shared/utils/webgl-debug.js +1103 -0
  94. package/es/index.js +4 -0
  95. package/package.json +130 -0
  96. package/type-declarations/aics-image-viewer/assets/icons/index.d.ts +14 -0
  97. package/type-declarations/aics-image-viewer/components/App/ChannelUpdater.d.ts +16 -0
  98. package/type-declarations/aics-image-viewer/components/App/index.d.ts +6 -0
  99. package/type-declarations/aics-image-viewer/components/App/types.d.ts +45 -0
  100. package/type-declarations/aics-image-viewer/components/AxisClipSliders/index.d.ts +24 -0
  101. package/type-declarations/aics-image-viewer/components/BottomPanel/index.d.ts +11 -0
  102. package/type-declarations/aics-image-viewer/components/CellViewerCanvasWrapper/index.d.ts +33 -0
  103. package/type-declarations/aics-image-viewer/components/ChannelsWidget.d.ts +19 -0
  104. package/type-declarations/aics-image-viewer/components/ChannelsWidgetRow/index.d.ts +17 -0
  105. package/type-declarations/aics-image-viewer/components/ColorPicker.d.ts +13 -0
  106. package/type-declarations/aics-image-viewer/components/ControlPanel/index.d.ts +20 -0
  107. package/type-declarations/aics-image-viewer/components/CustomizeWidget.d.ts +15 -0
  108. package/type-declarations/aics-image-viewer/components/ErrorAlert/index.d.ts +12 -0
  109. package/type-declarations/aics-image-viewer/components/GlobalVolumeControls.d.ts +21 -0
  110. package/type-declarations/aics-image-viewer/components/MetadataViewer/index.d.ts +7 -0
  111. package/type-declarations/aics-image-viewer/components/StyleProvider/index.d.ts +5 -0
  112. package/type-declarations/aics-image-viewer/components/TfEditor/index.d.ts +19 -0
  113. package/type-declarations/aics-image-viewer/components/Toolbar/DownloadButton.d.ts +8 -0
  114. package/type-declarations/aics-image-viewer/components/Toolbar/ViewModeRadioButtons.d.ts +8 -0
  115. package/type-declarations/aics-image-viewer/components/Toolbar/index.d.ts +31 -0
  116. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.d.ts +34 -0
  117. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/index.d.ts +33 -0
  118. package/type-declarations/aics-image-viewer/components/ViewerStateProvider/types.d.ts +105 -0
  119. package/type-declarations/aics-image-viewer/components/shared/NumericInput/index.d.ts +19 -0
  120. package/type-declarations/aics-image-viewer/components/shared/SharedCheckBox.d.ts +9 -0
  121. package/type-declarations/aics-image-viewer/components/shared/SliderRow/index.d.ts +17 -0
  122. package/type-declarations/aics-image-viewer/components/shared/SmarterSlider.d.ts +5 -0
  123. package/type-declarations/aics-image-viewer/components/shared/ViewerIcon.d.ts +9 -0
  124. package/type-declarations/aics-image-viewer/shared/constants.d.ts +40 -0
  125. package/type-declarations/aics-image-viewer/shared/enums.d.ts +15 -0
  126. package/type-declarations/aics-image-viewer/shared/types.d.ts +15 -0
  127. package/type-declarations/aics-image-viewer/shared/utils/colorRepresentations.d.ts +10 -0
  128. package/type-declarations/aics-image-viewer/shared/utils/controlPointsToLut.d.ts +53 -0
  129. package/type-declarations/aics-image-viewer/shared/utils/hooks.d.ts +14 -0
  130. package/type-declarations/aics-image-viewer/shared/utils/playControls.d.ts +27 -0
  131. package/type-declarations/aics-image-viewer/shared/utils/sceneStore.d.ts +17 -0
  132. package/type-declarations/aics-image-viewer/shared/utils/sliderValuesToImageValues.d.ts +10 -0
  133. package/type-declarations/aics-image-viewer/shared/utils/viewerChannelSettings.d.ts +46 -0
  134. package/type-declarations/aics-image-viewer/shared/utils/viewerState.d.ts +10 -0
  135. package/type-declarations/index.d.ts +7 -0
package/es/index.js ADDED
@@ -0,0 +1,4 @@
1
+ import ImageViewerApp from "./aics-image-viewer/components/App";
2
+ import ViewerStateProvider from "./aics-image-viewer/components/ViewerStateProvider";
3
+ export { ViewMode, RenderMode, ImageType } from "./aics-image-viewer/shared/enums";
4
+ export { ImageViewerApp, ViewerStateProvider };
package/package.json ADDED
@@ -0,0 +1,130 @@
1
+ {
2
+ "name": "@aics/vole-app",
3
+ "version": "2.11.0",
4
+ "description": "web view of cell volume images",
5
+ "repository": "github:allen-cell-animated/vole-app",
6
+ "main": "es/index.js",
7
+ "module": "es/index.js",
8
+ "browser": "es/index.js",
9
+ "types": "type-declarations",
10
+ "files": [
11
+ "es",
12
+ "type-declarations",
13
+ "README.md",
14
+ "package.json"
15
+ ],
16
+ "publishConfig": {
17
+ "registry": "https://registry.npmjs.org/",
18
+ "access": "public"
19
+ },
20
+ "scripts": {
21
+ "start": "webpack serve --config webpack.dev.js --env env=dev",
22
+ "gh-build-nightly": "webpack --config webpack.dev.js --env env=production basename=/vole-app/",
23
+ "gh-build-release": "webpack --config webpack.dev.js --env env=production basename=/website-3d-cell-viewer-release/",
24
+ "s3-build": "webpack --config webpack.dev.js --env env=production",
25
+ "docker-build": "webpack --config webpack.common.js --env env=production",
26
+ "dev": "webpack --config webpack.dev.js --env env=dev",
27
+ "lint": "eslint --config ./.eslintrc --ignore-path ./.eslintignore --ext .jsx --ext .js --ext .ts --ext .tsx ./",
28
+ "test": "jest --coverage --passWithNoTests",
29
+ "test:github-action": "jest --silent --passWithNoTests --ci --coverage --coverageReporters=\"text\" --coverageReporters=\"text-summary\" --outputFile=\"report.json\"",
30
+ "typeCheck": "tsc -p tsconfig.json --noEmit",
31
+ "generateTypes": "tsc -p tsconfig.base.json --emitDeclarationOnly",
32
+ "transpileES": "cross-env TS_NODE_PROJECT=tsconfig.es.json BABEL_ENV=es babel src --out-dir es --extensions \".js,.jsx,.ts,.tsx,.svg\" --ignore src/**/*.test.*",
33
+ "build": "npm-run-all generateTypes postcss transpileES",
34
+ "postcss": "postcss src/**/*.css --base src --dir es",
35
+ "publish-patch": "npm version patch | xargs -I {} sh -c 'git push origin {}'",
36
+ "postpublish-patch": "git push origin main",
37
+ "prepare": "cross-env DEPLOYMENT_ENV=production npm run build",
38
+ "predeploy": "cross-env DEPLOYMENT_ENV=production npm run dev",
39
+ "deploy": "gh-pages -d imageviewer -t true"
40
+ },
41
+ "author": "Megan Riel-Mehan",
42
+ "license": "ISC",
43
+ "dependencies": {
44
+ "@aics/vole-core": "^3.12.4",
45
+ "@ant-design/icons": "^5.2.5",
46
+ "@fortawesome/fontawesome-svg-core": "^6.5.2",
47
+ "@fortawesome/free-solid-svg-icons": "^6.5.2",
48
+ "@fortawesome/react-fontawesome": "^0.2.2",
49
+ "color-string": "^1.5.3",
50
+ "d3": "^7.9.0",
51
+ "fuse.js": "^7.0.0",
52
+ "lodash": "^4.17.20",
53
+ "nouislider-react": "^3.4.2",
54
+ "react-color": "^2.19.3",
55
+ "react-router-dom": "^6.26.2",
56
+ "styled-components": "^6.1.13",
57
+ "usehooks-ts": "^3.1.0"
58
+ },
59
+ "peerDependencies": {
60
+ "antd": "^5.16.2",
61
+ "react": "18.x",
62
+ "react-dom": "18.x",
63
+ "three": "^0.171.0"
64
+ },
65
+ "devDependencies": {
66
+ "@babel/cli": "^7.14.5",
67
+ "@babel/core": "^7.14.6",
68
+ "@babel/preset-env": "^7.23.3",
69
+ "@babel/preset-react": "^7.14.5",
70
+ "@babel/preset-typescript": "^7.14.5",
71
+ "@babel/runtime": "^7.14.6",
72
+ "@dr.pogodin/babel-preset-svgr": "^1.8.0",
73
+ "@trivago/prettier-plugin-sort-imports": "^4.3.0",
74
+ "@types/color-string": "^1.5.2",
75
+ "@types/d3": "^7.4.3",
76
+ "@types/jest": "^27.4.0",
77
+ "@types/lodash": "^4.14.185",
78
+ "@types/react": "^18.x",
79
+ "@types/react-color": "^3.0.12",
80
+ "@types/react-dom": "^18.x",
81
+ "@types/three": "^0.171.0",
82
+ "@typescript-eslint/eslint-plugin": "^5.31.0",
83
+ "@typescript-eslint/parser": "^5.31.0",
84
+ "antd": "^5.16.2",
85
+ "axios": "^0.21.1",
86
+ "babel-loader": "^8.2.2",
87
+ "babel-plugin-replace-import-extension": "^1.1.3",
88
+ "clean-webpack-plugin": "^4.0.0-alpha.0",
89
+ "command-line-args": "^5.1.1",
90
+ "copy-webpack-plugin": "^11.0.0",
91
+ "cross-env": "^7.0.3",
92
+ "css-loader": "^6.2.0",
93
+ "esbuild": "^0.14.50",
94
+ "esbuild-jest": "^0.5.0",
95
+ "eslint": "^8.20.0",
96
+ "eslint-plugin-react": "^7.30.1",
97
+ "file-loader": "^6.2.0",
98
+ "firebase": "^7.x",
99
+ "gh-pages": "^4.0.0",
100
+ "html-webpack-plugin": "^5.3.2",
101
+ "jest": "^27.0.6",
102
+ "mini-css-extract-plugin": "^2.9.1",
103
+ "morgan": "^1.9.1",
104
+ "npm-run-all": "^4.1.5",
105
+ "postcss": "^8.4.47",
106
+ "postcss-cli": "^11.0.0",
107
+ "postcss-discard-comments": "^7.0.3",
108
+ "postcss-extend-rule": "^4.0.0",
109
+ "postcss-import": "^16.1.0",
110
+ "postcss-loader": "^8.1.1",
111
+ "postcss-mixins": "^11.0.3",
112
+ "postcss-nested": "^6.2.0",
113
+ "postcss-simple-vars": "^7.0.1",
114
+ "postcss-url": "^10.1.3",
115
+ "prettier": "^3.3.3",
116
+ "prop-types": "^15.5.10",
117
+ "react": "^18.3.1",
118
+ "react-dom": "^18.3.1",
119
+ "resolve-url-loader": "^5.0.0",
120
+ "style-loader": "^4.0.0",
121
+ "ts-jest": "^27.1.2",
122
+ "typescript": "^4.3.5",
123
+ "url-loader": "^4.1.1",
124
+ "webpack": "^5.89.0",
125
+ "webpack-cli": "^4.7.2",
126
+ "webpack-dev-server": "^4.9.3",
127
+ "webpack-merge": "^5.8.0",
128
+ "webpack-shell-plugin": "^0.5.0"
129
+ }
130
+ }
@@ -0,0 +1,14 @@
1
+ declare const _default: {
2
+ axes: any;
3
+ boundingBox: any;
4
+ camera: any;
5
+ channels: any;
6
+ closePanel: any;
7
+ download: any;
8
+ dropdownArrow: any;
9
+ metadata: any;
10
+ preferences: any;
11
+ resetView: any;
12
+ turnTable: any;
13
+ };
14
+ export default _default;
@@ -0,0 +1,16 @@
1
+ import { View3d, Volume } from "@aics/vole-core";
2
+ import React from "react";
3
+ import { ChannelState } from "../ViewerStateProvider/types";
4
+ interface ChannelUpdaterProps {
5
+ index: number;
6
+ channelState: ChannelState;
7
+ view3d: View3d;
8
+ image: Volume | null;
9
+ version: number;
10
+ }
11
+ /**
12
+ * A component that doesn't render anything, but reacts to the provided `ChannelState`
13
+ * and keeps it in sync with the viewer.
14
+ */
15
+ declare const ChannelUpdater: React.FC<ChannelUpdaterProps>;
16
+ export default ChannelUpdater;
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ import type { AppProps } from "./types";
3
+ import "../../assets/styles/globals.css";
4
+ import "./styles.css";
5
+ declare const App: React.FC<AppProps>;
6
+ export default App;
@@ -0,0 +1,45 @@
1
+ import type { RawArrayData, RawArrayInfo, View3d, Volume } from "@aics/vole-core";
2
+ import { MutableRefObject } from "react";
3
+ import type { MetadataRecord } from "../../shared/types";
4
+ import type { ViewerChannelSettings } from "../../shared/utils/viewerChannelSettings";
5
+ import type { ViewerState } from "../ViewerStateProvider/types";
6
+ /** `typeof useEffect`, but the effect handler takes a `Volume` as an argument */
7
+ export type UseImageEffectType = (effect: (image: Volume) => void | (() => void), deps: React.DependencyList) => void;
8
+ type ControlNames = "alphaMaskSlider" | "autoRotateButton" | "axisClipSliders" | "brightnessSlider" | "backgroundColorPicker" | "boundingBoxColorPicker" | "colorPresetsDropdown" | "densitySlider" | "levelsSliders" | "interpolationControl" | "saveSurfaceButtons" | "fovCellSwitchControls" | "viewModeRadioButtons" | "resetCameraButton" | "showAxesButton" | "showBoundingBoxButton" | "metadataViewer";
9
+ /** Show/hide different elements of the UI */
10
+ export type ControlVisibilityFlags = {
11
+ [K in ControlNames]: boolean;
12
+ };
13
+ export type MultisceneUrls = {
14
+ scenes: (string | string[])[];
15
+ };
16
+ export interface AppProps {
17
+ rawData?: RawArrayData;
18
+ rawDims?: RawArrayInfo;
19
+ /**
20
+ * URL(s) from which to fetch the image. You can pass a `string` to load from a single data source, or get fancier:
21
+ * - Pass an array of strings to assemble a single volume with all sources' channels, in order.
22
+ * - Pass an object with a key `scenes: (string | string[])[]` to load multiple volumes as a *multi-scene collection*.
23
+ * Each string or string array within the `scenes` array is treated as a single volume with one or more sources.
24
+ */
25
+ imageUrl: string | MultisceneUrls;
26
+ parentImageUrl?: string | MultisceneUrls;
27
+ viewerChannelSettings?: ViewerChannelSettings;
28
+ appHeight: string;
29
+ cellId: string;
30
+ visibleControls?: Partial<ControlVisibilityFlags>;
31
+ viewerSettings?: Partial<ViewerState>;
32
+ imageDownloadHref: string;
33
+ parentImageDownloadHref: string;
34
+ pixelSize?: [number, number, number];
35
+ canvasMargin: string;
36
+ transform?: {
37
+ translation: [number, number, number];
38
+ rotation: [number, number, number];
39
+ };
40
+ metadata?: MetadataRecord;
41
+ view3dRef?: MutableRefObject<View3d | null>;
42
+ metadataFormatter?: (metadata: MetadataRecord) => MetadataRecord;
43
+ onControlPanelToggle?: (collapsed: boolean) => void;
44
+ }
45
+ export {};
@@ -0,0 +1,24 @@
1
+ import { Volume } from "@aics/vole-core";
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";
7
+ import "./styles.css";
8
+ type AxisClipSlidersProps = {
9
+ mode: ViewMode;
10
+ image: Volume | null;
11
+ changeViewerSetting: ViewerSettingUpdater;
12
+ numSlices: PerAxis<number>;
13
+ numSlicesLoaded: PerAxis<number>;
14
+ numScenes: number;
15
+ region: PerAxis<[number, number]>;
16
+ slices: PerAxis<number>;
17
+ numTimesteps: number;
18
+ time: number;
19
+ scene: number;
20
+ playingAxis: AxisName | "t" | null;
21
+ playControls: PlayControls;
22
+ };
23
+ declare const AxisClipSliders: React.FC<AxisClipSlidersProps>;
24
+ export default AxisClipSliders;
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import "./styles.css";
3
+ type BottomPanelProps = {
4
+ title?: string;
5
+ onVisibleChange?: (visible: boolean) => void;
6
+ onVisibleChangeEnd?: (visible: boolean) => void;
7
+ children?: React.ReactNode;
8
+ height?: number;
9
+ };
10
+ declare const BottomPanel: React.FC<BottomPanelProps>;
11
+ export default BottomPanel;
@@ -0,0 +1,33 @@
1
+ import { View3d, Volume } from "@aics/vole-core";
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";
7
+ import "./styles.css";
8
+ type ViewerWrapperProps = {
9
+ view3d: View3d;
10
+ loadingImage: boolean;
11
+ appHeight: string;
12
+ image: Volume | null;
13
+ numSlices: PerAxis<number>;
14
+ numSlicesLoaded: PerAxis<number>;
15
+ playControls: PlayControls;
16
+ playingAxis: AxisName | "t" | null;
17
+ numTimesteps: number;
18
+ numScenes: number;
19
+ visibleControls: {
20
+ axisClipSliders: boolean;
21
+ };
22
+ onClippingPanelVisibleChange?: (panelOpen: boolean, hasTime: boolean, hasScenes: boolean, mode3d: boolean) => void;
23
+ onClippingPanelVisibleChangeEnd?: (panelOpen: 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
+ };
32
+ declare const _default: React.FC<Omit<ViewerWrapperProps, "viewMode" | "autorotate" | "region" | "slice" | "time" | "scene" | "changeViewerSetting">>;
33
+ export default _default;
@@ -0,0 +1,19 @@
1
+ import { Channel } from "@aics/vole-core";
2
+ import React from "react";
3
+ import type { IsosurfaceFormat } from "../shared/types";
4
+ import type { ColorArray, ColorObject } from "../shared/utils/colorRepresentations";
5
+ import type { ChannelGrouping, ViewerChannelSettings } from "../shared/utils/viewerChannelSettings";
6
+ import type { ChannelSettingUpdater, ChannelState } from "./ViewerStateProvider/types";
7
+ export type ChannelsWidgetProps = {
8
+ channelDataChannels: Channel[] | undefined;
9
+ channelGroupedByType: ChannelGrouping;
10
+ viewerChannelSettings?: ViewerChannelSettings;
11
+ saveIsosurface: (channelIndex: number, type: IsosurfaceFormat) => void;
12
+ onApplyColorPresets: (presets: ColorArray[]) => void;
13
+ filterFunc?: (key: string) => boolean;
14
+ onColorChangeComplete?: (newRGB: ColorObject, oldRGB?: ColorObject, index?: number) => void;
15
+ channelSettings: ChannelState[];
16
+ changeChannelSetting: ChannelSettingUpdater;
17
+ };
18
+ declare const _default: React.FC<Omit<ChannelsWidgetProps, "channelSettings" | "changeChannelSetting">>;
19
+ export default _default;
@@ -0,0 +1,17 @@
1
+ import { Channel } from "@aics/vole-core";
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";
6
+ import "./styles.css";
7
+ interface ChannelsWidgetRowProps {
8
+ index: number;
9
+ name: string;
10
+ channelState: ChannelState;
11
+ channelDataForChannel: Channel;
12
+ changeChannelSetting: ChannelSettingUpdater;
13
+ saveIsosurface: (channelIndex: number, type: IsosurfaceFormat) => void;
14
+ onColorChangeComplete?: (newRGB: ColorObject, oldRGB?: ColorObject, index?: number) => void;
15
+ }
16
+ declare const ChannelsWidgetRow: React.FC<ChannelsWidgetRowProps>;
17
+ export default ChannelsWidgetRow;
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ import { ColorObject } from "../shared/utils/colorRepresentations";
3
+ type ColorChangeHandler = (currentColor: ColorObject, prevColor?: ColorObject, idx?: number) => void;
4
+ interface ColorPickerProps {
5
+ color: ColorObject;
6
+ width: number;
7
+ onColorChange?: ColorChangeHandler;
8
+ onColorChangeComplete?: ColorChangeHandler;
9
+ idx?: any;
10
+ disableAlpha?: boolean;
11
+ }
12
+ declare const ColorPicker: React.FC<ColorPickerProps>;
13
+ export default ColorPicker;
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ import { MetadataRecord } from "../../shared/types";
3
+ import ChannelsWidget from "../ChannelsWidget";
4
+ import CustomizeWidget, { CustomizeWidgetProps } from "../CustomizeWidget";
5
+ import GlobalVolumeControls, { GlobalVolumeControlsProps } from "../GlobalVolumeControls";
6
+ import "./styles.css";
7
+ type PropsOf<T> = T extends React.ComponentType<infer P> ? P : never;
8
+ interface ControlPanelProps extends PropsOf<typeof ChannelsWidget>, PropsOf<typeof GlobalVolumeControls>, PropsOf<typeof CustomizeWidget> {
9
+ hasImage: boolean;
10
+ visibleControls: GlobalVolumeControlsProps["visibleControls"] & CustomizeWidgetProps["visibleControls"] & {
11
+ colorPresetsDropdown: boolean;
12
+ metadataViewer: boolean;
13
+ };
14
+ getMetadata: () => MetadataRecord;
15
+ collapsed: boolean;
16
+ setCollapsed: (value: boolean) => void;
17
+ resetToDefaultViewerState: () => void;
18
+ }
19
+ declare const _default: React.FC<Omit<ControlPanelProps, "resetToDefaultViewerState">>;
20
+ export default _default;
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ import { ColorArray } from "../shared/utils/colorRepresentations";
3
+ import { ViewerSettingUpdater } from "./ViewerStateProvider/types";
4
+ export interface CustomizeWidgetProps {
5
+ visibleControls: {
6
+ backgroundColorPicker: boolean;
7
+ boundingBoxColorPicker: boolean;
8
+ };
9
+ showBoundingBox: boolean;
10
+ backgroundColor: ColorArray;
11
+ boundingBoxColor: ColorArray;
12
+ changeViewerSetting: ViewerSettingUpdater;
13
+ }
14
+ declare const _default: React.FC<Omit<CustomizeWidgetProps, "showBoundingBox" | "boundingBoxColor" | "backgroundColor" | "changeViewerSetting">>;
15
+ export default _default;
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import "./styles.css";
3
+ export type ErrorAlertProps = {
4
+ errors: unknown;
5
+ /** The number of times we've seen an error of the type that is currently being displayed before */
6
+ firstErrorCount?: number;
7
+ afterClose?: () => void;
8
+ onSkipError?: () => void;
9
+ };
10
+ declare const ErrorAlert: React.FC<ErrorAlertProps>;
11
+ export declare const useErrorAlert: () => [React.ReactNode, (error: unknown) => void];
12
+ export default ErrorAlert;
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+ import { ViewerSettingUpdater } from "./ViewerStateProvider/types";
3
+ export interface GlobalVolumeControlsProps {
4
+ imageName: string | undefined;
5
+ pixelSize: [number, number, number];
6
+ visibleControls: {
7
+ alphaMaskSlider: boolean;
8
+ brightnessSlider: boolean;
9
+ densitySlider: boolean;
10
+ levelsSliders: boolean;
11
+ interpolationControl: boolean;
12
+ };
13
+ maskAlpha: number;
14
+ brightness: number;
15
+ density: number;
16
+ levels: [number, number, number];
17
+ interpolationEnabled: boolean;
18
+ changeViewerSetting: ViewerSettingUpdater;
19
+ }
20
+ declare const _default: React.FC<Omit<GlobalVolumeControlsProps, "maskAlpha" | "brightness" | "density" | "levels" | "interpolationEnabled" | "changeViewerSetting">>;
21
+ export default _default;
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ import { MetadataRecord } from "../../shared/types";
3
+ import "./styles.css";
4
+ declare const MetadataViewer: React.FC<{
5
+ metadata: MetadataRecord;
6
+ }>;
7
+ export default MetadataViewer;
@@ -0,0 +1,5 @@
1
+ import { PropsWithChildren, ReactElement } from "react";
2
+ /**
3
+ * Provides CSS variables and global styling for the image viewer.
4
+ */
5
+ export default function StyleProvider(props: PropsWithChildren<{}>): ReactElement;
@@ -0,0 +1,19 @@
1
+ import { Channel, ControlPoint } from "@aics/vole-core";
2
+ import "nouislider/distribute/nouislider.css";
3
+ import React from "react";
4
+ import type { SingleChannelSettingUpdater } from "../ViewerStateProvider/types";
5
+ import "./styles.css";
6
+ type TfEditorProps = {
7
+ id: string;
8
+ width: number;
9
+ height: number;
10
+ channelData: Channel;
11
+ changeChannelSetting: SingleChannelSettingUpdater;
12
+ colorizeEnabled: boolean;
13
+ colorizeAlpha: number;
14
+ useControlPoints: boolean;
15
+ controlPoints: ControlPoint[];
16
+ ramp: [number, number];
17
+ };
18
+ declare const TfEditor: React.FC<TfEditorProps>;
19
+ export default TfEditor;
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ interface DownloadButtonProps {
3
+ cellDownloadHref: string;
4
+ fovDownloadHref: string;
5
+ hasFov: boolean;
6
+ }
7
+ declare const DownloadButton: React.FC<DownloadButtonProps>;
8
+ export default DownloadButton;
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import { ViewMode } from "../../shared/enums";
3
+ interface ViewModeRadioButtonsProps {
4
+ mode: ViewMode;
5
+ onViewModeChange: (newMode: ViewMode) => void;
6
+ }
7
+ declare const ViewModeRadioButtons: React.FC<ViewModeRadioButtonsProps>;
8
+ export default ViewModeRadioButtons;
@@ -0,0 +1,31 @@
1
+ import React from "react";
2
+ import { ViewerSettingUpdater } from "../ViewerStateProvider/types";
3
+ import { ImageType, RenderMode, ViewMode } from "../../shared/enums";
4
+ import "./styles.css";
5
+ type ToolbarProps = {
6
+ cellDownloadHref: string;
7
+ fovDownloadHref: string;
8
+ hasCellId: boolean;
9
+ hasParentImage: boolean;
10
+ canPathTrace: boolean;
11
+ resetCamera: () => void;
12
+ downloadScreenshot: () => void;
13
+ visibleControls: {
14
+ autoRotateButton: boolean;
15
+ viewModeRadioButtons: boolean;
16
+ fovCellSwitchControls: boolean;
17
+ resetCameraButton: boolean;
18
+ showAxesButton: boolean;
19
+ showBoundingBoxButton: boolean;
20
+ };
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
+ };
30
+ declare const _default: React.FC<Omit<ToolbarProps, "viewMode" | "renderMode" | "imageType" | "showAxes" | "showBoundingBox" | "autorotate" | "changeViewerSetting" | "resetToSavedViewerState">>;
31
+ export default _default;
@@ -0,0 +1,34 @@
1
+ /// <reference types="react" />
2
+ import { ViewerState, ViewerStateContextType, ResetState } from "./types";
3
+ import { ViewerChannelSettings } from "../../shared/utils/viewerChannelSettings";
4
+ /**
5
+ * Provides reset functionality for the viewer and channel states.
6
+ */
7
+ export default class ResetStateProvider implements ResetState {
8
+ savedViewerState: Partial<ViewerState>;
9
+ savedViewerChannelSettings: ViewerChannelSettings | undefined;
10
+ useDefaultViewerChannelSettings: boolean;
11
+ channelsToReset: Set<number>;
12
+ channelsToResetOnLoad: Set<number>;
13
+ ref: React.MutableRefObject<ViewerStateContextType>;
14
+ constructor(viewerStateRef: React.MutableRefObject<ViewerStateContextType>);
15
+ setSavedViewerState(state: Partial<ViewerState>): void;
16
+ setSavedViewerChannelSettings(settings: ViewerChannelSettings | undefined): void;
17
+ getChannelsAwaitingReset(): Set<number>;
18
+ getChannelsAwaitingResetOnLoad(): Set<number>;
19
+ onResetChannel(channelIndex: number): void;
20
+ /**
21
+ * Returns the current viewer channel settings that the viewer should use when
22
+ * resetting channels to an initial state.
23
+ */
24
+ getCurrentViewerChannelSettings(): ViewerChannelSettings | undefined;
25
+ /**
26
+ * Helper method. Resets the viewer and all channels to the provided state. If new data needs to
27
+ * be loaded, handles setup so the reset will be applied to each channel as it loads in.
28
+ */
29
+ private resetToState;
30
+ /** Resets to the initial saved state of the viewer, as shown to the user on load. */
31
+ resetToSavedViewerState(): void;
32
+ /** Reset to global default viewer state, as if loading the volume with no parameters. */
33
+ resetToDefaultViewerState(): void;
34
+ }
@@ -0,0 +1,33 @@
1
+ import React from "react";
2
+ import type { ViewerState, ViewerStateContextType } from "./types";
3
+ export declare const ALL_VIEWER_STATE_KEYS: (keyof ViewerState | "changeViewerSetting" | "setChannelSettings" | "channelSettings" | "changeChannelSetting" | "applyColorPresets" | keyof import("./types").ResetState)[];
4
+ type NoNull<T> = {
5
+ [K in keyof T]: NonNullable<T[K]>;
6
+ };
7
+ type ContextRefType = NoNull<React.MutableRefObject<ViewerStateContextType>>;
8
+ export declare const ViewerStateContext: React.Context<{
9
+ ref: ContextRefType;
10
+ }>;
11
+ /** Provides a central store for the state of the viewer, and the methods to update it. */
12
+ declare const ViewerStateProvider: React.FC<{
13
+ viewerSettings?: Partial<ViewerState>;
14
+ children?: React.ReactNode;
15
+ }>;
16
+ /**
17
+ * Higher-order component that connects a component to the viewer state context.
18
+ *
19
+ * Accepts a `component` and an array of `keys` from the viewer state context, and returns a new memoized component
20
+ * which "subscribes" to only those fields of state, and will not re-render if other fields change. This works by
21
+ * creating a component which is "split in two" as described
22
+ * [here](https://react.dev/reference/react/memo#updating-a-memoized-component-using-a-context).
23
+ *
24
+ * NOTE that while higher-order components don't seem to be explicitly considered an anti-pattern, they don't appear in
25
+ * modern documentation because they are "[not commonly used in modern React
26
+ * code](https://legacy.reactjs.org/docs/higher-order-components.html)." React-redux, which inspired this "connect"
27
+ * pattern, has also generally moved away from this pattern [in favor of a hooks-based
28
+ * approach](https://react-redux.js.org/api/hooks). I too would love to use hooks to connect to viewer state, but there
29
+ * is currently no way to hook into context without agreeing to re-render on every change. I feel okay using a higher-
30
+ * order component in this case because, analogous to a custom hook, it extends a provided primitive HOC (`memo`).
31
+ */
32
+ export declare function connectToViewerState<Keys extends keyof ViewerStateContextType, Props extends Pick<ViewerStateContextType, Keys>>(component: React.FC<Props>, keys: Keys[]): React.FC<Omit<Props, Keys>>;
33
+ export default ViewerStateProvider;