@liveblocks/react-ui 3.2.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/_private/index.cjs +4 -2
  2. package/dist/_private/index.cjs.map +1 -1
  3. package/dist/_private/index.d.cts +111 -38
  4. package/dist/_private/index.d.ts +111 -38
  5. package/dist/_private/index.js +3 -2
  6. package/dist/_private/index.js.map +1 -1
  7. package/dist/components/AiChat.cjs +11 -9
  8. package/dist/components/AiChat.cjs.map +1 -1
  9. package/dist/components/AiChat.js +12 -10
  10. package/dist/components/AiChat.js.map +1 -1
  11. package/dist/components/Thread.cjs +58 -0
  12. package/dist/components/Thread.cjs.map +1 -1
  13. package/dist/components/Thread.js +59 -1
  14. package/dist/components/Thread.js.map +1 -1
  15. package/dist/components/internal/AiComposer.cjs +132 -0
  16. package/dist/components/internal/AiComposer.cjs.map +1 -0
  17. package/dist/components/internal/AiComposer.js +130 -0
  18. package/dist/components/internal/AiComposer.js.map +1 -0
  19. package/dist/components/internal/Button.cjs.map +1 -1
  20. package/dist/components/internal/Button.js.map +1 -1
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.cts +123 -15
  23. package/dist/index.d.ts +123 -15
  24. package/dist/index.js.map +1 -1
  25. package/dist/overrides.cjs +4 -3
  26. package/dist/overrides.cjs.map +1 -1
  27. package/dist/overrides.js +4 -3
  28. package/dist/overrides.js.map +1 -1
  29. package/dist/primitives/AiComposer/contexts.cjs +24 -0
  30. package/dist/primitives/AiComposer/contexts.cjs.map +1 -0
  31. package/dist/primitives/AiComposer/contexts.js +19 -0
  32. package/dist/primitives/AiComposer/contexts.js.map +1 -0
  33. package/dist/primitives/AiComposer/index.cjs +348 -0
  34. package/dist/primitives/AiComposer/index.cjs.map +1 -0
  35. package/dist/primitives/AiComposer/index.js +340 -0
  36. package/dist/primitives/AiComposer/index.js.map +1 -0
  37. package/dist/primitives/Markdown.cjs +4 -3
  38. package/dist/primitives/Markdown.cjs.map +1 -1
  39. package/dist/primitives/Markdown.js +4 -3
  40. package/dist/primitives/Markdown.js.map +1 -1
  41. package/dist/primitives/index.d.cts +8 -1
  42. package/dist/primitives/index.d.ts +8 -1
  43. package/dist/version.cjs +1 -1
  44. package/dist/version.js +1 -1
  45. package/package.json +4 -4
  46. package/src/styles/index.css +37 -11
  47. package/styles.css +1 -1
  48. package/styles.css.map +1 -1
  49. package/dist/components/internal/AiChatComposer.cjs +0 -161
  50. package/dist/components/internal/AiChatComposer.cjs.map +0 -1
  51. package/dist/components/internal/AiChatComposer.js +0 -159
  52. package/dist/components/internal/AiChatComposer.js.map +0 -1
  53. package/dist/primitives/AiChatComposer/index.cjs +0 -202
  54. package/dist/primitives/AiChatComposer/index.cjs.map +0 -1
  55. package/dist/primitives/AiChatComposer/index.js +0 -195
  56. package/dist/primitives/AiChatComposer/index.js.map +0 -1
@@ -0,0 +1,340 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { Signal, kInternal } from '@liveblocks/core';
3
+ import { useClient } from '@liveblocks/react';
4
+ import { useSignal, useLayoutEffect } from '@liveblocks/react/_private';
5
+ import { Slot } from '@radix-ui/react-slot';
6
+ import { forwardRef, useRef, useState, useCallback, useImperativeHandle, useMemo } from 'react';
7
+ import { createEditor, Transforms, Editor } from 'slate';
8
+ import { withHistory } from 'slate-history';
9
+ import { withReact, ReactEditor, Slate, Editable } from 'slate-react';
10
+ import { requestSubmit } from '../../utils/request-submit.js';
11
+ import { useInitial } from '../../utils/use-initial.js';
12
+ import { withNormalize } from '../slate/plugins/normalize.js';
13
+ import { isEmpty } from '../slate/utils/is-empty.js';
14
+ import { AiComposerEditorContext, AiComposerContext, useAiComposerEditorContext, useAiComposer } from './contexts.js';
15
+
16
+ const AI_COMPOSER_SUBMIT_NAME = "AiComposerSubmit";
17
+ const AI_COMPOSER_ABORT_NAME = "AiComposerAbort";
18
+ const AI_COMPOSER_EDITOR_NAME = "AiComposerEditor";
19
+ const AI_COMPOSER_FORM_NAME = "AiComposerForm";
20
+ const emptyMessages\u03A3 = new Signal([]);
21
+ function getLastMessageId(messages) {
22
+ const lastMessage = messages[messages.length - 1];
23
+ if (lastMessage === void 0) {
24
+ return null;
25
+ }
26
+ return lastMessage.id;
27
+ }
28
+ function getAbortableMessageId(messages) {
29
+ return messages.find(
30
+ (message) => message.role === "assistant" && (message.status === "generating" || message.status === "awaiting-tool")
31
+ )?.id;
32
+ }
33
+ const AiComposerForm = forwardRef(
34
+ ({
35
+ onComposerSubmit,
36
+ onSubmit,
37
+ disabled,
38
+ chatId,
39
+ branchId,
40
+ asChild,
41
+ ...props
42
+ }, forwardedRef) => {
43
+ const Component = asChild ? Slot : "form";
44
+ const client = useClient();
45
+ const formRef = useRef(null);
46
+ const editor = useInitial(
47
+ () => withNormalize(withHistory(withReact(createEditor())))
48
+ );
49
+ const [isEditorEmpty, setEditorEmpty] = useState(true);
50
+ const [isSubmitting, setSubmitting] = useState(false);
51
+ const [isFocused, setFocused] = useState(false);
52
+ const messages\u03A3 = chatId ? client[kInternal].ai.signals.getChatMessagesForBranch\u03A3(chatId, branchId) : emptyMessages\u03A3;
53
+ const lastMessageId = useSignal(messages\u03A3, getLastMessageId);
54
+ const abortableMessageId = useSignal(messages\u03A3, getAbortableMessageId);
55
+ const isDisabled = isSubmitting || disabled === true;
56
+ const canAbort = abortableMessageId !== void 0;
57
+ const canSubmit = !isEditorEmpty && !canAbort;
58
+ const clear = useCallback(() => {
59
+ Transforms.delete(editor, {
60
+ at: {
61
+ anchor: Editor.start(editor, []),
62
+ focus: Editor.end(editor, [])
63
+ }
64
+ });
65
+ }, [editor]);
66
+ const select = useCallback(() => {
67
+ Transforms.select(editor, Editor.end(editor, []));
68
+ }, [editor]);
69
+ const focus = useCallback(
70
+ (resetSelection = true) => {
71
+ try {
72
+ if (!ReactEditor.isFocused(editor)) {
73
+ Transforms.select(
74
+ editor,
75
+ resetSelection || !editor.selection ? Editor.end(editor, []) : editor.selection
76
+ );
77
+ ReactEditor.focus(editor);
78
+ }
79
+ } catch {
80
+ }
81
+ },
82
+ [editor]
83
+ );
84
+ const blur = useCallback(() => {
85
+ try {
86
+ ReactEditor.blur(editor);
87
+ } catch {
88
+ }
89
+ }, [editor]);
90
+ const onSubmitEnd = useCallback(() => {
91
+ clear();
92
+ setSubmitting(false);
93
+ }, [clear]);
94
+ const handleSubmit = useCallback(
95
+ (event) => {
96
+ if (disabled) {
97
+ return;
98
+ }
99
+ const isEditorEmpty2 = isEmpty(editor, editor.children);
100
+ if (isEditorEmpty2) {
101
+ event.preventDefault();
102
+ return;
103
+ }
104
+ onSubmit?.(event);
105
+ if (onComposerSubmit === void 0 || event.isDefaultPrevented()) {
106
+ event.preventDefault();
107
+ return;
108
+ }
109
+ const content = editor.children.map((block) => {
110
+ if ("type" in block && block.type === "paragraph") {
111
+ return block.children.map((child) => {
112
+ if ("text" in child) {
113
+ return child.text;
114
+ }
115
+ return "";
116
+ }).join("");
117
+ }
118
+ return "";
119
+ }).join("\n");
120
+ const promise = onComposerSubmit(
121
+ { text: content, lastMessageId },
122
+ event
123
+ );
124
+ event.preventDefault();
125
+ if (promise) {
126
+ setSubmitting(true);
127
+ promise.then(onSubmitEnd);
128
+ } else {
129
+ onSubmitEnd();
130
+ }
131
+ },
132
+ [disabled, editor, onSubmit, onComposerSubmit, onSubmitEnd, lastMessageId]
133
+ );
134
+ useLayoutEffect(() => {
135
+ setEditorEmpty(isEmpty(editor, editor.children));
136
+ }, [editor]);
137
+ const handleEditorValueChange = useCallback(() => {
138
+ setEditorEmpty(isEmpty(editor, editor.children));
139
+ }, [editor]);
140
+ const submit = useCallback(() => {
141
+ if (!canSubmit) {
142
+ return;
143
+ }
144
+ requestAnimationFrame(() => {
145
+ if (formRef.current) {
146
+ requestSubmit(formRef.current);
147
+ }
148
+ });
149
+ }, [canSubmit]);
150
+ const abort = useCallback(() => {
151
+ if (!canAbort || !abortableMessageId) {
152
+ return;
153
+ }
154
+ client[kInternal].ai.abort(abortableMessageId);
155
+ }, [canAbort, abortableMessageId, client]);
156
+ useImperativeHandle(
157
+ forwardedRef,
158
+ () => formRef.current,
159
+ []
160
+ );
161
+ return /* @__PURE__ */ jsx(AiComposerEditorContext.Provider, {
162
+ value: {
163
+ editor,
164
+ onEditorValueChange: handleEditorValueChange,
165
+ abortableMessageId,
166
+ setFocused
167
+ },
168
+ children: /* @__PURE__ */ jsx(AiComposerContext.Provider, {
169
+ value: {
170
+ isDisabled,
171
+ isEmpty: isEditorEmpty,
172
+ isFocused,
173
+ canSubmit,
174
+ canAbort,
175
+ submit,
176
+ abort,
177
+ clear,
178
+ focus,
179
+ blur,
180
+ select
181
+ },
182
+ children: /* @__PURE__ */ jsx(Component, {
183
+ onSubmit: handleSubmit,
184
+ ...props,
185
+ ref: formRef
186
+ })
187
+ })
188
+ });
189
+ }
190
+ );
191
+ function AiComposerEditorPlaceholder({
192
+ attributes,
193
+ children
194
+ }) {
195
+ const { opacity: _opacity, ...style } = attributes.style;
196
+ return /* @__PURE__ */ jsx("span", {
197
+ ...attributes,
198
+ style,
199
+ "data-placeholder": "",
200
+ children
201
+ });
202
+ }
203
+ const AiComposerEditor = forwardRef(
204
+ ({
205
+ defaultValue = "",
206
+ onKeyDown,
207
+ onFocus,
208
+ onBlur,
209
+ disabled,
210
+ autoFocus,
211
+ dir,
212
+ ...props
213
+ }, forwardedRef) => {
214
+ const { editor, onEditorValueChange, setFocused } = useAiComposerEditorContext();
215
+ const {
216
+ submit,
217
+ isDisabled: isComposerDisabled,
218
+ isFocused,
219
+ focus,
220
+ blur,
221
+ select
222
+ } = useAiComposer();
223
+ const isDisabled = disabled || isComposerDisabled;
224
+ const handleKeyDown = useCallback(
225
+ (event) => {
226
+ onKeyDown?.(event);
227
+ if (event.isDefaultPrevented())
228
+ return;
229
+ if (event.key === "Enter" && !event.shiftKey) {
230
+ event.preventDefault();
231
+ submit();
232
+ } else if (event.key === "Enter" && event.shiftKey) {
233
+ event.preventDefault();
234
+ editor.insertBreak();
235
+ } else if (event.key === "Escape") {
236
+ blur();
237
+ }
238
+ },
239
+ [editor, onKeyDown, submit, blur]
240
+ );
241
+ const handleFocus = useCallback(
242
+ (event) => {
243
+ onFocus?.(event);
244
+ if (!event.isDefaultPrevented()) {
245
+ setFocused(true);
246
+ }
247
+ },
248
+ [onFocus, setFocused]
249
+ );
250
+ const handleBlur = useCallback(
251
+ (event) => {
252
+ onBlur?.(event);
253
+ if (!event.isDefaultPrevented()) {
254
+ setFocused(false);
255
+ }
256
+ },
257
+ [onBlur, setFocused]
258
+ );
259
+ useImperativeHandle(
260
+ forwardedRef,
261
+ () => ReactEditor.toDOMNode(editor, editor),
262
+ [editor]
263
+ );
264
+ useLayoutEffect(() => {
265
+ if (autoFocus) {
266
+ focus();
267
+ }
268
+ }, [autoFocus, editor, focus]);
269
+ useLayoutEffect(() => {
270
+ if (isFocused && editor.selection === null) {
271
+ select();
272
+ }
273
+ }, [editor, select, isFocused]);
274
+ const initialValue = useMemo(() => {
275
+ return defaultValue.split("\n").map((text) => ({ type: "paragraph", children: [{ text }] }));
276
+ }, [defaultValue]);
277
+ return /* @__PURE__ */ jsx(Slate, {
278
+ editor,
279
+ initialValue,
280
+ onValueChange: onEditorValueChange,
281
+ children: /* @__PURE__ */ jsx(Editable, {
282
+ dir,
283
+ enterKeyHint: "send",
284
+ autoCapitalize: "sentences",
285
+ "aria-label": "Composer editor",
286
+ onKeyDown: handleKeyDown,
287
+ onFocus: handleFocus,
288
+ onBlur: handleBlur,
289
+ "data-focused": isFocused || void 0,
290
+ "data-disabled": isDisabled || void 0,
291
+ ...props,
292
+ readOnly: isDisabled,
293
+ disabled: isDisabled,
294
+ renderPlaceholder: AiComposerEditorPlaceholder
295
+ })
296
+ });
297
+ }
298
+ );
299
+ const AiComposerSubmit = forwardRef(({ disabled, asChild, ...props }, forwardedRef) => {
300
+ const Component = asChild ? Slot : "button";
301
+ const { isDisabled: isComposerDisabled, canSubmit } = useAiComposer();
302
+ const isDisabled = isComposerDisabled || disabled || !canSubmit;
303
+ return /* @__PURE__ */ jsx(Component, {
304
+ type: "submit",
305
+ ...props,
306
+ ref: forwardedRef,
307
+ disabled: isDisabled
308
+ });
309
+ });
310
+ const AiComposerAbort = forwardRef(({ disabled, onClick, asChild, ...props }, forwardedRef) => {
311
+ const Component = asChild ? Slot : "button";
312
+ const { isDisabled: isComposerDisabled, canAbort, abort } = useAiComposer();
313
+ const isDisabled = isComposerDisabled || disabled || !canAbort;
314
+ const handleClick = useCallback(
315
+ (event) => {
316
+ onClick?.(event);
317
+ if (event.isDefaultPrevented()) {
318
+ return;
319
+ }
320
+ abort();
321
+ },
322
+ [abort, onClick]
323
+ );
324
+ return /* @__PURE__ */ jsx(Component, {
325
+ type: "button",
326
+ ...props,
327
+ ref: forwardedRef,
328
+ disabled: isDisabled,
329
+ onClick: handleClick
330
+ });
331
+ });
332
+ if (process.env.NODE_ENV !== "production") {
333
+ AiComposerEditor.displayName = AI_COMPOSER_EDITOR_NAME;
334
+ AiComposerForm.displayName = AI_COMPOSER_FORM_NAME;
335
+ AiComposerSubmit.displayName = AI_COMPOSER_SUBMIT_NAME;
336
+ AiComposerAbort.displayName = AI_COMPOSER_ABORT_NAME;
337
+ }
338
+
339
+ export { AiComposerAbort as Abort, AiComposerAbort, AiComposerForm, AiComposerSubmit, AiComposerEditor as Editor, AiComposerForm as Form, AiComposerSubmit as Submit };
340
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/primitives/AiComposer/index.tsx"],"sourcesContent":["import {\n type AiChatMessage,\n kInternal,\n Signal,\n type WithNavigation,\n} from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useLayoutEffect, useSignal } from \"@liveblocks/react/_private\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { FocusEvent, FormEvent, KeyboardEvent, MouseEvent } from \"react\";\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n createEditor,\n Editor as SlateEditor,\n Transforms as SlateTransforms,\n} from \"slate\";\nimport { withHistory } from \"slate-history\";\nimport {\n Editable,\n ReactEditor,\n type RenderPlaceholderProps,\n Slate,\n withReact,\n} from \"slate-react\";\n\nimport type { AiComposerBody } from \"../../types\";\nimport { requestSubmit } from \"../../utils/request-submit\";\nimport { useInitial } from \"../../utils/use-initial\";\nimport { withNormalize } from \"../slate/plugins/normalize\";\nimport { isEmpty } from \"../slate/utils/is-empty\";\nimport {\n AiComposerContext,\n AiComposerEditorContext,\n useAiComposer,\n useAiComposerEditorContext,\n} from \"./contexts\";\nimport type {\n AiComposerEditorProps,\n AiComposerFormProps,\n AiComposerSubmitProps,\n} from \"./types\";\n\nconst AI_COMPOSER_SUBMIT_NAME = \"AiComposerSubmit\";\nconst AI_COMPOSER_ABORT_NAME = \"AiComposerAbort\";\nconst AI_COMPOSER_EDITOR_NAME = \"AiComposerEditor\";\nconst AI_COMPOSER_FORM_NAME = \"AiComposerForm\";\n\ntype UiChatMessage = WithNavigation<AiChatMessage>;\n\n/* -------------------------------------------------------------------------------------------------\n * Form\n * -----------------------------------------------------------------------------------------------*/\n\nconst emptyMessagesΣ = new Signal<UiChatMessage[]>([]);\n\nfunction getLastMessageId(messages: UiChatMessage[]) {\n const lastMessage = messages[messages.length - 1];\n\n if (lastMessage === undefined) {\n return null;\n }\n\n return lastMessage.id;\n}\n\nfunction getAbortableMessageId(messages: UiChatMessage[]) {\n return messages.find(\n (message) =>\n message.role === \"assistant\" &&\n (message.status === \"generating\" || message.status === \"awaiting-tool\")\n )?.id;\n}\n\n/**\n * Surrounds the AI composer's content and handles submissions.\n *\n * @example\n * <AiComposer.Form onComposerSubmit={({ text }) => {}}>\n *\t <AiComposer.Editor />\n * <AiComposer.Submit />\n * </AiComposer.Form>\n */\nexport const AiComposerForm = forwardRef<HTMLFormElement, AiComposerFormProps>(\n (\n {\n onComposerSubmit,\n onSubmit,\n disabled,\n chatId,\n branchId,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"form\";\n const client = useClient();\n const formRef = useRef<HTMLFormElement | null>(null);\n const editor = useInitial(() =>\n withNormalize(withHistory(withReact(createEditor())))\n );\n const [isEditorEmpty, setEditorEmpty] = useState(true);\n const [isSubmitting, setSubmitting] = useState(false);\n const [isFocused, setFocused] = useState(false);\n const messagesΣ = chatId\n ? client[kInternal].ai.signals.getChatMessagesForBranchΣ(chatId, branchId)\n : emptyMessagesΣ;\n const lastMessageId = useSignal(messagesΣ, getLastMessageId);\n const abortableMessageId = useSignal(messagesΣ, getAbortableMessageId);\n\n const isDisabled = isSubmitting || disabled === true;\n const canAbort = abortableMessageId !== undefined;\n const canSubmit = !isEditorEmpty && !canAbort;\n\n const clear = useCallback(() => {\n SlateTransforms.delete(editor, {\n at: {\n anchor: SlateEditor.start(editor, []),\n focus: SlateEditor.end(editor, []),\n },\n });\n }, [editor]);\n\n const select = useCallback(() => {\n SlateTransforms.select(editor, SlateEditor.end(editor, []));\n }, [editor]);\n\n const focus = useCallback(\n (resetSelection = true) => {\n try {\n if (!ReactEditor.isFocused(editor)) {\n SlateTransforms.select(\n editor,\n resetSelection || !editor.selection\n ? SlateEditor.end(editor, [])\n : editor.selection\n );\n ReactEditor.focus(editor);\n }\n } catch {\n // Slate's DOM-specific methods will throw if the editor's DOM\n // node no longer exists. This action doesn't make sense on an\n // unmounted editor so we can safely ignore it.\n }\n },\n [editor]\n );\n\n const blur = useCallback(() => {\n try {\n ReactEditor.blur(editor);\n } catch {\n // Slate's DOM-specific methods will throw if the editor's DOM\n // node no longer exists. This action doesn't make sense on an\n // unmounted editor so we can safely ignore it.\n }\n }, [editor]);\n\n const onSubmitEnd = useCallback(() => {\n clear();\n setSubmitting(false);\n }, [clear]);\n\n const handleSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n if (disabled) {\n return;\n }\n\n // In some situations (e.g. pressing Enter while composing diacritics), it's possible\n // for the form to be submitted as empty even though we already checked whether the\n // editor was empty when handling the key press.\n const isEditorEmpty = isEmpty(editor, editor.children);\n\n // We even prevent the user's `onSubmit` handler from being called if the editor is empty.\n if (isEditorEmpty) {\n event.preventDefault();\n\n return;\n }\n\n onSubmit?.(event);\n\n if (onComposerSubmit === undefined || event.isDefaultPrevented()) {\n event.preventDefault();\n return;\n }\n\n // Extract the text content from the editor.\n const content = editor.children\n .map((block) => {\n if (\"type\" in block && block.type === \"paragraph\") {\n return block.children\n .map((child) => {\n if (\"text\" in child) {\n return child.text;\n }\n return \"\";\n })\n .join(\"\");\n }\n return \"\";\n })\n .join(\"\\n\");\n\n const promise = onComposerSubmit(\n { text: content, lastMessageId },\n event\n );\n\n event.preventDefault();\n\n if (promise) {\n setSubmitting(true);\n promise.then(onSubmitEnd);\n } else {\n onSubmitEnd();\n }\n },\n [disabled, editor, onSubmit, onComposerSubmit, onSubmitEnd, lastMessageId]\n );\n\n useLayoutEffect(() => {\n setEditorEmpty(isEmpty(editor, editor.children));\n }, [editor]);\n\n const handleEditorValueChange = useCallback(() => {\n setEditorEmpty(isEmpty(editor, editor.children));\n }, [editor]);\n\n const submit = useCallback(() => {\n if (!canSubmit) {\n return;\n }\n\n // We need to wait for the next frame in some cases like when composing diacritics,\n // we want any native handling to be done first while still being handled on `keydown`.\n requestAnimationFrame(() => {\n if (formRef.current) {\n requestSubmit(formRef.current);\n }\n });\n }, [canSubmit]);\n\n const abort = useCallback(() => {\n if (!canAbort || !abortableMessageId) {\n return;\n }\n\n client[kInternal].ai.abort(abortableMessageId);\n }, [canAbort, abortableMessageId, client]);\n\n useImperativeHandle<HTMLFormElement | null, HTMLFormElement | null>(\n forwardedRef,\n () => formRef.current,\n []\n );\n\n return (\n <AiComposerEditorContext.Provider\n value={{\n editor,\n onEditorValueChange: handleEditorValueChange,\n abortableMessageId,\n setFocused,\n }}\n >\n <AiComposerContext.Provider\n value={{\n isDisabled,\n isEmpty: isEditorEmpty,\n isFocused,\n canSubmit,\n canAbort,\n submit,\n abort,\n clear,\n focus,\n blur,\n select,\n }}\n >\n <Component onSubmit={handleSubmit} {...props} ref={formRef} />\n </AiComposerContext.Provider>\n </AiComposerEditorContext.Provider>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Editor\n * -----------------------------------------------------------------------------------------------*/\n\nfunction AiComposerEditorPlaceholder({\n attributes,\n children,\n}: RenderPlaceholderProps) {\n const { opacity: _opacity, ...style } = attributes.style;\n\n return (\n <span {...attributes} style={style} data-placeholder=\"\">\n {children}\n </span>\n );\n}\n\n/**\n * Displays the AI composer's editor.\n *\n * @example\n * <AiComposer.Editor placeholder=\"Write a message…\" />\n */\nconst AiComposerEditor = forwardRef<HTMLDivElement, AiComposerEditorProps>(\n (\n {\n defaultValue = \"\",\n onKeyDown,\n onFocus,\n onBlur,\n disabled,\n autoFocus,\n dir,\n ...props\n },\n forwardedRef\n ) => {\n const { editor, onEditorValueChange, setFocused } =\n useAiComposerEditorContext();\n const {\n submit,\n isDisabled: isComposerDisabled,\n isFocused,\n focus,\n blur,\n select,\n } = useAiComposer();\n const isDisabled = disabled || isComposerDisabled;\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.isDefaultPrevented()) return;\n\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n submit();\n } else if (event.key === \"Enter\" && event.shiftKey) {\n event.preventDefault();\n editor.insertBreak();\n } else if (event.key === \"Escape\") {\n blur();\n }\n },\n [editor, onKeyDown, submit, blur]\n );\n\n const handleFocus = useCallback(\n (event: FocusEvent<HTMLDivElement>) => {\n onFocus?.(event);\n\n if (!event.isDefaultPrevented()) {\n setFocused(true);\n }\n },\n [onFocus, setFocused]\n );\n\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLDivElement>) => {\n onBlur?.(event);\n\n if (!event.isDefaultPrevented()) {\n setFocused(false);\n }\n },\n [onBlur, setFocused]\n );\n\n useImperativeHandle(\n forwardedRef,\n () => ReactEditor.toDOMNode(editor, editor) as HTMLDivElement,\n [editor]\n );\n\n // Manually focus the editor when `autoFocus` is true\n useLayoutEffect(() => {\n if (autoFocus) {\n focus();\n }\n }, [autoFocus, editor, focus]);\n\n // Manually add a selection in the editor if the selection\n // is still empty after being focused\n useLayoutEffect(() => {\n if (isFocused && editor.selection === null) {\n select();\n }\n }, [editor, select, isFocused]);\n\n const initialValue: AiComposerBody = useMemo(() => {\n return defaultValue\n .split(\"\\n\")\n .map((text) => ({ type: \"paragraph\", children: [{ text }] }));\n }, [defaultValue]);\n\n return (\n <Slate\n editor={editor}\n initialValue={initialValue}\n onValueChange={onEditorValueChange}\n >\n <Editable\n dir={dir}\n enterKeyHint=\"send\"\n autoCapitalize=\"sentences\"\n aria-label=\"Composer editor\"\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n data-focused={isFocused || undefined}\n data-disabled={isDisabled || undefined}\n {...props}\n readOnly={isDisabled}\n disabled={isDisabled}\n renderPlaceholder={AiComposerEditorPlaceholder}\n />\n </Slate>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Submit\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * A button to submit the AI composer's content.\n *\n * @example\n * <AiComposer.Submit>Send</AiComposer.Submit>\n */\nexport const AiComposerSubmit = forwardRef<\n HTMLButtonElement,\n AiComposerSubmitProps\n>(({ disabled, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"button\";\n const { isDisabled: isComposerDisabled, canSubmit } = useAiComposer();\n const isDisabled = isComposerDisabled || disabled || !canSubmit;\n\n return (\n <Component\n type=\"submit\"\n {...props}\n ref={forwardedRef}\n disabled={isDisabled}\n />\n );\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Abort\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * A button to abort a response related to the AI composer.\n *\n * @example\n * <AiComposer.Abort>Cancel</AiComposer.Abort>\n */\nexport const AiComposerAbort = forwardRef<\n HTMLButtonElement,\n AiComposerSubmitProps\n>(({ disabled, onClick, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"button\";\n const { isDisabled: isComposerDisabled, canAbort, abort } = useAiComposer();\n const isDisabled = isComposerDisabled || disabled || !canAbort;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n abort();\n },\n [abort, onClick]\n );\n\n return (\n <Component\n type=\"button\"\n {...props}\n ref={forwardedRef}\n disabled={isDisabled}\n onClick={handleClick}\n />\n );\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n AiComposerEditor.displayName = AI_COMPOSER_EDITOR_NAME;\n AiComposerForm.displayName = AI_COMPOSER_FORM_NAME;\n AiComposerSubmit.displayName = AI_COMPOSER_SUBMIT_NAME;\n AiComposerAbort.displayName = AI_COMPOSER_ABORT_NAME;\n}\n\n// NOTE: Every export from this file will be available publicly as AiComposer.*\nexport {\n AiComposerAbort as Abort,\n AiComposerEditor as Editor,\n AiComposerForm as Form,\n AiComposerSubmit as Submit,\n};\n"],"names":["SlateTransforms","SlateEditor","isEditorEmpty"],"mappings":"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"}
@@ -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":";;;;;;;;AAuSA,MAAM,iBAAwC,GAAA;AAAA,EAC5C,SAAW,EAAA,CAAC,EAAE,QAAA,EAAe,KAAA;AAC3B,IAAA,uBAAQA,cAAA,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,uBAAQA,cAAA,CAAA,QAAA,EAAA;AAAA,UAAQ,QAAA;AAAA,SAAS,CAAA,CAAA;AAAA,MAC3B,KAAK,IAAA;AACH,QAAA,uBAAQA,cAAA,CAAA,IAAA,EAAA;AAAA,UAAI,QAAA;AAAA,SAAS,CAAA,CAAA;AAAA,MACvB,KAAK,MAAA;AACH,QAAA,uBAAQA,cAAA,CAAA,MAAA,EAAA;AAAA,UAAM,QAAA;AAAA,SAAS,CAAA,CAAA;AAAA,MACzB,KAAK,KAAA;AACH,QAAA,uBAAQA,cAAA,CAAA,KAAA,EAAA;AAAA,UAAK,QAAA;AAAA,SAAS,CAAA,CAAA;AAAA,MACxB;AACE,QAAAC,gBAAA,CAAY,MAAM,qBAAqB,CAAA,CAAA;AAAA,KAC3C;AAAA,GACF;AAAA,EACA,SAAW,EAAA,CAAC,EAAE,QAAA,EAAU,MAAW,KAAA;AACjC,IAAA,uBACGD,cAAA,CAAA,KAAA,EAAA;AAAA,MAAI,iBAAe,QAAY,IAAA,KAAA,CAAA;AAAA,MAC9B,QAAC,kBAAAA,cAAA,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,uBACGA,cAAA,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,uBAAQA,cAAA,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,uBAAQA,cAAA,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,uBAAQA,cAAA,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,uBACGE,eAAA,CAAA,OAAA,EAAA;AAAA,MACC,QAAA,EAAA;AAAA,wBAACF,cAAA,CAAA,OAAA,EAAA;AAAA,UACC,QAAC,kBAAAA,cAAA,CAAA,IAAA,EAAA;AAAA,YACE,QAAS,EAAA,QAAA,CAAA,GAAA,CAAI,CAAC,OAAA,EAAS,KAAU,KAAA;AAChC,cAAA,uBACGA,cAAA,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,wBACCA,cAAA,CAAA,OAAA,EAAA;AAAA,UACE,QAAK,EAAA,IAAA,CAAA,GAAA,CAAI,CAAC,GAAA,EAAK,KAAU,KAAA;AACxB,YAAA,uBACGA,cAAA,CAAA,IAAA,EAAA;AAAA,cACE,QAAI,EAAA,GAAA,CAAA,GAAA,CAAI,CAAC,IAAA,EAAMG,MAAU,KAAA;AACxB,gBAAA,uBACGH,cAAA,CAAA,IAAA,EAAA;AAAA,kBAAe,OAAO,IAAK,CAAA,KAAA;AAAA,kBACzB,QAAK,EAAA,IAAA,CAAA,QAAA;AAAA,iBAAA,EADCG,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,uBACGH,cAAA,CAAA,IAAA,EAAA;AAAA,MACE,QAAM,EAAA,KAAA,CAAA,GAAA,CAAI,CAAC,IAAA,EAAM,0BACfE,eAAA,CAAA,IAAA,EAAA;AAAA,QACE,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,YAAY,KAChB,CAAA,oBAAAA,eAAA,CAAAE,mBAAA,EAAA;AAAA,YACE,QAAA,EAAA;AAAA,8BAACJ,cAAA,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,sCAAQ,IAAG,EAAA,EAAA,CAAA,CAAA;AAAA,GACb;AACF,CAAA,CAAA;AAEO,MAAM,QAAW,GAAAK,gBAAA;AAAA,EACtB,CAAC,EAAE,OAAA,EAAS,YAAY,OAAY,EAAA,GAAA,KAAA,IAAS,YAAiB,KAAA;AAC5D,IAAM,MAAA,SAAA,GAAY,UAAUC,cAAO,GAAA,KAAA,CAAA;AACnC,IAAM,MAAA,MAAA,GAASC,cAAQ,MAAM;AAC3B,MAAA,OAAO,IAAIC,YAAA,EAAQ,CAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AAAA,KAChC,EAAG,CAAC,OAAO,CAAC,CAAA,CAAA;AAEZ,IAAA,uBACGR,cAAA,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,uBACGA,cAAA,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,GAAAS,UAAA;AAAA,EAC5B,CAAC;AAAA,IACC,KAAA;AAAA,IACA,UAAA;AAAA,GAII,KAAA;AACJ,IAAA,uBAAQT,cAAA,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,uBAAQA,cAAA,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,sCAAQ,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,uBACGA,cAAA,CAAA,SAAA,EAAA;AAAA,QACC,QAAC,kBAAAA,cAAA,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,uBACGA,cAAA,CAAA,OAAA,EAAA;AAAA,QAAQ,KAAA,EAAO,iBAAkB,CAAA,KAAA,CAAM,KAAK,CAAA;AAAA,QAC3C,QAAC,kBAAAA,cAAA,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,uBACGA,cAAA,CAAA,MAAA,EAAA;AAAA,QAAO,IAAK,EAAA,QAAA;AAAA,QACX,QAAC,kBAAAA,cAAA,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,uBACGA,cAAA,CAAA,MAAA,EAAA;AAAA,QAAO,IAAK,EAAA,IAAA;AAAA,QACX,QAAC,kBAAAA,cAAA,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,uBAAQA,cAAA,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,uBACGA,cAAA,CAAA,MAAA,EAAA;AAAA,QAAO,IAAK,EAAA,KAAA;AAAA,QACX,QAAC,kBAAAA,cAAA,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,GAAOU,gBAAY,CAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AAEnC,MAAA,IAAI,SAAS,IAAM,EAAA;AACjB,QAAA,uBAAQV,cAAA,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,uBACGA,cAAA,CAAA,IAAA,EAAA;AAAA,QAAK,IAAA;AAAA,QAAY,KAAA,EAAO,MAAM,KAAS,IAAA,KAAA,CAAA;AAAA,QACtC,QAAC,kBAAAA,cAAA,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,uBAAQA,cAAA,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,uBACGA,cAAA,CAAA,UAAA,EAAA;AAAA,QACC,QAAC,kBAAAA,cAAA,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,0BACGA,cAAA,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,uBACGA,cAAA,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,0BACGA,cAAA,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,0BACGA,cAAA,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,uBAAQA,cAAA,CAAA,KAAA,EAAA;AAAA,QAAM,QAAA;AAAA,QAAoB,IAAA;AAAA,OAAY,CAAA,CAAA;AAAA,KAChD;AAAA,IAEA,KAAK,OAAS,EAAA;AACZ,MAAM,MAAA,IAAA,GAAOU,gBAAY,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,uBACGV,cAAA,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,sCAAQ,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,0BACvBA,cAAA,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.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": {