mgwdev-m365-components 0.0.11-experimental → 0.0.13-experimental

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.
@@ -0,0 +1,476 @@
1
+ (function() {
2
+ const t = document.createElement("link").relList;
3
+ if (t && t.supports && t.supports("modulepreload"))
4
+ return;
5
+ for (const o of document.querySelectorAll('link[rel="modulepreload"]'))
6
+ s(o);
7
+ new MutationObserver((o) => {
8
+ for (const n of o)
9
+ if (n.type === "childList")
10
+ for (const r of n.addedNodes)
11
+ r.tagName === "LINK" && r.rel === "modulepreload" && s(r);
12
+ }).observe(document, { childList: !0, subtree: !0 });
13
+ function e(o) {
14
+ const n = {};
15
+ return o.integrity && (n.integrity = o.integrity), o.referrerPolicy && (n.referrerPolicy = o.referrerPolicy), o.crossOrigin === "use-credentials" ? n.credentials = "include" : o.crossOrigin === "anonymous" ? n.credentials = "omit" : n.credentials = "same-origin", n;
16
+ }
17
+ function s(o) {
18
+ if (o.ep)
19
+ return;
20
+ o.ep = !0;
21
+ const n = e(o);
22
+ fetch(o.href, n);
23
+ }
24
+ })();
25
+ /*! @azure/msal-common v16.5.2 2026-04-28 */
26
+ const M = "msal.js.common", C = "https://login.microsoftonline.com/common/", U = "login.microsoftonline.com", F = "common", H = "adfs", b = "dstsv2", w = `${C}discovery/instance?api-version=1.1&authorization_endpoint=`, v = ".ciamlogin.com", k = ".onmicrosoft.com", A = "|", h = "openid", N = "profile", I = "offline_access", f = "email", G = "S256", V = "application/x-www-form-urlencoded;charset=utf-8", K = "Not Available", g = "/", W = "http://169.254.169.254/metadata/instance/compute/location", q = "2020-06-01", Y = 2e3, j = "TryAutoDetect", x = "login.microsoft.com", B = [
27
+ "login.microsoftonline.com",
28
+ "login.windows.net",
29
+ "login.microsoft.com",
30
+ "sts.windows.net"
31
+ ], J = 240, Q = "invalid_instance", X = 200, $ = 400, z = 400, Z = 499, tt = 500, et = 599, st = {
32
+ GET: "GET",
33
+ POST: "POST"
34
+ }, y = [
35
+ h,
36
+ N,
37
+ I
38
+ ], ot = [...y, f], nt = {
39
+ CONTENT_TYPE: "Content-Type",
40
+ CONTENT_LENGTH: "Content-Length",
41
+ RETRY_AFTER: "Retry-After",
42
+ CCS_HEADER: "X-AnchorMailbox",
43
+ WWWAuthenticate: "WWW-Authenticate",
44
+ AuthenticationInfo: "Authentication-Info",
45
+ X_MS_REQUEST_ID: "x-ms-request-id",
46
+ X_MS_HTTP_VERSION: "x-ms-httpver"
47
+ }, at = {
48
+ ACTIVE_ACCOUNT_FILTERS: "active-account-filters"
49
+ // new cache entry for active_account for a more robust version for browser
50
+ }, m = {
51
+ COMMON: "common",
52
+ ORGANIZATIONS: "organizations",
53
+ CONSUMERS: "consumers"
54
+ }, rt = {
55
+ ACCESS_TOKEN: "access_token",
56
+ XMS_CC: "xms_cc"
57
+ }, ct = {
58
+ LOGIN: "login",
59
+ SELECT_ACCOUNT: "select_account",
60
+ CONSENT: "consent",
61
+ NONE: "none",
62
+ CREATE: "create",
63
+ NO_SESSION: "no_session"
64
+ }, it = {
65
+ CODE: "code",
66
+ IDTOKEN_TOKEN: "id_token token",
67
+ IDTOKEN_TOKEN_REFRESHTOKEN: "id_token token refresh_token"
68
+ }, _t = {
69
+ QUERY: "query",
70
+ FRAGMENT: "fragment",
71
+ FORM_POST: "form_post"
72
+ }, Et = {
73
+ IMPLICIT_GRANT: "implicit",
74
+ AUTHORIZATION_CODE_GRANT: "authorization_code",
75
+ CLIENT_CREDENTIALS_GRANT: "client_credentials",
76
+ RESOURCE_OWNER_PASSWORD_GRANT: "password",
77
+ REFRESH_TOKEN_GRANT: "refresh_token",
78
+ DEVICE_CODE_GRANT: "device_code",
79
+ JWT_BEARER: "urn:ietf:params:oauth:grant-type:jwt-bearer"
80
+ }, ut = "MSSTS", Tt = "ADFS", At = "Generic", St = "-", lt = ".", Rt = {
81
+ ID_TOKEN: "IdToken",
82
+ ACCESS_TOKEN: "AccessToken",
83
+ ACCESS_TOKEN_WITH_AUTH_SCHEME: "AccessToken_With_AuthScheme",
84
+ REFRESH_TOKEN: "RefreshToken"
85
+ }, mt = "appmetadata", Ot = "client_info", dt = "1", pt = "authority-metadata", Ct = 3600 * 24, ht = {
86
+ CONFIG: "config",
87
+ CACHE: "cache",
88
+ NETWORK: "network",
89
+ HARDCODED_VALUES: "hardcoded_values"
90
+ }, Nt = 5, It = 330, ft = 50, gt = "server-telemetry", yt = "|", Dt = ",", Lt = "1", Pt = "0", Mt = "unknown_error", Ut = {
91
+ BEARER: "Bearer",
92
+ POP: "pop",
93
+ SSH: "ssh-cert"
94
+ }, Ft = 60, Ht = 3600, bt = "throttling", wt = "retry-after, h429", vt = "invalid_grant", kt = "client_mismatch", Gt = {
95
+ FAILED_AUTO_DETECTION: "1",
96
+ INTERNAL_CACHE: "2",
97
+ ENVIRONMENT_VARIABLE: "3",
98
+ IMDS: "4"
99
+ }, Vt = {
100
+ CONFIGURED_MATCHES_DETECTED: "1",
101
+ CONFIGURED_NO_AUTO_DETECTION: "2",
102
+ CONFIGURED_NOT_DETECTED: "3",
103
+ AUTO_DETECTION_REQUESTED_SUCCESSFUL: "4",
104
+ AUTO_DETECTION_REQUESTED_FAILED: "5"
105
+ }, Kt = {
106
+ // When a token is found in the cache or the cache is not supposed to be hit when making the request
107
+ NOT_APPLICABLE: "0",
108
+ // When the token request goes to the identity provider because force_refresh was set to true. Also occurs if claims were requested
109
+ FORCE_REFRESH_OR_CLAIMS: "1",
110
+ // When the token request goes to the identity provider because no cached access token exists
111
+ NO_CACHED_ACCESS_TOKEN: "2",
112
+ // When the token request goes to the identity provider because cached access token expired
113
+ CACHED_ACCESS_TOKEN_EXPIRED: "3",
114
+ // When the token request goes to the identity provider because refresh_in was used and the existing token needs to be refreshed
115
+ PROACTIVELY_REFRESHED: "4"
116
+ }, Wt = {
117
+ Jwt: "JWT",
118
+ Jwk: "JWK",
119
+ Pop: "pop"
120
+ }, qt = 300;
121
+ /*! @azure/msal-common v16.5.2 2026-04-28 */
122
+ function d(a) {
123
+ return `See https://aka.ms/msal.js.errors#${a} for details`;
124
+ }
125
+ class _ extends Error {
126
+ constructor(t, e, s) {
127
+ const o = e || (t ? d(t) : ""), n = o ? `${t}: ${o}` : t;
128
+ super(n), Object.setPrototypeOf(this, _.prototype), this.errorCode = t || "", this.errorMessage = o || "", this.subError = s || "", this.name = "AuthError";
129
+ }
130
+ setCorrelationId(t) {
131
+ this.correlationId = t;
132
+ }
133
+ }
134
+ function Yt(a, t) {
135
+ return new _(a, t || d(a));
136
+ }
137
+ /*! @azure/msal-common v16.5.2 2026-04-28 */
138
+ class S extends _ {
139
+ constructor(t) {
140
+ super(t), this.name = "ClientConfigurationError", Object.setPrototypeOf(this, S.prototype);
141
+ }
142
+ }
143
+ function c(a) {
144
+ return new S(a);
145
+ }
146
+ /*! @azure/msal-common v16.5.2 2026-04-28 */
147
+ class T {
148
+ /**
149
+ * Check if stringified object is empty
150
+ * @param strObj
151
+ */
152
+ static isEmptyObj(t) {
153
+ if (t)
154
+ try {
155
+ const e = JSON.parse(t);
156
+ return Object.keys(e).length === 0;
157
+ } catch {
158
+ }
159
+ return !0;
160
+ }
161
+ static startsWith(t, e) {
162
+ return t.indexOf(e) === 0;
163
+ }
164
+ static endsWith(t, e) {
165
+ return t.length >= e.length && t.lastIndexOf(e) === t.length - e.length;
166
+ }
167
+ /**
168
+ * Parses string into an object.
169
+ *
170
+ * @param query
171
+ */
172
+ static queryStringToObject(t) {
173
+ const e = {}, s = t.split("&"), o = (n) => decodeURIComponent(n.replace(/\+/g, " "));
174
+ return s.forEach((n) => {
175
+ if (n.trim()) {
176
+ const [r, R] = n.split(/=(.+)/g, 2);
177
+ r && R && (e[o(r)] = o(R));
178
+ }
179
+ }), e;
180
+ }
181
+ /**
182
+ * Trims entries in an array.
183
+ *
184
+ * @param arr
185
+ */
186
+ static trimArrayEntries(t) {
187
+ return t.map((e) => e.trim());
188
+ }
189
+ /**
190
+ * Removes empty strings from array
191
+ * @param arr
192
+ */
193
+ static removeEmptyStringsFromArray(t) {
194
+ return t.filter((e) => !!e);
195
+ }
196
+ /**
197
+ * Attempts to parse a string into JSON
198
+ * @param str
199
+ */
200
+ static jsonParseHelper(t) {
201
+ try {
202
+ return JSON.parse(t);
203
+ } catch {
204
+ return null;
205
+ }
206
+ }
207
+ }
208
+ /*! @azure/msal-common v16.5.2 2026-04-28 */
209
+ class l extends _ {
210
+ constructor(t, e) {
211
+ super(t, e), this.name = "ClientAuthError", Object.setPrototypeOf(this, l.prototype);
212
+ }
213
+ }
214
+ function u(a, t) {
215
+ return new l(a, t);
216
+ }
217
+ /*! @azure/msal-common v16.5.2 2026-04-28 */
218
+ const jt = "redirect_uri_empty", D = "authority_uri_insecure", E = "url_parse_error", L = "empty_url_error", xt = "empty_input_scopes_error", Bt = "invalid_claims", Jt = "token_request_empty", Qt = "logout_request_empty", Xt = "pkce_params_missing", $t = "invalid_cloud_discovery_metadata", zt = "invalid_authority_metadata", Zt = "untrusted_authority", te = "missing_ssh_jwk", ee = "missing_ssh_kid", se = "cannot_set_OIDCOptions", oe = "cannot_allow_platform_broker", ne = "authority_mismatch", ae = "invalid_request_method_for_EAR";
219
+ /*! @azure/msal-common v16.5.2 2026-04-28 */
220
+ const re = "client_info_decoding_error", ce = "client_info_empty_error", ie = "token_parsing_error", _e = "null_or_empty_token", Ee = "endpoints_resolution_error", ue = "network_error", Te = "openid_config_error", Ae = "hash_not_deserialized", O = "invalid_state", Se = "state_mismatch", le = "state_not_found", Re = "nonce_mismatch", me = "auth_time_not_found", Oe = "max_age_transpired", de = "multiple_matching_appMetadata", pe = "request_cannot_be_made", Ce = "cannot_remove_empty_scope", he = "cannot_append_scopeset", Ne = "empty_input_scopeset", Ie = "no_account_in_silent_request", fe = "invalid_cache_record", ge = "invalid_cache_environment", ye = "no_account_found", p = "no_crypto_object", De = "token_refresh_required", Le = "token_claims_cnf_required_for_signedjwt", Pe = "authorization_code_missing_from_server_response", Me = "binding_key_not_removed", Ue = "end_session_endpoint_not_supported", Fe = "key_id_missing", He = "method_not_implemented", be = "resource_parameter_required", we = "misplaced_resource_parameter";
221
+ /*! @azure/msal-common v16.5.2 2026-04-28 */
222
+ class i {
223
+ get urlString() {
224
+ return this._urlString;
225
+ }
226
+ constructor(t) {
227
+ if (this._urlString = t, !this._urlString)
228
+ throw c(L);
229
+ t.includes("#") || (this._urlString = i.canonicalizeUri(t));
230
+ }
231
+ /**
232
+ * Ensure urls are lower case and end with a / character.
233
+ * @param url
234
+ */
235
+ static canonicalizeUri(t) {
236
+ if (t) {
237
+ let e = t.toLowerCase();
238
+ return T.endsWith(e, "?") ? e = e.slice(0, -1) : T.endsWith(e, "?/") && (e = e.slice(0, -2)), T.endsWith(e, "/") || (e += "/"), e;
239
+ }
240
+ return t;
241
+ }
242
+ /**
243
+ * Throws if urlString passed is not a valid authority URI string.
244
+ */
245
+ validateAsUri() {
246
+ let t;
247
+ try {
248
+ t = this.getUrlComponents();
249
+ } catch {
250
+ throw c(E);
251
+ }
252
+ if (!t.HostNameAndPort || !t.PathSegments)
253
+ throw c(E);
254
+ if (!t.Protocol || t.Protocol.toLowerCase() !== "https:")
255
+ throw c(D);
256
+ }
257
+ /**
258
+ * Given a url and a query string return the url with provided query string appended
259
+ * @param url
260
+ * @param queryString
261
+ */
262
+ static appendQueryString(t, e) {
263
+ return e ? t.indexOf("?") < 0 ? `${t}?${e}` : `${t}&${e}` : t;
264
+ }
265
+ /**
266
+ * Returns a url with the hash removed
267
+ * @param url
268
+ */
269
+ static removeHashFromUrl(t) {
270
+ return i.canonicalizeUri(t.split("#")[0]);
271
+ }
272
+ /**
273
+ * Given a url like https://a:b/common/d?e=f#g, and a tenantId, returns https://a:b/tenantId/d
274
+ * @param href The url
275
+ * @param tenantId The tenant id to replace
276
+ */
277
+ replaceTenantPath(t) {
278
+ const e = this.getUrlComponents(), s = e.PathSegments;
279
+ return t && s.length !== 0 && (s[0] === m.COMMON || s[0] === m.ORGANIZATIONS) && (s[0] = t), i.constructAuthorityUriFromObject(e);
280
+ }
281
+ /**
282
+ * Parses out the components from a url string.
283
+ * @returns An object with the various components. Please cache this value insted of calling this multiple times on the same url.
284
+ */
285
+ getUrlComponents() {
286
+ const t = RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?"), e = this.urlString.match(t);
287
+ if (!e)
288
+ throw c(E);
289
+ const s = {
290
+ Protocol: e[1],
291
+ HostNameAndPort: e[4],
292
+ AbsolutePath: e[5],
293
+ QueryString: e[7]
294
+ };
295
+ let o = s.AbsolutePath.split("/");
296
+ return o = o.filter((n) => n && n.length > 0), s.PathSegments = o, s.QueryString && s.QueryString.endsWith("/") && (s.QueryString = s.QueryString.substring(0, s.QueryString.length - 1)), s;
297
+ }
298
+ static getDomainFromUrl(t) {
299
+ const e = RegExp("^([^:/?#]+://)?([^/?#]*)"), s = t.match(e);
300
+ if (!s)
301
+ throw c(E);
302
+ return s[2];
303
+ }
304
+ static getAbsoluteUrl(t, e) {
305
+ if (t[0] === g) {
306
+ const o = new i(e).getUrlComponents();
307
+ return o.Protocol + "//" + o.HostNameAndPort + t;
308
+ }
309
+ return t;
310
+ }
311
+ static constructAuthorityUriFromObject(t) {
312
+ return new i(t.Protocol + "//" + t.HostNameAndPort + "/" + t.PathSegments.join("/"));
313
+ }
314
+ }
315
+ /*! @azure/msal-common v16.5.2 2026-04-28 */
316
+ function ve(a, t, e) {
317
+ const s = P(a, e);
318
+ return t ? `${s}${A}${t}` : s;
319
+ }
320
+ function P(a, t) {
321
+ if (!a)
322
+ throw u(p);
323
+ const e = {
324
+ id: a.createNewGuid()
325
+ };
326
+ t && (e.meta = t);
327
+ const s = JSON.stringify(e);
328
+ return a.base64Encode(s);
329
+ }
330
+ function ke(a, t) {
331
+ if (!a)
332
+ throw u(p);
333
+ if (!t)
334
+ throw u(O);
335
+ try {
336
+ const e = t.split(A), s = e[0], o = e.length > 1 ? e.slice(1).join(A) : "", n = a(s), r = JSON.parse(n);
337
+ return {
338
+ userRequestState: o || "",
339
+ libraryState: r
340
+ };
341
+ } catch {
342
+ throw u(O);
343
+ }
344
+ }
345
+ export {
346
+ me as $,
347
+ Ut as A,
348
+ Rt as B,
349
+ rt as C,
350
+ de as D,
351
+ mt as E,
352
+ pt as F,
353
+ qt as G,
354
+ nt as H,
355
+ M as I,
356
+ F as J,
357
+ Le as K,
358
+ gt as L,
359
+ bt as M,
360
+ St as N,
361
+ y as O,
362
+ Ct as P,
363
+ K as Q,
364
+ _t as R,
365
+ T as S,
366
+ dt as T,
367
+ i as U,
368
+ tt as V,
369
+ et as W,
370
+ wt as X,
371
+ $ as Y,
372
+ Z,
373
+ Re as _,
374
+ I as a,
375
+ st as a$,
376
+ ke as a0,
377
+ Fe as a1,
378
+ Ft as a2,
379
+ Ht as a3,
380
+ V as a4,
381
+ ue as a5,
382
+ q as a6,
383
+ X as a7,
384
+ Gt as a8,
385
+ z as a9,
386
+ te as aA,
387
+ Jt as aB,
388
+ Ie as aC,
389
+ vt as aD,
390
+ kt as aE,
391
+ Kt as aF,
392
+ De as aG,
393
+ le as aH,
394
+ O as aI,
395
+ Se as aJ,
396
+ Pe as aK,
397
+ ct as aL,
398
+ we as aM,
399
+ be as aN,
400
+ Dt as aO,
401
+ Nt as aP,
402
+ yt as aQ,
403
+ ft as aR,
404
+ Mt as aS,
405
+ It as aT,
406
+ Lt as aU,
407
+ Pt as aV,
408
+ Wt as aW,
409
+ Me as aX,
410
+ at as aY,
411
+ ne as aZ,
412
+ ee as a_,
413
+ W as aa,
414
+ Y as ab,
415
+ $t as ac,
416
+ g as ad,
417
+ v as ae,
418
+ b as af,
419
+ H as ag,
420
+ Ee as ah,
421
+ Ue as ai,
422
+ ht as aj,
423
+ Te as ak,
424
+ zt as al,
425
+ j as am,
426
+ Vt as an,
427
+ Zt as ao,
428
+ w as ap,
429
+ Q as aq,
430
+ U as ar,
431
+ B as as,
432
+ m as at,
433
+ x as au,
434
+ k as av,
435
+ pe as aw,
436
+ Qt as ax,
437
+ jt as ay,
438
+ Et as az,
439
+ ot as b,
440
+ ae as b0,
441
+ ve as b1,
442
+ ye as b2,
443
+ J as b3,
444
+ G as b4,
445
+ it as b5,
446
+ C as b6,
447
+ h as b7,
448
+ N as b8,
449
+ se as b9,
450
+ oe as ba,
451
+ Yt as bb,
452
+ c,
453
+ u as d,
454
+ xt as e,
455
+ he as f,
456
+ Ce as g,
457
+ Ne as h,
458
+ Bt as i,
459
+ Ot as j,
460
+ Ae as k,
461
+ Oe as l,
462
+ He as m,
463
+ _e as n,
464
+ d as o,
465
+ Xt as p,
466
+ ce as q,
467
+ re as r,
468
+ lt as s,
469
+ ie as t,
470
+ At as u,
471
+ ge as v,
472
+ Tt as w,
473
+ ut as x,
474
+ fe as y,
475
+ _ as z
476
+ };
@@ -6,5 +6,6 @@ export interface IDataGridFilterPanelProps {
6
6
  filterFields: DataField[];
7
7
  initialQueryFields?: IQueryField[];
8
8
  onFilterSet: (field: DataField, queryFields: IQueryField[]) => void;
9
+ onClearFilters?: () => void;
9
10
  }
10
11
  export declare function DataGridFilterPanel(props: IDataGridFilterPanelProps): React.JSX.Element;
@@ -1,11 +1,15 @@
1
1
  import * as React from "react";
2
2
  import { DataField } from "../../model/DataField";
3
3
  import { IColumnRenderer } from "./columnRenderers/IColumnRenderer";
4
+ import { DataGridSelectionMode } from "./GenericDataGrid";
4
5
  import { IHttpClient } from "mgwdev-m365-helpers";
5
6
  export interface IDataverseTableDataGridProps<T> {
6
7
  tableName: string;
7
8
  fieldsToRender: DataField[];
8
9
  customRenderers?: IColumnRenderer[];
10
+ selectionMode?: DataGridSelectionMode;
11
+ getRowId?: (item: T) => string;
12
+ onSelectionChange?: (selectedItems: T[]) => void;
9
13
  }
10
14
  export declare function DataverseTableGrid<T>(props: IDataverseTableDataGridProps<T>): React.JSX.Element;
11
15
  export declare function DataverseTableGridStandalone<T>(props: IDataverseTableDataGridProps<T> & {
@@ -3,11 +3,15 @@ import { IDataGridService } from "../../services/datagrid/DataGridService";
3
3
  import { DataField } from "../../model/DataField";
4
4
  import { IColumnRenderer } from "./columnRenderers/IColumnRenderer";
5
5
  import { IQueryField } from "mgwdev-m365-helpers";
6
+ export type DataGridSelectionMode = "single" | "multiselect";
6
7
  export interface IGenericDataGridProps<T> {
7
8
  dataService: IDataGridService<T>;
8
9
  fieldsToRender: DataField[];
9
10
  customRenderers?: IColumnRenderer[];
10
11
  systemFilter?: IQueryField[];
12
+ selectionMode?: DataGridSelectionMode;
13
+ getRowId?: (item: T) => string;
14
+ onSelectionChange?: (selectedItems: T[]) => void;
11
15
  renderFilter?: (field: DataField, onFilterSet: (field: DataField, queryFields: IQueryField[]) => void, initialQueryFields?: IQueryField[]) => React.ReactElement;
12
16
  }
13
17
  export declare function GenericDataGrid<T>(props: IGenericDataGridProps<T>): React.JSX.Element;
@@ -2,13 +2,17 @@ import * as React from "react";
2
2
  import { DataField } from "../../model/DataField";
3
3
  import { IColumnRenderer } from "./columnRenderers/IColumnRenderer";
4
4
  import { IHttpClient } from "mgwdev-m365-helpers";
5
- export interface ISPListDataGridProps {
5
+ import { DataGridSelectionMode } from "./GenericDataGrid";
6
+ export interface ISPListDataGridProps<T> {
6
7
  listId: string;
7
8
  fieldsToRender: DataField[];
8
9
  customRenderers?: IColumnRenderer[];
10
+ selectionMode?: DataGridSelectionMode;
11
+ getRowId?: (item: T) => string;
12
+ onSelectionChange?: (selectedItems: T[]) => void;
9
13
  }
10
- export declare function SPListDataGrid<T>(props: ISPListDataGridProps): React.JSX.Element;
11
- export declare function SPListDataGridStandalone<T>(props: ISPListDataGridProps & {
14
+ export declare function SPListDataGrid<T>(props: ISPListDataGridProps<T>): React.JSX.Element;
15
+ export declare function SPListDataGridStandalone<T>(props: ISPListDataGridProps<T> & {
12
16
  spClient: IHttpClient;
13
17
  siteUrl: string;
14
18
  }): React.JSX.Element;
@@ -0,0 +1,14 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Vite + React + TS</title>
8
+ <script type="module" crossorigin src="/mgwdev-m365-components.es.js"></script>
9
+ <link rel="modulepreload" crossorigin href="/ProtocolUtils-f8qLE_2m.mjs">
10
+ </head>
11
+ <body>
12
+ <div id="root"></div>
13
+ </body>
14
+ </html>