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