@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.
- package/LICENSE +33 -0
- package/LICENSE.txt +26 -0
- package/README.md +45 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.eot +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.js +2337 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.svg +604 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.ttf +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.woff +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-500.woff2 +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.eot +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.js +2336 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.svg +604 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.ttf +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.woff +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-700.woff2 +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.eot +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.js +2337 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.svg +604 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.ttf +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.woff +0 -0
- package/es/aics-image-viewer/assets/fonts/open-sans/open-sans-regular.woff2 +0 -0
- package/es/aics-image-viewer/assets/icons/axes.js +20 -0
- package/es/aics-image-viewer/assets/icons/boundingBox.js +18 -0
- package/es/aics-image-viewer/assets/icons/camera.js +15 -0
- package/es/aics-image-viewer/assets/icons/channels.js +15 -0
- package/es/aics-image-viewer/assets/icons/closePanel.js +18 -0
- package/es/aics-image-viewer/assets/icons/download.js +17 -0
- package/es/aics-image-viewer/assets/icons/dropdownArrow.js +15 -0
- package/es/aics-image-viewer/assets/icons/index.js +24 -0
- package/es/aics-image-viewer/assets/icons/metadata.js +15 -0
- package/es/aics-image-viewer/assets/icons/preferences.js +15 -0
- package/es/aics-image-viewer/assets/icons/resetView.js +16 -0
- package/es/aics-image-viewer/assets/icons/svg.d.js +0 -0
- package/es/aics-image-viewer/assets/icons/turnTable.js +18 -0
- package/es/aics-image-viewer/assets/styles/animatedEllipsis.css +21 -0
- package/es/aics-image-viewer/assets/styles/globals.css +35 -0
- package/es/aics-image-viewer/assets/styles/noui-slider-override.css +1 -0
- package/es/aics-image-viewer/assets/styles/variables.css +1 -0
- package/es/aics-image-viewer/components/App/ChannelUpdater.js +96 -0
- package/es/aics-image-viewer/components/App/index.js +849 -0
- package/es/aics-image-viewer/components/App/styles.css +60 -0
- package/es/aics-image-viewer/components/App/types.js +1 -0
- package/es/aics-image-viewer/components/AxisClipSliders/index.js +285 -0
- package/es/aics-image-viewer/components/AxisClipSliders/styles.css +257 -0
- package/es/aics-image-viewer/components/BottomPanel/index.js +70 -0
- package/es/aics-image-viewer/components/BottomPanel/styles.css +85 -0
- package/es/aics-image-viewer/components/CellViewerCanvasWrapper/index.js +113 -0
- package/es/aics-image-viewer/components/CellViewerCanvasWrapper/styles.css +12 -0
- package/es/aics-image-viewer/components/ChannelsWidget.js +100 -0
- package/es/aics-image-viewer/components/ChannelsWidgetRow/index.js +158 -0
- package/es/aics-image-viewer/components/ChannelsWidgetRow/styles.css +38 -0
- package/es/aics-image-viewer/components/ColorPicker.js +120 -0
- package/es/aics-image-viewer/components/ControlPanel/index.js +180 -0
- package/es/aics-image-viewer/components/ControlPanel/styles.css +169 -0
- package/es/aics-image-viewer/components/CustomizeWidget.js +46 -0
- package/es/aics-image-viewer/components/ErrorAlert/index.js +144 -0
- package/es/aics-image-viewer/components/ErrorAlert/styles.css +22 -0
- package/es/aics-image-viewer/components/GlobalVolumeControls.js +38 -0
- package/es/aics-image-viewer/components/MetadataViewer/index.js +99 -0
- package/es/aics-image-viewer/components/MetadataViewer/styles.css +81 -0
- package/es/aics-image-viewer/components/StyleProvider/index.js +210 -0
- package/es/aics-image-viewer/components/TfEditor/index.js +584 -0
- package/es/aics-image-viewer/components/TfEditor/styles.css +88 -0
- package/es/aics-image-viewer/components/Toolbar/DownloadButton.js +55 -0
- package/es/aics-image-viewer/components/Toolbar/ViewModeRadioButtons.js +22 -0
- package/es/aics-image-viewer/components/Toolbar/index.js +274 -0
- package/es/aics-image-viewer/components/Toolbar/styles.css +241 -0
- package/es/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.js +160 -0
- package/es/aics-image-viewer/components/ViewerStateProvider/index.js +261 -0
- package/es/aics-image-viewer/components/ViewerStateProvider/types.js +1 -0
- package/es/aics-image-viewer/components/shared/NumericInput/index.js +147 -0
- package/es/aics-image-viewer/components/shared/NumericInput/styles.css +64 -0
- package/es/aics-image-viewer/components/shared/SharedCheckBox.js +17 -0
- package/es/aics-image-viewer/components/shared/SliderRow/index.js +31 -0
- package/es/aics-image-viewer/components/shared/SliderRow/styles.css +19 -0
- package/es/aics-image-viewer/components/shared/SmarterSlider.js +40 -0
- package/es/aics-image-viewer/components/shared/ViewerIcon.js +22 -0
- package/es/aics-image-viewer/shared/colorPalette.js +19 -0
- package/es/aics-image-viewer/shared/constants.js +164 -0
- package/es/aics-image-viewer/shared/enums.js +18 -0
- package/es/aics-image-viewer/shared/types.js +6 -0
- package/es/aics-image-viewer/shared/utils/colorRepresentations.js +16 -0
- package/es/aics-image-viewer/shared/utils/controlPointsToLut.js +182 -0
- package/es/aics-image-viewer/shared/utils/hooks.js +51 -0
- package/es/aics-image-viewer/shared/utils/httpClient.js +57 -0
- package/es/aics-image-viewer/shared/utils/playControls.js +97 -0
- package/es/aics-image-viewer/shared/utils/sceneStore.js +140 -0
- package/es/aics-image-viewer/shared/utils/sliderValuesToImageValues.js +36 -0
- package/es/aics-image-viewer/shared/utils/test/viewerChannelSettings.test.js +132 -0
- package/es/aics-image-viewer/shared/utils/utilsService.js +54 -0
- package/es/aics-image-viewer/shared/utils/viewerChannelSettings.js +152 -0
- package/es/aics-image-viewer/shared/utils/viewerState.js +69 -0
- package/es/aics-image-viewer/shared/utils/webgl-debug.js +1103 -0
- package/es/index.js +4 -0
- package/package.json +130 -0
- package/type-declarations/aics-image-viewer/assets/icons/index.d.ts +14 -0
- package/type-declarations/aics-image-viewer/components/App/ChannelUpdater.d.ts +16 -0
- package/type-declarations/aics-image-viewer/components/App/index.d.ts +6 -0
- package/type-declarations/aics-image-viewer/components/App/types.d.ts +45 -0
- package/type-declarations/aics-image-viewer/components/AxisClipSliders/index.d.ts +24 -0
- package/type-declarations/aics-image-viewer/components/BottomPanel/index.d.ts +11 -0
- package/type-declarations/aics-image-viewer/components/CellViewerCanvasWrapper/index.d.ts +33 -0
- package/type-declarations/aics-image-viewer/components/ChannelsWidget.d.ts +19 -0
- package/type-declarations/aics-image-viewer/components/ChannelsWidgetRow/index.d.ts +17 -0
- package/type-declarations/aics-image-viewer/components/ColorPicker.d.ts +13 -0
- package/type-declarations/aics-image-viewer/components/ControlPanel/index.d.ts +20 -0
- package/type-declarations/aics-image-viewer/components/CustomizeWidget.d.ts +15 -0
- package/type-declarations/aics-image-viewer/components/ErrorAlert/index.d.ts +12 -0
- package/type-declarations/aics-image-viewer/components/GlobalVolumeControls.d.ts +21 -0
- package/type-declarations/aics-image-viewer/components/MetadataViewer/index.d.ts +7 -0
- package/type-declarations/aics-image-viewer/components/StyleProvider/index.d.ts +5 -0
- package/type-declarations/aics-image-viewer/components/TfEditor/index.d.ts +19 -0
- package/type-declarations/aics-image-viewer/components/Toolbar/DownloadButton.d.ts +8 -0
- package/type-declarations/aics-image-viewer/components/Toolbar/ViewModeRadioButtons.d.ts +8 -0
- package/type-declarations/aics-image-viewer/components/Toolbar/index.d.ts +31 -0
- package/type-declarations/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.d.ts +34 -0
- package/type-declarations/aics-image-viewer/components/ViewerStateProvider/index.d.ts +33 -0
- package/type-declarations/aics-image-viewer/components/ViewerStateProvider/types.d.ts +105 -0
- package/type-declarations/aics-image-viewer/components/shared/NumericInput/index.d.ts +19 -0
- package/type-declarations/aics-image-viewer/components/shared/SharedCheckBox.d.ts +9 -0
- package/type-declarations/aics-image-viewer/components/shared/SliderRow/index.d.ts +17 -0
- package/type-declarations/aics-image-viewer/components/shared/SmarterSlider.d.ts +5 -0
- package/type-declarations/aics-image-viewer/components/shared/ViewerIcon.d.ts +9 -0
- package/type-declarations/aics-image-viewer/shared/constants.d.ts +40 -0
- package/type-declarations/aics-image-viewer/shared/enums.d.ts +15 -0
- package/type-declarations/aics-image-viewer/shared/types.d.ts +15 -0
- package/type-declarations/aics-image-viewer/shared/utils/colorRepresentations.d.ts +10 -0
- package/type-declarations/aics-image-viewer/shared/utils/controlPointsToLut.d.ts +53 -0
- package/type-declarations/aics-image-viewer/shared/utils/hooks.d.ts +14 -0
- package/type-declarations/aics-image-viewer/shared/utils/playControls.d.ts +27 -0
- package/type-declarations/aics-image-viewer/shared/utils/sceneStore.d.ts +17 -0
- package/type-declarations/aics-image-viewer/shared/utils/sliderValuesToImageValues.d.ts +10 -0
- package/type-declarations/aics-image-viewer/shared/utils/viewerChannelSettings.d.ts +46 -0
- package/type-declarations/aics-image-viewer/shared/utils/viewerState.d.ts +10 -0
- 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,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,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
|
+
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;
|
package/type-declarations/aics-image-viewer/components/ViewerStateProvider/ResetStateProvider.d.ts
ADDED
|
@@ -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;
|