@liveblocks/react-ui 1.12.0-initial1

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 (391) hide show
  1. package/README.md +65 -0
  2. package/dist/components/Comment.js +473 -0
  3. package/dist/components/Comment.js.map +1 -0
  4. package/dist/components/Comment.mjs +447 -0
  5. package/dist/components/Comment.mjs.map +1 -0
  6. package/dist/components/Composer.js +299 -0
  7. package/dist/components/Composer.js.map +1 -0
  8. package/dist/components/Composer.mjs +297 -0
  9. package/dist/components/Composer.mjs.map +1 -0
  10. package/dist/components/InboxNotification.js +374 -0
  11. package/dist/components/InboxNotification.js.map +1 -0
  12. package/dist/components/InboxNotification.mjs +372 -0
  13. package/dist/components/InboxNotification.mjs.map +1 -0
  14. package/dist/components/InboxNotificationList.js +19 -0
  15. package/dist/components/InboxNotificationList.js.map +1 -0
  16. package/dist/components/InboxNotificationList.mjs +17 -0
  17. package/dist/components/InboxNotificationList.mjs.map +1 -0
  18. package/dist/components/Thread.js +188 -0
  19. package/dist/components/Thread.js.map +1 -0
  20. package/dist/components/Thread.mjs +167 -0
  21. package/dist/components/Thread.mjs.map +1 -0
  22. package/dist/components/internal/Attribution.js +26 -0
  23. package/dist/components/internal/Attribution.js.map +1 -0
  24. package/dist/components/internal/Attribution.mjs +24 -0
  25. package/dist/components/internal/Attribution.mjs.map +1 -0
  26. package/dist/components/internal/Avatar.js +40 -0
  27. package/dist/components/internal/Avatar.js.map +1 -0
  28. package/dist/components/internal/Avatar.mjs +38 -0
  29. package/dist/components/internal/Avatar.mjs.map +1 -0
  30. package/dist/components/internal/Button.js +24 -0
  31. package/dist/components/internal/Button.js.map +1 -0
  32. package/dist/components/internal/Button.mjs +22 -0
  33. package/dist/components/internal/Button.mjs.map +1 -0
  34. package/dist/components/internal/Dropdown.js +72 -0
  35. package/dist/components/internal/Dropdown.js.map +1 -0
  36. package/dist/components/internal/Dropdown.mjs +47 -0
  37. package/dist/components/internal/Dropdown.mjs.map +1 -0
  38. package/dist/components/internal/Emoji.js +18 -0
  39. package/dist/components/internal/Emoji.js.map +1 -0
  40. package/dist/components/internal/Emoji.mjs +16 -0
  41. package/dist/components/internal/Emoji.mjs.map +1 -0
  42. package/dist/components/internal/EmojiPicker.js +186 -0
  43. package/dist/components/internal/EmojiPicker.js.map +1 -0
  44. package/dist/components/internal/EmojiPicker.mjs +162 -0
  45. package/dist/components/internal/EmojiPicker.mjs.map +1 -0
  46. package/dist/components/internal/Icon.js +28 -0
  47. package/dist/components/internal/Icon.js.map +1 -0
  48. package/dist/components/internal/Icon.mjs +24 -0
  49. package/dist/components/internal/Icon.mjs.map +1 -0
  50. package/dist/components/internal/InboxNotificationThread.js +116 -0
  51. package/dist/components/internal/InboxNotificationThread.js.map +1 -0
  52. package/dist/components/internal/InboxNotificationThread.mjs +112 -0
  53. package/dist/components/internal/InboxNotificationThread.mjs.map +1 -0
  54. package/dist/components/internal/List.js +34 -0
  55. package/dist/components/internal/List.js.map +1 -0
  56. package/dist/components/internal/List.mjs +32 -0
  57. package/dist/components/internal/List.mjs.map +1 -0
  58. package/dist/components/internal/Room.js +22 -0
  59. package/dist/components/internal/Room.js.map +1 -0
  60. package/dist/components/internal/Room.mjs +20 -0
  61. package/dist/components/internal/Room.mjs.map +1 -0
  62. package/dist/components/internal/Tooltip.js +91 -0
  63. package/dist/components/internal/Tooltip.js.map +1 -0
  64. package/dist/components/internal/Tooltip.mjs +65 -0
  65. package/dist/components/internal/Tooltip.mjs.map +1 -0
  66. package/dist/components/internal/User.js +41 -0
  67. package/dist/components/internal/User.js.map +1 -0
  68. package/dist/components/internal/User.mjs +39 -0
  69. package/dist/components/internal/User.mjs.map +1 -0
  70. package/dist/components.js +64 -0
  71. package/dist/components.js.map +1 -0
  72. package/dist/components.mjs +41 -0
  73. package/dist/components.mjs.map +1 -0
  74. package/dist/config.js +33 -0
  75. package/dist/config.js.map +1 -0
  76. package/dist/config.mjs +30 -0
  77. package/dist/config.mjs.map +1 -0
  78. package/dist/constants.js +10 -0
  79. package/dist/constants.js.map +1 -0
  80. package/dist/constants.mjs +6 -0
  81. package/dist/constants.mjs.map +1 -0
  82. package/dist/icons/ArrowDown.js +15 -0
  83. package/dist/icons/ArrowDown.js.map +1 -0
  84. package/dist/icons/ArrowDown.mjs +13 -0
  85. package/dist/icons/ArrowDown.mjs.map +1 -0
  86. package/dist/icons/Check.js +15 -0
  87. package/dist/icons/Check.js.map +1 -0
  88. package/dist/icons/Check.mjs +13 -0
  89. package/dist/icons/Check.mjs.map +1 -0
  90. package/dist/icons/Cross.js +17 -0
  91. package/dist/icons/Cross.js.map +1 -0
  92. package/dist/icons/Cross.mjs +15 -0
  93. package/dist/icons/Cross.mjs.map +1 -0
  94. package/dist/icons/Delete.js +15 -0
  95. package/dist/icons/Delete.js.map +1 -0
  96. package/dist/icons/Delete.mjs +13 -0
  97. package/dist/icons/Delete.mjs.map +1 -0
  98. package/dist/icons/Edit.js +15 -0
  99. package/dist/icons/Edit.js.map +1 -0
  100. package/dist/icons/Edit.mjs +13 -0
  101. package/dist/icons/Edit.mjs.map +1 -0
  102. package/dist/icons/Ellipsis.js +26 -0
  103. package/dist/icons/Ellipsis.js.map +1 -0
  104. package/dist/icons/Ellipsis.mjs +24 -0
  105. package/dist/icons/Ellipsis.mjs.map +1 -0
  106. package/dist/icons/Emoji.js +27 -0
  107. package/dist/icons/Emoji.js.map +1 -0
  108. package/dist/icons/Emoji.mjs +25 -0
  109. package/dist/icons/Emoji.mjs.map +1 -0
  110. package/dist/icons/EmojiAdd.js +29 -0
  111. package/dist/icons/EmojiAdd.js.map +1 -0
  112. package/dist/icons/EmojiAdd.mjs +27 -0
  113. package/dist/icons/EmojiAdd.mjs.map +1 -0
  114. package/dist/icons/Mention.js +17 -0
  115. package/dist/icons/Mention.js.map +1 -0
  116. package/dist/icons/Mention.mjs +15 -0
  117. package/dist/icons/Mention.mjs.map +1 -0
  118. package/dist/icons/Missing.js +19 -0
  119. package/dist/icons/Missing.js.map +1 -0
  120. package/dist/icons/Missing.mjs +17 -0
  121. package/dist/icons/Missing.mjs.map +1 -0
  122. package/dist/icons/Resolve.js +19 -0
  123. package/dist/icons/Resolve.js.map +1 -0
  124. package/dist/icons/Resolve.mjs +17 -0
  125. package/dist/icons/Resolve.mjs.map +1 -0
  126. package/dist/icons/Resolved.js +21 -0
  127. package/dist/icons/Resolved.js.map +1 -0
  128. package/dist/icons/Resolved.mjs +19 -0
  129. package/dist/icons/Resolved.mjs.map +1 -0
  130. package/dist/icons/Search.js +15 -0
  131. package/dist/icons/Search.js.map +1 -0
  132. package/dist/icons/Search.mjs +13 -0
  133. package/dist/icons/Search.mjs.map +1 -0
  134. package/dist/icons/Send.js +15 -0
  135. package/dist/icons/Send.js.map +1 -0
  136. package/dist/icons/Send.mjs +13 -0
  137. package/dist/icons/Send.mjs.map +1 -0
  138. package/dist/icons/Spinner.js +22 -0
  139. package/dist/icons/Spinner.js.map +1 -0
  140. package/dist/icons/Spinner.mjs +20 -0
  141. package/dist/icons/Spinner.mjs.map +1 -0
  142. package/dist/index.d.mts +476 -0
  143. package/dist/index.d.ts +476 -0
  144. package/dist/index.js +20 -0
  145. package/dist/index.js.map +1 -0
  146. package/dist/index.mjs +11 -0
  147. package/dist/index.mjs.map +1 -0
  148. package/dist/overrides.js +100 -0
  149. package/dist/overrides.js.map +1 -0
  150. package/dist/overrides.mjs +77 -0
  151. package/dist/overrides.mjs.map +1 -0
  152. package/dist/primitives/Comment/index.js +113 -0
  153. package/dist/primitives/Comment/index.js.map +1 -0
  154. package/dist/primitives/Comment/index.mjs +109 -0
  155. package/dist/primitives/Comment/index.mjs.map +1 -0
  156. package/dist/primitives/Comment/utils.js +25 -0
  157. package/dist/primitives/Comment/utils.js.map +1 -0
  158. package/dist/primitives/Comment/utils.mjs +20 -0
  159. package/dist/primitives/Comment/utils.mjs.map +1 -0
  160. package/dist/primitives/Composer/contexts.js +34 -0
  161. package/dist/primitives/Composer/contexts.js.map +1 -0
  162. package/dist/primitives/Composer/contexts.mjs +27 -0
  163. package/dist/primitives/Composer/contexts.mjs.map +1 -0
  164. package/dist/primitives/Composer/index.js +771 -0
  165. package/dist/primitives/Composer/index.js.map +1 -0
  166. package/dist/primitives/Composer/index.mjs +762 -0
  167. package/dist/primitives/Composer/index.mjs.map +1 -0
  168. package/dist/primitives/Composer/utils.js +102 -0
  169. package/dist/primitives/Composer/utils.js.map +1 -0
  170. package/dist/primitives/Composer/utils.mjs +93 -0
  171. package/dist/primitives/Composer/utils.mjs.map +1 -0
  172. package/dist/primitives/EmojiPicker/contexts.js +19 -0
  173. package/dist/primitives/EmojiPicker/contexts.js.map +1 -0
  174. package/dist/primitives/EmojiPicker/contexts.mjs +16 -0
  175. package/dist/primitives/EmojiPicker/contexts.mjs.map +1 -0
  176. package/dist/primitives/EmojiPicker/index.js +434 -0
  177. package/dist/primitives/EmojiPicker/index.js.map +1 -0
  178. package/dist/primitives/EmojiPicker/index.mjs +430 -0
  179. package/dist/primitives/EmojiPicker/index.mjs.map +1 -0
  180. package/dist/primitives/EmojiPicker/utils.js +329 -0
  181. package/dist/primitives/EmojiPicker/utils.js.map +1 -0
  182. package/dist/primitives/EmojiPicker/utils.mjs +325 -0
  183. package/dist/primitives/EmojiPicker/utils.mjs.map +1 -0
  184. package/dist/primitives/Timestamp.js +121 -0
  185. package/dist/primitives/Timestamp.js.map +1 -0
  186. package/dist/primitives/Timestamp.mjs +119 -0
  187. package/dist/primitives/Timestamp.mjs.map +1 -0
  188. package/dist/primitives/index.d.mts +502 -0
  189. package/dist/primitives/index.d.ts +502 -0
  190. package/dist/primitives/index.js +16 -0
  191. package/dist/primitives/index.js.map +1 -0
  192. package/dist/primitives/index.mjs +9 -0
  193. package/dist/primitives/index.mjs.map +1 -0
  194. package/dist/primitives/internal/Emoji.js +30 -0
  195. package/dist/primitives/internal/Emoji.js.map +1 -0
  196. package/dist/primitives/internal/Emoji.mjs +28 -0
  197. package/dist/primitives/internal/Emoji.mjs.map +1 -0
  198. package/dist/shared.js +21 -0
  199. package/dist/shared.js.map +1 -0
  200. package/dist/shared.mjs +19 -0
  201. package/dist/shared.mjs.map +1 -0
  202. package/dist/slate/plugins/auto-formatting.js +83 -0
  203. package/dist/slate/plugins/auto-formatting.js.map +1 -0
  204. package/dist/slate/plugins/auto-formatting.mjs +81 -0
  205. package/dist/slate/plugins/auto-formatting.mjs.map +1 -0
  206. package/dist/slate/plugins/auto-links.js +175 -0
  207. package/dist/slate/plugins/auto-links.js.map +1 -0
  208. package/dist/slate/plugins/auto-links.mjs +172 -0
  209. package/dist/slate/plugins/auto-links.mjs.map +1 -0
  210. package/dist/slate/plugins/empty-clear-formatting.js +18 -0
  211. package/dist/slate/plugins/empty-clear-formatting.js.map +1 -0
  212. package/dist/slate/plugins/empty-clear-formatting.mjs +16 -0
  213. package/dist/slate/plugins/empty-clear-formatting.mjs.map +1 -0
  214. package/dist/slate/plugins/mentions.js +112 -0
  215. package/dist/slate/plugins/mentions.js.map +1 -0
  216. package/dist/slate/plugins/mentions.mjs +105 -0
  217. package/dist/slate/plugins/mentions.mjs.map +1 -0
  218. package/dist/slate/utils/get-character.js +50 -0
  219. package/dist/slate/utils/get-character.js.map +1 -0
  220. package/dist/slate/utils/get-character.mjs +47 -0
  221. package/dist/slate/utils/get-character.mjs.map +1 -0
  222. package/dist/slate/utils/get-dom-range.js +17 -0
  223. package/dist/slate/utils/get-dom-range.js.map +1 -0
  224. package/dist/slate/utils/get-dom-range.mjs +15 -0
  225. package/dist/slate/utils/get-dom-range.mjs.map +1 -0
  226. package/dist/slate/utils/get-match-range.js +53 -0
  227. package/dist/slate/utils/get-match-range.js.map +1 -0
  228. package/dist/slate/utils/get-match-range.mjs +51 -0
  229. package/dist/slate/utils/get-match-range.mjs.map +1 -0
  230. package/dist/slate/utils/is-empty-string.js +8 -0
  231. package/dist/slate/utils/is-empty-string.js.map +1 -0
  232. package/dist/slate/utils/is-empty-string.mjs +6 -0
  233. package/dist/slate/utils/is-empty-string.mjs.map +1 -0
  234. package/dist/slate/utils/is-empty.js +10 -0
  235. package/dist/slate/utils/is-empty.js.map +1 -0
  236. package/dist/slate/utils/is-empty.mjs +8 -0
  237. package/dist/slate/utils/is-empty.mjs.map +1 -0
  238. package/dist/slate/utils/is-selection-collapsed.js +10 -0
  239. package/dist/slate/utils/is-selection-collapsed.js.map +1 -0
  240. package/dist/slate/utils/is-selection-collapsed.mjs +8 -0
  241. package/dist/slate/utils/is-selection-collapsed.mjs.map +1 -0
  242. package/dist/slate/utils/marks.js +43 -0
  243. package/dist/slate/utils/marks.js.map +1 -0
  244. package/dist/slate/utils/marks.mjs +38 -0
  245. package/dist/slate/utils/marks.mjs.map +1 -0
  246. package/dist/utils/Persist.js +85 -0
  247. package/dist/utils/Persist.js.map +1 -0
  248. package/dist/utils/Persist.mjs +81 -0
  249. package/dist/utils/Persist.mjs.map +1 -0
  250. package/dist/utils/Portal.js +27 -0
  251. package/dist/utils/Portal.js.map +1 -0
  252. package/dist/utils/Portal.mjs +25 -0
  253. package/dist/utils/Portal.mjs.map +1 -0
  254. package/dist/utils/capitalize.js +8 -0
  255. package/dist/utils/capitalize.js.map +1 -0
  256. package/dist/utils/capitalize.mjs +6 -0
  257. package/dist/utils/capitalize.mjs.map +1 -0
  258. package/dist/utils/chunk.js +12 -0
  259. package/dist/utils/chunk.js.map +1 -0
  260. package/dist/utils/chunk.mjs +10 -0
  261. package/dist/utils/chunk.mjs.map +1 -0
  262. package/dist/utils/clamp.js +8 -0
  263. package/dist/utils/clamp.js.map +1 -0
  264. package/dist/utils/clamp.mjs +6 -0
  265. package/dist/utils/clamp.mjs.map +1 -0
  266. package/dist/utils/class-names.js +8 -0
  267. package/dist/utils/class-names.js.map +1 -0
  268. package/dist/utils/class-names.mjs +6 -0
  269. package/dist/utils/class-names.mjs.map +1 -0
  270. package/dist/utils/exists.js +8 -0
  271. package/dist/utils/exists.js.map +1 -0
  272. package/dist/utils/exists.mjs +6 -0
  273. package/dist/utils/exists.mjs.map +1 -0
  274. package/dist/utils/find-last-index.js +15 -0
  275. package/dist/utils/find-last-index.js.map +1 -0
  276. package/dist/utils/find-last-index.mjs +13 -0
  277. package/dist/utils/find-last-index.mjs.map +1 -0
  278. package/dist/utils/flush-sync.js +12 -0
  279. package/dist/utils/flush-sync.js.map +1 -0
  280. package/dist/utils/flush-sync.mjs +10 -0
  281. package/dist/utils/flush-sync.mjs.map +1 -0
  282. package/dist/utils/get-initials.js +13 -0
  283. package/dist/utils/get-initials.js.map +1 -0
  284. package/dist/utils/get-initials.mjs +11 -0
  285. package/dist/utils/get-initials.mjs.map +1 -0
  286. package/dist/utils/intl.js +24 -0
  287. package/dist/utils/intl.js.map +1 -0
  288. package/dist/utils/intl.mjs +20 -0
  289. package/dist/utils/intl.mjs.map +1 -0
  290. package/dist/utils/is-apple.js +9 -0
  291. package/dist/utils/is-apple.js.map +1 -0
  292. package/dist/utils/is-apple.mjs +7 -0
  293. package/dist/utils/is-apple.mjs.map +1 -0
  294. package/dist/utils/is-key.js +26 -0
  295. package/dist/utils/is-key.js.map +1 -0
  296. package/dist/utils/is-key.mjs +24 -0
  297. package/dist/utils/is-key.mjs.map +1 -0
  298. package/dist/utils/memoize.js +19 -0
  299. package/dist/utils/memoize.js.map +1 -0
  300. package/dist/utils/memoize.mjs +17 -0
  301. package/dist/utils/memoize.mjs.map +1 -0
  302. package/dist/utils/pluralize.js +8 -0
  303. package/dist/utils/pluralize.js.map +1 -0
  304. package/dist/utils/pluralize.mjs +6 -0
  305. package/dist/utils/pluralize.mjs.map +1 -0
  306. package/dist/utils/request-idle-callback.js +15 -0
  307. package/dist/utils/request-idle-callback.js.map +1 -0
  308. package/dist/utils/request-idle-callback.mjs +12 -0
  309. package/dist/utils/request-idle-callback.mjs.map +1 -0
  310. package/dist/utils/request-submit.js +20 -0
  311. package/dist/utils/request-submit.js.map +1 -0
  312. package/dist/utils/request-submit.mjs +18 -0
  313. package/dist/utils/request-submit.mjs.map +1 -0
  314. package/dist/utils/url.js +22 -0
  315. package/dist/utils/url.js.map +1 -0
  316. package/dist/utils/url.mjs +20 -0
  317. package/dist/utils/url.mjs.map +1 -0
  318. package/dist/utils/use-controllable-state.js +34 -0
  319. package/dist/utils/use-controllable-state.js.map +1 -0
  320. package/dist/utils/use-controllable-state.mjs +32 -0
  321. package/dist/utils/use-controllable-state.mjs.map +1 -0
  322. package/dist/utils/use-id.js +29 -0
  323. package/dist/utils/use-id.js.map +1 -0
  324. package/dist/utils/use-id.mjs +27 -0
  325. package/dist/utils/use-id.mjs.map +1 -0
  326. package/dist/utils/use-index.js +32 -0
  327. package/dist/utils/use-index.js.map +1 -0
  328. package/dist/utils/use-index.mjs +30 -0
  329. package/dist/utils/use-index.mjs.map +1 -0
  330. package/dist/utils/use-initial.js +10 -0
  331. package/dist/utils/use-initial.js.map +1 -0
  332. package/dist/utils/use-initial.mjs +8 -0
  333. package/dist/utils/use-initial.mjs.map +1 -0
  334. package/dist/utils/use-interval.js +24 -0
  335. package/dist/utils/use-interval.js.map +1 -0
  336. package/dist/utils/use-interval.mjs +22 -0
  337. package/dist/utils/use-interval.mjs.map +1 -0
  338. package/dist/utils/use-latest.js +14 -0
  339. package/dist/utils/use-latest.js.map +1 -0
  340. package/dist/utils/use-latest.mjs +12 -0
  341. package/dist/utils/use-latest.mjs.map +1 -0
  342. package/dist/utils/use-layout-effect.js +8 -0
  343. package/dist/utils/use-layout-effect.js.map +1 -0
  344. package/dist/utils/use-layout-effect.mjs +6 -0
  345. package/dist/utils/use-layout-effect.mjs.map +1 -0
  346. package/dist/utils/use-refs.js +24 -0
  347. package/dist/utils/use-refs.js.map +1 -0
  348. package/dist/utils/use-refs.mjs +22 -0
  349. package/dist/utils/use-refs.mjs.map +1 -0
  350. package/dist/utils/use-rerender.js +14 -0
  351. package/dist/utils/use-rerender.js.map +1 -0
  352. package/dist/utils/use-rerender.mjs +12 -0
  353. package/dist/utils/use-rerender.mjs.map +1 -0
  354. package/dist/utils/use-transition.js +12 -0
  355. package/dist/utils/use-transition.js.map +1 -0
  356. package/dist/utils/use-transition.mjs +10 -0
  357. package/dist/utils/use-transition.mjs.map +1 -0
  358. package/dist/utils/use-visible.js +48 -0
  359. package/dist/utils/use-visible.js.map +1 -0
  360. package/dist/utils/use-visible.mjs +46 -0
  361. package/dist/utils/use-visible.mjs.map +1 -0
  362. package/dist/utils/visually-hidden.js +17 -0
  363. package/dist/utils/visually-hidden.js.map +1 -0
  364. package/dist/utils/visually-hidden.mjs +15 -0
  365. package/dist/utils/visually-hidden.mjs.map +1 -0
  366. package/dist/utils/wrap.js +9 -0
  367. package/dist/utils/wrap.js.map +1 -0
  368. package/dist/utils/wrap.mjs +7 -0
  369. package/dist/utils/wrap.mjs.map +1 -0
  370. package/dist/version.js +10 -0
  371. package/dist/version.js.map +1 -0
  372. package/dist/version.mjs +6 -0
  373. package/dist/version.mjs.map +1 -0
  374. package/package.json +142 -0
  375. package/primitives/README.md +5 -0
  376. package/primitives/package.json +4 -0
  377. package/src/styles/constants.css +17 -0
  378. package/src/styles/dark/attributes.css +8 -0
  379. package/src/styles/dark/index.css +29 -0
  380. package/src/styles/dark/media-query.css +7 -0
  381. package/src/styles/index.css +1437 -0
  382. package/src/styles/utils.css +36 -0
  383. package/styles/dark/attributes.css +1 -0
  384. package/styles/dark/attributes.css.d.ts +1 -0
  385. package/styles/dark/attributes.css.map +1 -0
  386. package/styles/dark/media-query.css +1 -0
  387. package/styles/dark/media-query.css.d.ts +1 -0
  388. package/styles/dark/media-query.css.map +1 -0
  389. package/styles.css +1 -0
  390. package/styles.css.d.ts +1 -0
  391. package/styles.css.map +1 -0
@@ -0,0 +1,771 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ var reactDom = require('@floating-ui/react-dom');
5
+ var core = require('@liveblocks/core');
6
+ var react = require('@liveblocks/react');
7
+ var reactSlot = require('@radix-ui/react-slot');
8
+ var React = require('react');
9
+ var slate = require('slate');
10
+ var slateHistory = require('slate-history');
11
+ var slateReact = require('slate-react');
12
+ var config = require('../../config.js');
13
+ var constants = require('../../constants.js');
14
+ var autoFormatting = require('../../slate/plugins/auto-formatting.js');
15
+ var autoLinks = require('../../slate/plugins/auto-links.js');
16
+ var emptyClearFormatting = require('../../slate/plugins/empty-clear-formatting.js');
17
+ var mentions = require('../../slate/plugins/mentions.js');
18
+ var getDomRange = require('../../slate/utils/get-dom-range.js');
19
+ var isEmpty = require('../../slate/utils/is-empty.js');
20
+ var marks = require('../../slate/utils/marks.js');
21
+ var isKey = require('../../utils/is-key.js');
22
+ var Persist = require('../../utils/Persist.js');
23
+ var Portal = require('../../utils/Portal.js');
24
+ var requestSubmit = require('../../utils/request-submit.js');
25
+ var useId = require('../../utils/use-id.js');
26
+ var useIndex = require('../../utils/use-index.js');
27
+ var useInitial = require('../../utils/use-initial.js');
28
+ var useLayoutEffect = require('../../utils/use-layout-effect.js');
29
+ var useRefs = require('../../utils/use-refs.js');
30
+ var utils$1 = require('../Comment/utils.js');
31
+ var contexts = require('./contexts.js');
32
+ var utils = require('./utils.js');
33
+
34
+ const MENTION_SUGGESTIONS_POSITION = "top";
35
+ const COMPOSER_MENTION_NAME = "ComposerMention";
36
+ const COMPOSER_LINK_NAME = "ComposerLink";
37
+ const COMPOSER_SUGGESTIONS_NAME = "ComposerSuggestions";
38
+ const COMPOSER_SUGGESTIONS_LIST_NAME = "ComposerSuggestionsList";
39
+ const COMPOSER_SUGGESTIONS_LIST_ITEM_NAME = "ComposerSuggestionsListItem";
40
+ const COMPOSER_SUBMIT_NAME = "ComposerSubmit";
41
+ const COMPOSER_EDITOR_NAME = "ComposerEditor";
42
+ const COMPOSER_FORM_NAME = "ComposerForm";
43
+ const emptyCommentBody = {
44
+ version: 1,
45
+ content: [{ type: "paragraph", children: [{ text: "" }] }]
46
+ };
47
+ function createComposerEditor() {
48
+ return autoLinks.withAutoLinks(
49
+ mentions.withMentions(
50
+ emptyClearFormatting.withEmptyClearFormatting(
51
+ autoFormatting.withAutoFormatting(slateHistory.withHistory(slateReact.withReact(slate.createEditor())))
52
+ )
53
+ )
54
+ );
55
+ }
56
+ function ComposerEditorMentionWrapper({
57
+ Mention,
58
+ attributes,
59
+ children,
60
+ element
61
+ }) {
62
+ const isSelected = slateReact.useSelected();
63
+ return /* @__PURE__ */ React.createElement("span", {
64
+ ...attributes
65
+ }, element.id ? /* @__PURE__ */ React.createElement(Mention, {
66
+ userId: element.id,
67
+ isSelected
68
+ }) : null, children);
69
+ }
70
+ function ComposerEditorLinkWrapper({
71
+ Link,
72
+ attributes,
73
+ element,
74
+ children
75
+ }) {
76
+ const href = React.useMemo(
77
+ () => utils$1.toAbsoluteUrl(element.url) ?? element.url,
78
+ [element.url]
79
+ );
80
+ return /* @__PURE__ */ React.createElement("span", {
81
+ ...attributes
82
+ }, /* @__PURE__ */ React.createElement(Link, {
83
+ href
84
+ }, children));
85
+ }
86
+ function ComposerEditorMentionSuggestionsWrapper({
87
+ id,
88
+ itemId,
89
+ userIds,
90
+ selectedUserId,
91
+ setSelectedUserId,
92
+ mentionDraft,
93
+ onItemSelect,
94
+ position = MENTION_SUGGESTIONS_POSITION,
95
+ dir,
96
+ MentionSuggestions
97
+ }) {
98
+ const editor = slateReact.useSlateStatic();
99
+ const { isFocused } = contexts.useComposer();
100
+ const [content, setContent] = React.useState(null);
101
+ const [contentZIndex, setContentZIndex] = React.useState();
102
+ const contentRef = React.useCallback(setContent, [setContent]);
103
+ const { portalContainer } = config.useLiveblocksUIConfig();
104
+ const floatingOptions = React.useMemo(() => {
105
+ const detectOverflowOptions = {
106
+ padding: constants.FLOATING_ELEMENT_COLLISION_PADDING
107
+ };
108
+ return {
109
+ strategy: "fixed",
110
+ placement: utils.getPlacementFromPosition(position, dir),
111
+ middleware: [
112
+ reactDom.flip({ ...detectOverflowOptions, crossAxis: false }),
113
+ reactDom.hide(detectOverflowOptions),
114
+ reactDom.shift({
115
+ ...detectOverflowOptions,
116
+ limiter: reactDom.limitShift()
117
+ }),
118
+ reactDom.size({
119
+ ...detectOverflowOptions,
120
+ apply({ availableWidth, availableHeight, elements }) {
121
+ elements.floating.style.setProperty(
122
+ "--lb-composer-suggestions-available-width",
123
+ `${availableWidth}px`
124
+ );
125
+ elements.floating.style.setProperty(
126
+ "--lb-composer-suggestions-available-height",
127
+ `${availableHeight}px`
128
+ );
129
+ }
130
+ })
131
+ ],
132
+ whileElementsMounted: reactDom.autoUpdate
133
+ };
134
+ }, [position, dir]);
135
+ const {
136
+ refs: { setReference, setFloating },
137
+ strategy,
138
+ isPositioned,
139
+ placement,
140
+ x,
141
+ y
142
+ } = reactDom.useFloating(floatingOptions);
143
+ useLayoutEffect.useLayoutEffect(() => {
144
+ if (content) {
145
+ setContentZIndex(window.getComputedStyle(content).zIndex);
146
+ }
147
+ }, [content]);
148
+ useLayoutEffect.useLayoutEffect(() => {
149
+ if (!mentionDraft) {
150
+ return;
151
+ }
152
+ const domRange = getDomRange.getDOMRange(editor, mentionDraft.range);
153
+ if (domRange) {
154
+ setReference({
155
+ getBoundingClientRect: () => domRange.getBoundingClientRect(),
156
+ getClientRects: () => domRange.getClientRects()
157
+ });
158
+ }
159
+ }, [setReference, editor, mentionDraft]);
160
+ return /* @__PURE__ */ React.createElement(Persist.Persist, null, mentionDraft?.range && isFocused && userIds ? /* @__PURE__ */ React.createElement(contexts.ComposerSuggestionsContext.Provider, {
161
+ value: {
162
+ id,
163
+ itemId,
164
+ selectedValue: selectedUserId,
165
+ setSelectedValue: setSelectedUserId,
166
+ onItemSelect,
167
+ placement,
168
+ dir,
169
+ ref: contentRef
170
+ }
171
+ }, /* @__PURE__ */ React.createElement(Portal.Portal, {
172
+ ref: setFloating,
173
+ container: portalContainer,
174
+ style: {
175
+ position: strategy,
176
+ top: 0,
177
+ left: 0,
178
+ transform: isPositioned ? `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)` : "translate3d(0, -200%, 0)",
179
+ minWidth: "max-content",
180
+ zIndex: contentZIndex
181
+ }
182
+ }, /* @__PURE__ */ React.createElement(MentionSuggestions, {
183
+ userIds,
184
+ selectedUserId
185
+ }))) : null);
186
+ }
187
+ function ComposerEditorElement({
188
+ Mention,
189
+ Link,
190
+ ...props
191
+ }) {
192
+ const { attributes, children, element } = props;
193
+ switch (element.type) {
194
+ case "mention":
195
+ return /* @__PURE__ */ React.createElement(ComposerEditorMentionWrapper, {
196
+ Mention,
197
+ ...props
198
+ });
199
+ case "auto-link":
200
+ return /* @__PURE__ */ React.createElement(ComposerEditorLinkWrapper, {
201
+ Link,
202
+ ...props
203
+ });
204
+ case "paragraph":
205
+ return /* @__PURE__ */ React.createElement("p", {
206
+ ...attributes,
207
+ style: { position: "relative" }
208
+ }, children);
209
+ default:
210
+ return null;
211
+ }
212
+ }
213
+ function ComposerEditorLeaf({ attributes, children, leaf }) {
214
+ if (leaf.bold) {
215
+ children = /* @__PURE__ */ React.createElement("strong", null, children);
216
+ }
217
+ if (leaf.italic) {
218
+ children = /* @__PURE__ */ React.createElement("em", null, children);
219
+ }
220
+ if (leaf.strikethrough) {
221
+ children = /* @__PURE__ */ React.createElement("s", null, children);
222
+ }
223
+ if (leaf.code) {
224
+ children = /* @__PURE__ */ React.createElement("code", null, children);
225
+ }
226
+ return /* @__PURE__ */ React.createElement("span", {
227
+ ...attributes
228
+ }, children);
229
+ }
230
+ function ComposerEditorPlaceholder({
231
+ attributes,
232
+ children
233
+ }) {
234
+ const { opacity: _opacity, ...style } = attributes.style;
235
+ return /* @__PURE__ */ React.createElement("span", {
236
+ ...attributes,
237
+ style,
238
+ "data-placeholder": ""
239
+ }, children);
240
+ }
241
+ const ComposerMention = React.forwardRef(
242
+ ({ children, asChild, ...props }, forwardedRef) => {
243
+ const Component = asChild ? reactSlot.Slot : "span";
244
+ const isSelected = slateReact.useSelected();
245
+ return /* @__PURE__ */ React.createElement(Component, {
246
+ "data-selected": isSelected || void 0,
247
+ ...props,
248
+ ref: forwardedRef
249
+ }, children);
250
+ }
251
+ );
252
+ const ComposerLink = React.forwardRef(
253
+ ({ children, asChild, ...props }, forwardedRef) => {
254
+ const Component = asChild ? reactSlot.Slot : "a";
255
+ return /* @__PURE__ */ React.createElement(Component, {
256
+ target: "_blank",
257
+ rel: "noopener noreferrer nofollow",
258
+ ...props,
259
+ ref: forwardedRef
260
+ }, children);
261
+ }
262
+ );
263
+ const ComposerSuggestions = React.forwardRef(({ children, style, asChild, ...props }, forwardedRef) => {
264
+ const [isPresent] = Persist.usePersist();
265
+ const ref = React.useRef(null);
266
+ const {
267
+ ref: contentRef,
268
+ placement,
269
+ dir
270
+ } = contexts.useComposerSuggestionsContext(COMPOSER_SUGGESTIONS_NAME);
271
+ const mergedRefs = useRefs.useRefs(forwardedRef, contentRef, ref);
272
+ const [side, align] = React.useMemo(
273
+ () => utils.getSideAndAlignFromPlacement(placement),
274
+ [placement]
275
+ );
276
+ const Component = asChild ? reactSlot.Slot : "div";
277
+ Persist.useAnimationPersist(ref);
278
+ return /* @__PURE__ */ React.createElement(Component, {
279
+ dir,
280
+ ...props,
281
+ "data-state": isPresent ? "open" : "closed",
282
+ "data-side": side,
283
+ "data-align": align,
284
+ style: {
285
+ display: "flex",
286
+ flexDirection: "column",
287
+ maxHeight: "var(--lb-composer-suggestions-available-height)",
288
+ overflowY: "auto",
289
+ ...style
290
+ },
291
+ ref: mergedRefs
292
+ }, children);
293
+ });
294
+ const ComposerSuggestionsList = React.forwardRef(({ children, asChild, ...props }, forwardedRef) => {
295
+ const { id } = contexts.useComposerSuggestionsContext(COMPOSER_SUGGESTIONS_LIST_NAME);
296
+ const Component = asChild ? reactSlot.Slot : "ul";
297
+ return /* @__PURE__ */ React.createElement(Component, {
298
+ role: "listbox",
299
+ id,
300
+ "aria-label": "Suggestions list",
301
+ ...props,
302
+ ref: forwardedRef
303
+ }, children);
304
+ });
305
+ const ComposerSuggestionsListItem = React.forwardRef(
306
+ ({ value, children, onPointerMove, onPointerDown, asChild, ...props }, forwardedRef) => {
307
+ const ref = React.useRef(null);
308
+ const mergedRefs = useRefs.useRefs(forwardedRef, ref);
309
+ const { selectedValue, setSelectedValue, itemId, onItemSelect } = contexts.useComposerSuggestionsContext(COMPOSER_SUGGESTIONS_LIST_ITEM_NAME);
310
+ const Component = asChild ? reactSlot.Slot : "li";
311
+ const isSelected = React.useMemo(
312
+ () => selectedValue === value,
313
+ [selectedValue, value]
314
+ );
315
+ const id = React.useMemo(() => itemId(value), [itemId, value]);
316
+ React.useEffect(() => {
317
+ if (ref?.current && isSelected) {
318
+ ref.current.scrollIntoView({ block: "nearest" });
319
+ }
320
+ }, [isSelected]);
321
+ const handlePointerMove = React.useCallback(
322
+ (event) => {
323
+ onPointerMove?.(event);
324
+ if (!event.isDefaultPrevented()) {
325
+ setSelectedValue(value);
326
+ }
327
+ },
328
+ [onPointerMove, setSelectedValue, value]
329
+ );
330
+ const handlePointerDown = React.useCallback(
331
+ (event) => {
332
+ onPointerDown?.(event);
333
+ if (!event.isDefaultPrevented()) {
334
+ const target = event.target;
335
+ if (target.hasPointerCapture(event.pointerId)) {
336
+ target.releasePointerCapture(event.pointerId);
337
+ }
338
+ if (event.button === 0 && event.ctrlKey === false) {
339
+ onItemSelect(value);
340
+ event.preventDefault();
341
+ }
342
+ }
343
+ },
344
+ [onItemSelect, onPointerDown, value]
345
+ );
346
+ return /* @__PURE__ */ React.createElement(Component, {
347
+ role: "option",
348
+ id,
349
+ "data-selected": isSelected || void 0,
350
+ "aria-selected": isSelected || void 0,
351
+ onPointerMove: handlePointerMove,
352
+ onPointerDown: handlePointerDown,
353
+ ...props,
354
+ ref: mergedRefs
355
+ }, children);
356
+ }
357
+ );
358
+ const defaultEditorComponents = {
359
+ Link: ({ href, children }) => {
360
+ return /* @__PURE__ */ React.createElement(ComposerLink, {
361
+ href
362
+ }, children);
363
+ },
364
+ Mention: ({ userId }) => {
365
+ return /* @__PURE__ */ React.createElement(ComposerMention, null, mentions.MENTION_CHARACTER, userId);
366
+ },
367
+ MentionSuggestions: ({ userIds }) => {
368
+ return userIds.length > 0 ? /* @__PURE__ */ React.createElement(ComposerSuggestions, null, /* @__PURE__ */ React.createElement(ComposerSuggestionsList, null, userIds.map((userId) => /* @__PURE__ */ React.createElement(ComposerSuggestionsListItem, {
369
+ key: userId,
370
+ value: userId
371
+ }, userId)))) : null;
372
+ }
373
+ };
374
+ const ComposerEditor = React.forwardRef(
375
+ ({
376
+ defaultValue,
377
+ onKeyDown,
378
+ onFocus,
379
+ onBlur,
380
+ disabled,
381
+ autoFocus,
382
+ components,
383
+ dir,
384
+ ...props
385
+ }, forwardedRef) => {
386
+ const {
387
+ [core.kInternal]: { useMentionSuggestions },
388
+ useSelf
389
+ } = react.useRoomContextBundle();
390
+ const self = useSelf();
391
+ const isDisabled = React.useMemo(
392
+ () => disabled || !self?.canComment,
393
+ [disabled, self?.canComment]
394
+ );
395
+ const { editor, validate, setFocused } = contexts.useComposerEditorContext();
396
+ const { submit, focus, select, isEmpty, isFocused } = contexts.useComposer();
397
+ const initialBody = useInitial.useInitial(defaultValue ?? emptyCommentBody);
398
+ const initialEditorValue = React.useMemo(() => {
399
+ return utils.commentBodyToComposerBody(initialBody);
400
+ }, [initialBody]);
401
+ const { Link, Mention, MentionSuggestions } = React.useMemo(
402
+ () => ({ ...defaultEditorComponents, ...components }),
403
+ [components]
404
+ );
405
+ const [mentionDraft, setMentionDraft] = React.useState();
406
+ const mentionSuggestions = useMentionSuggestions(mentionDraft?.text);
407
+ const [
408
+ selectedMentionSuggestionIndex,
409
+ setPreviousSelectedMentionSuggestionIndex,
410
+ setNextSelectedMentionSuggestionIndex,
411
+ setSelectedMentionSuggestionIndex
412
+ ] = useIndex.useIndex(0, mentionSuggestions?.length ?? 0);
413
+ const id = useId.useId();
414
+ const suggestionsListId = React.useMemo(
415
+ () => `liveblocks-suggestions-list-${id}`,
416
+ [id]
417
+ );
418
+ const suggestionsListItemId = React.useCallback(
419
+ (userId) => userId ? `liveblocks-suggestions-list-item-${id}-${userId}` : void 0,
420
+ [id]
421
+ );
422
+ const renderElement = React.useCallback(
423
+ (props2) => {
424
+ return /* @__PURE__ */ React.createElement(ComposerEditorElement, {
425
+ Mention,
426
+ Link,
427
+ ...props2
428
+ });
429
+ },
430
+ [Link, Mention]
431
+ );
432
+ const handleChange = React.useCallback(
433
+ (value) => {
434
+ validate(value);
435
+ setMentionDraft(mentions.getMentionDraftAtSelection(editor));
436
+ },
437
+ [editor, validate]
438
+ );
439
+ const createMention = React.useCallback(
440
+ (userId) => {
441
+ if (!mentionDraft || !userId) {
442
+ return;
443
+ }
444
+ slate.Transforms.select(editor, mentionDraft.range);
445
+ mentions.insertMention(editor, userId);
446
+ setMentionDraft(void 0);
447
+ setSelectedMentionSuggestionIndex(0);
448
+ },
449
+ [editor, mentionDraft, setSelectedMentionSuggestionIndex]
450
+ );
451
+ const handleKeyDown = React.useCallback(
452
+ (event) => {
453
+ onKeyDown?.(event);
454
+ if (event.isDefaultPrevented()) {
455
+ return;
456
+ }
457
+ if (isKey.isKey(event, "ArrowLeft")) {
458
+ marks.leaveMarkEdge(editor, "start");
459
+ }
460
+ if (isKey.isKey(event, "ArrowRight")) {
461
+ marks.leaveMarkEdge(editor, "end");
462
+ }
463
+ if (mentionDraft && mentionSuggestions?.length) {
464
+ if (isKey.isKey(event, "ArrowDown")) {
465
+ event.preventDefault();
466
+ setNextSelectedMentionSuggestionIndex();
467
+ }
468
+ if (isKey.isKey(event, "ArrowUp")) {
469
+ event.preventDefault();
470
+ setPreviousSelectedMentionSuggestionIndex();
471
+ }
472
+ if (isKey.isKey(event, "Enter") || isKey.isKey(event, "Tab")) {
473
+ event.preventDefault();
474
+ const userId = mentionSuggestions?.[selectedMentionSuggestionIndex];
475
+ createMention(userId);
476
+ }
477
+ if (isKey.isKey(event, "Escape")) {
478
+ event.preventDefault();
479
+ setMentionDraft(void 0);
480
+ setSelectedMentionSuggestionIndex(0);
481
+ }
482
+ } else {
483
+ if (isKey.isKey(event, "Escape")) {
484
+ event.preventDefault();
485
+ slateReact.ReactEditor.blur(editor);
486
+ }
487
+ if (isKey.isKey(event, "Enter", { shift: false }) && !isEmpty) {
488
+ event.preventDefault();
489
+ submit();
490
+ }
491
+ if (isKey.isKey(event, "Enter", { shift: true })) {
492
+ event.preventDefault();
493
+ editor.insertBreak();
494
+ }
495
+ if (isKey.isKey(event, "b", { mod: true })) {
496
+ event.preventDefault();
497
+ marks.toggleMark(editor, "bold");
498
+ }
499
+ if (isKey.isKey(event, "i", { mod: true })) {
500
+ event.preventDefault();
501
+ marks.toggleMark(editor, "italic");
502
+ }
503
+ if (isKey.isKey(event, "s", { mod: true, shift: true })) {
504
+ event.preventDefault();
505
+ marks.toggleMark(editor, "strikethrough");
506
+ }
507
+ if (isKey.isKey(event, "e", { mod: true })) {
508
+ event.preventDefault();
509
+ marks.toggleMark(editor, "code");
510
+ }
511
+ }
512
+ },
513
+ [
514
+ createMention,
515
+ editor,
516
+ isEmpty,
517
+ mentionDraft,
518
+ mentionSuggestions,
519
+ selectedMentionSuggestionIndex,
520
+ onKeyDown,
521
+ setNextSelectedMentionSuggestionIndex,
522
+ setPreviousSelectedMentionSuggestionIndex,
523
+ setSelectedMentionSuggestionIndex,
524
+ submit
525
+ ]
526
+ );
527
+ const handleFocus = React.useCallback(
528
+ (event) => {
529
+ onFocus?.(event);
530
+ if (!event.isDefaultPrevented()) {
531
+ setFocused(true);
532
+ }
533
+ },
534
+ [onFocus, setFocused]
535
+ );
536
+ const handleBlur = React.useCallback(
537
+ (event) => {
538
+ onBlur?.(event);
539
+ if (!event.isDefaultPrevented()) {
540
+ setFocused(false);
541
+ }
542
+ },
543
+ [onBlur, setFocused]
544
+ );
545
+ const selectedMentionSuggestionUserId = React.useMemo(
546
+ () => mentionSuggestions?.[selectedMentionSuggestionIndex],
547
+ [selectedMentionSuggestionIndex, mentionSuggestions]
548
+ );
549
+ const setSelectedMentionSuggestionUserId = React.useCallback(
550
+ (userId) => {
551
+ const index = mentionSuggestions?.indexOf(userId);
552
+ if (index !== void 0 && index >= 0) {
553
+ setSelectedMentionSuggestionIndex(index);
554
+ }
555
+ },
556
+ [setSelectedMentionSuggestionIndex, mentionSuggestions]
557
+ );
558
+ const propsWhileSuggesting = React.useMemo(
559
+ () => mentionDraft ? {
560
+ role: "combobox",
561
+ "aria-autocomplete": "list",
562
+ "aria-expanded": true,
563
+ "aria-controls": suggestionsListId,
564
+ "aria-activedescendant": suggestionsListItemId(
565
+ selectedMentionSuggestionUserId
566
+ )
567
+ } : {},
568
+ [
569
+ mentionDraft,
570
+ suggestionsListId,
571
+ suggestionsListItemId,
572
+ selectedMentionSuggestionUserId
573
+ ]
574
+ );
575
+ React.useImperativeHandle(
576
+ forwardedRef,
577
+ () => {
578
+ return slateReact.ReactEditor.toDOMNode(editor, editor);
579
+ },
580
+ [editor]
581
+ );
582
+ React.useEffect(() => {
583
+ if (autoFocus) {
584
+ focus();
585
+ }
586
+ }, [autoFocus, editor, focus]);
587
+ React.useEffect(() => {
588
+ if (isFocused && editor.selection === null) {
589
+ select();
590
+ }
591
+ }, [editor, select, isFocused]);
592
+ return /* @__PURE__ */ React.createElement(slateReact.Slate, {
593
+ editor,
594
+ initialValue: initialEditorValue,
595
+ onChange: handleChange
596
+ }, /* @__PURE__ */ React.createElement(slateReact.Editable, {
597
+ dir,
598
+ enterKeyHint: mentionDraft ? "enter" : "send",
599
+ autoCapitalize: "sentences",
600
+ "aria-label": "Composer editor",
601
+ "data-focused": isFocused || void 0,
602
+ "data-disabled": isDisabled || void 0,
603
+ ...propsWhileSuggesting,
604
+ ...props,
605
+ readOnly: isDisabled,
606
+ disabled: isDisabled,
607
+ onKeyDown: handleKeyDown,
608
+ onFocus: handleFocus,
609
+ onBlur: handleBlur,
610
+ renderElement,
611
+ renderLeaf: ComposerEditorLeaf,
612
+ renderPlaceholder: ComposerEditorPlaceholder
613
+ }), /* @__PURE__ */ React.createElement(ComposerEditorMentionSuggestionsWrapper, {
614
+ dir,
615
+ mentionDraft,
616
+ selectedUserId: selectedMentionSuggestionUserId,
617
+ setSelectedUserId: setSelectedMentionSuggestionUserId,
618
+ userIds: mentionSuggestions,
619
+ id: suggestionsListId,
620
+ itemId: suggestionsListItemId,
621
+ onItemSelect: createMention,
622
+ MentionSuggestions
623
+ }));
624
+ }
625
+ );
626
+ const ComposerForm = React.forwardRef(
627
+ ({ children, onSubmit, onComposerSubmit, asChild, ...props }, forwardedRef) => {
628
+ const Component = asChild ? reactSlot.Slot : "form";
629
+ const editor = useInitial.useInitial(createComposerEditor);
630
+ const [isEmpty$1, setEmpty] = React.useState(true);
631
+ const [isFocused, setFocused] = React.useState(false);
632
+ const ref = React.useRef(null);
633
+ const mergedRefs = useRefs.useRefs(forwardedRef, ref);
634
+ const validate = React.useCallback(
635
+ (value) => {
636
+ setEmpty(isEmpty.isEmpty(editor, value));
637
+ },
638
+ [editor]
639
+ );
640
+ const submit = React.useCallback(() => {
641
+ if (ref.current) {
642
+ requestSubmit.requestSubmit(ref.current);
643
+ }
644
+ }, []);
645
+ const clear = React.useCallback(() => {
646
+ slate.Transforms.delete(editor, {
647
+ at: {
648
+ anchor: slate.Editor.start(editor, []),
649
+ focus: slate.Editor.end(editor, [])
650
+ }
651
+ });
652
+ }, [editor]);
653
+ const select = React.useCallback(() => {
654
+ slate.Transforms.select(editor, {
655
+ anchor: slate.Editor.end(editor, []),
656
+ focus: slate.Editor.end(editor, [])
657
+ });
658
+ }, [editor]);
659
+ const focus = React.useCallback(
660
+ (resetSelection = true) => {
661
+ if (!slateReact.ReactEditor.isFocused(editor)) {
662
+ slate.Transforms.select(
663
+ editor,
664
+ resetSelection || !editor.selection ? slate.Editor.end(editor, []) : editor.selection
665
+ );
666
+ slateReact.ReactEditor.focus(editor);
667
+ }
668
+ },
669
+ [editor]
670
+ );
671
+ const blur = React.useCallback(() => {
672
+ slateReact.ReactEditor.blur(editor);
673
+ }, [editor]);
674
+ const onSubmitEnd = React.useCallback(() => {
675
+ clear();
676
+ blur();
677
+ }, [blur, clear]);
678
+ const createMention = React.useCallback(() => {
679
+ focus();
680
+ mentions.insertMentionCharacter(editor);
681
+ }, [editor, focus]);
682
+ const insertText = React.useCallback(
683
+ (text) => {
684
+ focus(false);
685
+ slate.insertText(editor, text);
686
+ },
687
+ [editor, focus]
688
+ );
689
+ const handleSubmit = React.useCallback(
690
+ (event) => {
691
+ onSubmit?.(event);
692
+ if (event.isDefaultPrevented()) {
693
+ return;
694
+ }
695
+ const body = utils.composerBodyToCommentBody(
696
+ editor.children
697
+ );
698
+ const comment = { body };
699
+ const promise = onComposerSubmit?.(comment, event);
700
+ event.preventDefault();
701
+ if (promise) {
702
+ promise.then(onSubmitEnd);
703
+ } else {
704
+ onSubmitEnd();
705
+ }
706
+ },
707
+ [editor.children, onComposerSubmit, onSubmit, onSubmitEnd]
708
+ );
709
+ return /* @__PURE__ */ React.createElement(contexts.ComposerEditorContext.Provider, {
710
+ value: {
711
+ editor,
712
+ validate,
713
+ setFocused
714
+ }
715
+ }, /* @__PURE__ */ React.createElement(contexts.ComposerContext.Provider, {
716
+ value: {
717
+ isFocused,
718
+ isEmpty: isEmpty$1,
719
+ submit,
720
+ clear,
721
+ select,
722
+ focus,
723
+ blur,
724
+ createMention,
725
+ insertText
726
+ }
727
+ }, /* @__PURE__ */ React.createElement(Component, {
728
+ ...props,
729
+ onSubmit: handleSubmit,
730
+ ref: mergedRefs
731
+ }, children)));
732
+ }
733
+ );
734
+ const ComposerSubmit = React.forwardRef(
735
+ ({ children, disabled, asChild, ...props }, forwardedRef) => {
736
+ const Component = asChild ? reactSlot.Slot : "button";
737
+ const { useSelf } = react.useRoomContextBundle();
738
+ const { isEmpty } = contexts.useComposer();
739
+ const self = useSelf();
740
+ const isDisabled = React.useMemo(
741
+ () => disabled || isEmpty || !self?.canComment,
742
+ [disabled, isEmpty, self?.canComment]
743
+ );
744
+ return /* @__PURE__ */ React.createElement(Component, {
745
+ type: "submit",
746
+ ...props,
747
+ ref: forwardedRef,
748
+ disabled: isDisabled
749
+ }, children);
750
+ }
751
+ );
752
+ if (process.env.NODE_ENV !== "production") {
753
+ ComposerEditor.displayName = COMPOSER_EDITOR_NAME;
754
+ ComposerForm.displayName = COMPOSER_FORM_NAME;
755
+ ComposerMention.displayName = COMPOSER_MENTION_NAME;
756
+ ComposerLink.displayName = COMPOSER_LINK_NAME;
757
+ ComposerSubmit.displayName = COMPOSER_SUBMIT_NAME;
758
+ ComposerSuggestions.displayName = COMPOSER_SUGGESTIONS_NAME;
759
+ ComposerSuggestionsList.displayName = COMPOSER_SUGGESTIONS_LIST_NAME;
760
+ ComposerSuggestionsListItem.displayName = COMPOSER_SUGGESTIONS_LIST_ITEM_NAME;
761
+ }
762
+
763
+ exports.Editor = ComposerEditor;
764
+ exports.Form = ComposerForm;
765
+ exports.Link = ComposerLink;
766
+ exports.Mention = ComposerMention;
767
+ exports.Submit = ComposerSubmit;
768
+ exports.Suggestions = ComposerSuggestions;
769
+ exports.SuggestionsList = ComposerSuggestionsList;
770
+ exports.SuggestionsListItem = ComposerSuggestionsListItem;
771
+ //# sourceMappingURL=index.js.map