@tldraw/commenting 0.0.0-bootstrap → 5.3.0-canary.04044ed9e96d

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 (338) hide show
  1. package/README.md +0 -2
  2. package/commenting.css +1152 -350
  3. package/dist-cjs/canvas/anchor-lifecycle.js +148 -0
  4. package/dist-cjs/canvas/anchor-lifecycle.js.map +7 -0
  5. package/dist-cjs/{ui/avatar.js → canvas/canvas-events.js} +14 -22
  6. package/dist-cjs/canvas/canvas-events.js.map +7 -0
  7. package/dist-cjs/canvas/cluster-badge.js +121 -0
  8. package/dist-cjs/canvas/cluster-badge.js.map +7 -0
  9. package/dist-cjs/canvas/cluster-fade.js +85 -0
  10. package/dist-cjs/canvas/cluster-fade.js.map +7 -0
  11. package/dist-cjs/canvas/cluster-input.js +53 -3
  12. package/dist-cjs/canvas/cluster-input.js.map +2 -2
  13. package/dist-cjs/canvas/cluster-model.js +252 -0
  14. package/dist-cjs/canvas/cluster-model.js.map +7 -0
  15. package/dist-cjs/canvas/comment-body.js +1 -1
  16. package/dist-cjs/canvas/comment-body.js.map +2 -2
  17. package/dist-cjs/canvas/comment-drafts.js +54 -0
  18. package/dist-cjs/canvas/comment-drafts.js.map +7 -0
  19. package/dist-cjs/canvas/comment-mutations.js +152 -0
  20. package/dist-cjs/canvas/comment-mutations.js.map +7 -0
  21. package/dist-cjs/canvas/comment-reactions.js +160 -0
  22. package/dist-cjs/canvas/comment-reactions.js.map +7 -0
  23. package/dist-cjs/canvas/comment-render.js +9 -6
  24. package/dist-cjs/canvas/comment-render.js.map +2 -2
  25. package/dist-cjs/canvas/comment-store.js +19 -9
  26. package/dist-cjs/canvas/comment-store.js.map +2 -2
  27. package/dist-cjs/canvas/comment-tool.js +63 -14
  28. package/dist-cjs/canvas/comment-tool.js.map +2 -2
  29. package/dist-cjs/canvas/comments-filter-menu.js +17 -37
  30. package/dist-cjs/canvas/comments-filter-menu.js.map +2 -2
  31. package/dist-cjs/canvas/comments-overflow-menu.js +25 -22
  32. package/dist-cjs/canvas/comments-overflow-menu.js.map +2 -2
  33. package/dist-cjs/canvas/comments-overlay.js +151 -989
  34. package/dist-cjs/canvas/comments-overlay.js.map +3 -3
  35. package/dist-cjs/canvas/comments-sidebar.js +49 -41
  36. package/dist-cjs/canvas/comments-sidebar.js.map +2 -2
  37. package/dist-cjs/canvas/comments-visibility-toggle.js +45 -0
  38. package/dist-cjs/canvas/comments-visibility-toggle.js.map +7 -0
  39. package/dist-cjs/canvas/context.js +17 -0
  40. package/dist-cjs/canvas/context.js.map +7 -0
  41. package/dist-cjs/canvas/hooks.js +28 -3
  42. package/dist-cjs/canvas/hooks.js.map +2 -2
  43. package/dist-cjs/canvas/license.js.map +1 -1
  44. package/dist-cjs/canvas/mobile-placement.js +91 -0
  45. package/dist-cjs/canvas/mobile-placement.js.map +7 -0
  46. package/dist-cjs/canvas/options.js +57 -2
  47. package/dist-cjs/canvas/options.js.map +2 -2
  48. package/dist-cjs/canvas/pending-composer.js +134 -0
  49. package/dist-cjs/canvas/pending-composer.js.map +7 -0
  50. package/dist-cjs/canvas/pin-stacking.js +81 -0
  51. package/dist-cjs/canvas/pin-stacking.js.map +7 -0
  52. package/dist-cjs/canvas/region-box.js +113 -0
  53. package/dist-cjs/canvas/region-box.js.map +7 -0
  54. package/dist-cjs/canvas/sidebar-filters.js +2 -2
  55. package/dist-cjs/canvas/sidebar-filters.js.map +2 -2
  56. package/dist-cjs/canvas/state.js +28 -14
  57. package/dist-cjs/canvas/state.js.map +2 -2
  58. package/dist-cjs/canvas/thread-pin.js +304 -0
  59. package/dist-cjs/canvas/thread-pin.js.map +7 -0
  60. package/dist-cjs/canvas/thread-preview.js +177 -0
  61. package/dist-cjs/canvas/thread-preview.js.map +7 -0
  62. package/dist-cjs/canvas/thread-stack.js +199 -0
  63. package/dist-cjs/canvas/thread-stack.js.map +7 -0
  64. package/dist-cjs/canvas/thread-state.js +82 -21
  65. package/dist-cjs/canvas/thread-state.js.map +2 -2
  66. package/dist-cjs/canvas/thread-view.js +450 -0
  67. package/dist-cjs/canvas/thread-view.js.map +7 -0
  68. package/dist-cjs/clustering/computeClusterTable.js +6 -6
  69. package/dist-cjs/clustering/computeClusterTable.js.map +2 -2
  70. package/dist-cjs/clustering/replay.js +89 -22
  71. package/dist-cjs/clustering/replay.js.map +3 -3
  72. package/dist-cjs/clustering/runtime.js +126 -7
  73. package/dist-cjs/clustering/runtime.js.map +2 -2
  74. package/dist-cjs/clustering/types.js.map +1 -1
  75. package/dist-cjs/index.d.ts +904 -353
  76. package/dist-cjs/index.js +52 -28
  77. package/dist-cjs/index.js.map +2 -2
  78. package/dist-cjs/ui/byline.js +10 -6
  79. package/dist-cjs/ui/byline.js.map +2 -2
  80. package/dist-cjs/ui/comment-card.js +15 -8
  81. package/dist-cjs/ui/comment-card.js.map +2 -2
  82. package/dist-cjs/ui/comment-composer.js +124 -39
  83. package/dist-cjs/ui/comment-composer.js.map +2 -2
  84. package/dist-cjs/ui/comment-pin.js +11 -2
  85. package/dist-cjs/ui/comment-pin.js.map +2 -2
  86. package/dist-cjs/ui/comment-thread.js +9 -7
  87. package/dist-cjs/ui/comment-thread.js.map +2 -2
  88. package/dist-cjs/ui/comments-list.js +39 -40
  89. package/dist-cjs/ui/comments-list.js.map +2 -2
  90. package/dist-cjs/ui/count-badge.js +3 -2
  91. package/dist-cjs/ui/count-badge.js.map +2 -2
  92. package/dist-cjs/ui/emoji-picker.js +54 -0
  93. package/dist-cjs/ui/emoji-picker.js.map +7 -0
  94. package/dist-cjs/ui/empty-state.js +3 -3
  95. package/dist-cjs/ui/empty-state.js.map +2 -2
  96. package/dist-cjs/ui/format-time.js +16 -1
  97. package/dist-cjs/ui/format-time.js.map +2 -2
  98. package/dist-cjs/ui/icons.js +115 -0
  99. package/dist-cjs/ui/icons.js.map +7 -0
  100. package/dist-cjs/ui/reaction-picker.js +71 -0
  101. package/dist-cjs/ui/reaction-picker.js.map +7 -0
  102. package/dist-cjs/ui/reaction.js +58 -6
  103. package/dist-cjs/ui/reaction.js.map +2 -2
  104. package/dist-cjs/ui/reactions.js +20 -7
  105. package/dist-cjs/ui/reactions.js.map +2 -2
  106. package/dist-cjs/ui/{mention.js → reply-count.js} +9 -11
  107. package/dist-cjs/ui/reply-count.js.map +7 -0
  108. package/dist-cjs/ui/send-button.js +13 -1
  109. package/dist-cjs/ui/send-button.js.map +2 -2
  110. package/dist-cjs/ui/{comment-text.js → visual-viewport.js} +12 -9
  111. package/dist-cjs/ui/visual-viewport.js.map +7 -0
  112. package/dist-esm/canvas/anchor-lifecycle.mjs +128 -0
  113. package/dist-esm/canvas/anchor-lifecycle.mjs.map +7 -0
  114. package/dist-esm/canvas/canvas-events.mjs +15 -0
  115. package/dist-esm/canvas/canvas-events.mjs.map +7 -0
  116. package/dist-esm/canvas/cluster-badge.mjs +106 -0
  117. package/dist-esm/canvas/cluster-badge.mjs.map +7 -0
  118. package/dist-esm/canvas/cluster-fade.mjs +65 -0
  119. package/dist-esm/canvas/cluster-fade.mjs.map +7 -0
  120. package/dist-esm/canvas/cluster-input.mjs +54 -4
  121. package/dist-esm/canvas/cluster-input.mjs.map +2 -2
  122. package/dist-esm/canvas/cluster-model.mjs +236 -0
  123. package/dist-esm/canvas/cluster-model.mjs.map +7 -0
  124. package/dist-esm/canvas/comment-body.mjs +1 -1
  125. package/dist-esm/canvas/comment-body.mjs.map +2 -2
  126. package/dist-esm/canvas/comment-drafts.mjs +34 -0
  127. package/dist-esm/canvas/comment-drafts.mjs.map +7 -0
  128. package/dist-esm/canvas/comment-mutations.mjs +132 -0
  129. package/dist-esm/canvas/comment-mutations.mjs.map +7 -0
  130. package/dist-esm/canvas/comment-reactions.mjs +145 -0
  131. package/dist-esm/canvas/comment-reactions.mjs.map +7 -0
  132. package/dist-esm/canvas/comment-render.mjs +10 -7
  133. package/dist-esm/canvas/comment-render.mjs.map +2 -2
  134. package/dist-esm/canvas/comment-store.mjs +19 -9
  135. package/dist-esm/canvas/comment-store.mjs.map +2 -2
  136. package/dist-esm/canvas/comment-tool.mjs +66 -17
  137. package/dist-esm/canvas/comment-tool.mjs.map +2 -2
  138. package/dist-esm/canvas/comments-filter-menu.mjs +17 -36
  139. package/dist-esm/canvas/comments-filter-menu.mjs.map +2 -2
  140. package/dist-esm/canvas/comments-overflow-menu.mjs +27 -22
  141. package/dist-esm/canvas/comments-overflow-menu.mjs.map +2 -2
  142. package/dist-esm/canvas/comments-overlay.mjs +157 -1010
  143. package/dist-esm/canvas/comments-overlay.mjs.map +3 -3
  144. package/dist-esm/canvas/comments-sidebar.mjs +53 -46
  145. package/dist-esm/canvas/comments-sidebar.mjs.map +2 -2
  146. package/dist-esm/canvas/comments-visibility-toggle.mjs +25 -0
  147. package/dist-esm/canvas/comments-visibility-toggle.mjs.map +7 -0
  148. package/dist-esm/canvas/context.mjs +1 -0
  149. package/dist-esm/canvas/context.mjs.map +7 -0
  150. package/dist-esm/canvas/hooks.mjs +35 -5
  151. package/dist-esm/canvas/hooks.mjs.map +2 -2
  152. package/dist-esm/canvas/license.mjs.map +1 -1
  153. package/dist-esm/canvas/mobile-placement.mjs +71 -0
  154. package/dist-esm/canvas/mobile-placement.mjs.map +7 -0
  155. package/dist-esm/canvas/options.mjs +59 -3
  156. package/dist-esm/canvas/options.mjs.map +2 -2
  157. package/dist-esm/canvas/pending-composer.mjs +126 -0
  158. package/dist-esm/canvas/pending-composer.mjs.map +7 -0
  159. package/dist-esm/canvas/pin-stacking.mjs +61 -0
  160. package/dist-esm/canvas/pin-stacking.mjs.map +7 -0
  161. package/dist-esm/canvas/region-box.mjs +93 -0
  162. package/dist-esm/canvas/region-box.mjs.map +7 -0
  163. package/dist-esm/canvas/sidebar-filters.mjs +2 -2
  164. package/dist-esm/canvas/sidebar-filters.mjs.map +2 -2
  165. package/dist-esm/canvas/state.mjs +29 -19
  166. package/dist-esm/canvas/state.mjs.map +2 -2
  167. package/dist-esm/canvas/thread-pin.mjs +310 -0
  168. package/dist-esm/canvas/thread-pin.mjs.map +7 -0
  169. package/dist-esm/canvas/thread-preview.mjs +163 -0
  170. package/dist-esm/canvas/thread-preview.mjs.map +7 -0
  171. package/dist-esm/canvas/thread-stack.mjs +189 -0
  172. package/dist-esm/canvas/thread-stack.mjs.map +7 -0
  173. package/dist-esm/canvas/thread-state.mjs +86 -22
  174. package/dist-esm/canvas/thread-state.mjs.map +2 -2
  175. package/dist-esm/canvas/thread-view.mjs +461 -0
  176. package/dist-esm/canvas/thread-view.mjs.map +7 -0
  177. package/dist-esm/clustering/computeClusterTable.mjs +6 -6
  178. package/dist-esm/clustering/computeClusterTable.mjs.map +2 -2
  179. package/dist-esm/clustering/replay.mjs +89 -22
  180. package/dist-esm/clustering/replay.mjs.map +3 -3
  181. package/dist-esm/clustering/runtime.mjs +126 -7
  182. package/dist-esm/clustering/runtime.mjs.map +2 -2
  183. package/dist-esm/index.d.mts +904 -353
  184. package/dist-esm/index.mjs +102 -43
  185. package/dist-esm/index.mjs.map +2 -2
  186. package/dist-esm/ui/byline.mjs +11 -7
  187. package/dist-esm/ui/byline.mjs.map +2 -2
  188. package/dist-esm/ui/comment-card.mjs +15 -8
  189. package/dist-esm/ui/comment-card.mjs.map +2 -2
  190. package/dist-esm/ui/comment-composer.mjs +135 -39
  191. package/dist-esm/ui/comment-composer.mjs.map +2 -2
  192. package/dist-esm/ui/comment-pin.mjs +11 -2
  193. package/dist-esm/ui/comment-pin.mjs.map +2 -2
  194. package/dist-esm/ui/comment-thread.mjs +9 -7
  195. package/dist-esm/ui/comment-thread.mjs.map +2 -2
  196. package/dist-esm/ui/comments-list.mjs +51 -50
  197. package/dist-esm/ui/comments-list.mjs.map +2 -2
  198. package/dist-esm/ui/count-badge.mjs +3 -2
  199. package/dist-esm/ui/count-badge.mjs.map +2 -2
  200. package/dist-esm/ui/emoji-picker.mjs +34 -0
  201. package/dist-esm/ui/emoji-picker.mjs.map +7 -0
  202. package/dist-esm/ui/empty-state.mjs +3 -3
  203. package/dist-esm/ui/empty-state.mjs.map +2 -2
  204. package/dist-esm/ui/format-time.mjs +16 -1
  205. package/dist-esm/ui/format-time.mjs.map +2 -2
  206. package/dist-esm/ui/icons.mjs +95 -0
  207. package/dist-esm/ui/icons.mjs.map +7 -0
  208. package/dist-esm/ui/reaction-picker.mjs +59 -0
  209. package/dist-esm/ui/reaction-picker.mjs.map +7 -0
  210. package/dist-esm/ui/reaction.mjs +59 -7
  211. package/dist-esm/ui/reaction.mjs.map +2 -2
  212. package/dist-esm/ui/reactions.mjs +21 -8
  213. package/dist-esm/ui/reactions.mjs.map +2 -2
  214. package/dist-esm/ui/reply-count.mjs +9 -0
  215. package/dist-esm/ui/reply-count.mjs.map +7 -0
  216. package/dist-esm/ui/send-button.mjs +13 -1
  217. package/dist-esm/ui/send-button.mjs.map +2 -2
  218. package/dist-esm/ui/visual-viewport.mjs +12 -0
  219. package/dist-esm/ui/visual-viewport.mjs.map +7 -0
  220. package/package.json +6 -6
  221. package/src/canvas/anchor-lifecycle.test.ts +290 -0
  222. package/src/canvas/anchor-lifecycle.ts +191 -0
  223. package/src/canvas/canvas-events.ts +18 -0
  224. package/src/canvas/canvas.css +464 -55
  225. package/src/canvas/cluster-badge.tsx +133 -0
  226. package/src/canvas/cluster-fade.ts +102 -0
  227. package/src/canvas/cluster-input.test.ts +178 -36
  228. package/src/canvas/cluster-input.ts +95 -9
  229. package/src/canvas/cluster-model.ts +378 -0
  230. package/src/canvas/comment-body.tsx +1 -1
  231. package/src/canvas/comment-drafts.test.ts +55 -0
  232. package/src/canvas/comment-drafts.ts +46 -0
  233. package/src/canvas/comment-mutations.test.ts +452 -0
  234. package/src/canvas/comment-mutations.ts +299 -0
  235. package/src/canvas/comment-reactions.test.ts +154 -0
  236. package/src/canvas/comment-reactions.tsx +246 -0
  237. package/src/canvas/comment-render.test.ts +1 -1
  238. package/src/canvas/comment-render.ts +17 -13
  239. package/src/canvas/comment-store.ts +68 -33
  240. package/src/canvas/comment-tool.test.ts +162 -0
  241. package/src/canvas/comment-tool.tsx +103 -25
  242. package/src/canvas/comments-filter-menu.tsx +20 -36
  243. package/src/canvas/comments-overflow-menu.tsx +17 -19
  244. package/src/canvas/comments-overlay.tsx +252 -1369
  245. package/src/canvas/comments-sidebar.test.ts +45 -0
  246. package/src/canvas/comments-sidebar.tsx +112 -73
  247. package/src/canvas/comments-visibility-toggle.tsx +25 -0
  248. package/src/canvas/context.ts +48 -0
  249. package/src/canvas/hooks.test.ts +94 -0
  250. package/src/canvas/hooks.ts +66 -11
  251. package/src/canvas/license.ts +1 -1
  252. package/src/canvas/mobile-placement.ts +115 -0
  253. package/src/canvas/options.test.ts +176 -4
  254. package/src/canvas/options.ts +276 -18
  255. package/src/canvas/pending-composer.tsx +157 -0
  256. package/src/canvas/pin-stacking.test.ts +224 -0
  257. package/src/canvas/pin-stacking.ts +103 -0
  258. package/src/canvas/region-box.tsx +124 -0
  259. package/src/canvas/sidebar-filters.ts +4 -3
  260. package/src/canvas/state.ts +88 -39
  261. package/src/canvas/thread-pin.tsx +418 -0
  262. package/src/canvas/thread-preview.test.ts +91 -0
  263. package/src/canvas/thread-preview.tsx +294 -0
  264. package/src/canvas/thread-stack.tsx +242 -0
  265. package/src/canvas/thread-state.test.ts +260 -0
  266. package/src/canvas/thread-state.ts +171 -37
  267. package/src/canvas/thread-view.test.ts +72 -0
  268. package/src/canvas/thread-view.tsx +614 -0
  269. package/src/clustering/computeClusterTable.test.ts +24 -23
  270. package/src/clustering/computeClusterTable.ts +17 -8
  271. package/src/clustering/replay.test.ts +0 -7
  272. package/src/clustering/replay.ts +131 -32
  273. package/src/clustering/runtime.test.ts +267 -13
  274. package/src/clustering/runtime.ts +176 -19
  275. package/src/clustering/schedule.test.ts +0 -6
  276. package/src/clustering/screen-offsets.test.ts +171 -0
  277. package/src/clustering/types.ts +19 -9
  278. package/src/index.ts +91 -42
  279. package/src/ui/byline.tsx +21 -9
  280. package/src/ui/comment-card.tsx +20 -10
  281. package/src/ui/comment-composer.tsx +178 -56
  282. package/src/ui/comment-pin.tsx +13 -2
  283. package/src/ui/comment-thread.tsx +13 -6
  284. package/src/ui/comments-list.test.ts +31 -0
  285. package/src/ui/comments-list.tsx +82 -47
  286. package/src/ui/comments.css +577 -294
  287. package/src/ui/count-badge.tsx +9 -2
  288. package/src/ui/emoji-picker.test.ts +25 -0
  289. package/src/ui/emoji-picker.tsx +76 -0
  290. package/src/ui/empty-state.tsx +3 -3
  291. package/src/ui/format-time.test.ts +69 -0
  292. package/src/ui/format-time.ts +27 -2
  293. package/src/ui/icons.tsx +116 -0
  294. package/src/ui/reaction-picker.tsx +102 -0
  295. package/src/ui/reaction.tsx +125 -6
  296. package/src/ui/reactions.tsx +69 -10
  297. package/src/ui/reply-count.ts +16 -0
  298. package/src/ui/send-button.tsx +13 -3
  299. package/src/ui/visual-viewport.test.ts +36 -0
  300. package/src/ui/visual-viewport.ts +27 -0
  301. package/dist-cjs/canvas/region-options.js +0 -49
  302. package/dist-cjs/canvas/region-options.js.map +0 -7
  303. package/dist-cjs/ui/avatar.js.map +0 -7
  304. package/dist-cjs/ui/comment-mention.js +0 -42
  305. package/dist-cjs/ui/comment-mention.js.map +0 -7
  306. package/dist-cjs/ui/comment-text.js.map +0 -7
  307. package/dist-cjs/ui/mention-list.js +0 -70
  308. package/dist-cjs/ui/mention-list.js.map +0 -7
  309. package/dist-cjs/ui/mention-suggestion.js +0 -206
  310. package/dist-cjs/ui/mention-suggestion.js.map +0 -7
  311. package/dist-cjs/ui/mention.js.map +0 -7
  312. package/dist-cjs/ui/render-markdown.js +0 -63
  313. package/dist-cjs/ui/render-markdown.js.map +0 -7
  314. package/dist-esm/canvas/region-options.mjs +0 -29
  315. package/dist-esm/canvas/region-options.mjs.map +0 -7
  316. package/dist-esm/ui/avatar.mjs +0 -23
  317. package/dist-esm/ui/avatar.mjs.map +0 -7
  318. package/dist-esm/ui/comment-mention.mjs +0 -22
  319. package/dist-esm/ui/comment-mention.mjs.map +0 -7
  320. package/dist-esm/ui/comment-text.mjs +0 -9
  321. package/dist-esm/ui/comment-text.mjs.map +0 -7
  322. package/dist-esm/ui/mention-list.mjs +0 -50
  323. package/dist-esm/ui/mention-list.mjs.map +0 -7
  324. package/dist-esm/ui/mention-suggestion.mjs +0 -186
  325. package/dist-esm/ui/mention-suggestion.mjs.map +0 -7
  326. package/dist-esm/ui/mention.mjs +0 -11
  327. package/dist-esm/ui/mention.mjs.map +0 -7
  328. package/dist-esm/ui/render-markdown.mjs +0 -45
  329. package/dist-esm/ui/render-markdown.mjs.map +0 -7
  330. package/src/canvas/region-options.ts +0 -57
  331. package/src/ui/avatar.tsx +0 -31
  332. package/src/ui/comment-mention.ts +0 -47
  333. package/src/ui/comment-text.tsx +0 -12
  334. package/src/ui/mention-list.tsx +0 -106
  335. package/src/ui/mention-suggestion.test.ts +0 -18
  336. package/src/ui/mention-suggestion.tsx +0 -285
  337. package/src/ui/mention.tsx +0 -9
  338. package/src/ui/render-markdown.tsx +0 -72
@@ -1,77 +1,109 @@
1
1
  import { registerTldrawLibraryVersion } from "@tldraw/utils";
2
- import { Avatar } from "./ui/avatar.mjs";
2
+ import {
3
+ Avatar,
4
+ createMentionSuggestion,
5
+ filterMentionMembers,
6
+ Mention,
7
+ MentionList
8
+ } from "@tldraw/mentions";
3
9
  import { Byline } from "./ui/byline.mjs";
4
10
  import { CommentCard } from "./ui/comment-card.mjs";
5
11
  import { CommentComposer } from "./ui/comment-composer.mjs";
6
12
  import { CountBadge } from "./ui/count-badge.mjs";
7
13
  import { CommentPin } from "./ui/comment-pin.mjs";
8
- import { CommentText } from "./ui/comment-text.mjs";
9
14
  import { CommentThread } from "./ui/comment-thread.mjs";
10
- import { CommentsList } from "./ui/comments-list.mjs";
15
+ import {
16
+ CommentListItem,
17
+ CommentsList,
18
+ isOpenInNewTabClick
19
+ } from "./ui/comments-list.mjs";
11
20
  import { EmptyState } from "./ui/empty-state.mjs";
12
- import { formatRelativeTime } from "./ui/format-time.mjs";
13
- import { Mention } from "./ui/mention.mjs";
14
- import { MentionList } from "./ui/mention-list.mjs";
21
+ import { formatFullDateTime, formatRelativeTime } from "./ui/format-time.mjs";
15
22
  import {
16
- createMentionSuggestion,
17
- filterMentionMembers
18
- } from "./ui/mention-suggestion.mjs";
19
- import { Reaction } from "./ui/reaction.mjs";
20
- import { Reactions } from "./ui/reactions.mjs";
21
- import { renderMarkdown } from "./ui/render-markdown.mjs";
23
+ DEFAULT_REACTION_EMOJI,
24
+ EmojiPicker,
25
+ isAllowedReactionEmoji
26
+ } from "./ui/emoji-picker.mjs";
27
+ import {
28
+ Reaction,
29
+ defaultRenderReaction,
30
+ DefaultReactionTooltip,
31
+ DefaultReactionTooltipContent
32
+ } from "./ui/reaction.mjs";
33
+ import { ReactionPicker } from "./ui/reaction-picker.mjs";
34
+ import {
35
+ Reactions
36
+ } from "./ui/reactions.mjs";
22
37
  import { SendButton } from "./ui/send-button.mjs";
38
+ import { registerCommentAnchorLifecycle } from "./canvas/anchor-lifecycle.mjs";
23
39
  import { CommentBody } from "./canvas/comment-body.mjs";
24
40
  import {
25
- CommentTool,
26
- commentToolOverrides,
27
- commentTools
28
- } from "./canvas/comment-tool.mjs";
29
- import { collectClusterLeaves } from "./canvas/cluster-input.mjs";
30
- import { computeClusterTable } from "./clustering/computeClusterTable.mjs";
41
+ deleteComment,
42
+ deleteThread,
43
+ editComment,
44
+ putCommentRecords,
45
+ removeCommentRecords,
46
+ reopenThread,
47
+ resolveThread
48
+ } from "./canvas/comment-mutations.mjs";
49
+ import {
50
+ CommentReactionPicker,
51
+ CommentReactions,
52
+ summarizeReactions,
53
+ toggleCommentReaction,
54
+ useCommentReactions
55
+ } from "./canvas/comment-reactions.mjs";
56
+ import { CommentTool, commentToolOverrides, commentTools } from "./canvas/comment-tool.mjs";
31
57
  import {
58
+ getCommentReactions,
32
59
  getCommentRecord,
33
60
  getComments,
34
61
  getCommentThreads,
35
- putCommentRecords,
36
- removeCommentRecords
62
+ getLiveComments,
63
+ getLiveCommentThreads
37
64
  } from "./canvas/comment-store.mjs";
38
- import { createClusterRuntime } from "./clustering/runtime.mjs";
39
65
  import { CommentsFilterMenu } from "./canvas/comments-filter-menu.mjs";
40
66
  import { CommentsMenuItem } from "./canvas/comments-menu-item.mjs";
41
67
  import { CanvasComments } from "./canvas/comments-overlay.mjs";
42
68
  import {
69
+ defaultCanModifyComment,
43
70
  defaultCommentingOptions,
71
+ getCanComment,
72
+ getCanModifyComment,
44
73
  getCommentingOptions,
74
+ useCanComment,
75
+ useCanModifyComment,
45
76
  useCommentingOptions
46
77
  } from "./canvas/options.mjs";
47
78
  import { CommentsOverflowMenu } from "./canvas/comments-overflow-menu.mjs";
48
- import { CanvasCommentsSidebar } from "./canvas/comments-sidebar.mjs";
79
+ import { CommentsVisibilityToggle } from "./canvas/comments-visibility-toggle.mjs";
80
+ import {
81
+ CanvasCommentsSidebar,
82
+ sortSidebarRows
83
+ } from "./canvas/comments-sidebar.mjs";
49
84
  import { useComments, useCommentThreads, useThreadComments } from "./canvas/hooks.mjs";
50
85
  import { useCommentingEnabled } from "./canvas/license.mjs";
51
- import { DEFAULT_REGION_COMMENT_OPTIONS } from "./canvas/region-options.mjs";
52
86
  import { richTextToPlaintext } from "./canvas/rich-text.mjs";
53
87
  import { DEFAULT_SIDEBAR_FILTERS } from "./canvas/sidebar-filters.mjs";
54
88
  import {
55
89
  commentsHidden,
56
- commitCommentMutation,
90
+ commentsSidebarOpen,
91
+ getRevealThreadPending,
57
92
  openThreadId,
58
- pendingComment,
93
+ revealThread,
59
94
  sidebarFilters,
60
95
  toggleCommentsHidden,
96
+ toggleCommentsSidebar,
61
97
  useCommentsHidden,
98
+ useCommentsSidebarOpen,
62
99
  useOpenThreadId,
63
- usePendingComment,
100
+ useRevealThreadPending,
64
101
  useSidebarFilters
65
102
  } from "./canvas/state.mjs";
66
- import {
67
- anchorPagePoint,
68
- DEFAULT_IMPRECISE_SHAPE_ANCHOR,
69
- focusThread,
70
- shapeAnchorAt
71
- } from "./canvas/thread-state.mjs";
103
+ import { anchorPagePoint, focusThread, shapeAnchorAt } from "./canvas/thread-state.mjs";
72
104
  registerTldrawLibraryVersion(
73
105
  "@tldraw/commenting",
74
- "0.0.0-bootstrap",
106
+ "5.3.0-canary.04044ed9e96d",
75
107
  "esm"
76
108
  );
77
109
  export {
@@ -82,57 +114,84 @@ export {
82
114
  CommentBody,
83
115
  CommentCard,
84
116
  CommentComposer,
117
+ CommentListItem,
85
118
  CommentPin,
86
- CommentText,
119
+ CommentReactionPicker,
120
+ CommentReactions,
87
121
  CommentThread,
88
122
  CommentTool,
89
123
  CommentsFilterMenu,
90
124
  CommentsList,
91
125
  CommentsMenuItem,
92
126
  CommentsOverflowMenu,
127
+ CommentsVisibilityToggle,
93
128
  CountBadge,
94
- DEFAULT_IMPRECISE_SHAPE_ANCHOR,
95
- DEFAULT_REGION_COMMENT_OPTIONS,
129
+ DEFAULT_REACTION_EMOJI,
96
130
  DEFAULT_SIDEBAR_FILTERS,
131
+ DefaultReactionTooltip,
132
+ DefaultReactionTooltipContent,
133
+ EmojiPicker,
97
134
  EmptyState,
98
135
  Mention,
99
136
  MentionList,
100
137
  Reaction,
138
+ ReactionPicker,
101
139
  Reactions,
102
140
  SendButton,
103
141
  anchorPagePoint,
104
- collectClusterLeaves,
105
142
  commentToolOverrides,
106
143
  commentTools,
107
144
  commentsHidden,
108
- commitCommentMutation,
109
- computeClusterTable,
110
- createClusterRuntime,
145
+ commentsSidebarOpen,
111
146
  createMentionSuggestion,
147
+ defaultCanModifyComment,
112
148
  defaultCommentingOptions,
149
+ defaultRenderReaction,
150
+ deleteComment,
151
+ deleteThread,
152
+ editComment,
113
153
  filterMentionMembers,
114
154
  focusThread,
155
+ formatFullDateTime,
115
156
  formatRelativeTime,
157
+ getCanComment,
158
+ getCanModifyComment,
159
+ getCommentReactions,
116
160
  getCommentRecord,
117
161
  getCommentThreads,
118
162
  getCommentingOptions,
119
163
  getComments,
164
+ getLiveCommentThreads,
165
+ getLiveComments,
166
+ getRevealThreadPending,
167
+ isAllowedReactionEmoji,
168
+ isOpenInNewTabClick,
120
169
  openThreadId,
121
- pendingComment,
122
170
  putCommentRecords,
171
+ registerCommentAnchorLifecycle,
123
172
  removeCommentRecords,
124
- renderMarkdown,
173
+ reopenThread,
174
+ resolveThread,
175
+ revealThread,
125
176
  richTextToPlaintext,
126
177
  shapeAnchorAt,
127
178
  sidebarFilters,
179
+ sortSidebarRows,
180
+ summarizeReactions,
181
+ toggleCommentReaction,
128
182
  toggleCommentsHidden,
183
+ toggleCommentsSidebar,
184
+ useCanComment,
185
+ useCanModifyComment,
186
+ useCommentReactions,
129
187
  useCommentThreads,
130
188
  useCommentingEnabled,
131
189
  useCommentingOptions,
132
190
  useComments,
133
191
  useCommentsHidden,
192
+ useCommentsSidebarOpen,
134
193
  useOpenThreadId,
135
- usePendingComment,
194
+ useRevealThreadPending,
136
195
  useSidebarFilters,
137
196
  useThreadComments
138
197
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["import { registerTldrawLibraryVersion } from '@tldraw/utils'\n\n// Presentational commenting components. These are tldraw-independent and can be used to build\n// custom commenting UI.\nexport { Avatar, type AvatarProps } from './ui/avatar'\nexport { Byline, type BylineProps } from './ui/byline'\nexport { CommentCard, type CommentCardProps } from './ui/comment-card'\nexport { CommentComposer, type CommentComposerProps } from './ui/comment-composer'\nexport { CountBadge, type CountBadgeProps } from './ui/count-badge'\nexport { CommentPin, type CommentPinProps } from './ui/comment-pin'\nexport { CommentText, type CommentTextProps } from './ui/comment-text'\nexport { CommentThread, type CommentThreadProps } from './ui/comment-thread'\nexport { CommentsList, type CommentListItemProps, type CommentsListProps } from './ui/comments-list'\nexport { EmptyState, type EmptyStateProps } from './ui/empty-state'\nexport { formatRelativeTime } from './ui/format-time'\nexport { Mention, type MentionProps } from './ui/mention'\nexport { MentionList, type MentionListProps, type MentionMember } from './ui/mention-list'\nexport {\n\tcreateMentionSuggestion,\n\tfilterMentionMembers,\n\ttype MentionSuggestionOptions,\n} from './ui/mention-suggestion'\nexport { Reaction, type ReactionProps } from './ui/reaction'\nexport { Reactions } from './ui/reactions'\nexport { renderMarkdown } from './ui/render-markdown'\nexport { SendButton, type SendButtonProps } from './ui/send-button'\n\n// The tldraw-coupled commenting layer: the comment tool, reactive hooks over the comment\n// records, a rich-text body renderer, and a batteries-included <CanvasComments> overlay. Pairs\n// with the presentational components above.\nexport { CommentBody, type CommentBodyProps } from './canvas/comment-body'\nexport {\n\tCommentTool,\n\tcommentToolOverrides,\n\tcommentTools,\n\ttype PendingComment,\n} from './canvas/comment-tool'\nexport { collectClusterLeaves } from './canvas/cluster-input'\nexport { computeClusterTable } from './clustering/computeClusterTable'\nexport {\n\tgetCommentRecord,\n\tgetComments,\n\tgetCommentThreads,\n\tputCommentRecords,\n\tremoveCommentRecords,\n\ttype TLCommentRecord,\n} from './canvas/comment-store'\nexport { createClusterRuntime, type ClusterRuntime } from './clustering/runtime'\nexport type {\n\tClusterNode,\n\tClusterOptions,\n\tClusterTable,\n\tLeafInput,\n\tMergeEvent,\n} from './clustering/types'\nexport { CommentsFilterMenu, type CommentsFilterMenuProps } from './canvas/comments-filter-menu'\nexport { CommentsMenuItem } from './canvas/comments-menu-item'\nexport { CanvasComments, type CanvasCommentsProps } from './canvas/comments-overlay'\nexport {\n\ttype CommentingComponents,\n\ttype CommentingOptions,\n\tdefaultCommentingOptions,\n\tgetCommentingOptions,\n\tuseCommentingOptions,\n} from './canvas/options'\nexport { CommentsOverflowMenu } from './canvas/comments-overflow-menu'\nexport { CanvasCommentsSidebar, type CanvasCommentsSidebarProps } from './canvas/comments-sidebar'\nexport { useComments, useCommentThreads, useThreadComments } from './canvas/hooks'\nexport { useCommentingEnabled } from './canvas/license'\nexport { DEFAULT_REGION_COMMENT_OPTIONS, type RegionCommentOptions } from './canvas/region-options'\nexport { richTextToPlaintext } from './canvas/rich-text'\nexport { DEFAULT_SIDEBAR_FILTERS, type SidebarFilters } from './canvas/sidebar-filters'\nexport {\n\tcommentsHidden,\n\tcommitCommentMutation,\n\topenThreadId,\n\tpendingComment,\n\tsidebarFilters,\n\ttoggleCommentsHidden,\n\tuseCommentsHidden,\n\tuseOpenThreadId,\n\tusePendingComment,\n\tuseSidebarFilters,\n} from './canvas/state'\nexport {\n\tanchorPagePoint,\n\tDEFAULT_IMPRECISE_SHAPE_ANCHOR,\n\tfocusThread,\n\tshapeAnchorAt,\n} from './canvas/thread-state'\n\nregisterTldrawLibraryVersion(\n\t(globalThis as any).TLDRAW_LIBRARY_NAME,\n\t(globalThis as any).TLDRAW_LIBRARY_VERSION,\n\t(globalThis as any).TLDRAW_LIBRARY_MODULES\n)\n"],
5
- "mappings": "AAAA,SAAS,oCAAoC;AAI7C,SAAS,cAAgC;AACzC,SAAS,cAAgC;AACzC,SAAS,mBAA0C;AACnD,SAAS,uBAAkD;AAC3D,SAAS,kBAAwC;AACjD,SAAS,kBAAwC;AACjD,SAAS,mBAA0C;AACnD,SAAS,qBAA8C;AACvD,SAAS,oBAAuE;AAChF,SAAS,kBAAwC;AACjD,SAAS,0BAA0B;AACnC,SAAS,eAAkC;AAC3C,SAAS,mBAA8D;AACvE;AAAA,EACC;AAAA,EACA;AAAA,OAEM;AACP,SAAS,gBAAoC;AAC7C,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAC/B,SAAS,kBAAwC;AAKjD,SAAS,mBAA0C;AACnD;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OAEM;AACP,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AACpC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEM;AACP,SAAS,4BAAiD;AAQ1D,SAAS,0BAAwD;AACjE,SAAS,wBAAwB;AACjC,SAAS,sBAAgD;AACzD;AAAA,EAGC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,4BAA4B;AACrC,SAAS,6BAA8D;AACvE,SAAS,aAAa,mBAAmB,yBAAyB;AAClE,SAAS,4BAA4B;AACrC,SAAS,sCAAiE;AAC1E,SAAS,2BAA2B;AACpC,SAAS,+BAAoD;AAC7D;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF;",
4
+ "sourcesContent": ["import { registerTldrawLibraryVersion } from '@tldraw/utils'\n\n// Presentational commenting components. These are tldraw-independent and can be used to build\n// custom commenting UI. The mention picker, pill, and avatar are re-exported from @tldraw/mentions\n// so the commenting public API is unchanged.\nexport {\n\tAvatar,\n\ttype AvatarProps,\n\ttype CommentAuthor,\n\tcreateMentionSuggestion,\n\tfilterMentionMembers,\n\tMention,\n\tMentionList,\n\ttype MentionListProps,\n\ttype MentionMember,\n\ttype MentionProps,\n\ttype MentionSuggestionOptions,\n} from '@tldraw/mentions'\nexport { Byline, type BylineProps } from './ui/byline'\nexport { CommentCard, type CommentCardProps } from './ui/comment-card'\nexport { CommentComposer, type CommentComposerProps } from './ui/comment-composer'\nexport { CountBadge, type CountBadgeProps } from './ui/count-badge'\nexport { CommentPin, type CommentPinProps } from './ui/comment-pin'\nexport { CommentThread, type CommentThreadProps } from './ui/comment-thread'\nexport {\n\tCommentListItem,\n\tCommentsList,\n\tisOpenInNewTabClick,\n\ttype CommentListItemProps,\n\ttype CommentListItemRenderProps,\n\ttype CommentsListProps,\n} from './ui/comments-list'\nexport { EmptyState, type EmptyStateProps } from './ui/empty-state'\nexport { formatFullDateTime, formatRelativeTime } from './ui/format-time'\nexport {\n\tDEFAULT_REACTION_EMOJI,\n\tEmojiPicker,\n\ttype EmojiPickerProps,\n\tisAllowedReactionEmoji,\n} from './ui/emoji-picker'\nexport {\n\tReaction,\n\ttype ReactionProps,\n\ttype RenderReaction,\n\tdefaultRenderReaction,\n\tDefaultReactionTooltip,\n\tDefaultReactionTooltipContent,\n\ttype ReactionTooltipProps,\n} from './ui/reaction'\nexport { ReactionPicker, type ReactionPickerProps } from './ui/reaction-picker'\nexport {\n\tReactions,\n\ttype ReactionReactor,\n\ttype ReactionsProps,\n\ttype ReactionSummary,\n} from './ui/reactions'\nexport { SendButton, type SendButtonProps } from './ui/send-button'\n\n// The tldraw-coupled commenting layer: the comment tool, reactive hooks over the comment\n// records, a rich-text body renderer, and a batteries-included <CanvasComments> overlay. Pairs\n// with the presentational components above.\nexport { registerCommentAnchorLifecycle } from './canvas/anchor-lifecycle'\nexport { CommentBody, type CommentBodyProps } from './canvas/comment-body'\nexport {\n\tdeleteComment,\n\tdeleteThread,\n\teditComment,\n\tputCommentRecords,\n\tremoveCommentRecords,\n\treopenThread,\n\tresolveThread,\n} from './canvas/comment-mutations'\nexport {\n\tCommentReactionPicker,\n\ttype CommentReactionPickerProps,\n\tCommentReactions,\n\ttype CommentReactionsProps,\n\ttype ReactionSummaryInput,\n\tsummarizeReactions,\n\ttoggleCommentReaction,\n\tuseCommentReactions,\n} from './canvas/comment-reactions'\nexport { CommentTool, commentToolOverrides, commentTools } from './canvas/comment-tool'\nexport {\n\tgetCommentReactions,\n\tgetCommentRecord,\n\tgetComments,\n\tgetCommentThreads,\n\tgetLiveComments,\n\tgetLiveCommentThreads,\n\ttype TLCommentRecord,\n} from './canvas/comment-store'\nexport { type CommentingContext } from './canvas/context'\nexport { CommentsFilterMenu, type CommentsFilterMenuProps } from './canvas/comments-filter-menu'\nexport { CommentsMenuItem } from './canvas/comments-menu-item'\nexport { CanvasComments, type CanvasCommentsProps } from './canvas/comments-overlay'\nexport {\n\ttype CommentingComponents,\n\ttype CommentingOptions,\n\ttype CommentModification,\n\ttype CommentModificationContext,\n\tdefaultCanModifyComment,\n\tdefaultCommentingOptions,\n\tgetCanComment,\n\tgetCanModifyComment,\n\tgetCommentingOptions,\n\ttype ShapeCommentPrecisionContext,\n\tuseCanComment,\n\tuseCanModifyComment,\n\tuseCommentingOptions,\n} from './canvas/options'\nexport { CommentsOverflowMenu } from './canvas/comments-overflow-menu'\nexport { CommentsVisibilityToggle } from './canvas/comments-visibility-toggle'\nexport {\n\tCanvasCommentsSidebar,\n\tsortSidebarRows,\n\ttype CanvasCommentsSidebarProps,\n\ttype SidebarRow,\n} from './canvas/comments-sidebar'\nexport { useComments, useCommentThreads, useThreadComments } from './canvas/hooks'\nexport { useCommentingEnabled } from './canvas/license'\nexport { richTextToPlaintext } from './canvas/rich-text'\nexport { DEFAULT_SIDEBAR_FILTERS, type SidebarFilters } from './canvas/sidebar-filters'\nexport {\n\tcommentsHidden,\n\tcommentsSidebarOpen,\n\tgetRevealThreadPending,\n\topenThreadId,\n\trevealThread,\n\tsidebarFilters,\n\ttoggleCommentsHidden,\n\ttoggleCommentsSidebar,\n\tuseCommentsHidden,\n\tuseCommentsSidebarOpen,\n\tuseOpenThreadId,\n\tuseRevealThreadPending,\n\tuseSidebarFilters,\n} from './canvas/state'\nexport { anchorPagePoint, focusThread, shapeAnchorAt } from './canvas/thread-state'\n\nregisterTldrawLibraryVersion(\n\t(globalThis as any).TLDRAW_LIBRARY_NAME,\n\t(globalThis as any).TLDRAW_LIBRARY_VERSION,\n\t(globalThis as any).TLDRAW_LIBRARY_MODULES\n)\n"],
5
+ "mappings": "AAAA,SAAS,oCAAoC;AAK7C;AAAA,EACC;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKM;AACP,SAAS,cAAgC;AACzC,SAAS,mBAA0C;AACnD,SAAS,uBAAkD;AAC3D,SAAS,kBAAwC;AACjD,SAAS,kBAAwC;AACjD,SAAS,qBAA8C;AACvD;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OAIM;AACP,SAAS,kBAAwC;AACjD,SAAS,oBAAoB,0BAA0B;AACvD;AAAA,EACC;AAAA,EACA;AAAA,EAEA;AAAA,OACM;AACP;AAAA,EACC;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,OAEM;AACP,SAAS,sBAAgD;AACzD;AAAA,EACC;AAAA,OAIM;AACP,SAAS,kBAAwC;AAKjD,SAAS,sCAAsC;AAC/C,SAAS,mBAA0C;AACnD;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP;AAAA,EACC;AAAA,EAEA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,aAAa,sBAAsB,oBAAoB;AAChE;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEM;AAEP,SAAS,0BAAwD;AACjE,SAAS,wBAAwB;AACjC,SAAS,sBAAgD;AACzD;AAAA,EAKC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,4BAA4B;AACrC,SAAS,gCAAgC;AACzC;AAAA,EACC;AAAA,EACA;AAAA,OAGM;AACP,SAAS,aAAa,mBAAmB,yBAAyB;AAClE,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AACpC,SAAS,+BAAoD;AAC7D;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,iBAAiB,aAAa,qBAAqB;AAE5D;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,12 +1,16 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { formatRelativeTime } from "./format-time.mjs";
2
+ import { Avatar } from "@tldraw/mentions";
3
+ import { TldrawUiTooltip, useCurrentTranslation } from "tldraw";
4
+ import { formatFullDateTime, formatRelativeTime } from "./format-time.mjs";
3
5
  function Byline({ author, date, edited }) {
4
- return /* @__PURE__ */ jsxs("div", { className: "cmt-head", children: [
5
- /* @__PURE__ */ jsx("span", { className: "cmt-author", children: author }),
6
- /* @__PURE__ */ jsxs("span", { className: "cmt-time", children: [
7
- formatRelativeTime(date),
8
- edited && /* @__PURE__ */ jsx("span", { className: "cmt-edited", children: " \xB7 edited" })
9
- ] })
6
+ const { locale } = useCurrentTranslation();
7
+ return /* @__PURE__ */ jsxs("div", { className: "tlui-cmt-head", children: [
8
+ /* @__PURE__ */ jsx(Avatar, { author }),
9
+ /* @__PURE__ */ jsx("span", { className: "tlui-cmt-author", children: author.name }),
10
+ /* @__PURE__ */ jsx(TldrawUiTooltip, { content: formatFullDateTime(date, locale), children: /* @__PURE__ */ jsxs("span", { className: "tlui-cmt-time", children: [
11
+ formatRelativeTime(date, locale),
12
+ edited && /* @__PURE__ */ jsx("span", { className: "tlui-cmt-edited", children: " \xB7 edited" })
13
+ ] }) })
10
14
  ] });
11
15
  }
12
16
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/ui/byline.tsx"],
4
- "sourcesContent": ["import { formatRelativeTime } from './format-time'\n\n/** @public */\nexport interface BylineProps {\n\tauthor: string\n\t/** ISO datetime; formatted to relative time by the component. */\n\tdate: string\n\t/** Shows an \"edited\" marker when the comment has been edited. */\n\tedited?: boolean\n}\n\n/** A comment's metadata line: author name, relative time, and an edited marker. @public @react */\nexport function Byline({ author, date, edited }: BylineProps) {\n\treturn (\n\t\t<div className=\"cmt-head\">\n\t\t\t<span className=\"cmt-author\">{author}</span>\n\t\t\t<span className=\"cmt-time\">\n\t\t\t\t{formatRelativeTime(date)}\n\t\t\t\t{edited && <span className=\"cmt-edited\"> \u00B7 edited</span>}\n\t\t\t</span>\n\t\t</div>\n\t)\n}\n"],
5
- "mappings": "AAeG,cACA,YADA;AAfH,SAAS,0BAA0B;AAY5B,SAAS,OAAO,EAAE,QAAQ,MAAM,OAAO,GAAgB;AAC7D,SACC,qBAAC,SAAI,WAAU,YACd;AAAA,wBAAC,UAAK,WAAU,cAAc,kBAAO;AAAA,IACrC,qBAAC,UAAK,WAAU,YACd;AAAA,yBAAmB,IAAI;AAAA,MACvB,UAAU,oBAAC,UAAK,WAAU,cAAa,0BAAS;AAAA,OAClD;AAAA,KACD;AAEF;",
4
+ "sourcesContent": ["import { Avatar, type CommentAuthor } from '@tldraw/mentions'\nimport { TldrawUiTooltip, useCurrentTranslation } from 'tldraw'\nimport { formatFullDateTime, formatRelativeTime } from './format-time'\n\n/** @public */\nexport interface BylineProps {\n\tauthor: CommentAuthor\n\t/** ISO datetime; formatted to relative time by the component. */\n\tdate: string\n\t/** Shows an \"edited\" marker when the comment has been edited. */\n\tedited?: boolean\n}\n\n/**\n * A comment's metadata line: author name, relative time, and an edited marker. Hovering the time\n * shows the full date and time in a tooltip.\n * @public @react\n */\nexport function Byline({ author, date, edited }: BylineProps) {\n\t// The relative time is the one piece of a byline that isn't the host's data, so it follows the\n\t// same translation context as every other string in the UI rather than a prop of its own.\n\tconst { locale } = useCurrentTranslation()\n\treturn (\n\t\t<div className=\"tlui-cmt-head\">\n\t\t\t<Avatar author={author} />\n\t\t\t<span className=\"tlui-cmt-author\">{author.name}</span>\n\t\t\t<TldrawUiTooltip content={formatFullDateTime(date, locale)}>\n\t\t\t\t<span className=\"tlui-cmt-time\">\n\t\t\t\t\t{formatRelativeTime(date, locale)}\n\t\t\t\t\t{edited && <span className=\"tlui-cmt-edited\"> \u00B7 edited</span>}\n\t\t\t\t</span>\n\t\t\t</TldrawUiTooltip>\n\t\t</div>\n\t)\n}\n"],
5
+ "mappings": "AAwBG,cAGC,YAHD;AAxBH,SAAS,cAAkC;AAC3C,SAAS,iBAAiB,6BAA6B;AACvD,SAAS,oBAAoB,0BAA0B;AAgBhD,SAAS,OAAO,EAAE,QAAQ,MAAM,OAAO,GAAgB;AAG7D,QAAM,EAAE,OAAO,IAAI,sBAAsB;AACzC,SACC,qBAAC,SAAI,WAAU,iBACd;AAAA,wBAAC,UAAO,QAAgB;AAAA,IACxB,oBAAC,UAAK,WAAU,mBAAmB,iBAAO,MAAK;AAAA,IAC/C,oBAAC,mBAAgB,SAAS,mBAAmB,MAAM,MAAM,GACxD,+BAAC,UAAK,WAAU,iBACd;AAAA,yBAAmB,MAAM,MAAM;AAAA,MAC/B,UAAU,oBAAC,UAAK,WAAU,mBAAkB,0BAAS;AAAA,OACvD,GACD;AAAA,KACD;AAEF;",
6
6
  "names": []
7
7
  }
@@ -1,14 +1,21 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { Avatar } from "./avatar.mjs";
3
2
  import { Byline } from "./byline.mjs";
4
- function CommentCard({ author, body, date, you, edited, actions }) {
5
- return /* @__PURE__ */ jsxs("div", { className: you ? "cmt-card cmt-card--you" : "cmt-card", children: [
6
- /* @__PURE__ */ jsx(Avatar, { name: author }),
7
- /* @__PURE__ */ jsxs("div", { className: "cmt-body", children: [
8
- /* @__PURE__ */ jsx(Byline, { author, date, edited }),
9
- body
3
+ function CommentCard({
4
+ author,
5
+ body,
6
+ date,
7
+ you,
8
+ edited,
9
+ actions,
10
+ footer
11
+ }) {
12
+ return /* @__PURE__ */ jsxs("div", { className: you ? "tlui-cmt-card tlui-cmt-card--you" : "tlui-cmt-card", children: [
13
+ /* @__PURE__ */ jsx(Byline, { author, date, edited }),
14
+ /* @__PURE__ */ jsxs("div", { className: "tlui-cmt-body", children: [
15
+ body,
16
+ footer
10
17
  ] }),
11
- actions !== void 0 && /* @__PURE__ */ jsx("div", { className: "cmt-card__actions", children: actions })
18
+ actions !== void 0 && /* @__PURE__ */ jsx("div", { className: "tlui-cmt-card__actions", children: actions })
12
19
  ] });
13
20
  }
14
21
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/ui/comment-card.tsx"],
4
- "sourcesContent": ["import { ReactNode } from 'react'\nimport { Avatar } from './avatar'\nimport { Byline } from './byline'\n\n/** @public */\nexport interface CommentCardProps {\n\tauthor: string\n\t/** The rendered comment body. The card doesn't dictate a format \u2014 pass a `<CommentText>`\n\t * for markdown, a rich-text render, or any node. */\n\tbody: ReactNode\n\t/** ISO datetime; formatted to relative time by the component. */\n\tdate: string\n\tyou: boolean\n\t/** Whether the comment has been edited (shows an \"edited\" marker). */\n\tedited?: boolean\n\t/** Hover-revealed controls at the card's top-right (e.g. an edit affordance). */\n\tactions?: ReactNode\n}\n\n/** A single comment: Avatar, Byline, and a body slot the consumer renders. @public @react */\nexport function CommentCard({ author, body, date, you, edited, actions }: CommentCardProps) {\n\treturn (\n\t\t<div className={you ? 'cmt-card cmt-card--you' : 'cmt-card'}>\n\t\t\t<Avatar name={author} />\n\t\t\t<div className=\"cmt-body\">\n\t\t\t\t<Byline author={author} date={date} edited={edited} />\n\t\t\t\t{body}\n\t\t\t</div>\n\t\t\t{actions !== undefined && <div className=\"cmt-card__actions\">{actions}</div>}\n\t\t</div>\n\t)\n}\n"],
5
- "mappings": "AAuBG,cACA,YADA;AAtBH,SAAS,cAAc;AACvB,SAAS,cAAc;AAkBhB,SAAS,YAAY,EAAE,QAAQ,MAAM,MAAM,KAAK,QAAQ,QAAQ,GAAqB;AAC3F,SACC,qBAAC,SAAI,WAAW,MAAM,2BAA2B,YAChD;AAAA,wBAAC,UAAO,MAAM,QAAQ;AAAA,IACtB,qBAAC,SAAI,WAAU,YACd;AAAA,0BAAC,UAAO,QAAgB,MAAY,QAAgB;AAAA,MACnD;AAAA,OACF;AAAA,IACC,YAAY,UAAa,oBAAC,SAAI,WAAU,qBAAqB,mBAAQ;AAAA,KACvE;AAEF;",
4
+ "sourcesContent": ["import { type CommentAuthor } from '@tldraw/mentions'\nimport { ReactNode } from 'react'\nimport { Byline } from './byline'\n\n/** @public */\nexport interface CommentCardProps {\n\tauthor: CommentAuthor\n\t/** The rendered comment body. The card doesn't dictate a format \u2014 pass a `<CommentBody>`\n\t * for a comment's rich text, or any node of your own. */\n\tbody: ReactNode\n\t/** ISO datetime; formatted to relative time by the component. */\n\tdate: string\n\tyou: boolean\n\t/** Whether the comment has been edited (shows an \"edited\" marker). */\n\tedited?: boolean\n\t/** Hover-revealed controls at the card's top-right (e.g. an edit affordance). */\n\tactions?: ReactNode\n\t/** Content under the body, aligned with it rather than the avatar (e.g. a `<Reactions>` row). */\n\tfooter?: ReactNode\n}\n\n/** A single comment: Avatar, Byline, and a body slot the consumer renders. @public @react */\nexport function CommentCard({\n\tauthor,\n\tbody,\n\tdate,\n\tyou,\n\tedited,\n\tactions,\n\tfooter,\n}: CommentCardProps) {\n\treturn (\n\t\t<div className={you ? 'tlui-cmt-card tlui-cmt-card--you' : 'tlui-cmt-card'}>\n\t\t\t<Byline author={author} date={date} edited={edited} />\n\t\t\t<div className=\"tlui-cmt-body\">\n\t\t\t\t{body}\n\t\t\t\t{footer}\n\t\t\t</div>\n\t\t\t{actions !== undefined && <div className=\"tlui-cmt-card__actions\">{actions}</div>}\n\t\t</div>\n\t)\n}\n"],
5
+ "mappings": "AAiCG,cACA,YADA;AA/BH,SAAS,cAAc;AAoBhB,SAAS,YAAY;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAqB;AACpB,SACC,qBAAC,SAAI,WAAW,MAAM,qCAAqC,iBAC1D;AAAA,wBAAC,UAAO,QAAgB,MAAY,QAAgB;AAAA,IACpD,qBAAC,SAAI,WAAU,iBACb;AAAA;AAAA,MACA;AAAA,OACF;AAAA,IACC,YAAY,UAAa,oBAAC,SAAI,WAAU,0BAA0B,mBAAQ;AAAA,KAC5E;AAEF;",
6
6
  "names": []
7
7
  }
@@ -1,12 +1,20 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { Extension } from "@tiptap/core";
3
2
  import { EditorContent, useEditor } from "@tiptap/react";
4
- import { useEffect, useMemo, useRef, useState } from "react";
3
+ import {
4
+ Avatar,
5
+ createMentionExtension,
6
+ createMentionSuggestion,
7
+ isMentionPickerOpen
8
+ } from "@tldraw/mentions";
9
+ import {
10
+ useEffect,
11
+ useLayoutEffect,
12
+ useMemo,
13
+ useRef,
14
+ useState
15
+ } from "react";
5
16
  import { isEqual, useMaybeEditor } from "tldraw";
6
- import { Avatar } from "./avatar.mjs";
7
17
  import { commentTipTapExtensions, EMPTY_COMMENT, isCommentEmpty } from "./comment-extensions.mjs";
8
- import { commentMention } from "./comment-mention.mjs";
9
- import { createMentionSuggestion, isMentionPickerOpen } from "./mention-suggestion.mjs";
10
18
  import { SendButton } from "./send-button.mjs";
11
19
  function CommentComposer({
12
20
  author,
@@ -15,6 +23,7 @@ function CommentComposer({
15
23
  onChange,
16
24
  onSubmit,
17
25
  sendLabel = "Send",
26
+ onArrowUpWhenEmpty,
18
27
  disabled,
19
28
  autoFocus,
20
29
  leading,
@@ -27,6 +36,8 @@ function CommentComposer({
27
36
  onChangeRef.current = onChange;
28
37
  const onSubmitRef = useRef(onSubmit);
29
38
  onSubmitRef.current = onSubmit;
39
+ const onArrowUpWhenEmptyRef = useRef(onArrowUpWhenEmpty);
40
+ onArrowUpWhenEmptyRef.current = onArrowUpWhenEmpty;
30
41
  const disabledRef = useRef(disabled);
31
42
  disabledRef.current = disabled;
32
43
  const getMentionSuggestionsRef = useRef(getMentionSuggestions);
@@ -34,31 +45,55 @@ function CommentComposer({
34
45
  const renderMentionSuggestionRef = useRef(renderMentionSuggestion);
35
46
  renderMentionSuggestionRef.current = renderMentionSuggestion;
36
47
  const [isEmpty, setIsEmpty] = useState(() => !value || isCommentEmpty(value));
37
- const submitExtension = useMemo(
38
- () => Extension.create({
39
- name: "commentComposerSubmit",
40
- priority: 1e3,
41
- addKeyboardShortcuts() {
42
- return {
43
- Enter: () => {
44
- if (isMentionPickerOpen()) return false;
45
- if (!disabledRef.current) onSubmitRef.current?.();
46
- return true;
47
- }
48
- };
49
- }
50
- }),
51
- []
52
- );
48
+ const [expanded, setExpanded] = useState(false);
49
+ const expandedRef = useRef(expanded);
50
+ expandedRef.current = expanded;
51
+ const inputWrapRef = useRef(null);
52
+ const mirrorRef = useRef(null);
53
+ const remeasure = () => {
54
+ const wrap = inputWrapRef.current;
55
+ const mirror = mirrorRef.current;
56
+ const editor2 = editorRef.current;
57
+ if (!wrap || !mirror || !editor2) return;
58
+ if (editor2.isEmpty) {
59
+ if (expandedRef.current) setExpanded(false);
60
+ return;
61
+ }
62
+ if (wrap.clientWidth === 0) return;
63
+ const doc = editor2.state.doc;
64
+ const multiBlock = doc.childCount > 1 || doc.firstChild !== null && doc.firstChild.type.name !== "paragraph";
65
+ if (multiBlock) {
66
+ if (!expandedRef.current) setExpanded(true);
67
+ return;
68
+ }
69
+ const field = wrap.parentElement;
70
+ const send = field ? field.querySelector(".tlui-cmt-send") : null;
71
+ const input = wrap.querySelector(".tlui-cmt-input");
72
+ if (!send || !input) return;
73
+ mirror.innerHTML = input.innerHTML;
74
+ const textWidth = mirror.offsetWidth;
75
+ const wrapStyle = getComputedStyle(wrap);
76
+ const wrapPadX = parseFloat(wrapStyle.paddingLeft) + parseFloat(wrapStyle.paddingRight);
77
+ const collapsedAvailable = wrap.clientWidth - wrapPadX - (expandedRef.current ? send.offsetWidth + 6 : 0);
78
+ if (!expandedRef.current && textWidth > collapsedAvailable - 8) {
79
+ setExpanded(true);
80
+ } else if (expandedRef.current && textWidth < collapsedAvailable - 24) {
81
+ setExpanded(false);
82
+ }
83
+ };
84
+ const remeasureRef = useRef(remeasure);
85
+ remeasureRef.current = remeasure;
86
+ const editorRef = useRef(null);
87
+ const replayingEnter = useRef(false);
53
88
  const mentionsEnabled = !!getMentionSuggestions;
54
89
  const hasCustomRow = !!renderMentionSuggestion;
55
90
  const extensions = useMemo(() => {
56
- const list = [...commentTipTapExtensions, submitExtension];
91
+ const list = [...commentTipTapExtensions];
57
92
  if (mentionsEnabled) {
58
93
  const resolveSuggestions = (query) => getMentionSuggestionsRef.current?.(query) ?? [];
59
94
  const renderRow = hasCustomRow ? (member) => renderMentionSuggestionRef.current?.(member) : void 0;
60
95
  list.push(
61
- commentMention({
96
+ createMentionExtension({
62
97
  suggestion: createMentionSuggestion(resolveSuggestions, {
63
98
  renderMember: renderRow,
64
99
  editor: tlEditor
@@ -66,48 +101,109 @@ function CommentComposer({
66
101
  })
67
102
  );
68
103
  } else {
69
- list.push(commentMention({ suggestion: { char: "@", allow: () => false } }));
104
+ list.push(createMentionExtension({ suggestion: { char: "@", allow: () => false } }));
70
105
  }
71
106
  return list;
72
- }, [submitExtension, mentionsEnabled, hasCustomRow, tlEditor]);
107
+ }, [mentionsEnabled, hasCustomRow, tlEditor]);
73
108
  const editor = useEditor(
74
109
  {
75
110
  extensions,
76
111
  content: value ?? EMPTY_COMMENT,
77
112
  editable: interactive,
78
- // tldraw's default extensions add their own TextDirection extension (so it can be
79
- // overridden), so disable TipTap's core one to avoid a duplicate-extension warning —
80
- // mirrors RichTextArea's setup.
113
+ // tldraw ships its own TextDirection extension, so TipTap's core one would warn about a
114
+ // duplicate. Mirrors RichTextArea's setup.
81
115
  enableCoreExtensions: { textDirection: false },
82
116
  textDirection: "auto",
83
- editorProps: { attributes: { class: "cmt-input" } },
117
+ editorProps: {
118
+ attributes: {
119
+ class: "tlui-cmt-input",
120
+ "aria-label": placeholder,
121
+ role: "textbox",
122
+ "aria-multiline": "true"
123
+ },
124
+ // Runs before every keymap plugin, so it can distinguish Shift+Enter from Enter — an
125
+ // `Enter` keymap binding also fires on Shift+Enter and would otherwise swallow it.
126
+ handleKeyDown: (_view, event) => {
127
+ if (replayingEnter.current) return false;
128
+ if (event.key === "ArrowUp" && !event.isComposing) {
129
+ if (onArrowUpWhenEmptyRef.current && editorRef.current?.isEmpty && !isMentionPickerOpen()) {
130
+ onArrowUpWhenEmptyRef.current();
131
+ return true;
132
+ }
133
+ return false;
134
+ }
135
+ if (event.key !== "Enter" || event.isComposing) return false;
136
+ if (isMentionPickerOpen()) return false;
137
+ if (event.shiftKey && !event.metaKey && !event.ctrlKey && !event.altKey) {
138
+ if (editorRef.current?.isEmpty) return true;
139
+ replayingEnter.current = true;
140
+ try {
141
+ editorRef.current?.commands.enter();
142
+ } finally {
143
+ replayingEnter.current = false;
144
+ }
145
+ return true;
146
+ }
147
+ if (!disabledRef.current) onSubmitRef.current?.();
148
+ return true;
149
+ }
150
+ },
84
151
  onUpdate: ({ editor: editor2 }) => {
85
152
  setIsEmpty(editor2.isEmpty);
153
+ remeasureRef.current();
86
154
  onChangeRef.current?.(editor2.getJSON());
87
155
  }
88
156
  },
89
- [interactive]
157
+ [interactive, placeholder]
90
158
  );
159
+ editorRef.current = editor;
91
160
  useEffect(() => {
92
161
  if (!editor || value === void 0) return;
93
162
  if (isEqual(editor.getJSON(), value)) return;
94
163
  editor.commands.setContent(value);
95
164
  setIsEmpty(editor.isEmpty);
96
165
  }, [editor, value]);
166
+ useLayoutEffect(() => {
167
+ remeasureRef.current();
168
+ }, [editor, value]);
97
169
  useEffect(() => {
98
170
  if (!autoFocus || !editor) return;
99
171
  const raf = requestAnimationFrame(() => editor.commands.focus("end"));
100
172
  return () => cancelAnimationFrame(raf);
101
173
  }, [autoFocus, editor]);
102
- return /* @__PURE__ */ jsxs("div", { className: "cmt-composer", children: [
103
- leading ?? /* @__PURE__ */ jsx(Avatar, { name: author }),
104
- /* @__PURE__ */ jsxs("div", { className: "cmt-composer__field", children: [
105
- /* @__PURE__ */ jsxs("div", { className: "cmt-composer__input-wrap", children: [
106
- /* @__PURE__ */ jsx(EditorContent, { editor }),
107
- isEmpty && /* @__PURE__ */ jsx("div", { className: "cmt-input__placeholder", "aria-hidden": "true", children: placeholder })
108
- ] }),
109
- interactive && /* @__PURE__ */ jsx(SendButton, { label: sendLabel, onClick: onSubmit, disabled })
110
- ] })
174
+ const focusEditorFromField = (e) => {
175
+ const target = e.target;
176
+ if (target.closest(".tlui-cmt-input") || target.closest(".tlui-cmt-send")) return;
177
+ e.preventDefault();
178
+ editor?.commands.focus("end");
179
+ };
180
+ return /* @__PURE__ */ jsxs("div", { className: "tlui-cmt-composer", children: [
181
+ leading ?? /* @__PURE__ */ jsx(Avatar, { author }),
182
+ /* @__PURE__ */ jsxs(
183
+ "div",
184
+ {
185
+ className: [
186
+ "tlui-cmt-composer__field",
187
+ interactive && expanded && "tlui-cmt-composer__field--expanded"
188
+ ].filter(Boolean).join(" "),
189
+ onMouseDown: interactive ? focusEditorFromField : void 0,
190
+ children: [
191
+ /* @__PURE__ */ jsxs("div", { className: "tlui-cmt-composer__input-wrap", ref: inputWrapRef, children: [
192
+ /* @__PURE__ */ jsx(EditorContent, { editor }),
193
+ isEmpty && /* @__PURE__ */ jsx("div", { className: "tlui-cmt-input__placeholder", "aria-hidden": "true", children: placeholder }),
194
+ /* @__PURE__ */ jsx(
195
+ "div",
196
+ {
197
+ className: "tlui-cmt-composer__mirror tlui-cmt-input",
198
+ ref: mirrorRef,
199
+ "aria-hidden": "true"
200
+ }
201
+ )
202
+ ] }),
203
+ interactive && /* @__PURE__ */ jsx(SendButton, { label: sendLabel, onClick: onSubmit, disabled })
204
+ ]
205
+ }
206
+ )
111
207
  ] });
112
208
  }
113
209
  export {