From 7375c5d01c5cf99d59a7d89ea6ea904729a2fe53 Mon Sep 17 00:00:00 2001 From: xingsy97 <87063252+xingsy97@users.noreply.github.com> Date: Tue, 16 Jul 2024 09:33:34 +0800 Subject: [PATCH 1/6] add test client --- .github/workflows/release_extension.yml | 2 +- tools/vscode-azurewebpubsub/.vscodeignore | 2 + tools/vscode-azurewebpubsub/package-lock.json | 1616 ++++++++++++++++- tools/vscode-azurewebpubsub/package.json | 38 +- tools/vscode-azurewebpubsub/package.nls.json | 1 + tools/vscode-azurewebpubsub/src/commands.ts | 8 +- tools/vscode-azurewebpubsub/src/extension.ts | 2 +- .../src/panels/BasePanel.ts | 112 ++ .../src/panels/TestClientWebviewPanel.ts | 79 + tools/vscode-azurewebpubsub/src/utils.ts | 52 +- .../service/testClient/testClient.ts | 19 + tools/vscode-azurewebpubsub/tsconfig.json | 14 +- .../webview-ui/.gitignore | 7 + .../webview-ui/README.md | 10 + .../webview-ui/index.html | 15 + .../webview-ui/package.json | 34 + .../webview-ui/src/App.css | 155 ++ .../webview-ui/src/App.tsx | 19 + .../webview-ui/src/components/Dashboard.css | 117 ++ .../webview-ui/src/components/Dashboard.tsx | 76 + .../src/components/ResizablePanel.tsx | 38 + .../webview-ui/src/components/Tabs.tsx | 48 + .../webview-ui/src/components/TrafficItem.tsx | 26 + .../webview-ui/src/components/icons.tsx | 151 ++ .../components/workflows/StatusIndicator.tsx | 25 + .../webview-ui/src/index.tsx | 17 + .../webview-ui/src/models.ts | 60 + .../webview-ui/src/panels/ClientPanel.tsx | 13 + .../webview-ui/src/panels/Playground.css | 14 + .../webview-ui/src/panels/Playground.tsx | 185 ++ .../panels/sections/SimpleClientSection.tsx | 162 ++ .../sections/SubprotocolClientSection.css | 8 + .../sections/SubprotocolClientSection.tsx | 521 ++++++ .../webview-ui/src/providers/DataContext.tsx | 31 + .../webview-ui/src/providers/IDataFetcher.tsx | 11 + .../providers/VSCodeExtensionDataFetcher.tsx | 50 + .../webview-ui/src/utilities/vscode.ts | 78 + .../webview-ui/src/vite-env.d.ts | 1 + .../webview-ui/tsconfig.json | 20 + .../webview-ui/vite.config.ts | 19 + 40 files changed, 3828 insertions(+), 28 deletions(-) create mode 100644 tools/vscode-azurewebpubsub/src/panels/BasePanel.ts create mode 100644 tools/vscode-azurewebpubsub/src/panels/TestClientWebviewPanel.ts create mode 100644 tools/vscode-azurewebpubsub/src/workflows/service/testClient/testClient.ts create mode 100644 tools/vscode-azurewebpubsub/webview-ui/.gitignore create mode 100644 tools/vscode-azurewebpubsub/webview-ui/README.md create mode 100644 tools/vscode-azurewebpubsub/webview-ui/index.html create mode 100644 tools/vscode-azurewebpubsub/webview-ui/package.json create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/App.css create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/App.tsx create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/components/Dashboard.css create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/components/Dashboard.tsx create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/components/ResizablePanel.tsx create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/components/Tabs.tsx create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/components/TrafficItem.tsx create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/components/icons.tsx create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/components/workflows/StatusIndicator.tsx create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/index.tsx create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/models.ts create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/panels/ClientPanel.tsx create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/panels/Playground.css create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/panels/Playground.tsx create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/panels/sections/SimpleClientSection.tsx create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/panels/sections/SubprotocolClientSection.css create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/panels/sections/SubprotocolClientSection.tsx create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/providers/DataContext.tsx create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/providers/IDataFetcher.tsx create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/providers/VSCodeExtensionDataFetcher.tsx create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/utilities/vscode.ts create mode 100644 tools/vscode-azurewebpubsub/webview-ui/src/vite-env.d.ts create mode 100644 tools/vscode-azurewebpubsub/webview-ui/tsconfig.json create mode 100644 tools/vscode-azurewebpubsub/webview-ui/vite.config.ts diff --git a/.github/workflows/release_extension.yml b/.github/workflows/release_extension.yml index 75a75b6d0..6dd062fc3 100644 --- a/.github/workflows/release_extension.yml +++ b/.github/workflows/release_extension.yml @@ -28,7 +28,7 @@ jobs: node-version: 18 - name: Build and Pack - run: npm install && npm run build && npm run package + run: npm install:all && npm run build:all && npm run package - name: Get Metadata id: metadata_step diff --git a/tools/vscode-azurewebpubsub/.vscodeignore b/tools/vscode-azurewebpubsub/.vscodeignore index c2ce5b418..ba6c60cf0 100644 --- a/tools/vscode-azurewebpubsub/.vscodeignore +++ b/tools/vscode-azurewebpubsub/.vscodeignore @@ -24,3 +24,5 @@ tsconfig.json tslint.json typings/** webpack.config* +webview-ui/** +!webview-ui/build \ No newline at end of file diff --git a/tools/vscode-azurewebpubsub/package-lock.json b/tools/vscode-azurewebpubsub/package-lock.json index 900ed4a8e..677fa57e9 100644 --- a/tools/vscode-azurewebpubsub/package-lock.json +++ b/tools/vscode-azurewebpubsub/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-azurewebpubsub", - "version": "0.0.1-beta.1", + "version": "0.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "vscode-azurewebpubsub", - "version": "0.0.1-beta.1", + "version": "0.1.1", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@azure/arm-monitor": "^7.0.0", @@ -14,6 +14,9 @@ "@azure/arm-webpubsub": "^2.0.0-beta.2", "@azure/core-rest-pipeline": "1.10.3", "@azure/storage-blob": "^12.4.1", + "@azure/web-pubsub": "^1.1.1", + "@fluentui/react": "^8.106.3", + "@fluentui/react-components": "^9.34.1", "@microsoft/vscode-azext-azureutils": "^2.0.0", "@microsoft/vscode-azext-utils": "^2.1.3", "@microsoft/vscode-azureresources-api": "^2.2.1", @@ -397,6 +400,34 @@ "node": ">=12.0.0" } }, + "node_modules/@azure/web-pubsub": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@azure/web-pubsub/-/web-pubsub-1.1.1.tgz", + "integrity": "sha512-YqPVPv3KX36LIsboNOlF2qjTj1HMWExcFOOH1QIFpbv9ptXI2McIrr5goScgLTtDWO0JIFJjz0sKSWucWPgb1w==", + "dependencies": { + "@azure/core-auth": "^1.3.0", + "@azure/core-client": "^1.0.0", + "@azure/core-rest-pipeline": "^1.1.0", + "@azure/core-tracing": "^1.0.0", + "@azure/logger": "^1.0.0", + "jsonwebtoken": "^9.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -428,6 +459,11 @@ "node": ">=10.0.0" } }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -484,12 +520,1434 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", + "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/devtools": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/devtools/-/devtools-0.2.1.tgz", + "integrity": "sha512-8PHJLbD6VhBh+LJ1uty/Bz30qs02NXCE5u8WpOhSewlYXUWl03GNXknr9AS2yaAWJEQaY27x7eByJs44gODBcw==", + "peerDependencies": { + "@floating-ui/dom": ">=1.5.4" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", + "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" + }, + "node_modules/@fluentui/date-time-utilities": { + "version": "8.6.8", + "resolved": "https://registry.npmjs.org/@fluentui/date-time-utilities/-/date-time-utilities-8.6.8.tgz", + "integrity": "sha512-WoWO5eFI1c4TUgsQjTeOaCtnx6HQvuK36EdwF2Gyt/axhVvr3yjB7CWYqmVxIJ4BJsZ/lMfjGqR5sZ1w22G6pA==", + "dependencies": { + "@fluentui/set-version": "^8.2.22", + "tslib": "^2.1.0" + } + }, + "node_modules/@fluentui/dom-utilities": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/@fluentui/dom-utilities/-/dom-utilities-2.3.6.tgz", + "integrity": "sha512-/Qz/J2rdMAwh4Bk8Z+E/Fy40XUVw5IunezIsd/CJ7z1gOfNdBjRoD9XsrVkcUHbOaTTR6daUCLdWMcZtVgu0jA==", + "dependencies": { + "@fluentui/set-version": "^8.2.22", + "tslib": "^2.1.0" + } + }, + "node_modules/@fluentui/font-icons-mdl2": { + "version": "8.5.44", + "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.44.tgz", + "integrity": "sha512-PjhTL8I5Eia8wMFlPCWdzjYCcgAX8Wn/Fc2yfSFnwqGacY1Cox66mnoU9+QBMRWwQ1bxPbe0cV6Kcpm//MhVxw==", + "dependencies": { + "@fluentui/set-version": "^8.2.22", + "@fluentui/style-utilities": "^8.10.15", + "@fluentui/utilities": "^8.15.10", + "tslib": "^2.1.0" + } + }, + "node_modules/@fluentui/foundation-legacy": { + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.4.10.tgz", + "integrity": "sha512-NBKMsuhdEPEzRbycO73SIZ0nPzYLPufsgqwelEp4L8+KA6myMK0IdLVY1XjxBY+u1EYLVMOeLnU306MsWZE/Yw==", + "dependencies": { + "@fluentui/merge-styles": "^8.6.10", + "@fluentui/set-version": "^8.2.22", + "@fluentui/style-utilities": "^8.10.15", + "@fluentui/utilities": "^8.15.10", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "react": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/keyboard-key": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/@fluentui/keyboard-key/-/keyboard-key-0.4.22.tgz", + "integrity": "sha512-ZPneS+paMjl6f1SzFt52zK2WNyDoqD7/dSb6GXZtxXXKwxOMAg+7MjJt9O5qXGMmJ7rZ6ZPe51tVN6qCrxdfTA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@fluentui/keyboard-keys": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@fluentui/keyboard-keys/-/keyboard-keys-9.0.7.tgz", + "integrity": "sha512-vaQ+lOveQTdoXJYqDQXWb30udSfTVcIuKk1rV0X0eGAgcHeSDeP1HxMy+OgHOQZH3OiBH4ZYeWxb+tmfiDiygQ==", + "dependencies": { + "@swc/helpers": "^0.5.1" + } + }, + "node_modules/@fluentui/merge-styles": { + "version": "8.6.10", + "resolved": "https://registry.npmjs.org/@fluentui/merge-styles/-/merge-styles-8.6.10.tgz", + "integrity": "sha512-RHpziut4Ki36cv0dJQgi4v/+0gcw55wYHD89mKu2DZuF/rxb2+/yE36ohXg+TBU0RSOD208QKlufyId4ARn4TA==", + "dependencies": { + "@fluentui/set-version": "^8.2.22", + "tslib": "^2.1.0" + } + }, + "node_modules/@fluentui/priority-overflow": { + "version": "9.1.13", + "resolved": "https://registry.npmjs.org/@fluentui/priority-overflow/-/priority-overflow-9.1.13.tgz", + "integrity": "sha512-yDojVpkhBZTXOYExrCgW1GXbw3x9pYIS617xlNJIc2t06Cd3H32y2p51QXFt94sBmlVyAvPu7UKBHaq1Yw7u+w==", + "dependencies": { + "@swc/helpers": "^0.5.1" + } + }, + "node_modules/@fluentui/react": { + "version": "8.106.3", + "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.106.3.tgz", + "integrity": "sha512-Ag0XqcgnCmbDy60c6Lihsxud8qAwdcT+vq5IGAKKxqklFoFjpMDnFbE2qAJRsd9CTnQsMBlHccVa2j4M+6IjYA==", + "dependencies": { + "@fluentui/date-time-utilities": "^8.5.5", + "@fluentui/font-icons-mdl2": "^8.5.11", + "@fluentui/foundation-legacy": "^8.2.31", + "@fluentui/merge-styles": "^8.5.6", + "@fluentui/react-focus": "^8.8.17", + "@fluentui/react-hooks": "^8.6.18", + "@fluentui/react-portal-compat-context": "^9.0.4", + "@fluentui/react-window-provider": "^2.2.7", + "@fluentui/set-version": "^8.2.5", + "@fluentui/style-utilities": "^8.9.4", + "@fluentui/theme": "^2.6.24", + "@fluentui/utilities": "^8.13.8", + "@microsoft/load-themed-styles": "^1.10.26", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "@types/react-dom": ">=16.8.0 <19.0.0", + "react": ">=16.8.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-accordion": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.4.1.tgz", + "integrity": "sha512-xvQWtpnHVn4c8MCcCVUyoq284AtmQCvH4Dyd0kJUT13j8JwLSh2NxW0XPR+gutfoOVSlShEtpRFXdV0RO1ApsQ==", + "dependencies": { + "@fluentui/react-aria": "^9.12.1", + "@fluentui/react-context-selector": "^9.1.62", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-alert": { + "version": "9.0.0-beta.83", + "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.83.tgz", + "integrity": "sha512-uLyBa8V4z86IAX8MwDficjVDeZGHCmWrCszePnY+0T7JSC1ryZjj1DaMuzH87+LpN4rVsP/WOaZekgqY7KYfHA==", + "dependencies": { + "@fluentui/react-avatar": "^9.5.37", + "@fluentui/react-button": "^9.3.46", + "@fluentui/react-icons": "^2.0.217", + "@fluentui/react-jsx-runtime": "^9.0.14", + "@fluentui/react-tabster": "^9.13.4", + "@fluentui/react-theme": "^9.1.14", + "@fluentui/react-utilities": "^9.14.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.14.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-aria": { + "version": "9.12.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.12.1.tgz", + "integrity": "sha512-YKI1e/rzOsC2x0OMjOEMY/YCPETA6P0/LV1N8UzeFSYU2NyRavacLpYfRY7LfQjCYqFfM5eHd3uWOQfuzjPPmw==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-utilities": "^9.18.10", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-avatar": { + "version": "9.6.30", + "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.6.30.tgz", + "integrity": "sha512-oujqsEzLgTUBkvcvTYM4WIi5DNOac0oATtOfMYSk5ws+kh0nPA5umUSC505snG2KrWySrpxHZeX/SaG8MZgHvA==", + "dependencies": { + "@fluentui/react-badge": "^9.2.38", + "@fluentui/react-context-selector": "^9.1.62", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-popover": "^9.9.12", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-tooltip": "^9.4.31", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-badge": { + "version": "9.2.38", + "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.2.38.tgz", + "integrity": "sha512-Tc9zJQLWr/+O2x2IGPBTlnC18TXtvFqA7MTeQK+GRrGPmmDR24wdubuJHDRvkHT7olF+bcpVf6v96kry+9eIKA==", + "dependencies": { + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-button": { + "version": "9.3.84", + "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.3.84.tgz", + "integrity": "sha512-tZX4mt2dUIguTOmBYGEL555sRnf8H9MIrqD8YsBU+2sADBWgaYOoajoZrN6TUXkmpQoG5AYggwscqJcFICzeQg==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.12.1", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-card": { + "version": "9.0.84", + "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.0.84.tgz", + "integrity": "sha512-P3mOPT4ON62tNrMXI79RZSbj789nt+E6B5gRX2/cuTLbiMyrOepaF4zsYRE4+8tX7YFiKbv45xobRI/Oe31WRg==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-checkbox": { + "version": "9.2.29", + "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.2.29.tgz", + "integrity": "sha512-3KIY50KQ+i3Iwqi165zRo/kZ7sjeLoFX5yYYB3BXpqNey+EGP6zhm1C7NAOy3d6dUlREbOHHxbM+9QUHtgUv1w==", + "dependencies": { + "@fluentui/react-field": "^9.1.68", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-label": "^9.1.71", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-combobox": { + "version": "9.11.8", + "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.11.8.tgz", + "integrity": "sha512-qOKRnotJ53cBWVtSfJ3ZM1cpJ05Fzidfsygz351Jw6Gk8CKgvO9Vi9EvpadP8rrWcnr1GcPhnW2KGP9qsEFnJQ==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.12.1", + "@fluentui/react-context-selector": "^9.1.62", + "@fluentui/react-field": "^9.1.68", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-portal": "^9.4.28", + "@fluentui/react-positioning": "^9.15.3", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-components": { + "version": "9.34.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.34.1.tgz", + "integrity": "sha512-fiBAnKw2ayD+hpqYAjmWwHkN4f58XGOTYf2yPhtIbFHJiZIMx6Jwk4pyPhegOEGc4RAQFhKgT3dyblS50r3Ubg==", + "dependencies": { + "@fluentui/react-accordion": "^9.3.19", + "@fluentui/react-alert": "9.0.0-beta.83", + "@fluentui/react-avatar": "^9.5.37", + "@fluentui/react-badge": "^9.2.6", + "@fluentui/react-button": "^9.3.46", + "@fluentui/react-card": "^9.0.45", + "@fluentui/react-checkbox": "^9.1.47", + "@fluentui/react-combobox": "^9.5.21", + "@fluentui/react-dialog": "^9.7.6", + "@fluentui/react-divider": "^9.2.42", + "@fluentui/react-drawer": "9.0.0-beta.32", + "@fluentui/react-field": "^9.1.34", + "@fluentui/react-image": "^9.1.39", + "@fluentui/react-infobutton": "9.0.0-beta.67", + "@fluentui/react-input": "^9.4.44", + "@fluentui/react-label": "^9.1.42", + "@fluentui/react-link": "^9.1.25", + "@fluentui/react-menu": "^9.12.23", + "@fluentui/react-overflow": "^9.0.37", + "@fluentui/react-persona": "^9.2.47", + "@fluentui/react-popover": "^9.8.12", + "@fluentui/react-portal": "^9.3.21", + "@fluentui/react-positioning": "^9.9.18", + "@fluentui/react-progress": "^9.1.44", + "@fluentui/react-provider": "^9.10.4", + "@fluentui/react-radio": "^9.1.47", + "@fluentui/react-select": "^9.1.44", + "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-skeleton": "^9.0.32", + "@fluentui/react-slider": "^9.1.47", + "@fluentui/react-spinbutton": "^9.2.44", + "@fluentui/react-spinner": "^9.3.22", + "@fluentui/react-switch": "^9.1.47", + "@fluentui/react-table": "^9.10.2", + "@fluentui/react-tabs": "^9.3.48", + "@fluentui/react-tabster": "^9.13.4", + "@fluentui/react-tags": "^9.0.1", + "@fluentui/react-text": "^9.3.39", + "@fluentui/react-textarea": "^9.3.44", + "@fluentui/react-theme": "^9.1.14", + "@fluentui/react-toast": "^9.3.8", + "@fluentui/react-toolbar": "^9.1.47", + "@fluentui/react-tooltip": "^9.3.13", + "@fluentui/react-tree": "^9.4.2", + "@fluentui/react-utilities": "^9.14.1", + "@fluentui/react-virtualizer": "9.0.0-alpha.48", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.14.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0", + "scheduler": "^0.19.0 || ^0.20.0" + } + }, + "node_modules/@fluentui/react-context-selector": { + "version": "9.1.62", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.62.tgz", + "integrity": "sha512-XXSCkqzisRWGjckdkZLLx0uYnQyfwa0xedEB6HMMeCnJqYWj4aFj27IhQC25UQ2SMdrl1vnjdfqUYjn6G3NsAQ==", + "dependencies": { + "@fluentui/react-utilities": "^9.18.10", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0", + "scheduler": ">=0.19.0 <=0.23.0" + } + }, + "node_modules/@fluentui/react-dialog": { + "version": "9.11.2", + "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.11.2.tgz", + "integrity": "sha512-us1JbZ7iucDyJyd372sJQqdcJPCgQJLsxR3OFVoecQ+wOC66eLKTHHKhyHhdIRem/dfpm8X1mzEmrj+ipws1jQ==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.12.1", + "@fluentui/react-context-selector": "^9.1.62", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-motion": "^9.2.0", + "@fluentui/react-portal": "^9.4.28", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-divider": { + "version": "9.2.70", + "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.2.70.tgz", + "integrity": "sha512-PtPAQp+j9icisZrmZR65LLug/uk/cWBdyQAMKse6jKmF/274xp9M9xuB833fgryJ3NIMp+dVHsJT8XJxhMVHcQ==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-drawer": { + "version": "9.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.0.0-beta.32.tgz", + "integrity": "sha512-O0tyHngU+DblU9qiB6sg1KcjoK1jICxnK7Nl3mOzxBVCSLnfX+ShxqP8OBFbI14lupcBLkskrVnGm9YkEqbk3Q==", + "dependencies": { + "@fluentui/react-dialog": "^9.7.6", + "@fluentui/react-jsx-runtime": "^9.0.14", + "@fluentui/react-motion-preview": "^0.3.0", + "@fluentui/react-shared-contexts": "^9.9.2", + "@fluentui/react-theme": "^9.1.14", + "@fluentui/react-utilities": "^9.14.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.14.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-field": { + "version": "9.1.68", + "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.1.68.tgz", + "integrity": "sha512-PiXti7L9rBwk98S+BcS9EKj13nmvl/lymwdrw2vguOMJvNQYIW4UhmvAzFDxs92kpfeHIjZgcEv+cskhJ7Uo7g==", + "dependencies": { + "@fluentui/react-context-selector": "^9.1.62", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-label": "^9.1.71", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-focus": { + "version": "8.9.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.9.7.tgz", + "integrity": "sha512-W7ah8KsFCJz0bCa+w11/qUTdw+fdBYFVy42nSscSDdzdqriXQ87L1v2b8h+iOr/WBvzBG1AN6C97F5tNH/K95w==", + "dependencies": { + "@fluentui/keyboard-key": "^0.4.22", + "@fluentui/merge-styles": "^8.6.10", + "@fluentui/set-version": "^8.2.22", + "@fluentui/style-utilities": "^8.10.15", + "@fluentui/utilities": "^8.15.10", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "react": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-hooks": { + "version": "8.8.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.8.7.tgz", + "integrity": "sha512-bMNouJF8Ij3tSue+uFyYfDm8llL4D0PDCPcXoFroUgk6QDneCMxnsK4uqeUAvr8rvmcVedzYiQ29r7IxWXxj2g==", + "dependencies": { + "@fluentui/react-window-provider": "^2.2.26", + "@fluentui/set-version": "^8.2.22", + "@fluentui/utilities": "^8.15.10", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "react": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-icons": { + "version": "2.0.245", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.245.tgz", + "integrity": "sha512-okaKAWR9BPTEu7g/Lz7M+SeABkveiDC0A5dA+AKbnGX/5V60/0jV/m/mnTCs9EfsbMdHZaoErsVqzCxP3mqYGQ==", + "dependencies": { + "@griffel/react": "^1.0.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-image": { + "version": "9.1.68", + "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.1.68.tgz", + "integrity": "sha512-cjUoL7nt9cyO5WrPw5wG2GFYRvAEpOA2/nbeUooeAAQQ11V+d7ekSxpfD9OyyiA5KABpn909puzu96kqNTwKFg==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-infobutton": { + "version": "9.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.67.tgz", + "integrity": "sha512-SX8oVVQK6qXUtJCkzJlFQ5O5me/Y13nbboSduvJtyGzPFw30tQzZm11J/7ztJRauNmjNLJVHdJQI97zeyC6cHg==", + "deprecated": "@fluentui/react-infobutton has been deprecated, please use @fluentui/react-infolabel instead.", + "dependencies": { + "@fluentui/react-icons": "^2.0.217", + "@fluentui/react-jsx-runtime": "^9.0.14", + "@fluentui/react-label": "^9.1.42", + "@fluentui/react-popover": "^9.8.12", + "@fluentui/react-portal": "^9.3.21", + "@fluentui/react-tabster": "^9.13.4", + "@fluentui/react-theme": "^9.1.14", + "@fluentui/react-utilities": "^9.14.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.14.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-input": { + "version": "9.4.79", + "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.4.79.tgz", + "integrity": "sha512-Nuf3n4Py77v5zOVE9MLaQeC6ywwjfL7jTdEaKVGL3k/geWTG5WFqjG79CzNJo0Ajo0DKnPqul6MtLdRF+tqeNQ==", + "dependencies": { + "@fluentui/react-field": "^9.1.68", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-jsx-runtime": { + "version": "9.0.39", + "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.0.39.tgz", + "integrity": "sha512-mfK3L68Gfu9rMkfg1iVT06rOOPeOZasy+nKJID451YfKiAQYy1Zy9bhaTRDoNrOQcu2jDEOZAxAPURZw5oGLtw==", + "dependencies": { + "@fluentui/react-utilities": "^9.18.10", + "@swc/helpers": "^0.5.1", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "react": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-label": { + "version": "9.1.71", + "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.1.71.tgz", + "integrity": "sha512-PkzRsl86+AkSn6p26C0Y2AV4IxYUhbBV+lFNSwN/hVgiXwMVdUjPOZx4Nm4Fnvv5ctt/BVuaE0dB/nSSDsrnQw==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-link": { + "version": "9.2.25", + "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.2.25.tgz", + "integrity": "sha512-yhwgXjIFC39Nd5zveaOu3AgAra3H0Cv+gQ4rOLKW95ejlXHJqZEqcFPrf39d930YVCeIThiBH7IG1JCfo4z8/Q==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-menu": { + "version": "9.14.8", + "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.14.8.tgz", + "integrity": "sha512-FFY44tCxzQJaFVKXqJuR00++FSJPUSkx/qg41e73j/8+ytelD0FtyzLoS0r/ditAfDVSJtFwuuL10+3Dagk2WQ==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.12.1", + "@fluentui/react-context-selector": "^9.1.62", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-portal": "^9.4.28", + "@fluentui/react-positioning": "^9.15.3", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-motion": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-motion/-/react-motion-9.2.0.tgz", + "integrity": "sha512-gM38DObOXXEcE1xUe/c2bDd4J4wWwEeHghuIMOlQ+yElr8F4906bEv+gIlEbfSdACGDJ3SWixhGkxlAoAjaBow==", + "dependencies": { + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-utilities": "^9.18.10", + "@swc/helpers": "^0.5.1", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "@types/react-dom": ">=16.8.0 <19.0.0", + "react": ">=16.8.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-motion-preview": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-motion-preview/-/react-motion-preview-0.3.4.tgz", + "integrity": "sha512-5Ru/uoLEMQVDEHJIqfs8TZPN38ABZlVgcnBHmfpYwF+zuL6RgP8VQehGSgDpD/eZ2YLHqa6Cl9uNWZYK4ouXNQ==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.18", + "@fluentui/react-shared-contexts": "^9.10.0", + "@fluentui/react-theme": "^9.1.14", + "@fluentui/react-utilities": "^9.15.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.14.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-overflow": { + "version": "9.1.22", + "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.1.22.tgz", + "integrity": "sha512-h+mFyOdozdlyd0F7gzqMHyKk6jFgyAZutBwtMKiocxSSzyU44G5ZUS3hVAY6+qnVk7Ft8DkjHOZybv85naXuGA==", + "dependencies": { + "@fluentui/priority-overflow": "^9.1.13", + "@fluentui/react-context-selector": "^9.1.62", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-persona": { + "version": "9.2.89", + "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.2.89.tgz", + "integrity": "sha512-WzQ9amNhtkKNP00Uf/5xopyci+Zo1oOg8uEkWhT69PwBYLdeLHu7RF5QFPz4U/HmlW8waR8vbH25GSHD2oo9oA==", + "dependencies": { + "@fluentui/react-avatar": "^9.6.30", + "@fluentui/react-badge": "^9.2.38", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-popover": { + "version": "9.9.12", + "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.9.12.tgz", + "integrity": "sha512-oyNiU/NIrRV7N/JUIyX0IZgQSBgrYZE4C4GEpxCkB/wd8IYuF4ws/hm18WMl8NomItiC04mMfOcaB/VH4/JS9A==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.12.1", + "@fluentui/react-context-selector": "^9.1.62", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-portal": "^9.4.28", + "@fluentui/react-positioning": "^9.15.3", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-portal": { + "version": "9.4.28", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.4.28.tgz", + "integrity": "sha512-QtG/rVQ0ekF7irZDlI5KKQqmeT7I9aVsawP5E2/XISejVwFc5AGboPlXELldhGqgWx0M3nNRNVk1QdKkc0PlEQ==", + "dependencies": { + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1", + "use-disposable": "^1.0.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-portal-compat-context": { + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal-compat-context/-/react-portal-compat-context-9.0.11.tgz", + "integrity": "sha512-ubvW/ej0O+Pago9GH3mPaxzUgsNnBoqvghNamWjyKvZIViyaXUG6+sgcAl721R+qGAFac+A20akI5qDJz/xtdg==", + "dependencies": { + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "react": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-positioning": { + "version": "9.15.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.15.3.tgz", + "integrity": "sha512-hW9CGHLlz5q+IlBdpTh1xtj2OZZ6abPcDQ4WjxWneWmG3jAf4sFkwS8ylvSZ7i7QcUk+ckVuCiuJsc/GjcRzKQ==", + "dependencies": { + "@floating-ui/devtools": "0.2.1", + "@floating-ui/dom": "^1.2.0", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-progress": { + "version": "9.1.79", + "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.1.79.tgz", + "integrity": "sha512-NBHnpcOKQ9OOKnAIVd3HW4cn/yv7xjureJxn8EM2Om7ZBPS5HrKJqZHwJVrUE/QJ4WssTfiU8MipKwWwot+8Vg==", + "dependencies": { + "@fluentui/react-field": "^9.1.68", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-provider": { + "version": "9.16.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.16.3.tgz", + "integrity": "sha512-rF3FFvqsXPshpgk+nq1sxwzysFKRPFM0fV872qP/kHiyUU7IpEyRU8HcSU5j8sFgpRSNVatAjiD0I+rvy6ekjg==", + "dependencies": { + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/core": "^1.16.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-radio": { + "version": "9.2.24", + "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.2.24.tgz", + "integrity": "sha512-Wl19e4CQo4Fv2A+x0ta3rS2F1OMTL7mF4qVfdfhdTOTH2J/0WmmFPrz26E2ZhqENKivIv1+NXEV/KgpPFbWF0w==", + "dependencies": { + "@fluentui/react-field": "^9.1.68", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-label": "^9.1.71", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-select": { + "version": "9.1.79", + "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.1.79.tgz", + "integrity": "sha512-E9EuUIUy2MzHRkQPmXyJp5txVo5EYH+lNoV3xgZKd9zijg7QQJWxfgbNJqddubmnRdr8MtBt/fM4qmHia5cgSQ==", + "dependencies": { + "@fluentui/react-field": "^9.1.68", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-shared-contexts": { + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.19.0.tgz", + "integrity": "sha512-KWHRVuKSvQpFdGGxj802AwoHlq7VyFKaj89cgX2pBu2ZqZrdpxkbkfFQIvxLoaZ/Bzm7fWXVQrDYpj+8JHAfCA==", + "dependencies": { + "@fluentui/react-theme": "^9.1.19", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "react": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-skeleton": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.1.7.tgz", + "integrity": "sha512-2Ve7NZ1LyssPgztw+K55znY/uiZRx/g8Iif7L6ETvvcn3nE3WZFWISLfVdCF7SQBTa+oV+gDBjUKpEZcFA512Q==", + "dependencies": { + "@fluentui/react-field": "^9.1.68", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-slider": { + "version": "9.1.86", + "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.1.86.tgz", + "integrity": "sha512-icgE/5iYx69DQLcOlPicATxQJcNBYg2uJGvVgzVhhLuXy87mkqv7Lh5YFfmcMpMSWbOhoEbDle73MMTDu8UC9g==", + "dependencies": { + "@fluentui/react-field": "^9.1.68", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-spinbutton": { + "version": "9.2.79", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.2.79.tgz", + "integrity": "sha512-qqe7eQ4ra3Iu/RhZHXxjnYqhH9GNPr1FlTSqPRIHa7Kf0/0Hrig+gLQYw7N5BXzDSU4+cz29/9PyXowdg5mBLQ==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-field": "^9.1.68", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-spinner": { + "version": "9.4.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.4.9.tgz", + "integrity": "sha512-+X9OmvDIhdwdiKO7I0CKrgjiS5Y2DzSVgkONMmpuu6u+DywhgLWh1JLatCiEl8Qp2/cBlg32XNfBl0lAfQHHFw==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-label": "^9.1.71", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-switch": { + "version": "9.1.86", + "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.1.86.tgz", + "integrity": "sha512-tcgkSv+VwT4QzP/wuMT472R5oZJtiUhbLnSgMWGlyuETBMDMF0Vp3SNkp8noalTyNHPnrJgylKgUuKtt3MyL1Q==", + "dependencies": { + "@fluentui/react-field": "^9.1.68", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-label": "^9.1.71", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-table": { + "version": "9.15.8", + "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.15.8.tgz", + "integrity": "sha512-awEJcDF+LX0xCpIArGBRwUh4/4vw0rJcwVnmlujn2DoYBwasUoyL9QYZF2W5U+XnHazYBgX7Bm+JMJ7awVdSVQ==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.12.1", + "@fluentui/react-avatar": "^9.6.30", + "@fluentui/react-checkbox": "^9.2.29", + "@fluentui/react-context-selector": "^9.1.62", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-radio": "^9.2.24", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-tabs": { + "version": "9.4.24", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.4.24.tgz", + "integrity": "sha512-HBy+TNI0XoC1WqLjIAWokW5HeCD59h//Cy+nHELI4xSVc3gbWDb2KLRptDLYawcDT9hsUnwxtnSXmQgnGLhH2A==", + "dependencies": { + "@fluentui/react-context-selector": "^9.1.62", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-tabster": { + "version": "9.22.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.22.0.tgz", + "integrity": "sha512-R61y6/kRWjA8UP9F/wMvOBtOFM1frgiQA0zF49BfrQvwnJMFEYidaLsc1e6IkNS34IiwpsESaIIOlDMn5mUXzg==", + "dependencies": { + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1", + "keyborg": "^2.6.0", + "tabster": "^8.0.0" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-tags": { + "version": "9.3.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-tags/-/react-tags-9.3.9.tgz", + "integrity": "sha512-hwriI1Uj4rI5qQ0A8FrAlCHJ9pZCo8mwWM0VTKpssN5vK4nqcSpiMq91mw810+GUlNiXnTW+gZCn0RlaryCQFw==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.12.1", + "@fluentui/react-avatar": "^9.6.30", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-text": { + "version": "9.4.20", + "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.4.20.tgz", + "integrity": "sha512-9ulw77qtUfxmgFTIC3UwzCyw0mn9xWV16VZ3j8MzDeLOapvGUz4UnvOV8aLXIWmI7VbeEVRRcQ5eFMvL6dbhRQ==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-textarea": { + "version": "9.3.79", + "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.3.79.tgz", + "integrity": "sha512-7nAMBINpKWgvftXvKdynppiLhv0+O97bMwoLyhUdHnBu0fJi/2yYXlsCh1RFAaBg07qc+wqdQX1TdI4ad2nluQ==", + "dependencies": { + "@fluentui/react-field": "^9.1.68", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-theme": { + "version": "9.1.19", + "resolved": "https://registry.npmjs.org/@fluentui/react-theme/-/react-theme-9.1.19.tgz", + "integrity": "sha512-mrVhKbr4o9UKERPxgghIRDU59S7gRizrgz3/wwyMt7elkr8Sw+OpwKIeEw9x6P0RTcFDC00nggaMJhBGs7Xo4A==", + "dependencies": { + "@fluentui/tokens": "1.0.0-alpha.16", + "@swc/helpers": "^0.5.1" + } + }, + "node_modules/@fluentui/react-toast": { + "version": "9.3.47", + "resolved": "https://registry.npmjs.org/@fluentui/react-toast/-/react-toast-9.3.47.tgz", + "integrity": "sha512-sFvdp8OOniYMasIIQB2kwZkezb8lx7mw14RtnPyUG/E8bo5j96uVEZWVH8nAbZGezxSi2X75WZbplla55vhJ6Q==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.12.1", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-motion": "^9.2.0", + "@fluentui/react-portal": "^9.4.28", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-toolbar": { + "version": "9.1.87", + "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.1.87.tgz", + "integrity": "sha512-jxi5cSw4tj++goEjz85prAJdsfRSqZhY0IV4UAhYvcQLaNaR1mqdJzjynXWHwf5SyKj7u4lsgfJ8XYibBL9/JA==", + "dependencies": { + "@fluentui/react-button": "^9.3.84", + "@fluentui/react-context-selector": "^9.1.62", + "@fluentui/react-divider": "^9.2.70", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-radio": "^9.2.24", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-tooltip": { + "version": "9.4.31", + "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.4.31.tgz", + "integrity": "sha512-e6DZgYWDwzt1i0guZjUIrBxuX8sQ1KZg/snJ4puM6IWpbUC2dLahBvOdJbAZopyFRwhsvP37Cey4nTrwhhDVSA==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-portal": "^9.4.28", + "@fluentui/react-positioning": "^9.15.3", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-tree": { + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.7.1.tgz", + "integrity": "sha512-zyUW0NwuafZE1618ssOmBZidHg6Luccgmz67XO3zhv5VlVYvMnr1ci55tgyp4L1SY2P/6hVB216EVK0c7oJA6w==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.12.1", + "@fluentui/react-avatar": "^9.6.30", + "@fluentui/react-button": "^9.3.84", + "@fluentui/react-checkbox": "^9.2.29", + "@fluentui/react-context-selector": "^9.1.62", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-radio": "^9.2.24", + "@fluentui/react-shared-contexts": "^9.19.0", + "@fluentui/react-tabster": "^9.22.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-utilities": { + "version": "9.18.10", + "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.18.10.tgz", + "integrity": "sha512-1yUFZrJyBO1qizHa20S35JATQwr0QoTZ5vBmov0K49BWxDpJxpiAClMpFaMlw0hj9cI7HMLFF8Y87OhUYvaheQ==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-shared-contexts": "^9.19.0", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "react": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-virtualizer": { + "version": "9.0.0-alpha.48", + "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.48.tgz", + "integrity": "sha512-Ifw+6Ixqhxb9bDXY3dETIJH5H4s4wEv119PcLefFZknQ7M4Q3IMsrYMXppoptzhAyeEionTekpMRt1j2E4/4yw==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.14", + "@fluentui/react-utilities": "^9.14.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.14.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-window-provider": { + "version": "2.2.26", + "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-2.2.26.tgz", + "integrity": "sha512-LMDfddXka9/YnSzjVU9smjI4dixhJ5jM5fjUtD2Bh9qgeUUzCmCW2GVh6S4LIqjsaoJVJfOOCuPrSaZTr+HdRQ==", + "dependencies": { + "@fluentui/set-version": "^8.2.22", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "react": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/set-version": { + "version": "8.2.22", + "resolved": "https://registry.npmjs.org/@fluentui/set-version/-/set-version-8.2.22.tgz", + "integrity": "sha512-4m5AKK+s5LLBv/BOGHnaCl8W2qdDFOdfRHeRZBS7UNcFLUPHKCfmID1rdh1eCrl3qIgGXPlc46o3BBqt+SBTTw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@fluentui/style-utilities": { + "version": "8.10.15", + "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.10.15.tgz", + "integrity": "sha512-+XyRMAGOQhlmBQU830S+pGPYY7LTNofwRGTkeqERWBNI2gXw8O94TcgprQNGEXZM9jf5oSE/t09baoECeWdBmA==", + "dependencies": { + "@fluentui/merge-styles": "^8.6.10", + "@fluentui/set-version": "^8.2.22", + "@fluentui/theme": "^2.6.53", + "@fluentui/utilities": "^8.15.10", + "@microsoft/load-themed-styles": "^1.10.26", + "tslib": "^2.1.0" + } + }, + "node_modules/@fluentui/theme": { + "version": "2.6.53", + "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.53.tgz", + "integrity": "sha512-8w/072fUC+ukWzRGpCFkOlwmKmFraVanwY8VMdbC9O8u3bkaDFcGKx4j1VopUKE682SFaudqDyLiwECm+i3YuA==", + "dependencies": { + "@fluentui/merge-styles": "^8.6.10", + "@fluentui/set-version": "^8.2.22", + "@fluentui/utilities": "^8.15.10", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "react": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/tokens": { + "version": "1.0.0-alpha.16", + "resolved": "https://registry.npmjs.org/@fluentui/tokens/-/tokens-1.0.0-alpha.16.tgz", + "integrity": "sha512-Gr9G8LIlUhZYX5j6CfDQrofQqsWAz/q54KabWn1tWV/1083WwyoTZXiG1k6b37NnK7Feye7D7Nz+4MNqoKpXGw==", + "dependencies": { + "@swc/helpers": "^0.5.1" + } + }, + "node_modules/@fluentui/utilities": { + "version": "8.15.10", + "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.15.10.tgz", + "integrity": "sha512-7WAzaVd7vPTh60SfN8/nGtlxm6Pv19NrLVeANt6ZP9h8SA2E5fV3QwDH/88BjnVj/yfTQwb7011aQcSb6DiKBA==", + "dependencies": { + "@fluentui/dom-utilities": "^2.3.6", + "@fluentui/merge-styles": "^8.6.10", + "@fluentui/react-window-provider": "^2.2.26", + "@fluentui/set-version": "^8.2.22", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "react": ">=16.8.0 <19.0.0" + } + }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "dev": true }, + "node_modules/@griffel/core": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@griffel/core/-/core-1.17.0.tgz", + "integrity": "sha512-OhLMYQ9zXVpKh3DULgK0Olsm1Xw5cvQuL7BV3UCWoJttAWGfrdIvSMxGCJ2FpWVyS/OBWoG4BTYh3oHTgxBWCQ==", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@griffel/style-types": "^1.2.0", + "csstype": "^3.1.3", + "rtl-css-js": "^1.16.1", + "stylis": "^4.2.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@griffel/react": { + "version": "1.5.23", + "resolved": "https://registry.npmjs.org/@griffel/react/-/react-1.5.23.tgz", + "integrity": "sha512-pOOh+h+2JibSVlRfN6rzIigkPm6HONxMHEN3IWLB3gVU7OKEQHt/EOK+1ZePMzaMILZaaFDvuwCaKCkEq6QQ/Q==", + "dependencies": { + "@griffel/core": "^1.17.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@griffel/style-types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@griffel/style-types/-/style-types-1.2.0.tgz", + "integrity": "sha512-x166MNw0vWe5l5qhinfNT4eyWOaP48iFzPyFOfIB0/BVidKTWsEe5PmqRJDDtrJFS3VHhd/tE0oM6tkEMh2tsg==", + "dependencies": { + "csstype": "^3.1.3" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -696,6 +2154,11 @@ "eslint-plugin-import": ">=2" } }, + "node_modules/@microsoft/load-themed-styles": { + "version": "1.10.295", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.295.tgz", + "integrity": "sha512-W+IzEBw8a6LOOfRJM02dTT7BDZijxm+Z7lhtOAz1+y9vQm1Kdz9jlAO+qCEKsfxtUOmKilW8DIRqFw2aUgKeGg==" + }, "node_modules/@microsoft/vscode-azext-azureutils": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@microsoft/vscode-azext-azureutils/-/vscode-azext-azureutils-2.0.5.tgz", @@ -970,6 +2433,14 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/@swc/helpers": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.11.tgz", + "integrity": "sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -1129,6 +2600,31 @@ "integrity": "sha512-Yll76ZHikRFCyz/pffKGjrCwe/le2CDwOP5F210KQo27kpRE46U2rDnzikNlVn6/ezH3Mhn46bJMTfeVTtcYMg==", "dev": true }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "peer": true + }, + "node_modules/@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "peer": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/semver": { "version": "7.5.6", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", @@ -3142,6 +4638,11 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, "node_modules/d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -6579,6 +8080,12 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "peer": true + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -6698,6 +8205,11 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/keyborg": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/keyborg/-/keyborg-2.6.0.tgz", + "integrity": "sha512-o5kvLbuTF+o326CMVYpjlaykxqYP9DphFQZ2ZpgrvBouyvOxyEB7oqe8nOLFpiV5VCtz0D3pt8gXQYWpLpBnmA==" + }, "node_modules/keytar": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", @@ -7055,6 +8567,18 @@ "node": ">=8" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -8089,7 +9613,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8954,6 +10477,45 @@ "node": ">=0.10.0" } }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, "node_modules/read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -9079,6 +10641,11 @@ "node": ">= 0.10" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -9310,6 +10877,14 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rtl-css-js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", + "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -9400,6 +10975,16 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, "node_modules/schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", @@ -10136,6 +11721,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylis": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -10170,6 +11760,15 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/tabster": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/tabster/-/tabster-8.0.0.tgz", + "integrity": "sha512-82pqhDwH3uq7hVcy1nOo7lyYgCJcVUPqb30hvoHtX8DQ5pxEtRz9+FqVcW5w7J6kTjNBBu7cwKvuMy9qoeQt1g==", + "dependencies": { + "keyborg": "2.6.0", + "tslib": "^2.3.1" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -11105,6 +12704,17 @@ "node": ">=0.10.0" } }, + "node_modules/use-disposable": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/use-disposable/-/use-disposable-1.0.2.tgz", + "integrity": "sha512-UMaXVlV77dWOu4GqAFNjRzHzowYKUKbJBQfCexvahrYeIz4OkUYUjna4Tjjdf92NH8Nm8J7wEfFRgTIwYjO5jg==", + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "@types/react-dom": ">=16.8.0 <19.0.0", + "react": ">=16.8.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" + } + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", diff --git a/tools/vscode-azurewebpubsub/package.json b/tools/vscode-azurewebpubsub/package.json index a55920706..3608f7195 100644 --- a/tools/vscode-azurewebpubsub/package.json +++ b/tools/vscode-azurewebpubsub/package.json @@ -31,7 +31,8 @@ "preview": true, "activationEvents": [ "onView:azureResourceGroups", - "onView:azureResourceGroupsV2" + "onView:azureResourceGroupsV2", + "onWebviewPanel:testClientView" ], "main": "./main.js", "contributes": { @@ -124,6 +125,11 @@ "title": "%azureWebPubSub.service.openLiveTraceTool%", "category": "Azure Web PubSub" }, + { + "command": "azureWebPubSub.service.testClient", + "title": "%azureWebPubSub.service.testClient%", + "category": "Azure Web PubSub" + }, { "command": "azureWebPubSub.service.scaleUp", "title": "%azureWebPubSub.service.scaleUp%", @@ -258,29 +264,34 @@ ], "azureWebPubSub.service.advancedMenu": [ { - "command": "azureWebPubSub.service.scaleUp", + "command": "azureWebPubSub.service.testClient", "when": "view =~ /(azureResourceGroups|azureFocusView)/ && viewItem =~ /webPubSubServiceItem/i", "group": "1@1" }, { - "command": "azureWebPubSub.service.scaleOut", + "command": "azureWebPubSub.service.scaleUp", "when": "view =~ /(azureResourceGroups|azureFocusView)/ && viewItem =~ /webPubSubServiceItem/i", "group": "1@2" }, { - "command": "azureWebPubSub.service.viewMetrics", + "command": "azureWebPubSub.service.scaleOut", "when": "view =~ /(azureResourceGroups|azureFocusView)/ && viewItem =~ /webPubSubServiceItem/i", "group": "1@3" }, { - "command": "azureWebPubSub.service.checkHealth", + "command": "azureWebPubSub.service.viewMetrics", "when": "view =~ /(azureResourceGroups|azureFocusView)/ && viewItem =~ /webPubSubServiceItem/i", "group": "1@4" }, { - "command": "azureWebPubSub.service.regenerateKey", + "command": "azureWebPubSub.service.checkHealth", "when": "view =~ /(azureResourceGroups|azureFocusView)/ && viewItem =~ /webPubSubServiceItem/i", "group": "1@5" + }, + { + "command": "azureWebPubSub.service.regenerateKey", + "when": "view =~ /(azureResourceGroups|azureFocusView)/ && viewItem =~ /webPubSubServiceItem/i", + "group": "1@6" } ] }, @@ -300,17 +311,23 @@ "scripts": { "vscode:prepublish": "npm run cleanReadme", "build": "tsc && gulp webpack-prod", + "build:all": "npm run build && npm run build:webview", "cleanReadme": "gulp cleanReadme", "compile": "tsc -watch", "package": "vsce package --no-dependencies", "package:pre-release": "vsce package --pre-release", - "lint": "eslint --ext .ts .", - "lint-fix": "eslint --ext .ts . --fix", + "lint": "eslint --ext .ts ./src", + "lint-fix": "eslint --ext .ts ./src --fix", + "lint:all": "npm run lint && cd webview-ui && npm run lint", + "lint-fix:all": "npm run lint-fix && cd webview-ui && npm run lint-fix", "pretest": "npm run lint && npm run webpack-prod && gulp preTest", "test": "node ./out/test/runTest.js", "webpack": "tsc && gulp webpack-dev", "webpack-prod": "tsc && gulp webpack-prod", - "webpack-profile": "webpack --profile --json --mode production > webpack-stats.json && echo Use http://webpack.github.io/analyse to analyze the stats" + "webpack-profile": "webpack --profile --json --mode production > webpack-stats.json && echo Use http://webpack.github.io/analyse to analyze the stats", + "install:all": "npm install && cd webview-ui && npm install", + "start:webview": "cd webview-ui && npm run start", + "build:webview": "cd webview-ui && npm run build" }, "devDependencies": { "@azure/ms-rest-azure-env": "^2.0.0", @@ -345,6 +362,9 @@ "@azure/arm-webpubsub": "^2.0.0-beta.2", "@azure/core-rest-pipeline": "1.10.3", "@azure/storage-blob": "^12.4.1", + "@azure/web-pubsub": "^1.1.1", + "@fluentui/react": "^8.106.3", + "@fluentui/react-components": "^9.34.1", "@microsoft/vscode-azext-azureutils": "^2.0.0", "@microsoft/vscode-azext-utils": "^2.1.3", "@microsoft/vscode-azureresources-api": "^2.2.1", diff --git a/tools/vscode-azurewebpubsub/package.nls.json b/tools/vscode-azurewebpubsub/package.nls.json index 500e2d1a5..c4e6ff71e 100644 --- a/tools/vscode-azurewebpubsub/package.nls.json +++ b/tools/vscode-azurewebpubsub/package.nls.json @@ -1,5 +1,6 @@ { "azureWebPubSub.description": "An Azure Web PubSub extension for Visual Studio Code.", + "azureWebPubSub.service.testClient": "Test Client", "azureWebPubSub.service.advancedMenu": "Advanced", "azureWebPubSub.service.createInPortal": "Create Web PubSub Service in Portal", "azureWebPubSub.service.createInPortal.detail": "A fully managed service that supports WebSockets for real-time application development.", diff --git a/tools/vscode-azurewebpubsub/src/commands.ts b/tools/vscode-azurewebpubsub/src/commands.ts index 9cea26c04..32755622d 100644 --- a/tools/vscode-azurewebpubsub/src/commands.ts +++ b/tools/vscode-azurewebpubsub/src/commands.ts @@ -25,6 +25,9 @@ import { viewMetrics } from "./workflows/service/viewMetric/viewMetrics"; import { checkServiceHealth } from "./workflows/service/checkHealth/checkHealth"; import { attachLocalTunnel } from "./workflows/hubSetting/localTunnel/attachLocalTunnel"; import { switchAnonymousPolicy } from "./workflows/hubSetting/switchAnonymousPolicy/switchAnonymousPolicy"; +import { testClient } from "./workflows/service/testClient/testClient"; +import { ExtensionContext, commands } from "vscode"; +import { ServiceItem } from "./tree/service/ServiceItem"; function registerCommandWithTelemetryWrapper(commandId: string, callback: CommandCallback): void { // eslint-disable-next-line @typescript-eslint/no-unsafe-return @@ -43,8 +46,11 @@ function registerCommandWithTelemetryWrapper(commandId: string, callback: Comman registerCommandWithTreeNodeUnwrapping(commandId, callbackWithTroubleshooting); } -export function registerCommands(): void { +export function registerCommands(extensionContext: ExtensionContext): void { // Service + registerCommandWithTelemetryWrapper('azureWebPubSub.service.testClient', async (actionContext: IActionContext, node?: ServiceItem) => { + testClient(extensionContext.extensionUri, actionContext, node); + }); registerCommandWithTelemetryWrapper('azureWebPubSub.service.createInPortal', createServiceInPortal); registerCommandWithTelemetryWrapper('azureWebPubSub.service.createClassical', createServiceForClassical); registerCommandWithTelemetryWrapper('azureWebPubSub.service.createSocketIO', createServiceForSocketIO); diff --git a/tools/vscode-azurewebpubsub/src/extension.ts b/tools/vscode-azurewebpubsub/src/extension.ts index 629a6cc5d..f9ee12cea 100644 --- a/tools/vscode-azurewebpubsub/src/extension.ts +++ b/tools/vscode-azurewebpubsub/src/extension.ts @@ -32,7 +32,7 @@ export async function activate(context: vscode.ExtensionContext, perfStats: { lo ext.branchDataProvider = new ServicesDataProvider(); ext.rgApiV2 = await getAzureResourcesExtensionApi(context, '2.0.0'); ext.rgApiV2.resources.registerAzureResourceBranchDataProvider(AzExtResourceType.WebPubSub, ext.branchDataProvider); - registerCommands(); + registerCommands(context); })(); } diff --git a/tools/vscode-azurewebpubsub/src/panels/BasePanel.ts b/tools/vscode-azurewebpubsub/src/panels/BasePanel.ts new file mode 100644 index 000000000..fefa05691 --- /dev/null +++ b/tools/vscode-azurewebpubsub/src/panels/BasePanel.ts @@ -0,0 +1,112 @@ +import { Disposable, Webview, WebviewPanel, window, Uri, ViewColumn } from "vscode"; +import { ext } from "../extensionVariables"; +import { getNonce, getWebviewUri } from "../utils"; + +export class BasePanel { + protected readonly _panel: WebviewPanel; + protected _disposables: Disposable[] = []; + + /** + * The BasePanel class private constructor (called only from the render method). + * + * @param panel A reference to the webview panel + * @param extensionUri The URI of the directory containing the extension + */ + public constructor(panel: WebviewPanel, extensionUri: Uri) { + this._panel = panel; + + // Set an event listener to listen for when the panel is disposed (i.e. when the user closes + // the panel or when the panel is closed programmatically) + this._panel.onDidDispose(() => this.dispose(), null, this._disposables); + + // Set the HTML content for the webview panel + this._panel.webview.html = this._getWebviewContent(this._panel.webview, extensionUri); + + // Set an event listener to listen for messages passed from the webview context + this._setWebviewMessageListener(this._panel.webview); + } + + /** + * Renders a new webview panel + * will be created and displayed. + * + * @param extensionUri The URI of the directory containing the extension. + */ + protected static _render(extensionUri: Uri, viewType: string, title: string) { + return window.createWebviewPanel( + viewType, + title, + ViewColumn.One, + { + enableScripts: true, + retainContextWhenHidden: true, + localResourceRoots: [Uri.joinPath(extensionUri, "out"), Uri.joinPath(extensionUri, "webview-ui/build")], + } + ); + } + + /** + * Cleans up and disposes of webview resources when the webview panel is closed. + */ + public dispose() { + // Dispose of the current webview panel + this._panel.dispose(); + + // Dispose of all disposables (i.e. commands) for the current webview panel + while (this._disposables.length) { + const disposable = this._disposables.pop(); + if (disposable) { + disposable.dispose(); + } + } + } + + /** + * Defines and returns the HTML that should be rendered within the webview panel. + * + * @remarks This is also the place where references to the React webview build files + * are created and inserted into the webview HTML. + * + * @param webview A reference to the extension webview + * @param extensionUri The URI of the directory containing the extension + * @returns A template string literal containing the HTML that should be + * rendered within the webview panel + */ + protected _getWebviewContent(webview: Webview, extensionUri: Uri) { + const assetsPath = ["webview-ui", "build", "assets"]; + const stylesUri = getWebviewUri(webview, extensionUri, [...assetsPath, "index.css"]); + const scriptUri = getWebviewUri(webview, extensionUri, [...assetsPath, "index.js"]); + + const nonce = getNonce(); + + // Tip: Install the es6-string-html VS Code extension to enable code highlighting below + return /*html*/ ` + + + + + + + + AWPS Test Client Title + + +
+ + + + `; + } + + protected _setWebviewMessageListener(webview: Webview) { + webview.onDidReceiveMessage( + async (message: any) => { + const command = message.command; + let payload = message.payload; + ext.outputChannel.appendLog(`Received a message from webview, command = ${command}, payload = ${JSON.stringify(payload)}`); + }, + undefined, + this._disposables + ); + } +} diff --git a/tools/vscode-azurewebpubsub/src/panels/TestClientWebviewPanel.ts b/tools/vscode-azurewebpubsub/src/panels/TestClientWebviewPanel.ts new file mode 100644 index 000000000..206d52a33 --- /dev/null +++ b/tools/vscode-azurewebpubsub/src/panels/TestClientWebviewPanel.ts @@ -0,0 +1,79 @@ +import { Webview, WebviewPanel, window, Uri, ViewColumn } from "vscode"; +import { ServiceModel } from "../tree/service/ServiceModel"; +import { WebPubSubManagementClient } from "@azure/arm-webpubsub"; +import { getClientAccessUrl, localize, postMessageToWebviewWithLog } from "../utils"; +import { BasePanel } from "./BasePanel"; +import { ext } from "../extensionVariables"; + +export class TestClientWebviewPanel extends BasePanel { + public static currentPanel: TestClientWebviewPanel | undefined; + private readonly _service: ServiceModel; + private readonly _managementClient: WebPubSubManagementClient; + + public constructor(panel: WebviewPanel, extensionUri: Uri, service: ServiceModel, managementClient: WebPubSubManagementClient) { + super(panel, extensionUri); + this._service = service; + this._managementClient = managementClient; + } + + public static render(extensionUri: Uri, service: ServiceModel, managementClient: WebPubSubManagementClient) { + // If the webview panel already exists reveal it + if (TestClientWebviewPanel.currentPanel) { + return TestClientWebviewPanel.currentPanel._panel.reveal(ViewColumn.One); + } + const panel = super._render(extensionUri, "testClientView", `Test Client for ${service.name}`); + TestClientWebviewPanel.currentPanel = new TestClientWebviewPanel(panel, extensionUri, service, managementClient); + } + + public override dispose() { + TestClientWebviewPanel.currentPanel = undefined; + return super.dispose(); + } + + protected override _setWebviewMessageListener(webview: Webview) { + webview.onDidReceiveMessage( + async (message: any) => { + const command = message.command; + let payload = message.payload; + ext.outputChannel.appendLog(`Receive message from webview, command = ${command}, payload = ${JSON.stringify(payload)}`); + + const commandName = command.split("-")[0]; + const commandIdx = command.split("-")[1]; + switch (commandName) { + case "reportServiceConfiguration": + const hubsIterator = this._managementClient.webPubSubHubs.list(this._service.resourceGroup, this._service.name); + let hubNames: string[] = []; + for await (const hub of hubsIterator) { + hub.name && hubNames.push(hub.name); + } + postMessageToWebviewWithLog(webview, { + command: `ack-reportServiceConfiguration-${commandIdx}`, + payload: { + resourceGroup: this._service.resourceGroup, + resourceName: this._service.name, + hubNames: hubNames + } + }); + return; + + case "getClientAccessUrl": + payload = { hub: payload.hub ?? "", userId: payload.userId ?? "", roles: payload.roles ?? [], groups: payload.groups ?? []}; + console.log("[webview] payload = ", payload); + const { hub, userId, roles, groups } = payload; + const connectionString = (await (this._managementClient.webPubSub.listKeys(this._service.resourceGroup, this._service.name))).primaryConnectionString; + if (!connectionString) { + throw new Error(localize('getConnectionStringError', `Failed to get connection string of ${this._service.name}.`)); + } + const clientAccessUrl = await getClientAccessUrl(connectionString, hub, userId, roles, groups); + postMessageToWebviewWithLog(webview, { + command: `ack-getClientAccessUrl-${commandIdx}`, + payload: clientAccessUrl + }); + return ; + } + }, + undefined, + this._disposables + ); + } +} \ No newline at end of file diff --git a/tools/vscode-azurewebpubsub/src/utils.ts b/tools/vscode-azurewebpubsub/src/utils.ts index 91906cd18..5e9a582ee 100644 --- a/tools/vscode-azurewebpubsub/src/utils.ts +++ b/tools/vscode-azurewebpubsub/src/utils.ts @@ -3,14 +3,15 @@ import * as vscode from "vscode"; import * as nls from 'vscode-nls'; import * as fs from "fs"; import { WebPubSubManagementClient } from "@azure/arm-webpubsub"; -import { type AzExtClientContext} from "@microsoft/vscode-azext-azureutils"; +import { type AzExtClientContext } from "@microsoft/vscode-azext-azureutils"; import { createAzureClient } from "@microsoft/vscode-azext-azureutils"; -import { type IActionContext} from "@microsoft/vscode-azext-utils"; -import { type ExecuteActivityContext} from "@microsoft/vscode-azext-utils"; +import { type IActionContext } from "@microsoft/vscode-azext-utils"; +import { type ExecuteActivityContext } from "@microsoft/vscode-azext-utils"; import { createSubscriptionContext } from "@microsoft/vscode-azext-utils"; import { type AzureSubscription } from "@microsoft/vscode-azureresources-api"; import { type AzureResourcesExtensionApiWithActivity } from "@microsoft/vscode-azext-utils/activity"; import { ext } from "./extensionVariables"; +import { WebPubSubServiceClient } from "@azure/web-pubsub"; export const localize: nls.LocalizeFunc = nls.loadMessageBundle(); @@ -64,9 +65,52 @@ export async function loadPackageInfo(context: ExtensionContext) { export function createTerminalForTunnel(serviceName: string, hubName: string, ifShow: boolean = false): vscode.Terminal { const name = `AWPS Tunnel: ${serviceName} - ${hubName}`; - const sameNameTerminal = vscode.window.terminals.filter((t) => t.name === name) ?.[0] ?? undefined; + const sameNameTerminal = vscode.window.terminals.filter((t) => t.name === name)?.[0] ?? undefined; sameNameTerminal && sameNameTerminal.dispose(); const terminal = vscode.window.createTerminal({ name }); ifShow && terminal.show(); return terminal; } + +export async function getClientAccessUrl(connectionString: string, hubName: string, userId?: string, roles?: string[], groups?: string[]): Promise { + const client = new WebPubSubServiceClient(connectionString, hubName) + const cat = await client.getClientAccessToken({ userId, roles, groups }); + return cat.url; +} + +/** + * A helper function that returns a unique alphanumeric identifier called a nonce. + * + * @remarks This function is primarily used to help enforce content security + * policies for resources/scripts being executed in a webview context. + * + * @returns A nonce + */ +export function getNonce() { + let text = ""; + const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (let i = 0; i < 32; i++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + return text; +} + +/** + * A helper function which will get the webview URI of a given file or resource. + * + * @remarks This URI can be used within a webview's HTML as a link to the + * given file/resource. + * + * @param webview A reference to the extension webview + * @param extensionUri The URI of the directory containing the extension + * @param pathList An array of strings representing the path to a file/resource + * @returns A URI pointing to the file/resource + */ +export function getWebviewUri(webview: vscode.Webview, extensionUri: vscode.Uri, pathList: string[]) { + return webview.asWebviewUri(vscode.Uri.joinPath(extensionUri, ...pathList)); +} + +export function postMessageToWebviewWithLog(webview: vscode.Webview, message: any) { + ext.outputChannel.appendLog(`Post message to webview: ${JSON.stringify(message)}`); + webview.postMessage(message); +} diff --git a/tools/vscode-azurewebpubsub/src/workflows/service/testClient/testClient.ts b/tools/vscode-azurewebpubsub/src/workflows/service/testClient/testClient.ts new file mode 100644 index 000000000..ab846843a --- /dev/null +++ b/tools/vscode-azurewebpubsub/src/workflows/service/testClient/testClient.ts @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- +* Copyright (c) Microsoft Corporation. All rights reserved. +* Licensed under the MIT License. See License.txt in the project root for license information. +*--------------------------------------------------------------------------------------------*/ + +import { type IActionContext } from "@microsoft/vscode-azext-utils"; +import { type ServiceItem } from "../../../tree/service/ServiceItem"; +import { Uri } from "vscode"; +import { TestClientWebviewPanel } from "../../../panels/TestClientWebviewPanel"; +import { pickService } from "../../../tree/service/pickService"; +import { createWebPubSubAPIClient, localize } from "../../../utils"; + +export async function testClient(extensionUri: Uri, actionContext: IActionContext, node?: ServiceItem): Promise { + const { subscription, service } = node ?? await pickService(actionContext, { + title: localize('startTestClient', 'Start Test Client'), + }); + const managementClient = await createWebPubSubAPIClient(actionContext, subscription); + TestClientWebviewPanel.render(extensionUri, service, managementClient); +} diff --git a/tools/vscode-azurewebpubsub/tsconfig.json b/tools/vscode-azurewebpubsub/tsconfig.json index 46e3b271d..5f3f68d2c 100644 --- a/tools/vscode-azurewebpubsub/tsconfig.json +++ b/tools/vscode-azurewebpubsub/tsconfig.json @@ -4,7 +4,8 @@ "target": "es6", "outDir": "out", "lib": [ - "es6" + "es6", + "DOM" ], "sourceMap": true, "rootDir": ".", @@ -14,18 +15,13 @@ "noImplicitReturns": true, "strictNullChecks": true, "noUnusedParameters": false, - "baseUrl": "./", - "paths": { - "*": [ - "node_modules/vscode/*", - "*" - ] - } + "baseUrl": "./" }, "exclude": [ "node_modules", ".vscode-test", "gulpfile.ts", - "test/testProject" + "test/testProject", + "webview-ui" ] } diff --git a/tools/vscode-azurewebpubsub/webview-ui/.gitignore b/tools/vscode-azurewebpubsub/webview-ui/.gitignore new file mode 100644 index 000000000..133f67c00 --- /dev/null +++ b/tools/vscode-azurewebpubsub/webview-ui/.gitignore @@ -0,0 +1,7 @@ +node_modules +.DS_Store +dist +dist-ssr +build +build-ssr +*.local diff --git a/tools/vscode-azurewebpubsub/webview-ui/README.md b/tools/vscode-azurewebpubsub/webview-ui/README.md new file mode 100644 index 000000000..17f210afb --- /dev/null +++ b/tools/vscode-azurewebpubsub/webview-ui/README.md @@ -0,0 +1,10 @@ +# `webview-ui` Directory + +This directory contains all of the code that will be executed within the webview context. It can be thought of as the place where all the "frontend" code of a webview is contained. + +Types of content that can be contained here: + +- Frontend framework code (i.e. React, Svelte, Vue, etc.) +- JavaScript files +- CSS files +- Assets / resources (i.e. images, illustrations, etc.) diff --git a/tools/vscode-azurewebpubsub/webview-ui/index.html b/tools/vscode-azurewebpubsub/webview-ui/index.html new file mode 100644 index 000000000..de4e864de --- /dev/null +++ b/tools/vscode-azurewebpubsub/webview-ui/index.html @@ -0,0 +1,15 @@ + + + + + + + Web PubSub Test Client + + + +
+ + + + diff --git a/tools/vscode-azurewebpubsub/webview-ui/package.json b/tools/vscode-azurewebpubsub/webview-ui/package.json new file mode 100644 index 000000000..9e9cc56e9 --- /dev/null +++ b/tools/vscode-azurewebpubsub/webview-ui/package.json @@ -0,0 +1,34 @@ +{ + "name": "vscode-azurewebpubsub-webview-ui", + "version": "0.0.1", + "private": true, + "scripts": { + "start": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "dev": "vite --host", + "lint": "eslint ./src", + "lint-fix": "eslint ./src --fix" + }, + "dependencies": { + "@azure/web-pubsub-client": "^1.0.1", + "@fluentui/react": "8.114.0", + "@fluentui/react-components": "9.43.3", + "@vscode/webview-ui-toolkit": "^1.2.2", + "jose": "^5.4.1", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-json-view": "1.21.3", + "react-router-dom": "^6.23.0", + "react-scripts": "5.0.1", + "reactstrap": "9.2.1" + }, + "devDependencies": { + "@types/react": "18.2.45", + "@types/react-dom": "18.2.18", + "@types/vscode-webview": "^1.57.0", + "@vitejs/plugin-react": "^1.0.7", + "typescript": "^4.4.4", + "vite": "^2.9.13" + } +} diff --git a/tools/vscode-azurewebpubsub/webview-ui/src/App.css b/tools/vscode-azurewebpubsub/webview-ui/src/App.css new file mode 100644 index 000000000..22178dff2 --- /dev/null +++ b/tools/vscode-azurewebpubsub/webview-ui/src/App.css @@ -0,0 +1,155 @@ +/* +Taken from the