@liveblocks/react-ui 2.25.0-aiprivatebeta7 → 2.25.0-aiprivatebeta9

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.
Files changed (135) hide show
  1. package/dist/_private/index.cjs +14 -10
  2. package/dist/_private/index.cjs.map +1 -1
  3. package/dist/_private/index.d.cts +200 -105
  4. package/dist/_private/index.d.ts +200 -105
  5. package/dist/_private/index.js +10 -5
  6. package/dist/_private/index.js.map +1 -1
  7. package/dist/components/AiChat.cjs +85 -120
  8. package/dist/components/AiChat.cjs.map +1 -1
  9. package/dist/components/AiChat.js +87 -122
  10. package/dist/components/AiChat.js.map +1 -1
  11. package/dist/components/AiTool.cjs +164 -0
  12. package/dist/components/AiTool.cjs.map +1 -0
  13. package/dist/components/AiTool.js +162 -0
  14. package/dist/components/AiTool.js.map +1 -0
  15. package/dist/components/Comment.cjs +5 -3
  16. package/dist/components/Comment.cjs.map +1 -1
  17. package/dist/components/Comment.js +6 -4
  18. package/dist/components/Comment.js.map +1 -1
  19. package/dist/components/InboxNotificationList.cjs +11 -3
  20. package/dist/components/InboxNotificationList.cjs.map +1 -1
  21. package/dist/components/InboxNotificationList.js +12 -4
  22. package/dist/components/InboxNotificationList.js.map +1 -1
  23. package/dist/components/Thread.cjs +3 -3
  24. package/dist/components/Thread.cjs.map +1 -1
  25. package/dist/components/Thread.js +3 -3
  26. package/dist/components/Thread.js.map +1 -1
  27. package/dist/components/internal/AiChatAssistantMessage.cjs +53 -229
  28. package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
  29. package/dist/components/internal/AiChatAssistantMessage.js +55 -231
  30. package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
  31. package/dist/components/internal/AiChatComposer.cjs +29 -17
  32. package/dist/components/internal/AiChatComposer.cjs.map +1 -1
  33. package/dist/components/internal/AiChatComposer.js +29 -17
  34. package/dist/components/internal/AiChatComposer.js.map +1 -1
  35. package/dist/components/internal/AiChatUserMessage.cjs +17 -10
  36. package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
  37. package/dist/components/internal/AiChatUserMessage.js +17 -10
  38. package/dist/components/internal/AiChatUserMessage.js.map +1 -1
  39. package/dist/components/internal/Button.cjs.map +1 -1
  40. package/dist/components/internal/Button.js.map +1 -1
  41. package/dist/components/internal/CodeBlock.cjs +72 -0
  42. package/dist/components/internal/CodeBlock.cjs.map +1 -0
  43. package/dist/components/internal/CodeBlock.js +70 -0
  44. package/dist/components/internal/CodeBlock.js.map +1 -0
  45. package/dist/components/internal/Emoji.cjs +12 -4
  46. package/dist/components/internal/Emoji.cjs.map +1 -1
  47. package/dist/components/internal/Emoji.js +12 -4
  48. package/dist/components/internal/Emoji.js.map +1 -1
  49. package/dist/components/internal/Prose.cjs +37 -0
  50. package/dist/components/internal/Prose.cjs.map +1 -0
  51. package/dist/components/internal/Prose.js +35 -0
  52. package/dist/components/internal/Prose.js.map +1 -0
  53. package/dist/icon.cjs +2 -0
  54. package/dist/icon.cjs.map +1 -1
  55. package/dist/icon.js +1 -0
  56. package/dist/icon.js.map +1 -1
  57. package/dist/icons/{Resolve.cjs → CheckCircle.cjs} +3 -3
  58. package/dist/icons/CheckCircle.cjs.map +1 -0
  59. package/dist/icons/{Resolve.js → CheckCircle.js} +3 -3
  60. package/dist/icons/CheckCircle.js.map +1 -0
  61. package/dist/icons/{Resolved.cjs → CheckCircleFill.cjs} +3 -3
  62. package/dist/icons/CheckCircleFill.cjs.map +1 -0
  63. package/dist/icons/{Resolved.js → CheckCircleFill.js} +3 -3
  64. package/dist/icons/CheckCircleFill.js.map +1 -0
  65. package/dist/icons/index.cjs +4 -4
  66. package/dist/icons/index.js +2 -2
  67. package/dist/index.cjs +2 -0
  68. package/dist/index.cjs.map +1 -1
  69. package/dist/index.d.cts +68 -14
  70. package/dist/index.d.ts +68 -14
  71. package/dist/index.js +1 -0
  72. package/dist/index.js.map +1 -1
  73. package/dist/overrides.cjs +2 -8
  74. package/dist/overrides.cjs.map +1 -1
  75. package/dist/overrides.js +2 -8
  76. package/dist/overrides.js.map +1 -1
  77. package/dist/primitives/AiChatComposer/index.cjs +1 -2
  78. package/dist/primitives/AiChatComposer/index.cjs.map +1 -1
  79. package/dist/primitives/AiChatComposer/index.js +1 -2
  80. package/dist/primitives/AiChatComposer/index.js.map +1 -1
  81. package/dist/primitives/AiMessage/contexts.cjs +18 -0
  82. package/dist/primitives/AiMessage/contexts.cjs.map +1 -0
  83. package/dist/primitives/AiMessage/contexts.js +15 -0
  84. package/dist/primitives/AiMessage/contexts.js.map +1 -0
  85. package/dist/primitives/AiMessage/index.cjs +133 -0
  86. package/dist/primitives/AiMessage/index.cjs.map +1 -0
  87. package/dist/primitives/AiMessage/index.js +131 -0
  88. package/dist/primitives/AiMessage/index.js.map +1 -0
  89. package/dist/primitives/{internal/Collapsible → Collapsible}/index.cjs +39 -17
  90. package/dist/primitives/Collapsible/index.cjs.map +1 -0
  91. package/dist/primitives/{internal/Collapsible → Collapsible}/index.js +37 -15
  92. package/dist/primitives/Collapsible/index.js.map +1 -0
  93. package/dist/primitives/{internal/Markdown.cjs → Markdown.cjs} +150 -83
  94. package/dist/primitives/Markdown.cjs.map +1 -0
  95. package/dist/primitives/{internal/Markdown.js → Markdown.js} +151 -83
  96. package/dist/primitives/Markdown.js.map +1 -0
  97. package/dist/primitives/index.cjs +4 -6
  98. package/dist/primitives/index.cjs.map +1 -1
  99. package/dist/primitives/index.d.cts +2 -79
  100. package/dist/primitives/index.d.ts +2 -79
  101. package/dist/primitives/index.js +4 -6
  102. package/dist/primitives/index.js.map +1 -1
  103. package/dist/utils/ErrorBoundary.cjs +48 -0
  104. package/dist/utils/ErrorBoundary.cjs.map +1 -0
  105. package/dist/utils/ErrorBoundary.js +45 -0
  106. package/dist/utils/ErrorBoundary.js.map +1 -0
  107. package/dist/utils/use-visible.cjs +63 -45
  108. package/dist/utils/use-visible.cjs.map +1 -1
  109. package/dist/utils/use-visible.js +64 -46
  110. package/dist/utils/use-visible.js.map +1 -1
  111. package/dist/version.cjs +1 -1
  112. package/dist/version.js +1 -1
  113. package/package.json +5 -5
  114. package/src/styles/constants.css +1 -1
  115. package/src/styles/dark/index.css +7 -3
  116. package/src/styles/index.css +584 -238
  117. package/src/styles/utils.css +1 -1
  118. package/styles/dark/attributes.css +1 -1
  119. package/styles/dark/attributes.css.map +1 -1
  120. package/styles/dark/media-query.css +1 -1
  121. package/styles/dark/media-query.css.map +1 -1
  122. package/styles.css +1 -1
  123. package/styles.css.map +1 -1
  124. package/dist/icons/Resolve.cjs.map +0 -1
  125. package/dist/icons/Resolve.js.map +0 -1
  126. package/dist/icons/Resolved.cjs.map +0 -1
  127. package/dist/icons/Resolved.js.map +0 -1
  128. package/dist/primitives/internal/Collapsible/index.cjs.map +0 -1
  129. package/dist/primitives/internal/Collapsible/index.js.map +0 -1
  130. package/dist/primitives/internal/Emoji.cjs +0 -32
  131. package/dist/primitives/internal/Emoji.cjs.map +0 -1
  132. package/dist/primitives/internal/Emoji.js +0 -30
  133. package/dist/primitives/internal/Emoji.js.map +0 -1
  134. package/dist/primitives/internal/Markdown.cjs.map +0 -1
  135. package/dist/primitives/internal/Markdown.js.map +0 -1
@@ -1,34 +1,104 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
+ var reactSlot = require('@radix-ui/react-slot');
4
5
  var marked = require('marked');
5
6
  var react = require('react');
6
7
 
7
- function Markdown({ content }) {
8
- const tokens = react.useMemo(() => {
9
- return new marked.Lexer().lex(content);
10
- }, [content]);
11
- return tokens.map((token, index) => {
12
- return /* @__PURE__ */ jsxRuntime.jsx(BlockTokenComp, {
13
- token
14
- }, index);
15
- });
16
- }
17
- function BlockTokenComp({ token }) {
8
+ const defaultComponents = {
9
+ CodeBlock: ({ language, code }) => {
10
+ return /* @__PURE__ */ jsxRuntime.jsx("pre", {
11
+ "data-language": language ?? void 0,
12
+ children: /* @__PURE__ */ jsxRuntime.jsx("code", {
13
+ children: code
14
+ })
15
+ });
16
+ },
17
+ Link: ({ href, title, children }) => {
18
+ return /* @__PURE__ */ jsxRuntime.jsx("a", {
19
+ href,
20
+ title,
21
+ target: "_blank",
22
+ rel: "noopener noreferrer",
23
+ children
24
+ });
25
+ },
26
+ Heading: ({ level, children }) => {
27
+ const Heading = `h${level}`;
28
+ return /* @__PURE__ */ jsxRuntime.jsx(Heading, {
29
+ children
30
+ });
31
+ },
32
+ Image: ({ src, alt, title }) => {
33
+ return /* @__PURE__ */ jsxRuntime.jsx("img", {
34
+ src,
35
+ alt,
36
+ title
37
+ });
38
+ },
39
+ Blockquote: ({ children }) => {
40
+ return /* @__PURE__ */ jsxRuntime.jsx("blockquote", {
41
+ children
42
+ });
43
+ }
44
+ };
45
+ const Markdown = react.forwardRef(
46
+ ({ content, components, asChild, ...props }, forwardedRef) => {
47
+ const Component = asChild ? reactSlot.Slot : "div";
48
+ const tokens = react.useMemo(() => {
49
+ return new marked.Lexer().lex(content);
50
+ }, [content]);
51
+ return /* @__PURE__ */ jsxRuntime.jsx(Component, {
52
+ ...props,
53
+ ref: forwardedRef,
54
+ children: tokens.map((token, index) => {
55
+ return /* @__PURE__ */ jsxRuntime.jsx(MemoizedMarkdownBlockToken, {
56
+ token,
57
+ components
58
+ }, index);
59
+ })
60
+ });
61
+ }
62
+ );
63
+ const MemoizedMarkdownBlockToken = react.memo(
64
+ ({
65
+ token,
66
+ components
67
+ }) => {
68
+ return /* @__PURE__ */ jsxRuntime.jsx(MarkdownBlockToken, {
69
+ token,
70
+ components
71
+ });
72
+ },
73
+ (prevProps, nextProps) => {
74
+ const prevToken = prevProps.token;
75
+ const nextToken = nextProps.token;
76
+ if (prevToken.raw.length !== nextToken.raw.length) {
77
+ return false;
78
+ }
79
+ if (prevToken.type !== nextToken.type) {
80
+ return false;
81
+ }
82
+ return prevToken.raw === nextToken.raw;
83
+ }
84
+ );
85
+ function MarkdownBlockToken({
86
+ token,
87
+ components
88
+ }) {
18
89
  switch (token.type) {
19
90
  case "space": {
20
91
  return null;
21
92
  }
22
93
  case "code": {
23
- let language = null;
94
+ let language = void 0;
24
95
  if (token.lang !== void 0) {
25
- language = token.lang.match(/^\S*/)?.[0] ?? null;
96
+ language = token.lang.match(/^\S*/)?.[0] ?? void 0;
26
97
  }
27
- return /* @__PURE__ */ jsxRuntime.jsx("pre", {
28
- "data-language": language || void 0,
29
- children: /* @__PURE__ */ jsxRuntime.jsx("code", {
30
- children: token.text
31
- })
98
+ const CodeBlock = components?.CodeBlock ?? defaultComponents.CodeBlock;
99
+ return /* @__PURE__ */ jsxRuntime.jsx(CodeBlock, {
100
+ language,
101
+ code: token.text
32
102
  });
33
103
  }
34
104
  case "blockquote": {
@@ -66,10 +136,12 @@ function BlockTokenComp({ token }) {
66
136
  }
67
137
  }
68
138
  }
69
- return /* @__PURE__ */ jsxRuntime.jsx("blockquote", {
139
+ const Blockquote = components?.Blockquote ?? defaultComponents.Blockquote;
140
+ return /* @__PURE__ */ jsxRuntime.jsx(Blockquote, {
70
141
  children: tokens.map((token2, index) => {
71
- return /* @__PURE__ */ jsxRuntime.jsx(BlockTokenComp, {
72
- token: token2
142
+ return /* @__PURE__ */ jsxRuntime.jsx(MarkdownBlockToken, {
143
+ token: token2,
144
+ components
73
145
  }, index);
74
146
  })
75
147
  });
@@ -78,33 +150,12 @@ function BlockTokenComp({ token }) {
78
150
  return token.text;
79
151
  }
80
152
  case "heading": {
81
- let HeadingTag;
82
- switch (token.depth) {
83
- case 1:
84
- HeadingTag = "h1";
85
- break;
86
- case 2:
87
- HeadingTag = "h2";
88
- break;
89
- case 3:
90
- HeadingTag = "h3";
91
- break;
92
- case 4:
93
- HeadingTag = "h4";
94
- break;
95
- case 5:
96
- HeadingTag = "h5";
97
- break;
98
- case 6:
99
- HeadingTag = "h6";
100
- break;
101
- default:
102
- HeadingTag = "h1";
103
- break;
104
- }
105
- return /* @__PURE__ */ jsxRuntime.jsx(HeadingTag, {
106
- children: token.tokens.map((token2, index) => /* @__PURE__ */ jsxRuntime.jsx(InlineTokenComp, {
107
- token: token2
153
+ const Heading = components?.Heading ?? defaultComponents.Heading;
154
+ return /* @__PURE__ */ jsxRuntime.jsx(Heading, {
155
+ level: clampHeadingLevel(token.depth),
156
+ children: token.tokens.map((token2, index) => /* @__PURE__ */ jsxRuntime.jsx(MarkdownInlineToken, {
157
+ token: token2,
158
+ components
108
159
  }, index))
109
160
  });
110
161
  }
@@ -187,8 +238,9 @@ function BlockTokenComp({ token }) {
187
238
  }
188
239
  return /* @__PURE__ */ jsxRuntime.jsx("li", {
189
240
  children: items.map((token2, index2) => {
190
- return /* @__PURE__ */ jsxRuntime.jsx(BlockTokenComp, {
191
- token: token2
241
+ return /* @__PURE__ */ jsxRuntime.jsx(MarkdownBlockToken, {
242
+ token: token2,
243
+ components
192
244
  }, index2);
193
245
  })
194
246
  }, index);
@@ -231,8 +283,9 @@ function BlockTokenComp({ token }) {
231
283
  }
232
284
  return /* @__PURE__ */ jsxRuntime.jsx("li", {
233
285
  children: tokens.map((token2, index2) => {
234
- return /* @__PURE__ */ jsxRuntime.jsx(BlockTokenComp, {
235
- token: token2
286
+ return /* @__PURE__ */ jsxRuntime.jsx(MarkdownBlockToken, {
287
+ token: token2,
288
+ components
236
289
  }, index2);
237
290
  })
238
291
  }, index);
@@ -249,13 +302,15 @@ function BlockTokenComp({ token }) {
249
302
  case "list":
250
303
  case "paragraph":
251
304
  case "table": {
252
- return /* @__PURE__ */ jsxRuntime.jsx(BlockTokenComp, {
253
- token: token2
305
+ return /* @__PURE__ */ jsxRuntime.jsx(MarkdownBlockToken, {
306
+ token: token2,
307
+ components
254
308
  }, index2);
255
309
  }
256
310
  case "text": {
257
- return /* @__PURE__ */ jsxRuntime.jsx(InlineTokenComp, {
258
- token: token2
311
+ return /* @__PURE__ */ jsxRuntime.jsx(MarkdownInlineToken, {
312
+ token: token2,
313
+ components
259
314
  }, index2);
260
315
  }
261
316
  default: {
@@ -286,8 +341,9 @@ function BlockTokenComp({ token }) {
286
341
  }
287
342
  case "paragraph": {
288
343
  return /* @__PURE__ */ jsxRuntime.jsx("p", {
289
- children: token.tokens.map((token2, index) => /* @__PURE__ */ jsxRuntime.jsx(InlineTokenComp, {
290
- token: token2
344
+ children: token.tokens.map((token2, index) => /* @__PURE__ */ jsxRuntime.jsx(MarkdownInlineToken, {
345
+ token: token2,
346
+ components
291
347
  }, index))
292
348
  });
293
349
  }
@@ -299,8 +355,9 @@ function BlockTokenComp({ token }) {
299
355
  children: token.header.map((cell, index) => {
300
356
  return /* @__PURE__ */ jsxRuntime.jsx("th", {
301
357
  align: cell.align ?? void 0,
302
- children: cell.tokens.map((token2, index2) => /* @__PURE__ */ jsxRuntime.jsx(InlineTokenComp, {
303
- token: token2
358
+ children: cell.tokens.map((token2, index2) => /* @__PURE__ */ jsxRuntime.jsx(MarkdownInlineToken, {
359
+ token: token2,
360
+ components
304
361
  }, index2))
305
362
  }, index);
306
363
  })
@@ -312,8 +369,9 @@ function BlockTokenComp({ token }) {
312
369
  children: row.map((cell, index2) => {
313
370
  return /* @__PURE__ */ jsxRuntime.jsx("td", {
314
371
  align: cell.align ?? void 0,
315
- children: cell.tokens.map((token2, index3) => /* @__PURE__ */ jsxRuntime.jsx(InlineTokenComp, {
316
- token: token2
372
+ children: cell.tokens.map((token2, index3) => /* @__PURE__ */ jsxRuntime.jsx(MarkdownInlineToken, {
373
+ token: token2,
374
+ components
317
375
  }, index3))
318
376
  }, index2);
319
377
  })
@@ -325,21 +383,24 @@ function BlockTokenComp({ token }) {
325
383
  }
326
384
  }
327
385
  }
328
- function InlineTokenComp({
329
- token
386
+ function MarkdownInlineToken({
387
+ token,
388
+ components
330
389
  }) {
331
390
  switch (token.type) {
332
391
  case "strong": {
333
392
  return /* @__PURE__ */ jsxRuntime.jsx("strong", {
334
- children: token.tokens.map((token2, index) => /* @__PURE__ */ jsxRuntime.jsx(InlineTokenComp, {
335
- token: token2
393
+ children: token.tokens.map((token2, index) => /* @__PURE__ */ jsxRuntime.jsx(MarkdownInlineToken, {
394
+ token: token2,
395
+ components
336
396
  }, index))
337
397
  });
338
398
  }
339
399
  case "em": {
340
400
  return /* @__PURE__ */ jsxRuntime.jsx("em", {
341
- children: token.tokens.map((token2, index) => /* @__PURE__ */ jsxRuntime.jsx(InlineTokenComp, {
342
- token: token2
401
+ children: token.tokens.map((token2, index) => /* @__PURE__ */ jsxRuntime.jsx(MarkdownInlineToken, {
402
+ token: token2,
403
+ components
343
404
  }, index))
344
405
  });
345
406
  }
@@ -353,8 +414,9 @@ function InlineTokenComp({
353
414
  }
354
415
  case "del": {
355
416
  return /* @__PURE__ */ jsxRuntime.jsx("del", {
356
- children: token.tokens.map((token2, index) => /* @__PURE__ */ jsxRuntime.jsx(InlineTokenComp, {
357
- token: token2
417
+ children: token.tokens.map((token2, index) => /* @__PURE__ */ jsxRuntime.jsx(MarkdownInlineToken, {
418
+ token: token2,
419
+ components
358
420
  }, index))
359
421
  });
360
422
  }
@@ -371,17 +433,18 @@ function InlineTokenComp({
371
433
  href = null;
372
434
  }
373
435
  if (href === null) {
374
- return token.tokens.map((token2, index) => /* @__PURE__ */ jsxRuntime.jsx(InlineTokenComp, {
375
- token: token2
436
+ return token.tokens.map((token2, index) => /* @__PURE__ */ jsxRuntime.jsx(MarkdownInlineToken, {
437
+ token: token2,
438
+ components
376
439
  }, index));
377
440
  }
378
- return /* @__PURE__ */ jsxRuntime.jsx("a", {
441
+ const Link = components?.Link ?? defaultComponents.Link;
442
+ return /* @__PURE__ */ jsxRuntime.jsx(Link, {
379
443
  href,
380
- title: token.title ? token.title : void 0,
381
- target: "_blank",
382
- rel: "noopener noreferrer",
383
- children: token.tokens.map((token2, index) => /* @__PURE__ */ jsxRuntime.jsx(InlineTokenComp, {
384
- token: token2
444
+ title: token.title ?? void 0,
445
+ children: token.tokens.map((token2, index) => /* @__PURE__ */ jsxRuntime.jsx(MarkdownInlineToken, {
446
+ token: token2,
447
+ components
385
448
  }, index))
386
449
  });
387
450
  }
@@ -400,7 +463,8 @@ function InlineTokenComp({
400
463
  if (href === null) {
401
464
  return token.text;
402
465
  }
403
- return /* @__PURE__ */ jsxRuntime.jsx("img", {
466
+ const Image = components?.Image ?? defaultComponents.Image;
467
+ return /* @__PURE__ */ jsxRuntime.jsx(Image, {
404
468
  src: href,
405
469
  alt: token.text,
406
470
  title: token.title ?? void 0
@@ -408,8 +472,9 @@ function InlineTokenComp({
408
472
  }
409
473
  case "text": {
410
474
  if (token.tokens !== void 0) {
411
- return token.tokens.map((token2, index) => /* @__PURE__ */ jsxRuntime.jsx(InlineTokenComp, {
412
- token: token2
475
+ return token.tokens.map((token2, index) => /* @__PURE__ */ jsxRuntime.jsx(MarkdownInlineToken, {
476
+ token: token2,
477
+ components
413
478
  }, index));
414
479
  } else {
415
480
  return parseHtmlEntities(token.text);
@@ -437,8 +502,10 @@ function parseHtmlEntities(input) {
437
502
  );
438
503
  return document.body.textContent;
439
504
  }
505
+ function clampHeadingLevel(level) {
506
+ return Math.max(1, Math.min(6, level));
507
+ }
440
508
 
441
- exports.BlockTokenComp = BlockTokenComp;
442
509
  exports.Markdown = Markdown;
443
- exports.parseHtmlEntities = parseHtmlEntities;
510
+ exports.MarkdownBlockToken = MarkdownBlockToken;
444
511
  //# sourceMappingURL=Markdown.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Markdown.cjs","sources":["../../src/primitives/Markdown.tsx"],"sourcesContent":["import { Slot } from \"@radix-ui/react-slot\";\nimport { Lexer, type Tokens } from \"marked\";\nimport {\n type ComponentType,\n forwardRef,\n memo,\n type ReactNode,\n useMemo,\n} from \"react\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\n\nexport type MarkdownComponents = {\n CodeBlock: ComponentType<MarkdownComponentsCodeBlockProps>;\n Link: ComponentType<MarkdownComponentsLinkProps>;\n Heading: ComponentType<MarkdownComponentsHeadingProps>;\n Image: ComponentType<MarkdownComponentsImageProps>;\n Blockquote: ComponentType<MarkdownComponentsBlockquoteProps>;\n\n // Paragraph\n // Inline (text, strong, em, code, del)\n // Table\n // List\n // Separator (hr)\n};\n\nexport interface MarkdownComponentsBlockquoteProps {\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsImageProps {\n src: string;\n alt: string;\n title?: string;\n}\n\nexport interface MarkdownComponentsHeadingProps {\n level: 1 | 2 | 3 | 4 | 5 | 6;\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsLinkProps {\n href: string;\n title?: string;\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsCodeBlockProps {\n code: string;\n language?: string;\n}\n\nexport interface MarkdownProps\n extends Omit<ComponentPropsWithSlot<\"div\">, \"children\"> {\n content: string;\n components?: Partial<MarkdownComponents>;\n}\n\n/**\n * Block level tokens include:\n * - space\n * - code\n * - blockquote\n * - html\n * - heading\n * - hr\n * - list\n * - paragraph\n * - table\n */\nexport type BlockToken =\n | Tokens.Space\n | Tokens.Code\n | Tokens.Blockquote\n | Tokens.HTML\n | Tokens.Heading\n | Tokens.Hr\n | Tokens.List\n | Tokens.Paragraph\n | Tokens.Table;\n\n/**\n * Inline tokens include:\n * - strong\n * - em\n * - codespan\n * - br\n * - del\n * - link\n * - image\n * - text\n */\ntype InlineToken =\n | Tokens.Strong\n | Tokens.Em\n | Tokens.Codespan\n | Tokens.Br\n | Tokens.Del\n | Tokens.Link\n | Tokens.Image\n | Tokens.Text\n | Tokens.Escape;\n\nconst defaultComponents: MarkdownComponents = {\n CodeBlock: ({ language, code }) => {\n return (\n <pre data-language={language ?? undefined}>\n <code>{code}</code>\n </pre>\n );\n },\n Link: ({ href, title, children }) => {\n return (\n <a href={href} title={title} target=\"_blank\" rel=\"noopener noreferrer\">\n {children}\n </a>\n );\n },\n Heading: ({ level, children }) => {\n const Heading = `h${level}` as const;\n\n return <Heading>{children}</Heading>;\n },\n Image: ({ src, alt, title }) => {\n return <img src={src} alt={alt} title={title} />;\n },\n Blockquote: ({ children }) => {\n return <blockquote>{children}</blockquote>;\n },\n};\n\nexport const Markdown = forwardRef<HTMLDivElement, MarkdownProps>(\n ({ content, components, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"div\";\n const tokens = useMemo(() => {\n return new Lexer().lex(content);\n }, [content]);\n\n return (\n <Component {...props} ref={forwardedRef}>\n {tokens.map((token, index) => {\n return (\n <MemoizedMarkdownBlockToken\n token={token as BlockToken}\n key={index}\n components={components}\n />\n );\n })}\n </Component>\n );\n }\n);\n\nconst MemoizedMarkdownBlockToken = memo(\n ({\n token,\n components,\n }: {\n token: BlockToken;\n components?: Partial<MarkdownComponents>;\n }) => {\n return <MarkdownBlockToken token={token} components={components} />;\n },\n (prevProps, nextProps) => {\n const prevToken = prevProps.token;\n const nextToken = nextProps.token;\n if (prevToken.raw.length !== nextToken.raw.length) {\n return false;\n }\n if (prevToken.type !== nextToken.type) {\n return false;\n }\n return prevToken.raw === nextToken.raw;\n }\n);\n\nexport function MarkdownBlockToken({\n token,\n components,\n}: {\n token: BlockToken;\n components: Partial<MarkdownComponents> | undefined;\n}) {\n switch (token.type) {\n case \"space\": {\n return null;\n }\n case \"code\": {\n let language: string | undefined = undefined;\n if (token.lang !== undefined) {\n language = token.lang.match(/^\\S*/)?.[0] ?? undefined;\n }\n\n const CodeBlock = components?.CodeBlock ?? defaultComponents.CodeBlock;\n\n return <CodeBlock language={language} code={token.text} />;\n }\n case \"blockquote\": {\n const tokens: BlockToken[] = [];\n for (let i = 0; i < token.tokens.length; i++) {\n switch (token.tokens[i]!.type) {\n case \"space\":\n case \"code\":\n case \"blockquote\":\n case \"html\":\n case \"heading\":\n case \"hr\":\n case \"list\":\n case \"paragraph\":\n case \"table\": {\n tokens.push(token.tokens[i] as BlockToken);\n break;\n }\n case \"text\": {\n const texts: Tokens.Text[] = [token.tokens[i] as Tokens.Text];\n while (\n i + 1 < token.tokens.length &&\n token.tokens[i + 1]!.type === \"text\"\n ) {\n i++;\n texts.push(token.tokens[i] as Tokens.Text);\n }\n tokens.push({\n type: \"paragraph\",\n tokens: texts,\n raw: texts.map((text) => text.raw).join(\"\"),\n text: texts.map((text) => text.text).join(\"\"),\n } satisfies Tokens.Paragraph);\n break;\n }\n default: {\n continue;\n }\n }\n }\n\n const Blockquote = components?.Blockquote ?? defaultComponents.Blockquote;\n\n return (\n <Blockquote>\n {tokens.map((token, index) => {\n return (\n <MarkdownBlockToken\n token={token}\n key={index}\n components={components}\n />\n );\n })}\n </Blockquote>\n );\n }\n case \"html\": {\n return token.text;\n }\n case \"heading\": {\n const Heading = components?.Heading ?? defaultComponents.Heading;\n\n return (\n <Heading level={clampHeadingLevel(token.depth)}>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </Heading>\n );\n }\n case \"hr\": {\n return <hr />;\n }\n case \"list\": {\n const ListTag = token.ordered ? \"ol\" : \"ul\";\n\n return (\n <ListTag>\n {token.items.map((item, index) => {\n // A 'loose' list item in Markdown is one where the content is wrapped in a paragraph (or potentially other block) token\n if (item.loose) {\n // If the list item is a task list item, we need to add a checkbox to the start of the token\n if (item.task) {\n const tokens = [...item.tokens];\n if (tokens[0]?.type === \"paragraph\") {\n const token = tokens[0] as Tokens.Paragraph;\n token.tokens.unshift(\n {\n type: \"checkbox\",\n checked: item.checked,\n raw: \"\",\n },\n {\n type: \"text\",\n text: \" \",\n raw: \" \",\n escaped: false,\n }\n );\n } else {\n tokens.unshift(\n {\n type: \"checkbox\",\n checked: item.checked,\n raw: \"\",\n },\n {\n type: \"text\",\n text: \" \",\n raw: \" \",\n escaped: false,\n }\n );\n }\n\n const items: BlockToken[] = [];\n for (let i = 0; i < tokens.length; i++) {\n switch (tokens[i]!.type) {\n case \"space\":\n case \"code\":\n case \"blockquote\":\n case \"html\":\n case \"heading\":\n case \"hr\":\n case \"list\":\n case \"paragraph\":\n case \"table\": {\n items.push(tokens[i] as BlockToken);\n break;\n }\n case \"text\":\n case \"checkbox\": {\n const texts: (\n | Tokens.Text\n | {\n type: \"checkbox\";\n checked: boolean;\n raw: string;\n text: string;\n }\n )[] = [\n tokens[i] as\n | Tokens.Text\n | {\n type: \"checkbox\";\n checked: boolean;\n raw: string;\n text: string;\n },\n ];\n while (\n i + 1 < tokens.length &&\n tokens[i + 1]!.type === \"text\"\n ) {\n i++;\n texts.push(tokens[i] as Tokens.Text);\n }\n items.push({\n type: \"paragraph\",\n tokens: texts,\n raw: texts.map((text) => text.raw).join(\"\"),\n text: texts.map((text) => text.text).join(\"\"),\n } satisfies Tokens.Paragraph);\n break;\n }\n default: {\n continue;\n }\n }\n }\n\n return (\n <li key={index}>\n {items.map((token, index) => {\n return (\n <MarkdownBlockToken\n token={token}\n key={index}\n components={components}\n />\n );\n })}\n </li>\n );\n } else {\n const tokens: BlockToken[] = [];\n for (let i = 0; i < item.tokens.length; i++) {\n switch (item.tokens[i]!.type) {\n case \"space\":\n case \"code\":\n case \"blockquote\":\n case \"html\":\n case \"heading\":\n case \"hr\":\n case \"list\":\n case \"paragraph\":\n case \"table\": {\n tokens.push(item.tokens[i] as BlockToken);\n break;\n }\n case \"text\": {\n const texts: Tokens.Text[] = [\n item.tokens[i] as Tokens.Text,\n ];\n while (\n i + 1 < item.tokens.length &&\n item.tokens[i + 1]!.type === \"text\"\n ) {\n i++;\n texts.push(item.tokens[i] as Tokens.Text);\n }\n tokens.push({\n type: \"paragraph\",\n tokens: texts,\n raw: texts.map((text) => text.raw).join(\"\"),\n text: texts.map((text) => text.text).join(\"\"),\n } satisfies Tokens.Paragraph);\n break;\n }\n default: {\n continue;\n }\n }\n }\n\n return (\n <li key={index}>\n {tokens.map((token, index) => {\n return (\n <MarkdownBlockToken\n token={token}\n key={index}\n components={components}\n />\n );\n })}\n </li>\n );\n }\n } else {\n const Items: ReactNode = item.tokens.map((token, index) => {\n switch (token.type) {\n case \"space\":\n case \"code\":\n case \"blockquote\":\n case \"html\":\n case \"heading\":\n case \"hr\":\n case \"list\":\n case \"paragraph\":\n case \"table\": {\n return (\n <MarkdownBlockToken\n token={token as BlockToken}\n key={index}\n components={components}\n />\n );\n }\n case \"text\": {\n return (\n <MarkdownInlineToken\n token={token as Tokens.Text}\n key={index}\n components={components}\n />\n );\n }\n default: {\n return null;\n }\n }\n });\n if (item.task) {\n return (\n <li key={index}>\n <input type=\"checkbox\" disabled checked={item.checked} />{\" \"}\n {Items}\n </li>\n );\n } else {\n return <li key={index}>{Items}</li>;\n }\n }\n })}\n </ListTag>\n );\n }\n case \"paragraph\": {\n return (\n <p>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </p>\n );\n }\n case \"table\": {\n return (\n <table>\n <thead>\n <tr>\n {token.header.map((cell, index) => {\n return (\n <th key={index} align={cell.align ?? undefined}>\n {cell.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {token.rows.map((row, index) => {\n return (\n <tr key={index}>\n {row.map((cell, index) => {\n return (\n <td key={index} align={cell.align ?? undefined}>\n {cell.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n }\n }\n}\n\nfunction MarkdownInlineToken({\n token,\n components,\n}: {\n token: InlineToken | { type: \"checkbox\"; checked: boolean };\n components: Partial<MarkdownComponents> | undefined;\n}) {\n switch (token.type) {\n case \"strong\": {\n return (\n <strong>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </strong>\n );\n }\n case \"em\": {\n return (\n <em>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </em>\n );\n }\n case \"codespan\": {\n return <code>{parseHtmlEntities(token.text)}</code>;\n }\n case \"br\": {\n return <br />;\n }\n case \"del\": {\n return (\n <del>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </del>\n );\n }\n case \"link\": {\n let href: string | null;\n try {\n const url = new URL(token.href);\n if (url.protocol === \"http:\" || url.protocol === \"https:\") {\n href = url.toString();\n } else {\n href = null;\n }\n } catch {\n href = null;\n }\n\n if (href === null) {\n return token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ));\n }\n\n const Link = components?.Link ?? defaultComponents.Link;\n\n return (\n <Link href={href} title={token.title ?? undefined}>\n {token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ))}\n </Link>\n );\n }\n case \"image\": {\n let href: string | null;\n try {\n const url = new URL(token.href);\n if (url.protocol === \"http:\" || url.protocol === \"https:\") {\n href = url.toString();\n } else {\n href = null;\n }\n } catch {\n href = null;\n }\n\n if (href === null) {\n return token.text;\n }\n\n const Image = components?.Image ?? defaultComponents.Image;\n\n return (\n <Image src={href} alt={token.text} title={token.title ?? undefined} />\n );\n }\n case \"text\": {\n if (token.tokens !== undefined) {\n return token.tokens.map((token, index) => (\n <MarkdownInlineToken\n key={index}\n token={token as InlineToken}\n components={components}\n />\n ));\n } else {\n return parseHtmlEntities(token.text);\n }\n }\n case \"escape\": {\n return token.text;\n }\n case \"checkbox\": {\n return <input type=\"checkbox\" disabled checked={token.checked} />;\n }\n default: {\n return null;\n }\n }\n}\n\nfunction parseHtmlEntities(input: string) {\n const document = new DOMParser().parseFromString(\n `<!doctype html><body>${input}`,\n \"text/html\"\n );\n\n return document.body.textContent;\n}\n\nfunction clampHeadingLevel(level: number) {\n return Math.max(1, Math.min(6, level)) as 1 | 2 | 3 | 4 | 5 | 6;\n}\n"],"names":["jsx","forwardRef","Slot","useMemo","Lexer","memo","token","index","jsxs"],"mappings":"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"}