g-comments 0.1.0 → 0.2.0
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/CHANGELOG.md +17 -0
- package/README.md +40 -5
- package/dist/{chunk-X6RAR374.cjs → chunk-IBNNENCZ.cjs} +14 -2
- package/dist/chunk-IBNNENCZ.cjs.map +1 -0
- package/dist/{chunk-6E3M3PQN.js → chunk-WACVXJHD.js} +14 -2
- package/dist/chunk-WACVXJHD.js.map +1 -0
- package/dist/element.d.ts +58 -5
- package/dist/element.js +22 -18
- package/dist/element.js.map +1 -1
- package/dist/index.cjs +16 -16
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/{messages-BlBkT6Kr.d.cts → messages-C9bMljl3.d.cts} +51 -1
- package/dist/{messages-BlBkT6Kr.d.ts → messages-C9bMljl3.d.ts} +51 -1
- package/dist/react.cjs +232 -35
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +20 -5
- package/dist/react.d.ts +20 -5
- package/dist/react.js +202 -6
- package/dist/react.js.map +1 -1
- package/package.json +9 -9
- package/dist/chunk-6E3M3PQN.js.map +0 -1
- package/dist/chunk-X6RAR374.cjs.map +0 -1
package/dist/react.d.cts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
-
import { g as Comment,
|
|
3
|
+
import { g as Comment, V as Pending, o as Commenter, r as CommentsError, T as Messages, C as CreateClientOptions, a as CommentsClient, e as AuthStatus, c as AuthProvider, a1 as SignInOptions, U as OpenThreadOptions, Z as PostResult, a9 as ThreadHandle, ab as ThreadSnapshot, b as CountRef, N as ForumTheme } from './messages-C9bMljl3.cjs';
|
|
4
4
|
|
|
5
|
-
/**
|
|
6
|
-
|
|
5
|
+
/**
|
|
6
|
+
* `auto` follows `prefers-color-scheme`, `inherit` leaves the colours to the
|
|
7
|
+
* page, and `forum` applies the forum's own palettes, fonts and theme CSS.
|
|
8
|
+
*/
|
|
9
|
+
type Theme = "auto" | "light" | "dark" | "inherit" | "forum";
|
|
7
10
|
/** Design tokens; each is set as `--gc-<kebab-case name>` on the widget root. */
|
|
8
11
|
type AppearanceVariable = "font" | "fg" | "fgMuted" | "bg" | "bgSubtle" | "border" | "accent" | "accentFg" | "danger" | "radius" | "shadow" | "space" | "avatarSize";
|
|
9
12
|
/** Elements that accept extra class names through `appearance.elements`. */
|
|
@@ -16,7 +19,7 @@ interface Appearance {
|
|
|
16
19
|
}
|
|
17
20
|
|
|
18
21
|
/** What the widget was doing when an `error` event fired. */
|
|
19
|
-
type CommentsAction = "open" | "load" | "loadMore" | "loadReplies" | "context" | "post" | "edit" | "delete" | "like" | "flag" | "pin" | "upload" | "preview" | "signIn";
|
|
22
|
+
type CommentsAction = "open" | "load" | "loadMore" | "loadReplies" | "context" | "post" | "edit" | "delete" | "like" | "flag" | "pin" | "upload" | "preview" | "signIn" | "theme";
|
|
20
23
|
/** Delivered to `<DiscourseComments onEvent>`. */
|
|
21
24
|
type CommentsEvent = {
|
|
22
25
|
type: "comment.posted";
|
|
@@ -317,4 +320,16 @@ declare function useCommentCount(ref: CountRef | null, options?: {
|
|
|
317
320
|
forum?: string;
|
|
318
321
|
}): CommentCountState;
|
|
319
322
|
|
|
320
|
-
|
|
323
|
+
interface ForumThemeState {
|
|
324
|
+
/** `null` until loaded (or when `enabled` is false). */
|
|
325
|
+
theme: ForumTheme | null;
|
|
326
|
+
error: CommentsError | null;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* The forum's palettes, fonts and theme stylesheets (`GET /comments/theme`),
|
|
330
|
+
* for sites that style their own UI after the forum. `<Comments theme="forum">`
|
|
331
|
+
* applies the same data to the widget.
|
|
332
|
+
*/
|
|
333
|
+
declare function useForumTheme(): ForumThemeState;
|
|
334
|
+
|
|
335
|
+
export { type Appearance, type AppearanceElement, type AppearanceVariable, CommentCount, type CommentCountProps, type CommentCountState, type CommenterState, Comments, type CommentsAction, type CommentsEvent, type CommentsProps, type ComposerProps, type CountProps, DiscourseComments, type DiscourseCommentsProps, type ForumThemeState, type HeaderProps, type ItemProps, type ListProps, type RenderComment, type RootProps, type SignInMode, type SignInProps, type Theme, type UseThreadOptions, type UseThreadResult, useClient, useCommentCount, useCommenter, useForumTheme, useThread };
|
package/dist/react.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
-
import { g as Comment,
|
|
3
|
+
import { g as Comment, V as Pending, o as Commenter, r as CommentsError, T as Messages, C as CreateClientOptions, a as CommentsClient, e as AuthStatus, c as AuthProvider, a1 as SignInOptions, U as OpenThreadOptions, Z as PostResult, a9 as ThreadHandle, ab as ThreadSnapshot, b as CountRef, N as ForumTheme } from './messages-C9bMljl3.js';
|
|
4
4
|
|
|
5
|
-
/**
|
|
6
|
-
|
|
5
|
+
/**
|
|
6
|
+
* `auto` follows `prefers-color-scheme`, `inherit` leaves the colours to the
|
|
7
|
+
* page, and `forum` applies the forum's own palettes, fonts and theme CSS.
|
|
8
|
+
*/
|
|
9
|
+
type Theme = "auto" | "light" | "dark" | "inherit" | "forum";
|
|
7
10
|
/** Design tokens; each is set as `--gc-<kebab-case name>` on the widget root. */
|
|
8
11
|
type AppearanceVariable = "font" | "fg" | "fgMuted" | "bg" | "bgSubtle" | "border" | "accent" | "accentFg" | "danger" | "radius" | "shadow" | "space" | "avatarSize";
|
|
9
12
|
/** Elements that accept extra class names through `appearance.elements`. */
|
|
@@ -16,7 +19,7 @@ interface Appearance {
|
|
|
16
19
|
}
|
|
17
20
|
|
|
18
21
|
/** What the widget was doing when an `error` event fired. */
|
|
19
|
-
type CommentsAction = "open" | "load" | "loadMore" | "loadReplies" | "context" | "post" | "edit" | "delete" | "like" | "flag" | "pin" | "upload" | "preview" | "signIn";
|
|
22
|
+
type CommentsAction = "open" | "load" | "loadMore" | "loadReplies" | "context" | "post" | "edit" | "delete" | "like" | "flag" | "pin" | "upload" | "preview" | "signIn" | "theme";
|
|
20
23
|
/** Delivered to `<DiscourseComments onEvent>`. */
|
|
21
24
|
type CommentsEvent = {
|
|
22
25
|
type: "comment.posted";
|
|
@@ -317,4 +320,16 @@ declare function useCommentCount(ref: CountRef | null, options?: {
|
|
|
317
320
|
forum?: string;
|
|
318
321
|
}): CommentCountState;
|
|
319
322
|
|
|
320
|
-
|
|
323
|
+
interface ForumThemeState {
|
|
324
|
+
/** `null` until loaded (or when `enabled` is false). */
|
|
325
|
+
theme: ForumTheme | null;
|
|
326
|
+
error: CommentsError | null;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* The forum's palettes, fonts and theme stylesheets (`GET /comments/theme`),
|
|
330
|
+
* for sites that style their own UI after the forum. `<Comments theme="forum">`
|
|
331
|
+
* applies the same data to the widget.
|
|
332
|
+
*/
|
|
333
|
+
declare function useForumTheme(): ForumThemeState;
|
|
334
|
+
|
|
335
|
+
export { type Appearance, type AppearanceElement, type AppearanceVariable, CommentCount, type CommentCountProps, type CommentCountState, type CommenterState, Comments, type CommentsAction, type CommentsEvent, type CommentsProps, type ComposerProps, type CountProps, DiscourseComments, type DiscourseCommentsProps, type ForumThemeState, type HeaderProps, type ItemProps, type ListProps, type RenderComment, type RootProps, type SignInMode, type SignInProps, type Theme, type UseThreadOptions, type UseThreadResult, useClient, useCommentCount, useCommenter, useForumTheme, useThread };
|
package/dist/react.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { createTranslator, PACKAGE_NAME, currentUrlWithoutHash, findComment, createComposerTimer, normalizeForum, resolveLocale, clientRegistry, STORAGE_PREFIX, isCommentsError, CommentsError, encodeRef, defaultPageUrl } from './chunk-
|
|
2
|
+
import { createTranslator, PACKAGE_NAME, currentUrlWithoutHash, findComment, createComposerTimer, normalizeForum, resolveLocale, clientRegistry, STORAGE_PREFIX, isCommentsError, CommentsError, encodeRef, defaultPageUrl } from './chunk-WACVXJHD.js';
|
|
3
3
|
import { createContext, useState, useRef, useCallback, useEffect, useMemo, Fragment as Fragment$1, useId, useContext, useLayoutEffect, useSyncExternalStore } from 'react';
|
|
4
4
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
5
5
|
|
|
@@ -282,6 +282,146 @@ function ImageIcon() {
|
|
|
282
282
|
function BackIcon() {
|
|
283
283
|
return /* @__PURE__ */ jsx(Icon, { children: /* @__PURE__ */ jsx("path", { d: "m15 18-6-6 6-6" }) });
|
|
284
284
|
}
|
|
285
|
+
|
|
286
|
+
// src/react/forum-theme.ts
|
|
287
|
+
var FORUM_ROOT = '.gc-root[data-gc-theme="forum"]';
|
|
288
|
+
var FORUM_STYLED_ROOT = '.gc-root--styled[data-gc-theme="forum"]';
|
|
289
|
+
var TOKEN_SOURCES = [
|
|
290
|
+
["fg", "primary"],
|
|
291
|
+
["fg-muted", "primary-medium"],
|
|
292
|
+
["bg", "secondary"],
|
|
293
|
+
["bg-subtle", "primary-very-low"],
|
|
294
|
+
["border", "primary-low"],
|
|
295
|
+
["accent", "tertiary"],
|
|
296
|
+
["accent-fg", "secondary"],
|
|
297
|
+
["danger", "danger"]
|
|
298
|
+
];
|
|
299
|
+
var SAFE_NAME = /^[\w-]+$/;
|
|
300
|
+
var SAFE_VALUE = /^[^;{}<>]+$/;
|
|
301
|
+
var SAFE_FAMILY = /^[^"'\;{}<>]+$/;
|
|
302
|
+
var FONT_SOURCE = /^url\("https?:\/\/[^"\s<>]+"\)(?:\s+format\("[\w-]+"\))?$|^local\("[^"\\<>]+"\)$/;
|
|
303
|
+
var FONT_WEIGHT = /^(?:[1-9]\d{0,2}|normal|bold)$/;
|
|
304
|
+
var SCHEME_TYPES = /* @__PURE__ */ new Set(["light", "dark"]);
|
|
305
|
+
var STYLE_ATTRIBUTE = "data-gc-forum-theme";
|
|
306
|
+
var FONTS_ATTRIBUTE = "data-gc-forum-fonts";
|
|
307
|
+
function colorDeclarations(scheme) {
|
|
308
|
+
let css = "";
|
|
309
|
+
for (const [name, value] of Object.entries(scheme.colors)) {
|
|
310
|
+
if (SAFE_NAME.test(name) && SAFE_VALUE.test(value)) {
|
|
311
|
+
css += `--gc-forum-${name}:${value};`;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
if (SCHEME_TYPES.has(scheme.type)) {
|
|
315
|
+
css += `color-scheme:${scheme.type};`;
|
|
316
|
+
}
|
|
317
|
+
return css;
|
|
318
|
+
}
|
|
319
|
+
function fontDeclarations(fonts) {
|
|
320
|
+
let css = "";
|
|
321
|
+
for (const [role, font] of Object.entries(fonts)) {
|
|
322
|
+
if (font && SAFE_NAME.test(role) && SAFE_VALUE.test(font.stack)) {
|
|
323
|
+
css += `--gc-forum-font-${role}:${font.stack};`;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
return css;
|
|
327
|
+
}
|
|
328
|
+
function tokenDeclarations(theme) {
|
|
329
|
+
let css = "";
|
|
330
|
+
for (const [token, color] of TOKEN_SOURCES) {
|
|
331
|
+
if (color in theme.schemes.light.colors) {
|
|
332
|
+
css += `--_gc-${token}:var(--gc-${token},var(--gc-forum-${color}));`;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
if (theme.fonts.body) {
|
|
336
|
+
css += "--_gc-font:var(--gc-font,var(--gc-forum-font-body));";
|
|
337
|
+
}
|
|
338
|
+
return css;
|
|
339
|
+
}
|
|
340
|
+
function forumThemeCss(theme) {
|
|
341
|
+
const { light, dark } = theme.schemes;
|
|
342
|
+
let css = `${FORUM_ROOT}{${colorDeclarations(light)}${fontDeclarations(theme.fonts)}}
|
|
343
|
+
`;
|
|
344
|
+
css += `${FORUM_STYLED_ROOT}{${tokenDeclarations(theme)}}
|
|
345
|
+
`;
|
|
346
|
+
if (dark) {
|
|
347
|
+
css += `@media (prefers-color-scheme: dark){${FORUM_ROOT}{${colorDeclarations(dark)}}}
|
|
348
|
+
`;
|
|
349
|
+
}
|
|
350
|
+
return css;
|
|
351
|
+
}
|
|
352
|
+
function forumFontFacesCss(theme) {
|
|
353
|
+
let css = "";
|
|
354
|
+
for (const font of Object.values(theme.fonts)) {
|
|
355
|
+
for (const face of font?.faces ?? []) {
|
|
356
|
+
const weight = String(face.weight);
|
|
357
|
+
if (SAFE_FAMILY.test(face.family) && FONT_SOURCE.test(face.src) && FONT_WEIGHT.test(weight)) {
|
|
358
|
+
css += `@font-face{font-family:"${face.family}";src:${face.src};font-weight:${weight};font-display:swap;}
|
|
359
|
+
`;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return css;
|
|
364
|
+
}
|
|
365
|
+
function forumStylesheetUrls(theme, forum) {
|
|
366
|
+
const secure = forum.startsWith("https:");
|
|
367
|
+
const urls = [];
|
|
368
|
+
for (const href of theme.stylesheets) {
|
|
369
|
+
let url;
|
|
370
|
+
try {
|
|
371
|
+
url = new URL(href);
|
|
372
|
+
} catch {
|
|
373
|
+
continue;
|
|
374
|
+
}
|
|
375
|
+
if (url.protocol === "https:" || !secure && url.protocol === "http:") {
|
|
376
|
+
urls.push(url.href);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
return urls;
|
|
380
|
+
}
|
|
381
|
+
function documentOf(root) {
|
|
382
|
+
return root.nodeType === 9 ? root : root.ownerDocument;
|
|
383
|
+
}
|
|
384
|
+
function replaceNodes(container, attribute, forum, key, create) {
|
|
385
|
+
let current = false;
|
|
386
|
+
for (const node of container.querySelectorAll(`[${attribute}]`)) {
|
|
387
|
+
const value = node.getAttribute(attribute);
|
|
388
|
+
if (value === key) {
|
|
389
|
+
current = true;
|
|
390
|
+
} else if (value?.startsWith(`${forum}#`)) {
|
|
391
|
+
node.remove();
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
if (!current) {
|
|
395
|
+
container.append(...create());
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
function applyForumTheme(root, theme, forum) {
|
|
399
|
+
const doc = documentOf(root);
|
|
400
|
+
const container = root.nodeType === 9 ? doc.head : root;
|
|
401
|
+
const key = `${forum}#${theme.version}`;
|
|
402
|
+
replaceNodes(container, STYLE_ATTRIBUTE, forum, key, () => {
|
|
403
|
+
const style = doc.createElement("style");
|
|
404
|
+
style.setAttribute(STYLE_ATTRIBUTE, key);
|
|
405
|
+
style.textContent = forumThemeCss(theme);
|
|
406
|
+
const links = forumStylesheetUrls(theme, forum).map((href) => {
|
|
407
|
+
const link = doc.createElement("link");
|
|
408
|
+
link.rel = "stylesheet";
|
|
409
|
+
link.href = href;
|
|
410
|
+
link.setAttribute(STYLE_ATTRIBUTE, key);
|
|
411
|
+
return link;
|
|
412
|
+
});
|
|
413
|
+
return [style, ...links];
|
|
414
|
+
});
|
|
415
|
+
const faces = forumFontFacesCss(theme);
|
|
416
|
+
if (faces) {
|
|
417
|
+
replaceNodes(doc.head, FONTS_ATTRIBUTE, forum, key, () => {
|
|
418
|
+
const style = doc.createElement("style");
|
|
419
|
+
style.setAttribute(FONTS_ATTRIBUTE, key);
|
|
420
|
+
style.textContent = faces;
|
|
421
|
+
return [style];
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
}
|
|
285
425
|
var loaded = /* @__PURE__ */ new WeakMap();
|
|
286
426
|
function initial(client) {
|
|
287
427
|
return { client, config: loaded.get(client) ?? null, error: null };
|
|
@@ -351,6 +491,49 @@ function useCommenterFor(client, config) {
|
|
|
351
491
|
[state, providers, actions]
|
|
352
492
|
);
|
|
353
493
|
}
|
|
494
|
+
var loaded2 = /* @__PURE__ */ new WeakMap();
|
|
495
|
+
function initial2(client) {
|
|
496
|
+
return { client, theme: loaded2.get(client) ?? null, error: null };
|
|
497
|
+
}
|
|
498
|
+
function useForumThemeFor(client, enabled) {
|
|
499
|
+
const [stored, setState] = useState(() => initial2(client));
|
|
500
|
+
let state = stored;
|
|
501
|
+
if (stored.client !== client) {
|
|
502
|
+
state = initial2(client);
|
|
503
|
+
setState(state);
|
|
504
|
+
}
|
|
505
|
+
useEffect(() => {
|
|
506
|
+
if (!enabled) {
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
let active = true;
|
|
510
|
+
client.theme().then(
|
|
511
|
+
(theme) => {
|
|
512
|
+
loaded2.set(client, theme);
|
|
513
|
+
if (active) {
|
|
514
|
+
setState(
|
|
515
|
+
(current) => current.client === client && current.theme !== theme ? { client, theme, error: null } : current
|
|
516
|
+
);
|
|
517
|
+
}
|
|
518
|
+
},
|
|
519
|
+
(error) => {
|
|
520
|
+
if (active) {
|
|
521
|
+
setState(
|
|
522
|
+
(current) => current.client === client ? { ...current, error: toCommentsError(error) } : current
|
|
523
|
+
);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
);
|
|
527
|
+
return () => {
|
|
528
|
+
active = false;
|
|
529
|
+
};
|
|
530
|
+
}, [client, enabled]);
|
|
531
|
+
return { theme: state.theme, error: state.error };
|
|
532
|
+
}
|
|
533
|
+
function useForumTheme() {
|
|
534
|
+
const { client } = useCommentsContext();
|
|
535
|
+
return useForumThemeFor(client, true);
|
|
536
|
+
}
|
|
354
537
|
function useThread(options = {}) {
|
|
355
538
|
const { client } = useCommentsContext(options.forum);
|
|
356
539
|
return useThreadFor(client, options);
|
|
@@ -484,6 +667,19 @@ function ConfiguredRoot(props) {
|
|
|
484
667
|
threadIdRef.current = thread?.id;
|
|
485
668
|
const { config, error: configError, reload: reloadConfig } = useConfig(client);
|
|
486
669
|
const commenter = useCommenterFor(client, config);
|
|
670
|
+
const forumTheme = useForumThemeFor(client, theme === "forum");
|
|
671
|
+
useEffect(() => {
|
|
672
|
+
const element = rootRef.current;
|
|
673
|
+
if (theme === "forum" && forumTheme.theme && element) {
|
|
674
|
+
applyForumTheme(rootNodeOf(element), forumTheme.theme, client.forum);
|
|
675
|
+
}
|
|
676
|
+
}, [theme, forumTheme.theme, client.forum]);
|
|
677
|
+
const themeError = theme === "forum" ? forumTheme.error : null;
|
|
678
|
+
useEffect(() => {
|
|
679
|
+
if (themeError) {
|
|
680
|
+
reportError("theme", themeError);
|
|
681
|
+
}
|
|
682
|
+
}, [themeError, reportError]);
|
|
487
683
|
const retry = useCallback(() => {
|
|
488
684
|
retryThread();
|
|
489
685
|
if (configError) {
|
|
@@ -1455,8 +1651,8 @@ function UserAvatar({
|
|
|
1455
1651
|
}
|
|
1456
1652
|
);
|
|
1457
1653
|
}
|
|
1458
|
-
const
|
|
1459
|
-
return /* @__PURE__ */ jsx("span", { className: cx("gc-avatar", "gc-avatar--placeholder", className), "aria-hidden": "true", children:
|
|
1654
|
+
const initial3 = (user?.name || user?.username || "").charAt(0).toUpperCase();
|
|
1655
|
+
return /* @__PURE__ */ jsx("span", { className: cx("gc-avatar", "gc-avatar--placeholder", className), "aria-hidden": "true", children: initial3 });
|
|
1460
1656
|
}
|
|
1461
1657
|
function Meta({ className }) {
|
|
1462
1658
|
const { comment } = useItemContext("Comments.Meta");
|
|
@@ -2274,8 +2470,8 @@ function Replies() {
|
|
|
2274
2470
|
root.reportError("loadReplies", error);
|
|
2275
2471
|
return;
|
|
2276
2472
|
}
|
|
2277
|
-
const
|
|
2278
|
-
const first =
|
|
2473
|
+
const loaded3 = findComment(thread.snapshot().comments, comment.id)?.node.children ?? [];
|
|
2474
|
+
const first = loaded3.find((child) => !before.has(child.id));
|
|
2279
2475
|
if (first) {
|
|
2280
2476
|
root.focusComment(first.id);
|
|
2281
2477
|
}
|
|
@@ -2544,6 +2740,6 @@ function CommentCount({
|
|
|
2544
2740
|
return /* @__PURE__ */ jsx("span", { className: cx("gc-count", className), "aria-busy": count === null || void 0, children: count === null ? null : render ? render(count) : t("commentCount", { count }) });
|
|
2545
2741
|
}
|
|
2546
2742
|
|
|
2547
|
-
export { CommentCount, Comments, DiscourseComments, useClient, useCommentCount, useCommenter, useThread };
|
|
2743
|
+
export { CommentCount, Comments, DiscourseComments, useClient, useCommentCount, useCommenter, useForumTheme, useThread };
|
|
2548
2744
|
//# sourceMappingURL=react.js.map
|
|
2549
2745
|
//# sourceMappingURL=react.js.map
|