@liveblocks/react-ui 3.9.1 → 3.9.2-tiptap1

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 (451) hide show
  1. package/dist/components/AiChat.cjs +133 -113
  2. package/dist/components/AiChat.cjs.map +1 -1
  3. package/dist/components/AiChat.js +133 -113
  4. package/dist/components/AiChat.js.map +1 -1
  5. package/dist/components/AiTool.cjs +120 -93
  6. package/dist/components/AiTool.cjs.map +1 -1
  7. package/dist/components/AiTool.js +120 -93
  8. package/dist/components/AiTool.js.map +1 -1
  9. package/dist/components/Comment.cjs +374 -374
  10. package/dist/components/Comment.cjs.map +1 -1
  11. package/dist/components/Comment.js +374 -374
  12. package/dist/components/Comment.js.map +1 -1
  13. package/dist/components/Composer.cjs +208 -259
  14. package/dist/components/Composer.cjs.map +1 -1
  15. package/dist/components/Composer.js +208 -259
  16. package/dist/components/Composer.js.map +1 -1
  17. package/dist/components/HistoryVersionSummary.cjs +28 -25
  18. package/dist/components/HistoryVersionSummary.cjs.map +1 -1
  19. package/dist/components/HistoryVersionSummary.js +28 -25
  20. package/dist/components/HistoryVersionSummary.js.map +1 -1
  21. package/dist/components/HistoryVersionSummaryList.cjs +9 -9
  22. package/dist/components/HistoryVersionSummaryList.cjs.map +1 -1
  23. package/dist/components/HistoryVersionSummaryList.js +9 -9
  24. package/dist/components/HistoryVersionSummaryList.js.map +1 -1
  25. package/dist/components/InboxNotification.cjs +264 -239
  26. package/dist/components/InboxNotification.cjs.map +1 -1
  27. package/dist/components/InboxNotification.js +264 -239
  28. package/dist/components/InboxNotification.js.map +1 -1
  29. package/dist/components/InboxNotificationList.cjs +19 -19
  30. package/dist/components/InboxNotificationList.cjs.map +1 -1
  31. package/dist/components/InboxNotificationList.js +19 -19
  32. package/dist/components/InboxNotificationList.js.map +1 -1
  33. package/dist/components/Thread.cjs +102 -82
  34. package/dist/components/Thread.cjs.map +1 -1
  35. package/dist/components/Thread.js +102 -82
  36. package/dist/components/Thread.js.map +1 -1
  37. package/dist/components/internal/AiChatAssistantMessage.cjs +164 -210
  38. package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
  39. package/dist/components/internal/AiChatAssistantMessage.js +164 -210
  40. package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
  41. package/dist/components/internal/AiChatUserMessage.cjs +29 -26
  42. package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
  43. package/dist/components/internal/AiChatUserMessage.js +29 -26
  44. package/dist/components/internal/AiChatUserMessage.js.map +1 -1
  45. package/dist/components/internal/AiComposer.cjs +37 -53
  46. package/dist/components/internal/AiComposer.cjs.map +1 -1
  47. package/dist/components/internal/AiComposer.js +37 -53
  48. package/dist/components/internal/AiComposer.js.map +1 -1
  49. package/dist/components/internal/Attachment.cjs +170 -181
  50. package/dist/components/internal/Attachment.cjs.map +1 -1
  51. package/dist/components/internal/Attachment.js +170 -181
  52. package/dist/components/internal/Attachment.js.map +1 -1
  53. package/dist/components/internal/Attribution.cjs +27 -18
  54. package/dist/components/internal/Attribution.cjs.map +1 -1
  55. package/dist/components/internal/Attribution.js +27 -18
  56. package/dist/components/internal/Attribution.js.map +1 -1
  57. package/dist/components/internal/Avatar.cjs +30 -32
  58. package/dist/components/internal/Avatar.cjs.map +1 -1
  59. package/dist/components/internal/Avatar.js +30 -32
  60. package/dist/components/internal/Avatar.js.map +1 -1
  61. package/dist/components/internal/Button.cjs +34 -47
  62. package/dist/components/internal/Button.cjs.map +1 -1
  63. package/dist/components/internal/Button.js +34 -47
  64. package/dist/components/internal/Button.js.map +1 -1
  65. package/dist/components/internal/CodeBlock.cjs +15 -34
  66. package/dist/components/internal/CodeBlock.cjs.map +1 -1
  67. package/dist/components/internal/CodeBlock.js +15 -34
  68. package/dist/components/internal/CodeBlock.js.map +1 -1
  69. package/dist/components/internal/Dropdown.cjs +37 -37
  70. package/dist/components/internal/Dropdown.cjs.map +1 -1
  71. package/dist/components/internal/Dropdown.js +37 -37
  72. package/dist/components/internal/Dropdown.js.map +1 -1
  73. package/dist/components/internal/Emoji.cjs +16 -13
  74. package/dist/components/internal/Emoji.cjs.map +1 -1
  75. package/dist/components/internal/Emoji.js +16 -13
  76. package/dist/components/internal/Emoji.js.map +1 -1
  77. package/dist/components/internal/EmojiPicker.cjs +61 -102
  78. package/dist/components/internal/EmojiPicker.cjs.map +1 -1
  79. package/dist/components/internal/EmojiPicker.js +61 -102
  80. package/dist/components/internal/EmojiPicker.js.map +1 -1
  81. package/dist/components/internal/Favicon.cjs +1 -10
  82. package/dist/components/internal/Favicon.cjs.map +1 -1
  83. package/dist/components/internal/Favicon.js +1 -10
  84. package/dist/components/internal/Favicon.js.map +1 -1
  85. package/dist/components/internal/Group.cjs +12 -9
  86. package/dist/components/internal/Group.cjs.map +1 -1
  87. package/dist/components/internal/Group.js +12 -9
  88. package/dist/components/internal/Group.js.map +1 -1
  89. package/dist/components/internal/GroupDescription.cjs +1 -5
  90. package/dist/components/internal/GroupDescription.cjs.map +1 -1
  91. package/dist/components/internal/GroupDescription.js +1 -5
  92. package/dist/components/internal/GroupDescription.js.map +1 -1
  93. package/dist/components/internal/Icon.cjs +18 -15
  94. package/dist/components/internal/Icon.cjs.map +1 -1
  95. package/dist/components/internal/Icon.js +18 -15
  96. package/dist/components/internal/Icon.js.map +1 -1
  97. package/dist/components/internal/InboxNotificationThread.cjs +38 -50
  98. package/dist/components/internal/InboxNotificationThread.cjs.map +1 -1
  99. package/dist/components/internal/InboxNotificationThread.js +38 -50
  100. package/dist/components/internal/InboxNotificationThread.js.map +1 -1
  101. package/dist/components/internal/List.cjs +9 -6
  102. package/dist/components/internal/List.cjs.map +1 -1
  103. package/dist/components/internal/List.js +9 -6
  104. package/dist/components/internal/List.js.map +1 -1
  105. package/dist/components/internal/Prose.cjs +7 -14
  106. package/dist/components/internal/Prose.cjs.map +1 -1
  107. package/dist/components/internal/Prose.js +7 -14
  108. package/dist/components/internal/Prose.js.map +1 -1
  109. package/dist/components/internal/Room.cjs +9 -6
  110. package/dist/components/internal/Room.cjs.map +1 -1
  111. package/dist/components/internal/Room.js +9 -6
  112. package/dist/components/internal/Room.js.map +1 -1
  113. package/dist/components/internal/Tooltip.cjs +43 -56
  114. package/dist/components/internal/Tooltip.cjs.map +1 -1
  115. package/dist/components/internal/Tooltip.js +43 -56
  116. package/dist/components/internal/Tooltip.js.map +1 -1
  117. package/dist/components/internal/User.cjs +12 -9
  118. package/dist/components/internal/User.cjs.map +1 -1
  119. package/dist/components/internal/User.js +12 -9
  120. package/dist/components/internal/User.js.map +1 -1
  121. package/dist/components.cjs +1 -4
  122. package/dist/components.cjs.map +1 -1
  123. package/dist/components.js +1 -4
  124. package/dist/components.js.map +1 -1
  125. package/dist/config.cjs +1 -10
  126. package/dist/config.cjs.map +1 -1
  127. package/dist/config.js +1 -10
  128. package/dist/config.js.map +1 -1
  129. package/dist/icons/ArrowCornerDownRight.cjs +1 -6
  130. package/dist/icons/ArrowCornerDownRight.cjs.map +1 -1
  131. package/dist/icons/ArrowCornerDownRight.js +1 -6
  132. package/dist/icons/ArrowCornerDownRight.js.map +1 -1
  133. package/dist/icons/ArrowCornerUpRight.cjs +1 -6
  134. package/dist/icons/ArrowCornerUpRight.cjs.map +1 -1
  135. package/dist/icons/ArrowCornerUpRight.js +1 -6
  136. package/dist/icons/ArrowCornerUpRight.js.map +1 -1
  137. package/dist/icons/ArrowDown.cjs +1 -6
  138. package/dist/icons/ArrowDown.cjs.map +1 -1
  139. package/dist/icons/ArrowDown.js +1 -6
  140. package/dist/icons/ArrowDown.js.map +1 -1
  141. package/dist/icons/ArrowUp.cjs +1 -6
  142. package/dist/icons/ArrowUp.cjs.map +1 -1
  143. package/dist/icons/ArrowUp.js +1 -6
  144. package/dist/icons/ArrowUp.js.map +1 -1
  145. package/dist/icons/Attachment.cjs +1 -6
  146. package/dist/icons/Attachment.cjs.map +1 -1
  147. package/dist/icons/Attachment.js +1 -6
  148. package/dist/icons/Attachment.js.map +1 -1
  149. package/dist/icons/Bell.cjs +1 -6
  150. package/dist/icons/Bell.cjs.map +1 -1
  151. package/dist/icons/Bell.js +1 -6
  152. package/dist/icons/Bell.js.map +1 -1
  153. package/dist/icons/BellCrossed.cjs +1 -6
  154. package/dist/icons/BellCrossed.cjs.map +1 -1
  155. package/dist/icons/BellCrossed.js +1 -6
  156. package/dist/icons/BellCrossed.js.map +1 -1
  157. package/dist/icons/Blockquote.cjs +1 -6
  158. package/dist/icons/Blockquote.cjs.map +1 -1
  159. package/dist/icons/Blockquote.js +1 -6
  160. package/dist/icons/Blockquote.js.map +1 -1
  161. package/dist/icons/Bold.cjs +1 -6
  162. package/dist/icons/Bold.cjs.map +1 -1
  163. package/dist/icons/Bold.js +1 -6
  164. package/dist/icons/Bold.js.map +1 -1
  165. package/dist/icons/Check.cjs +1 -6
  166. package/dist/icons/Check.cjs.map +1 -1
  167. package/dist/icons/Check.js +1 -6
  168. package/dist/icons/Check.js.map +1 -1
  169. package/dist/icons/CheckCircle.cjs +4 -13
  170. package/dist/icons/CheckCircle.cjs.map +1 -1
  171. package/dist/icons/CheckCircle.js +4 -13
  172. package/dist/icons/CheckCircle.js.map +1 -1
  173. package/dist/icons/CheckCircleFill.cjs +4 -15
  174. package/dist/icons/CheckCircleFill.cjs.map +1 -1
  175. package/dist/icons/CheckCircleFill.js +4 -15
  176. package/dist/icons/CheckCircleFill.js.map +1 -1
  177. package/dist/icons/ChevronDown.cjs +1 -6
  178. package/dist/icons/ChevronDown.cjs.map +1 -1
  179. package/dist/icons/ChevronDown.js +1 -6
  180. package/dist/icons/ChevronDown.js.map +1 -1
  181. package/dist/icons/ChevronLeft.cjs +1 -6
  182. package/dist/icons/ChevronLeft.cjs.map +1 -1
  183. package/dist/icons/ChevronLeft.js +1 -6
  184. package/dist/icons/ChevronLeft.js.map +1 -1
  185. package/dist/icons/ChevronRight.cjs +1 -6
  186. package/dist/icons/ChevronRight.cjs.map +1 -1
  187. package/dist/icons/ChevronRight.js +1 -6
  188. package/dist/icons/ChevronRight.js.map +1 -1
  189. package/dist/icons/ChevronUp.cjs +1 -6
  190. package/dist/icons/ChevronUp.cjs.map +1 -1
  191. package/dist/icons/ChevronUp.js +1 -6
  192. package/dist/icons/ChevronUp.js.map +1 -1
  193. package/dist/icons/Code.cjs +1 -6
  194. package/dist/icons/Code.cjs.map +1 -1
  195. package/dist/icons/Code.js +1 -6
  196. package/dist/icons/Code.js.map +1 -1
  197. package/dist/icons/Comment.cjs +1 -6
  198. package/dist/icons/Comment.cjs.map +1 -1
  199. package/dist/icons/Comment.js +1 -6
  200. package/dist/icons/Comment.js.map +1 -1
  201. package/dist/icons/Copy.cjs +4 -15
  202. package/dist/icons/Copy.cjs.map +1 -1
  203. package/dist/icons/Copy.js +4 -15
  204. package/dist/icons/Copy.js.map +1 -1
  205. package/dist/icons/Cross.cjs +4 -11
  206. package/dist/icons/Cross.cjs.map +1 -1
  207. package/dist/icons/Cross.js +4 -11
  208. package/dist/icons/Cross.js.map +1 -1
  209. package/dist/icons/CrossCircleFill.cjs +4 -15
  210. package/dist/icons/CrossCircleFill.cjs.map +1 -1
  211. package/dist/icons/CrossCircleFill.js +4 -15
  212. package/dist/icons/CrossCircleFill.js.map +1 -1
  213. package/dist/icons/Delete.cjs +1 -6
  214. package/dist/icons/Delete.cjs.map +1 -1
  215. package/dist/icons/Delete.js +1 -6
  216. package/dist/icons/Delete.js.map +1 -1
  217. package/dist/icons/Edit.cjs +1 -6
  218. package/dist/icons/Edit.cjs.map +1 -1
  219. package/dist/icons/Edit.js +1 -6
  220. package/dist/icons/Edit.js.map +1 -1
  221. package/dist/icons/Ellipsis.cjs +5 -21
  222. package/dist/icons/Ellipsis.cjs.map +1 -1
  223. package/dist/icons/Ellipsis.js +5 -21
  224. package/dist/icons/Ellipsis.js.map +1 -1
  225. package/dist/icons/Emoji.cjs +7 -24
  226. package/dist/icons/Emoji.cjs.map +1 -1
  227. package/dist/icons/Emoji.js +7 -24
  228. package/dist/icons/Emoji.js.map +1 -1
  229. package/dist/icons/EmojiPlus.cjs +8 -27
  230. package/dist/icons/EmojiPlus.cjs.map +1 -1
  231. package/dist/icons/EmojiPlus.js +8 -27
  232. package/dist/icons/EmojiPlus.js.map +1 -1
  233. package/dist/icons/Globe.cjs +4 -13
  234. package/dist/icons/Globe.cjs.map +1 -1
  235. package/dist/icons/Globe.js +4 -13
  236. package/dist/icons/Globe.js.map +1 -1
  237. package/dist/icons/H1.cjs +1 -6
  238. package/dist/icons/H1.cjs.map +1 -1
  239. package/dist/icons/H1.js +1 -6
  240. package/dist/icons/H1.js.map +1 -1
  241. package/dist/icons/H2.cjs +1 -6
  242. package/dist/icons/H2.cjs.map +1 -1
  243. package/dist/icons/H2.js +1 -6
  244. package/dist/icons/H2.js.map +1 -1
  245. package/dist/icons/H3.cjs +1 -6
  246. package/dist/icons/H3.cjs.map +1 -1
  247. package/dist/icons/H3.js +1 -6
  248. package/dist/icons/H3.js.map +1 -1
  249. package/dist/icons/Italic.cjs +1 -6
  250. package/dist/icons/Italic.cjs.map +1 -1
  251. package/dist/icons/Italic.js +1 -6
  252. package/dist/icons/Italic.js.map +1 -1
  253. package/dist/icons/Lengthen.cjs +1 -6
  254. package/dist/icons/Lengthen.cjs.map +1 -1
  255. package/dist/icons/Lengthen.js +1 -6
  256. package/dist/icons/Lengthen.js.map +1 -1
  257. package/dist/icons/ListOrdered.cjs +1 -6
  258. package/dist/icons/ListOrdered.cjs.map +1 -1
  259. package/dist/icons/ListOrdered.js +1 -6
  260. package/dist/icons/ListOrdered.js.map +1 -1
  261. package/dist/icons/ListUnordered.cjs +8 -29
  262. package/dist/icons/ListUnordered.cjs.map +1 -1
  263. package/dist/icons/ListUnordered.js +8 -29
  264. package/dist/icons/ListUnordered.js.map +1 -1
  265. package/dist/icons/Mention.cjs +4 -11
  266. package/dist/icons/Mention.cjs.map +1 -1
  267. package/dist/icons/Mention.js +4 -11
  268. package/dist/icons/Mention.js.map +1 -1
  269. package/dist/icons/MinusCircle.cjs +4 -13
  270. package/dist/icons/MinusCircle.cjs.map +1 -1
  271. package/dist/icons/MinusCircle.js +4 -13
  272. package/dist/icons/MinusCircle.js.map +1 -1
  273. package/dist/icons/QuestionMark.cjs +5 -16
  274. package/dist/icons/QuestionMark.cjs.map +1 -1
  275. package/dist/icons/QuestionMark.js +5 -16
  276. package/dist/icons/QuestionMark.js.map +1 -1
  277. package/dist/icons/Redo.cjs +4 -11
  278. package/dist/icons/Redo.cjs.map +1 -1
  279. package/dist/icons/Redo.js +4 -11
  280. package/dist/icons/Redo.js.map +1 -1
  281. package/dist/icons/Restore.cjs +4 -11
  282. package/dist/icons/Restore.cjs.map +1 -1
  283. package/dist/icons/Restore.js +4 -11
  284. package/dist/icons/Restore.js.map +1 -1
  285. package/dist/icons/Retry.cjs +4 -11
  286. package/dist/icons/Retry.cjs.map +1 -1
  287. package/dist/icons/Retry.js +4 -11
  288. package/dist/icons/Retry.js.map +1 -1
  289. package/dist/icons/Search.cjs +1 -6
  290. package/dist/icons/Search.cjs.map +1 -1
  291. package/dist/icons/Search.js +1 -6
  292. package/dist/icons/Search.js.map +1 -1
  293. package/dist/icons/Send.cjs +1 -6
  294. package/dist/icons/Send.cjs.map +1 -1
  295. package/dist/icons/Send.js +1 -6
  296. package/dist/icons/Send.js.map +1 -1
  297. package/dist/icons/Shorten.cjs +1 -6
  298. package/dist/icons/Shorten.cjs.map +1 -1
  299. package/dist/icons/Shorten.js +1 -6
  300. package/dist/icons/Shorten.js.map +1 -1
  301. package/dist/icons/Sparkles.cjs +1 -6
  302. package/dist/icons/Sparkles.cjs.map +1 -1
  303. package/dist/icons/Sparkles.js +1 -6
  304. package/dist/icons/Sparkles.js.map +1 -1
  305. package/dist/icons/SparklesText.cjs +4 -11
  306. package/dist/icons/SparklesText.cjs.map +1 -1
  307. package/dist/icons/SparklesText.js +4 -11
  308. package/dist/icons/SparklesText.js.map +1 -1
  309. package/dist/icons/Spinner.cjs +1 -7
  310. package/dist/icons/Spinner.cjs.map +1 -1
  311. package/dist/icons/Spinner.js +1 -7
  312. package/dist/icons/Spinner.js.map +1 -1
  313. package/dist/icons/Stop.cjs +1 -11
  314. package/dist/icons/Stop.cjs.map +1 -1
  315. package/dist/icons/Stop.js +1 -11
  316. package/dist/icons/Stop.js.map +1 -1
  317. package/dist/icons/Strikethrough.cjs +1 -6
  318. package/dist/icons/Strikethrough.cjs.map +1 -1
  319. package/dist/icons/Strikethrough.js +1 -6
  320. package/dist/icons/Strikethrough.js.map +1 -1
  321. package/dist/icons/Text.cjs +1 -6
  322. package/dist/icons/Text.cjs.map +1 -1
  323. package/dist/icons/Text.js +1 -6
  324. package/dist/icons/Text.js.map +1 -1
  325. package/dist/icons/Translate.cjs +4 -11
  326. package/dist/icons/Translate.cjs.map +1 -1
  327. package/dist/icons/Translate.js +4 -11
  328. package/dist/icons/Translate.js.map +1 -1
  329. package/dist/icons/Underline.cjs +1 -6
  330. package/dist/icons/Underline.cjs.map +1 -1
  331. package/dist/icons/Underline.js +1 -6
  332. package/dist/icons/Underline.js.map +1 -1
  333. package/dist/icons/Undo.cjs +4 -11
  334. package/dist/icons/Undo.cjs.map +1 -1
  335. package/dist/icons/Undo.js +4 -11
  336. package/dist/icons/Undo.js.map +1 -1
  337. package/dist/icons/User.cjs +1 -6
  338. package/dist/icons/User.cjs.map +1 -1
  339. package/dist/icons/User.js +1 -6
  340. package/dist/icons/User.js.map +1 -1
  341. package/dist/icons/Users.cjs +1 -6
  342. package/dist/icons/Users.cjs.map +1 -1
  343. package/dist/icons/Users.js +1 -6
  344. package/dist/icons/Users.js.map +1 -1
  345. package/dist/icons/Warning.cjs +4 -13
  346. package/dist/icons/Warning.cjs.map +1 -1
  347. package/dist/icons/Warning.js +4 -13
  348. package/dist/icons/Warning.js.map +1 -1
  349. package/dist/overrides.cjs +102 -150
  350. package/dist/overrides.cjs.map +1 -1
  351. package/dist/overrides.js +102 -150
  352. package/dist/overrides.js.map +1 -1
  353. package/dist/primitives/AiComposer/index.cjs +77 -65
  354. package/dist/primitives/AiComposer/index.cjs.map +1 -1
  355. package/dist/primitives/AiComposer/index.js +77 -65
  356. package/dist/primitives/AiComposer/index.js.map +1 -1
  357. package/dist/primitives/AiMessage/index.cjs +28 -49
  358. package/dist/primitives/AiMessage/index.cjs.map +1 -1
  359. package/dist/primitives/AiMessage/index.js +28 -49
  360. package/dist/primitives/AiMessage/index.js.map +1 -1
  361. package/dist/primitives/AiMessage/tool-invocation.cjs +5 -5
  362. package/dist/primitives/AiMessage/tool-invocation.cjs.map +1 -1
  363. package/dist/primitives/AiMessage/tool-invocation.js +5 -5
  364. package/dist/primitives/AiMessage/tool-invocation.js.map +1 -1
  365. package/dist/primitives/Collapsible/index.cjs +46 -34
  366. package/dist/primitives/Collapsible/index.cjs.map +1 -1
  367. package/dist/primitives/Collapsible/index.js +46 -34
  368. package/dist/primitives/Collapsible/index.js.map +1 -1
  369. package/dist/primitives/Comment/index.cjs +41 -64
  370. package/dist/primitives/Comment/index.cjs.map +1 -1
  371. package/dist/primitives/Comment/index.js +41 -64
  372. package/dist/primitives/Comment/index.js.map +1 -1
  373. package/dist/primitives/Composer/contexts.cjs.map +1 -1
  374. package/dist/primitives/Composer/contexts.js.map +1 -1
  375. package/dist/primitives/Composer/index.cjs +324 -312
  376. package/dist/primitives/Composer/index.cjs.map +1 -1
  377. package/dist/primitives/Composer/index.js +324 -312
  378. package/dist/primitives/Composer/index.js.map +1 -1
  379. package/dist/primitives/Composer/slate/plugins/auto-links.cjs.map +1 -1
  380. package/dist/primitives/Composer/slate/plugins/auto-links.js.map +1 -1
  381. package/dist/primitives/Composer/slate/plugins/custom-links.cjs.map +1 -1
  382. package/dist/primitives/Composer/slate/plugins/custom-links.js.map +1 -1
  383. package/dist/primitives/Composer/slate/plugins/mentions.cjs +1 -0
  384. package/dist/primitives/Composer/slate/plugins/mentions.cjs.map +1 -1
  385. package/dist/primitives/Composer/slate/plugins/mentions.js +1 -0
  386. package/dist/primitives/Composer/slate/plugins/mentions.js.map +1 -1
  387. package/dist/primitives/Composer/slate/plugins/paste.cjs +1 -0
  388. package/dist/primitives/Composer/slate/plugins/paste.cjs.map +1 -1
  389. package/dist/primitives/Composer/slate/plugins/paste.js +1 -0
  390. package/dist/primitives/Composer/slate/plugins/paste.js.map +1 -1
  391. package/dist/primitives/Composer/utils.cjs +3 -0
  392. package/dist/primitives/Composer/utils.cjs.map +1 -1
  393. package/dist/primitives/Composer/utils.js +3 -0
  394. package/dist/primitives/Composer/utils.js.map +1 -1
  395. package/dist/primitives/Duration.cjs +11 -7
  396. package/dist/primitives/Duration.cjs.map +1 -1
  397. package/dist/primitives/Duration.js +11 -7
  398. package/dist/primitives/Duration.js.map +1 -1
  399. package/dist/primitives/FileSize.cjs +2 -5
  400. package/dist/primitives/FileSize.cjs.map +1 -1
  401. package/dist/primitives/FileSize.js +2 -5
  402. package/dist/primitives/FileSize.js.map +1 -1
  403. package/dist/primitives/Markdown.cjs +80 -188
  404. package/dist/primitives/Markdown.cjs.map +1 -1
  405. package/dist/primitives/Markdown.js +80 -188
  406. package/dist/primitives/Markdown.js.map +1 -1
  407. package/dist/primitives/Timestamp.cjs +12 -7
  408. package/dist/primitives/Timestamp.cjs.map +1 -1
  409. package/dist/primitives/Timestamp.js +12 -7
  410. package/dist/primitives/Timestamp.js.map +1 -1
  411. package/dist/primitives/slate/utils/get-dom-range.cjs.map +1 -1
  412. package/dist/primitives/slate/utils/get-dom-range.js.map +1 -1
  413. package/dist/primitives/slate/utils/get-match-range.cjs.map +1 -1
  414. package/dist/primitives/slate/utils/get-match-range.js.map +1 -1
  415. package/dist/primitives/slate/utils/is-empty.cjs.map +1 -1
  416. package/dist/primitives/slate/utils/is-empty.js.map +1 -1
  417. package/dist/primitives/slate/utils/marks.cjs.map +1 -1
  418. package/dist/primitives/slate/utils/marks.js.map +1 -1
  419. package/dist/shared.cjs.map +1 -1
  420. package/dist/shared.js.map +1 -1
  421. package/dist/utils/ErrorBoundary.cjs +1 -6
  422. package/dist/utils/ErrorBoundary.cjs.map +1 -1
  423. package/dist/utils/ErrorBoundary.js +1 -6
  424. package/dist/utils/ErrorBoundary.js.map +1 -1
  425. package/dist/utils/Persist.cjs +1 -4
  426. package/dist/utils/Persist.cjs.map +1 -1
  427. package/dist/utils/Persist.js +1 -4
  428. package/dist/utils/Persist.js.map +1 -1
  429. package/dist/utils/Portal.cjs +1 -5
  430. package/dist/utils/Portal.cjs.map +1 -1
  431. package/dist/utils/Portal.js +1 -5
  432. package/dist/utils/Portal.js.map +1 -1
  433. package/dist/utils/format-file-size.cjs.map +1 -1
  434. package/dist/utils/format-file-size.js.map +1 -1
  435. package/dist/utils/is-key.cjs.map +1 -1
  436. package/dist/utils/is-key.js.map +1 -1
  437. package/dist/utils/pluralize.cjs.map +1 -1
  438. package/dist/utils/pluralize.js.map +1 -1
  439. package/dist/utils/use-controllable-state.cjs.map +1 -1
  440. package/dist/utils/use-controllable-state.js.map +1 -1
  441. package/dist/utils/use-rerender.cjs +3 -0
  442. package/dist/utils/use-rerender.cjs.map +1 -1
  443. package/dist/utils/use-rerender.js +3 -0
  444. package/dist/utils/use-rerender.js.map +1 -1
  445. package/dist/utils/use-visible.cjs.map +1 -1
  446. package/dist/utils/use-visible.js.map +1 -1
  447. package/dist/version.cjs +1 -1
  448. package/dist/version.cjs.map +1 -1
  449. package/dist/version.js +1 -1
  450. package/dist/version.js.map +1 -1
  451. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"Markdown.js","sources":["../../src/primitives/Markdown.tsx"],"sourcesContent":["import { assertNever, isUrl, type Relax, sanitizeUrl } from \"@liveblocks/core\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport {\n Lexer,\n type MarkedToken,\n type Token as DefaultToken,\n type Tokens,\n} 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\nconst LIST_ITEM_CHECKBOX_REGEX = /^\\[\\s?(x)?\\]?$/i;\nconst PARTIAL_LINK_IMAGE_REGEX =\n /(?<!\\\\)(?<image>!)?\\[(?!\\^)(?<text>[^\\]]*)(?:\\](?:\\((?<url>[^)]*)?)?)?$/;\nconst PARTIAL_TABLE_HEADER_REGEX =\n /^\\s*\\|(?:[^|\\n]+(?:\\|[^|\\n]+)*?)?\\|?\\s*(?:\\n\\s*\\|\\s*[-:|\\s]*\\s*)?$/;\nconst PARTIAL_EMOJI_REGEX =\n /(?:\\u200D|\\uFE0F|\\u20E3|\\p{Regional_Indicator}|\\p{Emoji_Presentation}|\\p{Emoji_Modifier_Base}|\\p{Emoji_Modifier})+$/u;\nconst TRAILING_NON_WHITESPACE_REGEX = /^\\S*/;\nconst WHITESPACE_REGEX = /\\s/;\nconst NEWLINE_REGEX = /\\r\\n?/g;\nconst BUFFERED_CHARACTERS_REGEX =\n /(?<!\\\\)((\\*+|_+|~+|`+|\\++|-{0,2}|={0,2}|\\\\|!|<\\/?)\\s*)$/;\nconst SINGLE_CHARACTER_REGEX = /^\\s*(\\S\\s*)$/;\nconst LEFT_ANGLE_BRACKET_REGEX = /</g;\nconst RIGHT_ANGLE_BRACKET_REGEX = />/g;\nconst AMPERSAND_REGEX = /&(?!#?[0-9A-Za-z]+;)/g;\nconst DEFAULT_PARTIAL_LINK_URL = \"#\";\n\ntype CheckboxToken = {\n type: \"checkbox\";\n checked: boolean;\n raw: string;\n};\n\ntype Token = MarkedToken | CheckboxToken;\n\ntype AnyToken = Token | DefaultToken;\n\ntype PotentiallyPartialToken = Relax<\n | Tokens.Text\n | Tokens.Paragraph\n | Tokens.Heading\n | Tokens.Blockquote\n | Tokens.ListItem\n | Tokens.TableCell\n | Tokens.Code\n>;\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.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 partial?: boolean;\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}>{item.children}</li>\n ))}\n </List>\n );\n },\n Separator: () => {\n return <hr />;\n },\n};\n\nexport const Markdown = forwardRef<HTMLDivElement, MarkdownProps>(\n ({ content, partial, components, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"div\";\n const tokens = useMemo(() => {\n if (!content) {\n return [];\n }\n\n return partial ? tokenizePartial(content) : tokenize(content);\n }, [content, partial]);\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 partial={partial}\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 partial?: boolean;\n }) => {\n return <MarkdownToken token={token} components={components} />;\n },\n (previousProps, nextProps) => {\n const previousToken = previousProps.token;\n const nextToken = nextProps.token;\n\n // 1️⃣ Start with the fastest comparisons\n if (\n previousToken.type !== nextToken.type ||\n previousProps.partial !== nextProps.partial\n ) {\n return false;\n }\n\n let previousContent = previousToken.raw;\n let nextContent = nextToken.raw;\n\n if (\"text\" in previousToken && \"text\" in nextToken) {\n previousContent = previousToken.text;\n nextContent = nextToken.text;\n }\n\n // 2️⃣ Then only compare the tokens' content lengths first\n if (previousContent.length !== nextContent.length) {\n return false;\n }\n\n // 3️⃣ And finally compare the actual tokens' content\n return previousContent === nextContent;\n }\n);\n\nexport function MarkdownToken({\n token,\n components,\n}: {\n token: Token;\n components: Partial<MarkdownComponents> | undefined;\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 =\n token.lang.match(TRAILING_NON_WHITESPACE_REGEX)?.[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 let tokens = item.tokens;\n\n if (item.task) {\n tokens = [\n {\n type: \"checkbox\",\n checked: Boolean(item.checked),\n raw: `[${item.checked ? \"x\" : \" \"}]`,\n },\n ...tokens,\n ];\n }\n\n return {\n checked: item.task ? item.checked : undefined,\n children: (\n <MarkdownTokens\n tokens={tokens}\n components={components}\n normalizeToBlockTokens={\n // A non-loose list item doesn't need to be wrapped in block tokens.\n item.tokens.length > 0 ? item.loose : false\n }\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 \"checkbox\": {\n return (\n <>\n <input type=\"checkbox\" disabled checked={token.checked} />{\" \"}\n </>\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 case \"html\": {\n return parseHtmlEntities(token.text);\n }\n\n default: {\n return null;\n }\n }\n}\n\nfunction MarkdownTokens({\n tokens,\n components,\n normalizeToBlockTokens = false,\n}: {\n tokens: AnyToken[];\n components: Partial<MarkdownComponents> | undefined;\n normalizeToBlockTokens?: boolean;\n}) {\n assertTokens(tokens);\n\n let normalizedTokens: Token[] = [];\n\n if (normalizeToBlockTokens) {\n let leadingCheckboxToken =\n tokens[0]?.type === \"checkbox\" ? tokens[0] : null;\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!;\n\n switch (token.type) {\n case \"text\": {\n const paragraphTextTokens: Tokens.Text[] = [token];\n\n // Wrap consecutive text tokens into a paragraph.\n while (i + 1 < tokens.length && tokens[i + 1]!.type === \"text\") {\n i++;\n paragraphTextTokens.push(tokens[i] as Tokens.Text);\n }\n\n const paragraphRaw = paragraphTextTokens\n .map((text) => text.raw)\n .join(\"\");\n const paragraphText = paragraphTextTokens\n .map((text) => text.text)\n .join(\"\");\n\n // When wrapping loose task list items into paragraphs, we need to\n // move the checkbox into the first paragraph.\n normalizedTokens.push({\n type: \"paragraph\",\n tokens: leadingCheckboxToken\n ? [leadingCheckboxToken, ...paragraphTextTokens]\n : paragraphTextTokens,\n raw: paragraphRaw,\n text: paragraphText,\n } satisfies Tokens.Paragraph);\n leadingCheckboxToken = null;\n\n break;\n }\n\n case \"checkbox\":\n break;\n\n default: {\n normalizedTokens.push(token);\n }\n }\n }\n } else {\n normalizedTokens = tokens;\n }\n\n return normalizedTokens.map((token, index) => (\n <MarkdownToken key={index} token={token} components={components} />\n ));\n}\n\n/**\n * Marked.js' `Token` union type includes a `Generic` token type which is\n * too broad and makes narrowing difficult, we don't use generic/custom tokens\n * so we can assert the `Generic` type away.\n */\nfunction assertTokens(_: AnyToken): asserts _ is Token;\nfunction assertTokens(_: AnyToken[]): asserts _ is Token[];\nfunction assertTokens(_: AnyToken | AnyToken[]): asserts _ is Token | Token[] {}\n\nfunction isBlockToken(\n token: Token | Tokens.Generic\n): token is\n | Tokens.Paragraph\n | Tokens.Heading\n | Tokens.Blockquote\n | Tokens.ListItem {\n return (\n token.type === \"paragraph\" ||\n token.type === \"heading\" ||\n token.type === \"blockquote\" ||\n token.type === \"list_item\"\n );\n}\n\nfunction tokenize(markdown: string) {\n return new Lexer().lex(markdown) as Token[];\n}\n\nfunction tokenizePartial(markdown: string) {\n const preprocessedContent = trimPartialMarkdown(normalizeNewlines(markdown));\n\n const tokens = tokenize(preprocessedContent);\n\n try {\n return completePartialTokens(tokens);\n } catch {\n return tokens;\n }\n}\n\n/**\n * Find the last partial token that we could potentially complete.\n */\nfunction findPotentiallyPartialToken(\n tokens: AnyToken[],\n parentToken?: PotentiallyPartialToken\n): PotentiallyPartialToken | undefined {\n if (tokens.length === 0) {\n return parentToken;\n }\n\n assertTokens(tokens);\n\n const lastIndex = tokens.length - 1;\n let lastToken = tokens[lastIndex]!;\n\n if (lastToken.type === \"space\") {\n const penultimateToken = tokens[lastIndex - 1];\n\n if (!penultimateToken) {\n return parentToken;\n }\n\n lastToken = penultimateToken;\n }\n\n if (lastToken.type === \"list\") {\n const listToken = lastToken;\n const lastListItem = listToken.items[listToken.items.length - 1];\n\n if (!lastListItem) {\n return parentToken;\n }\n\n const lastListItemTokens = lastListItem.tokens as Token[];\n\n // List items containing empty lines are handled differently,\n // instead of using the list item's tokens, we use the last one\n // if it's a text or block token.\n if (\n lastListItemTokens.some((token) => token.type === \"space\") &&\n lastListItemTokens.length > 0\n ) {\n const lastListItemLastToken =\n lastListItemTokens[lastListItemTokens.length - 1];\n\n if (lastListItemLastToken) {\n if (lastListItemLastToken.type === \"text\") {\n return lastListItemLastToken;\n }\n\n if (isBlockToken(lastListItemLastToken)) {\n return findPotentiallyPartialToken(\n lastListItemLastToken.tokens,\n lastListItemLastToken\n );\n }\n\n return undefined;\n }\n }\n\n return findPotentiallyPartialToken(lastListItem.tokens, lastListItem);\n }\n\n if (lastToken.type === \"table\") {\n const tableToken = lastToken;\n const lastTableRow = tableToken.rows[tableToken.rows.length - 1];\n\n if (!lastTableRow) {\n return parentToken;\n }\n\n // Marked.js creates all cells in advance when creating rows,\n // we want the cell where the end currently is.\n const firstEmptyTableCellIndex = lastTableRow.findIndex(\n (cell) => cell.tokens.length === 0\n );\n const lastNonEmptyTableCell =\n firstEmptyTableCellIndex === -1\n ? undefined\n : firstEmptyTableCellIndex === 0\n ? lastTableRow[firstEmptyTableCellIndex]\n : lastTableRow[firstEmptyTableCellIndex - 1];\n\n if (!lastNonEmptyTableCell) {\n return parentToken;\n }\n\n return findPotentiallyPartialToken(\n lastNonEmptyTableCell.tokens,\n lastNonEmptyTableCell\n );\n }\n\n if (isBlockToken(lastToken)) {\n return findPotentiallyPartialToken(lastToken.tokens, lastToken);\n }\n\n return parentToken;\n}\n\nfunction normalizeNewlines(string: string) {\n return string.replace(NEWLINE_REGEX, \"\\n\");\n}\n\n/**\n * Trim a partial Markdown string to avoid incomplete tokens.\n */\nfunction trimPartialMarkdown(markdown: string) {\n const lines = markdown.split(\"\\n\");\n\n if (lines.length === 0) {\n return markdown;\n }\n\n // If the last line contains a single non-whitespace character,\n // we can remove it for now.\n const [singleCharacterMatch] =\n lines[lines.length - 1]!.match(SINGLE_CHARACTER_REGEX) ?? [];\n\n if (singleCharacterMatch) {\n lines[lines.length - 1] = lines[lines.length - 1]!.slice(\n 0,\n -singleCharacterMatch.length\n );\n\n return lines.join(\"\\n\");\n }\n\n // If the last line ends with partial syntax, we can remove it for now.\n const [bufferedCharactersMatch] =\n lines[lines.length - 1]!.match(BUFFERED_CHARACTERS_REGEX) ?? [];\n\n if (bufferedCharactersMatch) {\n lines[lines.length - 1] = lines[lines.length - 1]!.slice(\n 0,\n -bufferedCharactersMatch.length\n );\n\n return lines.join(\"\\n\");\n }\n\n return markdown;\n}\n\n/**\n * Optimistically complete a Markdown string of inline content:\n *\n * - Bold, italic, strikethrough, and inline code\n * - Links\n *\n * Remove any remaining partial content:\n *\n * - Emoji\n */\nfunction completePartialInlineMarkdown(\n markdown: string,\n options: { allowLinksImages?: boolean } = {}\n): string {\n const stack: { string: string; length: number; index: number }[] = [];\n const allowLinksImages = options.allowLinksImages ?? true;\n let completedMarkdown = markdown;\n\n // Trim any partial emoji.\n //\n // We do this here rather than in `trimPartialMarkdown` because\n // `trimPartialMarkdown` needs to run before Marked.js to prevent\n // it from parsing partial Markdown syntax, emojis won't be parsed\n // by Marked.js so we can trim them here to be a bit more efficient.\n const partialEmojiMatch = completedMarkdown.match(PARTIAL_EMOJI_REGEX);\n\n if (partialEmojiMatch) {\n const partialEmoji = partialEmojiMatch[0];\n completedMarkdown = completedMarkdown.slice(0, -partialEmoji.length);\n\n // If the removed partial emoji contains a special modifier (VS16 or keycap),\n // we also remove the preceding code point.\n if (partialEmoji.includes(\"\\uFE0F\") || partialEmoji.includes(\"\\u20E3\")) {\n const codepoints = Array.from(completedMarkdown);\n\n if (codepoints.length > 0) {\n completedMarkdown = codepoints.slice(0, -1).join(\"\");\n }\n }\n }\n\n // Move forward through the string to collect delimiters.\n for (let i = 0; i < completedMarkdown.length; i++) {\n const character = completedMarkdown[i]!;\n const isEscaped = i > 0 ? completedMarkdown[i - 1] === \"\\\\\" : false;\n\n if (isEscaped) {\n continue;\n }\n\n if (character === \"`\") {\n const lastDelimiter = stack[stack.length - 1];\n const isClosingPreviousDelimiter =\n lastDelimiter?.string === \"`\" && i > lastDelimiter.index;\n\n if (isClosingPreviousDelimiter) {\n // If the delimiter is closing a previous delimiter,\n // we remove it from the stack.\n stack.pop();\n } else {\n const characterAfterDelimiter = completedMarkdown[i + 1];\n\n // If the delimiter is opening and is followed by a\n // non-whitespace character, we add it to the stack.\n if (\n characterAfterDelimiter &&\n !WHITESPACE_REGEX.test(characterAfterDelimiter)\n ) {\n stack.push({ string: \"`\", length: 1, index: i });\n }\n }\n\n continue;\n }\n\n if (character === \"*\" || character === \"_\" || character === \"~\") {\n const isInsideInlineCode = stack[stack.length - 1]?.string === \"`\";\n\n let j = i;\n while (\n j < completedMarkdown.length &&\n completedMarkdown[j] === character\n ) {\n j++;\n }\n const consecutiveDelimiterCharacters = j - i;\n\n // Delimiters inside inline code shouldn't be closed so we skip them.\n if (isInsideInlineCode) {\n i += consecutiveDelimiterCharacters - 1;\n\n continue;\n }\n\n let remainingConsecutiveDelimiterCharacters =\n consecutiveDelimiterCharacters;\n let consecutiveDelimiterCharacterIndex = 0;\n\n while (remainingConsecutiveDelimiterCharacters > 0) {\n const lastDelimiter = stack[stack.length - 1];\n\n if (!lastDelimiter || lastDelimiter.string[0] !== character) {\n break;\n }\n\n // We close as many matching open delimiters as possible from the stack.\n if (remainingConsecutiveDelimiterCharacters >= lastDelimiter.length) {\n stack.pop();\n remainingConsecutiveDelimiterCharacters -= lastDelimiter.length;\n consecutiveDelimiterCharacterIndex += lastDelimiter.length;\n\n continue;\n }\n\n break;\n }\n\n if (remainingConsecutiveDelimiterCharacters > 0) {\n // If there are any unmatched delimiters at the end of the string,\n // we can remove them from the string.\n if (i + consecutiveDelimiterCharacters >= completedMarkdown.length) {\n completedMarkdown = completedMarkdown.slice(\n 0,\n completedMarkdown.length - remainingConsecutiveDelimiterCharacters\n );\n\n break;\n }\n\n const characterAfterDelimiters =\n completedMarkdown[i + consecutiveDelimiterCharacters];\n\n if (\n characterAfterDelimiters &&\n !WHITESPACE_REGEX.test(characterAfterDelimiters)\n ) {\n let delimiterStartIndex = i + consecutiveDelimiterCharacterIndex;\n\n // If there's an odd number of unmatched delimiters,\n // we match a single-character delimiter.\n if (remainingConsecutiveDelimiterCharacters % 2 === 1) {\n stack.push({\n string: character,\n length: 1,\n index: delimiterStartIndex,\n });\n delimiterStartIndex += 1;\n remainingConsecutiveDelimiterCharacters -= 1;\n }\n\n // If there are any unmatched delimiters remaining,\n // we match double-character delimiters.\n while (remainingConsecutiveDelimiterCharacters >= 2) {\n stack.push({\n string: character + character,\n length: 2,\n index: delimiterStartIndex,\n });\n delimiterStartIndex += 2;\n remainingConsecutiveDelimiterCharacters -= 2;\n }\n }\n }\n\n i += consecutiveDelimiterCharacters - 1;\n\n continue;\n }\n }\n\n if (allowLinksImages) {\n const partialLinkImageMatch = completedMarkdown.match(\n PARTIAL_LINK_IMAGE_REGEX\n );\n\n if (partialLinkImageMatch) {\n const linkImageStartIndex = partialLinkImageMatch.index!;\n const linkImageEndIndex =\n linkImageStartIndex + partialLinkImageMatch[0].length;\n\n const isInsideInlineCode = stack.some(\n (delimiter) =>\n delimiter.string === \"`\" && delimiter.index < linkImageStartIndex\n );\n\n if (!isInsideInlineCode) {\n const partialLinkImageContent = partialLinkImageMatch[0];\n const {\n text: partialLinkText,\n url: partialLinkUrl,\n image: isImage,\n } = partialLinkImageMatch.groups!;\n\n if (isImage) {\n // We can't optimistically complete images, so we remove them until they are complete.\n completedMarkdown = completedMarkdown.slice(\n 0,\n -partialLinkImageContent.length\n );\n } else {\n // We can remove delimiters from the stack that are inside the completed link,\n // since they are now closed.\n for (let i = stack.length - 1; i >= 0; i--) {\n const delimiter = stack[i]!;\n\n if (\n delimiter.index >= linkImageStartIndex &&\n delimiter.index < linkImageEndIndex\n ) {\n stack.splice(i, 1);\n }\n }\n\n const completedLinkText = partialLinkText\n ? partialLinkUrl\n ? // If there's a partial URL, the text is already completed.\n partialLinkText\n : // Otherwise, we complete the text and its potential nested elements.\n completePartialInlineMarkdown(partialLinkText, {\n // Links/images cannot be nested.\n allowLinksImages: false,\n })\n : \"\";\n const completedLinkUrl =\n partialLinkUrl &&\n !WHITESPACE_REGEX.test(partialLinkUrl) &&\n isUrl(partialLinkUrl)\n ? // We only use the partial URL if it's valid.\n partialLinkUrl\n : DEFAULT_PARTIAL_LINK_URL;\n const completedLink = `[${completedLinkText}](${completedLinkUrl})`;\n\n completedMarkdown = completedMarkdown.slice(\n 0,\n -partialLinkImageContent.length\n );\n completedMarkdown += completedLink;\n }\n }\n }\n }\n\n // Move through the stack to close open formatting tokens.\n for (let i = stack.length - 1; i >= 0; i--) {\n const delimiter = stack[i]!;\n\n // If the open token is at the end of the string,\n // we can't close it yet so we remove it.\n if (delimiter.index + delimiter.length >= completedMarkdown.length) {\n completedMarkdown = completedMarkdown.slice(0, delimiter.index);\n continue;\n }\n\n // Bold, italic, and strikethrough cannot end with whitespace so\n // we trim their content before closing them.\n if (delimiter.string !== \"`\") {\n completedMarkdown = completedMarkdown.trimEnd();\n }\n\n // We can close that open token at this point.\n completedMarkdown += delimiter.string;\n }\n\n return completedMarkdown;\n}\n\n/**\n * Optimistically complete a Markdown string of a table.\n */\nfunction completePartialTableMarkdown(markdown: string): string | undefined {\n const tableLines = markdown.split(\"\\n\");\n\n if (tableLines.length === 0) {\n return undefined;\n }\n\n const tableHeader = tableLines[0]!;\n\n if (tableHeader === \"|\") {\n return undefined;\n }\n\n const tableHeadings = tableHeader\n .split(\"|\")\n .map((cell) => cell.trim())\n .filter((cell) => cell !== \"\");\n\n if (tableHeadings.length === 0) {\n return undefined;\n }\n\n // If the last header cell is partial, it might also contain partial elements.\n if (!tableHeader.endsWith(\"|\")) {\n const lastTableHeading = tableHeadings[tableHeadings.length - 1]!;\n const completedLastTableHeading =\n completePartialInlineMarkdown(lastTableHeading);\n\n tableHeadings[tableHeadings.length - 1] = completedLastTableHeading;\n }\n\n return `| ${tableHeadings.join(\" | \")} |\\n| ${tableHeadings.map(() => \"---\").join(\" | \")} |`;\n}\n\nfunction completePartialTokens(tokens: Token[]) {\n const potentiallyPartialToken = findPotentiallyPartialToken(tokens);\n\n if (!potentiallyPartialToken) {\n return tokens;\n }\n\n if (\n potentiallyPartialToken.type === \"paragraph\" ||\n potentiallyPartialToken.type === \"text\"\n ) {\n // Marked.js only creates tables when the table header and its\n // separator below are complete.\n //\n // We optimistically create tables sooner if the current text looks\n // like a partial table header.\n if (PARTIAL_TABLE_HEADER_REGEX.test(potentiallyPartialToken.raw)) {\n const completedTableMarkdown = completePartialTableMarkdown(\n potentiallyPartialToken.raw\n );\n\n if (completedTableMarkdown) {\n // We optimistically complete the table as a string then re-tokenize\n // it to get an optimistically complete table token.\n const completedTable = tokenize(completedTableMarkdown)[0] as\n | Tokens.Table\n | undefined;\n\n if (completedTable) {\n // We replace the paragraph/text by the optimistically completed table.\n const table = potentiallyPartialToken as unknown as Tokens.Table;\n\n table.type = \"table\";\n table.header = completedTable.header;\n table.align = completedTable.align;\n table.rows = completedTable.rows;\n\n return tokens;\n }\n } else {\n // Otherwise, we hide it for now.\n potentiallyPartialToken.text = \"\";\n potentiallyPartialToken.tokens = [];\n }\n }\n }\n\n if (potentiallyPartialToken.type === \"list_item\") {\n const listItem = potentiallyPartialToken;\n const listItemTokens = listItem.tokens as Token[];\n\n // Marked.js only turns list items into tasks when the list marker\n // and the task checkbox are complete and followed by a space. (e.g. \"- [x] \")\n //\n // We optimistically mark list items as tasks sooner,\n // whenever a list item starts with \"- [\", \"- [x\", etc.\n if (\n !listItem.task &&\n listItemTokens.length === 1 &&\n listItemTokens[0]!.type === \"text\"\n ) {\n const listItemText = listItemTokens[0];\n const checkboxMatch = listItemText.text.match(LIST_ITEM_CHECKBOX_REGEX);\n\n if (checkboxMatch) {\n listItem.task = true;\n\n if (checkboxMatch[1] === \"x\") {\n listItem.checked = true;\n } else {\n listItem.checked = false;\n }\n\n listItem.text = \"\";\n listItem.tokens = [];\n }\n }\n }\n\n if (potentiallyPartialToken.text.length === 0) {\n return tokens;\n }\n\n // We optimistically complete inline content as a string then re-tokenize\n // it to get optimistically complete tokens.\n const completedMarkdown = completePartialInlineMarkdown(\n potentiallyPartialToken.text\n );\n const completedMarkdownTokens =\n (tokenize(completedMarkdown)[0] as Tokens.Paragraph | undefined)?.tokens ??\n [];\n\n potentiallyPartialToken.text = completedMarkdown;\n potentiallyPartialToken.tokens = completedMarkdownTokens;\n\n return tokens;\n}\n\nfunction parseHtmlEntities(input: string) {\n const document = new DOMParser().parseFromString(\n `<!doctype html><body>${input\n // Prevent some characters from being interpreted as markup.\n .replace(AMPERSAND_REGEX, \"&amp;\")\n .replace(LEFT_ANGLE_BRACKET_REGEX, \"&lt;\")\n .replace(RIGHT_ANGLE_BRACKET_REGEX, \"&gt;\")}`,\n \"text/html\"\n );\n\n return document.body.textContent;\n}\n\nfunction clampHeadingLevel(level: number) {\n return Math.max(1, Math.min(6, level)) as 1 | 2 | 3 | 4 | 5 | 6;\n}\n"],"names":["index"],"mappings":"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"}
1
+ {"version":3,"file":"Markdown.js","sources":["../../src/primitives/Markdown.tsx"],"sourcesContent":["import { assertNever, isUrl, type Relax, sanitizeUrl } from \"@liveblocks/core\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport {\n Lexer,\n type MarkedToken,\n type Token as DefaultToken,\n type Tokens,\n} 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\nconst LIST_ITEM_CHECKBOX_REGEX = /^\\[\\s?(x)?\\]?$/i;\nconst PARTIAL_LINK_IMAGE_REGEX =\n /(?<!\\\\)(?<image>!)?\\[(?!\\^)(?<text>[^\\]]*)(?:\\](?:\\((?<url>[^)]*)?)?)?$/;\nconst PARTIAL_TABLE_HEADER_REGEX =\n /^\\s*\\|(?:[^|\\n]+(?:\\|[^|\\n]+)*?)?\\|?\\s*(?:\\n\\s*\\|\\s*[-:|\\s]*\\s*)?$/;\nconst PARTIAL_EMOJI_REGEX =\n /(?:\\u200D|\\uFE0F|\\u20E3|\\p{Regional_Indicator}|\\p{Emoji_Presentation}|\\p{Emoji_Modifier_Base}|\\p{Emoji_Modifier})+$/u;\nconst TRAILING_NON_WHITESPACE_REGEX = /^\\S*/;\nconst WHITESPACE_REGEX = /\\s/;\nconst NEWLINE_REGEX = /\\r\\n?/g;\nconst BUFFERED_CHARACTERS_REGEX =\n /(?<!\\\\)((\\*+|_+|~+|`+|\\++|-{0,2}|={0,2}|\\\\|!|<\\/?)\\s*)$/;\nconst SINGLE_CHARACTER_REGEX = /^\\s*(\\S\\s*)$/;\nconst LEFT_ANGLE_BRACKET_REGEX = /</g;\nconst RIGHT_ANGLE_BRACKET_REGEX = />/g;\nconst AMPERSAND_REGEX = /&(?!#?[0-9A-Za-z]+;)/g;\nconst DEFAULT_PARTIAL_LINK_URL = \"#\";\n\ntype CheckboxToken = {\n type: \"checkbox\";\n checked: boolean;\n raw: string;\n};\n\ntype Token = MarkedToken | CheckboxToken;\n\ntype AnyToken = Token | DefaultToken;\n\ntype PotentiallyPartialToken = Relax<\n | Tokens.Text\n | Tokens.Paragraph\n | Tokens.Heading\n | Tokens.Blockquote\n | Tokens.ListItem\n | Tokens.TableCell\n | Tokens.Code\n>;\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.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 partial?: boolean;\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}>{item.children}</li>\n ))}\n </List>\n );\n },\n Separator: () => {\n return <hr />;\n },\n};\n\nexport const Markdown = forwardRef<HTMLDivElement, MarkdownProps>(\n ({ content, partial, components, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"div\";\n const tokens = useMemo(() => {\n if (!content) {\n return [];\n }\n\n return partial ? tokenizePartial(content) : tokenize(content);\n }, [content, partial]);\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 partial={partial}\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 partial?: boolean;\n }) => {\n return <MarkdownToken token={token} components={components} />;\n },\n (previousProps, nextProps) => {\n const previousToken = previousProps.token;\n const nextToken = nextProps.token;\n\n // 1️⃣ Start with the fastest comparisons\n if (\n previousToken.type !== nextToken.type ||\n previousProps.partial !== nextProps.partial\n ) {\n return false;\n }\n\n let previousContent = previousToken.raw;\n let nextContent = nextToken.raw;\n\n if (\"text\" in previousToken && \"text\" in nextToken) {\n previousContent = previousToken.text;\n nextContent = nextToken.text;\n }\n\n // 2️⃣ Then only compare the tokens' content lengths first\n if (previousContent.length !== nextContent.length) {\n return false;\n }\n\n // 3️⃣ And finally compare the actual tokens' content\n return previousContent === nextContent;\n }\n);\n\nexport function MarkdownToken({\n token,\n components,\n}: {\n token: Token;\n components: Partial<MarkdownComponents> | undefined;\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 =\n token.lang.match(TRAILING_NON_WHITESPACE_REGEX)?.[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 let tokens = item.tokens;\n\n if (item.task) {\n tokens = [\n {\n type: \"checkbox\",\n checked: Boolean(item.checked),\n raw: `[${item.checked ? \"x\" : \" \"}]`,\n },\n ...tokens,\n ];\n }\n\n return {\n checked: item.task ? item.checked : undefined,\n children: (\n <MarkdownTokens\n tokens={tokens}\n components={components}\n normalizeToBlockTokens={\n // A non-loose list item doesn't need to be wrapped in block tokens.\n item.tokens.length > 0 ? item.loose : false\n }\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 \"checkbox\": {\n return (\n <>\n <input type=\"checkbox\" disabled checked={token.checked} />{\" \"}\n </>\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 case \"html\": {\n return parseHtmlEntities(token.text);\n }\n\n default: {\n return null;\n }\n }\n}\n\nfunction MarkdownTokens({\n tokens,\n components,\n normalizeToBlockTokens = false,\n}: {\n tokens: AnyToken[];\n components: Partial<MarkdownComponents> | undefined;\n normalizeToBlockTokens?: boolean;\n}) {\n assertTokens(tokens);\n\n let normalizedTokens: Token[] = [];\n\n if (normalizeToBlockTokens) {\n let leadingCheckboxToken =\n tokens[0]?.type === \"checkbox\" ? tokens[0] : null;\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!;\n\n switch (token.type) {\n case \"text\": {\n const paragraphTextTokens: Tokens.Text[] = [token];\n\n // Wrap consecutive text tokens into a paragraph.\n while (i + 1 < tokens.length && tokens[i + 1]!.type === \"text\") {\n i++;\n paragraphTextTokens.push(tokens[i] as Tokens.Text);\n }\n\n const paragraphRaw = paragraphTextTokens\n .map((text) => text.raw)\n .join(\"\");\n const paragraphText = paragraphTextTokens\n .map((text) => text.text)\n .join(\"\");\n\n // When wrapping loose task list items into paragraphs, we need to\n // move the checkbox into the first paragraph.\n normalizedTokens.push({\n type: \"paragraph\",\n tokens: leadingCheckboxToken\n ? [leadingCheckboxToken, ...paragraphTextTokens]\n : paragraphTextTokens,\n raw: paragraphRaw,\n text: paragraphText,\n } satisfies Tokens.Paragraph);\n leadingCheckboxToken = null;\n\n break;\n }\n\n case \"checkbox\":\n break;\n\n default: {\n normalizedTokens.push(token);\n }\n }\n }\n } else {\n normalizedTokens = tokens;\n }\n\n return normalizedTokens.map((token, index) => (\n <MarkdownToken key={index} token={token} components={components} />\n ));\n}\n\n/**\n * Marked.js' `Token` union type includes a `Generic` token type which is\n * too broad and makes narrowing difficult, we don't use generic/custom tokens\n * so we can assert the `Generic` type away.\n */\nfunction assertTokens(_: AnyToken): asserts _ is Token;\nfunction assertTokens(_: AnyToken[]): asserts _ is Token[];\nfunction assertTokens(_: AnyToken | AnyToken[]): asserts _ is Token | Token[] {}\n\nfunction isBlockToken(\n token: Token | Tokens.Generic\n): token is\n | Tokens.Paragraph\n | Tokens.Heading\n | Tokens.Blockquote\n | Tokens.ListItem {\n return (\n token.type === \"paragraph\" ||\n token.type === \"heading\" ||\n token.type === \"blockquote\" ||\n token.type === \"list_item\"\n );\n}\n\nfunction tokenize(markdown: string) {\n return new Lexer().lex(markdown) as Token[];\n}\n\nfunction tokenizePartial(markdown: string) {\n const preprocessedContent = trimPartialMarkdown(normalizeNewlines(markdown));\n\n const tokens = tokenize(preprocessedContent);\n\n try {\n return completePartialTokens(tokens);\n } catch {\n return tokens;\n }\n}\n\n/**\n * Find the last partial token that we could potentially complete.\n */\nfunction findPotentiallyPartialToken(\n tokens: AnyToken[],\n parentToken?: PotentiallyPartialToken\n): PotentiallyPartialToken | undefined {\n if (tokens.length === 0) {\n return parentToken;\n }\n\n assertTokens(tokens);\n\n const lastIndex = tokens.length - 1;\n let lastToken = tokens[lastIndex]!;\n\n if (lastToken.type === \"space\") {\n const penultimateToken = tokens[lastIndex - 1];\n\n if (!penultimateToken) {\n return parentToken;\n }\n\n lastToken = penultimateToken;\n }\n\n if (lastToken.type === \"list\") {\n const listToken = lastToken;\n const lastListItem = listToken.items[listToken.items.length - 1];\n\n if (!lastListItem) {\n return parentToken;\n }\n\n const lastListItemTokens = lastListItem.tokens as Token[];\n\n // List items containing empty lines are handled differently,\n // instead of using the list item's tokens, we use the last one\n // if it's a text or block token.\n if (\n lastListItemTokens.some((token) => token.type === \"space\") &&\n lastListItemTokens.length > 0\n ) {\n const lastListItemLastToken =\n lastListItemTokens[lastListItemTokens.length - 1];\n\n if (lastListItemLastToken) {\n if (lastListItemLastToken.type === \"text\") {\n return lastListItemLastToken;\n }\n\n if (isBlockToken(lastListItemLastToken)) {\n return findPotentiallyPartialToken(\n lastListItemLastToken.tokens,\n lastListItemLastToken\n );\n }\n\n return undefined;\n }\n }\n\n return findPotentiallyPartialToken(lastListItem.tokens, lastListItem);\n }\n\n if (lastToken.type === \"table\") {\n const tableToken = lastToken;\n const lastTableRow = tableToken.rows[tableToken.rows.length - 1];\n\n if (!lastTableRow) {\n return parentToken;\n }\n\n // Marked.js creates all cells in advance when creating rows,\n // we want the cell where the end currently is.\n const firstEmptyTableCellIndex = lastTableRow.findIndex(\n (cell) => cell.tokens.length === 0\n );\n const lastNonEmptyTableCell =\n firstEmptyTableCellIndex === -1\n ? undefined\n : firstEmptyTableCellIndex === 0\n ? lastTableRow[firstEmptyTableCellIndex]\n : lastTableRow[firstEmptyTableCellIndex - 1];\n\n if (!lastNonEmptyTableCell) {\n return parentToken;\n }\n\n return findPotentiallyPartialToken(\n lastNonEmptyTableCell.tokens,\n lastNonEmptyTableCell\n );\n }\n\n if (isBlockToken(lastToken)) {\n return findPotentiallyPartialToken(lastToken.tokens, lastToken);\n }\n\n return parentToken;\n}\n\nfunction normalizeNewlines(string: string) {\n return string.replace(NEWLINE_REGEX, \"\\n\");\n}\n\n/**\n * Trim a partial Markdown string to avoid incomplete tokens.\n */\nfunction trimPartialMarkdown(markdown: string) {\n const lines = markdown.split(\"\\n\");\n\n if (lines.length === 0) {\n return markdown;\n }\n\n // If the last line contains a single non-whitespace character,\n // we can remove it for now.\n const [singleCharacterMatch] =\n lines[lines.length - 1]!.match(SINGLE_CHARACTER_REGEX) ?? [];\n\n if (singleCharacterMatch) {\n lines[lines.length - 1] = lines[lines.length - 1]!.slice(\n 0,\n -singleCharacterMatch.length\n );\n\n return lines.join(\"\\n\");\n }\n\n // If the last line ends with partial syntax, we can remove it for now.\n const [bufferedCharactersMatch] =\n lines[lines.length - 1]!.match(BUFFERED_CHARACTERS_REGEX) ?? [];\n\n if (bufferedCharactersMatch) {\n lines[lines.length - 1] = lines[lines.length - 1]!.slice(\n 0,\n -bufferedCharactersMatch.length\n );\n\n return lines.join(\"\\n\");\n }\n\n return markdown;\n}\n\n/**\n * Optimistically complete a Markdown string of inline content:\n *\n * - Bold, italic, strikethrough, and inline code\n * - Links\n *\n * Remove any remaining partial content:\n *\n * - Emoji\n */\nfunction completePartialInlineMarkdown(\n markdown: string,\n options: { allowLinksImages?: boolean } = {}\n): string {\n const stack: { string: string; length: number; index: number }[] = [];\n const allowLinksImages = options.allowLinksImages ?? true;\n let completedMarkdown = markdown;\n\n // Trim any partial emoji.\n //\n // We do this here rather than in `trimPartialMarkdown` because\n // `trimPartialMarkdown` needs to run before Marked.js to prevent\n // it from parsing partial Markdown syntax, emojis won't be parsed\n // by Marked.js so we can trim them here to be a bit more efficient.\n const partialEmojiMatch = completedMarkdown.match(PARTIAL_EMOJI_REGEX);\n\n if (partialEmojiMatch) {\n const partialEmoji = partialEmojiMatch[0];\n completedMarkdown = completedMarkdown.slice(0, -partialEmoji.length);\n\n // If the removed partial emoji contains a special modifier (VS16 or keycap),\n // we also remove the preceding code point.\n if (partialEmoji.includes(\"\\uFE0F\") || partialEmoji.includes(\"\\u20E3\")) {\n const codepoints = Array.from(completedMarkdown);\n\n if (codepoints.length > 0) {\n completedMarkdown = codepoints.slice(0, -1).join(\"\");\n }\n }\n }\n\n // Move forward through the string to collect delimiters.\n for (let i = 0; i < completedMarkdown.length; i++) {\n const character = completedMarkdown[i]!;\n const isEscaped = i > 0 ? completedMarkdown[i - 1] === \"\\\\\" : false;\n\n if (isEscaped) {\n continue;\n }\n\n if (character === \"`\") {\n const lastDelimiter = stack[stack.length - 1];\n const isClosingPreviousDelimiter =\n lastDelimiter?.string === \"`\" && i > lastDelimiter.index;\n\n if (isClosingPreviousDelimiter) {\n // If the delimiter is closing a previous delimiter,\n // we remove it from the stack.\n stack.pop();\n } else {\n const characterAfterDelimiter = completedMarkdown[i + 1];\n\n // If the delimiter is opening and is followed by a\n // non-whitespace character, we add it to the stack.\n if (\n characterAfterDelimiter &&\n !WHITESPACE_REGEX.test(characterAfterDelimiter)\n ) {\n stack.push({ string: \"`\", length: 1, index: i });\n }\n }\n\n continue;\n }\n\n if (character === \"*\" || character === \"_\" || character === \"~\") {\n const isInsideInlineCode = stack[stack.length - 1]?.string === \"`\";\n\n let j = i;\n while (\n j < completedMarkdown.length &&\n completedMarkdown[j] === character\n ) {\n j++;\n }\n const consecutiveDelimiterCharacters = j - i;\n\n // Delimiters inside inline code shouldn't be closed so we skip them.\n if (isInsideInlineCode) {\n i += consecutiveDelimiterCharacters - 1;\n\n continue;\n }\n\n let remainingConsecutiveDelimiterCharacters =\n consecutiveDelimiterCharacters;\n let consecutiveDelimiterCharacterIndex = 0;\n\n while (remainingConsecutiveDelimiterCharacters > 0) {\n const lastDelimiter = stack[stack.length - 1];\n\n if (!lastDelimiter || lastDelimiter.string[0] !== character) {\n break;\n }\n\n // We close as many matching open delimiters as possible from the stack.\n if (remainingConsecutiveDelimiterCharacters >= lastDelimiter.length) {\n stack.pop();\n remainingConsecutiveDelimiterCharacters -= lastDelimiter.length;\n consecutiveDelimiterCharacterIndex += lastDelimiter.length;\n\n continue;\n }\n\n break;\n }\n\n if (remainingConsecutiveDelimiterCharacters > 0) {\n // If there are any unmatched delimiters at the end of the string,\n // we can remove them from the string.\n if (i + consecutiveDelimiterCharacters >= completedMarkdown.length) {\n completedMarkdown = completedMarkdown.slice(\n 0,\n completedMarkdown.length - remainingConsecutiveDelimiterCharacters\n );\n\n break;\n }\n\n const characterAfterDelimiters =\n completedMarkdown[i + consecutiveDelimiterCharacters];\n\n if (\n characterAfterDelimiters &&\n !WHITESPACE_REGEX.test(characterAfterDelimiters)\n ) {\n let delimiterStartIndex = i + consecutiveDelimiterCharacterIndex;\n\n // If there's an odd number of unmatched delimiters,\n // we match a single-character delimiter.\n if (remainingConsecutiveDelimiterCharacters % 2 === 1) {\n stack.push({\n string: character,\n length: 1,\n index: delimiterStartIndex,\n });\n delimiterStartIndex += 1;\n remainingConsecutiveDelimiterCharacters -= 1;\n }\n\n // If there are any unmatched delimiters remaining,\n // we match double-character delimiters.\n while (remainingConsecutiveDelimiterCharacters >= 2) {\n stack.push({\n string: character + character,\n length: 2,\n index: delimiterStartIndex,\n });\n delimiterStartIndex += 2;\n remainingConsecutiveDelimiterCharacters -= 2;\n }\n }\n }\n\n i += consecutiveDelimiterCharacters - 1;\n\n continue;\n }\n }\n\n if (allowLinksImages) {\n const partialLinkImageMatch = completedMarkdown.match(\n PARTIAL_LINK_IMAGE_REGEX\n );\n\n if (partialLinkImageMatch) {\n const linkImageStartIndex = partialLinkImageMatch.index!;\n const linkImageEndIndex =\n linkImageStartIndex + partialLinkImageMatch[0].length;\n\n const isInsideInlineCode = stack.some(\n (delimiter) =>\n delimiter.string === \"`\" && delimiter.index < linkImageStartIndex\n );\n\n if (!isInsideInlineCode) {\n const partialLinkImageContent = partialLinkImageMatch[0];\n const {\n text: partialLinkText,\n url: partialLinkUrl,\n image: isImage,\n } = partialLinkImageMatch.groups!;\n\n if (isImage) {\n // We can't optimistically complete images, so we remove them until they are complete.\n completedMarkdown = completedMarkdown.slice(\n 0,\n -partialLinkImageContent.length\n );\n } else {\n // We can remove delimiters from the stack that are inside the completed link,\n // since they are now closed.\n for (let i = stack.length - 1; i >= 0; i--) {\n const delimiter = stack[i]!;\n\n if (\n delimiter.index >= linkImageStartIndex &&\n delimiter.index < linkImageEndIndex\n ) {\n stack.splice(i, 1);\n }\n }\n\n const completedLinkText = partialLinkText\n ? partialLinkUrl\n ? // If there's a partial URL, the text is already completed.\n partialLinkText\n : // Otherwise, we complete the text and its potential nested elements.\n completePartialInlineMarkdown(partialLinkText, {\n // Links/images cannot be nested.\n allowLinksImages: false,\n })\n : \"\";\n const completedLinkUrl =\n partialLinkUrl &&\n !WHITESPACE_REGEX.test(partialLinkUrl) &&\n isUrl(partialLinkUrl)\n ? // We only use the partial URL if it's valid.\n partialLinkUrl\n : DEFAULT_PARTIAL_LINK_URL;\n const completedLink = `[${completedLinkText}](${completedLinkUrl})`;\n\n completedMarkdown = completedMarkdown.slice(\n 0,\n -partialLinkImageContent.length\n );\n completedMarkdown += completedLink;\n }\n }\n }\n }\n\n // Move through the stack to close open formatting tokens.\n for (let i = stack.length - 1; i >= 0; i--) {\n const delimiter = stack[i]!;\n\n // If the open token is at the end of the string,\n // we can't close it yet so we remove it.\n if (delimiter.index + delimiter.length >= completedMarkdown.length) {\n completedMarkdown = completedMarkdown.slice(0, delimiter.index);\n continue;\n }\n\n // Bold, italic, and strikethrough cannot end with whitespace so\n // we trim their content before closing them.\n if (delimiter.string !== \"`\") {\n completedMarkdown = completedMarkdown.trimEnd();\n }\n\n // We can close that open token at this point.\n completedMarkdown += delimiter.string;\n }\n\n return completedMarkdown;\n}\n\n/**\n * Optimistically complete a Markdown string of a table.\n */\nfunction completePartialTableMarkdown(markdown: string): string | undefined {\n const tableLines = markdown.split(\"\\n\");\n\n if (tableLines.length === 0) {\n return undefined;\n }\n\n const tableHeader = tableLines[0]!;\n\n if (tableHeader === \"|\") {\n return undefined;\n }\n\n const tableHeadings = tableHeader\n .split(\"|\")\n .map((cell) => cell.trim())\n .filter((cell) => cell !== \"\");\n\n if (tableHeadings.length === 0) {\n return undefined;\n }\n\n // If the last header cell is partial, it might also contain partial elements.\n if (!tableHeader.endsWith(\"|\")) {\n const lastTableHeading = tableHeadings[tableHeadings.length - 1]!;\n const completedLastTableHeading =\n completePartialInlineMarkdown(lastTableHeading);\n\n tableHeadings[tableHeadings.length - 1] = completedLastTableHeading;\n }\n\n return `| ${tableHeadings.join(\" | \")} |\\n| ${tableHeadings.map(() => \"---\").join(\" | \")} |`;\n}\n\nfunction completePartialTokens(tokens: Token[]) {\n const potentiallyPartialToken = findPotentiallyPartialToken(tokens);\n\n if (!potentiallyPartialToken) {\n return tokens;\n }\n\n if (\n potentiallyPartialToken.type === \"paragraph\" ||\n potentiallyPartialToken.type === \"text\"\n ) {\n // Marked.js only creates tables when the table header and its\n // separator below are complete.\n //\n // We optimistically create tables sooner if the current text looks\n // like a partial table header.\n if (PARTIAL_TABLE_HEADER_REGEX.test(potentiallyPartialToken.raw)) {\n const completedTableMarkdown = completePartialTableMarkdown(\n potentiallyPartialToken.raw\n );\n\n if (completedTableMarkdown) {\n // We optimistically complete the table as a string then re-tokenize\n // it to get an optimistically complete table token.\n const completedTable = tokenize(completedTableMarkdown)[0] as\n | Tokens.Table\n | undefined;\n\n if (completedTable) {\n // We replace the paragraph/text by the optimistically completed table.\n const table = potentiallyPartialToken as unknown as Tokens.Table;\n\n table.type = \"table\";\n table.header = completedTable.header;\n table.align = completedTable.align;\n table.rows = completedTable.rows;\n\n return tokens;\n }\n } else {\n // Otherwise, we hide it for now.\n potentiallyPartialToken.text = \"\";\n potentiallyPartialToken.tokens = [];\n }\n }\n }\n\n if (potentiallyPartialToken.type === \"list_item\") {\n const listItem = potentiallyPartialToken;\n const listItemTokens = listItem.tokens as Token[];\n\n // Marked.js only turns list items into tasks when the list marker\n // and the task checkbox are complete and followed by a space. (e.g. \"- [x] \")\n //\n // We optimistically mark list items as tasks sooner,\n // whenever a list item starts with \"- [\", \"- [x\", etc.\n if (\n !listItem.task &&\n listItemTokens.length === 1 &&\n listItemTokens[0]!.type === \"text\"\n ) {\n const listItemText = listItemTokens[0];\n const checkboxMatch = listItemText.text.match(LIST_ITEM_CHECKBOX_REGEX);\n\n if (checkboxMatch) {\n listItem.task = true;\n\n if (checkboxMatch[1] === \"x\") {\n listItem.checked = true;\n } else {\n listItem.checked = false;\n }\n\n listItem.text = \"\";\n listItem.tokens = [];\n }\n }\n }\n\n if (potentiallyPartialToken.text.length === 0) {\n return tokens;\n }\n\n // We optimistically complete inline content as a string then re-tokenize\n // it to get optimistically complete tokens.\n const completedMarkdown = completePartialInlineMarkdown(\n potentiallyPartialToken.text\n );\n const completedMarkdownTokens =\n (tokenize(completedMarkdown)[0] as Tokens.Paragraph | undefined)?.tokens ??\n [];\n\n potentiallyPartialToken.text = completedMarkdown;\n potentiallyPartialToken.tokens = completedMarkdownTokens;\n\n return tokens;\n}\n\nfunction parseHtmlEntities(input: string) {\n const document = new DOMParser().parseFromString(\n `<!doctype html><body>${input\n // Prevent some characters from being interpreted as markup.\n .replace(AMPERSAND_REGEX, \"&amp;\")\n .replace(LEFT_ANGLE_BRACKET_REGEX, \"&lt;\")\n .replace(RIGHT_ANGLE_BRACKET_REGEX, \"&gt;\")}`,\n \"text/html\"\n );\n\n return document.body.textContent;\n}\n\nfunction clampHeadingLevel(level: number) {\n return Math.max(1, Math.min(6, level)) as 1 | 2 | 3 | 4 | 5 | 6;\n}\n"],"names":["index"],"mappings":"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"}
@@ -100,20 +100,25 @@ const Timestamp = react.forwardRef(
100
100
  );
101
101
  const title = react.useMemo(
102
102
  () => typeof renderTitle === "function" ? renderTitle(parsedDate, locale) : renderTitle,
103
+ // eslint-disable-next-line react-hooks/exhaustive-deps
103
104
  [renderTitle, parsedDate, locale, key]
104
105
  );
105
106
  const children = react.useMemo(
106
107
  () => typeof renderChildren === "function" ? renderChildren(parsedDate, locale) : renderChildren,
108
+ // eslint-disable-next-line react-hooks/exhaustive-deps
107
109
  [renderChildren, parsedDate, locale, key]
108
110
  );
109
111
  useInterval.useInterval(rerender, interval);
110
- return /* @__PURE__ */ jsxRuntime.jsx(Component, {
111
- ...props,
112
- ref: forwardedRef,
113
- dateTime: dateTime ?? normalizedDate,
114
- title,
115
- children
116
- });
112
+ return /* @__PURE__ */ jsxRuntime.jsx(
113
+ Component,
114
+ {
115
+ ...props,
116
+ ref: forwardedRef,
117
+ dateTime: dateTime ?? normalizedDate,
118
+ title,
119
+ children
120
+ }
121
+ );
117
122
  }
118
123
  );
119
124
  if (process.env.NODE_ENV !== "production") {
@@ -1 +1 @@
1
- {"version":3,"file":"Timestamp.cjs","sources":["../../src/primitives/Timestamp.tsx"],"sourcesContent":["\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { ReactNode } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\nimport { capitalize } from \"../utils/capitalize\";\nimport { dateTimeFormat, relativeTimeFormat } from \"../utils/intl\";\nimport { useInterval } from \"../utils/use-interval\";\nimport { useRerender } from \"../utils/use-rerender\";\n\nconst DYNAMIC_DATE_THRESHOLD = 3 * 24 * 60 * 60 * 1000; // 3 days\nconst RENDER_INTERVAL = 30 * 1000; // 30 seconds\n\nconst TIMESTAMP_NAME = \"Timestamp\";\n\nexport interface TimestampProps\n extends Omit<ComponentPropsWithSlot<\"time\">, \"children\" | \"title\"> {\n /**\n * The date to display.\n */\n date: Date | string | number;\n\n /**\n * A function to format the displayed date.\n */\n children?: (date: Date, locale?: string) => ReactNode;\n\n /**\n * The `title` attribute's value or a function to format it.\n */\n title?: string | ((date: Date, locale?: string) => string);\n\n /**\n * The interval in milliseconds at which the component will re-render.\n * Can be set to `false` to disable re-rendering.\n */\n interval?: number | false;\n\n /**\n * The locale used when formatting the date.\n */\n locale?: string;\n}\n\nconst relativeUnits = {\n seconds: 60,\n minutes: 60,\n hours: 24,\n days: 7,\n weeks: 4.34524,\n months: 12,\n};\n\n/**\n * Formats a date absolutely.\n */\nfunction formatVerboseDate(date: Date, locale?: string) {\n const formatter = dateTimeFormat(locale, {\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n });\n\n return capitalize(formatter.format(date));\n}\n\n/**\n * Formats a date absolutely with only the day and month.\n */\nfunction formatShortDate(date: Date, locale?: string) {\n const formatter = dateTimeFormat(locale, {\n month: \"short\",\n day: \"numeric\",\n });\n\n return capitalize(formatter.format(date));\n}\n\n// Some locales' relative formatting can be broken (e.g. \"-1h\") when using the narrow style.\nconst localesWithBrokenNarrowRelativeFormatting = [\n \"br\",\n \"fr\",\n \"nb\",\n \"nn\",\n \"no\",\n \"ro\",\n \"sv\",\n];\n\n/**\n * Formats a date relatively.\n */\nexport function formatRelativeDate(date: Date, locale?: string) {\n let resolvedLocale: string;\n\n if (locale) {\n resolvedLocale = locale;\n } else {\n const formatter = relativeTimeFormat();\n\n resolvedLocale = formatter.resolvedOptions().locale;\n }\n\n const isBrokenWhenNarrow = localesWithBrokenNarrowRelativeFormatting.some(\n (locale) =>\n resolvedLocale === locale || resolvedLocale.startsWith(`${locale}-`)\n );\n\n const formatter = relativeTimeFormat(resolvedLocale, {\n style: isBrokenWhenNarrow ? \"short\" : \"narrow\",\n numeric: \"auto\",\n });\n\n let difference = (date.getTime() - Date.now()) / 1000;\n\n if (\n difference > -relativeUnits.seconds &&\n difference < relativeUnits.seconds\n ) {\n return formatter.format(0, \"seconds\");\n }\n\n for (const [unit, length] of Object.entries(relativeUnits)) {\n if (Math.abs(difference) < length) {\n return formatter.format(\n Math.round(difference),\n unit as Intl.RelativeTimeFormatUnit\n );\n }\n\n difference /= length;\n }\n\n return capitalize(formatter.format(Math.round(difference), \"years\"));\n}\n\n/**\n * Formats a date relatively if it's recent or soon,\n * otherwise absolutely with only the day and month.\n */\nfunction formatDynamicDate(date: Date, locale?: string) {\n return Math.abs(date.getTime() - Date.now()) <= DYNAMIC_DATE_THRESHOLD\n ? formatRelativeDate(date, locale)\n : formatShortDate(date, locale);\n}\n\n/**\n * Displays a formatted date, and automatically re-renders to support relative\n * formatting. Defaults to relative formatting for nearby dates and a short\n * absolute formatting for more distant ones.\n *\n * @example\n * <Timestamp date={new Date()} />\n *\n * @example\n * <Timestamp date={new Date()} title={(date) => date.toISOString()} interval={false}>\n * {(date) => date.toLocaleDateString()}\n * </Timestamp>\n */\nexport const Timestamp = forwardRef<HTMLTimeElement, TimestampProps>(\n (\n {\n date,\n locale,\n children: renderChildren = formatDynamicDate,\n title: renderTitle = formatVerboseDate,\n dateTime,\n interval = RENDER_INTERVAL,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"time\";\n const [rerender, key] = useRerender();\n const parsedDate = useMemo(() => new Date(date), [date]);\n const normalizedDate = useMemo(\n () => parsedDate.toISOString(),\n [parsedDate]\n );\n const title = useMemo(\n () =>\n typeof renderTitle === \"function\"\n ? renderTitle(parsedDate, locale)\n : renderTitle,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [renderTitle, parsedDate, locale, key]\n );\n const children = useMemo(\n () =>\n typeof renderChildren === \"function\"\n ? renderChildren(parsedDate, locale)\n : renderChildren,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [renderChildren, parsedDate, locale, key]\n );\n\n useInterval(rerender, interval);\n\n return (\n <Component\n {...props}\n ref={forwardedRef}\n dateTime={dateTime ?? normalizedDate}\n title={title}\n >\n {children}\n </Component>\n );\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n Timestamp.displayName = TIMESTAMP_NAME;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAYA;AACA;AAEA;AA+BA;AAAsB;AACX;AACA;AACF;AACD;AACC;AAET;AAKA;AACE;AAAyC;AACjC;AACC;AACF;AACC;AACE;AAGV;AACF;AAKA;AACE;AAAyC;AAChC;AACF;AAGP;AACF;AAGA;AAAkD;AAChD;AACA;AACA;AACA;AACA;AACA;AAEF;AAKgB;AACd;AAEA;AACE;AAAiB;AAEjB;AAEA;AAA6C;AAG/C;AAAqE;AAEE;AAGvE;AAAqD;AACb;AAC7B;AAGX;AAEA;AAIE;AAAoC;AAGtC;AACE;AACE;AAAiB;AACM;AACrB;AACF;AAGF;AAAc;AAGhB;AACF;AAMA;AACE;AAGF;AAeO;AAAkB;AAErB;AACE;AACA;AAC2B;AACN;AACrB;AACW;AACX;AACG;AAIL;AACA;AACA;AACA;AAAuB;AACQ;AAClB;AAEb;AAAc;AAIN;AAE+B;AAEvC;AAAiB;AAIT;AAEkC;AAG1C;AAEA;AACG;AACK;AACC;AACiB;AACtB;AAEC;AACH;AAGN;AAEA;AACE;AACF;;;"}
1
+ {"version":3,"file":"Timestamp.cjs","sources":["../../src/primitives/Timestamp.tsx"],"sourcesContent":["\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { ReactNode } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\nimport { capitalize } from \"../utils/capitalize\";\nimport { dateTimeFormat, relativeTimeFormat } from \"../utils/intl\";\nimport { useInterval } from \"../utils/use-interval\";\nimport { useRerender } from \"../utils/use-rerender\";\n\nconst DYNAMIC_DATE_THRESHOLD = 3 * 24 * 60 * 60 * 1000; // 3 days\nconst RENDER_INTERVAL = 30 * 1000; // 30 seconds\n\nconst TIMESTAMP_NAME = \"Timestamp\";\n\nexport interface TimestampProps\n extends Omit<ComponentPropsWithSlot<\"time\">, \"children\" | \"title\"> {\n /**\n * The date to display.\n */\n date: Date | string | number;\n\n /**\n * A function to format the displayed date.\n */\n children?: (date: Date, locale?: string) => ReactNode;\n\n /**\n * The `title` attribute's value or a function to format it.\n */\n title?: string | ((date: Date, locale?: string) => string);\n\n /**\n * The interval in milliseconds at which the component will re-render.\n * Can be set to `false` to disable re-rendering.\n */\n interval?: number | false;\n\n /**\n * The locale used when formatting the date.\n */\n locale?: string;\n}\n\nconst relativeUnits = {\n seconds: 60,\n minutes: 60,\n hours: 24,\n days: 7,\n weeks: 4.34524,\n months: 12,\n};\n\n/**\n * Formats a date absolutely.\n */\nfunction formatVerboseDate(date: Date, locale?: string) {\n const formatter = dateTimeFormat(locale, {\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n });\n\n return capitalize(formatter.format(date));\n}\n\n/**\n * Formats a date absolutely with only the day and month.\n */\nfunction formatShortDate(date: Date, locale?: string) {\n const formatter = dateTimeFormat(locale, {\n month: \"short\",\n day: \"numeric\",\n });\n\n return capitalize(formatter.format(date));\n}\n\n// Some locales' relative formatting can be broken (e.g. \"-1h\") when using the narrow style.\nconst localesWithBrokenNarrowRelativeFormatting = [\n \"br\",\n \"fr\",\n \"nb\",\n \"nn\",\n \"no\",\n \"ro\",\n \"sv\",\n];\n\n/**\n * Formats a date relatively.\n */\nexport function formatRelativeDate(date: Date, locale?: string) {\n let resolvedLocale: string;\n\n if (locale) {\n resolvedLocale = locale;\n } else {\n const formatter = relativeTimeFormat();\n\n resolvedLocale = formatter.resolvedOptions().locale;\n }\n\n const isBrokenWhenNarrow = localesWithBrokenNarrowRelativeFormatting.some(\n (locale) =>\n resolvedLocale === locale || resolvedLocale.startsWith(`${locale}-`)\n );\n\n const formatter = relativeTimeFormat(resolvedLocale, {\n style: isBrokenWhenNarrow ? \"short\" : \"narrow\",\n numeric: \"auto\",\n });\n\n let difference = (date.getTime() - Date.now()) / 1000;\n\n if (\n difference > -relativeUnits.seconds &&\n difference < relativeUnits.seconds\n ) {\n return formatter.format(0, \"seconds\");\n }\n\n for (const [unit, length] of Object.entries(relativeUnits)) {\n if (Math.abs(difference) < length) {\n return formatter.format(\n Math.round(difference),\n unit as Intl.RelativeTimeFormatUnit\n );\n }\n\n difference /= length;\n }\n\n return capitalize(formatter.format(Math.round(difference), \"years\"));\n}\n\n/**\n * Formats a date relatively if it's recent or soon,\n * otherwise absolutely with only the day and month.\n */\nfunction formatDynamicDate(date: Date, locale?: string) {\n return Math.abs(date.getTime() - Date.now()) <= DYNAMIC_DATE_THRESHOLD\n ? formatRelativeDate(date, locale)\n : formatShortDate(date, locale);\n}\n\n/**\n * Displays a formatted date, and automatically re-renders to support relative\n * formatting. Defaults to relative formatting for nearby dates and a short\n * absolute formatting for more distant ones.\n *\n * @example\n * <Timestamp date={new Date()} />\n *\n * @example\n * <Timestamp date={new Date()} title={(date) => date.toISOString()} interval={false}>\n * {(date) => date.toLocaleDateString()}\n * </Timestamp>\n */\nexport const Timestamp = forwardRef<HTMLTimeElement, TimestampProps>(\n (\n {\n date,\n locale,\n children: renderChildren = formatDynamicDate,\n title: renderTitle = formatVerboseDate,\n dateTime,\n interval = RENDER_INTERVAL,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"time\";\n const [rerender, key] = useRerender();\n const parsedDate = useMemo(() => new Date(date), [date]);\n const normalizedDate = useMemo(\n () => parsedDate.toISOString(),\n [parsedDate]\n );\n const title = useMemo(\n () =>\n typeof renderTitle === \"function\"\n ? renderTitle(parsedDate, locale)\n : renderTitle,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [renderTitle, parsedDate, locale, key]\n );\n const children = useMemo(\n () =>\n typeof renderChildren === \"function\"\n ? renderChildren(parsedDate, locale)\n : renderChildren,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [renderChildren, parsedDate, locale, key]\n );\n\n useInterval(rerender, interval);\n\n return (\n <Component\n {...props}\n ref={forwardedRef}\n dateTime={dateTime ?? normalizedDate}\n title={title}\n >\n {children}\n </Component>\n );\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n Timestamp.displayName = TIMESTAMP_NAME;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAYA;AACA;AAEA;AA+BA;AAAsB;AACX;AACA;AACF;AACD;AACC;AAET;AAKA;AACE;AAAyC;AACjC;AACC;AACF;AACC;AACE;AAGV;AACF;AAKA;AACE;AAAyC;AAChC;AACF;AAGP;AACF;AAGA;AAAkD;AAChD;AACA;AACA;AACA;AACA;AACA;AAEF;AAKgB;AACd;AAEA;AACE;AAAiB;AAEjB;AAEA;AAA6C;AAG/C;AAAqE;AAEE;AAGvE;AAAqD;AACb;AAC7B;AAGX;AAEA;AAIE;AAAoC;AAGtC;AACE;AACE;AAAiB;AACM;AACrB;AACF;AAGF;AAAc;AAGhB;AACF;AAMA;AACE;AAGF;AAeO;AAAkB;AAErB;AACE;AACA;AAC2B;AACN;AACrB;AACW;AACX;AACG;AAIL;AACA;AACA;AACA;AAAuB;AACQ;AAClB;AAEb;AAAc;AAIN;AAAA;AAE+B;AAEvC;AAAiB;AAIT;AAAA;AAEkC;AAG1C;AAEA;AACE;AAAC;AAAA;AACK;AACC;AACiB;AACtB;AAEC;AAAA;AACH;AAGN;AAEA;AACE;AACF;;;"}
@@ -98,20 +98,25 @@ const Timestamp = forwardRef(
98
98
  );
99
99
  const title = useMemo(
100
100
  () => typeof renderTitle === "function" ? renderTitle(parsedDate, locale) : renderTitle,
101
+ // eslint-disable-next-line react-hooks/exhaustive-deps
101
102
  [renderTitle, parsedDate, locale, key]
102
103
  );
103
104
  const children = useMemo(
104
105
  () => typeof renderChildren === "function" ? renderChildren(parsedDate, locale) : renderChildren,
106
+ // eslint-disable-next-line react-hooks/exhaustive-deps
105
107
  [renderChildren, parsedDate, locale, key]
106
108
  );
107
109
  useInterval(rerender, interval);
108
- return /* @__PURE__ */ jsx(Component, {
109
- ...props,
110
- ref: forwardedRef,
111
- dateTime: dateTime ?? normalizedDate,
112
- title,
113
- children
114
- });
110
+ return /* @__PURE__ */ jsx(
111
+ Component,
112
+ {
113
+ ...props,
114
+ ref: forwardedRef,
115
+ dateTime: dateTime ?? normalizedDate,
116
+ title,
117
+ children
118
+ }
119
+ );
115
120
  }
116
121
  );
117
122
  if (process.env.NODE_ENV !== "production") {
@@ -1 +1 @@
1
- {"version":3,"file":"Timestamp.js","sources":["../../src/primitives/Timestamp.tsx"],"sourcesContent":["\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { ReactNode } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\nimport { capitalize } from \"../utils/capitalize\";\nimport { dateTimeFormat, relativeTimeFormat } from \"../utils/intl\";\nimport { useInterval } from \"../utils/use-interval\";\nimport { useRerender } from \"../utils/use-rerender\";\n\nconst DYNAMIC_DATE_THRESHOLD = 3 * 24 * 60 * 60 * 1000; // 3 days\nconst RENDER_INTERVAL = 30 * 1000; // 30 seconds\n\nconst TIMESTAMP_NAME = \"Timestamp\";\n\nexport interface TimestampProps\n extends Omit<ComponentPropsWithSlot<\"time\">, \"children\" | \"title\"> {\n /**\n * The date to display.\n */\n date: Date | string | number;\n\n /**\n * A function to format the displayed date.\n */\n children?: (date: Date, locale?: string) => ReactNode;\n\n /**\n * The `title` attribute's value or a function to format it.\n */\n title?: string | ((date: Date, locale?: string) => string);\n\n /**\n * The interval in milliseconds at which the component will re-render.\n * Can be set to `false` to disable re-rendering.\n */\n interval?: number | false;\n\n /**\n * The locale used when formatting the date.\n */\n locale?: string;\n}\n\nconst relativeUnits = {\n seconds: 60,\n minutes: 60,\n hours: 24,\n days: 7,\n weeks: 4.34524,\n months: 12,\n};\n\n/**\n * Formats a date absolutely.\n */\nfunction formatVerboseDate(date: Date, locale?: string) {\n const formatter = dateTimeFormat(locale, {\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n });\n\n return capitalize(formatter.format(date));\n}\n\n/**\n * Formats a date absolutely with only the day and month.\n */\nfunction formatShortDate(date: Date, locale?: string) {\n const formatter = dateTimeFormat(locale, {\n month: \"short\",\n day: \"numeric\",\n });\n\n return capitalize(formatter.format(date));\n}\n\n// Some locales' relative formatting can be broken (e.g. \"-1h\") when using the narrow style.\nconst localesWithBrokenNarrowRelativeFormatting = [\n \"br\",\n \"fr\",\n \"nb\",\n \"nn\",\n \"no\",\n \"ro\",\n \"sv\",\n];\n\n/**\n * Formats a date relatively.\n */\nexport function formatRelativeDate(date: Date, locale?: string) {\n let resolvedLocale: string;\n\n if (locale) {\n resolvedLocale = locale;\n } else {\n const formatter = relativeTimeFormat();\n\n resolvedLocale = formatter.resolvedOptions().locale;\n }\n\n const isBrokenWhenNarrow = localesWithBrokenNarrowRelativeFormatting.some(\n (locale) =>\n resolvedLocale === locale || resolvedLocale.startsWith(`${locale}-`)\n );\n\n const formatter = relativeTimeFormat(resolvedLocale, {\n style: isBrokenWhenNarrow ? \"short\" : \"narrow\",\n numeric: \"auto\",\n });\n\n let difference = (date.getTime() - Date.now()) / 1000;\n\n if (\n difference > -relativeUnits.seconds &&\n difference < relativeUnits.seconds\n ) {\n return formatter.format(0, \"seconds\");\n }\n\n for (const [unit, length] of Object.entries(relativeUnits)) {\n if (Math.abs(difference) < length) {\n return formatter.format(\n Math.round(difference),\n unit as Intl.RelativeTimeFormatUnit\n );\n }\n\n difference /= length;\n }\n\n return capitalize(formatter.format(Math.round(difference), \"years\"));\n}\n\n/**\n * Formats a date relatively if it's recent or soon,\n * otherwise absolutely with only the day and month.\n */\nfunction formatDynamicDate(date: Date, locale?: string) {\n return Math.abs(date.getTime() - Date.now()) <= DYNAMIC_DATE_THRESHOLD\n ? formatRelativeDate(date, locale)\n : formatShortDate(date, locale);\n}\n\n/**\n * Displays a formatted date, and automatically re-renders to support relative\n * formatting. Defaults to relative formatting for nearby dates and a short\n * absolute formatting for more distant ones.\n *\n * @example\n * <Timestamp date={new Date()} />\n *\n * @example\n * <Timestamp date={new Date()} title={(date) => date.toISOString()} interval={false}>\n * {(date) => date.toLocaleDateString()}\n * </Timestamp>\n */\nexport const Timestamp = forwardRef<HTMLTimeElement, TimestampProps>(\n (\n {\n date,\n locale,\n children: renderChildren = formatDynamicDate,\n title: renderTitle = formatVerboseDate,\n dateTime,\n interval = RENDER_INTERVAL,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"time\";\n const [rerender, key] = useRerender();\n const parsedDate = useMemo(() => new Date(date), [date]);\n const normalizedDate = useMemo(\n () => parsedDate.toISOString(),\n [parsedDate]\n );\n const title = useMemo(\n () =>\n typeof renderTitle === \"function\"\n ? renderTitle(parsedDate, locale)\n : renderTitle,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [renderTitle, parsedDate, locale, key]\n );\n const children = useMemo(\n () =>\n typeof renderChildren === \"function\"\n ? renderChildren(parsedDate, locale)\n : renderChildren,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [renderChildren, parsedDate, locale, key]\n );\n\n useInterval(rerender, interval);\n\n return (\n <Component\n {...props}\n ref={forwardedRef}\n dateTime={dateTime ?? normalizedDate}\n title={title}\n >\n {children}\n </Component>\n );\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n Timestamp.displayName = TIMESTAMP_NAME;\n}\n"],"names":[],"mappings":";;;;;;;;;;AAYA;AACA;AAEA;AA+BA;AAAsB;AACX;AACA;AACF;AACD;AACC;AAET;AAKA;AACE;AAAyC;AACjC;AACC;AACF;AACC;AACE;AAGV;AACF;AAKA;AACE;AAAyC;AAChC;AACF;AAGP;AACF;AAGA;AAAkD;AAChD;AACA;AACA;AACA;AACA;AACA;AAEF;AAKgB;AACd;AAEA;AACE;AAAiB;AAEjB;AAEA;AAA6C;AAG/C;AAAqE;AAEE;AAGvE;AAAqD;AACb;AAC7B;AAGX;AAEA;AAIE;AAAoC;AAGtC;AACE;AACE;AAAiB;AACM;AACrB;AACF;AAGF;AAAc;AAGhB;AACF;AAMA;AACE;AAGF;AAeO;AAAkB;AAErB;AACE;AACA;AAC2B;AACN;AACrB;AACW;AACX;AACG;AAIL;AACA;AACA;AACA;AAAuB;AACQ;AAClB;AAEb;AAAc;AAIN;AAE+B;AAEvC;AAAiB;AAIT;AAEkC;AAG1C;AAEA;AACG;AACK;AACC;AACiB;AACtB;AAEC;AACH;AAGN;AAEA;AACE;AACF;;"}
1
+ {"version":3,"file":"Timestamp.js","sources":["../../src/primitives/Timestamp.tsx"],"sourcesContent":["\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { ReactNode } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport type { ComponentPropsWithSlot } from \"../types\";\nimport { capitalize } from \"../utils/capitalize\";\nimport { dateTimeFormat, relativeTimeFormat } from \"../utils/intl\";\nimport { useInterval } from \"../utils/use-interval\";\nimport { useRerender } from \"../utils/use-rerender\";\n\nconst DYNAMIC_DATE_THRESHOLD = 3 * 24 * 60 * 60 * 1000; // 3 days\nconst RENDER_INTERVAL = 30 * 1000; // 30 seconds\n\nconst TIMESTAMP_NAME = \"Timestamp\";\n\nexport interface TimestampProps\n extends Omit<ComponentPropsWithSlot<\"time\">, \"children\" | \"title\"> {\n /**\n * The date to display.\n */\n date: Date | string | number;\n\n /**\n * A function to format the displayed date.\n */\n children?: (date: Date, locale?: string) => ReactNode;\n\n /**\n * The `title` attribute's value or a function to format it.\n */\n title?: string | ((date: Date, locale?: string) => string);\n\n /**\n * The interval in milliseconds at which the component will re-render.\n * Can be set to `false` to disable re-rendering.\n */\n interval?: number | false;\n\n /**\n * The locale used when formatting the date.\n */\n locale?: string;\n}\n\nconst relativeUnits = {\n seconds: 60,\n minutes: 60,\n hours: 24,\n days: 7,\n weeks: 4.34524,\n months: 12,\n};\n\n/**\n * Formats a date absolutely.\n */\nfunction formatVerboseDate(date: Date, locale?: string) {\n const formatter = dateTimeFormat(locale, {\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n });\n\n return capitalize(formatter.format(date));\n}\n\n/**\n * Formats a date absolutely with only the day and month.\n */\nfunction formatShortDate(date: Date, locale?: string) {\n const formatter = dateTimeFormat(locale, {\n month: \"short\",\n day: \"numeric\",\n });\n\n return capitalize(formatter.format(date));\n}\n\n// Some locales' relative formatting can be broken (e.g. \"-1h\") when using the narrow style.\nconst localesWithBrokenNarrowRelativeFormatting = [\n \"br\",\n \"fr\",\n \"nb\",\n \"nn\",\n \"no\",\n \"ro\",\n \"sv\",\n];\n\n/**\n * Formats a date relatively.\n */\nexport function formatRelativeDate(date: Date, locale?: string) {\n let resolvedLocale: string;\n\n if (locale) {\n resolvedLocale = locale;\n } else {\n const formatter = relativeTimeFormat();\n\n resolvedLocale = formatter.resolvedOptions().locale;\n }\n\n const isBrokenWhenNarrow = localesWithBrokenNarrowRelativeFormatting.some(\n (locale) =>\n resolvedLocale === locale || resolvedLocale.startsWith(`${locale}-`)\n );\n\n const formatter = relativeTimeFormat(resolvedLocale, {\n style: isBrokenWhenNarrow ? \"short\" : \"narrow\",\n numeric: \"auto\",\n });\n\n let difference = (date.getTime() - Date.now()) / 1000;\n\n if (\n difference > -relativeUnits.seconds &&\n difference < relativeUnits.seconds\n ) {\n return formatter.format(0, \"seconds\");\n }\n\n for (const [unit, length] of Object.entries(relativeUnits)) {\n if (Math.abs(difference) < length) {\n return formatter.format(\n Math.round(difference),\n unit as Intl.RelativeTimeFormatUnit\n );\n }\n\n difference /= length;\n }\n\n return capitalize(formatter.format(Math.round(difference), \"years\"));\n}\n\n/**\n * Formats a date relatively if it's recent or soon,\n * otherwise absolutely with only the day and month.\n */\nfunction formatDynamicDate(date: Date, locale?: string) {\n return Math.abs(date.getTime() - Date.now()) <= DYNAMIC_DATE_THRESHOLD\n ? formatRelativeDate(date, locale)\n : formatShortDate(date, locale);\n}\n\n/**\n * Displays a formatted date, and automatically re-renders to support relative\n * formatting. Defaults to relative formatting for nearby dates and a short\n * absolute formatting for more distant ones.\n *\n * @example\n * <Timestamp date={new Date()} />\n *\n * @example\n * <Timestamp date={new Date()} title={(date) => date.toISOString()} interval={false}>\n * {(date) => date.toLocaleDateString()}\n * </Timestamp>\n */\nexport const Timestamp = forwardRef<HTMLTimeElement, TimestampProps>(\n (\n {\n date,\n locale,\n children: renderChildren = formatDynamicDate,\n title: renderTitle = formatVerboseDate,\n dateTime,\n interval = RENDER_INTERVAL,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"time\";\n const [rerender, key] = useRerender();\n const parsedDate = useMemo(() => new Date(date), [date]);\n const normalizedDate = useMemo(\n () => parsedDate.toISOString(),\n [parsedDate]\n );\n const title = useMemo(\n () =>\n typeof renderTitle === \"function\"\n ? renderTitle(parsedDate, locale)\n : renderTitle,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [renderTitle, parsedDate, locale, key]\n );\n const children = useMemo(\n () =>\n typeof renderChildren === \"function\"\n ? renderChildren(parsedDate, locale)\n : renderChildren,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [renderChildren, parsedDate, locale, key]\n );\n\n useInterval(rerender, interval);\n\n return (\n <Component\n {...props}\n ref={forwardedRef}\n dateTime={dateTime ?? normalizedDate}\n title={title}\n >\n {children}\n </Component>\n );\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n Timestamp.displayName = TIMESTAMP_NAME;\n}\n"],"names":[],"mappings":";;;;;;;;;;AAYA;AACA;AAEA;AA+BA;AAAsB;AACX;AACA;AACF;AACD;AACC;AAET;AAKA;AACE;AAAyC;AACjC;AACC;AACF;AACC;AACE;AAGV;AACF;AAKA;AACE;AAAyC;AAChC;AACF;AAGP;AACF;AAGA;AAAkD;AAChD;AACA;AACA;AACA;AACA;AACA;AAEF;AAKgB;AACd;AAEA;AACE;AAAiB;AAEjB;AAEA;AAA6C;AAG/C;AAAqE;AAEE;AAGvE;AAAqD;AACb;AAC7B;AAGX;AAEA;AAIE;AAAoC;AAGtC;AACE;AACE;AAAiB;AACM;AACrB;AACF;AAGF;AAAc;AAGhB;AACF;AAMA;AACE;AAGF;AAeO;AAAkB;AAErB;AACE;AACA;AAC2B;AACN;AACrB;AACW;AACX;AACG;AAIL;AACA;AACA;AACA;AAAuB;AACQ;AAClB;AAEb;AAAc;AAIN;AAAA;AAE+B;AAEvC;AAAiB;AAIT;AAAA;AAEkC;AAG1C;AAEA;AACE;AAAC;AAAA;AACK;AACC;AACiB;AACtB;AAEC;AAAA;AACH;AAGN;AAEA;AACE;AACF;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-dom-range.cjs","sources":["../../../../src/primitives/slate/utils/get-dom-range.ts"],"sourcesContent":["import type { Editor as SlateEditor, Range as SlateRange } from \"slate\";\nimport { ReactEditor } from \"slate-react\";\n\nexport function getDOMRange(\n editor: SlateEditor,\n range: SlateRange\n): Range | undefined {\n try {\n return ReactEditor.toDOMRange(editor, range);\n } catch (error) {\n return getDOMRange(editor, {\n anchor: range.anchor,\n focus: range.anchor,\n });\n }\n}\n"],"names":["ReactEditor"],"mappings":";;;;AAGgB,SAAA,WAAA,CACd,QACA,KACmB,EAAA;AACnB,EAAI,IAAA;AACF,IAAO,OAAAA,sBAAA,CAAY,UAAW,CAAA,MAAA,EAAQ,KAAK,CAAA,CAAA;AAAA,WACpC,KAAP,EAAA;AACA,IAAA,OAAO,YAAY,MAAQ,EAAA;AAAA,MACzB,QAAQ,KAAM,CAAA,MAAA;AAAA,MACd,OAAO,KAAM,CAAA,MAAA;AAAA,KACd,CAAA,CAAA;AAAA,GACH;AACF;;;;"}
1
+ {"version":3,"file":"get-dom-range.cjs","sources":["../../../../src/primitives/slate/utils/get-dom-range.ts"],"sourcesContent":["import type { Editor as SlateEditor, Range as SlateRange } from \"slate\";\nimport { ReactEditor } from \"slate-react\";\n\nexport function getDOMRange(\n editor: SlateEditor,\n range: SlateRange\n): Range | undefined {\n try {\n return ReactEditor.toDOMRange(editor, range);\n } catch (error) {\n return getDOMRange(editor, {\n anchor: range.anchor,\n focus: range.anchor,\n });\n }\n}\n"],"names":["ReactEditor"],"mappings":";;;;AAGgB,SAAA,WAAA,CACd,QACA,KACmB,EAAA;AACnB,EAAI,IAAA;AACF,IAAO,OAAAA,sBAAA,CAAY,UAAW,CAAA,MAAA,EAAQ,KAAK,CAAA,CAAA;AAAA,WACpC,KAAO,EAAA;AACd,IAAA,OAAO,YAAY,MAAQ,EAAA;AAAA,MACzB,QAAQ,KAAM,CAAA,MAAA;AAAA,MACd,OAAO,KAAM,CAAA,MAAA;AAAA,KACd,CAAA,CAAA;AAAA,GACH;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-dom-range.js","sources":["../../../../src/primitives/slate/utils/get-dom-range.ts"],"sourcesContent":["import type { Editor as SlateEditor, Range as SlateRange } from \"slate\";\nimport { ReactEditor } from \"slate-react\";\n\nexport function getDOMRange(\n editor: SlateEditor,\n range: SlateRange\n): Range | undefined {\n try {\n return ReactEditor.toDOMRange(editor, range);\n } catch (error) {\n return getDOMRange(editor, {\n anchor: range.anchor,\n focus: range.anchor,\n });\n }\n}\n"],"names":[],"mappings":";;AAGgB,SAAA,WAAA,CACd,QACA,KACmB,EAAA;AACnB,EAAI,IAAA;AACF,IAAO,OAAA,WAAA,CAAY,UAAW,CAAA,MAAA,EAAQ,KAAK,CAAA,CAAA;AAAA,WACpC,KAAP,EAAA;AACA,IAAA,OAAO,YAAY,MAAQ,EAAA;AAAA,MACzB,QAAQ,KAAM,CAAA,MAAA;AAAA,MACd,OAAO,KAAM,CAAA,MAAA;AAAA,KACd,CAAA,CAAA;AAAA,GACH;AACF;;;;"}
1
+ {"version":3,"file":"get-dom-range.js","sources":["../../../../src/primitives/slate/utils/get-dom-range.ts"],"sourcesContent":["import type { Editor as SlateEditor, Range as SlateRange } from \"slate\";\nimport { ReactEditor } from \"slate-react\";\n\nexport function getDOMRange(\n editor: SlateEditor,\n range: SlateRange\n): Range | undefined {\n try {\n return ReactEditor.toDOMRange(editor, range);\n } catch (error) {\n return getDOMRange(editor, {\n anchor: range.anchor,\n focus: range.anchor,\n });\n }\n}\n"],"names":[],"mappings":";;AAGgB,SAAA,WAAA,CACd,QACA,KACmB,EAAA;AACnB,EAAI,IAAA;AACF,IAAO,OAAA,WAAA,CAAY,UAAW,CAAA,MAAA,EAAQ,KAAK,CAAA,CAAA;AAAA,WACpC,KAAO,EAAA;AACd,IAAA,OAAO,YAAY,MAAQ,EAAA;AAAA,MACzB,QAAQ,KAAM,CAAA,MAAA;AAAA,MACd,OAAO,KAAM,CAAA,MAAA;AAAA,KACd,CAAA,CAAA;AAAA,GACH;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-match-range.cjs","sources":["../../../../src/primitives/slate/utils/get-match-range.ts"],"sourcesContent":["import type { Point as SlatePoint } from \"slate\";\nimport {\n Editor as SlateEditor,\n Path as SlatePath,\n Range as SlateRange,\n} from \"slate\";\n\nimport { isWhitespaceCharacter } from \"./is-whitespace-character\";\n\ninterface Options {\n include?: boolean;\n direction?: \"before\" | \"after\" | \"both\";\n allowConsecutiveWhitespace?: boolean;\n ignoreTerminator?: (\n character: string,\n point: SlatePoint,\n direction: \"before\" | \"after\"\n ) => boolean;\n}\n\nconst defaultOptions: Options = {\n direction: \"before\",\n allowConsecutiveWhitespace: true,\n};\n\nexport function getMatchRange(\n editor: SlateEditor,\n at: SlateRange,\n terminators: string[] = [\" \"],\n options: Options = defaultOptions\n): SlateRange | undefined {\n const { include, direction, ignoreTerminator, allowConsecutiveWhitespace } = {\n ...defaultOptions,\n ...options,\n };\n\n let [start, end] = SlateRange.edges(at);\n let point: SlatePoint = start;\n let previousCharacterWasWhitespace = false;\n\n function move(direction: \"before\" | \"after\"): boolean {\n const nextPoint =\n direction === \"after\"\n ? SlateEditor.after(editor, point, { unit: \"character\" })\n : SlateEditor.before(editor, point, { unit: \"character\" });\n\n // Stop if we reached the end of a block\n if (!nextPoint || SlatePath.compare(nextPoint.path, point.path) !== 0) {\n return false;\n }\n\n const nextCharacter =\n nextPoint &&\n SlateEditor.string(\n editor,\n direction === \"after\"\n ? { anchor: point, focus: nextPoint }\n : { anchor: nextPoint, focus: point }\n );\n const lastCharacter =\n nextCharacter &&\n nextCharacter[direction === \"after\" ? 0 : nextCharacter.length - 1];\n\n if (\n !allowConsecutiveWhitespace &&\n previousCharacterWasWhitespace &&\n isWhitespaceCharacter(lastCharacter)\n ) {\n return false;\n }\n\n if (\n nextPoint &&\n lastCharacter &&\n (!terminators.includes(lastCharacter) ||\n ignoreTerminator?.(lastCharacter, nextPoint, direction))\n ) {\n previousCharacterWasWhitespace = isWhitespaceCharacter(lastCharacter);\n point = nextPoint;\n\n if (point.offset === 0) {\n return false;\n }\n } else {\n return false;\n }\n\n return true;\n }\n\n if (direction !== \"before\") {\n point = end;\n while (move(\"after\"));\n end = point;\n }\n\n if (direction !== \"after\") {\n point = start;\n while (move(\"before\"));\n start = point;\n }\n\n if (include) {\n return {\n anchor:\n direction === \"before\" || direction === \"both\"\n ? (SlateEditor.before(editor, start, { unit: \"offset\" }) ?? start)\n : start,\n focus:\n direction === \"after\" || direction === \"both\"\n ? (SlateEditor.after(editor, end, { unit: \"offset\" }) ?? end)\n : end,\n };\n }\n\n return { anchor: start, focus: end };\n}\n"],"names":["SlateRange","direction","SlateEditor","SlatePath","isWhitespaceCharacter"],"mappings":"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"}
1
+ {"version":3,"file":"get-match-range.cjs","sources":["../../../../src/primitives/slate/utils/get-match-range.ts"],"sourcesContent":["import type { Point as SlatePoint } from \"slate\";\nimport {\n Editor as SlateEditor,\n Path as SlatePath,\n Range as SlateRange,\n} from \"slate\";\n\nimport { isWhitespaceCharacter } from \"./is-whitespace-character\";\n\ninterface Options {\n include?: boolean;\n direction?: \"before\" | \"after\" | \"both\";\n allowConsecutiveWhitespace?: boolean;\n ignoreTerminator?: (\n character: string,\n point: SlatePoint,\n direction: \"before\" | \"after\"\n ) => boolean;\n}\n\nconst defaultOptions: Options = {\n direction: \"before\",\n allowConsecutiveWhitespace: true,\n};\n\nexport function getMatchRange(\n editor: SlateEditor,\n at: SlateRange,\n terminators: string[] = [\" \"],\n options: Options = defaultOptions\n): SlateRange | undefined {\n const { include, direction, ignoreTerminator, allowConsecutiveWhitespace } = {\n ...defaultOptions,\n ...options,\n };\n\n let [start, end] = SlateRange.edges(at);\n let point: SlatePoint = start;\n let previousCharacterWasWhitespace = false;\n\n function move(direction: \"before\" | \"after\"): boolean {\n const nextPoint =\n direction === \"after\"\n ? SlateEditor.after(editor, point, { unit: \"character\" })\n : SlateEditor.before(editor, point, { unit: \"character\" });\n\n // Stop if we reached the end of a block\n if (!nextPoint || SlatePath.compare(nextPoint.path, point.path) !== 0) {\n return false;\n }\n\n const nextCharacter =\n nextPoint &&\n SlateEditor.string(\n editor,\n direction === \"after\"\n ? { anchor: point, focus: nextPoint }\n : { anchor: nextPoint, focus: point }\n );\n const lastCharacter =\n nextCharacter &&\n nextCharacter[direction === \"after\" ? 0 : nextCharacter.length - 1];\n\n if (\n !allowConsecutiveWhitespace &&\n previousCharacterWasWhitespace &&\n isWhitespaceCharacter(lastCharacter)\n ) {\n return false;\n }\n\n if (\n nextPoint &&\n lastCharacter &&\n (!terminators.includes(lastCharacter) ||\n ignoreTerminator?.(lastCharacter, nextPoint, direction))\n ) {\n previousCharacterWasWhitespace = isWhitespaceCharacter(lastCharacter);\n point = nextPoint;\n\n if (point.offset === 0) {\n return false;\n }\n } else {\n return false;\n }\n\n return true;\n }\n\n if (direction !== \"before\") {\n point = end;\n while (move(\"after\"));\n end = point;\n }\n\n if (direction !== \"after\") {\n point = start;\n while (move(\"before\"));\n start = point;\n }\n\n if (include) {\n return {\n anchor:\n direction === \"before\" || direction === \"both\"\n ? (SlateEditor.before(editor, start, { unit: \"offset\" }) ?? start)\n : start,\n focus:\n direction === \"after\" || direction === \"both\"\n ? (SlateEditor.after(editor, end, { unit: \"offset\" }) ?? end)\n : end,\n };\n }\n\n return { anchor: start, focus: end };\n}\n"],"names":["SlateRange","direction","SlateEditor","SlatePath","isWhitespaceCharacter"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-match-range.js","sources":["../../../../src/primitives/slate/utils/get-match-range.ts"],"sourcesContent":["import type { Point as SlatePoint } from \"slate\";\nimport {\n Editor as SlateEditor,\n Path as SlatePath,\n Range as SlateRange,\n} from \"slate\";\n\nimport { isWhitespaceCharacter } from \"./is-whitespace-character\";\n\ninterface Options {\n include?: boolean;\n direction?: \"before\" | \"after\" | \"both\";\n allowConsecutiveWhitespace?: boolean;\n ignoreTerminator?: (\n character: string,\n point: SlatePoint,\n direction: \"before\" | \"after\"\n ) => boolean;\n}\n\nconst defaultOptions: Options = {\n direction: \"before\",\n allowConsecutiveWhitespace: true,\n};\n\nexport function getMatchRange(\n editor: SlateEditor,\n at: SlateRange,\n terminators: string[] = [\" \"],\n options: Options = defaultOptions\n): SlateRange | undefined {\n const { include, direction, ignoreTerminator, allowConsecutiveWhitespace } = {\n ...defaultOptions,\n ...options,\n };\n\n let [start, end] = SlateRange.edges(at);\n let point: SlatePoint = start;\n let previousCharacterWasWhitespace = false;\n\n function move(direction: \"before\" | \"after\"): boolean {\n const nextPoint =\n direction === \"after\"\n ? SlateEditor.after(editor, point, { unit: \"character\" })\n : SlateEditor.before(editor, point, { unit: \"character\" });\n\n // Stop if we reached the end of a block\n if (!nextPoint || SlatePath.compare(nextPoint.path, point.path) !== 0) {\n return false;\n }\n\n const nextCharacter =\n nextPoint &&\n SlateEditor.string(\n editor,\n direction === \"after\"\n ? { anchor: point, focus: nextPoint }\n : { anchor: nextPoint, focus: point }\n );\n const lastCharacter =\n nextCharacter &&\n nextCharacter[direction === \"after\" ? 0 : nextCharacter.length - 1];\n\n if (\n !allowConsecutiveWhitespace &&\n previousCharacterWasWhitespace &&\n isWhitespaceCharacter(lastCharacter)\n ) {\n return false;\n }\n\n if (\n nextPoint &&\n lastCharacter &&\n (!terminators.includes(lastCharacter) ||\n ignoreTerminator?.(lastCharacter, nextPoint, direction))\n ) {\n previousCharacterWasWhitespace = isWhitespaceCharacter(lastCharacter);\n point = nextPoint;\n\n if (point.offset === 0) {\n return false;\n }\n } else {\n return false;\n }\n\n return true;\n }\n\n if (direction !== \"before\") {\n point = end;\n while (move(\"after\"));\n end = point;\n }\n\n if (direction !== \"after\") {\n point = start;\n while (move(\"before\"));\n start = point;\n }\n\n if (include) {\n return {\n anchor:\n direction === \"before\" || direction === \"both\"\n ? (SlateEditor.before(editor, start, { unit: \"offset\" }) ?? start)\n : start,\n focus:\n direction === \"after\" || direction === \"both\"\n ? (SlateEditor.after(editor, end, { unit: \"offset\" }) ?? end)\n : end,\n };\n }\n\n return { anchor: start, focus: end };\n}\n"],"names":["SlateRange","direction","SlateEditor","SlatePath"],"mappings":"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"}
1
+ {"version":3,"file":"get-match-range.js","sources":["../../../../src/primitives/slate/utils/get-match-range.ts"],"sourcesContent":["import type { Point as SlatePoint } from \"slate\";\nimport {\n Editor as SlateEditor,\n Path as SlatePath,\n Range as SlateRange,\n} from \"slate\";\n\nimport { isWhitespaceCharacter } from \"./is-whitespace-character\";\n\ninterface Options {\n include?: boolean;\n direction?: \"before\" | \"after\" | \"both\";\n allowConsecutiveWhitespace?: boolean;\n ignoreTerminator?: (\n character: string,\n point: SlatePoint,\n direction: \"before\" | \"after\"\n ) => boolean;\n}\n\nconst defaultOptions: Options = {\n direction: \"before\",\n allowConsecutiveWhitespace: true,\n};\n\nexport function getMatchRange(\n editor: SlateEditor,\n at: SlateRange,\n terminators: string[] = [\" \"],\n options: Options = defaultOptions\n): SlateRange | undefined {\n const { include, direction, ignoreTerminator, allowConsecutiveWhitespace } = {\n ...defaultOptions,\n ...options,\n };\n\n let [start, end] = SlateRange.edges(at);\n let point: SlatePoint = start;\n let previousCharacterWasWhitespace = false;\n\n function move(direction: \"before\" | \"after\"): boolean {\n const nextPoint =\n direction === \"after\"\n ? SlateEditor.after(editor, point, { unit: \"character\" })\n : SlateEditor.before(editor, point, { unit: \"character\" });\n\n // Stop if we reached the end of a block\n if (!nextPoint || SlatePath.compare(nextPoint.path, point.path) !== 0) {\n return false;\n }\n\n const nextCharacter =\n nextPoint &&\n SlateEditor.string(\n editor,\n direction === \"after\"\n ? { anchor: point, focus: nextPoint }\n : { anchor: nextPoint, focus: point }\n );\n const lastCharacter =\n nextCharacter &&\n nextCharacter[direction === \"after\" ? 0 : nextCharacter.length - 1];\n\n if (\n !allowConsecutiveWhitespace &&\n previousCharacterWasWhitespace &&\n isWhitespaceCharacter(lastCharacter)\n ) {\n return false;\n }\n\n if (\n nextPoint &&\n lastCharacter &&\n (!terminators.includes(lastCharacter) ||\n ignoreTerminator?.(lastCharacter, nextPoint, direction))\n ) {\n previousCharacterWasWhitespace = isWhitespaceCharacter(lastCharacter);\n point = nextPoint;\n\n if (point.offset === 0) {\n return false;\n }\n } else {\n return false;\n }\n\n return true;\n }\n\n if (direction !== \"before\") {\n point = end;\n while (move(\"after\"));\n end = point;\n }\n\n if (direction !== \"after\") {\n point = start;\n while (move(\"before\"));\n start = point;\n }\n\n if (include) {\n return {\n anchor:\n direction === \"before\" || direction === \"both\"\n ? (SlateEditor.before(editor, start, { unit: \"offset\" }) ?? start)\n : start,\n focus:\n direction === \"after\" || direction === \"both\"\n ? (SlateEditor.after(editor, end, { unit: \"offset\" }) ?? end)\n : end,\n };\n }\n\n return { anchor: start, focus: end };\n}\n"],"names":["SlateRange","direction","SlateEditor","SlatePath"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"is-empty.cjs","sources":["../../../../src/primitives/slate/utils/is-empty.ts"],"sourcesContent":["import type { Descendant as SlateDescendant } from \"slate\";\nimport { Editor as SlateEditor } from \"slate\";\n\nimport { isEmptyString } from \"./is-empty-string\";\nimport { isText } from \"./is-text\";\n\nexport function isEmpty(editor: SlateEditor, children: SlateDescendant[]) {\n // Check if all blocks are empty, stopping at the first non-empty block\n for (const child of children) {\n if (isText(child)) {\n // Non-empty text\n if (!isEmptyString(child.text)) {\n return false;\n }\n } else if (child.type === \"paragraph\") {\n // Non-empty paragraph\n if (\n child.children.length > 1 ||\n (child.children[0] &&\n !(isText(child.children[0]) && isEmptyString(child.children[0].text)))\n ) {\n return false;\n }\n } else {\n // Non-empty other block\n if (!SlateEditor.isEmpty(editor, child)) {\n return false;\n }\n }\n }\n\n return true;\n}\n"],"names":["isText","isEmptyString","SlateEditor"],"mappings":";;;;;;AAMgB,SAAA,OAAA,CAAQ,QAAqB,QAA6B,EAAA;AAExE,EAAA,KAAA,MAAW,SAAS,QAAU,EAAA;AAC5B,IAAI,IAAAA,aAAA,CAAO,KAAK,CAAG,EAAA;AAEjB,MAAA,IAAI,CAACC,2BAAA,CAAc,KAAM,CAAA,IAAI,CAAG,EAAA;AAC9B,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,KACF,MAAA,IAAW,KAAM,CAAA,IAAA,KAAS,WAAa,EAAA;AAErC,MAAA,IACE,MAAM,QAAS,CAAA,MAAA,GAAS,KACvB,KAAM,CAAA,QAAA,CAAS,MACd,EAAED,aAAA,CAAO,KAAM,CAAA,QAAA,CAAS,EAAE,CAAK,IAAAC,2BAAA,CAAc,MAAM,QAAS,CAAA,CAAA,CAAA,CAAG,IAAI,CACrE,CAAA,EAAA;AACA,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,KACK,MAAA;AAEL,MAAA,IAAI,CAACC,YAAA,CAAY,OAAQ,CAAA,MAAA,EAAQ,KAAK,CAAG,EAAA;AACvC,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,KACF;AAAA,GACF;AAEA,EAAO,OAAA,IAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"is-empty.cjs","sources":["../../../../src/primitives/slate/utils/is-empty.ts"],"sourcesContent":["import type { Descendant as SlateDescendant } from \"slate\";\nimport { Editor as SlateEditor } from \"slate\";\n\nimport { isEmptyString } from \"./is-empty-string\";\nimport { isText } from \"./is-text\";\n\nexport function isEmpty(editor: SlateEditor, children: SlateDescendant[]) {\n // Check if all blocks are empty, stopping at the first non-empty block\n for (const child of children) {\n if (isText(child)) {\n // Non-empty text\n if (!isEmptyString(child.text)) {\n return false;\n }\n } else if (child.type === \"paragraph\") {\n // Non-empty paragraph\n if (\n child.children.length > 1 ||\n (child.children[0] &&\n !(isText(child.children[0]) && isEmptyString(child.children[0].text)))\n ) {\n return false;\n }\n } else {\n // Non-empty other block\n if (!SlateEditor.isEmpty(editor, child)) {\n return false;\n }\n }\n }\n\n return true;\n}\n"],"names":["isText","isEmptyString","SlateEditor"],"mappings":";;;;;;AAMgB,SAAA,OAAA,CAAQ,QAAqB,QAA6B,EAAA;AAExE,EAAA,KAAA,MAAW,SAAS,QAAU,EAAA;AAC5B,IAAI,IAAAA,aAAA,CAAO,KAAK,CAAG,EAAA;AAEjB,MAAA,IAAI,CAACC,2BAAA,CAAc,KAAM,CAAA,IAAI,CAAG,EAAA;AAC9B,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,KACF,MAAA,IAAW,KAAM,CAAA,IAAA,KAAS,WAAa,EAAA;AAErC,MACE,IAAA,KAAA,CAAM,SAAS,MAAS,GAAA,CAAA,IACvB,MAAM,QAAS,CAAA,CAAC,KACf,EAAED,aAAA,CAAO,MAAM,QAAS,CAAA,CAAC,CAAC,CAAK,IAAAC,2BAAA,CAAc,MAAM,QAAS,CAAA,CAAC,CAAE,CAAA,IAAI,CACrE,CAAA,EAAA;AACA,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,KACK,MAAA;AAEL,MAAA,IAAI,CAACC,YAAA,CAAY,OAAQ,CAAA,MAAA,EAAQ,KAAK,CAAG,EAAA;AACvC,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,KACF;AAAA,GACF;AAEA,EAAO,OAAA,IAAA,CAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"is-empty.js","sources":["../../../../src/primitives/slate/utils/is-empty.ts"],"sourcesContent":["import type { Descendant as SlateDescendant } from \"slate\";\nimport { Editor as SlateEditor } from \"slate\";\n\nimport { isEmptyString } from \"./is-empty-string\";\nimport { isText } from \"./is-text\";\n\nexport function isEmpty(editor: SlateEditor, children: SlateDescendant[]) {\n // Check if all blocks are empty, stopping at the first non-empty block\n for (const child of children) {\n if (isText(child)) {\n // Non-empty text\n if (!isEmptyString(child.text)) {\n return false;\n }\n } else if (child.type === \"paragraph\") {\n // Non-empty paragraph\n if (\n child.children.length > 1 ||\n (child.children[0] &&\n !(isText(child.children[0]) && isEmptyString(child.children[0].text)))\n ) {\n return false;\n }\n } else {\n // Non-empty other block\n if (!SlateEditor.isEmpty(editor, child)) {\n return false;\n }\n }\n }\n\n return true;\n}\n"],"names":["SlateEditor"],"mappings":";;;;AAMgB,SAAA,OAAA,CAAQ,QAAqB,QAA6B,EAAA;AAExE,EAAA,KAAA,MAAW,SAAS,QAAU,EAAA;AAC5B,IAAI,IAAA,MAAA,CAAO,KAAK,CAAG,EAAA;AAEjB,MAAA,IAAI,CAAC,aAAA,CAAc,KAAM,CAAA,IAAI,CAAG,EAAA;AAC9B,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,KACF,MAAA,IAAW,KAAM,CAAA,IAAA,KAAS,WAAa,EAAA;AAErC,MAAA,IACE,MAAM,QAAS,CAAA,MAAA,GAAS,KACvB,KAAM,CAAA,QAAA,CAAS,MACd,EAAE,MAAA,CAAO,KAAM,CAAA,QAAA,CAAS,EAAE,CAAK,IAAA,aAAA,CAAc,MAAM,QAAS,CAAA,CAAA,CAAA,CAAG,IAAI,CACrE,CAAA,EAAA;AACA,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,KACK,MAAA;AAEL,MAAA,IAAI,CAACA,MAAA,CAAY,OAAQ,CAAA,MAAA,EAAQ,KAAK,CAAG,EAAA;AACvC,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,KACF;AAAA,GACF;AAEA,EAAO,OAAA,IAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"is-empty.js","sources":["../../../../src/primitives/slate/utils/is-empty.ts"],"sourcesContent":["import type { Descendant as SlateDescendant } from \"slate\";\nimport { Editor as SlateEditor } from \"slate\";\n\nimport { isEmptyString } from \"./is-empty-string\";\nimport { isText } from \"./is-text\";\n\nexport function isEmpty(editor: SlateEditor, children: SlateDescendant[]) {\n // Check if all blocks are empty, stopping at the first non-empty block\n for (const child of children) {\n if (isText(child)) {\n // Non-empty text\n if (!isEmptyString(child.text)) {\n return false;\n }\n } else if (child.type === \"paragraph\") {\n // Non-empty paragraph\n if (\n child.children.length > 1 ||\n (child.children[0] &&\n !(isText(child.children[0]) && isEmptyString(child.children[0].text)))\n ) {\n return false;\n }\n } else {\n // Non-empty other block\n if (!SlateEditor.isEmpty(editor, child)) {\n return false;\n }\n }\n }\n\n return true;\n}\n"],"names":["SlateEditor"],"mappings":";;;;AAMgB,SAAA,OAAA,CAAQ,QAAqB,QAA6B,EAAA;AAExE,EAAA,KAAA,MAAW,SAAS,QAAU,EAAA;AAC5B,IAAI,IAAA,MAAA,CAAO,KAAK,CAAG,EAAA;AAEjB,MAAA,IAAI,CAAC,aAAA,CAAc,KAAM,CAAA,IAAI,CAAG,EAAA;AAC9B,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,KACF,MAAA,IAAW,KAAM,CAAA,IAAA,KAAS,WAAa,EAAA;AAErC,MACE,IAAA,KAAA,CAAM,SAAS,MAAS,GAAA,CAAA,IACvB,MAAM,QAAS,CAAA,CAAC,KACf,EAAE,MAAA,CAAO,MAAM,QAAS,CAAA,CAAC,CAAC,CAAK,IAAA,aAAA,CAAc,MAAM,QAAS,CAAA,CAAC,CAAE,CAAA,IAAI,CACrE,CAAA,EAAA;AACA,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,KACK,MAAA;AAEL,MAAA,IAAI,CAACA,MAAA,CAAY,OAAQ,CAAA,MAAA,EAAQ,KAAK,CAAG,EAAA;AACvC,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,KACF;AAAA,GACF;AAEA,EAAO,OAAA,IAAA,CAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"marks.cjs","sources":["../../../../src/primitives/slate/utils/marks.ts"],"sourcesContent":["import type { Text } from \"slate\";\nimport { Editor as SlateEditor, Range as SlateRange } from \"slate\";\n\nimport type { ComposerBodyMarks } from \"../../../types\";\nimport { getCharacterAfter, getCharacterBefore } from \"./get-character\";\n\nconst defaultComposerBodyMarks: Required<ComposerBodyMarks> = {\n bold: false,\n italic: false,\n strikethrough: false,\n code: false,\n};\n\nexport function getComposerBodyMarks(editor?: SlateEditor) {\n if (!editor) {\n return { ...defaultComposerBodyMarks };\n }\n\n const marks = SlateEditor.marks(editor);\n\n return { ...defaultComposerBodyMarks, ...marks };\n}\n\nexport function isMarkActive<M = ComposerBodyMarks>(\n editor: SlateEditor,\n mark: keyof M\n) {\n const marks = SlateEditor.marks(editor) as M | null;\n\n return marks ? marks[mark] === true : false;\n}\n\nexport function filterActiveMarks(\n value: Text | ComposerBodyMarks | null | undefined\n) {\n return Object.keys(value ?? {}).filter(\n (key) => key !== \"text\"\n ) as (keyof ComposerBodyMarks)[];\n}\n\nexport function toggleMark(editor: SlateEditor, mark: keyof ComposerBodyMarks) {\n const isActive = isMarkActive(editor, mark);\n\n if (isActive) {\n SlateEditor.removeMark(editor, mark);\n } else {\n SlateEditor.addMark(editor, mark, true);\n }\n}\n\nexport function removeMarks(editor: SlateEditor) {\n const marks = SlateEditor.marks(editor);\n\n if (marks) {\n for (const mark in marks) {\n SlateEditor.removeMark(editor, mark);\n }\n }\n}\n\nexport function leaveMarkEdge(editor: SlateEditor, edge: \"start\" | \"end\") {\n if (editor.selection && SlateRange.isCollapsed(editor.selection)) {\n const marks = Object.keys(SlateEditor.marks(editor) ?? {});\n\n if (marks.length > 0) {\n const sibling =\n edge === \"start\"\n ? getCharacterBefore(editor, editor.selection)\n : getCharacterAfter(editor, editor.selection);\n\n if (!sibling) {\n removeMarks(editor);\n }\n }\n }\n}\n"],"names":["SlateEditor","SlateRange","getCharacterBefore","getCharacterAfter"],"mappings":";;;;;AAMA,MAAM,wBAAwD,GAAA;AAAA,EAC5D,IAAM,EAAA,KAAA;AAAA,EACN,MAAQ,EAAA,KAAA;AAAA,EACR,aAAe,EAAA,KAAA;AAAA,EACf,IAAM,EAAA,KAAA;AACR,CAAA,CAAA;AAEO,SAAS,qBAAqB,MAAsB,EAAA;AACzD,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,EAAE,GAAG,wBAAyB,EAAA,CAAA;AAAA,GACvC;AAEA,EAAM,MAAA,KAAA,GAAQA,YAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAA,OAAO,EAAE,GAAG,wBAA0B,EAAA,GAAG,KAAM,EAAA,CAAA;AACjD,CAAA;AAEgB,SAAA,YAAA,CACd,QACA,IACA,EAAA;AACA,EAAM,MAAA,KAAA,GAAQA,YAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAO,OAAA,KAAA,GAAQ,KAAM,CAAA,IAAA,CAAA,KAAU,IAAO,GAAA,KAAA,CAAA;AACxC,CAAA;AAEO,SAAS,kBACd,KACA,EAAA;AACA,EAAA,OAAO,MAAO,CAAA,IAAA,CAAK,KAAS,IAAA,EAAE,CAAE,CAAA,MAAA;AAAA,IAC9B,CAAC,QAAQ,GAAQ,KAAA,MAAA;AAAA,GACnB,CAAA;AACF,CAAA;AAEgB,SAAA,UAAA,CAAW,QAAqB,IAA+B,EAAA;AAC7E,EAAM,MAAA,QAAA,GAAW,YAAa,CAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AAE1C,EAAA,IAAI,QAAU,EAAA;AACZ,IAAYA,YAAA,CAAA,UAAA,CAAW,QAAQ,IAAI,CAAA,CAAA;AAAA,GAC9B,MAAA;AACL,IAAYA,YAAA,CAAA,OAAA,CAAQ,MAAQ,EAAA,IAAA,EAAM,IAAI,CAAA,CAAA;AAAA,GACxC;AACF,CAAA;AAEO,SAAS,YAAY,MAAqB,EAAA;AAC/C,EAAM,MAAA,KAAA,GAAQA,YAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACxB,MAAYA,YAAA,CAAA,UAAA,CAAW,QAAQ,IAAI,CAAA,CAAA;AAAA,KACrC;AAAA,GACF;AACF,CAAA;AAEgB,SAAA,aAAA,CAAc,QAAqB,IAAuB,EAAA;AACxE,EAAA,IAAI,OAAO,SAAa,IAAAC,WAAA,CAAW,WAAY,CAAA,MAAA,CAAO,SAAS,CAAG,EAAA;AAChE,IAAM,MAAA,KAAA,GAAQ,OAAO,IAAK,CAAAD,YAAA,CAAY,MAAM,MAAM,CAAA,IAAK,EAAE,CAAA,CAAA;AAEzD,IAAI,IAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AACpB,MAAM,MAAA,OAAA,GACJ,IAAS,KAAA,OAAA,GACLE,+BAAmB,CAAA,MAAA,EAAQ,MAAO,CAAA,SAAS,CAC3C,GAAAC,8BAAA,CAAkB,MAAQ,EAAA,MAAA,CAAO,SAAS,CAAA,CAAA;AAEhD,MAAA,IAAI,CAAC,OAAS,EAAA;AACZ,QAAA,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,OACpB;AAAA,KACF;AAAA,GACF;AACF;;;;;;;;;"}
1
+ {"version":3,"file":"marks.cjs","sources":["../../../../src/primitives/slate/utils/marks.ts"],"sourcesContent":["import type { Text } from \"slate\";\nimport { Editor as SlateEditor, Range as SlateRange } from \"slate\";\n\nimport type { ComposerBodyMarks } from \"../../../types\";\nimport { getCharacterAfter, getCharacterBefore } from \"./get-character\";\n\nconst defaultComposerBodyMarks: Required<ComposerBodyMarks> = {\n bold: false,\n italic: false,\n strikethrough: false,\n code: false,\n};\n\nexport function getComposerBodyMarks(editor?: SlateEditor) {\n if (!editor) {\n return { ...defaultComposerBodyMarks };\n }\n\n const marks = SlateEditor.marks(editor);\n\n return { ...defaultComposerBodyMarks, ...marks };\n}\n\nexport function isMarkActive<M = ComposerBodyMarks>(\n editor: SlateEditor,\n mark: keyof M\n) {\n const marks = SlateEditor.marks(editor) as M | null;\n\n return marks ? marks[mark] === true : false;\n}\n\nexport function filterActiveMarks(\n value: Text | ComposerBodyMarks | null | undefined\n) {\n return Object.keys(value ?? {}).filter(\n (key) => key !== \"text\"\n ) as (keyof ComposerBodyMarks)[];\n}\n\nexport function toggleMark(editor: SlateEditor, mark: keyof ComposerBodyMarks) {\n const isActive = isMarkActive(editor, mark);\n\n if (isActive) {\n SlateEditor.removeMark(editor, mark);\n } else {\n SlateEditor.addMark(editor, mark, true);\n }\n}\n\nexport function removeMarks(editor: SlateEditor) {\n const marks = SlateEditor.marks(editor);\n\n if (marks) {\n for (const mark in marks) {\n SlateEditor.removeMark(editor, mark);\n }\n }\n}\n\nexport function leaveMarkEdge(editor: SlateEditor, edge: \"start\" | \"end\") {\n if (editor.selection && SlateRange.isCollapsed(editor.selection)) {\n const marks = Object.keys(SlateEditor.marks(editor) ?? {});\n\n if (marks.length > 0) {\n const sibling =\n edge === \"start\"\n ? getCharacterBefore(editor, editor.selection)\n : getCharacterAfter(editor, editor.selection);\n\n if (!sibling) {\n removeMarks(editor);\n }\n }\n }\n}\n"],"names":["SlateEditor","SlateRange","getCharacterBefore","getCharacterAfter"],"mappings":";;;;;AAMA,MAAM,wBAAwD,GAAA;AAAA,EAC5D,IAAM,EAAA,KAAA;AAAA,EACN,MAAQ,EAAA,KAAA;AAAA,EACR,aAAe,EAAA,KAAA;AAAA,EACf,IAAM,EAAA,KAAA;AACR,CAAA,CAAA;AAEO,SAAS,qBAAqB,MAAsB,EAAA;AACzD,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,EAAE,GAAG,wBAAyB,EAAA,CAAA;AAAA,GACvC;AAEA,EAAM,MAAA,KAAA,GAAQA,YAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAA,OAAO,EAAE,GAAG,wBAA0B,EAAA,GAAG,KAAM,EAAA,CAAA;AACjD,CAAA;AAEgB,SAAA,YAAA,CACd,QACA,IACA,EAAA;AACA,EAAM,MAAA,KAAA,GAAQA,YAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAA,OAAO,KAAQ,GAAA,KAAA,CAAM,IAAI,CAAA,KAAM,IAAO,GAAA,KAAA,CAAA;AACxC,CAAA;AAEO,SAAS,kBACd,KACA,EAAA;AACA,EAAA,OAAO,MAAO,CAAA,IAAA,CAAK,KAAS,IAAA,EAAE,CAAE,CAAA,MAAA;AAAA,IAC9B,CAAC,QAAQ,GAAQ,KAAA,MAAA;AAAA,GACnB,CAAA;AACF,CAAA;AAEgB,SAAA,UAAA,CAAW,QAAqB,IAA+B,EAAA;AAC7E,EAAM,MAAA,QAAA,GAAW,YAAa,CAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AAE1C,EAAA,IAAI,QAAU,EAAA;AACZ,IAAYA,YAAA,CAAA,UAAA,CAAW,QAAQ,IAAI,CAAA,CAAA;AAAA,GAC9B,MAAA;AACL,IAAYA,YAAA,CAAA,OAAA,CAAQ,MAAQ,EAAA,IAAA,EAAM,IAAI,CAAA,CAAA;AAAA,GACxC;AACF,CAAA;AAEO,SAAS,YAAY,MAAqB,EAAA;AAC/C,EAAM,MAAA,KAAA,GAAQA,YAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACxB,MAAYA,YAAA,CAAA,UAAA,CAAW,QAAQ,IAAI,CAAA,CAAA;AAAA,KACrC;AAAA,GACF;AACF,CAAA;AAEgB,SAAA,aAAA,CAAc,QAAqB,IAAuB,EAAA;AACxE,EAAA,IAAI,OAAO,SAAa,IAAAC,WAAA,CAAW,WAAY,CAAA,MAAA,CAAO,SAAS,CAAG,EAAA;AAChE,IAAM,MAAA,KAAA,GAAQ,OAAO,IAAK,CAAAD,YAAA,CAAY,MAAM,MAAM,CAAA,IAAK,EAAE,CAAA,CAAA;AAEzD,IAAI,IAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AACpB,MAAM,MAAA,OAAA,GACJ,IAAS,KAAA,OAAA,GACLE,+BAAmB,CAAA,MAAA,EAAQ,MAAO,CAAA,SAAS,CAC3C,GAAAC,8BAAA,CAAkB,MAAQ,EAAA,MAAA,CAAO,SAAS,CAAA,CAAA;AAEhD,MAAA,IAAI,CAAC,OAAS,EAAA;AACZ,QAAA,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,OACpB;AAAA,KACF;AAAA,GACF;AACF;;;;;;;;;"}