@liveblocks/react-ui 2.25.0-aiprivatebeta1 → 2.25.0-aiprivatebeta11

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 (273) hide show
  1. package/dist/_private/index.cjs +18 -10
  2. package/dist/_private/index.cjs.map +1 -1
  3. package/dist/_private/index.d.cts +204 -172
  4. package/dist/_private/index.d.ts +204 -172
  5. package/dist/_private/index.js +12 -5
  6. package/dist/_private/index.js.map +1 -1
  7. package/dist/components/AiChat.cjs +179 -0
  8. package/dist/components/AiChat.cjs.map +1 -0
  9. package/dist/components/AiChat.js +177 -0
  10. package/dist/components/AiChat.js.map +1 -0
  11. package/dist/components/AiTool.cjs +164 -0
  12. package/dist/components/AiTool.cjs.map +1 -0
  13. package/dist/components/AiTool.js +162 -0
  14. package/dist/components/AiTool.js.map +1 -0
  15. package/dist/components/Comment.cjs +7 -5
  16. package/dist/components/Comment.cjs.map +1 -1
  17. package/dist/components/Comment.js +7 -5
  18. package/dist/components/Comment.js.map +1 -1
  19. package/dist/components/Composer.cjs +1 -2
  20. package/dist/components/Composer.cjs.map +1 -1
  21. package/dist/components/Composer.js +1 -2
  22. package/dist/components/Composer.js.map +1 -1
  23. package/dist/components/InboxNotificationList.cjs +11 -3
  24. package/dist/components/InboxNotificationList.cjs.map +1 -1
  25. package/dist/components/InboxNotificationList.js +12 -4
  26. package/dist/components/InboxNotificationList.js.map +1 -1
  27. package/dist/components/Thread.cjs +3 -3
  28. package/dist/components/Thread.cjs.map +1 -1
  29. package/dist/components/Thread.js +3 -3
  30. package/dist/components/Thread.js.map +1 -1
  31. package/dist/components/internal/AiChatAssistantMessage.cjs +74 -291
  32. package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
  33. package/dist/components/internal/AiChatAssistantMessage.js +76 -293
  34. package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
  35. package/dist/components/internal/AiChatComposer.cjs +58 -282
  36. package/dist/components/internal/AiChatComposer.cjs.map +1 -1
  37. package/dist/components/internal/AiChatComposer.js +63 -283
  38. package/dist/components/internal/AiChatComposer.js.map +1 -1
  39. package/dist/components/internal/AiChatUserMessage.cjs +26 -169
  40. package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
  41. package/dist/components/internal/AiChatUserMessage.js +28 -171
  42. package/dist/components/internal/AiChatUserMessage.js.map +1 -1
  43. package/dist/components/internal/Button.cjs.map +1 -1
  44. package/dist/components/internal/Button.js.map +1 -1
  45. package/dist/components/internal/CodeBlock.cjs +72 -0
  46. package/dist/components/internal/CodeBlock.cjs.map +1 -0
  47. package/dist/components/internal/CodeBlock.js +70 -0
  48. package/dist/components/internal/CodeBlock.js.map +1 -0
  49. package/dist/components/internal/Emoji.cjs +12 -4
  50. package/dist/components/internal/Emoji.cjs.map +1 -1
  51. package/dist/components/internal/Emoji.js +12 -4
  52. package/dist/components/internal/Emoji.js.map +1 -1
  53. package/dist/components/internal/Prose.cjs +37 -0
  54. package/dist/components/internal/Prose.cjs.map +1 -0
  55. package/dist/components/internal/Prose.js +35 -0
  56. package/dist/components/internal/Prose.js.map +1 -0
  57. package/dist/constants.cjs +2 -0
  58. package/dist/constants.cjs.map +1 -1
  59. package/dist/constants.js +2 -1
  60. package/dist/constants.js.map +1 -1
  61. package/dist/icon.cjs +6 -0
  62. package/dist/icon.cjs.map +1 -1
  63. package/dist/icon.js +3 -0
  64. package/dist/icon.js.map +1 -1
  65. package/dist/icons/{Resolve.cjs → CheckCircle.cjs} +3 -3
  66. package/dist/icons/CheckCircle.cjs.map +1 -0
  67. package/dist/icons/{Resolve.js → CheckCircle.js} +3 -3
  68. package/dist/icons/CheckCircle.js.map +1 -0
  69. package/dist/icons/{Resolved.cjs → CheckCircleFill.cjs} +3 -3
  70. package/dist/icons/CheckCircleFill.cjs.map +1 -0
  71. package/dist/icons/{Resolved.js → CheckCircleFill.js} +3 -3
  72. package/dist/icons/CheckCircleFill.js.map +1 -0
  73. package/dist/icons/Copy.cjs +8 -9
  74. package/dist/icons/Copy.cjs.map +1 -1
  75. package/dist/icons/Copy.js +8 -9
  76. package/dist/icons/Copy.js.map +1 -1
  77. package/dist/icons/Retry.cjs +21 -0
  78. package/dist/icons/Retry.cjs.map +1 -0
  79. package/dist/icons/Retry.js +19 -0
  80. package/dist/icons/Retry.js.map +1 -0
  81. package/dist/icons/index.cjs +8 -4
  82. package/dist/icons/index.cjs.map +1 -1
  83. package/dist/icons/index.js +4 -2
  84. package/dist/icons/index.js.map +1 -1
  85. package/dist/index.cjs +3 -1
  86. package/dist/index.cjs.map +1 -1
  87. package/dist/index.d.cts +102 -43
  88. package/dist/index.d.ts +102 -43
  89. package/dist/index.js +2 -1
  90. package/dist/index.js.map +1 -1
  91. package/dist/overrides.cjs +6 -12
  92. package/dist/overrides.cjs.map +1 -1
  93. package/dist/overrides.js +6 -12
  94. package/dist/overrides.js.map +1 -1
  95. package/dist/primitives/AiChatComposer/index.cjs +202 -0
  96. package/dist/primitives/AiChatComposer/index.cjs.map +1 -0
  97. package/dist/primitives/AiChatComposer/index.js +195 -0
  98. package/dist/primitives/AiChatComposer/index.js.map +1 -0
  99. package/dist/primitives/AiMessage/contexts.cjs +18 -0
  100. package/dist/primitives/AiMessage/contexts.cjs.map +1 -0
  101. package/dist/primitives/AiMessage/contexts.js +15 -0
  102. package/dist/primitives/AiMessage/contexts.js.map +1 -0
  103. package/dist/primitives/AiMessage/index.cjs +134 -0
  104. package/dist/primitives/AiMessage/index.cjs.map +1 -0
  105. package/dist/primitives/AiMessage/index.js +132 -0
  106. package/dist/primitives/AiMessage/index.js.map +1 -0
  107. package/dist/primitives/Collapsible/index.cjs +127 -0
  108. package/dist/primitives/Collapsible/index.cjs.map +1 -0
  109. package/dist/primitives/Collapsible/index.js +123 -0
  110. package/dist/primitives/Collapsible/index.js.map +1 -0
  111. package/dist/primitives/Comment/index.cjs +2 -2
  112. package/dist/primitives/Comment/index.cjs.map +1 -1
  113. package/dist/primitives/Comment/index.js +1 -1
  114. package/dist/primitives/Comment/index.js.map +1 -1
  115. package/dist/primitives/Composer/index.cjs +19 -14
  116. package/dist/primitives/Composer/index.cjs.map +1 -1
  117. package/dist/primitives/Composer/index.js +18 -13
  118. package/dist/primitives/Composer/index.js.map +1 -1
  119. package/dist/{slate → primitives/Composer/slate}/plugins/auto-formatting.cjs +3 -3
  120. package/dist/primitives/Composer/slate/plugins/auto-formatting.cjs.map +1 -0
  121. package/dist/{slate → primitives/Composer/slate}/plugins/auto-formatting.js +3 -3
  122. package/dist/primitives/Composer/slate/plugins/auto-formatting.js.map +1 -0
  123. package/dist/{slate → primitives/Composer/slate}/plugins/auto-links.cjs +7 -2
  124. package/dist/primitives/Composer/slate/plugins/auto-links.cjs.map +1 -0
  125. package/dist/{slate → primitives/Composer/slate}/plugins/auto-links.js +8 -3
  126. package/dist/primitives/Composer/slate/plugins/auto-links.js.map +1 -0
  127. package/dist/{slate → primitives/Composer/slate}/plugins/custom-links.cjs +8 -3
  128. package/dist/primitives/Composer/slate/plugins/custom-links.cjs.map +1 -0
  129. package/dist/{slate → primitives/Composer/slate}/plugins/custom-links.js +9 -4
  130. package/dist/primitives/Composer/slate/plugins/custom-links.js.map +1 -0
  131. package/dist/{slate → primitives/Composer/slate}/plugins/mentions.cjs +9 -10
  132. package/dist/primitives/Composer/slate/plugins/mentions.cjs.map +1 -0
  133. package/dist/{slate → primitives/Composer/slate}/plugins/mentions.js +6 -6
  134. package/dist/primitives/Composer/slate/plugins/mentions.js.map +1 -0
  135. package/dist/{slate → primitives/Composer/slate}/plugins/paste.cjs +1 -1
  136. package/dist/primitives/Composer/slate/plugins/paste.cjs.map +1 -0
  137. package/dist/{slate → primitives/Composer/slate}/plugins/paste.js +1 -1
  138. package/dist/primitives/Composer/slate/plugins/paste.js.map +1 -0
  139. package/dist/primitives/Composer/utils.cjs +4 -4
  140. package/dist/primitives/Composer/utils.cjs.map +1 -1
  141. package/dist/primitives/Composer/utils.js +4 -4
  142. package/dist/primitives/Composer/utils.js.map +1 -1
  143. package/dist/primitives/{internal/Markdown.cjs → Markdown.cjs} +150 -83
  144. package/dist/primitives/Markdown.cjs.map +1 -0
  145. package/dist/primitives/{internal/Markdown.js → Markdown.js} +151 -83
  146. package/dist/primitives/Markdown.js.map +1 -0
  147. package/dist/primitives/index.cjs +4 -9
  148. package/dist/primitives/index.cjs.map +1 -1
  149. package/dist/primitives/index.d.cts +4 -110
  150. package/dist/primitives/index.d.ts +4 -110
  151. package/dist/primitives/index.js +0 -1
  152. package/dist/primitives/index.js.map +1 -1
  153. package/dist/primitives/slate/plugins/empty-clear-formatting.cjs.map +1 -0
  154. package/dist/primitives/slate/plugins/empty-clear-formatting.js.map +1 -0
  155. package/dist/{slate → primitives/slate}/plugins/normalize.cjs +0 -5
  156. package/dist/primitives/slate/plugins/normalize.cjs.map +1 -0
  157. package/dist/{slate → primitives/slate}/plugins/normalize.js +0 -5
  158. package/dist/primitives/slate/plugins/normalize.js.map +1 -0
  159. package/dist/primitives/slate/utils/get-character.cjs.map +1 -0
  160. package/dist/primitives/slate/utils/get-character.js.map +1 -0
  161. package/dist/primitives/slate/utils/get-dom-range.cjs.map +1 -0
  162. package/dist/primitives/slate/utils/get-dom-range.js.map +1 -0
  163. package/dist/primitives/slate/utils/get-match-range.cjs.map +1 -0
  164. package/dist/primitives/slate/utils/get-match-range.js.map +1 -0
  165. package/dist/primitives/slate/utils/is-empty-string.cjs.map +1 -0
  166. package/dist/primitives/slate/utils/is-empty-string.js.map +1 -0
  167. package/dist/primitives/slate/utils/is-empty.cjs.map +1 -0
  168. package/dist/primitives/slate/utils/is-empty.js.map +1 -0
  169. package/dist/primitives/slate/utils/is-text.cjs.map +1 -0
  170. package/dist/primitives/slate/utils/is-text.js.map +1 -0
  171. package/dist/primitives/slate/utils/is-whitespace-character.cjs.map +1 -0
  172. package/dist/primitives/slate/utils/is-whitespace-character.js.map +1 -0
  173. package/dist/{slate → primitives/slate}/utils/marks.cjs +9 -9
  174. package/dist/primitives/slate/utils/marks.cjs.map +1 -0
  175. package/dist/{slate → primitives/slate}/utils/marks.js +9 -9
  176. package/dist/primitives/slate/utils/marks.js.map +1 -0
  177. package/dist/primitives/slate/utils/selection-contains-inlines.cjs.map +1 -0
  178. package/dist/primitives/slate/utils/selection-contains-inlines.js.map +1 -0
  179. package/dist/utils/ErrorBoundary.cjs +48 -0
  180. package/dist/utils/ErrorBoundary.cjs.map +1 -0
  181. package/dist/utils/ErrorBoundary.js +45 -0
  182. package/dist/utils/ErrorBoundary.js.map +1 -0
  183. package/dist/utils/use-visible.cjs +65 -45
  184. package/dist/utils/use-visible.cjs.map +1 -1
  185. package/dist/utils/use-visible.js +66 -46
  186. package/dist/utils/use-visible.js.map +1 -1
  187. package/dist/version.cjs +1 -1
  188. package/dist/version.cjs.map +1 -1
  189. package/dist/version.js +1 -1
  190. package/dist/version.js.map +1 -1
  191. package/package.json +18 -6
  192. package/src/styles/constants.css +1 -1
  193. package/src/styles/dark/index.css +7 -3
  194. package/src/styles/index.css +640 -307
  195. package/src/styles/utils.css +8 -3
  196. package/styles/dark/attributes.css +1 -1
  197. package/styles/dark/attributes.css.map +1 -1
  198. package/styles/dark/media-query.css +1 -1
  199. package/styles/dark/media-query.css.map +1 -1
  200. package/styles.css +1 -1
  201. package/styles.css.map +1 -1
  202. package/dist/components/AiChat/AiChat.cjs +0 -211
  203. package/dist/components/AiChat/AiChat.cjs.map +0 -1
  204. package/dist/components/AiChat/AiChat.js +0 -209
  205. package/dist/components/AiChat/AiChat.js.map +0 -1
  206. package/dist/icons/Resolve.cjs.map +0 -1
  207. package/dist/icons/Resolve.js.map +0 -1
  208. package/dist/icons/Resolved.cjs.map +0 -1
  209. package/dist/icons/Resolved.js.map +0 -1
  210. package/dist/primitives/Chat/Composer/index.cjs +0 -323
  211. package/dist/primitives/Chat/Composer/index.cjs.map +0 -1
  212. package/dist/primitives/Chat/Composer/index.js +0 -315
  213. package/dist/primitives/Chat/Composer/index.js.map +0 -1
  214. package/dist/primitives/internal/Collapsible.cjs +0 -99
  215. package/dist/primitives/internal/Collapsible.cjs.map +0 -1
  216. package/dist/primitives/internal/Collapsible.js +0 -95
  217. package/dist/primitives/internal/Collapsible.js.map +0 -1
  218. package/dist/primitives/internal/Emoji.cjs +0 -32
  219. package/dist/primitives/internal/Emoji.cjs.map +0 -1
  220. package/dist/primitives/internal/Emoji.js +0 -30
  221. package/dist/primitives/internal/Emoji.js.map +0 -1
  222. package/dist/primitives/internal/Markdown.cjs.map +0 -1
  223. package/dist/primitives/internal/Markdown.js.map +0 -1
  224. package/dist/slate/plugins/auto-formatting.cjs.map +0 -1
  225. package/dist/slate/plugins/auto-formatting.js.map +0 -1
  226. package/dist/slate/plugins/auto-links.cjs.map +0 -1
  227. package/dist/slate/plugins/auto-links.js.map +0 -1
  228. package/dist/slate/plugins/custom-links.cjs.map +0 -1
  229. package/dist/slate/plugins/custom-links.js.map +0 -1
  230. package/dist/slate/plugins/empty-clear-formatting.cjs.map +0 -1
  231. package/dist/slate/plugins/empty-clear-formatting.js.map +0 -1
  232. package/dist/slate/plugins/mentions.cjs.map +0 -1
  233. package/dist/slate/plugins/mentions.js.map +0 -1
  234. package/dist/slate/plugins/normalize.cjs.map +0 -1
  235. package/dist/slate/plugins/normalize.js.map +0 -1
  236. package/dist/slate/plugins/paste.cjs.map +0 -1
  237. package/dist/slate/plugins/paste.js.map +0 -1
  238. package/dist/slate/utils/get-character.cjs.map +0 -1
  239. package/dist/slate/utils/get-character.js.map +0 -1
  240. package/dist/slate/utils/get-dom-range.cjs.map +0 -1
  241. package/dist/slate/utils/get-dom-range.js.map +0 -1
  242. package/dist/slate/utils/get-match-range.cjs.map +0 -1
  243. package/dist/slate/utils/get-match-range.js.map +0 -1
  244. package/dist/slate/utils/is-empty-string.cjs.map +0 -1
  245. package/dist/slate/utils/is-empty-string.js.map +0 -1
  246. package/dist/slate/utils/is-empty.cjs.map +0 -1
  247. package/dist/slate/utils/is-empty.js.map +0 -1
  248. package/dist/slate/utils/is-text.cjs.map +0 -1
  249. package/dist/slate/utils/is-text.js.map +0 -1
  250. package/dist/slate/utils/is-whitespace-character.cjs.map +0 -1
  251. package/dist/slate/utils/is-whitespace-character.js.map +0 -1
  252. package/dist/slate/utils/marks.cjs.map +0 -1
  253. package/dist/slate/utils/marks.js.map +0 -1
  254. package/dist/slate/utils/selection-contains-inlines.cjs.map +0 -1
  255. package/dist/slate/utils/selection-contains-inlines.js.map +0 -1
  256. /package/dist/{slate → primitives/slate}/plugins/empty-clear-formatting.cjs +0 -0
  257. /package/dist/{slate → primitives/slate}/plugins/empty-clear-formatting.js +0 -0
  258. /package/dist/{slate → primitives/slate}/utils/get-character.cjs +0 -0
  259. /package/dist/{slate → primitives/slate}/utils/get-character.js +0 -0
  260. /package/dist/{slate → primitives/slate}/utils/get-dom-range.cjs +0 -0
  261. /package/dist/{slate → primitives/slate}/utils/get-dom-range.js +0 -0
  262. /package/dist/{slate → primitives/slate}/utils/get-match-range.cjs +0 -0
  263. /package/dist/{slate → primitives/slate}/utils/get-match-range.js +0 -0
  264. /package/dist/{slate → primitives/slate}/utils/is-empty-string.cjs +0 -0
  265. /package/dist/{slate → primitives/slate}/utils/is-empty-string.js +0 -0
  266. /package/dist/{slate → primitives/slate}/utils/is-empty.cjs +0 -0
  267. /package/dist/{slate → primitives/slate}/utils/is-empty.js +0 -0
  268. /package/dist/{slate → primitives/slate}/utils/is-text.cjs +0 -0
  269. /package/dist/{slate → primitives/slate}/utils/is-text.js +0 -0
  270. /package/dist/{slate → primitives/slate}/utils/is-whitespace-character.cjs +0 -0
  271. /package/dist/{slate → primitives/slate}/utils/is-whitespace-character.js +0 -0
  272. /package/dist/{slate → primitives/slate}/utils/selection-contains-inlines.cjs +0 -0
  273. /package/dist/{slate → primitives/slate}/utils/selection-contains-inlines.js +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../src/primitives/Chat/Composer/index.tsx"],"sourcesContent":["import { HttpError, kInternal, nanoid } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport type {\n ButtonHTMLAttributes,\n FormEvent,\n FormHTMLAttributes,\n HTMLAttributes,\n KeyboardEvent,\n} from \"react\";\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { BaseEditor, Descendant } from \"slate\";\nimport { createEditor, Editor as SlateEditor, Transforms } from \"slate\";\nimport type { HistoryEditor } from \"slate-history\";\nimport { withHistory } from \"slate-history\";\nimport { Editable, ReactEditor, Slate, withReact } from \"slate-react\";\n\nimport { withNormalize } from \"../../../slate/plugins/normalize\";\nimport { isEmpty } from \"../../../slate/utils/is-empty\";\nimport { AttachmentTooLargeError } from \"../../Composer/utils\";\n\n/* -------------------------------------------------------------------------------------------------\n * Form\n * -----------------------------------------------------------------------------------------------*/\nexport const ComposerContext = createContext<{\n chatId: string;\n\n editor: SlateEditor;\n onEditorValueChange: (value: Descendant[]) => void;\n isEditorEmpty: boolean;\n\n attachments: ({\n id: string;\n file: File;\n } & (\n | {\n status: \"uploading\" | \"uploaded\";\n }\n | {\n status: \"error\";\n error: Error;\n }\n ))[];\n onAttachFiles: () => void;\n onRemoveAttachment: (id: string) => void;\n numOfAttachments: number;\n\n requestFormSubmit: () => void;\n disabled: boolean;\n} | null>(null);\n\nexport const MAX_ATTACHMENTS = 10;\nexport const MAX_ATTACHMENT_SIZE = 1024 * 1024 * 1024; // 1 GB\n\nexport type FormProps = FormHTMLAttributes<HTMLFormElement> & {\n /**\n * The event handler called when a chat message is submitted.\n */\n onComposerSubmit?: (\n message: {\n /**\n * The submitted message text.\n */\n text: string;\n },\n event: FormEvent<HTMLFormElement>\n ) => void;\n /**\n * Whether the composer is disabled.\n */\n disabled?: boolean;\n /**\n * The id of the chat the composer belongs to.\n */\n chatId: string;\n};\n\n/**\n * Surrounds the chat composer's content and handles submissions.\n *\n * @example\n * <Form onComposerSubmit={({ text }) => {}}>\n *\t <Editor />\n * <Submit />\n * </Form>\n */\nexport const Form = forwardRef<HTMLFormElement, FormProps>(\n (\n { onComposerSubmit, onSubmit, disabled, chatId, ...props },\n forwardedRef\n ) => {\n const formRef = useRef<HTMLFormElement | null>(null);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n\n const editorRef = useRef<(BaseEditor & ReactEditor & HistoryEditor) | null>(\n null\n );\n if (editorRef.current === null) {\n editorRef.current = withNormalize(withHistory(withReact(createEditor())));\n }\n const editor = editorRef.current;\n\n const [isEditorEmpty, setIsEditorEmpty] = useState(true);\n\n const [attachments, setAttachments] = useState<\n ({\n id: string;\n file: File;\n } & (\n | {\n status: \"uploading\" | \"uploaded\";\n }\n | {\n status: \"error\";\n error: Error;\n }\n ))[]\n >([]);\n\n const handleSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n if (disabled || isEmpty(editor, editor.children)) return;\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 onComposerSubmit({ text: content }, event);\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n event.preventDefault();\n\n // Clear the editor after dispatching the message.\n Transforms.delete(editor, {\n at: {\n anchor: SlateEditor.start(editor, []),\n focus: SlateEditor.end(editor, []),\n },\n });\n },\n [disabled, editor, onSubmit, onComposerSubmit]\n );\n\n useLayoutEffect(() => {\n setIsEditorEmpty(isEmpty(editor, editor.children));\n }, [editor]);\n\n const handleEditorValueChange = useCallback(() => {\n setIsEditorEmpty(isEmpty(editor, editor.children));\n }, [editor]);\n\n const requestFormSubmit = useCallback(() => {\n if (isEmpty(editor, editor.children)) return;\n\n if (attachments.some((attachment) => attachment.status === \"uploading\")) {\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 === null) return;\n if (typeof formRef.current.requestSubmit === \"function\") {\n return formRef.current.requestSubmit();\n }\n const submitter = document.createElement(\"input\");\n submitter.type = \"submit\";\n submitter.hidden = true;\n formRef.current.appendChild(submitter);\n submitter.click();\n formRef.current.removeChild(submitter);\n });\n }, [editor, attachments]);\n\n const handleAttachFiles = useCallback(() => {\n if (disabled) return;\n fileInputRef.current?.click();\n }, [disabled]);\n\n const handleRemoveAttachment = useCallback((id: string) => {\n setAttachments((attachments) =>\n attachments.filter((attachment) => attachment.id !== id)\n );\n }, []);\n\n useImperativeHandle<HTMLFormElement | null, HTMLFormElement | null>(\n forwardedRef,\n () => formRef.current,\n []\n );\n\n const client = useClient();\n\n return (\n <ComposerContext.Provider\n value={{\n chatId,\n editor,\n onEditorValueChange: handleEditorValueChange,\n isEditorEmpty,\n requestFormSubmit,\n disabled: disabled || false,\n attachments,\n onAttachFiles: handleAttachFiles,\n onRemoveAttachment: handleRemoveAttachment,\n numOfAttachments: attachments.length,\n }}\n >\n <form onSubmit={handleSubmit} {...props} ref={formRef} />\n <input\n type=\"file\"\n multiple\n accept=\"image/png, image/jpeg\"\n ref={fileInputRef}\n onClick={(event) => {\n event.stopPropagation();\n }}\n onChange={function (event) {\n if (disabled) return;\n\n if (event.target.files === null) return;\n if (event.target.files.length === 0) return;\n\n for (const file of Array.from(event.target.files).slice(\n 0,\n MAX_ATTACHMENTS - attachments.length\n )) {\n const id = `at_${nanoid()}`;\n if (file.size > MAX_ATTACHMENT_SIZE) {\n setAttachments((attachments) => [\n ...attachments,\n {\n id,\n file,\n status: \"error\",\n error: new AttachmentTooLargeError(\"File is too large.\"),\n },\n ]);\n continue;\n }\n\n setAttachments((attachments) => [\n ...attachments,\n {\n id,\n file,\n status: \"uploading\",\n },\n ]);\n\n client[kInternal].httpClient\n .uploadChatAttachment({\n chatId,\n attachment: {\n id,\n file,\n },\n })\n .then(() => {\n setAttachments((attachments) =>\n attachments.map((attachment) =>\n attachment.id === id\n ? { ...attachment, status: \"uploaded\" }\n : attachment\n )\n );\n })\n .catch((error) => {\n if (error instanceof Error) {\n setAttachments((attachments) =>\n attachments.map((attachment) =>\n attachment.id === id\n ? {\n ...attachment,\n status: \"error\",\n error:\n error instanceof HttpError &&\n error.status === 413\n ? new AttachmentTooLargeError(\n \"File is too large\"\n )\n : error,\n }\n : attachment\n )\n );\n }\n });\n }\n\n event.target.value = \"\";\n }}\n tabIndex={-1}\n style={{ display: \"none\" }}\n />\n </ComposerContext.Provider>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Editor\n * -----------------------------------------------------------------------------------------------*/\nexport type EditorProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"defaultValue\"\n> & {\n /**\n * The editor's initial value.\n */\n defaultValue?: string;\n /**\n * The text to display when the editor is empty.\n */\n placeholder?: string;\n /**\n * Whether the editor is disabled.\n */\n disabled?: boolean;\n /**\n * Whether to focus the editor on mount.\n */\n autoFocus?: boolean;\n};\n\n/**\n * Displays the chat composer's editor.\n *\n * @example\n * <Editor placeholder=\"Write a message…\" />\n */\nexport const Editor = forwardRef<HTMLDivElement, EditorProps>(\n (\n { defaultValue = \"\", onKeyDown, disabled, autoFocus, ...props },\n forwardedRef\n ) => {\n const context = useContext(ComposerContext);\n if (context === null) {\n throw new Error(\"Editor must be a descendant of Form.\");\n }\n\n const {\n editor,\n onEditorValueChange,\n requestFormSubmit,\n disabled: isFormDisabled,\n } = context;\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 requestFormSubmit();\n } else if (event.key === \"Enter\" && event.shiftKey) {\n event.preventDefault();\n editor.insertBreak();\n }\n },\n [editor, onKeyDown, requestFormSubmit]\n );\n\n useImperativeHandle(\n forwardedRef,\n () => ReactEditor.toDOMNode(editor, editor) as HTMLDivElement,\n [editor]\n );\n\n useEffect(() => {\n if (!autoFocus) return;\n\n try {\n if (!ReactEditor.isFocused(editor)) {\n Transforms.select(editor, SlateEditor.end(editor, []));\n ReactEditor.focus(editor);\n }\n } catch {\n // Slate's DOM-specific methods will throw if the editor's DOM node no longer exists. This action doesn't make sense on an unmounted editor so we can safely ignore it.\n }\n }, [editor, autoFocus]);\n\n const initialValue: { type: \"paragraph\"; children: { text: string }[] }[] =\n 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 enterKeyHint=\"send\"\n autoCapitalize=\"sentences\"\n onKeyDown={handleKeyDown}\n data-disabled={disabled || isFormDisabled || undefined}\n {...props}\n readOnly={disabled || isFormDisabled}\n disabled={disabled || isFormDisabled}\n renderPlaceholder={function ({ attributes, children }) {\n const { opacity: _opacity, ...style } = attributes.style;\n return (\n <span {...attributes} style={style} data-placeholder=\"\">\n {children}\n </span>\n );\n }}\n />\n </Slate>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Submit\n * -----------------------------------------------------------------------------------------------*/\nexport type SubmitProps = ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * A button to submit a chat message.\n *\n * @example\n * <ChatComposer.Submit>Send</ChatComposer.Submit>\n */\nexport const Submit = forwardRef<HTMLButtonElement, SubmitProps>(\n ({ disabled, ...props }, forwardedRef) => {\n const context = useContext(ComposerContext);\n if (context === null) {\n throw new Error(\"Submit must be a descendant of Form.\");\n }\n\n const { disabled: isFormDisabled, isEditorEmpty, attachments } = context;\n\n return (\n <button\n type=\"submit\"\n {...props}\n ref={forwardedRef}\n disabled={\n disabled ||\n isFormDisabled ||\n isEditorEmpty ||\n attachments.some((attachment) => attachment.status === \"uploading\")\n }\n />\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * AttachFiles\n * -----------------------------------------------------------------------------------------------*/\nexport type AttachFilesProps = ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * A button which opens a file picker to create attachments.\n *\n * @example\n * <Composer.AttachFiles>Attach files</Composer.AttachFiles>\n */\nexport const AttachFiles = forwardRef<HTMLButtonElement, AttachFilesProps>(\n ({ onClick, disabled, ...props }, forwardedRef) => {\n const context = useContext(ComposerContext);\n if (context === null) {\n throw new Error(\"AttachFiles must be a descendant of Form.\");\n }\n\n const {\n disabled: isFormDisabled,\n onAttachFiles,\n numOfAttachments,\n } = context;\n\n return (\n <button\n type=\"button\"\n {...props}\n onClick={function (event) {\n onClick?.(event);\n if (event.isDefaultPrevented()) return;\n onAttachFiles();\n }}\n onPointerDown={(event) => event.preventDefault()}\n ref={forwardedRef}\n disabled={\n isFormDisabled || disabled || numOfAttachments >= MAX_ATTACHMENTS\n }\n />\n );\n }\n);\n"],"names":["createContext","forwardRef","useRef","withNormalize","withHistory","withReact","createEditor","useState","useCallback","isEmpty","Transforms","SlateEditor","useLayoutEffect","attachments","useImperativeHandle","useClient","jsxs","jsx","nanoid","AttachmentTooLargeError","kInternal","HttpError","useContext","ReactEditor","useEffect","useMemo","Slate","Editable"],"mappings":"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"}
@@ -1,315 +0,0 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { nanoid, kInternal, HttpError } from '@liveblocks/core';
3
- import { useClient } from '@liveblocks/react';
4
- import { useLayoutEffect } from '@liveblocks/react/_private';
5
- import { createContext, forwardRef, useRef, useState, useCallback, useImperativeHandle, useContext, useEffect, useMemo } from 'react';
6
- import { createEditor, Transforms, Editor as Editor$1 } from 'slate';
7
- import { withHistory } from 'slate-history';
8
- import { withReact, ReactEditor, Slate, Editable } from 'slate-react';
9
- import { withNormalize } from '../../../slate/plugins/normalize.js';
10
- import { isEmpty } from '../../../slate/utils/is-empty.js';
11
- import { AttachmentTooLargeError } from '../../Composer/utils.js';
12
-
13
- const ComposerContext = createContext(null);
14
- const MAX_ATTACHMENTS = 10;
15
- const MAX_ATTACHMENT_SIZE = 1024 * 1024 * 1024;
16
- const Form = forwardRef(
17
- ({ onComposerSubmit, onSubmit, disabled, chatId, ...props }, forwardedRef) => {
18
- const formRef = useRef(null);
19
- const fileInputRef = useRef(null);
20
- const editorRef = useRef(
21
- null
22
- );
23
- if (editorRef.current === null) {
24
- editorRef.current = withNormalize(withHistory(withReact(createEditor())));
25
- }
26
- const editor = editorRef.current;
27
- const [isEditorEmpty, setIsEditorEmpty] = useState(true);
28
- const [attachments, setAttachments] = useState([]);
29
- const handleSubmit = useCallback(
30
- (event) => {
31
- if (disabled || isEmpty(editor, editor.children))
32
- return;
33
- onSubmit?.(event);
34
- if (onComposerSubmit === void 0 || event.isDefaultPrevented()) {
35
- event.preventDefault();
36
- return;
37
- }
38
- const content = editor.children.map((block) => {
39
- if ("type" in block && block.type === "paragraph") {
40
- return block.children.map((child) => {
41
- if ("text" in child) {
42
- return child.text;
43
- }
44
- return "";
45
- }).join("");
46
- }
47
- return "";
48
- }).join("\n");
49
- onComposerSubmit({ text: content }, event);
50
- if (event.isDefaultPrevented()) {
51
- return;
52
- }
53
- event.preventDefault();
54
- Transforms.delete(editor, {
55
- at: {
56
- anchor: Editor$1.start(editor, []),
57
- focus: Editor$1.end(editor, [])
58
- }
59
- });
60
- },
61
- [disabled, editor, onSubmit, onComposerSubmit]
62
- );
63
- useLayoutEffect(() => {
64
- setIsEditorEmpty(isEmpty(editor, editor.children));
65
- }, [editor]);
66
- const handleEditorValueChange = useCallback(() => {
67
- setIsEditorEmpty(isEmpty(editor, editor.children));
68
- }, [editor]);
69
- const requestFormSubmit = useCallback(() => {
70
- if (isEmpty(editor, editor.children))
71
- return;
72
- if (attachments.some((attachment) => attachment.status === "uploading")) {
73
- return;
74
- }
75
- requestAnimationFrame(() => {
76
- if (formRef.current === null)
77
- return;
78
- if (typeof formRef.current.requestSubmit === "function") {
79
- return formRef.current.requestSubmit();
80
- }
81
- const submitter = document.createElement("input");
82
- submitter.type = "submit";
83
- submitter.hidden = true;
84
- formRef.current.appendChild(submitter);
85
- submitter.click();
86
- formRef.current.removeChild(submitter);
87
- });
88
- }, [editor, attachments]);
89
- const handleAttachFiles = useCallback(() => {
90
- if (disabled)
91
- return;
92
- fileInputRef.current?.click();
93
- }, [disabled]);
94
- const handleRemoveAttachment = useCallback((id) => {
95
- setAttachments(
96
- (attachments2) => attachments2.filter((attachment) => attachment.id !== id)
97
- );
98
- }, []);
99
- useImperativeHandle(
100
- forwardedRef,
101
- () => formRef.current,
102
- []
103
- );
104
- const client = useClient();
105
- return /* @__PURE__ */ jsxs(ComposerContext.Provider, {
106
- value: {
107
- chatId,
108
- editor,
109
- onEditorValueChange: handleEditorValueChange,
110
- isEditorEmpty,
111
- requestFormSubmit,
112
- disabled: disabled || false,
113
- attachments,
114
- onAttachFiles: handleAttachFiles,
115
- onRemoveAttachment: handleRemoveAttachment,
116
- numOfAttachments: attachments.length
117
- },
118
- children: [
119
- /* @__PURE__ */ jsx("form", {
120
- onSubmit: handleSubmit,
121
- ...props,
122
- ref: formRef
123
- }),
124
- /* @__PURE__ */ jsx("input", {
125
- type: "file",
126
- multiple: true,
127
- accept: "image/png, image/jpeg",
128
- ref: fileInputRef,
129
- onClick: (event) => {
130
- event.stopPropagation();
131
- },
132
- onChange: function(event) {
133
- if (disabled)
134
- return;
135
- if (event.target.files === null)
136
- return;
137
- if (event.target.files.length === 0)
138
- return;
139
- for (const file of Array.from(event.target.files).slice(
140
- 0,
141
- MAX_ATTACHMENTS - attachments.length
142
- )) {
143
- const id = `at_${nanoid()}`;
144
- if (file.size > MAX_ATTACHMENT_SIZE) {
145
- setAttachments((attachments2) => [
146
- ...attachments2,
147
- {
148
- id,
149
- file,
150
- status: "error",
151
- error: new AttachmentTooLargeError("File is too large.")
152
- }
153
- ]);
154
- continue;
155
- }
156
- setAttachments((attachments2) => [
157
- ...attachments2,
158
- {
159
- id,
160
- file,
161
- status: "uploading"
162
- }
163
- ]);
164
- client[kInternal].httpClient.uploadChatAttachment({
165
- chatId,
166
- attachment: {
167
- id,
168
- file
169
- }
170
- }).then(() => {
171
- setAttachments(
172
- (attachments2) => attachments2.map(
173
- (attachment) => attachment.id === id ? { ...attachment, status: "uploaded" } : attachment
174
- )
175
- );
176
- }).catch((error) => {
177
- if (error instanceof Error) {
178
- setAttachments(
179
- (attachments2) => attachments2.map(
180
- (attachment) => attachment.id === id ? {
181
- ...attachment,
182
- status: "error",
183
- error: error instanceof HttpError && error.status === 413 ? new AttachmentTooLargeError(
184
- "File is too large"
185
- ) : error
186
- } : attachment
187
- )
188
- );
189
- }
190
- });
191
- }
192
- event.target.value = "";
193
- },
194
- tabIndex: -1,
195
- style: { display: "none" }
196
- })
197
- ]
198
- });
199
- }
200
- );
201
- const Editor = forwardRef(
202
- ({ defaultValue = "", onKeyDown, disabled, autoFocus, ...props }, forwardedRef) => {
203
- const context = useContext(ComposerContext);
204
- if (context === null) {
205
- throw new Error("Editor must be a descendant of Form.");
206
- }
207
- const {
208
- editor,
209
- onEditorValueChange,
210
- requestFormSubmit,
211
- disabled: isFormDisabled
212
- } = context;
213
- const handleKeyDown = useCallback(
214
- (event) => {
215
- onKeyDown?.(event);
216
- if (event.isDefaultPrevented())
217
- return;
218
- if (event.key === "Enter" && !event.shiftKey) {
219
- event.preventDefault();
220
- requestFormSubmit();
221
- } else if (event.key === "Enter" && event.shiftKey) {
222
- event.preventDefault();
223
- editor.insertBreak();
224
- }
225
- },
226
- [editor, onKeyDown, requestFormSubmit]
227
- );
228
- useImperativeHandle(
229
- forwardedRef,
230
- () => ReactEditor.toDOMNode(editor, editor),
231
- [editor]
232
- );
233
- useEffect(() => {
234
- if (!autoFocus)
235
- return;
236
- try {
237
- if (!ReactEditor.isFocused(editor)) {
238
- Transforms.select(editor, Editor$1.end(editor, []));
239
- ReactEditor.focus(editor);
240
- }
241
- } catch {
242
- }
243
- }, [editor, autoFocus]);
244
- const initialValue = useMemo(() => {
245
- return defaultValue.split("\n").map((text) => ({ type: "paragraph", children: [{ text }] }));
246
- }, [defaultValue]);
247
- return /* @__PURE__ */ jsx(Slate, {
248
- editor,
249
- initialValue,
250
- onValueChange: onEditorValueChange,
251
- children: /* @__PURE__ */ jsx(Editable, {
252
- enterKeyHint: "send",
253
- autoCapitalize: "sentences",
254
- onKeyDown: handleKeyDown,
255
- "data-disabled": disabled || isFormDisabled || void 0,
256
- ...props,
257
- readOnly: disabled || isFormDisabled,
258
- disabled: disabled || isFormDisabled,
259
- renderPlaceholder: function({ attributes, children }) {
260
- const { opacity: _opacity, ...style } = attributes.style;
261
- return /* @__PURE__ */ jsx("span", {
262
- ...attributes,
263
- style,
264
- "data-placeholder": "",
265
- children
266
- });
267
- }
268
- })
269
- });
270
- }
271
- );
272
- const Submit = forwardRef(
273
- ({ disabled, ...props }, forwardedRef) => {
274
- const context = useContext(ComposerContext);
275
- if (context === null) {
276
- throw new Error("Submit must be a descendant of Form.");
277
- }
278
- const { disabled: isFormDisabled, isEditorEmpty, attachments } = context;
279
- return /* @__PURE__ */ jsx("button", {
280
- type: "submit",
281
- ...props,
282
- ref: forwardedRef,
283
- disabled: disabled || isFormDisabled || isEditorEmpty || attachments.some((attachment) => attachment.status === "uploading")
284
- });
285
- }
286
- );
287
- const AttachFiles = forwardRef(
288
- ({ onClick, disabled, ...props }, forwardedRef) => {
289
- const context = useContext(ComposerContext);
290
- if (context === null) {
291
- throw new Error("AttachFiles must be a descendant of Form.");
292
- }
293
- const {
294
- disabled: isFormDisabled,
295
- onAttachFiles,
296
- numOfAttachments
297
- } = context;
298
- return /* @__PURE__ */ jsx("button", {
299
- type: "button",
300
- ...props,
301
- onClick: function(event) {
302
- onClick?.(event);
303
- if (event.isDefaultPrevented())
304
- return;
305
- onAttachFiles();
306
- },
307
- onPointerDown: (event) => event.preventDefault(),
308
- ref: forwardedRef,
309
- disabled: isFormDisabled || disabled || numOfAttachments >= MAX_ATTACHMENTS
310
- });
311
- }
312
- );
313
-
314
- export { AttachFiles, ComposerContext, Editor, Form, MAX_ATTACHMENTS, MAX_ATTACHMENT_SIZE, Submit };
315
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/primitives/Chat/Composer/index.tsx"],"sourcesContent":["import { HttpError, kInternal, nanoid } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport type {\n ButtonHTMLAttributes,\n FormEvent,\n FormHTMLAttributes,\n HTMLAttributes,\n KeyboardEvent,\n} from \"react\";\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { BaseEditor, Descendant } from \"slate\";\nimport { createEditor, Editor as SlateEditor, Transforms } from \"slate\";\nimport type { HistoryEditor } from \"slate-history\";\nimport { withHistory } from \"slate-history\";\nimport { Editable, ReactEditor, Slate, withReact } from \"slate-react\";\n\nimport { withNormalize } from \"../../../slate/plugins/normalize\";\nimport { isEmpty } from \"../../../slate/utils/is-empty\";\nimport { AttachmentTooLargeError } from \"../../Composer/utils\";\n\n/* -------------------------------------------------------------------------------------------------\n * Form\n * -----------------------------------------------------------------------------------------------*/\nexport const ComposerContext = createContext<{\n chatId: string;\n\n editor: SlateEditor;\n onEditorValueChange: (value: Descendant[]) => void;\n isEditorEmpty: boolean;\n\n attachments: ({\n id: string;\n file: File;\n } & (\n | {\n status: \"uploading\" | \"uploaded\";\n }\n | {\n status: \"error\";\n error: Error;\n }\n ))[];\n onAttachFiles: () => void;\n onRemoveAttachment: (id: string) => void;\n numOfAttachments: number;\n\n requestFormSubmit: () => void;\n disabled: boolean;\n} | null>(null);\n\nexport const MAX_ATTACHMENTS = 10;\nexport const MAX_ATTACHMENT_SIZE = 1024 * 1024 * 1024; // 1 GB\n\nexport type FormProps = FormHTMLAttributes<HTMLFormElement> & {\n /**\n * The event handler called when a chat message is submitted.\n */\n onComposerSubmit?: (\n message: {\n /**\n * The submitted message text.\n */\n text: string;\n },\n event: FormEvent<HTMLFormElement>\n ) => void;\n /**\n * Whether the composer is disabled.\n */\n disabled?: boolean;\n /**\n * The id of the chat the composer belongs to.\n */\n chatId: string;\n};\n\n/**\n * Surrounds the chat composer's content and handles submissions.\n *\n * @example\n * <Form onComposerSubmit={({ text }) => {}}>\n *\t <Editor />\n * <Submit />\n * </Form>\n */\nexport const Form = forwardRef<HTMLFormElement, FormProps>(\n (\n { onComposerSubmit, onSubmit, disabled, chatId, ...props },\n forwardedRef\n ) => {\n const formRef = useRef<HTMLFormElement | null>(null);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n\n const editorRef = useRef<(BaseEditor & ReactEditor & HistoryEditor) | null>(\n null\n );\n if (editorRef.current === null) {\n editorRef.current = withNormalize(withHistory(withReact(createEditor())));\n }\n const editor = editorRef.current;\n\n const [isEditorEmpty, setIsEditorEmpty] = useState(true);\n\n const [attachments, setAttachments] = useState<\n ({\n id: string;\n file: File;\n } & (\n | {\n status: \"uploading\" | \"uploaded\";\n }\n | {\n status: \"error\";\n error: Error;\n }\n ))[]\n >([]);\n\n const handleSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n if (disabled || isEmpty(editor, editor.children)) return;\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 onComposerSubmit({ text: content }, event);\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n event.preventDefault();\n\n // Clear the editor after dispatching the message.\n Transforms.delete(editor, {\n at: {\n anchor: SlateEditor.start(editor, []),\n focus: SlateEditor.end(editor, []),\n },\n });\n },\n [disabled, editor, onSubmit, onComposerSubmit]\n );\n\n useLayoutEffect(() => {\n setIsEditorEmpty(isEmpty(editor, editor.children));\n }, [editor]);\n\n const handleEditorValueChange = useCallback(() => {\n setIsEditorEmpty(isEmpty(editor, editor.children));\n }, [editor]);\n\n const requestFormSubmit = useCallback(() => {\n if (isEmpty(editor, editor.children)) return;\n\n if (attachments.some((attachment) => attachment.status === \"uploading\")) {\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 === null) return;\n if (typeof formRef.current.requestSubmit === \"function\") {\n return formRef.current.requestSubmit();\n }\n const submitter = document.createElement(\"input\");\n submitter.type = \"submit\";\n submitter.hidden = true;\n formRef.current.appendChild(submitter);\n submitter.click();\n formRef.current.removeChild(submitter);\n });\n }, [editor, attachments]);\n\n const handleAttachFiles = useCallback(() => {\n if (disabled) return;\n fileInputRef.current?.click();\n }, [disabled]);\n\n const handleRemoveAttachment = useCallback((id: string) => {\n setAttachments((attachments) =>\n attachments.filter((attachment) => attachment.id !== id)\n );\n }, []);\n\n useImperativeHandle<HTMLFormElement | null, HTMLFormElement | null>(\n forwardedRef,\n () => formRef.current,\n []\n );\n\n const client = useClient();\n\n return (\n <ComposerContext.Provider\n value={{\n chatId,\n editor,\n onEditorValueChange: handleEditorValueChange,\n isEditorEmpty,\n requestFormSubmit,\n disabled: disabled || false,\n attachments,\n onAttachFiles: handleAttachFiles,\n onRemoveAttachment: handleRemoveAttachment,\n numOfAttachments: attachments.length,\n }}\n >\n <form onSubmit={handleSubmit} {...props} ref={formRef} />\n <input\n type=\"file\"\n multiple\n accept=\"image/png, image/jpeg\"\n ref={fileInputRef}\n onClick={(event) => {\n event.stopPropagation();\n }}\n onChange={function (event) {\n if (disabled) return;\n\n if (event.target.files === null) return;\n if (event.target.files.length === 0) return;\n\n for (const file of Array.from(event.target.files).slice(\n 0,\n MAX_ATTACHMENTS - attachments.length\n )) {\n const id = `at_${nanoid()}`;\n if (file.size > MAX_ATTACHMENT_SIZE) {\n setAttachments((attachments) => [\n ...attachments,\n {\n id,\n file,\n status: \"error\",\n error: new AttachmentTooLargeError(\"File is too large.\"),\n },\n ]);\n continue;\n }\n\n setAttachments((attachments) => [\n ...attachments,\n {\n id,\n file,\n status: \"uploading\",\n },\n ]);\n\n client[kInternal].httpClient\n .uploadChatAttachment({\n chatId,\n attachment: {\n id,\n file,\n },\n })\n .then(() => {\n setAttachments((attachments) =>\n attachments.map((attachment) =>\n attachment.id === id\n ? { ...attachment, status: \"uploaded\" }\n : attachment\n )\n );\n })\n .catch((error) => {\n if (error instanceof Error) {\n setAttachments((attachments) =>\n attachments.map((attachment) =>\n attachment.id === id\n ? {\n ...attachment,\n status: \"error\",\n error:\n error instanceof HttpError &&\n error.status === 413\n ? new AttachmentTooLargeError(\n \"File is too large\"\n )\n : error,\n }\n : attachment\n )\n );\n }\n });\n }\n\n event.target.value = \"\";\n }}\n tabIndex={-1}\n style={{ display: \"none\" }}\n />\n </ComposerContext.Provider>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Editor\n * -----------------------------------------------------------------------------------------------*/\nexport type EditorProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"defaultValue\"\n> & {\n /**\n * The editor's initial value.\n */\n defaultValue?: string;\n /**\n * The text to display when the editor is empty.\n */\n placeholder?: string;\n /**\n * Whether the editor is disabled.\n */\n disabled?: boolean;\n /**\n * Whether to focus the editor on mount.\n */\n autoFocus?: boolean;\n};\n\n/**\n * Displays the chat composer's editor.\n *\n * @example\n * <Editor placeholder=\"Write a message…\" />\n */\nexport const Editor = forwardRef<HTMLDivElement, EditorProps>(\n (\n { defaultValue = \"\", onKeyDown, disabled, autoFocus, ...props },\n forwardedRef\n ) => {\n const context = useContext(ComposerContext);\n if (context === null) {\n throw new Error(\"Editor must be a descendant of Form.\");\n }\n\n const {\n editor,\n onEditorValueChange,\n requestFormSubmit,\n disabled: isFormDisabled,\n } = context;\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 requestFormSubmit();\n } else if (event.key === \"Enter\" && event.shiftKey) {\n event.preventDefault();\n editor.insertBreak();\n }\n },\n [editor, onKeyDown, requestFormSubmit]\n );\n\n useImperativeHandle(\n forwardedRef,\n () => ReactEditor.toDOMNode(editor, editor) as HTMLDivElement,\n [editor]\n );\n\n useEffect(() => {\n if (!autoFocus) return;\n\n try {\n if (!ReactEditor.isFocused(editor)) {\n Transforms.select(editor, SlateEditor.end(editor, []));\n ReactEditor.focus(editor);\n }\n } catch {\n // Slate's DOM-specific methods will throw if the editor's DOM node no longer exists. This action doesn't make sense on an unmounted editor so we can safely ignore it.\n }\n }, [editor, autoFocus]);\n\n const initialValue: { type: \"paragraph\"; children: { text: string }[] }[] =\n 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 enterKeyHint=\"send\"\n autoCapitalize=\"sentences\"\n onKeyDown={handleKeyDown}\n data-disabled={disabled || isFormDisabled || undefined}\n {...props}\n readOnly={disabled || isFormDisabled}\n disabled={disabled || isFormDisabled}\n renderPlaceholder={function ({ attributes, children }) {\n const { opacity: _opacity, ...style } = attributes.style;\n return (\n <span {...attributes} style={style} data-placeholder=\"\">\n {children}\n </span>\n );\n }}\n />\n </Slate>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Submit\n * -----------------------------------------------------------------------------------------------*/\nexport type SubmitProps = ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * A button to submit a chat message.\n *\n * @example\n * <ChatComposer.Submit>Send</ChatComposer.Submit>\n */\nexport const Submit = forwardRef<HTMLButtonElement, SubmitProps>(\n ({ disabled, ...props }, forwardedRef) => {\n const context = useContext(ComposerContext);\n if (context === null) {\n throw new Error(\"Submit must be a descendant of Form.\");\n }\n\n const { disabled: isFormDisabled, isEditorEmpty, attachments } = context;\n\n return (\n <button\n type=\"submit\"\n {...props}\n ref={forwardedRef}\n disabled={\n disabled ||\n isFormDisabled ||\n isEditorEmpty ||\n attachments.some((attachment) => attachment.status === \"uploading\")\n }\n />\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * AttachFiles\n * -----------------------------------------------------------------------------------------------*/\nexport type AttachFilesProps = ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * A button which opens a file picker to create attachments.\n *\n * @example\n * <Composer.AttachFiles>Attach files</Composer.AttachFiles>\n */\nexport const AttachFiles = forwardRef<HTMLButtonElement, AttachFilesProps>(\n ({ onClick, disabled, ...props }, forwardedRef) => {\n const context = useContext(ComposerContext);\n if (context === null) {\n throw new Error(\"AttachFiles must be a descendant of Form.\");\n }\n\n const {\n disabled: isFormDisabled,\n onAttachFiles,\n numOfAttachments,\n } = context;\n\n return (\n <button\n type=\"button\"\n {...props}\n onClick={function (event) {\n onClick?.(event);\n if (event.isDefaultPrevented()) return;\n onAttachFiles();\n }}\n onPointerDown={(event) => event.preventDefault()}\n ref={forwardedRef}\n disabled={\n isFormDisabled || disabled || numOfAttachments >= MAX_ATTACHMENTS\n }\n />\n );\n }\n);\n"],"names":["SlateEditor","attachments"],"mappings":"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"}
@@ -1,99 +0,0 @@
1
- 'use strict';
2
-
3
- var jsxRuntime = require('react/jsx-runtime');
4
- var react = require('react');
5
-
6
- const RootContext = react.createContext(null);
7
- const Root = react.forwardRef(function Root2({ open, onOpenChange, disabled = false, ...props }, forwardedRef) {
8
- const id = react.useId();
9
- return /* @__PURE__ */ jsxRuntime.jsx(RootContext.Provider, {
10
- value: { open, onOpenChange, disabled, contentId: id },
11
- children: /* @__PURE__ */ jsxRuntime.jsx("div", {
12
- ...props,
13
- ref: forwardedRef,
14
- "data-state": open ? "open" : "closed",
15
- "data-disabled": disabled ? "" : void 0
16
- })
17
- });
18
- });
19
- const Trigger = react.forwardRef(
20
- function Trigger2({ onClick, ...props }, forwardedRef) {
21
- const context = react.useContext(RootContext);
22
- if (!context) {
23
- throw new Error("Collapsible.Trigger must be a descendant of Root");
24
- }
25
- const { open, disabled, contentId, onOpenChange } = context;
26
- return /* @__PURE__ */ jsxRuntime.jsx("button", {
27
- ...props,
28
- ref: forwardedRef,
29
- type: "button",
30
- "aria-controls": contentId,
31
- "aria-expanded": open || false,
32
- "data-state": open ? "open" : "closed",
33
- "data-disabled": disabled ? "" : void 0,
34
- disabled,
35
- onClick: (event) => {
36
- onClick?.(event);
37
- if (event.defaultPrevented)
38
- return;
39
- if (disabled)
40
- return;
41
- onOpenChange(!open);
42
- }
43
- });
44
- }
45
- );
46
- const Content = react.forwardRef(
47
- function Content2(props, forwardedRef) {
48
- const rootContext = react.useContext(RootContext);
49
- const divRef = react.useRef(null);
50
- if (!rootContext)
51
- throw new Error("Missing RootContext Provider");
52
- const { open, onOpenChange, disabled, contentId } = rootContext;
53
- react.useEffect(() => {
54
- const element = divRef.current;
55
- if (element === null)
56
- return;
57
- const isHiddenUntilFoundSupported = "onbeforematch" in document.body;
58
- if (!isHiddenUntilFoundSupported)
59
- return;
60
- function handleBeforeMatch() {
61
- onOpenChange(true);
62
- }
63
- element.addEventListener("beforematch", handleBeforeMatch);
64
- return () => {
65
- element.removeEventListener("beforematch", handleBeforeMatch);
66
- };
67
- }, [onOpenChange]);
68
- react.useEffect(() => {
69
- const element = divRef.current;
70
- if (element === null)
71
- return;
72
- if (open)
73
- return;
74
- const isHiddenUntilFoundSupported = "onbeforematch" in document.body;
75
- if (!isHiddenUntilFoundSupported)
76
- return;
77
- element.setAttribute("hidden", "until-found");
78
- return () => {
79
- element.removeAttribute("hidden");
80
- };
81
- }, [open]);
82
- react.useImperativeHandle(forwardedRef, () => {
83
- return divRef.current;
84
- }, []);
85
- return /* @__PURE__ */ jsxRuntime.jsx("div", {
86
- ...props,
87
- ref: divRef,
88
- "data-state": open ? "open" : "closed",
89
- "data-disabled": disabled ? "" : void 0,
90
- id: contentId,
91
- hidden: !open
92
- });
93
- }
94
- );
95
-
96
- exports.Content = Content;
97
- exports.Root = Root;
98
- exports.Trigger = Trigger;
99
- //# sourceMappingURL=Collapsible.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Collapsible.cjs","sources":["../../../src/primitives/internal/Collapsible.tsx"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\nimport {\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useId,\n useImperativeHandle,\n useRef,\n} from \"react\";\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\nconst RootContext = createContext<{\n open: boolean;\n onOpenChange(open: boolean): void;\n\n disabled: boolean;\n contentId: string;\n} | null>(null);\n\nexport interface RootProps extends HTMLAttributes<HTMLDivElement> {\n open: boolean;\n onOpenChange(open: boolean): void;\n disabled?: boolean;\n}\n\nexport const Root = forwardRef<HTMLDivElement, RootProps>(function Root(\n { open, onOpenChange, disabled = false, ...props },\n forwardedRef\n) {\n const id = useId();\n\n return (\n <RootContext.Provider\n value={{ open, onOpenChange, disabled, contentId: id }}\n >\n <div\n {...props}\n ref={forwardedRef}\n data-state={open ? \"open\" : \"closed\"}\n data-disabled={disabled ? \"\" : undefined}\n />\n </RootContext.Provider>\n );\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Trigger\n * -----------------------------------------------------------------------------------------------*/\ninterface TriggerProps extends HTMLAttributes<HTMLButtonElement> {}\n\nexport const Trigger = forwardRef<HTMLButtonElement, TriggerProps>(\n function Trigger({ onClick, ...props }, forwardedRef) {\n const context = useContext(RootContext);\n\n if (!context) {\n throw new Error(\"Collapsible.Trigger must be a descendant of Root\");\n }\n\n const { open, disabled, contentId, onOpenChange } = context;\n\n return (\n <button\n {...props}\n ref={forwardedRef}\n type=\"button\"\n aria-controls={contentId}\n aria-expanded={open || false}\n data-state={open ? \"open\" : \"closed\"}\n data-disabled={disabled ? \"\" : undefined}\n disabled={disabled}\n onClick={(event) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n if (disabled) return;\n onOpenChange(!open);\n }}\n />\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Content\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ContentProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const Content = forwardRef<HTMLDivElement, ContentProps>(\n function Content(props, forwardedRef) {\n const rootContext = useContext(RootContext);\n const divRef = useRef<HTMLDivElement>(null);\n\n if (!rootContext) throw new Error(\"Missing RootContext Provider\");\n\n const { open, onOpenChange, disabled, contentId } = rootContext;\n\n useEffect(() => {\n const element = divRef.current;\n if (element === null) return;\n\n const isHiddenUntilFoundSupported = \"onbeforematch\" in document.body;\n if (!isHiddenUntilFoundSupported) return;\n\n function handleBeforeMatch() {\n onOpenChange(true);\n }\n\n // https://developer.chrome.com/articles/hidden-until-found/\n element.addEventListener(\"beforematch\", handleBeforeMatch);\n return () => {\n element.removeEventListener(\"beforematch\", handleBeforeMatch);\n };\n }, [onOpenChange]);\n\n // Passing `string` to `hidden` in JSX is not currently supported: https://github.com/facebook/react/issues/24740\n useEffect(() => {\n const element = divRef.current;\n if (element === null) return;\n\n if (open) return;\n\n const isHiddenUntilFoundSupported = \"onbeforematch\" in document.body;\n if (!isHiddenUntilFoundSupported) return;\n\n element.setAttribute(\"hidden\", \"until-found\");\n return () => {\n element.removeAttribute(\"hidden\");\n };\n }, [open]);\n\n useImperativeHandle<\n HTMLDivElement | null,\n HTMLDivElement | null\n >(forwardedRef, () => {\n return divRef.current;\n }, []);\n\n return (\n <div\n {...props}\n ref={divRef}\n data-state={open ? \"open\" : \"closed\"}\n data-disabled={disabled ? \"\" : undefined}\n id={contentId}\n hidden={!open}\n />\n );\n }\n);\n"],"names":["createContext","forwardRef","Root","useId","jsx","Trigger","useContext","Content","useRef","useEffect","useImperativeHandle"],"mappings":";;;;;AAeA,MAAM,WAAA,GAAcA,oBAMV,IAAI,CAAA,CAAA;AAQD,MAAA,IAAA,GAAOC,gBAAsC,CAAA,SAASC,KACjE,CAAA,EAAE,IAAM,EAAA,YAAA,EAAc,QAAW,GAAA,KAAA,EAAA,GAAU,KAAM,EAAA,EACjD,YACA,EAAA;AACA,EAAA,MAAM,KAAKC,WAAM,EAAA,CAAA;AAEjB,EACE,uBAAAC,cAAA,CAAC,YAAY,QAAZ,EAAA;AAAA,IACC,OAAO,EAAE,IAAA,EAAM,YAAc,EAAA,QAAA,EAAU,WAAW,EAAG,EAAA;AAAA,IAErD,QAAC,kBAAAA,cAAA,CAAA,KAAA,EAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,GAAK,EAAA,YAAA;AAAA,MACL,YAAA,EAAY,OAAO,MAAS,GAAA,QAAA;AAAA,MAC5B,eAAA,EAAe,WAAW,EAAK,GAAA,KAAA,CAAA;AAAA,KACjC,CAAA;AAAA,GACF,CAAA,CAAA;AAEJ,CAAC,EAAA;AAOM,MAAM,OAAU,GAAAH,gBAAA;AAAA,EACrB,SAASI,QAAQ,CAAA,EAAE,OAAY,EAAA,GAAA,KAAA,IAAS,YAAc,EAAA;AACpD,IAAM,MAAA,OAAA,GAAUC,iBAAW,WAAW,CAAA,CAAA;AAEtC,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAM,MAAA,IAAI,MAAM,kDAAkD,CAAA,CAAA;AAAA,KACpE;AAEA,IAAA,MAAM,EAAE,IAAA,EAAM,QAAU,EAAA,SAAA,EAAW,cAAiB,GAAA,OAAA,CAAA;AAEpD,IAAA,uBACGF,cAAA,CAAA,QAAA,EAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,GAAK,EAAA,YAAA;AAAA,MACL,IAAK,EAAA,QAAA;AAAA,MACL,eAAe,EAAA,SAAA;AAAA,MACf,iBAAe,IAAQ,IAAA,KAAA;AAAA,MACvB,YAAA,EAAY,OAAO,MAAS,GAAA,QAAA;AAAA,MAC5B,eAAA,EAAe,WAAW,EAAK,GAAA,KAAA,CAAA;AAAA,MAC/B,QAAA;AAAA,MACA,OAAA,EAAS,CAAC,KAAU,KAAA;AAClB,QAAA,OAAA,GAAU,KAAK,CAAA,CAAA;AACf,QAAA,IAAI,KAAM,CAAA,gBAAA;AAAkB,UAAA,OAAA;AAC5B,QAAI,IAAA,QAAA;AAAU,UAAA,OAAA;AACd,QAAA,YAAA,CAAa,CAAC,IAAI,CAAA,CAAA;AAAA,OACpB;AAAA,KACF,CAAA,CAAA;AAAA,GAEJ;AACF,EAAA;AAQO,MAAM,OAAU,GAAAH,gBAAA;AAAA,EACrB,SAASM,QAAQ,CAAA,KAAA,EAAO,YAAc,EAAA;AACpC,IAAM,MAAA,WAAA,GAAcD,iBAAW,WAAW,CAAA,CAAA;AAC1C,IAAM,MAAA,MAAA,GAASE,aAAuB,IAAI,CAAA,CAAA;AAE1C,IAAA,IAAI,CAAC,WAAA;AAAa,MAAM,MAAA,IAAI,MAAM,8BAA8B,CAAA,CAAA;AAEhE,IAAA,MAAM,EAAE,IAAA,EAAM,YAAc,EAAA,QAAA,EAAU,WAAc,GAAA,WAAA,CAAA;AAEpD,IAAAC,eAAA,CAAU,MAAM;AACd,MAAA,MAAM,UAAU,MAAO,CAAA,OAAA,CAAA;AACvB,MAAA,IAAI,OAAY,KAAA,IAAA;AAAM,QAAA,OAAA;AAEtB,MAAM,MAAA,2BAAA,GAA8B,mBAAmB,QAAS,CAAA,IAAA,CAAA;AAChE,MAAA,IAAI,CAAC,2BAAA;AAA6B,QAAA,OAAA;AAElC,MAAA,SAAS,iBAAoB,GAAA;AAC3B,QAAA,YAAA,CAAa,IAAI,CAAA,CAAA;AAAA,OACnB;AAGA,MAAQ,OAAA,CAAA,gBAAA,CAAiB,eAAe,iBAAiB,CAAA,CAAA;AACzD,MAAA,OAAO,MAAM;AACX,QAAQ,OAAA,CAAA,mBAAA,CAAoB,eAAe,iBAAiB,CAAA,CAAA;AAAA,OAC9D,CAAA;AAAA,KACF,EAAG,CAAC,YAAY,CAAC,CAAA,CAAA;AAGjB,IAAAA,eAAA,CAAU,MAAM;AACd,MAAA,MAAM,UAAU,MAAO,CAAA,OAAA,CAAA;AACvB,MAAA,IAAI,OAAY,KAAA,IAAA;AAAM,QAAA,OAAA;AAEtB,MAAI,IAAA,IAAA;AAAM,QAAA,OAAA;AAEV,MAAM,MAAA,2BAAA,GAA8B,mBAAmB,QAAS,CAAA,IAAA,CAAA;AAChE,MAAA,IAAI,CAAC,2BAAA;AAA6B,QAAA,OAAA;AAElC,MAAQ,OAAA,CAAA,YAAA,CAAa,UAAU,aAAa,CAAA,CAAA;AAC5C,MAAA,OAAO,MAAM;AACX,QAAA,OAAA,CAAQ,gBAAgB,QAAQ,CAAA,CAAA;AAAA,OAClC,CAAA;AAAA,KACF,EAAG,CAAC,IAAI,CAAC,CAAA,CAAA;AAET,IAAAC,yBAAA,CAGE,cAAc,MAAM;AACpB,MAAA,OAAO,MAAO,CAAA,OAAA,CAAA;AAAA,KAChB,EAAG,EAAE,CAAA,CAAA;AAEL,IAAA,uBACGN,cAAA,CAAA,KAAA,EAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,GAAK,EAAA,MAAA;AAAA,MACL,YAAA,EAAY,OAAO,MAAS,GAAA,QAAA;AAAA,MAC5B,eAAA,EAAe,WAAW,EAAK,GAAA,KAAA,CAAA;AAAA,MAC/B,EAAI,EAAA,SAAA;AAAA,MACJ,QAAQ,CAAC,IAAA;AAAA,KACX,CAAA,CAAA;AAAA,GAEJ;AACF;;;;;;"}
@@ -1,95 +0,0 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import { createContext, forwardRef, useId, useContext, useRef, useEffect, useImperativeHandle } from 'react';
3
-
4
- const RootContext = createContext(null);
5
- const Root = forwardRef(function Root2({ open, onOpenChange, disabled = false, ...props }, forwardedRef) {
6
- const id = useId();
7
- return /* @__PURE__ */ jsx(RootContext.Provider, {
8
- value: { open, onOpenChange, disabled, contentId: id },
9
- children: /* @__PURE__ */ jsx("div", {
10
- ...props,
11
- ref: forwardedRef,
12
- "data-state": open ? "open" : "closed",
13
- "data-disabled": disabled ? "" : void 0
14
- })
15
- });
16
- });
17
- const Trigger = forwardRef(
18
- function Trigger2({ onClick, ...props }, forwardedRef) {
19
- const context = useContext(RootContext);
20
- if (!context) {
21
- throw new Error("Collapsible.Trigger must be a descendant of Root");
22
- }
23
- const { open, disabled, contentId, onOpenChange } = context;
24
- return /* @__PURE__ */ jsx("button", {
25
- ...props,
26
- ref: forwardedRef,
27
- type: "button",
28
- "aria-controls": contentId,
29
- "aria-expanded": open || false,
30
- "data-state": open ? "open" : "closed",
31
- "data-disabled": disabled ? "" : void 0,
32
- disabled,
33
- onClick: (event) => {
34
- onClick?.(event);
35
- if (event.defaultPrevented)
36
- return;
37
- if (disabled)
38
- return;
39
- onOpenChange(!open);
40
- }
41
- });
42
- }
43
- );
44
- const Content = forwardRef(
45
- function Content2(props, forwardedRef) {
46
- const rootContext = useContext(RootContext);
47
- const divRef = useRef(null);
48
- if (!rootContext)
49
- throw new Error("Missing RootContext Provider");
50
- const { open, onOpenChange, disabled, contentId } = rootContext;
51
- useEffect(() => {
52
- const element = divRef.current;
53
- if (element === null)
54
- return;
55
- const isHiddenUntilFoundSupported = "onbeforematch" in document.body;
56
- if (!isHiddenUntilFoundSupported)
57
- return;
58
- function handleBeforeMatch() {
59
- onOpenChange(true);
60
- }
61
- element.addEventListener("beforematch", handleBeforeMatch);
62
- return () => {
63
- element.removeEventListener("beforematch", handleBeforeMatch);
64
- };
65
- }, [onOpenChange]);
66
- useEffect(() => {
67
- const element = divRef.current;
68
- if (element === null)
69
- return;
70
- if (open)
71
- return;
72
- const isHiddenUntilFoundSupported = "onbeforematch" in document.body;
73
- if (!isHiddenUntilFoundSupported)
74
- return;
75
- element.setAttribute("hidden", "until-found");
76
- return () => {
77
- element.removeAttribute("hidden");
78
- };
79
- }, [open]);
80
- useImperativeHandle(forwardedRef, () => {
81
- return divRef.current;
82
- }, []);
83
- return /* @__PURE__ */ jsx("div", {
84
- ...props,
85
- ref: divRef,
86
- "data-state": open ? "open" : "closed",
87
- "data-disabled": disabled ? "" : void 0,
88
- id: contentId,
89
- hidden: !open
90
- });
91
- }
92
- );
93
-
94
- export { Content, Root, Trigger };
95
- //# sourceMappingURL=Collapsible.js.map