From 618c2ac7d61adb9f549c136371d06afd10ae19e1 Mon Sep 17 00:00:00 2001 From: Georgina Date: Tue, 3 Jun 2025 11:45:42 -0400 Subject: [PATCH 01/51] Squashed: Add all changes from freshSharedComponents --- package-lock.json | 2531 ++++++++++++++++- .../tabs/propertyGridTabComponent.tsx | 21 +- packages/dev/sharedUiComponents/package.json | 4 + .../src/fluent/hoc/colorPropertyLine.tsx | 32 + .../src/fluent/hoc/fluentToolWrapper.tsx | 27 + .../src/fluent/hoc/propertyLine.tsx | 98 + .../src/fluent/hoc/syncedSliderLine.tsx | 36 + .../src/fluent/hoc/vectorPropertyLine.tsx | 36 + .../src/fluent/primitives/button.tsx | 29 + .../src/fluent/primitives/dropdown.tsx | 30 + .../src/fluent/primitives/input.tsx | 44 + .../src/fluent/primitives/link.tsx | 21 + .../src/fluent/primitives/switch.tsx | 33 + .../src/fluent/primitives/syncedSlider.tsx | 54 + .../src/fluent/primitives/text.tsx | 3 + .../src/fluent/primitives/textarea.tsx | 30 + .../sharedUiComponents/src/fluent/readme.md | 19 + .../tempInspectorV2/meshGeneralProperties.tsx | 29 + .../meshOutlineOverlayProperties.tsx | 14 + .../meshTransformProperties.tsx | 14 + .../src/lines/optionsLineComponent.tsx | 30 +- .../src/lines/sliderLineComponent.tsx | 20 +- .../src/lines/textInputLineComponent.tsx | 56 +- packages/tools/nodeEditor/src/graphEditor.tsx | 109 +- 24 files changed, 3141 insertions(+), 179 deletions(-) create mode 100644 packages/dev/sharedUiComponents/src/fluent/hoc/colorPropertyLine.tsx create mode 100644 packages/dev/sharedUiComponents/src/fluent/hoc/fluentToolWrapper.tsx create mode 100644 packages/dev/sharedUiComponents/src/fluent/hoc/propertyLine.tsx create mode 100644 packages/dev/sharedUiComponents/src/fluent/hoc/syncedSliderLine.tsx create mode 100644 packages/dev/sharedUiComponents/src/fluent/hoc/vectorPropertyLine.tsx create mode 100644 packages/dev/sharedUiComponents/src/fluent/primitives/button.tsx create mode 100644 packages/dev/sharedUiComponents/src/fluent/primitives/dropdown.tsx create mode 100644 packages/dev/sharedUiComponents/src/fluent/primitives/input.tsx create mode 100644 packages/dev/sharedUiComponents/src/fluent/primitives/link.tsx create mode 100644 packages/dev/sharedUiComponents/src/fluent/primitives/switch.tsx create mode 100644 packages/dev/sharedUiComponents/src/fluent/primitives/syncedSlider.tsx create mode 100644 packages/dev/sharedUiComponents/src/fluent/primitives/text.tsx create mode 100644 packages/dev/sharedUiComponents/src/fluent/primitives/textarea.tsx create mode 100644 packages/dev/sharedUiComponents/src/fluent/readme.md create mode 100644 packages/dev/sharedUiComponents/src/fluent/tempInspectorV2/meshGeneralProperties.tsx create mode 100644 packages/dev/sharedUiComponents/src/fluent/tempInspectorV2/meshOutlineOverlayProperties.tsx create mode 100644 packages/dev/sharedUiComponents/src/fluent/tempInspectorV2/meshTransformProperties.tsx diff --git a/package-lock.json b/package-lock.json index 063aafe96fe..1af89f04da7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1968,6 +1968,16 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/@dabh/diagnostics": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", @@ -2096,6 +2106,13 @@ "react": ">=16.8.0" } }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "dev": true, + "license": "MIT" + }, "node_modules/@es-joy/jsdoccomment": { "version": "0.39.4", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.39.4.tgz", @@ -2462,155 +2479,2270 @@ "node": ">=18" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", - "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", - "cpu": [ - "arm64" - ], + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz", + "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "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==", + "dev": true, + "peerDependencies": { + "@floating-ui/dom": ">=1.5.4" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz", + "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.0", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@fluentui/keyboard-keys": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@fluentui/keyboard-keys/-/keyboard-keys-9.0.8.tgz", + "integrity": "sha512-iUSJUUHAyTosnXK8O2Ilbfxma+ZyZPMua5vB028Ys96z80v+LFwntoehlFsdH3rMuPsA8GaC1RE7LMezwPBPdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.1" + } + }, + "node_modules/@fluentui/priority-overflow": { + "version": "9.1.15", + "resolved": "https://registry.npmjs.org/@fluentui/priority-overflow/-/priority-overflow-9.1.15.tgz", + "integrity": "sha512-/3jPBBq64hRdA416grVj+ZeMBUIaKZk2S5HiRg7CKCAV1JuyF84Do0rQI6ns8Vb9XOGuc4kurMcL/UEftoEVrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.1" + } + }, + "node_modules/@fluentui/react-accordion": { + "version": "9.6.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.6.9.tgz", + "integrity": "sha512-NPcPPhB8+MsyV4Nxc84ZpW9I2Nm71JBZLiYLT4sh3LcMW9/5H/i9a+ETkHp/mW6WAjr45kyQR4swY4gQlHN6Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-aria": "^9.14.7", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-motion": "^9.7.3", + "@fluentui/react-motion-components-preview": "^0.5.0", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-accordion/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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-accordion/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@fluentui/react-alert": { + "version": "9.0.0-beta.124", + "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.124.tgz", + "integrity": "sha512-yFBo3B5H9hnoaXxlkuz8wRz04DEyQ+ElYA/p5p+Vojf19Zuta8DmFZZ6JtWdtxcdnnQ4LvAfC5OYYlzdReozPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-avatar": "^9.6.29", + "@fluentui/react-button": "^9.3.83", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-tabster": "^9.21.5", + "@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-aria": { + "version": "9.14.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.14.7.tgz", + "integrity": "sha512-rOZC7SJAmYfea5Dqilmcn2t6jgCj05W/PkfmQdKJhJqeGc6uR9uSBkdKmLnVONFQ+CwlqBMdHWZBv7Tuj2CayQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-utilities": "^9.19.0", + "@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.7.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.7.7.tgz", + "integrity": "sha512-Td6p6KdsrKaVkF6F8F7qySASBV6vTJ8zsZkov6B39HpTgt3mMrANDbYrwymEeXbIEHzKBM6o81cI0mKR7RzNEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-badge": "^9.2.54", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-popover": "^9.10.7", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-tooltip": "^9.6.7", + "@fluentui/react-utilities": "^9.19.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-avatar/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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-avatar/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@fluentui/react-badge": { + "version": "9.2.54", + "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.2.54.tgz", + "integrity": "sha512-2PU0UA0VDz/XwbYKmMmPQKg4ykYHoUsgs3oZIqdwMPM3zxuhclsFEFx2xj4nxpMKiGCTBSBTM0fdOEQwRrbluQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-breadcrumb": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-breadcrumb/-/react-breadcrumb-9.1.7.tgz", + "integrity": "sha512-zfyb8FtQrqi48VAIS0fluhL2mlCQW6r7eRVx/sbuEbYxf+Q7brUTGP0iUwxdEFvmVj3DENyNg70yv5zkQMR1zA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-aria": "^9.14.7", + "@fluentui/react-button": "^9.4.7", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-link": "^9.4.7", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-button": { + "version": "9.4.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.4.7.tgz", + "integrity": "sha512-n5XyJ6CHEcOfE2sriX7GfF50QGVmMTW/3K4CzB8ZFoFxr2wgIO8OfOuUGewhb3w7a4ux2Dx3k65IlbGfXGuazQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-aria": "^9.14.7", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-card": { + "version": "9.2.6", + "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.2.6.tgz", + "integrity": "sha512-CU3T+ryfGAP7Ar2GZmO62cqyV2G9fBzpsFxuJrqN/mZxBxayc6J8CbcxZdQH/YK3l+c4f0LL3+0wrJd6eUw+dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-text": "^9.4.36", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-carousel": { + "version": "9.6.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-carousel/-/react-carousel-9.6.7.tgz", + "integrity": "sha512-IW+QUZHUJCLL4wwoW2oyKH/DJpkxFt+W2eKYDq1sYJzSsKrkKppgwIgUq/kPzuByF7kXSHG7zkF6v9aeMi9S8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-aria": "^9.14.7", + "@fluentui/react-button": "^9.4.7", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-tooltip": "^9.6.7", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1", + "embla-carousel": "^8.5.1", + "embla-carousel-autoplay": "^8.5.1", + "embla-carousel-fade": "^8.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-carousel/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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-carousel/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@fluentui/react-checkbox": { + "version": "9.3.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.3.7.tgz", + "integrity": "sha512-1Yp51+lJ6FH5tcX7nd9TY+FcvnL2fsTO7LsQHDBzX5/jjAoaHW7PFJsfUdqlDev+22YYIoxdKlXA8gzcSVkH0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.2.7", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-label": "^9.1.87", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-color-picker": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-color-picker/-/react-color-picker-9.0.5.tgz", + "integrity": "sha512-eq+J18tZwM5xIhMILO9ywnj1SS0G7ihpYwBuC0T2+xY3LUTZjGv5Apj5t6g8LSSk3vgMKjlGD60CLLvmr4dJCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.3.4", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-color-picker/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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-color-picker/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@fluentui/react-combobox": { + "version": "9.14.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.14.7.tgz", + "integrity": "sha512-Z1FQmjUIYt3BRAQMBM7XRatCzaNJT52SGGjoqbsytpezy/zQd99ffwp19E19P5W5oDojsFEUBbbCsMSNjVpD5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-aria": "^9.14.7", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-field": "^9.2.7", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-portal": "^9.5.7", + "@fluentui/react-positioning": "^9.17.0", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-combobox/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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-combobox/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@fluentui/react-components": { + "version": "9.64.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.64.0.tgz", + "integrity": "sha512-JTR0aJih8kHGxcVBvO7vzJ6+Dy+sG5klEA9mzYzwH3QUXMMEfJlnC3JrABAnwmnhcCEx42/sqAJTOB0LXZapPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-accordion": "^9.6.9", + "@fluentui/react-alert": "9.0.0-beta.124", + "@fluentui/react-aria": "^9.14.7", + "@fluentui/react-avatar": "^9.7.7", + "@fluentui/react-badge": "^9.2.54", + "@fluentui/react-breadcrumb": "^9.1.7", + "@fluentui/react-button": "^9.4.7", + "@fluentui/react-card": "^9.2.6", + "@fluentui/react-carousel": "^9.6.7", + "@fluentui/react-checkbox": "^9.3.7", + "@fluentui/react-color-picker": "^9.0.5", + "@fluentui/react-combobox": "^9.14.7", + "@fluentui/react-dialog": "^9.12.9", + "@fluentui/react-divider": "^9.2.86", + "@fluentui/react-drawer": "^9.7.9", + "@fluentui/react-field": "^9.2.7", + "@fluentui/react-image": "^9.1.84", + "@fluentui/react-infobutton": "9.0.0-beta.102", + "@fluentui/react-infolabel": "^9.2.1", + "@fluentui/react-input": "^9.5.7", + "@fluentui/react-label": "^9.1.87", + "@fluentui/react-link": "^9.4.7", + "@fluentui/react-list": "^9.1.7", + "@fluentui/react-menu": "^9.16.7", + "@fluentui/react-message-bar": "^9.4.8", + "@fluentui/react-motion": "^9.7.3", + "@fluentui/react-overflow": "^9.3.7", + "@fluentui/react-persona": "^9.3.7", + "@fluentui/react-popover": "^9.10.7", + "@fluentui/react-portal": "^9.5.7", + "@fluentui/react-positioning": "^9.17.0", + "@fluentui/react-progress": "^9.2.7", + "@fluentui/react-provider": "^9.20.7", + "@fluentui/react-radio": "^9.3.7", + "@fluentui/react-rating": "^9.1.7", + "@fluentui/react-search": "^9.1.7", + "@fluentui/react-select": "^9.2.7", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-skeleton": "^9.2.7", + "@fluentui/react-slider": "^9.3.8", + "@fluentui/react-spinbutton": "^9.3.7", + "@fluentui/react-spinner": "^9.5.11", + "@fluentui/react-swatch-picker": "^9.2.7", + "@fluentui/react-switch": "^9.2.7", + "@fluentui/react-table": "^9.16.7", + "@fluentui/react-tabs": "^9.7.7", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-tag-picker": "^9.5.7", + "@fluentui/react-tags": "^9.5.5", + "@fluentui/react-teaching-popover": "^9.4.6", + "@fluentui/react-text": "^9.4.36", + "@fluentui/react-textarea": "^9.4.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-toast": "^9.4.9", + "@fluentui/react-toolbar": "^9.4.6", + "@fluentui/react-tooltip": "^9.6.7", + "@fluentui/react-tree": "^9.10.10", + "@fluentui/react-utilities": "^9.19.0", + "@fluentui/react-virtualizer": "9.0.0-alpha.96", + "@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-dialog": { + "version": "9.12.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.12.9.tgz", + "integrity": "sha512-UUibE18ZazXuvc7B9uI1QX6omY6iEWmPCEPH7hYqMdbRkr2kwZRdpsAhSZKQTMpPesAESeiosSVefmV0/u1EyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-aria": "^9.14.7", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-motion": "^9.7.3", + "@fluentui/react-motion-components-preview": "^0.5.0", + "@fluentui/react-portal": "^9.5.7", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-dialog/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@fluentui/react-divider": { + "version": "9.2.86", + "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.2.86.tgz", + "integrity": "sha512-8hzwDVdW7CkumW8XU16lsrrg6s0tNAIWdsFC4Utfb/BL2xgfJRdg/0q6Dzw12uhQHtssC3pKNQV0mp4ia0oqww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-drawer": { + "version": "9.7.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.7.9.tgz", + "integrity": "sha512-WdRV8NARmBkfe/146tNJrKgpsXN6JuE5t2QI8poGip3LEb/E0n9oZcBv3f0drdiLLwUP5QCvFLd9SeHWHHgnqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-dialog": "^9.12.9", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-motion": "^9.7.3", + "@fluentui/react-portal": "^9.5.7", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-field": { + "version": "9.2.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.2.7.tgz", + "integrity": "sha512-eFzgz+q1I7VYdRN2HNDMZOT/lBsanzXXtewFm2aAa2p1TCfcz+YHQepdQVv56zggSpu1SZ7wWSpN3cqU2zsTKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-label": "^9.1.87", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-field/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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-field/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@fluentui/react-icons": { + "version": "2.0.300", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.300.tgz", + "integrity": "sha512-NyeeklHWwK8IOqP4joErsHMek6+adVtWwYpEEKE9XuphxCRqMqZ9ZUerNB7OyjKnJELZ3lD/uCsSoeSbzBlnjQ==", + "dev": true, + "license": "MIT", + "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.84", + "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.1.84.tgz", + "integrity": "sha512-+8X9IPtNi+RLsSJEIODUfnnalPXLJpfqSyyjrVcm/xjEasCm77F1kMSzCGiHbFYvz7hq5g5I4B/OH4TjL+fcqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-infobutton": { + "version": "9.0.0-beta.102", + "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.102.tgz", + "integrity": "sha512-3kA4F0Vga8Ds6JGlBajLCCDOo/LmPuS786Wg7ui4ZTDYVIMzy1yp2XuVcZniifBFvEp0HQCUoDPWUV0VI3FfzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-icons": "^2.0.237", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-label": "^9.1.68", + "@fluentui/react-popover": "^9.9.6", + "@fluentui/react-tabster": "^9.21.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@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-infolabel": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-infolabel/-/react-infolabel-9.2.1.tgz", + "integrity": "sha512-ztXIG+M5/6ivNVgP/TAc9MQRlzm17qO7EEgu3E1ydHUqUdLj7lvfcGtLYZQP7+XNAamik76Ts+CGLbMA4KBtUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-label": "^9.1.87", + "@fluentui/react-popover": "^9.10.7", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "@types/react-dom": ">=16.8.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-input": { + "version": "9.5.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.5.7.tgz", + "integrity": "sha512-2pZIrJwaO6WxkFGr0wei/O83kCIFVVtAU8t7242W56LdE55g0oBcMfm7FC2/wGut/eBG9HUbAeL9BvhAvZT0Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.2.7", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-jsx-runtime": { + "version": "9.0.54", + "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.0.54.tgz", + "integrity": "sha512-zSkP9X/bAFg17QUDBs4bnbDUgeQSpSBVbH4nKYa3cZb78vV3e3m3nyADBvb97NYkywyd7CfIXq8iTpDWVEoWTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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.87", + "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.1.87.tgz", + "integrity": "sha512-vfUppmSWkpwXztHU21oGcduYQ9jldkPrFpl+/zWmbiOia5CKTMqJtHqLJMMe/W1uoNKqoNU37uVp3bZgIWUHJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-link": { + "version": "9.4.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.4.7.tgz", + "integrity": "sha512-bc8OoGmQ1ukyJZwNQK2aOmGKopZLy82CYQ5LcFd8pALbmRQ7DCPmjfA3WO2Ffuj8w5FjwOZ7D50R+ktP9oK8+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-list": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-list/-/react-list-9.1.7.tgz", + "integrity": "sha512-qmdhxgK6s3ok28XQ5j8yekzyI/RnNrHNuFx2T2/3dDK1r/5QqSnnW0zwQQKnT54NwYQjjh4fj1V4pfq2Cnbdaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-checkbox": "^9.3.7", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "@types/react-dom": ">=16.8.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-list/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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-list/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@fluentui/react-menu": { + "version": "9.16.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.16.7.tgz", + "integrity": "sha512-1fkdfYI7ZxDlJUMjuYGTb3YUlsDZHht4bxb3hi3SpBbMcR5qWADRHSWdbt18ZzBkVW0gtWbwDf+R2rrOK9h/fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-aria": "^9.14.7", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-portal": "^9.5.7", + "@fluentui/react-positioning": "^9.17.0", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-menu/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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-menu/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@fluentui/react-message-bar": { + "version": "9.4.8", + "resolved": "https://registry.npmjs.org/@fluentui/react-message-bar/-/react-message-bar-9.4.8.tgz", + "integrity": "sha512-L0UTPqYTjzvSubitV25TDP4wQXsB5TVdOOIdxCZ6p1AYWO9KUWbTWcl3hoP/KUDSjLAT+pH8Ks3UTcqanCwLVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-button": "^9.4.7", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-link": "^9.4.7", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1", + "react-transition-group": "^4.4.1" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "@types/react-dom": ">=16.8.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-motion": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-motion/-/react-motion-9.7.3.tgz", + "integrity": "sha512-Zw9/xINOPrKToXf3XYAUwPNYGyf/xYvpK2ukbtFvQnnKve81pnMhjXz1LGmPFS9ZPkpuhvwPfLV61EvuO+xRBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-utilities": "^9.19.0", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "@types/react-dom": ">=16.8.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-motion-components-preview": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-motion-components-preview/-/react-motion-components-preview-0.5.0.tgz", + "integrity": "sha512-vlwDF0wot/chaWBxwnqJZ7uzkmouV7TditwN06hTGGdMM4XPd4wrE+5VuqBGWho/Bo9/aeskTfW+n8oDXzYOBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-motion": "*", + "@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-overflow": { + "version": "9.3.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.3.7.tgz", + "integrity": "sha512-7m1WYT+VY36IHquEPSjuT0CQl65cW5OjfNhEd9ew30Wv21QnR6EbGDJGhbP2PhonBrqLpY3P9XyF5AZPFPq34A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/priority-overflow": "^9.1.15", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-overflow/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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-overflow/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@fluentui/react-persona": { + "version": "9.3.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.3.7.tgz", + "integrity": "sha512-GYfWlyPCzFdwfr57HwSRUBHx1neeL0RruQondVzGCpdvwwkGj22fue+veF7ticMemxJF72B86fUWe8TEuB/vnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-avatar": "^9.7.7", + "@fluentui/react-badge": "^9.2.54", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-popover": { + "version": "9.10.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.10.7.tgz", + "integrity": "sha512-IgTPa+zUsIrOFzHo4hyTaO47x6Vn16E+5ZdcjHHj8oU61oulDRO/f1rJ1CBnHGQng9/n51spZaC011Q7Qg4kFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-aria": "^9.14.7", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-portal": "^9.5.7", + "@fluentui/react-positioning": "^9.17.0", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-popover/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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-popover/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@fluentui/react-portal": { + "version": "9.5.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.5.7.tgz", + "integrity": "sha512-jRFW42EhHA/8Kk54cH9mqzou/vP3lfwnGxW76Uii1Zla/ULTFFO8zLO2FXVty/DkqSMYEWip8Lud3bEFPeD+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-utilities": "^9.19.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-positioning": { + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.17.0.tgz", + "integrity": "sha512-ktczawcHCvxsh67Aakh8FyTs7BLyDYhXouLb2EOaWeZf3m7wr63B2jowdm7MdjQfc/XNoGb13oZy5PFPXIH/cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/devtools": "0.2.1", + "@floating-ui/dom": "^1.6.12", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-progress": { + "version": "9.2.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.2.7.tgz", + "integrity": "sha512-obY+X2Z+RWaupcn+XMroUp1P4rn4rdkinRhEa86ZZRasgONBQafhpko6zm0lf+hmDwym2yl0bkuXvjiG60z+wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.2.7", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-provider": { + "version": "9.20.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.20.7.tgz", + "integrity": "sha512-GzRqru/xzLaR3AA7VjCpTCRQ9tM5noFNTPeCs3Q7bpetA49ow+5hvvh8YTymCAMC+JVawKSVrdYWnV1MOrZL5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@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.3.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.3.7.tgz", + "integrity": "sha512-JJHNMbXRXiXfQjKe1zRMmwRo+B4oWDhFGzxbxtzawrxHLbhewfriK1+7V39s/JwUyy61iciYjainjdsdTku3Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.2.7", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-label": "^9.1.87", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-rating": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-rating/-/react-rating-9.1.7.tgz", + "integrity": "sha512-teGi+mlhw5Kps7Ex0m5Elh9SQgwlBIZ92Dg3gUxTRsXhCHiMTNMtGCaO0rwpOwJgs+ZoQTNszZod/jeZY2fd4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "@types/react-dom": ">=16.8.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-search": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-search/-/react-search-9.1.7.tgz", + "integrity": "sha512-ZY2a79x23QXFJYa2JBc63DKzdHkcjQMUEqo69A53sbByrhxLDb6M96+VP5Y0QLScpMfQ0+jy1UwN1yoo86JZ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-input": "^9.5.7", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-select": { + "version": "9.2.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.2.7.tgz", + "integrity": "sha512-cqhqz0Ty66YJJiFvVGWziThqceZzlZnTqKF4WVFhWrDwir8n6VvRjBSvzXhTYiVabVvCW8iGAklYGnZebRfYuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.2.7", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-shared-contexts": { + "version": "9.23.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.23.1.tgz", + "integrity": "sha512-mP+7talxLz7n0G36o7Asdvst+JPzUbqbnoMKUWRVB5YwzlOXumEgaQDgL1BkRUJYaDGOjIiSTUjHOEkBt7iSdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-theme": "^9.1.24", + "@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.2.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.2.7.tgz", + "integrity": "sha512-YVsH2ZIJGVWe5jC1O48I90sJawsjX752bKyepT8i+MAr2ngN8uf5MkGiozc16hW6k4LC0L0C+62SI1Cweiy01g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.2.7", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-slider": { + "version": "9.3.8", + "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.3.8.tgz", + "integrity": "sha512-1VMOD6uRJMmNAoZNJ4P+EK9dWGlLzMjTk2DPBZ+lfHCpWGHZ77aaX96hUMt57lVhZNho/u9fn99+U4IzAwGXIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.2.7", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-spinbutton": { + "version": "9.3.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.3.7.tgz", + "integrity": "sha512-chrVaxKnSAcg6SirJuXt/TNweh5MmGJm/Q6/DFdu5y4chGYCne4so26ZxxYv/N6Lt1vrojJmUMtSLwarE3O87w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-field": "^9.2.7", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-spinner": { + "version": "9.5.11", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.5.11.tgz", + "integrity": "sha512-q0mJLG7LfWSRqa2fO+Qvxw/noZWjk3HM4wurbddTOClezTcBlMXlYlad7rueu9TpzM5caGsWcMF791/gNYLHmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-label": "^9.1.87", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-swatch-picker": { + "version": "9.2.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-swatch-picker/-/react-swatch-picker-9.2.7.tgz", + "integrity": "sha512-/uZaRg356I4jQYrXIStlYVj1lWxHMZCx4MmIId9MTvqK64dve/yHvmHaXF0SE2El/tD7oHOLTBPfXSZA739Ytg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-field": "^9.2.7", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "@types/react-dom": ">=16.8.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-swatch-picker/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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-swatch-picker/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@fluentui/react-switch": { + "version": "9.2.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.2.7.tgz", + "integrity": "sha512-nfApUdFbdUEXu+0Q0OdW9jJxPj4K2zUf64blQWG73262kulD56hmE6rXx5cpE3sjuLR5ImsNLg+XDULf6hLo7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.2.7", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-label": "^9.1.87", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-table": { + "version": "9.16.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.16.7.tgz", + "integrity": "sha512-9GW0rlDHxXOCxNNtSAIer9FgL67lcy2G8U2Zmihi7RKwS9gQONWwXnUELvheKUixWXo+hbjATb7eo6xibz87kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-aria": "^9.14.7", + "@fluentui/react-avatar": "^9.7.7", + "@fluentui/react-checkbox": "^9.3.7", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-radio": "^9.3.7", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-table/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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-table/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@fluentui/react-tabs": { + "version": "9.7.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.7.7.tgz", + "integrity": "sha512-E0fAXxjTf6+NH/E1HpxaPVG9uno12tBry9ss+oMiBaMEpt1i0CUmKpo/EOv3PECyTuX0gjxX4SeDWGstI/ymjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-tabs/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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-tabs/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@fluentui/react-tabster": { + "version": "9.24.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.24.7.tgz", + "integrity": "sha512-GfJ7rOtqCML9xWFMpjoI/5XzLEOy3g2nk3PIXlwg7nhcY/swVcCJ6/X8njJHNeMY3QZqaQChRG9A+QwxVoAZcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1", + "keyborg": "^2.6.0", + "tabster": "^8.5.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-tag-picker": { + "version": "9.5.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-tag-picker/-/react-tag-picker-9.5.7.tgz", + "integrity": "sha512-lrCgVm43UasWWRE7QhZPwX//b/n03jpuz3G4zGffGbh+j2SytHytInCL7hJ0PbJZNZyo92vRs2Zmg2CymFKSIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-aria": "^9.14.7", + "@fluentui/react-combobox": "^9.14.7", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-field": "^9.2.7", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-portal": "^9.5.7", + "@fluentui/react-positioning": "^9.17.0", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-tags": "^9.5.5", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-tag-picker/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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-tag-picker/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@fluentui/react-tags": { + "version": "9.5.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-tags/-/react-tags-9.5.5.tgz", + "integrity": "sha512-/s5PKrMakZuSPrlVYnym0BI3Sj0sSzcsJOcG8i5OMbVoC5M+XOIk1MSTCsoUPqevI0sekdE9kuPsHZ3QJ3dOfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-aria": "^9.14.7", + "@fluentui/react-avatar": "^9.7.7", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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-teaching-popover": { + "version": "9.4.6", + "resolved": "https://registry.npmjs.org/@fluentui/react-teaching-popover/-/react-teaching-popover-9.4.6.tgz", + "integrity": "sha512-4mcsxbeV3YAwEETdJPxoRsekOwhwDxQTTRsFIhh/XDYqBGOl/9kTW+os0ncao3825LQVE5b2/rtEQH+sPrgZKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-aria": "^9.14.7", + "@fluentui/react-button": "^9.4.7", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-popover": "^9.10.7", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1", + "use-sync-external-store": "^1.2.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "@types/react-dom": ">=16.8.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-teaching-popover/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@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-teaching-popover/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@fluentui/react-text": { + "version": "9.4.36", + "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.4.36.tgz", + "integrity": "sha512-oLSGz6uksooCQrc+FXvWwAZCP+ucn2h12vZFyWSAOVODDtQMjtycol03p408BEHnPBQbrYaQCFpd3Id5eLuxBg==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "license": "MIT", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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/@esbuild/win32-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", - "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", - "cpu": [ - "ia32" - ], + "node_modules/@fluentui/react-textarea": { + "version": "9.4.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.4.7.tgz", + "integrity": "sha512-GwGlSaxJy8Gv/GJCvHsvGJmlqTJXey/7YzF2dCeWrEoVk1r6k8cxtDtUafmWMdgjBZLJwC3BCHQuXYwTXEwYEQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "license": "MIT", + "dependencies": { + "@fluentui/react-field": "^9.2.7", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.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/@esbuild/win32-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", - "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", - "cpu": [ - "x64" - ], + "node_modules/@fluentui/react-theme": { + "version": "9.1.24", + "resolved": "https://registry.npmjs.org/@fluentui/react-theme/-/react-theme-9.1.24.tgz", + "integrity": "sha512-OhVKYD7CMYHxzJEn4PtIszledj8hbQJNWBMfIZsp4Sytdp9vCi0txIQUx4BhS1WqtQPhNGCF16eW9Q3NRrnIrQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "license": "MIT", + "dependencies": { + "@fluentui/tokens": "1.0.0-alpha.21", + "@swc/helpers": "^0.5.1" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "node_modules/@fluentui/react-toast": { + "version": "9.4.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-toast/-/react-toast-9.4.9.tgz", + "integrity": "sha512-lAHH6nzogbKXwq9V656qACvhs42pBptQwcafzYV9n4V9viIFf3JpJm9Th0YbPmxzvHP9Ps9DKtaU1jr2W6CdeQ==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-aria": "^9.14.7", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-motion": "^9.7.3", + "@fluentui/react-motion-components-preview": "^0.5.0", + "@fluentui/react-portal": "^9.5.7", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.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-toolbar": { + "version": "9.4.6", + "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.4.6.tgz", + "integrity": "sha512-posqf792aDz0B9DKIGXnzU4Q78BMZXuyD6tWXdtgJjFNGsOYxOPt5WKAtESaxYEJpgnbUBz8u1d/w5mGApAaYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-button": "^9.4.7", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-divider": "^9.2.86", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-radio": "^9.3.7", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" }, - "funding": { - "url": "https://opencollective.com/eslint" + "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/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/react-utilities": "^9.19.0", + "@swc/helpers": "^0.5.1" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "@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/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "node_modules/@fluentui/react-toolbar/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@fluentui/react-tooltip": { + "version": "9.6.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.6.7.tgz", + "integrity": "sha512-NO7zCcd8P57lQs8tHTpiVW1zGMEMf2YqGclZKhztD03XuyQBsqlDv/1PLLhZCMhkln6gWd9KS64jyt7us2XKkA==", "dev": true, + "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-portal": "^9.5.7", + "@fluentui/react-positioning": "^9.17.0", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.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-tree": { + "version": "9.10.10", + "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.10.10.tgz", + "integrity": "sha512-ZlG+IqU0r76B6cmBso75dJAAzZUUhX5M/+SluU/4UDGOv8HAhNlY4Z6Xjb0vnYXuIDL4AEt9mS7Z4Ove26Hq7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-aria": "^9.14.7", + "@fluentui/react-avatar": "^9.7.7", + "@fluentui/react-button": "^9.4.7", + "@fluentui/react-checkbox": "^9.3.7", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-motion": "^9.7.3", + "@fluentui/react-motion-components-preview": "^0.5.0", + "@fluentui/react-radio": "^9.3.7", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.7", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" }, - "funding": { - "url": "https://opencollective.com/eslint" + "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/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@fluentui/react-tree/node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", + "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@fluentui/react-utilities": "^9.19.0", + "@swc/helpers": "^0.5.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "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/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@fluentui/react-tree/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "loose-envify": "^1.1.0" } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "node_modules/@fluentui/react-utilities": { + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.19.0.tgz", + "integrity": "sha512-66Kdpr4xZsov6KSqbPDmKR5CB96RUPZuWihMC3RYHj9uH+oxd81k2Jyrb6rM058xjVKDFSFVLUZlsp1Mgts38w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-shared-contexts": "^9.23.1", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "react": ">=16.14.0 <19.0.0" + } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@fluentui/react-virtualizer": { + "version": "9.0.0-alpha.96", + "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.96.tgz", + "integrity": "sha512-0o9RSTAAIoJ4xdM2g8hF5u98Up0OHRknRhMolZHZDoqXEvhJ5GroGtp+NPfU7LxU+dxHrZLx9gQ6wVWe/35ZzQ==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" }, - "engines": { - "node": "*" + "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/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "node_modules/@fluentui/tokens": { + "version": "1.0.0-alpha.21", + "resolved": "https://registry.npmjs.org/@fluentui/tokens/-/tokens-1.0.0-alpha.21.tgz", + "integrity": "sha512-xQ1T56sNgDFGl+kJdIwhz67mHng8vcwO7Dvx5Uja4t+NRULQBgMcJ4reUo4FGF3TjufHj08pP0/OnKQgnOaSVg==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.1" } }, "node_modules/@fortawesome/fontawesome-common-types": { @@ -2684,6 +4816,45 @@ "integrity": "sha512-gIhjdJp/c2beaIWWIlsXdqXVRUz3r2BxBCpfz/F3JXHvSAQ1paMYjLH+maEATtENg+k5eLV7gA+9yPp762ieuw==", "dev": true }, + "node_modules/@griffel/core": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@griffel/core/-/core-1.19.2.tgz", + "integrity": "sha512-WkB/QQkjy9dE4vrNYGhQvRRUHFkYVOuaznVOMNTDT4pS9aTJ9XPrMTXXlkpcwaf0D3vNKoerj4zAwnU2lBzbOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@griffel/style-types": "^1.3.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.30", + "resolved": "https://registry.npmjs.org/@griffel/react/-/react-1.5.30.tgz", + "integrity": "sha512-1q4ojbEVFY5YA0j1NamP0WWF4BKh+GHsVugltDYeEgEaVbH3odJ7tJabuhQgY+7Nhka0pyEFWSiHJev0K3FSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@griffel/core": "^1.19.2", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.8.0 <20.0.0" + } + }, + "node_modules/@griffel/style-types": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@griffel/style-types/-/style-types-1.3.0.tgz", + "integrity": "sha512-bHwD3sUE84Xwv4dH011gOKe1jul77M1S6ZFN9Tnq8pvZ48UMdY//vtES6fv7GRS5wXYT4iqxQPBluAiYAfkpmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.1.3" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -6291,6 +8462,16 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, "node_modules/@tools/accessibility": { "resolved": "packages/tools/accessibility", "link": true @@ -10360,6 +12541,17 @@ "utila": "~0.4" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -10527,6 +12719,33 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.158.tgz", "integrity": "sha512-9vcp2xHhkvraY6AHw2WMi+GDSLPX42qe2xjYaVoZqFRJiOcilVQFq9mZmpuHEQpzlgGDelKlV7ZiGcmMsc8WxQ==" }, + "node_modules/embla-carousel": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", + "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/embla-carousel-autoplay": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-autoplay/-/embla-carousel-autoplay-8.6.0.tgz", + "integrity": "sha512-OBu5G3nwaSXkZCo1A6LTaFMZ8EpkYbwIaH+bPqdBnDGQ2fh4+NbzjXjs2SktoPNKCtflfVMc75njaDHOYXcrsA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/embla-carousel-fade": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-fade/-/embla-carousel-fade-8.6.0.tgz", + "integrity": "sha512-qaYsx5mwCz72ZrjlsXgs1nKejSrW+UhkbOMwLgfRT7w2LtdEB03nPRI06GHuHv5ac2USvbEiX2/nAHctcDwvpg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", @@ -16219,6 +18438,13 @@ "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", "dev": true }, + "node_modules/keyborg": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/keyborg/-/keyborg-2.6.0.tgz", + "integrity": "sha512-o5kvLbuTF+o326CMVYpjlaykxqYP9DphFQZ2ZpgrvBouyvOxyEB7oqe8nOLFpiV5VCtz0D3pt8gXQYWpLpBnmA==", + "dev": true, + "license": "MIT" + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -20735,6 +22961,23 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/read": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/read/-/read-3.0.1.tgz", @@ -21564,6 +23807,16 @@ "node": ">= 8" } }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", @@ -22949,6 +25202,13 @@ "webpack": "^5.0.0" } }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "dev": true, + "license": "MIT" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -23114,6 +25374,34 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/tabster": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/tabster/-/tabster-8.5.5.tgz", + "integrity": "sha512-fqoBWIZRPJ2LuAqQWbGGE1KkKz6sX+6ROOeHlXIyRM7qD7XZK0gWc50mJbI8G48wuy8201/kvGkYq3p+QmSTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "keyborg": "2.6.0", + "tslib": "^2.8.1" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.40.0" + } + }, + "node_modules/tabster/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz", + "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/tapable": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", @@ -24320,6 +26608,16 @@ "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" }, + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/utf-8-validate": { "version": "5.0.10", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", @@ -25691,6 +27989,21 @@ "sass": "^1.62.1" } }, + "packages/dev/inspector-v2": { + "name": "@dev/inspector-v2", + "version": "1.0.0", + "extraneous": true, + "devDependencies": { + "@dev/core": "1.0.0", + "@dev/loaders": "1.0.0", + "@dev/shared-ui-components": "^1.0.0", + "@fluentui/react-components": "^9.62.0", + "@fluentui/react-icons": "^2.0.271", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "usehooks-ts": "^3.1.1" + } + }, "packages/dev/loaders": { "name": "@dev/loaders", "version": "1.0.0", @@ -25736,12 +28049,16 @@ "@babel/core": "^7.17.9", "@dev/core": "^1.0.0", "@dev/gui": "^1.0.0", + "@fluentui/react-components": "^9.62.0", + "@fluentui/react-icons": "^2.0.271", "@fortawesome/fontawesome-svg-core": "^6.1.0", "@fortawesome/free-solid-svg-icons": "^6.0.0", "@fortawesome/react-fontawesome": "^0.2.0", "sass": "^1.62.1" }, "peerDependencies": { + "@fluentui/react-components": "^9.62.0", + "@fluentui/react-icons": "^2.0.271", "@fortawesome/fontawesome-svg-core": "^6.1.0", "@fortawesome/free-solid-svg-icons": "^6.1.0", "@fortawesome/react-fontawesome": "^0.2.0", diff --git a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGridTabComponent.tsx b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGridTabComponent.tsx index 527d7d5338b..505ae89cb26 100644 --- a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGridTabComponent.tsx +++ b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGridTabComponent.tsx @@ -116,6 +116,7 @@ import { SkyMaterialPropertyGridComponent } from "./propertyGrids/materials/skyM import { Tags } from "core/Misc/tags"; import { LineContainerComponent } from "shared-ui-components/lines/lineContainerComponent"; import type { RectAreaLight } from "core/Lights/rectAreaLight"; +import { FluentToolWrapper } from "shared-ui-components/fluent/hoc/fluentToolWrapper"; export class PropertyGridTabComponent extends PaneComponent { private _timerIntervalId: number; @@ -774,15 +775,17 @@ export class PropertyGridTabComponent extends PaneComponent { const entity = this.props.selectedEntity || {}; const entityHasMetadataProp = Object.prototype.hasOwnProperty.call(entity, "metadata"); return ( -
- {this.renderContent()} - {Tags.HasTags(entity) && ( - -
{this.renderTags()}
-
- )} - {entityHasMetadataProp && } -
+ +
+ {this.renderContent()} + {Tags.HasTags(entity) && ( + +
{this.renderTags()}
+
+ )} + {entityHasMetadataProp && } +
+
); } } diff --git a/packages/dev/sharedUiComponents/package.json b/packages/dev/sharedUiComponents/package.json index 8aac42ca749..05a6eef119b 100644 --- a/packages/dev/sharedUiComponents/package.json +++ b/packages/dev/sharedUiComponents/package.json @@ -24,6 +24,8 @@ "@fortawesome/fontawesome-svg-core": "^6.1.0", "@fortawesome/free-solid-svg-icons": "^6.1.0", "@fortawesome/react-fontawesome": "^0.2.0", + "@fluentui/react-components": "^9.62.0", + "@fluentui/react-icons": "^2.0.271", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", "react": "^18.2.0", @@ -38,6 +40,8 @@ "@fortawesome/fontawesome-svg-core": "^6.1.0", "@fortawesome/free-solid-svg-icons": "^6.0.0", "@fortawesome/react-fontawesome": "^0.2.0", + "@fluentui/react-components": "^9.62.0", + "@fluentui/react-icons": "^2.0.271", "sass": "^1.62.1" }, "sideEffects": false, diff --git a/packages/dev/sharedUiComponents/src/fluent/hoc/colorPropertyLine.tsx b/packages/dev/sharedUiComponents/src/fluent/hoc/colorPropertyLine.tsx new file mode 100644 index 00000000000..0a2722c9f5c --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/hoc/colorPropertyLine.tsx @@ -0,0 +1,32 @@ +// eslint-disable-next-line import/no-internal-modules +import { Color3, Color4 } from "core/index"; + +import { IPropertyLineProps, PropertyLine } from "shared-ui-components/fluent/hoc/propertyLine"; +import { SyncedSliderLine } from "./syncedSliderLine"; +import { FunctionComponent } from "react"; + +type IColorPropertyLineProps = Omit & { + color: Color3 | Color4; +}; + +/** + * Reusable component which renders a color property line containing a label, colorPicker popout, and expandable RGBA values + * The expandable RGBA values are synced sliders that allow the user to modify the color's RGBA values directly + */ +export const ColorPropertyLine: FunctionComponent = (props: IColorPropertyLineProps) => { + const renderRGBExpand = (color: Color3 | Color4) => { + return ( + <> + + + + {color instanceof Color4 && } + + ); + }; + return ( + renderRGBExpand(props.color)}> + {props.color.toString()} + + ); +}; diff --git a/packages/dev/sharedUiComponents/src/fluent/hoc/fluentToolWrapper.tsx b/packages/dev/sharedUiComponents/src/fluent/hoc/fluentToolWrapper.tsx new file mode 100644 index 00000000000..cfeae261a13 --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/hoc/fluentToolWrapper.tsx @@ -0,0 +1,27 @@ +import { FluentProvider, Theme, webDarkTheme } from "@fluentui/react-components"; +import { createContext, FunctionComponent } from "react"; + +export interface ToolHostProps { + children: React.ReactNode; + customTheme?: Theme; +} + +export const ToolContext = createContext<{ useFluent: boolean }>({ useFluent: false }); + +/** + * For tools which are ready to move over the fluent, wrap the root of the tool (or the panel which you want fluentized) with this component + * Today we will only enable fluent if the URL has the `newUX` query parameter is truthy + * @param props + * @returns + */ +export const FluentToolWrapper: FunctionComponent = (props: ToolHostProps) => { + const url = window.location.href; + const enableFluent = /[\?&]newUX=(1|true)/.test(url); // Super forgiving approach, checks for newUX before/after the hash to enable quick dev loop + return enableFluent ? ( + + {props.children} + + ) : ( + props.children + ); +}; diff --git a/packages/dev/sharedUiComponents/src/fluent/hoc/propertyLine.tsx b/packages/dev/sharedUiComponents/src/fluent/hoc/propertyLine.tsx new file mode 100644 index 00000000000..5ba5f29fd32 --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/hoc/propertyLine.tsx @@ -0,0 +1,98 @@ +import { Body1Strong, Button, InfoLabel, makeStyles, tokens } from "@fluentui/react-components"; +import { Add24Filled, Copy24Regular, Subtract24Filled } from "@fluentui/react-icons"; +import { ComponentType, FunctionComponent, useState } from "react"; +import { copyCommandToClipboard } from "shared-ui-components/copyCommandToClipboard"; + +const usePropertyLineStyle = makeStyles({ + container: { + width: "100%", + display: "flex", + flexDirection: "column", // Stack line + expanded content + borderBottom: "1px solid #eee", + }, + line: { + display: "flex", + alignItems: "center", + justifyContent: "flex-start", + padding: `${tokens.spacingVerticalXS} 0px`, + width: "100%", + }, + label: { + width: "33%", + textAlign: "left", + }, + rightContent: { + width: "67%", + display: "flex", + alignItems: "center", + justifyContent: "flex-end", + }, + button: { + marginLeft: "10px", + width: "100px", + }, + fillRestOfRightContentWidth: { + flex: 1, + display: "flex", + justifyContent: "flex-end", + alignItems: "center", + }, + expandedContent: { + padding: "8px 12px", + backgroundColor: "#f9f9f9", + }, +}); + +export interface IPropertyLineProps { + children: React.ReactNode; + label: string; // The name of the property to display in the propetryline + description?: string; // if passed, the property line label will have a tooltip with this description + onCopy?: () => string; // Optional function returning a string to copy to clipboard + renderExpandedContent?: ComponentType; // If supplied, the propertyline will render an 'expand' icon which when clicked renders this component within the property line +} + +export const PropertyLine: FunctionComponent = (props: IPropertyLineProps) => { + const styles = usePropertyLineStyle(); + const [expanded, setExpanded] = useState(false); + + return ( +
+
+ + {props.label} + +
+
{props.children}
+ + {props.renderExpandedContent && ( +
+
+ + {expanded && props.renderExpandedContent && ( +
+ +
+ )} +
+ ); +}; diff --git a/packages/dev/sharedUiComponents/src/fluent/hoc/syncedSliderLine.tsx b/packages/dev/sharedUiComponents/src/fluent/hoc/syncedSliderLine.tsx new file mode 100644 index 00000000000..de22cd77acc --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/hoc/syncedSliderLine.tsx @@ -0,0 +1,36 @@ +import { IPropertyLineProps, PropertyLine } from "./propertyLine"; +import { SyncedSliderInput, SyncedSliderProps } from "../primitives/syncedSlider"; + +type KeyOf = string & keyof O; +export type SyncedSliderLineProps> = Omit & + Omit & { + validKey: K; + obj: O; + onChange?: (value: number) => void; + }; + +/** + * Renders a SyncedSlider within a PropertyLine for a given key/value pair, where the value is number (ex: can be used for a color's RGBA values, a vector's XYZ values, etc) + * When value changes, updates the object with the new value and calls the onChange callback. + * + * Example usage looks like + * + * + * @param param0 + * @returns + */ + +export const SyncedSliderLine = , K extends KeyOf>(props: SyncedSliderLineProps): React.ReactElement => { + return ( + + { + props.obj[props.validKey] = val as O[K]; + props.onChange?.(val); + }} + /> + + ); +}; diff --git a/packages/dev/sharedUiComponents/src/fluent/hoc/vectorPropertyLine.tsx b/packages/dev/sharedUiComponents/src/fluent/hoc/vectorPropertyLine.tsx new file mode 100644 index 00000000000..0a923be3e36 --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/hoc/vectorPropertyLine.tsx @@ -0,0 +1,36 @@ +// eslint-disable-next-line import/no-internal-modules +import { Vector3, Vector4 } from "core/index"; + +import { PropertyLine } from "shared-ui-components/fluent/hoc/propertyLine"; +import { SyncedSliderLine } from "./syncedSliderLine"; +import { FunctionComponent } from "react"; +import { Body1 } from "@fluentui/react-components"; + +type IVectorPropertyLineProps = { + vector: Vector3 | Vector4; + label: string; + min?: number; + max?: number; +}; + +/** + * Reusable component which renders a vector property line containing a label, vector value, and expandable XYZW values + * The expanded section contains a slider/input box for each component of the vector (x, y, z, w) + */ +export const VectorPropertyLine: FunctionComponent = ({ vector, label, min, max }) => { + const renderXYZExpand = (vector: Vector3 | Vector4) => { + return ( + <> + + + + {vector instanceof Vector4 && } + + ); + }; + return ( + renderXYZExpand(vector)}> + {vector.toString()} + + ); +}; diff --git a/packages/dev/sharedUiComponents/src/fluent/primitives/button.tsx b/packages/dev/sharedUiComponents/src/fluent/primitives/button.tsx new file mode 100644 index 00000000000..0177839171a --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/primitives/button.tsx @@ -0,0 +1,29 @@ +import { FunctionComponent } from "react"; +import { Button as FluentButton, ButtonProps, makeStyles } from "@fluentui/react-components"; + +type OurButtonProps = { + label?: string; + iconStr?: string; + iconLabel?: string; +}; + +const useButtonStyles = makeStyles({ + button: { + width: "100%", + }, +}); + +export const ButtonLine: FunctionComponent = (props: ButtonProps & OurButtonProps) => { + const styles = useButtonStyles(); + + return ( + } + {...props} + > + {props.label} + + ); +}; diff --git a/packages/dev/sharedUiComponents/src/fluent/primitives/dropdown.tsx b/packages/dev/sharedUiComponents/src/fluent/primitives/dropdown.tsx new file mode 100644 index 00000000000..429820bb1ce --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/primitives/dropdown.tsx @@ -0,0 +1,30 @@ +import { Dropdown as FluentDropdown, makeStyles, Option } from "@fluentui/react-components"; +import { IInspectableOptions } from "core/Misc"; + +const useDropdownStyles = makeStyles({ + dropdownOption: { + textAlign: "right", + minWidth: "40px", + }, + optionsLine: {}, +}); + +export const Dropdown = (props: { options: IInspectableOptions[]; onSelect: (o: string) => void; defaultValue: string | number }) => { + const styles = useDropdownStyles(); + return ( + { + data.optionValue != undefined && props.onSelect(data.optionValue); + }} + defaultValue={props.options.find((o) => o.value === props.defaultValue)?.label} + defaultSelectedOptions={[props.defaultValue.toString()]} + > + {props.options.map((option: IInspectableOptions, i: number) => ( + + ))} + + ); +}; diff --git a/packages/dev/sharedUiComponents/src/fluent/primitives/input.tsx b/packages/dev/sharedUiComponents/src/fluent/primitives/input.tsx new file mode 100644 index 00000000000..0f72fa2e099 --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/primitives/input.tsx @@ -0,0 +1,44 @@ +import { Input as FluentInput, InputProps as FluentInputProps, makeStyles } from "@fluentui/react-components"; +import { FunctionComponent, useEffect, useState } from "react"; + +const useInputStyles = makeStyles({ + text: { + height: "auto", + }, + float: { + height: "auto", + width: "80px", // Fixed width for number input + flexShrink: 0, + }, +}); + +/** + * This is an input text box that stops propagation of change events and sets its width based on the type of input (text or number) + * @param props + * @returns + */ +export const Input: FunctionComponent = (props: FluentInputProps) => { + const styles = useInputStyles(); + const [value, setValue] = useState(props.value || ""); + + useEffect(() => { + setValue(props.value || ""); // Update local state when props.value changes + }, [props.value]); + + const handleChange = (event: React.ChangeEvent, data: any) => { + event.stopPropagation(); // Prevent event propagation + if (props.onChange) { + props.onChange(event, data); // Call the original onChange handler passed as prop + } + setValue(event.target.value); // Update local state with the new value + }; + + const handleKeyDown = (event: React.KeyboardEvent) => { + event.stopPropagation(); // Prevent event propagation + if (props.onKeyDown) { + props.onKeyDown(event); // Call the original onKeyDown handler passed as prop + } + }; + + return ; +}; diff --git a/packages/dev/sharedUiComponents/src/fluent/primitives/link.tsx b/packages/dev/sharedUiComponents/src/fluent/primitives/link.tsx new file mode 100644 index 00000000000..45be9397269 --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/primitives/link.tsx @@ -0,0 +1,21 @@ +// No special styling / functionality yet! + +export { Link } from "@fluentui/react-components"; + +// import { Link as FluentLink, LinkProps as FluentLinkProps, makeStyles } from "@fluentui/react-components"; +// import { FunctionComponent } from "react"; + +// const useLinkStyles = makeStyles({ +// link: { +// textDecoration: "none", +// }, +// }); + +// /** +// * This is a primitive fluent link component which also has the ability to either linking to a URL or another entity +// */ +// export const Link: FunctionComponent = (props: FluentLinkProps) => { +// const classes = useLinkStyles(); + +// return ; +// }; diff --git a/packages/dev/sharedUiComponents/src/fluent/primitives/switch.tsx b/packages/dev/sharedUiComponents/src/fluent/primitives/switch.tsx new file mode 100644 index 00000000000..8705749d194 --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/primitives/switch.tsx @@ -0,0 +1,33 @@ +// eslint-disable-next-line import/no-internal-modules + +import type { SwitchOnChangeData, SwitchProps as FluentSwitchProps } from "@fluentui/react-components"; +import type { ChangeEvent, FunctionComponent } from "react"; + +import { makeStyles, Switch as FluentSwitch } from "@fluentui/react-components"; +import { useCallback, useMemo, useState } from "react"; + +const useSwitchStyles = makeStyles({ + switch: { + marginLeft: "auto", + }, + indicator: { + marginRight: 0, + }, +}); + +/** + * This is a primitive fluent boolean switch component whose only knowledge is the shared styling across all tools + */ +export const Switch: FunctionComponent = (props: FluentSwitchProps) => { + const classes = useSwitchStyles(); + const indicatorProps = useMemo(() => ({ className: classes.indicator }), [classes.indicator]); + + const [checked, setChecked] = useState(() => props.checked ?? false); + + const onChange = useCallback((event: ChangeEvent, data: SwitchOnChangeData) => { + props.onChange && props.onChange(event, data); + setChecked(event.target.checked); + }, []); + + return ; +}; diff --git a/packages/dev/sharedUiComponents/src/fluent/primitives/syncedSlider.tsx b/packages/dev/sharedUiComponents/src/fluent/primitives/syncedSlider.tsx new file mode 100644 index 00000000000..5a632a347c5 --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/primitives/syncedSlider.tsx @@ -0,0 +1,54 @@ +import { InputProps, makeStyles, Slider, SliderProps } from "@fluentui/react-components"; +import { Input } from "./input"; +import { FunctionComponent, useState } from "react"; + +const useSyncedSliderStyles = makeStyles({ + syncedSlider: { + display: "flex", + alignItems: "center", + gap: "1rem", + width: "100%", // Only fill available space + }, + slider: { + flexGrow: 1, // Let slider grow + minWidth: 0, // Allow shrink if needed + }, + input: { + width: "80px", // Fixed width for number input + flexShrink: 0, + }, +}); + +export type SyncedSliderProps = Omit & { + onChange: (value: number) => void; // Callback to notify parent of value change, override both of the slider/input handlers + value: number; // Controlled value for the slider and input +}; + +/** + * Component which synchronizes a slider and an input field, allowing the user to change a value using either control + * @param props + * @returns + */ +export const SyncedSliderInput: FunctionComponent = (props: SyncedSliderProps) => { + const styles = useSyncedSliderStyles(); + const [value, setValue] = useState(props.value); + const handleSliderChange = (_: any, data: { value: number }) => { + setValue(data.value); + props.onChange(data.value); // Notify parent + }; + + const handleInputChange = (e: React.ChangeEvent) => { + const newValue = Number(e.target.value); + if (!isNaN(newValue)) { + setValue(newValue); + props.onChange(newValue); // Notify parent + } + }; + + return ( +
+ + +
+ ); +}; diff --git a/packages/dev/sharedUiComponents/src/fluent/primitives/text.tsx b/packages/dev/sharedUiComponents/src/fluent/primitives/text.tsx new file mode 100644 index 00000000000..5812e2cf140 --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/primitives/text.tsx @@ -0,0 +1,3 @@ +export { Text } from "@fluentui/react-components"; + +// No special styling / functionality yet! diff --git a/packages/dev/sharedUiComponents/src/fluent/primitives/textarea.tsx b/packages/dev/sharedUiComponents/src/fluent/primitives/textarea.tsx new file mode 100644 index 00000000000..3d8008fb393 --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/primitives/textarea.tsx @@ -0,0 +1,30 @@ +import { Textarea as FluentTextarea, TextareaProps as FluentTextareaProps, makeStyles } from "@fluentui/react-components"; +import { FunctionComponent } from "react"; + +const useInputStyles = makeStyles({ + textarea: {}, +}); + +/** + * This is a texarea box that stops propagation of change/keydown events + * @param props + * @returns + */ +export const Textarea: FunctionComponent = (props: FluentTextareaProps) => { + const styles = useInputStyles(); + const handleChange = (event: React.ChangeEvent, data: any) => { + event.stopPropagation(); // Prevent event propagation + if (props.onChange) { + props.onChange(event, data); // Call the original onChange handler passed as prop + } + }; + + const handleKeyDown = (event: React.KeyboardEvent) => { + event.stopPropagation(); // Prevent event propagation + if (props.onKeyDown) { + props.onKeyDown(event); // Call the original onKeyDown handler passed as prop + } + }; + + return ; +}; diff --git a/packages/dev/sharedUiComponents/src/fluent/readme.md b/packages/dev/sharedUiComponents/src/fluent/readme.md new file mode 100644 index 00000000000..02e4da93ed0 --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/readme.md @@ -0,0 +1,19 @@ +# Fluent! + +We are embarking on an effort to replace our common controls with modernized fluent UX controls, used by the existing tools and the in-progress inspectorV2. + +This work is split into several distinct chunks + +1. **Fluent primitives** + These are lightweight wrappers around existing fluent components, with some minor styling applied. Depending on the primitive at hand, the wrapper may do very little (ex: apply some minor styling) or more complex logic (ex: SyncedSlider.tsx coordinates changes between a slider component and an input component). + These primitive can be used standalone or within a pre-styled component such as PropertyLine.tsx, see #2 +2. **Fluent higher order components (hoc)** + These are wrappers around the above primitives to handle styling for common UX patterns, ex: PropertyLine.tsx which renders a label, fluent primtive child component (to modify said propetry), and optional copy button. This is a common UX pattern used in the property pane of all of our tools. +3. **Render fluent components directly from inspectorV2** + InspectorV2 will be using the new fluent components directly, rather than using any existing shared-ui-components.You can see examples of this in various files within packages\dev\inspector-v2 (ex: meshGeneralProperties.tsx, commonGeneralProperties.tsx, outlineOverlayProperties.tsx). +4. **Conditionally render fluent components within existing shared-ui-components** + We are using a contextConsumer to read context.useFluent from within each shared component and conditionally render the fluent version of each shared component. This means that existing tools do not have to update every callsite of a shared component, instead the tool just needs to ensure the contextProvider is properly created at the tool root, see below +5. **Incrementally move each tool over to fluent** + 1 by 1 we will wrap each tool's root in a , which both creates a fluent provider and ensures useFluent context is set to true (so shared components render their fluent versions). This will allow for modular testing of the new components within each tool before lighting it up. Note that we also check for a 'newUX' Query String Parameter in the URL so that we can check-in the new logic without default enabling it for all users (to enable, add ?newUX=true to the URL) +6. **Incrementally refactor existing tools** + After each tool is fluentized, we can incrementally refactor the way the shared components are being initialized (ex: see PropertyTabComponent) to extract common tool paradigms into our shared tooling folder and reduce duplication of logic across our tools. diff --git a/packages/dev/sharedUiComponents/src/fluent/tempInspectorV2/meshGeneralProperties.tsx b/packages/dev/sharedUiComponents/src/fluent/tempInspectorV2/meshGeneralProperties.tsx new file mode 100644 index 00000000000..4d31b7b6097 --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/tempInspectorV2/meshGeneralProperties.tsx @@ -0,0 +1,29 @@ +// eslint-disable-next-line import/no-internal-modules +import type { AbstractMesh } from "core/index"; + +import type { FunctionComponent } from "react"; +import { PropertyLine } from "../hoc/propertyLine"; +import { ButtonLine } from "../primitives/button"; +import { Switch } from "../primitives/switch"; +import { Dropdown } from "../primitives/dropdown"; + +export const MeshGeneralProperties: FunctionComponent<{ entity: AbstractMesh }> = ({ entity: mesh }) => { + return ( + <> + + (mesh.isVisible = ev.target.checked)} /> + + + {}} + defaultValue={1} + /> + + mesh.dispose()} /> + + ); +}; diff --git a/packages/dev/sharedUiComponents/src/fluent/tempInspectorV2/meshOutlineOverlayProperties.tsx b/packages/dev/sharedUiComponents/src/fluent/tempInspectorV2/meshOutlineOverlayProperties.tsx new file mode 100644 index 00000000000..118c830e629 --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/tempInspectorV2/meshOutlineOverlayProperties.tsx @@ -0,0 +1,14 @@ +// eslint-disable-next-line import/no-internal-modules +import { type AbstractMesh } from "core/index"; + +import type { FunctionComponent } from "react"; +import { ColorPropertyLine } from "../hoc/colorPropertyLine"; + +export const MeshOutlineOverlayProperties: FunctionComponent<{ entity: AbstractMesh }> = ({ entity: mesh }) => { + return ( + <> + + + + ); +}; diff --git a/packages/dev/sharedUiComponents/src/fluent/tempInspectorV2/meshTransformProperties.tsx b/packages/dev/sharedUiComponents/src/fluent/tempInspectorV2/meshTransformProperties.tsx new file mode 100644 index 00000000000..9e2fdd8fc13 --- /dev/null +++ b/packages/dev/sharedUiComponents/src/fluent/tempInspectorV2/meshTransformProperties.tsx @@ -0,0 +1,14 @@ +// eslint-disable-next-line import/no-internal-modules + +import { AbstractMesh } from "core/Meshes"; +import type { FunctionComponent } from "react"; +import { VectorPropertyLine } from "../hoc/vectorPropertyLine"; + +export const MeshTransformProperties: FunctionComponent<{ entity: AbstractMesh }> = ({ entity: mesh }) => { + return ( + <> + + + + ); +}; diff --git a/packages/dev/sharedUiComponents/src/lines/optionsLineComponent.tsx b/packages/dev/sharedUiComponents/src/lines/optionsLineComponent.tsx index b48ea1b36cf..082c187d681 100644 --- a/packages/dev/sharedUiComponents/src/lines/optionsLineComponent.tsx +++ b/packages/dev/sharedUiComponents/src/lines/optionsLineComponent.tsx @@ -4,6 +4,9 @@ import type { PropertyChangedEvent } from "../propertyChangedEvent"; import { copyCommandToClipboard, getClassNameWithNamespace } from "../copyCommandToClipboard"; import type { IInspectableOptions } from "core/Misc/iInspectable"; import copyIcon from "../imgs/copy.svg"; +import { PropertyLine } from "shared-ui-components/fluent/hoc/propertyLine"; +import { Dropdown } from "shared-ui-components/fluent/primitives/dropdown"; +import { ToolContext } from "shared-ui-components/fluent/hoc/fluentToolWrapper"; // eslint-disable-next-line @typescript-eslint/naming-convention export const Null_Value = Number.MAX_SAFE_INTEGER; @@ -103,20 +106,34 @@ export class OptionsLine extends React.Component this.onCopyClickStr()}> + { + val !== undefined && this.updateValue(val); + }} + defaultValue={this.state.value} + /> + + ); + } + + private renderOriginal() { return (
{this.props.icon && {this.props.iconLabel}} @@ -134,10 +151,13 @@ export class OptionsLine extends React.Component
-
this.onCopyClick()} title="Copy to clipboard"> +
copyCommandToClipboard(this.onCopyClickStr())} title="Copy to clipboard"> Copy
); } + override render() { + return {({ useFluent }) => (useFluent ? this.renderFluent() : this.renderOriginal())}; + } } diff --git a/packages/dev/sharedUiComponents/src/lines/sliderLineComponent.tsx b/packages/dev/sharedUiComponents/src/lines/sliderLineComponent.tsx index 5b22d578ab5..ce8f6549128 100644 --- a/packages/dev/sharedUiComponents/src/lines/sliderLineComponent.tsx +++ b/packages/dev/sharedUiComponents/src/lines/sliderLineComponent.tsx @@ -6,6 +6,8 @@ import { Tools } from "core/Misc/tools"; import { FloatLineComponent } from "./floatLineComponent"; import type { LockObject } from "../tabs/propertyGrids/lockObject"; import copyIcon from "../imgs/copy.svg"; +import { ToolContext } from "shared-ui-components/fluent/hoc/fluentToolWrapper"; +import { SyncedSliderLine } from "shared-ui-components/fluent/hoc/syncedSliderLine"; interface ISliderLineComponentProps { label: string; @@ -140,7 +142,20 @@ export class SliderLineComponent extends React.Component this.onChange(val)} + min={this.props.minimum} + max={this.props.maximum} + /> + ); + } + + renderOriginal() { return (
{this.props.icon && {this.props.iconLabel}} @@ -188,4 +203,7 @@ export class SliderLineComponent extends React.Component ); } + override render() { + return {({ useFluent }) => (useFluent ? this.renderFluent() : this.renderOriginal())}; + } } diff --git a/packages/dev/sharedUiComponents/src/lines/textInputLineComponent.tsx b/packages/dev/sharedUiComponents/src/lines/textInputLineComponent.tsx index 9e862ba1773..a4a284612b7 100644 --- a/packages/dev/sharedUiComponents/src/lines/textInputLineComponent.tsx +++ b/packages/dev/sharedUiComponents/src/lines/textInputLineComponent.tsx @@ -4,6 +4,10 @@ import type { PropertyChangedEvent } from "../propertyChangedEvent"; import type { LockObject } from "../tabs/propertyGrids/lockObject"; import { conflictingValuesPlaceholder } from "./targetsProxy"; import { InputArrowsComponent } from "./inputArrowsComponent"; +import { PropertyLine } from "shared-ui-components/fluent/hoc/propertyLine"; +import { Textarea } from "shared-ui-components/fluent/primitives/textarea"; +import { Input } from "shared-ui-components/fluent/primitives/input"; +import { ToolContext } from "shared-ui-components/fluent/hoc/fluentToolWrapper"; export interface ITextInputLineComponentProps { label?: string; @@ -191,10 +195,43 @@ export class TextInputLineComponent extends React.Component + {this.props.multilines ? ( +