@liveblocks/react-ui 3.2.0 → 3.2.1

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.
@@ -1,9 +1,9 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import { ComponentProps, ReactNode, ElementType, ComponentPropsWithoutRef, ComponentType, Ref, RefCallback, FormEvent } from 'react';
4
+ import { Relax, AiTextPart, AiReasoningPart, AiChatMessage } from '@liveblocks/core';
4
5
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
5
6
  export { TooltipProvider } from '@radix-ui/react-tooltip';
6
- import { AiTextPart, AiReasoningPart, AiChatMessage } from '@liveblocks/core';
7
7
 
8
8
  interface AvatarProps extends ComponentProps<"div"> {
9
9
  /**
@@ -183,10 +183,10 @@ type MarkdownComponents = {
183
183
  * ```tsx
184
184
  * <Markdown
185
185
  * components={{
186
- * List: ({ type, items }) => {
186
+ * List: ({ type, items, start }) => {
187
187
  * const List = type === "ordered" ? "ol" : "ul";
188
188
  * return (
189
- * <List>
189
+ * <List start={start}>
190
190
  * {items.map((item, index) => (
191
191
  * <li key={index}>
192
192
  * {item.checked !== undefined && (
@@ -273,8 +273,14 @@ interface MarkdownComponentsListItem {
273
273
  checked?: boolean;
274
274
  children: ReactNode;
275
275
  }
276
- interface MarkdownComponentsListProps {
277
- type: "ordered" | "unordered";
276
+ type MarkdownComponentsListProps = Relax<MarkdownComponentsOrderedListProps | MarkdownComponentsUnorderedListProps>;
277
+ interface MarkdownComponentsOrderedListProps {
278
+ type: "ordered";
279
+ items: MarkdownComponentsListItem[];
280
+ start: number;
281
+ }
282
+ interface MarkdownComponentsUnorderedListProps {
283
+ type: "unordered";
278
284
  items: MarkdownComponentsListItem[];
279
285
  }
280
286
  interface MarkdownComponentsBlockquoteProps {
@@ -1,9 +1,9 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import { ComponentProps, ReactNode, ElementType, ComponentPropsWithoutRef, ComponentType, Ref, RefCallback, FormEvent } from 'react';
4
+ import { Relax, AiTextPart, AiReasoningPart, AiChatMessage } from '@liveblocks/core';
4
5
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
5
6
  export { TooltipProvider } from '@radix-ui/react-tooltip';
6
- import { AiTextPart, AiReasoningPart, AiChatMessage } from '@liveblocks/core';
7
7
 
8
8
  interface AvatarProps extends ComponentProps<"div"> {
9
9
  /**
@@ -183,10 +183,10 @@ type MarkdownComponents = {
183
183
  * ```tsx
184
184
  * <Markdown
185
185
  * components={{
186
- * List: ({ type, items }) => {
186
+ * List: ({ type, items, start }) => {
187
187
  * const List = type === "ordered" ? "ol" : "ul";
188
188
  * return (
189
- * <List>
189
+ * <List start={start}>
190
190
  * {items.map((item, index) => (
191
191
  * <li key={index}>
192
192
  * {item.checked !== undefined && (
@@ -273,8 +273,14 @@ interface MarkdownComponentsListItem {
273
273
  checked?: boolean;
274
274
  children: ReactNode;
275
275
  }
276
- interface MarkdownComponentsListProps {
277
- type: "ordered" | "unordered";
276
+ type MarkdownComponentsListProps = Relax<MarkdownComponentsOrderedListProps | MarkdownComponentsUnorderedListProps>;
277
+ interface MarkdownComponentsOrderedListProps {
278
+ type: "ordered";
279
+ items: MarkdownComponentsListItem[];
280
+ start: number;
281
+ }
282
+ interface MarkdownComponentsUnorderedListProps {
283
+ type: "unordered";
278
284
  items: MarkdownComponentsListItem[];
279
285
  }
280
286
  interface MarkdownComponentsBlockquoteProps {
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ComponentType, ComponentPropsWithoutRef, ElementType, ReactNode, ComponentProps, FormEvent, RefAttributes, MouseEvent, PropsWithChildren } from 'react';
3
- import { CommentAttachment, AiKnowledgeSource, AiOpaqueToolDefinition, AiToolTypePack, JsonObject, AiToolExecuteCallback, NoInfr, CommentBody, MentionData, BaseMetadata, DM, CommentData, HistoryVersion, InboxNotificationData, InboxNotificationThreadData, InboxNotificationTextMentionData, InboxNotificationCustomData, KDAD, ThreadData } from '@liveblocks/core';
3
+ import { CommentAttachment, Relax, AiKnowledgeSource, AiOpaqueToolDefinition, AiToolTypePack, JsonObject, AiToolExecuteCallback, NoInfr, CommentBody, MentionData, BaseMetadata, DM, CommentData, HistoryVersion, InboxNotificationData, InboxNotificationThreadData, InboxNotificationTextMentionData, InboxNotificationCustomData, KDAD, ThreadData } from '@liveblocks/core';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
 
6
6
  interface GlobalComponents {
@@ -264,10 +264,10 @@ type MarkdownComponents = {
264
264
  * ```tsx
265
265
  * <Markdown
266
266
  * components={{
267
- * List: ({ type, items }) => {
267
+ * List: ({ type, items, start }) => {
268
268
  * const List = type === "ordered" ? "ol" : "ul";
269
269
  * return (
270
- * <List>
270
+ * <List start={start}>
271
271
  * {items.map((item, index) => (
272
272
  * <li key={index}>
273
273
  * {item.checked !== undefined && (
@@ -354,8 +354,14 @@ interface MarkdownComponentsListItem {
354
354
  checked?: boolean;
355
355
  children: ReactNode;
356
356
  }
357
- interface MarkdownComponentsListProps {
358
- type: "ordered" | "unordered";
357
+ type MarkdownComponentsListProps = Relax<MarkdownComponentsOrderedListProps | MarkdownComponentsUnorderedListProps>;
358
+ interface MarkdownComponentsOrderedListProps {
359
+ type: "ordered";
360
+ items: MarkdownComponentsListItem[];
361
+ start: number;
362
+ }
363
+ interface MarkdownComponentsUnorderedListProps {
364
+ type: "unordered";
359
365
  items: MarkdownComponentsListItem[];
360
366
  }
361
367
  interface MarkdownComponentsBlockquoteProps {
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ComponentType, ComponentPropsWithoutRef, ElementType, ReactNode, ComponentProps, FormEvent, RefAttributes, MouseEvent, PropsWithChildren } from 'react';
3
- import { CommentAttachment, AiKnowledgeSource, AiOpaqueToolDefinition, AiToolTypePack, JsonObject, AiToolExecuteCallback, NoInfr, CommentBody, MentionData, BaseMetadata, DM, CommentData, HistoryVersion, InboxNotificationData, InboxNotificationThreadData, InboxNotificationTextMentionData, InboxNotificationCustomData, KDAD, ThreadData } from '@liveblocks/core';
3
+ import { CommentAttachment, Relax, AiKnowledgeSource, AiOpaqueToolDefinition, AiToolTypePack, JsonObject, AiToolExecuteCallback, NoInfr, CommentBody, MentionData, BaseMetadata, DM, CommentData, HistoryVersion, InboxNotificationData, InboxNotificationThreadData, InboxNotificationTextMentionData, InboxNotificationCustomData, KDAD, ThreadData } from '@liveblocks/core';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
 
6
6
  interface GlobalComponents {
@@ -264,10 +264,10 @@ type MarkdownComponents = {
264
264
  * ```tsx
265
265
  * <Markdown
266
266
  * components={{
267
- * List: ({ type, items }) => {
267
+ * List: ({ type, items, start }) => {
268
268
  * const List = type === "ordered" ? "ol" : "ul";
269
269
  * return (
270
- * <List>
270
+ * <List start={start}>
271
271
  * {items.map((item, index) => (
272
272
  * <li key={index}>
273
273
  * {item.checked !== undefined && (
@@ -354,8 +354,14 @@ interface MarkdownComponentsListItem {
354
354
  checked?: boolean;
355
355
  children: ReactNode;
356
356
  }
357
- interface MarkdownComponentsListProps {
358
- type: "ordered" | "unordered";
357
+ type MarkdownComponentsListProps = Relax<MarkdownComponentsOrderedListProps | MarkdownComponentsUnorderedListProps>;
358
+ interface MarkdownComponentsOrderedListProps {
359
+ type: "ordered";
360
+ items: MarkdownComponentsListItem[];
361
+ start: number;
362
+ }
363
+ interface MarkdownComponentsUnorderedListProps {
364
+ type: "unordered";
359
365
  items: MarkdownComponentsListItem[];
360
366
  }
361
367
  interface MarkdownComponentsBlockquoteProps {
@@ -97,9 +97,10 @@ const defaultComponents = {
97
97
  ]
98
98
  });
99
99
  },
100
- List: ({ type, items }) => {
100
+ List: ({ type, items, start }) => {
101
101
  const List = type === "ordered" ? "ol" : "ul";
102
102
  return /* @__PURE__ */ jsxRuntime.jsx(List, {
103
+ start: start === 1 ? void 0 : start,
103
104
  children: items.map((item, index) => /* @__PURE__ */ jsxRuntime.jsxs("li", {
104
105
  children: [
105
106
  item.checked !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
@@ -295,9 +296,9 @@ function MarkdownToken({
295
296
  })
296
297
  };
297
298
  });
299
+ const props = token.ordered ? { type: "ordered", items, start: token.start || 1 } : { type: "unordered", items };
298
300
  return /* @__PURE__ */ jsxRuntime.jsx(List, {
299
- type: token.ordered ? "ordered" : "unordered",
300
- items
301
+ ...props
301
302
  });
302
303
  }
303
304
  case "table": {
@@ -1 +1 @@
1
- {"version":3,"file":"Markdown.cjs","sources":["../../src/primitives/Markdown.tsx"],"sourcesContent":["import { assertNever, sanitizeUrl } from \"@liveblocks/core\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { Lexer, type MarkedToken, type Token, 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 /**\n * The component used to render paragraphs.\n *\n * @example\n * ```md\n * A paragraph.\n *\n * Another paragraph.\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Paragraph: ({ children }) => <p className=\"...\">{children}</p>\n * }}\n * />\n * ```\n */\n Paragraph: ComponentType<MarkdownComponentsParagraphProps>;\n\n /**\n * The component used to render inline elements (bold, italic, strikethrough, and inline code).\n *\n * @example\n * ```md\n * **Bold**, _italic_, ~~strikethrough~~, and `inline code`.\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Inline: ({ type, children }) => {\n * const Component = type;\n * return <Component className=\"...\">{children}</Component>;\n * }\n * }}\n * />\n * ```\n */\n Inline: ComponentType<MarkdownComponentsInlineProps>;\n\n /**\n * The component used to render links.\n *\n * @example\n * ```md\n * A [link](https://liveblocks.io).\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Link: ({ href, children }) => <a href={href} className=\"...\">{children}</a>\n * }}\n * />\n * ```\n */\n Link: ComponentType<MarkdownComponentsLinkProps>;\n\n /**\n * The component used to render headings.\n *\n * @example\n * ```md\n * # Heading 1\n * ## Heading 2\n * ### Heading 3\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Heading: ({ level, children }) => {\n * const Heading = `h${level}` as const;\n * return <Heading className=\"...\">{children}</Heading>;\n * }\n * }}\n * />\n * ```\n */\n Heading: ComponentType<MarkdownComponentsHeadingProps>;\n\n /**\n * The component used to render blockquotes.\n *\n * @example\n * ```md\n * > A blockquote.\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Blockquote: ({ children }) => <blockquote className=\"...\">{children}</blockquote>\n * }}\n * />\n * ```\n */\n Blockquote: ComponentType<MarkdownComponentsBlockquoteProps>;\n\n /**\n * The component used to render code blocks.\n *\n * @example\n * ```md\n * `⁠`⁠`javascript\n * const a = 1;\n * `⁠`⁠`\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * CodeBlock: ({ language, code }) => (\n * <pre data-language={language} className=\"...\">\n * <code className=\"...\">{code}</code>\n * </pre>\n * )\n * }}\n * />\n * ```\n */\n CodeBlock: ComponentType<MarkdownComponentsCodeBlockProps>;\n\n /**\n * The component used to render images.\n *\n * @example\n * ```md\n * ![An image](https://liveblocks.io/logo.svg)\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Image: ({ src, alt }) => <img src={src} alt={alt} className=\"...\">\n * }}\n * />\n * ```\n */\n Image: ComponentType<MarkdownComponentsImageProps>;\n\n /**\n * The component used to render lists.\n *\n * @example\n * ```md\n * 1. An ordered list item\n * - An unordered list item\n * - [x] A checked list item\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * List: ({ type, items }) => {\n * const List = type === \"ordered\" ? \"ol\" : \"ul\";\n * return (\n * <List>\n * {items.map((item, index) => (\n * <li key={index}>\n * {item.checked !== undefined && (\n * <input type=\"checkbox\" disabled checked={item.checked} />{\" \"}\n * )}\n * {item.children}\n * </li>\n * ))}\n * </List>\n * );\n * }\n * }}\n * />\n * ```\n */\n List: ComponentType<MarkdownComponentsListProps>;\n\n /**\n * The component used to render tables.\n *\n * @example\n * ```md\n * | Heading 1 | Heading 2 |\n * |-----------|-----------|\n * | Cell 1 | Cell 2 |\n * | Cell 3 | Cell 4 |\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Table: ({ headings, rows }) => (\n * <table>\n * <thead>\n * <tr>\n * {headings.map(({ children }, index) => (\n * <th key={index}>{children}</th>\n * ))}\n * </tr>\n * </thead>\n * <tbody>\n * {rows.map((row, index) => (\n * <tr key={index}>\n * {row.map(({ children }, index) => (\n * <td key={index}>{children}</td>\n * ))}\n * </tr>\n * ))}\n * </tbody>\n * </table>\n * )\n * }}\n * />\n * ```\n */\n Table: ComponentType<MarkdownComponentsTableProps>;\n\n /**\n * The component used to render separators.\n *\n * @example\n * ```md\n * ---\n * ```\n * ```tsx\n * <Markdown components={{ Separator: () => <hr className=\"...\" /> }} />\n * ```\n */\n Separator: ComponentType;\n};\n\nexport interface MarkdownComponentsInlineProps {\n type: \"strong\" | \"em\" | \"code\" | \"del\";\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsParagraphProps {\n children: ReactNode;\n}\n\ninterface MarkdownComponentsTableCell {\n align?: \"left\" | \"center\" | \"right\";\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsTableProps {\n headings: MarkdownComponentsTableCell[];\n rows: MarkdownComponentsTableCell[][];\n}\n\ninterface MarkdownComponentsListItem {\n checked?: boolean;\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsListProps {\n type: \"ordered\" | \"unordered\";\n items: MarkdownComponentsListItem[];\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 extends ComponentPropsWithSlot<\"div\"> {\n content: string;\n components?: Partial<MarkdownComponents>;\n}\n\nconst defaultComponents: MarkdownComponents = {\n Paragraph: ({ children }) => {\n return <p>{children}</p>;\n },\n Inline: ({ type, children }) => {\n switch (type) {\n case \"strong\":\n return <strong>{children}</strong>;\n case \"em\":\n return <em>{children}</em>;\n case \"code\":\n return <code>{children}</code>;\n case \"del\":\n return <del>{children}</del>;\n default:\n assertNever(type, \"Unknown inline type\");\n }\n },\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 Table: ({ headings, rows }) => {\n return (\n <table>\n <thead>\n <tr>\n {headings.map((heading, index) => {\n return (\n <th key={index} align={heading.align}>\n {heading.children}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, index) => {\n return (\n <tr key={index}>\n {row.map((cell, index) => {\n return (\n <td key={index} align={cell.align}>\n {cell.children}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n },\n List: ({ type, items }) => {\n const List = type === \"ordered\" ? \"ol\" : \"ul\";\n\n return (\n <List>\n {items.map((item, index) => (\n <li key={index}>\n {item.checked !== undefined && (\n <>\n <input type=\"checkbox\" disabled checked={item.checked} />{\" \"}\n </>\n )}\n {item.children}\n </li>\n ))}\n </List>\n );\n },\n Separator: () => {\n return <hr />;\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 <MemoizedMarkdownToken\n token={token}\n key={index}\n components={components}\n />\n );\n })}\n </Component>\n );\n }\n);\n\nconst MemoizedMarkdownToken = memo(\n ({\n token,\n components,\n }: {\n token: Token;\n components?: Partial<MarkdownComponents>;\n }) => {\n return <MarkdownToken token={token} components={components} />;\n },\n (previousProps, nextProps) => {\n const previousToken = previousProps.token;\n const nextToken = nextProps.token;\n\n if (previousToken.raw.length !== nextToken.raw.length) {\n return false;\n }\n\n if (previousToken.type !== nextToken.type) {\n return false;\n }\n\n return previousToken.raw === nextToken.raw;\n }\n);\n\nexport function MarkdownToken({\n token,\n components,\n}: {\n token: Token;\n components: Partial<MarkdownComponents> | undefined;\n}) {\n // Marked.js supports generic tokens, but we don't use them.\n if (!isMarkedToken(token)) {\n return null;\n }\n\n switch (token.type) {\n case \"escape\": {\n return token.text;\n }\n\n case \"space\": {\n return null;\n }\n\n case \"text\": {\n if (token.tokens !== undefined) {\n return <MarkdownTokens tokens={token.tokens} components={components} />;\n } else {\n return parseHtmlEntities(token.text);\n }\n }\n\n case \"br\": {\n return <br />;\n }\n\n case \"paragraph\": {\n const Paragraph = components?.Paragraph ?? defaultComponents.Paragraph;\n\n return (\n <Paragraph>\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Paragraph>\n );\n }\n\n case \"heading\": {\n const Heading = components?.Heading ?? defaultComponents.Heading;\n\n return (\n <Heading level={clampHeadingLevel(token.depth)}>\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Heading>\n );\n }\n\n case \"strong\": {\n const Inline = components?.Inline ?? defaultComponents.Inline;\n\n return (\n <Inline type=\"strong\">\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Inline>\n );\n }\n\n case \"em\": {\n const Inline = components?.Inline ?? defaultComponents.Inline;\n\n return (\n <Inline type=\"em\">\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Inline>\n );\n }\n\n case \"codespan\": {\n const Inline = components?.Inline ?? defaultComponents.Inline;\n\n return <Inline type=\"code\">{parseHtmlEntities(token.text)}</Inline>;\n }\n\n case \"del\": {\n const Inline = components?.Inline ?? defaultComponents.Inline;\n\n return (\n <Inline type=\"del\">\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Inline>\n );\n }\n\n case \"link\": {\n const href = sanitizeUrl(token.href);\n\n if (href === null) {\n return <MarkdownTokens tokens={token.tokens} components={components} />;\n }\n\n const Link = components?.Link ?? defaultComponents.Link;\n\n return (\n <Link href={href} title={token.title ?? undefined}>\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Link>\n );\n }\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\n case \"blockquote\": {\n const Blockquote = components?.Blockquote ?? defaultComponents.Blockquote;\n\n return (\n <Blockquote>\n <MarkdownTokens\n tokens={token.tokens}\n components={components}\n normalizeToBlockTokens\n />\n </Blockquote>\n );\n }\n\n case \"list\": {\n const List = components?.List ?? defaultComponents.List;\n const items: MarkdownComponentsListItem[] = token.items.map((item) => {\n return {\n checked: item.task ? item.checked : undefined,\n children: (\n <MarkdownTokens\n tokens={item.tokens}\n components={components}\n // A \"loose\" list item in Markdown is one where the content is wrapped in a paragraph (or potentially other block) token\n normalizeToBlockTokens={item.loose}\n />\n ),\n };\n });\n\n return (\n <List type={token.ordered ? \"ordered\" : \"unordered\"} items={items} />\n );\n }\n\n case \"table\": {\n const Table = components?.Table ?? defaultComponents.Table;\n const headings: MarkdownComponentsTableCell[] = token.header.map(\n (cell) => ({\n align: cell.align ?? undefined,\n children: (\n <MarkdownTokens tokens={cell.tokens} components={components} />\n ),\n })\n );\n\n const rows: MarkdownComponentsTableCell[][] = token.rows.map((row) =>\n row.map((cell) => ({\n align: cell.align ?? undefined,\n children: (\n <MarkdownTokens tokens={cell.tokens} components={components} />\n ),\n }))\n );\n\n return <Table headings={headings} rows={rows} />;\n }\n\n case \"image\": {\n const href = sanitizeUrl(token.href);\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\n case \"hr\": {\n const Separator = components?.Separator ?? defaultComponents.Separator;\n\n return <Separator />;\n }\n\n // HTML elements/tokens are not supported (yet).\n case \"html\":\n default: {\n return null;\n }\n }\n}\n\nfunction MarkdownTokens({\n tokens,\n components,\n normalizeToBlockTokens = false,\n}: {\n tokens: Token[];\n components: Partial<MarkdownComponents> | undefined;\n normalizeToBlockTokens?: boolean;\n}) {\n const normalizedTokens: Token[] = [];\n\n if (normalizeToBlockTokens) {\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!;\n\n switch (token.type) {\n case \"text\": {\n // Wrap consecutive text tokens into a paragraph\n const texts: Tokens.Text[] = [token as Tokens.Text];\n while (i + 1 < tokens.length && tokens[i + 1]!.type === \"text\") {\n i++;\n texts.push(tokens[i] as Tokens.Text);\n }\n\n normalizedTokens.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\n break;\n }\n\n default: {\n normalizedTokens.push(token);\n }\n }\n }\n }\n\n return tokens.map((token, index) => (\n <MarkdownToken key={index} token={token} components={components} />\n ));\n}\n\nconst markedTokenTypes = [\n \"blockquote\",\n \"br\",\n \"code\",\n \"codespan\",\n \"def\",\n \"del\",\n \"em\",\n \"escape\",\n \"heading\",\n \"hr\",\n \"html\",\n \"image\",\n \"link\",\n \"list\",\n \"list_item\",\n \"paragraph\",\n \"space\",\n \"strong\",\n \"table\",\n \"text\",\n] as const satisfies MarkedToken[\"type\"][];\n\nfunction isMarkedToken(token: unknown): token is MarkedToken {\n return (\n typeof token === \"object\" &&\n token !== null &&\n \"type\" in token &&\n markedTokenTypes.includes(token.type as MarkedToken[\"type\"])\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","assertNever","jsxs","index","Fragment","forwardRef","Slot","useMemo","Lexer","memo","sanitizeUrl"],"mappings":"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"}
1
+ {"version":3,"file":"Markdown.cjs","sources":["../../src/primitives/Markdown.tsx"],"sourcesContent":["import { assertNever, type Relax, sanitizeUrl } from \"@liveblocks/core\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { Lexer, type MarkedToken, type Token, 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 /**\n * The component used to render paragraphs.\n *\n * @example\n * ```md\n * A paragraph.\n *\n * Another paragraph.\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Paragraph: ({ children }) => <p className=\"...\">{children}</p>\n * }}\n * />\n * ```\n */\n Paragraph: ComponentType<MarkdownComponentsParagraphProps>;\n\n /**\n * The component used to render inline elements (bold, italic, strikethrough, and inline code).\n *\n * @example\n * ```md\n * **Bold**, _italic_, ~~strikethrough~~, and `inline code`.\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Inline: ({ type, children }) => {\n * const Component = type;\n * return <Component className=\"...\">{children}</Component>;\n * }\n * }}\n * />\n * ```\n */\n Inline: ComponentType<MarkdownComponentsInlineProps>;\n\n /**\n * The component used to render links.\n *\n * @example\n * ```md\n * A [link](https://liveblocks.io).\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Link: ({ href, children }) => <a href={href} className=\"...\">{children}</a>\n * }}\n * />\n * ```\n */\n Link: ComponentType<MarkdownComponentsLinkProps>;\n\n /**\n * The component used to render headings.\n *\n * @example\n * ```md\n * # Heading 1\n * ## Heading 2\n * ### Heading 3\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Heading: ({ level, children }) => {\n * const Heading = `h${level}` as const;\n * return <Heading className=\"...\">{children}</Heading>;\n * }\n * }}\n * />\n * ```\n */\n Heading: ComponentType<MarkdownComponentsHeadingProps>;\n\n /**\n * The component used to render blockquotes.\n *\n * @example\n * ```md\n * > A blockquote.\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Blockquote: ({ children }) => <blockquote className=\"...\">{children}</blockquote>\n * }}\n * />\n * ```\n */\n Blockquote: ComponentType<MarkdownComponentsBlockquoteProps>;\n\n /**\n * The component used to render code blocks.\n *\n * @example\n * ```md\n * `⁠`⁠`javascript\n * const a = 1;\n * `⁠`⁠`\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * CodeBlock: ({ language, code }) => (\n * <pre data-language={language} className=\"...\">\n * <code className=\"...\">{code}</code>\n * </pre>\n * )\n * }}\n * />\n * ```\n */\n CodeBlock: ComponentType<MarkdownComponentsCodeBlockProps>;\n\n /**\n * The component used to render images.\n *\n * @example\n * ```md\n * ![An image](https://liveblocks.io/logo.svg)\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Image: ({ src, alt }) => <img src={src} alt={alt} className=\"...\">\n * }}\n * />\n * ```\n */\n Image: ComponentType<MarkdownComponentsImageProps>;\n\n /**\n * The component used to render lists.\n *\n * @example\n * ```md\n * 1. An ordered list item\n * - An unordered list item\n * - [x] A checked list item\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * List: ({ type, items, start }) => {\n * const List = type === \"ordered\" ? \"ol\" : \"ul\";\n * return (\n * <List start={start}>\n * {items.map((item, index) => (\n * <li key={index}>\n * {item.checked !== undefined && (\n * <input type=\"checkbox\" disabled checked={item.checked} />{\" \"}\n * )}\n * {item.children}\n * </li>\n * ))}\n * </List>\n * );\n * }\n * }}\n * />\n * ```\n */\n List: ComponentType<MarkdownComponentsListProps>;\n\n /**\n * The component used to render tables.\n *\n * @example\n * ```md\n * | Heading 1 | Heading 2 |\n * |-----------|-----------|\n * | Cell 1 | Cell 2 |\n * | Cell 3 | Cell 4 |\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Table: ({ headings, rows }) => (\n * <table>\n * <thead>\n * <tr>\n * {headings.map(({ children }, index) => (\n * <th key={index}>{children}</th>\n * ))}\n * </tr>\n * </thead>\n * <tbody>\n * {rows.map((row, index) => (\n * <tr key={index}>\n * {row.map(({ children }, index) => (\n * <td key={index}>{children}</td>\n * ))}\n * </tr>\n * ))}\n * </tbody>\n * </table>\n * )\n * }}\n * />\n * ```\n */\n Table: ComponentType<MarkdownComponentsTableProps>;\n\n /**\n * The component used to render separators.\n *\n * @example\n * ```md\n * ---\n * ```\n * ```tsx\n * <Markdown components={{ Separator: () => <hr className=\"...\" /> }} />\n * ```\n */\n Separator: ComponentType;\n};\n\nexport interface MarkdownComponentsInlineProps {\n type: \"strong\" | \"em\" | \"code\" | \"del\";\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsParagraphProps {\n children: ReactNode;\n}\n\ninterface MarkdownComponentsTableCell {\n align?: \"left\" | \"center\" | \"right\";\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsTableProps {\n headings: MarkdownComponentsTableCell[];\n rows: MarkdownComponentsTableCell[][];\n}\n\ninterface MarkdownComponentsListItem {\n checked?: boolean;\n children: ReactNode;\n}\n\nexport type MarkdownComponentsListProps = Relax<\n MarkdownComponentsOrderedListProps | MarkdownComponentsUnorderedListProps\n>;\n\ninterface MarkdownComponentsOrderedListProps {\n type: \"ordered\";\n items: MarkdownComponentsListItem[];\n start: number;\n}\n\ninterface MarkdownComponentsUnorderedListProps {\n type: \"unordered\";\n items: MarkdownComponentsListItem[];\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 extends ComponentPropsWithSlot<\"div\"> {\n content: string;\n components?: Partial<MarkdownComponents>;\n}\n\nconst defaultComponents: MarkdownComponents = {\n Paragraph: ({ children }) => {\n return <p>{children}</p>;\n },\n Inline: ({ type, children }) => {\n switch (type) {\n case \"strong\":\n return <strong>{children}</strong>;\n case \"em\":\n return <em>{children}</em>;\n case \"code\":\n return <code>{children}</code>;\n case \"del\":\n return <del>{children}</del>;\n default:\n assertNever(type, \"Unknown inline type\");\n }\n },\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 Table: ({ headings, rows }) => {\n return (\n <table>\n <thead>\n <tr>\n {headings.map((heading, index) => {\n return (\n <th key={index} align={heading.align}>\n {heading.children}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, index) => {\n return (\n <tr key={index}>\n {row.map((cell, index) => {\n return (\n <td key={index} align={cell.align}>\n {cell.children}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n },\n List: ({ type, items, start }) => {\n const List = type === \"ordered\" ? \"ol\" : \"ul\";\n\n return (\n <List start={start === 1 ? undefined : start}>\n {items.map((item, index) => (\n <li key={index}>\n {item.checked !== undefined && (\n <>\n <input type=\"checkbox\" disabled checked={item.checked} />{\" \"}\n </>\n )}\n {item.children}\n </li>\n ))}\n </List>\n );\n },\n Separator: () => {\n return <hr />;\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 <MemoizedMarkdownToken\n token={token}\n key={index}\n components={components}\n />\n );\n })}\n </Component>\n );\n }\n);\n\nconst MemoizedMarkdownToken = memo(\n ({\n token,\n components,\n }: {\n token: Token;\n components?: Partial<MarkdownComponents>;\n }) => {\n return <MarkdownToken token={token} components={components} />;\n },\n (previousProps, nextProps) => {\n const previousToken = previousProps.token;\n const nextToken = nextProps.token;\n\n if (previousToken.raw.length !== nextToken.raw.length) {\n return false;\n }\n\n if (previousToken.type !== nextToken.type) {\n return false;\n }\n\n return previousToken.raw === nextToken.raw;\n }\n);\n\nexport function MarkdownToken({\n token,\n components,\n}: {\n token: Token;\n components: Partial<MarkdownComponents> | undefined;\n}) {\n // Marked.js supports generic tokens, but we don't use them.\n if (!isMarkedToken(token)) {\n return null;\n }\n\n switch (token.type) {\n case \"escape\": {\n return token.text;\n }\n\n case \"space\": {\n return null;\n }\n\n case \"text\": {\n if (token.tokens !== undefined) {\n return <MarkdownTokens tokens={token.tokens} components={components} />;\n } else {\n return parseHtmlEntities(token.text);\n }\n }\n\n case \"br\": {\n return <br />;\n }\n\n case \"paragraph\": {\n const Paragraph = components?.Paragraph ?? defaultComponents.Paragraph;\n\n return (\n <Paragraph>\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Paragraph>\n );\n }\n\n case \"heading\": {\n const Heading = components?.Heading ?? defaultComponents.Heading;\n\n return (\n <Heading level={clampHeadingLevel(token.depth)}>\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Heading>\n );\n }\n\n case \"strong\": {\n const Inline = components?.Inline ?? defaultComponents.Inline;\n\n return (\n <Inline type=\"strong\">\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Inline>\n );\n }\n\n case \"em\": {\n const Inline = components?.Inline ?? defaultComponents.Inline;\n\n return (\n <Inline type=\"em\">\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Inline>\n );\n }\n\n case \"codespan\": {\n const Inline = components?.Inline ?? defaultComponents.Inline;\n\n return <Inline type=\"code\">{parseHtmlEntities(token.text)}</Inline>;\n }\n\n case \"del\": {\n const Inline = components?.Inline ?? defaultComponents.Inline;\n\n return (\n <Inline type=\"del\">\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Inline>\n );\n }\n\n case \"link\": {\n const href = sanitizeUrl(token.href);\n\n if (href === null) {\n return <MarkdownTokens tokens={token.tokens} components={components} />;\n }\n\n const Link = components?.Link ?? defaultComponents.Link;\n\n return (\n <Link href={href} title={token.title ?? undefined}>\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Link>\n );\n }\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\n case \"blockquote\": {\n const Blockquote = components?.Blockquote ?? defaultComponents.Blockquote;\n\n return (\n <Blockquote>\n <MarkdownTokens\n tokens={token.tokens}\n components={components}\n normalizeToBlockTokens\n />\n </Blockquote>\n );\n }\n\n case \"list\": {\n const List = components?.List ?? defaultComponents.List;\n const items: MarkdownComponentsListItem[] = token.items.map((item) => {\n return {\n checked: item.task ? item.checked : undefined,\n children: (\n <MarkdownTokens\n tokens={item.tokens}\n components={components}\n // A \"loose\" list item in Markdown is one where the content is wrapped in a paragraph (or potentially other block) token\n normalizeToBlockTokens={item.loose}\n />\n ),\n };\n });\n\n const props: MarkdownComponentsListProps = token.ordered\n ? { type: \"ordered\", items, start: token.start || 1 }\n : { type: \"unordered\", items };\n\n return <List {...props} />;\n }\n\n case \"table\": {\n const Table = components?.Table ?? defaultComponents.Table;\n const headings: MarkdownComponentsTableCell[] = token.header.map(\n (cell) => ({\n align: cell.align ?? undefined,\n children: (\n <MarkdownTokens tokens={cell.tokens} components={components} />\n ),\n })\n );\n\n const rows: MarkdownComponentsTableCell[][] = token.rows.map((row) =>\n row.map((cell) => ({\n align: cell.align ?? undefined,\n children: (\n <MarkdownTokens tokens={cell.tokens} components={components} />\n ),\n }))\n );\n\n return <Table headings={headings} rows={rows} />;\n }\n\n case \"image\": {\n const href = sanitizeUrl(token.href);\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\n case \"hr\": {\n const Separator = components?.Separator ?? defaultComponents.Separator;\n\n return <Separator />;\n }\n\n // HTML elements/tokens are not supported (yet).\n case \"html\":\n default: {\n return null;\n }\n }\n}\n\nfunction MarkdownTokens({\n tokens,\n components,\n normalizeToBlockTokens = false,\n}: {\n tokens: Token[];\n components: Partial<MarkdownComponents> | undefined;\n normalizeToBlockTokens?: boolean;\n}) {\n const normalizedTokens: Token[] = [];\n\n if (normalizeToBlockTokens) {\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!;\n\n switch (token.type) {\n case \"text\": {\n // Wrap consecutive text tokens into a paragraph\n const texts: Tokens.Text[] = [token as Tokens.Text];\n while (i + 1 < tokens.length && tokens[i + 1]!.type === \"text\") {\n i++;\n texts.push(tokens[i] as Tokens.Text);\n }\n\n normalizedTokens.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\n break;\n }\n\n default: {\n normalizedTokens.push(token);\n }\n }\n }\n }\n\n return tokens.map((token, index) => (\n <MarkdownToken key={index} token={token} components={components} />\n ));\n}\n\nconst markedTokenTypes = [\n \"blockquote\",\n \"br\",\n \"code\",\n \"codespan\",\n \"def\",\n \"del\",\n \"em\",\n \"escape\",\n \"heading\",\n \"hr\",\n \"html\",\n \"image\",\n \"link\",\n \"list\",\n \"list_item\",\n \"paragraph\",\n \"space\",\n \"strong\",\n \"table\",\n \"text\",\n] as const satisfies MarkedToken[\"type\"][];\n\nfunction isMarkedToken(token: unknown): token is MarkedToken {\n return (\n typeof token === \"object\" &&\n token !== null &&\n \"type\" in token &&\n markedTokenTypes.includes(token.type as MarkedToken[\"type\"])\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","assertNever","jsxs","index","Fragment","forwardRef","Slot","useMemo","Lexer","memo","sanitizeUrl"],"mappings":"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"}
@@ -95,9 +95,10 @@ const defaultComponents = {
95
95
  ]
96
96
  });
97
97
  },
98
- List: ({ type, items }) => {
98
+ List: ({ type, items, start }) => {
99
99
  const List = type === "ordered" ? "ol" : "ul";
100
100
  return /* @__PURE__ */ jsx(List, {
101
+ start: start === 1 ? void 0 : start,
101
102
  children: items.map((item, index) => /* @__PURE__ */ jsxs("li", {
102
103
  children: [
103
104
  item.checked !== void 0 && /* @__PURE__ */ jsxs(Fragment, {
@@ -293,9 +294,9 @@ function MarkdownToken({
293
294
  })
294
295
  };
295
296
  });
297
+ const props = token.ordered ? { type: "ordered", items, start: token.start || 1 } : { type: "unordered", items };
296
298
  return /* @__PURE__ */ jsx(List, {
297
- type: token.ordered ? "ordered" : "unordered",
298
- items
299
+ ...props
299
300
  });
300
301
  }
301
302
  case "table": {
@@ -1 +1 @@
1
- {"version":3,"file":"Markdown.js","sources":["../../src/primitives/Markdown.tsx"],"sourcesContent":["import { assertNever, sanitizeUrl } from \"@liveblocks/core\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { Lexer, type MarkedToken, type Token, 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 /**\n * The component used to render paragraphs.\n *\n * @example\n * ```md\n * A paragraph.\n *\n * Another paragraph.\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Paragraph: ({ children }) => <p className=\"...\">{children}</p>\n * }}\n * />\n * ```\n */\n Paragraph: ComponentType<MarkdownComponentsParagraphProps>;\n\n /**\n * The component used to render inline elements (bold, italic, strikethrough, and inline code).\n *\n * @example\n * ```md\n * **Bold**, _italic_, ~~strikethrough~~, and `inline code`.\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Inline: ({ type, children }) => {\n * const Component = type;\n * return <Component className=\"...\">{children}</Component>;\n * }\n * }}\n * />\n * ```\n */\n Inline: ComponentType<MarkdownComponentsInlineProps>;\n\n /**\n * The component used to render links.\n *\n * @example\n * ```md\n * A [link](https://liveblocks.io).\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Link: ({ href, children }) => <a href={href} className=\"...\">{children}</a>\n * }}\n * />\n * ```\n */\n Link: ComponentType<MarkdownComponentsLinkProps>;\n\n /**\n * The component used to render headings.\n *\n * @example\n * ```md\n * # Heading 1\n * ## Heading 2\n * ### Heading 3\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Heading: ({ level, children }) => {\n * const Heading = `h${level}` as const;\n * return <Heading className=\"...\">{children}</Heading>;\n * }\n * }}\n * />\n * ```\n */\n Heading: ComponentType<MarkdownComponentsHeadingProps>;\n\n /**\n * The component used to render blockquotes.\n *\n * @example\n * ```md\n * > A blockquote.\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Blockquote: ({ children }) => <blockquote className=\"...\">{children}</blockquote>\n * }}\n * />\n * ```\n */\n Blockquote: ComponentType<MarkdownComponentsBlockquoteProps>;\n\n /**\n * The component used to render code blocks.\n *\n * @example\n * ```md\n * `⁠`⁠`javascript\n * const a = 1;\n * `⁠`⁠`\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * CodeBlock: ({ language, code }) => (\n * <pre data-language={language} className=\"...\">\n * <code className=\"...\">{code}</code>\n * </pre>\n * )\n * }}\n * />\n * ```\n */\n CodeBlock: ComponentType<MarkdownComponentsCodeBlockProps>;\n\n /**\n * The component used to render images.\n *\n * @example\n * ```md\n * ![An image](https://liveblocks.io/logo.svg)\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Image: ({ src, alt }) => <img src={src} alt={alt} className=\"...\">\n * }}\n * />\n * ```\n */\n Image: ComponentType<MarkdownComponentsImageProps>;\n\n /**\n * The component used to render lists.\n *\n * @example\n * ```md\n * 1. An ordered list item\n * - An unordered list item\n * - [x] A checked list item\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * List: ({ type, items }) => {\n * const List = type === \"ordered\" ? \"ol\" : \"ul\";\n * return (\n * <List>\n * {items.map((item, index) => (\n * <li key={index}>\n * {item.checked !== undefined && (\n * <input type=\"checkbox\" disabled checked={item.checked} />{\" \"}\n * )}\n * {item.children}\n * </li>\n * ))}\n * </List>\n * );\n * }\n * }}\n * />\n * ```\n */\n List: ComponentType<MarkdownComponentsListProps>;\n\n /**\n * The component used to render tables.\n *\n * @example\n * ```md\n * | Heading 1 | Heading 2 |\n * |-----------|-----------|\n * | Cell 1 | Cell 2 |\n * | Cell 3 | Cell 4 |\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Table: ({ headings, rows }) => (\n * <table>\n * <thead>\n * <tr>\n * {headings.map(({ children }, index) => (\n * <th key={index}>{children}</th>\n * ))}\n * </tr>\n * </thead>\n * <tbody>\n * {rows.map((row, index) => (\n * <tr key={index}>\n * {row.map(({ children }, index) => (\n * <td key={index}>{children}</td>\n * ))}\n * </tr>\n * ))}\n * </tbody>\n * </table>\n * )\n * }}\n * />\n * ```\n */\n Table: ComponentType<MarkdownComponentsTableProps>;\n\n /**\n * The component used to render separators.\n *\n * @example\n * ```md\n * ---\n * ```\n * ```tsx\n * <Markdown components={{ Separator: () => <hr className=\"...\" /> }} />\n * ```\n */\n Separator: ComponentType;\n};\n\nexport interface MarkdownComponentsInlineProps {\n type: \"strong\" | \"em\" | \"code\" | \"del\";\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsParagraphProps {\n children: ReactNode;\n}\n\ninterface MarkdownComponentsTableCell {\n align?: \"left\" | \"center\" | \"right\";\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsTableProps {\n headings: MarkdownComponentsTableCell[];\n rows: MarkdownComponentsTableCell[][];\n}\n\ninterface MarkdownComponentsListItem {\n checked?: boolean;\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsListProps {\n type: \"ordered\" | \"unordered\";\n items: MarkdownComponentsListItem[];\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 extends ComponentPropsWithSlot<\"div\"> {\n content: string;\n components?: Partial<MarkdownComponents>;\n}\n\nconst defaultComponents: MarkdownComponents = {\n Paragraph: ({ children }) => {\n return <p>{children}</p>;\n },\n Inline: ({ type, children }) => {\n switch (type) {\n case \"strong\":\n return <strong>{children}</strong>;\n case \"em\":\n return <em>{children}</em>;\n case \"code\":\n return <code>{children}</code>;\n case \"del\":\n return <del>{children}</del>;\n default:\n assertNever(type, \"Unknown inline type\");\n }\n },\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 Table: ({ headings, rows }) => {\n return (\n <table>\n <thead>\n <tr>\n {headings.map((heading, index) => {\n return (\n <th key={index} align={heading.align}>\n {heading.children}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, index) => {\n return (\n <tr key={index}>\n {row.map((cell, index) => {\n return (\n <td key={index} align={cell.align}>\n {cell.children}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n },\n List: ({ type, items }) => {\n const List = type === \"ordered\" ? \"ol\" : \"ul\";\n\n return (\n <List>\n {items.map((item, index) => (\n <li key={index}>\n {item.checked !== undefined && (\n <>\n <input type=\"checkbox\" disabled checked={item.checked} />{\" \"}\n </>\n )}\n {item.children}\n </li>\n ))}\n </List>\n );\n },\n Separator: () => {\n return <hr />;\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 <MemoizedMarkdownToken\n token={token}\n key={index}\n components={components}\n />\n );\n })}\n </Component>\n );\n }\n);\n\nconst MemoizedMarkdownToken = memo(\n ({\n token,\n components,\n }: {\n token: Token;\n components?: Partial<MarkdownComponents>;\n }) => {\n return <MarkdownToken token={token} components={components} />;\n },\n (previousProps, nextProps) => {\n const previousToken = previousProps.token;\n const nextToken = nextProps.token;\n\n if (previousToken.raw.length !== nextToken.raw.length) {\n return false;\n }\n\n if (previousToken.type !== nextToken.type) {\n return false;\n }\n\n return previousToken.raw === nextToken.raw;\n }\n);\n\nexport function MarkdownToken({\n token,\n components,\n}: {\n token: Token;\n components: Partial<MarkdownComponents> | undefined;\n}) {\n // Marked.js supports generic tokens, but we don't use them.\n if (!isMarkedToken(token)) {\n return null;\n }\n\n switch (token.type) {\n case \"escape\": {\n return token.text;\n }\n\n case \"space\": {\n return null;\n }\n\n case \"text\": {\n if (token.tokens !== undefined) {\n return <MarkdownTokens tokens={token.tokens} components={components} />;\n } else {\n return parseHtmlEntities(token.text);\n }\n }\n\n case \"br\": {\n return <br />;\n }\n\n case \"paragraph\": {\n const Paragraph = components?.Paragraph ?? defaultComponents.Paragraph;\n\n return (\n <Paragraph>\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Paragraph>\n );\n }\n\n case \"heading\": {\n const Heading = components?.Heading ?? defaultComponents.Heading;\n\n return (\n <Heading level={clampHeadingLevel(token.depth)}>\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Heading>\n );\n }\n\n case \"strong\": {\n const Inline = components?.Inline ?? defaultComponents.Inline;\n\n return (\n <Inline type=\"strong\">\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Inline>\n );\n }\n\n case \"em\": {\n const Inline = components?.Inline ?? defaultComponents.Inline;\n\n return (\n <Inline type=\"em\">\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Inline>\n );\n }\n\n case \"codespan\": {\n const Inline = components?.Inline ?? defaultComponents.Inline;\n\n return <Inline type=\"code\">{parseHtmlEntities(token.text)}</Inline>;\n }\n\n case \"del\": {\n const Inline = components?.Inline ?? defaultComponents.Inline;\n\n return (\n <Inline type=\"del\">\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Inline>\n );\n }\n\n case \"link\": {\n const href = sanitizeUrl(token.href);\n\n if (href === null) {\n return <MarkdownTokens tokens={token.tokens} components={components} />;\n }\n\n const Link = components?.Link ?? defaultComponents.Link;\n\n return (\n <Link href={href} title={token.title ?? undefined}>\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Link>\n );\n }\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\n case \"blockquote\": {\n const Blockquote = components?.Blockquote ?? defaultComponents.Blockquote;\n\n return (\n <Blockquote>\n <MarkdownTokens\n tokens={token.tokens}\n components={components}\n normalizeToBlockTokens\n />\n </Blockquote>\n );\n }\n\n case \"list\": {\n const List = components?.List ?? defaultComponents.List;\n const items: MarkdownComponentsListItem[] = token.items.map((item) => {\n return {\n checked: item.task ? item.checked : undefined,\n children: (\n <MarkdownTokens\n tokens={item.tokens}\n components={components}\n // A \"loose\" list item in Markdown is one where the content is wrapped in a paragraph (or potentially other block) token\n normalizeToBlockTokens={item.loose}\n />\n ),\n };\n });\n\n return (\n <List type={token.ordered ? \"ordered\" : \"unordered\"} items={items} />\n );\n }\n\n case \"table\": {\n const Table = components?.Table ?? defaultComponents.Table;\n const headings: MarkdownComponentsTableCell[] = token.header.map(\n (cell) => ({\n align: cell.align ?? undefined,\n children: (\n <MarkdownTokens tokens={cell.tokens} components={components} />\n ),\n })\n );\n\n const rows: MarkdownComponentsTableCell[][] = token.rows.map((row) =>\n row.map((cell) => ({\n align: cell.align ?? undefined,\n children: (\n <MarkdownTokens tokens={cell.tokens} components={components} />\n ),\n }))\n );\n\n return <Table headings={headings} rows={rows} />;\n }\n\n case \"image\": {\n const href = sanitizeUrl(token.href);\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\n case \"hr\": {\n const Separator = components?.Separator ?? defaultComponents.Separator;\n\n return <Separator />;\n }\n\n // HTML elements/tokens are not supported (yet).\n case \"html\":\n default: {\n return null;\n }\n }\n}\n\nfunction MarkdownTokens({\n tokens,\n components,\n normalizeToBlockTokens = false,\n}: {\n tokens: Token[];\n components: Partial<MarkdownComponents> | undefined;\n normalizeToBlockTokens?: boolean;\n}) {\n const normalizedTokens: Token[] = [];\n\n if (normalizeToBlockTokens) {\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!;\n\n switch (token.type) {\n case \"text\": {\n // Wrap consecutive text tokens into a paragraph\n const texts: Tokens.Text[] = [token as Tokens.Text];\n while (i + 1 < tokens.length && tokens[i + 1]!.type === \"text\") {\n i++;\n texts.push(tokens[i] as Tokens.Text);\n }\n\n normalizedTokens.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\n break;\n }\n\n default: {\n normalizedTokens.push(token);\n }\n }\n }\n }\n\n return tokens.map((token, index) => (\n <MarkdownToken key={index} token={token} components={components} />\n ));\n}\n\nconst markedTokenTypes = [\n \"blockquote\",\n \"br\",\n \"code\",\n \"codespan\",\n \"def\",\n \"del\",\n \"em\",\n \"escape\",\n \"heading\",\n \"hr\",\n \"html\",\n \"image\",\n \"link\",\n \"list\",\n \"list_item\",\n \"paragraph\",\n \"space\",\n \"strong\",\n \"table\",\n \"text\",\n] as const satisfies MarkedToken[\"type\"][];\n\nfunction isMarkedToken(token: unknown): token is MarkedToken {\n return (\n typeof token === \"object\" &&\n token !== null &&\n \"type\" in token &&\n markedTokenTypes.includes(token.type as MarkedToken[\"type\"])\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":["index"],"mappings":";;;;;;AAuSA,MAAM,iBAAwC,GAAA;AAAA,EAC5C,SAAW,EAAA,CAAC,EAAE,QAAA,EAAe,KAAA;AAC3B,IAAA,uBAAQ,GAAA,CAAA,GAAA,EAAA;AAAA,MAAG,QAAA;AAAA,KAAS,CAAA,CAAA;AAAA,GACtB;AAAA,EACA,MAAQ,EAAA,CAAC,EAAE,IAAA,EAAM,UAAe,KAAA;AAC9B,IAAA,QAAQ,IAAM;AAAA,MACZ,KAAK,QAAA;AACH,QAAA,uBAAQ,GAAA,CAAA,QAAA,EAAA;AAAA,UAAQ,QAAA;AAAA,SAAS,CAAA,CAAA;AAAA,MAC3B,KAAK,IAAA;AACH,QAAA,uBAAQ,GAAA,CAAA,IAAA,EAAA;AAAA,UAAI,QAAA;AAAA,SAAS,CAAA,CAAA;AAAA,MACvB,KAAK,MAAA;AACH,QAAA,uBAAQ,GAAA,CAAA,MAAA,EAAA;AAAA,UAAM,QAAA;AAAA,SAAS,CAAA,CAAA;AAAA,MACzB,KAAK,KAAA;AACH,QAAA,uBAAQ,GAAA,CAAA,KAAA,EAAA;AAAA,UAAK,QAAA;AAAA,SAAS,CAAA,CAAA;AAAA,MACxB;AACE,QAAA,WAAA,CAAY,MAAM,qBAAqB,CAAA,CAAA;AAAA,KAC3C;AAAA,GACF;AAAA,EACA,SAAW,EAAA,CAAC,EAAE,QAAA,EAAU,MAAW,KAAA;AACjC,IAAA,uBACG,GAAA,CAAA,KAAA,EAAA;AAAA,MAAI,iBAAe,QAAY,IAAA,KAAA,CAAA;AAAA,MAC9B,QAAC,kBAAA,GAAA,CAAA,MAAA,EAAA;AAAA,QAAM,QAAA,EAAA,IAAA;AAAA,OAAK,CAAA;AAAA,KACd,CAAA,CAAA;AAAA,GAEJ;AAAA,EACA,MAAM,CAAC,EAAE,IAAM,EAAA,KAAA,EAAO,UAAe,KAAA;AACnC,IAAA,uBACG,GAAA,CAAA,GAAA,EAAA;AAAA,MAAE,IAAA;AAAA,MAAY,KAAA;AAAA,MAAc,MAAO,EAAA,QAAA;AAAA,MAAS,GAAI,EAAA,qBAAA;AAAA,MAC9C,QAAA;AAAA,KACH,CAAA,CAAA;AAAA,GAEJ;AAAA,EACA,OAAS,EAAA,CAAC,EAAE,KAAA,EAAO,UAAe,KAAA;AAChC,IAAA,MAAM,UAAU,CAAI,CAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAEpB,IAAA,uBAAQ,GAAA,CAAA,OAAA,EAAA;AAAA,MAAS,QAAA;AAAA,KAAS,CAAA,CAAA;AAAA,GAC5B;AAAA,EACA,OAAO,CAAC,EAAE,GAAK,EAAA,GAAA,EAAK,OAAY,KAAA;AAC9B,IAAA,uBAAQ,GAAA,CAAA,KAAA,EAAA;AAAA,MAAI,GAAA;AAAA,MAAU,GAAA;AAAA,MAAU,KAAA;AAAA,KAAc,CAAA,CAAA;AAAA,GAChD;AAAA,EACA,UAAY,EAAA,CAAC,EAAE,QAAA,EAAe,KAAA;AAC5B,IAAA,uBAAQ,GAAA,CAAA,YAAA,EAAA;AAAA,MAAY,QAAA;AAAA,KAAS,CAAA,CAAA;AAAA,GAC/B;AAAA,EACA,KAAO,EAAA,CAAC,EAAE,QAAA,EAAU,MAAW,KAAA;AAC7B,IAAA,uBACG,IAAA,CAAA,OAAA,EAAA;AAAA,MACC,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,OAAA,EAAA;AAAA,UACC,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA;AAAA,YACE,QAAS,EAAA,QAAA,CAAA,GAAA,CAAI,CAAC,OAAA,EAAS,KAAU,KAAA;AAChC,cAAA,uBACG,GAAA,CAAA,IAAA,EAAA;AAAA,gBAAe,OAAO,OAAQ,CAAA,KAAA;AAAA,gBAC5B,QAAQ,EAAA,OAAA,CAAA,QAAA;AAAA,eAAA,EADF,KAET,CAAA,CAAA;AAAA,aAEH,CAAA;AAAA,WACH,CAAA;AAAA,SACF,CAAA;AAAA,wBACC,GAAA,CAAA,OAAA,EAAA;AAAA,UACE,QAAK,EAAA,IAAA,CAAA,GAAA,CAAI,CAAC,GAAA,EAAK,KAAU,KAAA;AACxB,YAAA,uBACG,GAAA,CAAA,IAAA,EAAA;AAAA,cACE,QAAI,EAAA,GAAA,CAAA,GAAA,CAAI,CAAC,IAAA,EAAMA,MAAU,KAAA;AACxB,gBAAA,uBACG,GAAA,CAAA,IAAA,EAAA;AAAA,kBAAe,OAAO,IAAK,CAAA,KAAA;AAAA,kBACzB,QAAK,EAAA,IAAA,CAAA,QAAA;AAAA,iBAAA,EADCA,MAET,CAAA,CAAA;AAAA,eAEH,CAAA;AAAA,aAAA,EAPM,KAQT,CAAA,CAAA;AAAA,WAEH,CAAA;AAAA,SACH,CAAA;AAAA,OAAA;AAAA,KACF,CAAA,CAAA;AAAA,GAEJ;AAAA,EACA,IAAM,EAAA,CAAC,EAAE,IAAA,EAAM,OAAY,KAAA;AACzB,IAAM,MAAA,IAAA,GAAO,IAAS,KAAA,SAAA,GAAY,IAAO,GAAA,IAAA,CAAA;AAEzC,IAAA,uBACG,GAAA,CAAA,IAAA,EAAA;AAAA,MACE,QAAM,EAAA,KAAA,CAAA,GAAA,CAAI,CAAC,IAAA,EAAM,0BACf,IAAA,CAAA,IAAA,EAAA;AAAA,QACE,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,YAAY,KAChB,CAAA,oBAAA,IAAA,CAAA,QAAA,EAAA;AAAA,YACE,QAAA,EAAA;AAAA,8BAAC,GAAA,CAAA,OAAA,EAAA;AAAA,gBAAM,IAAK,EAAA,UAAA;AAAA,gBAAW,QAAQ,EAAA,IAAA;AAAA,gBAAC,SAAS,IAAK,CAAA,OAAA;AAAA,eAAS,CAAA;AAAA,cAAG,GAAA;AAAA,aAAA;AAAA,WAC5D,CAAA;AAAA,UAED,IAAK,CAAA,QAAA;AAAA,SAAA;AAAA,OAAA,EANC,KAOT,CACD,CAAA;AAAA,KACH,CAAA,CAAA;AAAA,GAEJ;AAAA,EACA,WAAW,MAAM;AACf,IAAA,2BAAQ,IAAG,EAAA,EAAA,CAAA,CAAA;AAAA,GACb;AACF,CAAA,CAAA;AAEO,MAAM,QAAW,GAAA,UAAA;AAAA,EACtB,CAAC,EAAE,OAAA,EAAS,YAAY,OAAY,EAAA,GAAA,KAAA,IAAS,YAAiB,KAAA;AAC5D,IAAM,MAAA,SAAA,GAAY,UAAU,IAAO,GAAA,KAAA,CAAA;AACnC,IAAM,MAAA,MAAA,GAAS,QAAQ,MAAM;AAC3B,MAAA,OAAO,IAAI,KAAA,EAAQ,CAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AAAA,KAChC,EAAG,CAAC,OAAO,CAAC,CAAA,CAAA;AAEZ,IAAA,uBACG,GAAA,CAAA,SAAA,EAAA;AAAA,MAAW,GAAG,KAAA;AAAA,MAAO,GAAK,EAAA,YAAA;AAAA,MACxB,QAAO,EAAA,MAAA,CAAA,GAAA,CAAI,CAAC,KAAA,EAAO,KAAU,KAAA;AAC5B,QAAA,uBACG,GAAA,CAAA,qBAAA,EAAA;AAAA,UACC,KAAA;AAAA,UAEA,UAAA;AAAA,SAAA,EADK,KAEP,CAAA,CAAA;AAAA,OAEH,CAAA;AAAA,KACH,CAAA,CAAA;AAAA,GAEJ;AACF,EAAA;AAEA,MAAM,qBAAwB,GAAA,IAAA;AAAA,EAC5B,CAAC;AAAA,IACC,KAAA;AAAA,IACA,UAAA;AAAA,GAII,KAAA;AACJ,IAAA,uBAAQ,GAAA,CAAA,aAAA,EAAA;AAAA,MAAc,KAAA;AAAA,MAAc,UAAA;AAAA,KAAwB,CAAA,CAAA;AAAA,GAC9D;AAAA,EACA,CAAC,eAAe,SAAc,KAAA;AAC5B,IAAA,MAAM,gBAAgB,aAAc,CAAA,KAAA,CAAA;AACpC,IAAA,MAAM,YAAY,SAAU,CAAA,KAAA,CAAA;AAE5B,IAAA,IAAI,aAAc,CAAA,GAAA,CAAI,MAAW,KAAA,SAAA,CAAU,IAAI,MAAQ,EAAA;AACrD,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAEA,IAAI,IAAA,aAAA,CAAc,IAAS,KAAA,SAAA,CAAU,IAAM,EAAA;AACzC,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,aAAA,CAAc,QAAQ,SAAU,CAAA,GAAA,CAAA;AAAA,GACzC;AACF,CAAA,CAAA;AAEO,SAAS,aAAc,CAAA;AAAA,EAC5B,KAAA;AAAA,EACA,UAAA;AACF,CAGG,EAAA;AAED,EAAI,IAAA,CAAC,aAAc,CAAA,KAAK,CAAG,EAAA;AACzB,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,QAAQ,MAAM,IAAM;AAAA,IAClB,KAAK,QAAU,EAAA;AACb,MAAA,OAAO,KAAM,CAAA,IAAA,CAAA;AAAA,KACf;AAAA,IAEA,KAAK,OAAS,EAAA;AACZ,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAAA,IAEA,KAAK,MAAQ,EAAA;AACX,MAAI,IAAA,KAAA,CAAM,WAAW,KAAW,CAAA,EAAA;AAC9B,QAAA,uBAAQ,GAAA,CAAA,cAAA,EAAA;AAAA,UAAe,QAAQ,KAAM,CAAA,MAAA;AAAA,UAAQ,UAAA;AAAA,SAAwB,CAAA,CAAA;AAAA,OAChE,MAAA;AACL,QAAO,OAAA,iBAAA,CAAkB,MAAM,IAAI,CAAA,CAAA;AAAA,OACrC;AAAA,KACF;AAAA,IAEA,KAAK,IAAM,EAAA;AACT,MAAA,2BAAQ,IAAG,EAAA,EAAA,CAAA,CAAA;AAAA,KACb;AAAA,IAEA,KAAK,WAAa,EAAA;AAChB,MAAM,MAAA,SAAA,GAAY,UAAY,EAAA,SAAA,IAAa,iBAAkB,CAAA,SAAA,CAAA;AAE7D,MAAA,uBACG,GAAA,CAAA,SAAA,EAAA;AAAA,QACC,QAAC,kBAAA,GAAA,CAAA,cAAA,EAAA;AAAA,UAAe,QAAQ,KAAM,CAAA,MAAA;AAAA,UAAQ,UAAA;AAAA,SAAwB,CAAA;AAAA,OAChE,CAAA,CAAA;AAAA,KAEJ;AAAA,IAEA,KAAK,SAAW,EAAA;AACd,MAAM,MAAA,OAAA,GAAU,UAAY,EAAA,OAAA,IAAW,iBAAkB,CAAA,OAAA,CAAA;AAEzD,MAAA,uBACG,GAAA,CAAA,OAAA,EAAA;AAAA,QAAQ,KAAA,EAAO,iBAAkB,CAAA,KAAA,CAAM,KAAK,CAAA;AAAA,QAC3C,QAAC,kBAAA,GAAA,CAAA,cAAA,EAAA;AAAA,UAAe,QAAQ,KAAM,CAAA,MAAA;AAAA,UAAQ,UAAA;AAAA,SAAwB,CAAA;AAAA,OAChE,CAAA,CAAA;AAAA,KAEJ;AAAA,IAEA,KAAK,QAAU,EAAA;AACb,MAAM,MAAA,MAAA,GAAS,UAAY,EAAA,MAAA,IAAU,iBAAkB,CAAA,MAAA,CAAA;AAEvD,MAAA,uBACG,GAAA,CAAA,MAAA,EAAA;AAAA,QAAO,IAAK,EAAA,QAAA;AAAA,QACX,QAAC,kBAAA,GAAA,CAAA,cAAA,EAAA;AAAA,UAAe,QAAQ,KAAM,CAAA,MAAA;AAAA,UAAQ,UAAA;AAAA,SAAwB,CAAA;AAAA,OAChE,CAAA,CAAA;AAAA,KAEJ;AAAA,IAEA,KAAK,IAAM,EAAA;AACT,MAAM,MAAA,MAAA,GAAS,UAAY,EAAA,MAAA,IAAU,iBAAkB,CAAA,MAAA,CAAA;AAEvD,MAAA,uBACG,GAAA,CAAA,MAAA,EAAA;AAAA,QAAO,IAAK,EAAA,IAAA;AAAA,QACX,QAAC,kBAAA,GAAA,CAAA,cAAA,EAAA;AAAA,UAAe,QAAQ,KAAM,CAAA,MAAA;AAAA,UAAQ,UAAA;AAAA,SAAwB,CAAA;AAAA,OAChE,CAAA,CAAA;AAAA,KAEJ;AAAA,IAEA,KAAK,UAAY,EAAA;AACf,MAAM,MAAA,MAAA,GAAS,UAAY,EAAA,MAAA,IAAU,iBAAkB,CAAA,MAAA,CAAA;AAEvD,MAAA,uBAAQ,GAAA,CAAA,MAAA,EAAA;AAAA,QAAO,IAAK,EAAA,MAAA;AAAA,QAAQ,QAAA,EAAA,iBAAA,CAAkB,MAAM,IAAI,CAAA;AAAA,OAAE,CAAA,CAAA;AAAA,KAC5D;AAAA,IAEA,KAAK,KAAO,EAAA;AACV,MAAM,MAAA,MAAA,GAAS,UAAY,EAAA,MAAA,IAAU,iBAAkB,CAAA,MAAA,CAAA;AAEvD,MAAA,uBACG,GAAA,CAAA,MAAA,EAAA;AAAA,QAAO,IAAK,EAAA,KAAA;AAAA,QACX,QAAC,kBAAA,GAAA,CAAA,cAAA,EAAA;AAAA,UAAe,QAAQ,KAAM,CAAA,MAAA;AAAA,UAAQ,UAAA;AAAA,SAAwB,CAAA;AAAA,OAChE,CAAA,CAAA;AAAA,KAEJ;AAAA,IAEA,KAAK,MAAQ,EAAA;AACX,MAAM,MAAA,IAAA,GAAO,WAAY,CAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AAEnC,MAAA,IAAI,SAAS,IAAM,EAAA;AACjB,QAAA,uBAAQ,GAAA,CAAA,cAAA,EAAA;AAAA,UAAe,QAAQ,KAAM,CAAA,MAAA;AAAA,UAAQ,UAAA;AAAA,SAAwB,CAAA,CAAA;AAAA,OACvE;AAEA,MAAM,MAAA,IAAA,GAAO,UAAY,EAAA,IAAA,IAAQ,iBAAkB,CAAA,IAAA,CAAA;AAEnD,MAAA,uBACG,GAAA,CAAA,IAAA,EAAA;AAAA,QAAK,IAAA;AAAA,QAAY,KAAA,EAAO,MAAM,KAAS,IAAA,KAAA,CAAA;AAAA,QACtC,QAAC,kBAAA,GAAA,CAAA,cAAA,EAAA;AAAA,UAAe,QAAQ,KAAM,CAAA,MAAA;AAAA,UAAQ,UAAA;AAAA,SAAwB,CAAA;AAAA,OAChE,CAAA,CAAA;AAAA,KAEJ;AAAA,IAEA,KAAK,MAAQ,EAAA;AACX,MAAA,IAAI,QAA+B,GAAA,KAAA,CAAA,CAAA;AACnC,MAAI,IAAA,KAAA,CAAM,SAAS,KAAW,CAAA,EAAA;AAC5B,QAAA,QAAA,GAAW,KAAM,CAAA,IAAA,CAAK,KAAM,CAAA,MAAM,IAAI,CAAM,CAAA,IAAA,KAAA,CAAA,CAAA;AAAA,OAC9C;AAEA,MAAM,MAAA,SAAA,GAAY,UAAY,EAAA,SAAA,IAAa,iBAAkB,CAAA,SAAA,CAAA;AAE7D,MAAA,uBAAQ,GAAA,CAAA,SAAA,EAAA;AAAA,QAAU,QAAA;AAAA,QAAoB,MAAM,KAAM,CAAA,IAAA;AAAA,OAAM,CAAA,CAAA;AAAA,KAC1D;AAAA,IAEA,KAAK,YAAc,EAAA;AACjB,MAAM,MAAA,UAAA,GAAa,UAAY,EAAA,UAAA,IAAc,iBAAkB,CAAA,UAAA,CAAA;AAE/D,MAAA,uBACG,GAAA,CAAA,UAAA,EAAA;AAAA,QACC,QAAC,kBAAA,GAAA,CAAA,cAAA,EAAA;AAAA,UACC,QAAQ,KAAM,CAAA,MAAA;AAAA,UACd,UAAA;AAAA,UACA,sBAAsB,EAAA,IAAA;AAAA,SACxB,CAAA;AAAA,OACF,CAAA,CAAA;AAAA,KAEJ;AAAA,IAEA,KAAK,MAAQ,EAAA;AACX,MAAM,MAAA,IAAA,GAAO,UAAY,EAAA,IAAA,IAAQ,iBAAkB,CAAA,IAAA,CAAA;AACnD,MAAA,MAAM,KAAsC,GAAA,KAAA,CAAM,KAAM,CAAA,GAAA,CAAI,CAAC,IAAS,KAAA;AACpE,QAAO,OAAA;AAAA,UACL,OAAS,EAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAK,OAAU,GAAA,KAAA,CAAA;AAAA,UACpC,0BACG,GAAA,CAAA,cAAA,EAAA;AAAA,YACC,QAAQ,IAAK,CAAA,MAAA;AAAA,YACb,UAAA;AAAA,YAEA,wBAAwB,IAAK,CAAA,KAAA;AAAA,WAC/B,CAAA;AAAA,SAEJ,CAAA;AAAA,OACD,CAAA,CAAA;AAED,MAAA,uBACG,GAAA,CAAA,IAAA,EAAA;AAAA,QAAK,IAAA,EAAM,KAAM,CAAA,OAAA,GAAU,SAAY,GAAA,WAAA;AAAA,QAAa,KAAA;AAAA,OAAc,CAAA,CAAA;AAAA,KAEvE;AAAA,IAEA,KAAK,OAAS,EAAA;AACZ,MAAM,MAAA,KAAA,GAAQ,UAAY,EAAA,KAAA,IAAS,iBAAkB,CAAA,KAAA,CAAA;AACrD,MAAM,MAAA,QAAA,GAA0C,MAAM,MAAO,CAAA,GAAA;AAAA,QAC3D,CAAC,IAAU,MAAA;AAAA,UACT,KAAA,EAAO,KAAK,KAAS,IAAA,KAAA,CAAA;AAAA,UACrB,0BACG,GAAA,CAAA,cAAA,EAAA;AAAA,YAAe,QAAQ,IAAK,CAAA,MAAA;AAAA,YAAQ,UAAA;AAAA,WAAwB,CAAA;AAAA,SAEjE,CAAA;AAAA,OACF,CAAA;AAEA,MAAM,MAAA,IAAA,GAAwC,MAAM,IAAK,CAAA,GAAA;AAAA,QAAI,CAAC,GAAA,KAC5D,GAAI,CAAA,GAAA,CAAI,CAAC,IAAU,MAAA;AAAA,UACjB,KAAA,EAAO,KAAK,KAAS,IAAA,KAAA,CAAA;AAAA,UACrB,0BACG,GAAA,CAAA,cAAA,EAAA;AAAA,YAAe,QAAQ,IAAK,CAAA,MAAA;AAAA,YAAQ,UAAA;AAAA,WAAwB,CAAA;AAAA,SAE/D,CAAA,CAAA;AAAA,OACJ,CAAA;AAEA,MAAA,uBAAQ,GAAA,CAAA,KAAA,EAAA;AAAA,QAAM,QAAA;AAAA,QAAoB,IAAA;AAAA,OAAY,CAAA,CAAA;AAAA,KAChD;AAAA,IAEA,KAAK,OAAS,EAAA;AACZ,MAAM,MAAA,IAAA,GAAO,WAAY,CAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AAEnC,MAAA,IAAI,SAAS,IAAM,EAAA;AACjB,QAAA,OAAO,KAAM,CAAA,IAAA,CAAA;AAAA,OACf;AAEA,MAAM,MAAA,KAAA,GAAQ,UAAY,EAAA,KAAA,IAAS,iBAAkB,CAAA,KAAA,CAAA;AAErD,MAAA,uBACG,GAAA,CAAA,KAAA,EAAA;AAAA,QAAM,GAAK,EAAA,IAAA;AAAA,QAAM,KAAK,KAAM,CAAA,IAAA;AAAA,QAAM,KAAA,EAAO,MAAM,KAAS,IAAA,KAAA,CAAA;AAAA,OAAW,CAAA,CAAA;AAAA,KAExE;AAAA,IAEA,KAAK,IAAM,EAAA;AACT,MAAM,MAAA,SAAA,GAAY,UAAY,EAAA,SAAA,IAAa,iBAAkB,CAAA,SAAA,CAAA;AAE7D,MAAA,2BAAQ,SAAU,EAAA,EAAA,CAAA,CAAA;AAAA,KACpB;AAAA,IAGA,KAAK,MAAA,CAAA;AAAA,IACL,SAAS;AACP,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAAA,GACF;AACF,CAAA;AAEA,SAAS,cAAe,CAAA;AAAA,EACtB,MAAA;AAAA,EACA,UAAA;AAAA,EACA,sBAAyB,GAAA,KAAA;AAC3B,CAIG,EAAA;AACD,EAAA,MAAM,mBAA4B,EAAC,CAAA;AAEnC,EAAA,IAAI,sBAAwB,EAAA;AAC1B,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,MAAA,CAAO,QAAQ,CAAK,EAAA,EAAA;AACtC,MAAA,MAAM,QAAQ,MAAO,CAAA,CAAA,CAAA,CAAA;AAErB,MAAA,QAAQ,MAAM,IAAM;AAAA,QAClB,KAAK,MAAQ,EAAA;AAEX,UAAM,MAAA,KAAA,GAAuB,CAAC,KAAoB,CAAA,CAAA;AAClD,UAAO,OAAA,CAAA,GAAI,IAAI,MAAO,CAAA,MAAA,IAAU,OAAO,CAAI,GAAA,CAAA,CAAA,CAAI,SAAS,MAAQ,EAAA;AAC9D,YAAA,CAAA,EAAA,CAAA;AACA,YAAM,KAAA,CAAA,IAAA,CAAK,OAAO,CAAiB,CAAA,CAAA,CAAA;AAAA,WACrC;AAEA,UAAA,gBAAA,CAAiB,IAAK,CAAA;AAAA,YACpB,IAAM,EAAA,WAAA;AAAA,YACN,MAAQ,EAAA,KAAA;AAAA,YACR,GAAA,EAAK,MAAM,GAAI,CAAA,CAAC,SAAS,IAAK,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,EAAE,CAAA;AAAA,YAC1C,IAAA,EAAM,MAAM,GAAI,CAAA,CAAC,SAAS,IAAK,CAAA,IAAI,CAAE,CAAA,IAAA,CAAK,EAAE,CAAA;AAAA,WAClB,CAAA,CAAA;AAE5B,UAAA,MAAA;AAAA,SACF;AAAA,QAEA,SAAS;AACP,UAAA,gBAAA,CAAiB,KAAK,KAAK,CAAA,CAAA;AAAA,SAC7B;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAEA,EAAA,OAAO,MAAO,CAAA,GAAA,CAAI,CAAC,KAAA,EAAO,0BACvB,GAAA,CAAA,aAAA,EAAA;AAAA,IAA0B,KAAA;AAAA,IAAc,UAAA;AAAA,GAAA,EAArB,KAA6C,CAClE,CAAA,CAAA;AACH,CAAA;AAEA,MAAM,gBAAmB,GAAA;AAAA,EACvB,YAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AACF,CAAA,CAAA;AAEA,SAAS,cAAc,KAAsC,EAAA;AAC3D,EACE,OAAA,OAAO,KAAU,KAAA,QAAA,IACjB,KAAU,KAAA,IAAA,IACV,UAAU,KACV,IAAA,gBAAA,CAAiB,QAAS,CAAA,KAAA,CAAM,IAA2B,CAAA,CAAA;AAE/D,CAAA;AAEA,SAAS,kBAAkB,KAAe,EAAA;AACxC,EAAM,MAAA,QAAA,GAAW,IAAI,SAAA,EAAY,CAAA,eAAA;AAAA,IAC/B,CAAwB,qBAAA,EAAA,KAAA,CAAA,CAAA;AAAA,IACxB,WAAA;AAAA,GACF,CAAA;AAEA,EAAA,OAAO,SAAS,IAAK,CAAA,WAAA,CAAA;AACvB,CAAA;AAEA,SAAS,kBAAkB,KAAe,EAAA;AACxC,EAAA,OAAO,KAAK,GAAI,CAAA,CAAA,EAAG,KAAK,GAAI,CAAA,CAAA,EAAG,KAAK,CAAC,CAAA,CAAA;AACvC;;;;"}
1
+ {"version":3,"file":"Markdown.js","sources":["../../src/primitives/Markdown.tsx"],"sourcesContent":["import { assertNever, type Relax, sanitizeUrl } from \"@liveblocks/core\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { Lexer, type MarkedToken, type Token, 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 /**\n * The component used to render paragraphs.\n *\n * @example\n * ```md\n * A paragraph.\n *\n * Another paragraph.\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Paragraph: ({ children }) => <p className=\"...\">{children}</p>\n * }}\n * />\n * ```\n */\n Paragraph: ComponentType<MarkdownComponentsParagraphProps>;\n\n /**\n * The component used to render inline elements (bold, italic, strikethrough, and inline code).\n *\n * @example\n * ```md\n * **Bold**, _italic_, ~~strikethrough~~, and `inline code`.\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Inline: ({ type, children }) => {\n * const Component = type;\n * return <Component className=\"...\">{children}</Component>;\n * }\n * }}\n * />\n * ```\n */\n Inline: ComponentType<MarkdownComponentsInlineProps>;\n\n /**\n * The component used to render links.\n *\n * @example\n * ```md\n * A [link](https://liveblocks.io).\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Link: ({ href, children }) => <a href={href} className=\"...\">{children}</a>\n * }}\n * />\n * ```\n */\n Link: ComponentType<MarkdownComponentsLinkProps>;\n\n /**\n * The component used to render headings.\n *\n * @example\n * ```md\n * # Heading 1\n * ## Heading 2\n * ### Heading 3\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Heading: ({ level, children }) => {\n * const Heading = `h${level}` as const;\n * return <Heading className=\"...\">{children}</Heading>;\n * }\n * }}\n * />\n * ```\n */\n Heading: ComponentType<MarkdownComponentsHeadingProps>;\n\n /**\n * The component used to render blockquotes.\n *\n * @example\n * ```md\n * > A blockquote.\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Blockquote: ({ children }) => <blockquote className=\"...\">{children}</blockquote>\n * }}\n * />\n * ```\n */\n Blockquote: ComponentType<MarkdownComponentsBlockquoteProps>;\n\n /**\n * The component used to render code blocks.\n *\n * @example\n * ```md\n * `⁠`⁠`javascript\n * const a = 1;\n * `⁠`⁠`\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * CodeBlock: ({ language, code }) => (\n * <pre data-language={language} className=\"...\">\n * <code className=\"...\">{code}</code>\n * </pre>\n * )\n * }}\n * />\n * ```\n */\n CodeBlock: ComponentType<MarkdownComponentsCodeBlockProps>;\n\n /**\n * The component used to render images.\n *\n * @example\n * ```md\n * ![An image](https://liveblocks.io/logo.svg)\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Image: ({ src, alt }) => <img src={src} alt={alt} className=\"...\">\n * }}\n * />\n * ```\n */\n Image: ComponentType<MarkdownComponentsImageProps>;\n\n /**\n * The component used to render lists.\n *\n * @example\n * ```md\n * 1. An ordered list item\n * - An unordered list item\n * - [x] A checked list item\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * List: ({ type, items, start }) => {\n * const List = type === \"ordered\" ? \"ol\" : \"ul\";\n * return (\n * <List start={start}>\n * {items.map((item, index) => (\n * <li key={index}>\n * {item.checked !== undefined && (\n * <input type=\"checkbox\" disabled checked={item.checked} />{\" \"}\n * )}\n * {item.children}\n * </li>\n * ))}\n * </List>\n * );\n * }\n * }}\n * />\n * ```\n */\n List: ComponentType<MarkdownComponentsListProps>;\n\n /**\n * The component used to render tables.\n *\n * @example\n * ```md\n * | Heading 1 | Heading 2 |\n * |-----------|-----------|\n * | Cell 1 | Cell 2 |\n * | Cell 3 | Cell 4 |\n * ```\n * ```tsx\n * <Markdown\n * components={{\n * Table: ({ headings, rows }) => (\n * <table>\n * <thead>\n * <tr>\n * {headings.map(({ children }, index) => (\n * <th key={index}>{children}</th>\n * ))}\n * </tr>\n * </thead>\n * <tbody>\n * {rows.map((row, index) => (\n * <tr key={index}>\n * {row.map(({ children }, index) => (\n * <td key={index}>{children}</td>\n * ))}\n * </tr>\n * ))}\n * </tbody>\n * </table>\n * )\n * }}\n * />\n * ```\n */\n Table: ComponentType<MarkdownComponentsTableProps>;\n\n /**\n * The component used to render separators.\n *\n * @example\n * ```md\n * ---\n * ```\n * ```tsx\n * <Markdown components={{ Separator: () => <hr className=\"...\" /> }} />\n * ```\n */\n Separator: ComponentType;\n};\n\nexport interface MarkdownComponentsInlineProps {\n type: \"strong\" | \"em\" | \"code\" | \"del\";\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsParagraphProps {\n children: ReactNode;\n}\n\ninterface MarkdownComponentsTableCell {\n align?: \"left\" | \"center\" | \"right\";\n children: ReactNode;\n}\n\nexport interface MarkdownComponentsTableProps {\n headings: MarkdownComponentsTableCell[];\n rows: MarkdownComponentsTableCell[][];\n}\n\ninterface MarkdownComponentsListItem {\n checked?: boolean;\n children: ReactNode;\n}\n\nexport type MarkdownComponentsListProps = Relax<\n MarkdownComponentsOrderedListProps | MarkdownComponentsUnorderedListProps\n>;\n\ninterface MarkdownComponentsOrderedListProps {\n type: \"ordered\";\n items: MarkdownComponentsListItem[];\n start: number;\n}\n\ninterface MarkdownComponentsUnorderedListProps {\n type: \"unordered\";\n items: MarkdownComponentsListItem[];\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 extends ComponentPropsWithSlot<\"div\"> {\n content: string;\n components?: Partial<MarkdownComponents>;\n}\n\nconst defaultComponents: MarkdownComponents = {\n Paragraph: ({ children }) => {\n return <p>{children}</p>;\n },\n Inline: ({ type, children }) => {\n switch (type) {\n case \"strong\":\n return <strong>{children}</strong>;\n case \"em\":\n return <em>{children}</em>;\n case \"code\":\n return <code>{children}</code>;\n case \"del\":\n return <del>{children}</del>;\n default:\n assertNever(type, \"Unknown inline type\");\n }\n },\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 Table: ({ headings, rows }) => {\n return (\n <table>\n <thead>\n <tr>\n {headings.map((heading, index) => {\n return (\n <th key={index} align={heading.align}>\n {heading.children}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, index) => {\n return (\n <tr key={index}>\n {row.map((cell, index) => {\n return (\n <td key={index} align={cell.align}>\n {cell.children}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n },\n List: ({ type, items, start }) => {\n const List = type === \"ordered\" ? \"ol\" : \"ul\";\n\n return (\n <List start={start === 1 ? undefined : start}>\n {items.map((item, index) => (\n <li key={index}>\n {item.checked !== undefined && (\n <>\n <input type=\"checkbox\" disabled checked={item.checked} />{\" \"}\n </>\n )}\n {item.children}\n </li>\n ))}\n </List>\n );\n },\n Separator: () => {\n return <hr />;\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 <MemoizedMarkdownToken\n token={token}\n key={index}\n components={components}\n />\n );\n })}\n </Component>\n );\n }\n);\n\nconst MemoizedMarkdownToken = memo(\n ({\n token,\n components,\n }: {\n token: Token;\n components?: Partial<MarkdownComponents>;\n }) => {\n return <MarkdownToken token={token} components={components} />;\n },\n (previousProps, nextProps) => {\n const previousToken = previousProps.token;\n const nextToken = nextProps.token;\n\n if (previousToken.raw.length !== nextToken.raw.length) {\n return false;\n }\n\n if (previousToken.type !== nextToken.type) {\n return false;\n }\n\n return previousToken.raw === nextToken.raw;\n }\n);\n\nexport function MarkdownToken({\n token,\n components,\n}: {\n token: Token;\n components: Partial<MarkdownComponents> | undefined;\n}) {\n // Marked.js supports generic tokens, but we don't use them.\n if (!isMarkedToken(token)) {\n return null;\n }\n\n switch (token.type) {\n case \"escape\": {\n return token.text;\n }\n\n case \"space\": {\n return null;\n }\n\n case \"text\": {\n if (token.tokens !== undefined) {\n return <MarkdownTokens tokens={token.tokens} components={components} />;\n } else {\n return parseHtmlEntities(token.text);\n }\n }\n\n case \"br\": {\n return <br />;\n }\n\n case \"paragraph\": {\n const Paragraph = components?.Paragraph ?? defaultComponents.Paragraph;\n\n return (\n <Paragraph>\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Paragraph>\n );\n }\n\n case \"heading\": {\n const Heading = components?.Heading ?? defaultComponents.Heading;\n\n return (\n <Heading level={clampHeadingLevel(token.depth)}>\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Heading>\n );\n }\n\n case \"strong\": {\n const Inline = components?.Inline ?? defaultComponents.Inline;\n\n return (\n <Inline type=\"strong\">\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Inline>\n );\n }\n\n case \"em\": {\n const Inline = components?.Inline ?? defaultComponents.Inline;\n\n return (\n <Inline type=\"em\">\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Inline>\n );\n }\n\n case \"codespan\": {\n const Inline = components?.Inline ?? defaultComponents.Inline;\n\n return <Inline type=\"code\">{parseHtmlEntities(token.text)}</Inline>;\n }\n\n case \"del\": {\n const Inline = components?.Inline ?? defaultComponents.Inline;\n\n return (\n <Inline type=\"del\">\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Inline>\n );\n }\n\n case \"link\": {\n const href = sanitizeUrl(token.href);\n\n if (href === null) {\n return <MarkdownTokens tokens={token.tokens} components={components} />;\n }\n\n const Link = components?.Link ?? defaultComponents.Link;\n\n return (\n <Link href={href} title={token.title ?? undefined}>\n <MarkdownTokens tokens={token.tokens} components={components} />\n </Link>\n );\n }\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\n case \"blockquote\": {\n const Blockquote = components?.Blockquote ?? defaultComponents.Blockquote;\n\n return (\n <Blockquote>\n <MarkdownTokens\n tokens={token.tokens}\n components={components}\n normalizeToBlockTokens\n />\n </Blockquote>\n );\n }\n\n case \"list\": {\n const List = components?.List ?? defaultComponents.List;\n const items: MarkdownComponentsListItem[] = token.items.map((item) => {\n return {\n checked: item.task ? item.checked : undefined,\n children: (\n <MarkdownTokens\n tokens={item.tokens}\n components={components}\n // A \"loose\" list item in Markdown is one where the content is wrapped in a paragraph (or potentially other block) token\n normalizeToBlockTokens={item.loose}\n />\n ),\n };\n });\n\n const props: MarkdownComponentsListProps = token.ordered\n ? { type: \"ordered\", items, start: token.start || 1 }\n : { type: \"unordered\", items };\n\n return <List {...props} />;\n }\n\n case \"table\": {\n const Table = components?.Table ?? defaultComponents.Table;\n const headings: MarkdownComponentsTableCell[] = token.header.map(\n (cell) => ({\n align: cell.align ?? undefined,\n children: (\n <MarkdownTokens tokens={cell.tokens} components={components} />\n ),\n })\n );\n\n const rows: MarkdownComponentsTableCell[][] = token.rows.map((row) =>\n row.map((cell) => ({\n align: cell.align ?? undefined,\n children: (\n <MarkdownTokens tokens={cell.tokens} components={components} />\n ),\n }))\n );\n\n return <Table headings={headings} rows={rows} />;\n }\n\n case \"image\": {\n const href = sanitizeUrl(token.href);\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\n case \"hr\": {\n const Separator = components?.Separator ?? defaultComponents.Separator;\n\n return <Separator />;\n }\n\n // HTML elements/tokens are not supported (yet).\n case \"html\":\n default: {\n return null;\n }\n }\n}\n\nfunction MarkdownTokens({\n tokens,\n components,\n normalizeToBlockTokens = false,\n}: {\n tokens: Token[];\n components: Partial<MarkdownComponents> | undefined;\n normalizeToBlockTokens?: boolean;\n}) {\n const normalizedTokens: Token[] = [];\n\n if (normalizeToBlockTokens) {\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!;\n\n switch (token.type) {\n case \"text\": {\n // Wrap consecutive text tokens into a paragraph\n const texts: Tokens.Text[] = [token as Tokens.Text];\n while (i + 1 < tokens.length && tokens[i + 1]!.type === \"text\") {\n i++;\n texts.push(tokens[i] as Tokens.Text);\n }\n\n normalizedTokens.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\n break;\n }\n\n default: {\n normalizedTokens.push(token);\n }\n }\n }\n }\n\n return tokens.map((token, index) => (\n <MarkdownToken key={index} token={token} components={components} />\n ));\n}\n\nconst markedTokenTypes = [\n \"blockquote\",\n \"br\",\n \"code\",\n \"codespan\",\n \"def\",\n \"del\",\n \"em\",\n \"escape\",\n \"heading\",\n \"hr\",\n \"html\",\n \"image\",\n \"link\",\n \"list\",\n \"list_item\",\n \"paragraph\",\n \"space\",\n \"strong\",\n \"table\",\n \"text\",\n] as const satisfies MarkedToken[\"type\"][];\n\nfunction isMarkedToken(token: unknown): token is MarkedToken {\n return (\n typeof token === \"object\" &&\n token !== null &&\n \"type\" in token &&\n markedTokenTypes.includes(token.type as MarkedToken[\"type\"])\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":["index"],"mappings":"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"}
package/dist/version.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const PKG_NAME = "@liveblocks/react-ui";
4
- const PKG_VERSION = typeof "3.2.0" === "string" && "3.2.0";
4
+ const PKG_VERSION = typeof "3.2.1" === "string" && "3.2.1";
5
5
  const PKG_FORMAT = typeof "cjs" === "string" && "cjs";
6
6
 
7
7
  exports.PKG_FORMAT = PKG_FORMAT;
package/dist/version.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const PKG_NAME = "@liveblocks/react-ui";
2
- const PKG_VERSION = typeof "3.2.0" === "string" && "3.2.0";
2
+ const PKG_VERSION = typeof "3.2.1" === "string" && "3.2.1";
3
3
  const PKG_FORMAT = typeof "esm" === "string" && "esm";
4
4
 
5
5
  export { PKG_FORMAT, PKG_NAME, PKG_VERSION };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liveblocks/react-ui",
3
- "version": "3.2.0",
3
+ "version": "3.2.1",
4
4
  "description": "A set of React pre-built components for the Liveblocks products. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -76,9 +76,9 @@
76
76
  },
77
77
  "dependencies": {
78
78
  "@floating-ui/react-dom": "^2.1.2",
79
- "@liveblocks/client": "3.2.0",
80
- "@liveblocks/core": "3.2.0",
81
- "@liveblocks/react": "3.2.0",
79
+ "@liveblocks/client": "3.2.1",
80
+ "@liveblocks/core": "3.2.1",
81
+ "@liveblocks/react": "3.2.1",
82
82
  "@radix-ui/react-dropdown-menu": "^2.1.2",
83
83
  "@radix-ui/react-popover": "^1.1.2",
84
84
  "@radix-ui/react-slot": "^1.1.0",
@@ -604,7 +604,7 @@
604
604
  flex-direction: column;
605
605
  gap: 0.25em;
606
606
  margin-block: 0.75em;
607
- padding-inline-start: 1.5em;
607
+ padding-inline-start: 1.125em;
608
608
  list-style-position: outside;
609
609
 
610
610
  :where(ol, ul) {