diff --git a/CHANGELOG.md b/CHANGELOG.md index e014569f4..72761fc5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ You can find the changelog of the Retrospective Extension below. _PS: Unfortunately, changelog before v1.0.46 is not available_ 🤦‍♂️ +## v1.XX.X +* Boards can now restrict access down to specific teams or individuals. From [Github PR #650](https://github.com/microsoft/vsts-extension-retrospectives/pull/650) + ## v1.92.1 * Team Assessment form: Background colors for each number on the spectrum now more diff --git a/RetrospectiveExtension.Frontend/components/__mocks__/mocked_components/mockedBoardMetadataForm.tsx b/RetrospectiveExtension.Frontend/components/__mocks__/mocked_components/mockedBoardMetadataForm.tsx index 9d22d1e44..45392fc54 100644 --- a/RetrospectiveExtension.Frontend/components/__mocks__/mocked_components/mockedBoardMetadataForm.tsx +++ b/RetrospectiveExtension.Frontend/components/__mocks__/mocked_components/mockedBoardMetadataForm.tsx @@ -1,6 +1,7 @@ import { IFeedbackBoardDocument, IFeedbackColumn } from "../../../interfaces/feedback"; export const testTeamId: string = 'mocked-team-uuid'; +export const testUserId: string = 'mocked-user-uuid'; export const testTitle: string = 'Test Title'; export const testColumns: IFeedbackColumn[] = [ @@ -32,5 +33,7 @@ export const testExistingBoard: IFeedbackBoardDocument = { isIncludeTeamEffectivenessMeasurement: true, shouldShowFeedbackAfterCollect: false, displayPrimeDirective: true, - isAnonymous: false + isAnonymous: false, + isPublic: false, + permissions: null } diff --git a/RetrospectiveExtension.Frontend/components/__tests__/feedbackBoardMetadataForm.test.tsx b/RetrospectiveExtension.Frontend/components/__tests__/feedbackBoardMetadataForm.test.tsx index e07a6e299..ffb1564d0 100644 --- a/RetrospectiveExtension.Frontend/components/__tests__/feedbackBoardMetadataForm.test.tsx +++ b/RetrospectiveExtension.Frontend/components/__tests__/feedbackBoardMetadataForm.test.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { mockUuid } from '../__mocks__/uuid/v4'; import FeedbackBoardMetadataForm, { IFeedbackBoardMetadataFormProps, IFeedbackColumnCard } from '../feedbackBoardMetadataForm'; -import { testColumns, testExistingBoard, testTeamId, testTitle } from '../__mocks__/mocked_components/mockedBoardMetadataForm'; +import { testColumns, testExistingBoard, testTeamId } from '../__mocks__/mocked_components/mockedBoardMetadataForm'; import { Checkbox, List, TextField } from 'office-ui-fabric-react'; const mockedProps: IFeedbackBoardMetadataFormProps = { @@ -12,6 +12,7 @@ const mockedProps: IFeedbackBoardMetadataFormProps = { teamId: testTeamId, placeholderText: '', maxvotesPerUser: 5, + availablePermissionOptions: [], onFormSubmit: () => null, onFormCancel: () => null }; diff --git a/RetrospectiveExtension.Frontend/components/__tests__/feedbackBoardMetadataFormPermissions.test.tsx b/RetrospectiveExtension.Frontend/components/__tests__/feedbackBoardMetadataFormPermissions.test.tsx new file mode 100644 index 000000000..581f93ae9 --- /dev/null +++ b/RetrospectiveExtension.Frontend/components/__tests__/feedbackBoardMetadataFormPermissions.test.tsx @@ -0,0 +1,232 @@ +import React from 'react'; +import { mount, shallow } from 'enzyme'; +import { mockUuid } from '../__mocks__/uuid/v4'; +import FeedbackBoardMetadataForm, { IFeedbackBoardMetadataFormProps, IFeedbackColumnCard } from '../feedbackBoardMetadataForm'; +import { testColumns, testExistingBoard, testTeamId, testUserId } from '../__mocks__/mocked_components/mockedBoardMetadataForm'; +import { Checkbox, List, TextField } from 'office-ui-fabric-react'; +import FeedbackBoardMetadataFormPermissions, { IFeedbackBoardMetadataFormPermissionsProps } from '../feedbackBoardMetadataFormPermissions'; + +const mockedProps: IFeedbackBoardMetadataFormPermissionsProps = { + permissions: { + Teams: [], + Members: [] + }, + permissionOptions: [], + onPermissionChanged: jest.fn() +}; + +jest.mock('uuid', () => ({ v4: () => mockUuid})); + +describe('Board Metadata Form Permissions', () => { + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('can be rendered', () => { + const wrapper = shallow(); + const component = wrapper.children().dive(); + const textField = component.findWhere(c => c.prop('id') === 'retrospective-permission-search-input').find(TextField); + + expect(textField).toBeDefined(); + expect(textField.prop('value')).toEqual(''); + }); + + describe('Public Banner', () => { + const publicBannerText: string = 'This board is visible to every member in the organization.'; + + it('should show when there are not team or member permissions', () => { + const wrapper = shallow(); + const component = wrapper.children().dive(); + const element = component.findWhere(c => c.text() === publicBannerText); + + expect(element).toBeDefined(); + }); + + it('should hide when there are team permissions', () => { + const props = { + ...mockedProps, + permissions: { + Teams: [testTeamId], + Members: [] as string[] + } + }; + const wrapper = shallow(); + const component = wrapper.children().dive(); + const element = component.findWhere(c => c.text() === publicBannerText); + + expect(element).toHaveLength(0); + }) + + it('should hide when there are member permissions', () => { + const props = { + ...mockedProps, + permissions: { + Teams: [] as string[], + Members: [testUserId] + } + }; + const wrapper = shallow(); + const component = wrapper.children().dive(); + const element = component.findWhere(c => c.text() === publicBannerText); + + expect(element).toHaveLength(0); + }) + }); + + describe('Permission Table', () => { + + it('should show team permissions', () => { + const props: IFeedbackBoardMetadataFormPermissionsProps = { + ...mockedProps, + permissionOptions: [ + { + id: '1', + name: 'Team 1', + uniqueName: 'Team 1', + type: 'team', + thumbnailUrl: '' + }, + { + id: '2', + name: 'Team 2', + uniqueName: 'Team 2', + type: 'team', + thumbnailUrl: '' + } + ] + }; + const wrapper = shallow(); + const component = wrapper.children().dive(); + const tableBody = component.find('tbody'); + const tableRows = tableBody.find('tr'); + + expect(tableRows).toHaveLength(2); + + const everyRowHasTeamIcon = tableRows.find('i').everyWhere(c => c.hasClass('fa-users')); + expect(everyRowHasTeamIcon).toBeTruthy(); + }); + + it('should show member permissions', () => { + const props: IFeedbackBoardMetadataFormPermissionsProps = { + ...mockedProps, + permissionOptions: [ + { + id: '1', + name: 'User 1', + uniqueName: 'User 1', + type: 'member', + thumbnailUrl: '' + }, + { + id: '2', + name: 'User 2', + uniqueName: 'User 2', + type: 'member', + thumbnailUrl: '' + } + ] + }; + const wrapper = shallow(); + const component = wrapper.children().dive(); + const tableBody = component.find('tbody'); + const tableRows = tableBody.find('tr'); + + expect(tableRows).toHaveLength(2); + + const everyRowHasUserImage = tableRows.find('img').everyWhere(c => c.hasClass('permission-image')); + expect(everyRowHasUserImage).toBeTruthy(); + }) + + it('should order alpha by name', () => { + const props: IFeedbackBoardMetadataFormPermissionsProps = { + ...mockedProps, + permissionOptions: [ + { + id: '1', + name: 'Alpha', + uniqueName: 'User 1', + type: 'member', + thumbnailUrl: '' + }, + { + id: '2', + name: 'Charlie', + uniqueName: 'User 2', + type: 'member', + thumbnailUrl: '' + }, + { + id: '3', + name: 'Bravo', + uniqueName: 'Team 3', + type: 'team', + thumbnailUrl: '' + }, + ] + }; + const wrapper = mount(); + const tableBody = wrapper.find('tbody'); + const tableRows = tableBody.find('tr'); + + expect(tableRows).toHaveLength(3); + + const first = tableRows.first().find('span').first(); + expect(first.text()).toEqual('Alpha'); + + const last = tableRows.last().find('span').first(); + expect(last.text()).toEqual('Charlie'); + }) + + it('should order options that have permission then by name', () => { + const props: IFeedbackBoardMetadataFormPermissionsProps = { + ...mockedProps, + permissions: { + Teams: ['4'], + Members: [] + }, + permissionOptions: [ + { + id: '1', + name: 'Alpha', + uniqueName: 'User 1', + type: 'member', + thumbnailUrl: '' + }, + { + id: '2', + name: 'Charlie', + uniqueName: 'User 2', + type: 'member', + thumbnailUrl: '' + }, + { + id: '3', + name: 'Bravo', + uniqueName: 'Team 3', + type: 'team', + thumbnailUrl: '' + }, + { + id: '4', + name: 'Zebra', + uniqueName: 'Team Z', + type: 'team', + thumbnailUrl: '' + }, + ] + }; + const wrapper = mount(); + const tableBody = wrapper.find('tbody'); + const tableRows = tableBody.find('tr'); + + expect(tableRows).toHaveLength(4); + + const first = tableRows.first().find('span').first(); + expect(first.text()).toEqual('Zebra'); + + const last = tableRows.last().find('span').first(); + expect(last.text()).toEqual('Charlie'); + }) + }); +}); diff --git a/RetrospectiveExtension.Frontend/components/feedbackBoardContainer.tsx b/RetrospectiveExtension.Frontend/components/feedbackBoardContainer.tsx index ecb3fda2c..b749c7593 100644 --- a/RetrospectiveExtension.Frontend/components/feedbackBoardContainer.tsx +++ b/RetrospectiveExtension.Frontend/components/feedbackBoardContainer.tsx @@ -10,7 +10,7 @@ import { MobileWidthBreakpoint } from '../config/constants'; import { WorkflowPhase } from '../interfaces/workItem'; import WorkflowStage from './workflowStage'; import BoardDataService from '../dal/boardDataService'; -import { IFeedbackBoardDocument, IFeedbackColumn, IFeedbackItemDocument } from '../interfaces/feedback'; +import { FeedbackBoardDocumentHelper, IFeedbackBoardDocument, IFeedbackBoardDocumentPermissions, IFeedbackColumn, IFeedbackItemDocument } from '../interfaces/feedback'; import { reflectBackendService } from '../dal/reflectBackendService'; import BoardSummaryTable from './boardSummaryTable'; import FeedbackBoardMetadataForm from './feedbackBoardMetadataForm'; @@ -41,6 +41,7 @@ import { appInsights, reactPlugin } from '../utilities/telemetryClient'; import copyToClipboard from 'copy-to-clipboard'; import boardDataService from '../dal/boardDataService'; import { getColumnsByTemplateId } from '../utilities/boardColumnsHelper'; +import { FeedbackBoardPermissionOption } from './feedbackBoardMetadataFormPermissions'; export interface FeedbackBoardContainerProps { isHostedAzureDevOps: boolean; @@ -61,7 +62,13 @@ export interface FeedbackBoardContainerState { isTeamDataLoaded: boolean; isAllTeamsLoaded: boolean; maxvotesPerUser: number; + /** + * Teams that the current user is specifically a member of. + */ userTeams: WebApiTeam[]; + /** + * All teams within the current organization. + */ projectTeams: WebApiTeam[]; nonHiddenWorkItemTypes: WorkItemType[]; allWorkItemTypes: WorkItemType[]; @@ -91,7 +98,15 @@ export interface FeedbackBoardContainerState { effectivenessMeasurementChartData: { questionId: number, red: number, yellow: number, green: number }[]; teamEffectivenessMeasurementAverageVisibilityClassName: string; actionItemIds: number[]; + /** + * Members related to the current team. + */ members: TeamMember[]; + /** + * Members of the all teams that the current user access to. This may not be all the team + * members within the organization. + */ + allMembers: TeamMember[]; castedVoteCount: number; boardColumns: IFeedbackColumn[]; questionIdForDiscussAndActBoardUpdate: number; @@ -145,6 +160,7 @@ class FeedbackBoardContainer extends React.Component { - actionItemIds = actionItemIds.concat(item.associatedActionItemIds); - }); - - const contributors = feedbackItems.map(e => { return { id: e.userIdRef, name: e?.createdBy?.displayName, imageUrl: e?.createdBy?.imageUrl }; }).filter((v, i, a) => a.indexOf(v) === i); - - const votes = Object.values(board.boardVoteCollection || []); - - this.setState({ - actionItemIds: actionItemIds.filter(item => item !== undefined), - feedbackItems, - contributors: [...new Set(contributors.map(e => e.id))].map(e => contributors.find(i => i.id === e)), - castedVoteCount: (votes !== null && votes.length > 0) ? votes.reduce((a, b) => a + b) : 0 - }); - } - public componentDidUpdate(prevProps: FeedbackBoardContainerProps, prevState: FeedbackBoardContainerState) { // TODO (enpolat) : if (prevState.currentTeam !== this.state.currentTeam) { // TODO (enpolat) : appInsightsClient.updateTeamInfo(this.state.currentTeam); @@ -264,6 +260,28 @@ class FeedbackBoardContainer extends React.Component { + actionItemIds = actionItemIds.concat(item.associatedActionItemIds); + }); + + const contributors = feedbackItems.map(e => { return { id: e.userIdRef, name: e?.createdBy?.displayName, imageUrl: e?.createdBy?.imageUrl }; }).filter((v, i, a) => a.indexOf(v) === i); + + const votes = Object.values(board.boardVoteCollection || []); + + this.setState({ + actionItemIds: actionItemIds.filter(item => item !== undefined), + feedbackItems, + contributors: [...new Set(contributors.map(e => e.id))].map(e => contributors.find(i => i.id === e)), + castedVoteCount: (votes !== null && votes.length > 0) ? votes.reduce((a, b) => a + b) : 0 + }); + } + private toggleAndFixResolution = () => { const newView = !this.state.isDesktop; @@ -317,9 +335,8 @@ class FeedbackBoardContainer extends React.Component { const boardsForTeam = [...prevState.boards, boardToAdd] - .sort((b1, b2) => { - return (new Date(b2.createdDate).getTime() - new Date(b1.createdDate).getTime()); - }); + .filter((board: IFeedbackBoardDocument) => FeedbackBoardDocumentHelper.filter(board, this.state.userTeams.map(t => t.id), this.state.currentUserId)) + .sort((b1, b2) => FeedbackBoardDocumentHelper.sort(b1, b2)); const baseResult = { boards: boardsForTeam, @@ -431,8 +448,6 @@ class FeedbackBoardContainer extends React.Component allTeamMembers.findIndex(existingMember => existingMember.identity.id !== m.identity.id) === -1); + allTeamMembers.push(...members); + } + // Default to select first user team or the project's default team. const defaultTeam = (userTeams && userTeams.length) ? userTeams[0] : await azureDevOpsCoreService.getDefaultTeam(this.props.projectId); const baseTeamState = { userTeams, filteredUserTeams: userTeams, - projectTeams: (userTeams && userTeams.length) ? [] : [defaultTeam], - filteredProjectTeams: (userTeams && userTeams.length) ? [] : [defaultTeam], currentTeam: defaultTeam, isTeamBoardDeletedInfoDialogHidden: true, teamBoardDeletedDialogTitle: '', @@ -500,7 +520,7 @@ class FeedbackBoardContainer extends React.Component { - return (new Date(b2.createdDate).getTime() - new Date(b1.createdDate).getTime()); - }); + boardsForMatchedTeam = boardsForMatchedTeam + .filter((board: IFeedbackBoardDocument) => FeedbackBoardDocumentHelper.filter(board, this.state.userTeams.map(t => t.id), this.state.currentUserId)) + .sort((b1, b2) => FeedbackBoardDocumentHelper.sort(b1, b2)); } const queryParamTeamAndDefaultBoardState = { @@ -576,15 +596,23 @@ class FeedbackBoardContainer extends React.Component { + private initializeProjectTeams = async (defaultTeam: WebApiTeam) => { const allTeams = await azureDevOpsCoreService.getAllTeams(this.props.projectId, false); allTeams.sort((t1, t2) => { return t1.name.localeCompare(t2.name, [], { sensitivity: "accent" }); }); + const allTeamMembers: TeamMember[] = [] + for(const team of allTeams) { + let members = await azureDevOpsCoreService.getMembers(team.projectId, team.id); + members = members.filter(m => allTeamMembers.findIndex(existingMember => existingMember.identity.id !== m.identity.id) === -1); + allTeamMembers.push(...members); + } + this.setState({ - projectTeams: allTeams, - filteredProjectTeams: allTeams, + allMembers: allTeamMembers, + projectTeams: allTeams?.length > 0 ? allTeams : [defaultTeam], + filteredProjectTeams: allTeams?.length > 0 ? allTeams : [defaultTeam], isAllTeamsLoaded: true, }); } @@ -593,7 +621,7 @@ class FeedbackBoardContainer extends React.Component { - return (new Date(b2.createdDate).getTime() - new Date(b1.createdDate).getTime()); - }); + boardsForTeam = boardsForTeam + .filter((board: IFeedbackBoardDocument) => FeedbackBoardDocumentHelper.filter(board, userTeams.map(t => t.id), this.state.currentUserId)) + .sort((b1, b2) => FeedbackBoardDocumentHelper.sort(b1, b2)); } const recentVisitState = { @@ -626,11 +654,11 @@ class FeedbackBoardContainer extends React.Component { - return (new Date(b2.createdDate).getTime() - new Date(b1.createdDate).getTime()); - }); + boardsForMatchedTeam = boardsForMatchedTeam + .filter((board: IFeedbackBoardDocument) => FeedbackBoardDocumentHelper.filter(board, userTeams.map(t => t.id), this.state.currentUserId)) + .sort((b1, b2) => FeedbackBoardDocumentHelper.sort(b1, b2)); } return { @@ -651,11 +679,11 @@ class FeedbackBoardContainer extends React.Component team.id === teamId); if (matchedTeam) { - const boardsForTeam = await BoardDataService.getBoardsForTeam(matchedTeam.id); + let boardsForTeam = await BoardDataService.getBoardsForTeam(matchedTeam.id); if (boardsForTeam && boardsForTeam.length) { - boardsForTeam.sort((b1, b2) => { - return (new Date(b2.createdDate).getTime() - new Date(b1.createdDate).getTime()); - }); + boardsForTeam = boardsForTeam + .filter((board: IFeedbackBoardDocument) => FeedbackBoardDocumentHelper.filter(board, this.state.userTeams.map(t => t.id), this.state.currentUserId)) + .sort((b1, b2) => FeedbackBoardDocumentHelper.sort(b1, b2)); } // @ts-ignore TS2345 @@ -687,7 +715,7 @@ class FeedbackBoardContainer extends React.Component { this.setState({ isTeamDataLoaded: false }); - const boardsForTeam = await BoardDataService.getBoardsForTeam(this.state.currentTeam.id); + let boardsForTeam = await BoardDataService.getBoardsForTeam(this.state.currentTeam.id); if (!boardsForTeam.length) { this.setState({ @@ -699,9 +727,9 @@ class FeedbackBoardContainer extends React.Component { - return (new Date(b2.createdDate).getTime() - new Date(b1.createdDate).getTime()); - }); + boardsForTeam = boardsForTeam + .filter((board: IFeedbackBoardDocument) => FeedbackBoardDocumentHelper.filter(board, this.state.userTeams.map(t => t.id), this.state.currentUserId)) + .sort((b1, b2) => FeedbackBoardDocumentHelper.sort(b1, b2)); // Default to select most recently created board. const currentBoard: IFeedbackBoardDocument = boardsForTeam[0]; @@ -778,7 +806,8 @@ class FeedbackBoardContainer extends React.Component { + displayPrimeDirective: boolean, + permissions: IFeedbackBoardDocumentPermissions) => { const createdBoard = await BoardDataService.createBoardForTeam(this.state.currentTeam.id, title, maxvotesPerUser, @@ -786,7 +815,10 @@ class FeedbackBoardContainer extends React.Component { + private updateBoardMetadata = async (title: string, maxvotesPerUser: number, columns: IFeedbackColumn[], isIncludeTeamEffectivenessMeasurement: boolean, isBoardAnonymous: boolean, shouldShowFeedbackAfterCollect: boolean, displayPrimeDirective: boolean, permissions: IFeedbackBoardDocumentPermissions) => { const updatedBoard = - await BoardDataService.updateBoardMetadata(this.state.currentTeam.id, this.state.currentBoard.id, maxvotesPerUser, title, columns); + await BoardDataService.updateBoardMetadata(this.state.currentTeam.id, this.state.currentBoard.id, maxvotesPerUser, title, columns, permissions); this.updateBoardAndBroadcast(updatedBoard); } @@ -977,9 +1009,32 @@ class FeedbackBoardContainer extends React.Component void, onCancel: () => void) => { + + const permissionOptions: FeedbackBoardPermissionOption[] = [] + + for(const team of this.state.projectTeams) { + permissionOptions.push({ + id: team.id, + name: team.name, + uniqueName: team.projectName, + type: 'team', + }) + } + + for(const member of this.state.allMembers) { + permissionOptions.push({ + id: member.identity.id, + name: member.identity.displayName, + uniqueName: member.identity.uniqueName, + thumbnailUrl: member.identity.imageUrl, + type: 'member', + }) + } + return ( ); @@ -1213,9 +1269,8 @@ class FeedbackBoardContainer extends React.Component void; + displayPrimeDirective: boolean, + permissions: IFeedbackBoardDocumentPermissions) => void; onFormCancel: () => void; } @@ -50,6 +54,7 @@ interface IFeedbackBoardMetadataFormState { columnCardBeingEdited: IFeedbackColumnCard; selectedIconKey: string; selectedAccentColorKey: string; + permissions: IFeedbackBoardDocumentPermissions } export interface IFeedbackColumnCard { @@ -68,8 +73,9 @@ class FeedbackBoardMetadataForm extends React.Component { return { column, markedForDeletion: false } }); defaultMaxVotes = this.props.currentBoard.maxVotesPerUser; @@ -77,6 +83,7 @@ class FeedbackBoardMetadataForm extends React.Component) => { const columns = getColumnsByTemplateId(event.target.value); - this.setState({columnCards: columns.map((column) => { return {column, markedForDeletion: false}; })}); + this.setState({ columnCards: columns.map((column) => { return { column, markedForDeletion: false }; }) }); }; private allIconClassNames: { friendlyName: string, iconClass: string }[] = [ @@ -312,267 +321,372 @@ class FeedbackBoardMetadataForm extends React.Component -
-

Board Settings

-
- - - {this.state.isBoardNameTaken && - A board with this name already exists. Please choose a different name. - } -
-
-
- - -
-
-
-  These settings cannot be modified after board creation. -
-
-
- -
- Note: All user information for assessment answers is always stored anonymously. -
-
-
- -
- -
- -
- -
- -
- -
-
-
-

Column Settings

-
-  You can create a maximum of {this.maxColumnCount} columns in a retrospective. -
- {!this.props.isNewBoardCreation && -
-  Warning: -
Existing feedback items may not be available after changing the board template! -
- } -
- - -
- { - return ( -
- { - this.setState({ - columnCardBeingEdited: columnCard, - isChooseColumnIconDialogHidden: false, - }); - }}> - - - { - this.setState({ - columnCardBeingEdited: columnCard, - isChooseColumnAccentColorDialogHidden: false, - }); - }}> - + + +
+
+

Board Settings

+
+ + + {this.state.isBoardNameTaken && + A board with this name already exists. Please choose a different name. + } +
+
+
+ + +
+
+
+  These settings cannot be modified after board creation. +
+
+
+ - - { - columnCard.column.title = newText - this.setState({ - columnCards: [].concat(this.state.columnCards), - }); - }} /> +
+ Note: All user information for assessment answers is always stored anonymously. +
+
-
- + +
+ +
+ +
+ +
+ +
+
+
+

Column Settings

+
+  You can create a maximum of {this.maxColumnCount} columns in a retrospective. +
+ {!this.props.isNewBoardCreation && +
+  Warning: +
Existing feedback items may not be available after changing the board template! +
+ } +
+ + +
+ { + return ( +
+ { + this.setState({ + columnCardBeingEdited: columnCard, + isChooseColumnIconDialogHidden: false, + }); + }}> + + + { + this.setState({ + columnCardBeingEdited: columnCard, + isChooseColumnAccentColorDialogHidden: false, + }); + }}> + + + { + columnCard.column.title = newText + this.setState({ + columnCards: [].concat(this.state.columnCards), + }); + }} /> +
+
+ { + const newColumns = [].concat(this.state.columnCards); + [newColumns[index], newColumns[index - 1]] = [newColumns[index - 1], newColumns[index]]; + this.setState({ + columnCards: newColumns, + }); + }} /> + { + const newColumns = [].concat(this.state.columnCards); + [newColumns[index], newColumns[index + 1]] = [newColumns[index + 1], newColumns[index]]; + this.setState({ + columnCards: newColumns, + }); + }} /> + {!columnCard.markedForDeletion && + !columnCard.markedForDeletion).length <= 1} + onClick={() => { + const newColumns = [].concat(this.state.columnCards); + newColumns[index].markedForDeletion = true; + this.setState({ + columnCards: newColumns, + }); + }} + />} + {columnCard.markedForDeletion && + !columnCard.markedForDeletion).length >= this.maxColumnCount} + onClick={() => { + const newColumns = [].concat(this.state.columnCards); + newColumns[index].markedForDeletion = false; + this.setState({ + columnCards: newColumns, + }); + }} + />} +
+
); + }} /> +
+ !columnCard.markedForDeletion).length >= this.maxColumnCount} onClick={() => { - const newColumns = [].concat(this.state.columnCards); - [newColumns[index], newColumns[index - 1]] = [newColumns[index - 1], newColumns[index]]; + const newColumns: IFeedbackColumnCard[] = [].concat(this.state.columnCards); + const newColumnId = uuid(); + newColumns.push( + { + column: { + id: newColumnId, + title: "New Column", + iconClass: this.getRandomArrayElement(this.allIconClassNames).iconClass, + accentColor: this.getRandomArrayElement(this.allAccentColors).colorCode, + }, + markedForDeletion: false, + }); this.setState({ columnCards: newColumns, }); - }} /> - + Add new column + +
+
+ {this.props.currentBoard && } + {this.state.columnCardBeingEdited &&
- ); - }} /> -
- !columnCard.markedForDeletion).length >= this.maxColumnCount} - onClick={() => { - const newColumns: IFeedbackColumnCard[] = [].concat(this.state.columnCards); - const newColumnId = uuid(); - newColumns.push( - { - column: { - id: newColumnId, - title: "New Column", - iconClass: this.getRandomArrayElement(this.allIconClassNames).iconClass, - accentColor: this.getRandomArrayElement(this.allAccentColors).colorCode, - }, - markedForDeletion: false, + }}> + + + })} + } + {this.state.columnCardBeingEdited && -
-
+ }}> + {this.allAccentColors.map((accentColor) => { + return { + this.state.columnCardBeingEdited.column.accentColor = accentColor.colorCode; + this.setState({ + isChooseColumnAccentColorDialogHidden: true, + columnCardBeingEdited: undefined, + columnCards: [].concat(this.state.columnCards), + }); + }}> + + + })} + } + + + + this.setState({ permissions: s.permissions })} + /> + + - {this.props.currentBoard && } - {this.state.columnCardBeingEdited && } - {this.state.columnCardBeingEdited && } ); } diff --git a/RetrospectiveExtension.Frontend/components/feedbackBoardMetadataFormPermissions.tsx b/RetrospectiveExtension.Frontend/components/feedbackBoardMetadataFormPermissions.tsx new file mode 100644 index 000000000..497235abe --- /dev/null +++ b/RetrospectiveExtension.Frontend/components/feedbackBoardMetadataFormPermissions.tsx @@ -0,0 +1,207 @@ +import React, { useEffect } from 'react'; +import { TextField } from 'office-ui-fabric-react/lib/TextField'; +import { Checkbox } from 'office-ui-fabric-react/lib/Checkbox'; +import { IFeedbackBoardDocumentPermissions } from '../interfaces/feedback'; + +import { withAITracking } from '@microsoft/applicationinsights-react-js'; +import { reactPlugin } from '../utilities/telemetryClient'; + +export interface IFeedbackBoardMetadataFormPermissionsProps { + permissions: IFeedbackBoardDocumentPermissions; + permissionOptions: FeedbackBoardPermissionOption[]; + onPermissionChanged: (state: FeedbackBoardPermissionState) => void; +} + +export interface FeedbackBoardPermissionState { + permissions: IFeedbackBoardDocumentPermissions +} + +export interface FeedbackBoardPermissionOption { + id: string; + name: string; + uniqueName: string; + hasPermission?: boolean; + type: 'team' | 'member'; + thumbnailUrl?: string; +} + +function FeedbackBoardMetadataFormPermissions(props: IFeedbackBoardMetadataFormPermissionsProps): JSX.Element { + const [teamPermissions, setTeamPermissions] = React.useState(props.permissions?.Teams ?? []); + const [memberPermissions, setMemberPermissions] = React.useState(props.permissions?.Members ?? []); + const [filteredPermissionOptions, setFilteredPermissionOptions] = React.useState(props.permissionOptions); + const [selectAllChecked, setSelectAllChecked] = React.useState(false); + const [searchTerm, setSearchTerm] = React.useState(''); + + const handleSelectAllClicked = (checked: boolean) => { + if(checked) { + setTeamPermissions([...teamPermissions, ...filteredPermissionOptions.filter(o => o.type === 'team' && !teamPermissions.includes(o.id)).map(o => o.id)]); + setMemberPermissions([...memberPermissions, ...filteredPermissionOptions.filter(o => o.type === 'member' && !memberPermissions.includes(o.id)).map(o => o.id)]); + } else { + setTeamPermissions(teamPermissions.filter(o => !filteredPermissionOptions.map(o => o.id).includes(o))); + setMemberPermissions(memberPermissions.filter(o => !filteredPermissionOptions.map(o => o.id).includes(o))); + } + + setSelectAllState(); + } + + const handlePermissionClicked = (option: FeedbackBoardPermissionOption, hasPermission: boolean) => { + let permissionList: string[] = option.type === 'team' + ? teamPermissions ?? [] + : memberPermissions ?? []; + + if(hasPermission) { + permissionList.push(option.id); + } else { + permissionList = permissionList.filter(t => t !== option.id); + } + + if(option.type === 'team') { + setTeamPermissions([...permissionList]); + } + else { + setMemberPermissions([...permissionList]); + } + } + + const handleSearchTermChanged = (newSearchTerm: string) => { + setSearchTerm(newSearchTerm); + + const filteredOptions: FeedbackBoardPermissionOption[] = props.permissionOptions.filter(o => { + if(newSearchTerm.length === 0) { + return true + } + + return o.name.toLowerCase().includes(newSearchTerm.toLowerCase()); + }); + + setSelectAllState(); + setFilteredPermissionOptions(orderedPermissionOptions(filteredOptions)); + } + + const setSelectAllState = () => { + const allVisibleIds = filteredPermissionOptions.map(o => o.id); + const allPermissionIds = [...teamPermissions, ...memberPermissions]; + const allVisibleIdsAreInFilteredOptions: boolean = allVisibleIds.every(id => allPermissionIds.includes(id)); + + setSelectAllChecked(allVisibleIdsAreInFilteredOptions); + }; + + const orderedPermissionOptions = (options: FeedbackBoardPermissionOption[]): FeedbackBoardPermissionOption[] => { + const orderedPermissionOptions = options + .map(o => { + o.hasPermission = teamPermissions.includes(o.id) || memberPermissions.includes(o.id); + return o; + }) + .sort((a, b) => { + if (a.hasPermission !== b.hasPermission) { + return b.hasPermission ? 1 : -1; + } + + return a.name.localeCompare(b.name); + }); + + return orderedPermissionOptions; + } + + const emitChangeEvent = () => { + props.onPermissionChanged({ + permissions: { + Teams: teamPermissions, + Members: memberPermissions + } + }) + } + + const PermissionImage = (props: {option: FeedbackBoardPermissionOption}) => { + if (props.option.type === 'team') { + return + } + + return {`Permission + } + + const PublicWarningBanner = () => { + if(teamPermissions.length === 0 && memberPermissions.length === 0) { + return
+  This board is visible to every member in the organization. +
+ } + + return null; + } + + useEffect(() => { + setSelectAllState(); + setFilteredPermissionOptions(orderedPermissionOptions(filteredPermissionOptions)); + emitChangeEvent(); + }, [teamPermissions, memberPermissions]) + + return
+
+ + +
+ handleSearchTermChanged(newValue)} + /> +
+ +
+ {/* TODO: Replace with Fluent grid once we migration components over */} + + + + + + + + + {filteredPermissionOptions.map((option, index) => { + return ( + + + + + ) + })} + +
+ handleSelectAllClicked(checked)} + /> + + {"Name"} +
+ handlePermissionClicked(option, isChecked)} + /> + +
+ {PermissionImage({ option })} +
+
+ {option.name} + {option.uniqueName} +
+
+
+
+
; +} + +export default withAITracking(reactPlugin, FeedbackBoardMetadataFormPermissions); diff --git a/RetrospectiveExtension.Frontend/css/feedbackBoardMetadataForm.scss b/RetrospectiveExtension.Frontend/css/feedbackBoardMetadataForm.scss index 9645a5782..fa17c4c8d 100644 --- a/RetrospectiveExtension.Frontend/css/feedbackBoardMetadataForm.scss +++ b/RetrospectiveExtension.Frontend/css/feedbackBoardMetadataForm.scss @@ -4,6 +4,7 @@ $feedback_column_card_height: 60px; .board-metadata-form { text-align: center; + margin-top: 15px; hr { border: 0.5px solid $azdo_blue; @@ -43,13 +44,6 @@ $feedback_column_card_height: 60px; } } - .board-metadata-form-board-settings { - padding-top: 20px; - border: $border_grey 1px solid; - padding: 10px; - margin-bottom: 5px; - } - .board-metadata-edit-column-settings { border: $border_grey 1px solid; padding: 10px; @@ -90,6 +84,14 @@ $feedback_column_card_height: 60px; } } + &.is-disabled { + .ms-Checkbox-checkbox { + &:hover { + background-color: var(--background-color); + } + } + } + .ms-Checkbox-text { color: var(--text-primary-color); diff --git a/RetrospectiveExtension.Frontend/css/feedbackBoardMetadataFormPermissions.scss b/RetrospectiveExtension.Frontend/css/feedbackBoardMetadataFormPermissions.scss new file mode 100644 index 000000000..326634d53 --- /dev/null +++ b/RetrospectiveExtension.Frontend/css/feedbackBoardMetadataFormPermissions.scss @@ -0,0 +1,88 @@ +@import "_variables.scss"; + +$content-padding: 10px; + +.board-metadata-form-permissions { + + .board-metadata-form-board-settings { + padding-top: 20px; + border: $border_grey 1px solid; + padding: $content-padding; + margin-bottom: 5px; + + &--no-padding { + padding: 0; + } + + .board-metadata-form-section-information { + margin: $content-padding + } + + .search-bar { + padding: $content-padding $content-padding 0 $content-padding; + } + + .board-metadata-table-container { + max-height: 350px; + overflow: auto; + } + + .board-metadata-table { + border-top: 1px solid rgba(0,0,0,0.1); + border-collapse: collapse; + overflow: auto; + width: 100%; + + td, th { + color: var(--text-primary-color); + padding: $content-padding; + } + + th { + position: sticky; + background-color: var(--background-color); + border-bottom: var(--border-subtle-color) 1px solid; + top: 0px; + z-index: 1; + + &.cell-checkbox { + width: 30px; + } + } + + .option-row { + + td { + &.cell-content { + background-color: var(--background-color); + + .content-image { + padding-right: $content-padding; + + .permission-image { + width: 44px; + height: 44px; + border-radius: 99999px; // rounded-full + display: flex; + align-items: center; + justify-content: center; + color: var(--text-primary-color); + background-color: var(--background-color); + } + } + + .content-text { + color: var(--text-primary-color); + + .content-sub-text { + color: var(--text-secondary-color); + } + } + } + } + } + } + } + +} + diff --git a/RetrospectiveExtension.Frontend/css/main.scss b/RetrospectiveExtension.Frontend/css/main.scss index 20dc531e0..eb19919de 100644 --- a/RetrospectiveExtension.Frontend/css/main.scss +++ b/RetrospectiveExtension.Frontend/css/main.scss @@ -5,6 +5,7 @@ @import "./feedbackBoardContainer.scss"; @import "./noFeedbackBoardsView.scss"; @import "./feedbackBoardMetadataForm.scss"; +@import "./feedbackBoardMetadataFormPermissions.scss"; @import "./feedbackBoardPreviewEmail.scss"; @import "./feedbackBoard.scss"; @import "./feedbackColumn.scss"; diff --git a/RetrospectiveExtension.Frontend/dal/azureDevOpsCoreService.tsx b/RetrospectiveExtension.Frontend/dal/azureDevOpsCoreService.tsx index f76a7f80b..0a3681021 100644 --- a/RetrospectiveExtension.Frontend/dal/azureDevOpsCoreService.tsx +++ b/RetrospectiveExtension.Frontend/dal/azureDevOpsCoreService.tsx @@ -55,7 +55,7 @@ class AzureDevOpsCoreService { const getTeamBatch = async (skip: number) => { const teamBatch: WebApiTeam[] = - await this._httpCoreClient.getTeams(projectId, forCurrentUserOnly, this.maxTeamsPerRequest, skip); + await this._httpCoreClient.getTeams(projectId, forCurrentUserOnly, this.maxTeamsPerRequest, skip, true); if (teamBatch.length > 0) { allTeams.push(...teamBatch); diff --git a/RetrospectiveExtension.Frontend/dal/boardDataService.tsx b/RetrospectiveExtension.Frontend/dal/boardDataService.tsx index a189de62a..a69df15af 100644 --- a/RetrospectiveExtension.Frontend/dal/boardDataService.tsx +++ b/RetrospectiveExtension.Frontend/dal/boardDataService.tsx @@ -1,5 +1,5 @@ import { createDocument, deleteDocument, readDocument, readDocuments, updateDocument } from './dataService'; -import { IFeedbackBoardDocument, IFeedbackColumn, IFeedbackItemDocument } from '../interfaces/feedback'; +import { IFeedbackBoardDocument, IFeedbackBoardDocumentPermissions, IFeedbackColumn, IFeedbackItemDocument } from '../interfaces/feedback'; import { v4 as uuid } from 'uuid'; import { WorkflowPhase } from '../interfaces/workItem'; import { getUserIdentity } from '../utilities/userIdentityHelper'; @@ -18,7 +18,8 @@ class BoardDataService { shouldShowFeedbackAfterCollect?: boolean, displayPrimeDirective?: boolean, startDate?: Date, - endDate?: Date) => { + endDate?: Date, + permissions?: IFeedbackBoardDocumentPermissions) => { const boardId: string = uuid(); const userIdentity = getUserIdentity(); @@ -40,6 +41,8 @@ class BoardDataService { title, boardVoteCollection: {}, teamEffectivenessMeasurementVoteCollection: [], + isPublic: this.isBoardPublic(permissions), + permissions: permissions } return await createDocument(teamId, board); @@ -88,7 +91,7 @@ class BoardDataService { await deleteDocument(teamId, boardId); } - public updateBoardMetadata = async (teamId: string, boardId: string, maxvotesPerUser: number, title: string, newColumns: IFeedbackColumn[]): Promise => { + public updateBoardMetadata = async (teamId: string, boardId: string, maxvotesPerUser: number, title: string, newColumns: IFeedbackColumn[], permissions: IFeedbackBoardDocumentPermissions): Promise => { const board: IFeedbackBoardDocument = await this.getBoardForTeamById(teamId, boardId); // Check in case board was deleted by other user after option to update was selected by current user @@ -101,6 +104,8 @@ class BoardDataService { board.maxVotesPerUser = maxvotesPerUser; board.columns = newColumns; board.modifiedDate = new Date(Date.now()); + board.isPublic = this.isBoardPublic(permissions), + board.permissions = permissions; return await this.updateBoard(teamId, board); } @@ -109,6 +114,10 @@ class BoardDataService { private updateBoard = async (teamId: string, board: IFeedbackBoardDocument): Promise => { return await updateDocument(teamId, board); } + + private isBoardPublic = (permissions: IFeedbackBoardDocumentPermissions): boolean => { + return permissions === undefined || (permissions.Teams.length === 0 && permissions.Members.length === 0); + } } export default new BoardDataService(); diff --git a/RetrospectiveExtension.Frontend/index.tsx b/RetrospectiveExtension.Frontend/index.tsx index 55f0475fe..767dddd21 100644 --- a/RetrospectiveExtension.Frontend/index.tsx +++ b/RetrospectiveExtension.Frontend/index.tsx @@ -21,7 +21,7 @@ sdkInit({ applyTheme: true }).then(() => { ReactDOM.render(

We detected an error in the application

} appInsights={reactPlugin}> - +
, document.getElementById('root') as HTMLElement, ); diff --git a/RetrospectiveExtension.Frontend/interfaces/feedback.tsx b/RetrospectiveExtension.Frontend/interfaces/feedback.tsx index 07329b1ed..591ac635d 100644 --- a/RetrospectiveExtension.Frontend/interfaces/feedback.tsx +++ b/RetrospectiveExtension.Frontend/interfaces/feedback.tsx @@ -29,6 +29,40 @@ export interface IFeedbackBoardDocument { maxVotesPerUser: number; boardVoteCollection: { [voter: string]: number }; teamEffectivenessMeasurementVoteCollection: ITeamEffectivenessMeasurementVoteCollection[]; + permissions?: IFeedbackBoardDocumentPermissions; + isPublic?: boolean; +} + +export class FeedbackBoardDocumentHelper { + static sort(board1: IFeedbackBoardDocument, board2: IFeedbackBoardDocument): number { + return (new Date(board2.createdDate).getTime() - new Date(board1.createdDate).getTime()) + } + + /** + * Filter out boards that the user does not have access to + * @param board - Current board being evaluated + * @param teamIds - List of team ids the user has access to + * @param userId - Id of the current user + * @returns + */ + static filter(board: IFeedbackBoardDocument, teamIds: string[], userId: string): boolean { + const isBoardOwner = board.createdBy?.id === userId; + const isBoardPublic = board.isPublic === undefined || board.isPublic === true; + const hasAccessByMember = board.permissions?.Members === undefined || board.permissions.Members.includes(userId); + const hasAccessByTeam = board.permissions?.Teams === undefined || teamIds.some(t => board.permissions.Teams.includes(t)); + + const hasAccess = isBoardOwner || + isBoardPublic || + hasAccessByMember || + hasAccessByTeam; + + return hasAccess; + } +} + +export interface IFeedbackBoardDocumentPermissions { + Teams: string[]; + Members: string[]; } export interface ITeamEffectivenessMeasurementVoteCollection { diff --git a/RetrospectiveExtension.Frontend/package-lock.json b/RetrospectiveExtension.Frontend/package-lock.json index 2c50c1b67..3beb49220 100644 --- a/RetrospectiveExtension.Frontend/package-lock.json +++ b/RetrospectiveExtension.Frontend/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@fluentui/react-components": "^9.45.0", "@microsoft/applicationinsights-react-js": "3.3.5", "@microsoft/applicationinsights-web": "2.8.5", "@microsoft/signalr": "6.0.7", @@ -663,7 +664,6 @@ "version": "7.19.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", - "peer": true, "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -753,6 +753,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/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -773,6 +778,36 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz", + "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/devtools": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/devtools/-/devtools-0.2.1.tgz", + "integrity": "sha512-8PHJLbD6VhBh+LJ1uty/Bz30qs02NXCE5u8WpOhSewlYXUWl03GNXknr9AS2yaAWJEQaY27x7eByJs44gODBcw==", + "peerDependencies": { + "@floating-ui/dom": ">=1.5.4" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz", + "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", + "dependencies": { + "@floating-ui/core": "^1.5.3", + "@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": "7.9.1", "resolved": "https://registry.npmjs.org/@fluentui/date-time-utilities/-/date-time-utilities-7.9.1.tgz", @@ -814,6 +849,418 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "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/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": { + "@swc/helpers": "^0.5.1" + } + }, + "node_modules/@fluentui/react-accordion": { + "version": "9.3.38", + "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.3.38.tgz", + "integrity": "sha512-BB8d9+Jr0v4SW58OJTIyvsxhA/iOBbvIkQZlVHKqt4tL8dHOIFPrApw5WqQqaSYJsEwt4HxmlNU4Dv8qRughbg==", + "dependencies": { + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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", + "scheduler": "^0.19.0 || ^0.20.0" + } + }, + "node_modules/@fluentui/react-alert": { + "version": "9.0.0-beta.104", + "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.104.tgz", + "integrity": "sha512-Z8BGSyzEKok5wlJF2cUc8GUj2q+c1D+119YF0WtHLiieh7pwOHjBcDJOHqnaVnQNbhetIA3NUht2z0e1wgOK5w==", + "dependencies": { + "@fluentui/react-avatar": "^9.6.9", + "@fluentui/react-button": "^9.3.65", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-aria": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.7.3.tgz", + "integrity": "sha512-YwyPNEcBDCdY6YzhrIrtlSrLs2Le7X1jLq9em8OnqHeiO22dBmg5xlBJoAMwJ8awCpI9xhu1PhU/2VJY4YqNuA==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-utilities": "^9.16.1", + "@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.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.6.9.tgz", + "integrity": "sha512-3aZeUhGOg+UlHsp2x//G4VKRWKclcsZvX6L9UVnHsA/nQqRw7C5Bfo9iFNsEeJ3R5W5mFA6LyEFWedJ7QdAmdQ==", + "dependencies": { + "@fluentui/react-badge": "^9.2.22", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-popover": "^9.8.33", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-tooltip": "^9.4.11", + "@fluentui/react-utilities": "^9.16.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", + "scheduler": "^0.19.0 || ^0.20.0" + } + }, + "node_modules/@fluentui/react-badge": { + "version": "9.2.22", + "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.2.22.tgz", + "integrity": "sha512-zzimP5mZiiCOm8expUTzD6yvvKbnKq22PK/L6+oNpifrvQnDwJF/0nwXQVjA3+icNoYTaHe/q0fFivpXV+Js6g==", + "dependencies": { + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-breadcrumb": { + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/@fluentui/react-breadcrumb/-/react-breadcrumb-9.0.11.tgz", + "integrity": "sha512-L+AQqZz1gqkScD8IW1CjZWGNrDaHDc/gSv+PrvgSZeGDPibGj6TnLygJ7BKM+rQ+Hc2SbCogKbERpQZCbrSFvA==", + "dependencies": { + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-button": "^9.3.65", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-link": "^9.2.7", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-button": { + "version": "9.3.65", + "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.3.65.tgz", + "integrity": "sha512-3VOt29AugkfR7VMnkKON449E7Sn/nvc6BBT4kJDGKQY+Nm5d2p9e4HmHp1UaM9zRPt47lagTY2WFJNrKKSe/BA==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-card": { + "version": "9.0.64", + "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.0.64.tgz", + "integrity": "sha512-TB/Zk+tLDUPNyAd2y8BvN0T2nroimtBOpB5GTK72E5sWPk0kaKIHwBEfXxNFGdGXcw0TAmVNqYi4ks37vh0Rgg==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-checkbox": { + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.2.8.tgz", + "integrity": "sha512-L4aWzeZdi98d0ZhgNPtxghfhasQv1qlxIRMaPxtwvk5TN6i9YmRF8vf5Pmf0PESjT+zp3VPcisHcIfcqG26SmQ==", + "dependencies": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-label": "^9.1.58", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-combobox": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.7.0.tgz", + "integrity": "sha512-YmTdg04rvsg2+Dkw3ob+YLnS9rm3TLVMMNYTH0T64/FM3qirHntIXGbhMZXP5Cdo14gzQwr/e78NjBRKfYO4Wg==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-portal": "^9.4.10", + "@fluentui/react-positioning": "^9.12.4", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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", + "scheduler": "^0.19.0 || ^0.20.0" + } + }, + "node_modules/@fluentui/react-components": { + "version": "9.45.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.45.0.tgz", + "integrity": "sha512-Y+Laj1dvRcCp/nWT0DExRXoh7oKTX458g6oltrGjhIHikq4D6/kssK5tfhCyknPLwIlVSYi5J+G6L3NfvI8a8w==", + "dependencies": { + "@fluentui/react-accordion": "^9.3.38", + "@fluentui/react-alert": "9.0.0-beta.104", + "@fluentui/react-avatar": "^9.6.9", + "@fluentui/react-badge": "^9.2.22", + "@fluentui/react-breadcrumb": "^9.0.11", + "@fluentui/react-button": "^9.3.65", + "@fluentui/react-card": "^9.0.64", + "@fluentui/react-checkbox": "^9.2.8", + "@fluentui/react-combobox": "^9.7.0", + "@fluentui/react-dialog": "^9.9.7", + "@fluentui/react-divider": "^9.2.58", + "@fluentui/react-drawer": "^9.1.1", + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-image": "^9.1.55", + "@fluentui/react-infobutton": "9.0.0-beta.88", + "@fluentui/react-infolabel": "^9.0.16", + "@fluentui/react-input": "^9.4.60", + "@fluentui/react-label": "^9.1.58", + "@fluentui/react-link": "^9.2.7", + "@fluentui/react-menu": "^9.12.45", + "@fluentui/react-message-bar": "^9.0.16", + "@fluentui/react-overflow": "^9.1.8", + "@fluentui/react-persona": "^9.2.68", + "@fluentui/react-popover": "^9.8.33", + "@fluentui/react-portal": "^9.4.10", + "@fluentui/react-positioning": "^9.12.4", + "@fluentui/react-progress": "^9.1.60", + "@fluentui/react-provider": "^9.13.8", + "@fluentui/react-radio": "^9.2.3", + "@fluentui/react-select": "^9.1.60", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-skeleton": "^9.0.48", + "@fluentui/react-slider": "^9.1.65", + "@fluentui/react-spinbutton": "^9.2.60", + "@fluentui/react-spinner": "^9.3.38", + "@fluentui/react-switch": "^9.1.65", + "@fluentui/react-table": "^9.11.5", + "@fluentui/react-tabs": "^9.4.6", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-tags": "^9.0.22", + "@fluentui/react-text": "^9.4.7", + "@fluentui/react-textarea": "^9.3.60", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-toast": "^9.3.27", + "@fluentui/react-toolbar": "^9.1.66", + "@fluentui/react-tooltip": "^9.4.11", + "@fluentui/react-tree": "^9.4.25", + "@fluentui/react-utilities": "^9.16.1", + "@fluentui/react-virtualizer": "9.0.0-alpha.66", + "@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", + "scheduler": "^0.19.0 || ^0.20.0" + } + }, + "node_modules/@fluentui/react-context-selector": { + "version": "9.1.49", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.49.tgz", + "integrity": "sha512-u4wRNfnyfuZDalVEESBPFQ0Ue4yYu+ozkPQvuEV6kriQGnAQQyyVbIidOCuP7Sja0nBwgM8eAzK0uX/slmmj3Q==", + "dependencies": { + "@fluentui/react-utilities": "^9.16.1", + "@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.20.0" + } + }, + "node_modules/@fluentui/react-dialog": { + "version": "9.9.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.9.7.tgz", + "integrity": "sha512-5/6MeaHOYpx8Vt0auMJGLCjn6O1IYtl6IhwdwRNXL6AS1o4F24IKXdWZPtiHWuvzbuZAQd3+5nRDUE5KC9We6A==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-portal": "^9.4.10", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@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.58", + "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.2.58.tgz", + "integrity": "sha512-y1ECy1zM4imKhpyOyUGugB+J30tfySO5hhrsIcpaiUQxRjE4IhZf2ZG6EqAQYLinJ+hV06yLZoazekljlvk6yw==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-drawer": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.1.1.tgz", + "integrity": "sha512-3zvbbeaLLJZa4MXRpW8Ta4DFZ5457Tq9/4a0CqsIW/+8EuwtJwO+FB5a0DS6j0q6kN4mjkWF19OvzMkJsSTRVw==", + "dependencies": { + "@fluentui/react-dialog": "^9.9.7", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-motion-preview": "^0.5.10", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-field": { + "version": "9.1.50", + "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.1.50.tgz", + "integrity": "sha512-2mbx7YReMWvrgi3set9KepLLgMyNJ7StLu/HiHMM3jkcgPt3mGfwoJEsEKt+xd8eUAo4b82F7t+tHI4f9yzJaQ==", + "dependencies": { + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-label": "^9.1.58", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-focus": { "version": "7.18.5", "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-7.18.5.tgz", @@ -838,6 +1285,807 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "node_modules/@fluentui/react-icons": { + "version": "2.0.225", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.225.tgz", + "integrity": "sha512-L9phN3bAMlZCa5+/ObGjIO+5GI8M50ym766sraSq92jaJwgAXrCJDLWuDGWZRGrC63DcagtR2culptj3q7gMMg==", + "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.55", + "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.1.55.tgz", + "integrity": "sha512-hYP61OWLuGSJNPOGJXtphbiDESfLB+/vsODKQsJhrDRJ2CSNMAfNznPHucqGRRN6AWQOI/BynJDS5F22Y//7CQ==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-infobutton": { + "version": "9.0.0-beta.88", + "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.88.tgz", + "integrity": "sha512-NVZyfrLtoFNu7cGkp2ORWsxJiCk1JgN4CVBDj03QSIh14EsPMwphYgDwfQ8TZOF2Nub0DGtC7/tF8IUlb/aP6g==", + "dependencies": { + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-label": "^9.1.58", + "@fluentui/react-popover": "^9.8.33", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-infolabel": { + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-infolabel/-/react-infolabel-9.0.16.tgz", + "integrity": "sha512-UCY+2vB4vOn0LfVhbgkyNG0EiuKIe0PdxEAtLU2PqosHLkaLKnYDKJdiIS/oaFmyNtGHmMxRkigvZpZ7h74f9g==", + "dependencies": { + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-label": "^9.1.58", + "@fluentui/react-popover": "^9.8.33", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@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.60", + "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.4.60.tgz", + "integrity": "sha512-kuk24K0X0gckTCssXoiWvZsTFVpZJv+WPl2fkjxeffzmFfBZtJUFQkXeC4/hcAg+aScjZnEtqjHjwDEbjZqkeA==", + "dependencies": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-jsx-runtime": { + "version": "9.0.27", + "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.0.27.tgz", + "integrity": "sha512-9wxsWxVI7RLXsdK+7lzp7TK0FJKnrrj+Igxn0prqAvXdBRiFcuycoCJaHzC4Ka+Hsiol8NQg6xaIR59a28lmyQ==", + "dependencies": { + "@fluentui/react-utilities": "^9.16.1", + "@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.58", + "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.1.58.tgz", + "integrity": "sha512-0ouSMop4vpXJzMvAyfmIr3TgDM/W1k+GFm8ZPD5fDQCopSJ+h3kvUZg5pqaXpBwamvZ16+qRARfTNITp2U7Rjw==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-link": { + "version": "9.2.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.2.7.tgz", + "integrity": "sha512-z4X9dcUc/7FlqDxbGKbOfWubru+QimtzgMtlVxZ30pkC959hfIbFpbBY6Me76UOuFiOZxUPdfyY/73ekhhhVxw==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-menu": { + "version": "9.12.45", + "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.12.45.tgz", + "integrity": "sha512-qhpmuvAB4DUmmC5lNMakVvZjTdj/GZnH6WctNGZp94iCZLhcnIQcM9l0PvRpUpU1v3irXRyE5QV+x+wXC0awTw==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-portal": "^9.4.10", + "@fluentui/react-positioning": "^9.12.4", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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", + "scheduler": "^0.19.0 || ^0.20.0" + } + }, + "node_modules/@fluentui/react-message-bar": { + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-message-bar/-/react-message-bar-9.0.16.tgz", + "integrity": "sha512-R1VnqcFwu0pM2Yk8rjkN48Lx/n44UFD13BuY8/JeEuU8XQ8hLnEBVtdHjzRPJk+iM5in2ScMMQj4Z0nWyCRM1Q==", + "dependencies": { + "@fluentui/react-button": "^9.3.65", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@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.10", + "resolved": "https://registry.npmjs.org/@fluentui/react-motion-preview/-/react-motion-preview-0.5.10.tgz", + "integrity": "sha512-6iwF3N4hB6IxCoFVusgA2mp6mrTknwcsVGNYEQw1YF5WgGOMF3M0N1xNpN61/SYziT6HSUaI38NaA7LI3Dp3Sw==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-overflow": { + "version": "9.1.8", + "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.1.8.tgz", + "integrity": "sha512-W8L68+0bUtfGr72LRx+U05EZLO0E8VMfscDiNKiEjDrOqdBnqNAIDN86825wrN77HH2wvILN07EhPOauqzz8YQ==", + "dependencies": { + "@fluentui/priority-overflow": "^9.1.11", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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", + "scheduler": "^0.19.0 || ^0.20.0" + } + }, + "node_modules/@fluentui/react-persona": { + "version": "9.2.68", + "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.2.68.tgz", + "integrity": "sha512-CYtDiZ34GGaw7lZ85uHZOuYXzkY21VHN6cUlGY1TJn98+Xz+y7JoVLIG7KZHHp2JzmmjtwjvgnqAdOun5LrWig==", + "dependencies": { + "@fluentui/react-avatar": "^9.6.9", + "@fluentui/react-badge": "^9.2.22", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-popover": { + "version": "9.8.33", + "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.8.33.tgz", + "integrity": "sha512-0yPX6KCdMEGmrvJnQles5iTKN0OZ2vNSPVdkbyEKIUKj5DrNK1cMZEV/7Tgrtn922fx3/74FLMqEpEDTdrvQ/Q==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-portal": "^9.4.10", + "@fluentui/react-positioning": "^9.12.4", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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", + "scheduler": "^0.19.0 || ^0.20.0" + } + }, + "node_modules/@fluentui/react-portal": { + "version": "9.4.10", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.4.10.tgz", + "integrity": "sha512-k8fTRv9wTPSPCuNBFE2HxIhXsVYoG6Azb6Ib2xaDK+nczoW2WbsmNmwBJGEGi8UKjIoQzV+95KsYQ9me+uqKPA==", + "dependencies": { + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-utilities": "^9.16.1", + "@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-positioning": { + "version": "9.12.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.12.4.tgz", + "integrity": "sha512-qQAjHF/FJFs2TyK0x08t0iFtDQlGNGH0OFC3jrG1xIFEe3nFPoeYeNT3zxOmj+D7bvlcJTIITcoe++YQTnCf4w==", + "dependencies": { + "@floating-ui/devtools": "0.2.1", + "@floating-ui/dom": "^1.2.0", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-progress": { + "version": "9.1.60", + "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.1.60.tgz", + "integrity": "sha512-9wC7lWdo3S8rhxKWlIhcYAzsZNw+rL2HvNJTvEvFxXcOG7nJxP/3mGclV/jCCwDoPDnt9BT+40pGK84eD0BNIA==", + "dependencies": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-provider": { + "version": "9.13.8", + "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.13.8.tgz", + "integrity": "sha512-FCvDMjs/BNAcqJuHU+kN/lqLB2RDQ/LQo29ltfLKFlTR1nTUNJvPMOVhjj6eEt+t81628LOYhbbaXOj9rYtfGg==", + "dependencies": { + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@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.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.2.3.tgz", + "integrity": "sha512-8eKeUL0ZNr792Q6NGWPp7dpOV2IFcjAQ2oWR2/bruQVu8LMzYYKe2o6pQWdCag6UGPZuszkms9Xl7zPdDQBUdA==", + "dependencies": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-label": "^9.1.58", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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", + "scheduler": "^0.19.0 || ^0.20.0" + } + }, + "node_modules/@fluentui/react-select": { + "version": "9.1.60", + "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.1.60.tgz", + "integrity": "sha512-4HfRRTlGStOgtO00RY6jmOwz6MXnoa9gtjkV7StLmJZ2U5NTjVUrnp2dP1Vjb6hO13xaihWGEYyYKnsQ3R7kIw==", + "dependencies": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-shared-contexts": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.14.0.tgz", + "integrity": "sha512-P9yhg31WYfB1W66/gD3+qVCLBsyIEcOzQvKVaIQvd9UhF67lNW4kMXUB6YVOk5PV0Og4hXnkH/vuHl7YMD9RHw==", + "dependencies": { + "@fluentui/react-theme": "^9.1.16", + "@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.0.48", + "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.0.48.tgz", + "integrity": "sha512-P0Rw5hIOn5CrZIWg7nVoK3gamxFhZI80KcRVaWap4O3gLo5C8nKHJWOtyBQZ5WKH+S6hoEGZ2USL6CoyXslxeQ==", + "dependencies": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-slider": { + "version": "9.1.65", + "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.1.65.tgz", + "integrity": "sha512-7kuJMIojxCmNOuiRmQwh9iiXx8zwxkrgvsWmReRIBX0WB6w1VqMcuuikq2Z2ISgNPmepCX8W+qDfx8Ne4F/HtQ==", + "dependencies": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-spinbutton": { + "version": "9.2.60", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.2.60.tgz", + "integrity": "sha512-0IIxEH0CTf4fNMoyvMa37bc63+0ZlznlsNy8lF3hujAT8Z9sUKVMH68e6tGUuXGJIkCUyDKU8HA+9FF2DyPvNA==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-spinner": { + "version": "9.3.38", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.3.38.tgz", + "integrity": "sha512-dPJr7/rgU2Qe/K2BciJTAEwEd0ytGpCw3VOVyK2T25w7Jw5RAHmgP+mbw+7se44Mr6sd1LH76mh5sfmQ3tODgw==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-label": "^9.1.58", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-switch": { + "version": "9.1.65", + "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.1.65.tgz", + "integrity": "sha512-P0DwogD6hZJ3O005zCFPDoFXuzkrpKMrAeQGh9X0fqFP5JyHXVCgAAZQOLcphbbT9QukoEF5irN2Z4L9gBn57A==", + "dependencies": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-label": "^9.1.58", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-table": { + "version": "9.11.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.11.5.tgz", + "integrity": "sha512-roQRITOtl1aqXlachS2oTraVE45x3KdDrX0KyQGCdcQRxNprXJW6dIK9QjlbAL6yAsAMDafmFA4y9uRxl408dQ==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-avatar": "^9.6.9", + "@fluentui/react-checkbox": "^9.2.8", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-radio": "^9.2.3", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-tabs": { + "version": "9.4.6", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.4.6.tgz", + "integrity": "sha512-LQvibLeJFyqKKiOjZUkRvbfLtsVosUhNUdh1SCQUPxQVpEPSK6XgwK0A1+jjoVhKn+PAJakxRINgnvqQD8pQBA==", + "dependencies": { + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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", + "scheduler": "^0.19.0 || ^0.20.0" + } + }, + "node_modules/@fluentui/react-tabster": { + "version": "9.17.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.17.3.tgz", + "integrity": "sha512-cFcUYrkGW15w5yXzCPTTVG/7x5kNXxnhQXuh8SPyCc9JZeG7XI3+hy1T37PsXGxNS4KN9ePHkBHzgDfYO4gzYQ==", + "dependencies": { + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "keyborg": "^2.3.0", + "tabster": "^5.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-tags": { + "version": "9.0.22", + "resolved": "https://registry.npmjs.org/@fluentui/react-tags/-/react-tags-9.0.22.tgz", + "integrity": "sha512-gQIOCVu3HIfGjtAmwOnwBEnTsNyRBU8Pvs6EugpUyyqkRjzbm5TnL3LtiUy4f6/+NuaRqcYAvhwpdUhrlciwcA==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-avatar": "^9.6.9", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-text": { + "version": "9.4.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.4.7.tgz", + "integrity": "sha512-c6uJ98B35L8sviYxhQj1i+LW+HVNDdco2ImS9VLv/Duo4HiYs1G2y1YhtBDDiGxLe2moIvfg9ajDzMZV29aXFw==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-textarea": { + "version": "9.3.60", + "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.3.60.tgz", + "integrity": "sha512-wH4MBWT4EOgNH9FXTjcgH34oANUaoduhmVjffnxaPl3R767Ak0fZPG7kky7yrLMjTDUSwILsEj/q+hsN6o+7Ag==", + "dependencies": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-theme": { + "version": "9.1.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-theme/-/react-theme-9.1.16.tgz", + "integrity": "sha512-QK2dGE5aQXN1UGdiEmGKpYGP3tHXIchLvFf8DEEOWnF4XBc9SiEPNFYkvLMJjHxZmDz4D670rsOPe0r5jFDEKQ==", + "dependencies": { + "@fluentui/tokens": "1.0.0-alpha.13", + "@swc/helpers": "^0.5.1" + } + }, + "node_modules/@fluentui/react-toast": { + "version": "9.3.27", + "resolved": "https://registry.npmjs.org/@fluentui/react-toast/-/react-toast-9.3.27.tgz", + "integrity": "sha512-DbRAYyL5Bd/pcFiGHPpK+rQMyc4LBll9YBy496l97dGDO2HmqFuiwP74V1KznxLcr4inCNWwThIJws5VLFsJLg==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-portal": "^9.4.10", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@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.66", + "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.1.66.tgz", + "integrity": "sha512-ooNTp1R5MBZwiVK8fiJu29gE48vUx4NbXdwB2yHcCprasG3asjuoKQfOYM4+1NfFA0DetVrbK8L46IBeZyeBvA==", + "dependencies": { + "@fluentui/react-button": "^9.3.65", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-divider": "^9.2.58", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-radio": "^9.2.3", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-tooltip": { + "version": "9.4.11", + "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.4.11.tgz", + "integrity": "sha512-HXm8yYuAHJuczeFExco0WQSjO3DzDj5AJxqICHF8qtbtihUKfWpPnKM1qQWR+yJR2zc2jzvOEIzZXEkxSG+fSg==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-portal": "^9.4.10", + "@fluentui/react-positioning": "^9.12.4", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-tree": { + "version": "9.4.25", + "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.4.25.tgz", + "integrity": "sha512-7IMqnOiNFMRuPujnbxJUYD8AEh0z1OGXkdNkAeLyj3pkwuvQs9+TbaNtv5Z372YN+kwYF4EYalYcPuNsRlx7cQ==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-avatar": "^9.6.9", + "@fluentui/react-button": "^9.3.65", + "@fluentui/react-checkbox": "^9.2.8", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-radio": "^9.2.3", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.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-utilities": { + "version": "9.16.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.16.1.tgz", + "integrity": "sha512-2wdwmgTFcVy14ZLbRNJ8Q6dCCBLekkJ8Znnok68gKRLDcwpPT3UjSraoU+DGjOA5BMfPppZBU8Yb5GqdIfd48g==", + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-shared-contexts": "^9.14.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.66", + "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.66.tgz", + "integrity": "sha512-x/ZOAIAwctt7pvOBIzS4iZGU0ahiPhQFS7iAHksFkF9LimneaV92A/02dW0Cy4v7dv9wZNoosQwhS05Yx3DVDQ==", + "dependencies": { + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-utilities": "^9.16.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-window-provider": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-1.0.3.tgz", @@ -880,6 +2128,14 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "node_modules/@fluentui/tokens": { + "version": "1.0.0-alpha.13", + "resolved": "https://registry.npmjs.org/@fluentui/tokens/-/tokens-1.0.0-alpha.13.tgz", + "integrity": "sha512-IzYysTTBkAH7tQZxYKpzhxYnTJkvwXhjhTOpmERgnqTFifHTP8/vaQjJAAm7dI/9zlDx1oN+y/I+KzL9bDLHZQ==", + "dependencies": { + "@swc/helpers": "^0.5.1" + } + }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -888,6 +2144,39 @@ "optional": true, "peer": true }, + "node_modules/@griffel/core": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@griffel/core/-/core-1.15.2.tgz", + "integrity": "sha512-RlsIXoSS3gaYykUgxFpwKAs/DV9cRUKp3CW1kt3iPAtsDTWn/o+8bT1jvBws/tMM2GBu/Uc0EkaIzUPqD7uA+Q==", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@griffel/style-types": "^1.0.3", + "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.20", + "resolved": "https://registry.npmjs.org/@griffel/react/-/react-1.5.20.tgz", + "integrity": "sha512-1P2yaPctENFSCwyPIYXBmgpNH68c0lc/jwSzPij1QATHDK1AASKuSeq6hW108I67RKjhRyHCcALshdZ3GcQXSg==", + "dependencies": { + "@griffel/core": "^1.15.2", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.8.0 <19.0.0" + } + }, + "node_modules/@griffel/style-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@griffel/style-types/-/style-types-1.0.3.tgz", + "integrity": "sha512-AzbbYV/EobNIBtfMtyu2edFin895gjVxtu1nsRhTETUAIb0/LCZoue3Jd/kFLuPwe95rv5WRUBiQpVwJsrrFcw==", + "dependencies": { + "csstype": "^3.1.3" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.9.5", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", @@ -1564,6 +2853,14 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/@swc/helpers": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz", + "integrity": "sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@tanstack/react-table": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.10.0.tgz", @@ -4720,9 +6017,9 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "node_modules/csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/cycle": { "version": "1.0.3", @@ -5064,6 +6361,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/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -8773,6 +10079,11 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/keyborg": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/keyborg/-/keyborg-2.4.1.tgz", + "integrity": "sha512-B9EZwDd36WKlIq6JmimaTsTDx5E0aUqZcxtgTfK66ut1FbRXYhBmiB7Al2qKzB7CCX9C49sTBiiyVzsXCA6J4Q==" + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -10952,8 +12263,7 @@ "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==", - "dev": true + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/react-shallow-renderer": { "version": "16.15.0", @@ -11011,6 +12321,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/read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -11197,8 +12522,7 @@ "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "peer": true + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", @@ -11463,6 +12787,14 @@ "nearley": "^2.7.10" } }, + "node_modules/rtl-css-js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", + "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -12420,6 +13752,11 @@ "webpack": "^5.0.0" } }, + "node_modules/stylis": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", + "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12461,6 +13798,15 @@ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, + "node_modules/tabster": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/tabster/-/tabster-5.2.1.tgz", + "integrity": "sha512-UGl95j5YHbn9wpNA3hX/mTfH7n+y/HFSHVGPkj9Nx06+CXT3mRwTR2/ub1dqii5pG83LJ6xn2F4jSFrUgOwhuA==", + "dependencies": { + "keyborg": "^2.2.0", + "tslib": "^2.3.1" + } + }, "node_modules/tailwindcss": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.6.tgz", @@ -12989,8 +14335,7 @@ "node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "peer": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -13231,6 +14576,17 @@ "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/util": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", @@ -14636,7 +15992,6 @@ "version": "7.19.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", - "peer": true, "requires": { "regenerator-runtime": "^0.13.4" } @@ -14707,6 +16062,11 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "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/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -14724,6 +16084,34 @@ "strip-json-comments": "^3.1.1" } }, + "@floating-ui/core": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz", + "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", + "requires": { + "@floating-ui/utils": "^0.2.0" + } + }, + "@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.5.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz", + "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", + "requires": { + "@floating-ui/core": "^1.5.3", + "@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": "7.9.1", "resolved": "https://registry.npmjs.org/@fluentui/date-time-utilities/-/date-time-utilities-7.9.1.tgz", @@ -14771,6 +16159,317 @@ } } }, + "@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==", + "requires": { + "@swc/helpers": "^0.5.1" + } + }, + "@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-accordion": { + "version": "9.3.38", + "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.3.38.tgz", + "integrity": "sha512-BB8d9+Jr0v4SW58OJTIyvsxhA/iOBbvIkQZlVHKqt4tL8dHOIFPrApw5WqQqaSYJsEwt4HxmlNU4Dv8qRughbg==", + "requires": { + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-alert": { + "version": "9.0.0-beta.104", + "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.104.tgz", + "integrity": "sha512-Z8BGSyzEKok5wlJF2cUc8GUj2q+c1D+119YF0WtHLiieh7pwOHjBcDJOHqnaVnQNbhetIA3NUht2z0e1wgOK5w==", + "requires": { + "@fluentui/react-avatar": "^9.6.9", + "@fluentui/react-button": "^9.3.65", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-aria": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.7.3.tgz", + "integrity": "sha512-YwyPNEcBDCdY6YzhrIrtlSrLs2Le7X1jLq9em8OnqHeiO22dBmg5xlBJoAMwJ8awCpI9xhu1PhU/2VJY4YqNuA==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-utilities": "^9.16.1", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-avatar": { + "version": "9.6.9", + "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.6.9.tgz", + "integrity": "sha512-3aZeUhGOg+UlHsp2x//G4VKRWKclcsZvX6L9UVnHsA/nQqRw7C5Bfo9iFNsEeJ3R5W5mFA6LyEFWedJ7QdAmdQ==", + "requires": { + "@fluentui/react-badge": "^9.2.22", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-popover": "^9.8.33", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-tooltip": "^9.4.11", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-badge": { + "version": "9.2.22", + "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.2.22.tgz", + "integrity": "sha512-zzimP5mZiiCOm8expUTzD6yvvKbnKq22PK/L6+oNpifrvQnDwJF/0nwXQVjA3+icNoYTaHe/q0fFivpXV+Js6g==", + "requires": { + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-breadcrumb": { + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/@fluentui/react-breadcrumb/-/react-breadcrumb-9.0.11.tgz", + "integrity": "sha512-L+AQqZz1gqkScD8IW1CjZWGNrDaHDc/gSv+PrvgSZeGDPibGj6TnLygJ7BKM+rQ+Hc2SbCogKbERpQZCbrSFvA==", + "requires": { + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-button": "^9.3.65", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-link": "^9.2.7", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-button": { + "version": "9.3.65", + "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.3.65.tgz", + "integrity": "sha512-3VOt29AugkfR7VMnkKON449E7Sn/nvc6BBT4kJDGKQY+Nm5d2p9e4HmHp1UaM9zRPt47lagTY2WFJNrKKSe/BA==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-card": { + "version": "9.0.64", + "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.0.64.tgz", + "integrity": "sha512-TB/Zk+tLDUPNyAd2y8BvN0T2nroimtBOpB5GTK72E5sWPk0kaKIHwBEfXxNFGdGXcw0TAmVNqYi4ks37vh0Rgg==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-checkbox": { + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.2.8.tgz", + "integrity": "sha512-L4aWzeZdi98d0ZhgNPtxghfhasQv1qlxIRMaPxtwvk5TN6i9YmRF8vf5Pmf0PESjT+zp3VPcisHcIfcqG26SmQ==", + "requires": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-label": "^9.1.58", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-combobox": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.7.0.tgz", + "integrity": "sha512-YmTdg04rvsg2+Dkw3ob+YLnS9rm3TLVMMNYTH0T64/FM3qirHntIXGbhMZXP5Cdo14gzQwr/e78NjBRKfYO4Wg==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-portal": "^9.4.10", + "@fluentui/react-positioning": "^9.12.4", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-components": { + "version": "9.45.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.45.0.tgz", + "integrity": "sha512-Y+Laj1dvRcCp/nWT0DExRXoh7oKTX458g6oltrGjhIHikq4D6/kssK5tfhCyknPLwIlVSYi5J+G6L3NfvI8a8w==", + "requires": { + "@fluentui/react-accordion": "^9.3.38", + "@fluentui/react-alert": "9.0.0-beta.104", + "@fluentui/react-avatar": "^9.6.9", + "@fluentui/react-badge": "^9.2.22", + "@fluentui/react-breadcrumb": "^9.0.11", + "@fluentui/react-button": "^9.3.65", + "@fluentui/react-card": "^9.0.64", + "@fluentui/react-checkbox": "^9.2.8", + "@fluentui/react-combobox": "^9.7.0", + "@fluentui/react-dialog": "^9.9.7", + "@fluentui/react-divider": "^9.2.58", + "@fluentui/react-drawer": "^9.1.1", + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-image": "^9.1.55", + "@fluentui/react-infobutton": "9.0.0-beta.88", + "@fluentui/react-infolabel": "^9.0.16", + "@fluentui/react-input": "^9.4.60", + "@fluentui/react-label": "^9.1.58", + "@fluentui/react-link": "^9.2.7", + "@fluentui/react-menu": "^9.12.45", + "@fluentui/react-message-bar": "^9.0.16", + "@fluentui/react-overflow": "^9.1.8", + "@fluentui/react-persona": "^9.2.68", + "@fluentui/react-popover": "^9.8.33", + "@fluentui/react-portal": "^9.4.10", + "@fluentui/react-positioning": "^9.12.4", + "@fluentui/react-progress": "^9.1.60", + "@fluentui/react-provider": "^9.13.8", + "@fluentui/react-radio": "^9.2.3", + "@fluentui/react-select": "^9.1.60", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-skeleton": "^9.0.48", + "@fluentui/react-slider": "^9.1.65", + "@fluentui/react-spinbutton": "^9.2.60", + "@fluentui/react-spinner": "^9.3.38", + "@fluentui/react-switch": "^9.1.65", + "@fluentui/react-table": "^9.11.5", + "@fluentui/react-tabs": "^9.4.6", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-tags": "^9.0.22", + "@fluentui/react-text": "^9.4.7", + "@fluentui/react-textarea": "^9.3.60", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-toast": "^9.3.27", + "@fluentui/react-toolbar": "^9.1.66", + "@fluentui/react-tooltip": "^9.4.11", + "@fluentui/react-tree": "^9.4.25", + "@fluentui/react-utilities": "^9.16.1", + "@fluentui/react-virtualizer": "9.0.0-alpha.66", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-context-selector": { + "version": "9.1.49", + "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.49.tgz", + "integrity": "sha512-u4wRNfnyfuZDalVEESBPFQ0Ue4yYu+ozkPQvuEV6kriQGnAQQyyVbIidOCuP7Sja0nBwgM8eAzK0uX/slmmj3Q==", + "requires": { + "@fluentui/react-utilities": "^9.16.1", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-dialog": { + "version": "9.9.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.9.7.tgz", + "integrity": "sha512-5/6MeaHOYpx8Vt0auMJGLCjn6O1IYtl6IhwdwRNXL6AS1o4F24IKXdWZPtiHWuvzbuZAQd3+5nRDUE5KC9We6A==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-portal": "^9.4.10", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "react-transition-group": "^4.4.1" + } + }, + "@fluentui/react-divider": { + "version": "9.2.58", + "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.2.58.tgz", + "integrity": "sha512-y1ECy1zM4imKhpyOyUGugB+J30tfySO5hhrsIcpaiUQxRjE4IhZf2ZG6EqAQYLinJ+hV06yLZoazekljlvk6yw==", + "requires": { + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-drawer": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.1.1.tgz", + "integrity": "sha512-3zvbbeaLLJZa4MXRpW8Ta4DFZ5457Tq9/4a0CqsIW/+8EuwtJwO+FB5a0DS6j0q6kN4mjkWF19OvzMkJsSTRVw==", + "requires": { + "@fluentui/react-dialog": "^9.9.7", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-motion-preview": "^0.5.10", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-field": { + "version": "9.1.50", + "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.1.50.tgz", + "integrity": "sha512-2mbx7YReMWvrgi3set9KepLLgMyNJ7StLu/HiHMM3jkcgPt3mGfwoJEsEKt+xd8eUAo4b82F7t+tHI4f9yzJaQ==", + "requires": { + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-label": "^9.1.58", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, "@fluentui/react-focus": { "version": "7.18.5", "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-7.18.5.tgz", @@ -14791,6 +16490,583 @@ } } }, + "@fluentui/react-icons": { + "version": "2.0.225", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.225.tgz", + "integrity": "sha512-L9phN3bAMlZCa5+/ObGjIO+5GI8M50ym766sraSq92jaJwgAXrCJDLWuDGWZRGrC63DcagtR2culptj3q7gMMg==", + "requires": { + "@griffel/react": "^1.0.0", + "tslib": "^2.1.0" + } + }, + "@fluentui/react-image": { + "version": "9.1.55", + "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.1.55.tgz", + "integrity": "sha512-hYP61OWLuGSJNPOGJXtphbiDESfLB+/vsODKQsJhrDRJ2CSNMAfNznPHucqGRRN6AWQOI/BynJDS5F22Y//7CQ==", + "requires": { + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-infobutton": { + "version": "9.0.0-beta.88", + "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.88.tgz", + "integrity": "sha512-NVZyfrLtoFNu7cGkp2ORWsxJiCk1JgN4CVBDj03QSIh14EsPMwphYgDwfQ8TZOF2Nub0DGtC7/tF8IUlb/aP6g==", + "requires": { + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-label": "^9.1.58", + "@fluentui/react-popover": "^9.8.33", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-infolabel": { + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-infolabel/-/react-infolabel-9.0.16.tgz", + "integrity": "sha512-UCY+2vB4vOn0LfVhbgkyNG0EiuKIe0PdxEAtLU2PqosHLkaLKnYDKJdiIS/oaFmyNtGHmMxRkigvZpZ7h74f9g==", + "requires": { + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-label": "^9.1.58", + "@fluentui/react-popover": "^9.8.33", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-input": { + "version": "9.4.60", + "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.4.60.tgz", + "integrity": "sha512-kuk24K0X0gckTCssXoiWvZsTFVpZJv+WPl2fkjxeffzmFfBZtJUFQkXeC4/hcAg+aScjZnEtqjHjwDEbjZqkeA==", + "requires": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-jsx-runtime": { + "version": "9.0.27", + "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.0.27.tgz", + "integrity": "sha512-9wxsWxVI7RLXsdK+7lzp7TK0FJKnrrj+Igxn0prqAvXdBRiFcuycoCJaHzC4Ka+Hsiol8NQg6xaIR59a28lmyQ==", + "requires": { + "@fluentui/react-utilities": "^9.16.1", + "@swc/helpers": "^0.5.1", + "react-is": "^17.0.2" + } + }, + "@fluentui/react-label": { + "version": "9.1.58", + "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.1.58.tgz", + "integrity": "sha512-0ouSMop4vpXJzMvAyfmIr3TgDM/W1k+GFm8ZPD5fDQCopSJ+h3kvUZg5pqaXpBwamvZ16+qRARfTNITp2U7Rjw==", + "requires": { + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-link": { + "version": "9.2.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.2.7.tgz", + "integrity": "sha512-z4X9dcUc/7FlqDxbGKbOfWubru+QimtzgMtlVxZ30pkC959hfIbFpbBY6Me76UOuFiOZxUPdfyY/73ekhhhVxw==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-menu": { + "version": "9.12.45", + "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.12.45.tgz", + "integrity": "sha512-qhpmuvAB4DUmmC5lNMakVvZjTdj/GZnH6WctNGZp94iCZLhcnIQcM9l0PvRpUpU1v3irXRyE5QV+x+wXC0awTw==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-portal": "^9.4.10", + "@fluentui/react-positioning": "^9.12.4", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-message-bar": { + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-message-bar/-/react-message-bar-9.0.16.tgz", + "integrity": "sha512-R1VnqcFwu0pM2Yk8rjkN48Lx/n44UFD13BuY8/JeEuU8XQ8hLnEBVtdHjzRPJk+iM5in2ScMMQj4Z0nWyCRM1Q==", + "requires": { + "@fluentui/react-button": "^9.3.65", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "react-transition-group": "^4.4.1" + } + }, + "@fluentui/react-motion-preview": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@fluentui/react-motion-preview/-/react-motion-preview-0.5.10.tgz", + "integrity": "sha512-6iwF3N4hB6IxCoFVusgA2mp6mrTknwcsVGNYEQw1YF5WgGOMF3M0N1xNpN61/SYziT6HSUaI38NaA7LI3Dp3Sw==", + "requires": { + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-overflow": { + "version": "9.1.8", + "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.1.8.tgz", + "integrity": "sha512-W8L68+0bUtfGr72LRx+U05EZLO0E8VMfscDiNKiEjDrOqdBnqNAIDN86825wrN77HH2wvILN07EhPOauqzz8YQ==", + "requires": { + "@fluentui/priority-overflow": "^9.1.11", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-persona": { + "version": "9.2.68", + "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.2.68.tgz", + "integrity": "sha512-CYtDiZ34GGaw7lZ85uHZOuYXzkY21VHN6cUlGY1TJn98+Xz+y7JoVLIG7KZHHp2JzmmjtwjvgnqAdOun5LrWig==", + "requires": { + "@fluentui/react-avatar": "^9.6.9", + "@fluentui/react-badge": "^9.2.22", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-popover": { + "version": "9.8.33", + "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.8.33.tgz", + "integrity": "sha512-0yPX6KCdMEGmrvJnQles5iTKN0OZ2vNSPVdkbyEKIUKj5DrNK1cMZEV/7Tgrtn922fx3/74FLMqEpEDTdrvQ/Q==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-portal": "^9.4.10", + "@fluentui/react-positioning": "^9.12.4", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-portal": { + "version": "9.4.10", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.4.10.tgz", + "integrity": "sha512-k8fTRv9wTPSPCuNBFE2HxIhXsVYoG6Azb6Ib2xaDK+nczoW2WbsmNmwBJGEGi8UKjIoQzV+95KsYQ9me+uqKPA==", + "requires": { + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "use-disposable": "^1.0.1" + } + }, + "@fluentui/react-positioning": { + "version": "9.12.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.12.4.tgz", + "integrity": "sha512-qQAjHF/FJFs2TyK0x08t0iFtDQlGNGH0OFC3jrG1xIFEe3nFPoeYeNT3zxOmj+D7bvlcJTIITcoe++YQTnCf4w==", + "requires": { + "@floating-ui/devtools": "0.2.1", + "@floating-ui/dom": "^1.2.0", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-progress": { + "version": "9.1.60", + "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.1.60.tgz", + "integrity": "sha512-9wC7lWdo3S8rhxKWlIhcYAzsZNw+rL2HvNJTvEvFxXcOG7nJxP/3mGclV/jCCwDoPDnt9BT+40pGK84eD0BNIA==", + "requires": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-provider": { + "version": "9.13.8", + "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.13.8.tgz", + "integrity": "sha512-FCvDMjs/BNAcqJuHU+kN/lqLB2RDQ/LQo29ltfLKFlTR1nTUNJvPMOVhjj6eEt+t81628LOYhbbaXOj9rYtfGg==", + "requires": { + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/core": "^1.14.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-radio": { + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.2.3.tgz", + "integrity": "sha512-8eKeUL0ZNr792Q6NGWPp7dpOV2IFcjAQ2oWR2/bruQVu8LMzYYKe2o6pQWdCag6UGPZuszkms9Xl7zPdDQBUdA==", + "requires": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-label": "^9.1.58", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-select": { + "version": "9.1.60", + "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.1.60.tgz", + "integrity": "sha512-4HfRRTlGStOgtO00RY6jmOwz6MXnoa9gtjkV7StLmJZ2U5NTjVUrnp2dP1Vjb6hO13xaihWGEYyYKnsQ3R7kIw==", + "requires": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-shared-contexts": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.14.0.tgz", + "integrity": "sha512-P9yhg31WYfB1W66/gD3+qVCLBsyIEcOzQvKVaIQvd9UhF67lNW4kMXUB6YVOk5PV0Og4hXnkH/vuHl7YMD9RHw==", + "requires": { + "@fluentui/react-theme": "^9.1.16", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-skeleton": { + "version": "9.0.48", + "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.0.48.tgz", + "integrity": "sha512-P0Rw5hIOn5CrZIWg7nVoK3gamxFhZI80KcRVaWap4O3gLo5C8nKHJWOtyBQZ5WKH+S6hoEGZ2USL6CoyXslxeQ==", + "requires": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-slider": { + "version": "9.1.65", + "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.1.65.tgz", + "integrity": "sha512-7kuJMIojxCmNOuiRmQwh9iiXx8zwxkrgvsWmReRIBX0WB6w1VqMcuuikq2Z2ISgNPmepCX8W+qDfx8Ne4F/HtQ==", + "requires": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-spinbutton": { + "version": "9.2.60", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.2.60.tgz", + "integrity": "sha512-0IIxEH0CTf4fNMoyvMa37bc63+0ZlznlsNy8lF3hujAT8Z9sUKVMH68e6tGUuXGJIkCUyDKU8HA+9FF2DyPvNA==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-spinner": { + "version": "9.3.38", + "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.3.38.tgz", + "integrity": "sha512-dPJr7/rgU2Qe/K2BciJTAEwEd0ytGpCw3VOVyK2T25w7Jw5RAHmgP+mbw+7se44Mr6sd1LH76mh5sfmQ3tODgw==", + "requires": { + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-label": "^9.1.58", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-switch": { + "version": "9.1.65", + "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.1.65.tgz", + "integrity": "sha512-P0DwogD6hZJ3O005zCFPDoFXuzkrpKMrAeQGh9X0fqFP5JyHXVCgAAZQOLcphbbT9QukoEF5irN2Z4L9gBn57A==", + "requires": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-label": "^9.1.58", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-table": { + "version": "9.11.5", + "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.11.5.tgz", + "integrity": "sha512-roQRITOtl1aqXlachS2oTraVE45x3KdDrX0KyQGCdcQRxNprXJW6dIK9QjlbAL6yAsAMDafmFA4y9uRxl408dQ==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-avatar": "^9.6.9", + "@fluentui/react-checkbox": "^9.2.8", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-radio": "^9.2.3", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-tabs": { + "version": "9.4.6", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.4.6.tgz", + "integrity": "sha512-LQvibLeJFyqKKiOjZUkRvbfLtsVosUhNUdh1SCQUPxQVpEPSK6XgwK0A1+jjoVhKn+PAJakxRINgnvqQD8pQBA==", + "requires": { + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-tabster": { + "version": "9.17.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.17.3.tgz", + "integrity": "sha512-cFcUYrkGW15w5yXzCPTTVG/7x5kNXxnhQXuh8SPyCc9JZeG7XI3+hy1T37PsXGxNS4KN9ePHkBHzgDfYO4gzYQ==", + "requires": { + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "keyborg": "^2.3.0", + "tabster": "^5.0.1" + } + }, + "@fluentui/react-tags": { + "version": "9.0.22", + "resolved": "https://registry.npmjs.org/@fluentui/react-tags/-/react-tags-9.0.22.tgz", + "integrity": "sha512-gQIOCVu3HIfGjtAmwOnwBEnTsNyRBU8Pvs6EugpUyyqkRjzbm5TnL3LtiUy4f6/+NuaRqcYAvhwpdUhrlciwcA==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-avatar": "^9.6.9", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-text": { + "version": "9.4.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.4.7.tgz", + "integrity": "sha512-c6uJ98B35L8sviYxhQj1i+LW+HVNDdco2ImS9VLv/Duo4HiYs1G2y1YhtBDDiGxLe2moIvfg9ajDzMZV29aXFw==", + "requires": { + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-textarea": { + "version": "9.3.60", + "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.3.60.tgz", + "integrity": "sha512-wH4MBWT4EOgNH9FXTjcgH34oANUaoduhmVjffnxaPl3R767Ak0fZPG7kky7yrLMjTDUSwILsEj/q+hsN6o+7Ag==", + "requires": { + "@fluentui/react-field": "^9.1.50", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-theme": { + "version": "9.1.16", + "resolved": "https://registry.npmjs.org/@fluentui/react-theme/-/react-theme-9.1.16.tgz", + "integrity": "sha512-QK2dGE5aQXN1UGdiEmGKpYGP3tHXIchLvFf8DEEOWnF4XBc9SiEPNFYkvLMJjHxZmDz4D670rsOPe0r5jFDEKQ==", + "requires": { + "@fluentui/tokens": "1.0.0-alpha.13", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-toast": { + "version": "9.3.27", + "resolved": "https://registry.npmjs.org/@fluentui/react-toast/-/react-toast-9.3.27.tgz", + "integrity": "sha512-DbRAYyL5Bd/pcFiGHPpK+rQMyc4LBll9YBy496l97dGDO2HmqFuiwP74V1KznxLcr4inCNWwThIJws5VLFsJLg==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-portal": "^9.4.10", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1", + "react-transition-group": "^4.4.1" + } + }, + "@fluentui/react-toolbar": { + "version": "9.1.66", + "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.1.66.tgz", + "integrity": "sha512-ooNTp1R5MBZwiVK8fiJu29gE48vUx4NbXdwB2yHcCprasG3asjuoKQfOYM4+1NfFA0DetVrbK8L46IBeZyeBvA==", + "requires": { + "@fluentui/react-button": "^9.3.65", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-divider": "^9.2.58", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-radio": "^9.2.3", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-tooltip": { + "version": "9.4.11", + "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.4.11.tgz", + "integrity": "sha512-HXm8yYuAHJuczeFExco0WQSjO3DzDj5AJxqICHF8qtbtihUKfWpPnKM1qQWR+yJR2zc2jzvOEIzZXEkxSG+fSg==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-portal": "^9.4.10", + "@fluentui/react-positioning": "^9.12.4", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-tree": { + "version": "9.4.25", + "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.4.25.tgz", + "integrity": "sha512-7IMqnOiNFMRuPujnbxJUYD8AEh0z1OGXkdNkAeLyj3pkwuvQs9+TbaNtv5Z372YN+kwYF4EYalYcPuNsRlx7cQ==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-aria": "^9.7.3", + "@fluentui/react-avatar": "^9.6.9", + "@fluentui/react-button": "^9.3.65", + "@fluentui/react-checkbox": "^9.2.8", + "@fluentui/react-context-selector": "^9.1.49", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-radio": "^9.2.3", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-tabster": "^9.17.3", + "@fluentui/react-theme": "^9.1.16", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-utilities": { + "version": "9.16.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.16.1.tgz", + "integrity": "sha512-2wdwmgTFcVy14ZLbRNJ8Q6dCCBLekkJ8Znnok68gKRLDcwpPT3UjSraoU+DGjOA5BMfPppZBU8Yb5GqdIfd48g==", + "requires": { + "@fluentui/keyboard-keys": "^9.0.7", + "@fluentui/react-shared-contexts": "^9.14.0", + "@swc/helpers": "^0.5.1" + } + }, + "@fluentui/react-virtualizer": { + "version": "9.0.0-alpha.66", + "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.66.tgz", + "integrity": "sha512-x/ZOAIAwctt7pvOBIzS4iZGU0ahiPhQFS7iAHksFkF9LimneaV92A/02dW0Cy4v7dv9wZNoosQwhS05Yx3DVDQ==", + "requires": { + "@fluentui/react-jsx-runtime": "^9.0.27", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-utilities": "^9.16.1", + "@griffel/react": "^1.5.14", + "@swc/helpers": "^0.5.1" + } + }, "@fluentui/react-window-provider": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-1.0.3.tgz", @@ -14825,6 +17101,14 @@ } } }, + "@fluentui/tokens": { + "version": "1.0.0-alpha.13", + "resolved": "https://registry.npmjs.org/@fluentui/tokens/-/tokens-1.0.0-alpha.13.tgz", + "integrity": "sha512-IzYysTTBkAH7tQZxYKpzhxYnTJkvwXhjhTOpmERgnqTFifHTP8/vaQjJAAm7dI/9zlDx1oN+y/I+KzL9bDLHZQ==", + "requires": { + "@swc/helpers": "^0.5.1" + } + }, "@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -14833,6 +17117,36 @@ "optional": true, "peer": true }, + "@griffel/core": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@griffel/core/-/core-1.15.2.tgz", + "integrity": "sha512-RlsIXoSS3gaYykUgxFpwKAs/DV9cRUKp3CW1kt3iPAtsDTWn/o+8bT1jvBws/tMM2GBu/Uc0EkaIzUPqD7uA+Q==", + "requires": { + "@emotion/hash": "^0.9.0", + "@griffel/style-types": "^1.0.3", + "csstype": "^3.1.3", + "rtl-css-js": "^1.16.1", + "stylis": "^4.2.0", + "tslib": "^2.1.0" + } + }, + "@griffel/react": { + "version": "1.5.20", + "resolved": "https://registry.npmjs.org/@griffel/react/-/react-1.5.20.tgz", + "integrity": "sha512-1P2yaPctENFSCwyPIYXBmgpNH68c0lc/jwSzPij1QATHDK1AASKuSeq6hW108I67RKjhRyHCcALshdZ3GcQXSg==", + "requires": { + "@griffel/core": "^1.15.2", + "tslib": "^2.1.0" + } + }, + "@griffel/style-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@griffel/style-types/-/style-types-1.0.3.tgz", + "integrity": "sha512-AzbbYV/EobNIBtfMtyu2edFin895gjVxtu1nsRhTETUAIb0/LCZoue3Jd/kFLuPwe95rv5WRUBiQpVwJsrrFcw==", + "requires": { + "csstype": "^3.1.3" + } + }, "@humanwhocodes/config-array": { "version": "0.9.5", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", @@ -15383,6 +17697,14 @@ "@sinonjs/commons": "^1.7.0" } }, + "@swc/helpers": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz", + "integrity": "sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==", + "requires": { + "tslib": "^2.4.0" + } + }, "@tanstack/react-table": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.10.0.tgz", @@ -17966,9 +20288,9 @@ } }, "csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "cycle": { "version": "1.0.3", @@ -18235,6 +20557,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" + } + }, "dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -21067,6 +23398,11 @@ } } }, + "keyborg": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/keyborg/-/keyborg-2.4.1.tgz", + "integrity": "sha512-B9EZwDd36WKlIq6JmimaTsTDx5E0aUqZcxtgTfK66ut1FbRXYhBmiB7Al2qKzB7CCX9C49sTBiiyVzsXCA6J4Q==" + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -22713,8 +25049,7 @@ "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==", - "dev": true + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "react-shallow-renderer": { "version": "16.15.0", @@ -22758,6 +25093,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" + } + }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -22905,8 +25251,7 @@ "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "peer": true + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regexp.prototype.flags": { "version": "1.4.3", @@ -23109,6 +25454,14 @@ "nearley": "^2.7.10" } }, + "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-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -23850,6 +26203,11 @@ "dev": true, "requires": {} }, + "stylis": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", + "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==" + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -23879,6 +26237,15 @@ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, + "tabster": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/tabster/-/tabster-5.2.1.tgz", + "integrity": "sha512-UGl95j5YHbn9wpNA3hX/mTfH7n+y/HFSHVGPkj9Nx06+CXT3mRwTR2/ub1dqii5pG83LJ6xn2F4jSFrUgOwhuA==", + "requires": { + "keyborg": "^2.2.0", + "tslib": "^2.3.1" + } + }, "tailwindcss": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.6.tgz", @@ -24272,8 +26639,7 @@ "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "peer": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "tsutils": { "version": "3.21.0", @@ -24453,6 +26819,12 @@ "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": {} + }, "util": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz",