@devsym/graph-toolkit-react 1.0.0-next.7 → 1.0.0-next.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -0
- package/dist/components/PeoplePicker/PeoplePicker.d.ts +24 -0
- package/dist/components/PeoplePicker/PeoplePicker.d.ts.map +1 -0
- package/dist/components/PeoplePicker/PeoplePicker.types.d.ts +57 -0
- package/dist/components/PeoplePicker/PeoplePicker.types.d.ts.map +1 -0
- package/dist/components/PeoplePicker/index.d.ts +6 -0
- package/dist/components/PeoplePicker/index.d.ts.map +1 -0
- package/dist/components/Person/Person.d.ts.map +1 -1
- package/dist/components/Person/Person.types.d.ts +145 -7
- package/dist/components/Person/Person.types.d.ts.map +1 -1
- package/dist/components/Person/index.d.ts +1 -1
- package/dist/components/Person/index.d.ts.map +1 -1
- package/dist/hooks/usePeopleSearch.d.ts +37 -0
- package/dist/hooks/usePeopleSearch.d.ts.map +1 -0
- package/dist/hooks/usePersonData.d.ts +1 -0
- package/dist/hooks/usePersonData.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.mjs +1046 -219
- package/dist/providers/IPersonDataProvider.d.ts +55 -1
- package/dist/providers/IPersonDataProvider.d.ts.map +1 -1
- package/dist/providers/MockProvider.d.ts +3 -2
- package/dist/providers/MockProvider.d.ts.map +1 -1
- package/dist/providers/MsalBrowserProvider.d.ts +14 -2
- package/dist/providers/MsalBrowserProvider.d.ts.map +1 -1
- package/package.json +3 -2
- package/readme.md +40 -12
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Person data provider interface for fetching user information, presence, and photos
|
|
2
|
+
* Person data provider interface for fetching user information, presence, and photos,
|
|
3
|
+
* and optionally searching for people.
|
|
3
4
|
*/
|
|
4
5
|
import { Presence, User } from '@microsoft/microsoft-graph-types';
|
|
5
6
|
import { IProvider } from './IProvider';
|
|
@@ -19,6 +20,12 @@ export interface ProviderPersonDataRequest {
|
|
|
19
20
|
* Whether to fetch profile photo
|
|
20
21
|
*/
|
|
21
22
|
fetchPhoto: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Additional user profile fields to fetch beyond the default set.
|
|
25
|
+
* Each entry must be a valid OData field name (letters, digits, underscores, dots, or slashes).
|
|
26
|
+
* Empty strings and entries containing unsafe characters are ignored.
|
|
27
|
+
*/
|
|
28
|
+
selectFields?: string[];
|
|
22
29
|
}
|
|
23
30
|
/**
|
|
24
31
|
* Response data containing user information, presence, and photo
|
|
@@ -54,4 +61,51 @@ export interface IPersonDataProvider {
|
|
|
54
61
|
* @returns True if the provider implements IPersonDataProvider
|
|
55
62
|
*/
|
|
56
63
|
export declare const isPersonDataProvider: (provider: IProvider | null) => provider is IProvider & IPersonDataProvider;
|
|
64
|
+
/**
|
|
65
|
+
* Result item returned by a people search operation
|
|
66
|
+
*/
|
|
67
|
+
export interface PeopleSearchResult {
|
|
68
|
+
/**
|
|
69
|
+
* The unique identifier for the person
|
|
70
|
+
*/
|
|
71
|
+
id: string;
|
|
72
|
+
/**
|
|
73
|
+
* The person's display name
|
|
74
|
+
*/
|
|
75
|
+
displayName?: string | null;
|
|
76
|
+
/**
|
|
77
|
+
* The person's primary mail address
|
|
78
|
+
*/
|
|
79
|
+
mail?: string | null;
|
|
80
|
+
/**
|
|
81
|
+
* The person's user principal name
|
|
82
|
+
*/
|
|
83
|
+
userPrincipalName?: string | null;
|
|
84
|
+
/**
|
|
85
|
+
* The person's job title
|
|
86
|
+
*/
|
|
87
|
+
jobTitle?: string | null;
|
|
88
|
+
/**
|
|
89
|
+
* The department the person belongs to
|
|
90
|
+
*/
|
|
91
|
+
department?: string | null;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Optional interface that providers can implement to support people search
|
|
95
|
+
*/
|
|
96
|
+
export interface IPeopleSearchProvider {
|
|
97
|
+
/**
|
|
98
|
+
* Search for people matching the given query string
|
|
99
|
+
* @param query - The search query (display name, email, or UPN fragment)
|
|
100
|
+
* @param maxResults - Maximum number of results to return (default: 10)
|
|
101
|
+
* @returns Promise resolving to an array of matching people
|
|
102
|
+
*/
|
|
103
|
+
searchPeople(query: string, maxResults?: number): Promise<PeopleSearchResult[]>;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Type guard to check if a provider implements the IPeopleSearchProvider interface
|
|
107
|
+
* @param provider - The provider to check
|
|
108
|
+
* @returns True if the provider implements IPeopleSearchProvider
|
|
109
|
+
*/
|
|
110
|
+
export declare const isPeopleSearchProvider: (provider: IProvider | null) => provider is IProvider & IPeopleSearchProvider;
|
|
57
111
|
//# sourceMappingURL=IPersonDataProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IPersonDataProvider.d.ts","sourceRoot":"","sources":["../../src/providers/IPersonDataProvider.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"IPersonDataProvider.d.ts","sourceRoot":"","sources":["../../src/providers/IPersonDataProvider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC;;OAEG;IACH,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB;;OAEG;IACH,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;CACxF;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAC/B,UAAU,SAAS,GAAG,IAAI,KACzB,QAAQ,IAAI,SAAS,GAAG,mBAM1B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;CACjF;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GACjC,UAAU,SAAS,GAAG,IAAI,KACzB,QAAQ,IAAI,SAAS,GAAG,qBAM1B,CAAC"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* MockProvider - simple in-memory provider for development and tests
|
|
3
3
|
*/
|
|
4
4
|
import { IProvider, ProviderState } from './IProvider';
|
|
5
|
-
import { IPersonDataProvider, ProviderPersonDataRequest, ProviderPersonDataResponse } from './IPersonDataProvider';
|
|
6
|
-
export declare class MockProvider implements IProvider, IPersonDataProvider {
|
|
5
|
+
import { IPersonDataProvider, IPeopleSearchProvider, PeopleSearchResult, ProviderPersonDataRequest, ProviderPersonDataResponse } from './IPersonDataProvider';
|
|
6
|
+
export declare class MockProvider implements IProvider, IPersonDataProvider, IPeopleSearchProvider {
|
|
7
7
|
private state;
|
|
8
8
|
private listeners;
|
|
9
9
|
constructor(options?: {
|
|
@@ -12,6 +12,7 @@ export declare class MockProvider implements IProvider, IPersonDataProvider {
|
|
|
12
12
|
});
|
|
13
13
|
getAccessToken(): Promise<string>;
|
|
14
14
|
getPersonData(request: ProviderPersonDataRequest): Promise<ProviderPersonDataResponse>;
|
|
15
|
+
searchPeople(query: string, maxResults?: number): Promise<PeopleSearchResult[]>;
|
|
15
16
|
login(): Promise<void>;
|
|
16
17
|
logout(): Promise<void>;
|
|
17
18
|
getState(): ProviderState;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MockProvider.d.ts","sourceRoot":"","sources":["../../src/providers/MockProvider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,0BAA0B,EAC3B,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"MockProvider.d.ts","sourceRoot":"","sources":["../../src/providers/MockProvider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,yBAAyB,EACzB,0BAA0B,EAC3B,MAAM,uBAAuB,CAAC;AAyF/B,qBAAa,YAAa,YAAW,SAAS,EAAE,mBAAmB,EAAE,qBAAqB;IACxF,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,SAAS,CAAuB;gBAC5B,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAMnE,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAQ3B,aAAa,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IA+BtF,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,SAAK,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAe3E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B,QAAQ,IAAI,aAAa;IAIzB,cAAc,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAIzC,yBAAyB,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAIpD,OAAO,CAAC,IAAI;CASb;AAED,eAAO,MAAM,0BAA0B,oBAA+C,CAAC"}
|
|
@@ -1,15 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Native MSAL browser provider for Graph Toolkit React
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import type { IPublicClientApplication } from '@azure/msal-browser';
|
|
5
5
|
import { IProvider, ProviderState } from './IProvider';
|
|
6
|
+
/**
|
|
7
|
+
* Error indicating that an interactive redirect has been initiated and token acquisition
|
|
8
|
+
* will continue after navigation completes.
|
|
9
|
+
*/
|
|
10
|
+
export declare class RedirectInProgressError extends Error {
|
|
11
|
+
/**
|
|
12
|
+
* Creates a new instance of RedirectInProgressError.
|
|
13
|
+
*
|
|
14
|
+
* @param message - A human-readable description of the redirect state.
|
|
15
|
+
*/
|
|
16
|
+
constructor(message: string);
|
|
17
|
+
}
|
|
6
18
|
export declare class MsalBrowserProvider implements IProvider {
|
|
7
19
|
private readonly msalInstance;
|
|
8
20
|
private readonly defaultScopes;
|
|
9
21
|
private account;
|
|
10
22
|
private state;
|
|
11
23
|
private listeners;
|
|
12
|
-
constructor(msalInstance:
|
|
24
|
+
constructor(msalInstance: IPublicClientApplication, defaultScopes: string[]);
|
|
13
25
|
initialize(): Promise<void>;
|
|
14
26
|
login(): Promise<void>;
|
|
15
27
|
logout(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MsalBrowserProvider.d.ts","sourceRoot":"","sources":["../../src/providers/MsalBrowserProvider.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"MsalBrowserProvider.d.ts","sourceRoot":"","sources":["../../src/providers/MsalBrowserProvider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAe,wBAAwB,EAAkC,MAAM,qBAAqB,CAAC;AACjH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEvD;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IAChD;;;;OAIG;gBACS,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,mBAAoB,YAAW,SAAS;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2B;IACxD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAW;IACzC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,SAAS,CAAyB;gBAE9B,YAAY,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,EAAE;IAKrE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAWvB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IA8BxD,QAAQ,IAAI,aAAa;IAIzB,cAAc,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAIzC,yBAAyB,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAIpD,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,IAAI;CASb"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devsym/graph-toolkit-react",
|
|
3
|
-
"version": "1.0.0-next.
|
|
3
|
+
"version": "1.0.0-next.9",
|
|
4
4
|
"description": "React components for Microsoft Graph powered by Fluent UI",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -69,13 +69,14 @@
|
|
|
69
69
|
"@microsoft/microsoft-graph-types": "^2.40.0"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
|
-
"@changesets/cli": "^2.29.7",
|
|
73
72
|
"@azure/msal-browser": "^5.2.0",
|
|
73
|
+
"@changesets/cli": "^2.29.7",
|
|
74
74
|
"@fluentui/react-components": "^9.72.6",
|
|
75
75
|
"@storybook/addon-a11y": "^10.0.6",
|
|
76
76
|
"@storybook/addon-docs": "^10.0.6",
|
|
77
77
|
"@storybook/addon-links": "^10.0.6",
|
|
78
78
|
"@storybook/react-vite": "^10.0.6",
|
|
79
|
+
"@testing-library/dom": "^10.4.1",
|
|
79
80
|
"@testing-library/react": "^16.3.0",
|
|
80
81
|
"@types/react": "^18.2.0",
|
|
81
82
|
"@types/react-dom": "^18.2.0",
|
package/readme.md
CHANGED
|
@@ -5,18 +5,18 @@
|
|
|
5
5
|
<h4 align="center">Modern React Components for <a href="https://graph.microsoft.com">Microsoft Graph</a> powered by <a href="https://react.fluentui.dev/">Fluent UI</a></h4>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
<img src="https://img.shields.io/badge/alpha-0.1.0-orange" alt="Alpha Release">
|
|
8
|
+
<a href="https://www.npmjs.com/package/@devsym/graph-toolkit-react"><img src="https://img.shields.io/badge/alpha-0.1.0-orange" alt="Alpha Release"></a>
|
|
9
9
|
<img src="https://img.shields.io/badge/React-18%2F19-blue" alt="React 18/19">
|
|
10
10
|
<img src="https://img.shields.io/badge/Fluent_UI-9.72-purple" alt="Fluent UI 9">
|
|
11
11
|
<img src="https://img.shields.io/badge/TypeScript-5.9-blue" alt="TypeScript 5.9">
|
|
12
12
|
</p>
|
|
13
13
|
|
|
14
14
|
<h3 align="center">
|
|
15
|
-
<a href="
|
|
16
|
-
<a href="
|
|
17
|
-
<a href="
|
|
18
|
-
<a href="
|
|
19
|
-
<a href="
|
|
15
|
+
<a href="#-getting-started">Get Started</a> •
|
|
16
|
+
<a href="#-migration-from-mgt">Migration</a> •
|
|
17
|
+
<a href="#-agent-quick-reference">Agent Quick Reference</a> •
|
|
18
|
+
<a href="#-storybook">Storybook</a> •
|
|
19
|
+
<a href="#-contribute">Contribute</a>
|
|
20
20
|
</h3>
|
|
21
21
|
|
|
22
22
|
## 🎯 Project Vision
|
|
@@ -52,7 +52,6 @@ npm install @devsym/graph-toolkit-react
|
|
|
52
52
|
| ------- | ------- | ----------- |
|
|
53
53
|
| `@devsym/graph-toolkit-react` | `0.1.0-alpha.1` | React components for Microsoft Graph powered by Fluent UI |
|
|
54
54
|
|
|
55
|
-
<a id="migration-from-mgt"></a>
|
|
56
55
|
## 🔄 Migration from MGT
|
|
57
56
|
|
|
58
57
|
For migration from Microsoft Graph Toolkit (including Teams-hosted scenarios), use [`docs/MGT_MIGRATION.md`](./docs/MGT_MIGRATION.md).
|
|
@@ -64,7 +63,6 @@ The guide includes:
|
|
|
64
63
|
- Teams-specific migration section (`TeamsHostedProvider` + backend token exchange)
|
|
65
64
|
- Common migration pitfalls and validation checklist
|
|
66
65
|
|
|
67
|
-
<a id="agent-quick-reference"></a>
|
|
68
66
|
## 🤖 Agent Quick Reference
|
|
69
67
|
|
|
70
68
|
If you are using a coding agent (Copilot/Codex/Claude/etc.), use the scenario-first reference in [`AGENTS.md`](./AGENTS.md).
|
|
@@ -101,8 +99,37 @@ import { Person } from '@devsym/graph-toolkit-react';
|
|
|
101
99
|
|
|
102
100
|
`Person` supports Fluent UI Persona props directly.
|
|
103
101
|
|
|
102
|
+
MGT-style line customization is also supported:
|
|
103
|
+
|
|
104
|
+
```tsx
|
|
105
|
+
<Person
|
|
106
|
+
userId="me"
|
|
107
|
+
view="threelines"
|
|
108
|
+
line1Property="givenName"
|
|
109
|
+
line2Property="mail,userPrincipalName"
|
|
110
|
+
line3Property="presenceAvailability"
|
|
111
|
+
/>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
For full manual override, use React render callbacks as the replacement for MGT line templates:
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
<Person
|
|
118
|
+
personDetails={{
|
|
119
|
+
displayName: 'Megan Bowen',
|
|
120
|
+
jobTitle: 'CEO',
|
|
121
|
+
department: 'Leadership',
|
|
122
|
+
officeLocation: 'Seattle',
|
|
123
|
+
}}
|
|
124
|
+
view="fourlines"
|
|
125
|
+
renderLine1={({ text }) => <span>Name: {text}</span>}
|
|
126
|
+
renderLine2={({ text }) => <span>Role: {text}</span>}
|
|
127
|
+
renderLine3={({ text }) => <span>Org: {text}</span>}
|
|
128
|
+
renderLine4={({ text }) => <span>Location: {text}</span>}
|
|
129
|
+
/>
|
|
130
|
+
```
|
|
131
|
+
|
|
104
132
|
|
|
105
|
-
<a id="getting-started"></a>
|
|
106
133
|
## 🚀 Getting Started
|
|
107
134
|
|
|
108
135
|
### Prerequisites
|
|
@@ -194,6 +221,8 @@ function App() {
|
|
|
194
221
|
}
|
|
195
222
|
```
|
|
196
223
|
|
|
224
|
+
The provider uses redirect flow. Set the redirect URI to your app's origin and register it as a **Single-page application (SPA)** platform in Azure AD.
|
|
225
|
+
|
|
197
226
|
#### `TeamsHostedProvider` quick start (consumer-managed Teams login)
|
|
198
227
|
|
|
199
228
|
Use this when your app is hosted in Microsoft Teams and your app code already handles TeamsJS auth for multiple APIs.
|
|
@@ -258,7 +287,6 @@ class MyAuthProvider implements IProvider {
|
|
|
258
287
|
}
|
|
259
288
|
```
|
|
260
289
|
|
|
261
|
-
<a id="storybook"></a>
|
|
262
290
|
## 📚 Storybook
|
|
263
291
|
|
|
264
292
|
Explore all components interactively in our Storybook documentation:
|
|
@@ -344,12 +372,11 @@ stories/
|
|
|
344
372
|
- ✅ Sample app with MSAL sign-in and `Person` (`userId="me"`) at `samples/react-msal-sample`
|
|
345
373
|
|
|
346
374
|
**Next Steps**:
|
|
347
|
-
- Additional components (PeoplePicker, PersonCard, Login)
|
|
375
|
+
- Additional components (PeoplePicker, PersonCard, Login) — see [`docs/COMPONENT_ROADMAP.md`](./docs/COMPONENT_ROADMAP.md) for the full ranked list
|
|
348
376
|
- Expanded provider guidance and production auth examples
|
|
349
377
|
- Comprehensive test coverage
|
|
350
378
|
- First stable release (1.0.0)
|
|
351
379
|
|
|
352
|
-
<a id="contribute"></a>
|
|
353
380
|
## 🤝 Contribute
|
|
354
381
|
|
|
355
382
|
This **community-driven project** provides React developers with components for Microsoft Graph. Contributions are welcome!
|
|
@@ -382,6 +409,7 @@ MIT License - see [LICENSE](LICENSE) for details.
|
|
|
382
409
|
|
|
383
410
|
- **Fluent UI**: [react.fluentui.dev](https://react.fluentui.dev/)
|
|
384
411
|
- **Microsoft Graph**: [graph.microsoft.com](https://graph.microsoft.com)
|
|
412
|
+
- **Component Roadmap**: [docs/COMPONENT_ROADMAP.md](./docs/COMPONENT_ROADMAP.md)
|
|
385
413
|
- **Changelog**: [CHANGELOG.md](CHANGELOG.md)
|
|
386
414
|
- **Publishing**: [PUBLISHING.md](PUBLISHING.md)
|
|
387
415
|
|