@dxos/plugin-thread 0.8.4-main.1068cf700f → 0.8.4-main.1c7ec43d41

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 (507) hide show
  1. package/dist/lib/browser/add-message-3FTZANTW.mjs +89 -0
  2. package/dist/lib/browser/add-message-3FTZANTW.mjs.map +7 -0
  3. package/dist/lib/browser/append-channel-message-CO3M6FSA.mjs +40 -0
  4. package/dist/lib/browser/append-channel-message-CO3M6FSA.mjs.map +7 -0
  5. package/dist/lib/browser/blueprints/index.mjs +33 -4
  6. package/dist/lib/browser/blueprints/index.mjs.map +4 -4
  7. package/dist/lib/browser/chunk-MR4CWITF.mjs +31 -0
  8. package/dist/lib/browser/chunk-MR4CWITF.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-TPNZ43NB.mjs +258 -0
  10. package/dist/lib/browser/chunk-TPNZ43NB.mjs.map +7 -0
  11. package/dist/lib/browser/create-GMUAPFZM.mjs +55 -0
  12. package/dist/lib/browser/create-GMUAPFZM.mjs.map +7 -0
  13. package/dist/lib/browser/create-channel-ZXKSLHGN.mjs +19 -0
  14. package/dist/lib/browser/create-channel-ZXKSLHGN.mjs.map +7 -0
  15. package/dist/lib/browser/create-proposals-AV5CREPV.mjs +56 -0
  16. package/dist/lib/browser/create-proposals-AV5CREPV.mjs.map +7 -0
  17. package/dist/lib/browser/delete-673YOWCG.mjs +59 -0
  18. package/dist/lib/browser/delete-673YOWCG.mjs.map +7 -0
  19. package/dist/lib/browser/delete-message-RQ72ZY5D.mjs +55 -0
  20. package/dist/lib/browser/delete-message-RQ72ZY5D.mjs.map +7 -0
  21. package/dist/lib/browser/index.mjs +1770 -270
  22. package/dist/lib/browser/index.mjs.map +4 -4
  23. package/dist/lib/browser/meta.json +1 -1
  24. package/dist/lib/browser/on-create-space-SPE3QVFZ.mjs +24 -0
  25. package/dist/lib/browser/on-create-space-SPE3QVFZ.mjs.map +7 -0
  26. package/dist/lib/browser/operations/index.mjs +13 -0
  27. package/dist/lib/browser/operations/index.mjs.map +7 -0
  28. package/dist/lib/browser/restore-VX7FLZOZ.mjs +32 -0
  29. package/dist/lib/browser/restore-VX7FLZOZ.mjs.map +7 -0
  30. package/dist/lib/browser/restore-message-D65NSWUA.mjs +33 -0
  31. package/dist/lib/browser/restore-message-D65NSWUA.mjs.map +7 -0
  32. package/dist/lib/browser/select-DO4AYSCB.mjs +26 -0
  33. package/dist/lib/browser/select-DO4AYSCB.mjs.map +7 -0
  34. package/dist/lib/browser/toggle-resolved-JD3D4WBZ.mjs +36 -0
  35. package/dist/lib/browser/toggle-resolved-JD3D4WBZ.mjs.map +7 -0
  36. package/dist/lib/browser/translations.mjs +90 -0
  37. package/dist/lib/browser/translations.mjs.map +7 -0
  38. package/dist/lib/browser/types/index.mjs +5 -9
  39. package/dist/lib/node-esm/add-message-56J2HLJB.mjs +90 -0
  40. package/dist/lib/node-esm/add-message-56J2HLJB.mjs.map +7 -0
  41. package/dist/lib/node-esm/append-channel-message-F7KGBSWP.mjs +41 -0
  42. package/dist/lib/node-esm/append-channel-message-F7KGBSWP.mjs.map +7 -0
  43. package/dist/lib/node-esm/blueprints/index.mjs +33 -4
  44. package/dist/lib/node-esm/blueprints/index.mjs.map +4 -4
  45. package/dist/lib/node-esm/chunk-L6UL3NVS.mjs +32 -0
  46. package/dist/lib/node-esm/chunk-L6UL3NVS.mjs.map +7 -0
  47. package/dist/lib/node-esm/chunk-XKUMDYGR.mjs +259 -0
  48. package/dist/lib/node-esm/chunk-XKUMDYGR.mjs.map +7 -0
  49. package/dist/lib/node-esm/create-LEXHIPUT.mjs +56 -0
  50. package/dist/lib/node-esm/create-LEXHIPUT.mjs.map +7 -0
  51. package/dist/lib/node-esm/create-channel-6VHTC2OR.mjs +20 -0
  52. package/dist/lib/node-esm/create-channel-6VHTC2OR.mjs.map +7 -0
  53. package/dist/lib/node-esm/create-proposals-P5O2ICOL.mjs +57 -0
  54. package/dist/lib/node-esm/create-proposals-P5O2ICOL.mjs.map +7 -0
  55. package/dist/lib/node-esm/delete-4KSU4UEJ.mjs +60 -0
  56. package/dist/lib/node-esm/delete-4KSU4UEJ.mjs.map +7 -0
  57. package/dist/lib/node-esm/delete-message-PGNLB6TL.mjs +56 -0
  58. package/dist/lib/node-esm/delete-message-PGNLB6TL.mjs.map +7 -0
  59. package/dist/lib/node-esm/index.mjs +1770 -270
  60. package/dist/lib/node-esm/index.mjs.map +4 -4
  61. package/dist/lib/node-esm/meta.json +1 -1
  62. package/dist/lib/node-esm/on-create-space-TFBSHWQ4.mjs +25 -0
  63. package/dist/lib/node-esm/on-create-space-TFBSHWQ4.mjs.map +7 -0
  64. package/dist/lib/node-esm/operations/index.mjs +14 -0
  65. package/dist/lib/node-esm/operations/index.mjs.map +7 -0
  66. package/dist/lib/node-esm/restore-E27OAIFJ.mjs +33 -0
  67. package/dist/lib/node-esm/restore-E27OAIFJ.mjs.map +7 -0
  68. package/dist/lib/node-esm/restore-message-J3CH6NGI.mjs +34 -0
  69. package/dist/lib/node-esm/restore-message-J3CH6NGI.mjs.map +7 -0
  70. package/dist/lib/node-esm/select-NDHRM75K.mjs +27 -0
  71. package/dist/lib/node-esm/select-NDHRM75K.mjs.map +7 -0
  72. package/dist/lib/node-esm/toggle-resolved-VS6NKXL3.mjs +37 -0
  73. package/dist/lib/node-esm/toggle-resolved-VS6NKXL3.mjs.map +7 -0
  74. package/dist/lib/node-esm/translations.mjs +91 -0
  75. package/dist/lib/node-esm/translations.mjs.map +7 -0
  76. package/dist/lib/node-esm/types/index.mjs +5 -9
  77. package/dist/types/src/ThreadPlugin.d.ts +1 -0
  78. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  79. package/dist/types/src/ThreadPlugin.node.d.ts +4 -0
  80. package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -0
  81. package/dist/types/src/ThreadPlugin.test.d.ts +2 -0
  82. package/dist/types/src/ThreadPlugin.test.d.ts.map +1 -0
  83. package/dist/types/src/blueprints/index.d.ts +1 -1
  84. package/dist/types/src/blueprints/index.d.ts.map +1 -1
  85. package/dist/types/src/blueprints/thread-blueprint.d.ts +3 -20
  86. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -1
  87. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  88. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  89. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  90. package/dist/types/src/calls/speaking-monitor.d.ts +0 -3
  91. package/dist/types/src/calls/speaking-monitor.d.ts.map +1 -1
  92. package/dist/types/src/calls/types.d.ts.map +1 -1
  93. package/dist/types/src/calls/util/audio.d.ts.map +1 -1
  94. package/dist/types/src/calls/util/calls-service.d.ts +2 -2
  95. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  96. package/dist/types/src/calls/util/history-cache.d.ts.map +1 -1
  97. package/dist/types/src/calls/util/media.d.ts.map +1 -1
  98. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  99. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
  100. package/dist/types/src/calls-service.stories.d.ts +2 -2
  101. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  102. package/dist/types/src/capabilities/app-graph-builder.d.ts +6 -0
  103. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  104. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  105. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  106. package/dist/types/src/capabilities/call-manager.d.ts +6 -0
  107. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -0
  108. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  109. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  110. package/dist/types/src/capabilities/index.d.ts +21 -10
  111. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  112. package/dist/types/src/capabilities/markdown.d.ts +5 -0
  113. package/dist/types/src/capabilities/markdown.d.ts.map +1 -0
  114. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  115. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  116. package/dist/types/src/capabilities/{react-root/react-root.d.ts → react-root.d.ts} +1 -1
  117. package/dist/types/src/capabilities/react-root.d.ts.map +1 -0
  118. package/dist/types/src/capabilities/react-surface.d.ts +5 -0
  119. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  120. package/dist/types/src/capabilities/settings.d.ts +7 -0
  121. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  122. package/dist/types/src/capabilities/state.d.ts +7 -0
  123. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  124. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  125. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  126. package/dist/types/src/components/Call/Call.d.ts +32 -4
  127. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  128. package/dist/types/src/components/Call/Toolbar.d.ts +5 -5
  129. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  130. package/dist/types/src/components/Chat/Chat.d.ts +51 -0
  131. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -0
  132. package/dist/types/src/components/Chat/index.d.ts +2 -0
  133. package/dist/types/src/components/Chat/index.d.ts.map +1 -0
  134. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts +13 -0
  135. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
  136. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +160 -0
  137. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -0
  138. package/dist/types/src/components/{CommentsThreadContainer.d.ts → CommentsPanel/CommentsThread.d.ts} +3 -3
  139. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -0
  140. package/dist/types/src/components/CommentsPanel/index.d.ts +3 -0
  141. package/dist/types/src/components/CommentsPanel/index.d.ts.map +1 -0
  142. package/dist/types/src/components/Lobby/Lobby.d.ts +24 -3
  143. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  144. package/dist/types/src/components/Media/VideoObject.d.ts +1 -1
  145. package/dist/types/src/components/Media/VideoObject.stories.d.ts +1 -1
  146. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  147. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts +15 -0
  148. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -0
  149. package/dist/types/src/components/MessagePanel/index.d.ts +2 -0
  150. package/dist/types/src/components/MessagePanel/index.d.ts.map +1 -0
  151. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  152. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  153. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +1 -1
  154. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +142 -144
  155. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  156. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  157. package/dist/types/src/components/ResponsiveGrid/{ResponsiveContainer.d.ts → ResponsivePanel.d.ts} +4 -4
  158. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts.map +1 -0
  159. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts +164 -0
  160. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts.map +1 -0
  161. package/dist/types/src/components/ResponsiveGrid/index.d.ts +1 -1
  162. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +1 -1
  163. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts +6 -0
  164. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -0
  165. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +161 -0
  166. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -0
  167. package/dist/types/src/components/ThreadSettings/index.d.ts +2 -0
  168. package/dist/types/src/components/ThreadSettings/index.d.ts.map +1 -0
  169. package/dist/types/src/components/index.d.ts +5 -9
  170. package/dist/types/src/components/index.d.ts.map +1 -1
  171. package/dist/types/src/{components → containers/CallDebugPanel}/CallDebugPanel.d.ts +1 -1
  172. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +1 -0
  173. package/dist/types/src/containers/CallDebugPanel/index.d.ts +2 -0
  174. package/dist/types/src/containers/CallDebugPanel/index.d.ts.map +1 -0
  175. package/dist/types/src/{components → containers/CallSidebar}/CallSidebar.d.ts +0 -1
  176. package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts.map +1 -0
  177. package/dist/types/src/containers/CallSidebar/index.d.ts +2 -0
  178. package/dist/types/src/containers/CallSidebar/index.d.ts.map +1 -0
  179. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts +20 -0
  180. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts.map +1 -0
  181. package/dist/types/src/containers/ChannelChat/index.d.ts +4 -0
  182. package/dist/types/src/containers/ChannelChat/index.d.ts.map +1 -0
  183. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +12 -0
  184. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +1 -0
  185. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +162 -0
  186. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +1 -0
  187. package/dist/types/src/containers/ChannelContainer/index.d.ts +2 -0
  188. package/dist/types/src/containers/ChannelContainer/index.d.ts.map +1 -0
  189. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts +8 -0
  190. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -0
  191. package/dist/types/src/containers/ThreadCompanion/index.d.ts +2 -0
  192. package/dist/types/src/containers/ThreadCompanion/index.d.ts.map +1 -0
  193. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts +20 -0
  194. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts.map +1 -0
  195. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts +162 -0
  196. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts.map +1 -0
  197. package/dist/types/src/containers/ThreadContainer/index.d.ts +4 -0
  198. package/dist/types/src/containers/ThreadContainer/index.d.ts.map +1 -0
  199. package/dist/types/src/containers/index.d.ts +8 -0
  200. package/dist/types/src/containers/index.d.ts.map +1 -0
  201. package/dist/types/src/{components/command-extension.d.ts → extensions/command.d.ts} +1 -1
  202. package/dist/types/src/extensions/command.d.ts.map +1 -0
  203. package/dist/types/src/extensions/index.d.ts +1 -0
  204. package/dist/types/src/extensions/index.d.ts.map +1 -1
  205. package/dist/types/src/extensions/threads.d.ts +3 -3
  206. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  207. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  208. package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
  209. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  210. package/dist/types/src/index.d.ts +3 -2
  211. package/dist/types/src/index.d.ts.map +1 -1
  212. package/dist/types/src/operations/add-message.d.ts +5 -0
  213. package/dist/types/src/operations/add-message.d.ts.map +1 -0
  214. package/dist/types/src/operations/append-channel-message.d.ts +5 -0
  215. package/dist/types/src/operations/append-channel-message.d.ts.map +1 -0
  216. package/dist/types/src/operations/create-channel.d.ts +5 -0
  217. package/dist/types/src/operations/create-channel.d.ts.map +1 -0
  218. package/dist/types/src/operations/create-proposals.d.ts +5 -0
  219. package/dist/types/src/operations/create-proposals.d.ts.map +1 -0
  220. package/dist/types/src/operations/create.d.ts +5 -0
  221. package/dist/types/src/operations/create.d.ts.map +1 -0
  222. package/dist/types/src/operations/definitions.d.ts +1995 -0
  223. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  224. package/dist/types/src/operations/delete-message.d.ts +5 -0
  225. package/dist/types/src/operations/delete-message.d.ts.map +1 -0
  226. package/dist/types/src/operations/delete.d.ts +5 -0
  227. package/dist/types/src/operations/delete.d.ts.map +1 -0
  228. package/dist/types/src/operations/index.d.ts +4 -0
  229. package/dist/types/src/operations/index.d.ts.map +1 -0
  230. package/dist/types/src/operations/on-create-space.d.ts +5 -0
  231. package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
  232. package/dist/types/src/operations/restore-message.d.ts +5 -0
  233. package/dist/types/src/operations/restore-message.d.ts.map +1 -0
  234. package/dist/types/src/operations/restore.d.ts +5 -0
  235. package/dist/types/src/operations/restore.d.ts.map +1 -0
  236. package/dist/types/src/operations/select.d.ts +5 -0
  237. package/dist/types/src/operations/select.d.ts.map +1 -0
  238. package/dist/types/src/operations/toggle-resolved.d.ts +5 -0
  239. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -0
  240. package/dist/types/src/{components/testing.d.ts → testing/data.d.ts} +1 -1
  241. package/dist/types/src/testing/data.d.ts.map +1 -0
  242. package/dist/types/src/testing/index.d.ts +1 -1
  243. package/dist/types/src/testing/index.d.ts.map +1 -1
  244. package/dist/types/src/translations.d.ts +140 -142
  245. package/dist/types/src/translations.d.ts.map +1 -1
  246. package/dist/types/src/types/Settings.d.ts +5 -0
  247. package/dist/types/src/types/Settings.d.ts.map +1 -0
  248. package/dist/types/src/types/capabilities.d.ts +8 -2
  249. package/dist/types/src/types/capabilities.d.ts.map +1 -1
  250. package/dist/types/src/types/index.d.ts +0 -1
  251. package/dist/types/src/types/index.d.ts.map +1 -1
  252. package/dist/types/src/types/types.d.ts +1 -3227
  253. package/dist/types/src/types/types.d.ts.map +1 -1
  254. package/dist/types/src/util.d.ts +6 -3
  255. package/dist/types/src/util.d.ts.map +1 -1
  256. package/dist/types/tsconfig.tsbuildinfo +1 -1
  257. package/package.json +89 -71
  258. package/src/ThreadPlugin.node.ts +39 -0
  259. package/src/ThreadPlugin.test.ts +37 -0
  260. package/src/ThreadPlugin.tsx +20 -67
  261. package/src/blueprints/index.ts +1 -1
  262. package/src/blueprints/thread-blueprint.ts +13 -9
  263. package/src/calls/util/calls-service.ts +3 -2
  264. package/src/calls/util/stub-media-streams.ts +3 -1
  265. package/src/calls-service.stories.tsx +9 -8
  266. package/src/capabilities/{app-graph-builder/app-graph-builder.ts → app-graph-builder.ts} +53 -60
  267. package/src/capabilities/blueprint-definition.ts +19 -0
  268. package/src/capabilities/{call-manager/call-manager.ts → call-manager.ts} +4 -3
  269. package/src/capabilities/create-object.ts +29 -0
  270. package/src/capabilities/index.ts +18 -10
  271. package/src/capabilities/{markdown/markdown.ts → markdown.ts} +17 -14
  272. package/src/capabilities/operation-handler.ts +16 -0
  273. package/src/capabilities/{react-root/react-root.tsx → react-root.tsx} +2 -2
  274. package/src/capabilities/react-surface.tsx +97 -0
  275. package/src/capabilities/{settings/settings.ts → settings.ts} +6 -5
  276. package/src/capabilities/{state/state.ts → state.ts} +1 -1
  277. package/src/capabilities/undo-mappings.ts +46 -0
  278. package/src/components/Call/Call.tsx +9 -9
  279. package/src/components/Call/Toolbar.tsx +28 -20
  280. package/src/components/Chat/Chat.tsx +258 -0
  281. package/src/components/Chat/index.ts +5 -0
  282. package/src/components/{Comments.stories.tsx → CommentsPanel/CommentsPanel.stories.tsx} +18 -16
  283. package/src/components/{CommentsContainer.tsx → CommentsPanel/CommentsPanel.tsx} +15 -14
  284. package/src/components/{CommentsThreadContainer.tsx → CommentsPanel/CommentsThread.tsx} +19 -20
  285. package/src/components/CommentsPanel/index.ts +6 -0
  286. package/src/components/Lobby/Lobby.tsx +12 -10
  287. package/src/components/Media/VideoObject.stories.tsx +6 -7
  288. package/src/components/Media/VideoObject.tsx +1 -1
  289. package/src/components/{MessageContainer.tsx → MessagePanel/MessagePanel.tsx} +28 -19
  290. package/src/components/MessagePanel/index.ts +5 -0
  291. package/src/components/Participant/Participant.tsx +2 -1
  292. package/src/components/Participant/ParticipantGrid.tsx +0 -1
  293. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +11 -11
  294. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +8 -8
  295. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +9 -9
  296. package/src/components/ResponsiveGrid/{ResponsiveContainer.stories.tsx → ResponsivePanel.stories.tsx} +9 -9
  297. package/src/components/ResponsiveGrid/{ResponsiveContainer.tsx → ResponsivePanel.tsx} +5 -5
  298. package/src/components/ResponsiveGrid/index.ts +1 -1
  299. package/src/components/ThreadSettings/ThreadSettings.stories.tsx +32 -0
  300. package/src/components/ThreadSettings/ThreadSettings.tsx +20 -0
  301. package/src/components/ThreadSettings/index.ts +5 -0
  302. package/src/components/index.ts +6 -9
  303. package/src/{components → containers/CallDebugPanel}/CallDebugPanel.tsx +8 -7
  304. package/src/containers/CallDebugPanel/index.ts +5 -0
  305. package/src/{components → containers/CallSidebar}/CallSidebar.tsx +3 -5
  306. package/src/containers/CallSidebar/index.ts +5 -0
  307. package/src/containers/ChannelChat/ChannelChat.tsx +75 -0
  308. package/src/containers/ChannelChat/index.ts +8 -0
  309. package/src/containers/ChannelContainer/ChannelContainer.stories.tsx +105 -0
  310. package/src/{components → containers/ChannelContainer}/ChannelContainer.tsx +73 -58
  311. package/src/containers/ChannelContainer/index.ts +5 -0
  312. package/src/{components → containers/ThreadCompanion}/ThreadCompanion.tsx +66 -45
  313. package/src/containers/ThreadCompanion/index.ts +5 -0
  314. package/src/{components/Chat.stories.tsx → containers/ThreadContainer/ThreadContainer.stories.tsx} +23 -23
  315. package/src/containers/ThreadContainer/ThreadContainer.tsx +75 -0
  316. package/src/containers/ThreadContainer/index.ts +8 -0
  317. package/src/containers/index.ts +12 -0
  318. package/src/{components/command-extension.ts → extensions/command.ts} +1 -1
  319. package/src/extensions/index.ts +1 -0
  320. package/src/extensions/threads.ts +15 -14
  321. package/src/hooks/analytics.ts +2 -1
  322. package/src/index.ts +10 -3
  323. package/src/meta.ts +2 -2
  324. package/src/operations/add-message.ts +81 -0
  325. package/src/operations/append-channel-message.ts +36 -0
  326. package/src/operations/create-channel.ts +20 -0
  327. package/src/operations/create-proposals.ts +49 -0
  328. package/src/operations/create.ts +48 -0
  329. package/src/operations/definitions.ts +177 -0
  330. package/src/operations/delete-message.ts +53 -0
  331. package/src/operations/delete.ts +63 -0
  332. package/src/operations/index.ts +22 -0
  333. package/src/operations/on-create-space.ts +27 -0
  334. package/src/operations/restore-message.ts +38 -0
  335. package/src/operations/restore.ts +38 -0
  336. package/src/operations/select.ts +24 -0
  337. package/src/operations/toggle-resolved.ts +41 -0
  338. package/src/{components/testing.ts → testing/data.ts} +7 -7
  339. package/src/testing/index.ts +1 -1
  340. package/src/translations.ts +72 -76
  341. package/src/types/Settings.ts +10 -0
  342. package/src/types/capabilities.ts +15 -7
  343. package/src/types/index.ts +0 -1
  344. package/src/types/types.ts +2 -184
  345. package/src/util.ts +37 -5
  346. package/dist/lib/browser/app-graph-builder-XFGLMIGK.mjs +0 -189
  347. package/dist/lib/browser/app-graph-builder-XFGLMIGK.mjs.map +0 -7
  348. package/dist/lib/browser/blueprint-definition-ACPH22F7.mjs +0 -18
  349. package/dist/lib/browser/blueprint-definition-ACPH22F7.mjs.map +0 -7
  350. package/dist/lib/browser/call-manager-GDGIKJKN.mjs +0 -26
  351. package/dist/lib/browser/call-manager-GDGIKJKN.mjs.map +0 -7
  352. package/dist/lib/browser/chunk-2FIHSX35.mjs +0 -293
  353. package/dist/lib/browser/chunk-2FIHSX35.mjs.map +0 -7
  354. package/dist/lib/browser/chunk-4EUEMHNI.mjs +0 -1817
  355. package/dist/lib/browser/chunk-4EUEMHNI.mjs.map +0 -7
  356. package/dist/lib/browser/chunk-CP7E2HRE.mjs +0 -31
  357. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +0 -7
  358. package/dist/lib/browser/chunk-ERK254BS.mjs +0 -1810
  359. package/dist/lib/browser/chunk-ERK254BS.mjs.map +0 -7
  360. package/dist/lib/browser/chunk-ISCHODBV.mjs +0 -106
  361. package/dist/lib/browser/chunk-ISCHODBV.mjs.map +0 -7
  362. package/dist/lib/browser/chunk-JBB73URQ.mjs +0 -184
  363. package/dist/lib/browser/chunk-JBB73URQ.mjs.map +0 -7
  364. package/dist/lib/browser/chunk-RH7XTXSR.mjs +0 -106
  365. package/dist/lib/browser/chunk-RH7XTXSR.mjs.map +0 -7
  366. package/dist/lib/browser/markdown-YJCSOWXX.mjs +0 -210
  367. package/dist/lib/browser/markdown-YJCSOWXX.mjs.map +0 -7
  368. package/dist/lib/browser/operation-resolver-PROCP5L4.mjs +0 -441
  369. package/dist/lib/browser/operation-resolver-PROCP5L4.mjs.map +0 -7
  370. package/dist/lib/browser/react-root-FHK2SVPU.mjs +0 -25
  371. package/dist/lib/browser/react-root-FHK2SVPU.mjs.map +0 -7
  372. package/dist/lib/browser/react-surface-7MQA6VSH.mjs +0 -111
  373. package/dist/lib/browser/react-surface-7MQA6VSH.mjs.map +0 -7
  374. package/dist/lib/browser/repair-6OZ75AUU.mjs +0 -38
  375. package/dist/lib/browser/repair-6OZ75AUU.mjs.map +0 -7
  376. package/dist/lib/browser/settings-TWKOTGSU.mjs +0 -33
  377. package/dist/lib/browser/settings-TWKOTGSU.mjs.map +0 -7
  378. package/dist/lib/browser/state-SJR2GL5G.mjs +0 -24
  379. package/dist/lib/browser/state-SJR2GL5G.mjs.map +0 -7
  380. package/dist/lib/node-esm/app-graph-builder-IN6VLJBO.mjs +0 -190
  381. package/dist/lib/node-esm/app-graph-builder-IN6VLJBO.mjs.map +0 -7
  382. package/dist/lib/node-esm/blueprint-definition-SXVKFUNV.mjs +0 -19
  383. package/dist/lib/node-esm/blueprint-definition-SXVKFUNV.mjs.map +0 -7
  384. package/dist/lib/node-esm/call-manager-36UAAQCJ.mjs +0 -27
  385. package/dist/lib/node-esm/call-manager-36UAAQCJ.mjs.map +0 -7
  386. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs +0 -33
  387. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +0 -7
  388. package/dist/lib/node-esm/chunk-G7PZNN3Z.mjs +0 -185
  389. package/dist/lib/node-esm/chunk-G7PZNN3Z.mjs.map +0 -7
  390. package/dist/lib/node-esm/chunk-OKVE6CLS.mjs +0 -107
  391. package/dist/lib/node-esm/chunk-OKVE6CLS.mjs.map +0 -7
  392. package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs +0 -1811
  393. package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs.map +0 -7
  394. package/dist/lib/node-esm/chunk-RBRWHRHE.mjs +0 -1818
  395. package/dist/lib/node-esm/chunk-RBRWHRHE.mjs.map +0 -7
  396. package/dist/lib/node-esm/chunk-VBI32FGI.mjs +0 -108
  397. package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +0 -7
  398. package/dist/lib/node-esm/chunk-WMWUXWAS.mjs +0 -294
  399. package/dist/lib/node-esm/chunk-WMWUXWAS.mjs.map +0 -7
  400. package/dist/lib/node-esm/markdown-6LRP3PAP.mjs +0 -211
  401. package/dist/lib/node-esm/markdown-6LRP3PAP.mjs.map +0 -7
  402. package/dist/lib/node-esm/operation-resolver-LPEPV5BF.mjs +0 -442
  403. package/dist/lib/node-esm/operation-resolver-LPEPV5BF.mjs.map +0 -7
  404. package/dist/lib/node-esm/react-root-P5P4VGQJ.mjs +0 -26
  405. package/dist/lib/node-esm/react-root-P5P4VGQJ.mjs.map +0 -7
  406. package/dist/lib/node-esm/react-surface-M7VI5XG2.mjs +0 -112
  407. package/dist/lib/node-esm/react-surface-M7VI5XG2.mjs.map +0 -7
  408. package/dist/lib/node-esm/repair-6777EPOM.mjs +0 -39
  409. package/dist/lib/node-esm/repair-6777EPOM.mjs.map +0 -7
  410. package/dist/lib/node-esm/settings-5O254B3Z.mjs +0 -34
  411. package/dist/lib/node-esm/settings-5O254B3Z.mjs.map +0 -7
  412. package/dist/lib/node-esm/state-5R3TZJQE.mjs +0 -25
  413. package/dist/lib/node-esm/state-5R3TZJQE.mjs.map +0 -7
  414. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +0 -6
  415. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +0 -1
  416. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +0 -3
  417. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +0 -1
  418. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +0 -10
  419. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +0 -1
  420. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +0 -3
  421. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +0 -1
  422. package/dist/types/src/capabilities/call-manager/call-manager.d.ts +0 -6
  423. package/dist/types/src/capabilities/call-manager/call-manager.d.ts.map +0 -1
  424. package/dist/types/src/capabilities/call-manager/index.d.ts +0 -3
  425. package/dist/types/src/capabilities/call-manager/index.d.ts.map +0 -1
  426. package/dist/types/src/capabilities/markdown/index.d.ts +0 -3
  427. package/dist/types/src/capabilities/markdown/index.d.ts.map +0 -1
  428. package/dist/types/src/capabilities/markdown/markdown.d.ts +0 -5
  429. package/dist/types/src/capabilities/markdown/markdown.d.ts.map +0 -1
  430. package/dist/types/src/capabilities/operation-resolver/index.d.ts +0 -3
  431. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +0 -1
  432. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +0 -5
  433. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +0 -1
  434. package/dist/types/src/capabilities/react-root/index.d.ts +0 -6
  435. package/dist/types/src/capabilities/react-root/index.d.ts.map +0 -1
  436. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +0 -1
  437. package/dist/types/src/capabilities/react-surface/index.d.ts +0 -3
  438. package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
  439. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +0 -5
  440. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
  441. package/dist/types/src/capabilities/repair/index.d.ts +0 -3
  442. package/dist/types/src/capabilities/repair/index.d.ts.map +0 -1
  443. package/dist/types/src/capabilities/repair/repair.d.ts +0 -6
  444. package/dist/types/src/capabilities/repair/repair.d.ts.map +0 -1
  445. package/dist/types/src/capabilities/settings/index.d.ts +0 -3
  446. package/dist/types/src/capabilities/settings/index.d.ts.map +0 -1
  447. package/dist/types/src/capabilities/settings/settings.d.ts +0 -6
  448. package/dist/types/src/capabilities/settings/settings.d.ts.map +0 -1
  449. package/dist/types/src/capabilities/state/index.d.ts +0 -3
  450. package/dist/types/src/capabilities/state/index.d.ts.map +0 -1
  451. package/dist/types/src/capabilities/state/state.d.ts +0 -7
  452. package/dist/types/src/capabilities/state/state.d.ts.map +0 -1
  453. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  454. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  455. package/dist/types/src/components/ChannelContainer.d.ts +0 -13
  456. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  457. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -164
  458. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  459. package/dist/types/src/components/Chat.stories.d.ts +0 -164
  460. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  461. package/dist/types/src/components/ChatContainer.d.ts +0 -18
  462. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  463. package/dist/types/src/components/Comments.stories.d.ts +0 -162
  464. package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
  465. package/dist/types/src/components/CommentsContainer.d.ts +0 -13
  466. package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
  467. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +0 -1
  468. package/dist/types/src/components/MessageContainer.d.ts +0 -15
  469. package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
  470. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
  471. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -166
  472. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
  473. package/dist/types/src/components/ThreadCompanion.d.ts +0 -5
  474. package/dist/types/src/components/ThreadCompanion.d.ts.map +0 -1
  475. package/dist/types/src/components/ThreadSettings.d.ts +0 -8
  476. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  477. package/dist/types/src/components/command-extension.d.ts.map +0 -1
  478. package/dist/types/src/components/testing.d.ts.map +0 -1
  479. package/dist/types/src/functions/create-proposals.d.ts +0 -13
  480. package/dist/types/src/functions/create-proposals.d.ts.map +0 -1
  481. package/dist/types/src/functions/index.d.ts +0 -2
  482. package/dist/types/src/functions/index.d.ts.map +0 -1
  483. package/dist/types/src/testing/stories.d.ts +0 -3
  484. package/dist/types/src/testing/stories.d.ts.map +0 -1
  485. package/dist/types/src/types/Channel.d.ts +0 -695
  486. package/dist/types/src/types/Channel.d.ts.map +0 -1
  487. package/src/capabilities/app-graph-builder/index.ts +0 -7
  488. package/src/capabilities/blueprint-definition/blueprint-definition.ts +0 -24
  489. package/src/capabilities/blueprint-definition/index.ts +0 -7
  490. package/src/capabilities/call-manager/index.ts +0 -7
  491. package/src/capabilities/markdown/index.ts +0 -7
  492. package/src/capabilities/operation-resolver/index.ts +0 -7
  493. package/src/capabilities/operation-resolver/operation-resolver.ts +0 -400
  494. package/src/capabilities/react-root/index.ts +0 -7
  495. package/src/capabilities/react-surface/index.ts +0 -7
  496. package/src/capabilities/react-surface/react-surface.tsx +0 -98
  497. package/src/capabilities/repair/index.ts +0 -7
  498. package/src/capabilities/repair/repair.ts +0 -51
  499. package/src/capabilities/settings/index.ts +0 -7
  500. package/src/capabilities/state/index.ts +0 -7
  501. package/src/components/ChannelContainer.stories.tsx +0 -60
  502. package/src/components/ChatContainer.tsx +0 -152
  503. package/src/components/ThreadSettings.tsx +0 -22
  504. package/src/functions/create-proposals.ts +0 -57
  505. package/src/functions/index.ts +0 -5
  506. package/src/testing/stories.ts +0 -56
  507. package/src/types/Channel.ts +0 -30
@@ -19,11 +19,11 @@ import {
19
19
  toLocalizedString,
20
20
  useTranslation,
21
21
  } from '@dxos/react-ui';
22
+ import { type Channel } from '@dxos/types';
22
23
  import { groupHoverControlItemWithTransition, mx } from '@dxos/ui-theme';
23
24
 
24
- import { meta } from '../../meta';
25
- import { ThreadCapabilities } from '../../types';
26
- import { type Channel } from '../../types';
25
+ import { meta } from '#meta';
26
+ import { ThreadCapabilities } from '#types';
27
27
 
28
28
  export type ToolbarProps = ThemedClassName<{
29
29
  channel?: Channel.Channel;
@@ -63,21 +63,20 @@ export const Toolbar = ({
63
63
  // TODO(wittjosiah): In order to use toolbar, need to update to actually use the graph action callbacks directly.
64
64
  return (
65
65
  <div className={mx('z-20 flex justify-center m-8', autoHideControls && groupHoverControlItemWithTransition)}>
66
- <NaturalToolbar.Root classNames={['p-2 bg-modalSurface rounded-md shadow-md', classNames]}>
66
+ <NaturalToolbar.Root classNames={['p-2 bg-modal-surface rounded-md shadow-md', classNames]}>
67
67
  <ToggleButton
68
68
  active={media.audioEnabled}
69
69
  state={{
70
70
  on: {
71
71
  icon: 'ph--microphone--regular',
72
- label: t('mic off'),
72
+ label: t('mic-off.button'),
73
73
  onClick: () => call.turnAudioOff(),
74
- classNames: 'bg-callActive',
74
+ classNames: 'bg-call-active',
75
75
  },
76
76
  off: {
77
77
  icon: 'ph--microphone-slash--duotone',
78
- label: t('mic on'),
78
+ label: t('mic-on.button'),
79
79
  onClick: () => call.turnAudioOn(),
80
- classNames: [joined && 'bg-callAlert'],
81
80
  },
82
81
  }}
83
82
  />
@@ -86,20 +85,20 @@ export const Toolbar = ({
86
85
  state={{
87
86
  on: {
88
87
  icon: 'ph--video-camera--regular',
89
- label: t('camera off'),
88
+ label: t('camera-off.button'),
90
89
  onClick: () => call.turnVideoOff(),
91
90
  },
92
91
  off: {
93
92
  icon: 'ph--video-camera-slash--duotone',
94
- label: t('camera on'),
93
+ label: t('camera-on.button'),
95
94
  onClick: () => call.turnVideoOn(),
96
95
  },
97
96
  }}
98
97
  />
99
98
 
100
99
  {(participants !== undefined && (
101
- <div className='flex justify-center items-center gap-2 is-[5rem] text-xs text-subdued'>
102
- <Icon icon='ph--users--regular' size={4} />
100
+ <div className='flex justify-center items-center gap-2 w-[5rem] text-xs text-subdued'>
101
+ <Icon icon='ph--users--regular' />
103
102
  <div>{participants}</div>
104
103
  </div>
105
104
  )) || <NaturalToolbar.Separator variant='gap' />}
@@ -112,12 +111,12 @@ export const Toolbar = ({
112
111
  state={{
113
112
  on: {
114
113
  icon: 'ph--monitor--regular',
115
- label: t('screenshare off'),
114
+ label: t('screenshare-off.button'),
116
115
  onClick: () => call.turnScreenshareOff(),
117
116
  },
118
117
  off: {
119
118
  icon: 'ph--monitor-arrow-up--duotone',
120
- label: t('screenshare on'),
119
+ label: t('screenshare-on.button'),
121
120
  onClick: () => call.turnScreenshareOn(),
122
121
  },
123
122
  }}
@@ -142,13 +141,12 @@ export const Toolbar = ({
142
141
  state={{
143
142
  on: {
144
143
  icon: 'ph--hand-waving--regular',
145
- label: t('lower hand'),
144
+ label: t('lower-hand.button'),
146
145
  onClick: () => call.setRaisedHand(false),
147
- classNames: [joined && 'bg-callAlert'],
148
146
  },
149
147
  off: {
150
148
  icon: 'ph--hand-palm--duotone',
151
- label: t('raise hand'),
149
+ label: t('raise-hand.button'),
152
150
  onClick: () => call.setRaisedHand(true),
153
151
  },
154
152
  }}
@@ -156,9 +154,19 @@ export const Toolbar = ({
156
154
  </>
157
155
  )}
158
156
  {joined ? (
159
- <IconButton variant='destructive' icon='ph--phone-x--regular' label={t('leave call')} onClick={onLeave} />
157
+ <IconButton
158
+ variant='destructive'
159
+ icon='ph--phone-x--regular'
160
+ label={t('leave-call.button')}
161
+ onClick={onLeave}
162
+ />
160
163
  ) : (
161
- <IconButton variant='primary' icon='ph--phone-incoming--regular' label={t('join call')} onClick={onJoin} />
164
+ <IconButton
165
+ variant='primary'
166
+ icon='ph--phone-incoming--regular'
167
+ label={t('join-call.button')}
168
+ onClick={onJoin}
169
+ />
162
170
  )}
163
171
  </NaturalToolbar.Root>
164
172
  </div>
@@ -183,7 +191,7 @@ const defaultButtonProps: Partial<IconButtonProps> = {
183
191
  const ToggleButton = ({ active, state }: ToolbarButtonProps) => (
184
192
  <IconButton
185
193
  {...defaultButtonProps}
186
- classNames={[active ? (state.on.classNames ?? 'bg-callActive') : state.off.classNames]}
194
+ classNames={[active ? (state.on.classNames ?? 'bg-call-active') : state.off.classNames]}
187
195
  icon={active ? state.on.icon : state.off.icon}
188
196
  label={active ? state.on.label : state.off.label}
189
197
  onClick={active ? state.on.onClick : state.off.onClick}
@@ -0,0 +1,258 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React, { type RefObject, useLayoutEffect, useMemo, useRef, useState } from 'react';
6
+
7
+ import { type SpaceMember } from '@dxos/react-client/echo';
8
+ import { type Identity } from '@dxos/react-client/halo';
9
+ import { ScrollArea, type ThemedClassName, useThemeContext, useTranslation } from '@dxos/react-ui';
10
+ import {
11
+ type MessageMetadata,
12
+ MessageTextbox,
13
+ Thread as ThreadComponent,
14
+ type ThreadRootProps,
15
+ threadLayout,
16
+ } from '@dxos/react-ui-thread';
17
+ import { type Message } from '@dxos/types';
18
+ import { createBasicExtensions, createThemeExtensions, listener, type Extension } from '@dxos/ui-editor';
19
+ import { composable, composableProps, mx } from '@dxos/ui-theme';
20
+ import { isNonNullable } from '@dxos/util';
21
+
22
+ import { meta } from '#meta';
23
+
24
+ import { command } from '../../extensions';
25
+ import { getMessageMetadata } from '../../util';
26
+ import { MessagePanel } from '../MessagePanel';
27
+
28
+ export type ChatProps = ThemedClassName<
29
+ {
30
+ /** Stable id used for the underlying thread root and message metadata. */
31
+ id: string;
32
+ /** Identity used to attribute outgoing messages in the textbox metadata. */
33
+ identity?: Identity;
34
+ /** Space members for rendering sender names/avatars on incoming messages. */
35
+ members: SpaceMember[];
36
+ /** Messages to render in order. */
37
+ messages: readonly Message.Message[];
38
+ /** Activity indicator (e.g. processing) shown beneath the textbox. */
39
+ activity?: boolean;
40
+ /**
41
+ * Called with the user's textbox content when they press send.
42
+ * Returning `true` signals the message was accepted; the textbox is then cleared.
43
+ */
44
+ onSend: (text: string) => boolean;
45
+ autoFocusTextbox?: boolean;
46
+ /**
47
+ * Where the composer sits relative to the messages.
48
+ * - `'top'` (default) — composer follows the messages at intrinsic height,
49
+ * suitable for inline comment threads.
50
+ * - `'bottom'` — composer pinned to the bottom of the panel, messages
51
+ * scrolling above it. Suitable for full-panel multi-party chat.
52
+ */
53
+ orientation?: ChatOrientation;
54
+ /**
55
+ * When true, hide the composer textbox and activity indicator. Used for
56
+ * channels whose source-of-truth lives elsewhere (e.g. externally-synced
57
+ * Slack/Discord channels keyed by a foreign id) — sending isn't meaningful
58
+ * because there is no local-write path back to the source.
59
+ */
60
+ readOnly?: boolean;
61
+ } & Pick<ThreadRootProps, 'current'>
62
+ >;
63
+
64
+ export type ChatOrientation = 'top' | 'bottom';
65
+
66
+ /**
67
+ * Pure chat UI: scrollable message list + composer textbox + activity indicator.
68
+ * Owns its own UI state (textbox content, scroll position, editor extensions) but
69
+ * does not load data or invoke operations — the caller passes messages and an
70
+ * `onSend` callback. Used by both `ThreadContainer` (AutoMerge `Thread`) and
71
+ * `ChannelContainer`'s feed-backed channel chat.
72
+ */
73
+ export const Chat = composable<HTMLDivElement, ChatProps>(
74
+ (
75
+ {
76
+ id,
77
+ identity,
78
+ members,
79
+ messages,
80
+ activity,
81
+ onSend,
82
+ autoFocusTextbox,
83
+ current,
84
+ orientation = 'top',
85
+ readOnly,
86
+ ...props
87
+ },
88
+ forwardedRef,
89
+ ) => {
90
+ const { t } = useTranslation(meta.id);
91
+ const { themeMode } = useThemeContext();
92
+
93
+ const scrollRef = useRef<HTMLDivElement | null>(null);
94
+ const sentinelRef = useRef<HTMLDivElement | null>(null);
95
+ const [autoFocus, setAutoFocus] = useState(autoFocusTextbox);
96
+
97
+ // Force the editor to remount after a successful send so its content resets.
98
+ const [_count, _setCount] = useState(0);
99
+
100
+ const textboxMetadata = getMessageMetadata(id, identity);
101
+ const messageRef = useRef('');
102
+ const extensions = useMemo(
103
+ () => [
104
+ createBasicExtensions({ placeholder: t('message.placeholder') }),
105
+ createThemeExtensions({ themeMode }),
106
+ listener({ onChange: ({ text }) => (messageRef.current = text) }),
107
+ command,
108
+ ],
109
+ [themeMode, _count],
110
+ );
111
+
112
+ const scrollToEnd = (behavior: ScrollBehavior) =>
113
+ setTimeout(() => sentinelRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);
114
+
115
+ useLayoutEffect(() => {
116
+ scrollToEnd('instant');
117
+ }, []);
118
+ // NOTE: Auto-scroll on new messages is intentionally not implemented here. Smooth-scroll
119
+ // animations were causing ResizeObserver feedback loops with CodeMirror/ScrollArea. The
120
+ // proper fix is "scroll only if user is already at the bottom" — deferred to a follow-up.
121
+
122
+ const handleSend = () => {
123
+ const text = messageRef.current;
124
+ if (!text?.length) {
125
+ return false;
126
+ }
127
+
128
+ const accepted = onSend(text);
129
+ if (!accepted) {
130
+ return false;
131
+ }
132
+
133
+ messageRef.current = '';
134
+ setAutoFocus(true);
135
+ scrollToEnd('smooth');
136
+ _setCount((count) => count + 1);
137
+ return true;
138
+ };
139
+
140
+ const filteredMessages = messages.filter(isNonNullable);
141
+ const renderState: ChatRenderState = {
142
+ messages: filteredMessages,
143
+ members,
144
+ activity,
145
+ extensions,
146
+ autoFocus,
147
+ handleSend,
148
+ textboxMetadata,
149
+ scrollRef,
150
+ sentinelRef,
151
+ readOnly,
152
+ };
153
+
154
+ return orientation === 'bottom' ? (
155
+ <ChannelLayout
156
+ {...composableProps(props, { classNames: 'flex flex-col bs-full min-h-0' })}
157
+ id={id}
158
+ ref={forwardedRef}
159
+ state={renderState}
160
+ />
161
+ ) : (
162
+ <ThreadLayout
163
+ {...composableProps(props, { classNames: 'dx-container grid-rows-[1fr_min-content_min-content]' })}
164
+ id={id}
165
+ current={current}
166
+ ref={forwardedRef}
167
+ state={renderState}
168
+ />
169
+ );
170
+ },
171
+ );
172
+
173
+ //
174
+ // Internal layout helpers — share state via the ChatRenderState bag.
175
+ //
176
+
177
+ type ChatRenderState = {
178
+ messages: Message.Message[];
179
+ members: SpaceMember[];
180
+ activity?: boolean;
181
+ extensions: Extension[];
182
+ autoFocus?: boolean;
183
+ handleSend: () => boolean;
184
+ textboxMetadata: MessageMetadata;
185
+ scrollRef: RefObject<HTMLDivElement | null>;
186
+ sentinelRef: RefObject<HTMLDivElement | null>;
187
+ readOnly?: boolean;
188
+ };
189
+
190
+ type LayoutProps = React.HTMLAttributes<HTMLDivElement> & {
191
+ id: string;
192
+ state: ChatRenderState;
193
+ };
194
+
195
+ /** Thread layout — composer follows messages at intrinsic height. */
196
+ const ThreadLayout = React.forwardRef<HTMLDivElement, LayoutProps & Pick<ThreadRootProps, 'current'>>(
197
+ ({ id, current, state, ...props }, ref) => {
198
+ const { t } = useTranslation(meta.id);
199
+ const { messages, members, activity, extensions, autoFocus, handleSend, textboxMetadata, sentinelRef, readOnly } =
200
+ state;
201
+ return (
202
+ <ThreadComponent.Root {...props} id={id} current={current} ref={ref}>
203
+ <ScrollArea.Root classNames='col-span-2' orientation='vertical'>
204
+ <ScrollArea.Viewport ref={sentinelRef}>
205
+ <div role='none' className={mx(threadLayout, 'place-self-end')}>
206
+ {messages.map((message) => (
207
+ <MessagePanel key={message.id} message={message} members={members} />
208
+ ))}
209
+ </div>
210
+ </ScrollArea.Viewport>
211
+ </ScrollArea.Root>
212
+ {!readOnly && (
213
+ <>
214
+ <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleSend} {...textboxMetadata} />
215
+ <ThreadComponent.Status activity={activity}>{t('activity.message')}</ThreadComponent.Status>
216
+ </>
217
+ )}
218
+ </ThreadComponent.Root>
219
+ );
220
+ },
221
+ );
222
+
223
+ /** Channel layout — composer pinned to the bottom, messages scroll above it. */
224
+ const ChannelLayout = React.forwardRef<HTMLDivElement, LayoutProps>(({ id, state, ...props }, ref) => {
225
+ const { t } = useTranslation(meta.id);
226
+ const {
227
+ messages,
228
+ members,
229
+ activity,
230
+ extensions,
231
+ autoFocus,
232
+ handleSend,
233
+ textboxMetadata,
234
+ scrollRef,
235
+ sentinelRef,
236
+ readOnly,
237
+ } = state;
238
+ return (
239
+ <div {...props} id={id} ref={ref}>
240
+ <div ref={scrollRef} className='flex-1 min-h-0 overflow-y-auto'>
241
+ {messages.map((message) => (
242
+ <div key={message.id} className='grid grid-cols-[var(--dx-rail-size)_1fr] w-full'>
243
+ <MessagePanel message={message} members={members} />
244
+ </div>
245
+ ))}
246
+ <div ref={sentinelRef} />
247
+ </div>
248
+ {!readOnly && (
249
+ <>
250
+ <div className='shrink-0 grid grid-cols-[var(--dx-rail-size)_1fr]'>
251
+ <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleSend} {...textboxMetadata} />
252
+ </div>
253
+ <div className='shrink-0 px-2 pb-1 text-xs text-description'>{activity ? t('activity.message') : null}</div>
254
+ </>
255
+ )}
256
+ </div>
257
+ );
258
+ });
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './Chat';
@@ -6,29 +6,30 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import * as Effect from 'effect/Effect';
7
7
  import React from 'react';
8
8
 
9
- import { OperationPlugin } from '@dxos/app-framework';
9
+ import { OperationPlugin, RuntimePlugin } from '@dxos/app-framework';
10
10
  import { withPluginManager } from '@dxos/app-framework/testing';
11
11
  import { Obj, Query, Relation } from '@dxos/echo';
12
12
  import { TestSchema } from '@dxos/echo/testing';
13
13
  import { ClientPlugin } from '@dxos/plugin-client';
14
- import { faker } from '@dxos/random';
15
- import { useDatabase, useQuery } from '@dxos/react-client/echo';
14
+ import { initializeIdentity } from '@dxos/plugin-client/testing';
15
+ import { random } from '@dxos/random';
16
+ import { useQuery, useSpaces } from '@dxos/react-client/echo';
16
17
  import { useIdentity } from '@dxos/react-client/halo';
17
18
  import { useAsyncEffect } from '@dxos/react-ui';
18
- import { withLayout, withTheme } from '@dxos/react-ui/testing';
19
- import { render } from '@dxos/storybook-utils';
19
+ import { withLayout, withTheme, Loading } from '@dxos/react-ui/testing';
20
20
  import { AnchoredTo, Message, Thread } from '@dxos/types';
21
21
 
22
- import { translations } from '../translations';
22
+ import { translations } from '#translations';
23
23
 
24
- import { CommentsContainer } from './CommentsContainer';
25
- import { createCommentThread, createProposalThread } from './testing';
24
+ import { createCommentThread, createProposalThread } from '../../testing/data';
25
+ import { CommentsPanel } from './CommentsPanel';
26
26
 
27
- faker.seed(1);
27
+ random.seed(1);
28
28
 
29
29
  const DefaultStory = () => {
30
30
  const identity = useIdentity();
31
- const db = useDatabase();
31
+ const [space] = useSpaces();
32
+ const db = space?.db;
32
33
  const anchors = useQuery(db, Query.type(AnchoredTo.AnchoredTo));
33
34
 
34
35
  useAsyncEffect(async () => {
@@ -54,28 +55,29 @@ const DefaultStory = () => {
54
55
  }, [identity, db]);
55
56
 
56
57
  if (!identity || !db || !anchors) {
57
- return null;
58
+ return <Loading data={{ identity: !!identity, db: !!db, anchors: !!anchors }} />;
58
59
  }
59
60
 
60
- return <CommentsContainer anchors={anchors} onThreadDelete={console.log} onAcceptProposal={console.log} />;
61
+ return <CommentsPanel anchors={anchors} onThreadDelete={console.log} onAcceptProposal={console.log} />;
61
62
  };
62
63
 
63
64
  const meta = {
64
- title: 'plugins/plugin-thread/Comments',
65
- render: render(DefaultStory),
65
+ title: 'plugins/plugin-thread/components/Comments',
66
+ render: DefaultStory,
66
67
  decorators: [
67
68
  withTheme(),
68
- withLayout({ layout: 'column', scroll: true }),
69
+ withLayout({ layout: 'column' }),
69
70
  // TODO(wittjosiah): This shouldn't depend on app framework (use withClientProvider instead).
70
71
  // Currently this is required due to useOnEditAnalytics.
71
72
  withPluginManager({
72
73
  plugins: [
73
74
  OperationPlugin(),
75
+ RuntimePlugin(),
74
76
  ClientPlugin({
75
77
  types: [Message.Message, Thread.Thread, AnchoredTo.AnchoredTo],
76
78
  onClientInitialized: ({ client }) =>
77
79
  Effect.gen(function* () {
78
- yield* Effect.promise(() => client.halo.createIdentity());
80
+ yield* initializeIdentity(client);
79
81
  }),
80
82
  }),
81
83
  ],
@@ -5,14 +5,14 @@
5
5
  import React, { useEffect } from 'react';
6
6
 
7
7
  import { Obj, Relation } from '@dxos/echo';
8
- import { Callout, Icon, Trans, useTranslation } from '@dxos/react-ui';
8
+ import { Icon, Message, Trans, useTranslation } from '@dxos/react-ui';
9
9
  import { type AnchoredTo, type Thread } from '@dxos/types';
10
10
 
11
- import { meta } from '../meta';
11
+ import { meta } from '#meta';
12
12
 
13
- import { CommentsThreadContainer, type CommentsThreadContainerProps } from './CommentsThreadContainer';
13
+ import { CommentsThread, type CommentsThreadProps } from './CommentsThread';
14
14
 
15
- export type CommentsContainerProps = Omit<CommentsThreadContainerProps, 'anchor' | 'current'> & {
15
+ export type CommentsPanelProps = Omit<CommentsThreadProps, 'anchor' | 'current'> & {
16
16
  anchors: AnchoredTo.AnchoredTo[];
17
17
  currentId?: string;
18
18
  showResolvedThreads?: boolean;
@@ -21,7 +21,7 @@ export type CommentsContainerProps = Omit<CommentsThreadContainerProps, 'anchor'
21
21
  /**
22
22
  * Root container for collection of comment threads.
23
23
  */
24
- export const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props }: CommentsContainerProps) => {
24
+ export const CommentsPanel = ({ anchors, currentId, showResolvedThreads, ...props }: CommentsPanelProps) => {
25
25
  const { t } = useTranslation(meta.id);
26
26
 
27
27
  // TODO(wittjosiah): There seems to be a race between thread and anchor being deleted.
@@ -29,7 +29,8 @@ export const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...
29
29
  ? anchors.filter((anchor) => !!Relation.getSource(anchor))
30
30
  : anchors.filter((anchor) => {
31
31
  const thread = Relation.getSource(anchor);
32
- return thread && thread.status !== 'resolved';
32
+ // TODO(dmaretskyi): Do Obj.instanceOf check instead.
33
+ return thread && (thread as any).status !== 'resolved';
33
34
  });
34
35
 
35
36
  useEffect(() => {
@@ -40,20 +41,20 @@ export const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...
40
41
 
41
42
  if (filteredAnchors.length === 0) {
42
43
  return (
43
- <div role='none' className='plb-cardSpacingBlock pli-cardSpacingInline'>
44
- <Callout.Root>
45
- <Callout.Title>
44
+ <div role='none' className='p-form-padding'>
45
+ <Message.Root>
46
+ <Message.Content>
46
47
  <Trans
47
48
  {...{
48
49
  t,
49
- i18nKey: 'no comments message',
50
+ i18nKey: 'no-comments.message',
50
51
  components: {
51
- commentIcon: <Icon icon='ph--chat-text--regular' size={4} classNames='inline-block' />,
52
+ commentIcon: <Icon icon='ph--chat-text--regular' size={4} classNames='dx-icon-inline' />,
52
53
  },
53
54
  }}
54
55
  />
55
- </Callout.Title>
56
- </Callout.Root>
56
+ </Message.Content>
57
+ </Message.Root>
57
58
  </div>
58
59
  );
59
60
  }
@@ -63,7 +64,7 @@ export const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...
63
64
  {filteredAnchors.map((anchor) => {
64
65
  const thread = Relation.getSource(anchor) as Thread.Thread;
65
66
  const threadId = Obj.getDXN(thread).toString();
66
- return <CommentsThreadContainer key={threadId} anchor={anchor} current={currentId === threadId} {...props} />;
67
+ return <CommentsThread key={threadId} anchor={anchor} current={currentId === threadId} {...props} />;
67
68
  })}
68
69
  </div>
69
70
  );
@@ -19,14 +19,14 @@ import { type AnchoredTo, type Thread } from '@dxos/types';
19
19
  import { createBasicExtensions, createThemeExtensions, listener } from '@dxos/ui-editor';
20
20
  import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';
21
21
 
22
- import { useStatus } from '../hooks';
23
- import { meta } from '../meta';
24
- import { getMessageMetadata } from '../util';
22
+ import { useStatus } from '#hooks';
23
+ import { meta } from '#meta';
25
24
 
26
- import { command } from './command-extension';
27
- import { MessageContainer, buttonClassNames, buttonGroupClassNames } from './MessageContainer';
25
+ import { command } from '../../extensions/command';
26
+ import { getMessageMetadata } from '../../util';
27
+ import { MessagePanel, buttonClassNames, buttonGroupClassNames } from '../MessagePanel';
28
28
 
29
- export type CommentsThreadContainerProps = {
29
+ export type CommentsThreadProps = {
30
30
  anchor: AnchoredTo.AnchoredTo;
31
31
  onAttend?: (anchor: AnchoredTo.AnchoredTo) => void;
32
32
  onComment?: (anchor: AnchoredTo.AnchoredTo, message: string) => void;
@@ -36,7 +36,7 @@ export type CommentsThreadContainerProps = {
36
36
  onAcceptProposal?: (anchor: AnchoredTo.AnchoredTo, messageId: string) => void;
37
37
  } & Pick<ThreadRootProps, 'current'>;
38
38
 
39
- export const CommentsThreadContainer = ({
39
+ export const CommentsThread = ({
40
40
  anchor,
41
41
  current,
42
42
  onAttend,
@@ -45,7 +45,7 @@ export const CommentsThreadContainer = ({
45
45
  onMessageDelete,
46
46
  onThreadDelete,
47
47
  onAcceptProposal,
48
- }: CommentsThreadContainerProps) => {
48
+ }: CommentsThreadProps) => {
49
49
  const { themeMode } = useThemeContext();
50
50
  const { t } = useTranslation(meta.id);
51
51
  const identity = useIdentity()!;
@@ -64,7 +64,7 @@ export const CommentsThreadContainer = ({
64
64
  const messageRef = useRef('');
65
65
  const extensions = useMemo(
66
66
  () => [
67
- createBasicExtensions({ placeholder: t('message placeholder') }),
67
+ createBasicExtensions({ placeholder: t('message.placeholder') }),
68
68
  createThemeExtensions({ themeMode }),
69
69
  listener({ onChange: ({ text }) => (messageRef.current = text) }),
70
70
  command,
@@ -82,7 +82,7 @@ export const CommentsThreadContainer = ({
82
82
  const handleThreadDelete = useCallback(() => onThreadDelete?.(anchor), [onThreadDelete, anchor]);
83
83
  const handleAcceptProposal = useCallback((id: string) => onAcceptProposal?.(anchor, id), [onAcceptProposal, anchor]);
84
84
 
85
- const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {
85
+ const handleComment = useCallback<NonNullable<MessageTextboxProps['onSend']>>(() => {
86
86
  if (!messageRef.current) {
87
87
  return false;
88
88
  }
@@ -98,7 +98,7 @@ export const CommentsThreadContainer = ({
98
98
  return (
99
99
  <ThreadComponent.Root
100
100
  id={Obj.getDXN(thread).toString()}
101
- classNames='pbs-2 border-be border-subduedSeparator last:border-none'
101
+ classNames='pt-2 border-b border-subdued-separator last:border-none'
102
102
  current={current}
103
103
  onClickCapture={handleAttend}
104
104
  onFocusCapture={handleAttend}
@@ -106,27 +106,27 @@ export const CommentsThreadContainer = ({
106
106
  <div
107
107
  role='none'
108
108
  className={mx(
109
- 'col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]',
109
+ 'col-span-2 grid grid-cols-[var(--dx-rail-size)_1fr_min-content]',
110
110
  hoverableControls,
111
111
  hoverableFocusedWithinControls,
112
112
  )}
113
113
  >
114
114
  {detached ? (
115
- <Tooltip.Trigger asChild content={t('detached thread label')} side='top'>
115
+ <Tooltip.Trigger asChild content={t('detached-thread.label')} side='top'>
116
116
  <ThreadComponent.Header detached>{thread.name}</ThreadComponent.Header>
117
117
  </Tooltip.Trigger>
118
118
  ) : (
119
119
  <ThreadComponent.Header>{thread.name}</ThreadComponent.Header>
120
120
  )}
121
121
  <div role='none' className={buttonGroupClassNames}>
122
- {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}
122
+ {thread.status === 'staged' && <Tag palette='neutral'>{t('draft.button')}</Tag>}
123
123
  {onResolve && !(thread?.status === 'staged') && (
124
124
  <IconButton
125
125
  data-testid='thread.resolve'
126
126
  variant='ghost'
127
127
  icon={thread?.status === 'resolved' ? 'ph--check--fill' : 'ph--check--regular'}
128
128
  iconOnly
129
- label={t('resolve thread label')}
129
+ label={t('resolve-thread.label')}
130
130
  classNames={[buttonClassNames, thread?.status !== 'resolved' && hoverableControlItem]}
131
131
  onClick={handleResolve}
132
132
  />
@@ -137,7 +137,7 @@ export const CommentsThreadContainer = ({
137
137
  variant='ghost'
138
138
  icon='ph--x--regular'
139
139
  iconOnly
140
- label={t('delete thread label')}
140
+ label={t('delete-thread.label')}
141
141
  classNames={[buttonClassNames, hoverableControlItem]}
142
142
  onClick={handleThreadDelete}
143
143
  />
@@ -146,7 +146,7 @@ export const CommentsThreadContainer = ({
146
146
  </div>
147
147
 
148
148
  {messages?.map((ref) => (
149
- <MessageContainer
149
+ <MessagePanel
150
150
  key={ref.dxn.toString()}
151
151
  editable
152
152
  message={ref}
@@ -164,10 +164,9 @@ export const CommentsThreadContainer = ({
164
164
  */}
165
165
  <MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />
166
166
 
167
- <ThreadComponent.Status activity={activity}>{t('activity message')}</ThreadComponent.Status>
167
+ <ThreadComponent.Status activity={activity}>{t('activity.message')}</ThreadComponent.Status>
168
168
 
169
- {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}
170
- <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />
169
+ <div role='none' className='h-px -mt-px' ref={threadScrollRef} />
171
170
  </ThreadComponent.Root>
172
171
  );
173
172
  };