diff --git a/example/package-lock.json b/example/package-lock.json index b2255813..40ffcbfb 100644 --- a/example/package-lock.json +++ b/example/package-lock.json @@ -1,341 +1,341 @@ -{ - "name": "react-volume-viewer-example", - "version": "0.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "react-volume-viewer-example", - "version": "0.0.0", - "dependencies": { - "react": "file:../node_modules/react", - "react-dom": "file:../node_modules/react-dom", - "react-scripts": "file:../node_modules/react-scripts", - "react-volume-viewer": "file:.." - } - }, - "..": { - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "@reach/listbox": "^0.16.2", - "aframe": "^1.2.0", - "aframe-event-set-component": "^5.0.0", - "aframe-orbit-controls": "^1.3.0", - "d3-scale": "^4.0.2", - "rc-slider": "^9.7.4" - }, - "devDependencies": { - "@babel/core": "^7.0.0", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-commonjs": "^21.0.0", - "@rollup/plugin-node-resolve": "^13.0.6", - "@rollup/plugin-url": "^6.1.0", - "babel-eslint": "^10.0.3", - "babel-preset-stage-0": "^6.24.1", - "cross-env": "^7.0.3", - "eslint-config-react-app": "^7.0.0", - "gh-pages": "^3.2.3", - "npm-run-all": "^4.1.5", - "prettier": "^2.4.1", - "prop-types": "^15.7.2", - "react": "^17.0.0", - "react-dom": "^17.0.0", - "react-scripts": "^5.0.0", - "rollup": "^2.59.0", - "rollup-plugin-peer-deps-external": "^2.2.4", - "rollup-plugin-postcss": "^4.0.1", - "styled-components": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^17.0.0", - "react-dom": "^17.0.0", - "styled-components": "^5.0.0" - } - }, - "../node_modules/react": { - "version": "17.0.2", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "../node_modules/react-dom": { - "version": "17.0.2", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "../node_modules/react-scripts": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.16.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@svgr/webpack": "^5.5.0", - "babel-jest": "^27.4.2", - "babel-loader": "^8.2.3", - "babel-plugin-named-asset-import": "^0.3.8", - "babel-preset-react-app": "^10.0.1", - "bfj": "^7.0.2", - "browserslist": "^4.18.1", - "camelcase": "^6.2.1", - "case-sensitive-paths-webpack-plugin": "^2.4.0", - "css-loader": "^6.5.1", - "css-minimizer-webpack-plugin": "^3.2.0", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.0", - "eslint-webpack-plugin": "^3.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "html-webpack-plugin": "^5.5.0", - "identity-obj-proxy": "^3.0.0", - "jest": "^27.4.3", - "jest-resolve": "^27.4.2", - "jest-watch-typeahead": "^1.0.0", - "mini-css-extract-plugin": "^2.4.5", - "postcss": "^8.4.4", - "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^6.2.1", - "postcss-normalize": "^10.0.1", - "postcss-preset-env": "^7.0.1", - "prompts": "^2.4.2", - "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.0", - "react-refresh": "^0.11.0", - "resolve": "^1.20.0", - "resolve-url-loader": "^4.0.0", - "sass-loader": "^12.3.0", - "semver": "^7.3.5", - "source-map-loader": "^3.0.0", - "style-loader": "^3.3.1", - "tailwindcss": "^3.0.2", - "terser-webpack-plugin": "^5.2.5", - "webpack": "^5.64.4", - "webpack-dev-server": "^4.6.0", - "webpack-manifest-plugin": "^4.0.2", - "workbox-webpack-plugin": "^6.4.1" - }, - "bin": { - "react-scripts": "bin/react-scripts.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - }, - "peerDependencies": { - "react": ">= 16", - "typescript": "^3.2.1 || ^4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/react": { - "resolved": "../node_modules/react", - "link": true - }, - "node_modules/react-dom": { - "resolved": "../node_modules/react-dom", - "link": true - }, - "node_modules/react-scripts": { - "resolved": "../node_modules/react-scripts", - "link": true - }, - "node_modules/react-volume-viewer": { - "resolved": "..", - "link": true - } - }, - "dependencies": { - "react": { - "version": "file:../node_modules/react", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-dom": { - "version": "file:../node_modules/react-dom", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "react-scripts": { - "version": "file:../node_modules/react-scripts", - "requires": { - "@babel/core": "^7.16.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@svgr/webpack": "^5.5.0", - "babel-jest": "^27.4.2", - "babel-loader": "^8.2.3", - "babel-plugin-named-asset-import": "^0.3.8", - "babel-preset-react-app": "^10.0.1", - "bfj": "^7.0.2", - "browserslist": "^4.18.1", - "camelcase": "^6.2.1", - "case-sensitive-paths-webpack-plugin": "^2.4.0", - "css-loader": "^6.5.1", - "css-minimizer-webpack-plugin": "^3.2.0", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.0", - "eslint-webpack-plugin": "^3.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "fsevents": "^2.3.2", - "html-webpack-plugin": "^5.5.0", - "identity-obj-proxy": "^3.0.0", - "jest": "^27.4.3", - "jest-resolve": "^27.4.2", - "jest-watch-typeahead": "^1.0.0", - "mini-css-extract-plugin": "^2.4.5", - "postcss": "^8.4.4", - "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^6.2.1", - "postcss-normalize": "^10.0.1", - "postcss-preset-env": "^7.0.1", - "prompts": "^2.4.2", - "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.0", - "react-refresh": "^0.11.0", - "resolve": "^1.20.0", - "resolve-url-loader": "^4.0.0", - "sass-loader": "^12.3.0", - "semver": "^7.3.5", - "source-map-loader": "^3.0.0", - "style-loader": "^3.3.1", - "tailwindcss": "^3.0.2", - "terser-webpack-plugin": "^5.2.5", - "webpack": "^5.64.4", - "webpack-dev-server": "^4.6.0", - "webpack-manifest-plugin": "^4.0.2", - "workbox-webpack-plugin": "^6.4.1" - } - }, - "react-volume-viewer": { - "version": "file:..", - "requires": { - "@babel/core": "^7.0.0", - "@reach/listbox": "^0.16.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-commonjs": "^21.0.0", - "@rollup/plugin-node-resolve": "^13.0.6", - "@rollup/plugin-url": "^6.1.0", - "aframe": "^1.2.0", - "aframe-event-set-component": "^5.0.0", - "aframe-orbit-controls": "^1.3.0", - "babel-eslint": "^10.0.3", - "babel-preset-stage-0": "^6.24.1", - "cross-env": "^7.0.3", - "d3-scale": "^4.0.2", - "eslint-config-react-app": "^7.0.0", - "gh-pages": "^3.2.3", - "npm-run-all": "^4.1.5", - "prettier": "^2.4.1", - "prop-types": "^15.7.2", - "rc-slider": "^9.7.4", - "react": "^17.0.0", - "react-dom": "^17.0.0", - "react-scripts": "^5.0.0", - "rollup": "^2.59.0", - "rollup-plugin-peer-deps-external": "^2.2.4", - "rollup-plugin-postcss": "^4.0.1", - "styled-components": "^5.0.0" - }, - "dependencies": { - "react": { - "version": "17.0.2", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-dom": { - "version": "17.0.2", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "react-scripts": { - "version": "5.0.0", - "requires": { - "@babel/core": "^7.16.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@svgr/webpack": "^5.5.0", - "babel-jest": "^27.4.2", - "babel-loader": "^8.2.3", - "babel-plugin-named-asset-import": "^0.3.8", - "babel-preset-react-app": "^10.0.1", - "bfj": "^7.0.2", - "browserslist": "^4.18.1", - "camelcase": "^6.2.1", - "case-sensitive-paths-webpack-plugin": "^2.4.0", - "css-loader": "^6.5.1", - "css-minimizer-webpack-plugin": "^3.2.0", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.0", - "eslint-webpack-plugin": "^3.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "fsevents": "^2.3.2", - "html-webpack-plugin": "^5.5.0", - "identity-obj-proxy": "^3.0.0", - "jest": "^27.4.3", - "jest-resolve": "^27.4.2", - "jest-watch-typeahead": "^1.0.0", - "mini-css-extract-plugin": "^2.4.5", - "postcss": "^8.4.4", - "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^6.2.1", - "postcss-normalize": "^10.0.1", - "postcss-preset-env": "^7.0.1", - "prompts": "^2.4.2", - "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.0", - "react-refresh": "^0.11.0", - "resolve": "^1.20.0", - "resolve-url-loader": "^4.0.0", - "sass-loader": "^12.3.0", - "semver": "^7.3.5", - "source-map-loader": "^3.0.0", - "style-loader": "^3.3.1", - "tailwindcss": "^3.0.2", - "terser-webpack-plugin": "^5.2.5", - "webpack": "^5.64.4", - "webpack-dev-server": "^4.6.0", - "webpack-manifest-plugin": "^4.0.2", - "workbox-webpack-plugin": "^6.4.1" - } - } - } - } - } -} +{ + "name": "react-volume-viewer-example", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "react-volume-viewer-example", + "version": "0.0.0", + "dependencies": { + "react": "file:../node_modules/react", + "react-dom": "file:../node_modules/react-dom", + "react-scripts": "file:../node_modules/react-scripts", + "react-volume-viewer": "file:.." + } + }, + "..": { + "version": "0.3.1", + "license": "MIT", + "dependencies": { + "@reach/listbox": "^0.16.2", + "aframe": "^1.2.0", + "d3-scale": "^4.0.2", + "rc-slider": "^9.7.4" + }, + "devDependencies": { + "@babel/core": "^7.0.0", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-commonjs": "^21.0.0", + "@rollup/plugin-node-resolve": "^13.0.6", + "@rollup/plugin-url": "^6.1.0", + "babel-eslint": "^10.0.3", + "babel-preset-stage-0": "^6.24.1", + "cross-env": "^7.0.3", + "eslint-config-react-app": "^7.0.0", + "gh-pages": "^3.2.3", + "npm-run-all": "^4.1.5", + "prettier": "^2.4.1", + "prop-types": "^15.7.2", + "react": "^17.0.0", + "react-dom": "^17.0.0", + "react-scripts": "^5.0.0", + "rollup": "^2.59.0", + "rollup-plugin-peer-deps-external": "^2.2.4", + "rollup-plugin-postcss": "^4.0.1", + "styled-components": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^17.0.0", + "react-dom": "^17.0.0", + "styled-components": "^5.0.0" + } + }, + "../node_modules/react": { + "version": "17.0.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../node_modules/react-dom": { + "version": "17.0.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "../node_modules/react-scripts": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.0", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.0", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react": { + "resolved": "../node_modules/react", + "link": true + }, + "node_modules/react-dom": { + "resolved": "../node_modules/react-dom", + "link": true + }, + "node_modules/react-scripts": { + "resolved": "../node_modules/react-scripts", + "link": true + }, + "node_modules/react-volume-viewer": { + "resolved": "..", + "link": true + } + }, + "dependencies": { + "react": { + "version": "file:../node_modules/react", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-dom": { + "version": "file:../node_modules/react-dom", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "react-scripts": { + "version": "file:../node_modules/react-scripts", + "requires": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.0", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "fsevents": "^2.3.2", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react": "^17.0.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.0", + "react-dom": "^17.0.2", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + } + }, + "react-volume-viewer": { + "version": "file:..", + "requires": { + "@babel/core": "^7.0.0", + "@reach/listbox": "^0.16.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-commonjs": "^21.0.0", + "@rollup/plugin-node-resolve": "^13.0.6", + "@rollup/plugin-url": "^6.1.0", + "aframe": "^1.2.0", + "babel-eslint": "^10.0.3", + "babel-preset-stage-0": "^6.24.1", + "cross-env": "^7.0.3", + "d3-scale": "^4.0.2", + "eslint-config-react-app": "^7.0.0", + "gh-pages": "^3.2.3", + "npm-run-all": "^4.1.5", + "prettier": "^2.4.1", + "prop-types": "^15.7.2", + "rc-slider": "^9.7.4", + "react": "^17.0.0", + "react-dom": "^17.0.0", + "react-scripts": "^5.0.0", + "rollup": "^2.59.0", + "rollup-plugin-peer-deps-external": "^2.2.4", + "rollup-plugin-postcss": "^4.0.1", + "styled-components": "^5.0.0" + }, + "dependencies": { + "react": { + "version": "17.0.2", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-dom": { + "version": "17.0.2", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "react-scripts": { + "version": "5.0.0", + "requires": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.0", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "fsevents": "^2.3.2", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react": "^17.0.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.0", + "react-dom": "^17.0.2", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + } + } + } + } + } +} diff --git a/example/src/App.js b/example/src/App.js index 6f052ce9..16a38d47 100644 --- a/example/src/App.js +++ b/example/src/App.js @@ -99,7 +99,7 @@ function App() { } const StyledVolumeViewer = styled(VolumeViewer)` - height: 75vh; + height: 76vh; `; const Main = styled.main` diff --git a/package-lock.json b/package-lock.json index b4f3c00e..de0dba7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,8 +11,6 @@ "dependencies": { "@reach/listbox": "^0.16.2", "aframe": "^1.2.0", - "aframe-event-set-component": "^5.0.0", - "aframe-orbit-controls": "^1.3.0", "d3-scale": "^4.0.2", "rc-slider": "^9.7.4" }, @@ -69,9 +67,9 @@ } }, "node_modules/@babel/core": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.10.tgz", - "integrity": "sha512-pbiIdZbCiMx/MM6toR+OfXarYix3uz0oVsnNtfdAGTcCTu3w/JGF8JhirevXLBJUu0WguSZI12qpKnx7EeMyLA==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", @@ -79,7 +77,7 @@ "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-module-transforms": "^7.16.7", "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.10", + "@babel/parser": "^7.16.12", "@babel/template": "^7.16.7", "@babel/traverse": "^7.16.10", "@babel/types": "^7.16.8", @@ -514,9 +512,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", - "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -2042,9 +2040,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", + "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -3685,9 +3683,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "17.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.10.tgz", - "integrity": "sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog==", + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.13.tgz", + "integrity": "sha512-Y86MAxASe25hNzlDbsviXl8jQHb0RDvKt4c40ZJQ1Don0AAL0STLZSs4N+6gLEO55pedy7r2cLwS+ZDxPm/2Bw==", "dev": true }, "node_modules/@types/parse-json": { @@ -3800,14 +3798,14 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz", - "integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.1.tgz", + "integrity": "sha512-xN3CYqFlyE/qOcy978/L0xLR2HlcAGIyIK5sMOasxaaAPfQRj/MmMV6OC3I7NZO84oEUdWCOju34Z9W8E0pFDQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.10.0", - "@typescript-eslint/type-utils": "5.10.0", - "@typescript-eslint/utils": "5.10.0", + "@typescript-eslint/scope-manager": "5.10.1", + "@typescript-eslint/type-utils": "5.10.1", + "@typescript-eslint/utils": "5.10.1", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -3848,12 +3846,12 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.10.0.tgz", - "integrity": "sha512-GeQAPqQMI5DVMGOUwGbSR+NdsirryyKOgUFRTWInhlsKUArns/MVnXmPpzxfrzB1nU36cT5WJAwmfCsjoaVBWg==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.10.1.tgz", + "integrity": "sha512-Ryeb8nkJa/1zKl8iujNtJC8tgj6PgaY0sDUnrTqbmC70nrKKkZaHfiRDTcqICmCSCEQyLQcJAoh0AukLaIaGTw==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.10.0" + "@typescript-eslint/utils": "5.10.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3867,14 +3865,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz", - "integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.1.tgz", + "integrity": "sha512-GReo3tjNBwR5RnRO0K2wDIDN31cM3MmDtgyQ85oAxAmC5K3j/g85IjP+cDfcqDsDDBf1HNKQAD0WqOYL8jXqUA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.10.0", - "@typescript-eslint/types": "5.10.0", - "@typescript-eslint/typescript-estree": "5.10.0", + "@typescript-eslint/scope-manager": "5.10.1", + "@typescript-eslint/types": "5.10.1", + "@typescript-eslint/typescript-estree": "5.10.1", "debug": "^4.3.2" }, "engines": { @@ -3894,13 +3892,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz", - "integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.1.tgz", + "integrity": "sha512-Lyvi559Gvpn94k7+ElXNMEnXu/iundV5uFmCUNnftbFrUbAJ1WBoaGgkbOBm07jVZa682oaBU37ao/NGGX4ZDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.10.0", - "@typescript-eslint/visitor-keys": "5.10.0" + "@typescript-eslint/types": "5.10.1", + "@typescript-eslint/visitor-keys": "5.10.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3911,12 +3909,12 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz", - "integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.1.tgz", + "integrity": "sha512-AfVJkV8uck/UIoDqhu+ptEdBoQATON9GXnhOpPLzkQRJcSChkvD//qsz9JVffl2goxX+ybs5klvacE9vmrQyCw==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.10.0", + "@typescript-eslint/utils": "5.10.1", "debug": "^4.3.2", "tsutils": "^3.21.0" }, @@ -3937,9 +3935,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", - "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.1.tgz", + "integrity": "sha512-ZvxQ2QMy49bIIBpTqFiOenucqUyjTQ0WNLhBM6X1fh1NNlYAC6Kxsx8bRTY3jdYsYg44a0Z/uEgQkohbR0H87Q==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3950,13 +3948,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz", - "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.1.tgz", + "integrity": "sha512-PwIGnH7jIueXv4opcwEbVGDATjGPO1dx9RkUl5LlHDSe+FXxPwFL5W/qYd5/NHr7f6lo/vvTrAzd0KlQtRusJQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.10.0", - "@typescript-eslint/visitor-keys": "5.10.0", + "@typescript-eslint/types": "5.10.1", + "@typescript-eslint/visitor-keys": "5.10.1", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -3992,15 +3990,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz", - "integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.1.tgz", + "integrity": "sha512-RRmlITiUbLuTRtn/gcPRi4202niF+q7ylFLCKu4c+O/PcpRvZ/nAUwQ2G00bZgpWkhrNLNnvhZLbDn8Ml0qsQw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.10.0", - "@typescript-eslint/types": "5.10.0", - "@typescript-eslint/typescript-estree": "5.10.0", + "@typescript-eslint/scope-manager": "5.10.1", + "@typescript-eslint/types": "5.10.1", + "@typescript-eslint/typescript-estree": "5.10.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -4038,12 +4036,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz", - "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.1.tgz", + "integrity": "sha512-NjQ0Xinhy9IL979tpoTRuLKxMc0zJC7QVSdeerXs2/QvOy2yRkzX5dRb10X5woNUdJgU8G3nYRDlI33sq1K4YQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/types": "5.10.1", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -4374,32 +4372,6 @@ "npm": "^2.15.9" } }, - "node_modules/aframe-event-set-component": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aframe-event-set-component/-/aframe-event-set-component-5.0.0.tgz", - "integrity": "sha512-O9Bhs8Qu2cEilXQ6F2xUxxJIbaZEA2atdIxTwq5qPHRHaIa+8ZghkirUBicNs92aHR9QQwk6ZnRx+SmBXi+B9Q==", - "dependencies": { - "debug": "^2.6.9" - } - }, - "node_modules/aframe-event-set-component/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/aframe-event-set-component/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/aframe-orbit-controls": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/aframe-orbit-controls/-/aframe-orbit-controls-1.3.0.tgz", - "integrity": "sha512-xRrarJR1kaGy6F0YS4iFBN4jaobeUDKu+C0dasJLEB1k3RZ+GsxSs6W7WmVOEQjMmuzDNDNV2TIsE/PK/hlx/w==" - }, "node_modules/aframe/node_modules/debug": { "version": "2.2.0", "resolved": "git+ssh://git@github.com/ngokevin/debug.git#ef5f8e66d49ce8bc64c6f282c15f8b7164409e3a", @@ -4494,12 +4466,6 @@ "ajv": "^6.9.1" } }, - "node_modules/alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, "node_modules/an-array": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/an-array/-/an-array-1.0.0.tgz", @@ -5918,9 +5884,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001300", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz", - "integrity": "sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA==", + "version": "1.0.30001303", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001303.tgz", + "integrity": "sha512-/Mqc1oESndUNszJP0kx0UaQU9kEv9nNtJ7Kn8AdA0mNnH8eR1cj0kG+NbNuC1Wq/b21eA8prhKRA3bbkjONegQ==", "dev": true, "funding": { "type": "opencollective", @@ -6041,9 +6007,9 @@ "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" }, "node_modules/clean-css": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.2.tgz", - "integrity": "sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", + "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", "dev": true, "dependencies": { "source-map": "~0.6.0" @@ -6733,12 +6699,12 @@ } }, "node_modules/cssnano": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.15.tgz", - "integrity": "sha512-ppZsS7oPpi2sfiyV5+i+NbB/3GtQ+ab2Vs1azrZaXWujUSN4o+WdTxlCZIMcT9yLW3VO/5yX3vpyDaQ1nIn8CQ==", + "version": "5.0.16", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.16.tgz", + "integrity": "sha512-ryhRI9/B9VFCwPbb1z60LLK5/ldoExi7nwdnJzpkLZkm2/r7j2X3jfY+ZvDVJhC/0fPZlrAguYdHNFg0iglPKQ==", "dev": true, "dependencies": { - "cssnano-preset-default": "^5.1.10", + "cssnano-preset-default": "^5.1.11", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, @@ -6754,40 +6720,40 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.10.tgz", - "integrity": "sha512-BcpSzUVygHMOnp9uG5rfPzTOCb0GAHQkqtUQx8j1oMNF9A1Q8hziOOhiM4bdICpmrBIU85BE64RD5XGYsVQZNA==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.11.tgz", + "integrity": "sha512-ETet5hqHxmzQq2ynXMOQofKuLm7VOjMiOB7E2zdtm/hSeCKlD9fabzIUV4GoPcRyJRHi+4kGf0vsfGYbQ4nmPw==", "dev": true, "dependencies": { "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.0.1", "postcss-calc": "^8.2.0", - "postcss-colormin": "^5.2.3", - "postcss-convert-values": "^5.0.2", - "postcss-discard-comments": "^5.0.1", - "postcss-discard-duplicates": "^5.0.1", - "postcss-discard-empty": "^5.0.1", - "postcss-discard-overridden": "^5.0.2", - "postcss-merge-longhand": "^5.0.4", - "postcss-merge-rules": "^5.0.4", - "postcss-minify-font-values": "^5.0.2", - "postcss-minify-gradients": "^5.0.4", - "postcss-minify-params": "^5.0.3", - "postcss-minify-selectors": "^5.1.1", - "postcss-normalize-charset": "^5.0.1", + "postcss-colormin": "^5.2.4", + "postcss-convert-values": "^5.0.3", + "postcss-discard-comments": "^5.0.2", + "postcss-discard-duplicates": "^5.0.2", + "postcss-discard-empty": "^5.0.2", + "postcss-discard-overridden": "^5.0.3", + "postcss-merge-longhand": "^5.0.5", + "postcss-merge-rules": "^5.0.5", + "postcss-minify-font-values": "^5.0.3", + "postcss-minify-gradients": "^5.0.5", + "postcss-minify-params": "^5.0.4", + "postcss-minify-selectors": "^5.1.2", + "postcss-normalize-charset": "^5.0.2", "postcss-normalize-display-values": "^5.0.2", - "postcss-normalize-positions": "^5.0.2", - "postcss-normalize-repeat-style": "^5.0.2", - "postcss-normalize-string": "^5.0.2", + "postcss-normalize-positions": "^5.0.3", + "postcss-normalize-repeat-style": "^5.0.3", + "postcss-normalize-string": "^5.0.3", "postcss-normalize-timing-functions": "^5.0.2", - "postcss-normalize-unicode": "^5.0.2", + "postcss-normalize-unicode": "^5.0.3", "postcss-normalize-url": "^5.0.4", - "postcss-normalize-whitespace": "^5.0.2", - "postcss-ordered-values": "^5.0.3", + "postcss-normalize-whitespace": "^5.0.3", + "postcss-ordered-values": "^5.0.4", "postcss-reduce-initial": "^5.0.2", - "postcss-reduce-transforms": "^5.0.2", + "postcss-reduce-transforms": "^5.0.3", "postcss-svgo": "^5.0.3", - "postcss-unique-selectors": "^5.0.2" + "postcss-unique-selectors": "^5.0.3" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -6797,9 +6763,9 @@ } }, "node_modules/cssnano-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.0.tgz", - "integrity": "sha512-Pzs7/BZ6OgT+tXXuF12DKR8SmSbzUeVYCtMBbS8lI0uAm3mrYmkyqCXXPsQESI6kmLfEVBppbdVY/el3hg3nAA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.1.tgz", + "integrity": "sha512-VNCHL364lh++/ono+S3j9NlUK+d97KNkxI77NlqZU2W3xd2/qmyN61dsa47pTpb55zuU4G4lI7qFjAXZJH1OAQ==", "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" @@ -7444,9 +7410,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.49", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.49.tgz", - "integrity": "sha512-k/0t1TRfonHIp8TJKfjBu2cKj8MqYTiEpOhci+q7CVEE5xnCQnx1pTa+V8b/sdhe4S3PR4p4iceEQWhGrKQORQ==", + "version": "1.4.56", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.56.tgz", + "integrity": "sha512-0k/S0FQqRRpJbX7YUjwCcLZ8D42RqGKtaiq90adXBOYgTIWwLA/g3toO8k9yEpqU8iC4QyaWYYWSTBIna8WV4g==", "dev": true }, "node_modules/email-addresses": { @@ -7795,9 +7761,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", - "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", + "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", "dev": true, "dependencies": { "debug": "^3.2.7", @@ -8004,9 +7970,9 @@ } }, "node_modules/eslint-plugin-testing-library": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.0.3.tgz", - "integrity": "sha512-tKZ9G+HnIOnYAhXeoBCiAT8LOdU3m1VquBTKsBW/5zAaB30vq7gC60DIayPfMJt8EZBlqPVzGqSN57sIFmTunQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.0.4.tgz", + "integrity": "sha512-zA/NfAENCsJXujvwwiap5gsqLp2U6X7m2XA5nOksl4zzb6GpUmRNAleCll58rEP0brFVj7DZBprlIlMGIhoC7Q==", "dev": true, "dependencies": { "@typescript-eslint/experimental-utils": "^5.9.0" @@ -8687,9 +8653,9 @@ } }, "node_modules/flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, "node_modules/flatten-vertex-data": { @@ -9630,12 +9596,12 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", - "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.2.tgz", + "integrity": "sha512-XtmDN5w+vdFTBZaYhdJAbMqn0DP/EhkUaAeo963mojwpKMMbw6nivtFKw07D7DDOH745L5k0VL0P8KRYNEVF/g==", "dev": true, "dependencies": { - "@types/http-proxy": "^1.17.5", + "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", @@ -9643,6 +9609,9 @@ }, "engines": { "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" } }, "node_modules/https-proxy-agent": { @@ -12822,9 +12791,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.2.tgz", - "integrity": "sha512-Lwgq9qLNyBK6yNLgzssXnq4r2+mB9Mz3cJWlM8kseysHIvTicFhDNimFgY94jjqlwhNzLPsq8wv4X+vOHtMdYA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz", + "integrity": "sha512-YseMB8cs8U/KCaAGQoqYmfUuhhGW0a9p9XvWXrxVOkE3/IiISTLw4ALNt7JR5B2eYauFM+PQGSbXMDmVbR7Tfw==", "dev": true, "dependencies": { "schema-utils": "^4.0.0" @@ -13758,9 +13727,9 @@ } }, "node_modules/pirates": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", - "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", "dev": true, "engines": { "node": ">= 6" @@ -13988,9 +13957,9 @@ } }, "node_modules/postcss-calc": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.2.tgz", - "integrity": "sha512-B5R0UeB4zLJvxNt1FVCaDZULdzsKLPc6FhjFJ+xwFiq7VG4i9cuaJLxVjNtExNK8ocm3n2o4unXXLiVX1SCqxA==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.3.tgz", + "integrity": "sha512-EGM2EBBWqP57N0E7N7WOLT116PJ39dwHVU01WO4XPPQLJfkL2xVgkMZ+TZvCfapj/uJH07UEfKHQNPHzSw/14Q==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.2", @@ -14046,9 +14015,9 @@ } }, "node_modules/postcss-colormin": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.3.tgz", - "integrity": "sha512-dra4xoAjub2wha6RUXAgadHEn2lGxbj8drhFcIGLOMn914Eu7DkPUurugDXgstwttCYkJtZ/+PkWRWdp3UHRIA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.4.tgz", + "integrity": "sha512-rYlC5015aNqVQt/B6Cy156g7sH5tRUJGmT9xeagYthtKehetbKx7jHxhyLpulP4bs4vbp8u/B2rac0J7S7qPQg==", "dev": true, "dependencies": { "browserslist": "^4.16.6", @@ -14064,12 +14033,12 @@ } }, "node_modules/postcss-convert-values": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz", - "integrity": "sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.3.tgz", + "integrity": "sha512-fVkjHm2T0PSMqXUCIhHNWVGjhB9mHEWX2GboVs7j3iCgr6FpIl9c/IdXy0PHWZSQ9LFTRgmj98amxJE6KOnlsA==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.1.0" + "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -14136,9 +14105,9 @@ } }, "node_modules/postcss-discard-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", - "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.2.tgz", + "integrity": "sha512-6VQ3pYTsJHEsN2Bic88Aa7J/Brn4Bv8j/rqaFQZkH+pcVkKYwxCIvoMQkykEW7fBjmofdTnQgcivt5CCBJhtrg==", "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" @@ -14148,9 +14117,9 @@ } }, "node_modules/postcss-discard-duplicates": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", - "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.2.tgz", + "integrity": "sha512-LKY81YjUjc78p6rbXIsnppsaFo8XzCoMZkXVILJU//sK0DgPkPSpuq/cZvHss3EtdKvWNYgWzQL+wiJFtEET4g==", "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" @@ -14160,9 +14129,9 @@ } }, "node_modules/postcss-discard-empty": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", - "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.2.tgz", + "integrity": "sha512-SxBsbTjlsKUvZLL+dMrdWauuNZU8TBq5IOL/DHa6jBUSXFEwmDqeXRfTIK/FQpPTa8MJMxEHjSV3UbiuyLARPQ==", "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" @@ -14172,9 +14141,9 @@ } }, "node_modules/postcss-discard-overridden": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.2.tgz", - "integrity": "sha512-+56BLP6NSSUuWUXjRgAQuho1p5xs/hU5Sw7+xt9S3JSg+7R6+WMGnJW7Hre/6tTuZ2xiXMB42ObkiZJ2hy/Pew==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.3.tgz", + "integrity": "sha512-yRTXknIZA4k8Yo4FiF1xbsLj/VBxfXEWxJNIrtIy6HC9KQ4xJxcPtoaaskh6QptCGrrcGnhKsTsENTRPZOBu4g==", "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" @@ -14418,13 +14387,13 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.4.tgz", - "integrity": "sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.5.tgz", + "integrity": "sha512-R2BCPJJ/U2oh1uTWEYn9CcJ7MMcQ1iIbj9wfr2s/zHu5om5MP/ewKdaunpfJqR1WYzqCsgnXuRoVXPAzxdqy8g==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.1.0", - "stylehacks": "^5.0.1" + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.0.2" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -14434,14 +14403,14 @@ } }, "node_modules/postcss-merge-rules": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.4.tgz", - "integrity": "sha512-yOj7bW3NxlQxaERBB0lEY1sH5y+RzevjbdH4DBJurjKERNpknRByFNdNe+V72i5pIZL12woM9uGdS5xbSB+kDQ==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.5.tgz", + "integrity": "sha512-3Oa26/Pb9VOFVksJjFG45SNoe4nhGvJ2Uc6TlRimqF8uhfOCEhVCaJ3rvEat5UFOn2UZqTY5Da8dFgCh3Iq0Ug==", "dev": true, "dependencies": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.0.1", "postcss-selector-parser": "^6.0.5" }, "engines": { @@ -14452,9 +14421,9 @@ } }, "node_modules/postcss-minify-font-values": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.2.tgz", - "integrity": "sha512-R6MJZryq28Cw0AmnyhXrM7naqJZZLoa1paBltIzh2wM7yb4D45TLur+eubTQ4jCmZU9SGeZdWsc5KcSoqTMeTg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.3.tgz", + "integrity": "sha512-bC45rVzEwsLhv/cL1eCjoo2OOjbSk9I7HKFBYnBvtyuIZlf7uMipMATXtA0Fc3jwPo3wuPIW1jRJWKzflMh1sA==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14467,13 +14436,13 @@ } }, "node_modules/postcss-minify-gradients": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.4.tgz", - "integrity": "sha512-RVwZA7NC4R4J76u8X0Q0j+J7ItKUWAeBUJ8oEEZWmtv3Xoh19uNJaJwzNpsydQjk6PkuhRrK+YwwMf+c+68EYg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.5.tgz", + "integrity": "sha512-/YjvXs8PepsoiZAIpjstOO4IHKwFAqYNqbA1yVdqklM84tbUUneh6omJxGlRlF3mi6K5Pa067Mg6IwqEnYC8Zg==", "dev": true, "dependencies": { "colord": "^2.9.1", - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -14484,14 +14453,13 @@ } }, "node_modules/postcss-minify-params": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.3.tgz", - "integrity": "sha512-NY92FUikE+wralaiVexFd5gwb7oJTIDhgTNeIw89i1Ymsgt4RWiPXfz3bg7hDy4NL6gepcThJwOYNtZO/eNi7Q==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.4.tgz", + "integrity": "sha512-Z0vjod9lRZEmEPfEmA2sCfjbfEEFKefMD3RDIQSUfXK4LpCyWkX1CniUgyNvnjJFLDPSxtgKzozhHhPHKoeGkg==", "dev": true, "dependencies": { - "alphanum-sort": "^1.0.2", "browserslist": "^4.16.6", - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -14502,12 +14470,11 @@ } }, "node_modules/postcss-minify-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.1.tgz", - "integrity": "sha512-TOzqOPXt91O2luJInaVPiivh90a2SIK5Nf1Ea7yEIM/5w+XA5BGrZGUSW8aEx9pJ/oNj7ZJBhjvigSiBV+bC1Q==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.2.tgz", + "integrity": "sha512-gpn1nJDMCf3g32y/7kl+jsdamhiYT+/zmEt57RoT9GmzlixBNRPohI7k8UIHelLABhdLf3MSZhtM33xuH5eQOQ==", "dev": true, "dependencies": { - "alphanum-sort": "^1.0.2", "postcss-selector-parser": "^6.0.5" }, "engines": { @@ -14648,9 +14615,9 @@ } }, "node_modules/postcss-normalize-charset": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", - "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.2.tgz", + "integrity": "sha512-fEMhYXzO8My+gC009qDc/3bgnFP8Fv1Ic8uw4ec4YTlhIOw63tGPk1YFd7fk9bZUf1DAbkhiL/QPWs9JLqdF2g==", "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" @@ -14675,9 +14642,9 @@ } }, "node_modules/postcss-normalize-positions": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.2.tgz", - "integrity": "sha512-tqghWFVDp2btqFg1gYob1etPNxXLNh3uVeWgZE2AQGh6b2F8AK2Gj36v5Vhyh+APwIzNjmt6jwZ9pTBP+/OM8g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.3.tgz", + "integrity": "sha512-U+rmhjrNBvIGYqr/1tD4wXPFFMKUbXsYXvlUCzLi0tOCUS6LoeEAnmVXXJY/MEB/1CKZZwBSs2tmzGawcygVBA==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14690,9 +14657,9 @@ } }, "node_modules/postcss-normalize-repeat-style": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.2.tgz", - "integrity": "sha512-/rIZn8X9bBzC7KvY4iKUhXUGW3MmbXwfPF23jC9wT9xTi7kAvgj8sEgwxjixBmoL6MVa4WOgxNz2hAR6wTK8tw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.3.tgz", + "integrity": "sha512-uk1+xYx0AMbA3nLSNhbDrqbf/rx+Iuq5tVad2VNyaxxJzx79oGieJ6D9F6AfOL2GtiIbP7vTYlpYHtG+ERFXTg==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14705,9 +14672,9 @@ } }, "node_modules/postcss-normalize-string": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.2.tgz", - "integrity": "sha512-zaI1yzwL+a/FkIzUWMQoH25YwCYxi917J4pYm1nRXtdgiCdnlTkx5eRzqWEC64HtRa06WCJ9TIutpb6GmW4gFw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.3.tgz", + "integrity": "sha512-Mf2V4JbIDboNGQhW6xW0YREDiYXoX3WrD3EjKkjvnpAJ6W4qqjLnK/c9aioyVFaWWHVdP5zVRw/9DI5S3oLDFw==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14735,9 +14702,9 @@ } }, "node_modules/postcss-normalize-unicode": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.2.tgz", - "integrity": "sha512-3y/V+vjZ19HNcTizeqwrbZSUsE69ZMRHfiiyLAJb7C7hJtYmM4Gsbajy7gKagu97E8q5rlS9k8FhojA8cpGhWw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.3.tgz", + "integrity": "sha512-uNC7BmS/7h6to2UWa4RFH8sOTzu2O9dVWPE/F9Vm9GdhONiD/c1kNaCLbmsFHlKWcEx7alNUChQ+jH/QAlqsQw==", "dev": true, "dependencies": { "browserslist": "^4.16.6", @@ -14767,9 +14734,9 @@ } }, "node_modules/postcss-normalize-whitespace": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.2.tgz", - "integrity": "sha512-CXBx+9fVlzSgbk0IXA/dcZn9lXixnQRndnsPC5ht3HxlQ1bVh77KQDL1GffJx1LTzzfae8ftMulsjYmO2yegxA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.3.tgz", + "integrity": "sha512-333JWRnX655fSoUbufJ10HJop3c8mrpKkCCUnEmgz/Cb/QEtW+/TMZwDAUt4lnwqP6tCCk0x0b58jqvDgiQm/A==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14782,12 +14749,12 @@ } }, "node_modules/postcss-ordered-values": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.3.tgz", - "integrity": "sha512-T9pDS+P9bWeFvqivXd5ACzQmrCmHjv3ZP+djn8E1UZY7iK79pFSm7i3WbKw2VSmFmdbMm8sQ12OPcNpzBo3Z2w==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.4.tgz", + "integrity": "sha512-taKtGDZtyYUMVYkg+MuJeBUiTF6cGHZmo/qcW7ibvW79UlyKuSHbo6dpCIiqI+j9oJsXWzP+ovIxoyLDOeQFdw==", "dev": true, "dependencies": { - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -14912,9 +14879,9 @@ } }, "node_modules/postcss-reduce-transforms": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.2.tgz", - "integrity": "sha512-25HeDeFsgiPSUx69jJXZn8I06tMxLQJJNF5h7i9gsUg8iP4KOOJ8EX8fj3seeoLt3SLU2YDD6UPnDYVGUO7DEA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.3.tgz", + "integrity": "sha512-yDnTUab5i7auHiNwdcL1f+pBnqQFf+7eC4cbC7D8Lc1FkvNZhtpkdad+9U4wDdFb84haupMf0rA/Zc5LcTe/3A==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -15035,12 +15002,11 @@ } }, "node_modules/postcss-unique-selectors": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.2.tgz", - "integrity": "sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.3.tgz", + "integrity": "sha512-V5tX2hadSSn+miVCluuK1IDGy+7jAXSOfRZ2DQ+s/4uQZb/orDYBjH0CHgFrXsRw78p4QTuEFA9kI6C956UnHQ==", "dev": true, "dependencies": { - "alphanum-sort": "^1.0.2", "postcss-selector-parser": "^6.0.5" }, "engines": { @@ -15455,9 +15421,9 @@ } }, "node_modules/rc-util": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.16.1.tgz", - "integrity": "sha512-kSCyytvdb3aRxQacS/71ta6c+kBWvM1v8/2h9d/HaNWauc3qB8pLnF20PJ8NajkNN8gb+rR1l0eWO+D4Pz+LLQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.17.0.tgz", + "integrity": "sha512-HWuTIKzBeZQQ7IBqdokE0wMp/xx39/KfUJ0gcquBigoldDCrf3YBcWFHrrQlJG7sI82Wg8mwp1uAKV3zMGfAgg==", "dependencies": { "@babel/runtime": "^7.12.5", "react-is": "^16.12.0", @@ -16099,12 +16065,12 @@ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, "node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dev": true, "dependencies": { - "is-core-module": "^2.8.0", + "is-core-module": "^2.8.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -16249,9 +16215,9 @@ } }, "node_modules/rollup": { - "version": "2.64.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.64.0.tgz", - "integrity": "sha512-+c+lbw1lexBKSMb1yxGDVfJ+vchJH3qLbmavR+awDinTDA2C5Ug9u7lkOzj62SCu0PKUExsW36tpgW7Fmpn3yQ==", + "version": "2.66.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.66.1.tgz", + "integrity": "sha512-crSgLhSkLMnKr4s9iZ/1qJCplgAgrRY+igWv8KhG/AjKOJ0YX/WpmANyn8oxrw+zenF3BXWDLa7Xl/QZISH+7w==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -17322,12 +17288,12 @@ } }, "node_modules/stylehacks": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", - "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.2.tgz", + "integrity": "sha512-114zeJdOpTrbQYRD4OU5UWJ99LKUaqCPJTU1HQ/n3q3BwmllFN8kHENaLnOeqVq6AhXrWfxHNZTl33iJ4oy3cQ==", "dev": true, "dependencies": { - "browserslist": "^4.16.0", + "browserslist": "^4.16.6", "postcss-selector-parser": "^6.0.4" }, "engines": { @@ -17532,20 +17498,20 @@ "integrity": "sha512-H1XoH1URcBOa/rZZWxLxHCtOdVUEev+9vo5YdYhC9tCY4wnybX+VQrCYuy9ubkg69fCBxCONJOSLGfw0DWMffQ==" }, "node_modules/tailwindcss": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.15.tgz", - "integrity": "sha512-bT2iy7FtjwgsXik4ZoJnHXR+SRCiGR1W95fVqpLZebr64m4ahwUwRbIAc5w5+2fzr1YF4Ct2eI7dojMRRl8sVQ==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.17.tgz", + "integrity": "sha512-OiHUsmOKQQEg/ocXaLIjk/kOz8EK2jF6iPuc1bQ4NsmhYl7sk70UDsGV02AJvBAAiJhinPCkDR8egT9qY+ulCw==", "dev": true, "dependencies": { "arg": "^5.0.1", "chalk": "^4.1.2", - "chokidar": "^3.5.2", + "chokidar": "^3.5.3", "color-name": "^1.1.4", "cosmiconfig": "^7.0.1", "detective": "^5.2.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.11", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "normalize-path": "^3.0.0", @@ -18334,9 +18300,9 @@ } }, "node_modules/webpack": { - "version": "5.66.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.66.0.tgz", - "integrity": "sha512-NJNtGT7IKpGzdW7Iwpn/09OXz9inIkeIQ/ibY6B+MdV1x6+uReqz/5z1L89ezWnpPDWpXF0TY5PCYKQdWVn8Vg==", + "version": "5.67.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", + "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.0", @@ -18362,7 +18328,7 @@ "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.3.1", - "webpack-sources": "^3.2.2" + "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" @@ -19414,9 +19380,9 @@ "dev": true }, "@babel/core": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.10.tgz", - "integrity": "sha512-pbiIdZbCiMx/MM6toR+OfXarYix3uz0oVsnNtfdAGTcCTu3w/JGF8JhirevXLBJUu0WguSZI12qpKnx7EeMyLA==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", @@ -19424,7 +19390,7 @@ "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-module-transforms": "^7.16.7", "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.10", + "@babel/parser": "^7.16.12", "@babel/template": "^7.16.7", "@babel/traverse": "^7.16.10", "@babel/types": "^7.16.8", @@ -19748,9 +19714,9 @@ } }, "@babel/parser": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", - "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -20793,9 +20759,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", + "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -22004,9 +21970,9 @@ "dev": true }, "@types/node": { - "version": "17.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.10.tgz", - "integrity": "sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog==", + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.13.tgz", + "integrity": "sha512-Y86MAxASe25hNzlDbsviXl8jQHb0RDvKt4c40ZJQ1Don0AAL0STLZSs4N+6gLEO55pedy7r2cLwS+ZDxPm/2Bw==", "dev": true }, "@types/parse-json": { @@ -22119,14 +22085,14 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz", - "integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.1.tgz", + "integrity": "sha512-xN3CYqFlyE/qOcy978/L0xLR2HlcAGIyIK5sMOasxaaAPfQRj/MmMV6OC3I7NZO84oEUdWCOju34Z9W8E0pFDQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.10.0", - "@typescript-eslint/type-utils": "5.10.0", - "@typescript-eslint/utils": "5.10.0", + "@typescript-eslint/scope-manager": "5.10.1", + "@typescript-eslint/type-utils": "5.10.1", + "@typescript-eslint/utils": "5.10.1", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -22147,61 +22113,61 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.10.0.tgz", - "integrity": "sha512-GeQAPqQMI5DVMGOUwGbSR+NdsirryyKOgUFRTWInhlsKUArns/MVnXmPpzxfrzB1nU36cT5WJAwmfCsjoaVBWg==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.10.1.tgz", + "integrity": "sha512-Ryeb8nkJa/1zKl8iujNtJC8tgj6PgaY0sDUnrTqbmC70nrKKkZaHfiRDTcqICmCSCEQyLQcJAoh0AukLaIaGTw==", "dev": true, "requires": { - "@typescript-eslint/utils": "5.10.0" + "@typescript-eslint/utils": "5.10.1" } }, "@typescript-eslint/parser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz", - "integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.1.tgz", + "integrity": "sha512-GReo3tjNBwR5RnRO0K2wDIDN31cM3MmDtgyQ85oAxAmC5K3j/g85IjP+cDfcqDsDDBf1HNKQAD0WqOYL8jXqUA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.10.0", - "@typescript-eslint/types": "5.10.0", - "@typescript-eslint/typescript-estree": "5.10.0", + "@typescript-eslint/scope-manager": "5.10.1", + "@typescript-eslint/types": "5.10.1", + "@typescript-eslint/typescript-estree": "5.10.1", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz", - "integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.1.tgz", + "integrity": "sha512-Lyvi559Gvpn94k7+ElXNMEnXu/iundV5uFmCUNnftbFrUbAJ1WBoaGgkbOBm07jVZa682oaBU37ao/NGGX4ZDg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.10.0", - "@typescript-eslint/visitor-keys": "5.10.0" + "@typescript-eslint/types": "5.10.1", + "@typescript-eslint/visitor-keys": "5.10.1" } }, "@typescript-eslint/type-utils": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz", - "integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.1.tgz", + "integrity": "sha512-AfVJkV8uck/UIoDqhu+ptEdBoQATON9GXnhOpPLzkQRJcSChkvD//qsz9JVffl2goxX+ybs5klvacE9vmrQyCw==", "dev": true, "requires": { - "@typescript-eslint/utils": "5.10.0", + "@typescript-eslint/utils": "5.10.1", "debug": "^4.3.2", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", - "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.1.tgz", + "integrity": "sha512-ZvxQ2QMy49bIIBpTqFiOenucqUyjTQ0WNLhBM6X1fh1NNlYAC6Kxsx8bRTY3jdYsYg44a0Z/uEgQkohbR0H87Q==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz", - "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.1.tgz", + "integrity": "sha512-PwIGnH7jIueXv4opcwEbVGDATjGPO1dx9RkUl5LlHDSe+FXxPwFL5W/qYd5/NHr7f6lo/vvTrAzd0KlQtRusJQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.10.0", - "@typescript-eslint/visitor-keys": "5.10.0", + "@typescript-eslint/types": "5.10.1", + "@typescript-eslint/visitor-keys": "5.10.1", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -22221,15 +22187,15 @@ } }, "@typescript-eslint/utils": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz", - "integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.1.tgz", + "integrity": "sha512-RRmlITiUbLuTRtn/gcPRi4202niF+q7ylFLCKu4c+O/PcpRvZ/nAUwQ2G00bZgpWkhrNLNnvhZLbDn8Ml0qsQw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.10.0", - "@typescript-eslint/types": "5.10.0", - "@typescript-eslint/typescript-estree": "5.10.0", + "@typescript-eslint/scope-manager": "5.10.1", + "@typescript-eslint/types": "5.10.1", + "@typescript-eslint/typescript-estree": "5.10.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -22253,12 +22219,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz", - "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.1.tgz", + "integrity": "sha512-NjQ0Xinhy9IL979tpoTRuLKxMc0zJC7QVSdeerXs2/QvOy2yRkzX5dRb10X5woNUdJgU8G3nYRDlI33sq1K4YQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/types": "5.10.1", "eslint-visitor-keys": "^3.0.0" }, "dependencies": { @@ -22553,34 +22519,6 @@ } } }, - "aframe-event-set-component": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aframe-event-set-component/-/aframe-event-set-component-5.0.0.tgz", - "integrity": "sha512-O9Bhs8Qu2cEilXQ6F2xUxxJIbaZEA2atdIxTwq5qPHRHaIa+8ZghkirUBicNs92aHR9QQwk6ZnRx+SmBXi+B9Q==", - "requires": { - "debug": "^2.6.9" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "aframe-orbit-controls": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/aframe-orbit-controls/-/aframe-orbit-controls-1.3.0.tgz", - "integrity": "sha512-xRrarJR1kaGy6F0YS4iFBN4jaobeUDKu+C0dasJLEB1k3RZ+GsxSs6W7WmVOEQjMmuzDNDNV2TIsE/PK/hlx/w==" - }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -22648,12 +22586,6 @@ "dev": true, "requires": {} }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, "an-array": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/an-array/-/an-array-1.0.0.tgz", @@ -23845,9 +23777,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001300", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz", - "integrity": "sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA==", + "version": "1.0.30001303", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001303.tgz", + "integrity": "sha512-/Mqc1oESndUNszJP0kx0UaQU9kEv9nNtJ7Kn8AdA0mNnH8eR1cj0kG+NbNuC1Wq/b21eA8prhKRA3bbkjONegQ==", "dev": true }, "cardboard-vr-display": { @@ -23940,9 +23872,9 @@ "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" }, "clean-css": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.2.tgz", - "integrity": "sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", + "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -24446,57 +24378,57 @@ "dev": true }, "cssnano": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.15.tgz", - "integrity": "sha512-ppZsS7oPpi2sfiyV5+i+NbB/3GtQ+ab2Vs1azrZaXWujUSN4o+WdTxlCZIMcT9yLW3VO/5yX3vpyDaQ1nIn8CQ==", + "version": "5.0.16", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.16.tgz", + "integrity": "sha512-ryhRI9/B9VFCwPbb1z60LLK5/ldoExi7nwdnJzpkLZkm2/r7j2X3jfY+ZvDVJhC/0fPZlrAguYdHNFg0iglPKQ==", "dev": true, "requires": { - "cssnano-preset-default": "^5.1.10", + "cssnano-preset-default": "^5.1.11", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.10.tgz", - "integrity": "sha512-BcpSzUVygHMOnp9uG5rfPzTOCb0GAHQkqtUQx8j1oMNF9A1Q8hziOOhiM4bdICpmrBIU85BE64RD5XGYsVQZNA==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.11.tgz", + "integrity": "sha512-ETet5hqHxmzQq2ynXMOQofKuLm7VOjMiOB7E2zdtm/hSeCKlD9fabzIUV4GoPcRyJRHi+4kGf0vsfGYbQ4nmPw==", "dev": true, "requires": { "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.0.1", "postcss-calc": "^8.2.0", - "postcss-colormin": "^5.2.3", - "postcss-convert-values": "^5.0.2", - "postcss-discard-comments": "^5.0.1", - "postcss-discard-duplicates": "^5.0.1", - "postcss-discard-empty": "^5.0.1", - "postcss-discard-overridden": "^5.0.2", - "postcss-merge-longhand": "^5.0.4", - "postcss-merge-rules": "^5.0.4", - "postcss-minify-font-values": "^5.0.2", - "postcss-minify-gradients": "^5.0.4", - "postcss-minify-params": "^5.0.3", - "postcss-minify-selectors": "^5.1.1", - "postcss-normalize-charset": "^5.0.1", + "postcss-colormin": "^5.2.4", + "postcss-convert-values": "^5.0.3", + "postcss-discard-comments": "^5.0.2", + "postcss-discard-duplicates": "^5.0.2", + "postcss-discard-empty": "^5.0.2", + "postcss-discard-overridden": "^5.0.3", + "postcss-merge-longhand": "^5.0.5", + "postcss-merge-rules": "^5.0.5", + "postcss-minify-font-values": "^5.0.3", + "postcss-minify-gradients": "^5.0.5", + "postcss-minify-params": "^5.0.4", + "postcss-minify-selectors": "^5.1.2", + "postcss-normalize-charset": "^5.0.2", "postcss-normalize-display-values": "^5.0.2", - "postcss-normalize-positions": "^5.0.2", - "postcss-normalize-repeat-style": "^5.0.2", - "postcss-normalize-string": "^5.0.2", + "postcss-normalize-positions": "^5.0.3", + "postcss-normalize-repeat-style": "^5.0.3", + "postcss-normalize-string": "^5.0.3", "postcss-normalize-timing-functions": "^5.0.2", - "postcss-normalize-unicode": "^5.0.2", + "postcss-normalize-unicode": "^5.0.3", "postcss-normalize-url": "^5.0.4", - "postcss-normalize-whitespace": "^5.0.2", - "postcss-ordered-values": "^5.0.3", + "postcss-normalize-whitespace": "^5.0.3", + "postcss-ordered-values": "^5.0.4", "postcss-reduce-initial": "^5.0.2", - "postcss-reduce-transforms": "^5.0.2", + "postcss-reduce-transforms": "^5.0.3", "postcss-svgo": "^5.0.3", - "postcss-unique-selectors": "^5.0.2" + "postcss-unique-selectors": "^5.0.3" } }, "cssnano-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.0.tgz", - "integrity": "sha512-Pzs7/BZ6OgT+tXXuF12DKR8SmSbzUeVYCtMBbS8lI0uAm3mrYmkyqCXXPsQESI6kmLfEVBppbdVY/el3hg3nAA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.1.tgz", + "integrity": "sha512-VNCHL364lh++/ono+S3j9NlUK+d97KNkxI77NlqZU2W3xd2/qmyN61dsa47pTpb55zuU4G4lI7qFjAXZJH1OAQ==", "dev": true, "requires": {} }, @@ -25002,9 +24934,9 @@ } }, "electron-to-chromium": { - "version": "1.4.49", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.49.tgz", - "integrity": "sha512-k/0t1TRfonHIp8TJKfjBu2cKj8MqYTiEpOhci+q7CVEE5xnCQnx1pTa+V8b/sdhe4S3PR4p4iceEQWhGrKQORQ==", + "version": "1.4.56", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.56.tgz", + "integrity": "sha512-0k/S0FQqRRpJbX7YUjwCcLZ8D42RqGKtaiq90adXBOYgTIWwLA/g3toO8k9yEpqU8iC4QyaWYYWSTBIna8WV4g==", "dev": true }, "email-addresses": { @@ -25360,9 +25292,9 @@ } }, "eslint-module-utils": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz", - "integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", + "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", "dev": true, "requires": { "debug": "^3.2.7", @@ -25517,9 +25449,9 @@ "requires": {} }, "eslint-plugin-testing-library": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.0.3.tgz", - "integrity": "sha512-tKZ9G+HnIOnYAhXeoBCiAT8LOdU3m1VquBTKsBW/5zAaB30vq7gC60DIayPfMJt8EZBlqPVzGqSN57sIFmTunQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.0.4.tgz", + "integrity": "sha512-zA/NfAENCsJXujvwwiap5gsqLp2U6X7m2XA5nOksl4zzb6GpUmRNAleCll58rEP0brFVj7DZBprlIlMGIhoC7Q==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "^5.9.0" @@ -25944,9 +25876,9 @@ } }, "flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, "flatten-vertex-data": { @@ -26650,12 +26582,12 @@ } }, "http-proxy-middleware": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", - "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.2.tgz", + "integrity": "sha512-XtmDN5w+vdFTBZaYhdJAbMqn0DP/EhkUaAeo963mojwpKMMbw6nivtFKw07D7DDOH745L5k0VL0P8KRYNEVF/g==", "dev": true, "requires": { - "@types/http-proxy": "^1.17.5", + "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", @@ -29039,9 +28971,9 @@ } }, "mini-css-extract-plugin": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.2.tgz", - "integrity": "sha512-Lwgq9qLNyBK6yNLgzssXnq4r2+mB9Mz3cJWlM8kseysHIvTicFhDNimFgY94jjqlwhNzLPsq8wv4X+vOHtMdYA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz", + "integrity": "sha512-YseMB8cs8U/KCaAGQoqYmfUuhhGW0a9p9XvWXrxVOkE3/IiISTLw4ALNt7JR5B2eYauFM+PQGSbXMDmVbR7Tfw==", "dev": true, "requires": { "schema-utils": "^4.0.0" @@ -29742,9 +29674,9 @@ } }, "pirates": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", - "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", "dev": true }, "pkg-dir": { @@ -29911,9 +29843,9 @@ "requires": {} }, "postcss-calc": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.2.tgz", - "integrity": "sha512-B5R0UeB4zLJvxNt1FVCaDZULdzsKLPc6FhjFJ+xwFiq7VG4i9cuaJLxVjNtExNK8ocm3n2o4unXXLiVX1SCqxA==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.3.tgz", + "integrity": "sha512-EGM2EBBWqP57N0E7N7WOLT116PJ39dwHVU01WO4XPPQLJfkL2xVgkMZ+TZvCfapj/uJH07UEfKHQNPHzSw/14Q==", "dev": true, "requires": { "postcss-selector-parser": "^6.0.2", @@ -29948,9 +29880,9 @@ } }, "postcss-colormin": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.3.tgz", - "integrity": "sha512-dra4xoAjub2wha6RUXAgadHEn2lGxbj8drhFcIGLOMn914Eu7DkPUurugDXgstwttCYkJtZ/+PkWRWdp3UHRIA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.4.tgz", + "integrity": "sha512-rYlC5015aNqVQt/B6Cy156g7sH5tRUJGmT9xeagYthtKehetbKx7jHxhyLpulP4bs4vbp8u/B2rac0J7S7qPQg==", "dev": true, "requires": { "browserslist": "^4.16.6", @@ -29960,12 +29892,12 @@ } }, "postcss-convert-values": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz", - "integrity": "sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.3.tgz", + "integrity": "sha512-fVkjHm2T0PSMqXUCIhHNWVGjhB9mHEWX2GboVs7j3iCgr6FpIl9c/IdXy0PHWZSQ9LFTRgmj98amxJE6KOnlsA==", "dev": true, "requires": { - "postcss-value-parser": "^4.1.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-custom-media": { @@ -30003,30 +29935,30 @@ } }, "postcss-discard-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", - "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.2.tgz", + "integrity": "sha512-6VQ3pYTsJHEsN2Bic88Aa7J/Brn4Bv8j/rqaFQZkH+pcVkKYwxCIvoMQkykEW7fBjmofdTnQgcivt5CCBJhtrg==", "dev": true, "requires": {} }, "postcss-discard-duplicates": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", - "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.2.tgz", + "integrity": "sha512-LKY81YjUjc78p6rbXIsnppsaFo8XzCoMZkXVILJU//sK0DgPkPSpuq/cZvHss3EtdKvWNYgWzQL+wiJFtEET4g==", "dev": true, "requires": {} }, "postcss-discard-empty": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", - "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.2.tgz", + "integrity": "sha512-SxBsbTjlsKUvZLL+dMrdWauuNZU8TBq5IOL/DHa6jBUSXFEwmDqeXRfTIK/FQpPTa8MJMxEHjSV3UbiuyLARPQ==", "dev": true, "requires": {} }, "postcss-discard-overridden": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.2.tgz", - "integrity": "sha512-+56BLP6NSSUuWUXjRgAQuho1p5xs/hU5Sw7+xt9S3JSg+7R6+WMGnJW7Hre/6tTuZ2xiXMB42ObkiZJ2hy/Pew==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.3.tgz", + "integrity": "sha512-yRTXknIZA4k8Yo4FiF1xbsLj/VBxfXEWxJNIrtIy6HC9KQ4xJxcPtoaaskh6QptCGrrcGnhKsTsENTRPZOBu4g==", "dev": true, "requires": {} }, @@ -30168,66 +30100,64 @@ "requires": {} }, "postcss-merge-longhand": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.4.tgz", - "integrity": "sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.5.tgz", + "integrity": "sha512-R2BCPJJ/U2oh1uTWEYn9CcJ7MMcQ1iIbj9wfr2s/zHu5om5MP/ewKdaunpfJqR1WYzqCsgnXuRoVXPAzxdqy8g==", "dev": true, "requires": { - "postcss-value-parser": "^4.1.0", - "stylehacks": "^5.0.1" + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.0.2" } }, "postcss-merge-rules": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.4.tgz", - "integrity": "sha512-yOj7bW3NxlQxaERBB0lEY1sH5y+RzevjbdH4DBJurjKERNpknRByFNdNe+V72i5pIZL12woM9uGdS5xbSB+kDQ==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.5.tgz", + "integrity": "sha512-3Oa26/Pb9VOFVksJjFG45SNoe4nhGvJ2Uc6TlRimqF8uhfOCEhVCaJ3rvEat5UFOn2UZqTY5Da8dFgCh3Iq0Ug==", "dev": true, "requires": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.0.1", "postcss-selector-parser": "^6.0.5" } }, "postcss-minify-font-values": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.2.tgz", - "integrity": "sha512-R6MJZryq28Cw0AmnyhXrM7naqJZZLoa1paBltIzh2wM7yb4D45TLur+eubTQ4jCmZU9SGeZdWsc5KcSoqTMeTg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.3.tgz", + "integrity": "sha512-bC45rVzEwsLhv/cL1eCjoo2OOjbSk9I7HKFBYnBvtyuIZlf7uMipMATXtA0Fc3jwPo3wuPIW1jRJWKzflMh1sA==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-minify-gradients": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.4.tgz", - "integrity": "sha512-RVwZA7NC4R4J76u8X0Q0j+J7ItKUWAeBUJ8oEEZWmtv3Xoh19uNJaJwzNpsydQjk6PkuhRrK+YwwMf+c+68EYg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.5.tgz", + "integrity": "sha512-/YjvXs8PepsoiZAIpjstOO4IHKwFAqYNqbA1yVdqklM84tbUUneh6omJxGlRlF3mi6K5Pa067Mg6IwqEnYC8Zg==", "dev": true, "requires": { "colord": "^2.9.1", - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.0.1", "postcss-value-parser": "^4.2.0" } }, "postcss-minify-params": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.3.tgz", - "integrity": "sha512-NY92FUikE+wralaiVexFd5gwb7oJTIDhgTNeIw89i1Ymsgt4RWiPXfz3bg7hDy4NL6gepcThJwOYNtZO/eNi7Q==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.4.tgz", + "integrity": "sha512-Z0vjod9lRZEmEPfEmA2sCfjbfEEFKefMD3RDIQSUfXK4LpCyWkX1CniUgyNvnjJFLDPSxtgKzozhHhPHKoeGkg==", "dev": true, "requires": { - "alphanum-sort": "^1.0.2", "browserslist": "^4.16.6", - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.0.1", "postcss-value-parser": "^4.2.0" } }, "postcss-minify-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.1.tgz", - "integrity": "sha512-TOzqOPXt91O2luJInaVPiivh90a2SIK5Nf1Ea7yEIM/5w+XA5BGrZGUSW8aEx9pJ/oNj7ZJBhjvigSiBV+bC1Q==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.2.tgz", + "integrity": "sha512-gpn1nJDMCf3g32y/7kl+jsdamhiYT+/zmEt57RoT9GmzlixBNRPohI7k8UIHelLABhdLf3MSZhtM33xuH5eQOQ==", "dev": true, "requires": { - "alphanum-sort": "^1.0.2", "postcss-selector-parser": "^6.0.5" } }, @@ -30313,9 +30243,9 @@ } }, "postcss-normalize-charset": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", - "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.2.tgz", + "integrity": "sha512-fEMhYXzO8My+gC009qDc/3bgnFP8Fv1Ic8uw4ec4YTlhIOw63tGPk1YFd7fk9bZUf1DAbkhiL/QPWs9JLqdF2g==", "dev": true, "requires": {} }, @@ -30329,27 +30259,27 @@ } }, "postcss-normalize-positions": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.2.tgz", - "integrity": "sha512-tqghWFVDp2btqFg1gYob1etPNxXLNh3uVeWgZE2AQGh6b2F8AK2Gj36v5Vhyh+APwIzNjmt6jwZ9pTBP+/OM8g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.3.tgz", + "integrity": "sha512-U+rmhjrNBvIGYqr/1tD4wXPFFMKUbXsYXvlUCzLi0tOCUS6LoeEAnmVXXJY/MEB/1CKZZwBSs2tmzGawcygVBA==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-repeat-style": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.2.tgz", - "integrity": "sha512-/rIZn8X9bBzC7KvY4iKUhXUGW3MmbXwfPF23jC9wT9xTi7kAvgj8sEgwxjixBmoL6MVa4WOgxNz2hAR6wTK8tw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.3.tgz", + "integrity": "sha512-uk1+xYx0AMbA3nLSNhbDrqbf/rx+Iuq5tVad2VNyaxxJzx79oGieJ6D9F6AfOL2GtiIbP7vTYlpYHtG+ERFXTg==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-string": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.2.tgz", - "integrity": "sha512-zaI1yzwL+a/FkIzUWMQoH25YwCYxi917J4pYm1nRXtdgiCdnlTkx5eRzqWEC64HtRa06WCJ9TIutpb6GmW4gFw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.3.tgz", + "integrity": "sha512-Mf2V4JbIDboNGQhW6xW0YREDiYXoX3WrD3EjKkjvnpAJ6W4qqjLnK/c9aioyVFaWWHVdP5zVRw/9DI5S3oLDFw==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" @@ -30365,9 +30295,9 @@ } }, "postcss-normalize-unicode": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.2.tgz", - "integrity": "sha512-3y/V+vjZ19HNcTizeqwrbZSUsE69ZMRHfiiyLAJb7C7hJtYmM4Gsbajy7gKagu97E8q5rlS9k8FhojA8cpGhWw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.3.tgz", + "integrity": "sha512-uNC7BmS/7h6to2UWa4RFH8sOTzu2O9dVWPE/F9Vm9GdhONiD/c1kNaCLbmsFHlKWcEx7alNUChQ+jH/QAlqsQw==", "dev": true, "requires": { "browserslist": "^4.16.6", @@ -30385,21 +30315,21 @@ } }, "postcss-normalize-whitespace": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.2.tgz", - "integrity": "sha512-CXBx+9fVlzSgbk0IXA/dcZn9lXixnQRndnsPC5ht3HxlQ1bVh77KQDL1GffJx1LTzzfae8ftMulsjYmO2yegxA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.3.tgz", + "integrity": "sha512-333JWRnX655fSoUbufJ10HJop3c8mrpKkCCUnEmgz/Cb/QEtW+/TMZwDAUt4lnwqP6tCCk0x0b58jqvDgiQm/A==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-ordered-values": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.3.tgz", - "integrity": "sha512-T9pDS+P9bWeFvqivXd5ACzQmrCmHjv3ZP+djn8E1UZY7iK79pFSm7i3WbKw2VSmFmdbMm8sQ12OPcNpzBo3Z2w==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.4.tgz", + "integrity": "sha512-taKtGDZtyYUMVYkg+MuJeBUiTF6cGHZmo/qcW7ibvW79UlyKuSHbo6dpCIiqI+j9oJsXWzP+ovIxoyLDOeQFdw==", "dev": true, "requires": { - "cssnano-utils": "^3.0.0", + "cssnano-utils": "^3.0.1", "postcss-value-parser": "^4.2.0" } }, @@ -30487,9 +30417,9 @@ } }, "postcss-reduce-transforms": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.2.tgz", - "integrity": "sha512-25HeDeFsgiPSUx69jJXZn8I06tMxLQJJNF5h7i9gsUg8iP4KOOJ8EX8fj3seeoLt3SLU2YDD6UPnDYVGUO7DEA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.3.tgz", + "integrity": "sha512-yDnTUab5i7auHiNwdcL1f+pBnqQFf+7eC4cbC7D8Lc1FkvNZhtpkdad+9U4wDdFb84haupMf0rA/Zc5LcTe/3A==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" @@ -30577,12 +30507,11 @@ } }, "postcss-unique-selectors": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.2.tgz", - "integrity": "sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.3.tgz", + "integrity": "sha512-V5tX2hadSSn+miVCluuK1IDGy+7jAXSOfRZ2DQ+s/4uQZb/orDYBjH0CHgFrXsRw78p4QTuEFA9kI6C956UnHQ==", "dev": true, "requires": { - "alphanum-sort": "^1.0.2", "postcss-selector-parser": "^6.0.5" } }, @@ -30886,9 +30815,9 @@ } }, "rc-util": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.16.1.tgz", - "integrity": "sha512-kSCyytvdb3aRxQacS/71ta6c+kBWvM1v8/2h9d/HaNWauc3qB8pLnF20PJ8NajkNN8gb+rR1l0eWO+D4Pz+LLQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.17.0.tgz", + "integrity": "sha512-HWuTIKzBeZQQ7IBqdokE0wMp/xx39/KfUJ0gcquBigoldDCrf3YBcWFHrrQlJG7sI82Wg8mwp1uAKV3zMGfAgg==", "requires": { "@babel/runtime": "^7.12.5", "react-is": "^16.12.0", @@ -31382,12 +31311,12 @@ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dev": true, "requires": { - "is-core-module": "^2.8.0", + "is-core-module": "^2.8.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -31480,9 +31409,9 @@ } }, "rollup": { - "version": "2.64.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.64.0.tgz", - "integrity": "sha512-+c+lbw1lexBKSMb1yxGDVfJ+vchJH3qLbmavR+awDinTDA2C5Ug9u7lkOzj62SCu0PKUExsW36tpgW7Fmpn3yQ==", + "version": "2.66.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.66.1.tgz", + "integrity": "sha512-crSgLhSkLMnKr4s9iZ/1qJCplgAgrRY+igWv8KhG/AjKOJ0YX/WpmANyn8oxrw+zenF3BXWDLa7Xl/QZISH+7w==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -32307,12 +32236,12 @@ } }, "stylehacks": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", - "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.2.tgz", + "integrity": "sha512-114zeJdOpTrbQYRD4OU5UWJ99LKUaqCPJTU1HQ/n3q3BwmllFN8kHENaLnOeqVq6AhXrWfxHNZTl33iJ4oy3cQ==", "dev": true, "requires": { - "browserslist": "^4.16.0", + "browserslist": "^4.16.6", "postcss-selector-parser": "^6.0.4" } }, @@ -32483,20 +32412,20 @@ "integrity": "sha512-H1XoH1URcBOa/rZZWxLxHCtOdVUEev+9vo5YdYhC9tCY4wnybX+VQrCYuy9ubkg69fCBxCONJOSLGfw0DWMffQ==" }, "tailwindcss": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.15.tgz", - "integrity": "sha512-bT2iy7FtjwgsXik4ZoJnHXR+SRCiGR1W95fVqpLZebr64m4ahwUwRbIAc5w5+2fzr1YF4Ct2eI7dojMRRl8sVQ==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.17.tgz", + "integrity": "sha512-OiHUsmOKQQEg/ocXaLIjk/kOz8EK2jF6iPuc1bQ4NsmhYl7sk70UDsGV02AJvBAAiJhinPCkDR8egT9qY+ulCw==", "dev": true, "requires": { "arg": "^5.0.1", "chalk": "^4.1.2", - "chokidar": "^3.5.2", + "chokidar": "^3.5.3", "color-name": "^1.1.4", "cosmiconfig": "^7.0.1", "detective": "^5.2.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.11", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "normalize-path": "^3.0.0", @@ -33087,9 +33016,9 @@ "dev": true }, "webpack": { - "version": "5.66.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.66.0.tgz", - "integrity": "sha512-NJNtGT7IKpGzdW7Iwpn/09OXz9inIkeIQ/ibY6B+MdV1x6+uReqz/5z1L89ezWnpPDWpXF0TY5PCYKQdWVn8Vg==", + "version": "5.67.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", + "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -33115,7 +33044,7 @@ "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.3.1", - "webpack-sources": "^3.2.2" + "webpack-sources": "^3.2.3" }, "dependencies": { "@types/estree": { diff --git a/package.json b/package.json index 6d7ef055..1525ded3 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,6 @@ "dependencies": { "@reach/listbox": "^0.16.2", "aframe": "^1.2.0", - "aframe-event-set-component": "^5.0.0", - "aframe-orbit-controls": "^1.3.0", "d3-scale": "^4.0.2", "rc-slider": "^9.7.4" }, diff --git a/src/Aframe/ccvLibVolumeShader.js b/src/Aframe/Shader.js similarity index 99% rename from src/Aframe/ccvLibVolumeShader.js rename to src/Aframe/Shader.js index 20ef86a3..31a16f91 100644 --- a/src/Aframe/ccvLibVolumeShader.js +++ b/src/Aframe/Shader.js @@ -1,25 +1,27 @@ -THREE.ShaderLib["ccvLibVolumeRenderShader"] = { +/* globals THREE */ + +THREE.ShaderLib["ModelShader"] = { uniforms: { - slice: { value: 1.0 }, - dim: { value: 1.0 }, - clipPlane: { value: new THREE.Matrix4() }, + box_max: { value: new THREE.Vector3(1, 1, 1) }, + box_min: { value: new THREE.Vector3(0, 0, 0) }, + channel: { value: 1 }, clipping: { value: false }, - threshold: { value: 1 }, + clipPlane: { value: new THREE.Matrix4() }, + controllerPoseMatrix: { value: new THREE.Matrix4() }, + depth: { value: null }, + dim: { value: 1.0 }, + grabMesh: { value: false }, + intensity: { value: 1.0 }, multiplier: { value: 1 }, + P_inv: { value: new THREE.Matrix4() }, + slice: { value: 1.0 }, step_size: { value: new THREE.Vector3(1, 1, 1) }, - channel: { value: 1 }, + threshold: { value: 1 }, + u_data: { value: null }, u_lut: { value: null }, useLut: { value: true }, viewPort: { value: new THREE.Vector2() }, - P_inv: { value: new THREE.Matrix4() }, - u_data: { value: null }, - depth: { value: null }, zScale: { value: 1.0 }, - controllerPoseMatrix: { value: new THREE.Matrix4() }, - grabMesh: { value: false }, - box_min: { value: new THREE.Vector3(0, 0, 0) }, - box_max: { value: new THREE.Vector3(1, 1, 1) }, - intensity: { value: 1.0 }, }, vertexShader: [ diff --git a/src/Aframe/arcball-camera.js b/src/Aframe/arcball-camera.js index 7c9270ee..48fc6409 100644 --- a/src/Aframe/arcball-camera.js +++ b/src/Aframe/arcball-camera.js @@ -1,7 +1,7 @@ -/* globals AFRAME THREE*/ +/* globals AFRAME THREE*/ import "./arcball-controller.js"; -let bind = AFRAME.utils.bind; +const bind = AFRAME.utils.bind; AFRAME.registerComponent("arcball-camera", { dependencies: ["camera"], @@ -11,80 +11,54 @@ AFRAME.registerComponent("arcball-camera", { }, init: function () { - let el = this.el; - this.vrcam = document.querySelector("#camera"); + const el = this.el; + + this.oldPosition = new THREE.Vector3(); + this.oldMatrix = new THREE.Matrix4(); + this.meshObjectHandler = document.getElementById("volumeCube").object3D; + + // Create controls this.controls = new THREE.TrackballControls( el.getObject3D("camera"), el.sceneEl.renderer.domElement ); - - this.meshObjectHandler = document.getElementById("volumeCube").object3D; this.controls.rotateSpeed = 1.0; this.controls.zoomSpeed = 1.2; this.controls.panSpeed = 0.8; - this.oldPosition = new THREE.Vector3(); - this.oldMatrix = new THREE.Matrix4(); - - this.debugPosition = false; - - this.bindMethods(); - this.onWindowResize = this.onWindowResize.bind(this); + // Bind functions and add event listeners + this.onEnterVR = bind(this.onEnterVR, this); + this.onExitVR = bind(this.onExitVR, this); el.sceneEl.addEventListener("enter-vr", this.onEnterVR); el.sceneEl.addEventListener("exit-vr", this.onExitVR); - window.addEventListener("resize", this.onWindowResize, false); - + // Move camera to initial position el.getObject3D("camera").position.copy(this.data.initialPosition); - - // Set the pointer to grab/grabbing when over the vr canvas - const aCanvas = document.querySelector(".a-canvas"); - aCanvas.style.cursor = "grab"; - - document.addEventListener("mousedown", () => { - aCanvas.style.cursor = "grabbing"; - }); - document.addEventListener("mouseup", () => { - aCanvas.style.cursor = "grab"; - }); - }, - - onWindowResize() {}, - - bindMethods: function () { - this.onEnterVR = bind(this.onEnterVR, this); - this.onExitVR = bind(this.onExitVR, this); }, onEnterVR: function () { - let el = this.el; - this.debugPosition = true; + const el = this.el; if ( !AFRAME.utils.device.checkHeadsetConnected() && !AFRAME.utils.device.isMobile() ) { return; } + this.controls.enabled = false; if (el.hasAttribute("look-controls")) { el.setAttribute("look-controls", "enabled", true); + + // Store position from before VR and move to origin this.oldMatrix.copy(this.meshObjectHandler.matrixWorld); this.oldPosition.copy(el.getObject3D("camera").position); el.getObject3D("camera").position.set(0, 0, 0); } }, - update: function (oldData) { - let controls = this.controls; - controls.rotateSpeed = 1.0; - controls.zoomSpeed = 1.2; - controls.panSpeed = 0.8; - }, - onExitVR: function () { - console.log("exit VR"); - let el = this.el; - this.debugPosition = false; + const el = this.el; + if ( !AFRAME.utils.device.checkHeadsetConnected() && !AFRAME.utils.device.isMobile() @@ -92,12 +66,7 @@ AFRAME.registerComponent("arcball-camera", { return; } this.controls.enabled = true; - el.getObject3D("camera").position.set(0, 0, 2); - console.log( - "this.meshObjectHandler.el.getAttribute('loader').meshPosition" - ); - let mesh = this.meshObjectHandler.el.getAttribute("loader").meshPosition; - console.log(mesh); + el.getObject3D("camera").position.set(this.oldPosition); if (el.hasAttribute("look-controls")) { el.setAttribute("look-controls", "enabled", false); @@ -108,8 +77,6 @@ AFRAME.registerComponent("arcball-camera", { if (this.controls.enabled) { this.controls.update(); } - if (this.debugPosition) { - } }, remove: function () { diff --git a/src/Aframe/buttons-check.js b/src/Aframe/buttons-check.js index a5ec82b0..c176caa3 100644 --- a/src/Aframe/buttons-check.js +++ b/src/Aframe/buttons-check.js @@ -1,4 +1,6 @@ /* globals AFRAME */ + +// TODO: Change vars to triggerDown and gripDown AFRAME.registerComponent("buttons-check", { schema: { clipPlane: { type: "boolean", default: false }, @@ -6,22 +8,33 @@ AFRAME.registerComponent("buttons-check", { }, init: function () { - this.el.addEventListener("gripdown", (evt) => { - this.data.clipPlane = true; - }); - - this.el.addEventListener("gripup", (evt) => { - this.data.clipPlane = false; - }); + this.onGripDown = this.onGripDown.bind(this); + this.onGripUp = this.onGripDown.bind(this); + this.onTriggerDown = this.onTriggerDown.bind(this); + this.onTriggerUp = this.onTriggerUp.bind(this); + this.el.addEventListener("gripdown", this.onGripDown); + this.el.addEventListener("gripup", this.onGripUp); + this.el.addEventListener("triggerdown", this.onTriggerDown); + this.el.addEventListener("triggerup", this.onTriggerUp); + }, - this.el.addEventListener("triggerdown", (evt) => { - this.data.grabObject = true; - console.log(this.data.grabObject); - }); + remove: function () { + this.el.removeEventListener("gripdown", this.onGripDown); + this.el.removeEventListener("gripup", this.onGripUp); + this.el.removeEventListener("triggerdown", this.onTriggerDown); + this.el.removeEventListener("triggerup", this.onTriggerUp); + }, - this.el.addEventListener("triggerup", (evt) => { - this.data.grabObject = false; - console.log(this.data.grabObject); - }); + onGripDown: function (e) { + this.data.clipPlane = true; + }, + onGripUp: function (e) { + this.data.clipPlane = false; + }, + onTriggerDown: function (e) { + this.data.grabObject = true; + }, + onTriggerUp: function (e) { + this.data.grabObject = false; }, }); diff --git a/src/Aframe/collider-check.js b/src/Aframe/collider-check.js new file mode 100644 index 00000000..34a6af8a --- /dev/null +++ b/src/Aframe/collider-check.js @@ -0,0 +1,22 @@ +/* globals AFRAME */ + +AFRAME.registerComponent("collider-check", { + dependencies: ["raycaster", "buttons-check"], + + schema: { + intersecting: { type: "boolean", default: false }, + }, + + init: function () { + this.onCollide = this.onCollide.bind(this); + this.el.addEventListener("raycaster-intersection", this.onCollide); + }, + + onCollide: function (e) { + this.data.intersecting = true; + }, + + remove: function () { + this.el.removeEventListener("raycaster-intersection", this.onCollide); + }, +}); diff --git a/src/Aframe/cursor-listener.js b/src/Aframe/cursor-listener.js deleted file mode 100644 index 69bce3fa..00000000 --- a/src/Aframe/cursor-listener.js +++ /dev/null @@ -1,42 +0,0 @@ -/* globals AFRAME */ - -// Component to change to a sequential color on click. -AFRAME.registerComponent("cursor-listener", { - init: function () { - this.lastIndex = -1; - this.COLORS = ["red", "green", "blue"]; - this.dragging = false; - this.cameraHandler = document.getElementById("camera").object3D; - this.onMousedown = this.onMousedown.bind(this); - this.onMouseUp = this.onMouseUp.bind(this); - this.onMouseMove = this.onMouseMove.bind(this); - - this.el.addEventListener("mousedown", function (evt) { - this.dragging = true; - }); - - this.el.addEventListener("mousemove ", function (evt) { - if (this.dragging === true) { - console.log("dragging at: ", evt.detail.intersection.point); - } - }); - this.el.addEventListener("mouseup ", function (evt) { - this.dragging = false; - }); - }, - - onMousedown: function (evt) { - this.dragging = true; - }, - - onMouseMove: function (evt) { - if (this.dragging === true) { - console.log("dragging at: ", evt.detail.intersection.point); - } - }, - - onMouseUp: function (evt) { - this.dragging = false; - console.log("mouseup at: ", evt.detail.intersection.point); - }, -}); diff --git a/src/Aframe/entity-collider-check.js b/src/Aframe/entity-collider-check.js new file mode 100644 index 00000000..492cb6a4 --- /dev/null +++ b/src/Aframe/entity-collider-check.js @@ -0,0 +1,20 @@ +/* globals AFRAME */ + +AFRAME.registerComponent("entity-collider-check", { + schema: { + intersected: { type: "boolean", default: false }, + }, + + init: function () { + this.onCollide = this.onCollide.bind(this); + this.el.addEventListener("raycaster-intersected", this.onCollide); + }, + + remove: function () { + this.el.removeEventListener("raycaster-intersected", this.onCollide); + }, + + onCollide: function (e) { + this.data.intersected = true; + }, +}); diff --git a/src/Aframe/loader.js b/src/Aframe/loader.js deleted file mode 100644 index ce374436..00000000 --- a/src/Aframe/loader.js +++ /dev/null @@ -1,647 +0,0 @@ -/* globals AFRAME THREE */ -import "./ccvLibVolumeShader.js"; -let bind = AFRAME.utils.bind; - -AFRAME.registerComponent("collider-check", { - dependencies: ["raycaster", "buttons-check"], - - schema: { - intersecting: { type: "boolean", default: false }, - }, - - init: function () { - this.onCollide = this.onCollide.bind(this); - this.el.addEventListener("raycaster-intersection", this.onCollide); - }, - - onCollide: function (event) { - this.data.intersecting = true; - }, -}); - -AFRAME.registerComponent("entity-collider-check", { - schema: { - intersected: { type: "boolean", default: false }, - }, - - init: function () { - this.onCollide = this.onCollide.bind(this); - this.el.addEventListener("raycaster-intersected", this.onCollide); - }, - - onCollide: function (event) { - this.data.intersected = true; - console.log("entity-intersected"); - }, -}); - -AFRAME.registerComponent("loader", { - schema: { - rayCollided: { type: "boolean", default: false }, - modelLoaded: { type: "boolean", default: false }, - meshPosition: { type: "vec3", default: { x: 0, y: 0, z: 0 } }, - alphaXDataArray: { type: "array" }, - alphaYDataArray: { type: "array" }, - colorMap: { type: "string", default: "" }, - path: { type: "string", default: "" }, - slices: { type: "number", default: 55 }, - x_spacing: { type: "number", default: 2.0 }, - y_spacing: { type: "number", default: 2.0 }, - z_spacing: { type: "number", default: 1.0 }, - useTransferFunction: { type: "boolean", default: false }, - channel: { type: "number", default: 1 }, - intensity: { type: "number", default: 1.0 }, - }, - - init: function () { - this.objectPose = new THREE.Matrix4(); - this.controllerPose = new THREE.Matrix4(); - this.tempMatrix = new THREE.Matrix4(); - this.onCollide = this.onCollide.bind(this); - this.grabbed = false; - this.onSelectStart = this.onSelectStart.bind(this); - this.onClearCollide = this.onClearCollide.bind(this); - this.loadModel = this.loadModel.bind(this); - this.updateTransferTexture = this.updateTransferTexture.bind(this); - this.updateDataChannel = this.updateDataChannel.bind(this); - this.updateColorMapping = this.updateColorMapping.bind(this); - this.debugScene = this.debugScene.bind(this); - - this.updateOpacityData = this.updateOpacityData.bind(this); - this.colorMapNeedsUpdate = false; - this.currentColorMap = this.data.colorMap; - - this.el.addEventListener("raycaster-intersected", this.onCollide); - this.el.addEventListener( - "raycaster-intersected-cleared", - this.onClearCollide - ); - - this.colorTransferMap = new Map(); - - this.group = new THREE.Group(); - - this.isVrModeOn = false; - - this.sceneHandler = this.el.sceneEl; - this.group = new THREE.Group(); - - this.controllerHandler = document.getElementById("rhand").object3D; - this.controllerHandler.el.addEventListener( - "selectstart", - this.onSelectStart - ); - - this.clipPlaneListenerHandler = document.getElementById( - "clipplane2DListener" - ).object3D; - this.clip2DPlaneRendered = false; - - this.clipPlaneHandler = document.getElementById("clipplane2D").object3D; - - this.controllerHandler.matrixAutoUpdate = false; - this.grabState = - this.controllerHandler.el.getAttribute("buttons-check").grabObject; - let clipplane2D = document.getElementById("clipplane2D"); - if (clipplane2D !== undefined) { - this.clipplane2DHandler = clipplane2D.object3D; - } - - // save mesh vr position and rotation on swich between desktop and vr - this.vrPosition = new THREE.Vector3(0, 0, 0); - this.vrRotation = new THREE.Vector3(0, 0, 0); - this.debugVRPos = false; - // bind onenterVR and onexitVR - this.bindMethods(); - this.el.sceneEl.addEventListener("enter-vr", this.onEnterVR); - this.el.sceneEl.addEventListener("exit-vr", this.onExitVR); - - this.opacityControlPoints = [0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]; - - let jet_values = [ - [0, 0, 0.5], - [0, 0, 1], - [0, 0.5, 1], - [0, 1, 1], - [0.5, 1, 0.5], - [1, 1, 0], - [1, 0.5, 0], - [1, 0, 0], - [0.5, 0, 0], - ]; - - const pData = []; - this.alphaData = []; - this.newAlphaData = []; - const indices = []; - const zeroArray = [0, 0, 0, 0]; - - //setting up control points - for (let i = 0; i < 9; i++) { - const index = i * 28; - while (pData.length < index) { - pData.push(zeroArray); - } - - pData.push([ - jet_values[i][0] * 255, - jet_values[i][1] * 255, - jet_values[i][2] * 255, - this.opacityControlPoints[i] * 255, - ]); - indices.push(index); - } - - //interpolation between opacity control points - for (let j = 0; j < 9 - 1; j++) { - const dDataA = pData[indices[j + 1]][3] - pData[indices[j]][3]; - const dIndex = indices[j + 1] - indices[j]; - const dDataIncA = dDataA / dIndex; - for (let idx = indices[j] + 1; idx < indices[j + 1]; idx++) { - let alpha = pData[idx - 1][3] + dDataIncA; - this.alphaData[idx] = alpha; - } - } - - // interpolation between colors control points - for (let j = 0; j < 9 - 1; j++) { - const dDataR = pData[indices[j + 1]][0] - pData[indices[j]][0]; - const dDataG = pData[indices[j + 1]][1] - pData[indices[j]][1]; - const dDataB = pData[indices[j + 1]][2] - pData[indices[j]][2]; - const dDataA = pData[indices[j + 1]][3] - pData[indices[j]][3]; - const dIndex = indices[j + 1] - indices[j]; - - const dDataIncR = dDataR / dIndex; - const dDataIncG = dDataG / dIndex; - const dDataIncB = dDataB / dIndex; - const dDataIncA = dDataA / dIndex; - - for (let idx = indices[j] + 1; idx < indices[j + 1]; idx++) { - const alpha = pData[idx - 1][3] + dDataIncA; - this.alphaData[idx] = alpha; - pData[idx] = [ - pData[idx - 1][0] + dDataIncR, - pData[idx - 1][1] + dDataIncG, - pData[idx - 1][2] + dDataIncB, - alpha, - ]; - } - } - - this.canvas = this.el.sceneEl.canvas; - - this.printedLog = false; - - let cameraEl = document.querySelector("#camera"); - cameraEl.setAttribute("camera", "active", true); - }, - - debugScene: function (evt) {}, - - updateTransferTexture: function () { - if (this.colorTransferMap.has(this.currentColorMap)) { - const colorTransfer = this.colorTransferMap.get( - this.currentColorMap - ).data; - if (colorTransfer) { - const imageTransferData = new Uint8Array(4 * 256); - for (let i = 0; i < 256; i++) { - imageTransferData[i * 4 + 0] = colorTransfer[i * 3 + 0]; - imageTransferData[i * 4 + 1] = colorTransfer[i * 3 + 1]; - imageTransferData[i * 4 + 2] = colorTransfer[i * 3 + 2]; - imageTransferData[i * 4 + 3] = this.newAlphaData[i]; - } - const transferTexture = new THREE.DataTexture( - imageTransferData, - 256, - 1, - THREE.RGBAFormat - ); - transferTexture.needsUpdate = true; - - if (this.el.getObject3D("mesh") !== undefined) { - let material = this.el.getObject3D("mesh").material; - // Shader script uses channel 6 for color mapping - material.uniforms.channel.value = 6; - material.uniforms.u_lut.value = transferTexture; - material.uniforms.useLut.value = this.data.useTransferFunction; - material.needsUpdate = true; - } - } - } - }, - - updateDataChannel: function () { - if (this.el.getObject3D("mesh") !== undefined) { - let material = this.el.getObject3D("mesh").material; - material.uniforms.channel.value = this.data.channel; - material.uniforms.useLut.value = this.data.useTransferFunction; - material.needsUpdate = true; - } - }, - - bindMethods: function () { - this.onEnterVR = bind(this.onEnterVR, this); - this.onExitVR = bind(this.onExitVR, this); - }, - - onEnterVR: function () {}, - - onExitVR: function () { - if (this.el.getObject3D("mesh") !== undefined) { - console.log("loader onExitVR 1: "); - console.log(this.el.getObject3D("mesh").position); - - this.data.meshPosition.x = this.el.getObject3D("mesh").position.x; - this.data.meshPosition.y = this.el.getObject3D("mesh").position.y; - this.data.meshPosition.z = this.el.getObject3D("mesh").position.z; - - console.log("loader onExitVR this.data.meshPosition 1 : "); - console.log(this.data.meshPosition); - - this.vrRotation = this.el.getObject3D("mesh").rotation; - this.el.getObject3D("mesh").position.copy(new THREE.Vector3()); - console.log("loader onExitVR this.data.meshPosition 2 : "); - console.log(this.data.meshPosition); - - this.el.getObject3D("mesh").rotation.set(0, 0, 0); - - console.log("loader onExitVR 2: "); - console.log(this.el.getObject3D("mesh").position); - this.debugVRPos = true; - } - }, - - loadModel: function () { - let currentVolume = this.el.getObject3D("mesh"); - const { x_spacing, y_spacing, z_spacing, slices, path } = this.data; - if (currentVolume !== undefined) { - //clear mesh - this.el.removeObject3D("mesh"); - currentVolume = undefined; - } - - if (path !== "") { - const el = this.el; - const data = this.data; - const canvasWidth = this.canvas.width; - const canvasHeight = this.canvas.height; - - const useTransferFunction = this.data.useTransferFunction; - const intensity = this.data.intensity; - - const updateColorMapping = this.updateColorMapping; - const updateDataChannel = this.updateDataChannel; - - //load as 2D texture - new THREE.TextureLoader().load( - path, - function (texture) { - const dim = Math.ceil(Math.sqrt(slices)); - const spacing = [x_spacing, y_spacing, z_spacing]; - - const volumeScale = [ - 1.0 / ((texture.image.width / dim) * spacing[0]), - 1.0 / ((texture.image.height / dim) * spacing[1]), - 1.0 / (slices * spacing[2]), - ]; - - const zScale = volumeScale[0] / volumeScale[2]; - - texture.minFilter = texture.magFilter = THREE.LinearFilter; - texture.unpackAlignment = 1; - texture.needsUpdate = true; - - // Material - const shader = THREE.ShaderLib["ccvLibVolumeRenderShader"]; - const uniforms = THREE.UniformsUtils.clone(shader.uniforms); - uniforms["u_data"].value = texture; - uniforms["u_lut"].value = null; - uniforms["clipPlane"].value = new THREE.Matrix4(); - uniforms["clipping"].value = false; - uniforms["threshold"].value = 1; - uniforms["multiplier"].value = 1; - uniforms["slice"].value = slices; - uniforms["dim"].value = dim; - - if (!useTransferFunction) { - uniforms["channel"].value = 6; - uniforms["useLut"].value = false; - } else { - uniforms["channel"].value = 1; - uniforms["useLut"].value = true; - } - uniforms["step_size"].value = new THREE.Vector3( - 1 / 100, - 1 / 100, - 1 / 100 - ); - - uniforms["viewPort"].value = new THREE.Vector2( - canvasWidth, - canvasHeight - ); - uniforms["P_inv"].value = new THREE.Matrix4(); - uniforms["depth"].value = null; - uniforms["zScale"].value = zScale; - uniforms["controllerPoseMatrix"].value = new THREE.Matrix4(); - uniforms["grabMesh"].value = false; - uniforms["box_min"].value = new THREE.Vector3(0, 0, 0); - uniforms["box_max"].value = new THREE.Vector3(1, 1, 1); - uniforms["intensity"].value = intensity; - - const material = new THREE.ShaderMaterial({ - uniforms: uniforms, - transparent: true, - vertexShader: shader.vertexShader, - fragmentShader: shader.fragmentShader, - side: THREE.BackSide, // The volume shader uses the backface as its "reference point" - }); - - // Mesh - const geometry = new THREE.BoxGeometry(1, 1, 1); - - el.setObject3D("mesh", new THREE.Mesh(geometry, material)); - data.modelLoaded = true; - material.needsUpdate = true; - - //this steps needs the model to be uploaded first - if (useTransferFunction) { - updateColorMapping(); - } else { - updateDataChannel(); - } - }, - function () {}, - function () { - console.log("Could not load the data, Data not found"); - } - ); - } - }, - - onCollide: function (event) { - this.data.rayCollided = true; - }, - - onClearCollide: function (event) { - this.data.rayCollided = false; - }, - onSelectStart: function (event) { - console.log("onSelectStart"); - }, - - remove: function () { - // Do something the component or its entity is detached. - }, - - updateColorMapping: function () { - if (!this.colorTransferMap.has(this.currentColorMap)) { - const colorCanvas = document.createElement("canvas"); - - const imgWidth = 255; - const imgHeight = 15; - const newColorMap = { - img: document.createElement("img"), - width: imgWidth, - height: imgHeight, - data: null, - }; - - // Re-inject local image with semi-colon - if (this.currentColorMap.startsWith("data:image/png")) { - this.currentColorMap = - this.currentColorMap.substring(0, 14) + - ";" + - this.currentColorMap.substring(14); - } - - newColorMap.img.src = this.currentColorMap; - this.colorTransferMap.set(this.currentColorMap, newColorMap); - const mappedColorMap = newColorMap; - - const updateTransferTexture = this.updateTransferTexture; - newColorMap.img.onload = function (data) { - colorCanvas.height = imgHeight; - colorCanvas.width = imgWidth; - const colorContext = colorCanvas.getContext("2d"); - colorContext.drawImage(newColorMap.img, 0, 0); - const colorData = colorContext.getImageData(0, 0, imgWidth, 1).data; - const colorTransfer = new Uint8Array(3 * 256); - for (let i = 0; i < 256; i++) { - colorTransfer[i * 3] = colorData[i * 4]; - colorTransfer[i * 3 + 1] = colorData[i * 4 + 1]; - colorTransfer[i * 3 + 2] = colorData[i * 4 + 2]; - } - mappedColorMap.data = colorTransfer; - - updateTransferTexture(); - }; - } else { - this.updateTransferTexture(); - } - }, - - update: function (oldData) { - if (oldData === undefined) { - return; - } - - if (this.data.useTransferFunction) { - // this part updates the opacity control points - //comparing javascript arrays - if ( - (this.data.alphaXDataArray !== undefined && - JSON.stringify(oldData.alphaXDataArray) !== - JSON.stringify(this.data.alphaXDataArray)) || - (this.data.alphaYDataArray !== undefined && - JSON.stringify(oldData.alphaYDataArray) !== - JSON.stringify(this.data.alphaYDataArray)) - ) { - this.updateOpacityData( - this.data.alphaXDataArray, - this.data.alphaYDataArray - ); - this.updateTransferTexture(); - } else if (oldData.colorMap !== this.data.colorMap) { - this.currentColorMap = this.data.colorMap; - this.updateColorMapping(); - } - } else { - // Data using channels - if ( - this.data.channel !== undefined && - oldData.channel !== this.data.channel - ) { - this.updateDataChannel(); - } - } - - if (oldData.path !== this.data.path) { - this.loadModel(); - } - }, - - updateOpacityData: function (arrayX, arrayY) { - this.newAlphaData = []; - - for (let i = 0; i <= arrayX.length - 2; i++) { - const scaledColorInit = arrayX[i] * 255; - const scaledColorEnd = arrayX[i + 1] * 255; - - const scaledAplhaInit = arrayY[i] * 255; - const scaledAlphaEnd = arrayY[i + 1] * 255; - - const deltaX = scaledColorEnd - scaledColorInit; - - for (let j = 1 / deltaX; j < 1; j += 1 / deltaX) { - // linear interpolation - this.newAlphaData.push(scaledAplhaInit * (1 - j) + scaledAlphaEnd * j); - } - } - }, - - getMesh: function () { - return this.el.getObject3D("mesh"); - }, - - tick: function (time, timeDelta) { - // Do something on every scene tick or frame. - if (this.debugVRPos) { - this.debugVRPos = false; - } - - const isVrModeActive = this.sceneHandler.is("vr-mode"); - if (this.data.modelLoaded) { - if (this.clipPlaneListenerHandler !== undefined && !isVrModeActive) { - if ( - this.clipPlaneListenerHandler.el.getAttribute("render-2d-clipplane") - .activateClipPlane && - !this.clip2DPlaneRendered - ) { - this.clip2DPlaneRendered = true; - } else if ( - !this.clipPlaneListenerHandler.el.getAttribute("render-2d-clipplane") - .activateClipPlane && - this.clip2DPlaneRendered - ) { - this.clip2DPlaneRendered = false; - - if (this.el.getObject3D("mesh") !== undefined) { - const material = this.el.getObject3D("mesh").material; - material.uniforms.box_min.value = new THREE.Vector3(0, 0, 0); - material.uniforms.box_max.value = new THREE.Vector3(1, 1, 1); - } - } - - if (this.clip2DPlaneRendered) { - if (this.el.getObject3D("mesh") !== undefined) { - const material = this.el.getObject3D("mesh").material; - - if (material !== undefined) { - const sliceX = this.clipPlaneListenerHandler.el.getAttribute( - "render-2d-clipplane" - ).clipX; - const sliceY = this.clipPlaneListenerHandler.el.getAttribute( - "render-2d-clipplane" - ).clipY; - const sliceZ = this.clipPlaneListenerHandler.el.getAttribute( - "render-2d-clipplane" - ).clipZ; - - material.uniforms.box_min.value = new THREE.Vector3( - sliceX.x, - sliceY.x, - sliceZ.x - ); - material.uniforms.box_max.value = new THREE.Vector3( - sliceX.y, - sliceY.y, - sliceZ.y - ); - } - } - } - } else if (this.controllerHandler !== undefined && isVrModeActive) { - if ( - !this.controllerHandler.el.getAttribute("buttons-check").grabObject && - this.grabbed - ) { - this.el - .getObject3D("mesh") - .matrix.premultiply(this.controllerHandler.matrixWorld); - this.el - .getObject3D("mesh") - .matrix.decompose( - this.el.getObject3D("mesh").position, - this.el.getObject3D("mesh").quaternion, - this.el.getObject3D("mesh").scale - ); - this.el.object3D.add(this.el.getObject3D("mesh")); - - this.grabbed = false; - } - - // grab mesh - if ( - this.controllerHandler.el.getAttribute("buttons-check").grabObject && - this.data.rayCollided && - !this.grabbed - ) { - const inverseControllerPos = new THREE.Matrix4(); - inverseControllerPos.getInverse(this.controllerHandler.matrixWorld); - this.el.getObject3D("mesh").matrix.premultiply(inverseControllerPos); - this.el - .getObject3D("mesh") - .matrix.decompose( - this.el.getObject3D("mesh").position, - this.el.getObject3D("mesh").quaternion, - this.el.getObject3D("mesh").scale - ); - this.controllerHandler.add(this.el.getObject3D("mesh")); - - this.grabbed = true; - } - - this.updateMeshClipMatrix(this.controllerHandler.matrixWorld); - } - } - - if (this.el.getObject3D("mesh") !== undefined) { - this.data.meshPosition = this.el.getObject3D("mesh").position; - } - }, - - updateMeshClipMatrix: function (currentSpaceClipMatrix) { - const volumeMatrix = this.el.getObject3D("mesh").matrixWorld; - //material for setting the clipPlane and clipping value - const material = this.el.getObject3D("mesh").material; - - //scalematrix for zscaling - const scaleMatrix = new THREE.Matrix4(); - scaleMatrix.makeScale(1, 1, material.uniforms.zScale.value); - - //translationmatrix to cube-coordinates ranging from 0 -1 - const translationMatrix = new THREE.Matrix4(); - translationMatrix.makeTranslation(-0.5, -0.5, -0.5); - - //inverse of the clipMatrix - const currentSpaceClipMatrix_inverse = new THREE.Matrix4(); - currentSpaceClipMatrix_inverse.getInverse(currentSpaceClipMatrix); - - //outputmatrix - controller_inverse * volume * scale * translation - const clipMatrix = new THREE.Matrix4(); - clipMatrix.multiplyMatrices(currentSpaceClipMatrix_inverse, volumeMatrix); - clipMatrix.multiplyMatrices(clipMatrix, scaleMatrix); - clipMatrix.multiplyMatrices(clipMatrix, translationMatrix); - - //set uniforms of shader - const isVrModeActive = this.sceneHandler.is("vr-mode"); - const doClip = - isVrModeActive && - this.controllerHandler.el.getAttribute("buttons-check").clipPlane && - !this.grabbed; - material.uniforms.clipPlane.value = clipMatrix; - material.uniforms.clipping.value = doClip; - }, -}); diff --git a/src/Aframe/model.js b/src/Aframe/model.js new file mode 100644 index 00000000..5f0e61db --- /dev/null +++ b/src/Aframe/model.js @@ -0,0 +1,376 @@ +/* globals AFRAME THREE */ + +import "./Shader.js"; +import { + DEFAULT_TRANSFER_FUNCTION, + DEFAULT_MODEL, + DEFAULT_COLOR_MAP, + DEFAULT_SLIDERS, +} from "../constants/constants"; + +const bind = AFRAME.utils.bind; + +// TODO: The function in THREE.TextureLoader().load (loadModel) needs to run asynchronously +// Before loadColorMap, updateClipping, updateTransferTexture, etc. +// TODO: colorMapData should {[name]: colorMapData} +// Check if color map has already been loaded before - then there's no need to load the data again + +AFRAME.registerComponent("model", { + dependencies: ["render-2d-clipplane", "buttons-check"], + schema: { + colorMap: { parse: JSON.parse, default: DEFAULT_COLOR_MAP }, + sliders: { parse: JSON.parse, default: DEFAULT_SLIDERS }, + transferFunction: { parse: JSON.parse, default: DEFAULT_TRANSFER_FUNCTION }, + useTransferFunction: { type: "boolean", default: false }, + channel: { type: "number", default: DEFAULT_MODEL.channel }, + intensity: { type: "number", default: DEFAULT_MODEL.intensity }, + path: { type: "string" }, + slices: { type: "number", default: DEFAULT_MODEL.slices }, + spacing: { parse: JSON.parse, default: DEFAULT_MODEL.spacing }, + }, + + init: function () { + this.scene = this.el.sceneEl; + this.canvas = this.scene.canvas; + this.alphaData = []; + this.colorMapData = []; + this.rayCollided = false; + this.grabbed = false; + + // Get other entities + this.controllerObject = document.getElementById("rhand").object3D; + this.controllerObject.matrixAutoUpdate = false; + this.clipPlaneListenerHandler = document.getElementById( + "clipplane2DListener" + ).object3D; + + // Bind functions + this.onEnterVR = bind(this.onEnterVR, this); + this.onExitVR = bind(this.onExitVR, this); + this.onCollide = this.onCollide.bind(this); + this.onClearCollide = this.onClearCollide.bind(this); + this.getMesh = this.getMesh.bind(this); + this.loadModel = this.loadModel.bind(this); + this.updateChannel = this.updateChannel.bind(this); + this.loadColorMap = this.loadColorMap.bind(this); + this.updateClipping = this.updateClipping.bind(this); + this.updateTransferTexture = this.updateTransferTexture.bind(this); + this.updateOpacityData = this.updateOpacityData.bind(this); + this.updateMeshClipMatrix = this.updateMeshClipMatrix.bind(this); + + // Add event listeners + this.scene.addEventListener("enter-vr", this.onEnterVR); + this.scene.addEventListener("exit-vr", this.onExitVR); + this.el.addEventListener("raycaster-intersected", this.onCollide); + this.el.addEventListener( + "raycaster-intersected-cleared", + this.onClearCollide + ); + + // Activate camera + document.getElementById("camera").setAttribute("camera", "active", true); + + // Load data and colorMap + this.loadModel(); + this.loadColorMap(); + }, + + update: function (oldData) { + // Update model + if (oldData.path !== this.data.path) this.loadModel(); + + // Update color map + if (oldData.colorMap !== this.data.colorMap) this.loadColorMap(); + + // Update clipping + if (oldData.sliders !== this.data.sliders) this.updateClipping(); + + if (this.data.useTransferFunction) { + // Update transfer function + if (oldData.transferFunction !== this.data.transferFunction) + this.updateOpacityData(); + } else { + // Update channel + if (oldData.channel !== this.data.channel) this.updateChannel(); + } + }, + + tick: function (time, timeDelta) { + const isVrModeActive = this.scene.is("vr-mode"); + const mesh = this.getMesh(); + + // Position is controlled by controllerObject in VR + if (this.controllerObject && isVrModeActive) { + const grabObject = + this.controllerObject.el.getAttribute("buttons-check").grabObject; + + if (this.grabbed && !grabObject) { + mesh.matrix.premultiply(this.controllerObject.matrixWorld); + mesh.matrix.decompose(mesh.position, mesh.quaternion, mesh.scale); + this.el.object3D.add(mesh); + this.grabbed = false; + } + + // grab mesh + if (!this.grabbed && grabObject && this.rayCollided) { + const inverseControllerPos = new THREE.Matrix4(); + inverseControllerPos.getInverse(this.controllerObject.matrixWorld); + mesh.matrix.premultiply(inverseControllerPos); + mesh.matrix.decompose(mesh.position, mesh.quaternion, mesh.scale); + this.controllerObject.add(mesh); + this.grabbed = true; + } + this.updateMeshClipMatrix(); + } + }, + + remove: function () { + this.scene.removeEventListener("enter-vr", this.onEnterVR); + this.scene.removeEventListener("exit-vr", this.onExitVR); + this.el.removeEventListener("raycaster-intersected", this.onCollide); + this.el.removeEventListener( + "raycaster-intersected-cleared", + this.onClearCollide + ); + }, + + /** EVENT LISTENER FUNCTIONS */ + + onEnterVR: function () {}, + + onExitVR: function () { + const mesh = this.getMesh(); + if (mesh) { + mesh.position.copy(new THREE.Vector3()); + mesh.rotation.set(0, 0, 0); + } + }, + + onCollide: function (event) { + this.rayCollided = true; + }, + + onClearCollide: function (event) { + this.rayCollided = false; + }, + + /** HELPER FUNCTIONS */ + + getMesh: function () { + return this.el.getObject3D("mesh"); + }, + + loadModel: function () { + const { spacing, slices, path, useTransferFunction, intensity } = this.data; + + // Clear mesh and load new model + if (this.getMesh()) this.el.removeObject3D("mesh"); + new THREE.TextureLoader().load( + path, + (texture) => { + // Create 3D material from texture + texture.minFilter = texture.magFilter = THREE.LinearFilter; + texture.unpackAlignment = 1; + texture.needsUpdate = true; + + const dim = Math.ceil(Math.sqrt(slices)); + const volumeScale = [ + 1.0 / ((texture.image.width / dim) * spacing.x), + 1.0 / ((texture.image.height / dim) * spacing.y), + 1.0 / (slices * spacing.z), + ]; + const zScale = volumeScale[0] / volumeScale[2]; + + // Set material properties + const shader = THREE.ShaderLib["ModelShader"]; + const uniforms = THREE.UniformsUtils.clone(shader.uniforms); + uniforms.dim.value = dim; + uniforms.intensity.value = intensity; + uniforms.slice.value = slices; + uniforms.step_size.value = new THREE.Vector3(0.01, 0.01, 0.01); + uniforms.u_data.value = texture; + uniforms.viewPort.value = new THREE.Vector2( + this.canvas.width, + this.canvas.height + ); + uniforms.zScale.value = zScale; + if (useTransferFunction) { + uniforms.channel.value = 1; + uniforms.useLut.value = true; + } else { + uniforms.channel.value = 6; + uniforms.useLut.value = false; + } + + const material = new THREE.ShaderMaterial({ + uniforms: uniforms, + transparent: true, + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader, + side: THREE.BackSide, // The volume shader uses the "backface" as its reference point + }); + + // Model is a unit box with the file's material + const geometry = new THREE.BoxGeometry(1, 1, 1); + this.el.setObject3D("mesh", new THREE.Mesh(geometry, material)); + material.needsUpdate = true; + + // Update colorMapping/data channel once model is loaded + if (useTransferFunction) this.loadColorMap(); + else this.updateChannel(); + this.updateClipping(); + }, + () => {}, + () => { + throw new Error("Could not load the data at", path); + } + ); + }, + + loadColorMap: function () { + const colorMap = this.data.colorMap; + + // Re-inject local image path with semi-colon + if (colorMap.path.startsWith("data:image/png")) { + colorMap.path = + colorMap.path.substring(0, 14) + ";" + colorMap.path.substring(14); + } + + // Create and image and canvas + const img = document.createElement("img"); + img.src = colorMap.path; + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + + // Draw img on the canvas and read RGB data + img.onload = () => { + ctx.drawImage(img, 0, 0); + const colorData = ctx.getImageData(0, 0, img.width, 1).data; + const colorTransfer = new Uint8Array(3 * 256); + for (let i = 0; i < 256; i++) { + for (let j = 0; j < 3; j++) + colorTransfer[i * 3 + j] = colorData[i * 4 + j]; + } + this.colorMapData = colorTransfer; + + this.updateTransferTexture(); + }; + }, + + updateTransferTexture: function () { + const colorMapData = this.colorMapData; + const imageTransferData = new Uint8Array(4 * 256); + for (let i = 0; i < 256; i++) { + for (let j = 0; j < 3; j++) + imageTransferData[i * 4 + j] = colorMapData[i * 3 + j]; + imageTransferData[i * 4 + 3] = this.alphaData[i]; + } + + const transferTexture = new THREE.DataTexture( + imageTransferData, + 256, + 1, + THREE.RGBAFormat + ); + transferTexture.needsUpdate = true; + + // Apply transfer texture + const mesh = this.getMesh(); + if (mesh) { + const material = mesh.material; + material.uniforms.u_lut.value = transferTexture; + material.uniforms.channel.value = this.data.channel; + material.uniforms.useLut.value = this.data.useTransferFunction; + material.needsUpdate = true; + } + }, + + updateClipping: function () { + const mesh = this.getMesh(); + const activateClipPlane = this.clipPlaneListenerHandler.el.getAttribute( + "render-2d-clipplane" + ).activateClipPlane; + + if (mesh) { + const material = mesh.material; + if (activateClipPlane) { + const sliders = this.data.sliders; + material.uniforms.box_min.value = new THREE.Vector3( + sliders.x[0], + sliders.y[0], + sliders.z[0] + ); + material.uniforms.box_max.value = new THREE.Vector3( + sliders.x[1], + sliders.y[1], + sliders.z[1] + ); + } else { + // Ignore sliders + material.uniforms.box_min.value = new THREE.Vector3(0, 0, 0); + material.uniforms.box_max.value = new THREE.Vector3(1, 1, 1); + } + } + }, + + updateChannel: function () { + const mesh = this.getMesh(); + if (mesh) { + const material = mesh.material; + material.uniforms.channel.value = this.data.channel; + material.uniforms.useLut.value = this.data.useTransferFunction; + material.needsUpdate = true; + } + }, + + updateOpacityData: function () { + this.alphaData = []; + const transferFunction = this.data.transferFunction; + for (let i = 0; i < transferFunction.length - 1; i++) { + const start = transferFunction[i]; + const end = transferFunction[i + 1]; + const deltaX = end.x * 255 - start.x * 255; + + // Linear interpolation between points + const alphaStart = start.y * 255; + const alphaEnd = end.y * 255; + for (let j = 1 / deltaX; j < 1; j += 1 / deltaX) { + this.alphaData.push(alphaStart * (1 - j) + alphaEnd * j); + } + } + this.updateTransferTexture(); + }, + + updateMeshClipMatrix: function () { + const volumeMatrix = this.getMesh().matrixWorld; + const material = this.getMesh().material; + + // Matrix for zscaling + const scaleMatrix = new THREE.Matrix4(); + scaleMatrix.makeScale(1, 1, material.uniforms.zScale.value); + + // Translate to cube-coordinates ranging from 0 -1 + const translationMatrix = new THREE.Matrix4(); + translationMatrix.makeTranslation(-0.5, -0.5, -0.5); + + // Inverse of the clip matrix + const controllerMatrix = this.controllerObject.matrixWorld; + const controllerMatrix_inverse = new THREE.Matrix4(); + controllerMatrix_inverse.copy(controllerMatrix).invert(); + + //outputmatrix - controller_inverse * volume * scale * translation + const clipMatrix = new THREE.Matrix4(); + clipMatrix.multiplyMatrices(controllerMatrix_inverse, volumeMatrix); + clipMatrix.multiplyMatrices(clipMatrix, scaleMatrix); + clipMatrix.multiplyMatrices(clipMatrix, translationMatrix); + + //set uniforms of shader + const isVrModeActive = this.scene.is("vr-mode"); + const isClipped = + isVrModeActive && + this.controllerObject.el.getAttribute("buttons-check").clipPlane && + !this.grabbed; + material.uniforms.clipPlane.value = clipMatrix; + material.uniforms.clipping.value = isClipped; + }, +}); diff --git a/src/Aframe/render-2d-clipplane.js b/src/Aframe/render-2d-clipplane.js index 55dc925e..50845ad6 100644 --- a/src/Aframe/render-2d-clipplane.js +++ b/src/Aframe/render-2d-clipplane.js @@ -19,8 +19,6 @@ AFRAME.registerComponent("render-2d-clipplane", { xBounds: { type: "array", default: [0, 1] }, yBounds: { type: "array", default: [0, 1] }, zBounds: { type: "array", default: [0, 1] }, - currentAxisAngle: { type: "vec3" }, - rotateAngle: { type: "vec3" }, clipX: { type: "vec2" }, clipY: { type: "vec2" }, clipZ: { type: "vec2" }, @@ -35,7 +33,6 @@ AFRAME.registerComponent("render-2d-clipplane", { this.onKeyDown = this.onKeyDown.bind(this); this.onKeyUp = this.onKeyUp.bind(this); this.activate2DClipPlane = this.activate2DClipPlane.bind(this); - window.addEventListener("keydown", this.onKeyDown); window.addEventListener("keyup", this.onKeyUp); }, @@ -43,16 +40,6 @@ AFRAME.registerComponent("render-2d-clipplane", { update: function () {}, tick: function (time, timeDelta) { - // I dont know why I have to save the current angle axis using a temporal variable. Maybe Aframe updates - // data on a asynchronous call - this.tempVec.x = this.data.xCLipPlaneRotation; - this.tempVec.y = this.data.yCLipPlaneRotation; - this.tempVec.z = this.data.zCLipPlaneRotation; - - this.data.currentAxisAngle.x = this.tempVec.x; - this.data.currentAxisAngle.y = this.tempVec.y; - this.data.currentAxisAngle.z = this.tempVec.z; - this.data.clipX = { x: this.data.xBounds[0], y: this.data.xBounds[1] }; this.data.clipY = { x: this.data.yBounds[0], y: this.data.yBounds[1] }; this.data.clipZ = { x: this.data.zBounds[0], y: this.data.zBounds[1] }; @@ -71,7 +58,8 @@ AFRAME.registerComponent("render-2d-clipplane", { }, remove: function () { - this.removeEventListeners(); + window.removeEventListener("keydown", this.onKeydown); + window.removeEventListener("keyup", this.onKeyUp); }, onKeyDown: function (event) { @@ -88,9 +76,4 @@ AFRAME.registerComponent("render-2d-clipplane", { activate2DClipPlane: function (event) { this.data.isActive = false; }, - - removeEventListeners: function () { - window.removeEventListener("keydown", this.onKeydown); - window.removeEventListener("keyup", this.onKeyUp); - }, }); diff --git a/src/components/AframeScene.jsx b/src/components/AframeScene.jsx index 55735c73..e44a0d85 100644 --- a/src/components/AframeScene.jsx +++ b/src/components/AframeScene.jsx @@ -1,14 +1,13 @@ import React from "react"; import "aframe"; -import "aframe-event-set-component"; -import "aframe-orbit-controls"; import "../Aframe/arcball-camera"; import "../Aframe/buttons-check"; -import "../Aframe/cursor-listener"; -import "../Aframe/loader"; +import "../Aframe/model"; import "../Aframe/render-2d-clipplane"; +import "../Aframe/entity-collider-check"; +import "../Aframe/collider-check"; // aframe data is passed as a string const toAframeString = (obj) => { @@ -58,6 +57,7 @@ function AframeScene({ })} /> + {/* CLICKABLE PLANE FOR MOUSE INTERACTIONS */} {/* MODEL */} p["x"]), - alphaYDataArray: transferFunction.map((p) => p["y"]), - colorMap: colorMap.path, - path: model.path, - slices: model.slices, - x_spacing: model.spacing.x, - y_spacing: model.spacing.y, - z_spacing: model.spacing.z, + model={toAframeString({ + colorMap: JSON.stringify(colorMap), + sliders: JSON.stringify(sliders), + transferFunction: JSON.stringify(transferFunction), useTransferFunction, channel: model.channel, intensity: model.intensity, + path: model.path, + slices: model.slices, + spacing: JSON.stringify(model.spacing), })} position={model.position} rotation={model.rotation} @@ -101,7 +98,7 @@ function AframeScene({ id="camera" camera="active: true" look-controls - arcball-camera="initialPosition:0 0 1" + arcball-camera="initialPosition: 0 0 1;" /> ); diff --git a/src/components/VolumeViewer.jsx b/src/components/VolumeViewer.jsx index dbacb298..a2ea067c 100644 --- a/src/components/VolumeViewer.jsx +++ b/src/components/VolumeViewer.jsx @@ -143,6 +143,10 @@ VolumeViewer.propTypes = { /** The model to be displayed and it's related information */ model: PropTypes.shape({ + /** Channel to load data from (R:1, G:2, B:3)*/ + channel: PropTypes.number, + /** Increase/decrease voxels intensity */ + intensity: PropTypes.number, /** Path to the model REQUIRED */ path: PropTypes.string.isRequired, /** Position of the model in the scene */ @@ -165,10 +169,6 @@ VolumeViewer.propTypes = { y: PropTypes.number, z: PropTypes.number, }), - /** Channel to load data from (R:1, G:2, B:3)*/ - channel: PropTypes.number, - /** Increase/decrease voxels intensity */ - intensity: PropTypes.number, }), /** diff --git a/src/constants/constants.js b/src/constants/constants.js index 893d784e..490eb248 100644 --- a/src/constants/constants.js +++ b/src/constants/constants.js @@ -14,14 +14,14 @@ const DEFAULT_COLOR_MAPS = [ const DEFAULT_COLOR_MAP = grayscaleColorMap; const DEFAULT_MODEL = { + channel: 1, + intensity: 1.0, position: "0 0 0", range: { min: 0, max: 1, unit: "" }, rotation: "0 0 0", scale: "1 1 1", slices: 55, spacing: { x: 2, y: 2, z: 1 }, - channel: 1, - intensity: 1.0, }; const DEFAULT_TRANSFER_FUNCTION = [