modified: .gitignore

modified:   package-lock.json
	modified:   package.json
	modified:   src/app/component/Bus.tsx
	modified:   src/app/component/BusesList.tsx
	modified:   src/app/component/Strip.tsx
	modified:   src/app/component/StripBusOutput.tsx
	modified:   src/app/layout.tsx
	modified:   src/app/page.tsx
	modified:   src/utils/GetComponentState.ts
This commit is contained in:
Maksym 2024-10-19 18:53:16 +02:00
parent 4763e22691
commit 99477f9b12
10 changed files with 464 additions and 401 deletions

4
.gitignore vendored
View File

@ -36,4 +36,6 @@ yarn-error.log*
next-env.d.ts
**/public/sw.js*
**/public/workbox-*.js*
**/public/workbox-*.js*
.vscode

446
package-lock.json generated
View File

@ -8,11 +8,12 @@
"name": "frontend",
"version": "0.1.0",
"dependencies": {
"@emotion/react": "^11.11.4",
"@emotion/styled": "^11.11.5",
"@emotion/react": "^11.13.3",
"@emotion/styled": "^11.13.0",
"@fontsource/roboto": "^5.1.0",
"@mui/material": "^5.15.20",
"next": "14.2.4",
"@mui/icons-material": "^6.1.4",
"@mui/material": "^5.16.7",
"next": "^14.2.15",
"next-pwa": "^5.6.0",
"react": "^18",
"react-dom": "^18"
@ -21,6 +22,7 @@
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
"cross-env": "^7.0.3",
"eslint": "^8",
"eslint-config-next": "14.2.4",
"postcss": "^8",
@ -1683,9 +1685,10 @@
"integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA=="
},
"node_modules/@babel/runtime": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz",
"integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==",
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
"integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
"license": "MIT",
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
@ -1745,15 +1748,16 @@
}
},
"node_modules/@emotion/babel-plugin": {
"version": "11.11.0",
"resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz",
"integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==",
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz",
"integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==",
"license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.16.7",
"@babel/runtime": "^7.18.3",
"@emotion/hash": "^0.9.1",
"@emotion/memoize": "^0.8.1",
"@emotion/serialize": "^1.1.2",
"@emotion/hash": "^0.9.2",
"@emotion/memoize": "^0.9.0",
"@emotion/serialize": "^1.2.0",
"babel-plugin-macros": "^3.1.0",
"convert-source-map": "^1.5.0",
"escape-string-regexp": "^4.0.0",
@ -1763,47 +1767,52 @@
}
},
"node_modules/@emotion/cache": {
"version": "11.11.0",
"resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz",
"integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==",
"version": "11.13.1",
"resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz",
"integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==",
"license": "MIT",
"dependencies": {
"@emotion/memoize": "^0.8.1",
"@emotion/sheet": "^1.2.2",
"@emotion/utils": "^1.2.1",
"@emotion/weak-memoize": "^0.3.1",
"@emotion/memoize": "^0.9.0",
"@emotion/sheet": "^1.4.0",
"@emotion/utils": "^1.4.0",
"@emotion/weak-memoize": "^0.4.0",
"stylis": "4.2.0"
}
},
"node_modules/@emotion/hash": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz",
"integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ=="
"version": "0.9.2",
"resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
"integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==",
"license": "MIT"
},
"node_modules/@emotion/is-prop-valid": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz",
"integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==",
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz",
"integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==",
"license": "MIT",
"dependencies": {
"@emotion/memoize": "^0.8.1"
"@emotion/memoize": "^0.9.0"
}
},
"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=="
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
"integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==",
"license": "MIT"
},
"node_modules/@emotion/react": {
"version": "11.11.4",
"resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz",
"integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==",
"version": "11.13.3",
"resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz",
"integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.18.3",
"@emotion/babel-plugin": "^11.11.0",
"@emotion/cache": "^11.11.0",
"@emotion/serialize": "^1.1.3",
"@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
"@emotion/utils": "^1.2.1",
"@emotion/weak-memoize": "^0.3.1",
"@emotion/babel-plugin": "^11.12.0",
"@emotion/cache": "^11.13.0",
"@emotion/serialize": "^1.3.1",
"@emotion/use-insertion-effect-with-fallbacks": "^1.1.0",
"@emotion/utils": "^1.4.0",
"@emotion/weak-memoize": "^0.4.0",
"hoist-non-react-statics": "^3.3.1"
},
"peerDependencies": {
@ -1816,33 +1825,36 @@
}
},
"node_modules/@emotion/serialize": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz",
"integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==",
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.2.tgz",
"integrity": "sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==",
"license": "MIT",
"dependencies": {
"@emotion/hash": "^0.9.1",
"@emotion/memoize": "^0.8.1",
"@emotion/unitless": "^0.8.1",
"@emotion/utils": "^1.2.1",
"@emotion/hash": "^0.9.2",
"@emotion/memoize": "^0.9.0",
"@emotion/unitless": "^0.10.0",
"@emotion/utils": "^1.4.1",
"csstype": "^3.0.2"
}
},
"node_modules/@emotion/sheet": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz",
"integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA=="
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
"integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==",
"license": "MIT"
},
"node_modules/@emotion/styled": {
"version": "11.11.5",
"resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz",
"integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==",
"version": "11.13.0",
"resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz",
"integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.18.3",
"@emotion/babel-plugin": "^11.11.0",
"@emotion/is-prop-valid": "^1.2.2",
"@emotion/serialize": "^1.1.4",
"@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
"@emotion/utils": "^1.2.1"
"@emotion/babel-plugin": "^11.12.0",
"@emotion/is-prop-valid": "^1.3.0",
"@emotion/serialize": "^1.3.0",
"@emotion/use-insertion-effect-with-fallbacks": "^1.1.0",
"@emotion/utils": "^1.4.0"
},
"peerDependencies": {
"@emotion/react": "^11.0.0-rc.0",
@ -1855,27 +1867,31 @@
}
},
"node_modules/@emotion/unitless": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
"integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
"integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==",
"license": "MIT"
},
"node_modules/@emotion/use-insertion-effect-with-fallbacks": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz",
"integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==",
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz",
"integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==",
"license": "MIT",
"peerDependencies": {
"react": ">=16.8.0"
}
},
"node_modules/@emotion/utils": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz",
"integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg=="
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.1.tgz",
"integrity": "sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==",
"license": "MIT"
},
"node_modules/@emotion/weak-memoize": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz",
"integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww=="
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
"integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==",
"license": "MIT"
},
"node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0",
@ -1933,40 +1949,6 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/@floating-ui/core": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz",
"integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==",
"dependencies": {
"@floating-ui/utils": "^0.2.0"
}
},
"node_modules/@floating-ui/dom": {
"version": "1.6.5",
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz",
"integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==",
"dependencies": {
"@floating-ui/core": "^1.0.0",
"@floating-ui/utils": "^0.2.0"
}
},
"node_modules/@floating-ui/react-dom": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz",
"integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==",
"dependencies": {
"@floating-ui/dom": "^1.0.0"
},
"peerDependencies": {
"react": ">=16.8.0",
"react-dom": ">=16.8.0"
}
},
"node_modules/@floating-ui/utils": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz",
"integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw=="
},
"node_modules/@fontsource/roboto": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.1.0.tgz",
@ -2104,30 +2086,35 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@mui/base": {
"version": "5.0.0-beta.40",
"resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz",
"integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==",
"node_modules/@mui/core-downloads-tracker": {
"version": "5.16.7",
"resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz",
"integrity": "sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==",
"license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mui-org"
}
},
"node_modules/@mui/icons-material": {
"version": "6.1.4",
"resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.4.tgz",
"integrity": "sha512-nhXBNSP3WkY0pz8dg25VIYIXJkhdRLRKZtD50f9OuHVQ1eh8b+enmvaZQF0o5M8cs1sR6wQHwZYwG34qDZeG0g==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.9",
"@floating-ui/react-dom": "^2.0.8",
"@mui/types": "^7.2.14",
"@mui/utils": "^5.15.14",
"@popperjs/core": "^2.11.8",
"clsx": "^2.1.0",
"prop-types": "^15.8.1"
"@babel/runtime": "^7.25.7"
},
"engines": {
"node": ">=12.0.0"
"node": ">=14.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mui-org"
},
"peerDependencies": {
"@types/react": "^17.0.0 || ^18.0.0",
"react": "^17.0.0 || ^18.0.0",
"react-dom": "^17.0.0 || ^18.0.0"
"@mui/material": "^6.1.4",
"@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
"react": "^17.0.0 || ^18.0.0 || ^19.0.0"
},
"peerDependenciesMeta": {
"@types/react": {
@ -2135,31 +2122,23 @@
}
}
},
"node_modules/@mui/core-downloads-tracker": {
"version": "5.15.20",
"resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.20.tgz",
"integrity": "sha512-DoL2ppgldL16utL8nNyj/P12f8mCNdx/Hb/AJnX9rLY4b52hCMIx1kH83pbXQ6uMy6n54M3StmEbvSGoj2OFuA==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mui-org"
}
},
"node_modules/@mui/material": {
"version": "5.15.20",
"resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.20.tgz",
"integrity": "sha512-tVq3l4qoXx/NxUgIx/x3lZiPn/5xDbdTE8VrLczNpfblLYZzlrbxA7kb9mI8NoBF6+w9WE9IrxWnKK5KlPI2bg==",
"version": "5.16.7",
"resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.7.tgz",
"integrity": "sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.9",
"@mui/base": "5.0.0-beta.40",
"@mui/core-downloads-tracker": "^5.15.20",
"@mui/system": "^5.15.20",
"@mui/types": "^7.2.14",
"@mui/utils": "^5.15.20",
"@mui/core-downloads-tracker": "^5.16.7",
"@mui/system": "^5.16.7",
"@mui/types": "^7.2.15",
"@mui/utils": "^5.16.6",
"@popperjs/core": "^2.11.8",
"@types/react-transition-group": "^4.4.10",
"clsx": "^2.1.0",
"csstype": "^3.1.3",
"prop-types": "^15.8.1",
"react-is": "^18.2.0",
"react-is": "^18.3.1",
"react-transition-group": "^4.4.5"
},
"engines": {
@ -2194,12 +2173,13 @@
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
},
"node_modules/@mui/private-theming": {
"version": "5.15.20",
"resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.20.tgz",
"integrity": "sha512-BK8F94AIqSrnaPYXf2KAOjGZJgWfvqAVQ2gVR3EryvQFtuBnG6RwodxrCvd3B48VuMy6Wsk897+lQMUxJyk+6g==",
"version": "5.16.6",
"resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz",
"integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.9",
"@mui/utils": "^5.15.20",
"@mui/utils": "^5.16.6",
"prop-types": "^15.8.1"
},
"engines": {
@ -2220,9 +2200,10 @@
}
},
"node_modules/@mui/styled-engine": {
"version": "5.15.14",
"resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz",
"integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==",
"version": "5.16.6",
"resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz",
"integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.9",
"@emotion/cache": "^11.11.0",
@ -2251,15 +2232,16 @@
}
},
"node_modules/@mui/system": {
"version": "5.15.20",
"resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.20.tgz",
"integrity": "sha512-LoMq4IlAAhxzL2VNUDBTQxAb4chnBe8JvRINVNDiMtHE2PiPOoHlhOPutSxEbaL5mkECPVWSv6p8JEV+uykwIA==",
"version": "5.16.7",
"resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz",
"integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.9",
"@mui/private-theming": "^5.15.20",
"@mui/styled-engine": "^5.15.14",
"@mui/types": "^7.2.14",
"@mui/utils": "^5.15.20",
"@mui/private-theming": "^5.16.6",
"@mui/styled-engine": "^5.16.6",
"@mui/types": "^7.2.15",
"@mui/utils": "^5.16.6",
"clsx": "^2.1.0",
"csstype": "^3.1.3",
"prop-types": "^15.8.1"
@ -2290,11 +2272,12 @@
}
},
"node_modules/@mui/types": {
"version": "7.2.14",
"resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz",
"integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==",
"version": "7.2.18",
"resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.18.tgz",
"integrity": "sha512-uvK9dWeyCJl/3ocVnTOS6nlji/Knj8/tVqVX03UVTpdmTJYu/s4jtDd9Kvv0nRGE0CUSNW1UYAci7PYypjealg==",
"license": "MIT",
"peerDependencies": {
"@types/react": "^17.0.0 || ^18.0.0"
"@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0"
},
"peerDependenciesMeta": {
"@types/react": {
@ -2303,14 +2286,17 @@
}
},
"node_modules/@mui/utils": {
"version": "5.15.20",
"resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.20.tgz",
"integrity": "sha512-mAbYx0sovrnpAu1zHc3MDIhPqL8RPVC5W5xcO1b7PiSCJPtckIZmBkp8hefamAvUiAV8gpfMOM6Zb+eSisbI2A==",
"version": "5.16.6",
"resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz",
"integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.9",
"@types/prop-types": "^15.7.11",
"@mui/types": "^7.2.15",
"@types/prop-types": "^15.7.12",
"clsx": "^2.1.1",
"prop-types": "^15.8.1",
"react-is": "^18.2.0"
"react-is": "^18.3.1"
},
"engines": {
"node": ">=12.0.0"
@ -2332,12 +2318,14 @@
"node_modules/@mui/utils/node_modules/react-is": {
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
"license": "MIT"
},
"node_modules/@next/env": {
"version": "14.2.4",
"resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.4.tgz",
"integrity": "sha512-3EtkY5VDkuV2+lNmKlbkibIJxcO4oIHEhBWne6PaAp+76J9KoSsGvNikp6ivzAT8dhhBMYrm6op2pS1ApG0Hzg=="
"version": "14.2.15",
"resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.15.tgz",
"integrity": "sha512-S1qaj25Wru2dUpcIZMjxeMVSwkt8BK4dmWHHiBuRstcIyOsMapqT4A4jSB6onvqeygkSSmOkyny9VVx8JIGamQ==",
"license": "MIT"
},
"node_modules/@next/eslint-plugin-next": {
"version": "14.2.4",
@ -2349,12 +2337,13 @@
}
},
"node_modules/@next/swc-darwin-arm64": {
"version": "14.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.4.tgz",
"integrity": "sha512-AH3mO4JlFUqsYcwFUHb1wAKlebHU/Hv2u2kb1pAuRanDZ7pD/A/KPD98RHZmwsJpdHQwfEc/06mgpSzwrJYnNg==",
"version": "14.2.15",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.15.tgz",
"integrity": "sha512-Rvh7KU9hOUBnZ9TJ28n2Oa7dD9cvDBKua9IKx7cfQQ0GoYUwg9ig31O2oMwH3wm+pE3IkAQ67ZobPfEgurPZIA==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
@ -2364,12 +2353,13 @@
}
},
"node_modules/@next/swc-darwin-x64": {
"version": "14.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz",
"integrity": "sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg==",
"version": "14.2.15",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.15.tgz",
"integrity": "sha512-5TGyjFcf8ampZP3e+FyCax5zFVHi+Oe7sZyaKOngsqyaNEpOgkKB3sqmymkZfowy3ufGA/tUgDPPxpQx931lHg==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
@ -2379,12 +2369,13 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
"version": "14.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz",
"integrity": "sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ==",
"version": "14.2.15",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.15.tgz",
"integrity": "sha512-3Bwv4oc08ONiQ3FiOLKT72Q+ndEMyLNsc/D3qnLMbtUYTQAmkx9E/JRu0DBpHxNddBmNT5hxz1mYBphJ3mfrrw==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
@ -2394,12 +2385,13 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
"version": "14.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz",
"integrity": "sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A==",
"version": "14.2.15",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.15.tgz",
"integrity": "sha512-k5xf/tg1FBv/M4CMd8S+JL3uV9BnnRmoe7F+GWC3DxkTCD9aewFRH1s5rJ1zkzDa+Do4zyN8qD0N8c84Hu96FQ==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
@ -2409,12 +2401,13 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
"version": "14.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz",
"integrity": "sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q==",
"version": "14.2.15",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.15.tgz",
"integrity": "sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
@ -2424,12 +2417,13 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
"version": "14.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz",
"integrity": "sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ==",
"version": "14.2.15",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.15.tgz",
"integrity": "sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
@ -2439,12 +2433,13 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
"version": "14.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz",
"integrity": "sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A==",
"version": "14.2.15",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.15.tgz",
"integrity": "sha512-2raR16703kBvYEQD9HNLyb0/394yfqzmIeyp2nDzcPV4yPjqNUG3ohX6jX00WryXz6s1FXpVhsCo3i+g4RUX+g==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
@ -2454,12 +2449,13 @@
}
},
"node_modules/@next/swc-win32-ia32-msvc": {
"version": "14.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz",
"integrity": "sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag==",
"version": "14.2.15",
"resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.15.tgz",
"integrity": "sha512-fyTE8cklgkyR1p03kJa5zXEaZ9El+kDNM5A+66+8evQS5e/6v0Gk28LqA0Jet8gKSOyP+OTm/tJHzMlGdQerdQ==",
"cpu": [
"ia32"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
@ -2469,12 +2465,13 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
"version": "14.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz",
"integrity": "sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg==",
"version": "14.2.15",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.15.tgz",
"integrity": "sha512-SzqGbsLsP9OwKNUG9nekShTwhj6JSB9ZLMWQ8g1gG6hdE5gQLncbnbymrwy2yVmH9nikSLYRYxYMFu78Ggp7/g==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
@ -2529,6 +2526,7 @@
"version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
"license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
@ -2712,7 +2710,8 @@
"node_modules/@types/parse-json": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
"integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="
"integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
"license": "MIT"
},
"node_modules/@types/prop-types": {
"version": "15.7.12",
@ -3413,6 +3412,7 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
"integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.12.5",
"cosmiconfig": "^7.0.0",
@ -3707,6 +3707,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
"integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
"license": "MIT",
"engines": {
"node": ">=6"
}
@ -3757,7 +3758,8 @@
"node_modules/convert-source-map": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
"integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
"integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
"license": "MIT"
},
"node_modules/core-js-compat": {
"version": "3.37.1",
@ -3775,6 +3777,7 @@
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
"integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
"license": "MIT",
"dependencies": {
"@types/parse-json": "^4.0.0",
"import-fresh": "^3.2.1",
@ -3790,10 +3793,30 @@
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
"license": "ISC",
"engines": {
"node": ">= 6"
}
},
"node_modules/cross-env": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
"integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
"dev": true,
"license": "MIT",
"dependencies": {
"cross-spawn": "^7.0.1"
},
"bin": {
"cross-env": "src/bin/cross-env.js",
"cross-env-shell": "src/bin/cross-env-shell.js"
},
"engines": {
"node": ">=10.14",
"npm": ">=6",
"yarn": ">=1"
}
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@ -4171,6 +4194,7 @@
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
"integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
"license": "MIT",
"dependencies": {
"is-arrayish": "^0.2.1"
}
@ -4919,7 +4943,8 @@
"node_modules/find-root": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
"integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
"integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
"license": "MIT"
},
"node_modules/find-up": {
"version": "5.0.0",
@ -5421,7 +5446,8 @@
"node_modules/is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
"license": "MIT"
},
"node_modules/is-async-function": {
"version": "2.0.0",
@ -6320,11 +6346,12 @@
"peer": true
},
"node_modules/next": {
"version": "14.2.4",
"resolved": "https://registry.npmjs.org/next/-/next-14.2.4.tgz",
"integrity": "sha512-R8/V7vugY+822rsQGQCjoLhMuC9oFj9SOi4Cl4b2wjDrseD0LRZ10W7R6Czo4w9ZznVSshKjuIomsRjvm9EKJQ==",
"version": "14.2.15",
"resolved": "https://registry.npmjs.org/next/-/next-14.2.15.tgz",
"integrity": "sha512-h9ctmOokpoDphRvMGnwOJAedT6zKhwqyZML9mDtspgf4Rh3Pn7UTYKqePNoDvhsWBAO5GoPNYshnAUGIazVGmw==",
"license": "MIT",
"dependencies": {
"@next/env": "14.2.4",
"@next/env": "14.2.15",
"@swc/helpers": "0.5.5",
"busboy": "1.6.0",
"caniuse-lite": "^1.0.30001579",
@ -6339,15 +6366,15 @@
"node": ">=18.17.0"
},
"optionalDependencies": {
"@next/swc-darwin-arm64": "14.2.4",
"@next/swc-darwin-x64": "14.2.4",
"@next/swc-linux-arm64-gnu": "14.2.4",
"@next/swc-linux-arm64-musl": "14.2.4",
"@next/swc-linux-x64-gnu": "14.2.4",
"@next/swc-linux-x64-musl": "14.2.4",
"@next/swc-win32-arm64-msvc": "14.2.4",
"@next/swc-win32-ia32-msvc": "14.2.4",
"@next/swc-win32-x64-msvc": "14.2.4"
"@next/swc-darwin-arm64": "14.2.15",
"@next/swc-darwin-x64": "14.2.15",
"@next/swc-linux-arm64-gnu": "14.2.15",
"@next/swc-linux-arm64-musl": "14.2.15",
"@next/swc-linux-x64-gnu": "14.2.15",
"@next/swc-linux-x64-musl": "14.2.15",
"@next/swc-win32-arm64-msvc": "14.2.15",
"@next/swc-win32-ia32-msvc": "14.2.15",
"@next/swc-win32-x64-msvc": "14.2.15"
},
"peerDependencies": {
"@opentelemetry/api": "^1.1.0",
@ -6657,6 +6684,7 @@
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
@ -7582,6 +7610,7 @@
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
@ -7875,7 +7904,8 @@
"node_modules/stylis": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
"integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
"integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
"license": "MIT"
},
"node_modules/sucrase": {
"version": "3.35.0",

View File

@ -3,17 +3,18 @@
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"dev": "cross-env NODE_OPTIONS='--inspect' next dev",
"build": "next build",
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"@emotion/react": "^11.11.4",
"@emotion/styled": "^11.11.5",
"@emotion/react": "^11.13.3",
"@emotion/styled": "^11.13.0",
"@fontsource/roboto": "^5.1.0",
"@mui/material": "^5.15.20",
"next": "14.2.4",
"@mui/icons-material": "^6.1.4",
"@mui/material": "^5.16.7",
"next": "^14.2.15",
"next-pwa": "^5.6.0",
"react": "^18",
"react-dom": "^18"
@ -22,6 +23,7 @@
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
"cross-env": "^7.0.3",
"eslint": "^8",
"eslint-config-next": "14.2.4",
"postcss": "^8",

View File

@ -55,7 +55,6 @@ export class Bus extends React.Component<BusProps, BusState> {
private eventCounter = new EventCounter<"onSliderResetDefaults">();
constructor(props: BusProps) {
super(props);
let { values: initialValues } = props;
this.state = getComponentState<BusState, "">(
props.values,
this.defaultValues
@ -130,32 +129,27 @@ export class Bus extends React.Component<BusProps, BusState> {
sx={{ width: "inherit" }}
>
{/* {this.props.width > 600 ? (
// <TextField
// inputProps={{
// "aria-labelledby": "input-slider",
// itemType: "number",
// style:{padding: 0}
// }}
// value={Bus.percentToGain(this.state.gainPercent).toFixed(1)}
// onWheel={(e) => this.onStripWheel(e)}
// onClick={(e) => this.stopPropagation(e)}
// onChange={(e) => {
// e.target.value = Bus.gainToPercent(
// parseInt(e.target.value)
// ).toFixed(0);
// this.onGainSliderChange(e as unknown as Event);
// }}
// size="small"
// label={this.props.name}
// type="number"
// variant="outlined"
// sx={{
// minWidth: "100px",
// maxWidth: "100px",
// height: "",
// marginBlockEnd: "8px",
// }}
// />
<TextField
inputProps={{
"aria-labelledby": "input-slider",
itemType: "number",
style:{padding: 0}
}}
value={this.state.gain}
// onWheel={(e) => this.on(e)}
onClick={(e) => stopPropagation(e)}
onChange={(e) => this.onGainSliderChange(e)}
size="small"
label={this.props.name}
type="number"
variant="outlined"
sx={{
minWidth: "100px",
maxWidth: "100px",
height: "",
marginBlockEnd: "8px",
}}
/>
) : (
<Typography variant="caption">{this.props.name}</Typography>
)} */}
@ -174,7 +168,7 @@ export class Bus extends React.Component<BusProps, BusState> {
)} */}
<Slider
valueLabelDisplay={this.props.width > 600 ? "off" : "auto"}
value={this.state.gain}
value={this.state.gain}
color={
this.state.gain > 0 && this.state.gain < 12
? "warning"

View File

@ -8,7 +8,7 @@ import {
withTheme,
} from "@mui/material";
import React from "react";
import { Bus, BusEvent } from "./Bus";
import { Bus, BusEvent, BusProps } from "./Bus";
import { range } from "@/utils/Range";
export interface BusesListProps {
@ -16,6 +16,7 @@ export interface BusesListProps {
virtual: number;
width: number;
stackProps?: StackOwnProps;
values?: BusProps["values"][];
onChange: (event: BusEvent, id: number) => any;
}
export interface BusesListState {}
@ -44,6 +45,7 @@ export class BusesList extends React.Component<BusesListProps, BusesListState> {
<Bus
width={this.props.width}
name={name}
values={this.props.values ? this.props.values[busId] : undefined}
onChange={(e) => this.props.onChange(e, busId)}
/>
</Stack>

View File

@ -9,12 +9,15 @@ import {
Stack,
styled,
TextField,
ToggleButton,
ToggleButtonGroup,
Typography,
} from "@mui/material";
import React from "react";
import { StripBusOutput, StripBusOutputEvent } from "./StripBusOutput";
import { EventCounter } from "@/utils/EventCounter";
import { stopPropagation } from "@/utils/StopPropagation";
import { getComponentState } from "@/utils/GetComponentState";
export interface StripProps {
physicalBuses: number;
@ -61,26 +64,15 @@ export class Strip extends React.Component<StripProps, StripState> {
),
muted: false,
};
const getValue = (name: keyof typeof this.defaultValues) => {
if (initialValues === undefined) return this.defaultValues[name];
return initialValues[name] !== undefined
? this.defaultValues[name]
: initialValues[name];
};
this.state = {
...(Object.fromEntries(
Object.entries(this.defaultValues).map(([name]) => [
name,
getValue(name as keyof typeof this.defaultValues) as any,
])
) as Omit<StripState, StateDefaultValueException>),
};
this.state = getComponentState(initialValues, this.defaultValues);
this.eventCounter.on({
callback: this.onResetDefaults.bind(this),
count: 2,
name: "onSliderResetDefaults",
});
}
onSliderClick(event: React.MouseEvent) {
stopPropagation(event);
this.eventCounter.emit("onSliderResetDefaults");
@ -141,7 +133,6 @@ export class Strip extends React.Component<StripProps, StripState> {
}
);
}
render() {
return (
<>
@ -152,34 +143,17 @@ export class Strip extends React.Component<StripProps, StripState> {
}}
>
<Stack alignItems={"center"} style={{ maxWidth: "70px" }}>
{this.props.width > 600 ? (
<TextField
// inputProps={{
// "aria-labelledby": "input-slider",
// itemType: "number",
// style: { padding: 0 },
// }}
value={this.state.gain}
onWheel={(e) => this.onStripWheel(e)}
onClick={(e) => stopPropagation(e)}
size="small"
type="number"
label={this.props.name}
// sx={{minWidth: "4em", maxWidth: "5em"}}
// fullWidth
/>
) : (
<>
{/* <Typography variant="caption">{this.props.name}</Typography>
<Typography width={"4em"} textAlign="center" variant="caption">
{this.state.gain} dB
</Typography> */}
</>
)}
<Slider
orientation="vertical"
valueLabelDisplay={this.props.width > 600 ? "off" : "auto"}
value={this.state.gain}
color={
this.state.gain > 0 && this.state.gain < 12
? "warning"
: this.state.gain <= 0
? "primary"
: "error"
}
min={-60}
max={12}
step={0.1}
@ -192,7 +166,7 @@ export class Strip extends React.Component<StripProps, StripState> {
/>
</Stack>
<Stack>
<ButtonGroup orientation="vertical">
<ButtonGroup orientation="vertical" variant="text" color="inherit" disableElevation={true}>
{[
...Array(this.props.physicalBuses + this.props.virtualBuses),
].map((_v, i) => (

View File

@ -1,5 +1,5 @@
"use client";
import { Button, Grid, Slider, Stack } from "@mui/material";
import { Button, Grid, Slider, Stack, ToggleButton } from "@mui/material";
import React from "react";
export interface StripBusOutputEvent {
@ -30,7 +30,7 @@ export class StripBusOutput extends React.Component<StripProps, StripState> {
};
}
onClick(event: React.MouseEvent) {
event.nativeEvent.stopImmediatePropagation()
event.nativeEvent.stopImmediatePropagation();
this.setState(
(state) => ({ enabled: !state.enabled }),
() => {
@ -50,7 +50,7 @@ export class StripBusOutput extends React.Component<StripProps, StripState> {
size="small"
sx={{ height: "35px" }}
onClick={(e) => this.onClick(e)}
variant={this.state.enabled ? "contained" : "outlined"}
variant={this.state.enabled ? "contained" : "text"}
>
{this.props.isVirtual ? "B" : "A"}
{this.props.id + 1}

View File

@ -15,6 +15,7 @@ export default function RootLayout({
<html lang="en">
<Head>
<link rel="manifest" href="/manifest.json" />
<meta name="viewport" content="width=device-width, user-scalable=no"></meta>
</Head>
<body>{children}</body>

View File

@ -1,12 +1,15 @@
"use client";
import React, { createRef, useEffect, useMemo, useState } from "react";
import { Strip, StripEvent } from "./component/Strip";
import React, { createRef, useEffect, useMemo, useRef, useState } from "react";
import { Strip, StripEvent, StripProps, StripState } from "./component/Strip";
import {
Backdrop,
Button,
CircularProgress,
Container,
createTheme,
CssBaseline,
Divider,
Fab,
Slide,
Snackbar,
Stack,
@ -14,32 +17,46 @@ import {
Typography,
useMediaQuery,
} from "@mui/material";
import { Bus, BusEvent } from "./component/Bus";
import { Bus, BusEvent, BusProps, BusState } from "./component/Bus";
import Grid from "@mui/material/Unstable_Grid2";
import { EventCounter } from "@/utils/EventCounter";
import { BusesList } from "./component/BusesList";
import { isItMobile } from "@/utils/DetectMobile";
import FullscreenIcon from "@mui/icons-material/Fullscreen";
import FullscreenExit from "@mui/icons-material/FullscreenExit";
function random(min: number, max: number, floor: boolean = true) {
const value = Math.random() * (max - min + 1) + min;
return floor ? Math.floor(value) : value;
}
interface Values {
strips: { gain: number; muteState: boolean; outputBuses: boolean[] }[];
buses: { gain: number; muteState: boolean }[];
}
export default function Home() {
const theme = useMemo(
() =>
createTheme({
palette: { mode: "dark", background: { default: "#000" } },
palette: {
mode: "dark",
background: { default: "#000" },
primary: { main: "#9d9d9d" },
secondary: { main: "#262626" },
error: { main: "#cb0801",A700: "#fff" },
warning: {main:"#cb7c01"}
},
}),
[]
);
function sendApi(
path: string,
method: RequestInit["method"],
body: any,
method: RequestInit["method"] = "GET",
body?: any,
fetchOptions?: RequestInit
) {
const url = new URL(path, "http://127.0.0.1:3001/");
const url = new URL(path, "http://10.0.0.200:3001/");
return fetch(url.toString(), {
method,
body: body !== undefined ? JSON.stringify(body) : undefined,
@ -48,7 +65,9 @@ export default function Home() {
? { "Content-Type": "application/json" }
: ({} as RequestInit["headers"]))(),
...fetchOptions,
}).then((r) => r.json());
})
.then((r) => r.json())
.catch((e) => console.error("Error:", e));
}
function onEvent(event: StripEvent | BusEvent, id: number) {
console.log(event);
@ -69,6 +88,21 @@ export default function Home() {
sendApi(`/bus/${id}/gain`, "PATCH", { gain: event.gain });
break;
}
case "StripBusOutputChanged":
setValues((e) => {
if (e === undefined) return;
e.strips[id]!.outputBuses![
event.isVirtual ? event.busId + buses.physical : event.busId
] = event.enabled;
sendApi(`/strip/${id}/outputs`, "PATCH", {
outputs: e.strips[id]!.outputBuses,
});
return e;
});
break;
case "BusSelectToggle":
break;
}
}
const isSnackBarHidden = useMemo(() => {
@ -76,65 +110,56 @@ export default function Home() {
return localStorage.getItem("snackBarHidden") === "true";
}, []);
const [snackBarVisible, setSnackBarVisibility] = useState(false);
const breakPoints = useMemo(() => theme.breakpoints.values, []);
const [values, setValues] = useState<{
buses: BusProps["values"][];
strips: StripProps["values"][];
}>();
const [width, setWidth] = useState(1000);
const eventCounter = useMemo(() => {
const eventCounter = new EventCounter<"emptySpaceClick">();
eventCounter.on({
callback: () => {
if (document.fullscreenElement === null)
document.documentElement.requestFullscreen();
else document.exitFullscreen();
},
count: 3,
name: "emptySpaceClick",
});
return eventCounter;
}, []);
const isItMobileDevice = useMemo(() => isItMobile(navigator.userAgent), []);
const [isLoaded, setIsLoaded] = useState(false);
// const eventCounter = useMemo(() => {
// const eventCounter = new EventCounter<"emptySpaceClick">();
// eventCounter.on({
// callback: () => {
// },
// count: 3,
// name: "emptySpaceClick",
// });
// return eventCounter;
// }, []);
const isItMobileDevice = useMemo(
() =>
typeof window !== "undefined" ? isItMobile(navigator.userAgent) : "",
[]
);
useEffect(() => {
sendApi("/values")
.then((v: Values) => {
setValues({
buses: v.buses.map((v) => ({
gain: v.gain,
muted: v.muteState,
})),
strips: v.strips.map((v) => ({
gain: v.gain,
muted: v.muteState,
outputBuses: v.outputBuses,
})),
});
setIsLoaded(true);
})
.catch((e) => console.error(e));
setSnackBarVisibility(!isSnackBarHidden);
setWidth(window.innerWidth);
}, []);
// useEffect(() => {
// const values = {} as Record<
// string,
// [number, "bigger" | "smaller" | "equal"]
// >;
// type valuesKey = keyof typeof breakPoints;
// for (const key in breakPoints) {
// if (Object.prototype.hasOwnProperty.call(breakPoints, key)) {
// const breakPointWidth = breakPoints[key as keyof typeof breakPoints];
// values[key as valuesKey] = [
// breakPointWidth,
// breakPointWidth === width
// ? "equal"
// : breakPointWidth > width
// ? "bigger"
// : "smaller",
// ];
// }
// }
// console.clear();
// console.log(
// width,
// `Closest: ${
// Object.entries(breakPoints).reduce((acc, i) => {
// const equation =
// Math.abs(i[1] - width) <= Math.abs(acc[1] - width) ? i : acc;
// return equation;
// })[0]
// }`
// );
// console.table(values);
// }, [width]);
const strips = { virtual: 3, physical: 5 };
const buses = { virtual: 3, physical: 5 };
const amountOfStrips = strips.physical + strips.virtual;
const amountOfBuses = buses.physical + buses.virtual;
const virtualInputNames = useMemo(() => ["VAIO", "AUX", "VAIO3"], []);
if (typeof document !== "undefined") {
document.onclick = () => eventCounter.emit("emptySpaceClick");
// document.onclick = () => eventCounter.emit("emptySpaceClick");
window.onresize = () => {
setWidth(window.innerWidth);
};
@ -160,60 +185,74 @@ export default function Home() {
maxWidth={"xl"}
style={{ height: "100%", paddingInline: "10px" }}
>
<div>
<CssBaseline />
<Typography variant="h5">Inputs</Typography>
<Grid
container
// spacing={width ? 0 : 1}
sx={{ paddingBlockStart: "15px" }}
display={"flex"}
alignItems={"center"}
justifyContent={"space-evenly"}
columns={{ xs: 8, sm: 12, md: 12, lg: 14 }}
>
{[...Array(amountOfStrips)].map((_v, stripId) => {
const isPhysical = stripId < strips.physical;
const name = `${isPhysical ? "A" : "B"}${
isPhysical ? stripId + 1 : stripId + 1 - strips.physical
}`;
return (
<React.Fragment key={name}>
<Grid
lgOffset={stripId === strips.physical ? 2 : 0}
mdOffset={
stripId === strips.physical ? (width > 1098 ? 0.8 : 0) : 0
}
sx={{ minWidth: "fit-content" }}
>
{/* <Typography variant="overline">{`Strip #${
stripId + 1
}`}</Typography> */}
<Strip
onChange={(ev) => onEvent(ev, stripId)}
physicalBuses={buses.physical}
virtualBuses={buses.virtual}
width={width}
name={
isPhysical
? `#${stripId + 1}`
: virtualInputNames[stripId - strips.physical]
<CssBaseline />
{isLoaded ? (
<div>
<Typography variant="h5">Inputs</Typography>
<Grid
container
// spacing={width ? 0 : 1}
sx={{ paddingBlockStart: "15px" }}
display={"flex"}
alignItems={"center"}
justifyContent={"space-evenly"}
columns={{ xs: 8, sm: 12, md: 12, lg: 14 }}
>
{[...Array(amountOfStrips)].map((_v, stripId) => {
const isPhysical = stripId < strips.physical;
const name = `${isPhysical ? "A" : "B"}${
isPhysical ? stripId + 1 : stripId + 1 - strips.physical
}`;
return (
<React.Fragment key={name}>
<Grid
lgOffset={stripId === strips.physical ? 2 : 0}
mdOffset={
stripId === strips.physical
? width > 1098
? 0.8
: 0
: 0
}
/>
</Grid>
</React.Fragment>
);
})}
</Grid>
<Typography variant="h5">Outputs</Typography>
<BusesList
onChange={onEvent}
stackProps={{ sx: { paddingBlockStart: "10px" } }}
width={width}
physical={buses.physical}
virtual={buses.virtual}
/>
</div>
sx={{ minWidth: "fit-content" }}
>
<Strip
onChange={(ev) => onEvent(ev, stripId)}
physicalBuses={buses.physical}
values={values?.strips[stripId]}
virtualBuses={buses.virtual}
width={width}
name={
isPhysical
? `#${stripId + 1}`
: virtualInputNames[stripId - strips.physical]
}
/>
</Grid>
</React.Fragment>
);
})}
</Grid>
<Typography variant="h5">Outputs</Typography>
<BusesList
onChange={onEvent}
stackProps={{ sx: { paddingBlockStart: "10px" } }}
width={width}
values={[...Array(amountOfBuses)].map(
(_v, busId) => values?.buses[busId]
)}
physical={buses.physical}
virtual={buses.virtual}
/>
</div>
) : (
<Backdrop
sx={(theme) => ({ color: "#fff", zIndex: theme.zIndex.drawer + 1 })}
open={!isLoaded}
>
<CircularProgress color="inherit" />
</Backdrop>
)}
</Container>
<Snackbar
anchorOrigin={{ horizontal: "center", vertical: "top" }}
@ -230,16 +269,36 @@ export default function Home() {
on any gain slider to reset it's value to 0 dB
<br />
</Typography>
<Typography component={"span"}>
{/* <Typography component={"span"}>
<Typography variant={"button"} fontWeight={500}>
Triple {isItMobileDevice ? "tap" : "click"}
</Typography>{" "}
on empty space for toggle fullscreen
</Typography>
</Typography> */}
</>
}
action={snackBarActionButton}
/>
<Fab
size="medium"
sx={{
position: "absolute",
bottom: 15,
right: 15,
}}
color="secondary"
onClick={() => {
if (document.fullscreenElement === null)
document.documentElement.requestFullscreen();
else document.exitFullscreen();
}}
>
{document.fullscreenElement === null ? (
<FullscreenIcon />
) : (
<FullscreenExit />
)}
</Fab>
</ThemeProvider>
);
}

View File

@ -8,10 +8,9 @@ export function getComponentState<
type InitialValuesType = Omit<State, StateDefaultValueException>;
// const { initialValues } = props;
const getValue = (name: keyof InitialValuesType) => {
if (initialValues === undefined) return defaultValues[name];
return initialValues[name] !== undefined
? defaultValues[name]
: initialValues[name];
if (initialValues === undefined || initialValues[name] === undefined)
return defaultValues[name];
return initialValues[name];
};
const state = {
...(Object.fromEntries(