diff --git a/.rete-patch b/.rete-patch new file mode 100644 index 0000000..7f02853 --- /dev/null +++ b/.rete-patch @@ -0,0 +1,5 @@ +{ + "stack": "react", + "version": 18, + "kitVersion": "1.4.4" +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ebbb112..41908d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,9 +15,23 @@ "@types/node": "^16.18.66", "@types/react": "^18.2.39", "@types/react-dom": "^18.2.17", + "@types/styled-components": "^5.1.32", + "@types/three": "^0.156.0", + "antd": "^5.11.5", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", + "rete": "^2.0.2", + "rete-area-3d-plugin": "^2.0.3", + "rete-area-plugin": "^2.0.1", + "rete-auto-arrange-plugin": "^2.0.0", + "rete-connection-plugin": "^2.0.0", + "rete-context-menu-plugin": "^2.0.0", + "rete-engine": "^2.0.0", + "rete-react-plugin": "^2.0.4", + "rete-render-utils": "^2.0.1", + "styled-components": "^5.3.11", + "three": "^0.156.1", "typescript": "^4.9.5", "web-vitals": "^2.1.4" } @@ -58,6 +72,71 @@ "node": ">=6.0.0" } }, + "node_modules/@ant-design/colors": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.0.tgz", + "integrity": "sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.18.0.tgz", + "integrity": "sha512-NXzfnNjJgpn+L6d0cD2cS14Tsqs46Bsua6PwVMlmN+F0OEoa9PhJRwUWmI+HyIrc4cgVZVfQTDpXC0p07Jmglw==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.0.10", + "rc-util": "^5.35.0", + "stylis": "^4.0.13" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.2.6.tgz", + "integrity": "sha512-4wn0WShF43TrggskBJPRqCD0fcHbzTYjnaoskdiJrVHg86yxoZ8ZUqsXvyn4WUqehRiFKnaclOhqk9w4Ui2KVw==", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.3.0", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz", + "integrity": "sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==" + }, + "node_modules/@ant-design/react-slick": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.0.2.tgz", + "integrity": "sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ==", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", @@ -2290,6 +2369,42 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -3247,6 +3362,118 @@ } } }, + "node_modules/@rc-component/color-picker": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.4.1.tgz", + "integrity": "sha512-vh5EWqnsayZa/JwUznqDaPJz39jznx/YDbyBuVJntv735tKXKwEUZZb2jYEldOg+NKWZwtALjGMrNeGBmqFoEw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@ctrl/tinycolor": "^3.6.0", + "classnames": "^2.2.6", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.10.0.tgz", + "integrity": "sha512-voV0BKaTJbewB9LLgAHQ7tAGG7rgDkKQkZo82xw2gIk542hY+o7zwoqdN16oHhIKk7eG/xi+mdXrONT62Dt57A==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^1.3.6", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-1.18.2.tgz", + "integrity": "sha512-jRLYgFgjLEPq3MvS87fIhcfuywFSRDaDrYw1FLku7Cm4esszvzTbA0JBsyacAyLrK9rF3TiHFcvoEDMzoD3CTA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.38.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -4012,6 +4239,15 @@ "@types/node": "*" } }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -4199,6 +4435,21 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" }, + "node_modules/@types/stats.js": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", + "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==" + }, + "node_modules/@types/styled-components": { + "version": "5.1.32", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.32.tgz", + "integrity": "sha512-DqVpl8R0vbhVSop4120UHtGrFmHuPeoDwF4hDT0kPJTY8ty0SI38RV3VhCMsWigMUXG+kCXu7vMRqMFNy6eQgA==", + "dependencies": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + } + }, "node_modules/@types/testing-library__jest-dom": { "version": "5.14.9", "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", @@ -4207,11 +4458,27 @@ "@types/jest": "*" } }, + "node_modules/@types/three": { + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.156.0.tgz", + "integrity": "sha512-733bXDSRdlrxqOmQuOmfC1UBRuJ2pREPk8sWnx9MtIJEVDQMx8U0NQO5MVVaOrjzDPyLI+cFPim2X/ss9v0+LQ==", + "dependencies": { + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.6.10", + "meshoptimizer": "~0.18.1" + } + }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" }, + "node_modules/@types/webxr": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.10.tgz", + "integrity": "sha512-n3u5sqXQJhf1CS68mw3Wf16FQ4cRPNBBwdYLFzq3UddiADOim1Pn3Y6PBdDilz1vOJF3ybLxJ8ZEDlLIzrOQZg==" + }, "node_modules/@types/ws": { "version": "8.5.10", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", @@ -4804,6 +5071,69 @@ "node": ">=4" } }, + "node_modules/antd": { + "version": "5.11.5", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.11.5.tgz", + "integrity": "sha512-qB1YmvO4Zm4r48M0Ptxn7orpaXeMPSeTrrw6dAgtTYN+ysnWD/D/zlxFc5g73GywIzZ10XGqvNC+74A+HD0yeQ==", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/cssinjs": "^1.17.5", + "@ant-design/icons": "^5.2.6", + "@ant-design/react-slick": "~1.0.2", + "@babel/runtime": "^7.18.3", + "@ctrl/tinycolor": "^3.6.1", + "@rc-component/color-picker": "~1.4.1", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/tour": "~1.10.0", + "@rc-component/trigger": "^1.18.2", + "classnames": "^2.3.2", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.1", + "qrcode.react": "^3.1.0", + "rc-cascader": "~3.20.0", + "rc-checkbox": "~3.1.0", + "rc-collapse": "~3.7.1", + "rc-dialog": "~9.3.4", + "rc-drawer": "~6.5.2", + "rc-dropdown": "~4.1.0", + "rc-field-form": "~1.40.0", + "rc-image": "~7.5.1", + "rc-input": "~1.3.6", + "rc-input-number": "~8.4.0", + "rc-mentions": "~2.9.1", + "rc-menu": "~9.12.2", + "rc-motion": "^2.9.0", + "rc-notification": "~5.3.0", + "rc-pagination": "~3.7.0", + "rc-picker": "~3.14.6", + "rc-progress": "~3.5.1", + "rc-rate": "~2.12.0", + "rc-resize-observer": "^1.4.0", + "rc-segmented": "~2.2.2", + "rc-select": "~14.10.0", + "rc-slider": "~10.4.0", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.36.0", + "rc-tabs": "~12.13.1", + "rc-textarea": "~1.5.3", + "rc-tooltip": "~6.1.2", + "rc-tree": "~5.8.2", + "rc-tree-select": "~5.15.0", + "rc-upload": "~4.3.5", + "rc-util": "^5.38.1", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -4877,6 +5207,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -5002,6 +5337,11 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, "node_modules/asynciterator.prototype": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", @@ -5301,6 +5641,21 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-styled-components": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", + "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "lodash": "^4.17.21", + "picomatch": "^2.3.1" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, "node_modules/babel-plugin-transform-react-remove-prop-types": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", @@ -5620,6 +5975,14 @@ "node": ">= 6" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -5748,6 +6111,11 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -5910,6 +6278,11 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz", + "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5965,6 +6338,14 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, "node_modules/core-js": { "version": "3.33.3", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.3.tgz", @@ -6055,6 +6436,14 @@ "postcss": "^8.4" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, "node_modules/css-declaration-sorter": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", @@ -6236,6 +6625,16 @@ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -6451,6 +6850,11 @@ "node": ">=10" } }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -6835,6 +7239,12 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.599.tgz", "integrity": "sha512-FdLI0/h+PvShEqmBMnZCdbgabAuQiiM9Ph8hVGmPOR5GU1XXZgwLRCMogE63OrUxcDEOBlEMVYAgtkJjWFnhRA==" }, + "node_modules/elkjs": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", + "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==", + "peer": true + }, "node_modules/emittery": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", @@ -7943,6 +8353,11 @@ "bser": "2.1.1" } }, + "node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==" + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -8698,6 +9113,19 @@ "he": "bin/he" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -11704,6 +12132,14 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -12040,6 +12476,11 @@ "node": ">= 8" } }, + "node_modules/meshoptimizer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", + "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==" + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -14223,6 +14664,14 @@ "teleport": ">=0.2.0" } }, + "node_modules/qrcode.react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz", + "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -14318,6 +14767,581 @@ "node": ">=0.10.0" } }, + "node_modules/rc-cascader": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.20.0.tgz", + "integrity": "sha512-lkT9EEwOcYdjZ/jvhLoXGzprK1sijT3/Tp4BLxQQcHDZkkOzzwYQC9HgmKoJz0K7CukMfgvO9KqHeBdgE+pELw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "classnames": "^2.3.1", + "rc-select": "~14.10.0", + "rc-tree": "~5.8.1", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.1.0.tgz", + "integrity": "sha512-PAwpJFnBa3Ei+5pyqMMXdcKYKNBMS+TvSDiLdDnARnMJHC8ESxwPfm4Ao1gJiKtWLdmGfigascnCpwrHFgoOBQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.2.tgz", + "integrity": "sha512-ZRw6ipDyOnfLFySxAiCMdbHtb5ePAsB9mT17PA6y1mRD/W6KHRaZeb5qK/X9xDV1CqgyxMpzw0VdS74PCcUk4A==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.3.4.tgz", + "integrity": "sha512-975X3018GhR+EjZFbxA2Z57SX5rnu0G0/OxFgMMvZK4/hQWEm3MHaNvP4wXpxYDoJsp+xUvVW+GB9CMMCm81jA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.5.2.tgz", + "integrity": "sha512-QckxAnQNdhh4vtmKN0ZwDf3iakO83W9eZcSKWYYTDv4qcD2fHhRAZJJ/OE6v2ZlQ2kSqCJX5gYssF4HJFvsEPQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.36.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.1.0.tgz", + "integrity": "sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^1.7.0", + "classnames": "^2.2.6", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.40.0.tgz", + "integrity": "sha512-OM3N01X2BYFGJDJcwpk9/BBtlwgveE7eh2SQAKIxVCt9KVWlODYJ9ypTHQdxchfDbeJKJKxMBFXlLAmyvlgPHg==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "async-validator": "^4.1.0", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.5.1.tgz", + "integrity": "sha512-Z9loECh92SQp0nSipc0MBuf5+yVC05H/pzC+Nf8xw1BKDFUJzUeehYBjaWlxly8VGBZJcTHYri61Fz9ng1G3Ag==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.3.4", + "rc-motion": "^2.6.2", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.3.6.tgz", + "integrity": "sha512-/HjTaKi8/Ts4zNbYaB5oWCquxFyFQO4Co1MnMgoCeGJlpe7k8Eir2HN0a0F9IHDmmo+GYiGgPpz7w/d/krzsJA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-8.4.0.tgz", + "integrity": "sha512-B6rziPOLRmeP7kcS5qbdC5hXvvDHYKV4vUxmahevYx2E6crS2bRi0xLDjhJ0E1HtOWo8rTmaE2EBJAkTCZOLdA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.3.5", + "rc-util": "^5.28.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.9.1.tgz", + "integrity": "sha512-cZuElWr/5Ws0PXx1uxobxfYh4mqUw2FitfabR62YnWgm+WAfDyXZXqZg5DxXW+M1cgVvntrQgDDd9LrihrXzew==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^1.5.0", + "classnames": "^2.2.6", + "rc-input": "~1.3.5", + "rc-menu": "~9.12.0", + "rc-textarea": "~1.5.0", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.12.2", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.12.2.tgz", + "integrity": "sha512-NzloFH2pRUYmQ3S/YbJAvRkgCZaLvq0sRa5rgJtuIHLfPPprNHNyepeSlT64+dbVqI4qRWL44VN0lUCldCbbfg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.17.0", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.0.tgz", + "integrity": "sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.3.0.tgz", + "integrity": "sha512-WCf0uCOkZ3HGfF0p1H4Sgt7aWfipxORWTPp7o6prA3vxwtWhtug3GfpYls1pnBp4WA+j8vGIi5c2/hQRpGzPcQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.9.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.2.tgz", + "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.7.0.tgz", + "integrity": "sha512-IxSzKapd13L91/195o1TPkKnCNw8gIR25UP1GCW/7c7n/slhld4npu2j2PB9IWjXm4SssaAaSAt2lscYog7wzg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.32.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "3.14.6", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-3.14.6.tgz", + "integrity": "sha512-AdKKW0AqMwZsKvIpwUWDUnpuGKZVrbxVTZTNjcO+pViGkjC1EBcjMgxVe8tomOEaIHJL5Gd13vS8Rr3zzxWmag==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.5.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.5.1.tgz", + "integrity": "sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.12.0.tgz", + "integrity": "sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz", + "integrity": "sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.38.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.2.2.tgz", + "integrity": "sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.10.0", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.10.0.tgz", + "integrity": "sha512-TsIJTYafTTapCA32LLNpx/AD6ntepR1TG8jEVx35NiAAWCPymhUfuca8kRcUNd3WIGVMDcMKn9kkphoxEz+6Ag==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.5.0", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.3.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.4.1.tgz", + "integrity": "sha512-wiHRWgzEEHcgF7MWDd0ODsMpqBwszT558R2qH52fplJwctw/L9J8ipEt89ZqVASlh0QFG9kJPgBuL2+cbdLRUw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.27.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.36.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.36.0.tgz", + "integrity": "sha512-3xVcdCC5OLeOOhaCg+5Lps2oPreM/GWXmUXWTSX4p6vF7F76ABM4dfPpMJ9Dnf5yGRyh+8pe7FRyhRVnWw2H/w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.4.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.37.0", + "rc-virtual-list": "^3.11.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "12.13.1", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.13.1.tgz", + "integrity": "sha512-83u3l2QkO0UznCzdBLEk9WnNcT+imtmDmMT993sUUEOGnNQAmqOdev0XjeqrcvsAMe9CDpAWDFd7L/RZw+LVJQ==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.1.0", + "rc-menu": "~9.12.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.34.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.5.3.tgz", + "integrity": "sha512-oH682ghHx++stFNYrosPRBfwsypywrTXpaD0/5Z8MPkUOnyOQUaY9ueL9tMu6BP1LfsuYQ1VLpg5OtshViLNgA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.3.5", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.1.2.tgz", + "integrity": "sha512-89zwvybvCxGJu3+gGF8w5AXd4HHk6hIN7K0vZbkzjilVaEAIWPqc1fcyeUeP71n3VCcw7pTL9LyFupFbrx8gHw==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^1.18.0", + "classnames": "^2.3.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.8.2.tgz", + "integrity": "sha512-xH/fcgLHWTLmrSuNphU8XAqV7CdaOQgm4KywlLGNoTMhDAcNR3GVNP6cZzb0GrKmIZ9yae+QLot/cAgUdPRMzg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.15.0.tgz", + "integrity": "sha512-YJHfdO6azFnR0/JuNBZLDptGE4/RGfVeHAafUIYcm2T3RBkL1O8aVqiHvwIyLzdK59ry0NLrByd+3TkfpRM+9Q==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "~14.10.0", + "rc-tree": "~5.8.1", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.5.tgz", + "integrity": "sha512-EHlKJbhkgFSQHliTj9v/2K5aEuFwfUQgZARzD7AmAPOneZEPiCNF3n6PEWIuqz9h7oq6FuXgdR67sC5BWFxJbA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.38.1.tgz", + "integrity": "sha512-e4ZMs7q9XqwTuhIK7zBIVFltUtMSjphuPPQXHoHlzRzNdOwUxDejo0Zls5HYaJfRKNURcsS/ceKVULlhjBrxng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/rc-virtual-list": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.11.3.tgz", + "integrity": "sha512-tu5UtrMk/AXonHwHxUogdXAWynaXsrx1i6dsgg+lOo/KJSF8oBAcprh1z5J3xgnPJD5hXxTL58F8s8onokdt0Q==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -14769,6 +15793,11 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -14873,6 +15902,118 @@ "node": ">=10" } }, + "node_modules/rete": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/rete/-/rete-2.0.2.tgz", + "integrity": "sha512-VZhyWl0E3dzcRRiN5OIVK4CIVcADZHO4XCFs85fjoi4ZYCPcB3P608wzq5MbdlYOfptPyuvKOrRqgFCtILdKIw==", + "hasInstallScript": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + } + }, + "node_modules/rete-area-3d-plugin": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/rete-area-3d-plugin/-/rete-area-3d-plugin-2.0.3.tgz", + "integrity": "sha512-1Pc6jfmtghj0pUKz3TVD3wVOYS8nnqJvaZJ9zGqPYufTsAqdV6idOq2K1AWUayoeqleTCymY2YZ4Nj/0TmCTDA==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "peerDependencies": { + "rete": "^2.0.1", + "rete-area-plugin": "^2.0.0", + "rete-render-utils": "^2.0.0", + "three": ">= 0.152.2 < 0.157.0" + } + }, + "node_modules/rete-area-plugin": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rete-area-plugin/-/rete-area-plugin-2.0.1.tgz", + "integrity": "sha512-H7IGv2Tfm1Tk928Hl6O9pS3JCmKboCFY4xqGm2TCXvzVAlHvmUV7mtkxlT1fCAZQMNin6ktwthCdQ455euHDgQ==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "peerDependencies": { + "rete": "^2.0.0" + } + }, + "node_modules/rete-auto-arrange-plugin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rete-auto-arrange-plugin/-/rete-auto-arrange-plugin-2.0.0.tgz", + "integrity": "sha512-wyrJ+DW94J1E4ceTX6XVHt7lnp0eNXdwHKnuREY8ePl3BO8buLutvVpuMFwJEVW6AbnUVcKY38/huAwp4wDGoQ==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "peerDependencies": { + "elkjs": "^0.8.2", + "rete": "^2.0.1", + "rete-area-plugin": "^2.0.0", + "web-worker": "^1.2.0" + } + }, + "node_modules/rete-connection-plugin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rete-connection-plugin/-/rete-connection-plugin-2.0.0.tgz", + "integrity": "sha512-8M+UC6gcWwTi0PEICprmCaoGxwEA4x42z0ywx3O5NQSILvkhWcvQXzHcyvwGx/LTsJT/UPzNjCfixu/TbRyTEw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "peerDependencies": { + "rete": "^2.0.1", + "rete-area-plugin": "^2.0.0" + } + }, + "node_modules/rete-context-menu-plugin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rete-context-menu-plugin/-/rete-context-menu-plugin-2.0.0.tgz", + "integrity": "sha512-cFqXUCgbuzdD994+cUgLNCiN/BeQzBb8PS1oZfJijL1RsHpRIlMM/pvVgGp1DJcveeIeKccndXb6UuzR9qfU4A==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "peerDependencies": { + "rete": "^2.0.1", + "rete-area-plugin": "^2.0.0" + } + }, + "node_modules/rete-engine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rete-engine/-/rete-engine-2.0.0.tgz", + "integrity": "sha512-Xo/UggbWDgZf2TnFY5ftylkGH42CX3Ws5dH9fBx7r3PNXfAYJLIT3Calaoe+JogJPTeMZHMoeR61/aJTZABGzQ==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "peerDependencies": { + "rete": "^2.0.1" + } + }, + "node_modules/rete-react-plugin": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/rete-react-plugin/-/rete-react-plugin-2.0.4.tgz", + "integrity": "sha512-t+rsaZ6wUFVbO1krfzUl8GInHI+V9Zp8q2fLj8NnDLVKRxQzq1W0sfpBvBK262dkt2TEZvHyeX9M+eqTlaowHQ==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "usehooks-ts": "^2.9.1" + }, + "peerDependencies": { + "react": "^16.8.6 || ^17 || ^18", + "react-dom": "^16.8.6 || ^17 || ^18", + "rete": "^2.0.1", + "rete-area-plugin": "^2.0.0", + "rete-render-utils": "^2.0.0", + "styled-components": "^5.3.6 || ^6" + } + }, + "node_modules/rete-render-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rete-render-utils/-/rete-render-utils-2.0.1.tgz", + "integrity": "sha512-mzNVADCE1iV0AlkVyz1Pai34GG55VYBIWWOv9MqHUl7jlnpNIIkx+hARIc3wgabcye46IdswQPUApuARhvjbmA==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "peerDependencies": { + "rete": "^2.0.0", + "rete-area-plugin": "^2.0.0" + } + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -15132,6 +16273,14 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -15344,6 +16493,11 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -15659,6 +16813,11 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -15840,6 +16999,35 @@ "webpack": "^5.0.0" } }, + "node_modules/styled-components": { + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", + "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, "node_modules/stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", @@ -15855,6 +17043,11 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", + "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==" + }, "node_modules/sucrase": { "version": "3.34.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", @@ -16233,11 +17426,24 @@ "node": ">=0.8" } }, + "node_modules/three": { + "version": "0.156.1", + "resolved": "https://registry.npmjs.org/three/-/three-0.156.1.tgz", + "integrity": "sha512-kP7H0FK9d/k6t/XvQ9FO6i+QrePoDcNhwl0I02+wmUJRNSLCUIDMcfObnzQvxb37/0Uc9TDT0T1HgsRRrO6SYQ==" + }, "node_modules/throat": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" }, + "node_modules/throttle-debounce": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", + "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "engines": { + "node": ">=12.22" + } + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -16267,6 +17473,11 @@ "node": ">=8.0" } }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -16637,6 +17848,19 @@ "requires-port": "^1.0.0" } }, + "node_modules/usehooks-ts": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-2.9.1.tgz", + "integrity": "sha512-2FAuSIGHlY+apM9FVlj8/oNhd+1y+Uwv5QNkMQz1oSfdHk4PXo1qoCw9I5M7j0vpH8CSWFJwXbVPeYDjLCx9PA==", + "engines": { + "node": ">=16.15.0", + "npm": ">=8" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16756,6 +17980,12 @@ "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", + "peer": true + }, "node_modules/webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", diff --git a/package.json b/package.json index 0656122..73e81be 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,23 @@ "@types/node": "^16.18.66", "@types/react": "^18.2.39", "@types/react-dom": "^18.2.17", + "@types/styled-components": "^5.1.32", + "@types/three": "^0.156.0", + "antd": "^5.11.5", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", + "rete": "^2.0.2", + "rete-area-3d-plugin": "^2.0.3", + "rete-area-plugin": "^2.0.1", + "rete-auto-arrange-plugin": "^2.0.0", + "rete-connection-plugin": "^2.0.0", + "rete-context-menu-plugin": "^2.0.0", + "rete-engine": "^2.0.0", + "rete-react-plugin": "^2.0.4", + "rete-render-utils": "^2.0.1", + "styled-components": "^5.3.11", + "three": "^0.156.1", "typescript": "^4.9.5", "web-vitals": "^2.1.4" }, diff --git a/src/App.tsx b/src/App.tsx index a53698a..a30bb81 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,26 +1,25 @@ import React from 'react'; -import logo from './logo.svg'; +import { useRete } from 'rete-react-plugin'; import './App.css'; +import './rete.css'; +import { initAudio, createEditor } from './rete'; +import { Button, Space } from "antd"; function App() { + const [ref, editor]: readonly [any, any] = useRete(createEditor) + return (
- logo -

- Edit src/App.tsx and save to reload. -

- - Learn React - + + + + +
+
); } -export default App; +export default App diff --git a/src/customization/CustomConnection.tsx b/src/customization/CustomConnection.tsx new file mode 100644 index 0000000..a5696af --- /dev/null +++ b/src/customization/CustomConnection.tsx @@ -0,0 +1,36 @@ +import * as React from "react"; +import styled from "styled-components"; +import { ClassicScheme, Presets } from "rete-react-plugin"; + +const { useConnection } = Presets.classic; + +const Svg = styled.svg` + overflow: visible !important; + position: absolute; + pointer-events: none; + width: 9999px; + height: 9999px; +`; + +const Path = styled.path<{ styles?: (props: any) => any }>` + fill: none; + stroke-width: 5px; + stroke: black; + pointer-events: auto; + ${(props) => props.styles && props.styles(props)} +`; + +export function CustomConnection(props: { + data: ClassicScheme["Connection"] & { isLoop?: boolean }; + styles?: () => any; +}) { + const { path } = useConnection(); + + if (!path) return null; + + return ( + + + + ); +} diff --git a/src/customization/CustomNode.tsx b/src/customization/CustomNode.tsx new file mode 100644 index 0000000..49c4901 --- /dev/null +++ b/src/customization/CustomNode.tsx @@ -0,0 +1,187 @@ +import * as React from "react"; +import { ClassicScheme, RenderEmit, Presets } from "rete-react-plugin"; +import styled, { css } from "styled-components"; +import { $nodewidth, $socketmargin, $socketsize } from "./vars"; + +const { RefSocket, RefControl } = Presets.classic; + +type NodeExtraData = { width?: number; height?: number }; + +export const NodeStyles = styled.div< + NodeExtraData & { selected: boolean; styles?: (props: any) => any } +>` + background: black; + border: 2px solid grey; + border-radius: 10px; + cursor: pointer; + box-sizing: border-box; + width: ${(props) => + Number.isFinite(props.width) ? `${props.width}px` : `${$nodewidth}px`}; + height: ${(props) => + Number.isFinite(props.height) ? `${props.height}px` : "auto"}; + padding-bottom: 6px; + position: relative; + user-select: none; + &:hover { + background: #333; + } + ${(props) => + props.selected && + css` + border-color: red; + `} + .title { + color: white; + font-family: sans-serif; + font-size: 18px; + padding: 8px; + } + .output { + text-align: right; + } + .input { + text-align: left; + } + .output-socket { + text-align: right; + margin-right: -1px; + display: inline-block; + } + .input-socket { + text-align: left; + margin-left: -1px; + display: inline-block; + } + .input-title, + .output-title { + vertical-align: middle; + color: white; + display: inline-block; + font-family: sans-serif; + font-size: 14px; + margin: ${$socketmargin}px; + line-height: ${$socketsize}px; + } + .input-control { + z-index: 1; + width: calc(100% - ${$socketsize + 2 * $socketmargin}px); + vertical-align: middle; + display: inline-block; + } + .control { + display: block; + padding: ${$socketmargin}px ${$socketsize / 2 + $socketmargin}px; + } + ${(props) => props.styles && props.styles(props)} +`; + +function sortByIndex( + entries: T +) { + entries.sort((a, b) => { + const ai = a[1]?.index || 0; + const bi = b[1]?.index || 0; + + return ai - bi; + }); +} + +type Props = { + data: S["Node"] & NodeExtraData; + styles?: () => any; + emit: RenderEmit; +}; +export type NodeComponent = ( + props: Props +) => JSX.Element; + +export function CustomNode(props: Props) { + const inputs = Object.entries(props.data.inputs); + const outputs = Object.entries(props.data.outputs); + const controls = Object.entries(props.data.controls); + const selected = props.data.selected || false; + const { id, label, width, height } = props.data; + + sortByIndex(inputs); + sortByIndex(outputs); + sortByIndex(controls); + + return ( + +
+ {label} +
+ {/* Outputs */} + {outputs.map( + ([key, output]) => + output && ( +
+
+ {output?.label} +
+ +
+ ) + )} + {/* Controls */} + {controls.map(([key, control]) => { + return control ? ( + + ) : null; + })} + {/* Inputs */} + {inputs.map( + ([key, input]) => + input && ( +
+ + {input && (!input.control || !input.showControl) && ( +
+ {input?.label} +
+ )} + {input?.control && input?.showControl && ( + + + + )} +
+ ) + )} +
+ ); +} diff --git a/src/customization/CustomSocket.tsx b/src/customization/CustomSocket.tsx new file mode 100644 index 0000000..d4f7c83 --- /dev/null +++ b/src/customization/CustomSocket.tsx @@ -0,0 +1,25 @@ +import * as React from "react"; +import { ClassicPreset } from "rete"; +import styled from "styled-components"; +import { $socketsize } from "./vars"; + +const Styles = styled.div` + display: inline-block; + cursor: pointer; + border: 1px solid grey; + width: ${$socketsize}px; + height: ${$socketsize * 2}px; + vertical-align: middle; + background: #fff; + z-index: 2; + box-sizing: border-box; + &:hover { + background: #ddd; + } +`; + +export function CustomSocket(props: { + data: T; +}) { + return ; +} diff --git a/src/customization/StyledNode.tsx b/src/customization/StyledNode.tsx new file mode 100644 index 0000000..cf4e836 --- /dev/null +++ b/src/customization/StyledNode.tsx @@ -0,0 +1,28 @@ +import { Presets } from "rete-react-plugin"; +import { css } from "styled-components"; + +const styles = css<{ selected?: boolean }>` + background: #ebebeb; + border-color: #646464; + .title { + color: #646464; + } + &:hover { + background: #f2f2f2; + } + .output-socket { + margin-right: -1px; + } + .input-socket { + margin-left: -1px; + } + ${(props) => + props.selected && + css` + border-color: red; + `} +`; + +export function StyledNode(props: any) { + return styles} {...props} />; +} diff --git a/src/customization/background.css b/src/customization/background.css new file mode 100644 index 0000000..ff1181f --- /dev/null +++ b/src/customization/background.css @@ -0,0 +1,21 @@ +.fill-area { + display: table; + z-index: -1; + position: absolute; + top: -320000px; + left: -320000px; + width: 640000px; + height: 640000px; +} + +.background { + background-color: #ffffff; + opacity: 1; + background-image: linear-gradient(#f1f1f1 3.2px, transparent 3.2px), + linear-gradient(90deg, #f1f1f1 3.2px, transparent 3.2px), + linear-gradient(#f1f1f1 1.6px, transparent 1.6px), + linear-gradient(90deg, #f1f1f1 1.6px, #ffffff 1.6px); + background-size: 80px 80px, 80px 80px, 16px 16px, 16px 16px; + background-position: -3.2px -3.2px, -3.2px -3.2px, -1.6px -1.6px, + -1.6px -1.6px; +} diff --git a/src/customization/custom-background.ts b/src/customization/custom-background.ts new file mode 100644 index 0000000..1386185 --- /dev/null +++ b/src/customization/custom-background.ts @@ -0,0 +1,14 @@ +import { BaseSchemes } from "rete"; +import { AreaPlugin } from "rete-area-plugin"; +import './background.css' + +export function addCustomBackground( + area: AreaPlugin +) { + const background = document.createElement("div"); + + background.classList.add("background"); + background.classList.add("fill-area"); + + area.area.content.add(background); +} diff --git a/src/customization/vars.ts b/src/customization/vars.ts new file mode 100644 index 0000000..c79b882 --- /dev/null +++ b/src/customization/vars.ts @@ -0,0 +1,3 @@ +export const $nodewidth = 200; +export const $socketmargin = 6; +export const $socketsize = 16; diff --git a/src/rete.css b/src/rete.css new file mode 100644 index 0000000..0bd999d --- /dev/null +++ b/src/rete.css @@ -0,0 +1,10 @@ +.rete { + position: relative; + width: 80vw; + height: 90vh; + font-size: 1rem; + background: white; + margin: 1em; + border-radius: 1em; + text-align: left; +} diff --git a/src/rete/3d.ts b/src/rete/3d.ts new file mode 100644 index 0000000..4ec92df --- /dev/null +++ b/src/rete/3d.ts @@ -0,0 +1,111 @@ +import { ClassicPreset as Classic, GetSchemes, NodeEditor } from 'rete'; + +import { Area3D, Area3DExtensions, Area3DPlugin } from 'rete-area-3d-plugin'; +import { + ConnectionPlugin, + Presets as ConnectionPresets, +} from 'rete-connection-plugin'; +import { + ReactPlugin, + ReactArea2D, + Presets as ReactPresets, +} from 'rete-react-plugin'; +import { createRoot } from 'react-dom/client'; + +import * as THREE from 'three'; + +type Node = NumberNode | AddNode; +type Conn = + | Connection + | Connection + | Connection; +type Schemes = GetSchemes; + +class Connection extends Classic.Connection< + A, + B +> {} + +class NumberNode extends Classic.Node { + width = 180; + height = 120; + + constructor(initial: number, change?: (value: number) => void) { + super('Number'); + + this.addOutput('value', new Classic.Output(socket, 'Number')); + this.addControl( + 'value', + new Classic.InputControl('number', { initial, change }) + ); + } +} + +class AddNode extends Classic.Node { + width = 180; + height = 195; + + constructor() { + super('Add'); + + this.addInput('a', new Classic.Input(socket, 'A')); + this.addInput('b', new Classic.Input(socket, 'B')); + this.addOutput('value', new Classic.Output(socket, 'Number')); + this.addControl( + 'result', + new Classic.InputControl('number', { initial: 0, readonly: true }) + ); + } +} + +type AreaExtra = Area3D | ReactArea2D; + +const socket = new Classic.Socket('socket'); + +export async function createEditor(container: HTMLElement) { + const editor = new NodeEditor(); + const area = new Area3DPlugin(container); + const connection = new ConnectionPlugin(); + const reactRender = new ReactPlugin({ createRoot }); + + editor.use(area); + area.use(reactRender); + + area.use(connection); + + connection.addPreset(ConnectionPresets.classic.setup()); + reactRender.addPreset(ReactPresets.classic.setup()); + + Area3DExtensions.forms.connection(reactRender); + + Area3DExtensions.forms.node(area); + + const a = new NumberNode(1); + const b = new NumberNode(1); + const add = new AddNode(); + + await editor.addNode(a); + await editor.addNode(b); + await editor.addNode(add); + + await editor.addConnection(new Connection(a, 'value', add, 'a')); + await editor.addConnection(new Connection(b, 'value', add, 'b')); + + await area.translate(a.id, { x: 12, y: 35 }); + await area.translate(b.id, { x: 12, y: 172 }); + await area.translate(add.id, { x: 250, y: 12 }); + + const axesHelper = new THREE.AxesHelper(100); + const gridHelper = new THREE.GridHelper(10000, 100); + + gridHelper.translateY(-320); + + area.area.scene.root.add(axesHelper); + area.area.scene.root.add(gridHelper); + + Area3DExtensions.animate(area); + + return { + destroy: () => area.destroy(), + }; +} diff --git a/src/rete/customization.ts b/src/rete/customization.ts new file mode 100644 index 0000000..53dcb6f --- /dev/null +++ b/src/rete/customization.ts @@ -0,0 +1,87 @@ +import { NodeEditor, GetSchemes, ClassicPreset } from 'rete'; + +import { AreaPlugin } from 'rete-area-plugin'; +import { + ConnectionPlugin, + Presets as ConnectionPresets, +} from 'rete-connection-plugin'; +import { + ReactPlugin, + ReactArea2D, + Presets as ReactPresets, +} from 'rete-react-plugin'; +import { createRoot } from 'react-dom/client'; + +import { CustomNode } from '../customization/CustomNode'; +import { StyledNode } from '../customization/StyledNode'; +import { CustomSocket } from '../customization/CustomSocket'; +import { CustomConnection } from '../customization/CustomConnection'; + +import { addCustomBackground } from '../customization/custom-background'; + +type Schemes = GetSchemes< + ClassicPreset.Node, + ClassicPreset.Connection +>; +type AreaExtra = ReactArea2D; + +const socket = new ClassicPreset.Socket('socket'); + +export async function createEditor(container: HTMLElement) { + const editor = new NodeEditor(); + const area = new AreaPlugin(container); + const connection = new ConnectionPlugin(); + const reactRender = new ReactPlugin({ createRoot }); + + reactRender.addPreset( + ReactPresets.classic.setup({ + customize: { + node(context) { + if (context.payload.label === 'Fully customized') { + return CustomNode; + } + if (context.payload.label === 'Override styles') { + return StyledNode; + } + return ReactPresets.classic.Node; + }, + socket() { + return CustomSocket; + }, + connection() { + return CustomConnection; + }, + }, + }) + ); + + connection.addPreset(ConnectionPresets.classic.setup()); + + addCustomBackground(area); + + editor.use(area); + area.use(connection); + area.use(reactRender); + + const aLabel = 'Override styles'; + const bLabel = 'Fully customized'; + + const a = new ClassicPreset.Node(aLabel); + a.addOutput('a', new ClassicPreset.Output(socket)); + a.addInput('a', new ClassicPreset.Input(socket)); + await editor.addNode(a); + + const b = new ClassicPreset.Node(bLabel); + b.addOutput('a', new ClassicPreset.Output(socket)); + b.addInput('a', new ClassicPreset.Input(socket)); + await editor.addNode(b); + + await area.translate(a.id, { x: 0, y: 0 }); + await area.translate(b.id, { x: 300, y: 0 }); + + await editor.addConnection(new ClassicPreset.Connection(a, 'a', b, 'a')); + + return { + destroy: () => area.destroy(), + }; +} diff --git a/src/rete/default.tsx b/src/rete/default.tsx new file mode 100644 index 0000000..8963fd2 --- /dev/null +++ b/src/rete/default.tsx @@ -0,0 +1,462 @@ +import { ClassicPreset as Classic, GetSchemes, NodeEditor } from 'rete'; + +import { Area2D, AreaPlugin, AreaExtensions } from 'rete-area-plugin'; +import { + ConnectionPlugin, + Presets as ConnectionPresets, +} from 'rete-connection-plugin'; + +import { + AutoArrangePlugin, + Presets as ArrangePresets, + ArrangeAppliers +} from "rete-auto-arrange-plugin"; + +import { + ReactPlugin, + ReactArea2D, + //Presets as ReactPresets, + Presets, +} from 'rete-react-plugin'; +import { createRoot } from 'react-dom/client'; + +import { DataflowEngine } from 'rete-engine'; import { + ContextMenuExtra, + ContextMenuPlugin, + Presets as ContextMenuPresets +} from "rete-context-menu-plugin"; + +import { useRef } from 'react'; + +import { Select } from 'antd'; +import { DefaultOptionType } from 'antd/es/select'; + +type Node = | MyConstantNode | AudioOutputNode | MyOscillatorNode | MyGainNode | VisualizerOutputNode; +type Conn = +| Connection +| Connection +| Connection +| Connection +| Connection +type Schemes = GetSchemes; +class Connection extends Classic.Connection< + A, + B +> { } + +class LabeledInputControl extends Classic.InputControl<"number"> { + constructor(public value: number, public label: string, change?: () => void) { + super("number", { initial: value, change }) + } +} + +function CustomLabeledInputControl(props: { data: LabeledInputControl }) { + return (
{props.data.label}{Presets.classic.Control({ data: props.data })}
); +} + +class DropdownControl extends Classic.InputControl<"text"> { + constructor(public menuOptions: DefaultOptionType[], public label?: string, change?: () => void) { + super("text", { initial: menuOptions[0]?.value?.toString() || "default", change }) + } +} + +class VisualizerControl extends Classic.Control { + constructor(public analyserNode: AnalyserNode) { + super() + } +} + +function CustomVisualizerOutput(props: { data: VisualizerControl }) { + const canvasRef = useRef() as React.MutableRefObject + + function draw() { + props.data.analyserNode.fftSize = 2048; + var bufferLength = props.data.analyserNode.frequencyBinCount; + var dataArray = new Uint8Array(bufferLength); + props.data.analyserNode.getByteTimeDomainData(dataArray); + + requestAnimationFrame(draw); + + if (canvasRef.current) { + + var canvas = canvasRef.current + var canvasCtx = canvas.getContext("2d"); + + if (canvasCtx) { + + props.data.analyserNode.getByteTimeDomainData(dataArray); + + canvasCtx.fillStyle = "white"; + canvasCtx.fillRect(0, 0, canvas.width, canvas.height); + + canvasCtx.lineWidth = 2; + canvasCtx.strokeStyle = "rgb(0, 0, 0)"; + + canvasCtx.beginPath(); + + var sliceWidth = (canvas.width * 1.0) / bufferLength; + var x = 0; + + for (var i = 0; i < bufferLength; i++) { + var v = dataArray[i] / 128.0; + var y = (v * canvas.height) / 2; + if (i === 0) { + canvasCtx.moveTo(x, y); + } else { + canvasCtx.lineTo(x, y); + } + x += sliceWidth; + } + + canvasCtx.lineTo(canvas.width, canvas.height / 2); + canvasCtx.stroke(); + } + } + } + + draw(); + + return () +} + +function CustomDropdownControl(props: { data: DropdownControl }) { + const defaultVal = props.data.menuOptions[0]?.value?.toString() || "default" + if (props.data.label) { + return (

{props.data.label}

); + } else { + return (); + } +} + +class MyOscillatorNode extends Classic.Node<{ baseFrequency: Classic.Socket, frequency: Classic.Socket }, { signal: Classic.Socket }, { waveform: DropdownControl }> { + width = 180 + height = 200 + constructor(change?: () => void, private update?: (control: LabeledInputControl) => void) { + super('Oscillator'); + + let baseFreqInput = new Classic.Input(socket, "Base Frequency", false); + baseFreqInput.addControl(new LabeledInputControl(440, "Base Frequency", change)) + this.addInput("baseFrequency", baseFreqInput); + + let freqInput = new Classic.Input(socket, 'Additional Frequency', true); + this.addInput("frequency", freqInput); + + this.addOutput("signal", new Classic.Output(socket, "Signal")) + + const dropdownOptions = [ + { value: "sine", label: "sine" }, + { value: "sawtooth", label: "sawtooth" }, + { value: "triangle", label: "triangle" }, + { value: "square", label: "square" }, + ] + + this.addControl("waveform", new DropdownControl(dropdownOptions, undefined, change)) + } + + data(inputs: { baseFrequency?: AudioNode[], frequency?: AudioNode[] }): { signal: AudioNode } { + const osc = audioCtx.createOscillator(); + osc.type = this.controls.waveform.value?.toString() as OscillatorType || "sine" + const bfreqControl = this.inputs["baseFrequency"]?.control; + + if (inputs.baseFrequency) { + osc.frequency.setValueAtTime(0.01, audioCtx.currentTime); + inputs.baseFrequency[0].connect(osc.frequency); + } else { + osc.frequency.setValueAtTime((bfreqControl as LabeledInputControl).value || 440, audioCtx.currentTime); + } + + if (inputs.frequency) { + inputs.frequency.forEach(itm => { console.log(itm); itm.connect(osc.frequency) }); + } + + audioSources.push(osc); + audioSourceStates.push(false); + return { + signal: osc + } + } +} + +class MyGainNode extends Classic.Node<{ signal: Classic.Socket, baseGain: Classic.Socket, additionalGain: Classic.Socket }, { signal: Classic.Socket }, {}> { + width = 180 + height = 200 + constructor(initial?: number, change?: () => void, private update?: (control: LabeledInputControl) => void) { + super('Gain'); + + + let signalInput = new Classic.Input(socket, 'Signal', true); + this.addInput("signal", signalInput); + + let baseGainInput = new Classic.Input(socket, "Base Gain", false); + baseGainInput.addControl(new LabeledInputControl(initial || 1, "Base Gain", change)) + this.addInput("baseGain", baseGainInput); + + let gainInput = new Classic.Input(socket, "Additional Gain", true); + this.addInput("additionalGain", gainInput); + + this.addOutput("signal", new Classic.Output(socket, "Signal")) + } + + data(inputs: { signal?: AudioNode[], baseGain?: AudioNode[], additionalGain?: AudioNode[] }): { signal: AudioNode } { + const gainNode = audioCtx.createGain(); + const gainControl = this.inputs["baseGain"]?.control; + + if (inputs.signal) { + inputs.signal.forEach(itm => itm.connect(gainNode)); + } + + if (inputs.baseGain) { + gainNode.gain.setValueAtTime(0, audioCtx.currentTime) + inputs.baseGain[0].connect(gainNode.gain) + } else { + gainNode.gain.setValueAtTime((gainControl as LabeledInputControl).value || 1, audioCtx.currentTime); + } + + if (inputs.additionalGain) { + inputs.additionalGain.forEach(itm => itm.connect(gainNode.gain)); + } + + return { + signal: gainNode + } + } +} + +class AudioOutputNode extends Classic.Node<{ signal: Classic.Socket }, {}, { gain: LabeledInputControl }> { + width = 180 + height = 140 + constructor(change?: () => void) { + super('Audio Output'); + + this.addInput('signal', new Classic.Input(socket, 'Signal', true)); + this.addControl( + 'gain', + new LabeledInputControl(1, "Gain", change) + ); + } + + data(inputs: { signal?: AudioNode[] }): { value: boolean } { + let val = false + if (inputs.signal) { + val = true + inputs.signal.forEach(itm => itm.connect(globalGain)); + } + globalGain.gain.value = this.controls.gain.value; + return { + value: val + } + } +} + +class VisualizerOutputNode extends Classic.Node<{ signal: Classic.Socket }, {}, { visualizer: VisualizerControl }> { + width = 400 + height = 200 + public analyserNode = audioCtx.createAnalyser() + constructor() { + super('Signal Visualizer') + + this.addInput('signal', new Classic.Input(socket, 'Signal', true)); + this.addControl( + 'visualizer', + new VisualizerControl(this.analyserNode) + ); + } + + data(inputs: { signal?: AudioNode[] }): { value: AnalyserNode } { + if (inputs.signal) { + inputs.signal.forEach(itm => itm.connect(this.analyserNode)); + } + return { + value: this.analyserNode + } + } +} + +class MyConstantNode extends Classic.Node<{}, { value: Classic.Socket }, { value: Classic.InputControl<"number", number> }> { + width = 180 + height = 120 + constructor(initial: number, change?: (value: number) => void) { + super('Constant'); + + this.addOutput('value', new Classic.Output(socket, 'Number')); + this.addControl( + 'value', + new Classic.InputControl('number', { initial, change }) + ); + } + + data(): { value: AudioNode } { + const constantNode = audioCtx.createConstantSource(); + const val = this.controls.value.value || 1; + constantNode.offset.setValueAtTime(val, audioCtx.currentTime); + + audioSources.push(constantNode); + audioSourceStates.push(false); + + return { + value: constantNode + } + } +} + +type AreaExtra = Area2D | ReactArea2D | ContextMenuExtra; + +const socket = new Classic.Socket('socket'); + +const audioCtx = new window.AudioContext(); +const globalGain = audioCtx.createGain(); +globalGain.gain.value = 0; +const globalCompressor = audioCtx.createDynamicsCompressor(); +globalGain.connect(globalCompressor).connect(audioCtx.destination); +let audioSources: AudioScheduledSourceNode[] = []; +let audioSourceStates: boolean[] = [] + +export function initAudio() { + if (audioCtx.state === 'suspended') { + audioCtx.resume(); + process(); + } else { + globalGain.gain.value = 0; + audioCtx.suspend(); + } +} + +function reInitOscillators() { + for (let i = 0; i < audioSources.length; i++) { + if (!audioSourceStates[i]) { + audioSources[i].start() + audioSourceStates[i] = true + } + } +} + +function killOscillators() { + for (let i = 0; i < audioSources.length; i++) { + if (audioSourceStates[i]) { + audioSources[i].stop() + audioSourceStates[i] = false + } + } + audioSources.length = 0 + audioSourceStates.length = 0 +} + +const editor = new NodeEditor(); +const engine = new DataflowEngine(); + +function process() { + engine.reset(); + + killOscillators(); + + editor + .getNodes() + .forEach((n) => engine.fetch(n.id)); + + setTimeout(reInitOscillators, 100); +} + +export async function createEditor(container: HTMLElement) { + + const area = new AreaPlugin(container); + const connection = new ConnectionPlugin(); + const reactRender = new ReactPlugin({ createRoot }); + const arrange = new AutoArrangePlugin(); + arrange.addPreset(ArrangePresets.classic.setup()); + + const applier = new ArrangeAppliers.TransitionApplier({ + duration: 500, + timingFunction: (t) => t, + async onTick() { + await AreaExtensions.zoomAt(area, editor.getNodes()); + } + }); + + + + const contextMenu = new ContextMenuPlugin({ + items: ContextMenuPresets.classic.setup([ + ["Constant", () => new MyConstantNode(1, process)], + ["Oscillator", () => new MyOscillatorNode(process)], + ["Gain", () => new MyGainNode(1, process)], + ["Outputs", + [["AudioOutput", () => new AudioOutputNode(process)], + ["Visualizer", () => new VisualizerOutputNode()]]] + ]) + }); + + + editor.addPipe((context) => { + if (["connectioncreated", "connectionremoved"].includes(context.type)) { + setTimeout(process, 10); + //process(); + } + return context; + }); + + AreaExtensions.selectableNodes(area, AreaExtensions.selector(), { + accumulating: AreaExtensions.accumulateOnCtrl() + }); + AreaExtensions.showInputControl(area); + + editor.use(area); + editor.use(engine); + + area.use(reactRender); + area.use(contextMenu); + area.use(connection); + area.use(arrange); + + connection.addPreset(ConnectionPresets.classic.setup()); + reactRender.addPreset(Presets.classic.setup({ + customize: { + control(data) { + if (data.payload instanceof VisualizerControl) { + return CustomVisualizerOutput; + } + if (data.payload instanceof LabeledInputControl) { + return CustomLabeledInputControl; + } + if (data.payload instanceof DropdownControl) { + return CustomDropdownControl; + } + if (data.payload instanceof Classic.InputControl) { + return Presets.classic.Control; + } + return null; + } + } + })); + reactRender.addPreset(Presets.contextMenu.setup()); + + const osc = new MyOscillatorNode(process); + const gain = new MyGainNode(0.5, process); + const visualizer = new VisualizerOutputNode(); + const output = new AudioOutputNode(process); + + await editor.addNode(osc); + await editor.addNode(gain); + await editor.addNode(visualizer); + await editor.addNode(output); + + var c = new Connection(osc, 'signal', gain, 'signal') + + await editor.addConnection(c); + await editor.addConnection(new Connection(gain, 'signal', visualizer, 'signal')); + await editor.addConnection(new Connection(gain, 'signal', output, 'signal')); + + await arrange.layout({ applier }); + AreaExtensions.zoomAt(area, editor.getNodes()); + + await editor.removeConnection(c.id); + + process() + + return { + layout: async (animate: boolean) => { + await arrange.layout({ applier: animate ? applier : undefined }); + AreaExtensions.zoomAt(area, editor.getNodes()); + }, + destroy: () => area.destroy(), + }; +} diff --git a/src/rete/index.ts b/src/rete/index.ts new file mode 100644 index 0000000..cfee6e8 --- /dev/null +++ b/src/rete/index.ts @@ -0,0 +1,26 @@ +import { createEditor as createDefaultEditor } from './default' +import { createEditor as createPerfEditor } from './perf' +import { createEditor as createCustomEditor } from './customization' +import { createEditor as create3DEditor } from './3d' +import { initAudio } from './default' + +const factory = { + 'default': createDefaultEditor, + 'perf': createPerfEditor, + 'customization': createCustomEditor, + '3d': create3DEditor +} +// eslint-disable-next-line no-restricted-globals, no-undef +const query = typeof location !== 'undefined' && new URLSearchParams(location.search) +const name = ((query && query.get('template')) || 'default') as keyof typeof factory + +const createEditor = factory[name] + +if (!createEditor) { + throw new Error(`template with name ${name} not found`) +} + +export { + createEditor, + initAudio +} diff --git a/src/rete/perf.ts b/src/rete/perf.ts new file mode 100644 index 0000000..1f0fe52 --- /dev/null +++ b/src/rete/perf.ts @@ -0,0 +1,65 @@ +import { ClassicPreset as Classic, GetSchemes, NodeEditor } from 'rete'; +import { AreaPlugin } from 'rete-area-plugin'; + +import { + ReactPlugin, + ReactArea2D, + Presets as ReactPresets, +} from 'rete-react-plugin'; +import { createRoot } from 'react-dom/client'; + +class Node extends Classic.Node { + constructor() { + super('Perf'); + + this.addInput('port', new Classic.Input(socket, 'Input')); + this.addOutput('port', new Classic.Output(socket, 'Output')); + } +} + +class Connection
extends Classic.Connection< + A, + B +> {} + +type Schemes = GetSchemes>; + +type AreaExtra = ReactArea2D; + +const socket = new Classic.Socket('socket'); + +export async function createEditor(container: HTMLElement) { + const editor = new NodeEditor(); + const area = new AreaPlugin(container); + const reactRender = new ReactPlugin({ createRoot }); + + editor.use(area); + + area.use(reactRender); + + reactRender.addPreset(ReactPresets.classic.setup()); + + // eslint-disable-next-line no-restricted-globals + const query = new URLSearchParams(location.search); + const rows = Number(query.get('rows') || 0) || 12; + const cols = Number(query.get('cols') || 0) || 12; + + let prev: null | Node = null; + for (let row = 0; row < rows; row++) { + for (let col = 0; col < cols; col++) { + const a = new Node(); + + await editor.addNode(a); + await area.translate(a.id, { x: col * 310, y: row * 190 }); + + if (prev) { + await editor.addConnection(new Connection(prev, 'port', a, 'port')); + } + prev = a; + } + } + + return { + destroy: () => area.destroy(), + }; +}