@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,372 @@
1
+ 'use client';
2
+ import { assertNever, console } from '@liveblocks/core';
3
+ import { useLiveblocksContextBundle } from '@liveblocks/react';
4
+ import { Slot } from '@radix-ui/react-slot';
5
+ import { TooltipProvider } from '@radix-ui/react-tooltip';
6
+ import React__default, { forwardRef, useState, useCallback, useMemo } from 'react';
7
+ import { useComponents } from '../components.mjs';
8
+ import { CheckIcon } from '../icons/Check.mjs';
9
+ import { EllipsisIcon } from '../icons/Ellipsis.mjs';
10
+ import { MissingIcon } from '../icons/Missing.mjs';
11
+ import { useOverrides } from '../overrides.mjs';
12
+ import { Timestamp } from '../primitives/Timestamp.mjs';
13
+ import { useCurrentUserId } from '../shared.mjs';
14
+ import { classNames } from '../utils/class-names.mjs';
15
+ import { generateURL } from '../utils/url.mjs';
16
+ import { Avatar } from './internal/Avatar.mjs';
17
+ import { Button } from './internal/Button.mjs';
18
+ import { Dropdown, DropdownItem } from './internal/Dropdown.mjs';
19
+ import { generateInboxNotificationThreadContents, InboxNotificationComment, INBOX_NOTIFICATION_THREAD_MAX_COMMENTS } from './internal/InboxNotificationThread.mjs';
20
+ import { List } from './internal/List.mjs';
21
+ import { Room } from './internal/Room.mjs';
22
+ import { Tooltip } from './internal/Tooltip.mjs';
23
+ import { User } from './internal/User.mjs';
24
+ import { DropdownMenuTrigger } from '@radix-ui/react-dropdown-menu';
25
+
26
+ const InboxNotificationLayout = forwardRef(
27
+ ({
28
+ inboxNotification,
29
+ children,
30
+ aside,
31
+ title,
32
+ date,
33
+ unread,
34
+ markAsReadOnClick,
35
+ onClick,
36
+ href,
37
+ showActions,
38
+ overrides,
39
+ components,
40
+ className,
41
+ asChild,
42
+ ...props
43
+ }, forwardedRef) => {
44
+ const $ = useOverrides(overrides);
45
+ const { Anchor } = useComponents(components);
46
+ const Component = asChild ? Slot : Anchor;
47
+ const [isMoreActionOpen, setMoreActionOpen] = useState(false);
48
+ const { useMarkInboxNotificationAsRead } = useLiveblocksContextBundle();
49
+ const markInboxNotificationAsRead = useMarkInboxNotificationAsRead();
50
+ const handleClick = useCallback(
51
+ (event) => {
52
+ onClick?.(event);
53
+ const shouldMarkAsReadOnClick = markAsReadOnClick ?? Boolean(href);
54
+ if (unread && shouldMarkAsReadOnClick) {
55
+ markInboxNotificationAsRead(inboxNotification.id);
56
+ }
57
+ },
58
+ [
59
+ href,
60
+ inboxNotification.id,
61
+ markAsReadOnClick,
62
+ markInboxNotificationAsRead,
63
+ onClick,
64
+ unread
65
+ ]
66
+ );
67
+ const stopPropagation = useCallback((event) => {
68
+ event.stopPropagation();
69
+ }, []);
70
+ const preventDefaultAndStopPropagation = useCallback(
71
+ (event) => {
72
+ event.preventDefault();
73
+ event.stopPropagation();
74
+ },
75
+ []
76
+ );
77
+ const handleMoreClick = useCallback((event) => {
78
+ event.preventDefault();
79
+ event.stopPropagation();
80
+ setMoreActionOpen((open) => !open);
81
+ }, []);
82
+ const handleMarkAsRead = useCallback(() => {
83
+ markInboxNotificationAsRead(inboxNotification.id);
84
+ }, [inboxNotification.id, markInboxNotificationAsRead]);
85
+ return /* @__PURE__ */ React__default.createElement(TooltipProvider, null, /* @__PURE__ */ React__default.createElement(Component, {
86
+ className: classNames(
87
+ "lb-root lb-inbox-notification",
88
+ showActions === "hover" && "lb-inbox-notification:show-actions-hover",
89
+ isMoreActionOpen && "lb-inbox-notification:action-open",
90
+ className
91
+ ),
92
+ dir: $.dir,
93
+ "data-unread": unread ? "" : void 0,
94
+ "data-kind": inboxNotification.kind,
95
+ onClick: handleClick,
96
+ href,
97
+ ...props,
98
+ ref: forwardedRef
99
+ }, aside && /* @__PURE__ */ React__default.createElement("div", {
100
+ className: "lb-inbox-notification-aside"
101
+ }, aside), /* @__PURE__ */ React__default.createElement("div", {
102
+ className: "lb-inbox-notification-content"
103
+ }, /* @__PURE__ */ React__default.createElement("div", {
104
+ className: "lb-inbox-notification-header"
105
+ }, /* @__PURE__ */ React__default.createElement("span", {
106
+ className: "lb-inbox-notification-title"
107
+ }, title), /* @__PURE__ */ React__default.createElement("div", {
108
+ className: "lb-inbox-notification-details"
109
+ }, /* @__PURE__ */ React__default.createElement("span", {
110
+ className: "lb-inbox-notification-details-labels"
111
+ }, /* @__PURE__ */ React__default.createElement(Timestamp, {
112
+ locale: $.locale,
113
+ date,
114
+ className: "lb-inbox-notification-date"
115
+ }), unread && /* @__PURE__ */ React__default.createElement("span", {
116
+ className: "lb-inbox-notification-unread-indicator",
117
+ role: "presentation"
118
+ }))), showActions && /* @__PURE__ */ React__default.createElement("div", {
119
+ className: "lb-inbox-notification-actions"
120
+ }, /* @__PURE__ */ React__default.createElement(Dropdown, {
121
+ open: isMoreActionOpen,
122
+ onOpenChange: setMoreActionOpen,
123
+ align: "end",
124
+ content: /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(DropdownItem, {
125
+ onSelect: handleMarkAsRead,
126
+ onClick: stopPropagation,
127
+ disabled: !unread
128
+ }, /* @__PURE__ */ React__default.createElement(CheckIcon, {
129
+ className: "lb-dropdown-item-icon"
130
+ }), $.INBOX_NOTIFICATION_MARK_AS_READ))
131
+ }, /* @__PURE__ */ React__default.createElement(Tooltip, {
132
+ content: $.INBOX_NOTIFICATION_MORE
133
+ }, /* @__PURE__ */ React__default.createElement(DropdownMenuTrigger, {
134
+ asChild: true
135
+ }, /* @__PURE__ */ React__default.createElement(Button, {
136
+ className: "lb-inbox-notification-action",
137
+ onClick: handleMoreClick,
138
+ onPointerDown: preventDefaultAndStopPropagation,
139
+ onPointerUp: preventDefaultAndStopPropagation,
140
+ "aria-label": $.INBOX_NOTIFICATION_MORE
141
+ }, /* @__PURE__ */ React__default.createElement(EllipsisIcon, {
142
+ className: "lb-button-icon"
143
+ }))))))), /* @__PURE__ */ React__default.createElement("div", {
144
+ className: "lb-inbox-notification-body"
145
+ }, children))));
146
+ }
147
+ );
148
+ function InboxNotificationIcon({
149
+ className,
150
+ ...props
151
+ }) {
152
+ return /* @__PURE__ */ React__default.createElement("div", {
153
+ className: classNames("lb-inbox-notification-icon", className),
154
+ ...props
155
+ });
156
+ }
157
+ function InboxNotificationAvatar({
158
+ className,
159
+ ...props
160
+ }) {
161
+ return /* @__PURE__ */ React__default.createElement(Avatar, {
162
+ className: classNames("lb-inbox-notification-avatar", className),
163
+ ...props
164
+ });
165
+ }
166
+ const InboxNotificationThread = forwardRef(
167
+ ({
168
+ inboxNotification,
169
+ href,
170
+ showRoomName = true,
171
+ showActions = "hover",
172
+ overrides,
173
+ ...props
174
+ }, forwardedRef) => {
175
+ const $ = useOverrides(overrides);
176
+ const { useRoomInfo, useInboxNotificationThread } = useLiveblocksContextBundle();
177
+ const thread = useInboxNotificationThread(inboxNotification.id);
178
+ const currentUserId = useCurrentUserId();
179
+ const { info } = useRoomInfo(inboxNotification.roomId);
180
+ const { unread, date, aside, title, content, commentId } = useMemo(() => {
181
+ const contents = generateInboxNotificationThreadContents(
182
+ inboxNotification,
183
+ thread,
184
+ currentUserId ?? ""
185
+ );
186
+ switch (contents.type) {
187
+ case "comments": {
188
+ const reversedUserIds = [...contents.userIds].reverse();
189
+ const firstUserId = reversedUserIds[0];
190
+ const aside2 = /* @__PURE__ */ React__default.createElement(InboxNotificationAvatar, {
191
+ userId: firstUserId
192
+ });
193
+ const title2 = $.INBOX_NOTIFICATION_THREAD_COMMENTS_LIST(
194
+ /* @__PURE__ */ React__default.createElement(List, {
195
+ values: reversedUserIds.map((userId, index) => /* @__PURE__ */ React__default.createElement(User, {
196
+ key: userId,
197
+ userId,
198
+ capitalize: index === 0,
199
+ replaceSelf: true
200
+ })),
201
+ formatRemaining: $.LIST_REMAINING_USERS,
202
+ truncate: INBOX_NOTIFICATION_THREAD_MAX_COMMENTS - 1
203
+ }),
204
+ showRoomName ? /* @__PURE__ */ React__default.createElement(Room, {
205
+ roomId: thread.roomId
206
+ }) : void 0,
207
+ reversedUserIds.length
208
+ );
209
+ const content2 = /* @__PURE__ */ React__default.createElement("div", {
210
+ className: "lb-inbox-notification-comments"
211
+ }, contents.comments.map((comment) => /* @__PURE__ */ React__default.createElement(InboxNotificationComment, {
212
+ key: comment.id,
213
+ comment,
214
+ showHeader: contents.comments.length > 1,
215
+ overrides
216
+ })));
217
+ return {
218
+ unread: contents.unread,
219
+ date: contents.date,
220
+ aside: aside2,
221
+ title: title2,
222
+ content: content2,
223
+ threadId: thread.id,
224
+ commentId: contents.comments[contents.comments.length - 1].id
225
+ };
226
+ }
227
+ case "mention": {
228
+ const mentionUserId = contents.userIds[0];
229
+ const mentionComment = contents.comments[0];
230
+ const aside2 = /* @__PURE__ */ React__default.createElement(InboxNotificationAvatar, {
231
+ userId: mentionUserId
232
+ });
233
+ const title2 = $.INBOX_NOTIFICATION_THREAD_MENTION(
234
+ /* @__PURE__ */ React__default.createElement(User, {
235
+ key: mentionUserId,
236
+ userId: mentionUserId,
237
+ capitalize: true
238
+ }),
239
+ showRoomName ? /* @__PURE__ */ React__default.createElement(Room, {
240
+ roomId: thread.roomId
241
+ }) : void 0
242
+ );
243
+ const content2 = /* @__PURE__ */ React__default.createElement("div", {
244
+ className: "lb-inbox-notification-comments"
245
+ }, /* @__PURE__ */ React__default.createElement(InboxNotificationComment, {
246
+ key: mentionComment.id,
247
+ comment: mentionComment,
248
+ showHeader: false
249
+ }));
250
+ return {
251
+ unread: contents.unread,
252
+ date: contents.date,
253
+ aside: aside2,
254
+ title: title2,
255
+ content: content2,
256
+ threadId: thread.id,
257
+ commentId: mentionComment.id
258
+ };
259
+ }
260
+ default:
261
+ return assertNever(
262
+ contents,
263
+ "Unexpected thread inbox notification type"
264
+ );
265
+ }
266
+ }, [$, currentUserId, inboxNotification, overrides, showRoomName, thread]);
267
+ const resolvedHref = useMemo(() => {
268
+ const resolvedHref2 = href ?? info?.url;
269
+ return resolvedHref2 ? generateURL(resolvedHref2, void 0, commentId) : void 0;
270
+ }, [commentId, href, info?.url]);
271
+ return /* @__PURE__ */ React__default.createElement(InboxNotificationLayout, {
272
+ inboxNotification,
273
+ aside,
274
+ title,
275
+ date,
276
+ unread,
277
+ overrides,
278
+ href: resolvedHref,
279
+ showActions,
280
+ markAsReadOnClick: false,
281
+ ...props,
282
+ ref: forwardedRef
283
+ }, content);
284
+ }
285
+ );
286
+ const InboxNotificationCustom = forwardRef(
287
+ ({
288
+ inboxNotification,
289
+ showActions = "hover",
290
+ title,
291
+ aside,
292
+ children,
293
+ overrides,
294
+ ...props
295
+ }, forwardedRef) => {
296
+ const unread = useMemo(() => {
297
+ return !inboxNotification.readAt || inboxNotification.notifiedAt > inboxNotification.readAt;
298
+ }, [inboxNotification.notifiedAt, inboxNotification.readAt]);
299
+ return /* @__PURE__ */ React__default.createElement(InboxNotificationLayout, {
300
+ inboxNotification,
301
+ aside,
302
+ title,
303
+ date: inboxNotification.notifiedAt,
304
+ unread,
305
+ overrides,
306
+ showActions,
307
+ ...props,
308
+ ref: forwardedRef
309
+ }, children);
310
+ }
311
+ );
312
+ const InboxNotificationCustomMissing = forwardRef(({ inboxNotification, ...props }, forwardedRef) => {
313
+ return /* @__PURE__ */ React__default.createElement(InboxNotificationCustom, {
314
+ inboxNotification,
315
+ ...props,
316
+ title: /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, "Custom notification kind ", /* @__PURE__ */ React__default.createElement("code", null, inboxNotification.kind), " is not handled"),
317
+ aside: /* @__PURE__ */ React__default.createElement(InboxNotificationIcon, null, /* @__PURE__ */ React__default.createElement(MissingIcon, null)),
318
+ ref: forwardedRef,
319
+ "data-missing": ""
320
+ }, "Notifications of this kind won\u2019t be displayed in production. Use the", " ", /* @__PURE__ */ React__default.createElement("code", null, "kinds"), " prop to define how they should be rendered.");
321
+ });
322
+ const inboxNotificationKindsWarnings = /* @__PURE__ */ new Set();
323
+ const InboxNotification = Object.assign(
324
+ forwardRef(
325
+ ({ inboxNotification, kinds, ...props }, forwardedRef) => {
326
+ switch (inboxNotification.kind) {
327
+ case "thread": {
328
+ const ResolvedInboxNotificationThread = kinds?.thread ?? InboxNotificationThread;
329
+ return /* @__PURE__ */ React__default.createElement(ResolvedInboxNotificationThread, {
330
+ inboxNotification,
331
+ ...props,
332
+ ref: forwardedRef
333
+ });
334
+ }
335
+ default: {
336
+ const ResolvedInboxNotificationCustom = kinds?.[inboxNotification.kind];
337
+ if (!ResolvedInboxNotificationCustom) {
338
+ if (process.env.NODE_ENV !== "production") {
339
+ if (!inboxNotificationKindsWarnings.has(inboxNotification.kind)) {
340
+ inboxNotificationKindsWarnings.add(inboxNotification.kind);
341
+ console.warn(
342
+ `Custom notification kind "${inboxNotification.kind}" is not handled so notifications of this kind will not be displayed in production. Use the kinds prop to define how they should be rendered.`
343
+ );
344
+ }
345
+ return /* @__PURE__ */ React__default.createElement(InboxNotificationCustomMissing, {
346
+ inboxNotification,
347
+ ...props,
348
+ ref: forwardedRef
349
+ });
350
+ } else {
351
+ return null;
352
+ }
353
+ }
354
+ return /* @__PURE__ */ React__default.createElement(ResolvedInboxNotificationCustom, {
355
+ inboxNotification,
356
+ ...props,
357
+ ref: forwardedRef
358
+ });
359
+ }
360
+ }
361
+ }
362
+ ),
363
+ {
364
+ Thread: InboxNotificationThread,
365
+ Custom: InboxNotificationCustom,
366
+ Icon: InboxNotificationIcon,
367
+ Avatar: InboxNotificationAvatar
368
+ }
369
+ );
370
+
371
+ export { InboxNotification };
372
+ //# sourceMappingURL=InboxNotification.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InboxNotification.mjs","sources":["../../src/components/InboxNotification.tsx"],"sourcesContent":["\"use client\";\n\nimport type {\n InboxNotificationCustomData,\n InboxNotificationData,\n InboxNotificationThreadData,\n} from \"@liveblocks/core\";\nimport { assertNever, console } from \"@liveblocks/core\";\nimport { useLiveblocksContextBundle } from \"@liveblocks/react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { TooltipProvider } from \"@radix-ui/react-tooltip\";\nimport type {\n ComponentProps,\n ComponentPropsWithoutRef,\n ComponentType,\n MouseEvent as ReactMouseEvent,\n ReactNode,\n SyntheticEvent,\n} from \"react\";\nimport React, { forwardRef, useCallback, useMemo, useState } from \"react\";\n\nimport type { GlobalComponents } from \"../components\";\nimport { useComponents } from \"../components\";\nimport { CheckIcon } from \"../icons/Check\";\nimport { EllipsisIcon } from \"../icons/Ellipsis\";\nimport { MissingIcon } from \"../icons/Missing\";\nimport type {\n CommentOverrides,\n GlobalOverrides,\n InboxNotificationOverrides,\n} from \"../overrides\";\nimport { useOverrides } from \"../overrides\";\nimport { Timestamp } from \"../primitives/Timestamp\";\nimport { useCurrentUserId } from \"../shared\";\nimport type { SlotProp } from \"../types\";\nimport { classNames } from \"../utils/class-names\";\nimport { generateURL } from \"../utils/url\";\nimport { Avatar, type AvatarProps } from \"./internal/Avatar\";\nimport { Button } from \"./internal/Button\";\nimport { Dropdown, DropdownItem, DropdownTrigger } from \"./internal/Dropdown\";\nimport {\n generateInboxNotificationThreadContents,\n INBOX_NOTIFICATION_THREAD_MAX_COMMENTS,\n InboxNotificationComment,\n} from \"./internal/InboxNotificationThread\";\nimport { List } from \"./internal/List\";\nimport { Room } from \"./internal/Room\";\nimport { Tooltip } from \"./internal/Tooltip\";\nimport { User } from \"./internal/User\";\n\ntype Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;\n\ntype ComponentTypeWithRef<\n T extends keyof JSX.IntrinsicElements,\n P,\n> = ComponentType<P & Pick<ComponentProps<T>, \"ref\">>;\n\ntype InboxNotificationKinds = Record<\n `$${string}`,\n ComponentTypeWithRef<\n \"a\",\n Optional<InboxNotificationCustomProps, \"title\" | \"children\">\n >\n> & {\n thread: ComponentTypeWithRef<\"a\", InboxNotificationThreadProps>;\n};\n\ninterface InboxNotificationSharedProps {\n /**\n * How to show or hide the actions.\n */\n showActions?: boolean | \"hover\";\n}\n\nexport interface InboxNotificationProps\n extends Omit<ComponentPropsWithoutRef<\"a\">, \"title\">,\n InboxNotificationSharedProps {\n /**\n * The inbox notification to display.\n */\n inboxNotification: InboxNotificationData;\n\n /**\n * Override specific kinds of inbox notifications.\n */\n kinds?: Partial<InboxNotificationKinds>;\n\n /**\n * Override the component's strings.\n */\n overrides?: Partial<\n GlobalOverrides & InboxNotificationOverrides & CommentOverrides\n >;\n\n /**\n * Override the component's components.\n */\n components?: Partial<GlobalComponents>;\n}\n\nexport interface InboxNotificationThreadProps\n extends Omit<InboxNotificationProps, \"kinds\" | \"children\">,\n InboxNotificationSharedProps {\n /**\n * The inbox notification to display.\n */\n inboxNotification: InboxNotificationThreadData;\n\n /**\n * Whether to show the room name in the title.\n */\n showRoomName?: boolean;\n}\n\nexport interface InboxNotificationCustomProps\n extends Omit<InboxNotificationProps, \"kinds\">,\n InboxNotificationSharedProps,\n SlotProp {\n /**\n * The inbox notification to display.\n */\n inboxNotification: InboxNotificationCustomData;\n\n /**\n * The inbox notification's content.\n */\n children: ReactNode;\n\n /**\n * The inbox notification's title.\n */\n title: ReactNode;\n\n /**\n * The inbox notification's aside content.\n * Can be combined with `InboxNotification.Icon` or `InboxNotification.Avatar` to easily follow default styles.\n */\n aside?: ReactNode;\n\n /**\n * Whether to mark the inbox notification as read when clicked.\n */\n markAsReadOnClick?: boolean;\n}\n\ninterface InboxNotificationLayoutProps\n extends Omit<ComponentPropsWithoutRef<\"a\">, \"title\">,\n InboxNotificationSharedProps,\n SlotProp {\n inboxNotification: InboxNotificationData;\n aside: ReactNode;\n title: ReactNode;\n date: Date | string | number;\n unread?: boolean;\n overrides?: Partial<GlobalOverrides & InboxNotificationOverrides>;\n components?: Partial<GlobalComponents>;\n markAsReadOnClick?: boolean;\n}\n\nexport type InboxNotificationIconProps = ComponentProps<\"div\">;\n\nexport type InboxNotificationAvatarProps = AvatarProps;\n\nconst InboxNotificationLayout = forwardRef<\n HTMLAnchorElement,\n InboxNotificationLayoutProps\n>(\n (\n {\n inboxNotification,\n children,\n aside,\n title,\n date,\n unread,\n markAsReadOnClick,\n onClick,\n href,\n showActions,\n overrides,\n components,\n className,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const $ = useOverrides(overrides);\n const { Anchor } = useComponents(components);\n const Component = asChild ? Slot : Anchor;\n const [isMoreActionOpen, setMoreActionOpen] = useState(false);\n const { useMarkInboxNotificationAsRead } = useLiveblocksContextBundle();\n const markInboxNotificationAsRead = useMarkInboxNotificationAsRead();\n\n const handleClick = useCallback(\n (event: ReactMouseEvent<HTMLAnchorElement, MouseEvent>) => {\n onClick?.(event);\n\n const shouldMarkAsReadOnClick = markAsReadOnClick ?? Boolean(href);\n\n if (unread && shouldMarkAsReadOnClick) {\n markInboxNotificationAsRead(inboxNotification.id);\n }\n },\n [\n href,\n inboxNotification.id,\n markAsReadOnClick,\n markInboxNotificationAsRead,\n onClick,\n unread,\n ]\n );\n\n const stopPropagation = useCallback((event: SyntheticEvent) => {\n event.stopPropagation();\n }, []);\n\n const preventDefaultAndStopPropagation = useCallback(\n (event: SyntheticEvent) => {\n event.preventDefault();\n event.stopPropagation();\n },\n []\n );\n\n const handleMoreClick = useCallback((event: ReactMouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n setMoreActionOpen((open) => !open);\n }, []);\n\n const handleMarkAsRead = useCallback(() => {\n markInboxNotificationAsRead(inboxNotification.id);\n }, [inboxNotification.id, markInboxNotificationAsRead]);\n\n return (\n <TooltipProvider>\n <Component\n className={classNames(\n \"lb-root lb-inbox-notification\",\n showActions === \"hover\" &&\n \"lb-inbox-notification:show-actions-hover\",\n isMoreActionOpen && \"lb-inbox-notification:action-open\",\n className\n )}\n dir={$.dir}\n data-unread={unread ? \"\" : undefined}\n data-kind={inboxNotification.kind}\n onClick={handleClick}\n href={href}\n {...props}\n ref={forwardedRef}\n >\n {aside && <div className=\"lb-inbox-notification-aside\">{aside}</div>}\n <div className=\"lb-inbox-notification-content\">\n <div className=\"lb-inbox-notification-header\">\n <span className=\"lb-inbox-notification-title\">{title}</span>\n <div className=\"lb-inbox-notification-details\">\n <span className=\"lb-inbox-notification-details-labels\">\n <Timestamp\n locale={$.locale}\n date={date}\n className=\"lb-inbox-notification-date\"\n />\n {unread && (\n <span\n className=\"lb-inbox-notification-unread-indicator\"\n role=\"presentation\"\n />\n )}\n </span>\n </div>\n {showActions && (\n <div className=\"lb-inbox-notification-actions\">\n <Dropdown\n open={isMoreActionOpen}\n onOpenChange={setMoreActionOpen}\n align=\"end\"\n content={\n <>\n <DropdownItem\n onSelect={handleMarkAsRead}\n onClick={stopPropagation}\n disabled={!unread}\n >\n <CheckIcon className=\"lb-dropdown-item-icon\" />\n {$.INBOX_NOTIFICATION_MARK_AS_READ}\n </DropdownItem>\n </>\n }\n >\n <Tooltip content={$.INBOX_NOTIFICATION_MORE}>\n <DropdownTrigger asChild>\n <Button\n className=\"lb-inbox-notification-action\"\n onClick={handleMoreClick}\n onPointerDown={preventDefaultAndStopPropagation}\n onPointerUp={preventDefaultAndStopPropagation}\n aria-label={$.INBOX_NOTIFICATION_MORE}\n >\n <EllipsisIcon className=\"lb-button-icon\" />\n </Button>\n </DropdownTrigger>\n </Tooltip>\n </Dropdown>\n </div>\n )}\n </div>\n <div className=\"lb-inbox-notification-body\">{children}</div>\n </div>\n </Component>\n </TooltipProvider>\n );\n }\n);\n\nfunction InboxNotificationIcon({\n className,\n ...props\n}: InboxNotificationIconProps) {\n return (\n <div\n className={classNames(\"lb-inbox-notification-icon\", className)}\n {...props}\n />\n );\n}\n\nfunction InboxNotificationAvatar({\n className,\n ...props\n}: InboxNotificationAvatarProps) {\n return (\n <Avatar\n className={classNames(\"lb-inbox-notification-avatar\", className)}\n {...props}\n />\n );\n}\n\n/**\n * Displays a thread inbox notification.\n */\nconst InboxNotificationThread = forwardRef<\n HTMLAnchorElement,\n InboxNotificationThreadProps\n>(\n (\n {\n inboxNotification,\n href,\n showRoomName = true,\n showActions = \"hover\",\n overrides,\n ...props\n },\n forwardedRef\n ) => {\n const $ = useOverrides(overrides);\n const { useRoomInfo, useInboxNotificationThread } =\n useLiveblocksContextBundle();\n const thread = useInboxNotificationThread(inboxNotification.id);\n const currentUserId = useCurrentUserId();\n // TODO: If you provide `href` (or plan to), we shouldn't run this hook. We should find a way to conditionally run it.\n // Because of batching and the fact that the same hook will be called within <Room /> in the notification's title,\n // it's not a big deal, the only scenario where it would be superfluous would be if the user provides their own\n // `href` AND disables room names in the title via `showRoomName={false}`.\n const { info } = useRoomInfo(inboxNotification.roomId);\n const { unread, date, aside, title, content, commentId } = useMemo(() => {\n const contents = generateInboxNotificationThreadContents(\n inboxNotification,\n thread,\n currentUserId ?? \"\"\n );\n\n switch (contents.type) {\n case \"comments\": {\n const reversedUserIds = [...contents.userIds].reverse();\n const firstUserId = reversedUserIds[0];\n\n const aside = <InboxNotificationAvatar userId={firstUserId} />;\n const title = $.INBOX_NOTIFICATION_THREAD_COMMENTS_LIST(\n <List\n values={reversedUserIds.map((userId, index) => (\n <User\n key={userId}\n userId={userId}\n capitalize={index === 0}\n replaceSelf\n />\n ))}\n formatRemaining={$.LIST_REMAINING_USERS}\n truncate={INBOX_NOTIFICATION_THREAD_MAX_COMMENTS - 1}\n />,\n showRoomName ? <Room roomId={thread.roomId} /> : undefined,\n reversedUserIds.length\n );\n const content = (\n <div className=\"lb-inbox-notification-comments\">\n {contents.comments.map((comment) => (\n <InboxNotificationComment\n key={comment.id}\n comment={comment}\n showHeader={contents.comments.length > 1}\n overrides={overrides}\n />\n ))}\n </div>\n );\n\n return {\n unread: contents.unread,\n date: contents.date,\n aside,\n title,\n content,\n threadId: thread.id,\n commentId: contents.comments[contents.comments.length - 1].id,\n };\n }\n\n case \"mention\": {\n const mentionUserId = contents.userIds[0];\n const mentionComment = contents.comments[0];\n\n const aside = <InboxNotificationAvatar userId={mentionUserId} />;\n const title = $.INBOX_NOTIFICATION_THREAD_MENTION(\n <User key={mentionUserId} userId={mentionUserId} capitalize />,\n showRoomName ? <Room roomId={thread.roomId} /> : undefined\n );\n const content = (\n <div className=\"lb-inbox-notification-comments\">\n <InboxNotificationComment\n key={mentionComment.id}\n comment={mentionComment}\n showHeader={false}\n />\n </div>\n );\n\n return {\n unread: contents.unread,\n date: contents.date,\n aside,\n title,\n content,\n threadId: thread.id,\n commentId: mentionComment.id,\n };\n }\n\n default:\n return assertNever(\n contents,\n \"Unexpected thread inbox notification type\"\n );\n }\n }, [$, currentUserId, inboxNotification, overrides, showRoomName, thread]);\n // Add the thread ID and comment ID to the `href`.\n // And use URL from `resolveRoomsInfo` if `href` isn't set.\n const resolvedHref = useMemo(() => {\n const resolvedHref = href ?? info?.url;\n\n return resolvedHref\n ? generateURL(resolvedHref, undefined, commentId)\n : undefined;\n }, [commentId, href, info?.url]);\n\n return (\n <InboxNotificationLayout\n inboxNotification={inboxNotification}\n aside={aside}\n title={title}\n date={date}\n unread={unread}\n overrides={overrides}\n href={resolvedHref}\n showActions={showActions}\n markAsReadOnClick={false}\n {...props}\n ref={forwardedRef}\n >\n {content}\n </InboxNotificationLayout>\n );\n }\n);\n\n/**\n * Displays a custom notification kind.\n */\nconst InboxNotificationCustom = forwardRef<\n HTMLAnchorElement,\n InboxNotificationCustomProps\n>(\n (\n {\n inboxNotification,\n showActions = \"hover\",\n title,\n aside,\n children,\n overrides,\n ...props\n },\n forwardedRef\n ) => {\n const unread = useMemo(() => {\n return (\n !inboxNotification.readAt ||\n inboxNotification.notifiedAt > inboxNotification.readAt\n );\n }, [inboxNotification.notifiedAt, inboxNotification.readAt]);\n\n return (\n <InboxNotificationLayout\n inboxNotification={inboxNotification}\n aside={aside}\n title={title}\n date={inboxNotification.notifiedAt}\n unread={unread}\n overrides={overrides}\n showActions={showActions}\n {...props}\n ref={forwardedRef}\n >\n {children}\n </InboxNotificationLayout>\n );\n }\n);\n\nconst InboxNotificationCustomMissing = forwardRef<\n HTMLAnchorElement,\n Omit<InboxNotificationCustomProps, \"children\" | \"title\" | \"aside\">\n>(({ inboxNotification, ...props }, forwardedRef) => {\n return (\n <InboxNotificationCustom\n inboxNotification={inboxNotification}\n {...props}\n title={\n <>\n Custom notification kind <code>{inboxNotification.kind}</code> is not\n handled\n </>\n }\n aside={\n <InboxNotificationIcon>\n <MissingIcon />\n </InboxNotificationIcon>\n }\n ref={forwardedRef}\n data-missing=\"\"\n >\n {/* TODO: Add link to the docs */}\n Notifications of this kind won’t be displayed in production. Use the{\" \"}\n <code>kinds</code> prop to define how they should be rendered.\n </InboxNotificationCustom>\n );\n});\n\n// Keeps track of which inbox notification kinds it has warned about already.\nconst inboxNotificationKindsWarnings: Set<string> = new Set();\n\n/**\n * Displays a single inbox notification.\n *\n * @example\n * <>\n * {inboxNotifications.map((inboxNotification) => (\n * <InboxNotification\n * key={inboxNotification.id}\n * inboxNotification={inboxNotification}\n * href={`/rooms/${inboxNotification.roomId}`\n * />\n * ))}\n * </>\n */\nexport const InboxNotification = Object.assign(\n forwardRef<HTMLAnchorElement, InboxNotificationProps>(\n ({ inboxNotification, kinds, ...props }, forwardedRef) => {\n switch (inboxNotification.kind) {\n case \"thread\": {\n const ResolvedInboxNotificationThread =\n kinds?.thread ?? InboxNotificationThread;\n\n return (\n <ResolvedInboxNotificationThread\n inboxNotification={inboxNotification}\n {...props}\n ref={forwardedRef}\n />\n );\n }\n\n default: {\n const ResolvedInboxNotificationCustom =\n kinds?.[inboxNotification.kind];\n\n if (!ResolvedInboxNotificationCustom) {\n if (process.env.NODE_ENV !== \"production\") {\n if (!inboxNotificationKindsWarnings.has(inboxNotification.kind)) {\n inboxNotificationKindsWarnings.add(inboxNotification.kind);\n // TODO: Add link to the docs\n console.warn(\n `Custom notification kind \"${inboxNotification.kind}\" is not handled so notifications of this kind will not be displayed in production. Use the kinds prop to define how they should be rendered.`\n );\n }\n\n return (\n <InboxNotificationCustomMissing\n inboxNotification={inboxNotification}\n {...props}\n ref={forwardedRef}\n />\n );\n } else {\n // Don't render anything in production if this inbox notification kind is not defined.\n return null;\n }\n }\n\n return (\n <ResolvedInboxNotificationCustom\n inboxNotification={inboxNotification}\n {...props}\n ref={forwardedRef}\n />\n );\n }\n }\n }\n ),\n {\n Thread: InboxNotificationThread,\n Custom: InboxNotificationCustom,\n Icon: InboxNotificationIcon,\n Avatar: InboxNotificationAvatar,\n }\n);\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAmKA;AAAgC;AAK5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACG;AAIL;AACA;AACA;AACA;AACA;AACA;AAEA;AAAoB;AAEhB;AAEA;AAEA;AACE;AAAgD;AAClD;AACF;AACA;AACE;AACkB;AAClB;AACA;AACA;AACA;AACF;AAGF;AACE;AAAsB;AAGxB;AAAyC;AAErC;AACA;AAAsB;AACxB;AACC;AAGH;AACE;AACA;AACA;AAAiC;AAGnC;AACE;AAAgD;AAGlD;AAEK;AACY;AACT;AAEE;AACkB;AACpB;AACF;AACO;AACoB;AACE;AACpB;AACT;AACI;AACC;AAEM;AAAc;AACxB;AAAc;AACZ;AAAc;AACZ;AAAe;AACf;AAAc;AACZ;AAAe;AACb;AACW;AACV;AACU;AAGT;AACW;AACL;AAMV;AAAc;AACZ;AACO;AACQ;AACR;AAGD;AACW;AACD;AACE;AAEV;AAAoB;AAGzB;AAGD;AAAmB;AACjB;AAAuB;AACrB;AACW;AACD;AACM;AACF;AACC;AAEb;AAAuB;AAQrC;AAAc;AAGrB;AAGN;AAEA;AAA+B;AAC7B;AAEF;AACE;AACG;AAC8D;AACzD;AAGV;AAEA;AAAiC;AAC/B;AAEF;AACE;AACG;AACgE;AAC3D;AAGV;AAKA;AAAgC;AAK5B;AACE;AACA;AACe;AACD;AACd;AACG;AAIL;AACA;AAEA;AACA;AAKA;AACA;AACE;AAAiB;AACf;AACA;AACiB;AAGnB;AAAuB;AAEnB;AACA;AAEA;AAAe;AAAgC;AAC/C;AAAgB;AACb;AAEI;AACM;AACL;AACsB;AACX;AAEd;AACkB;AACgC;AACrD;AACgB;AAAoB;AAAa;AACjC;AAElB;AACG;AAAc;AAEV;AACc;AACb;AACuC;AACvC;AAMR;AAAO;AACY;AACF;AACf;AACA;AACA;AACiB;AAC0C;AAC7D;AACF;AAGE;AACA;AAEA;AAAe;AAAgC;AAC/C;AAAgB;AACb;AAAU;AAAuB;AAAyB;AAAC;AAC5C;AAAoB;AAAa;AAEnD;AACG;AAAc;AACZ;AACqB;AACX;AACG;AAKlB;AAAO;AACY;AACF;AACf;AACA;AACA;AACiB;AACS;AAC5B;AACF;AAGE;AAAO;AACL;AACA;AACF;AACJ;AAIF;AACE;AAEA;AAEI;AAGN;AACG;AACC;AACA;AACA;AACA;AACA;AACA;AACM;AACN;AACmB;AACf;AACC;AAGP;AAGN;AAKA;AAAgC;AAK5B;AACE;AACc;AACd;AACA;AACA;AACA;AACG;AAIL;AACE;AAEmD;AAIrD;AACG;AACC;AACA;AACA;AACwB;AACxB;AACA;AACA;AACI;AACC;AAGP;AAGN;AAEA;AAIE;AACG;AACC;AACI;AAKF;AAKA;AAEG;AACQ;AAOnB;AAGA;AAgBO;AAAiC;AACtC;AAEI;AAAgC;AAE5B;AAGA;AACG;AACC;AACI;AACC;AACP;AAEJ;AAGE;AAGA;AACE;AACE;AACE;AAEA;AAAQ;AACyC;AACjD;AAGF;AACG;AACC;AACI;AACC;AACP;AAIF;AAAO;AACT;AAGF;AACG;AACC;AACI;AACC;AACP;AAEJ;AACF;AACF;AACF;AACA;AACU;AACA;AACF;AACE;AAEZ;;"}
@@ -0,0 +1,19 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ var React = require('react');
5
+ var classNames = require('../utils/class-names.js');
6
+
7
+ const InboxNotificationList = React.forwardRef(({ children, className, ...props }, forwardedRef) => {
8
+ return /* @__PURE__ */ React.createElement("ol", {
9
+ className: classNames.classNames("lb-root lb-inbox-notification-list", className),
10
+ ...props,
11
+ ref: forwardedRef
12
+ }, React.Children.map(children, (child, index) => /* @__PURE__ */ React.createElement("li", {
13
+ key: index,
14
+ className: "lb-inbox-notification-list-item"
15
+ }, child)));
16
+ });
17
+
18
+ exports.InboxNotificationList = InboxNotificationList;
19
+ //# sourceMappingURL=InboxNotificationList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InboxNotificationList.js","sources":["../../src/components/InboxNotificationList.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport React, { Children, forwardRef } from \"react\";\n\nimport { classNames } from \"../utils/class-names\";\n\nexport type InboxNotificationListProps = ComponentPropsWithoutRef<\"ol\">;\n\n/**\n * Displays inbox notifications as a list.\n *\n * @example\n * <InboxNotificationList>\n * {inboxNotifications.map((inboxNotification) => (\n * <InboxNotification key={inboxNotification.id} inboxNotification={inboxNotification} />\n * ))}\n * </InboxNotificationList>\n */\nexport const InboxNotificationList = forwardRef<\n HTMLOListElement,\n InboxNotificationListProps\n>(({ children, className, ...props }, forwardedRef) => {\n return (\n <ol\n className={classNames(\"lb-root lb-inbox-notification-list\", className)}\n {...props}\n ref={forwardedRef}\n >\n {Children.map(children, (child, index) => (\n <li key={index} className=\"lb-inbox-notification-list-item\">\n {child}\n </li>\n ))}\n </ol>\n );\n});\n"],"names":[],"mappings":";;;;;;AAmBa;AAIX;AACG;AACsE;AACjE;AACC;AAGF;AAAQ;AAAiB;AAMlC;;"}
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+ import React__default, { forwardRef, Children } from 'react';
3
+ import { classNames } from '../utils/class-names.mjs';
4
+
5
+ const InboxNotificationList = forwardRef(({ children, className, ...props }, forwardedRef) => {
6
+ return /* @__PURE__ */ React__default.createElement("ol", {
7
+ className: classNames("lb-root lb-inbox-notification-list", className),
8
+ ...props,
9
+ ref: forwardedRef
10
+ }, Children.map(children, (child, index) => /* @__PURE__ */ React__default.createElement("li", {
11
+ key: index,
12
+ className: "lb-inbox-notification-list-item"
13
+ }, child)));
14
+ });
15
+
16
+ export { InboxNotificationList };
17
+ //# sourceMappingURL=InboxNotificationList.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InboxNotificationList.mjs","sources":["../../src/components/InboxNotificationList.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport React, { Children, forwardRef } from \"react\";\n\nimport { classNames } from \"../utils/class-names\";\n\nexport type InboxNotificationListProps = ComponentPropsWithoutRef<\"ol\">;\n\n/**\n * Displays inbox notifications as a list.\n *\n * @example\n * <InboxNotificationList>\n * {inboxNotifications.map((inboxNotification) => (\n * <InboxNotification key={inboxNotification.id} inboxNotification={inboxNotification} />\n * ))}\n * </InboxNotificationList>\n */\nexport const InboxNotificationList = forwardRef<\n HTMLOListElement,\n InboxNotificationListProps\n>(({ children, className, ...props }, forwardedRef) => {\n return (\n <ol\n className={classNames(\"lb-root lb-inbox-notification-list\", className)}\n {...props}\n ref={forwardedRef}\n >\n {Children.map(children, (child, index) => (\n <li key={index} className=\"lb-inbox-notification-list-item\">\n {child}\n </li>\n ))}\n </ol>\n );\n});\n"],"names":[],"mappings":";;;;AAmBa;AAIX;AACG;AACsE;AACjE;AACC;AAGF;AAAQ;AAAiB;AAMlC;;"}
@@ -0,0 +1,188 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ var react = require('@liveblocks/react');
5
+ var TogglePrimitive = require('@radix-ui/react-toggle');
6
+ var React = require('react');
7
+ var ArrowDown = require('../icons/ArrowDown.js');
8
+ var Resolve = require('../icons/Resolve.js');
9
+ var Resolved = require('../icons/Resolved.js');
10
+ var overrides = require('../overrides.js');
11
+ var classNames = require('../utils/class-names.js');
12
+ var findLastIndex = require('../utils/find-last-index.js');
13
+ var Comment = require('./Comment.js');
14
+ var Composer = require('./Composer.js');
15
+ var Button = require('./internal/Button.js');
16
+ var Tooltip = require('./internal/Tooltip.js');
17
+ var TooltipPrimitive = require('@radix-ui/react-tooltip');
18
+
19
+ function _interopNamespaceDefault(e) {
20
+ var n = Object.create(null);
21
+ if (e) {
22
+ Object.keys(e).forEach(function (k) {
23
+ if (k !== 'default') {
24
+ var d = Object.getOwnPropertyDescriptor(e, k);
25
+ Object.defineProperty(n, k, d.get ? d : {
26
+ enumerable: true,
27
+ get: function () { return e[k]; }
28
+ });
29
+ }
30
+ });
31
+ }
32
+ n.default = e;
33
+ return Object.freeze(n);
34
+ }
35
+
36
+ var TogglePrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(TogglePrimitive);
37
+
38
+ const Thread = React.forwardRef(
39
+ ({
40
+ thread,
41
+ indentCommentContent = true,
42
+ showActions = "hover",
43
+ showDeletedComments,
44
+ showResolveAction = true,
45
+ showReactions = true,
46
+ showComposer = "collapsed",
47
+ onResolvedChange,
48
+ onCommentEdit,
49
+ onCommentDelete,
50
+ onThreadDelete,
51
+ onAuthorClick,
52
+ onMentionClick,
53
+ overrides: overrides$1,
54
+ className,
55
+ ...props
56
+ }, forwardedRef) => {
57
+ const { useEditThreadMetadata, useThreadSubscription } = react.useRoomContextBundle();
58
+ const editThreadMetadata = useEditThreadMetadata();
59
+ const $ = overrides.useOverrides(overrides$1);
60
+ const firstCommentIndex = React.useMemo(() => {
61
+ return showDeletedComments ? 0 : thread.comments.findIndex((comment) => comment.body);
62
+ }, [showDeletedComments, thread.comments]);
63
+ const lastCommentIndex = React.useMemo(() => {
64
+ return showDeletedComments ? thread.comments.length - 1 : findLastIndex.findLastIndex(thread.comments, (comment) => comment.body);
65
+ }, [showDeletedComments, thread.comments]);
66
+ const { status: subscriptionStatus, unreadSince } = useThreadSubscription(
67
+ thread.id
68
+ );
69
+ const unreadIndex = React.useMemo(() => {
70
+ if (subscriptionStatus !== "subscribed") {
71
+ return;
72
+ }
73
+ if (unreadSince === null) {
74
+ return firstCommentIndex;
75
+ }
76
+ const unreadIndex2 = thread.comments.findIndex(
77
+ (comment) => (showDeletedComments ? true : comment.body) && comment.createdAt > unreadSince
78
+ );
79
+ return unreadIndex2 >= 0 && unreadIndex2 < thread.comments.length ? unreadIndex2 : void 0;
80
+ }, [
81
+ firstCommentIndex,
82
+ showDeletedComments,
83
+ subscriptionStatus,
84
+ thread.comments,
85
+ unreadSince
86
+ ]);
87
+ const [newIndex, setNewIndex] = React.useState();
88
+ const newIndicatorIndex = newIndex === void 0 ? unreadIndex : newIndex;
89
+ React.useEffect(() => {
90
+ if (unreadIndex) {
91
+ setNewIndex(
92
+ (persistedUnreadIndex) => Math.min(persistedUnreadIndex ?? Infinity, unreadIndex)
93
+ );
94
+ }
95
+ }, [unreadIndex]);
96
+ const stopPropagation = React.useCallback((event) => {
97
+ event.stopPropagation();
98
+ }, []);
99
+ const handleResolvedChange = React.useCallback(
100
+ (resolved) => {
101
+ onResolvedChange?.(resolved);
102
+ editThreadMetadata({ threadId: thread.id, metadata: { resolved } });
103
+ },
104
+ [editThreadMetadata, onResolvedChange, thread.id]
105
+ );
106
+ const handleCommentDelete = React.useCallback(
107
+ (comment) => {
108
+ onCommentDelete?.(comment);
109
+ const filteredComments = thread.comments.filter(
110
+ (comment2) => comment2.body
111
+ );
112
+ if (filteredComments.length <= 1) {
113
+ onThreadDelete?.(thread);
114
+ }
115
+ },
116
+ [onCommentDelete, onThreadDelete, thread]
117
+ );
118
+ return /* @__PURE__ */ React.createElement(TooltipPrimitive.TooltipProvider, null, /* @__PURE__ */ React.createElement("div", {
119
+ className: classNames.classNames(
120
+ "lb-root lb-thread",
121
+ showActions === "hover" && "lb-thread:show-actions-hover",
122
+ className
123
+ ),
124
+ "data-resolved": thread.metadata.resolved ? "" : void 0,
125
+ "data-unread": unreadIndex !== void 0 ? "" : void 0,
126
+ dir: $.dir,
127
+ ...props,
128
+ ref: forwardedRef
129
+ }, /* @__PURE__ */ React.createElement("div", {
130
+ className: "lb-thread-comments"
131
+ }, thread.comments.map((comment, index) => {
132
+ const isFirstComment = index === firstCommentIndex;
133
+ const isUnread = unreadIndex !== void 0 && index >= unreadIndex;
134
+ const children = /* @__PURE__ */ React.createElement(Comment.Comment, {
135
+ key: comment.id,
136
+ className: "lb-thread-comment",
137
+ "data-unread": isUnread ? "" : void 0,
138
+ comment,
139
+ indentContent: indentCommentContent,
140
+ showDeleted: showDeletedComments,
141
+ showActions,
142
+ showReactions,
143
+ onCommentEdit,
144
+ onCommentDelete: handleCommentDelete,
145
+ onAuthorClick,
146
+ onMentionClick,
147
+ markThreadAsReadWhenVisible: index === lastCommentIndex && isUnread ? thread.id : void 0,
148
+ additionalActionsClassName: isFirstComment ? "lb-thread-actions" : void 0,
149
+ additionalActions: isFirstComment && showResolveAction ? /* @__PURE__ */ React.createElement(Tooltip.Tooltip, {
150
+ content: thread.metadata.resolved ? $.THREAD_UNRESOLVE : $.THREAD_RESOLVE
151
+ }, /* @__PURE__ */ React.createElement(TogglePrimitive__namespace.Root, {
152
+ pressed: thread.metadata.resolved,
153
+ onPressedChange: handleResolvedChange,
154
+ asChild: true
155
+ }, /* @__PURE__ */ React.createElement(Button.Button, {
156
+ className: "lb-comment-action",
157
+ onClick: stopPropagation,
158
+ "aria-label": thread.metadata.resolved ? $.THREAD_UNRESOLVE : $.THREAD_RESOLVE
159
+ }, thread.metadata.resolved ? /* @__PURE__ */ React.createElement(Resolved.ResolvedIcon, {
160
+ className: "lb-button-icon"
161
+ }) : /* @__PURE__ */ React.createElement(Resolve.ResolveIcon, {
162
+ className: "lb-button-icon"
163
+ })))) : null
164
+ });
165
+ return index === newIndicatorIndex && newIndicatorIndex !== firstCommentIndex && newIndicatorIndex <= lastCommentIndex ? /* @__PURE__ */ React.createElement(React.Fragment, {
166
+ key: comment.id
167
+ }, /* @__PURE__ */ React.createElement("div", {
168
+ className: "lb-thread-new-indicator",
169
+ "aria-label": $.THREAD_NEW_INDICATOR_DESCRIPTION
170
+ }, /* @__PURE__ */ React.createElement("span", {
171
+ className: "lb-thread-new-indicator-label"
172
+ }, /* @__PURE__ */ React.createElement(ArrowDown.ArrowDownIcon, {
173
+ className: "lb-thread-new-indicator-label-icon"
174
+ }), $.THREAD_NEW_INDICATOR)), children) : children;
175
+ })), showComposer && /* @__PURE__ */ React.createElement(Composer.Composer, {
176
+ className: "lb-thread-composer",
177
+ threadId: thread.id,
178
+ defaultCollapsed: showComposer === "collapsed" ? true : void 0,
179
+ overrides: {
180
+ COMPOSER_PLACEHOLDER: $.THREAD_COMPOSER_PLACEHOLDER,
181
+ COMPOSER_SEND: $.THREAD_COMPOSER_SEND
182
+ }
183
+ })));
184
+ }
185
+ );
186
+
187
+ exports.Thread = Thread;
188
+ //# sourceMappingURL=Thread.js.map