From a98f4a90663cfc6d0b0afa84f34684df7dcd9d95 Mon Sep 17 00:00:00 2001 From: Elena Shorohova <92329687+jsorohova@users.noreply.github.com> Date: Mon, 20 May 2024 15:52:21 +0200 Subject: [PATCH 01/29] FUI - List of operations (#2475) --- package-lock.json | 3002 +++++++++++++++-- package.json | 6 +- src/apim.design.module.ts | 2 + src/apim.publish.module.ts | 2 + src/apim.runtime.module.ts | 7 +- .../operation-list/ko/operationList.html | 2 +- .../operationList.runtime.module.ts | 10 + .../react/runtime/OperationList.tsx | 359 ++ .../react/runtime/OperationListGql.tsx | 151 + .../react/runtime/OperationListRuntime.tsx | 109 + src/constants.ts | 11 + src/services/apiService.ts | 2 +- src/services/graphqlService.ts | 132 + src/themes/website/styles/forms.scss | 20 +- .../website/styles/widgets/fui/fluentui.scss | 13 + .../styles/widgets/fui/operation-list.scss | 101 + .../website/styles/widgets/widgets.scss | 5 +- 17 files changed, 3686 insertions(+), 248 deletions(-) create mode 100644 src/components/operations/operation-list/operationList.runtime.module.ts create mode 100644 src/components/operations/operation-list/react/runtime/OperationList.tsx create mode 100644 src/components/operations/operation-list/react/runtime/OperationListGql.tsx create mode 100644 src/components/operations/operation-list/react/runtime/OperationListRuntime.tsx create mode 100644 src/services/graphqlService.ts create mode 100644 src/themes/website/styles/widgets/fui/fluentui.scss create mode 100644 src/themes/website/styles/widgets/fui/operation-list.scss diff --git a/package-lock.json b/package-lock.json index c05633f2..8b8d1815 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,14 +14,16 @@ "@azure/msal-browser": "^2.37.1", "@braintree/sanitize-url": "6.0.4", "@fluentui/font-icons-mdl2": "^8.5.9", - "@fluentui/react": "^8.105.11", + "@fluentui/react": "^8.117.7", + "@fluentui/react-components": "^9.49.0", + "@fluentui/react-icons": "^2.0.237", "@microsoft/applicationinsights-web": "^3.0.2", "@monaco-editor/loader": "^1.3.3", "@paperbits/azure": "0.1.593", "@paperbits/common": "0.1.593-hotfix2", "@paperbits/core": "0.1.593-hotfix2", "@paperbits/forms": "0.1.593-hotfix2", - "@paperbits/react": "1.0.7", + "@paperbits/react": "^1.0.8", "@paperbits/styles": "0.1.593-hotfix2", "@webcomponents/custom-elements": "1.6.0", "@webcomponents/shadydom": "^1.11.0", @@ -832,6 +834,11 @@ "node": ">=10.0.0" } }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", @@ -896,44 +903,74 @@ "node": ">=14" } }, - "node_modules/@fluentui/date-time-utilities": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@fluentui/date-time-utilities/-/date-time-utilities-8.5.13.tgz", - "integrity": "sha512-X3clbPKh0URkDj21QoARw6SNec7dWg7Gt7SkTlkVYFzmZUdC4ZIrYk3n36xKe3U1wcGp26EVmKjhAhB262ugpw==", + "node_modules/@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", "dependencies": { - "@fluentui/set-version": "^8.2.11", + "@floating-ui/utils": "^0.2.1" + } + }, + "node_modules/@floating-ui/devtools": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/devtools/-/devtools-0.2.1.tgz", + "integrity": "sha512-8PHJLbD6VhBh+LJ1uty/Bz30qs02NXCE5u8WpOhSewlYXUWl03GNXknr9AS2yaAWJEQaY27x7eByJs44gODBcw==", + "peerDependencies": { + "@floating-ui/dom": ">=1.5.4" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, + "node_modules/@fluentui/date-time-utilities": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/@fluentui/date-time-utilities/-/date-time-utilities-8.6.3.tgz", + "integrity": "sha512-GMCVGvGOEzuboIDnSUEphWdMtOzLwZyNPFLwp/aRI+Tdlr8JNZoCWVytsb3D8EZ9W0ARxgUdYa9W+aGYXVmr7w==", + "dependencies": { + "@fluentui/set-version": "^8.2.17", "tslib": "^2.1.0" } }, "node_modules/@fluentui/dom-utilities": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/@fluentui/dom-utilities/-/dom-utilities-2.2.11.tgz", - "integrity": "sha512-2tXfg7/9PXu9nfU72/P3o3waHEFEQtHUfQbVexUaYqNNAxMj6sOfsqpUx4vd5nPgO+grSWrl+spqlLN2yej51w==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@fluentui/dom-utilities/-/dom-utilities-2.3.1.tgz", + "integrity": "sha512-wZbAQIEBHmCXyqLjUPDDu/4LCQj6fZOoN5GYG5ZQ4oSUk31C4Nl8AsEtQsLV37iL91d4Lj5A5P9lrsXQ80kxKA==", "dependencies": { - "@fluentui/set-version": "^8.2.11", + "@fluentui/set-version": "^8.2.17", "tslib": "^2.1.0" } }, "node_modules/@fluentui/font-icons-mdl2": { - "version": "8.5.24", - "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.24.tgz", - "integrity": "sha512-x1MCt2lTb8aoRjV9pV69sotjPhQ8KEFzdF7l/1jBs8XaRdR6z392LsDKB4HwTlo3Grp8c/6Oykh8k/UWknh4sQ==", + "version": "8.5.38", + "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.38.tgz", + "integrity": "sha512-CySTbfOTURlJ1nMKwW1oI902xzz2FRwMhz/YhWEYRxT4fBhDqjRm/oSsB/HO738qM6i8QrYd2fuglsKUO6/g8w==", "dependencies": { - "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.17", - "@fluentui/utilities": "^8.13.18", + "@fluentui/set-version": "^8.2.17", + "@fluentui/style-utilities": "^8.10.9", + "@fluentui/utilities": "^8.15.4", "tslib": "^2.1.0" } }, "node_modules/@fluentui/foundation-legacy": { - "version": "8.2.44", - "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.2.44.tgz", - "integrity": "sha512-0k4ymfab0VLjZjWDYFnthOLcggQ2XkuB6fin/Qiui9mfXd4QQL4iwnIZqkvcFZDUnlZDW7Y7s5NGnSNGEvJSWQ==", + "version": "8.4.4", + "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.4.4.tgz", + "integrity": "sha512-LGUxPpLKVKHzrSsVnURbZ2nngYeH2AkMvRAsLqy05wDDTOl7JD/HAjc5xjQNyYp5c0vKettC1Z3KI9WZT9OFTA==", "dependencies": { - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.17", - "@fluentui/utilities": "^8.13.18", + "@fluentui/merge-styles": "^8.6.4", + "@fluentui/set-version": "^8.2.17", + "@fluentui/style-utilities": "^8.10.9", + "@fluentui/utilities": "^8.15.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -942,39 +979,55 @@ } }, "node_modules/@fluentui/keyboard-key": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@fluentui/keyboard-key/-/keyboard-key-0.4.11.tgz", - "integrity": "sha512-TVB/EloWado9AVp1niChgcdDOQAHGP5B30Dinmtfe7zi8OnstwPoxwFP6dHJDdpLQ6ZEUTaEHViSzvewl7Chag==", + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/@fluentui/keyboard-key/-/keyboard-key-0.4.17.tgz", + "integrity": "sha512-9DwTTAfpNwFxb77in0PHHsAHLsLVWB0g2ZQ4uRJBUgmmmtIu81iVrbJJgAvd92DH9C22YuU/c0pXC3MsgVIq/w==", "dependencies": { "tslib": "^2.1.0" } }, + "node_modules/@fluentui/keyboard-keys": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@fluentui/keyboard-keys/-/keyboard-keys-9.0.7.tgz", + "integrity": "sha512-vaQ+lOveQTdoXJYqDQXWb30udSfTVcIuKk1rV0X0eGAgcHeSDeP1HxMy+OgHOQZH3OiBH4ZYeWxb+tmfiDiygQ==", + "dependencies": { + "@swc/helpers": "^0.5.1" + } + }, "node_modules/@fluentui/merge-styles": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@fluentui/merge-styles/-/merge-styles-8.5.12.tgz", - "integrity": "sha512-ZnUo0YuMP7AYi68dkknFqVxopIAgbrUnqR/MZlemmRvBYyy1SMj1WQeHcoiLFA8mF8YKn7B+jxQgJbN2bfcrRw==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@fluentui/merge-styles/-/merge-styles-8.6.4.tgz", + "integrity": "sha512-tTkek3aWim00VvJ9Zr86mVQqP9KOU47tBWhdUBjZPta+QtQV/V+E6OwaMD7itb2jACnt4jzyIvTLnOsMX8VHGA==", "dependencies": { - "@fluentui/set-version": "^8.2.11", + "@fluentui/set-version": "^8.2.17", "tslib": "^2.1.0" } }, - "node_modules/@fluentui/react": { - "version": "8.111.2", - "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.111.2.tgz", - "integrity": "sha512-1mWewd6+9rUChaZwva0ZbywZxk4ao2/hPTmDSvMbeaJdzUWgaIGGJ7fJbC0oawuNXchakDuhRkixbjrUyOefLA==", + "node_modules/@fluentui/priority-overflow": { + "version": "9.1.11", + "resolved": "https://registry.npmjs.org/@fluentui/priority-overflow/-/priority-overflow-9.1.11.tgz", + "integrity": "sha512-sdrpavvKX2kepQ1d6IaI3ObLq5SAQBPRHPGx2+wiMWL7cEx9vGGM0fmeicl3soqqmM5uwCmWnZk9QZv9XOY98w==", "dependencies": { - "@fluentui/date-time-utilities": "^8.5.13", - "@fluentui/font-icons-mdl2": "^8.5.24", - "@fluentui/foundation-legacy": "^8.2.44", - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/react-focus": "^8.8.31", - "@fluentui/react-hooks": "^8.6.29", - "@fluentui/react-portal-compat-context": "^9.0.6", - "@fluentui/react-window-provider": "^2.2.15", - "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.17", - "@fluentui/theme": "^2.6.35", - "@fluentui/utilities": "^8.13.18", + "@swc/helpers": "^0.5.1" + } + }, + "node_modules/@fluentui/react": { + "version": "8.117.7", + "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.117.7.tgz", + "integrity": "sha512-yHrncVrWoDoIQR80RAKMSG0THZwMa0VGDCzv27oRp6RFdB44XnFS4xtukNlkdB42IC+dCu8o6Anj7NP6DgX+MQ==", + "dependencies": { + "@fluentui/date-time-utilities": "^8.6.3", + "@fluentui/font-icons-mdl2": "^8.5.38", + "@fluentui/foundation-legacy": "^8.4.4", + "@fluentui/merge-styles": "^8.6.4", + "@fluentui/react-focus": "^8.9.1", + "@fluentui/react-hooks": "^8.8.1", + "@fluentui/react-portal-compat-context": "^9.0.11", + "@fluentui/react-window-provider": "^2.2.21", + "@fluentui/set-version": "^8.2.17", + "@fluentui/style-utilities": "^8.10.9", + "@fluentui/theme": "^2.6.47", + "@fluentui/utilities": "^8.15.4", "@microsoft/load-themed-styles": "^1.10.26", "tslib": "^2.1.0" }, @@ -985,16 +1038,414 @@ "react-dom": ">=16.8.0 <19.0.0" } }, - "node_modules/@fluentui/react-focus": { - "version": "8.8.31", - "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.8.31.tgz", - "integrity": "sha512-XCGVooD+n1EcE7B6X1+aS/g/3XRsisppmZZJbr+9uGmbac50KkpA1Y+48Qm99UfQRnF4lsXh85A8TE+FZJqwUA==", + "node_modules/@fluentui/react-accordion": { + "version": "9.3.50", + "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.3.50.tgz", + "integrity": "sha512-I/dL89nrNC9BzjzTsXRApaQMpmegdSZ4ofh4vpbTJ/ZohHPBKTjpPzgPFuSRsUPY3ZUX0P5q4Xb5MpObLY+t0g==", "dependencies": { - "@fluentui/keyboard-key": "^0.4.11", - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.17", - "@fluentui/utilities": "^8.13.18", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-alert": { + "version": "9.0.0-beta.117", + "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.117.tgz", + "integrity": "sha512-vZYEyILCKN8XpUB+bk4a7OoDI23vtD5IR4g2Fm6OHqEGxauQPEUTCFK6Ogxt85mQLce0pWEK75p5dVkWOvCzWw==", + "dependencies": { + "@fluentui/react-avatar": "^9.6.22", + "@fluentui/react-button": "^9.3.76", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-tabster": "^9.20.1", + "@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-aria": { + "version": "9.10.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.10.5.tgz", + "integrity": "sha512-mltw1Kelz31UxeZXlQpmX5eW4UUQBRQm4OLTlM4YDiDNe1N3Qd63cUIDGhgn0MvCvwVpIryOO89jj+RJGXkpkA==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-utilities": "^9.18.7", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-avatar": { + "version": "9.6.22", + "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.6.22.tgz", + "integrity": "sha512-AYK2Ak4DhbUTDIHvde1DQ9NLSx/iOq2GduDOI6tIwUxVMmqrjF+ec+DxJLjtdrBK6RCnYtvb5F4fMezySBZrPQ==", + "dependencies": { + "@fluentui/react-badge": "^9.2.32", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-popover": "^9.9.5", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-tooltip": "^9.4.24", + "@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-badge": { + "version": "9.2.32", + "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.2.32.tgz", + "integrity": "sha512-fqO8Mlg129h3yuYwodVk4bj02fe9ryiA+37MKMzajQSGrOJH1xnTzD+R8ngf8s1iEq5TUsy7dQXLyzGSxllhVw==", + "dependencies": { + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.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-breadcrumb": { + "version": "9.0.22", + "resolved": "https://registry.npmjs.org/@fluentui/react-breadcrumb/-/react-breadcrumb-9.0.22.tgz", + "integrity": "sha512-EGHbOwaInu7CJmCdd5V0jI88iC9/xQiCQYEwn8EaZpciSpv6AD1QMiwwdr9OHLq3Y4NgEZTDki8JD+fWbhlk8Q==", + "dependencies": { + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-button": "^9.3.76", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-link": "^9.2.18", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-button": { + "version": "9.3.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.3.76.tgz", + "integrity": "sha512-3ZsEjbRcNY3oEAjxCOuXg6JNtA6/jryMs/IKoP0b7yh8UyJsChRy9hhlRD8ms+f7OBfqLoUyz4WUfwV9eeQV8g==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-card": { + "version": "9.0.75", + "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.0.75.tgz", + "integrity": "sha512-AWtgjvKm0hRbnelIMfXZrPJ8kke2bGLKQhVTLcRybTjLh7aXHp/PPVtY5ktZODUp96VuAZkZl1yL3IxJLjldog==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-tabster": "^9.20.1", + "@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-checkbox": { + "version": "9.2.21", + "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.2.21.tgz", + "integrity": "sha512-oma+pLiLvtWonUiXUsJLXeIJ4fUIbd6TgvK6v5SFU+97loaQGsx+0TtayUBj1dCVVvoW/tjJebNtud92Ozz/qQ==", + "dependencies": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-label": "^9.1.68", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-combobox": { + "version": "9.10.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.10.1.tgz", + "integrity": "sha512-RoXXtB7bKlT7JbuNP5mQxZMANbq2opT+vslNVhoOy5Gu8EJe1gxdNwKfug+NY/SC2N1SFBH1xdgsBzhPsGi38g==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-portal": "^9.4.21", + "@fluentui/react-positioning": "^9.14.4", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-components": { + "version": "9.49.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.49.0.tgz", + "integrity": "sha512-7IRiUhdMlGcyAVHxnNTdj2l2WbEaXkHeETMkkLDxf3x7d8qwWkRcrRYm/Ds36aI37kBOYKwKjYNqaybDxq4WBw==", + "dependencies": { + "@fluentui/react-accordion": "^9.3.50", + "@fluentui/react-alert": "9.0.0-beta.117", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-avatar": "^9.6.22", + "@fluentui/react-badge": "^9.2.32", + "@fluentui/react-breadcrumb": "^9.0.22", + "@fluentui/react-button": "^9.3.76", + "@fluentui/react-card": "^9.0.75", + "@fluentui/react-checkbox": "^9.2.21", + "@fluentui/react-combobox": "^9.10.1", + "@fluentui/react-dialog": "^9.10.1", + "@fluentui/react-divider": "^9.2.67", + "@fluentui/react-drawer": "^9.1.12", + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-image": "^9.1.64", + "@fluentui/react-infobutton": "9.0.0-beta.101", + "@fluentui/react-infolabel": "^9.0.29", + "@fluentui/react-input": "^9.4.72", + "@fluentui/react-label": "^9.1.68", + "@fluentui/react-link": "^9.2.18", + "@fluentui/react-menu": "^9.14.0", + "@fluentui/react-message-bar": "^9.0.27", + "@fluentui/react-overflow": "^9.1.17", + "@fluentui/react-persona": "^9.2.81", + "@fluentui/react-popover": "^9.9.5", + "@fluentui/react-portal": "^9.4.21", + "@fluentui/react-positioning": "^9.14.4", + "@fluentui/react-progress": "^9.1.72", + "@fluentui/react-provider": "^9.14.0", + "@fluentui/react-radio": "^9.2.16", + "@fluentui/react-rating": "^9.0.4", + "@fluentui/react-search": "^9.0.1", + "@fluentui/react-select": "^9.1.72", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-skeleton": "^9.1.0", + "@fluentui/react-slider": "^9.1.78", + "@fluentui/react-spinbutton": "^9.2.72", + "@fluentui/react-spinner": "^9.4.5", + "@fluentui/react-switch": "^9.1.78", + "@fluentui/react-table": "^9.15.0", + "@fluentui/react-tabs": "^9.4.17", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-tags": "^9.3.1", + "@fluentui/react-teaching-popover": "^9.1.0", + "@fluentui/react-text": "^9.4.16", + "@fluentui/react-textarea": "^9.3.72", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-toast": "^9.3.38", + "@fluentui/react-toolbar": "^9.1.79", + "@fluentui/react-tooltip": "^9.4.24", + "@fluentui/react-tree": "^9.4.39", + "@fluentui/react-utilities": "^9.18.7", + "@fluentui/react-virtualizer": "9.0.0-alpha.75", + "@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-context-selector": { + "version": "9.1.58", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.58.tgz", + "integrity": "sha512-XFL+X09+AABkC1D/4P20e+AbU+hG3+AiivA2+ZW+6Lqpg2RmYe5a9AhZdMCD0Desyq2BoKurYNyNOmI3OPJF8w==", + "dependencies": { + "@fluentui/react-utilities": "^9.18.7", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0", + "scheduler": ">=0.19.0 <=0.23.0" + } + }, + "node_modules/@fluentui/react-dialog": { + "version": "9.10.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.10.1.tgz", + "integrity": "sha512-xtNk5cuSFAqxAvFG8wbsyCDMjduRX7kpmOMym0jRveEiAnXirWApJlXtIbqGhQq1E13bHhcUrgk+rThYNj++0A==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-portal": "^9.4.21", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "react-transition-group": "^4.4.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-divider": { + "version": "9.2.67", + "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.2.67.tgz", + "integrity": "sha512-+25KhiweeFQUW4PrqnkBhVgTktMSF+965Xlezjpp7848MYEb2SfyvJC2akeZ4bcZUwCyqth9RTv/4hKBdYXmOw==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.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-drawer": { + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.1.12.tgz", + "integrity": "sha512-YFIrKhcdi6seNjgNIC1P8VeajNFLlbYe1WRPJi0J/6fcQEQRBOfMpLgwUdqw4rXV/54U4+F5DI6q5t67i5jLGg==", + "dependencies": { + "@fluentui/react-dialog": "^9.10.1", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-motion-preview": "^0.5.19", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-field": { + "version": "9.1.62", + "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.1.62.tgz", + "integrity": "sha512-p1x4NYdGO9CMOAQ9yqos0liSEb84i5tpTFXPgdSCyYrAcsFbBnblabgyg0hUtdtuuuZVKcHGE3M+vk8xaa0n+A==", + "dependencies": { + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-label": "^9.1.68", + "@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-focus": { + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.9.1.tgz", + "integrity": "sha512-8MWmkRJaJLQ8n6bMCSF4FGySYDBtCv/uWLBdXx4qwu3la/Pc6fctWej6eOL0AGzgBVlPh0+sw9q8RylNmevsXg==", + "dependencies": { + "@fluentui/keyboard-key": "^0.4.17", + "@fluentui/merge-styles": "^8.6.4", + "@fluentui/set-version": "^8.2.17", + "@fluentui/style-utilities": "^8.10.9", + "@fluentui/utilities": "^8.15.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1003,13 +1454,13 @@ } }, "node_modules/@fluentui/react-hooks": { - "version": "8.6.29", - "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.6.29.tgz", - "integrity": "sha512-MeVevmGJtrYxdhoarrkVWE0Hs4XdzOc9A3tiOjMBIcwOvoOYOAoOELoHK/wuulPVwUn2R9Y+7JpJ6oCe4ImdJw==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.8.1.tgz", + "integrity": "sha512-3RgbzgQQtaZ6zqoSrJ1eV13UKSCBPjeh8flwTPhUXBrq6M7ctMCSVOhNKB5LGtXI+XiC6GkdlvsHoR8s3BjN3A==", "dependencies": { - "@fluentui/react-window-provider": "^2.2.15", - "@fluentui/set-version": "^8.2.11", - "@fluentui/utilities": "^8.13.18", + "@fluentui/react-window-provider": "^2.2.21", + "@fluentui/set-version": "^8.2.17", + "@fluentui/utilities": "^8.15.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1017,10 +1468,310 @@ "react": ">=16.8.0 <19.0.0" } }, + "node_modules/@fluentui/react-icons": { + "version": "2.0.237", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.237.tgz", + "integrity": "sha512-J+6XDB/Y3G3nfNWvKKI6xhUXDN6/xvhksnV+zfXiGb6tqtK7QiihAzvRRgPnKuS3BH/H1TM7k3KC19V0AJrTDg==", + "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.64", + "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.1.64.tgz", + "integrity": "sha512-GIf3ld0McmndF6vc9I0WS/90d9ON11J9QB9tnI7TxYEFpzgpJ7UIMjVsqqICM/xIj+RtBqYu/1VgiXccIcuZsw==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.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-infobutton": { + "version": "9.0.0-beta.101", + "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.101.tgz", + "integrity": "sha512-gX8Y8/cCc8LgfXtB4aJE+SRo3H3FA+DtWoGvmdaMLIWEoUbxv8sLSEl537MPGhlmTeu+ogXmA+c0RaFMJhvDsw==", + "dependencies": { + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-label": "^9.1.68", + "@fluentui/react-popover": "^9.9.5", + "@fluentui/react-tabster": "^9.20.1", + "@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.0.29", + "resolved": "https://registry.npmjs.org/@fluentui/react-infolabel/-/react-infolabel-9.0.29.tgz", + "integrity": "sha512-FloTgj6lsK+wH2YaOonwfmc2TexTbpnGfw+fQ140rKTYEJlsgbb41PzviY3YUbokaG1S/S2rxy+JBlnUU8zzTQ==", + "dependencies": { + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-label": "^9.1.68", + "@fluentui/react-popover": "^9.9.5", + "@fluentui/react-tabster": "^9.20.1", + "@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.8.0 <19.0.0", + "@types/react-dom": ">=16.8.0 <19.0.0", + "react": ">=16.8.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-input": { + "version": "9.4.72", + "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.4.72.tgz", + "integrity": "sha512-MhxgCJd0dma8qx3AOlfgowRTyGabEW8a9vczM9uaex6dO0vtf2CIsP7MfR3DC4b8MeHT1+XEEmfCTNFJb9q3BA==", + "dependencies": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.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-jsx-runtime": { + "version": "9.0.36", + "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.0.36.tgz", + "integrity": "sha512-qCaZJ2UagJ6aEahSp83n6OPFAKkxFGB2NEJZ+Cg+PDNZHScA80ds6NfO/FkQ3rz0Vmx0R+qN8MH/zgb6Il05Kg==", + "dependencies": { + "@fluentui/react-utilities": "^9.18.7", + "@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.68", + "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.1.68.tgz", + "integrity": "sha512-j9aQw47kQKX9ECI2EehXvXUwQC2qrOokn1TJsabo54ipgt6yxxjQJPODluqQNWeBxRT0ctuYBTiZvJNvJkw+1A==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.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-link": { + "version": "9.2.18", + "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.2.18.tgz", + "integrity": "sha512-dQc9ryjAI6TEyH+pFp71Qzz3jLg4WyiB5oNHNAN6HDRQKSdJKwMzn2HexGmuIV5e/WVH9E9kTfQe5g7a0WMwqw==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-menu": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.14.0.tgz", + "integrity": "sha512-rI7NI18Q8FS6p0hs56DRjfo337egGpfpj1AgU6qPKd8TnzX87+LGVAQ0/AuIiDTW9XIIhJmlPaNe9tw2NsoZ4w==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-portal": "^9.4.21", + "@fluentui/react-positioning": "^9.14.4", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-message-bar": { + "version": "9.0.27", + "resolved": "https://registry.npmjs.org/@fluentui/react-message-bar/-/react-message-bar-9.0.27.tgz", + "integrity": "sha512-U42QwnMziF9MHKeY4j4YUg9P0SnNGLlvIbtSlLGry4yIh6qa4I3aSuY0skPemkbr4TAsKTwiUMDFkd0SbyztFA==", + "dependencies": { + "@fluentui/react-button": "^9.3.76", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@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.8.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-motion-preview": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@fluentui/react-motion-preview/-/react-motion-preview-0.5.19.tgz", + "integrity": "sha512-Gb77BuKbwVlpPZXm+nMAKp6jpjeAT7p6qFkW7YKan8CgDArxUFOLbo2CmpzysJKvd6z6ni21eEFd7gdD7N9p7Q==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.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-overflow": { + "version": "9.1.17", + "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.1.17.tgz", + "integrity": "sha512-21QUisRSs4/aOSxDvSBSm6Tj7ow0WEECbLEI9Vvb7AuaIGGUWujTOuFIWehK9/ME9Ml/Uv23pHtTcBesc0JzOw==", + "dependencies": { + "@fluentui/priority-overflow": "^9.1.11", + "@fluentui/react-context-selector": "^9.1.58", + "@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-persona": { + "version": "9.2.81", + "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.2.81.tgz", + "integrity": "sha512-LQnteXDG5C8Jlwgk4TQsHTNvHV9r1uqWRLEmKqDrrKFf2ApA3lHyHy1EEc8a5BwOv0ef1dpalqgnAuArXZrEiw==", + "dependencies": { + "@fluentui/react-avatar": "^9.6.22", + "@fluentui/react-badge": "^9.2.32", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.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-popover": { + "version": "9.9.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.9.5.tgz", + "integrity": "sha512-yhKaMAKlj+wnV2LzoBqUXlLe5l0EiHg8m2I4n9efXHIVGzyaZEkVc26rwSaxoTbUnFSS8NG1EG5EYqQGh3wiwA==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-portal": "^9.4.21", + "@fluentui/react-positioning": "^9.14.4", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-portal": { + "version": "9.4.21", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.4.21.tgz", + "integrity": "sha512-FsDOmvvpC7OAFiwSAiSvvu/WoUUC4oMTQnY/zyotqnzKEyGS/6nMJ5Mr0gyzxtPDCzl6wIPAch5rVksseCm8vg==", + "dependencies": { + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "use-disposable": "^1.0.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, "node_modules/@fluentui/react-portal-compat-context": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@fluentui/react-portal-compat-context/-/react-portal-compat-context-9.0.7.tgz", - "integrity": "sha512-WkHRCSyJXwHoDTCZxaoeZYEMQ/aiYO5FzEtJSuDrSxPB04bYKvVLUbSYhkeHVJEjOD7ajZgVN843oRsKJEabYA==", + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal-compat-context/-/react-portal-compat-context-9.0.11.tgz", + "integrity": "sha512-ubvW/ej0O+Pago9GH3mPaxzUgsNnBoqvghNamWjyKvZIViyaXUG6+sgcAl721R+qGAFac+A20akI5qDJz/xtdg==", "dependencies": { "@swc/helpers": "^0.5.1" }, @@ -1029,12 +1780,574 @@ "react": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-window-provider": { - "version": "2.2.15", - "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-2.2.15.tgz", - "integrity": "sha512-RraWvRe7wakpPJRBX2tlCV/cybOKiqLJ1UBLPNf5xq7ZIs0T0g/hh3G3Zb5teOeipjuRnl6srkdDUT9Dy9wrBg==", + "node_modules/@fluentui/react-positioning": { + "version": "9.14.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.14.4.tgz", + "integrity": "sha512-mQz0C0iwRWy3g14laBcbbEEeoTb21dXn/ve8DNEJbVQ4P70MM43vCQeXWbHIDNw6HON+bIG3TyfNyFKQIpLwNA==", "dependencies": { - "@fluentui/set-version": "^8.2.11", + "@floating-ui/devtools": "0.2.1", + "@floating-ui/dom": "^1.2.0", + "@fluentui/react-shared-contexts": "^9.17.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-progress": { + "version": "9.1.72", + "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.1.72.tgz", + "integrity": "sha512-+pXMRybkZx5qjz3Cfnuj0ntzT6gvLlqukSPHGaneFHOMbivWz9TjVj/FCGIwy6OrY3nAQcgk92zN5sapgM0Nsw==", + "dependencies": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.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-provider": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.14.0.tgz", + "integrity": "sha512-uau0iv04ncFJLkRqKF1tFS8mUqumMBLc+n9CvUE8MK6/QXqHwcWPMUr09dCOsVAB6zpjiQO+4yHBZlja6RKKxA==", + "dependencies": { + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/core": "^1.14.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-radio": { + "version": "9.2.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.2.16.tgz", + "integrity": "sha512-H5NzFFYYkQ2osE7Rh96DjWRgI24POZoaBnjJrUvds5B/3Jod4905c2VsP6MSvkr+cslVRnO55OCeBX7MlqP17g==", + "dependencies": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-label": "^9.1.68", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-rating": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-rating/-/react-rating-9.0.4.tgz", + "integrity": "sha512-AieJyOO6Ldflfr8IxbUYkBpEDKOm+zPJJhtzUVQrb/kqJOsCDknPoO4UkL3VbfjN8QGCQ353Aq1ZX2svL5ar3Q==", + "dependencies": { + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-tabster": "^9.20.1", + "@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.8.0 <19.0.0", + "@types/react-dom": ">=16.8.0 <19.0.0", + "react": ">=16.8.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-search": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-search/-/react-search-9.0.1.tgz", + "integrity": "sha512-Hz/44MwKCaSjoGSxzwE9pu/cj0XtjeNNl2ky3aRYgvmfHTIMGc2c72vhxp98EYrVolyV7ijCdm3AnwWW7aA6Kw==", + "dependencies": { + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-input": "^9.4.72", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@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-select": { + "version": "9.1.72", + "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.1.72.tgz", + "integrity": "sha512-xtdiK++/aT49xT/JRSNhOSwgfMR/OcifShXrLCx1WNG78yXMCFOv7J2/i+01MsPZHZDo7EYWgxKmAYZ0+e4TIw==", + "dependencies": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.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-shared-contexts": { + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.17.0.tgz", + "integrity": "sha512-SvfFmzzy0QfhaCrGcUJFJcscc6NGyuoYxT0Q8wgu5ol3vZ+idvVgGIJbhwQFVT08Ph5yR6FsWS22/nLjTqE58A==", + "dependencies": { + "@fluentui/react-theme": "^9.1.19", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "react": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-skeleton": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.1.0.tgz", + "integrity": "sha512-eV+UbqZ3Xq8aShusyDnGrex9NG+7wcmvnKiTY8aOAf4Kl5XJwNr8WE5nHcHO3pyIsX6bQQcvSWsyxMw5rJy/Ag==", + "dependencies": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.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-slider": { + "version": "9.1.78", + "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.1.78.tgz", + "integrity": "sha512-0+SC1TG6smvlK21MU6DCO6dEGtnFNa/Zt2VqNxP2h56iusdPzDwqj2UQre5S6tfigR1fCAMEMeOkerOpXKWW/g==", + "dependencies": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-spinbutton": { + "version": "9.2.72", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.2.72.tgz", + "integrity": "sha512-79/IfTrRWmsq4C09q6nZsCGBsHSbfLCsTe8WI13sB0zWBlCDQVXOwsi7XuS8DbO3jmT8eUggJbaYEn4h/8iHHQ==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.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-spinner": { + "version": "9.4.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.4.5.tgz", + "integrity": "sha512-Kg5NUB2UrViDiBEKNdV7UVN4mPxeZF5seUm7qZP4hBSKf90oj2xcJ+BKggQg++MelDLMFeLnTE1pJO/Lv/ovbA==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-label": "^9.1.68", + "@fluentui/react-shared-contexts": "^9.17.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-switch": { + "version": "9.1.78", + "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.1.78.tgz", + "integrity": "sha512-pyqKSXE5vglqkGS9UXIQe/l2Q78t/PFPuiCbfEr1c8TYhzdQWXJq2WkK5WbrZAwLRL9AEbhCmoD1Lig9PXvGHQ==", + "dependencies": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-label": "^9.1.68", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-table": { + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.15.0.tgz", + "integrity": "sha512-uvdmF7JdlYZ5jXi8Y7M4KB2TmNNm9+oTevwiF3BmnQVLCoHq0lX1Mlv12gLRuztAuHiTOsNcPETZTbUjlf1GZg==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-avatar": "^9.6.22", + "@fluentui/react-checkbox": "^9.2.21", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-radio": "^9.2.16", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-tabs": { + "version": "9.4.17", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.4.17.tgz", + "integrity": "sha512-ZdzS46h2FW8dZOLCZPkrnvYEE6dD4HRYN6M4/RGqiN8dT8jWxj0FBZSNpp6gGTCftADr6k675GqKWoGmnr2ctA==", + "dependencies": { + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-tabster": { + "version": "9.20.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.20.1.tgz", + "integrity": "sha512-dDm18fThjQfDYL5dH2WdcECdbYNe0T8sn6j2RGP3V6cxqCwXpAI+zfquIAjqkgoR9bn/XDDSkUKTyxrFMrVMVA==", + "dependencies": { + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "keyborg": "^2.5.0", + "tabster": "^7.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-tags": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-tags/-/react-tags-9.3.1.tgz", + "integrity": "sha512-tzfMFmM3q4Rl65M7qDSIHSNM6PLMcctLfjpt0qBj//OriomJ1cG0N1tmEXRVWlq3BMeGI+xIXCXktrl/2xbpCA==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-avatar": "^9.6.22", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-teaching-popover": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-teaching-popover/-/react-teaching-popover-9.1.0.tgz", + "integrity": "sha512-KBeCqzoPc8jiGTQmvEABJuxcJHyM2sp/hSNLpdl68zniqXCJCvqY3o02Av1xWRjmyFKn7Lt5q6MTs5ZkaEYcYQ==", + "dependencies": { + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-button": "^9.3.76", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-popover": "^9.9.5", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@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.8.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-text": { + "version": "9.4.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.4.16.tgz", + "integrity": "sha512-rgdLtbY6rHdFrxNWqflh88aEqqONWBgoMA6xEOQix357E3A5J7S8NJSlKAsd00zQO5gFRiKO+gr5iiRFVKDqeA==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.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-textarea": { + "version": "9.3.72", + "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.3.72.tgz", + "integrity": "sha512-lLYtumX6CxHPbsTP2W+PX6ehWGlZXAKpcgqrhCU4YGxNAdD7FbBO30SIQMAgQ6ygWMAZRztGGRQYkihFz8SeiQ==", + "dependencies": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.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-theme": { + "version": "9.1.19", + "resolved": "https://registry.npmjs.org/@fluentui/react-theme/-/react-theme-9.1.19.tgz", + "integrity": "sha512-mrVhKbr4o9UKERPxgghIRDU59S7gRizrgz3/wwyMt7elkr8Sw+OpwKIeEw9x6P0RTcFDC00nggaMJhBGs7Xo4A==", + "dependencies": { + "@fluentui/tokens": "1.0.0-alpha.16", + "@swc/helpers": "^0.5.1" + } + }, + "node_modules/@fluentui/react-toast": { + "version": "9.3.38", + "resolved": "https://registry.npmjs.org/@fluentui/react-toast/-/react-toast-9.3.38.tgz", + "integrity": "sha512-oGLdXgObrDCpWzGoM+AKEz1QmwvIix9xCyA2Tf5j9n4kuXAzN9QQZCrS0qVt+I43SboUdsvW8VT+06oSdNPNUA==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-portal": "^9.4.21", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "react-transition-group": "^4.4.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-toolbar": { + "version": "9.1.79", + "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.1.79.tgz", + "integrity": "sha512-9PnMPBh9Yz519qJad18fxe8mQxeLipkB2X9E7xfqMk0zJM1Yni2PmyjuFfJZlgMipkdD26/G1P+gqt45O+b4oQ==", + "dependencies": { + "@fluentui/react-button": "^9.3.76", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-divider": "^9.2.67", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-radio": "^9.2.16", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-tooltip": { + "version": "9.4.24", + "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.4.24.tgz", + "integrity": "sha512-TJNP3KBZID+yLc4BlJ0A4lrB7SlelI9RPgpFs7En5AR35eqKsRriGLiiIj3cAeKh7BvvH+dNCDjg6zo82rbytQ==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-portal": "^9.4.21", + "@fluentui/react-positioning": "^9.14.4", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-tree": { + "version": "9.4.39", + "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.4.39.tgz", + "integrity": "sha512-3Zab9biXU+ds2Vx59NGuDksYtGNLuVrAxWQxTmXDbGQ0Y8ogPTA82t52Nf2vRbygzw8PV4dBfwbgau6uQgFNNQ==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-avatar": "^9.6.22", + "@fluentui/react-button": "^9.3.76", + "@fluentui/react-checkbox": "^9.2.21", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-radio": "^9.2.16", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@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-utilities": { + "version": "9.18.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.18.7.tgz", + "integrity": "sha512-voVd4xrx+9VxCPYt51JlzLuJYsjCf3LYjoytAyruu7kEOkPF31Fnjkmp81yrXnAbM+J+tL8HajG5bUHjt8H59w==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-shared-contexts": "^9.17.0", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "react": ">=16.14.0 <19.0.0" + } + }, + "node_modules/@fluentui/react-virtualizer": { + "version": "9.0.0-alpha.75", + "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.75.tgz", + "integrity": "sha512-1ISbGEr4XVDcrSCQfnStc+yH3lD2bZuK2zg6cEouqZNBo6GdNFtvRU5Zi84CfOFeGMzO6NItHfBHLoJYqSYCSw==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@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-window-provider": { + "version": "2.2.21", + "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-2.2.21.tgz", + "integrity": "sha512-ZrPYPmhLB9TqWu2c4g7L9zJGakcfJ4AYD3rje8lQJzSDftQ3OpM8DoLoe18joGni6yLICSaCVdBfQfoJpFmkHg==", + "dependencies": { + "@fluentui/set-version": "^8.2.17", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1043,34 +2356,34 @@ } }, "node_modules/@fluentui/set-version": { - "version": "8.2.11", - "resolved": "https://registry.npmjs.org/@fluentui/set-version/-/set-version-8.2.11.tgz", - "integrity": "sha512-UI03tysau/adBO1a3q4uFZWQ3lfkiFcAWIFng4k5odWcCokfCm5IxA0urKqj5W5JRYdyoBUaq8QbcNGkFB4dCw==", + "version": "8.2.17", + "resolved": "https://registry.npmjs.org/@fluentui/set-version/-/set-version-8.2.17.tgz", + "integrity": "sha512-AdhnGcw0qAdSJliDYc2sWh+fryeN9FjFw7VVw8/eG1U97k6KmJvAmMMgqcOir1XZgRRnwL4EjSPc5TWYwh5EuQ==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@fluentui/style-utilities": { - "version": "8.9.17", - "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.9.17.tgz", - "integrity": "sha512-wMeLw3MSIotx1EzDYTMWFx03iZqR/YBaUt1FR2oamt+zz3HKiproNR9xNKEQmszNFUDDAZJL9XhLVp1iNlS88A==", + "version": "8.10.9", + "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.10.9.tgz", + "integrity": "sha512-6qc0LdmPqBFROTtl5a3X/ELizz+mosxjlmAQrkF2aw91JSw5dZ1PaxuJh052fiG+r/0QtvX5qQdlOh84vXYa1g==", "dependencies": { - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/set-version": "^8.2.11", - "@fluentui/theme": "^2.6.35", - "@fluentui/utilities": "^8.13.18", + "@fluentui/merge-styles": "^8.6.4", + "@fluentui/set-version": "^8.2.17", + "@fluentui/theme": "^2.6.47", + "@fluentui/utilities": "^8.15.4", "@microsoft/load-themed-styles": "^1.10.26", "tslib": "^2.1.0" } }, "node_modules/@fluentui/theme": { - "version": "2.6.35", - "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.35.tgz", - "integrity": "sha512-8EusEcEX/9gA1H0vVYZX0q+na88cPrS8Cs2XPlN056Xtzzrbgl6qFRJ79aiJaZ8Oq6TkcASn1gfgyUTz6fbMng==", + "version": "2.6.47", + "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.47.tgz", + "integrity": "sha512-B58sD7w5S8/UVwo9j/enjf3KjEhCjDw6bXMG6lJS1EILRvz1aDN90J0Z+GiYnm3WtaTeYq04kh9XLfpnfkadcA==", "dependencies": { - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/set-version": "^8.2.11", - "@fluentui/utilities": "^8.13.18", + "@fluentui/merge-styles": "^8.6.4", + "@fluentui/set-version": "^8.2.17", + "@fluentui/utilities": "^8.15.4", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1078,14 +2391,23 @@ "react": ">=16.8.0 <19.0.0" } }, - "node_modules/@fluentui/utilities": { - "version": "8.13.18", - "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.13.18.tgz", - "integrity": "sha512-/0rX9EzltLKwU1SS14VV7agWoOzruVTU3oagZq1QgFAvoj8qi7fNqvSX/VEeRy+0gmbsCkrEViUPkmC7drKzPg==", + "node_modules/@fluentui/tokens": { + "version": "1.0.0-alpha.16", + "resolved": "https://registry.npmjs.org/@fluentui/tokens/-/tokens-1.0.0-alpha.16.tgz", + "integrity": "sha512-Gr9G8LIlUhZYX5j6CfDQrofQqsWAz/q54KabWn1tWV/1083WwyoTZXiG1k6b37NnK7Feye7D7Nz+4MNqoKpXGw==", "dependencies": { - "@fluentui/dom-utilities": "^2.2.11", - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/set-version": "^8.2.11", + "@swc/helpers": "^0.5.1" + } + }, + "node_modules/@fluentui/utilities": { + "version": "8.15.4", + "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.15.4.tgz", + "integrity": "sha512-0M7gm2PmkJeQmQflcoens80QOslm3NGAQgV2bWsWFrdOB2Qn1fx3eyPWtT3h+a6IA705N0YR8KZCtAJ87mS+nA==", + "dependencies": { + "@fluentui/dom-utilities": "^2.3.1", + "@fluentui/merge-styles": "^8.6.4", + "@fluentui/react-window-provider": "^2.2.21", + "@fluentui/set-version": "^8.2.17", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1259,6 +2581,39 @@ "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@griffel/core": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@griffel/core/-/core-1.15.3.tgz", + "integrity": "sha512-5ksBpOjFJ75HijGehQ06Ri9cQjhd/rqQ0N/jJzXDDXQFYdOOzib/QL7BXNwhkLtTyHvN391cD4/BqcTdynfLUg==", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@griffel/style-types": "^1.0.4", + "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.21", + "resolved": "https://registry.npmjs.org/@griffel/react/-/react-1.5.21.tgz", + "integrity": "sha512-7wuY9uFSt/0E7kLAKX//ue8NILx0IGoOtIx6WVuavEUFJXPCrvFn4uCDgnJC0211LZtJ+XH7zZGPNUtSb7nijw==", + "dependencies": { + "@griffel/core": "^1.15.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@griffel/style-types": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@griffel/style-types/-/style-types-1.0.4.tgz", + "integrity": "sha512-geZomjQTIHXoQZFFB811PUMXYAr8LuBNOMPcR2YJAl1pslbHYYiZKCa2FgZCw00hnQFP4uB4JIJ2CiPJqKZYmw==", + "dependencies": { + "csstype": "^3.1.3" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", @@ -1727,20 +3082,20 @@ } }, "node_modules/@paperbits/react": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@paperbits/react/-/react-1.0.7.tgz", - "integrity": "sha512-0/Td5LeYSZj0W8nyXQi9x9QEBDoLoU/VznpBi0n2TVGCvJVexN8QU7+FKkERQv+91mWqQ2V5nDyFeQoQRAgRpg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@paperbits/react/-/react-1.0.8.tgz", + "integrity": "sha512-APB8ok9eqnwYSLn0tPW6z7EeTsdsp6QMJL3QbwVosTwfeZW0T/GBypk1KneyCZTXn2LCYG1todneuK/Eo2dBwg==", "dependencies": { - "@paperbits/common": "0.1.529", + "@paperbits/common": "0.1.550", "inversify-react": "^1.0.2", "react": "^18.2.0", "react-dom": "^18.2.0" } }, "node_modules/@paperbits/react/node_modules/@paperbits/common": { - "version": "0.1.529", - "resolved": "https://registry.npmjs.org/@paperbits/common/-/common-0.1.529.tgz", - "integrity": "sha512-TGxI4wlEES73l9FNawUKeMIU8sj8r8+n7F5BkiGz4hd9XqwBx65M+n9CYuCvNXILZMI483Z8t1phM6VCOmrqDA==", + "version": "0.1.550", + "resolved": "https://registry.npmjs.org/@paperbits/common/-/common-0.1.550.tgz", + "integrity": "sha512-gGq5/2kRBrlvpfpeYZEh27eaamBRmjEk458i/W9r02UCI1LXRp6SBO3woAfsh2VkQwt6PwOU0X9663oS9efBgA==", "dependencies": { "@googlemaps/js-api-loader": "^1.13.2", "html-minifier-terser": "^5.1.1", @@ -2044,9 +3399,9 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.11.tgz", + "integrity": "sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==", "dependencies": { "tslib": "^2.4.0" } @@ -4311,9 +5666,9 @@ "license": "MIT" }, "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/d3": { "version": "7.8.5", @@ -4952,6 +6307,15 @@ "node": ">=6.0.0" } }, + "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==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/domexception": { "version": "4.0.0", "license": "MIT", @@ -7437,6 +8801,11 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/keyborg": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/keyborg/-/keyborg-2.5.0.tgz", + "integrity": "sha512-nb4Ji1suqWqj6VXb61Jrs4ab/UWgtGph4wDch2NIZDfLBUObmLcZE0aiDjZY49ghtu03fvwxDNvS9ZB0XMz6/g==" + }, "node_modules/kind-of": { "version": "6.0.3", "dev": true, @@ -8877,7 +10246,6 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9636,6 +11004,21 @@ "dev": true, "license": "MIT" }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/property-information": { "version": "6.1.0", "license": "MIT", @@ -9902,6 +11285,11 @@ "react": "^18.2.0" } }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, "node_modules/react-toastify": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.1.3.tgz", @@ -9914,6 +11302,21 @@ "react-dom": ">=16" } }, + "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==", + "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/readable-stream": { "version": "2.0.6", "dev": true, @@ -10195,6 +11598,14 @@ "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==" }, + "node_modules/rtl-css-js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", + "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, "node_modules/run-async": { "version": "2.4.1", "license": "MIT", @@ -10823,6 +12234,11 @@ "inline-style-parser": "0.1.1" } }, + "node_modules/stylis": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" + }, "node_modules/supports-color": { "version": "8.1.1", "dev": true, @@ -10860,6 +12276,15 @@ "version": "3.2.4", "license": "MIT" }, + "node_modules/tabster": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/tabster/-/tabster-7.1.1.tgz", + "integrity": "sha512-3VsXUb0XxVcFq9NmzTieAJAlruMiaj/dvXIHm7RgjsUrMGkEcq9KbBdai05NAGp2D2d/CxHc6j1mbuUzGofWBA==", + "dependencies": { + "keyborg": "2.5.0", + "tslib": "^2.3.1" + } + }, "node_modules/tapable": { "version": "2.2.1", "dev": true, @@ -11397,6 +12822,25 @@ "requires-port": "^1.0.0" } }, + "node_modules/use-disposable": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/use-disposable/-/use-disposable-1.0.2.tgz", + "integrity": "sha512-UMaXVlV77dWOu4GqAFNjRzHzowYKUKbJBQfCexvahrYeIz4OkUYUjna4Tjjdf92NH8Nm8J7wEfFRgTIwYjO5jg==", + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "@types/react-dom": ">=16.8.0 <19.0.0", + "react": ">=16.8.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.1.tgz", + "integrity": "sha512-6MCBDr76UJmRpbF8pzP27uIoTocf3tITaMJ52mccgAhMJycuh5A/RL6mDZCTwTisj0Qfeq69FtjMCUX27U78oA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util": { "version": "0.10.4", "dev": true, @@ -12694,6 +14138,11 @@ "version": "0.5.6", "dev": true }, + "@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, "@eslint-community/eslint-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", @@ -12737,166 +14186,1145 @@ "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==" }, - "@fluentui/date-time-utilities": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@fluentui/date-time-utilities/-/date-time-utilities-8.5.13.tgz", - "integrity": "sha512-X3clbPKh0URkDj21QoARw6SNec7dWg7Gt7SkTlkVYFzmZUdC4ZIrYk3n36xKe3U1wcGp26EVmKjhAhB262ugpw==", + "@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", "requires": { - "@fluentui/set-version": "^8.2.11", + "@floating-ui/utils": "^0.2.1" + } + }, + "@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==", + "requires": {} + }, + "@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "requires": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, + "@fluentui/date-time-utilities": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/@fluentui/date-time-utilities/-/date-time-utilities-8.6.3.tgz", + "integrity": "sha512-GMCVGvGOEzuboIDnSUEphWdMtOzLwZyNPFLwp/aRI+Tdlr8JNZoCWVytsb3D8EZ9W0ARxgUdYa9W+aGYXVmr7w==", + "requires": { + "@fluentui/set-version": "^8.2.17", "tslib": "^2.1.0" } }, "@fluentui/dom-utilities": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/@fluentui/dom-utilities/-/dom-utilities-2.2.11.tgz", - "integrity": "sha512-2tXfg7/9PXu9nfU72/P3o3waHEFEQtHUfQbVexUaYqNNAxMj6sOfsqpUx4vd5nPgO+grSWrl+spqlLN2yej51w==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@fluentui/dom-utilities/-/dom-utilities-2.3.1.tgz", + "integrity": "sha512-wZbAQIEBHmCXyqLjUPDDu/4LCQj6fZOoN5GYG5ZQ4oSUk31C4Nl8AsEtQsLV37iL91d4Lj5A5P9lrsXQ80kxKA==", "requires": { - "@fluentui/set-version": "^8.2.11", + "@fluentui/set-version": "^8.2.17", "tslib": "^2.1.0" } }, "@fluentui/font-icons-mdl2": { - "version": "8.5.24", - "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.24.tgz", - "integrity": "sha512-x1MCt2lTb8aoRjV9pV69sotjPhQ8KEFzdF7l/1jBs8XaRdR6z392LsDKB4HwTlo3Grp8c/6Oykh8k/UWknh4sQ==", + "version": "8.5.38", + "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.38.tgz", + "integrity": "sha512-CySTbfOTURlJ1nMKwW1oI902xzz2FRwMhz/YhWEYRxT4fBhDqjRm/oSsB/HO738qM6i8QrYd2fuglsKUO6/g8w==", "requires": { - "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.17", - "@fluentui/utilities": "^8.13.18", + "@fluentui/set-version": "^8.2.17", + "@fluentui/style-utilities": "^8.10.9", + "@fluentui/utilities": "^8.15.4", "tslib": "^2.1.0" } }, "@fluentui/foundation-legacy": { - "version": "8.2.44", - "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.2.44.tgz", - "integrity": "sha512-0k4ymfab0VLjZjWDYFnthOLcggQ2XkuB6fin/Qiui9mfXd4QQL4iwnIZqkvcFZDUnlZDW7Y7s5NGnSNGEvJSWQ==", + "version": "8.4.4", + "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.4.4.tgz", + "integrity": "sha512-LGUxPpLKVKHzrSsVnURbZ2nngYeH2AkMvRAsLqy05wDDTOl7JD/HAjc5xjQNyYp5c0vKettC1Z3KI9WZT9OFTA==", "requires": { - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.17", - "@fluentui/utilities": "^8.13.18", + "@fluentui/merge-styles": "^8.6.4", + "@fluentui/set-version": "^8.2.17", + "@fluentui/style-utilities": "^8.10.9", + "@fluentui/utilities": "^8.15.4", "tslib": "^2.1.0" } }, "@fluentui/keyboard-key": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@fluentui/keyboard-key/-/keyboard-key-0.4.11.tgz", - "integrity": "sha512-TVB/EloWado9AVp1niChgcdDOQAHGP5B30Dinmtfe7zi8OnstwPoxwFP6dHJDdpLQ6ZEUTaEHViSzvewl7Chag==", + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/@fluentui/keyboard-key/-/keyboard-key-0.4.17.tgz", + "integrity": "sha512-9DwTTAfpNwFxb77in0PHHsAHLsLVWB0g2ZQ4uRJBUgmmmtIu81iVrbJJgAvd92DH9C22YuU/c0pXC3MsgVIq/w==", "requires": { "tslib": "^2.1.0" } }, - "@fluentui/merge-styles": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@fluentui/merge-styles/-/merge-styles-8.5.12.tgz", - "integrity": "sha512-ZnUo0YuMP7AYi68dkknFqVxopIAgbrUnqR/MZlemmRvBYyy1SMj1WQeHcoiLFA8mF8YKn7B+jxQgJbN2bfcrRw==", - "requires": { - "@fluentui/set-version": "^8.2.11", - "tslib": "^2.1.0" - } - }, - "@fluentui/react": { - "version": "8.111.2", - "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.111.2.tgz", - "integrity": "sha512-1mWewd6+9rUChaZwva0ZbywZxk4ao2/hPTmDSvMbeaJdzUWgaIGGJ7fJbC0oawuNXchakDuhRkixbjrUyOefLA==", - "requires": { - "@fluentui/date-time-utilities": "^8.5.13", - "@fluentui/font-icons-mdl2": "^8.5.24", - "@fluentui/foundation-legacy": "^8.2.44", - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/react-focus": "^8.8.31", - "@fluentui/react-hooks": "^8.6.29", - "@fluentui/react-portal-compat-context": "^9.0.6", - "@fluentui/react-window-provider": "^2.2.15", - "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.17", - "@fluentui/theme": "^2.6.35", - "@fluentui/utilities": "^8.13.18", - "@microsoft/load-themed-styles": "^1.10.26", - "tslib": "^2.1.0" - } - }, - "@fluentui/react-focus": { - "version": "8.8.31", - "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.8.31.tgz", - "integrity": "sha512-XCGVooD+n1EcE7B6X1+aS/g/3XRsisppmZZJbr+9uGmbac50KkpA1Y+48Qm99UfQRnF4lsXh85A8TE+FZJqwUA==", - "requires": { - "@fluentui/keyboard-key": "^0.4.11", - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/set-version": "^8.2.11", - "@fluentui/style-utilities": "^8.9.17", - "@fluentui/utilities": "^8.13.18", - "tslib": "^2.1.0" - } - }, - "@fluentui/react-hooks": { - "version": "8.6.29", - "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.6.29.tgz", - "integrity": "sha512-MeVevmGJtrYxdhoarrkVWE0Hs4XdzOc9A3tiOjMBIcwOvoOYOAoOELoHK/wuulPVwUn2R9Y+7JpJ6oCe4ImdJw==", - "requires": { - "@fluentui/react-window-provider": "^2.2.15", - "@fluentui/set-version": "^8.2.11", - "@fluentui/utilities": "^8.13.18", - "tslib": "^2.1.0" - } - }, - "@fluentui/react-portal-compat-context": { + "@fluentui/keyboard-keys": { "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@fluentui/react-portal-compat-context/-/react-portal-compat-context-9.0.7.tgz", - "integrity": "sha512-WkHRCSyJXwHoDTCZxaoeZYEMQ/aiYO5FzEtJSuDrSxPB04bYKvVLUbSYhkeHVJEjOD7ajZgVN843oRsKJEabYA==", + "resolved": "https://registry.npmjs.org/@fluentui/keyboard-keys/-/keyboard-keys-9.0.7.tgz", + "integrity": "sha512-vaQ+lOveQTdoXJYqDQXWb30udSfTVcIuKk1rV0X0eGAgcHeSDeP1HxMy+OgHOQZH3OiBH4ZYeWxb+tmfiDiygQ==", "requires": { "@swc/helpers": "^0.5.1" } }, - "@fluentui/react-window-provider": { - "version": "2.2.15", - "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-2.2.15.tgz", - "integrity": "sha512-RraWvRe7wakpPJRBX2tlCV/cybOKiqLJ1UBLPNf5xq7ZIs0T0g/hh3G3Zb5teOeipjuRnl6srkdDUT9Dy9wrBg==", + "@fluentui/merge-styles": { + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@fluentui/merge-styles/-/merge-styles-8.6.4.tgz", + "integrity": "sha512-tTkek3aWim00VvJ9Zr86mVQqP9KOU47tBWhdUBjZPta+QtQV/V+E6OwaMD7itb2jACnt4jzyIvTLnOsMX8VHGA==", "requires": { - "@fluentui/set-version": "^8.2.11", + "@fluentui/set-version": "^8.2.17", + "tslib": "^2.1.0" + } + }, + "@fluentui/priority-overflow": { + "version": "9.1.11", + "resolved": "https://registry.npmjs.org/@fluentui/priority-overflow/-/priority-overflow-9.1.11.tgz", + "integrity": "sha512-sdrpavvKX2kepQ1d6IaI3ObLq5SAQBPRHPGx2+wiMWL7cEx9vGGM0fmeicl3soqqmM5uwCmWnZk9QZv9XOY98w==", + "requires": { + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react": { + "version": "8.117.7", + "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.117.7.tgz", + "integrity": "sha512-yHrncVrWoDoIQR80RAKMSG0THZwMa0VGDCzv27oRp6RFdB44XnFS4xtukNlkdB42IC+dCu8o6Anj7NP6DgX+MQ==", + "requires": { + "@fluentui/date-time-utilities": "^8.6.3", + "@fluentui/font-icons-mdl2": "^8.5.38", + "@fluentui/foundation-legacy": "^8.4.4", + "@fluentui/merge-styles": "^8.6.4", + "@fluentui/react-focus": "^8.9.1", + "@fluentui/react-hooks": "^8.8.1", + "@fluentui/react-portal-compat-context": "^9.0.11", + "@fluentui/react-window-provider": "^2.2.21", + "@fluentui/set-version": "^8.2.17", + "@fluentui/style-utilities": "^8.10.9", + "@fluentui/theme": "^2.6.47", + "@fluentui/utilities": "^8.15.4", + "@microsoft/load-themed-styles": "^1.10.26", + "tslib": "^2.1.0" + } + }, + "@fluentui/react-accordion": { + "version": "9.3.50", + "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.3.50.tgz", + "integrity": "sha512-I/dL89nrNC9BzjzTsXRApaQMpmegdSZ4ofh4vpbTJ/ZohHPBKTjpPzgPFuSRsUPY3ZUX0P5q4Xb5MpObLY+t0g==", + "requires": { + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-alert": { + "version": "9.0.0-beta.117", + "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.117.tgz", + "integrity": "sha512-vZYEyILCKN8XpUB+bk4a7OoDI23vtD5IR4g2Fm6OHqEGxauQPEUTCFK6Ogxt85mQLce0pWEK75p5dVkWOvCzWw==", + "requires": { + "@fluentui/react-avatar": "^9.6.22", + "@fluentui/react-button": "^9.3.76", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-aria": { + "version": "9.10.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.10.5.tgz", + "integrity": "sha512-mltw1Kelz31UxeZXlQpmX5eW4UUQBRQm4OLTlM4YDiDNe1N3Qd63cUIDGhgn0MvCvwVpIryOO89jj+RJGXkpkA==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-utilities": "^9.18.7", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-avatar": { + "version": "9.6.22", + "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.6.22.tgz", + "integrity": "sha512-AYK2Ak4DhbUTDIHvde1DQ9NLSx/iOq2GduDOI6tIwUxVMmqrjF+ec+DxJLjtdrBK6RCnYtvb5F4fMezySBZrPQ==", + "requires": { + "@fluentui/react-badge": "^9.2.32", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-popover": "^9.9.5", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-tooltip": "^9.4.24", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-badge": { + "version": "9.2.32", + "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.2.32.tgz", + "integrity": "sha512-fqO8Mlg129h3yuYwodVk4bj02fe9ryiA+37MKMzajQSGrOJH1xnTzD+R8ngf8s1iEq5TUsy7dQXLyzGSxllhVw==", + "requires": { + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-breadcrumb": { + "version": "9.0.22", + "resolved": "https://registry.npmjs.org/@fluentui/react-breadcrumb/-/react-breadcrumb-9.0.22.tgz", + "integrity": "sha512-EGHbOwaInu7CJmCdd5V0jI88iC9/xQiCQYEwn8EaZpciSpv6AD1QMiwwdr9OHLq3Y4NgEZTDki8JD+fWbhlk8Q==", + "requires": { + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-button": "^9.3.76", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-link": "^9.2.18", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-button": { + "version": "9.3.76", + "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.3.76.tgz", + "integrity": "sha512-3ZsEjbRcNY3oEAjxCOuXg6JNtA6/jryMs/IKoP0b7yh8UyJsChRy9hhlRD8ms+f7OBfqLoUyz4WUfwV9eeQV8g==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-card": { + "version": "9.0.75", + "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.0.75.tgz", + "integrity": "sha512-AWtgjvKm0hRbnelIMfXZrPJ8kke2bGLKQhVTLcRybTjLh7aXHp/PPVtY5ktZODUp96VuAZkZl1yL3IxJLjldog==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-checkbox": { + "version": "9.2.21", + "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.2.21.tgz", + "integrity": "sha512-oma+pLiLvtWonUiXUsJLXeIJ4fUIbd6TgvK6v5SFU+97loaQGsx+0TtayUBj1dCVVvoW/tjJebNtud92Ozz/qQ==", + "requires": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-label": "^9.1.68", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-combobox": { + "version": "9.10.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.10.1.tgz", + "integrity": "sha512-RoXXtB7bKlT7JbuNP5mQxZMANbq2opT+vslNVhoOy5Gu8EJe1gxdNwKfug+NY/SC2N1SFBH1xdgsBzhPsGi38g==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-portal": "^9.4.21", + "@fluentui/react-positioning": "^9.14.4", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-components": { + "version": "9.49.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.49.0.tgz", + "integrity": "sha512-7IRiUhdMlGcyAVHxnNTdj2l2WbEaXkHeETMkkLDxf3x7d8qwWkRcrRYm/Ds36aI37kBOYKwKjYNqaybDxq4WBw==", + "requires": { + "@fluentui/react-accordion": "^9.3.50", + "@fluentui/react-alert": "9.0.0-beta.117", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-avatar": "^9.6.22", + "@fluentui/react-badge": "^9.2.32", + "@fluentui/react-breadcrumb": "^9.0.22", + "@fluentui/react-button": "^9.3.76", + "@fluentui/react-card": "^9.0.75", + "@fluentui/react-checkbox": "^9.2.21", + "@fluentui/react-combobox": "^9.10.1", + "@fluentui/react-dialog": "^9.10.1", + "@fluentui/react-divider": "^9.2.67", + "@fluentui/react-drawer": "^9.1.12", + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-image": "^9.1.64", + "@fluentui/react-infobutton": "9.0.0-beta.101", + "@fluentui/react-infolabel": "^9.0.29", + "@fluentui/react-input": "^9.4.72", + "@fluentui/react-label": "^9.1.68", + "@fluentui/react-link": "^9.2.18", + "@fluentui/react-menu": "^9.14.0", + "@fluentui/react-message-bar": "^9.0.27", + "@fluentui/react-overflow": "^9.1.17", + "@fluentui/react-persona": "^9.2.81", + "@fluentui/react-popover": "^9.9.5", + "@fluentui/react-portal": "^9.4.21", + "@fluentui/react-positioning": "^9.14.4", + "@fluentui/react-progress": "^9.1.72", + "@fluentui/react-provider": "^9.14.0", + "@fluentui/react-radio": "^9.2.16", + "@fluentui/react-rating": "^9.0.4", + "@fluentui/react-search": "^9.0.1", + "@fluentui/react-select": "^9.1.72", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-skeleton": "^9.1.0", + "@fluentui/react-slider": "^9.1.78", + "@fluentui/react-spinbutton": "^9.2.72", + "@fluentui/react-spinner": "^9.4.5", + "@fluentui/react-switch": "^9.1.78", + "@fluentui/react-table": "^9.15.0", + "@fluentui/react-tabs": "^9.4.17", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-tags": "^9.3.1", + "@fluentui/react-teaching-popover": "^9.1.0", + "@fluentui/react-text": "^9.4.16", + "@fluentui/react-textarea": "^9.3.72", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-toast": "^9.3.38", + "@fluentui/react-toolbar": "^9.1.79", + "@fluentui/react-tooltip": "^9.4.24", + "@fluentui/react-tree": "^9.4.39", + "@fluentui/react-utilities": "^9.18.7", + "@fluentui/react-virtualizer": "9.0.0-alpha.75", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-context-selector": { + "version": "9.1.58", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.58.tgz", + "integrity": "sha512-XFL+X09+AABkC1D/4P20e+AbU+hG3+AiivA2+ZW+6Lqpg2RmYe5a9AhZdMCD0Desyq2BoKurYNyNOmI3OPJF8w==", + "requires": { + "@fluentui/react-utilities": "^9.18.7", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-dialog": { + "version": "9.10.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.10.1.tgz", + "integrity": "sha512-xtNk5cuSFAqxAvFG8wbsyCDMjduRX7kpmOMym0jRveEiAnXirWApJlXtIbqGhQq1E13bHhcUrgk+rThYNj++0A==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-portal": "^9.4.21", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "react-transition-group": "^4.4.1" + } + }, + "@fluentui/react-divider": { + "version": "9.2.67", + "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.2.67.tgz", + "integrity": "sha512-+25KhiweeFQUW4PrqnkBhVgTktMSF+965Xlezjpp7848MYEb2SfyvJC2akeZ4bcZUwCyqth9RTv/4hKBdYXmOw==", + "requires": { + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-drawer": { + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.1.12.tgz", + "integrity": "sha512-YFIrKhcdi6seNjgNIC1P8VeajNFLlbYe1WRPJi0J/6fcQEQRBOfMpLgwUdqw4rXV/54U4+F5DI6q5t67i5jLGg==", + "requires": { + "@fluentui/react-dialog": "^9.10.1", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-motion-preview": "^0.5.19", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-field": { + "version": "9.1.62", + "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.1.62.tgz", + "integrity": "sha512-p1x4NYdGO9CMOAQ9yqos0liSEb84i5tpTFXPgdSCyYrAcsFbBnblabgyg0hUtdtuuuZVKcHGE3M+vk8xaa0n+A==", + "requires": { + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-label": "^9.1.68", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-focus": { + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.9.1.tgz", + "integrity": "sha512-8MWmkRJaJLQ8n6bMCSF4FGySYDBtCv/uWLBdXx4qwu3la/Pc6fctWej6eOL0AGzgBVlPh0+sw9q8RylNmevsXg==", + "requires": { + "@fluentui/keyboard-key": "^0.4.17", + "@fluentui/merge-styles": "^8.6.4", + "@fluentui/set-version": "^8.2.17", + "@fluentui/style-utilities": "^8.10.9", + "@fluentui/utilities": "^8.15.4", + "tslib": "^2.1.0" + } + }, + "@fluentui/react-hooks": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.8.1.tgz", + "integrity": "sha512-3RgbzgQQtaZ6zqoSrJ1eV13UKSCBPjeh8flwTPhUXBrq6M7ctMCSVOhNKB5LGtXI+XiC6GkdlvsHoR8s3BjN3A==", + "requires": { + "@fluentui/react-window-provider": "^2.2.21", + "@fluentui/set-version": "^8.2.17", + "@fluentui/utilities": "^8.15.4", + "tslib": "^2.1.0" + } + }, + "@fluentui/react-icons": { + "version": "2.0.237", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.237.tgz", + "integrity": "sha512-J+6XDB/Y3G3nfNWvKKI6xhUXDN6/xvhksnV+zfXiGb6tqtK7QiihAzvRRgPnKuS3BH/H1TM7k3KC19V0AJrTDg==", + "requires": { + "@griffel/react": "^1.0.0", + "tslib": "^2.1.0" + } + }, + "@fluentui/react-image": { + "version": "9.1.64", + "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.1.64.tgz", + "integrity": "sha512-GIf3ld0McmndF6vc9I0WS/90d9ON11J9QB9tnI7TxYEFpzgpJ7UIMjVsqqICM/xIj+RtBqYu/1VgiXccIcuZsw==", + "requires": { + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-infobutton": { + "version": "9.0.0-beta.101", + "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.101.tgz", + "integrity": "sha512-gX8Y8/cCc8LgfXtB4aJE+SRo3H3FA+DtWoGvmdaMLIWEoUbxv8sLSEl537MPGhlmTeu+ogXmA+c0RaFMJhvDsw==", + "requires": { + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-label": "^9.1.68", + "@fluentui/react-popover": "^9.9.5", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-infolabel": { + "version": "9.0.29", + "resolved": "https://registry.npmjs.org/@fluentui/react-infolabel/-/react-infolabel-9.0.29.tgz", + "integrity": "sha512-FloTgj6lsK+wH2YaOonwfmc2TexTbpnGfw+fQ140rKTYEJlsgbb41PzviY3YUbokaG1S/S2rxy+JBlnUU8zzTQ==", + "requires": { + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-label": "^9.1.68", + "@fluentui/react-popover": "^9.9.5", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-input": { + "version": "9.4.72", + "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.4.72.tgz", + "integrity": "sha512-MhxgCJd0dma8qx3AOlfgowRTyGabEW8a9vczM9uaex6dO0vtf2CIsP7MfR3DC4b8MeHT1+XEEmfCTNFJb9q3BA==", + "requires": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-jsx-runtime": { + "version": "9.0.36", + "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.0.36.tgz", + "integrity": "sha512-qCaZJ2UagJ6aEahSp83n6OPFAKkxFGB2NEJZ+Cg+PDNZHScA80ds6NfO/FkQ3rz0Vmx0R+qN8MH/zgb6Il05Kg==", + "requires": { + "@fluentui/react-utilities": "^9.18.7", + "@swc/helpers": "^0.5.1", + "react-is": "^17.0.2" + } + }, + "@fluentui/react-label": { + "version": "9.1.68", + "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.1.68.tgz", + "integrity": "sha512-j9aQw47kQKX9ECI2EehXvXUwQC2qrOokn1TJsabo54ipgt6yxxjQJPODluqQNWeBxRT0ctuYBTiZvJNvJkw+1A==", + "requires": { + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-link": { + "version": "9.2.18", + "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.2.18.tgz", + "integrity": "sha512-dQc9ryjAI6TEyH+pFp71Qzz3jLg4WyiB5oNHNAN6HDRQKSdJKwMzn2HexGmuIV5e/WVH9E9kTfQe5g7a0WMwqw==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-menu": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.14.0.tgz", + "integrity": "sha512-rI7NI18Q8FS6p0hs56DRjfo337egGpfpj1AgU6qPKd8TnzX87+LGVAQ0/AuIiDTW9XIIhJmlPaNe9tw2NsoZ4w==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-portal": "^9.4.21", + "@fluentui/react-positioning": "^9.14.4", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-message-bar": { + "version": "9.0.27", + "resolved": "https://registry.npmjs.org/@fluentui/react-message-bar/-/react-message-bar-9.0.27.tgz", + "integrity": "sha512-U42QwnMziF9MHKeY4j4YUg9P0SnNGLlvIbtSlLGry4yIh6qa4I3aSuY0skPemkbr4TAsKTwiUMDFkd0SbyztFA==", + "requires": { + "@fluentui/react-button": "^9.3.76", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "react-transition-group": "^4.4.1" + } + }, + "@fluentui/react-motion-preview": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@fluentui/react-motion-preview/-/react-motion-preview-0.5.19.tgz", + "integrity": "sha512-Gb77BuKbwVlpPZXm+nMAKp6jpjeAT7p6qFkW7YKan8CgDArxUFOLbo2CmpzysJKvd6z6ni21eEFd7gdD7N9p7Q==", + "requires": { + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-overflow": { + "version": "9.1.17", + "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.1.17.tgz", + "integrity": "sha512-21QUisRSs4/aOSxDvSBSm6Tj7ow0WEECbLEI9Vvb7AuaIGGUWujTOuFIWehK9/ME9Ml/Uv23pHtTcBesc0JzOw==", + "requires": { + "@fluentui/priority-overflow": "^9.1.11", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-persona": { + "version": "9.2.81", + "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.2.81.tgz", + "integrity": "sha512-LQnteXDG5C8Jlwgk4TQsHTNvHV9r1uqWRLEmKqDrrKFf2ApA3lHyHy1EEc8a5BwOv0ef1dpalqgnAuArXZrEiw==", + "requires": { + "@fluentui/react-avatar": "^9.6.22", + "@fluentui/react-badge": "^9.2.32", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-popover": { + "version": "9.9.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.9.5.tgz", + "integrity": "sha512-yhKaMAKlj+wnV2LzoBqUXlLe5l0EiHg8m2I4n9efXHIVGzyaZEkVc26rwSaxoTbUnFSS8NG1EG5EYqQGh3wiwA==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-portal": "^9.4.21", + "@fluentui/react-positioning": "^9.14.4", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-portal": { + "version": "9.4.21", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.4.21.tgz", + "integrity": "sha512-FsDOmvvpC7OAFiwSAiSvvu/WoUUC4oMTQnY/zyotqnzKEyGS/6nMJ5Mr0gyzxtPDCzl6wIPAch5rVksseCm8vg==", + "requires": { + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "use-disposable": "^1.0.1" + } + }, + "@fluentui/react-portal-compat-context": { + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal-compat-context/-/react-portal-compat-context-9.0.11.tgz", + "integrity": "sha512-ubvW/ej0O+Pago9GH3mPaxzUgsNnBoqvghNamWjyKvZIViyaXUG6+sgcAl721R+qGAFac+A20akI5qDJz/xtdg==", + "requires": { + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-positioning": { + "version": "9.14.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.14.4.tgz", + "integrity": "sha512-mQz0C0iwRWy3g14laBcbbEEeoTb21dXn/ve8DNEJbVQ4P70MM43vCQeXWbHIDNw6HON+bIG3TyfNyFKQIpLwNA==", + "requires": { + "@floating-ui/devtools": "0.2.1", + "@floating-ui/dom": "^1.2.0", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-progress": { + "version": "9.1.72", + "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.1.72.tgz", + "integrity": "sha512-+pXMRybkZx5qjz3Cfnuj0ntzT6gvLlqukSPHGaneFHOMbivWz9TjVj/FCGIwy6OrY3nAQcgk92zN5sapgM0Nsw==", + "requires": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-provider": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.14.0.tgz", + "integrity": "sha512-uau0iv04ncFJLkRqKF1tFS8mUqumMBLc+n9CvUE8MK6/QXqHwcWPMUr09dCOsVAB6zpjiQO+4yHBZlja6RKKxA==", + "requires": { + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/core": "^1.14.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-radio": { + "version": "9.2.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.2.16.tgz", + "integrity": "sha512-H5NzFFYYkQ2osE7Rh96DjWRgI24POZoaBnjJrUvds5B/3Jod4905c2VsP6MSvkr+cslVRnO55OCeBX7MlqP17g==", + "requires": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-label": "^9.1.68", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-rating": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-rating/-/react-rating-9.0.4.tgz", + "integrity": "sha512-AieJyOO6Ldflfr8IxbUYkBpEDKOm+zPJJhtzUVQrb/kqJOsCDknPoO4UkL3VbfjN8QGCQ353Aq1ZX2svL5ar3Q==", + "requires": { + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-search": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-search/-/react-search-9.0.1.tgz", + "integrity": "sha512-Hz/44MwKCaSjoGSxzwE9pu/cj0XtjeNNl2ky3aRYgvmfHTIMGc2c72vhxp98EYrVolyV7ijCdm3AnwWW7aA6Kw==", + "requires": { + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-input": "^9.4.72", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-select": { + "version": "9.1.72", + "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.1.72.tgz", + "integrity": "sha512-xtdiK++/aT49xT/JRSNhOSwgfMR/OcifShXrLCx1WNG78yXMCFOv7J2/i+01MsPZHZDo7EYWgxKmAYZ0+e4TIw==", + "requires": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-shared-contexts": { + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.17.0.tgz", + "integrity": "sha512-SvfFmzzy0QfhaCrGcUJFJcscc6NGyuoYxT0Q8wgu5ol3vZ+idvVgGIJbhwQFVT08Ph5yR6FsWS22/nLjTqE58A==", + "requires": { + "@fluentui/react-theme": "^9.1.19", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-skeleton": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.1.0.tgz", + "integrity": "sha512-eV+UbqZ3Xq8aShusyDnGrex9NG+7wcmvnKiTY8aOAf4Kl5XJwNr8WE5nHcHO3pyIsX6bQQcvSWsyxMw5rJy/Ag==", + "requires": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-slider": { + "version": "9.1.78", + "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.1.78.tgz", + "integrity": "sha512-0+SC1TG6smvlK21MU6DCO6dEGtnFNa/Zt2VqNxP2h56iusdPzDwqj2UQre5S6tfigR1fCAMEMeOkerOpXKWW/g==", + "requires": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-spinbutton": { + "version": "9.2.72", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.2.72.tgz", + "integrity": "sha512-79/IfTrRWmsq4C09q6nZsCGBsHSbfLCsTe8WI13sB0zWBlCDQVXOwsi7XuS8DbO3jmT8eUggJbaYEn4h/8iHHQ==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-spinner": { + "version": "9.4.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.4.5.tgz", + "integrity": "sha512-Kg5NUB2UrViDiBEKNdV7UVN4mPxeZF5seUm7qZP4hBSKf90oj2xcJ+BKggQg++MelDLMFeLnTE1pJO/Lv/ovbA==", + "requires": { + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-label": "^9.1.68", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-switch": { + "version": "9.1.78", + "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.1.78.tgz", + "integrity": "sha512-pyqKSXE5vglqkGS9UXIQe/l2Q78t/PFPuiCbfEr1c8TYhzdQWXJq2WkK5WbrZAwLRL9AEbhCmoD1Lig9PXvGHQ==", + "requires": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-label": "^9.1.68", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-table": { + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.15.0.tgz", + "integrity": "sha512-uvdmF7JdlYZ5jXi8Y7M4KB2TmNNm9+oTevwiF3BmnQVLCoHq0lX1Mlv12gLRuztAuHiTOsNcPETZTbUjlf1GZg==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-avatar": "^9.6.22", + "@fluentui/react-checkbox": "^9.2.21", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-radio": "^9.2.16", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-tabs": { + "version": "9.4.17", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.4.17.tgz", + "integrity": "sha512-ZdzS46h2FW8dZOLCZPkrnvYEE6dD4HRYN6M4/RGqiN8dT8jWxj0FBZSNpp6gGTCftADr6k675GqKWoGmnr2ctA==", + "requires": { + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-tabster": { + "version": "9.20.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.20.1.tgz", + "integrity": "sha512-dDm18fThjQfDYL5dH2WdcECdbYNe0T8sn6j2RGP3V6cxqCwXpAI+zfquIAjqkgoR9bn/XDDSkUKTyxrFMrVMVA==", + "requires": { + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "keyborg": "^2.5.0", + "tabster": "^7.1.0" + } + }, + "@fluentui/react-tags": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-tags/-/react-tags-9.3.1.tgz", + "integrity": "sha512-tzfMFmM3q4Rl65M7qDSIHSNM6PLMcctLfjpt0qBj//OriomJ1cG0N1tmEXRVWlq3BMeGI+xIXCXktrl/2xbpCA==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-avatar": "^9.6.22", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-teaching-popover": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-teaching-popover/-/react-teaching-popover-9.1.0.tgz", + "integrity": "sha512-KBeCqzoPc8jiGTQmvEABJuxcJHyM2sp/hSNLpdl68zniqXCJCvqY3o02Av1xWRjmyFKn7Lt5q6MTs5ZkaEYcYQ==", + "requires": { + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-button": "^9.3.76", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-popover": "^9.9.5", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "use-sync-external-store": "^1.2.0" + } + }, + "@fluentui/react-text": { + "version": "9.4.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.4.16.tgz", + "integrity": "sha512-rgdLtbY6rHdFrxNWqflh88aEqqONWBgoMA6xEOQix357E3A5J7S8NJSlKAsd00zQO5gFRiKO+gr5iiRFVKDqeA==", + "requires": { + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-textarea": { + "version": "9.3.72", + "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.3.72.tgz", + "integrity": "sha512-lLYtumX6CxHPbsTP2W+PX6ehWGlZXAKpcgqrhCU4YGxNAdD7FbBO30SIQMAgQ6ygWMAZRztGGRQYkihFz8SeiQ==", + "requires": { + "@fluentui/react-field": "^9.1.62", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-theme": { + "version": "9.1.19", + "resolved": "https://registry.npmjs.org/@fluentui/react-theme/-/react-theme-9.1.19.tgz", + "integrity": "sha512-mrVhKbr4o9UKERPxgghIRDU59S7gRizrgz3/wwyMt7elkr8Sw+OpwKIeEw9x6P0RTcFDC00nggaMJhBGs7Xo4A==", + "requires": { + "@fluentui/tokens": "1.0.0-alpha.16", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-toast": { + "version": "9.3.38", + "resolved": "https://registry.npmjs.org/@fluentui/react-toast/-/react-toast-9.3.38.tgz", + "integrity": "sha512-oGLdXgObrDCpWzGoM+AKEz1QmwvIix9xCyA2Tf5j9n4kuXAzN9QQZCrS0qVt+I43SboUdsvW8VT+06oSdNPNUA==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-portal": "^9.4.21", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "react-transition-group": "^4.4.1" + } + }, + "@fluentui/react-toolbar": { + "version": "9.1.79", + "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.1.79.tgz", + "integrity": "sha512-9PnMPBh9Yz519qJad18fxe8mQxeLipkB2X9E7xfqMk0zJM1Yni2PmyjuFfJZlgMipkdD26/G1P+gqt45O+b4oQ==", + "requires": { + "@fluentui/react-button": "^9.3.76", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-divider": "^9.2.67", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-radio": "^9.2.16", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-tooltip": { + "version": "9.4.24", + "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.4.24.tgz", + "integrity": "sha512-TJNP3KBZID+yLc4BlJ0A4lrB7SlelI9RPgpFs7En5AR35eqKsRriGLiiIj3cAeKh7BvvH+dNCDjg6zo82rbytQ==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-portal": "^9.4.21", + "@fluentui/react-positioning": "^9.14.4", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-tree": { + "version": "9.4.39", + "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.4.39.tgz", + "integrity": "sha512-3Zab9biXU+ds2Vx59NGuDksYtGNLuVrAxWQxTmXDbGQ0Y8ogPTA82t52Nf2vRbygzw8PV4dBfwbgau6uQgFNNQ==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.10.5", + "@fluentui/react-avatar": "^9.6.22", + "@fluentui/react-button": "^9.3.76", + "@fluentui/react-checkbox": "^9.2.21", + "@fluentui/react-context-selector": "^9.1.58", + "@fluentui/react-icons": "^2.0.235", + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-radio": "^9.2.16", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-tabster": "^9.20.1", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-utilities": { + "version": "9.18.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.18.7.tgz", + "integrity": "sha512-voVd4xrx+9VxCPYt51JlzLuJYsjCf3LYjoytAyruu7kEOkPF31Fnjkmp81yrXnAbM+J+tL8HajG5bUHjt8H59w==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-shared-contexts": "^9.17.0", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-virtualizer": { + "version": "9.0.0-alpha.75", + "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.75.tgz", + "integrity": "sha512-1ISbGEr4XVDcrSCQfnStc+yH3lD2bZuK2zg6cEouqZNBo6GdNFtvRU5Zi84CfOFeGMzO6NItHfBHLoJYqSYCSw==", + "requires": { + "@fluentui/react-jsx-runtime": "^9.0.36", + "@fluentui/react-shared-contexts": "^9.17.0", + "@fluentui/react-utilities": "^9.18.7", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-window-provider": { + "version": "2.2.21", + "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-2.2.21.tgz", + "integrity": "sha512-ZrPYPmhLB9TqWu2c4g7L9zJGakcfJ4AYD3rje8lQJzSDftQ3OpM8DoLoe18joGni6yLICSaCVdBfQfoJpFmkHg==", + "requires": { + "@fluentui/set-version": "^8.2.17", "tslib": "^2.1.0" } }, "@fluentui/set-version": { - "version": "8.2.11", - "resolved": "https://registry.npmjs.org/@fluentui/set-version/-/set-version-8.2.11.tgz", - "integrity": "sha512-UI03tysau/adBO1a3q4uFZWQ3lfkiFcAWIFng4k5odWcCokfCm5IxA0urKqj5W5JRYdyoBUaq8QbcNGkFB4dCw==", + "version": "8.2.17", + "resolved": "https://registry.npmjs.org/@fluentui/set-version/-/set-version-8.2.17.tgz", + "integrity": "sha512-AdhnGcw0qAdSJliDYc2sWh+fryeN9FjFw7VVw8/eG1U97k6KmJvAmMMgqcOir1XZgRRnwL4EjSPc5TWYwh5EuQ==", "requires": { "tslib": "^2.1.0" } }, "@fluentui/style-utilities": { - "version": "8.9.17", - "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.9.17.tgz", - "integrity": "sha512-wMeLw3MSIotx1EzDYTMWFx03iZqR/YBaUt1FR2oamt+zz3HKiproNR9xNKEQmszNFUDDAZJL9XhLVp1iNlS88A==", + "version": "8.10.9", + "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.10.9.tgz", + "integrity": "sha512-6qc0LdmPqBFROTtl5a3X/ELizz+mosxjlmAQrkF2aw91JSw5dZ1PaxuJh052fiG+r/0QtvX5qQdlOh84vXYa1g==", "requires": { - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/set-version": "^8.2.11", - "@fluentui/theme": "^2.6.35", - "@fluentui/utilities": "^8.13.18", + "@fluentui/merge-styles": "^8.6.4", + "@fluentui/set-version": "^8.2.17", + "@fluentui/theme": "^2.6.47", + "@fluentui/utilities": "^8.15.4", "@microsoft/load-themed-styles": "^1.10.26", "tslib": "^2.1.0" } }, "@fluentui/theme": { - "version": "2.6.35", - "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.35.tgz", - "integrity": "sha512-8EusEcEX/9gA1H0vVYZX0q+na88cPrS8Cs2XPlN056Xtzzrbgl6qFRJ79aiJaZ8Oq6TkcASn1gfgyUTz6fbMng==", + "version": "2.6.47", + "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.47.tgz", + "integrity": "sha512-B58sD7w5S8/UVwo9j/enjf3KjEhCjDw6bXMG6lJS1EILRvz1aDN90J0Z+GiYnm3WtaTeYq04kh9XLfpnfkadcA==", "requires": { - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/set-version": "^8.2.11", - "@fluentui/utilities": "^8.13.18", + "@fluentui/merge-styles": "^8.6.4", + "@fluentui/set-version": "^8.2.17", + "@fluentui/utilities": "^8.15.4", "tslib": "^2.1.0" } }, - "@fluentui/utilities": { - "version": "8.13.18", - "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.13.18.tgz", - "integrity": "sha512-/0rX9EzltLKwU1SS14VV7agWoOzruVTU3oagZq1QgFAvoj8qi7fNqvSX/VEeRy+0gmbsCkrEViUPkmC7drKzPg==", + "@fluentui/tokens": { + "version": "1.0.0-alpha.16", + "resolved": "https://registry.npmjs.org/@fluentui/tokens/-/tokens-1.0.0-alpha.16.tgz", + "integrity": "sha512-Gr9G8LIlUhZYX5j6CfDQrofQqsWAz/q54KabWn1tWV/1083WwyoTZXiG1k6b37NnK7Feye7D7Nz+4MNqoKpXGw==", "requires": { - "@fluentui/dom-utilities": "^2.2.11", - "@fluentui/merge-styles": "^8.5.12", - "@fluentui/set-version": "^8.2.11", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/utilities": { + "version": "8.15.4", + "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.15.4.tgz", + "integrity": "sha512-0M7gm2PmkJeQmQflcoens80QOslm3NGAQgV2bWsWFrdOB2Qn1fx3eyPWtT3h+a6IA705N0YR8KZCtAJ87mS+nA==", + "requires": { + "@fluentui/dom-utilities": "^2.3.1", + "@fluentui/merge-styles": "^8.6.4", + "@fluentui/react-window-provider": "^2.2.21", + "@fluentui/set-version": "^8.2.17", "tslib": "^2.1.0" } }, @@ -13019,6 +15447,36 @@ "integrity": "sha512-9anpBMM9mEgZN4wr2v8wHJI2/u5TnnggewRN6OlvXTTnuVyoY19X6rOv9XTqKRw6dcGKwZsBi8n0kDE2I5i4VA==", "requires": {} }, + "@griffel/core": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@griffel/core/-/core-1.15.3.tgz", + "integrity": "sha512-5ksBpOjFJ75HijGehQ06Ri9cQjhd/rqQ0N/jJzXDDXQFYdOOzib/QL7BXNwhkLtTyHvN391cD4/BqcTdynfLUg==", + "requires": { + "@emotion/hash": "^0.9.0", + "@griffel/style-types": "^1.0.4", + "csstype": "^3.1.3", + "rtl-css-js": "^1.16.1", + "stylis": "^4.2.0", + "tslib": "^2.1.0" + } + }, + "@griffel/react": { + "version": "1.5.21", + "resolved": "https://registry.npmjs.org/@griffel/react/-/react-1.5.21.tgz", + "integrity": "sha512-7wuY9uFSt/0E7kLAKX//ue8NILx0IGoOtIx6WVuavEUFJXPCrvFn4uCDgnJC0211LZtJ+XH7zZGPNUtSb7nijw==", + "requires": { + "@griffel/core": "^1.15.3", + "tslib": "^2.1.0" + } + }, + "@griffel/style-types": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@griffel/style-types/-/style-types-1.0.4.tgz", + "integrity": "sha512-geZomjQTIHXoQZFFB811PUMXYAr8LuBNOMPcR2YJAl1pslbHYYiZKCa2FgZCw00hnQFP4uB4JIJ2CiPJqKZYmw==", + "requires": { + "csstype": "^3.1.3" + } + }, "@humanwhocodes/config-array": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", @@ -13419,20 +15877,20 @@ } }, "@paperbits/react": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@paperbits/react/-/react-1.0.7.tgz", - "integrity": "sha512-0/Td5LeYSZj0W8nyXQi9x9QEBDoLoU/VznpBi0n2TVGCvJVexN8QU7+FKkERQv+91mWqQ2V5nDyFeQoQRAgRpg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@paperbits/react/-/react-1.0.8.tgz", + "integrity": "sha512-APB8ok9eqnwYSLn0tPW6z7EeTsdsp6QMJL3QbwVosTwfeZW0T/GBypk1KneyCZTXn2LCYG1todneuK/Eo2dBwg==", "requires": { - "@paperbits/common": "0.1.529", + "@paperbits/common": "0.1.550", "inversify-react": "^1.0.2", "react": "^18.2.0", "react-dom": "^18.2.0" }, "dependencies": { "@paperbits/common": { - "version": "0.1.529", - "resolved": "https://registry.npmjs.org/@paperbits/common/-/common-0.1.529.tgz", - "integrity": "sha512-TGxI4wlEES73l9FNawUKeMIU8sj8r8+n7F5BkiGz4hd9XqwBx65M+n9CYuCvNXILZMI483Z8t1phM6VCOmrqDA==", + "version": "0.1.550", + "resolved": "https://registry.npmjs.org/@paperbits/common/-/common-0.1.550.tgz", + "integrity": "sha512-gGq5/2kRBrlvpfpeYZEh27eaamBRmjEk458i/W9r02UCI1LXRp6SBO3woAfsh2VkQwt6PwOU0X9663oS9efBgA==", "requires": { "@googlemaps/js-api-loader": "^1.13.2", "html-minifier-terser": "^5.1.1", @@ -13624,9 +16082,9 @@ } }, "@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.11.tgz", + "integrity": "sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==", "requires": { "tslib": "^2.4.0" } @@ -15136,9 +17594,9 @@ } }, "csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "d3": { "version": "7.8.5", @@ -15535,6 +17993,15 @@ "esutils": "^2.0.2" } }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "domexception": { "version": "4.0.0", "requires": { @@ -17187,6 +19654,11 @@ "safe-buffer": "^5.0.1" } }, + "keyborg": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/keyborg/-/keyborg-2.5.0.tgz", + "integrity": "sha512-nb4Ji1suqWqj6VXb61Jrs4ab/UWgtGph4wDch2NIZDfLBUObmLcZE0aiDjZY49ghtu03fvwxDNvS9ZB0XMz6/g==" + }, "kind-of": { "version": "6.0.3", "dev": true @@ -18021,8 +20493,7 @@ "version": "2.2.0" }, "object-assign": { - "version": "4.1.1", - "dev": true + "version": "4.1.1" }, "obuf": { "version": "1.1.2", @@ -18472,6 +20943,23 @@ "version": "1.0.7", "dev": true }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, "property-information": { "version": "6.1.0" }, @@ -18662,6 +21150,11 @@ "scheduler": "^0.23.0" } }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, "react-toastify": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.1.3.tgz", @@ -18670,6 +21163,17 @@ "clsx": "^1.1.1" } }, + "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==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, "readable-stream": { "version": "2.0.6", "dev": true, @@ -18848,6 +21352,14 @@ "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==" }, + "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==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, "run-async": { "version": "2.4.1" }, @@ -19256,6 +21768,11 @@ "inline-style-parser": "0.1.1" } }, + "stylis": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" + }, "supports-color": { "version": "8.1.1", "dev": true, @@ -19276,6 +21793,15 @@ "symbol-tree": { "version": "3.2.4" }, + "tabster": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/tabster/-/tabster-7.1.1.tgz", + "integrity": "sha512-3VsXUb0XxVcFq9NmzTieAJAlruMiaj/dvXIHm7RgjsUrMGkEcq9KbBdai05NAGp2D2d/CxHc6j1mbuUzGofWBA==", + "requires": { + "keyborg": "2.5.0", + "tslib": "^2.3.1" + } + }, "tapable": { "version": "2.2.1", "dev": true @@ -19594,6 +22120,18 @@ "requires-port": "^1.0.0" } }, + "use-disposable": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/use-disposable/-/use-disposable-1.0.2.tgz", + "integrity": "sha512-UMaXVlV77dWOu4GqAFNjRzHzowYKUKbJBQfCexvahrYeIz4OkUYUjna4Tjjdf92NH8Nm8J7wEfFRgTIwYjO5jg==", + "requires": {} + }, + "use-sync-external-store": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.1.tgz", + "integrity": "sha512-6MCBDr76UJmRpbF8pzP27uIoTocf3tITaMJ52mccgAhMJycuh5A/RL6mDZCTwTisj0Qfeq69FtjMCUX27U78oA==", + "requires": {} + }, "util": { "version": "0.10.4", "dev": true, diff --git a/package.json b/package.json index ccf8ad35..2907f4a1 100644 --- a/package.json +++ b/package.json @@ -76,14 +76,16 @@ "@azure/msal-browser": "^2.37.1", "@braintree/sanitize-url": "6.0.4", "@fluentui/font-icons-mdl2": "^8.5.9", - "@fluentui/react": "^8.105.11", + "@fluentui/react": "^8.117.7", + "@fluentui/react-components": "^9.49.0", + "@fluentui/react-icons": "^2.0.237", "@microsoft/applicationinsights-web": "^3.0.2", "@monaco-editor/loader": "^1.3.3", "@paperbits/azure": "0.1.593", "@paperbits/common": "0.1.593-hotfix2", "@paperbits/core": "0.1.593-hotfix2", "@paperbits/forms": "0.1.593-hotfix2", - "@paperbits/react": "1.0.7", + "@paperbits/react": "^1.0.8", "@paperbits/styles": "0.1.593-hotfix2", "@webcomponents/custom-elements": "1.6.0", "@webcomponents/shadydom": "^1.11.0", diff --git a/src/apim.design.module.ts b/src/apim.design.module.ts index 0a02a246..fd59fdf1 100644 --- a/src/apim.design.module.ts +++ b/src/apim.design.module.ts @@ -1,6 +1,7 @@ import * as Constants from "./constants"; import "./bindingHandlers/codeEditor"; import "./bindingHandlers/copyToClipboard"; +import { ReactModule } from "@paperbits/react/react.module"; import { UnsavedChangesRouteGuard } from "./routing/unsavedChangesRouteGuard"; import { MapiObjectStorage, MapiBlobStorage } from "./persistence"; import { DefaultAuthenticator } from "./components/defaultAuthenticator"; @@ -54,6 +55,7 @@ import { CodeEditor } from "./components/code-editor/code-editor"; export class ApimDesignModule implements IInjectorModule { public register(injector: IInjector): void { injector.bindModule(new SetupModule()); + injector.bindModule(new ReactModule()); injector.bindModule(new ListOfApisDesignModule()); injector.bindModule(new ApiProductsDesignModule()); injector.bindModule(new DetailsOfApiDesignModule()); diff --git a/src/apim.publish.module.ts b/src/apim.publish.module.ts index fee952a4..3db6543e 100644 --- a/src/apim.publish.module.ts +++ b/src/apim.publish.module.ts @@ -1,3 +1,4 @@ +import { ReactModule } from "@paperbits/react/react.module"; import { AadConfigPublisher } from "./publishing/aadConfigPublisher"; import { IInjector, IInjectorModule } from "@paperbits/common/injection"; import { ConsoleLogger } from "@paperbits/common/logging"; @@ -45,6 +46,7 @@ import { staticDataEnvironment, mockStaticDataEnvironment } from "./../environme export class ApimPublishModule implements IInjectorModule { public register(injector: IInjector): void { + injector.bindModule(new ReactModule()); injector.bindModule(new ListOfApisPublishModule()); injector.bindModule(new ApiProductsPublishModule()); injector.bindModule(new DetailsOfApiPublishModule()); diff --git a/src/apim.runtime.module.ts b/src/apim.runtime.module.ts index 9edd1c44..ec367ba3 100644 --- a/src/apim.runtime.module.ts +++ b/src/apim.runtime.module.ts @@ -1,3 +1,4 @@ +import { ReactModule } from "@paperbits/react/react.module"; import { IInjector, IInjectorModule } from "@paperbits/common/injection"; import { ConsoleLogger } from "@paperbits/common/logging"; import { DefaultSessionManager } from "@paperbits/common/persistence/defaultSessionManager"; @@ -88,10 +89,12 @@ import { TagService } from "./services/tagService"; import { TenantService } from "./services/tenantService"; import { UsersService } from "./services/usersService"; import { TraceClick } from "./bindingHandlers/traceClick"; - +import { OperationListRuntimeModule } from "./components/operations/operation-list/operationList.runtime.module"; +import { GraphqlService } from "./services/graphqlService"; export class ApimRuntimeModule implements IInjectorModule { public register(injector: IInjector): void { + injector.bindModule(new ReactModule()); injector.bindSingleton("logger", ConsoleLogger); injector.bindSingleton("traceClick", TraceClick); injector.bindToCollection("autostart", UnhandledErrorHandler); @@ -117,6 +120,7 @@ export class ApimRuntimeModule implements IInjectorModule { injector.bind("codeSnippet", CodeSnippet); injector.bind("fileInput", FileInput); injector.bind("apiService", ApiService); + injector.bind("graphqlService", GraphqlService); injector.bind("tagService", TagService); injector.bind("productService", ProductService); injector.bind("analyticsService", AnalyticsService); @@ -165,6 +169,7 @@ export class ApimRuntimeModule implements IInjectorModule { injector.bind("oauthServerConfiguration", OauthServerConfiguration); injector.bindModule(new CustomWidgetRuntimeModule()); injector.bindModule(new RoleBasedSecurityRuntimeModule()); + injector.bindModule(new OperationListRuntimeModule()); if (process.env.NODE_ENV === staticDataEnvironment) { injector.bind("httpClient", StaticDataHttpClient); diff --git a/src/components/operations/operation-list/ko/operationList.html b/src/components/operations/operation-list/ko/operationList.html index a5888b20..ce31b213 100644 --- a/src/components/operations/operation-list/ko/operationList.html +++ b/src/components/operations/operation-list/ko/operationList.html @@ -1 +1 @@ - + diff --git a/src/components/operations/operation-list/operationList.runtime.module.ts b/src/components/operations/operation-list/operationList.runtime.module.ts new file mode 100644 index 00000000..8f460823 --- /dev/null +++ b/src/components/operations/operation-list/operationList.runtime.module.ts @@ -0,0 +1,10 @@ +import { IInjector, IInjectorModule } from "@paperbits/common/injection"; +import { registerCustomElement } from "@paperbits/react/customElements"; +import { OperationListRuntime } from "./react/runtime/OperationListRuntime"; + +export class OperationListRuntimeModule implements IInjectorModule { + public register(injector: IInjector): void { + injector.bind("operationListRuntime", OperationListRuntime); + registerCustomElement(OperationListRuntime, "fui-operation-list", injector); + } +} \ No newline at end of file diff --git a/src/components/operations/operation-list/react/runtime/OperationList.tsx b/src/components/operations/operation-list/react/runtime/OperationList.tsx new file mode 100644 index 00000000..718fc2da --- /dev/null +++ b/src/components/operations/operation-list/react/runtime/OperationList.tsx @@ -0,0 +1,359 @@ +import * as React from "react"; +import { useEffect, useState } from "react"; +import { Router } from "@paperbits/common/routing"; +import { Stack } from "@fluentui/react"; +import { + Accordion, + AccordionHeader, + AccordionItem, + AccordionPanel, + Body1, + Body1Strong, + Button, + Link, + Menu, + MenuButton, + MenuGroup, + MenuGroupHeader, + MenuItemCheckbox, + MenuList, + MenuPopover, + MenuTrigger, + SearchBox, + Spinner +} from "@fluentui/react-components"; +import { ChevronUpRegular, FilterRegular, MoreHorizontalRegular, SearchRegular } from "@fluentui/react-icons"; +import { defaultPageSize } from "../../../../../constants"; +import { SearchQuery } from "../../../../../contracts/searchQuery"; +import { Tag } from "../../../../../models/tag"; +import { Page } from "../../../../../models/page"; +import { Operation } from "../../../../../models/operation"; +import { TagGroup } from "../../../../../models/tagGroup"; +import { ApiService } from "../../../../../services/apiService"; +import { TagService } from "../../../../../services/tagService"; +import { RouteHelper } from "../../../../../routing/routeHelper"; +import { OperationListRuntimeProps } from "./OperationListRuntime"; + +enum TListProps { + groupByTag = "group-by-tag", + showUrlPath = "show-url-path" +} + +export const OperationList = ({ + apiName, + operationName, + apiService, + tagService, + routeHelper, + router, + allowSelection, + wrapText, + showToggleUrlPath, + defaultShowUrlPath, + defaultGroupByTagToEnabled, + defaultAllGroupTagsExpanded, + detailsPageUrl +}: OperationListRuntimeProps & { apiName: string, operationName: string, apiService: ApiService, tagService: TagService, routeHelper: RouteHelper, router: Router }) => { + const [working, setWorking] = useState(false); + const [isCollapsed, setIsCollapsed] = useState(false); + const [pageNumber, setPageNumber] = useState(1); + const [hasNextPage, setHasNextPage] = useState(false); + const [operations, setOperations] = useState([]); + const [operationsByTags, setOperationsByTags] = useState[]>([]); + const [selectedOperationName, setSelectedOperationName] = useState(); + const [pattern, setPattern] = useState(); + const [showUrlPath, setShowUrlPath] = useState(defaultShowUrlPath); + const [tags, setTags] = useState([]); + const [selectedTags, setSelectedTags] = useState([]); + const [groupByTag, setGroupByTag] = useState(defaultGroupByTagToEnabled); + const [searchByTags, setSearchByTags] = useState(false); + const [tagPattern, setTagPattern] = useState(); + + useEffect(() => { + if (!apiName) return; + + const query: SearchQuery = { + pattern, + tags: [...selectedTags], + skip: (pageNumber - 1) * defaultPageSize, + take: defaultPageSize, + grouping: groupByTag ? "tag" : "none", + propertyName: showUrlPath ? "urlTemplate" : "" + }; + + setWorking(true); + if (groupByTag) { + loadOperationsByTag(query) + .then(loadedOperations => { + if (pageNumber > 1) { + // Check if the tag is already displayed. If yes, add to this tag + loadedOperations.value.forEach(newOperation => { + const existingTagIndex = operationsByTags.findIndex(item => item.tag === newOperation.tag); + if (existingTagIndex !== -1) { + operationsByTags[existingTagIndex].items.push(...newOperation.items); + } else { + operationsByTags.push(newOperation); + } + }); + setOperationsByTags(operationsByTags); + } else { + setOperationsByTags([...loadedOperations.value]); + } + + setHasNextPage(!!loadedOperations.nextLink); + + if (allowSelection && loadedOperations.count > 0) { + if (!operationName) { + selectOperation(loadedOperations.value[0].items[0]); + } else { + const selectedOperation = loadedOperations.value.find(operation => operation.items.some(item => item.name === operationName)); + selectedOperation && selectOperation(selectedOperation.items.find(item => item.name === operationName)); + } + } + }) + .finally(() => setWorking(false)); + } else { + loadOperations(query) + .then(loadedOperations => { + if (pageNumber > 1) { + setOperations([...operations, ...loadedOperations.value]); + } else { + setOperations([...loadedOperations.value]); + } + setHasNextPage(!!loadedOperations.nextLink); + + if (allowSelection && loadedOperations.count > 0) { + if (!operationName) { + selectOperation(loadedOperations.value[0]); + } else { + const selectedOperation = loadedOperations.value.find(operation => operation.name === operationName); + selectedOperation && selectOperation(selectedOperation); + } + } + }) + .finally(() => setWorking(false)); + } + }, [apiName, pageNumber, pattern, selectedTags, groupByTag]); + + useEffect(() => { + if (apiName) { + loadTags().then(loadedTags => setTags(loadedTags.value)); + } + }, [apiName, tagPattern]); + + const loadOperations = async (query: SearchQuery): Promise> => { + let pageOfOperations: Page; + + try { + pageOfOperations = await apiService.getOperations(`apis/${apiName}`, query); + } catch (error) { + throw new Error(`Unable to load the API. Error: ${error.message}`); + } + + return pageOfOperations; + } + + const loadOperationsByTag = async (query: SearchQuery): Promise>> => { + let pageOfOperations: Page>; + + try { + pageOfOperations = await apiService.getOperationsByTags(apiName, query); + } catch (error) { + throw new Error(`Unable to load the API. Error: ${error.message}`); + } + + return pageOfOperations; + } + + const loadTags = async (): Promise> => { + let pageOfTags: Page; + + try { + pageOfTags = await tagService.getTags(`apis/${apiName}`, tagPattern); + } catch (error) { + throw new Error(`Unable to load tags. Error: ${error.message}`); + } + + return pageOfTags; + } + + const getDefaultListProps = (): Array => { + const defaultProps = []; + defaultGroupByTagToEnabled && defaultProps.push(TListProps.groupByTag); + defaultShowUrlPath && defaultProps.push(TListProps.showUrlPath); + + return defaultProps; + } + + const selectOperation = (operation: Operation): void => { + if (!operation) return; + + allowSelection && setSelectedOperationName(operation.name); + const operationUrl = routeHelper.getOperationReferenceUrl(apiName, operation.name, detailsPageUrl); + router.navigateTo(operationUrl); + } + + const renderOperation = (operation: Operation): JSX.Element => ( + selectOperation(operation)} + > + {operation.name === selectedOperationName + ? <> + + {operation.method} + + + {showUrlPath ? operation.urlTemplate : operation.displayName} + + + : <> + + {operation.method} + + + {showUrlPath ? operation.urlTemplate : operation.displayName} + + + } + + ) + + return ( +
+ + Operations + + + + } + appearance={"transparent"} + className={"operation-more"} + aria-label={"More options"} + /> + + + + + { + setPageNumber(1); + setSelectedOperationName(null); + setGroupByTag(!groupByTag); + }} + > + Group operations by tag + + {showToggleUrlPath && + setShowUrlPath(!showUrlPath)} + > + Show URL path + + } + + + +
+ + ); +} \ No newline at end of file diff --git a/src/components/operations/operation-list/react/runtime/OperationListGql.tsx b/src/components/operations/operation-list/react/runtime/OperationListGql.tsx new file mode 100644 index 00000000..c2d998ee --- /dev/null +++ b/src/components/operations/operation-list/react/runtime/OperationListGql.tsx @@ -0,0 +1,151 @@ +import * as React from "react"; +import { useEffect, useState } from "react"; +import { Router } from "@paperbits/common/routing"; +import { Stack } from "@fluentui/react"; +import { Body1, Body1Strong, Button, Dropdown, Option, SearchBox, Spinner } from "@fluentui/react-components"; +import { ChevronUpRegular, SearchRegular } from "@fluentui/react-icons"; +import { RouteHelper } from "../../../../../routing/routeHelper"; +import { OperationListRuntimeProps } from "./OperationListRuntime"; +import { GraphqlService, TGraphqlTypes } from "../../../../../services/graphqlService"; + +export const OperationListGql = ({ + apiName, + graphqlService, + routeHelper, + router, + allowSelection, + wrapText, + detailsPageUrl +}: OperationListRuntimeProps & { apiName: string, graphqlService: GraphqlService, routeHelper: RouteHelper, router: Router }) => { + const [working, setWorking] = useState(false); + const [isCollapsed, setIsCollapsed] = useState(false); + const [graphqlTypes, setGraphqlTypes] = useState(); + const [availableGraphqlTypes, setAvailableGraphqlTypes] = useState([]); + const [selectedGraphqlType, setSelectedGraphqlType] = useState(null); + const [selectedGraphqlTypeOperations, setSelectedGraphqlTypeOperations] = useState(); + const [filteredOperations, setFilteredOperations] = useState(); + const [selectedOperationName, setSelectedOperationName] = useState(); + + useEffect(() => { + if (!apiName) return; + + setWorking(true); + getGraphValues().then(loadedValues => { + setGraphqlTypes(loadedValues.graphqlTypes); + setAvailableGraphqlTypes(loadedValues.availableGraphqlTypes); + + const selectedType = loadedValues?.availableGraphqlTypes[0]; + if (selectedType) { + const operations = loadedValues.graphqlTypes[selectedType.toLowerCase()]; + setSelectedGraphqlType(selectedType); + setSelectedGraphqlTypeOperations(operations); + setFilteredOperations(operations); + Object.values(operations).length > 0 && setSelectedOperationName(Object.values(operations)[0]["name"]); + } + }).finally(() => setWorking(false)); + }, [apiName]); + + const getGraphValues = async (): Promise<{graphqlTypes: TGraphqlTypes, availableGraphqlTypes: string[]}> => { + let graphqlTypes: TGraphqlTypes; + let availableGraphqlTypes: string[]; + + try { + graphqlTypes = await graphqlService.getGraphqlTypes(apiName); + availableGraphqlTypes = await graphqlService.getAvailableGraphqlTypes(graphqlTypes); + } catch (error) { + throw new Error(`Unable to get GraphQL types. Error: ${error.message}`); + } + + return {graphqlTypes, availableGraphqlTypes}; + } + + const selectOperation = (operation): void => { + if (!operation) return; + + allowSelection && setSelectedOperationName(operation.name); + const operationUrl = routeHelper.getGraphReferenceUrl(apiName, selectedGraphqlType.toLowerCase(), operation.name, detailsPageUrl); + router.navigateTo(operationUrl); + } + + const filterOperations = (searchText?: string): void => { + if (!searchText) { + setFilteredOperations(selectedGraphqlTypeOperations); + } else { + const filteredOperations: {} = Object + .values(selectedGraphqlTypeOperations) + .filter(operation => operation["name"].toLowerCase().includes(searchText.toLowerCase())) + .reduce((obj: object, item: any) => { + return { + ...obj, + [item.name]: item + }; + }, {}); + setFilteredOperations(filteredOperations); + } + } + + const renderOperation = (operation): JSX.Element => ( + selectOperation(operation)} + > + {operation.name === selectedOperationName + ? + {operation.name} + + : + {operation.name} + + } + + ) + + return ( +
+ + Operations +
+ ); +} \ No newline at end of file diff --git a/src/components/operations/operation-list/react/runtime/OperationListRuntime.tsx b/src/components/operations/operation-list/react/runtime/OperationListRuntime.tsx new file mode 100644 index 00000000..61425312 --- /dev/null +++ b/src/components/operations/operation-list/react/runtime/OperationListRuntime.tsx @@ -0,0 +1,109 @@ +import * as React from "react"; +import { Resolve } from "@paperbits/react/decorators"; +import { Router } from "@paperbits/common/routing"; +import { Body1, FluentProvider} from "@fluentui/react-components"; +import { TypeOfApi, fuiTheme } from "../../../../../constants"; +import { ApiService } from "../../../../../services/apiService"; +import { TagService } from "../../../../../services/tagService"; +import { GraphqlService } from "../../../../../services/graphqlService"; +import { GraphDocService } from "../../../operation-details/ko/runtime/graphql-documentation/graphql-doc-service"; +import { RouteHelper } from "../../../../../routing/routeHelper"; +import { OperationList } from "./OperationList"; +import { OperationListGql } from "./OperationListGql"; + +export interface OperationListRuntimeProps { + allowSelection?: boolean, + wrapText?: boolean, + showToggleUrlPath?: boolean, + defaultShowUrlPath?: boolean, + defaultGroupByTagToEnabled?: boolean, + defaultAllGroupTagsExpanded?: boolean, + detailsPageUrl: string +} + +interface OperationListRuntimeState { + apiName: string, + apiType: string, + operationName: string +} + +export class OperationListRuntime extends React.Component { + @Resolve("apiService") + public apiService: ApiService; + + @Resolve("tagService") + public tagService: TagService; + + @Resolve("graphqlService") + public graphqlService: GraphqlService; + + @Resolve("graphDocService") + public graphDocService: GraphDocService; + + @Resolve("routeHelper") + public routeHelper: RouteHelper; + + @Resolve("router") + public router: Router; + + constructor(props: OperationListRuntimeProps) { + super(props); + + this.state = { + apiName: null, + apiType: null, + operationName: null + } + } + + componentDidMount(): void { + this.getApi(); + this.router.addRouteChangeListener(() => this.getApi()); + } + + componentWillUnmount(): void { + this.router.removeRouteChangeListener(() => this.getApi()); + } + + getApi = async (): Promise => { + const apiName = this.routeHelper.getApiName(); + const operationName = this.routeHelper.getOperationName(); + let apiType: string; + + if (apiName && apiName !== this.state.apiName) { + const api = await this.apiService.getApi(`apis/${apiName}`); + apiType = api?.type; + + this.graphDocService.initialize(); // TODO: remove this when the whole GQL logic is moved to React + + this.setState({ apiName, operationName, apiType }); + } + } + + render() { + return ( + + {this.state.apiType === TypeOfApi.webSocket + ?
WebSocket APIs don't expose API operations.
+ : this.state.apiType === TypeOfApi.graphQL + ? + : + } +
+ ); + } +} \ No newline at end of file diff --git a/src/constants.ts b/src/constants.ts index 64ab1823..8654b4b5 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,4 +1,5 @@ import { OVERRIDE_PORT_KEY } from "@azure/api-management-custom-widgets-scaffolder"; +import { Theme, webLightTheme } from "@fluentui/react-components"; /** * APIM service SKU names. @@ -339,3 +340,13 @@ export const overrideToastSessionKeyPrefix = "MS_APIM_CW_override_toast_dismisse */ export const mobileBreakpoint = 768; export const smallMobileBreakpoint = 400; + +/** + * Customization of the Fluent UI Theme + */ +export const fuiTheme: Theme = { + ...webLightTheme, + fontFamilyBase: "inherit", + fontFamilyMonospace: "inherit", + fontFamilyNumeric: "inherit", +}; diff --git a/src/services/apiService.ts b/src/services/apiService.ts index e3005bc7..9bb2cf95 100644 --- a/src/services/apiService.ts +++ b/src/services/apiService.ts @@ -457,7 +457,7 @@ export class ApiService { } private async getGQLSchemaData(apiId: string): Promise> { - const result = await this.mapiClient.get>(`${apiId}/schemas`, [await this.mapiClient.getPortalHeader("getSchemas")]); + const result = await this.mapiClient.get>(`${apiId}/schemas?$expand=document`, [await this.mapiClient.getPortalHeader("getSchemas")]); return result; } diff --git a/src/services/graphqlService.ts b/src/services/graphqlService.ts new file mode 100644 index 00000000..13c1b9c3 --- /dev/null +++ b/src/services/graphqlService.ts @@ -0,0 +1,132 @@ +import * as _ from "lodash"; +import * as GraphQL from "graphql"; +import * as ko from "knockout"; +import { Router } from "@paperbits/common/routing"; +import { ApiService } from "./apiService"; +import { RouteHelper } from "../routing/routeHelper"; +import { GraphqlCustomFieldNames, GraphqlTypes, GraphqlTypesForDocumentation, TypeOfApi } from "../constants"; + +export type TGraphqlTypes = { + query: object, + mutation: object, + subscription: object, + objectType: object, + inputObjectType: object, + enumType: object, + scalarType: object, + unionType: object, + interfaceType: object +} + +export class GraphqlService { + constructor( + private readonly apiService: ApiService, + public readonly router: Router, + public readonly routeHelper: RouteHelper + ) {} + + public async getGraphqlTypes(apiName: string): Promise { + const api = await this.apiService.getApi(`apis/${apiName}`); + const graphqlTypes: TGraphqlTypes = { + query: {}, + mutation: {}, + subscription: {}, + objectType: {}, + inputObjectType: {}, + enumType: {}, + scalarType: {}, + unionType: {}, + interfaceType: {} + }; + + if (api?.type === TypeOfApi.graphQL) { + const graphQLSchema = await this.apiService.getGQLSchema(api.id); + if (!graphQLSchema) { + return; + } + const schema = GraphQL.buildSchema(graphQLSchema.graphQLSchema, { commentDescriptions: true }); + + graphqlTypes.query = schema.getQueryType()?.getFields(); + graphqlTypes.mutation = schema.getMutationType()?.getFields(); + graphqlTypes.subscription = schema.getSubscriptionType()?.getFields(); + + const typeMap = schema.getTypeMap(); + graphqlTypes.objectType = _.pickBy(typeMap, (t) => { + return (t instanceof GraphQL.GraphQLObjectType); + }); + graphqlTypes.inputObjectType = _.pickBy(typeMap, (t) => { + return (t instanceof GraphQL.GraphQLInputObjectType); + }); + graphqlTypes.enumType = _.pickBy(typeMap, (t) => { + return (t instanceof GraphQL.GraphQLEnumType); + }); + graphqlTypes.scalarType = _.pickBy(typeMap, (t) => { + return (t instanceof GraphQL.GraphQLScalarType); + }); + graphqlTypes.unionType = _.pickBy(typeMap, (t) => { + return (t instanceof GraphQL.GraphQLUnionType); + }); + graphqlTypes.interfaceType = _.pickBy(typeMap, (t) => { + return (t instanceof GraphQL.GraphQLInterfaceType); + }); + + _.forEach(graphqlTypes, (value, key) => { + const valueData = value; + this.addingNewFields(valueData, key); + if (key == GraphqlTypes.query || key == GraphqlTypes.subscription || key == GraphqlTypes.mutation) { + value = this.sortingAlphabetically(valueData); + } + graphqlTypes[key] = value; + }); + + return graphqlTypes; + } + } + + public async getAvailableGraphqlTypes(graphqlTypes: TGraphqlTypes): Promise { + const availableTypes = []; + + _.each(GraphqlTypesForDocumentation, (value, key) => { + if (_.size(graphqlTypes[key]) > 0 && (key == GraphqlTypes.query || key == GraphqlTypes.subscription || key == GraphqlTypes.mutation)) { + availableTypes.push(value); + } + }); + + return availableTypes; + } + + private sortingAlphabetically(collection: object): object { + return _(collection).toPairs().sortBy(0).fromPairs().value(); + } + + private addingNewFields(collection: object, type: string) { + _.forEach(collection, (value) => { + if (type == GraphqlTypes.query || type == GraphqlTypes.subscription || type == GraphqlTypes.mutation) { + value[GraphqlCustomFieldNames.selected] = ko.observable(false); + } + value[GraphqlCustomFieldNames.type] = ko.observable(type); + }); + } + + public indexCollectionFromType(type: GraphQL.GraphQLOutputType | GraphQL.GraphQLInputType): string { + while ((type instanceof GraphQL.GraphQLList) || (type instanceof GraphQL.GraphQLNonNull)) { + type = type.ofType; + } + if (type instanceof GraphQL.GraphQLObjectType) { + return "objectType"; + } + if (type instanceof GraphQL.GraphQLInputObjectType) { + return "inputObjectType"; + } + if (type instanceof GraphQL.GraphQLEnumType) { + return "enumType"; + } + if (type instanceof GraphQL.GraphQLScalarType) { + return "scalarType"; + } + if (type instanceof GraphQL.GraphQLUnionType) { + return "unionType"; + } + return "interfaceType"; + } +} \ No newline at end of file diff --git a/src/themes/website/styles/forms.scss b/src/themes/website/styles/forms.scss index 2b5f67f6..e67338cd 100644 --- a/src/themes/website/styles/forms.scss +++ b/src/themes/website/styles/forms.scss @@ -130,16 +130,16 @@ } } -input[type=search] { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - @extend .icon-svg-magnifier; - background-position: 5px center; - background-size: 1em; - background-repeat: no-repeat; - padding-left: calc(1em + 10px); -} +// input[type=search] { +// white-space: nowrap; +// overflow: hidden; +// text-overflow: ellipsis; +// @extend .icon-svg-magnifier; +// background-position: 5px center; +// background-size: 1em; +// background-repeat: no-repeat; +// padding-left: calc(1em + 10px); +// } .input-label { margin-bottom: 5px; diff --git a/src/themes/website/styles/widgets/fui/fluentui.scss b/src/themes/website/styles/widgets/fui/fluentui.scss new file mode 100644 index 00000000..e839553d --- /dev/null +++ b/src/themes/website/styles/widgets/fui/fluentui.scss @@ -0,0 +1,13 @@ +/** + Styles for React Fluent UI (fui) based common components +*/ + +// For consistency with designs and admin panel +.fui-search-icon { + color: #0078D4; + transform: scaleX(-1); +} + +.fui-MenuItem .fui-MenuItem__checkmark { + margin-top: 0; +} diff --git a/src/themes/website/styles/widgets/fui/operation-list.scss b/src/themes/website/styles/widgets/fui/operation-list.scss new file mode 100644 index 00000000..ca1dfb56 --- /dev/null +++ b/src/themes/website/styles/widgets/fui/operation-list.scss @@ -0,0 +1,101 @@ +fui-operation-list { + flex-basis: 100%; + + .operation-list-collapsible { + max-height: 100%; + overflow: hidden; + + &.is-collapsed { + max-height: 0; + } + } + + .collapse-operations-button { + &.is-collapsed span { + transform: rotate(180deg); + } + } + + .operation-list-title { + width: 100%; + } + + .operation-search-container { + margin: 1rem 0; + + .operation-search { + width: 100%; + } + + .operation-filter { + margin-left: .625rem; + } + } + + .operation { + padding: 6px; + margin-bottom: .5rem; + border-left: 5px solid transparent; + + &.is-selected-operation { + background-color: #EBEBEB; + border-left-color: #0F6CBD; + border-radius: 0 .25rem .25rem 0; + } + } + + .operation-accordion-panel { + margin-left: 0; + margin-right: 0; + } + + .operation-name { + width: 100%; + + &.nowrap { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + } + } + + .operation-method { + width: 75px; + color: #696969; + + &.method-GET { + color: #107C10; + } + + &.method-POST { + color: #0F6CBD; + } + + &.method-DELETE { + color: #C50F1F; + } + + &.method-PUT { + color: #8e562e; + } + } + + .show-more-operations { + margin: 4px 0 0 11px; + } + + .operation-type-dropdown { + width: 100%; + margin-top: 1rem; + } +} + +.fui-tags-popover { + .tags-search { + width: 100%; + } + + .tags-no-results { + padding: .375rem; + } +} \ No newline at end of file diff --git a/src/themes/website/styles/widgets/widgets.scss b/src/themes/website/styles/widgets/widgets.scss index 7ab8c2e9..bc89e1dd 100644 --- a/src/themes/website/styles/widgets/widgets.scss +++ b/src/themes/website/styles/widgets/widgets.scss @@ -9,4 +9,7 @@ @import "popups.scss"; @import "tables.scss"; @import "tabs.scss"; -@import "picture.scss"; \ No newline at end of file +@import "picture.scss"; + +@import "fui/fluentui.scss"; +@import "fui/operation-list.scss"; \ No newline at end of file From c6d71e3a6f5a572bd383888b3a099bf4f44c7812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1n=20Mach?= <92859870+JMach1@users.noreply.github.com> Date: Fri, 31 May 2024 13:50:08 +0200 Subject: [PATCH 02/29] Fixed Custom widgets CORS issue in Safari (#2498) [28254976] --- src/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/constants.ts b/src/constants.ts index 8654b4b5..3a582415 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -316,7 +316,7 @@ export const iframeAllows = "clipboard-read; clipboard-write; camera; microphone /** * List of allowed attributes for a sandboxed iframe. */ -export const iframeSandboxAllows = "allow-scripts allow-modals allow-forms allow-downloads allow-popups allow-popups-to-escape-sandbox allow-top-navigation allow-pointer-lock"; +export const iframeSandboxAllows = "allow-same-origin allow-scripts allow-modals allow-forms allow-popups allow-popups-to-escape-sandbox allow-top-navigation allow-pointer-lock"; /** * List of downloadable content types From e54f0c3568cb75c55c0d7e724e5d861853f18163 Mon Sep 17 00:00:00 2001 From: malincrist <92857141+malincrist@users.noreply.github.com> Date: Thu, 20 Jun 2024 13:15:50 +0200 Subject: [PATCH 03/29] Added pagination and filter support for subscriptions in the test console (#2516) * Added pagination and filter support for subscriptions in the test console * simplified if statement * added nullcheck --- .../ko/runtime/authorization.html | 53 ++++++++--- .../ko/runtime/authorization.ts | 87 ++++++++++++++++--- src/services/productService.ts | 20 ++++- 3 files changed, 137 insertions(+), 23 deletions(-) diff --git a/src/components/operations/operation-details/ko/runtime/authorization.html b/src/components/operations/operation-details/ko/runtime/authorization.html index ff002c80..9580d6f0 100644 --- a/src/components/operations/operation-details/ko/runtime/authorization.html +++ b/src/components/operations/operation-details/ko/runtime/authorization.html @@ -88,21 +88,52 @@
- - +
+ + +
+ - +
- - ); -} \ No newline at end of file diff --git a/src/components/operations/operation-list/react/runtime/OperationListGql.tsx b/src/components/operations/operation-list/react/runtime/OperationListGql.tsx deleted file mode 100644 index c2d998ee..00000000 --- a/src/components/operations/operation-list/react/runtime/OperationListGql.tsx +++ /dev/null @@ -1,151 +0,0 @@ -import * as React from "react"; -import { useEffect, useState } from "react"; -import { Router } from "@paperbits/common/routing"; -import { Stack } from "@fluentui/react"; -import { Body1, Body1Strong, Button, Dropdown, Option, SearchBox, Spinner } from "@fluentui/react-components"; -import { ChevronUpRegular, SearchRegular } from "@fluentui/react-icons"; -import { RouteHelper } from "../../../../../routing/routeHelper"; -import { OperationListRuntimeProps } from "./OperationListRuntime"; -import { GraphqlService, TGraphqlTypes } from "../../../../../services/graphqlService"; - -export const OperationListGql = ({ - apiName, - graphqlService, - routeHelper, - router, - allowSelection, - wrapText, - detailsPageUrl -}: OperationListRuntimeProps & { apiName: string, graphqlService: GraphqlService, routeHelper: RouteHelper, router: Router }) => { - const [working, setWorking] = useState(false); - const [isCollapsed, setIsCollapsed] = useState(false); - const [graphqlTypes, setGraphqlTypes] = useState(); - const [availableGraphqlTypes, setAvailableGraphqlTypes] = useState([]); - const [selectedGraphqlType, setSelectedGraphqlType] = useState(null); - const [selectedGraphqlTypeOperations, setSelectedGraphqlTypeOperations] = useState(); - const [filteredOperations, setFilteredOperations] = useState(); - const [selectedOperationName, setSelectedOperationName] = useState(); - - useEffect(() => { - if (!apiName) return; - - setWorking(true); - getGraphValues().then(loadedValues => { - setGraphqlTypes(loadedValues.graphqlTypes); - setAvailableGraphqlTypes(loadedValues.availableGraphqlTypes); - - const selectedType = loadedValues?.availableGraphqlTypes[0]; - if (selectedType) { - const operations = loadedValues.graphqlTypes[selectedType.toLowerCase()]; - setSelectedGraphqlType(selectedType); - setSelectedGraphqlTypeOperations(operations); - setFilteredOperations(operations); - Object.values(operations).length > 0 && setSelectedOperationName(Object.values(operations)[0]["name"]); - } - }).finally(() => setWorking(false)); - }, [apiName]); - - const getGraphValues = async (): Promise<{graphqlTypes: TGraphqlTypes, availableGraphqlTypes: string[]}> => { - let graphqlTypes: TGraphqlTypes; - let availableGraphqlTypes: string[]; - - try { - graphqlTypes = await graphqlService.getGraphqlTypes(apiName); - availableGraphqlTypes = await graphqlService.getAvailableGraphqlTypes(graphqlTypes); - } catch (error) { - throw new Error(`Unable to get GraphQL types. Error: ${error.message}`); - } - - return {graphqlTypes, availableGraphqlTypes}; - } - - const selectOperation = (operation): void => { - if (!operation) return; - - allowSelection && setSelectedOperationName(operation.name); - const operationUrl = routeHelper.getGraphReferenceUrl(apiName, selectedGraphqlType.toLowerCase(), operation.name, detailsPageUrl); - router.navigateTo(operationUrl); - } - - const filterOperations = (searchText?: string): void => { - if (!searchText) { - setFilteredOperations(selectedGraphqlTypeOperations); - } else { - const filteredOperations: {} = Object - .values(selectedGraphqlTypeOperations) - .filter(operation => operation["name"].toLowerCase().includes(searchText.toLowerCase())) - .reduce((obj: object, item: any) => { - return { - ...obj, - [item.name]: item - }; - }, {}); - setFilteredOperations(filteredOperations); - } - } - - const renderOperation = (operation): JSX.Element => ( - selectOperation(operation)} - > - {operation.name === selectedOperationName - ? - {operation.name} - - : - {operation.name} - - } - - ) - - return ( -
- - Operations -
- ); -} \ No newline at end of file diff --git a/src/components/operations/operation-list/react/runtime/OperationListRuntime.tsx b/src/components/operations/operation-list/react/runtime/OperationListRuntime.tsx deleted file mode 100644 index 61425312..00000000 --- a/src/components/operations/operation-list/react/runtime/OperationListRuntime.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import * as React from "react"; -import { Resolve } from "@paperbits/react/decorators"; -import { Router } from "@paperbits/common/routing"; -import { Body1, FluentProvider} from "@fluentui/react-components"; -import { TypeOfApi, fuiTheme } from "../../../../../constants"; -import { ApiService } from "../../../../../services/apiService"; -import { TagService } from "../../../../../services/tagService"; -import { GraphqlService } from "../../../../../services/graphqlService"; -import { GraphDocService } from "../../../operation-details/ko/runtime/graphql-documentation/graphql-doc-service"; -import { RouteHelper } from "../../../../../routing/routeHelper"; -import { OperationList } from "./OperationList"; -import { OperationListGql } from "./OperationListGql"; - -export interface OperationListRuntimeProps { - allowSelection?: boolean, - wrapText?: boolean, - showToggleUrlPath?: boolean, - defaultShowUrlPath?: boolean, - defaultGroupByTagToEnabled?: boolean, - defaultAllGroupTagsExpanded?: boolean, - detailsPageUrl: string -} - -interface OperationListRuntimeState { - apiName: string, - apiType: string, - operationName: string -} - -export class OperationListRuntime extends React.Component { - @Resolve("apiService") - public apiService: ApiService; - - @Resolve("tagService") - public tagService: TagService; - - @Resolve("graphqlService") - public graphqlService: GraphqlService; - - @Resolve("graphDocService") - public graphDocService: GraphDocService; - - @Resolve("routeHelper") - public routeHelper: RouteHelper; - - @Resolve("router") - public router: Router; - - constructor(props: OperationListRuntimeProps) { - super(props); - - this.state = { - apiName: null, - apiType: null, - operationName: null - } - } - - componentDidMount(): void { - this.getApi(); - this.router.addRouteChangeListener(() => this.getApi()); - } - - componentWillUnmount(): void { - this.router.removeRouteChangeListener(() => this.getApi()); - } - - getApi = async (): Promise => { - const apiName = this.routeHelper.getApiName(); - const operationName = this.routeHelper.getOperationName(); - let apiType: string; - - if (apiName && apiName !== this.state.apiName) { - const api = await this.apiService.getApi(`apis/${apiName}`); - apiType = api?.type; - - this.graphDocService.initialize(); // TODO: remove this when the whole GQL logic is moved to React - - this.setState({ apiName, operationName, apiType }); - } - } - - render() { - return ( - - {this.state.apiType === TypeOfApi.webSocket - ?
WebSocket APIs don't expose API operations.
- : this.state.apiType === TypeOfApi.graphQL - ? - : - } -
- ); - } -} \ No newline at end of file diff --git a/src/constants.ts b/src/constants.ts index 46b7fa07..447c604d 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,5 +1,4 @@ import { OVERRIDE_PORT_KEY } from "@azure/api-management-custom-widgets-scaffolder"; -import { Theme, webLightTheme } from "@fluentui/react-components"; /** * APIM service SKU names. @@ -340,14 +339,4 @@ export const overrideToastSessionKeyPrefix = "MS_APIM_CW_override_toast_dismisse * Styling constants */ export const mobileBreakpoint = 768; -export const smallMobileBreakpoint = 400; - -/** - * Customization of the Fluent UI Theme - */ -export const fuiTheme: Theme = { - ...webLightTheme, - fontFamilyBase: "inherit", - fontFamilyMonospace: "inherit", - fontFamilyNumeric: "inherit", -}; +export const smallMobileBreakpoint = 400; \ No newline at end of file diff --git a/src/services/graphqlService.ts b/src/services/graphqlService.ts deleted file mode 100644 index 13c1b9c3..00000000 --- a/src/services/graphqlService.ts +++ /dev/null @@ -1,132 +0,0 @@ -import * as _ from "lodash"; -import * as GraphQL from "graphql"; -import * as ko from "knockout"; -import { Router } from "@paperbits/common/routing"; -import { ApiService } from "./apiService"; -import { RouteHelper } from "../routing/routeHelper"; -import { GraphqlCustomFieldNames, GraphqlTypes, GraphqlTypesForDocumentation, TypeOfApi } from "../constants"; - -export type TGraphqlTypes = { - query: object, - mutation: object, - subscription: object, - objectType: object, - inputObjectType: object, - enumType: object, - scalarType: object, - unionType: object, - interfaceType: object -} - -export class GraphqlService { - constructor( - private readonly apiService: ApiService, - public readonly router: Router, - public readonly routeHelper: RouteHelper - ) {} - - public async getGraphqlTypes(apiName: string): Promise { - const api = await this.apiService.getApi(`apis/${apiName}`); - const graphqlTypes: TGraphqlTypes = { - query: {}, - mutation: {}, - subscription: {}, - objectType: {}, - inputObjectType: {}, - enumType: {}, - scalarType: {}, - unionType: {}, - interfaceType: {} - }; - - if (api?.type === TypeOfApi.graphQL) { - const graphQLSchema = await this.apiService.getGQLSchema(api.id); - if (!graphQLSchema) { - return; - } - const schema = GraphQL.buildSchema(graphQLSchema.graphQLSchema, { commentDescriptions: true }); - - graphqlTypes.query = schema.getQueryType()?.getFields(); - graphqlTypes.mutation = schema.getMutationType()?.getFields(); - graphqlTypes.subscription = schema.getSubscriptionType()?.getFields(); - - const typeMap = schema.getTypeMap(); - graphqlTypes.objectType = _.pickBy(typeMap, (t) => { - return (t instanceof GraphQL.GraphQLObjectType); - }); - graphqlTypes.inputObjectType = _.pickBy(typeMap, (t) => { - return (t instanceof GraphQL.GraphQLInputObjectType); - }); - graphqlTypes.enumType = _.pickBy(typeMap, (t) => { - return (t instanceof GraphQL.GraphQLEnumType); - }); - graphqlTypes.scalarType = _.pickBy(typeMap, (t) => { - return (t instanceof GraphQL.GraphQLScalarType); - }); - graphqlTypes.unionType = _.pickBy(typeMap, (t) => { - return (t instanceof GraphQL.GraphQLUnionType); - }); - graphqlTypes.interfaceType = _.pickBy(typeMap, (t) => { - return (t instanceof GraphQL.GraphQLInterfaceType); - }); - - _.forEach(graphqlTypes, (value, key) => { - const valueData = value; - this.addingNewFields(valueData, key); - if (key == GraphqlTypes.query || key == GraphqlTypes.subscription || key == GraphqlTypes.mutation) { - value = this.sortingAlphabetically(valueData); - } - graphqlTypes[key] = value; - }); - - return graphqlTypes; - } - } - - public async getAvailableGraphqlTypes(graphqlTypes: TGraphqlTypes): Promise { - const availableTypes = []; - - _.each(GraphqlTypesForDocumentation, (value, key) => { - if (_.size(graphqlTypes[key]) > 0 && (key == GraphqlTypes.query || key == GraphqlTypes.subscription || key == GraphqlTypes.mutation)) { - availableTypes.push(value); - } - }); - - return availableTypes; - } - - private sortingAlphabetically(collection: object): object { - return _(collection).toPairs().sortBy(0).fromPairs().value(); - } - - private addingNewFields(collection: object, type: string) { - _.forEach(collection, (value) => { - if (type == GraphqlTypes.query || type == GraphqlTypes.subscription || type == GraphqlTypes.mutation) { - value[GraphqlCustomFieldNames.selected] = ko.observable(false); - } - value[GraphqlCustomFieldNames.type] = ko.observable(type); - }); - } - - public indexCollectionFromType(type: GraphQL.GraphQLOutputType | GraphQL.GraphQLInputType): string { - while ((type instanceof GraphQL.GraphQLList) || (type instanceof GraphQL.GraphQLNonNull)) { - type = type.ofType; - } - if (type instanceof GraphQL.GraphQLObjectType) { - return "objectType"; - } - if (type instanceof GraphQL.GraphQLInputObjectType) { - return "inputObjectType"; - } - if (type instanceof GraphQL.GraphQLEnumType) { - return "enumType"; - } - if (type instanceof GraphQL.GraphQLScalarType) { - return "scalarType"; - } - if (type instanceof GraphQL.GraphQLUnionType) { - return "unionType"; - } - return "interfaceType"; - } -} \ No newline at end of file diff --git a/src/themes/website/styles/forms.scss b/src/themes/website/styles/forms.scss index e67338cd..2b5f67f6 100644 --- a/src/themes/website/styles/forms.scss +++ b/src/themes/website/styles/forms.scss @@ -130,16 +130,16 @@ } } -// input[type=search] { -// white-space: nowrap; -// overflow: hidden; -// text-overflow: ellipsis; -// @extend .icon-svg-magnifier; -// background-position: 5px center; -// background-size: 1em; -// background-repeat: no-repeat; -// padding-left: calc(1em + 10px); -// } +input[type=search] { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + @extend .icon-svg-magnifier; + background-position: 5px center; + background-size: 1em; + background-repeat: no-repeat; + padding-left: calc(1em + 10px); +} .input-label { margin-bottom: 5px; diff --git a/src/themes/website/styles/widgets/fui/fluentui.scss b/src/themes/website/styles/widgets/fui/fluentui.scss deleted file mode 100644 index e839553d..00000000 --- a/src/themes/website/styles/widgets/fui/fluentui.scss +++ /dev/null @@ -1,13 +0,0 @@ -/** - Styles for React Fluent UI (fui) based common components -*/ - -// For consistency with designs and admin panel -.fui-search-icon { - color: #0078D4; - transform: scaleX(-1); -} - -.fui-MenuItem .fui-MenuItem__checkmark { - margin-top: 0; -} diff --git a/src/themes/website/styles/widgets/fui/operation-list.scss b/src/themes/website/styles/widgets/fui/operation-list.scss deleted file mode 100644 index ca1dfb56..00000000 --- a/src/themes/website/styles/widgets/fui/operation-list.scss +++ /dev/null @@ -1,101 +0,0 @@ -fui-operation-list { - flex-basis: 100%; - - .operation-list-collapsible { - max-height: 100%; - overflow: hidden; - - &.is-collapsed { - max-height: 0; - } - } - - .collapse-operations-button { - &.is-collapsed span { - transform: rotate(180deg); - } - } - - .operation-list-title { - width: 100%; - } - - .operation-search-container { - margin: 1rem 0; - - .operation-search { - width: 100%; - } - - .operation-filter { - margin-left: .625rem; - } - } - - .operation { - padding: 6px; - margin-bottom: .5rem; - border-left: 5px solid transparent; - - &.is-selected-operation { - background-color: #EBEBEB; - border-left-color: #0F6CBD; - border-radius: 0 .25rem .25rem 0; - } - } - - .operation-accordion-panel { - margin-left: 0; - margin-right: 0; - } - - .operation-name { - width: 100%; - - &.nowrap { - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - } - } - - .operation-method { - width: 75px; - color: #696969; - - &.method-GET { - color: #107C10; - } - - &.method-POST { - color: #0F6CBD; - } - - &.method-DELETE { - color: #C50F1F; - } - - &.method-PUT { - color: #8e562e; - } - } - - .show-more-operations { - margin: 4px 0 0 11px; - } - - .operation-type-dropdown { - width: 100%; - margin-top: 1rem; - } -} - -.fui-tags-popover { - .tags-search { - width: 100%; - } - - .tags-no-results { - padding: .375rem; - } -} \ No newline at end of file diff --git a/src/themes/website/styles/widgets/widgets.scss b/src/themes/website/styles/widgets/widgets.scss index bc89e1dd..7ab8c2e9 100644 --- a/src/themes/website/styles/widgets/widgets.scss +++ b/src/themes/website/styles/widgets/widgets.scss @@ -9,7 +9,4 @@ @import "popups.scss"; @import "tables.scss"; @import "tabs.scss"; -@import "picture.scss"; - -@import "fui/fluentui.scss"; -@import "fui/operation-list.scss"; \ No newline at end of file +@import "picture.scss"; \ No newline at end of file From 01f945055a98786bb7eef0721447c48232de104e Mon Sep 17 00:00:00 2001 From: Annaji Sharma Ganti <42851022+annaji-msft@users.noreply.github.com> Date: Mon, 22 Jul 2024 12:54:12 -0700 Subject: [PATCH 08/29] Create config.yml (#2536) --- .github/ISSUE_TEMPLATE/config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..3ba13e0c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false From d468cb1467d341dc3bc1410071e369ccc19469a0 Mon Sep 17 00:00:00 2001 From: Annaji Sharma Ganti <42851022+annaji-msft@users.noreply.github.com> Date: Mon, 22 Jul 2024 13:45:42 -0700 Subject: [PATCH 09/29] Update README.md (#2641) --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c83eaa55..7829e235 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,15 @@ The `master` branch of this repository is used for daily development purposes an ## Interactions -You can **report bugs** or **submit feature requests** in [the repository's Issues section](https://github.com/Azure/api-management-developer-portal/issues). +### Managed developer portal, +> **report bugs** in Azure Support + Troubleshooting in Azure portal + +> **submit feature requests** [on the Azure Feedback Forum](https://aka.ms/apimwish). + +### Self-hosted developer portal, +> **report bugs** in [the repository's Issues section](https://github.com/Azure/api-management-developer-portal/issues) + +> **submit feature requests** under [Feature requests discussion section](https://github.com/Azure/api-management-developer-portal/discussions/categories/feature-request) Microsoft Azure Support assistance is limited to managed portals and only the initial setup of self-hosted portals ([documentation](https://aka.ms/apimdocs/selfhostportal)); best effort support is provided for problems that are caused by environmental factors, such as (but not limited to): hosting platform, development environment, network configuration. Other self-hosted portal assistance requests (for example, problem with custom widgets) should be submitted [on Stack Overflow](https://aka.ms/apimso) with the `azure-api-management` tag. **We don't provide support through GitHub Issues**. From 7c093711299b32e1872e05cc7a05255e3223352a Mon Sep 17 00:00:00 2001 From: Annaji Sharma Ganti <42851022+annaji-msft@users.noreply.github.com> Date: Tue, 23 Jul 2024 04:05:41 -0700 Subject: [PATCH 10/29] Update bug_report.md (#2647) --- .github/ISSUE_TEMPLATE/bug_report.md | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index a1c3fc52..1337976e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -7,14 +7,10 @@ assignees: '' --- -** PLEASE DO NOT CREATE ISSUES RELATED TO MANAGED DEVELOPER PORTAL IN THIS REPOSITORY. Issues related to "Managed developer portal" will be closed automatically. These issues should be created directly in Azure Support + Troubleshooting in Azure portal** - -**Every bug report should have precise description and reproduction steps; console traces or source code references are appreciated.** - -**For assistance requests, contact Azure support or submit a post [on Stack Overflow](http://aka.ms/apimso). We don't provide support through GitHub Issues. Feature requests can be raised [on the Azure Feedback Forum](https://aka.ms/apimwish).** - - - +> [!IMPORTANT] +> **PLEASE DO NOT CREATE ISSUES RELATED TO MANAGED DEVELOPER PORTAL IN THIS REPOSITORY**. Issues related to "Managed developer portal" will be closed automatically. Managed developer portal issues should be created directly in Azure Support + Troubleshooting in Azure portal. Contact Azure support (or) submit a post [on Stack Overflow](http://aka.ms/apimso). Feature requests can be raised [on the Azure Feedback Forum](https://aka.ms/apimwish). + +Every self-hosted developer bug report should have precise description and reproduction steps; console traces (or) source code references are appreciated. ## Bug description @@ -31,9 +27,11 @@ A clear and concise description of the bug. A clear and concise description of what you expected to happen. -## Is your portal managed or self-hosted? +## Is self-hosted portal? -Managed / Self-hosted +Yes / No +> [!WARNING] +> "Managed developer portal issues" will be closed automatically. See above for more details. ## Release tag or commit SHA (if using self-hosted version) From 22556f0428b1c71211009d823fcb874a7d88d17a Mon Sep 17 00:00:00 2001 From: Elena Shorohova <92329687+jsorohova@users.noreply.github.com> Date: Fri, 16 Aug 2024 19:35:44 +0300 Subject: [PATCH 11/29] What's new modal refactoring (#2657) * Whats new modal refactoring * Fixed a11y issue for slides headings --- src/admin/onboardingModal.tsx | 92 +++++++++++++++++------------------ 1 file changed, 44 insertions(+), 48 deletions(-) diff --git a/src/admin/onboardingModal.tsx b/src/admin/onboardingModal.tsx index b53f2ce2..a54aa74f 100644 --- a/src/admin/onboardingModal.tsx +++ b/src/admin/onboardingModal.tsx @@ -10,6 +10,34 @@ interface OnboardingModalProps { onDismiss: () => void } +const modalSlides = [ + { + imagePath: '/assets/images/onboarding-1.png', + header: 'Introducing the improved developer portal and API and product details pages!', + body: We redesigned the developer portal layout to help maximize your productivity. We also added a new API details page and product details page widget so that you can display custom documentation. + }, + { + imagePath: '/assets/images/onboarding-2.png', + header: 'A new look and greater efficiency', + body: <>The developer portal editor has a new layout that emphasizes site management. We reorganized the core elements that you interact with most, but all your favorite features are still here: +
    +
  • Menu: Easily locate the features you need to manage and customize your site.
  • +
  • Toolbar menu: Quickly save and publish changes or switch between editing options.
  • +
  • Content area: Edit content in a more focused workspace.
  • +
+ }, + { + imagePath: '/assets/images/onboarding-4.png', + header: 'Access information and customer support', + body: <>We grouped helpful resources to support your site management needs. Access them through the Help and resources section of the menu: +
    +
  • Documentation and tutorials: Access our library of documentation to gain a deeper understanding of our features and functionality.
  • +
  • Feedback: Share your experience or report a bug in our GitHub repository.
  • +
  • Support: Request assistance through your API Management service.
  • +
+ } +]; + export class OnboardingModal extends React.Component { constructor(props: OnboardingModalProps) { super(props); @@ -29,8 +57,8 @@ export class OnboardingModal extends React.Component ( props.currentSlide === 3 ? this.props.onDismiss() : props.nextSlide()} + text={props.currentSlide === modalSlides.length - 1 ? 'Close' : 'Next' } + onClick={() => props.currentSlide === modalSlides.length - 1 ? this.props.onDismiss() : props.nextSlide()} /> ) @@ -53,52 +81,20 @@ export class OnboardingModal extends React.Component this.renderPrevButton(props)} renderCenterRightControls={(props: ControlProps) => this.renderNextButton(props)} > -
- Introducing the improved developer portal and API and product details pages! - - Introducing the improved developer portal and API and product details pages! - We redesigned the developer portal layout to help maximize your productivity. We also added a new API details page and product details page widget so that you can display custom documentation. - -
-
- A new look and greater efficiency - - A new look and greater efficiency - The developer portal editor has a new layout that emphasizes site management. We reorganized the core elements that you interact with most, but all your favorite features are still here: -
    -
  • Menu: Easily locate the features you need to manage and customize your site.
  • -
  • Toolbar menu: Quickly save and publish changes or switch between editing options.
  • -
  • Content area: Edit content in a more focused workspace.
  • -
-
-
-
- Access information and customer support - - Access information and customer support - We grouped helpful resources to support your site management needs. Access them through the Help and resources section of the menu: -
    -
  • Documentation and tutorials: Access our library of documentation to gain a deeper understanding of our features and functionality.
  • -
  • Feedback: Share your experience or report a bug in our GitHub repository.
  • -
  • Support: Request assistance through your API Management service.
  • -
-
-
+ {modalSlides.map(slide => ( +
+ {slide.header} + + {slide.header} + {slide.body} + +
+ ))} From 4510713ef52abc31bfd9f0ad57fe29abd1a8c191 Mon Sep 17 00:00:00 2001 From: Elena Shorohova <92329687+jsorohova@users.noreply.github.com> Date: Fri, 16 Aug 2024 20:01:57 +0300 Subject: [PATCH 12/29] Role and screen size dropdowns accessibility fix (#2659) --- src/admin/rightPanel.tsx | 56 ++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/src/admin/rightPanel.tsx b/src/admin/rightPanel.tsx index 81b0efbf..fa49e844 100644 --- a/src/admin/rightPanel.tsx +++ b/src/admin/rightPanel.tsx @@ -10,7 +10,7 @@ import { Router } from '@paperbits/common/routing'; import { Resolve } from '@paperbits/react/decorators'; import { ContentWorkshop } from '../components/content'; import { initializeIcons } from '@fluentui/font-icons-mdl2'; -import { CommandBarButton, DefaultButton, Dropdown, Icon, IconButton, IDropdownOption, IIconProps, PrimaryButton, Stack, Text, ThemeProvider } from '@fluentui/react'; +import { CommandBarButton, DefaultButton, Dropdown, Icon, IconButton, IDropdownOption, IIconProps, PrimaryButton, Stack, Text, ThemeProvider, TooltipHost } from '@fluentui/react'; import { lightTheme, darkTheme } from './utils/themes'; import { mobileBreakpoint, smallMobileBreakpoint } from '../constants'; initializeIcons(); @@ -234,27 +234,39 @@ export class RightPanel extends React.Component<{}, RightPanelState> { renderDropdowns = (): JSX.Element => ( - this.viewManager.setViewRoles([this.state.roles.find(role => role.key === option.key)])} - styles={dropdownStyles} - className="top-panel-dropdown" - dropdownWidth={170} - /> - this.viewManager.setViewport(option.key.toString())} - styles={dropdownStyles} - className="top-panel-dropdown" - dropdownWidth={170} - /> + + this.viewManager.setViewRoles([this.state.roles.find(role => role.key === option.key)])} + styles={dropdownStyles} + className="top-panel-dropdown" + dropdownWidth={170} + /> + + + this.viewManager.setViewport(option.key.toString())} + styles={dropdownStyles} + className="top-panel-dropdown" + dropdownWidth={170} + /> + ) From 1d87b9f9a18d872f7d34442098a200fa3521563d Mon Sep 17 00:00:00 2001 From: Elena Shorohova <92329687+jsorohova@users.noreply.github.com> Date: Mon, 19 Aug 2024 17:29:47 +0300 Subject: [PATCH 13/29] Made several left nav items keyboard accessible (#2660) --- src/admin/custom-widgets/customWidgets.tsx | 12 ++++++++-- src/admin/pages/pages.tsx | 28 +++++++++++++++++----- src/admin/popups/popups.tsx | 12 ++++++++-- src/admin/urls/urls.tsx | 12 ++++++++-- src/themes/designer/styles/admin.scss | 4 ++++ 5 files changed, 56 insertions(+), 12 deletions(-) diff --git a/src/admin/custom-widgets/customWidgets.tsx b/src/admin/custom-widgets/customWidgets.tsx index 4e0c2a81..88c38fbc 100644 --- a/src/admin/custom-widgets/customWidgets.tsx +++ b/src/admin/custom-widgets/customWidgets.tsx @@ -81,10 +81,18 @@ export class CustomWidgets extends React.Component { + this.setState({ showCustomWidgetModal: true, selectedCustomWidget: customWidget }); event.stopPropagation(); - this.setState({ showCustomWidgetModal: true, selectedCustomWidget: customWidget })} - } + }} + // Required for accessibility + onKeyDown={(event) => { + if (event.key === 'Enter') { + this.setState({ showCustomWidgetModal: true, selectedCustomWidget: customWidget }); + event.preventDefault(); + } + }} /> ) diff --git a/src/admin/pages/pages.tsx b/src/admin/pages/pages.tsx index 361832fa..372550eb 100644 --- a/src/admin/pages/pages.tsx +++ b/src/admin/pages/pages.tsx @@ -105,7 +105,6 @@ export class Pages extends React.Component { horizontalAlign="space-between" verticalAlign="center" className="nav-item-outer-stack" - onClick={async () => await this.router.navigateTo(page.permalink)} > {page.title} { title="Edit" style={iconStyles} className="nav-item-inner" + tabIndex={0} onClick={(event) => { + this.setState({ showPagesModal: true, selectedPage: page }); event.stopPropagation(); - this.setState({ showPagesModal: true, selectedPage: page })} - } + }} + // Required for accessibility + onKeyDown={(event) => { + if (event.key === 'Enter') { + this.setState({ showPagesModal: true, selectedPage: page }); + event.preventDefault(); + } + }} /> ) @@ -127,7 +134,6 @@ export class Pages extends React.Component { horizontalAlign="space-between" verticalAlign="center" className="nav-item-outer-stack" - onClick={async () => this.viewManager.setHost({ name: 'layout-host', params: { layoutKey: layout.key } })} > {layout.title} { title="Edit" style={iconStyles} className="nav-item-inner" + tabIndex={0} onClick={(event) => { + this.setState({ showLayoutModal: true, selectedLayout: layout }); event.stopPropagation(); - this.setState({ showLayoutModal: true, selectedLayout: layout })} - } + }} + // Required for accessibility + onKeyDown={(event) => { + if (event.key === 'Enter') { + this.setState({ showLayoutModal: true, selectedLayout: layout }); + event.preventDefault(); + } + }} /> ) @@ -188,6 +202,7 @@ export class Pages extends React.Component { key={page.key} className="nav-item-list-button" onRenderText={() => this.renderPageContent(page)} + onClick={async () => await this.router.navigateTo(page.permalink)} /> )} @@ -218,6 +233,7 @@ export class Pages extends React.Component { key={layout.key} className="nav-item-list-button" onRenderText={() => this.renderPageLayoutContent(layout)} + onClick={async () => this.viewManager.setHost({ name: 'layout-host', params: { layoutKey: layout.key } })} /> )} diff --git a/src/admin/popups/popups.tsx b/src/admin/popups/popups.tsx index 35eaf15c..90e54730 100644 --- a/src/admin/popups/popups.tsx +++ b/src/admin/popups/popups.tsx @@ -77,10 +77,18 @@ export class Popups extends React.Component { title="Edit" style={iconStyles} className="nav-item-inner" + tabIndex={0} onClick={(event) => { + this.setState({ showPopupDetailsModal: true, selectedPopup: popup }); event.stopPropagation(); - this.setState({ showPopupDetailsModal: true, selectedPopup: popup })} - } + }} + // Required for accessibility + onKeyDown={(event) => { + if (event.key === 'Enter') { + this.setState({ showPopupDetailsModal: true, selectedPopup: popup }); + event.preventDefault(); + } + }} /> ) diff --git a/src/admin/urls/urls.tsx b/src/admin/urls/urls.tsx index f1de345e..35f299ee 100644 --- a/src/admin/urls/urls.tsx +++ b/src/admin/urls/urls.tsx @@ -77,10 +77,18 @@ export class Urls extends React.Component { title="Edit" style={iconStyles} className="nav-item-inner" + tabIndex={0} onClick={(event) => { + this.setState({ showUrlDetailsModal: true, selectedUrl: url }); event.stopPropagation(); - this.setState({ showUrlDetailsModal: true, selectedUrl: url })} - } + }} + // Required for accessibility + onKeyDown={(event) => { + if (event.key === 'Enter') { + this.setState({ showUrlDetailsModal: true, selectedUrl: url }); + event.preventDefault(); + } + }} /> ) diff --git a/src/themes/designer/styles/admin.scss b/src/themes/designer/styles/admin.scss index ae90496c..9db5370a 100644 --- a/src/themes/designer/styles/admin.scss +++ b/src/themes/designer/styles/admin.scss @@ -95,6 +95,10 @@ .nav-item-inner { opacity: 0; + + &:focus { + opacity: 1; + } } &:hover { From 8e44ec0c63d60f0f9100f5b093765728b5ec5b8c Mon Sep 17 00:00:00 2001 From: Elena Shorohova <92329687+jsorohova@users.noreply.github.com> Date: Wed, 21 Aug 2024 17:44:02 +0300 Subject: [PATCH 14/29] Multiple fixes for Site menu item modal (#2661) --- src/admin/navigation/navigationItemModal.tsx | 25 +++++++++++++------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/admin/navigation/navigationItemModal.tsx b/src/admin/navigation/navigationItemModal.tsx index b0fb9c06..5562681e 100644 --- a/src/admin/navigation/navigationItemModal.tsx +++ b/src/admin/navigation/navigationItemModal.tsx @@ -293,6 +293,8 @@ export class NavigationItemModal extends React.Component { navItems.forEach(navItem => { + if (navItem.key === this.props.navItem?.key) return; + const newNodeText = currentNodeLabel ? currentNodeLabel + '/' + navItem.label : navItem.label; dropdownItems.push({ @@ -436,8 +438,9 @@ export class NavigationItemModal extends React.Component { - let errors = this.state.errors; - if (option.key.toString() !== LinkOptionKey.Anchor) errors = this.removeError(LinkOptionKey.Anchor); - this.setState({ selectedLinkOption: option.key.toString(), targetWindow: option.key === LinkOptionKey.Media ? LinkActionOptionKey.Download : LinkActionOptionKey.Self, - errors + errors: {} }); if (option.key.toString() === LinkOptionKey.Anchor && this.state.selectedPage !== '') { this.processAnchorsForDropdown(this.state.selectedPage); @@ -624,7 +624,16 @@ export class NavigationItemModal extends React.Component this.setState({ selectedUrlType: option.key })} + onChange={(event, option) => { + let errors = this.state.errors; + if (option.key.toString() === LinkOptionKey.SavedUrl) { + errors = this.removeError(LinkOptionKey.NewUrl); + } else { + errors = this.removeError(LinkOptionKey.SavedUrl); + } + + this.setState({ selectedUrlType: option.key, errors }); + }} styles={{ root: { paddingBottom: 15 } }} /> } @@ -686,7 +695,7 @@ export class NavigationItemModal extends React.Component this.onInputChange('parent', option.key.toString())} styles={{ root: { paddingBottom: 15 } }} /> From 990a348e8bb18c75c2a39de0d1f5a7662ec87655 Mon Sep 17 00:00:00 2001 From: Igor O Date: Thu, 22 Aug 2024 07:45:57 -0700 Subject: [PATCH 15/29] Removed paging from test console subscriptions dropdown (#2664) Limit dropdown with 50 subscriptions (100 keys) Improved subscriptions secrets load --- .../ko/runtime/authorization.html | 6 +- .../ko/runtime/authorization.ts | 47 ++++--- src/services/productService.ts | 125 ++++++++++++++---- src/themes/website/styles/navs.scss | 2 + 4 files changed, 133 insertions(+), 47 deletions(-) diff --git a/src/components/operations/operation-details/ko/runtime/authorization.html b/src/components/operations/operation-details/ko/runtime/authorization.html index 9580d6f0..834bfc16 100644 --- a/src/components/operations/operation-details/ko/runtime/authorization.html +++ b/src/components/operations/operation-details/ko/runtime/authorization.html @@ -39,6 +39,7 @@
@@ -120,11 +121,6 @@ - - - - diff --git a/src/components/operations/operation-details/ko/runtime/authorization.ts b/src/components/operations/operation-details/ko/runtime/authorization.ts index 21fdb107..9fc47a7a 100644 --- a/src/components/operations/operation-details/ko/runtime/authorization.ts +++ b/src/components/operations/operation-details/ko/runtime/authorization.ts @@ -28,8 +28,6 @@ interface SubscriptionOption { value: string; } -const maxSubscriptionsPageNumber = 5; - @Component({ selector: "authorization", template: template, @@ -50,8 +48,6 @@ export class Authorization { public readonly selectedAuthorizationServer: ko.Observable; public readonly subscriptionsPattern: ko.Observable; public readonly subscriptionSelection: ko.Computed; - public readonly subscriptionsPageNumber: ko.Observable; - public readonly nextSubscriptionsPage: ko.Observable; public readonly isSubscriptionListEmptyDueToFilter: ko.Observable; public readonly subscriptionsLoading = ko.observable(false); @@ -79,14 +75,13 @@ export class Authorization { this.authorizationServers = ko.observable(); this.selectedAuthorizationServer = ko.observable(); this.subscriptionsPattern = ko.observable(); - this.subscriptionsPageNumber = ko.observable(1); - this.nextSubscriptionsPage = ko.observable(); this.isSubscriptionListEmptyDueToFilter = ko.observable(false); this.subscriptionsLoading = ko.observable(true); this.subscriptionSelection = ko.computed(() => { return this.selectedSubscriptionKey() ? this.selectedSubscriptionKey().name : "Select a subscription"; }); } + @Param() public authorizationServers: ko.Observable; @@ -131,11 +126,9 @@ export class Authorization { this.subscriptionsPattern .extend({ rateLimit: { timeout: Constants.defaultInputDelayMs, method: "notifyWhenChangesStop" } }) .subscribe(this.resetSubscriptionsSearch); - this.subscriptionsPageNumber.subscribe(() => this.loadSubscriptionKeys()); } public async resetSubscriptionsSearch(): Promise { - this.subscriptionsPageNumber(1); this.loadSubscriptionKeys(); } @@ -177,6 +170,9 @@ export class Authorization { const oauthSession = await this.sessionManager.getItem(oauthSessionKey); const recordKey = this.getSessionRecordKey(serverName, scopeOverride); const storedCredentials = oauthSession?.[recordKey]; + if (!storedCredentials) { + return null; + } try { /* Trying to check if it's a JWT token and, if yes, whether it got expired. */ @@ -413,30 +409,26 @@ export class Authorization { return; } - const pageNumber = this.subscriptionsPageNumber() - 1; const subscriptionsQuery: SearchQuery = { - pattern: this.subscriptionsPattern(), - skip: pageNumber * maxSubscriptionsPageNumber, - take: maxSubscriptionsPageNumber + pattern: this.subscriptionsPattern() }; const pageOfProducts = await this.apiService.getAllApiProducts(this.api().id); const products = pageOfProducts && pageOfProducts.value ? pageOfProducts.value : []; - const pageOfSubscriptions = await this.productService.getSubscriptions(userId, null, subscriptionsQuery); - const subscriptions = pageOfSubscriptions.value.filter(subscription => subscription.state === SubscriptionState.active); + const allSubscriptions = await this.productService.getProductsAllSubscriptions(this.api().name, products, userId, subscriptionsQuery); + const subscriptions = allSubscriptions.filter(subscription => subscription.state === SubscriptionState.active); const availableProducts = []; - this.nextSubscriptionsPage(!!pageOfSubscriptions.nextLink); - + const productsSubscriptions = allSubscriptions.filter(subscription => !this.productService.isProductScope(subscription.scope, this.api().name)); products.forEach(product => { const keys: SubscriptionOption[] = []; - if (subscriptions.length === 0) { + if (productsSubscriptions.length === 0) { return; } - subscriptions.forEach(subscription => { - if (!this.productService.isScopeSuitable(subscription.scope, this.api().name, product.name)) { + productsSubscriptions.forEach(subscription => { + if (!this.productService.isProductScope(subscription.scope, product.name)) { return; } @@ -456,6 +448,23 @@ export class Authorization { } }); + const apiSubscriptions = allSubscriptions.filter(subscription => this.productService.isProductScope(subscription.scope, this.api().name)); + apiSubscriptions.forEach(subscription => { + const apiKeys: SubscriptionOption[] = []; + apiKeys.push({ + name: `Primary: ${subscription.name?.trim() || subscription.primaryKey.substr(0, 4)}`, + value: subscription.primaryKey + }); + + apiKeys.push({ + name: `Secondary: ${subscription.name?.trim() || subscription.secondaryKey.substr(0, 4)}`, + value: subscription.secondaryKey + }); + if(apiKeys.length > 0) { + availableProducts.push({ name: "Apis", subscriptionKeys: apiKeys }); + } + }); + this.isSubscriptionListEmptyDueToFilter(availableProducts.length == 0 && this.subscriptionsPattern() !== undefined); this.products(availableProducts); this.subscriptionsLoading(false); diff --git a/src/services/productService.ts b/src/services/productService.ts index ed4d36c6..a244550d 100644 --- a/src/services/productService.ts +++ b/src/services/productService.ts @@ -52,25 +52,7 @@ export class ProductService { try { const pageContract = await this.mapiClient.get>(`${userId}/subscriptions${query}`, [await this.mapiClient.getPortalHeader("getSubscriptions")]); - const promises: Promise[] = []; - const subscriptions: Subscription[] = []; - - for (const subscriptionContract of pageContract.value) { - const subscription = new Subscription(subscriptionContract); - - const secretPromise = this.mapiClient - .post(`${userId}/subscriptions/${subscriptionContract.name}/listSecrets`, [await this.mapiClient.getPortalHeader("getSubscriptionSecrets")]) - .then(secrets => { - subscription.primaryKey = secrets.primaryKey; - subscription.secondaryKey = secrets.secondaryKey; - }); - - promises.push(secretPromise); - - subscriptions.push(subscription); - } - - await Promise.all(promises); + const subscriptions = await this.getSubscriptionsData(pageContract.value, userId); pageOfSubscriptions.value = subscriptions; pageOfSubscriptions.count = pageContract.count; @@ -87,6 +69,82 @@ export class ProductService { } } + /** + * Returns all user products subscriptions for a query. + * @param apiName {string} Api name to check scope in subscriptions. + * @param products {Product[]} Products to check scope in subscriptions. + * @param userId {string} User unique identifier. + * @param searchRequest {SearchQuery} filter. + */ + public async getProductsAllSubscriptions(apiName: string, products: Product[], userId: string, searchRequest?: SearchQuery): Promise { + if (!userId) { + throw new Error(`Parameter "userId" not specified.`); + } + + const odataFilterEntries = []; + + if (searchRequest?.pattern) { + const pattern = Utils.encodeURICustomized(searchRequest.pattern, Constants.reservedCharTuplesForOData); + odataFilterEntries.push(`(contains(properties/displayName,'${pattern}'))`); + } + + let query = "?$top=100&$skip=0"; + + if (odataFilterEntries.length > 0) { + query = Utils.addQueryParameter(query, `$filter=` + odataFilterEntries.join(" and ")); + } + + try { + const allContracts = await this.mapiClient.getAll(`${userId}/subscriptions${query}`, [await this.mapiClient.getPortalHeader("getSubscriptions")]); + return await this.getSubscriptionsData(allContracts, userId, products, apiName); + } + catch (error) { + if (error?.code === "ResourceNotFound") { + return []; + } + + throw new Error(`Unable to retrieve subscriptions for user with ID "${userId}". Error: ${error.message}`); + } + } + + private async getSubscriptionsData(allContracts: SubscriptionContract[], userId: string, products: Product[] = undefined, apiName: string = undefined): Promise { + const promises: Promise[] = []; + const subscriptions: Subscription[] = []; + + for (const subscriptionContract of allContracts) { + // stop if we have enough subscriptions + if( subscriptions.length >= Constants.defaultPageSize) { + break; + } + + // skip not active subscriptions + if (SubscriptionState[subscriptionContract.properties.state] !== SubscriptionState.active) { + continue; + } + + if ((products?.length > 0 || apiName) && !this.isScopeValid(subscriptionContract.properties.scope, apiName, products)) { + continue; + } + + const subscription = new Subscription(subscriptionContract); + + const secretPromise = this.mapiClient + .post(`${userId}/subscriptions/${subscriptionContract.name}/listSecrets`, [await this.mapiClient.getPortalHeader("getSubscriptionSecrets")]) + .then(secrets => { + subscription.primaryKey = secrets.primaryKey; + subscription.secondaryKey = secrets.secondaryKey; + }); + + promises.push(secretPromise); + + subscriptions.push(subscription); + } + + await Promise.all(promises); + + return subscriptions; + } + /** * Returns user subscriptions for specified product. * @param userId {string} User unique identifier. @@ -387,18 +445,39 @@ export class ProductService { } /** - * Determines if specified subscription scope is suitable in context of an API or a Product. + * Determines if specified subscription scope is suitable in context of a Product. * @param scope {string} Subscription scope. - * @param apiName {string} ARM name of the API. * @param productName {string} ARM name of the Product. */ - public isScopeSuitable(scope: string, apiName: string = null, productName: string = null): boolean { + public isProductScope(scope: string, productName: string): boolean { + if (!scope) { + throw new Error(`Parameter "scope" not specified.`); + } + + return scope.endsWith("/apis") + || (productName && scope.endsWith(`/products/${productName}`)); + } + + /** + * Determines if specified subscription scope is suitable in context of an API. + * @param scope {string} Subscription scope. + * @param apiName {string} ARM name of the API. + */ + public isApiScope(scope: string, apiName: string): boolean { + if (!scope) { + throw new Error(`Parameter "scope" not specified.`); + } + + return apiName && scope.endsWith(`/apis/${apiName}`); + } + + private isScopeValid(scope: string, apiName: string = undefined, products: Product[] = undefined): boolean { if (!scope) { throw new Error(`Parameter "scope" not specified.`); } return scope.endsWith("/apis") || (apiName && scope.endsWith(`/apis/${apiName}`)) - || (productName && scope.endsWith(`/products/${productName}`)); + || (products && products.some(product => scope.endsWith(`/products/${product.name}`))); } } \ No newline at end of file diff --git a/src/themes/website/styles/navs.scss b/src/themes/website/styles/navs.scss index 68e8d7d5..234dd2bf 100644 --- a/src/themes/website/styles/navs.scss +++ b/src/themes/website/styles/navs.scss @@ -29,6 +29,8 @@ &.show { display: block; + max-height: 500px; + overflow-x: auto; } } From d22c4270273738fb2b13a3721781069f8885fa3b Mon Sep 17 00:00:00 2001 From: Elena Shorohova <92329687+jsorohova@users.noreply.github.com> Date: Thu, 22 Aug 2024 17:47:59 +0300 Subject: [PATCH 16/29] Developer portal version bump to 2.30 (#2662) --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index acef20dd..bbda0195 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "apim-developer-portal", - "version": "2.29.0", + "version": "2.30.0", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index c034c9ca..f538663a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "apim-developer-portal", - "version": "2.29.0", + "version": "2.30.0", "description": "API management developer portal", "author": "Microsoft", "license": "MIT", From a8b70bff8864bd1d76a28ae471404513ea934d6b Mon Sep 17 00:00:00 2001 From: Igor O Date: Wed, 28 Aug 2024 04:27:39 -0700 Subject: [PATCH 17/29] Fixed grouping apis subscriptions in test console selector (#2665) --- .../operation-details/ko/runtime/authorization.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/operations/operation-details/ko/runtime/authorization.ts b/src/components/operations/operation-details/ko/runtime/authorization.ts index 9fc47a7a..68918eb3 100644 --- a/src/components/operations/operation-details/ko/runtime/authorization.ts +++ b/src/components/operations/operation-details/ko/runtime/authorization.ts @@ -449,8 +449,8 @@ export class Authorization { }); const apiSubscriptions = allSubscriptions.filter(subscription => this.productService.isProductScope(subscription.scope, this.api().name)); + const apiKeys: SubscriptionOption[] = []; apiSubscriptions.forEach(subscription => { - const apiKeys: SubscriptionOption[] = []; apiKeys.push({ name: `Primary: ${subscription.name?.trim() || subscription.primaryKey.substr(0, 4)}`, value: subscription.primaryKey @@ -460,10 +460,10 @@ export class Authorization { name: `Secondary: ${subscription.name?.trim() || subscription.secondaryKey.substr(0, 4)}`, value: subscription.secondaryKey }); - if(apiKeys.length > 0) { - availableProducts.push({ name: "Apis", subscriptionKeys: apiKeys }); - } }); + if(apiKeys.length > 0) { + availableProducts.push({ name: "Apis", subscriptionKeys: apiKeys }); + } this.isSubscriptionListEmptyDueToFilter(availableProducts.length == 0 && this.subscriptionsPattern() !== undefined); this.products(availableProducts); From dfe3d6c3822dff23859644a4336069dbd0adcc69 Mon Sep 17 00:00:00 2001 From: Elena Shorohova <92329687+jsorohova@users.noreply.github.com> Date: Wed, 28 Aug 2024 18:19:02 +0300 Subject: [PATCH 18/29] Error processing and search fixes in Admin UI (#2666) * Error processing and search fixes in Admin UI * Fixed permalink validation in the page admin modal --- package-lock.json | 2 +- src/admin/media/mediaModal.tsx | 9 ++------- src/admin/media/mediaSelectionItemModal.tsx | 15 ++++++--------- src/admin/navigation/navigationItemModal.tsx | 6 +++++- src/admin/pages/pageDetailsModal.tsx | 4 ++-- src/admin/pages/pages.tsx | 15 +++------------ src/admin/popups/popups.tsx | 9 ++------- src/admin/urls/urls.tsx | 9 ++------- src/admin/utils/helpers.ts | 11 +++++++++++ 9 files changed, 34 insertions(+), 46 deletions(-) diff --git a/package-lock.json b/package-lock.json index bbda0195..218d5f84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "apim-developer-portal", - "version": "2.29.0", + "version": "2.30.0", "license": "MIT", "dependencies": { "@azure/api-management-custom-widgets-scaffolder": "^1.0.0-beta.4", diff --git a/src/admin/media/mediaModal.tsx b/src/admin/media/mediaModal.tsx index f7b5a010..00ef1e3a 100644 --- a/src/admin/media/mediaModal.tsx +++ b/src/admin/media/mediaModal.tsx @@ -6,11 +6,10 @@ import { EventManager } from '@paperbits/common/events'; import { ViewManager } from '@paperbits/common/ui'; import { IMediaService } from '@paperbits/common/media'; import { MediaContract } from '@paperbits/common/media/mediaContract'; -import { Query, Operator } from '@paperbits/common/persistence'; import { MimeTypes } from '@paperbits/common'; import { Checkbox, DefaultButton, IconButton, IIconProps, Image, ImageFit, IOverflowSetItemProps, Link, Modal, OverflowSet, SearchBox, Spinner, Stack, Text, TextField } from '@fluentui/react'; import { DeleteConfirmationOverlay } from '../utils/components/deleteConfirmationOverlay'; -import { getAllValues, getThumbnailUrl } from '../utils/helpers'; +import { createSearchQuery, getAllValues, getThumbnailUrl } from '../utils/helpers'; import { ImageDetailsModal } from './imageDetailsModal'; import { NonImageDetailsModal } from './nonImageDetailsModal'; @@ -69,11 +68,7 @@ export class MediaModal extends React.Component => { this.setState({ isLoading: true }); - const query = Query.from().orderBy('fileName'); - if (searchPattern) { - query.where('fileName', Operator.contains, searchPattern); - } - + const query = createSearchQuery(searchPattern, 'fileName'); const mediaSearchResult = await this.mediaService.search(query); const allMedia = await getAllValues(mediaSearchResult, mediaSearchResult.value); this.setState({ media: allMedia, isLoading: false }); diff --git a/src/admin/media/mediaSelectionItemModal.tsx b/src/admin/media/mediaSelectionItemModal.tsx index 321cad8f..ebc66be7 100644 --- a/src/admin/media/mediaSelectionItemModal.tsx +++ b/src/admin/media/mediaSelectionItemModal.tsx @@ -6,9 +6,8 @@ import { EventManager } from '@paperbits/common/events'; import { ViewManager } from '@paperbits/common/ui'; import { IMediaService } from '@paperbits/common/media'; import { MediaContract } from '@paperbits/common/media/mediaContract'; -import { Query, Operator } from '@paperbits/common/persistence'; import { DefaultButton, IIconProps, Image, ImageFit, IOverflowSetItemProps, Link, Modal, SearchBox, Stack, Text } from '@fluentui/react'; -import { getAllValues } from '../utils/helpers'; +import { createSearchQuery, getAllValues } from '../utils/helpers'; import { NonImageDetailsModal } from './nonImageDetailsModal'; interface MediaSelectionItemModalState { @@ -50,11 +49,7 @@ export class MediaSelectionItemModal extends React.Component => { - const query = Query.from().orderBy('fileName'); - if (searchPattern) { - query.where('fileName', Operator.contains, searchPattern); - } - + const query = createSearchQuery(searchPattern, 'fileName'); const mediaSearchResult = await this.mediaService.search(query); const allMedia = await getAllValues(mediaSearchResult, mediaSearchResult.value); this.setState({ media: allMedia }); @@ -171,8 +166,10 @@ export class MediaSelectionItemModal extends React.Component - {this.state.media.map(mediaItem => - this.renderMediaItem(mediaItem) + {this.state.media.length === 0 + ? It seems that you don't have media items yet. + : this.state.media.map(mediaItem => + this.renderMediaItem(mediaItem) )} diff --git a/src/admin/navigation/navigationItemModal.tsx b/src/admin/navigation/navigationItemModal.tsx index 5562681e..0ec206d2 100644 --- a/src/admin/navigation/navigationItemModal.tsx +++ b/src/admin/navigation/navigationItemModal.tsx @@ -178,6 +178,10 @@ export class NavigationItemModal extends React.Component => { + if (!permalink) { + return URL_REQUIRED_MESSAGE; + } + const isPermalinkNotDefined = await this.permalinkService.isPermalinkDefined(permalink) && !reservedPermalinks.includes(permalink); let errorMessage = validateField(UNIQUE_REQUIRED, permalink, isPermalinkNotDefined); @@ -440,7 +444,7 @@ export class NavigationItemModal extends React.Component => { - let permalink = ''; + let permalink = null; if (!this.props.page && field === 'title') { permalink = newValue.replace(/\s+/g, '-').toLowerCase(); @@ -80,7 +80,7 @@ export class PageDetailsModal extends React.Component { } searchPages = async (searchPattern: string = ''): Promise => { - const query = Query.from().orderBy('title'); - if (searchPattern) { - query.where('title', Operator.contains, searchPattern); - } - + const query = createSearchQuery(searchPattern); const pagesSearchResult = await this.pageService.search(query); const allPages = await getAllValues(pagesSearchResult, pagesSearchResult.value); this.setState({ pages: allPages }); } searchLayouts = async (searchPattern: string = ''): Promise => { - const query = Query.from().orderBy('title'); - if (searchPattern) { - query.where('title', Operator.contains, searchPattern); - } - + const query = createSearchQuery(searchPattern); const layoutsSearchResult = await this.layoutService.search(query); const allLayouts = await getAllValues(layoutsSearchResult, layoutsSearchResult.value); this.setState({ layouts: allLayouts }); diff --git a/src/admin/popups/popups.tsx b/src/admin/popups/popups.tsx index 90e54730..6b3f2929 100644 --- a/src/admin/popups/popups.tsx +++ b/src/admin/popups/popups.tsx @@ -1,10 +1,9 @@ import * as React from 'react'; import { Resolve } from '@paperbits/react/decorators'; import { IPopupService, PopupContract } from '@paperbits/common/popups'; -import { Query, Operator } from '@paperbits/common/persistence'; import { ViewManager } from '@paperbits/common/ui'; import { CommandBarButton, FontIcon, IIconProps, SearchBox, Spinner, Stack, Text } from '@fluentui/react'; -import { getAllValues } from '../utils/helpers'; +import { createSearchQuery, getAllValues } from '../utils/helpers'; import { lightTheme } from '../utils/themes'; import { BackButton } from '../utils/components/backButton'; import { PopupDetailsModal } from './popupDetailsModal'; @@ -54,11 +53,7 @@ export class Popups extends React.Component { } searchPopups = async (searchPattern: string = ''): Promise => { - const query = Query.from().orderBy('title'); - if (searchPattern) { - query.where('title', Operator.contains, searchPattern); - } - + const query = createSearchQuery(searchPattern); const popupsSearchResult = await this.popupService.search(query); const allPopups = await getAllValues(popupsSearchResult, popupsSearchResult.value); this.setState({ popups: allPopups }); diff --git a/src/admin/urls/urls.tsx b/src/admin/urls/urls.tsx index 35f299ee..33942311 100644 --- a/src/admin/urls/urls.tsx +++ b/src/admin/urls/urls.tsx @@ -1,10 +1,9 @@ import * as React from 'react'; import { Resolve } from '@paperbits/react/decorators'; import { IUrlService, UrlContract } from '@paperbits/common/urls'; -import { Query, Operator } from '@paperbits/common/persistence'; import { ViewManager } from '@paperbits/common/ui'; import { CommandBarButton, FontIcon, IIconProps, SearchBox, Spinner, Stack, Text } from '@fluentui/react'; -import { getAllValues } from '../utils/helpers'; +import { createSearchQuery, getAllValues } from '../utils/helpers'; import { lightTheme } from '../utils/themes'; import { BackButton } from '../utils/components/backButton'; import { UrlDetailsModal } from './urlDetailsModal'; @@ -54,11 +53,7 @@ export class Urls extends React.Component { } searchUrls = async (searchPattern: string = ''): Promise => { - const query = Query.from().orderBy('title'); - if (searchPattern) { - query.where('title', Operator.contains, searchPattern); - } - + const query = createSearchQuery(searchPattern); const urlsSearchResult = await this.urlService.search(query); const allUrls = await getAllValues(urlsSearchResult, urlsSearchResult.value); this.setState({ urls: allUrls }); diff --git a/src/admin/utils/helpers.ts b/src/admin/utils/helpers.ts index 7c5fd334..9bd41e9a 100644 --- a/src/admin/utils/helpers.ts +++ b/src/admin/utils/helpers.ts @@ -1,5 +1,6 @@ import * as MediaUtils from "@paperbits/common/media/mediaUtils"; import { MediaContract } from "@paperbits/common/media"; +import { Operator, Query } from "@paperbits/common/persistence"; export const getThumbnailUrl = (mediaItem: MediaContract): string => { if (mediaItem?.mimeType?.startsWith("video")) { @@ -35,4 +36,14 @@ export const getAllValues = async (page: any, values: any) => { } return values; +} + +export const createSearchQuery = (searchPattern: string, fieldName: string = 'title') => { + const patternProcessed = searchPattern.replaceAll("#", "%23"); // TODO: Remove this when the issue with # in search is fixed on the Paperbits side + const query = Query.from().orderBy(fieldName); + if (patternProcessed) { + query.where(fieldName, Operator.contains, patternProcessed); + } + + return query; } \ No newline at end of file From 3ed293c21e3523059db806e2590c086cdbf6e58c Mon Sep 17 00:00:00 2001 From: Elena Shorohova <92329687+jsorohova@users.noreply.github.com> Date: Thu, 29 Aug 2024 17:22:31 +0300 Subject: [PATCH 19/29] Added a fix for incorrect validation (#2668) --- src/admin/pages/pageDetailsModal.tsx | 15 +++++++++------ src/admin/pages/pageLayoutDetailsModal.tsx | 16 +++++++++------- src/admin/utils/validator.ts | 7 ++++--- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/admin/pages/pageDetailsModal.tsx b/src/admin/pages/pageDetailsModal.tsx index 2c1ff849..7171505a 100644 --- a/src/admin/pages/pageDetailsModal.tsx +++ b/src/admin/pages/pageDetailsModal.tsx @@ -134,12 +134,13 @@ export class PageDetailsModal extends React.Component => { - if (this.state.page.permalink === '/new-page') { - const permalinkError = await this.validatePermalink(this.state.page.permalink); - if (permalinkError) { - this.setState({ errors: { permalink: permalinkError } }); - return; - } + // TODO: find a root cause of an ability to click Save button when name is empty or permalink is not unique + const permalinkError = await this.validatePermalink(this.state.page.permalink); + const titleError = validateField(REQUIRED, this.state.page.title); + + if (permalinkError || titleError) { + this.setState({ errors: { permalink: permalinkError, title: titleError } }); + return; } if (this.props.page && !this.state.copyPage) { @@ -206,6 +207,7 @@ export class PageDetailsModal extends React.Component} ariaLabel="Name" + placeholder="Enter the page name" value={this.state.page.title} onChange={(event, newValue) => this.onInputChange('title', newValue, REQUIRED)} errorMessage={this.state.errors['title'] ?? ''} @@ -220,6 +222,7 @@ export class PageDetailsModal extends React.Component } ariaLabel="Permalink path" + placeholder="Enter the permalink path" value={this.state.page.permalink} onChange={(event, newValue) => this.onInputChange('permalink', newValue)} errorMessage={this.state.errors['permalink'] ?? ''} diff --git a/src/admin/pages/pageLayoutDetailsModal.tsx b/src/admin/pages/pageLayoutDetailsModal.tsx index b978cf60..ad185321 100644 --- a/src/admin/pages/pageLayoutDetailsModal.tsx +++ b/src/admin/pages/pageLayoutDetailsModal.tsx @@ -106,13 +106,13 @@ export class PageLayoutDetailsModal extends React.Component => { - if (this.state.layout.permalinkTemplate === '/new-layout') { - const permalinkError = await this.validatePermalink(this.state.layout.permalinkTemplate); - if (permalinkError) { - this.setState({ errors: { permalinkTemplate: permalinkError } }); - - return; - } + // TODO: find a root cause of an ability to click Save button when name is empty or permalink is not unique + const permalinkError = await this.validatePermalink(this.state.layout.permalinkTemplate); + const titleError = validateField(REQUIRED, this.state.layout.title); + + if (permalinkError || titleError) { + this.setState({ errors: { permalinkTemplate: permalinkError, title: titleError } }); + return; } if (this.props.layout && !this.state.copyLayout) { @@ -173,6 +173,7 @@ export class PageLayoutDetailsModal extends React.Component this.onInputChange('title', newValue, REQUIRED)} errorMessage={this.state.errors['title'] ?? ''} @@ -188,6 +189,7 @@ export class PageLayoutDetailsModal extends React.Component } ariaLabel="Permalink path template" + placeholder="Enter the permalink path template" value={this.state.layout.permalinkTemplate} onChange={(event, newValue) => this.onInputChange('permalinkTemplate', newValue)} errorMessage={this.state.errors['permalinkTemplate'] ?? ''} diff --git a/src/admin/utils/validator.ts b/src/admin/utils/validator.ts index d7912253..293ce3a6 100644 --- a/src/admin/utils/validator.ts +++ b/src/admin/utils/validator.ts @@ -16,14 +16,15 @@ export const validateField = (validationType: string, value: string, customValid const absoluteUrlRegex = /^(?:https?:\/\/)?(?:[\w-]+\.)*[\w.-]+\.[a-zA-Z]{2,}(?:\/[\w-.~:/?#[\]@!$&'()*+,;=%]*)?$/; const relativeUrlRegex = /^(?:\/|#)[\w-.~:/?#[\]@!$&'()*+,;=%]*$/; + const isNotEmpty = value.length > 0 && value.trim().length > 0; switch (validationType) { case REQUIRED: - isValid = value.length > 0; + isValid = isNotEmpty; errorMessage = isValid ? "" : REQUIRED_MESSAGE; break; case UNIQUE_REQUIRED: - isValid = value.length > 0 && customValidation; + isValid = isNotEmpty && customValidation; errorMessage = isValid ? "" : UNIQUE_REQUIRED_MESSAGE; break; case URL: @@ -31,7 +32,7 @@ export const validateField = (validationType: string, value: string, customValid errorMessage = isValid ? "" : URL_MESSAGE; break; case URL_REQUIRED: - isValid = value.length > 0 && (absoluteUrlRegex.test(value) || relativeUrlRegex.test(value)); + isValid = isNotEmpty && (absoluteUrlRegex.test(value) || relativeUrlRegex.test(value)); errorMessage = isValid ? "" : URL_REQUIRED_MESSAGE; break; } From cca58a429a5ffee4ee458e125ef0208f197dff65 Mon Sep 17 00:00:00 2001 From: Elena Shorohova <92329687+jsorohova@users.noreply.github.com> Date: Thu, 29 Aug 2024 19:30:52 +0300 Subject: [PATCH 20/29] CR fix (#2669) --- src/admin/utils/validator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/admin/utils/validator.ts b/src/admin/utils/validator.ts index 293ce3a6..4480cfd3 100644 --- a/src/admin/utils/validator.ts +++ b/src/admin/utils/validator.ts @@ -24,7 +24,7 @@ export const validateField = (validationType: string, value: string, customValid errorMessage = isValid ? "" : REQUIRED_MESSAGE; break; case UNIQUE_REQUIRED: - isValid = isNotEmpty && customValidation; + isValid = isNotEmpty && (customValidation === true); errorMessage = isValid ? "" : UNIQUE_REQUIRED_MESSAGE; break; case URL: From 5580269baae45a06c8c781809ac222e7715267fb Mon Sep 17 00:00:00 2001 From: Elena Shorohova <92329687+jsorohova@users.noreply.github.com> Date: Tue, 24 Sep 2024 12:50:34 +0300 Subject: [PATCH 21/29] Fixed integration user errors (#2679) * Fixed integration user errors * Fixed GitHub build errors --- .github/workflows/mainCI.yml | 2 +- .github/workflows/test.yml | 2 +- src/components/users/profile/ko/runtime/profile.ts | 2 +- src/constants.ts | 7 ++++++- src/models/user.ts | 2 +- src/services/productService.ts | 4 ++++ src/services/usersService.ts | 2 +- 7 files changed, 15 insertions(+), 6 deletions(-) diff --git a/.github/workflows/mainCI.yml b/.github/workflows/mainCI.yml index 9516679a..309f8b77 100644 --- a/.github/workflows/mainCI.yml +++ b/.github/workflows/mainCI.yml @@ -40,7 +40,7 @@ jobs: input-urls: http://localhost:12345/profile http://localhost:12345/500 http://localhost:12345/404 - name: Upload report artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: accessibility-reports path: ${{ github.workspace }}/_accessibility-reports diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6c03c4d8..7793ba33 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -52,7 +52,7 @@ jobs: - name: Run tests run: npx playwright test tests/ --workers 1 - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 if: failure() with: name: playwright-report diff --git a/src/components/users/profile/ko/runtime/profile.ts b/src/components/users/profile/ko/runtime/profile.ts index 323443eb..810118d8 100644 --- a/src/components/users/profile/ko/runtime/profile.ts +++ b/src/components/users/profile/ko/runtime/profile.ts @@ -69,7 +69,7 @@ export class Profile { await this.usersService.ensureSignedIn(); const model: User = await this.usersService.getCurrentUser(); - this.isBasicAccount(model.isBasicAccount); + this.isBasicAccount(model?.isBasicAccount); this.setUser(model); } diff --git a/src/constants.ts b/src/constants.ts index 447c604d..19e31fc9 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -339,4 +339,9 @@ export const overrideToastSessionKeyPrefix = "MS_APIM_CW_override_toast_dismisse * Styling constants */ export const mobileBreakpoint = 768; -export const smallMobileBreakpoint = 400; \ No newline at end of file +export const smallMobileBreakpoint = 400; + +/** + * Key of the default admin user + */ +export const integrationUserId = '/users/integration'; \ No newline at end of file diff --git a/src/models/user.ts b/src/models/user.ts index 87555d38..40b1293e 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -23,7 +23,7 @@ export class User { this.note = contract.properties.note; this.groups = contract.properties.groups; this.identities = contract.properties.identities; - this.isBasicAccount = this.identities[0]?.provider === "Basic"; + this.isBasicAccount = this.identities?.[0]?.provider === "Basic"; } } diff --git a/src/services/productService.ts b/src/services/productService.ts index a244550d..342a64ac 100644 --- a/src/services/productService.ts +++ b/src/services/productService.ts @@ -180,6 +180,10 @@ export class ProductService { if (!userId) { throw new Error(`Parameter "userId" not specified.`); } + + if (userId === Constants.integrationUserId) { + return new Page(); + } const skip = searchRequest && searchRequest.skip || 0; const take = searchRequest && searchRequest.take || Constants.defaultPageSize; diff --git a/src/services/usersService.ts b/src/services/usersService.ts index 6f5cd340..693daf14 100644 --- a/src/services/usersService.ts +++ b/src/services/usersService.ts @@ -181,7 +181,7 @@ export class UsersService { try { const userId = await this.getCurrentUserId(); - if (!userId) { + if (!userId || userId === Constants.integrationUserId) { return null; } From d51e1232f6ed1edfd39261330ffd9a23f8816e57 Mon Sep 17 00:00:00 2001 From: Roman Kolesnikov <14820428+rkolesnikovDX@users.noreply.github.com> Date: Tue, 1 Oct 2024 19:02:36 +0200 Subject: [PATCH 22/29] Fixed custom widgets editor configuration view (#2686) Co-authored-by: Roman I. Kolesnikov false --- .../custom-widget/ko/customWidgetEditorViewModel.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/custom-widget/ko/customWidgetEditorViewModel.ts b/src/components/custom-widget/ko/customWidgetEditorViewModel.ts index ef378a37..6ac6cea1 100644 --- a/src/components/custom-widget/ko/customWidgetEditorViewModel.ts +++ b/src/components/custom-widget/ko/customWidgetEditorViewModel.ts @@ -24,7 +24,7 @@ export class CustomWidgetEditorViewModel implements WidgetEditor; public readonly instanceId: ko.Observable; public readonly iframeAllows: string = iframeAllows; - public readonly iframeSandboxAllows: string = iframeSandboxAllows; + public readonly iframeSandboxAllows: string = CustomWidgetEditorViewModel.buildSandboxParams(); constructor( private readonly viewManager: ViewManager, @@ -69,6 +69,10 @@ export class CustomWidgetEditorViewModel implements WidgetEditor Date: Wed, 2 Oct 2024 13:50:05 +0200 Subject: [PATCH 23/29] Added allow-same-origin as a settings option for custom widgets (#2688) * Added cors allo-same-origin option for custom widget * Nit, changed text --- .../custom-widget/customWidgetContract.ts | 6 ++++++ .../custom-widget/customWidgetModel.ts | 5 +++++ .../customWidgetModelBinder.publish.ts | 2 ++ .../custom-widget/customWidgetModelBinder.ts | 2 ++ .../custom-widget/ko/customWidgetEditorView.html | 8 +++++++- .../ko/customWidgetEditorViewModel.ts | 6 +++++- .../ko/customWidgetViewModelBinder.ts | 1 + .../custom-widget/ko/runtime/customWidget.ts | 16 ++++++++++------ 8 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/components/custom-widget/customWidgetContract.ts b/src/components/custom-widget/customWidgetContract.ts index 1cd4fdcb..dbb2d8a2 100644 --- a/src/components/custom-widget/customWidgetContract.ts +++ b/src/components/custom-widget/customWidgetContract.ts @@ -31,4 +31,10 @@ export interface CustomWidgetContract extends Contract { * Local styles. */ styles: LocalStyles; + + /** + * allow iframe to load content from the same origin. + * @default false + * */ + allowSameOrigin: boolean; } diff --git a/src/components/custom-widget/customWidgetModel.ts b/src/components/custom-widget/customWidgetModel.ts index c6ce7a58..31f8ab47 100644 --- a/src/components/custom-widget/customWidgetModel.ts +++ b/src/components/custom-widget/customWidgetModel.ts @@ -26,6 +26,11 @@ export class CustomWidgetModel { */ public instanceId: string; + /** + * Allow iframe to load content from the same origin. + */ + public allowSameOrigin: boolean; + constructor() { this.styles = {}; } diff --git a/src/components/custom-widget/customWidgetModelBinder.publish.ts b/src/components/custom-widget/customWidgetModelBinder.publish.ts index a31b4480..bb2b3196 100644 --- a/src/components/custom-widget/customWidgetModelBinder.publish.ts +++ b/src/components/custom-widget/customWidgetModelBinder.publish.ts @@ -16,6 +16,7 @@ export class CustomWidgetModelBinder implements IModelBinder model.customInputValue = contract.customInputValue ?? "{}"; model.instanceId = contract.instanceKey; model.styles = contract.styles || {}; + model.allowSameOrigin = contract.allowSameOrigin || false; return model; } @@ -27,6 +28,7 @@ export class CustomWidgetModelBinder implements IModelBinder customInputValue: model.customInputValue, instanceKey: model.instanceId, styles: model.styles, + allowSameOrigin: model.allowSameOrigin, } as CustomWidgetContract; } } diff --git a/src/components/custom-widget/customWidgetModelBinder.ts b/src/components/custom-widget/customWidgetModelBinder.ts index 71f22e6a..dfc70aec 100644 --- a/src/components/custom-widget/customWidgetModelBinder.ts +++ b/src/components/custom-widget/customWidgetModelBinder.ts @@ -16,6 +16,7 @@ export class CustomWidgetModelBinder implements IModelBinder model.customInputValue = contract.customInputValue ?? "{}"; model.instanceId = contract.instanceKey; model.styles = contract.styles || {}; + model.allowSameOrigin = contract.allowSameOrigin || false; return model; } @@ -27,6 +28,7 @@ export class CustomWidgetModelBinder implements IModelBinder customInputValue: model.customInputValue, instanceKey: model.instanceId, styles: model.styles, + allowSameOrigin: model.allowSameOrigin, } as CustomWidgetContract; } } diff --git a/src/components/custom-widget/ko/customWidgetEditorView.html b/src/components/custom-widget/ko/customWidgetEditorView.html index c3b6d450..0f4909e4 100644 --- a/src/components/custom-widget/ko/customWidgetEditorView.html +++ b/src/components/custom-widget/ko/customWidgetEditorView.html @@ -9,6 +9,12 @@ + +

Custom properties

Custom properties let you adjust values in the custom widget’s code from the administrative user interface of the developer portal, without changing the code or redeploying the custom widget.

@@ -19,4 +25,4 @@ frameborder="0" > - \ No newline at end of file + diff --git a/src/components/custom-widget/ko/customWidgetEditorViewModel.ts b/src/components/custom-widget/ko/customWidgetEditorViewModel.ts index 6ac6cea1..67254b66 100644 --- a/src/components/custom-widget/ko/customWidgetEditorViewModel.ts +++ b/src/components/custom-widget/ko/customWidgetEditorViewModel.ts @@ -25,6 +25,7 @@ export class CustomWidgetEditorViewModel implements WidgetEditor; public readonly iframeAllows: string = iframeAllows; public readonly iframeSandboxAllows: string = CustomWidgetEditorViewModel.buildSandboxParams(); + public readonly allowSameOrigin: ko.Observable; constructor( private readonly viewManager: ViewManager, @@ -35,6 +36,7 @@ export class CustomWidgetEditorViewModel implements WidgetEditor { if (typeof event.data === "object" && "customInputValueChangedMSAPIM" in event.data) { @@ -60,7 +63,7 @@ export class CustomWidgetEditorViewModel implements WidgetEditor iframe?.sandbox.supports(token)) - .join(" "); } @Param() @@ -41,10 +35,20 @@ export class CustomWidget { @Param() public readonly environment: Environment; + @Param() + public readonly allowSameOrigin: boolean; + @OnMounted() public async initialize(): Promise { if (this.environment === "development") this.windowRef = window.parent.window; + const iframe = document.getElementsByTagName("iframe")[0]; + const sandboxAttrs = `${iframeSandboxAllows} ${iframeSandboxAllowsBrowserSpecific}`.split(" "); + if(this.allowSameOrigin) { + sandboxAttrs.push("allow-same-origin"); + } + this.iframeSandboxAllows = sandboxAttrs.filter(token=> iframe?.sandbox.supports(token)).join(" "); + this.propagateHashchange(); this.windowRef.addEventListener("hashchange", this.propagateHashchange); } From 92dbb62df7c7265db1794efa8dff1473f4583e9f Mon Sep 17 00:00:00 2001 From: Roman Kolesnikov <14820428+rkolesnikovDX@users.noreply.github.com> Date: Wed, 2 Oct 2024 16:25:38 +0200 Subject: [PATCH 24/29] Update package version to 2.31.0 (#2689) * Update package version to 2.31.0 --------- Co-authored-by: Roman I. Kolesnikov false --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 218d5f84..3f6269ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "apim-developer-portal", - "version": "2.30.0", + "version": "2.31.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "apim-developer-portal", - "version": "2.30.0", + "version": "2.31.0", "license": "MIT", "dependencies": { "@azure/api-management-custom-widgets-scaffolder": "^1.0.0-beta.4", diff --git a/package.json b/package.json index f538663a..45f9268d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "apim-developer-portal", - "version": "2.30.0", + "version": "2.31.0", "description": "API management developer portal", "author": "Microsoft", "license": "MIT", From 7bc743f8133b8840192bc1b90b3d8409430f0b15 Mon Sep 17 00:00:00 2001 From: Roman Kolesnikov <14820428+rkolesnikovDX@users.noreply.github.com> Date: Thu, 3 Oct 2024 19:32:18 +0200 Subject: [PATCH 25/29] Fixed nonImageDetailModal to pass schema validation on saving of linked item (#2691) Co-authored-by: Roman I. Kolesnikov false --- src/admin/media/nonImageDetailsModal.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/admin/media/nonImageDetailsModal.tsx b/src/admin/media/nonImageDetailsModal.tsx index a3e1c946..bcfdc1a8 100644 --- a/src/admin/media/nonImageDetailsModal.tsx +++ b/src/admin/media/nonImageDetailsModal.tsx @@ -8,6 +8,7 @@ import { DefaultButton, Modal, PrimaryButton, Stack, Text, TextField } from '@fl import { CopyableTextField } from '../utils/components/copyableTextField'; import { REQUIRED, UNIQUE_REQUIRED, URL_REQUIRED, validateField } from '../utils/validator'; import { reservedPermalinks } from '../../constants'; +import { MimeTypes } from '@paperbits/common'; interface NonImageDetailsModalState { mediaItem: MediaContract, @@ -78,11 +79,12 @@ export class NonImageDetailsModal extends React.Component => { if (permalink === this.props.mediaItem?.permalink) return ''; @@ -107,7 +109,7 @@ export class NonImageDetailsModal extends React.Component Date: Fri, 4 Oct 2024 11:00:11 -0700 Subject: [PATCH 26/29] Packages and styles upgrade (#2692) * Migrated declarations. * Upgraded designer styles. * Updated packages and fixed styles --------- Co-authored-by: Alexander Zaslonov --- package-lock.json | 386 +++++++----------- package.json | 12 +- .../apis/api-products/apiProductsHandlers.ts | 6 +- .../details-of-api/detailsOfApiHandlers.ts | 2 +- .../history-of-api/historyOfApiHandlers.ts | 2 +- .../apis/list-of-apis/listOfApisHandlers.ts | 6 +- .../custom-html/customHtmlHandlers.ts | 2 +- .../custom-widget/customWidgetHandlers.ts | 2 +- .../operationDetailsHandlers.ts | 2 +- .../operation-list/operationListHandlers.ts | 2 +- .../product-apis/productApisHandlers.ts | 4 +- .../product-details/productDetailsHandlers.ts | 2 +- .../product-list/productListHandlers.ts | 6 +- .../productSubscribeHandlers.ts | 2 +- .../productSubscriptionsHandlers.ts | 2 +- src/components/reports/reportsHandlers.ts | 2 +- .../change-password/changePasswordHandlers.ts | 2 +- .../confirmPasswordHandlers.ts | 2 +- .../users/profile/profileHandlers.ts | 2 +- .../reset-password/resetPasswordHandlers.ts | 2 +- .../signin-social/signinSocialHandlers.ts | 2 +- src/components/users/signin/signinHandlers.ts | 2 +- .../signup-social/signupSocialHandlers.ts | 2 +- src/components/users/signup/signupHandlers.ts | 2 +- .../subscriptions/subscriptionsHandlers.ts | 2 +- .../validationSummaryHandlers.ts | 2 +- src/startup.design.ts | 3 +- src/themes/designer/styles/arrows.scss | 4 +- src/themes/designer/styles/balloons.scss | 36 +- src/themes/designer/styles/buttons.scss | 5 +- src/themes/designer/styles/draggables.scss | 4 +- src/themes/designer/styles/dropbucket.scss | 7 +- src/themes/designer/styles/dropzones.scss | 5 +- .../styles/editors/colorSelector.scss | 1 - src/themes/designer/styles/forms.scss | 67 ++- src/themes/designer/styles/grid.scss | 11 +- src/themes/designer/styles/layouts.scss | 10 +- src/themes/designer/styles/lightbox.scss | 2 + src/themes/designer/styles/lists.scss | 17 +- src/themes/designer/styles/mixins.scss | 75 ++-- src/themes/designer/styles/scaffolding.scss | 5 +- src/themes/designer/styles/slider.scss | 2 + src/themes/designer/styles/tabs.scss | 2 +- src/themes/designer/styles/toasts.scss | 8 +- .../designer/styles/toolbox.paragraph.scss | 6 +- src/themes/designer/styles/toolboxes.scss | 8 +- src/themes/designer/styles/typography.scss | 36 -- src/themes/designer/styles/utils.scss | 2 + src/themes/designer/styles/widgets.scss | 3 +- src/themes/website/styles/buttons.scss | 8 + src/themes/website/styles/forms.scss | 258 +++--------- src/themes/website/styles/grids.scss | 10 + src/themes/website/styles/icons.scss | 11 + src/themes/website/styles/navs.scss | 3 +- src/themes/website/styles/reboot.scss | 2 + src/themes/website/styles/scrollbars.scss | 107 +++++ src/themes/website/styles/styles.design.scss | 114 ++++-- src/themes/website/styles/styles.scss | 4 +- src/themes/website/styles/utils.scss | 24 +- src/themes/website/styles/variables.scss | 8 +- tsconfig.json | 2 - 61 files changed, 729 insertions(+), 601 deletions(-) create mode 100644 src/themes/website/styles/grids.scss create mode 100644 src/themes/website/styles/scrollbars.scss diff --git a/package-lock.json b/package-lock.json index 3f6269ec..c5fc9f91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,12 +17,12 @@ "@fluentui/react": "^8.105.11", "@microsoft/applicationinsights-web": "^3.0.2", "@monaco-editor/loader": "^1.3.3", - "@paperbits/azure": "0.1.593", - "@paperbits/common": "0.1.593-hotfix2", - "@paperbits/core": "0.1.593-hotfix2", - "@paperbits/forms": "0.1.593-hotfix2", - "@paperbits/react": "1.0.7", - "@paperbits/styles": "0.1.593-hotfix2", + "@paperbits/azure": "0.1.623", + "@paperbits/common": "0.1.623", + "@paperbits/core": "0.1.623", + "@paperbits/forms": "0.1.623", + "@paperbits/react": "1.0.8", + "@paperbits/styles": "0.1.623", "@webcomponents/custom-elements": "1.6.0", "@webcomponents/shadydom": "^1.11.0", "client-oauth2": "4.3.3", @@ -713,9 +713,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1583,12 +1583,12 @@ } }, "node_modules/@paperbits/azure": { - "version": "0.1.593", - "resolved": "https://registry.npmjs.org/@paperbits/azure/-/azure-0.1.593.tgz", - "integrity": "sha512-aX8z7XExsleDyJsoE7iilPaqtJ5bIVOYD3M1Ejl7yMLUJsGWK3z/u7exT1ImCOGx1hPSlGyCGqCMOUqU74Dzgw==", + "version": "0.1.623", + "resolved": "https://registry.npmjs.org/@paperbits/azure/-/azure-0.1.623.tgz", + "integrity": "sha512-FB4HFkXjUjf0UWNIrzMXal6jBaU1PmiOz55xV1zMsntCow9MKvu1uM724AX0b//5OQCs2VAMdovGOB6aDp5nAQ==", "dependencies": { "@azure/storage-blob": "12.14.0", - "@paperbits/common": "0.1.593", + "@paperbits/common": "0.1.623", "applicationinsights-js": "1.0.21", "mime": "3.0.0" } @@ -1611,29 +1611,10 @@ "node": ">=14.0.0" } }, - "node_modules/@paperbits/azure/node_modules/@paperbits/common": { - "version": "0.1.593", - "resolved": "https://registry.npmjs.org/@paperbits/common/-/common-0.1.593.tgz", - "integrity": "sha512-GPX2OGAgmT2PAuRRMJg+eDeXvbWHyPQrbEvufunkwdaptwvyQrP6WVBojXhBnoNPllkjIAhlRQS3XP/8EDVn3w==", - "dependencies": { - "@googlemaps/js-api-loader": "^1.13.2", - "html-minifier-terser": "^5.1.1", - "html2plaintext": "^2.1.2", - "inversify": "^5.0.1", - "jsdom": "^19.0.0", - "knockout": "^3.5.1", - "lodash": "^4.17.15", - "lunr": "^2.3.8", - "mime": "3.0.0", - "moment": "^2.24.0", - "reflect-metadata": "^0.1.13", - "xhr2": "^0.2.0" - } - }, "node_modules/@paperbits/common": { - "version": "0.1.593-hotfix2", - "resolved": "https://registry.npmjs.org/@paperbits/common/-/common-0.1.593-hotfix2.tgz", - "integrity": "sha512-tX0Uz0X3JVfBWCfh7RAKEKtTi4hZsSI8qHr2QUP5KYVpSsjvVe0wxMd9AD5ajDhniNHFit9nX5aXF3uZlCjf0g==", + "version": "0.1.623", + "resolved": "https://registry.npmjs.org/@paperbits/common/-/common-0.1.623.tgz", + "integrity": "sha512-L2zlIsKpgeVyMrbWkBB23t5Us5/iqwJbs0Aoj1OCz9AgUa/cmNU/YvmHR4pWw2E1EMe/RpEpccRpZy44hk74Bw==", "dependencies": { "@googlemaps/js-api-loader": "^1.13.2", "html-minifier-terser": "^5.1.1", @@ -1650,14 +1631,14 @@ } }, "node_modules/@paperbits/core": { - "version": "0.1.593-hotfix2", - "resolved": "https://registry.npmjs.org/@paperbits/core/-/core-0.1.593-hotfix2.tgz", - "integrity": "sha512-8aKQ0r9iswqfz6JS3TaJ4Xk+7obPAUmkHnMqFXOX2ePP3RhlZrppccfAFuhKWD4PktLu002MOSwZSsrsKna/Qw==", + "version": "0.1.623", + "resolved": "https://registry.npmjs.org/@paperbits/core/-/core-0.1.623.tgz", + "integrity": "sha512-Lb2TvbLaj4pb7Zhw5IHRROC+rt+nKH4MSpXT2jIqfvpdvLBf9XWCPntu2mzlycEUKuDSEdm+iCLtZA759k2FpQ==", "dependencies": { "@googlemaps/js-api-loader": "^1.12.9", - "@paperbits/common": "0.1.593-hotfix2", - "@paperbits/prosemirror": "0.1.593", - "@paperbits/styles": "0.1.593-hotfix2", + "@paperbits/common": "0.1.623", + "@paperbits/prosemirror": "0.1.623", + "@paperbits/styles": "0.1.623", "await-parallel-limit": "^2.1.0", "basiclightbox": "^5.0.4", "cropperjs": "^1.5.11", @@ -1680,23 +1661,23 @@ } }, "node_modules/@paperbits/forms": { - "version": "0.1.593-hotfix2", - "resolved": "https://registry.npmjs.org/@paperbits/forms/-/forms-0.1.593-hotfix2.tgz", - "integrity": "sha512-ib+wSj5rfWh9PaBLXNn51BP/bXT5LgU2wyu5p7C+OwSHAiVPFWzkR2qjV+u3D3F22qUpCJYaLy3jOk3ADTx2kQ==", + "version": "0.1.623", + "resolved": "https://registry.npmjs.org/@paperbits/forms/-/forms-0.1.623.tgz", + "integrity": "sha512-yIlLkI+pPTEInuLqRDrFZeIG5v/00KwSF5AaZjZQpofW2DoULzPiyqnO8Hwd8qUiCPWNeGKNyyqKBF5+pnZkXA==", "dependencies": { - "@paperbits/common": "0.1.593-hotfix2", - "@paperbits/core": "0.1.593-hotfix2", - "@paperbits/styles": "0.1.593-hotfix2", + "@paperbits/common": "0.1.623", + "@paperbits/core": "0.1.623", + "@paperbits/styles": "0.1.623", "knockout": "^3.5.1", "knockout.validation": "^2.0.4" } }, "node_modules/@paperbits/prosemirror": { - "version": "0.1.593", - "resolved": "https://registry.npmjs.org/@paperbits/prosemirror/-/prosemirror-0.1.593.tgz", - "integrity": "sha512-+fpgzeFO63D92X2HXzXQLdYQDO/y5FmqMOKm7WsFo4C3071i9loGaE+aop/rwHlx2+DEgZLZN5TOaaBMW1WetQ==", + "version": "0.1.623", + "resolved": "https://registry.npmjs.org/@paperbits/prosemirror/-/prosemirror-0.1.623.tgz", + "integrity": "sha512-+TwtfMyfCMbGMJoy6Dk0EHdY6RwWspPtc4A1ZTl3I801vBYsWyVoiSmKgnerCAgfh8QEOXAp9I0EIXlnDy6lMA==", "dependencies": { - "@paperbits/common": "0.1.593", + "@paperbits/common": "0.1.623", "prosemirror-commands": "^1.5.2", "prosemirror-history": "^1.3.2", "prosemirror-inputrules": "^1.2.1", @@ -1708,40 +1689,21 @@ "prosemirror-view": "^1.31.3" } }, - "node_modules/@paperbits/prosemirror/node_modules/@paperbits/common": { - "version": "0.1.593", - "resolved": "https://registry.npmjs.org/@paperbits/common/-/common-0.1.593.tgz", - "integrity": "sha512-GPX2OGAgmT2PAuRRMJg+eDeXvbWHyPQrbEvufunkwdaptwvyQrP6WVBojXhBnoNPllkjIAhlRQS3XP/8EDVn3w==", - "dependencies": { - "@googlemaps/js-api-loader": "^1.13.2", - "html-minifier-terser": "^5.1.1", - "html2plaintext": "^2.1.2", - "inversify": "^5.0.1", - "jsdom": "^19.0.0", - "knockout": "^3.5.1", - "lodash": "^4.17.15", - "lunr": "^2.3.8", - "mime": "3.0.0", - "moment": "^2.24.0", - "reflect-metadata": "^0.1.13", - "xhr2": "^0.2.0" - } - }, "node_modules/@paperbits/react": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@paperbits/react/-/react-1.0.7.tgz", - "integrity": "sha512-0/Td5LeYSZj0W8nyXQi9x9QEBDoLoU/VznpBi0n2TVGCvJVexN8QU7+FKkERQv+91mWqQ2V5nDyFeQoQRAgRpg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@paperbits/react/-/react-1.0.8.tgz", + "integrity": "sha512-APB8ok9eqnwYSLn0tPW6z7EeTsdsp6QMJL3QbwVosTwfeZW0T/GBypk1KneyCZTXn2LCYG1todneuK/Eo2dBwg==", "dependencies": { - "@paperbits/common": "0.1.529", + "@paperbits/common": "0.1.550", "inversify-react": "^1.0.2", "react": "^18.2.0", "react-dom": "^18.2.0" } }, "node_modules/@paperbits/react/node_modules/@paperbits/common": { - "version": "0.1.529", - "resolved": "https://registry.npmjs.org/@paperbits/common/-/common-0.1.529.tgz", - "integrity": "sha512-TGxI4wlEES73l9FNawUKeMIU8sj8r8+n7F5BkiGz4hd9XqwBx65M+n9CYuCvNXILZMI483Z8t1phM6VCOmrqDA==", + "version": "0.1.550", + "resolved": "https://registry.npmjs.org/@paperbits/common/-/common-0.1.550.tgz", + "integrity": "sha512-gGq5/2kRBrlvpfpeYZEh27eaamBRmjEk458i/W9r02UCI1LXRp6SBO3woAfsh2VkQwt6PwOU0X9663oS9efBgA==", "dependencies": { "@googlemaps/js-api-loader": "^1.13.2", "html-minifier-terser": "^5.1.1", @@ -1758,11 +1720,11 @@ } }, "node_modules/@paperbits/styles": { - "version": "0.1.593-hotfix2", - "resolved": "https://registry.npmjs.org/@paperbits/styles/-/styles-0.1.593-hotfix2.tgz", - "integrity": "sha512-KrFOC/UJQ9Eeb7a7CKAu1ztv8Fj4wFhrLLMxliq7WqPpw/rhqilBqI2zk3xvWnh7YOUOaqKMQYA0q6kcih7nxA==", + "version": "0.1.623", + "resolved": "https://registry.npmjs.org/@paperbits/styles/-/styles-0.1.623.tgz", + "integrity": "sha512-NcG6pm6hS1C/o7ljyexazFbvMYK22jZXlW2QbgX0HjrNYe6OJPHC9WM2mYMssIkkE1IWjGxaztnSjW7kkvxEpg==", "dependencies": { - "@paperbits/common": "0.1.593-hotfix2", + "@paperbits/common": "0.1.623", "@simonwep/pickr": "^1.7.4", "jss": "^10.4.0", "jss-preset-default": "^10.4.0", @@ -2036,12 +1998,12 @@ "license": "MIT" }, "node_modules/@simonwep/pickr": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.9.0.tgz", - "integrity": "sha512-oEYvv15PyfZzjoAzvXYt3UyNGwzsrpFxLaZKzkOSd0WYBVwLd19iJerePDONxC1iF6+DpcswPdLIM2KzCJuYFg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.9.1.tgz", + "integrity": "sha512-fR3qmfAcPf/HSFS7GEnTmZLM3+xERv1+jyMBbzT63ilRRM8veYjI7ELvkHHKk0/du3lHp7uh/FqatjM3646X1g==", "dependencies": { - "core-js": "3.32.2", - "nanopop": "2.3.0" + "core-js": "3.37.0", + "nanopop": "2.4.2" } }, "node_modules/@swc/helpers": { @@ -3468,9 +3430,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001534", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", - "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", "dev": true, "funding": [ { @@ -4162,9 +4124,9 @@ } }, "node_modules/core-js": { - "version": "3.32.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.2.tgz", - "integrity": "sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", + "integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -6581,9 +6543,9 @@ } }, "node_modules/hyphenate-style-name": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", - "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==" }, "node_modules/iconv-lite": { "version": "0.4.24", @@ -8719,9 +8681,9 @@ } }, "node_modules/nanopop": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/nanopop/-/nanopop-2.3.0.tgz", - "integrity": "sha512-fzN+T2K7/Ah25XU02MJkPZ5q4Tj5FpjmIYq4rvoHX4yb16HzFdCO6JxFFn5Y/oBhQ8no8fUZavnyIv9/+xkBBw==" + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/nanopop/-/nanopop-2.4.2.tgz", + "integrity": "sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -9646,9 +9608,9 @@ } }, "node_modules/prosemirror-commands": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz", - "integrity": "sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.6.0.tgz", + "integrity": "sha512-xn1U/g36OqXn2tn5nGmvnnimAj/g1pUx2ypJJIe8WkVX83WyJVC5LTARaxZa2AtQRwntu9Jc5zXs9gL9svp/mg==", "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", @@ -9656,9 +9618,9 @@ } }, "node_modules/prosemirror-history": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.2.tgz", - "integrity": "sha512-/zm0XoU/N/+u7i5zepjmZAEnpvjDtzoPWW6VmKptcAnPadN/SStsBjMImdCEbb3seiNTpveziPTIrXQbHLtU1g==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.1.tgz", + "integrity": "sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==", "dependencies": { "prosemirror-state": "^1.2.2", "prosemirror-transform": "^1.0.0", @@ -9685,17 +9647,17 @@ } }, "node_modules/prosemirror-model": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.19.4.tgz", - "integrity": "sha512-RPmVXxUfOhyFdayHawjuZCxiROsm9L4FCUA6pWI+l7n2yCBsWy9VpdE1hpDHUS8Vad661YLY9AzqfjLhAKQ4iQ==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.22.3.tgz", + "integrity": "sha512-V4XCysitErI+i0rKFILGt/xClnFJaohe/wrrlT2NSZ+zk8ggQfDH4x2wNK7Gm0Hp4CIoWizvXFP7L9KMaCuI0Q==", "dependencies": { "orderedmap": "^2.0.0" } }, "node_modules/prosemirror-schema-list": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.3.0.tgz", - "integrity": "sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.4.1.tgz", + "integrity": "sha512-jbDyaP/6AFfDfu70VzySsD75Om2t3sXTOdl5+31Wlxlg62td1haUpty/ybajSfJ1pkGadlOfwQq9kgW5IMo1Rg==", "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", @@ -9713,19 +9675,19 @@ } }, "node_modules/prosemirror-transform": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.8.0.tgz", - "integrity": "sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.0.tgz", + "integrity": "sha512-9UOgFSgN6Gj2ekQH5CTDJ8Rp/fnKR2IkYfGdzzp5zQMFsS4zDllLVx/+jGcX86YlACpG7UR5fwAXiWzxqWtBTg==", "dependencies": { - "prosemirror-model": "^1.0.0" + "prosemirror-model": "^1.21.0" } }, "node_modules/prosemirror-view": { - "version": "1.32.7", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.32.7.tgz", - "integrity": "sha512-pvxiOoD4shW41X5bYDjRQk3DSG4fMqxh36yPMt7VYgU3dWRmqFzWJM/R6zeo1KtC8nyk717ZbQND3CC9VNeptw==", + "version": "1.34.3", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.34.3.tgz", + "integrity": "sha512-mKZ54PrX19sSaQye+sef+YjBbNu2voNwLS1ivb6aD2IRmxRGW64HU9B644+7OfJStGLyxvOreKqEgfvXa91WIA==", "dependencies": { - "prosemirror-model": "^1.16.0", + "prosemirror-model": "^1.20.0", "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0" } @@ -12592,9 +12554,9 @@ } }, "@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", "requires": { "regenerator-runtime": "^0.14.0" } @@ -13275,12 +13237,12 @@ "version": "1.0.3" }, "@paperbits/azure": { - "version": "0.1.593", - "resolved": "https://registry.npmjs.org/@paperbits/azure/-/azure-0.1.593.tgz", - "integrity": "sha512-aX8z7XExsleDyJsoE7iilPaqtJ5bIVOYD3M1Ejl7yMLUJsGWK3z/u7exT1ImCOGx1hPSlGyCGqCMOUqU74Dzgw==", + "version": "0.1.623", + "resolved": "https://registry.npmjs.org/@paperbits/azure/-/azure-0.1.623.tgz", + "integrity": "sha512-FB4HFkXjUjf0UWNIrzMXal6jBaU1PmiOz55xV1zMsntCow9MKvu1uM724AX0b//5OQCs2VAMdovGOB6aDp5nAQ==", "requires": { "@azure/storage-blob": "12.14.0", - "@paperbits/common": "0.1.593", + "@paperbits/common": "0.1.623", "applicationinsights-js": "1.0.21", "mime": "3.0.0" }, @@ -13299,32 +13261,13 @@ "events": "^3.0.0", "tslib": "^2.2.0" } - }, - "@paperbits/common": { - "version": "0.1.593", - "resolved": "https://registry.npmjs.org/@paperbits/common/-/common-0.1.593.tgz", - "integrity": "sha512-GPX2OGAgmT2PAuRRMJg+eDeXvbWHyPQrbEvufunkwdaptwvyQrP6WVBojXhBnoNPllkjIAhlRQS3XP/8EDVn3w==", - "requires": { - "@googlemaps/js-api-loader": "^1.13.2", - "html-minifier-terser": "^5.1.1", - "html2plaintext": "^2.1.2", - "inversify": "^5.0.1", - "jsdom": "^19.0.0", - "knockout": "^3.5.1", - "lodash": "^4.17.15", - "lunr": "^2.3.8", - "mime": "3.0.0", - "moment": "^2.24.0", - "reflect-metadata": "^0.1.13", - "xhr2": "^0.2.0" - } } } }, "@paperbits/common": { - "version": "0.1.593-hotfix2", - "resolved": "https://registry.npmjs.org/@paperbits/common/-/common-0.1.593-hotfix2.tgz", - "integrity": "sha512-tX0Uz0X3JVfBWCfh7RAKEKtTi4hZsSI8qHr2QUP5KYVpSsjvVe0wxMd9AD5ajDhniNHFit9nX5aXF3uZlCjf0g==", + "version": "0.1.623", + "resolved": "https://registry.npmjs.org/@paperbits/common/-/common-0.1.623.tgz", + "integrity": "sha512-L2zlIsKpgeVyMrbWkBB23t5Us5/iqwJbs0Aoj1OCz9AgUa/cmNU/YvmHR4pWw2E1EMe/RpEpccRpZy44hk74Bw==", "requires": { "@googlemaps/js-api-loader": "^1.13.2", "html-minifier-terser": "^5.1.1", @@ -13341,14 +13284,14 @@ } }, "@paperbits/core": { - "version": "0.1.593-hotfix2", - "resolved": "https://registry.npmjs.org/@paperbits/core/-/core-0.1.593-hotfix2.tgz", - "integrity": "sha512-8aKQ0r9iswqfz6JS3TaJ4Xk+7obPAUmkHnMqFXOX2ePP3RhlZrppccfAFuhKWD4PktLu002MOSwZSsrsKna/Qw==", + "version": "0.1.623", + "resolved": "https://registry.npmjs.org/@paperbits/core/-/core-0.1.623.tgz", + "integrity": "sha512-Lb2TvbLaj4pb7Zhw5IHRROC+rt+nKH4MSpXT2jIqfvpdvLBf9XWCPntu2mzlycEUKuDSEdm+iCLtZA759k2FpQ==", "requires": { "@googlemaps/js-api-loader": "^1.12.9", - "@paperbits/common": "0.1.593-hotfix2", - "@paperbits/prosemirror": "0.1.593", - "@paperbits/styles": "0.1.593-hotfix2", + "@paperbits/common": "0.1.623", + "@paperbits/prosemirror": "0.1.623", + "@paperbits/styles": "0.1.623", "await-parallel-limit": "^2.1.0", "basiclightbox": "^5.0.4", "cropperjs": "^1.5.11", @@ -13371,23 +13314,23 @@ } }, "@paperbits/forms": { - "version": "0.1.593-hotfix2", - "resolved": "https://registry.npmjs.org/@paperbits/forms/-/forms-0.1.593-hotfix2.tgz", - "integrity": "sha512-ib+wSj5rfWh9PaBLXNn51BP/bXT5LgU2wyu5p7C+OwSHAiVPFWzkR2qjV+u3D3F22qUpCJYaLy3jOk3ADTx2kQ==", + "version": "0.1.623", + "resolved": "https://registry.npmjs.org/@paperbits/forms/-/forms-0.1.623.tgz", + "integrity": "sha512-yIlLkI+pPTEInuLqRDrFZeIG5v/00KwSF5AaZjZQpofW2DoULzPiyqnO8Hwd8qUiCPWNeGKNyyqKBF5+pnZkXA==", "requires": { - "@paperbits/common": "0.1.593-hotfix2", - "@paperbits/core": "0.1.593-hotfix2", - "@paperbits/styles": "0.1.593-hotfix2", + "@paperbits/common": "0.1.623", + "@paperbits/core": "0.1.623", + "@paperbits/styles": "0.1.623", "knockout": "^3.5.1", "knockout.validation": "^2.0.4" } }, "@paperbits/prosemirror": { - "version": "0.1.593", - "resolved": "https://registry.npmjs.org/@paperbits/prosemirror/-/prosemirror-0.1.593.tgz", - "integrity": "sha512-+fpgzeFO63D92X2HXzXQLdYQDO/y5FmqMOKm7WsFo4C3071i9loGaE+aop/rwHlx2+DEgZLZN5TOaaBMW1WetQ==", + "version": "0.1.623", + "resolved": "https://registry.npmjs.org/@paperbits/prosemirror/-/prosemirror-0.1.623.tgz", + "integrity": "sha512-+TwtfMyfCMbGMJoy6Dk0EHdY6RwWspPtc4A1ZTl3I801vBYsWyVoiSmKgnerCAgfh8QEOXAp9I0EIXlnDy6lMA==", "requires": { - "@paperbits/common": "0.1.593", + "@paperbits/common": "0.1.623", "prosemirror-commands": "^1.5.2", "prosemirror-history": "^1.3.2", "prosemirror-inputrules": "^1.2.1", @@ -13397,44 +13340,23 @@ "prosemirror-state": "^1.4.3", "prosemirror-transform": "^1.7.2", "prosemirror-view": "^1.31.3" - }, - "dependencies": { - "@paperbits/common": { - "version": "0.1.593", - "resolved": "https://registry.npmjs.org/@paperbits/common/-/common-0.1.593.tgz", - "integrity": "sha512-GPX2OGAgmT2PAuRRMJg+eDeXvbWHyPQrbEvufunkwdaptwvyQrP6WVBojXhBnoNPllkjIAhlRQS3XP/8EDVn3w==", - "requires": { - "@googlemaps/js-api-loader": "^1.13.2", - "html-minifier-terser": "^5.1.1", - "html2plaintext": "^2.1.2", - "inversify": "^5.0.1", - "jsdom": "^19.0.0", - "knockout": "^3.5.1", - "lodash": "^4.17.15", - "lunr": "^2.3.8", - "mime": "3.0.0", - "moment": "^2.24.0", - "reflect-metadata": "^0.1.13", - "xhr2": "^0.2.0" - } - } } }, "@paperbits/react": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@paperbits/react/-/react-1.0.7.tgz", - "integrity": "sha512-0/Td5LeYSZj0W8nyXQi9x9QEBDoLoU/VznpBi0n2TVGCvJVexN8QU7+FKkERQv+91mWqQ2V5nDyFeQoQRAgRpg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@paperbits/react/-/react-1.0.8.tgz", + "integrity": "sha512-APB8ok9eqnwYSLn0tPW6z7EeTsdsp6QMJL3QbwVosTwfeZW0T/GBypk1KneyCZTXn2LCYG1todneuK/Eo2dBwg==", "requires": { - "@paperbits/common": "0.1.529", + "@paperbits/common": "0.1.550", "inversify-react": "^1.0.2", "react": "^18.2.0", "react-dom": "^18.2.0" }, "dependencies": { "@paperbits/common": { - "version": "0.1.529", - "resolved": "https://registry.npmjs.org/@paperbits/common/-/common-0.1.529.tgz", - "integrity": "sha512-TGxI4wlEES73l9FNawUKeMIU8sj8r8+n7F5BkiGz4hd9XqwBx65M+n9CYuCvNXILZMI483Z8t1phM6VCOmrqDA==", + "version": "0.1.550", + "resolved": "https://registry.npmjs.org/@paperbits/common/-/common-0.1.550.tgz", + "integrity": "sha512-gGq5/2kRBrlvpfpeYZEh27eaamBRmjEk458i/W9r02UCI1LXRp6SBO3woAfsh2VkQwt6PwOU0X9663oS9efBgA==", "requires": { "@googlemaps/js-api-loader": "^1.13.2", "html-minifier-terser": "^5.1.1", @@ -13453,11 +13375,11 @@ } }, "@paperbits/styles": { - "version": "0.1.593-hotfix2", - "resolved": "https://registry.npmjs.org/@paperbits/styles/-/styles-0.1.593-hotfix2.tgz", - "integrity": "sha512-KrFOC/UJQ9Eeb7a7CKAu1ztv8Fj4wFhrLLMxliq7WqPpw/rhqilBqI2zk3xvWnh7YOUOaqKMQYA0q6kcih7nxA==", + "version": "0.1.623", + "resolved": "https://registry.npmjs.org/@paperbits/styles/-/styles-0.1.623.tgz", + "integrity": "sha512-NcG6pm6hS1C/o7ljyexazFbvMYK22jZXlW2QbgX0HjrNYe6OJPHC9WM2mYMssIkkE1IWjGxaztnSjW7kkvxEpg==", "requires": { - "@paperbits/common": "0.1.593-hotfix2", + "@paperbits/common": "0.1.623", "@simonwep/pickr": "^1.7.4", "jss": "^10.4.0", "jss-preset-default": "^10.4.0", @@ -13617,12 +13539,12 @@ "version": "1.0.0" }, "@simonwep/pickr": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.9.0.tgz", - "integrity": "sha512-oEYvv15PyfZzjoAzvXYt3UyNGwzsrpFxLaZKzkOSd0WYBVwLd19iJerePDONxC1iF6+DpcswPdLIM2KzCJuYFg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.9.1.tgz", + "integrity": "sha512-fR3qmfAcPf/HSFS7GEnTmZLM3+xERv1+jyMBbzT63ilRRM8veYjI7ELvkHHKk0/du3lHp7uh/FqatjM3646X1g==", "requires": { - "core-js": "3.32.2", - "nanopop": "2.3.0" + "core-js": "3.37.0", + "nanopop": "2.4.2" } }, "@swc/helpers": { @@ -14624,9 +14546,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001534", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", - "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", "dev": true }, "ccount": { @@ -15037,9 +14959,9 @@ } }, "core-js": { - "version": "3.32.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.2.tgz", - "integrity": "sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==" + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", + "integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==" }, "core-util-is": { "version": "1.0.3", @@ -16606,9 +16528,9 @@ "dev": true }, "hyphenate-style-name": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", - "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==" }, "iconv-lite": { "version": "0.4.24", @@ -17931,9 +17853,9 @@ "dev": true }, "nanopop": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/nanopop/-/nanopop-2.3.0.tgz", - "integrity": "sha512-fzN+T2K7/Ah25XU02MJkPZ5q4Tj5FpjmIYq4rvoHX4yb16HzFdCO6JxFFn5Y/oBhQ8no8fUZavnyIv9/+xkBBw==" + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/nanopop/-/nanopop-2.4.2.tgz", + "integrity": "sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==" }, "natural-compare": { "version": "1.4.0", @@ -18478,9 +18400,9 @@ "version": "6.1.0" }, "prosemirror-commands": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz", - "integrity": "sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.6.0.tgz", + "integrity": "sha512-xn1U/g36OqXn2tn5nGmvnnimAj/g1pUx2ypJJIe8WkVX83WyJVC5LTARaxZa2AtQRwntu9Jc5zXs9gL9svp/mg==", "requires": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", @@ -18488,9 +18410,9 @@ } }, "prosemirror-history": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.2.tgz", - "integrity": "sha512-/zm0XoU/N/+u7i5zepjmZAEnpvjDtzoPWW6VmKptcAnPadN/SStsBjMImdCEbb3seiNTpveziPTIrXQbHLtU1g==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.1.tgz", + "integrity": "sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==", "requires": { "prosemirror-state": "^1.2.2", "prosemirror-transform": "^1.0.0", @@ -18517,17 +18439,17 @@ } }, "prosemirror-model": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.19.4.tgz", - "integrity": "sha512-RPmVXxUfOhyFdayHawjuZCxiROsm9L4FCUA6pWI+l7n2yCBsWy9VpdE1hpDHUS8Vad661YLY9AzqfjLhAKQ4iQ==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.22.3.tgz", + "integrity": "sha512-V4XCysitErI+i0rKFILGt/xClnFJaohe/wrrlT2NSZ+zk8ggQfDH4x2wNK7Gm0Hp4CIoWizvXFP7L9KMaCuI0Q==", "requires": { "orderedmap": "^2.0.0" } }, "prosemirror-schema-list": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.3.0.tgz", - "integrity": "sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.4.1.tgz", + "integrity": "sha512-jbDyaP/6AFfDfu70VzySsD75Om2t3sXTOdl5+31Wlxlg62td1haUpty/ybajSfJ1pkGadlOfwQq9kgW5IMo1Rg==", "requires": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", @@ -18545,19 +18467,19 @@ } }, "prosemirror-transform": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.8.0.tgz", - "integrity": "sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.0.tgz", + "integrity": "sha512-9UOgFSgN6Gj2ekQH5CTDJ8Rp/fnKR2IkYfGdzzp5zQMFsS4zDllLVx/+jGcX86YlACpG7UR5fwAXiWzxqWtBTg==", "requires": { - "prosemirror-model": "^1.0.0" + "prosemirror-model": "^1.21.0" } }, "prosemirror-view": { - "version": "1.32.7", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.32.7.tgz", - "integrity": "sha512-pvxiOoD4shW41X5bYDjRQk3DSG4fMqxh36yPMt7VYgU3dWRmqFzWJM/R6zeo1KtC8nyk717ZbQND3CC9VNeptw==", + "version": "1.34.3", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.34.3.tgz", + "integrity": "sha512-mKZ54PrX19sSaQye+sef+YjBbNu2voNwLS1ivb6aD2IRmxRGW64HU9B644+7OfJStGLyxvOreKqEgfvXa91WIA==", "requires": { - "prosemirror-model": "^1.16.0", + "prosemirror-model": "^1.20.0", "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0" } diff --git a/package.json b/package.json index 45f9268d..86c228e5 100644 --- a/package.json +++ b/package.json @@ -79,12 +79,12 @@ "@fluentui/react": "^8.105.11", "@microsoft/applicationinsights-web": "^3.0.2", "@monaco-editor/loader": "^1.3.3", - "@paperbits/azure": "0.1.593", - "@paperbits/common": "0.1.593-hotfix2", - "@paperbits/core": "0.1.593-hotfix2", - "@paperbits/forms": "0.1.593-hotfix2", - "@paperbits/react": "1.0.7", - "@paperbits/styles": "0.1.593-hotfix2", + "@paperbits/azure": "0.1.623", + "@paperbits/common": "0.1.623", + "@paperbits/core": "0.1.623", + "@paperbits/forms": "0.1.623", + "@paperbits/react": "1.0.8", + "@paperbits/styles": "0.1.623", "@webcomponents/custom-elements": "1.6.0", "@webcomponents/shadydom": "^1.11.0", "client-oauth2": "4.3.3", diff --git a/src/components/apis/api-products/apiProductsHandlers.ts b/src/components/apis/api-products/apiProductsHandlers.ts index 788e75ee..c557ebfe 100644 --- a/src/components/apis/api-products/apiProductsHandlers.ts +++ b/src/components/apis/api-products/apiProductsHandlers.ts @@ -1,19 +1,19 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { ApiProductsModel } from "./apiProductsModel"; -export class ApiProductsHandlers implements IWidgetHandler { +export class ApiProductsHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ApiProductsModel("list"); } } -export class ApiProductsDropdownHandlers implements IWidgetHandler { +export class ApiProductsDropdownHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ApiProductsModel("dropdown"); } } -export class ApiProductsTilesHandlers implements IWidgetHandler { +export class ApiProductsTilesHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ApiProductsModel("tiles"); } diff --git a/src/components/apis/details-of-api/detailsOfApiHandlers.ts b/src/components/apis/details-of-api/detailsOfApiHandlers.ts index 960fb5d4..6ad7e50d 100644 --- a/src/components/apis/details-of-api/detailsOfApiHandlers.ts +++ b/src/components/apis/details-of-api/detailsOfApiHandlers.ts @@ -1,7 +1,7 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { DetailsOfApiModel } from "./detailsOfApiModel"; -export class DetailsOfApiHandlers implements IWidgetHandler { +export class DetailsOfApiHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new DetailsOfApiModel(); } diff --git a/src/components/apis/history-of-api/historyOfApiHandlers.ts b/src/components/apis/history-of-api/historyOfApiHandlers.ts index dc482cbf..2302d5bd 100644 --- a/src/components/apis/history-of-api/historyOfApiHandlers.ts +++ b/src/components/apis/history-of-api/historyOfApiHandlers.ts @@ -1,7 +1,7 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { HistoryOfApiModel } from "./historyOfApiModel"; -export class HistoryOfApiHandlers implements IWidgetHandler { +export class HistoryOfApiHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new HistoryOfApiModel(); } diff --git a/src/components/apis/list-of-apis/listOfApisHandlers.ts b/src/components/apis/list-of-apis/listOfApisHandlers.ts index 633a7653..e8b6a905 100644 --- a/src/components/apis/list-of-apis/listOfApisHandlers.ts +++ b/src/components/apis/list-of-apis/listOfApisHandlers.ts @@ -1,19 +1,19 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { ListOfApisModel } from "./listOfApisModel"; -export class ListOfApisHandlers implements IWidgetHandler { +export class ListOfApisHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ListOfApisModel("list"); } } -export class ListOfApisTilesHandlers implements IWidgetHandler { +export class ListOfApisTilesHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ListOfApisModel("tiles"); } } -export class ListOfApisDropdownHandlers implements IWidgetHandler { +export class ListOfApisDropdownHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ListOfApisModel("dropdown"); } diff --git a/src/components/custom-html/customHtmlHandlers.ts b/src/components/custom-html/customHtmlHandlers.ts index 509bb420..d8686ca7 100644 --- a/src/components/custom-html/customHtmlHandlers.ts +++ b/src/components/custom-html/customHtmlHandlers.ts @@ -3,7 +3,7 @@ import { StyleHelper } from "@paperbits/styles"; import { CustomHtmlModel } from "./customHtmlModel"; import { htmlCodeInitial, htmlCodeSizeStylesInitial } from "./ko/constants"; -export class HTMLInjectionHandlers implements IWidgetHandler { +export class HTMLInjectionHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { const model = new CustomHtmlModel(); model.htmlCode = htmlCodeInitial; diff --git a/src/components/custom-widget/customWidgetHandlers.ts b/src/components/custom-widget/customWidgetHandlers.ts index ecbb3c02..d539bb57 100644 --- a/src/components/custom-widget/customWidgetHandlers.ts +++ b/src/components/custom-widget/customWidgetHandlers.ts @@ -11,7 +11,7 @@ export interface TCustomWidgetConfig extends CustomWidgetCommonConfig { override?: string | boolean; } -export class CustomWidgetHandlers implements IWidgetHandler { +export class CustomWidgetHandlers implements IWidgetHandler { constructor(private readonly configuration: TCustomWidgetConfig) { this.getWidgetModel = this.getWidgetModel.bind(this); } diff --git a/src/components/operations/operation-details/operationDetailsHandlers.ts b/src/components/operations/operation-details/operationDetailsHandlers.ts index 2b2c64b4..97ccb2d8 100644 --- a/src/components/operations/operation-details/operationDetailsHandlers.ts +++ b/src/components/operations/operation-details/operationDetailsHandlers.ts @@ -1,7 +1,7 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { OperationDetailsModel } from "./operationDetailsModel"; -export class OperationDetailsHandlers implements IWidgetHandler { +export class OperationDetailsHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new OperationDetailsModel(); } diff --git a/src/components/operations/operation-list/operationListHandlers.ts b/src/components/operations/operation-list/operationListHandlers.ts index fe8f8554..3385da94 100644 --- a/src/components/operations/operation-list/operationListHandlers.ts +++ b/src/components/operations/operation-list/operationListHandlers.ts @@ -1,7 +1,7 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { OperationListModel } from "./operationListModel"; -export class OperationListHandlers implements IWidgetHandler { +export class OperationListHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new OperationListModel(); } diff --git a/src/components/products/product-apis/productApisHandlers.ts b/src/components/products/product-apis/productApisHandlers.ts index 2b61e795..e19b5740 100644 --- a/src/components/products/product-apis/productApisHandlers.ts +++ b/src/components/products/product-apis/productApisHandlers.ts @@ -1,13 +1,13 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { ProductApisModel } from "./productApisModel"; -export class ProductApisHandlers implements IWidgetHandler { +export class ProductApisHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ProductApisModel("list") } } -export class ProductApisTilesHandlers implements IWidgetHandler { +export class ProductApisTilesHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ProductApisModel("tiles") } diff --git a/src/components/products/product-details/productDetailsHandlers.ts b/src/components/products/product-details/productDetailsHandlers.ts index e9485fb8..eb2d73af 100644 --- a/src/components/products/product-details/productDetailsHandlers.ts +++ b/src/components/products/product-details/productDetailsHandlers.ts @@ -1,7 +1,7 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { ProductDetailsModel } from "./productDetailsModel"; -export class ProductDetailsHandlers implements IWidgetHandler { +export class ProductDetailsHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ProductDetailsModel() } diff --git a/src/components/products/product-list/productListHandlers.ts b/src/components/products/product-list/productListHandlers.ts index fc2808ba..cc712cd4 100644 --- a/src/components/products/product-list/productListHandlers.ts +++ b/src/components/products/product-list/productListHandlers.ts @@ -1,19 +1,19 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { ProductListModel } from "./productListModel"; -export class ProductListHandlers implements IWidgetHandler { +export class ProductListHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ProductListModel("list"); } } -export class ProductListDropdownHandlers implements IWidgetHandler { +export class ProductListDropdownHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ProductListModel("dropdown"); } } -export class ProductListTilesHandlers implements IWidgetHandler { +export class ProductListTilesHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ProductListModel("tiles"); } diff --git a/src/components/products/product-subscribe/productSubscribeHandlers.ts b/src/components/products/product-subscribe/productSubscribeHandlers.ts index 045e0d67..c64ff65b 100644 --- a/src/components/products/product-subscribe/productSubscribeHandlers.ts +++ b/src/components/products/product-subscribe/productSubscribeHandlers.ts @@ -1,7 +1,7 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { ProductSubscribeModel } from "./productSubscribeModel"; -export class ProductSubscribeHandlers implements IWidgetHandler { +export class ProductSubscribeHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ProductSubscribeModel() } diff --git a/src/components/products/product-subscriptions/productSubscriptionsHandlers.ts b/src/components/products/product-subscriptions/productSubscriptionsHandlers.ts index 0105df70..289348bf 100644 --- a/src/components/products/product-subscriptions/productSubscriptionsHandlers.ts +++ b/src/components/products/product-subscriptions/productSubscriptionsHandlers.ts @@ -2,7 +2,7 @@ import { ProductSubscriptionsModel } from "./productSubscriptionsModel"; -export class ProductSubscriptionsHandlers implements IWidgetHandler { +export class ProductSubscriptionsHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ProductSubscriptionsModel(); } diff --git a/src/components/reports/reportsHandlers.ts b/src/components/reports/reportsHandlers.ts index c7ddc2d1..7b8fd492 100644 --- a/src/components/reports/reportsHandlers.ts +++ b/src/components/reports/reportsHandlers.ts @@ -2,7 +2,7 @@ import { ReportsModel } from "./reportsModel"; -export class ReportsHandlers implements IWidgetHandler { +export class ReportsHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ReportsModel() } diff --git a/src/components/users/change-password/changePasswordHandlers.ts b/src/components/users/change-password/changePasswordHandlers.ts index 192d5824..3dddc4e1 100644 --- a/src/components/users/change-password/changePasswordHandlers.ts +++ b/src/components/users/change-password/changePasswordHandlers.ts @@ -1,7 +1,7 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { ChangePasswordModel } from "./changePasswordModel"; -export class ChangePasswordHandlers implements IWidgetHandler { +export class ChangePasswordHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ChangePasswordModel() } diff --git a/src/components/users/confirm-password/confirmPasswordHandlers.ts b/src/components/users/confirm-password/confirmPasswordHandlers.ts index 06148985..49e47f14 100644 --- a/src/components/users/confirm-password/confirmPasswordHandlers.ts +++ b/src/components/users/confirm-password/confirmPasswordHandlers.ts @@ -2,7 +2,7 @@ import { ConfirmPasswordModel } from "./confirmPasswordModel"; -export class ConfirmPasswordHandlers implements IWidgetHandler { +export class ConfirmPasswordHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ConfirmPasswordModel() } diff --git a/src/components/users/profile/profileHandlers.ts b/src/components/users/profile/profileHandlers.ts index 1f36ab93..8fadd2e6 100644 --- a/src/components/users/profile/profileHandlers.ts +++ b/src/components/users/profile/profileHandlers.ts @@ -1,7 +1,7 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { ProfileModel } from "./profileModel"; -export class ProfileHandlers implements IWidgetHandler { +export class ProfileHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ProfileModel() } diff --git a/src/components/users/reset-password/resetPasswordHandlers.ts b/src/components/users/reset-password/resetPasswordHandlers.ts index 04eb2c7f..9e6e84e7 100644 --- a/src/components/users/reset-password/resetPasswordHandlers.ts +++ b/src/components/users/reset-password/resetPasswordHandlers.ts @@ -1,7 +1,7 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { ResetPasswordModel } from "./resetPasswordModel"; -export class ResetPasswordHandlers implements IWidgetHandler { +export class ResetPasswordHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ResetPasswordModel() } diff --git a/src/components/users/signin-social/signinSocialHandlers.ts b/src/components/users/signin-social/signinSocialHandlers.ts index e1b3816c..f8abd53f 100644 --- a/src/components/users/signin-social/signinSocialHandlers.ts +++ b/src/components/users/signin-social/signinSocialHandlers.ts @@ -2,7 +2,7 @@ import { SigninSocialModel } from "./signinSocialModel"; -export class SigninSocialHandlers implements IWidgetHandler { +export class SigninSocialHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { const model = new SigninSocialModel(); model.aadLabel = "Azure Active Directory"; diff --git a/src/components/users/signin/signinHandlers.ts b/src/components/users/signin/signinHandlers.ts index d7e1d789..da6b7c60 100644 --- a/src/components/users/signin/signinHandlers.ts +++ b/src/components/users/signin/signinHandlers.ts @@ -1,7 +1,7 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { SigninModel } from "./signinModel"; -export class SigninHandlers implements IWidgetHandler { +export class SigninHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new SigninModel() } diff --git a/src/components/users/signup-social/signupSocialHandlers.ts b/src/components/users/signup-social/signupSocialHandlers.ts index c23b9376..a5fd7e15 100644 --- a/src/components/users/signup-social/signupSocialHandlers.ts +++ b/src/components/users/signup-social/signupSocialHandlers.ts @@ -1,7 +1,7 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { SignupSocialModel } from "./signupSocialModel"; -export class SignupSocialHandlers implements IWidgetHandler { +export class SignupSocialHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new SignupSocialModel() } diff --git a/src/components/users/signup/signupHandlers.ts b/src/components/users/signup/signupHandlers.ts index fc684d2e..5748e5a9 100644 --- a/src/components/users/signup/signupHandlers.ts +++ b/src/components/users/signup/signupHandlers.ts @@ -2,7 +2,7 @@ import { SignupModel } from "./signupModel"; -export class SignupHandlers implements IWidgetHandler { +export class SignupHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new SignupModel() } diff --git a/src/components/users/subscriptions/subscriptionsHandlers.ts b/src/components/users/subscriptions/subscriptionsHandlers.ts index a1c37255..5e683abd 100644 --- a/src/components/users/subscriptions/subscriptionsHandlers.ts +++ b/src/components/users/subscriptions/subscriptionsHandlers.ts @@ -1,7 +1,7 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { SubscriptionsModel } from "./subscriptionsModel"; -export class SubscriptionsHandlers implements IWidgetHandler { +export class SubscriptionsHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new SubscriptionsModel() } diff --git a/src/components/users/validation-summary/validationSummaryHandlers.ts b/src/components/users/validation-summary/validationSummaryHandlers.ts index b280a214..9699af1a 100644 --- a/src/components/users/validation-summary/validationSummaryHandlers.ts +++ b/src/components/users/validation-summary/validationSummaryHandlers.ts @@ -2,7 +2,7 @@ import { IWidgetHandler } from "@paperbits/common/editing"; import { ValidationSummaryModel } from "../validation-summary/validationSummaryModel"; -export class ValidationSummaryHandlers implements IWidgetHandler { +export class ValidationSummaryHandlers implements IWidgetHandler { public async getWidgetModel(): Promise { return new ValidationSummaryModel() } diff --git a/src/startup.design.ts b/src/startup.design.ts index 9d2079e8..ae5c069c 100644 --- a/src/startup.design.ts +++ b/src/startup.design.ts @@ -7,11 +7,12 @@ import { FormsDesignModule } from "@paperbits/forms/forms.design.module"; import { StylesDesignModule } from "@paperbits/styles/styles.design.module"; import { ApimDesignModule } from "./apim.design.module"; import { SessionExpirationErrorHandler } from "./errors/sessionExpirationErrorHandler"; -import { ComponentBinder } from "@paperbits/common/editing"; +import { ComponentBinder } from "@paperbits/common/components"; import { ReactModule } from "@paperbits/react/react.module"; import { LeftPanel } from "./admin/leftPanel"; import { RightPanel } from "./admin/rightPanel"; + /* Initializing dependency injection container */ const injector = new InversifyInjector(); injector.bindToCollection("autostart", SessionExpirationErrorHandler); diff --git a/src/themes/designer/styles/arrows.scss b/src/themes/designer/styles/arrows.scss index 09b5c301..6c6b7228 100644 --- a/src/themes/designer/styles/arrows.scss +++ b/src/themes/designer/styles/arrows.scss @@ -1,4 +1,6 @@ -@media (min-width: $breakpoint-lg) { +@import "animation.scss"; +@import "variables.scss"; +@media (min-width: $breakpoint-lg) { .arrow-self { background-image: data-uri("../svgs/arrow.svg"); background-size: auto 80%; diff --git a/src/themes/designer/styles/balloons.scss b/src/themes/designer/styles/balloons.scss index 5c55cf2e..95cee5c1 100644 --- a/src/themes/designer/styles/balloons.scss +++ b/src/themes/designer/styles/balloons.scss @@ -1,4 +1,8 @@ -$tip-width: 10px; +@import "animation.scss"; +@import "variables.scss"; +@import "mixins.scss"; + +$tip-width: 10px; .balloon { @include surface(); @@ -16,6 +20,36 @@ } } +.add-block-container { + width: 100%; + max-height: 600px; + .remove-block { + background-color: rgb(43, 135, 218); + background-repeat: no-repeat; + position: absolute; + top: 10px; + right: 10px; + .paperbits-icon { + padding: 0; + } + } +} + +.zoom-selector-item { + width: 100%; + height: 120px; + overflow: hidden; + margin: 8px 2px 2px 2px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); +} + +.zoom-item { + transform: scale(0.32); + transform-origin: 0% 0%; + transform-origin: top left; + pointer-events: none; +} + .balloon-tip { position: fixed; background-color: $balloon-background; diff --git a/src/themes/designer/styles/buttons.scss b/src/themes/designer/styles/buttons.scss index 567b338a..3ef80388 100644 --- a/src/themes/designer/styles/buttons.scss +++ b/src/themes/designer/styles/buttons.scss @@ -1,4 +1,7 @@ -.btn { +@import "variables.scss"; +@import "mixins.scss"; + +.btn { border: none; background: none; color: $color-base; diff --git a/src/themes/designer/styles/draggables.scss b/src/themes/designer/styles/draggables.scss index e1a46cf8..1e8db0a9 100644 --- a/src/themes/designer/styles/draggables.scss +++ b/src/themes/designer/styles/draggables.scss @@ -1,4 +1,6 @@ -.dragtarget { +@import "variables.scss"; + +.dragtarget { width: 100px; height: 100px; border: 1px dashed #ccc; diff --git a/src/themes/designer/styles/dropbucket.scss b/src/themes/designer/styles/dropbucket.scss index 6d8f6b7a..e6f17a67 100644 --- a/src/themes/designer/styles/dropbucket.scss +++ b/src/themes/designer/styles/dropbucket.scss @@ -1,4 +1,9 @@ -dropbucket { +@import "variables.scss"; +@import "toolboxes.scss"; +@import "animation.scss"; +@import "buttons.scss"; + +dropbucket { right: 20px; bottom: 20px; position: fixed; diff --git a/src/themes/designer/styles/dropzones.scss b/src/themes/designer/styles/dropzones.scss index c4e190fc..401f5fb4 100644 --- a/src/themes/designer/styles/dropzones.scss +++ b/src/themes/designer/styles/dropzones.scss @@ -1,4 +1,7 @@ -[alignment] { +@import "variables.scss"; +@import "mixins.scss"; + +[alignment] { position: absolute; top: initial; left: initial; diff --git a/src/themes/designer/styles/editors/colorSelector.scss b/src/themes/designer/styles/editors/colorSelector.scss index 0b61534a..d398f3fa 100644 --- a/src/themes/designer/styles/editors/colorSelector.scss +++ b/src/themes/designer/styles/editors/colorSelector.scss @@ -46,7 +46,6 @@ padding: 0; line-height: 30px; overflow: hidden; - text-align: center; &.pseudo-transparent-bckg { @include pseudo-transparent-bckg(); diff --git a/src/themes/designer/styles/forms.scss b/src/themes/designer/styles/forms.scss index 1e8a2e62..39aa4723 100644 --- a/src/themes/designer/styles/forms.scss +++ b/src/themes/designer/styles/forms.scss @@ -1,4 +1,8 @@ -.form { +@import "variables.scss"; +@import "mixins.scss"; +@import "icons-toolboxes.scss"; + +.form { margin: 0; padding: 0; border: none; @@ -217,3 +221,64 @@ hr { min-width: 150px; min-height: 150px; } + +summary { + display: block; + cursor: pointer; + outline: 0; +} + +summary::-webkit-details-marker { + display: none; +} + +summary::-webkit-details-marker { + display: none !important; +} + +details { + display: block; + white-space: nowrap; + position: relative; + padding-left: 20px; + margin: 10px 0; + + &[open]:before { + content: ""; + left: 7px; + position: absolute; + top: 25px; + height: calc(100% - 25px); + border-left: 1px dotted #ccc; + width: 1px; + } + + &[open] > summary:before { + left: -25px; + top: 1px; + @extend .paperbits-icon; + @extend .paperbits-circle-delete; + color: $collapse-button-color; + } + + & > summary { + font-weight: bold; + margin-bottom: 10px; + + &:before { + left: -25px; + top: 1px; + position: absolute; + @extend .paperbits-icon; + @extend .paperbits-circle-add; + color: $collapse-button-color; + display: inline-block; + width: 1.6rem; + text-align: center; + } + + &::-webkit-details-marker { + display: none; + } + } +} diff --git a/src/themes/designer/styles/grid.scss b/src/themes/designer/styles/grid.scss index 90c70ca2..2039acb8 100644 --- a/src/themes/designer/styles/grid.scss +++ b/src/themes/designer/styles/grid.scss @@ -6,12 +6,9 @@ column-gap: 0 !important; margin: 5px !important; width: 80px !important; - height: 50px !important; float: left; - padding: 2px; - &:hover, - &:focus { + &:hover { @include selection(15px, -5px); cursor: pointer; } @@ -20,11 +17,11 @@ .snippet-grid-cell { background: #d9d9d9; outline: 1px solid gray; - min-width: 10px; - min-height: 10px; + min-width: 15px; + min-height: 20px; margin: 2px; - &[future-role="article"] { + &[role="article"] { background: #bfbfbf; } } diff --git a/src/themes/designer/styles/layouts.scss b/src/themes/designer/styles/layouts.scss index 7690e5b5..54d037d4 100644 --- a/src/themes/designer/styles/layouts.scss +++ b/src/themes/designer/styles/layouts.scss @@ -1,4 +1,7 @@ @use "sass:math"; +@import "mixins.scss"; +@import "variables.scss"; + paperbits-code, paperbits-googlemaps, @@ -106,9 +109,9 @@ widget { width: 80px; white-space: nowrap; margin: 5px; - @include selection(15px, -5px); &:hover { + @include selection(15px, -5px); cursor: pointer; } } @@ -155,7 +158,10 @@ widget { line-height: 0; width: 120px; cursor: pointer; - @include selection(15px, -10px); + + &:hover { + @include selection(15px, -10px); + } } .section-container-cfg { diff --git a/src/themes/designer/styles/lightbox.scss b/src/themes/designer/styles/lightbox.scss index 2ac19243..69dfc4dc 100644 --- a/src/themes/designer/styles/lightbox.scss +++ b/src/themes/designer/styles/lightbox.scss @@ -1,3 +1,5 @@ +@import "variables.scss"; + // Vars ---------------------------------------------------------------- // $basicLightbox__background: rgba(0, 0, 0, .8) !default; $basicLightbox__zIndex: 100000 !default; diff --git a/src/themes/designer/styles/lists.scss b/src/themes/designer/styles/lists.scss index 6a792dad..1db206d3 100644 --- a/src/themes/designer/styles/lists.scss +++ b/src/themes/designer/styles/lists.scss @@ -1,4 +1,8 @@ -.list-item-group { +@import "variables.scss"; +@import "mixins.scss"; +@import "icons-toolboxes.scss"; + +.list-item-group { width: 100%; .list-item { @@ -34,10 +38,10 @@ height: 16px; left: -16px; position: absolute; - @include selection(8px, -3px); &:focus, &:hover { + @include selection(8px, -3px); outline: none; cursor: pointer; } @@ -62,7 +66,6 @@ text-decoration: none; color: $color-base; padding: 0 5px; - @include selection(5px); .paperbits-icon { padding: 0 5px; @@ -81,6 +84,14 @@ outline: none; } + &:hover { + @include selection(); + } + + &:focus { + @include selection(); + } + &.selected { font-weight: bold; } diff --git a/src/themes/designer/styles/mixins.scss b/src/themes/designer/styles/mixins.scss index 9af03c28..3c78d3b5 100644 --- a/src/themes/designer/styles/mixins.scss +++ b/src/themes/designer/styles/mixins.scss @@ -1,4 +1,6 @@ -@mixin hide-text() { +@import "variables.scss"; + +@mixin hide-text() { text-indent: -9999px; white-space: nowrap; } @@ -36,11 +38,10 @@ position: absolute; } @mixin tabable() { - @include selection(); - &:focus, &:hover { outline: none; + @include selection(); } &:active, @@ -49,51 +50,47 @@ } } @mixin selection($size: 10px, $spacing: 0) { - @include selectionUneven($size, $size, $spacing); + @include selectionUneven($size, $size, $spacing); } + @mixin selectionUneven($sizeX: 10px, $sizeY: 10px, $spacing: 0) { - &:after { - @include fit($spacing); - @include no-pointer-events(); - background: - linear-gradient(to right, $selection-corners-color 1px, transparent 1px) 0 0, - linear-gradient(to right, $selection-corners-color 1px, transparent 1px) 0 100%, - linear-gradient(to left, $selection-corners-color 1px, transparent 1px) 100% 0, - linear-gradient(to left, $selection-corners-color 1px, transparent 1px) 100% 100%, - linear-gradient(to bottom, $selection-corners-color 1px, transparent 1px) 0 0, - linear-gradient(to bottom, $selection-corners-color 1px, transparent 1px) 100% 0, - linear-gradient(to top, $selection-corners-color 1px, transparent 1px) 0 100%, - linear-gradient(to top, $selection-corners-color 1px, transparent 1px) 100% 100%; - background-repeat: no-repeat; - background-size: 0 0; - z-index: $z-index-selection; - content: ''; - } - &:active:after, - &:focus:after, - &:hover:after { - background-size: $sizeX $sizeY; - } + &:after { + @include fit($spacing); + @include no-pointer-events(); + background: linear-gradient(to right, $selection-corners-color 1px, transparent 1px) 0 0, linear-gradient(to right, $selection-corners-color 1px, transparent 1px) 0 100%, linear-gradient(to left, $selection-corners-color 1px, transparent 1px) 100% 0, linear-gradient(to left, $selection-corners-color 1px, transparent 1px) 100% 100%, linear-gradient(to bottom, $selection-corners-color 1px, transparent 1px) 0 0, linear-gradient(to bottom, $selection-corners-color 1px, transparent 1px) 100% 0, linear-gradient(to top, $selection-corners-color 1px, transparent 1px) 0 100%, linear-gradient(to top, $selection-corners-color 1px, transparent 1px) 100% 100%; + background-repeat: no-repeat; + background-size: 0 0; + z-index: $z-index-selection; + content: ''; + } + + &:active:after, + &:focus:after, + &:hover:after { + background-size: $sizeX $sizeY; + } } + @mixin surface() { - @include box-shadow(1px 1px 20px 1px rgba(0, 0, 0, 0.15)); - margin: 0; - background-color: $toolbox-background; - border-radius: $toolbox-border-radius; - font-family: $font-family-base; - font-weight: $font-weight-base; - z-index: $z-index-base; - list-style: none; - user-select: none; - font-size: $font-size-base; + @include box-shadow(1px 1px 20px 1px rgba(0, 0, 0, 0.15)); + margin: 0; + background-color: $toolbox-background; + border-radius: $toolbox-border-radius; + font-family: $font-family-base; + font-weight: $font-weight-base; + z-index: $z-index-base; + list-style: none; + user-select: none; + font-size: $font-size-base; } + @mixin pseudo-transparent-bckg { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAA3NCSVQICAjb4U/gAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACuoAAArqAVDM774AAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAANElEQVQ4T2P8DwQMeMDr16+hLOyACUqTDUYNGAwGML569QpvOhAVFYWysIPRQBwGBjAwAABDVwrY3ACsDwAAAABJRU5ErkJggg=="); - background-size: 10px; + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAA3NCSVQICAjb4U/gAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACuoAAArqAVDM774AAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAANElEQVQ4T2P8DwQMeMDr16+hLOyACUqTDUYNGAwGML569QpvOhAVFYWysIPRQBwGBjAwAABDVwrY3ACsDwAAAABJRU5ErkJggg=="); + background-size: 10px; } .fit { - @include fit(0); + @include fit(0); } @mixin slider-thumb { diff --git a/src/themes/designer/styles/scaffolding.scss b/src/themes/designer/styles/scaffolding.scss index b9175215..048fa484 100644 --- a/src/themes/designer/styles/scaffolding.scss +++ b/src/themes/designer/styles/scaffolding.scss @@ -1,3 +1,4 @@ +@import "mixins.scss"; html, body { width: 100%; @@ -9,10 +10,6 @@ body { * { @include box-sizing(border-box); - //position: relative; -} - -app * { position: relative; } diff --git a/src/themes/designer/styles/slider.scss b/src/themes/designer/styles/slider.scss index b9408577..cfd25e69 100644 --- a/src/themes/designer/styles/slider.scss +++ b/src/themes/designer/styles/slider.scss @@ -1,3 +1,5 @@ +@import "variables.scss"; + .slider-display { width: 100%; height: 25px; diff --git a/src/themes/designer/styles/tabs.scss b/src/themes/designer/styles/tabs.scss index 8ed0deef..00a7e3ce 100644 --- a/src/themes/designer/styles/tabs.scss +++ b/src/themes/designer/styles/tabs.scss @@ -16,12 +16,12 @@ padding: 0 10px; text-decoration: none; font-weight: bold; - @include selection(); &:active, &:focus, &:hover { outline: none; + @include selection(); } } diff --git a/src/themes/designer/styles/toasts.scss b/src/themes/designer/styles/toasts.scss index afbf8165..d4b0506c 100644 --- a/src/themes/designer/styles/toasts.scss +++ b/src/themes/designer/styles/toasts.scss @@ -1,4 +1,8 @@ -.toasts { +@import "variables.scss"; +@import "mixins.scss"; +@import "animation.scss"; + +.toasts { position: fixed; right: 40px; bottom: 50px; @@ -11,7 +15,7 @@ align-items: center; justify-content: center; - width: 350px; + max-width: 350px; .toast-indicator { width: 30px; diff --git a/src/themes/designer/styles/toolbox.paragraph.scss b/src/themes/designer/styles/toolbox.paragraph.scss index 3610146b..4f1054aa 100644 --- a/src/themes/designer/styles/toolbox.paragraph.scss +++ b/src/themes/designer/styles/toolbox.paragraph.scss @@ -1,4 +1,8 @@ -.tools-paragraph-style { +@import "variables.scss"; +@import "buttons.scss"; + + +.tools-paragraph-style { @include tabable(); display: block; padding: 5px 10px; diff --git a/src/themes/designer/styles/toolboxes.scss b/src/themes/designer/styles/toolboxes.scss index 507b5969..14c0591c 100644 --- a/src/themes/designer/styles/toolboxes.scss +++ b/src/themes/designer/styles/toolboxes.scss @@ -1,4 +1,10 @@ -h1, +@import "variables.scss"; +@import "mixins.scss"; +@import "icons-toolboxes.scss"; +@import "animation.scss"; +@import "layouts.scss"; + +h1, h2 { font-family: $font-family-base; color: $color-base; diff --git a/src/themes/designer/styles/typography.scss b/src/themes/designer/styles/typography.scss index 83d48050..8d6baefa 100644 --- a/src/themes/designer/styles/typography.scss +++ b/src/themes/designer/styles/typography.scss @@ -40,40 +40,4 @@ src: url('fonts/paperbits.eot') format('embedded-opentype'), url('fonts/paperbits.woff2') format('woff2'), url('fonts/paperbits.woff') format('woff'), url('fonts/paperbits.ttf') format('truetype'), url('fonts/paperbits.svg') format('svg'); font-weight: normal; font-style: normal; -} -@font-face { - font-family: 'SegoeUI'; - font-style: normal; - font-weight: 400; - src: url('fonts/SegoeUI-Regular.ttf') format('truetype'); -} -@font-face { - font-family: 'SegoeUI'; - font-style: italic; - font-weight: 400; - src: url('fonts/SegoeUI-Italic.ttf') format('truetype'); -} -@font-face { - font-family: 'SegoeUI'; - font-style: normal; - font-weight: 700; - src: url('fonts/SegoeUI-Bold.ttf') format('truetype'); -} -@font-face { - font-family: 'SegoeUI'; - font-style: italic; - font-weight: 700; - src: url('fonts/SegoeUI-BoldItalic.ttf') format('truetype'); -} -@font-face { - font-family: 'SegoeUI'; - font-style: normal; - font-weight: 300; - src: url('fonts/SegoeUI-Light.ttf') format('truetype'); -} -@font-face { - font-family: 'OpenSans'; - font-style: italic; - font-weight: 300; - src: url('fonts/SegoeUI-LightItalic.ttf') format('truetype'); } \ No newline at end of file diff --git a/src/themes/designer/styles/utils.scss b/src/themes/designer/styles/utils.scss index 2fac46e2..42038278 100644 --- a/src/themes/designer/styles/utils.scss +++ b/src/themes/designer/styles/utils.scss @@ -1,3 +1,5 @@ +@import "variables.scss"; + .text-center { text-align: center; } diff --git a/src/themes/designer/styles/widgets.scss b/src/themes/designer/styles/widgets.scss index 9e665b8d..649eae67 100644 --- a/src/themes/designer/styles/widgets.scss +++ b/src/themes/designer/styles/widgets.scss @@ -1,5 +1,4 @@ -@import "widgets/custom-widget-list.scss"; -@import "widgets/map.scss"; +@import "widgets/map.scss"; @import "widgets/video.scss"; @import "editors/videoEditor.scss"; @import "editors/rowLayoutSelector.scss"; diff --git a/src/themes/website/styles/buttons.scss b/src/themes/website/styles/buttons.scss index 0736b4ed..2268215d 100644 --- a/src/themes/website/styles/buttons.scss +++ b/src/themes/website/styles/buttons.scss @@ -1,3 +1,11 @@ +.button { + &.button-noborder { + border: none; + background: transparent; + box-shadow: none; + } +} + .btn-centered-vert { display: flex; align-items: center; diff --git a/src/themes/website/styles/forms.scss b/src/themes/website/styles/forms.scss index 2b5f67f6..e8eb1fa2 100644 --- a/src/themes/website/styles/forms.scss +++ b/src/themes/website/styles/forms.scss @@ -1,5 +1,14 @@ @import "variables.scss"; +form { + padding: 10px; + flex-grow: 1; +} + +.form-control { + width: 100%; +} + .form-inline { display: flex; flex-flow: row wrap; @@ -10,6 +19,33 @@ width: 100%; } +.form-check-inline { + display: inline-block; + margin-right: 1rem; +} + +.invalid-feedback { + margin-top: 0.25rem; + font-size: 0.875em; + color: $form-invalid-color; + display: none; +} + +:invalid~.invalid-feedback, +.invalid~.invalid-feedback { + display: block; +} + +form.needs-validation:invalid { + [type="submit"] { + pointer-events: none; + } +} + +input[type="range"] { + width: 100%; +} + @media (min-width: 576px) { .form-inline label { display: flex; @@ -20,7 +56,6 @@ .form-inline .form-group { display: flex; - flex: 0 0 auto; flex-flow: row wrap; align-items: center; margin-bottom: 0; @@ -41,8 +76,8 @@ display: inline-block; } - .form-inline .custom-select, - .form-inline .input-group { + .form-inline .input-group, + .form-inline .custom-select { width: auto; } @@ -58,165 +93,15 @@ position: relative; flex-shrink: 0; margin-top: 0; - margin-right: .25rem; + margin-right: 0.25rem; margin-left: 0; } } -.form-label { - padding: .375rem .75rem; -} - -.form-control { - display: block; - padding: .375rem .75rem; - font-size: 1rem; - line-height: 1.5; - color: $form-control-color; - background-color: $form-control-bg-color; - background-clip: padding-box; - border: 1px solid $form-control-border-color; - border-radius: $form-control-border-radius; - width: 100%; - - &.form-control-light { - border-top: none; - border-left: none; - border-right: none; - background-color: transparent; - } -} - - - -.form-check-inline { - display: inline-flex; - align-items: center; - padding-left: 0; - margin-right: .75rem; -} - -.form-check { - position: relative; - display: block; - padding-left: 1.25rem; -} - -.form-group { - margin-bottom: 1rem; -} - -.form-group-inline { - display: flex; - align-items: center; - - label { - margin: 5px 30px 5px 0; - } -} - -.invalid-feedback { - display: block; - flex-basis: 100%; - margin-top: .25rem; - font-size: 80%; - color: #dc3545; -} - -.expanded { - .icon-chevron-down { - // TODO: Introduce proper class for dropdown toggle - transform: rotate(180deg); - } -} - -input[type=search] { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - @extend .icon-svg-magnifier; - background-position: 5px center; - background-size: 1em; - background-repeat: no-repeat; - padding-left: calc(1em + 10px); -} - -.input-label { - margin-bottom: 5px; - - .item-label { - padding-right: 5px; - } -} - -.input[type=password]::-ms-reveal { - display: none; -} - -.input[type=password]::-ms-clear { - display: none; -} - -.switch { - position: relative; - display: inline-block; - width: $switch-width; - height: $switch-height; - margin: 10px; - - input[type=checkbox] { - opacity: 0; - width: 0; - height: 0; - - &:checked + .slider { - background: $switch-background-color-on; - } - - &:checked + .slider:before { - transform: translateX(26px); - } - } - - .slider { - position: absolute; - cursor: pointer; - border: 1px solid #ffffff; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: $switch-background-color-off; - transition: .4s; - - &.round { - border-radius: 34px; - - &:before { - border-radius: 50%; - } - } - - &:before { - position: absolute; - content: ""; - height: $switch-trigger-size; - width: $switch-trigger-size; - left: $switch-trigger-gap; - bottom: $switch-trigger-gap + 1px; - background: #ffffff; - forced-color-adjust: none; - border: 1px solid #ffffff; - transition: .4s; - } - } -} - .input-group { padding: 0; - display: inline-flex; + display: flex; flex-wrap: wrap; - width: 100%; & > :not(:first-child):not(.dropdown):not(.invalid-feedback) { border-top-left-radius: 0; @@ -224,7 +109,7 @@ input[type=search] { margin-left: -1px; } - &.has-validation > :nth-last-child(n+3) { + &.has-validation > :nth-last-child(n + 3) { border-top-right-radius: 0; border-bottom-right-radius: 0; margin-left: -1px; @@ -235,9 +120,9 @@ input[type=search] { border-bottom-right-radius: 0; } - .form-control { - flex: 1; + flex-grow: 1; + width: auto; } .input-group-addon { @@ -256,42 +141,31 @@ input[type=search] { left: 0; right: 0; } -} -.select-badge { - margin: 0 .5em; - font-family: $font-family-base; - font-size: 13px; + .select-badge { + margin: 0 .5em; + font-family: $font-family-base; + font-size: 13px; - select { - padding: .625em 1em; - padding-right: 2.75em; - border: solid white 1px; - border-radius: .875em; - background: #D9D9D9; - outline: none; - - -webkit-appearance: none; - -moz-appearance: none; - } - - .arrow { - position: absolute; - width: 2em; - height: 100%; - top: 1px; - right: 2px; - border-left: solid white 1px; - pointer-events: none; - /* - .icon-emb { - transition: transform .5s ease; + select { + padding: .625em 1em; + padding-right: 2.75em; + border: solid white 1px; + border-radius: .875em; + background: #D9D9D9; + outline: none; + -webkit-appearance: none; + -moz-appearance: none; + } + + .arrow { + position: absolute; + width: 2em; + height: 100%; + top: 1px; + right: 2px; + border-left: solid white 1px; + pointer-events: none; } - */ } - /* - select:focus + .arrow .icon-emb { - transform: rotate(-180deg); - } - */ } diff --git a/src/themes/website/styles/grids.scss b/src/themes/website/styles/grids.scss new file mode 100644 index 00000000..63bf8280 --- /dev/null +++ b/src/themes/website/styles/grids.scss @@ -0,0 +1,10 @@ +$console-parameters-row-gap: 10px; + +.console-parameters-row { + display: grid; + grid-template-columns: 1fr 1fr 30px; + column-gap: $console-parameters-row-gap; + justify-items: start; + margin-bottom: $console-parameters-row-gap; + align-items: baseline; +} diff --git a/src/themes/website/styles/icons.scss b/src/themes/website/styles/icons.scss index 79168c7f..d79fc3b6 100644 --- a/src/themes/website/styles/icons.scss +++ b/src/themes/website/styles/icons.scss @@ -24,6 +24,17 @@ -moz-osx-font-smoothing: grayscale; } +.icon-emb { + display: inline-block; + font-family: "Icons Embedded" !important; + font-size: 1.1em; + line-height: inherit; + text-transform: none; + flex-shrink: 0; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + .icon-emb-simple-remove:before { content: "\e90f"; } diff --git a/src/themes/website/styles/navs.scss b/src/themes/website/styles/navs.scss index 234dd2bf..424a44f1 100644 --- a/src/themes/website/styles/navs.scss +++ b/src/themes/website/styles/navs.scss @@ -29,8 +29,6 @@ &.show { display: block; - max-height: 500px; - overflow-x: auto; } } @@ -41,6 +39,7 @@ .nav-item { padding: 0; margin: 0; + max-width: 100%; } .nav-link { diff --git a/src/themes/website/styles/reboot.scss b/src/themes/website/styles/reboot.scss index c8a0ad33..b59fece8 100644 --- a/src/themes/website/styles/reboot.scss +++ b/src/themes/website/styles/reboot.scss @@ -2,6 +2,8 @@ ::after, ::before { box-sizing: border-box; + min-width: 0; + min-height: 0; } html { font-family: sans-serif; diff --git a/src/themes/website/styles/scrollbars.scss b/src/themes/website/styles/scrollbars.scss new file mode 100644 index 00000000..b32a9532 --- /dev/null +++ b/src/themes/website/styles/scrollbars.scss @@ -0,0 +1,107 @@ +/* + * Container style + */ + .ps { + overflow: hidden !important; + overflow-anchor: none; + touch-action: auto; +} + +/* + * Scrollbar rail styles + */ +.ps__rail-x { + display: none; + opacity: 0; + transition: background-color .2s linear, opacity .2s linear; + height: 15px; + /* there must be 'bottom' or 'top' for ps__rail-x */ + bottom: 0; + /* please don't change 'position' */ + position: absolute; + border-radius: 20px; +} + +.ps__rail-y { + display: none; + opacity: 0; + transition: background-color .2s linear, opacity .2s linear; + width: 15px; + /* there must be 'right' or 'left' for ps__rail-y */ + right: 0; + /* please don't change 'position' */ + position: absolute; + border-radius: 20px; +} + +.ps--active-x > .ps__rail-x, +.ps--active-y > .ps__rail-y { + display: block; + background-color: transparent; +} + +.ps--focus > .ps__rail-x, +.ps--focus > .ps__rail-y, +.ps--scrolling-x > .ps__rail-x, +.ps--scrolling-y > .ps__rail-y, +.ps:hover > .ps__rail-x, +.ps:hover > .ps__rail-y { + opacity: .6; +} + +.ps__rail-x:focus, +.ps__rail-x:hover, +.ps__rail-y:focus, +.ps__rail-y:hover { + background-color: $scrollbar-rail-active-bg; + opacity: .9; +} + +/* + * Scrollbar thumb styles + */ +.ps__thumb-x { + background-color: $scrollbar-thumb-bg; + border-radius: 6px; + transition: background-color .2s linear, height .2s ease-in-out; + height: 6px; + /* there must be 'bottom' for ps__thumb-x */ + bottom: 2px; + /* please don't change 'position' */ + position: absolute; +} + +.ps__thumb-y { + background-color: $scrollbar-thumb-bg; + border-radius: 6px; + transition: background-color .2s linear, width .2s ease-in-out; + width: 6px; + /* there must be 'right' for ps__thumb-y */ + right: 2px; + /* please don't change 'position' */ + position: absolute; +} + +.ps__rail-x:focus > .ps__thumb-x, +.ps__rail-x:hover > .ps__thumb-x { + background-color: $scrollbar-thumb-active-bg; + height: 11px; +} + +.ps__rail-y:focus > .ps__thumb-y, +.ps__rail-y:hover > .ps__thumb-y { + background-color: $scrollbar-thumb-active-bg; + width: 11px; +} + +/* MS supports */ +@supports (-ms-overflow-style: none) { + .ps { + overflow: auto !important; + } +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .ps { + overflow: auto !important; + } +} \ No newline at end of file diff --git a/src/themes/website/styles/styles.design.scss b/src/themes/website/styles/styles.design.scss index 0422023a..27e312fa 100644 --- a/src/themes/website/styles/styles.design.scss +++ b/src/themes/website/styles/styles.design.scss @@ -48,6 +48,7 @@ $style-guide-color: #000; } .style-guide { + padding-bottom: 50px; .style-card { cursor: default; color: $style-guide-color; @@ -56,6 +57,15 @@ $style-guide-color: #000; .style-card-body { padding: 10px; + &:before { + content: ""; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 9999; + } } &.transparent { @@ -212,32 +222,86 @@ $style-guide-color: #000; } } +.style-guide { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .style-guide { + max-width: 540px; + } +} + +@media (min-width: 768px) { + .style-guide { + max-width: 720px; + } +} + +@media (min-width: 992px) { + .style-guide { + max-width: 960px; + } +} + +@media (min-width: 1200px) { + .style-guide { + max-width: 1140px; + } +} + +.style-guide-fluid, +.style-guide-sm, +.style-guide-md, +.style-guide-lg, +.style-guide-xl { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .style-guide, + .style-guide-sm { + max-width: 540px; + } +} + +@media (min-width: 768px) { + .style-guide, + .style-guide-sm, + .style-guide-md { + max-width: 720px; + } +} + +@media (min-width: 992px) { + .style-guide, + .style-guide-sm, + .style-guide-md, + .style-guide-lg { + max-width: 960px; + } +} + +@media (min-width: 1200px) { + .style-guide, + .style-guide-sm, + .style-guide-md, + .style-guide-lg, + .style-guide-xl { + max-width: 1140px; + } +} + .text-uppercase { - text-transform: uppercase; -} - -.snippet-grid { - display: grid; - grid-template-columns: repeat(12, 10px); - grid-template-rows: repeat(12, 10px); - margin: 5px; - width: 80px; - - &:hover { - @include selection(15px, -5px); - cursor: pointer; - } -} - -.snippet-grid-cell { - background: #d9d9d9; - outline: 1px solid gray; - min-width: 15px; - min-height: 20px; - margin: 2px; - &[role="article"] { - background: #bfbfbf; - } + text-transform: uppercase; } .placeholder { diff --git a/src/themes/website/styles/styles.scss b/src/themes/website/styles/styles.scss index 148bd2bc..23b314e8 100644 --- a/src/themes/website/styles/styles.scss +++ b/src/themes/website/styles/styles.scss @@ -31,4 +31,6 @@ @import "gql.scss"; @import "details.scss"; @import "subscriptions.scss"; -@import "operations.scss"; \ No newline at end of file +@import "operations.scss"; +@import "scrollbars.scss"; +@import "grids.scss"; \ No newline at end of file diff --git a/src/themes/website/styles/utils.scss b/src/themes/website/styles/utils.scss index 134781ac..97bb2cd3 100644 --- a/src/themes/website/styles/utils.scss +++ b/src/themes/website/styles/utils.scss @@ -90,7 +90,7 @@ display: none; &::before { - content: ''; + content: ""; position: absolute; left: 50%; margin-top: -16px; @@ -152,6 +152,10 @@ padding-left: 0px !important; } +.m-0 { + margin: 0 !important; +} + .max-w-500 { max-width: 500px; } @@ -188,4 +192,20 @@ .mr-20 { margin-right: 20px; -} \ No newline at end of file +} + +.w-100 { + width: 100%; +} + +.h-100 { + height: 100%; +} + +.p-0 { + padding: 0 !important; +} + +.p-20 { + padding: 20px; +} diff --git a/src/themes/website/styles/variables.scss b/src/themes/website/styles/variables.scss index b3250218..027e163c 100644 --- a/src/themes/website/styles/variables.scss +++ b/src/themes/website/styles/variables.scss @@ -72,6 +72,7 @@ $form-control-bg-color: #fff; $form-control-border-color: #ced4da; $form-control-border-radius: 0; $search-button-width: 30px; +$form-invalid-color: #f58634; /* GraphQL */ $gql-input-node-color: #8b2bb9; @@ -79,4 +80,9 @@ $gql-not-input-node-color: #0F7EBD; $gql-operation-type-color: #b11a04; /* Panel */ -$panel-bg-color-highlight: darken(#fafafa, 3%); \ No newline at end of file +$panel-bg-color-highlight: darken(#fafafa, 3%); + +/* Scrollbars */ +$scrollbar-rail-active-bg: #eee; +$scrollbar-thumb-bg: #aaa; +$scrollbar-thumb-active-bg: #999; \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 3df0243a..a93f0b5a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,8 +7,6 @@ ], "module": "commonjs", "moduleResolution": "node", - "noStrictGenericChecks": true, - "ignoreDeprecations": "5.0", "removeComments": true, "noLib": false, "skipLibCheck": true, From 4f5b452e1bb36b5015c80c56aaa090d47d5ea968 Mon Sep 17 00:00:00 2001 From: Roman Kolesnikov Date: Fri, 4 Oct 2024 16:50:06 +0000 Subject: [PATCH 27/29] Merged PR 10992070: fix(sitemenu): Fix linking for image site menu -> media modal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Problem:** Link image doesn't work for media because of missed property compared to schema **Solution:** Fixed **Synchronization:** _Describe If there is any condition to merge this code to main repository. Link any PR that is needed to be deployed together with this PR._ **Type of change:** - [ ] Feature work - [X] Bugfix - [ ] Security patch - [ ] Documentation - [ ] Engineering change - [ ] Test - [ ] Logging/Metrics _Before submitting this PR, please make sure that the following are done_: - [ ] There is sufficient test coverage (unit/BVT) - [ ] There is sufficient logging and metrics to troubleshoot in production. Ensured PII is not logged - [ ] Validated that it is not introducing breaking changes in the product behavior **Risk**: - [ ] High – Errors could cause MAJOR regression of many scenarios. (Example: new large features or high-level infrastructure changes) - [ ] Medium – Errors could cause regression of 1 or more scenarios. (Example: somewhat complex bug fixes, small new features) - [X] Small – No issues are expected. (Example: Very small bugfixes, string changes, or configuration settings changes) Related work items: #29755670 --- src/admin/media/mediaSelectionItemModal.tsx | 9 +++++---- src/admin/media/nonImageDetailsModal.tsx | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/admin/media/mediaSelectionItemModal.tsx b/src/admin/media/mediaSelectionItemModal.tsx index ebc66be7..053598bc 100644 --- a/src/admin/media/mediaSelectionItemModal.tsx +++ b/src/admin/media/mediaSelectionItemModal.tsx @@ -9,6 +9,7 @@ import { MediaContract } from '@paperbits/common/media/mediaContract'; import { DefaultButton, IIconProps, Image, ImageFit, IOverflowSetItemProps, Link, Modal, SearchBox, Stack, Text } from '@fluentui/react'; import { createSearchQuery, getAllValues } from '../utils/helpers'; import { NonImageDetailsModal } from './nonImageDetailsModal'; +import { MimeTypes } from '@paperbits/common'; interface MediaSelectionItemModalState { media: MediaContract[], @@ -30,7 +31,7 @@ export class MediaSelectionItemModal extends React.Component => { - const newMediaFile = await this.mediaService.createMediaUrl('media.svg', 'https://cdn.paperbits.io/images/logo.svg'); + const newMediaFile = await this.mediaService.createMediaUrl('media.svg', 'https://cdn.paperbits.io/images/logo.svg', MimeTypes.imageSvg); this.setState({ selectedMediaFile: newMediaFile, showNonImageDetailsModal: true }); } @@ -103,14 +104,14 @@ export class MediaSelectionItemModal extends React.Component { const thumbnailUrl: string = this.getThumbnailUrl(mediaItem); - + return (
this.props.selectMedia(mediaItem)} key={mediaItem.key}> + /> {mediaItem.fileName} diff --git a/src/admin/media/nonImageDetailsModal.tsx b/src/admin/media/nonImageDetailsModal.tsx index bcfdc1a8..76e981d0 100644 --- a/src/admin/media/nonImageDetailsModal.tsx +++ b/src/admin/media/nonImageDetailsModal.tsx @@ -9,6 +9,7 @@ import { CopyableTextField } from '../utils/components/copyableTextField'; import { REQUIRED, UNIQUE_REQUIRED, URL_REQUIRED, validateField } from '../utils/validator'; import { reservedPermalinks } from '../../constants'; import { MimeTypes } from '@paperbits/common'; +import { getType } from "mime"; interface NonImageDetailsModalState { mediaItem: MediaContract, @@ -47,6 +48,19 @@ export class NonImageDetailsModal extends React.Component Date: Mon, 7 Oct 2024 10:06:01 +0000 Subject: [PATCH 28/29] Merged PR 11000481: fix(media): Fixed reference url is not updatable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Problem:** When you try to put value to reference url in limk media dialog, the value is not updated **Solution:** Fixed state updates **Synchronization:** _Describe If there is any condition to merge this code to main repository. Link any PR that is needed to be deployed together with this PR._ **Type of change:** - [ ] Feature work - [X] Bugfix - [ ] Security patch - [ ] Documentation - [ ] Engineering change - [ ] Test - [ ] Logging/Metrics _Before submitting this PR, please make sure that the following are done_: - [X] There is sufficient test coverage (unit/BVT) - [ ] There is sufficient logging and metrics to troubleshoot in production. Ensured PII is not logged - [X] Validated that it is not introducing breaking changes in the product behavior **Risk**: - [ ] High – Errors could cause MAJOR regression of many scenarios. (Example: new large features or high-level infrastructure changes) - [ ] Medium – Errors could cause regression of 1 or more scenarios. (Example: somewhat complex bug fixes, small new features) - [X] Small – No issues are expected. (Example: Very small bugfixes, string changes, or configuration settings changes) Related work items: #29755670 --- src/admin/media/nonImageDetailsModal.tsx | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/admin/media/nonImageDetailsModal.tsx b/src/admin/media/nonImageDetailsModal.tsx index 76e981d0..35a7a73d 100644 --- a/src/admin/media/nonImageDetailsModal.tsx +++ b/src/admin/media/nonImageDetailsModal.tsx @@ -41,26 +41,16 @@ export class NonImageDetailsModal extends React.Component => { - this.setState({ - mediaItem: { - ...this.state.mediaItem, - [field]: newValue - } - }); + const newStateMediaItem: MediaContract = { ...this.state.mediaItem, [field]: newValue }; if (field === 'downloadUrl') { - const newMimeType = getType(newValue); + const newMimeType: string = getType(newValue); if (newMimeType) { - this.setState({ - mediaItem: { - ...this.state.mediaItem, - mimeType: newMimeType - } - }) + newStateMediaItem.mimeType = newMimeType; } - } + this.setState({ mediaItem: newStateMediaItem }); this.runValidation(field, newValue, validationType); } From edd386aea9c877b3a14314753f1a03e59ec38df8 Mon Sep 17 00:00:00 2001 From: Igor O Date: Mon, 7 Oct 2024 15:47:41 -0700 Subject: [PATCH 29/29] Fixed styles after last packages update (#2694) * Fixed styles after last packages update * Returned default styles from style guide --- .../ko/runtime/operation-console.html | 14 +- .../ko/runtime/operation-list.html | 2 +- src/themes/website/styles/forms.scss | 129 ++++++++++++++---- src/themes/website/styles/navs.scss | 2 + src/themes/website/styles/reboot.scss | 1 - 5 files changed, 117 insertions(+), 31 deletions(-) diff --git a/src/components/operations/operation-details/ko/runtime/operation-console.html b/src/components/operations/operation-details/ko/runtime/operation-console.html index 72d6e95a..7dcf0ae4 100644 --- a/src/components/operations/operation-details/ko/runtime/operation-console.html +++ b/src/components/operations/operation-details/ko/runtime/operation-console.html @@ -391,12 +391,14 @@ - +
+ +
diff --git a/src/components/operations/operation-list/ko/runtime/operation-list.html b/src/components/operations/operation-list/ko/runtime/operation-list.html index 91e30283..707c7900 100644 --- a/src/components/operations/operation-list/ko/runtime/operation-list.html +++ b/src/components/operations/operation-list/ko/runtime/operation-list.html @@ -19,7 +19,7 @@
-
+
diff --git a/src/themes/website/styles/forms.scss b/src/themes/website/styles/forms.scss index e8eb1fa2..950489b2 100644 --- a/src/themes/website/styles/forms.scss +++ b/src/themes/website/styles/forms.scss @@ -5,8 +5,21 @@ form { flex-grow: 1; } +.form-label { + padding: .375rem .75rem; +} + .form-control { + display: block; + background-clip: padding-box; width: 100%; + + &.form-control-light { + border-top: none; + border-left: none; + border-right: none; + background-color: transparent; + } } .form-inline { @@ -98,6 +111,72 @@ input[type="range"] { } } +input[type=search] { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + @extend .icon-svg-magnifier; + background-position: 5px center; + background-size: 1em; + background-repeat: no-repeat; + padding-left: calc(1em + 10px) !important; +} + +.switch { + position: relative; + display: inline-block; + width: $switch-width; + height: $switch-height; + margin: 10px; + + input[type=checkbox] { + opacity: 0; + width: 0; + height: 0; + + &:checked + .slider { + background: $switch-background-color-on; + } + + &:checked + .slider:before { + transform: translateX(26px); + } + } + + .slider { + position: absolute; + cursor: pointer; + border: 1px solid #ffffff; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: $switch-background-color-off; + transition: .4s; + + &.round { + border-radius: 34px; + + &:before { + border-radius: 50%; + } + } + + &:before { + position: absolute; + content: ""; + height: $switch-trigger-size; + width: $switch-trigger-size; + left: $switch-trigger-gap; + bottom: $switch-trigger-gap + 1px; + background: #ffffff; + forced-color-adjust: none; + border: 1px solid #ffffff; + transition: .4s; + } + } +} + .input-group { padding: 0; display: flex; @@ -130,6 +209,10 @@ input[type="range"] { background-color: #fff; color: #000; border: 1px solid #000; + padding-top: 7px; + padding-left: 10px; + padding-right: 10px; + padding-bottom: 5px; } .dropdown { @@ -141,31 +224,31 @@ input[type="range"] { left: 0; right: 0; } +} - .select-badge { - margin: 0 .5em; - font-family: $font-family-base; - font-size: 13px; +.select-badge { + margin: 0 .5em; + font-family: $font-family-base; + font-size: 13px; - select { - padding: .625em 1em; - padding-right: 2.75em; - border: solid white 1px; - border-radius: .875em; - background: #D9D9D9; - outline: none; - -webkit-appearance: none; - -moz-appearance: none; - } + select { + padding: .625em 1em; + padding-right: 2.75em; + border: solid white 1px; + border-radius: .875em; + background: #D9D9D9; + outline: none; + -webkit-appearance: none; + -moz-appearance: none; + } - .arrow { - position: absolute; - width: 2em; - height: 100%; - top: 1px; - right: 2px; - border-left: solid white 1px; - pointer-events: none; - } + .arrow { + position: absolute; + width: 2em; + height: 100%; + top: 1px; + right: 2px; + border-left: solid white 1px; + pointer-events: none; } } diff --git a/src/themes/website/styles/navs.scss b/src/themes/website/styles/navs.scss index 424a44f1..67fc4769 100644 --- a/src/themes/website/styles/navs.scss +++ b/src/themes/website/styles/navs.scss @@ -29,6 +29,8 @@ &.show { display: block; + max-height: 500px; + overflow-x: auto; } } diff --git a/src/themes/website/styles/reboot.scss b/src/themes/website/styles/reboot.scss index b59fece8..e096ab1b 100644 --- a/src/themes/website/styles/reboot.scss +++ b/src/themes/website/styles/reboot.scss @@ -3,7 +3,6 @@ ::before { box-sizing: border-box; min-width: 0; - min-height: 0; } html { font-family: sans-serif;