diff --git a/.eslintrc.json b/.eslintrc.json index cb13dbd..52c78ae 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -47,6 +47,7 @@ "useContext", "useError", "useMsal", + "useRoute", "useStore", "useService", "useReducer", diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index cc3a799..290ef79 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -5,7 +5,7 @@ on: - develop env: - BUILD_VERSION: '1.13.1' + BUILD_VERSION: '1.13.2' jobs: select-environment: diff --git a/package-lock.json b/package-lock.json index 521db5a..36e9539 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,25 +10,25 @@ "dependencies": { "@automapper/core": "^8.8.1", "@automapper/pojos": "^8.8.1", - "@azure/msal-browser": "^3.14.0", + "@azure/msal-browser": "^3.20.0", "@azure/msal-react": "^2.0.22", - "@fluentui/react-components": "^9.51.1", + "@fluentui/react-components": "^9.54.7", "@fluentui/react-icons-mdl2": "^1.3.72", "@fluentui/react-icons-mdl2-branded": "^1.2.74", - "@microsoft/applicationinsights-react-js": "^17.2.0", - "@microsoft/applicationinsights-web": "^3.2.2", + "@microsoft/applicationinsights-react-js": "^17.3.0", + "@microsoft/applicationinsights-web": "^3.3.0", "@microsoft/microsoft-graph-client": "^3.0.7", "bytes": "^3.1.2", "mime": "^4.0.4", - "monaco-editor": "^0.48.0", + "monaco-editor": "^0.50.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-dropzone": "^14.2.3", "react-error-boundary": "^4.0.13", - "react-hook-form": "^7.51.5", + "react-hook-form": "^7.52.1", "react-intl": "^6.6.8", "react-markdown": "^9.0.1", - "react-router-dom": "^6.23.1", + "react-router-dom": "^6.25.1", "react-syntax-highlighter": "^15.5.0", "react-use": "^17.5.1", "rehype-raw": "^7.0.0", @@ -36,47 +36,48 @@ "ress": "^5.0.2" }, "devDependencies": { - "@babel/core": "^7.24.9", - "@babel/preset-env": "^7.24.8", + "@babel/core": "^7.25.2", + "@babel/preset-env": "^7.25.2", "@babel/preset-react": "^7.24.7", "@babel/preset-typescript": "^7.24.7", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/jest": "^11.11.0", - "@emotion/react": "^11.11.4", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/jest": "^11.13.0", + "@emotion/react": "^11.13.0", "@formatjs/cli": "^6.2.12", "@microsoft/microsoft-graph-types": "^2.40.0", "@testing-library/jest-dom": "^6.4.8", "@testing-library/react": "^15.0.7", + "@testing-library/user-event": "^14.5.2", "@types/bytes": "^3.1.4", "@types/jest": "^29.5.12", "@types/mime": "^3.0.4", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@types/react-syntax-highlighter": "^15.5.13", - "@typescript-eslint/eslint-plugin": "^7.9.0", - "@typescript-eslint/parser": "^7.9.0", - "@vitejs/plugin-react": "^4.2.1", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", + "@vitejs/plugin-react": "^4.3.1", "babel-jest": "^29.7.0", "babel-plugin-formatjs": "^10.5.16", "eslint": "^8.57.0", "eslint-config-standard": "^17.1.0", "eslint-plugin-hooks": "^0.4.3", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-react": "^7.34.4", + "eslint-plugin-react": "^7.35.0", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-sonarjs": "^1.0.4", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jest-junit": "^16.0.0", - "postcss": "^8.4.39", + "postcss": "^8.4.40", "postcss-scss": "^4.0.9", "postcss-styled-syntax": "^0.6.4", "sass": "^1.77.8", - "stylelint": "^16.5.0", + "stylelint": "^16.8.1", "stylelint-config-recess-order": "^5.0.1", "stylelint-config-standard-scss": "^13.1.0", - "typescript": "^5.4.5", - "vite": "^5.2.13" + "typescript": "^5.5.4", + "vite": "^5.3.5" } }, "node_modules/@adobe/css-tools": { @@ -162,30 +163,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", - "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", - "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.9", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-module-transforms": "^7.24.9", - "@babel/helpers": "^7.24.8", - "@babel/parser": "^7.24.8", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.9", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -201,12 +202,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", - "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "dev": true, "dependencies": { - "@babel/types": "^7.24.9", + "@babel/types": "^7.25.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -241,12 +242,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", - "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.24.8", + "@babel/compat-data": "^7.25.2", "@babel/helper-validator-option": "^7.24.8", "browserslist": "^4.23.1", "lru-cache": "^5.1.1", @@ -257,19 +258,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.8.tgz", - "integrity": "sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz", + "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", "@babel/helper-member-expression-to-functions": "^7.24.8", "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/traverse": "^7.25.0", "semver": "^6.3.1" }, "engines": { @@ -280,9 +279,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", - "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -312,43 +311,6 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", @@ -376,16 +338,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", - "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -416,14 +377,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", - "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-wrap-function": "^7.24.7" + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -433,14 +394,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -475,18 +436,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", @@ -515,28 +464,27 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", - "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", - "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dev": true, "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.8" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -558,9 +506,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", - "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", + "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -570,13 +518,28 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", - "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.0.tgz", + "integrity": "sha512-dG0aApncVQwAUJa8tP1VHTnmU67BeIQvKafd3raEx315H54FfkZSz3B/TT+33ZQAjatGJA79gZqTtqL5QZUKXw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", + "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -586,12 +549,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", - "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -618,13 +581,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", - "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -938,15 +901,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", - "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", + "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -988,12 +951,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", - "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1036,18 +999,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.8.tgz", - "integrity": "sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", + "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.0", "globals": "^11.1.0" }, "engines": { @@ -1119,6 +1080,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", + "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", @@ -1184,14 +1161,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", - "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" }, "engines": { "node": ">=6.9.0" @@ -1217,12 +1194,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", - "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1296,15 +1273,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", - "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1539,16 +1516,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz", - "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -1726,14 +1703,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.8.tgz", - "integrity": "sha512-CgFgtN61BbdOGCP4fLaAMOPkzWUh6yQZNMr5YSt8uz2cZSSiQONCQFWqsE4NeVfOIhqDOlS9CR3WD91FzMeB2Q==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", + "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.8", + "@babel/helper-create-class-features-plugin": "^7.25.0", "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-typescript": "^7.24.7" }, "engines": { @@ -1807,19 +1785,20 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.8.tgz", - "integrity": "sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.2.tgz", + "integrity": "sha512-Y2Vkwy3ITW4id9c6KXshVV/x5yCGK7VdJmKkzOzNsDZMojRKfSA/033rRbLqlRozmhRXCejxWHLSJOg/wUHfzw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.24.8", - "@babel/helper-compilation-targets": "^7.24.8", + "@babel/compat-data": "^7.25.2", + "@babel/helper-compilation-targets": "^7.25.2", "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.0", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1840,29 +1819,30 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.0", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", "@babel/plugin-transform-class-properties": "^7.24.7", "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.24.8", + "@babel/plugin-transform-classes": "^7.25.0", "@babel/plugin-transform-computed-properties": "^7.24.7", "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-dotall-regex": "^7.24.7", "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", "@babel/plugin-transform-dynamic-import": "^7.24.7", "@babel/plugin-transform-exponentiation-operator": "^7.24.7", "@babel/plugin-transform-export-namespace-from": "^7.24.7", "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-member-expression-literals": "^7.24.7", "@babel/plugin-transform-modules-amd": "^7.24.7", "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", "@babel/plugin-transform-modules-umd": "^7.24.7", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-new-target": "^7.24.7", @@ -1961,9 +1941,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", - "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1972,33 +1952,30 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", - "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.2.tgz", + "integrity": "sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.8", - "@babel/types": "^7.24.8", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2007,9 +1984,9 @@ } }, "node_modules/@babel/types": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", - "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.24.8", @@ -2148,9 +2125,9 @@ "dev": true }, "node_modules/@emotion/cache": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.0.tgz", - "integrity": "sha512-hPV345J/tH0Cwk2wnU/3PBzORQ9HeX+kQSbwI+jslzpRCHE6fSGTohswksA/Ensr8znPzwfzKZCmAM9Lmlhp7g==", + "version": "11.13.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", + "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", "dev": true, "dependencies": { "@emotion/memoize": "^0.9.0", @@ -2902,14 +2879,16 @@ } }, "node_modules/@fluentui/react-accordion": { - "version": "9.4.4", - "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.4.4.tgz", - "integrity": "sha512-nDkzWhz9PID94rzg06CiuzSkFuAemT2mIOs5G9/IQqIaQYr2do/Ff7WH5gbB6vK901C1b4ZqxeNnPYNf/wLhpA==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.5.0.tgz", + "integrity": "sha512-GKkY+626XF+k0oWZV2aI8UBhM3E3KE73udzAvJ18mHVVTZ6fSRvz71ieFA6nR8h5USf0CO8RPgF98iXxaz1LKQ==", "dependencies": { "@fluentui/react-aria": "^9.13.2", "@fluentui/react-context-selector": "^9.1.65", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.42", + "@fluentui/react-motion": "^9.3.0", + "@fluentui/react-motion-components-preview": "^0.1.1", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-tabster": "^9.22.3", "@fluentui/react-theme": "^9.1.19", @@ -2966,19 +2945,19 @@ } }, "node_modules/@fluentui/react-avatar": { - "version": "9.6.33", - "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.6.33.tgz", - "integrity": "sha512-xikMYnjtBQRv1rHOhDEc/5GvG5F46MFhgu3jcBbxyVt512AfwVgDMPj18tg4y2RaZ587FLPFifK7VlNBDAaT4g==", + "version": "9.6.34", + "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.6.34.tgz", + "integrity": "sha512-KojRJFErsutRLIOXJbaWhA/AkiKvQzKpQVBzpvYf1vQu+ZEn90Ng0J8cwGQcqjQ1E9NydrCGO7G3akEcBuaqHg==", "dependencies": { "@fluentui/react-badge": "^9.2.41", "@fluentui/react-context-selector": "^9.1.65", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.42", - "@fluentui/react-popover": "^9.9.15", + "@fluentui/react-popover": "^9.9.16", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-tabster": "^9.22.3", "@fluentui/react-theme": "^9.1.19", - "@fluentui/react-tooltip": "^9.4.34", + "@fluentui/react-tooltip": "^9.4.35", "@fluentui/react-utilities": "^9.18.13", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" @@ -3011,9 +2990,9 @@ } }, "node_modules/@fluentui/react-breadcrumb": { - "version": "9.0.33", - "resolved": "https://registry.npmjs.org/@fluentui/react-breadcrumb/-/react-breadcrumb-9.0.33.tgz", - "integrity": "sha512-VDnTsUPqmWRAuOwXwScItlaLzuMFlOXCRgrZuU3py8QTTjUU4jIBi2X7wI7DREpD0FRM7wbujCkN0tb4lRO4FQ==", + "version": "9.0.34", + "resolved": "https://registry.npmjs.org/@fluentui/react-breadcrumb/-/react-breadcrumb-9.0.34.tgz", + "integrity": "sha512-uSMlQme/Rrt6giWJRz5el0soY9GjKsnm8v6b/md1cehivc6FX8iys2Lmk5oJM+m3a2gxKQYr3sp8CvKsyKOGlw==", "dependencies": { "@fluentui/react-aria": "^9.13.2", "@fluentui/react-button": "^9.3.87", @@ -3058,13 +3037,14 @@ } }, "node_modules/@fluentui/react-card": { - "version": "9.0.87", - "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.0.87.tgz", - "integrity": "sha512-aH7tvf1XTtW5kVM2YzbM1OEVQ0dn9POBHEutmpSkHpxb/Wa4bAPm4Yrimt9PZqcFws1WdFapbZD0xaYGhf+9Ew==", + "version": "9.0.88", + "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.0.88.tgz", + "integrity": "sha512-wEvgIonwR1r4e7N+fDxcW5DuBxGUjtOjNhrCqRxVFA1H0WjhLXHpGAlbBzROrCtolHBnv+Xv4ndKPm/ftguA5Q==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.7", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-tabster": "^9.22.3", + "@fluentui/react-text": "^9.4.23", "@fluentui/react-theme": "^9.1.19", "@fluentui/react-utilities": "^9.18.13", "@griffel/react": "^1.5.22", @@ -3078,11 +3058,11 @@ } }, "node_modules/@fluentui/react-checkbox": { - "version": "9.2.32", - "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.2.32.tgz", - "integrity": "sha512-q75W+SaGxKHFNjInGq/TYARQHeP7x1H2N0681JFhvo6Ji0BbCTKpxMTsssHvR6OlqBPjcXfkxpXiVD/V8vVgNA==", + "version": "9.2.33", + "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.2.33.tgz", + "integrity": "sha512-5bccf0H4as8vjQXslFrZhEIosNUUOqpuZ20OLkpoI+NVzVfQtwa4sI8BaSr8oATJU3haXVBxItOa/zOOiBzWvA==", "dependencies": { - "@fluentui/react-field": "^9.1.71", + "@fluentui/react-field": "^9.1.72", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-label": "^9.1.74", @@ -3101,18 +3081,18 @@ } }, "node_modules/@fluentui/react-combobox": { - "version": "9.13.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.13.2.tgz", - "integrity": "sha512-unLJyLs0rq06cl81ka89JkvKo3iXXGHC5wbZ4KTAEF3ZoXjuw7EI19tLiR+FIEV60qhSo2jOXKCF8xpHOKWIXQ==", + "version": "9.13.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.13.3.tgz", + "integrity": "sha512-q1B/1e/beA8dkPZS8MV+jHF092W8y0bCdxfTrsnWuapKIXIn0BMPSE04f0aNED8R4yxxZN27y8LR/9EGcWeHtA==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.7", "@fluentui/react-aria": "^9.13.2", "@fluentui/react-context-selector": "^9.1.65", - "@fluentui/react-field": "^9.1.71", + "@fluentui/react-field": "^9.1.72", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-portal": "^9.4.31", - "@fluentui/react-positioning": "^9.15.6", + "@fluentui/react-positioning": "^9.15.7", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-tabster": "^9.22.3", "@fluentui/react-theme": "^9.1.19", @@ -3128,64 +3108,64 @@ } }, "node_modules/@fluentui/react-components": { - "version": "9.54.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.54.6.tgz", - "integrity": "sha512-ocL+VIdTZsyjrA8z7IWifoyH7YFAsLLn2FPFdLkQqPk/+XPcbuduRDBYfeVAqwsQLmNk44dC5RXZyziigLUd/A==", + "version": "9.54.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.54.7.tgz", + "integrity": "sha512-X7B5rLEsx30bRtHMdNHgWnij+xSMleJg6tyRR9L2nwFaDIf89jaQU1iNDkIgEf4zSXGhBRXAlT0UlYcwcEWZjw==", "dependencies": { - "@fluentui/react-accordion": "^9.4.4", + "@fluentui/react-accordion": "^9.5.0", "@fluentui/react-alert": "9.0.0-beta.124", "@fluentui/react-aria": "^9.13.2", - "@fluentui/react-avatar": "^9.6.33", + "@fluentui/react-avatar": "^9.6.34", "@fluentui/react-badge": "^9.2.41", - "@fluentui/react-breadcrumb": "^9.0.33", + "@fluentui/react-breadcrumb": "^9.0.34", "@fluentui/react-button": "^9.3.87", - "@fluentui/react-card": "^9.0.87", - "@fluentui/react-checkbox": "^9.2.32", - "@fluentui/react-combobox": "^9.13.2", - "@fluentui/react-dialog": "^9.11.6", + "@fluentui/react-card": "^9.0.88", + "@fluentui/react-checkbox": "^9.2.33", + "@fluentui/react-combobox": "^9.13.3", + "@fluentui/react-dialog": "^9.11.7", "@fluentui/react-divider": "^9.2.73", - "@fluentui/react-drawer": "^9.5.6", - "@fluentui/react-field": "^9.1.71", + "@fluentui/react-drawer": "^9.5.7", + "@fluentui/react-field": "^9.1.72", "@fluentui/react-image": "^9.1.71", "@fluentui/react-infobutton": "9.0.0-beta.102", - "@fluentui/react-infolabel": "^9.0.40", - "@fluentui/react-input": "^9.4.83", + "@fluentui/react-infolabel": "^9.0.41", + "@fluentui/react-input": "^9.4.84", "@fluentui/react-label": "^9.1.74", "@fluentui/react-link": "^9.2.28", - "@fluentui/react-menu": "^9.14.11", + "@fluentui/react-menu": "^9.14.12", "@fluentui/react-message-bar": "^9.2.6", "@fluentui/react-motion": "^9.4.0", - "@fluentui/react-overflow": "^9.1.25", - "@fluentui/react-persona": "^9.2.92", - "@fluentui/react-popover": "^9.9.15", + "@fluentui/react-overflow": "^9.1.26", + "@fluentui/react-persona": "^9.2.93", + "@fluentui/react-popover": "^9.9.16", "@fluentui/react-portal": "^9.4.31", - "@fluentui/react-positioning": "^9.15.6", - "@fluentui/react-progress": "^9.1.82", + "@fluentui/react-positioning": "^9.15.7", + "@fluentui/react-progress": "^9.1.83", "@fluentui/react-provider": "^9.17.0", - "@fluentui/react-radio": "^9.2.27", + "@fluentui/react-radio": "^9.2.28", "@fluentui/react-rating": "^9.0.15", - "@fluentui/react-search": "^9.0.12", - "@fluentui/react-select": "^9.1.82", + "@fluentui/react-search": "^9.0.13", + "@fluentui/react-select": "^9.1.83", "@fluentui/react-shared-contexts": "^9.20.0", - "@fluentui/react-skeleton": "^9.1.10", - "@fluentui/react-slider": "^9.1.89", - "@fluentui/react-spinbutton": "^9.2.83", + "@fluentui/react-skeleton": "^9.1.11", + "@fluentui/react-slider": "^9.1.90", + "@fluentui/react-spinbutton": "^9.2.84", "@fluentui/react-spinner": "^9.4.12", "@fluentui/react-swatch-picker": "^9.1.6", - "@fluentui/react-switch": "^9.1.89", - "@fluentui/react-table": "^9.15.11", + "@fluentui/react-switch": "^9.1.90", + "@fluentui/react-table": "^9.15.12", "@fluentui/react-tabs": "^9.4.27", "@fluentui/react-tabster": "^9.22.3", - "@fluentui/react-tag-picker": "^9.2.3", - "@fluentui/react-tags": "^9.3.12", - "@fluentui/react-teaching-popover": "^9.1.11", + "@fluentui/react-tag-picker": "^9.2.4", + "@fluentui/react-tags": "^9.3.13", + "@fluentui/react-teaching-popover": "^9.1.12", "@fluentui/react-text": "^9.4.23", - "@fluentui/react-textarea": "^9.3.83", + "@fluentui/react-textarea": "^9.3.84", "@fluentui/react-theme": "^9.1.19", "@fluentui/react-toast": "^9.3.51", - "@fluentui/react-toolbar": "^9.1.90", - "@fluentui/react-tooltip": "^9.4.34", - "@fluentui/react-tree": "^9.7.5", + "@fluentui/react-toolbar": "^9.1.91", + "@fluentui/react-tooltip": "^9.4.35", + "@fluentui/react-tree": "^9.7.6", "@fluentui/react-utilities": "^9.18.13", "@fluentui/react-virtualizer": "9.0.0-alpha.82", "@griffel/react": "^1.5.22", @@ -3215,9 +3195,9 @@ } }, "node_modules/@fluentui/react-dialog": { - "version": "9.11.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.11.6.tgz", - "integrity": "sha512-a7KQZeRcaOM8PzEHFONIxjHyiZjLwA57+Bm2XdILJsVrNL9cCSz2ChN3zaIGGZ3gfZ+YkNvfcbXAz5sVIXyKVw==", + "version": "9.11.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.11.7.tgz", + "integrity": "sha512-g0tcW2X7FyDGifwJU+Q2hX8pgLk+AUYBDK7d0xOyXpWhP/HN920r4E+MlgJhmmpf5hRh3959knZqoyrnG0+GGA==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.7", "@fluentui/react-aria": "^9.13.2", @@ -3260,13 +3240,13 @@ } }, "node_modules/@fluentui/react-drawer": { - "version": "9.5.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.5.6.tgz", - "integrity": "sha512-vfn4G+gRpNETqBFQ3cnWJajKbCyMNeqInzDaeEh7eU+8/YANGIofMU8bPublVcSD5Ew9Ly++GEte4dIGvQiB8A==", + "version": "9.5.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.5.7.tgz", + "integrity": "sha512-9v755/LWQu76vvdsHiSMj/3XKvjfJT8NFQGHF+qwUj/wXmyW6ZfmVwW1HcwJ1dDMP6yOGBUXS9R56SqLIVGFxQ==", "dependencies": { - "@fluentui/react-dialog": "^9.11.6", + "@fluentui/react-dialog": "^9.11.7", "@fluentui/react-jsx-runtime": "^9.0.42", - "@fluentui/react-motion-preview": "^0.5.25", + "@fluentui/react-motion": "^9.4.0", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-tabster": "^9.22.3", "@fluentui/react-theme": "^9.1.19", @@ -3282,9 +3262,9 @@ } }, "node_modules/@fluentui/react-field": { - "version": "9.1.71", - "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.1.71.tgz", - "integrity": "sha512-DqvLa3ZPm+vhIvbQrZqV8d2Nr/+dJv3mOxlootqMVu4v1l8K6fux4qUzwXvSyydIx7U73R99sC/iOCic2SYDFw==", + "version": "9.1.72", + "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.1.72.tgz", + "integrity": "sha512-39DsB0nIOU7FdWN7+a8x2RKPaZrAMmsGaz85DOYryzbp8y9bn990BjU8WnhquNABkW2xJNI9gEi0goW/R3tmiQ==", "dependencies": { "@fluentui/react-context-selector": "^9.1.65", "@fluentui/react-icons": "^2.0.245", @@ -3319,9 +3299,9 @@ } }, "node_modules/@fluentui/react-icons": { - "version": "2.0.249", - "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.249.tgz", - "integrity": "sha512-VcOCbqv3MxzMZdH6jyqpzsfyNV0cG5F4TKXnnXcJ/QVQcWsN2BU6NrCiwkZHKEjbOYbxwBTdBHq1gnR5qz4baw==", + "version": "2.0.252", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.252.tgz", + "integrity": "sha512-MvvgjRL2Hb0ftQkJwQRqwlNNMUTqh246psL1Xb4DRWZjpxR+CcDY9UxAyIu2Fp6i2/BEWtizIMzo8sxH0e1YRw==", "dependencies": { "@griffel/react": "^1.0.0", "tslib": "^2.1.0" @@ -3403,14 +3383,14 @@ } }, "node_modules/@fluentui/react-infolabel": { - "version": "9.0.40", - "resolved": "https://registry.npmjs.org/@fluentui/react-infolabel/-/react-infolabel-9.0.40.tgz", - "integrity": "sha512-3hXmmiuv5gEqZWTNK25tp/YdLoIgIZ64XgFXDgtaRjK94evzEIYR2jRhhfQUWZorMOhTqqSBMfKK/+M8dwfk2g==", + "version": "9.0.41", + "resolved": "https://registry.npmjs.org/@fluentui/react-infolabel/-/react-infolabel-9.0.41.tgz", + "integrity": "sha512-Jp544tDHH+Ss2XsHJy18nQlWA8tv4jKWXR9wwNS8NbKk40mW+KIVV4fbq8fUvD29McHI9vpuAMl5Yfzpcu2hkg==", "dependencies": { "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-label": "^9.1.74", - "@fluentui/react-popover": "^9.9.15", + "@fluentui/react-popover": "^9.9.16", "@fluentui/react-tabster": "^9.22.3", "@fluentui/react-theme": "^9.1.19", "@fluentui/react-utilities": "^9.18.13", @@ -3425,11 +3405,11 @@ } }, "node_modules/@fluentui/react-input": { - "version": "9.4.83", - "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.4.83.tgz", - "integrity": "sha512-mM2aU0Xsqfx7LKFs1X0VBCyXncxRQBRHwEh+1MTvkbhgOYLxD3f2qEy/XNk0vyJ2rya/A2zHE9vwDHKn7Ck44A==", + "version": "9.4.84", + "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.4.84.tgz", + "integrity": "sha512-gl/HRKkxsJKlc9mBcblb6HSUWeqPJTpi2yAjyPMIHxVHOg1RftG3+5xQTcmkXwvFeUEfC/4krEMibsFBXtvwWg==", "dependencies": { - "@fluentui/react-field": "^9.1.71", + "@fluentui/react-field": "^9.1.72", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-theme": "^9.1.19", @@ -3499,9 +3479,9 @@ } }, "node_modules/@fluentui/react-menu": { - "version": "9.14.11", - "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.14.11.tgz", - "integrity": "sha512-E1LWDywVukrbmKN8GIbdmTxP3w3q9V7ig4xDJNIt3VQxNoHdDS/Dz00pT6SZT/zP9VqCnfhpuF0xu+q5sOh4Nw==", + "version": "9.14.12", + "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.14.12.tgz", + "integrity": "sha512-aBFXf5dtDLctNTb5+VTS7zqZgV3VOv6hEOpf4PmRZiWfw1WAjSwMKdWTWXunqIdd5eOZu9mB7y1RWSoyBrN7Jg==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.7", "@fluentui/react-aria": "^9.13.2", @@ -3509,7 +3489,7 @@ "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-portal": "^9.4.31", - "@fluentui/react-positioning": "^9.15.6", + "@fluentui/react-positioning": "^9.15.7", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-tabster": "^9.22.3", "@fluentui/react-theme": "^9.1.19", @@ -3563,16 +3543,12 @@ "react-dom": ">=16.8.0 <19.0.0" } }, - "node_modules/@fluentui/react-motion-preview": { - "version": "0.5.25", - "resolved": "https://registry.npmjs.org/@fluentui/react-motion-preview/-/react-motion-preview-0.5.25.tgz", - "integrity": "sha512-TRmDFTuIEOeCs5HCyk5NCpMXBgY8L7tSkjAyZVdZtBY5KxFGlMys+7DnXTXJNDud5OvgDphU6XEvKEGFmaq/Uw==", + "node_modules/@fluentui/react-motion-components-preview": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-motion-components-preview/-/react-motion-components-preview-0.1.1.tgz", + "integrity": "sha512-V6NxqlIgNyad0FjwcseuMef0nJyyf9uKSy400EsfnL95X/u6zYze3WiXukSjU+HlL7iASvDZDovTX2oL0eVLTQ==", "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.42", - "@fluentui/react-shared-contexts": "^9.20.0", - "@fluentui/react-theme": "^9.1.19", - "@fluentui/react-utilities": "^9.18.13", - "@griffel/react": "^1.5.22", + "@fluentui/react-motion": "*", "@swc/helpers": "^0.5.1" }, "peerDependencies": { @@ -3583,9 +3559,9 @@ } }, "node_modules/@fluentui/react-overflow": { - "version": "9.1.25", - "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.1.25.tgz", - "integrity": "sha512-NfZF6D+5xlaUN9bJ5sziE5VkO0SHmJeoUXu+K0wXTpexVQVc16xh9Ob9wF4FouQ6JnD86WWdEGkALKpyaNQieQ==", + "version": "9.1.26", + "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.1.26.tgz", + "integrity": "sha512-zrJfbLvxrW10GH+JtRhPclCeV/mxUxSYRsHBpD/RwABaE+L2PR//3QKHXCV7xIlFpNJUpmRbFe71dtb7Eyt2Xw==", "dependencies": { "@fluentui/priority-overflow": "^9.1.13", "@fluentui/react-context-selector": "^9.1.65", @@ -3602,11 +3578,11 @@ } }, "node_modules/@fluentui/react-persona": { - "version": "9.2.92", - "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.2.92.tgz", - "integrity": "sha512-TNbCR0NY4JIM217DZlSZBaCFkbFPzd6KRuVwC9XGLhHhTtA+Wr3J86OgWldtjTAUWcX6eJ94JsW0aYT4exCbYA==", + "version": "9.2.93", + "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.2.93.tgz", + "integrity": "sha512-b/D7LzDC75L2yR3V6d3F3KTs72rGvagIuX7tEVtvs3e0Q6iX3vlJAsZFd/ce4T49gMm9+gbI9TYJlDQmgoBJ+w==", "dependencies": { - "@fluentui/react-avatar": "^9.6.33", + "@fluentui/react-avatar": "^9.6.34", "@fluentui/react-badge": "^9.2.41", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-shared-contexts": "^9.20.0", @@ -3623,16 +3599,16 @@ } }, "node_modules/@fluentui/react-popover": { - "version": "9.9.15", - "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.9.15.tgz", - "integrity": "sha512-9KVRpKa1IDL6RGOJF7CYZvC+ayhye65fTshRYz17kiSXPHX3oshrPS+TwsrQq6ENmOuoirVva7AA6AqyooDrjQ==", + "version": "9.9.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.9.16.tgz", + "integrity": "sha512-edgBJBYXJ8N6LgxH0bKgnMCFp430BpqqOzqf2Ap/0360qo9YbK8oUP2rfh0YZZJKcSC0bro3smcMbFQkq8v/3Q==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.7", "@fluentui/react-aria": "^9.13.2", "@fluentui/react-context-selector": "^9.1.65", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-portal": "^9.4.31", - "@fluentui/react-positioning": "^9.15.6", + "@fluentui/react-positioning": "^9.15.7", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-tabster": "^9.22.3", "@fluentui/react-theme": "^9.1.19", @@ -3667,9 +3643,9 @@ } }, "node_modules/@fluentui/react-positioning": { - "version": "9.15.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.15.6.tgz", - "integrity": "sha512-733OgnMAJt9OQ7yvjsshNR+mWtQE7+236HM6gf1SSL8D9j1W481b+jxnXbo6qiPDkAn1Me5wdGZoJmEN5jFO1w==", + "version": "9.15.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.15.7.tgz", + "integrity": "sha512-Zb+Td/a3nFDeLvz3pH6ebod7Bq9tsDtx2MGQ/aarfKAvbp9JRrmb/1nkqMEauth7NPg/JV9NfXJMGq5hvBQtrw==", "dependencies": { "@floating-ui/devtools": "0.2.1", "@floating-ui/dom": "^1.2.0", @@ -3687,11 +3663,11 @@ } }, "node_modules/@fluentui/react-progress": { - "version": "9.1.82", - "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.1.82.tgz", - "integrity": "sha512-r4aZ57rEoReNZoIDG65OvXVk5/19HZGLFghBQ6J8ytLLnIYwqhOueUyv2HEcRXpK16ayhN37GpQE7eBLnMLGGg==", + "version": "9.1.83", + "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.1.83.tgz", + "integrity": "sha512-hZGlarZwPhi90LwUsNStEymd/oqHt3Dc8mBm402RHD3XJOhJ+T7k71ROLblZOwm98m2hNJ0lSB3o6FztQlrtsw==", "dependencies": { - "@fluentui/react-field": "^9.1.71", + "@fluentui/react-field": "^9.1.72", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-theme": "^9.1.19", @@ -3729,11 +3705,11 @@ } }, "node_modules/@fluentui/react-radio": { - "version": "9.2.27", - "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.2.27.tgz", - "integrity": "sha512-CNGloT6Jc11I8fMpn9pqTgpN2gImgNuNY5YulOUQZ8Z4afT1P0YCWDTY6kRIUo3LFH4x4A1YsN3O05Sn2dImcA==", + "version": "9.2.28", + "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.2.28.tgz", + "integrity": "sha512-WoH95UndR6sx+BfBH4MdztHWIodi6smpZekKBUN7Y5YjvD2delCxEDaEn5Ct5qyF3pY6rwlkVTSvmZ+GSC/baQ==", "dependencies": { - "@fluentui/react-field": "^9.1.71", + "@fluentui/react-field": "^9.1.72", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-label": "^9.1.74", "@fluentui/react-shared-contexts": "^9.20.0", @@ -3771,12 +3747,12 @@ } }, "node_modules/@fluentui/react-search": { - "version": "9.0.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-search/-/react-search-9.0.12.tgz", - "integrity": "sha512-63Yxkx0JeQ8ueSr37tc/OA+yYQFPQHAoVmvJyqhYngRLJUzuGT3ErvM6WjBtZjQ49ErRXjmwJw9Rcf3HowUZCg==", + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@fluentui/react-search/-/react-search-9.0.13.tgz", + "integrity": "sha512-mg2vI15635/h/9/FffxrVBXrD8AiCRetCISbvNHCgzHMl/1M1C/7HsJnaLj+U6wl3sgBVaWYJgLgyLd8jcc1hg==", "dependencies": { "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-input": "^9.4.83", + "@fluentui/react-input": "^9.4.84", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-theme": "^9.1.19", "@fluentui/react-utilities": "^9.18.13", @@ -3791,11 +3767,11 @@ } }, "node_modules/@fluentui/react-select": { - "version": "9.1.82", - "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.1.82.tgz", - "integrity": "sha512-anu9A918H13HRRFdnmWk2XrjiVkefreUKsY5gA07qK94TJRH/drw1GPCOX5fOkQF60J7fqZShyNVTqE4fJ+9pQ==", + "version": "9.1.83", + "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.1.83.tgz", + "integrity": "sha512-vdbkFOtkG3ychVsX1b1nMxsewzu2e+ox+p+rIn2X6hBqa989797VJdhXRRQYMfCs1phSlDL1HCPM1p1s7827Lw==", "dependencies": { - "@fluentui/react-field": "^9.1.71", + "@fluentui/react-field": "^9.1.72", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-shared-contexts": "^9.20.0", @@ -3825,11 +3801,11 @@ } }, "node_modules/@fluentui/react-skeleton": { - "version": "9.1.10", - "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.1.10.tgz", - "integrity": "sha512-W0OkdaS7+5NkK32WTTP1sbBWu+NBL343YYU0R52LHfXBMJXlhJ/pNIcfIPrBSij6szmMiRZrPzYGtDzFx/S4qA==", + "version": "9.1.11", + "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.1.11.tgz", + "integrity": "sha512-e5Pl8EqclZ2NHAdRtwheFmrNwvynVooem0Hh+w19AZwuukjFDvpdWktJ6mpECtPQyaWgcFb67mO1IbfnQNffqA==", "dependencies": { - "@fluentui/react-field": "^9.1.71", + "@fluentui/react-field": "^9.1.72", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-theme": "^9.1.19", @@ -3845,11 +3821,11 @@ } }, "node_modules/@fluentui/react-slider": { - "version": "9.1.89", - "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.1.89.tgz", - "integrity": "sha512-cKCGAGVbKK6hYIQKfnveQehfCEr75gKPUSP9B7HdQX8CLiPUgUSrwXGouSYgJSLcpD3BN7boLj7DUfs3mhxMqQ==", + "version": "9.1.90", + "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.1.90.tgz", + "integrity": "sha512-k+NppSxPKYji9KqtKbpfo6Lva8g6dO289Hpkt8UAwyuV1c7BxnwgOLfPXE9OyQg28J0vcsluxYXFwsLyRqj/Fg==", "dependencies": { - "@fluentui/react-field": "^9.1.71", + "@fluentui/react-field": "^9.1.72", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-tabster": "^9.22.3", @@ -3866,12 +3842,12 @@ } }, "node_modules/@fluentui/react-spinbutton": { - "version": "9.2.83", - "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.2.83.tgz", - "integrity": "sha512-wWdggoxT0nUnbE8PqnUojnH0OznnkUvHHINwE0l3II8EDz0YXTPBZMoaRfB84+FykdDAfyNm2BWa+uEtRH47ZA==", + "version": "9.2.84", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.2.84.tgz", + "integrity": "sha512-3Zsqk5zYXNrCjAR6wIrwvMMbrKthdXJKQH3Z37LhF+gfRfwq34dyj8N5CFhXYi0bClWRqK3namX2cMXZ7FqIsQ==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.7", - "@fluentui/react-field": "^9.1.71", + "@fluentui/react-field": "^9.1.72", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-shared-contexts": "^9.20.0", @@ -3930,11 +3906,11 @@ } }, "node_modules/@fluentui/react-switch": { - "version": "9.1.89", - "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.1.89.tgz", - "integrity": "sha512-9gYOhubFq5+4c2bnD6VJGfRCwl9X5RFp3AXztfrYELRTgwSsIeCAoa6VM3bu9nUi3V60GHCNHk38j8lVwDgy/w==", + "version": "9.1.90", + "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.1.90.tgz", + "integrity": "sha512-0xd7vn1o+XsGk4jIkA6mAXJm4HxnFcK2WoQI3NFjsJ1wXdghHZEEV+1YX0bgUUh4DouXfETrQzgZKkF0c1uCFA==", "dependencies": { - "@fluentui/react-field": "^9.1.71", + "@fluentui/react-field": "^9.1.72", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-label": "^9.1.74", @@ -3953,18 +3929,18 @@ } }, "node_modules/@fluentui/react-table": { - "version": "9.15.11", - "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.15.11.tgz", - "integrity": "sha512-6eK8v22lbZpMnBPVEwf7qaaueSrrVcLSMs9U4f3nNGo2pJVOnOcg9Vhvom/GL2D8FItpOOcTwxT7Asg/FGRIIA==", + "version": "9.15.12", + "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.15.12.tgz", + "integrity": "sha512-J7oF4szGNhXboobgOeNGMy3F342IJYma76sEQhUN1rZEHpIkJIEfldUtdXlJK72N3RRaNruq26WTpeQFLaT9MQ==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.7", "@fluentui/react-aria": "^9.13.2", - "@fluentui/react-avatar": "^9.6.33", - "@fluentui/react-checkbox": "^9.2.32", + "@fluentui/react-avatar": "^9.6.34", + "@fluentui/react-checkbox": "^9.2.33", "@fluentui/react-context-selector": "^9.1.65", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.42", - "@fluentui/react-radio": "^9.2.27", + "@fluentui/react-radio": "^9.2.28", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-tabster": "^9.22.3", "@fluentui/react-theme": "^9.1.19", @@ -4021,22 +3997,22 @@ } }, "node_modules/@fluentui/react-tag-picker": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@fluentui/react-tag-picker/-/react-tag-picker-9.2.3.tgz", - "integrity": "sha512-5VvdPcFUY1PrvlLFDCfx1oOiwViukZiI9fQDeX2606wj3g+1lFmzao+8DLxjQ/jX9rEiLFrCrF0RIg+xcjRtxA==", + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-tag-picker/-/react-tag-picker-9.2.4.tgz", + "integrity": "sha512-pApWLCBA/Lpi7WRCyNEAr5Vmye6/WtOHdTpjLTWPb4ymWM1ifXZwHGmD1c7dvukhO4jxWbQHFCz0Jt3ElyoY5Q==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.7", "@fluentui/react-aria": "^9.13.2", - "@fluentui/react-combobox": "^9.13.2", + "@fluentui/react-combobox": "^9.13.3", "@fluentui/react-context-selector": "^9.1.65", - "@fluentui/react-field": "^9.1.71", + "@fluentui/react-field": "^9.1.72", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-portal": "^9.4.31", - "@fluentui/react-positioning": "^9.15.6", + "@fluentui/react-positioning": "^9.15.7", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-tabster": "^9.22.3", - "@fluentui/react-tags": "^9.3.12", + "@fluentui/react-tags": "^9.3.13", "@fluentui/react-theme": "^9.1.19", "@fluentui/react-utilities": "^9.18.13", "@griffel/react": "^1.5.22", @@ -4050,13 +4026,13 @@ } }, "node_modules/@fluentui/react-tags": { - "version": "9.3.12", - "resolved": "https://registry.npmjs.org/@fluentui/react-tags/-/react-tags-9.3.12.tgz", - "integrity": "sha512-Qm77lq/lWoG0g7bOPZcvjJfyjqezI+uUTAYo1+5mugIhZ+7AyBzgsnCdrmdwn1yFgsSlNNes1+A78V/jHdUE0w==", + "version": "9.3.13", + "resolved": "https://registry.npmjs.org/@fluentui/react-tags/-/react-tags-9.3.13.tgz", + "integrity": "sha512-Q+vY6q8HecNIPH0VQ8nIIcInBFScfGvG+5VZkCV+LOQ/QLY7AhXt/dJPsx0nFJXhoxSrTXyPYm908RdBsfnv8A==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.7", "@fluentui/react-aria": "^9.13.2", - "@fluentui/react-avatar": "^9.6.33", + "@fluentui/react-avatar": "^9.6.34", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-shared-contexts": "^9.20.0", @@ -4074,16 +4050,16 @@ } }, "node_modules/@fluentui/react-teaching-popover": { - "version": "9.1.11", - "resolved": "https://registry.npmjs.org/@fluentui/react-teaching-popover/-/react-teaching-popover-9.1.11.tgz", - "integrity": "sha512-qjA764EpNLHgYg41KplqDpKc4OuA0zsEZmomO256Q5MdLpaj6A5tPcpWb/cHb3XsdKHoOysbW4V3Fd9Gn1XBIQ==", + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@fluentui/react-teaching-popover/-/react-teaching-popover-9.1.12.tgz", + "integrity": "sha512-bzZQWZRgOWGNbohu0MKIbjQkQiosgBBetBvUrJZiQsV3Dw8rKuU1TyRBNbLuSyA0AOGPR0NHQBkbCkfnMgnKBQ==", "dependencies": { "@fluentui/react-aria": "^9.13.2", "@fluentui/react-button": "^9.3.87", "@fluentui/react-context-selector": "^9.1.65", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.42", - "@fluentui/react-popover": "^9.9.15", + "@fluentui/react-popover": "^9.9.16", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-tabster": "^9.22.3", "@fluentui/react-theme": "^9.1.19", @@ -4119,11 +4095,11 @@ } }, "node_modules/@fluentui/react-textarea": { - "version": "9.3.83", - "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.3.83.tgz", - "integrity": "sha512-Oiy5Ahkx44Gpm3g0rch1YyskW7xejiF5gWNR0LgoNJVSFeOS5eHz6GdHOva710IOGVQf71408uFZLancXxFz0A==", + "version": "9.3.84", + "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.3.84.tgz", + "integrity": "sha512-ORBGHRX4rJMo3CMVt459KJucPSIo5liedQjs5Uzlp5eJsWuWQdWj0j9bKf34wNc3kD+ciyDrjGI4xSgaRd30OQ==", "dependencies": { - "@fluentui/react-field": "^9.1.71", + "@fluentui/react-field": "^9.1.72", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-theme": "^9.1.19", @@ -4173,15 +4149,15 @@ } }, "node_modules/@fluentui/react-toolbar": { - "version": "9.1.90", - "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.1.90.tgz", - "integrity": "sha512-nN/18X/ef2uwJ6uDQOq1yv71RGuwOXUVXZHcMdp7OuePqb9G33S9p1s4dp8TFeBO2yzNOB3kh1hNswVVQ4PyFw==", + "version": "9.1.91", + "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.1.91.tgz", + "integrity": "sha512-mkrtSd95uT2udBgHZXseAtSSziqm6BB0nRi4NEoXvRj9fbJTTP54Xb/HM6LZYEp+cxzcbNLPvKQzNw+Sh3VHow==", "dependencies": { "@fluentui/react-button": "^9.3.87", "@fluentui/react-context-selector": "^9.1.65", "@fluentui/react-divider": "^9.2.73", "@fluentui/react-jsx-runtime": "^9.0.42", - "@fluentui/react-radio": "^9.2.27", + "@fluentui/react-radio": "^9.2.28", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-tabster": "^9.22.3", "@fluentui/react-theme": "^9.1.19", @@ -4197,14 +4173,14 @@ } }, "node_modules/@fluentui/react-tooltip": { - "version": "9.4.34", - "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.4.34.tgz", - "integrity": "sha512-mwyuCEiFrVGmyU/W/U2VVGT9i9uKKQMXNoy1NDGjARs7gzxXRvsFr0xME+7PhA8gyvK393rDn9d5aK3XqmuDVA==", + "version": "9.4.35", + "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.4.35.tgz", + "integrity": "sha512-UgFRwNaOYCgMv88ds5kBZY6NPsj5eH5RYSw09WsXPpeow84eDSovH4iAW3iduDYThoFIYdJc4cUuhn49f131zQ==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.7", "@fluentui/react-jsx-runtime": "^9.0.42", "@fluentui/react-portal": "^9.4.31", - "@fluentui/react-positioning": "^9.15.6", + "@fluentui/react-positioning": "^9.15.7", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-tabster": "^9.22.3", "@fluentui/react-theme": "^9.1.19", @@ -4220,19 +4196,19 @@ } }, "node_modules/@fluentui/react-tree": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.7.5.tgz", - "integrity": "sha512-RShNuaSJPKIUPtX7SQ0VXJgWTcSOMjrZQMUQDibqK+YoV1xQbtgs0k3ykU1OeqtwUAdOWjywqwtism4jFlZENg==", + "version": "9.7.6", + "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.7.6.tgz", + "integrity": "sha512-AaOziw3wZ5yTGXs7cGIblR2noqVP2O785/0ZUFdMj0DredAfU7m2coIFrj64xa2W7FvVOueiUcGU8LBRzXarpQ==", "dependencies": { "@fluentui/keyboard-keys": "^9.0.7", "@fluentui/react-aria": "^9.13.2", - "@fluentui/react-avatar": "^9.6.33", + "@fluentui/react-avatar": "^9.6.34", "@fluentui/react-button": "^9.3.87", - "@fluentui/react-checkbox": "^9.2.32", + "@fluentui/react-checkbox": "^9.2.33", "@fluentui/react-context-selector": "^9.1.65", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.42", - "@fluentui/react-radio": "^9.2.27", + "@fluentui/react-radio": "^9.2.28", "@fluentui/react-shared-contexts": "^9.20.0", "@fluentui/react-tabster": "^9.22.3", "@fluentui/react-theme": "^9.1.19", @@ -4586,9 +4562,9 @@ } }, "node_modules/@griffel/core": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@griffel/core/-/core-1.17.1.tgz", - "integrity": "sha512-K3osVOktJ5nioY62idtkjLiIdVcazMwraNxkUMhLtoapDthnKVSC3+gYTuPCBZMdfLH5Hl5Y29YUClRlDjyb7g==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@griffel/core/-/core-1.18.0.tgz", + "integrity": "sha512-3Dkn6f7ULeSzJ1wLyLfN1vc+v3q5shuEejeMe4XymBozQo0l35WIfH8FWcwB+Xrgip4fLLOy1p3sYN85gFGZxw==", "dependencies": { "@emotion/hash": "^0.9.0", "@griffel/style-types": "^1.2.0", @@ -4599,11 +4575,11 @@ } }, "node_modules/@griffel/react": { - "version": "1.5.24", - "resolved": "https://registry.npmjs.org/@griffel/react/-/react-1.5.24.tgz", - "integrity": "sha512-WDxWyg182kL/aFCViybARAm/ZFVZoJDiW52pguveZx6cJvvc51esZ2qYJhsbMoy8cqOfnfOrWhOibdb89kgXAQ==", + "version": "1.5.25", + "resolved": "https://registry.npmjs.org/@griffel/react/-/react-1.5.25.tgz", + "integrity": "sha512-ZGiCdn71VIX56fd3AxM7ouCxgClPvunOFIpXxFKebGJ94/rdj4sIbahuI1QBUFuU4/bqUyD6QonjDEpFBl9ORw==", "dependencies": { - "@griffel/core": "^1.17.1", + "@griffel/core": "^1.18.0", "tslib": "^2.1.0" }, "peerDependencies": { @@ -5689,9 +5665,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.0.tgz", - "integrity": "sha512-JlPfZ/C7yn5S5p0yKk7uhHTTnFlvTgLetl2VxqE518QgyM7C9bSfFTYvB/Q/ftkq0RIPY4ySxTz+/wKJ/dXC0w==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.1.tgz", + "integrity": "sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww==", "cpu": [ "arm" ], @@ -5702,9 +5678,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.0.tgz", - "integrity": "sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.1.tgz", + "integrity": "sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A==", "cpu": [ "arm64" ], @@ -5715,9 +5691,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.0.tgz", - "integrity": "sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.1.tgz", + "integrity": "sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q==", "cpu": [ "arm64" ], @@ -5728,9 +5704,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.0.tgz", - "integrity": "sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.1.tgz", + "integrity": "sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA==", "cpu": [ "x64" ], @@ -5741,9 +5717,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.0.tgz", - "integrity": "sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.1.tgz", + "integrity": "sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q==", "cpu": [ "arm" ], @@ -5754,9 +5730,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz", - "integrity": "sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.1.tgz", + "integrity": "sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw==", "cpu": [ "arm" ], @@ -5767,9 +5743,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.0.tgz", - "integrity": "sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.1.tgz", + "integrity": "sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw==", "cpu": [ "arm64" ], @@ -5780,9 +5756,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.0.tgz", - "integrity": "sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.1.tgz", + "integrity": "sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw==", "cpu": [ "arm64" ], @@ -5793,9 +5769,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz", - "integrity": "sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.1.tgz", + "integrity": "sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ==", "cpu": [ "ppc64" ], @@ -5806,9 +5782,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.0.tgz", - "integrity": "sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.1.tgz", + "integrity": "sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A==", "cpu": [ "riscv64" ], @@ -5819,9 +5795,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz", - "integrity": "sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.1.tgz", + "integrity": "sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q==", "cpu": [ "s390x" ], @@ -5832,9 +5808,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.0.tgz", - "integrity": "sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.1.tgz", + "integrity": "sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q==", "cpu": [ "x64" ], @@ -5845,9 +5821,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.0.tgz", - "integrity": "sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.1.tgz", + "integrity": "sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q==", "cpu": [ "x64" ], @@ -5858,9 +5834,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.0.tgz", - "integrity": "sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.1.tgz", + "integrity": "sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA==", "cpu": [ "arm64" ], @@ -5871,9 +5847,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.0.tgz", - "integrity": "sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.1.tgz", + "integrity": "sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ==", "cpu": [ "ia32" ], @@ -5884,9 +5860,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.0.tgz", - "integrity": "sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.1.tgz", + "integrity": "sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg==", "cpu": [ "x64" ], @@ -6135,6 +6111,19 @@ } } }, + "node_modules/@testing-library/user-event": { + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", + "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", + "dev": true, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -6367,12 +6356,12 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.14.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz", - "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==", + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.0.0.tgz", + "integrity": "sha512-VT7KSYudcPOzP5Q0wfbowyNLaVR8QWUdw+088uFWwfvpY6uCWaXpqV6ieLAu9WBcnTa7H4Z5RLK8I5t2FuOcqw==", "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.11.1" } }, "node_modules/@types/parse-json": { @@ -6445,16 +6434,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.17.0.tgz", - "integrity": "sha512-pyiDhEuLM3PuANxH7uNYan1AaFs5XE0zw1hq69JBvGvE7gSuEoQl1ydtEe/XQeoC3GQxLXyOVa5kNOATgM638A==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.17.0", - "@typescript-eslint/type-utils": "7.17.0", - "@typescript-eslint/utils": "7.17.0", - "@typescript-eslint/visitor-keys": "7.17.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -6478,15 +6467,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.17.0.tgz", - "integrity": "sha512-puiYfGeg5Ydop8eusb/Hy1k7QmOU6X3nvsqCgzrB2K4qMavK//21+PzNE8qeECgNOIoertJPUC1SpegHDI515A==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.17.0", - "@typescript-eslint/types": "7.17.0", - "@typescript-eslint/typescript-estree": "7.17.0", - "@typescript-eslint/visitor-keys": "7.17.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4" }, "engines": { @@ -6506,13 +6495,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.17.0.tgz", - "integrity": "sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.17.0", - "@typescript-eslint/visitor-keys": "7.17.0" + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -6523,13 +6512,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.17.0.tgz", - "integrity": "sha512-XD3aaBt+orgkM/7Cei0XNEm1vwUxQ958AOLALzPlbPqb8C1G8PZK85tND7Jpe69Wualri81PLU+Zc48GVKIMMA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.17.0", - "@typescript-eslint/utils": "7.17.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -6550,9 +6539,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.17.0.tgz", - "integrity": "sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -6563,13 +6552,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.17.0.tgz", - "integrity": "sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.17.0", - "@typescript-eslint/visitor-keys": "7.17.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -6603,15 +6592,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.17.0.tgz", - "integrity": "sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.17.0", - "@typescript-eslint/types": "7.17.0", - "@typescript-eslint/typescript-estree": "7.17.0" + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -6625,12 +6614,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.17.0.tgz", - "integrity": "sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.17.0", + "@typescript-eslint/types": "7.18.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -7423,9 +7412,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001643", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz", - "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==", + "version": "1.0.30001645", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001645.tgz", + "integrity": "sha512-GFtY2+qt91kzyMk6j48dJcwJVq5uTkk71XxE3RtScx7XWRLsO7bU44LOFkOZYR8w9YMS0UhPSYpN/6rAMImmLw==", "dev": true, "funding": [ { @@ -7952,9 +7941,9 @@ } }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -8148,9 +8137,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.0.tgz", - "integrity": "sha512-Vb3xHHYnLseK8vlMJQKJYXJ++t4u1/qJ3vykuVrVjvdiOEhYyT1AuP4x03G8EnPmYvYOhe9T+dADTmthjRQMkA==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", + "integrity": "sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==", "dev": true }, "node_modules/emittery": { @@ -14136,9 +14125,9 @@ } }, "node_modules/monaco-editor": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.48.0.tgz", - "integrity": "sha512-goSDElNqFfw7iDHMg8WDATkfcyeLTNpBHQpO8incK6p5qZt5G/1j41X0xdGzpIkGojGXM+QiRQyLjnfDVvrpwA==" + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.50.0.tgz", + "integrity": "sha512-8CclLCmrRRh+sul7C08BmPBP3P8wVWfBHomsTcndxg5NRCEPfu/mc2AGU8k37ajjDVXcXFc12ORAMUkmk+lkFA==" }, "node_modules/ms": { "version": "2.1.2", @@ -14590,9 +14579,9 @@ } }, "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "version": "8.4.40", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", + "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", "dev": true, "funding": [ { @@ -15528,9 +15517,9 @@ } }, "node_modules/rollup": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.0.tgz", - "integrity": "sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.1.tgz", + "integrity": "sha512-K5vziVlg7hTpYfFBI+91zHBEMo6jafYXpkMlqZjg7/zhIG9iHqazBf4xz9AVdjS9BruRn280ROqLI7G3OFRIlw==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -15543,22 +15532,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.19.0", - "@rollup/rollup-android-arm64": "4.19.0", - "@rollup/rollup-darwin-arm64": "4.19.0", - "@rollup/rollup-darwin-x64": "4.19.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.19.0", - "@rollup/rollup-linux-arm-musleabihf": "4.19.0", - "@rollup/rollup-linux-arm64-gnu": "4.19.0", - "@rollup/rollup-linux-arm64-musl": "4.19.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.19.0", - "@rollup/rollup-linux-riscv64-gnu": "4.19.0", - "@rollup/rollup-linux-s390x-gnu": "4.19.0", - "@rollup/rollup-linux-x64-gnu": "4.19.0", - "@rollup/rollup-linux-x64-musl": "4.19.0", - "@rollup/rollup-win32-arm64-msvc": "4.19.0", - "@rollup/rollup-win32-ia32-msvc": "4.19.0", - "@rollup/rollup-win32-x64-msvc": "4.19.0", + "@rollup/rollup-android-arm-eabi": "4.19.1", + "@rollup/rollup-android-arm64": "4.19.1", + "@rollup/rollup-darwin-arm64": "4.19.1", + "@rollup/rollup-darwin-x64": "4.19.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.19.1", + "@rollup/rollup-linux-arm-musleabihf": "4.19.1", + "@rollup/rollup-linux-arm64-gnu": "4.19.1", + "@rollup/rollup-linux-arm64-musl": "4.19.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.19.1", + "@rollup/rollup-linux-riscv64-gnu": "4.19.1", + "@rollup/rollup-linux-s390x-gnu": "4.19.1", + "@rollup/rollup-linux-x64-gnu": "4.19.1", + "@rollup/rollup-linux-x64-musl": "4.19.1", + "@rollup/rollup-win32-arm64-msvc": "4.19.1", + "@rollup/rollup-win32-ia32-msvc": "4.19.1", + "@rollup/rollup-win32-x64-msvc": "4.19.1", "fsevents": "~2.3.2" } }, @@ -16152,9 +16141,9 @@ } }, "node_modules/stylelint": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.7.0.tgz", - "integrity": "sha512-Q1ATiXlz+wYr37a7TGsfvqYn2nSR3T/isw3IWlZQzFzCNoACHuGBb6xBplZXz56/uDRJHIygxjh7jbV/8isewA==", + "version": "16.8.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.8.1.tgz", + "integrity": "sha512-O8aDyfdODSDNz/B3gW2HQ+8kv8pfhSu7ZR7xskQ93+vI6FhKKGUJMQ03Ydu+w3OvXXE0/u4hWU4hCPNOyld+OA==", "dev": true, "funding": [ { @@ -16177,7 +16166,7 @@ "cosmiconfig": "^9.0.0", "css-functions-list": "^3.2.2", "css-tree": "^2.3.1", - "debug": "^4.3.5", + "debug": "^4.3.6", "fast-glob": "^3.3.2", "fastest-levenshtein": "^1.0.16", "file-entry-cache": "^9.0.0", @@ -16194,10 +16183,10 @@ "micromatch": "^4.0.7", "normalize-path": "^3.0.0", "picocolors": "^1.0.1", - "postcss": "^8.4.39", - "postcss-resolve-nested-selector": "^0.1.1", + "postcss": "^8.4.40", + "postcss-resolve-nested-selector": "^0.1.4", "postcss-safe-parser": "^7.0.0", - "postcss-selector-parser": "^6.1.0", + "postcss-selector-parser": "^6.1.1", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", @@ -16935,9 +16924,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.11.1.tgz", + "integrity": "sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ==", "dev": true }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -17221,9 +17210,9 @@ } }, "node_modules/vite": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", - "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", + "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", "dev": true, "dependencies": { "esbuild": "^0.21.3", @@ -17380,13 +17369,13 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", "dev": true, "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", "is-finalizationregistry": "^1.0.2", @@ -17395,8 +17384,8 @@ "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" diff --git a/package.json b/package.json index beea50c..61ff7f6 100644 --- a/package.json +++ b/package.json @@ -20,25 +20,25 @@ "dependencies": { "@automapper/core": "^8.8.1", "@automapper/pojos": "^8.8.1", - "@azure/msal-browser": "^3.14.0", + "@azure/msal-browser": "^3.20.0", "@azure/msal-react": "^2.0.22", - "@fluentui/react-components": "^9.51.1", + "@fluentui/react-components": "^9.54.7", "@fluentui/react-icons-mdl2": "^1.3.72", "@fluentui/react-icons-mdl2-branded": "^1.2.74", - "@microsoft/applicationinsights-react-js": "^17.2.0", - "@microsoft/applicationinsights-web": "^3.2.2", + "@microsoft/applicationinsights-react-js": "^17.3.0", + "@microsoft/applicationinsights-web": "^3.3.0", "@microsoft/microsoft-graph-client": "^3.0.7", "bytes": "^3.1.2", "mime": "^4.0.4", - "monaco-editor": "^0.48.0", + "monaco-editor": "^0.50.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-dropzone": "^14.2.3", "react-error-boundary": "^4.0.13", - "react-hook-form": "^7.51.5", + "react-hook-form": "^7.52.1", "react-intl": "^6.6.8", "react-markdown": "^9.0.1", - "react-router-dom": "^6.23.1", + "react-router-dom": "^6.25.1", "react-syntax-highlighter": "^15.5.0", "react-use": "^17.5.1", "rehype-raw": "^7.0.0", @@ -46,47 +46,48 @@ "ress": "^5.0.2" }, "devDependencies": { - "@babel/core": "^7.24.9", - "@babel/preset-env": "^7.24.8", + "@babel/core": "^7.25.2", + "@babel/preset-env": "^7.25.2", "@babel/preset-react": "^7.24.7", "@babel/preset-typescript": "^7.24.7", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/jest": "^11.11.0", - "@emotion/react": "^11.11.4", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/jest": "^11.13.0", + "@emotion/react": "^11.13.0", "@formatjs/cli": "^6.2.12", "@microsoft/microsoft-graph-types": "^2.40.0", "@testing-library/jest-dom": "^6.4.8", "@testing-library/react": "^15.0.7", + "@testing-library/user-event": "^14.5.2", "@types/bytes": "^3.1.4", "@types/jest": "^29.5.12", "@types/mime": "^3.0.4", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@types/react-syntax-highlighter": "^15.5.13", - "@typescript-eslint/eslint-plugin": "^7.9.0", - "@typescript-eslint/parser": "^7.9.0", - "@vitejs/plugin-react": "^4.2.1", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", + "@vitejs/plugin-react": "^4.3.1", "babel-jest": "^29.7.0", "babel-plugin-formatjs": "^10.5.16", "eslint": "^8.57.0", "eslint-config-standard": "^17.1.0", "eslint-plugin-hooks": "^0.4.3", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-react": "^7.34.4", + "eslint-plugin-react": "^7.35.0", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-sonarjs": "^1.0.4", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jest-junit": "^16.0.0", - "postcss": "^8.4.39", + "postcss": "^8.4.40", "postcss-scss": "^4.0.9", "postcss-styled-syntax": "^0.6.4", "sass": "^1.77.8", - "stylelint": "^16.5.0", + "stylelint": "^16.8.1", "stylelint-config-recess-order": "^5.0.1", "stylelint-config-standard-scss": "^13.1.0", - "typescript": "^5.4.5", - "vite": "^5.2.13" + "typescript": "^5.5.4", + "vite": "^5.3.5" }, "volta": { "node": "20.11.0" diff --git a/src/common/components/Communication.presenter.tsx b/src/common/components/Communication.presenter.tsx index 3b04312..fd778fa 100644 --- a/src/common/components/Communication.presenter.tsx +++ b/src/common/components/Communication.presenter.tsx @@ -37,6 +37,7 @@ function Communication(props: Readonly) { grid-template-rows: auto auto; grid-template-columns: auto; grid-gap: 2rem; + padding: 1rem; `}> {title}) { color: ${theme.colorNeutralForeground4}; `}> ) { } = props; const [ state, setState ] = React.useState({}); - const ref = React.useRef(null); const handleKeyDown = React.useCallback((event: KeyboardEvent) => { diff --git a/src/common/components/ScrollSynchronizer.tsx b/src/common/components/ScrollSynchronizer.tsx index bb84fa5..c4b59aa 100644 --- a/src/common/components/ScrollSynchronizer.tsx +++ b/src/common/components/ScrollSynchronizer.tsx @@ -43,7 +43,6 @@ function ScrollSynchronizer(props: Readonly) { const [ element1Position, setElement1Position ] = React.useState(defaultElement1Position); const [ element2Position, setElement2Position ] = React.useState(defaultElement2Position); - const element1Active = React.useRef(); const element1Size = React.useRef(); const element2Active = React.useRef(); diff --git a/src/common/components/SidePanel.presenter.tsx b/src/common/components/SidePanel.presenter.tsx index c633dd4..ffb6ee0 100644 --- a/src/common/components/SidePanel.presenter.tsx +++ b/src/common/components/SidePanel.presenter.tsx @@ -43,7 +43,7 @@ function SidePanel(props: Readonly>) { position="end" size="medium" css={css` - height: 100vh; + height: 100svh; `} onOpenChange={(event, data) => onOpenChange?.(event, data.open)}> diff --git a/src/common/components/Tree.tsx b/src/common/components/Tree.tsx index 12cc995..1c8c148 100644 --- a/src/common/components/Tree.tsx +++ b/src/common/components/Tree.tsx @@ -9,6 +9,7 @@ import React from 'react'; import { Event } from '../../types/Event'; +import { moveNext, movePrevious } from '../../utils/Keyboard'; import Presenter from './Tree.presenter'; @@ -29,31 +30,11 @@ function Tree(props: Readonly>) { const { key } = event as KeyboardEvent; switch (key) { case 'ArrowDown': { - const { current: element } = ref; - const items = element?.querySelectorAll('div[role="menuitem"]'); - if (items == null) { - break; - } - for (let i = 0; i < items?.length - 1; i++) { - if (items[i] === document.activeElement) { - items[i + 1].focus(); - break; - } - } + moveNext(ref.current, 'div[role="menuitem"]'); break; } case 'ArrowUp': { - const { current: element } = ref; - const items = element?.querySelectorAll('div[role="menuitem"]'); - if (items == null) { - break; - } - for (let i = 1; i < items?.length; i++) { - if (items[i] === document.activeElement) { - items[i - 1].focus(); - break; - } - } + movePrevious(ref.current, 'div[role="menuitem"]'); break; } default: diff --git a/src/common/components/TreeItem.presenter.tsx b/src/common/components/TreeItem.presenter.tsx index eb2f60c..5afe681 100644 --- a/src/common/components/TreeItem.presenter.tsx +++ b/src/common/components/TreeItem.presenter.tsx @@ -71,7 +71,8 @@ function TreeItem(props: Readonly) { background-color: ${theme.colorNeutralBackground2Hover}; } `} - onKeyDown={onKeyDown}> + onKeyDown={onKeyDown} + onTouchStart={onClick}>
) { } = props; const [ loading, setLoading ] = React.useState(true); - const ref = React.useRef(null); React.useEffect(() => { diff --git a/src/features/dialog/components/FileCopyDialog.tsx b/src/features/dialog/components/FileCopyDialog.tsx index aad4e19..24b7c20 100644 --- a/src/features/dialog/components/FileCopyDialog.tsx +++ b/src/features/dialog/components/FileCopyDialog.tsx @@ -32,9 +32,7 @@ function FileCopyDialog(props: Readonly) { const { value } = props; - const { - dispatch - } = useStore(); + const { dispatch } = useStore(); const { graph } = useService(); const [ loading, setLoading ] = React.useState(false); @@ -52,11 +50,7 @@ function FileCopyDialog(props: Readonly) { dispatch(setContentFile(file)); dispatch(setContentText(await graph.getFileText(file))); } catch (error) { - if (error instanceof Error) { - dispatch(setError(error)); - return; - } - throw error; + dispatch(setError(error as Error)); } finally { setLoading(false); dispatch(setDialogAction()); diff --git a/src/features/dialog/components/FileCreateDialog.tsx b/src/features/dialog/components/FileCreateDialog.tsx index a225d95..ceb68bf 100644 --- a/src/features/dialog/components/FileCreateDialog.tsx +++ b/src/features/dialog/components/FileCreateDialog.tsx @@ -55,11 +55,7 @@ function FileCreateDialog() { file: file?.id }); } catch (error) { - if (error instanceof Error) { - dispatch(setError(error)); - return; - } - throw error; + dispatch(setError(error as Error)); } finally { setLoading(false); dispatch(setDialogAction()); diff --git a/src/features/dialog/components/FileDeleteDialog.tsx b/src/features/dialog/components/FileDeleteDialog.tsx index 299c19e..5112a4b 100644 --- a/src/features/dialog/components/FileDeleteDialog.tsx +++ b/src/features/dialog/components/FileDeleteDialog.tsx @@ -65,11 +65,7 @@ function FileDeleteDialog(props: Readonly) { }); } } catch (error) { - if (error instanceof Error) { - dispatch(setError(error)); - return; - } - throw error; + dispatch(setError(error as Error)); } finally { setLoading(false); dispatch(setDialogAction()); diff --git a/src/features/dialog/components/FileOverwriteDialog.tsx b/src/features/dialog/components/FileOverwriteDialog.tsx index 06397d6..7469828 100644 --- a/src/features/dialog/components/FileOverwriteDialog.tsx +++ b/src/features/dialog/components/FileOverwriteDialog.tsx @@ -31,9 +31,7 @@ function FileOverwriteDialog(props: Readonly) { const { value } = props; - const { - dispatch - } = useStore(); + const { dispatch } = useStore(); const { graph } = useService(); const [ loading, setLoading ] = React.useState(false); @@ -52,10 +50,7 @@ function FileOverwriteDialog(props: Readonly) { } dispatch(removeExplorerFileConflict(value)); } catch (error) { - if (error instanceof Error) { - dispatch(setError(error)); - return; - } + dispatch(setError(error as Error)); throw error; } finally { setLoading(false); diff --git a/src/features/dialog/components/FileRenameDialog.tsx b/src/features/dialog/components/FileRenameDialog.tsx index c6c0950..6621638 100644 --- a/src/features/dialog/components/FileRenameDialog.tsx +++ b/src/features/dialog/components/FileRenameDialog.tsx @@ -63,18 +63,14 @@ function FileRenameDialog(props: Readonly) { })); } } catch (error) { - if (error instanceof Error) { - dispatch(setError(error)); - return; - } - throw error; + dispatch(setError(error as Error)); } finally { setLoading(false); dispatch(setDialogAction()); } }, [ - graph, contentProps?.file, + graph, dispatch ]); diff --git a/src/features/dialog/components/FileRestoreDialog.tsx b/src/features/dialog/components/FileRestoreDialog.tsx index 5b4b187..895195e 100644 --- a/src/features/dialog/components/FileRestoreDialog.tsx +++ b/src/features/dialog/components/FileRestoreDialog.tsx @@ -50,19 +50,15 @@ function FileDeleteDialog(props: Readonly) { await graph.restoreFile(value); dispatch(setContentText(await graph.getFileText(contentFile))); } catch (error) { - if (error instanceof Error) { - dispatch(setError(error)); - return; - } - throw error; + dispatch(setError(error as Error)); } finally { setLoading(false); dispatch(setDialogAction()); dispatch(setSidePanelAction()); } }, [ - graph, contentProps?.file, + graph, value, dispatch ]); diff --git a/src/features/dialog/components/FolderCreateDialog.tsx b/src/features/dialog/components/FolderCreateDialog.tsx index 81d287b..50c7b15 100644 --- a/src/features/dialog/components/FolderCreateDialog.tsx +++ b/src/features/dialog/components/FolderCreateDialog.tsx @@ -45,11 +45,7 @@ function FolderCreateDialog() { const folder = await graph.createFolder(selectedFolder, `${data.name}`); dispatch(appendExplorerFolder(folder)); } catch (error) { - if (error instanceof Error) { - dispatch(setError(error)); - return; - } - throw error; + dispatch(setError(error as Error)); } finally { setLoading(false); dispatch(setDialogAction()); diff --git a/src/features/dialog/components/FolderDeleteDialog.tsx b/src/features/dialog/components/FolderDeleteDialog.tsx index 358655b..1531277 100644 --- a/src/features/dialog/components/FolderDeleteDialog.tsx +++ b/src/features/dialog/components/FolderDeleteDialog.tsx @@ -28,9 +28,7 @@ function FileDeleteDialog(props: Readonly) { const { value } = props; - const { - dispatch - } = useStore(); + const { dispatch } = useStore(); const { graph } = useService(); const [ loading, setLoading ] = React.useState(false); @@ -42,11 +40,7 @@ function FileDeleteDialog(props: Readonly) { await graph.deleteFolder(value); dispatch(removeExplorerFolder(value)); } catch (error) { - if (error instanceof Error) { - dispatch(setError(error)); - return; - } - throw error; + dispatch(setError(error as Error)); } finally { setLoading(false); dispatch(setDialogAction()); diff --git a/src/features/dialog/components/FolderRenameDialog.tsx b/src/features/dialog/components/FolderRenameDialog.tsx index 5df3cc9..62462f0 100644 --- a/src/features/dialog/components/FolderRenameDialog.tsx +++ b/src/features/dialog/components/FolderRenameDialog.tsx @@ -46,11 +46,7 @@ function FolderRenameDialog(props: Readonly) { const folder = await graph.renameFolder(data, data.name); dispatch(updateExplorerFolder(folder)); } catch (error) { - if (error instanceof Error) { - dispatch(setError(error)); - return; - } - throw error; + dispatch(setError(error as Error)); } finally { setLoading(false); dispatch(setDialogAction()); diff --git a/src/features/dialog/components/LinkCopyDialog.presenter.tsx b/src/features/dialog/components/LinkCopyDialog.presenter.tsx new file mode 100644 index 0000000..ad3da51 --- /dev/null +++ b/src/features/dialog/components/LinkCopyDialog.presenter.tsx @@ -0,0 +1,116 @@ +// +// Copyright (c) 2023-2024 karamem0 +// +// This software is released under the MIT License. +// +// https://github.com/karamem0/hitofude/blob/main/LICENSE +// + +import React from 'react'; + +import { FormattedMessage, useIntl } from 'react-intl'; + +import { + Button, + DialogActions, + DialogBody, + DialogContent, + DialogSurface, + DialogTitle, + DialogTrigger, + Input, + MessageBar, + MessageBarTitle +} from '@fluentui/react-components'; +import { CopyIcon } from '@fluentui/react-icons-mdl2'; + +import { css } from '@emotion/react'; + +import ModalDialog from '../../../common/components/ModalDialog'; +import { EventHandler } from '../../../types/Event'; +import messages from '../messages'; + +interface LinkCopyDialogProps { + copied?: boolean, + value?: string, + onCopy?: EventHandler +} + +function LinkCopyDialog(props: Readonly) { + + const { + copied, + value, + onCopy + } = props; + + const intl = useIntl(); + + return ( + + + + + + + +
+ { + copied ? ( + + + + + + ) : ( + + )} + onClick={onCopy} /> + )} /> + ) + } +
+
+ + + + + +
+
+
+ ); + +} + +export default React.memo(LinkCopyDialog); diff --git a/src/features/dialog/components/LinkCopyDialog.tsx b/src/features/dialog/components/LinkCopyDialog.tsx new file mode 100644 index 0000000..8c8ccdc --- /dev/null +++ b/src/features/dialog/components/LinkCopyDialog.tsx @@ -0,0 +1,39 @@ +// +// Copyright (c) 2023-2024 karamem0 +// +// This software is released under the MIT License. +// +// https://github.com/karamem0/hitofude/blob/main/LICENSE +// + +import React from 'react'; + +import Presenter from './LinkCopyDialog.presenter'; + +interface LinkCopyDialogProps { + value?: string +} + +function LinkCopyDialog(props: Readonly) { + + const { value } = props; + + const [ copied, setCopied ] = React.useState(false); + + const handleCopy = React.useCallback(async () => { + await navigator.clipboard.writeText(value ?? ''); + setCopied(true); + }, [ + value + ]); + + return ( + + ); + +} + +export default LinkCopyDialog; diff --git a/src/features/dialog/factories/DialogFactory.presenter.tsx b/src/features/dialog/factories/DialogFactory.presenter.tsx index 9680130..57f4de6 100644 --- a/src/features/dialog/factories/DialogFactory.presenter.tsx +++ b/src/features/dialog/factories/DialogFactory.presenter.tsx @@ -25,6 +25,7 @@ import FileRestoreDialog from '../components/FileRestoreDialog'; import FolderCreateDialog from '../components/FolderCreateDialog'; import FolderDeleteDialog from '../components/FolderDeleteDialog'; import FolderRenameDialog from '../components/FolderRenameDialog'; +import LinkCopyDialog from '../components/LinkCopyDialog'; import ThemeChangeDialog from '../components/ThemeChangeDialog'; interface DialogFactoryProps { @@ -46,6 +47,10 @@ function DialogFactory(props: Readonly) { return ( ); + case DialogType.copyLink: + return ( + + ); case DialogType.createFile: return ( diff --git a/src/features/dialog/messages.ts b/src/features/dialog/messages.ts index 520b5c3..31d0a16 100644 --- a/src/features/dialog/messages.ts +++ b/src/features/dialog/messages.ts @@ -12,7 +12,9 @@ const messages = defineMessages({ Cancel: { defaultMessage: 'Cancel' }, ChangeTheme: { defaultMessage: 'Change theme' }, Close: { defaultMessage: 'Close' }, + Copy: { defaultMessage: 'Copy' }, CopyFile: { defaultMessage: 'Copy file' }, + CopyLink: { defaultMessage: 'Copy link' }, Dark: { defaultMessage: 'Dark' }, DeleteFile: { defaultMessage: 'Delete file' }, DeleteFileConfirm: { defaultMessage: 'Are you sure to delete this file?' }, @@ -21,6 +23,8 @@ const messages = defineMessages({ FileName: { defaultMessage: 'File name' }, FolderName: { defaultMessage: 'Folder name' }, Light: { defaultMessage: 'Light' }, + Link: { defaultMessage: 'Link' }, + LinkCopied: { defaultMessage: 'Link copied' }, No: { defaultMessage: 'No' }, OK: { defaultMessage: 'OK' }, OverwriteFile: { defaultMessage: 'Overwrite file' }, diff --git a/src/features/explorer/components/ExplorerFileConflictButton.tsx b/src/features/explorer/components/ExplorerFileConflictButton.tsx index e66c4dc..8cf0669 100644 --- a/src/features/explorer/components/ExplorerFileConflictButton.tsx +++ b/src/features/explorer/components/ExplorerFileConflictButton.tsx @@ -25,9 +25,7 @@ interface ExplorerFileConflictButtonProps { function ExplorerFileConflictButton(props: Readonly) { - const { - file - } = props; + const { file } = props; const { dispatch, diff --git a/src/features/explorer/components/ExplorerFileMenuList.presenter.tsx b/src/features/explorer/components/ExplorerFileMenuList.presenter.tsx index c4c6e07..3d2ed8c 100644 --- a/src/features/explorer/components/ExplorerFileMenuList.presenter.tsx +++ b/src/features/explorer/components/ExplorerFileMenuList.presenter.tsx @@ -20,6 +20,7 @@ import { CopyIcon, DeleteIcon, DownloadDocumentIcon, + LinkIcon, RenameIcon } from '@fluentui/react-icons-mdl2'; import { @@ -67,6 +68,21 @@ function ExplorerFileMenuList(props: Readonly) { })}> + + )} + onClick={(event) => onMenuClick?.(event, { + type: ExplorerMenuType.copyLink, + data: file + })}> + + diff --git a/src/features/explorer/components/ExplorerFileMenuList.tsx b/src/features/explorer/components/ExplorerFileMenuList.tsx index afd9fcf..b68a4aa 100644 --- a/src/features/explorer/components/ExplorerFileMenuList.tsx +++ b/src/features/explorer/components/ExplorerFileMenuList.tsx @@ -28,9 +28,7 @@ interface ExplorerFileMenuListProps { function ExplorerFileMenuList(props: Readonly) { - const { - dispatch - } = useStore(); + const { dispatch } = useStore(); const handleMenuClick = React.useCallback((_: Event, data?: ExplorerMenuAction) => { switch (data?.type) { @@ -45,6 +43,17 @@ function ExplorerFileMenuList(props: Readonly) { })); break; } + case ExplorerMenuType.copyLink: { + const value = data?.data as File | undefined; + if (value?.webUrl == null) { + throw new ArgumentNullError(); + } + dispatch(setDialogAction({ + type: DialogType.copyLink, + data: value.webUrl + })); + break; + } case ExplorerMenuType.deleteFile: { const value = data?.data as File | undefined; if (value == null) { diff --git a/src/features/explorer/components/ExplorerFileTreeItem.tsx b/src/features/explorer/components/ExplorerFileTreeItem.tsx index de6670f..ec2eaff 100644 --- a/src/features/explorer/components/ExplorerFileTreeItem.tsx +++ b/src/features/explorer/components/ExplorerFileTreeItem.tsx @@ -20,9 +20,7 @@ interface ExplorerFileTreeItemProps { function ExplorerFileTreeItem(props: Readonly) { - const { - onClick - } = props; + const { onClick } = props; const { state: { diff --git a/src/features/explorer/components/ExplorerFolderMenuList.presenter.tsx b/src/features/explorer/components/ExplorerFolderMenuList.presenter.tsx index c2401ce..cd23032 100644 --- a/src/features/explorer/components/ExplorerFolderMenuList.presenter.tsx +++ b/src/features/explorer/components/ExplorerFolderMenuList.presenter.tsx @@ -16,7 +16,11 @@ import { MenuItem, MenuList } from '@fluentui/react-components'; -import { DeleteIcon, RenameIcon } from '@fluentui/react-icons-mdl2'; +import { + DeleteIcon, + LinkIcon, + RenameIcon +} from '@fluentui/react-icons-mdl2'; import { OneDriveLogoIcon } from '@fluentui/react-icons-mdl2-branded'; @@ -45,6 +49,24 @@ function ExplorerFolderMenuList(props: Readonly) { return folder ? ( + + + )} + onClick={(event) => onMenuClick?.(event, { + type: ExplorerMenuType.copyLink, + data: folder + })}> + + + + ) { - const { - dispatch - } = useStore(); + const { dispatch } = useStore(); const handleMenuClick = React.useCallback((_: Event, data?: ExplorerMenuAction) => { switch (data?.type) { + case ExplorerMenuType.copyLink: { + const value = data?.data as Folder | undefined; + if (value?.webUrl == null) { + throw new ArgumentNullError(); + } + dispatch(setDialogAction({ + type: DialogType.copyLink, + data: value.webUrl + })); + break; + } case ExplorerMenuType.deleteFolder: { const value = data?.data as Folder | undefined; if (value == null) { diff --git a/src/features/explorer/components/ExplorerHeaderMenuList.presenter.tsx b/src/features/explorer/components/ExplorerHeaderMenuList.presenter.tsx index 17d5586..f4ed9fc 100644 --- a/src/features/explorer/components/ExplorerHeaderMenuList.presenter.tsx +++ b/src/features/explorer/components/ExplorerHeaderMenuList.presenter.tsx @@ -18,6 +18,7 @@ import { } from '@fluentui/react-components'; import { Hide3Icon, + LinkIcon, PageAddIcon, RefreshIcon, ViewIcon @@ -102,6 +103,24 @@ function ExplorerHeaderMenuList(props: Readonly) { + + + )} + onClick={(event) => onMenuClick?.(event, { + type: ExplorerMenuType.copyLink, + data: selectedFolder + })}> + + + + { switch (data?.type) { + case ExplorerMenuType.copyLink: { + const value = data?.data as Folder | undefined; + if (value?.webUrl == null) { + throw new ArgumentNullError(); + } + dispatch(setDialogAction({ + type: DialogType.copyLink, + data: value.webUrl + })); + break; + } case ExplorerMenuType.createFile: { dispatch(setDialogAction({ type: DialogType.createFile, @@ -66,12 +77,16 @@ function ExplorerHeaderMenuList() { break; } case ExplorerMenuType.refreshFolder: { - const value = data?.data as Folder | undefined; - if (value == null) { - throw new ArgumentNullError(); + try { + const value = data?.data as Folder | undefined; + if (value == null) { + throw new ArgumentNullError(); + } + const folder = await graph.getFolderById(value.id); + dispatch(setExplorerSelectedFolder(folder)); + } catch (error) { + dispatch(setError(error as Error)); } - const folder = await graph.getFolderById(value.id); - dispatch(setExplorerSelectedFolder(folder)); break; } case ExplorerMenuType.toggleAllFiles: { diff --git a/src/features/explorer/components/ExplorerTabPanel.presenter.tsx b/src/features/explorer/components/ExplorerTabPanel.presenter.tsx index 3b08a86..9fb057e 100644 --- a/src/features/explorer/components/ExplorerTabPanel.presenter.tsx +++ b/src/features/explorer/components/ExplorerTabPanel.presenter.tsx @@ -20,12 +20,7 @@ import Tree from '../../../common/components/Tree'; import TreeHeader from '../../../common/components/TreeHeader'; import { useTheme } from '../../../providers/ThemeProvider'; import { EventHandler } from '../../../types/Event'; -import { - DialogAction, - DialogType, - File, - Folder -} from '../../../types/Model'; +import { File, Folder } from '../../../types/Model'; import { isEmpty } from '../../../utils/Folder'; import messages from '../messages'; import { DropEventData } from '../types/Event'; @@ -38,8 +33,8 @@ interface ExplorerTabPanelProps { allFiles?: boolean, fileConflicts?: File[], selectedFolder?: Folder, + onCreateFile?: EventHandler, onDropFiles?: EventHandler, - onOpenDialog?: EventHandler, onSelectFile?: EventHandler, onSelectFolder?: EventHandler } @@ -49,8 +44,8 @@ function ExplorerTabPanel(props: Readonly) { const { allFiles, selectedFolder, + onCreateFile, onDropFiles, - onOpenDialog, onSelectFile, onSelectFolder } = props; @@ -81,9 +76,9 @@ function ExplorerTabPanel(props: Readonly) { @@ -146,10 +141,7 @@ function ExplorerTabPanel(props: Readonly) { line-height: 1rem; `} /> )} - onClick={(event) => onOpenDialog?.(event, { - type: DialogType.createFile, - data: null - })}> + onClick={onCreateFile}>
diff --git a/src/features/explorer/components/ExplorerTabPanel.tsx b/src/features/explorer/components/ExplorerTabPanel.tsx index 752b32e..ff8326e 100644 --- a/src/features/explorer/components/ExplorerTabPanel.tsx +++ b/src/features/explorer/components/ExplorerTabPanel.tsx @@ -17,7 +17,8 @@ import { setExplorerSelectedFolder, appendExplorerFile, appendExplorerFileConflict, - setExplorerSelectedFile + setExplorerSelectedFile, + setDialogAction } from '../../../stores/Action'; import { ArgumentNullError, @@ -26,7 +27,7 @@ import { FileNotFoundError } from '../../../types/Error'; import { Event } from '../../../types/Event'; -import { ProgressType, TabType } from '../../../types/Model'; +import { DialogType, ProgressType, TabType } from '../../../types/Model'; import { fromFile } from '../../../utils/Blob'; import { isSupportedFile } from '../../../utils/File'; import { DropEventData } from '../types/Event'; @@ -38,7 +39,6 @@ function ExplorerTabPanel() { const { route } = useRoute(); const { dispatch, - onOpenDialog, state: { explorerProps } @@ -47,45 +47,48 @@ function ExplorerTabPanel() { const { setProgress } = useProgress(); const handleDropFiles = React.useCallback(async (_: Event, data?: DropEventData) => { - const folder = explorerProps?.selectedFolder; - if (data == null) { - throw new ArgumentNullError(); - } - if (folder == null) { - throw new DependencyNullError(); - } - setProgress(ProgressType.upload); - for (const acceptedFile of data.acceptedFiles) { - const fileName = acceptedFile.name; - const fileBlob = fromFile(acceptedFile); - try { - const file = await Promise.resolve() - .then(() => graph.createFile(folder, fileName, fileBlob)) - .then((file) => graph.getFileById(file.id)); - dispatch(appendExplorerFile(file)); - route.setParams({ - tab: TabType.explorer, - folder: folder.id, - file: file?.id - }); - } catch (error) { - if (error instanceof FileConflictError) { - const file = folder.files?.find((item) => item.fullName === fileName); - if (file == null) { - throw new FileNotFoundError(); + try { + const folder = explorerProps?.selectedFolder; + if (data == null) { + throw new ArgumentNullError(); + } + if (folder == null) { + throw new DependencyNullError(); + } + setProgress(ProgressType.upload); + for (const acceptedFile of data.acceptedFiles) { + const fileName = acceptedFile.name; + const fileBlob = fromFile(acceptedFile); + try { + const file = await Promise.resolve() + .then(() => graph.createFile(folder, fileName, fileBlob)) + .then((file) => graph.getFileById(file.id)); + dispatch(appendExplorerFile(file)); + route.setParams({ + tab: TabType.explorer, + folder: folder.id, + file: file?.id + }); + } catch (error) { + if (error instanceof FileConflictError) { + const file = folder.files?.find((item) => item.fullName === fileName); + if (file == null) { + throw new FileNotFoundError(); + } + dispatch(appendExplorerFileConflict({ + id: file.id, + name: fileName, + data: fileBlob + })); + } else { + throw error; } - dispatch(appendExplorerFileConflict({ - id: file.id, - name: fileName, - data: fileBlob - })); - continue; } - dispatch(setError(error as Error)); - return; } + setProgress(); + } catch (error) { + dispatch(setError(error as Error)); } - setProgress(); }, [ explorerProps?.selectedFolder, graph, @@ -94,6 +97,15 @@ function ExplorerTabPanel() { setProgress ]); + const handleCreateFile = React.useCallback(() => { + dispatch(setDialogAction({ + type: DialogType.createFile, + data: undefined + })); + }, [ + dispatch + ]); + const handleSelectFile = React.useCallback(async (_: Event, data?: string) => { try { if (data == null) { @@ -153,8 +165,8 @@ function ExplorerTabPanel() { return ( ); diff --git a/src/features/explorer/messages.ts b/src/features/explorer/messages.ts index 0e71a77..4744ad6 100644 --- a/src/features/explorer/messages.ts +++ b/src/features/explorer/messages.ts @@ -11,6 +11,7 @@ import { defineMessages } from 'react-intl'; const messages = defineMessages({ ConflictFile: { defaultMessage: 'Conflict file' }, CopyFile: { defaultMessage: 'Copy file' }, + CopyLink: { defaultMessage: 'Copy link' }, DeleteFile: { defaultMessage: 'Delete file' }, DeleteFolder: { defaultMessage: 'Delete folder' }, Download: { defaultMessage: 'Download' }, diff --git a/src/features/main/components/AppBar.tsx b/src/features/main/components/AppBar.tsx index 8d96fab..825ae95 100644 --- a/src/features/main/components/AppBar.tsx +++ b/src/features/main/components/AppBar.tsx @@ -18,6 +18,7 @@ import { DialogType, TabType } from '../../../types/Model'; +import { moveNext, movePrevious } from '../../../utils/Keyboard'; import Presenter from './AppBar.presenter'; @@ -32,7 +33,6 @@ function AppBar() { tabProps } } = useStore(); - const ref = React.useRef(null); const handleMenuClick = React.useCallback((_: Event, data?: AppBarMenuAction) => { @@ -87,31 +87,11 @@ function AppBar() { const { key } = event as KeyboardEvent; switch (key) { case 'ArrowDown': { - const { current: element } = ref; - const items = element?.querySelectorAll('button'); - if (items == null) { - break; - } - for (let i = 0; i < items?.length - 1; i++) { - if (items[i] === document.activeElement) { - items[i + 1].focus(); - break; - } - } + moveNext(ref.current, 'button'); break; } case 'ArrowUp': { - const { current: element } = ref; - const items = element?.querySelectorAll('button'); - if (items == null) { - break; - } - for (let i = 1; i < items?.length; i++) { - if (items[i] === document.activeElement) { - items[i - 1].focus(); - break; - } - } + movePrevious(ref.current, 'button'); break; } default: diff --git a/src/features/main/components/ContentMarkdown.tsx b/src/features/main/components/ContentMarkdown.tsx index 5d99788..8ca074a 100644 --- a/src/features/main/components/ContentMarkdown.tsx +++ b/src/features/main/components/ContentMarkdown.tsx @@ -37,7 +37,6 @@ function ContentMarkdown(props: Readonly) { tabProps } } = useStore(); - const editorRef = React.useRef(null); const handleScrollPositionChange = React.useCallback((_: Event, data?: ScrollPosition) => { diff --git a/src/features/main/components/ContentSupported.tsx b/src/features/main/components/ContentSupported.tsx index 1c6c9e7..00a1582 100644 --- a/src/features/main/components/ContentSupported.tsx +++ b/src/features/main/components/ContentSupported.tsx @@ -38,22 +38,14 @@ function ContentSupported() { const { setProgress } = useProgress(); const handleCancel = React.useCallback(() => { - try { - dispatch(setContentScrollPosition()); - dispatch(setContentEditing(false)); - } catch (error) { - dispatch(setError(error as Error)); - } + dispatch(setContentScrollPosition()); + dispatch(setContentEditing(false)); }, [ dispatch ]); const handleEdit = React.useCallback(() => { - try { - dispatch(setContentEditing(true)); - } catch (error) { - dispatch(setError(error as Error)); - } + dispatch(setContentEditing(true)); }, [ dispatch ]); diff --git a/src/features/main/components/MeControl.tsx b/src/features/main/components/MeControl.tsx index 992bec3..fb5ee4c 100644 --- a/src/features/main/components/MeControl.tsx +++ b/src/features/main/components/MeControl.tsx @@ -23,7 +23,10 @@ function MeControl() { const msal = useMsal(); const { graph } = useService(); const [ photo, setPhoto ] = React.useState(); - const account = msal.instance.getActiveAccount(); + + const account = React.useMemo(() => msal.instance.getActiveAccount(), [ + msal + ]); const handleSignOut = React.useCallback(async () => { await msal.instance.logoutRedirect({ diff --git a/src/features/main/pages/MainPage.presenter.tsx b/src/features/main/pages/MainPage.presenter.tsx index e573f7c..8f3b419 100644 --- a/src/features/main/pages/MainPage.presenter.tsx +++ b/src/features/main/pages/MainPage.presenter.tsx @@ -94,18 +94,20 @@ function MainPage(props: Readonly) {
div:last-of-type { position: fixed; - width: calc(100vw - 3rem); - margin: 0 0 0 3rem; + width: calc(100vw - ${layouts.appBar.width}); + height: ${layouts.pageBody.height}; + margin: 0 0 0 ${layouts.appBar.width}; } } @media not all and (width <= 960px) { - grid-template-rows: ${layouts.pageBody.height}; + grid-template-rows: auto; grid-template-columns: auto auto 1fr; & > div:last-of-type { position: static; diff --git a/src/features/markdown/components/MarkdownEditor.tsx b/src/features/markdown/components/MarkdownEditor.tsx index e780e9a..638cb6b 100644 --- a/src/features/markdown/components/MarkdownEditor.tsx +++ b/src/features/markdown/components/MarkdownEditor.tsx @@ -61,7 +61,6 @@ function MarkdownEditor(props: Readonly, ref: React.Ref(null); const monacoRef = React.useRef(); diff --git a/src/features/markdown/components/MarkdownImageRenderer.tsx b/src/features/markdown/components/MarkdownImageRenderer.tsx index 890a7b5..9f6ffeb 100644 --- a/src/features/markdown/components/MarkdownImageRenderer.tsx +++ b/src/features/markdown/components/MarkdownImageRenderer.tsx @@ -42,7 +42,6 @@ function MarkdownImageRenderer(props: Readonly) { } } = useStore(); const { graph } = useService(); - const [ state, setState ] = React.useState(); React.useEffect(() => { diff --git a/src/features/panel/components/FileVersionPanel.tsx b/src/features/panel/components/FileVersionPanel.tsx index b17e2a1..89a80c3 100644 --- a/src/features/panel/components/FileVersionPanel.tsx +++ b/src/features/panel/components/FileVersionPanel.tsx @@ -33,7 +33,6 @@ function FileVersionPanel(props: Readonly) { const { dispatch } = useStore(); const { graph } = useService(); - const [ items, setItems ] = React.useState(); const handleRestore = React.useCallback((_: Event, data?: DialogAction) => { diff --git a/src/features/search/components/SearchFileTreeItem.presenter.tsx b/src/features/search/components/SearchFileTreeItem.presenter.tsx index 5e0f6aa..8d33d5f 100644 --- a/src/features/search/components/SearchFileTreeItem.presenter.tsx +++ b/src/features/search/components/SearchFileTreeItem.presenter.tsx @@ -11,10 +11,16 @@ import React from 'react'; import { FormattedMessage } from 'react-intl'; import { + MenuDivider, + MenuGroup, MenuItem, MenuList } from '@fluentui/react-components'; -import { OpenFolderHorizontalIcon, TextDocumentIcon } from '@fluentui/react-icons-mdl2'; +import { + LinkIcon, + OpenFolderHorizontalIcon, + TextDocumentIcon +} from '@fluentui/react-icons-mdl2'; import { css } from '@emotion/react'; @@ -60,21 +66,41 @@ function SearchFileTreeItem(props: Readonly) { )} menu={( - + + )} + onClick={(event) => onMenuClick?.(event, { + type: SearchMenuType.copyLink, + data: item + })}> + + + + + + )} - onClick={(event) => onMenuClick?.(event, { - type: SearchMenuType.openFileLocation, - data: item.id - })}> - - + onClick={(event) => onMenuClick?.(event, { + type: SearchMenuType.openFileLocation, + data: item + })}> + + + )} onClick={(event) => onClick?.(event, item)} /> diff --git a/src/features/search/components/SearchFileTreeItem.tsx b/src/features/search/components/SearchFileTreeItem.tsx index 80b5704..187ab9e 100644 --- a/src/features/search/components/SearchFileTreeItem.tsx +++ b/src/features/search/components/SearchFileTreeItem.tsx @@ -11,10 +11,11 @@ import React from 'react'; import { useRoute } from '../../../providers/RouteProvider'; import { useService } from '../../../providers/ServiceProvider'; import { useStore } from '../../../providers/StoreProvider'; -import { setError } from '../../../stores/Action'; +import { setDialogAction, setError } from '../../../stores/Action'; import { ArgumentNullError, FolderNotFoundError } from '../../../types/Error'; import { Event } from '../../../types/Event'; import { + DialogType, File, SearchMenuAction, SearchMenuType, @@ -36,13 +37,29 @@ function SearchFileTreeItem() { const handleMenuClick = React.useCallback(async (_: Event, data?: SearchMenuAction) => { switch (data?.type) { + case SearchMenuType.copyLink: { + try { + const value = data?.data as File | undefined; + if (value?.id == null) { + throw new ArgumentNullError(); + } + const file = await graph.getFileById(value?.id); + dispatch(setDialogAction({ + type: DialogType.copyLink, + data: file.webUrl + })); + } catch (error) { + dispatch(setError(error as Error)); + } + break; + } case SearchMenuType.openFileLocation: { try { - const value = data?.data as string; - if (value == null) { + const value = data?.data as File | undefined; + if (value?.id == null) { throw new ArgumentNullError(); } - const file = await graph.getFileById(value); + const file = await graph.getFileById(value.id); if (file.parentId == null) { throw new FolderNotFoundError(); } @@ -50,7 +67,7 @@ function SearchFileTreeItem() { route.setParams({ tab: TabType.explorer, folder: folder.id, - file: value + file: value.id }); } catch (error) { dispatch(setError(error as Error)); @@ -67,22 +84,17 @@ function SearchFileTreeItem() { ]); const handleClick = React.useCallback(async (_: Event, data?: File) => { - try { - if (data == null) { - throw new ArgumentNullError(); - } - route.setParams({ - tab: TabType.search, - search: searchProps?.query, - file: data.id - }); - } catch (error) { - dispatch(setError(error as Error)); + if (data == null) { + throw new ArgumentNullError(); } + route.setParams({ + tab: TabType.search, + search: searchProps?.query, + file: data.id + }); }, [ - searchProps?.query, route, - dispatch + searchProps?.query ]); return ( diff --git a/src/features/search/components/SearchTabPanel.presenter.tsx b/src/features/search/components/SearchTabPanel.presenter.tsx index b05bcb7..bebb6e8 100644 --- a/src/features/search/components/SearchTabPanel.presenter.tsx +++ b/src/features/search/components/SearchTabPanel.presenter.tsx @@ -16,7 +16,7 @@ import { Input, Text } from '@fluentui/react-components'; -import { ClearIcon } from '@fluentui/react-icons-mdl2'; +import { CancelIcon } from '@fluentui/react-icons-mdl2'; import { css } from '@emotion/react'; @@ -63,9 +63,9 @@ function SearchTabPanel(props: Readonly) { @@ -95,10 +95,10 @@ function SearchTabPanel(props: Readonly) { size="small" tabIndex={0} icon={( - )} onClick={(event) => onClear?.(event, field.name)} /> diff --git a/src/features/search/components/SearchTabPanel.tsx b/src/features/search/components/SearchTabPanel.tsx index bd8ffc3..7a161fb 100644 --- a/src/features/search/components/SearchTabPanel.tsx +++ b/src/features/search/components/SearchTabPanel.tsx @@ -12,7 +12,6 @@ import { useForm } from 'react-hook-form'; import { useRoute } from '../../../providers/RouteProvider'; import { useStore } from '../../../providers/StoreProvider'; -import { setError } from '../../../stores/Action'; import { ArgumentNullError } from '../../../types/Error'; import { Event } from '../../../types/Event'; import { TabType } from '../../../types/Model'; @@ -24,7 +23,6 @@ function SearchTabPanel() { const { route } = useRoute(); const { - dispatch, state: { searchProps } @@ -32,40 +30,30 @@ function SearchTabPanel() { const form = useForm(); const handleClear = React.useCallback((_: Event, data?: SearchTabPanelFormField) => { - try { - if (data == null) { - throw new ArgumentNullError(); - } - form.setValue(data, ''); - route.setParams({ - tab: TabType.search, - search: '' - }); - } catch (error) { - dispatch(setError(error as Error)); + if (data == null) { + throw new ArgumentNullError(); } + form.setValue(data, ''); + route.setParams({ + tab: TabType.search, + search: '' + }); }, [ form, - route, - dispatch + route ]); const handleSubmit = React.useCallback(async (_: Event, data?: SearchTabPanelFormState) => { - try { - if (data?.query == null) { - throw new ArgumentNullError(); - } - route.setParams({ - tab: TabType.search, - search: data.query - }); - } catch (error) { - dispatch(setError(error as Error)); + if (data?.query == null) { + throw new ArgumentNullError(); } + route.setParams({ + tab: TabType.search, + search: data.query + }); }, [ - route, - dispatch + route ]); React.useEffect(() => { diff --git a/src/features/search/messages.ts b/src/features/search/messages.ts index 22cef45..4be27f2 100644 --- a/src/features/search/messages.ts +++ b/src/features/search/messages.ts @@ -9,6 +9,7 @@ import { defineMessages } from 'react-intl'; const messages = defineMessages({ + CopyLink: { defaultMessage: 'Copy link' }, OpenFileLocation: { defaultMessage: 'Open file location' }, Search: { defaultMessage: 'Search' } }); diff --git a/src/providers/StoreProvider.tsx b/src/providers/StoreProvider.tsx index 4a09c80..1cbf531 100644 --- a/src/providers/StoreProvider.tsx +++ b/src/providers/StoreProvider.tsx @@ -8,11 +8,10 @@ import React from 'react'; -import { setDialogAction, setError, setInitialState } from '../stores/Action'; +import { setInitialState } from '../stores/Action'; import { reducer } from '../stores/Reducer'; -import { ArgumentNullError, InvalidOperationError } from '../types/Error'; -import { Event, EventHandler } from '../types/Event'; -import { DialogAction, ThemeName } from '../types/Model'; +import { InvalidOperationError } from '../types/Error'; +import { ThemeName } from '../types/Model'; import { Action, State } from '../types/Store'; import { useService } from './ServiceProvider'; @@ -20,9 +19,7 @@ import { useTheme } from './ThemeProvider'; interface StoreContextState { dispatch: React.Dispatch, - state: State, - onOpenDialog: EventHandler, - onOpenUrl?: EventHandler + state: State } const StoreContext = React.createContext(undefined); @@ -48,39 +45,12 @@ function StoreProvider(props: Readonly>) { const [ loading, setLoading ] = React.useState(true); - const handleOpenDialog = React.useCallback((_: Event, data?: DialogAction) => { - try { - dispatch(setDialogAction(data)); - } catch (error) { - dispatch(setError(error as Error)); - } - }, [ - dispatch - ]); - - const handleOpenUrl = React.useCallback((_: Event, data?: string) => { - try { - if (data == null) { - throw new ArgumentNullError(); - } - window.open(data, '_blank', 'noreferrer'); - } catch (error) { - dispatch(setError(error as Error)); - } - }, [ - dispatch - ]); - const value = React.useMemo(() => ({ dispatch, - state, - onOpenDialog: handleOpenDialog, - onOpenUrl: handleOpenUrl + state }), [ state, - dispatch, - handleOpenDialog, - handleOpenUrl + dispatch ]); React.useEffect(() => { diff --git a/src/themes/Layout.ts b/src/themes/Layout.ts index b43d36b..417221d 100644 --- a/src/themes/Layout.ts +++ b/src/themes/Layout.ts @@ -7,6 +7,9 @@ // export const layouts = { + appBar: { + width: '3.5rem' + }, appTab: { maxWidth: 'calc(100vw - 4rem)', width: '20rem' diff --git a/src/translations/compiled/en.json b/src/translations/compiled/en.json index 389ddbd..cf063cb 100644 --- a/src/translations/compiled/en.json +++ b/src/translations/compiled/en.json @@ -35,6 +35,12 @@ "value": "Cancel" } ], + "4l6vz1": [ + { + "type": 0, + "value": "Copy" + } + ], "5929Xm": [ { "type": 0, @@ -173,6 +179,12 @@ "value": "Version" } ], + "JBWS0c": [ + { + "type": 0, + "value": "Link" + } + ], "JEsxDw": [ { "type": 0, @@ -377,6 +389,12 @@ "value": "Folder name" } ], + "lbr3Lq": [ + { + "type": 0, + "value": "Copy link" + } + ], "mJN/zn": [ { "type": 0, @@ -484,5 +502,11 @@ "type": 0, "value": "Drag and drop files here" } + ], + "zU/q1N": [ + { + "type": 0, + "value": "Link copied" + } ] } \ No newline at end of file diff --git a/src/translations/compiled/ja.json b/src/translations/compiled/ja.json index d5ad972..52c03d6 100644 --- a/src/translations/compiled/ja.json +++ b/src/translations/compiled/ja.json @@ -35,6 +35,12 @@ "value": "キャンセル" } ], + "4l6vz1": [ + { + "type": 0, + "value": "コピー" + } + ], "5929Xm": [ { "type": 0, @@ -173,6 +179,12 @@ "value": "バージョン" } ], + "JBWS0c": [ + { + "type": 0, + "value": "リンク" + } + ], "JEsxDw": [ { "type": 0, @@ -377,6 +389,12 @@ "value": "フォルダー名" } ], + "lbr3Lq": [ + { + "type": 0, + "value": "リンクのコピー" + } + ], "mJN/zn": [ { "type": 0, @@ -484,5 +502,11 @@ "type": 0, "value": "ここにファイルをドラッグ アンド ドロップ" } + ], + "zU/q1N": [ + { + "type": 0, + "value": "リンクをコピーしました" + } ] } \ No newline at end of file diff --git a/src/translations/en.json b/src/translations/en.json index fa1585d..d59c9a3 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -5,6 +5,7 @@ "14KiwR": "There is nothing here", "3cc4Ct": "Light", "47FYwb": "Cancel", + "4l6vz1": "Copy", "5929Xm": "Change theme", "5KHmz1": "Minimap", "5q3qC0": "Download", @@ -28,6 +29,7 @@ "HKsvaG": "Hide other files", "HjkLKL": "Unsupported file format", "I3b4hn": "Version", + "JBWS0c": "Link", "JEsxDw": "Uploading...", "JqiqNj": "Something went wrong", "LYCry0": "Conflict file", @@ -62,6 +64,7 @@ "jvo0vs": "Save", "kAEQyV": "OK", "lR/7o8": "Folder name", + "lbr3Lq": "Copy link", "mJN/zn": "Explorer", "oUWADl": "No", "olfaAj": "The file with the name does not exists", @@ -79,5 +82,6 @@ "xXbJso": "Sign out", "xhRkpH": "Word wrap", "xmcVZ0": "Search", - "xyET3x": "Drag and drop files here" + "xyET3x": "Drag and drop files here", + "zU/q1N": "Link copied" } diff --git a/src/translations/ja.json b/src/translations/ja.json index ad019c8..1954eb4 100644 --- a/src/translations/ja.json +++ b/src/translations/ja.json @@ -5,6 +5,7 @@ "14KiwR": "ここには何もありません", "3cc4Ct": "ライト", "47FYwb": "キャンセル", + "4l6vz1": "コピー", "5929Xm": "外観の変更", "5KHmz1": "ミニマップ", "5q3qC0": "ダウンロード", @@ -28,6 +29,7 @@ "HKsvaG": "その他のファイルを非表示", "HjkLKL": "サポートされていないファイル形式です", "I3b4hn": "バージョン", + "JBWS0c": "リンク", "JEsxDw": "アップロードしています...", "JqiqNj": "問題が発生しました", "LYCry0": "ファイルが競合しています", @@ -62,6 +64,7 @@ "jvo0vs": "保存", "kAEQyV": "OK", "lR/7o8": "フォルダー名", + "lbr3Lq": "リンクのコピー", "mJN/zn": "エクスプローラー", "oUWADl": "いいえ", "olfaAj": "指定した名前のファイルは存在しません", @@ -79,5 +82,6 @@ "xXbJso": "サインアウト", "xhRkpH": "行の折り返し", "xmcVZ0": "検索", - "xyET3x": "ここにファイルをドラッグ アンド ドロップ" + "xyET3x": "ここにファイルをドラッグ アンド ドロップ", + "zU/q1N": "リンクをコピーしました" } diff --git a/src/types/Model.ts b/src/types/Model.ts index 5ceb485..50f746e 100644 --- a/src/types/Model.ts +++ b/src/types/Model.ts @@ -52,6 +52,7 @@ export interface DialogAction { export enum DialogType { changeTheme = 'changeTheme', copyFile = 'copyFile', + copyLink = 'copyLink', createFile = 'createFile', createFolder = 'createFolder', deleteFile = 'deleteFile', @@ -69,6 +70,7 @@ export interface ExplorerMenuAction { export enum ExplorerMenuType { copyFile = 'copyFile', + copyLink = 'copyLink', createFile = 'createFile', createFolder = 'createFolder', deleteFile = 'deleteFile', @@ -159,6 +161,7 @@ export interface SearchMenuAction { } export enum SearchMenuType { + copyLink = 'copyLink', openFileLocation = 'openFileLocation' } diff --git a/src/utils/Keyboard.test.tsx b/src/utils/Keyboard.test.tsx new file mode 100644 index 0000000..8dcd476 --- /dev/null +++ b/src/utils/Keyboard.test.tsx @@ -0,0 +1,82 @@ +// +// Copyright (c) 2023-2024 karamem0 +// +// This software is released under the MIT License. +// +// https://github.com/karamem0/hitofude/blob/main/LICENSE +// + +import React from 'react'; + +import { render } from '@testing-library/react'; +import { userEvent } from '@testing-library/user-event'; + +import { moveNext, movePrevious } from './Keyboard'; + +describe('moveNext', () => { + + it('should change focus to the next node', async () => { + const user = userEvent.setup(); + const { getByTestId } = render( +
+ + + +
+ ); + await user.tab(); + await user.tab(); + moveNext(getByTestId('root'), 'button'); + expect(document.activeElement).toBe(getByTestId('baz')); + }); + + it('should not change focus if it is the last node', async () => { + const user = userEvent.setup(); + const { getByTestId } = render( +
+ + + +
+ ); + await user.tab(); + await user.tab(); + await user.tab(); + moveNext(getByTestId('root'), 'button'); + expect(document.activeElement).toBe(getByTestId('baz')); + }); + +}); + +describe('movePrevious', () => { + + it('should change focus to the previous node', async () => { + const user = userEvent.setup(); + const { getByTestId } = render( +
+ + + +
+ ); + await user.tab(); + await user.tab(); + movePrevious(getByTestId('root'), 'button'); + expect(document.activeElement).toBe(getByTestId('foo')); + }); + + it('should not change focus if it is the first node', async () => { + const user = userEvent.setup(); + const { getByTestId } = render( +
+ + + +
+ ); + await user.tab(); + movePrevious(getByTestId('root'), 'button'); + expect(document.activeElement).toBe(getByTestId('foo')); + }); + +}); diff --git a/src/utils/Keyboard.ts b/src/utils/Keyboard.ts new file mode 100644 index 0000000..32bbdd0 --- /dev/null +++ b/src/utils/Keyboard.ts @@ -0,0 +1,33 @@ +// +// Copyright (c) 2023-2024 karamem0 +// +// This software is released under the MIT License. +// +// https://github.com/karamem0/hitofude/blob/main/LICENSE +// + +export function moveNext(value: HTMLElement | null | undefined, query: string) : HTMLElement | undefined { + const items = value?.querySelectorAll(query); + if (items == null) { + return; + } + for (let index = 0; index < items?.length - 1; index++) { + if (items[index] === document.activeElement) { + items[index + 1].focus(); + return items[index + 1]; + } + } +} + +export function movePrevious(value: HTMLElement | null | undefined, query: string) : HTMLElement | undefined { + const items = value?.querySelectorAll(query); + if (items == null) { + return; + } + for (let index = 1; index < items?.length; index++) { + if (items[index] === document.activeElement) { + items[index - 1].focus(); + return items[index - 1]; + } + } +}