@dxos/plugin-thread 0.8.4-main.bc674ce → 0.8.4-main.bcb3aa67d6

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 (436) hide show
  1. package/dist/lib/browser/add-message-RNUQFJTH.mjs +97 -0
  2. package/dist/lib/browser/add-message-RNUQFJTH.mjs.map +7 -0
  3. package/dist/lib/browser/blueprints/index.mjs +33 -4
  4. package/dist/lib/browser/blueprints/index.mjs.map +4 -4
  5. package/dist/lib/browser/chunk-BHQ62SKT.mjs +259 -0
  6. package/dist/lib/browser/chunk-BHQ62SKT.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-H32XEGIV.mjs +61 -0
  8. package/dist/lib/browser/chunk-H32XEGIV.mjs.map +7 -0
  9. package/dist/lib/browser/create-UWYTS35R.mjs +55 -0
  10. package/dist/lib/browser/create-UWYTS35R.mjs.map +7 -0
  11. package/dist/lib/browser/create-channel-7RX3G7QV.mjs +21 -0
  12. package/dist/lib/browser/create-channel-7RX3G7QV.mjs.map +7 -0
  13. package/dist/lib/browser/create-channel-thread-ZA7IVGTL.mjs +28 -0
  14. package/dist/lib/browser/create-channel-thread-ZA7IVGTL.mjs.map +7 -0
  15. package/dist/lib/browser/create-proposals-74FZ3XTC.mjs +57 -0
  16. package/dist/lib/browser/create-proposals-74FZ3XTC.mjs.map +7 -0
  17. package/dist/lib/browser/delete-SJBDYXW3.mjs +59 -0
  18. package/dist/lib/browser/delete-SJBDYXW3.mjs.map +7 -0
  19. package/dist/lib/browser/delete-message-AHSDDYXK.mjs +64 -0
  20. package/dist/lib/browser/delete-message-AHSDDYXK.mjs.map +7 -0
  21. package/dist/lib/browser/index.mjs +2225 -211
  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-YNZHJSZ5.mjs +25 -0
  25. package/dist/lib/browser/on-create-space-YNZHJSZ5.mjs.map +7 -0
  26. package/dist/lib/browser/operations/index.mjs +14 -0
  27. package/dist/lib/browser/operations/index.mjs.map +7 -0
  28. package/dist/lib/browser/restore-X2K3ZKFD.mjs +33 -0
  29. package/dist/lib/browser/restore-X2K3ZKFD.mjs.map +7 -0
  30. package/dist/lib/browser/restore-message-EHSQSLM3.mjs +42 -0
  31. package/dist/lib/browser/restore-message-EHSQSLM3.mjs.map +7 -0
  32. package/dist/lib/browser/select-GKW3QALS.mjs +26 -0
  33. package/dist/lib/browser/select-GKW3QALS.mjs.map +7 -0
  34. package/dist/lib/browser/toggle-resolved-Y5KJLQO3.mjs +45 -0
  35. package/dist/lib/browser/toggle-resolved-Y5KJLQO3.mjs.map +7 -0
  36. package/dist/lib/browser/types/index.mjs +5 -7
  37. package/dist/lib/node-esm/add-message-R3XLXRZ5.mjs +98 -0
  38. package/dist/lib/node-esm/add-message-R3XLXRZ5.mjs.map +7 -0
  39. package/dist/lib/node-esm/blueprints/index.mjs +33 -4
  40. package/dist/lib/node-esm/blueprints/index.mjs.map +4 -4
  41. package/dist/lib/node-esm/chunk-BAKHDRSB.mjs +260 -0
  42. package/dist/lib/node-esm/chunk-BAKHDRSB.mjs.map +7 -0
  43. package/dist/lib/node-esm/chunk-M6EZRL5B.mjs +62 -0
  44. package/dist/lib/node-esm/chunk-M6EZRL5B.mjs.map +7 -0
  45. package/dist/lib/node-esm/create-SKEKGLSD.mjs +56 -0
  46. package/dist/lib/node-esm/create-SKEKGLSD.mjs.map +7 -0
  47. package/dist/lib/node-esm/create-channel-4UICXKGI.mjs +22 -0
  48. package/dist/lib/node-esm/create-channel-4UICXKGI.mjs.map +7 -0
  49. package/dist/lib/node-esm/create-channel-thread-EWDR3J44.mjs +29 -0
  50. package/dist/lib/node-esm/create-channel-thread-EWDR3J44.mjs.map +7 -0
  51. package/dist/lib/node-esm/create-proposals-SASCDSNZ.mjs +58 -0
  52. package/dist/lib/node-esm/create-proposals-SASCDSNZ.mjs.map +7 -0
  53. package/dist/lib/node-esm/delete-IGQXPUHX.mjs +60 -0
  54. package/dist/lib/node-esm/delete-IGQXPUHX.mjs.map +7 -0
  55. package/dist/lib/node-esm/delete-message-IEJYQNZY.mjs +65 -0
  56. package/dist/lib/node-esm/delete-message-IEJYQNZY.mjs.map +7 -0
  57. package/dist/lib/node-esm/index.mjs +2225 -211
  58. package/dist/lib/node-esm/index.mjs.map +4 -4
  59. package/dist/lib/node-esm/meta.json +1 -1
  60. package/dist/lib/node-esm/on-create-space-UGALNIWK.mjs +26 -0
  61. package/dist/lib/node-esm/on-create-space-UGALNIWK.mjs.map +7 -0
  62. package/dist/lib/node-esm/operations/index.mjs +15 -0
  63. package/dist/lib/node-esm/operations/index.mjs.map +7 -0
  64. package/dist/lib/node-esm/restore-4EAMGSOF.mjs +34 -0
  65. package/dist/lib/node-esm/restore-4EAMGSOF.mjs.map +7 -0
  66. package/dist/lib/node-esm/restore-message-2Z6KR3RJ.mjs +43 -0
  67. package/dist/lib/node-esm/restore-message-2Z6KR3RJ.mjs.map +7 -0
  68. package/dist/lib/node-esm/select-MLVUUPYK.mjs +27 -0
  69. package/dist/lib/node-esm/select-MLVUUPYK.mjs.map +7 -0
  70. package/dist/lib/node-esm/toggle-resolved-Y2FRSWZ3.mjs +46 -0
  71. package/dist/lib/node-esm/toggle-resolved-Y2FRSWZ3.mjs.map +7 -0
  72. package/dist/lib/node-esm/types/index.mjs +5 -7
  73. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  74. package/dist/types/src/blueprints/index.d.ts +1 -1
  75. package/dist/types/src/blueprints/index.d.ts.map +1 -1
  76. package/dist/types/src/blueprints/thread-blueprint.d.ts +3 -20
  77. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -1
  78. package/dist/types/src/calls-service.stories.d.ts +2 -2
  79. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/app-graph-builder.d.ts +6 -0
  81. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  82. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  83. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  84. package/dist/types/src/capabilities/call-manager.d.ts +6 -0
  85. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -0
  86. package/dist/types/src/capabilities/index.d.ts +15 -10
  87. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  88. package/dist/types/src/capabilities/markdown.d.ts +5 -0
  89. package/dist/types/src/capabilities/markdown.d.ts.map +1 -0
  90. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  91. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  92. package/dist/types/src/capabilities/{react-root/react-root.d.ts → react-root.d.ts} +1 -1
  93. package/dist/types/src/capabilities/react-root.d.ts.map +1 -0
  94. package/dist/types/src/capabilities/react-surface.d.ts +5 -0
  95. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  96. package/dist/types/src/capabilities/settings.d.ts +6 -0
  97. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  98. package/dist/types/src/capabilities/state.d.ts +7 -0
  99. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  100. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  101. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  102. package/dist/types/src/components/Call/Toolbar.d.ts +1 -1
  103. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  104. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts +13 -0
  105. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
  106. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +160 -0
  107. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -0
  108. package/dist/types/src/components/{CommentsThreadContainer.d.ts → CommentsPanel/CommentsThread.d.ts} +3 -3
  109. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -0
  110. package/dist/types/src/components/CommentsPanel/index.d.ts +3 -0
  111. package/dist/types/src/components/CommentsPanel/index.d.ts.map +1 -0
  112. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts +15 -0
  113. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -0
  114. package/dist/types/src/components/MessagePanel/index.d.ts +2 -0
  115. package/dist/types/src/components/MessagePanel/index.d.ts.map +1 -0
  116. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +142 -144
  117. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  118. package/dist/types/src/components/ResponsiveGrid/{ResponsiveContainer.d.ts → ResponsivePanel.d.ts} +4 -4
  119. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts.map +1 -0
  120. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts +164 -0
  121. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts.map +1 -0
  122. package/dist/types/src/components/ResponsiveGrid/index.d.ts +1 -1
  123. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +1 -1
  124. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts +6 -0
  125. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -0
  126. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +161 -0
  127. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -0
  128. package/dist/types/src/components/ThreadSettings/index.d.ts +3 -0
  129. package/dist/types/src/components/ThreadSettings/index.d.ts.map +1 -0
  130. package/dist/types/src/components/index.d.ts +4 -9
  131. package/dist/types/src/components/index.d.ts.map +1 -1
  132. package/dist/types/src/{components → containers/CallDebugPanel}/CallDebugPanel.d.ts +1 -1
  133. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +1 -0
  134. package/dist/types/src/containers/CallDebugPanel/index.d.ts +3 -0
  135. package/dist/types/src/containers/CallDebugPanel/index.d.ts.map +1 -0
  136. package/dist/types/src/{components → containers/CallSidebar}/CallSidebar.d.ts +0 -1
  137. package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts.map +1 -0
  138. package/dist/types/src/containers/CallSidebar/index.d.ts +3 -0
  139. package/dist/types/src/containers/CallSidebar/index.d.ts.map +1 -0
  140. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +12 -0
  141. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +1 -0
  142. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +162 -0
  143. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +1 -0
  144. package/dist/types/src/containers/ChannelContainer/index.d.ts +3 -0
  145. package/dist/types/src/containers/ChannelContainer/index.d.ts.map +1 -0
  146. package/dist/types/src/{components → containers/ChatContainer}/ChatContainer.d.ts +7 -5
  147. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +1 -0
  148. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts +162 -0
  149. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts.map +1 -0
  150. package/dist/types/src/containers/ChatContainer/index.d.ts +4 -0
  151. package/dist/types/src/containers/ChatContainer/index.d.ts.map +1 -0
  152. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts +8 -0
  153. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -0
  154. package/dist/types/src/containers/ThreadCompanion/index.d.ts +3 -0
  155. package/dist/types/src/containers/ThreadCompanion/index.d.ts.map +1 -0
  156. package/dist/types/src/containers/index.d.ts +7 -0
  157. package/dist/types/src/containers/index.d.ts.map +1 -0
  158. package/dist/types/src/{components/command-extension.d.ts → extensions/command.d.ts} +1 -1
  159. package/dist/types/src/extensions/command.d.ts.map +1 -0
  160. package/dist/types/src/extensions/index.d.ts +1 -0
  161. package/dist/types/src/extensions/index.d.ts.map +1 -1
  162. package/dist/types/src/extensions/threads.d.ts +1 -1
  163. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  164. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  165. package/dist/types/src/operations/add-message.d.ts +5 -0
  166. package/dist/types/src/operations/add-message.d.ts.map +1 -0
  167. package/dist/types/src/operations/create-channel-thread.d.ts +5 -0
  168. package/dist/types/src/operations/create-channel-thread.d.ts.map +1 -0
  169. package/dist/types/src/operations/create-channel.d.ts +5 -0
  170. package/dist/types/src/operations/create-channel.d.ts.map +1 -0
  171. package/dist/types/src/operations/create-proposals.d.ts +5 -0
  172. package/dist/types/src/operations/create-proposals.d.ts.map +1 -0
  173. package/dist/types/src/operations/create.d.ts +5 -0
  174. package/dist/types/src/operations/create.d.ts.map +1 -0
  175. package/dist/types/src/operations/definitions.d.ts +2789 -0
  176. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  177. package/dist/types/src/operations/delete-message.d.ts +5 -0
  178. package/dist/types/src/operations/delete-message.d.ts.map +1 -0
  179. package/dist/types/src/operations/delete.d.ts +5 -0
  180. package/dist/types/src/operations/delete.d.ts.map +1 -0
  181. package/dist/types/src/operations/index.d.ts +4 -0
  182. package/dist/types/src/operations/index.d.ts.map +1 -0
  183. package/dist/types/src/operations/on-create-space.d.ts +5 -0
  184. package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
  185. package/dist/types/src/operations/restore-message.d.ts +5 -0
  186. package/dist/types/src/operations/restore-message.d.ts.map +1 -0
  187. package/dist/types/src/operations/restore.d.ts +5 -0
  188. package/dist/types/src/operations/restore.d.ts.map +1 -0
  189. package/dist/types/src/operations/select.d.ts +5 -0
  190. package/dist/types/src/operations/select.d.ts.map +1 -0
  191. package/dist/types/src/operations/toggle-resolved.d.ts +5 -0
  192. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -0
  193. package/dist/types/src/{components/testing.d.ts → testing/data.d.ts} +1 -1
  194. package/dist/types/src/testing/data.d.ts.map +1 -0
  195. package/dist/types/src/testing/stories.d.ts.map +1 -1
  196. package/dist/types/src/translations.d.ts +140 -142
  197. package/dist/types/src/translations.d.ts.map +1 -1
  198. package/dist/types/src/types/Channel.d.ts +25 -9
  199. package/dist/types/src/types/Channel.d.ts.map +1 -1
  200. package/dist/types/src/types/Settings.d.ts +4 -0
  201. package/dist/types/src/types/Settings.d.ts.map +1 -0
  202. package/dist/types/src/types/capabilities.d.ts.map +1 -1
  203. package/dist/types/src/types/types.d.ts +1 -3227
  204. package/dist/types/src/types/types.d.ts.map +1 -1
  205. package/dist/types/tsconfig.tsbuildinfo +1 -1
  206. package/package.json +88 -66
  207. package/src/ThreadPlugin.tsx +55 -57
  208. package/src/blueprints/index.ts +1 -1
  209. package/src/blueprints/thread-blueprint.ts +13 -8
  210. package/src/calls-service.stories.tsx +8 -8
  211. package/src/capabilities/{app-graph-builder/app-graph-builder.ts → app-graph-builder.ts} +41 -50
  212. package/src/capabilities/blueprint-definition.ts +17 -0
  213. package/src/capabilities/{call-manager/call-manager.ts → call-manager.ts} +5 -5
  214. package/src/capabilities/index.ts +16 -10
  215. package/src/capabilities/{markdown/markdown.ts → markdown.ts} +13 -15
  216. package/src/capabilities/operation-handler.ts +16 -0
  217. package/src/capabilities/{react-root/react-root.tsx → react-root.tsx} +4 -4
  218. package/src/capabilities/{react-surface/react-surface.tsx → react-surface.tsx} +32 -34
  219. package/src/capabilities/{settings/settings.ts → settings.ts} +8 -7
  220. package/src/capabilities/{state/state.ts → state.ts} +1 -1
  221. package/src/capabilities/undo-mappings.ts +46 -0
  222. package/src/components/Call/Call.tsx +4 -4
  223. package/src/components/Call/Toolbar.tsx +30 -21
  224. package/src/components/{Comments.stories.tsx → CommentsPanel/CommentsPanel.stories.tsx} +14 -13
  225. package/src/components/{CommentsContainer.tsx → CommentsPanel/CommentsPanel.tsx} +15 -14
  226. package/src/components/{CommentsThreadContainer.tsx → CommentsPanel/CommentsThread.tsx} +19 -20
  227. package/src/components/CommentsPanel/index.ts +6 -0
  228. package/src/components/Lobby/Lobby.tsx +7 -7
  229. package/src/components/Media/VideoObject.stories.tsx +6 -6
  230. package/src/components/Media/VideoObject.tsx +1 -1
  231. package/src/components/{MessageContainer.tsx → MessagePanel/MessagePanel.tsx} +18 -18
  232. package/src/components/MessagePanel/index.ts +5 -0
  233. package/src/components/Participant/Participant.tsx +2 -2
  234. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +6 -6
  235. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +8 -8
  236. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +9 -9
  237. package/src/components/ResponsiveGrid/{ResponsiveContainer.stories.tsx → ResponsivePanel.stories.tsx} +7 -7
  238. package/src/components/ResponsiveGrid/{ResponsiveContainer.tsx → ResponsivePanel.tsx} +5 -5
  239. package/src/components/ResponsiveGrid/index.ts +1 -1
  240. package/src/components/ThreadSettings/ThreadSettings.stories.tsx +32 -0
  241. package/src/components/ThreadSettings/ThreadSettings.tsx +20 -0
  242. package/src/components/ThreadSettings/index.ts +7 -0
  243. package/src/components/index.ts +5 -9
  244. package/src/{components → containers/CallDebugPanel}/CallDebugPanel.tsx +7 -7
  245. package/src/containers/CallDebugPanel/index.ts +7 -0
  246. package/src/{components → containers/CallSidebar}/CallSidebar.tsx +4 -7
  247. package/src/containers/CallSidebar/index.ts +7 -0
  248. package/src/{components → containers/ChannelContainer}/ChannelContainer.stories.tsx +11 -13
  249. package/src/{components → containers/ChannelContainer}/ChannelContainer.tsx +75 -60
  250. package/src/containers/ChannelContainer/index.ts +7 -0
  251. package/src/{components/Chat.stories.tsx → containers/ChatContainer/ChatContainer.stories.tsx} +20 -18
  252. package/src/containers/ChatContainer/ChatContainer.tsx +130 -0
  253. package/src/containers/ChatContainer/index.ts +8 -0
  254. package/src/{components → containers/ThreadCompanion}/ThreadCompanion.tsx +74 -50
  255. package/src/containers/ThreadCompanion/index.ts +7 -0
  256. package/src/containers/index.ts +11 -0
  257. package/src/{components/command-extension.ts → extensions/command.ts} +1 -1
  258. package/src/extensions/index.ts +1 -0
  259. package/src/extensions/threads.ts +14 -13
  260. package/src/hooks/analytics.ts +3 -2
  261. package/src/meta.ts +2 -2
  262. package/src/operations/add-message.ts +82 -0
  263. package/src/operations/create-channel-thread.ts +26 -0
  264. package/src/operations/create-channel.ts +21 -0
  265. package/src/operations/create-proposals.ts +49 -0
  266. package/src/operations/create.ts +49 -0
  267. package/src/operations/definitions.ts +177 -0
  268. package/src/operations/delete-message.ts +53 -0
  269. package/src/operations/delete.ts +64 -0
  270. package/src/operations/index.ts +22 -0
  271. package/src/operations/on-create-space.ts +27 -0
  272. package/src/operations/restore-message.ts +38 -0
  273. package/src/operations/restore.ts +38 -0
  274. package/src/operations/select.ts +25 -0
  275. package/src/operations/toggle-resolved.ts +41 -0
  276. package/src/testing/stories.ts +6 -11
  277. package/src/translations.ts +72 -76
  278. package/src/types/Channel.ts +11 -4
  279. package/src/types/Settings.ts +10 -0
  280. package/src/types/capabilities.ts +8 -7
  281. package/src/types/types.ts +2 -184
  282. package/src/util.ts +1 -1
  283. package/dist/lib/browser/app-graph-builder-7C2QW32W.mjs +0 -188
  284. package/dist/lib/browser/app-graph-builder-7C2QW32W.mjs.map +0 -7
  285. package/dist/lib/browser/blueprint-definition-UQ63QKQG.mjs +0 -17
  286. package/dist/lib/browser/blueprint-definition-UQ63QKQG.mjs.map +0 -7
  287. package/dist/lib/browser/call-manager-4P536YNX.mjs +0 -26
  288. package/dist/lib/browser/call-manager-4P536YNX.mjs.map +0 -7
  289. package/dist/lib/browser/chunk-2FIHSX35.mjs +0 -293
  290. package/dist/lib/browser/chunk-2FIHSX35.mjs.map +0 -7
  291. package/dist/lib/browser/chunk-CP7E2HRE.mjs +0 -31
  292. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +0 -7
  293. package/dist/lib/browser/chunk-DLO2G3DM.mjs +0 -184
  294. package/dist/lib/browser/chunk-DLO2G3DM.mjs.map +0 -7
  295. package/dist/lib/browser/chunk-ERK254BS.mjs +0 -1810
  296. package/dist/lib/browser/chunk-ERK254BS.mjs.map +0 -7
  297. package/dist/lib/browser/chunk-ISCHODBV.mjs +0 -106
  298. package/dist/lib/browser/chunk-ISCHODBV.mjs.map +0 -7
  299. package/dist/lib/browser/chunk-YSHXWAL3.mjs +0 -1815
  300. package/dist/lib/browser/chunk-YSHXWAL3.mjs.map +0 -7
  301. package/dist/lib/browser/chunk-ZFLSTQSE.mjs +0 -106
  302. package/dist/lib/browser/chunk-ZFLSTQSE.mjs.map +0 -7
  303. package/dist/lib/browser/markdown-QMJLRR6R.mjs +0 -210
  304. package/dist/lib/browser/markdown-QMJLRR6R.mjs.map +0 -7
  305. package/dist/lib/browser/operation-resolver-T63EP5TY.mjs +0 -441
  306. package/dist/lib/browser/operation-resolver-T63EP5TY.mjs.map +0 -7
  307. package/dist/lib/browser/react-root-56MJI77R.mjs +0 -25
  308. package/dist/lib/browser/react-root-56MJI77R.mjs.map +0 -7
  309. package/dist/lib/browser/react-surface-DMBHQOXJ.mjs +0 -110
  310. package/dist/lib/browser/react-surface-DMBHQOXJ.mjs.map +0 -7
  311. package/dist/lib/browser/repair-6OZ75AUU.mjs +0 -38
  312. package/dist/lib/browser/repair-6OZ75AUU.mjs.map +0 -7
  313. package/dist/lib/browser/settings-WZMJMML3.mjs +0 -32
  314. package/dist/lib/browser/settings-WZMJMML3.mjs.map +0 -7
  315. package/dist/lib/browser/state-SJR2GL5G.mjs +0 -24
  316. package/dist/lib/browser/state-SJR2GL5G.mjs.map +0 -7
  317. package/dist/lib/node-esm/app-graph-builder-JCSVFRVY.mjs +0 -189
  318. package/dist/lib/node-esm/app-graph-builder-JCSVFRVY.mjs.map +0 -7
  319. package/dist/lib/node-esm/blueprint-definition-MZZXXL37.mjs +0 -18
  320. package/dist/lib/node-esm/blueprint-definition-MZZXXL37.mjs.map +0 -7
  321. package/dist/lib/node-esm/call-manager-FMLRR5S5.mjs +0 -27
  322. package/dist/lib/node-esm/call-manager-FMLRR5S5.mjs.map +0 -7
  323. package/dist/lib/node-esm/chunk-7XQLXMX7.mjs +0 -1816
  324. package/dist/lib/node-esm/chunk-7XQLXMX7.mjs.map +0 -7
  325. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs +0 -33
  326. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-AQHPP6ZX.mjs +0 -107
  328. package/dist/lib/node-esm/chunk-AQHPP6ZX.mjs.map +0 -7
  329. package/dist/lib/node-esm/chunk-KRBZBJRI.mjs +0 -185
  330. package/dist/lib/node-esm/chunk-KRBZBJRI.mjs.map +0 -7
  331. package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs +0 -1811
  332. package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs.map +0 -7
  333. package/dist/lib/node-esm/chunk-VBI32FGI.mjs +0 -108
  334. package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +0 -7
  335. package/dist/lib/node-esm/chunk-WMWUXWAS.mjs +0 -294
  336. package/dist/lib/node-esm/chunk-WMWUXWAS.mjs.map +0 -7
  337. package/dist/lib/node-esm/markdown-L6LLQLIN.mjs +0 -211
  338. package/dist/lib/node-esm/markdown-L6LLQLIN.mjs.map +0 -7
  339. package/dist/lib/node-esm/operation-resolver-G6GZPBRP.mjs +0 -442
  340. package/dist/lib/node-esm/operation-resolver-G6GZPBRP.mjs.map +0 -7
  341. package/dist/lib/node-esm/react-root-V4W4X5GL.mjs +0 -26
  342. package/dist/lib/node-esm/react-root-V4W4X5GL.mjs.map +0 -7
  343. package/dist/lib/node-esm/react-surface-ELDSTUA3.mjs +0 -111
  344. package/dist/lib/node-esm/react-surface-ELDSTUA3.mjs.map +0 -7
  345. package/dist/lib/node-esm/repair-6777EPOM.mjs +0 -39
  346. package/dist/lib/node-esm/repair-6777EPOM.mjs.map +0 -7
  347. package/dist/lib/node-esm/settings-37CO3SNR.mjs +0 -33
  348. package/dist/lib/node-esm/settings-37CO3SNR.mjs.map +0 -7
  349. package/dist/lib/node-esm/state-5R3TZJQE.mjs +0 -25
  350. package/dist/lib/node-esm/state-5R3TZJQE.mjs.map +0 -7
  351. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +0 -6
  352. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +0 -1
  353. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +0 -3
  354. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +0 -1
  355. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +0 -9
  356. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +0 -1
  357. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +0 -3
  358. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +0 -1
  359. package/dist/types/src/capabilities/call-manager/call-manager.d.ts +0 -6
  360. package/dist/types/src/capabilities/call-manager/call-manager.d.ts.map +0 -1
  361. package/dist/types/src/capabilities/call-manager/index.d.ts +0 -3
  362. package/dist/types/src/capabilities/call-manager/index.d.ts.map +0 -1
  363. package/dist/types/src/capabilities/markdown/index.d.ts +0 -3
  364. package/dist/types/src/capabilities/markdown/index.d.ts.map +0 -1
  365. package/dist/types/src/capabilities/markdown/markdown.d.ts +0 -5
  366. package/dist/types/src/capabilities/markdown/markdown.d.ts.map +0 -1
  367. package/dist/types/src/capabilities/operation-resolver/index.d.ts +0 -3
  368. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +0 -1
  369. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +0 -5
  370. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +0 -1
  371. package/dist/types/src/capabilities/react-root/index.d.ts +0 -6
  372. package/dist/types/src/capabilities/react-root/index.d.ts.map +0 -1
  373. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +0 -1
  374. package/dist/types/src/capabilities/react-surface/index.d.ts +0 -3
  375. package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
  376. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +0 -5
  377. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
  378. package/dist/types/src/capabilities/repair/index.d.ts +0 -3
  379. package/dist/types/src/capabilities/repair/index.d.ts.map +0 -1
  380. package/dist/types/src/capabilities/repair/repair.d.ts +0 -6
  381. package/dist/types/src/capabilities/repair/repair.d.ts.map +0 -1
  382. package/dist/types/src/capabilities/settings/index.d.ts +0 -3
  383. package/dist/types/src/capabilities/settings/index.d.ts.map +0 -1
  384. package/dist/types/src/capabilities/settings/settings.d.ts +0 -5
  385. package/dist/types/src/capabilities/settings/settings.d.ts.map +0 -1
  386. package/dist/types/src/capabilities/state/index.d.ts +0 -3
  387. package/dist/types/src/capabilities/state/index.d.ts.map +0 -1
  388. package/dist/types/src/capabilities/state/state.d.ts +0 -7
  389. package/dist/types/src/capabilities/state/state.d.ts.map +0 -1
  390. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  391. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  392. package/dist/types/src/components/ChannelContainer.d.ts +0 -13
  393. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  394. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -164
  395. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  396. package/dist/types/src/components/Chat.stories.d.ts +0 -164
  397. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  398. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  399. package/dist/types/src/components/Comments.stories.d.ts +0 -162
  400. package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
  401. package/dist/types/src/components/CommentsContainer.d.ts +0 -13
  402. package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
  403. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +0 -1
  404. package/dist/types/src/components/MessageContainer.d.ts +0 -15
  405. package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
  406. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
  407. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -166
  408. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
  409. package/dist/types/src/components/ThreadCompanion.d.ts +0 -5
  410. package/dist/types/src/components/ThreadCompanion.d.ts.map +0 -1
  411. package/dist/types/src/components/ThreadSettings.d.ts +0 -8
  412. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  413. package/dist/types/src/components/command-extension.d.ts.map +0 -1
  414. package/dist/types/src/components/testing.d.ts.map +0 -1
  415. package/dist/types/src/functions/create-proposals.d.ts +0 -6
  416. package/dist/types/src/functions/create-proposals.d.ts.map +0 -1
  417. package/dist/types/src/functions/index.d.ts +0 -2
  418. package/dist/types/src/functions/index.d.ts.map +0 -1
  419. package/src/capabilities/app-graph-builder/index.ts +0 -7
  420. package/src/capabilities/blueprint-definition/blueprint-definition.ts +0 -23
  421. package/src/capabilities/blueprint-definition/index.ts +0 -7
  422. package/src/capabilities/call-manager/index.ts +0 -7
  423. package/src/capabilities/markdown/index.ts +0 -7
  424. package/src/capabilities/operation-resolver/index.ts +0 -7
  425. package/src/capabilities/operation-resolver/operation-resolver.ts +0 -400
  426. package/src/capabilities/react-root/index.ts +0 -7
  427. package/src/capabilities/react-surface/index.ts +0 -7
  428. package/src/capabilities/repair/index.ts +0 -7
  429. package/src/capabilities/repair/repair.ts +0 -51
  430. package/src/capabilities/settings/index.ts +0 -7
  431. package/src/capabilities/state/index.ts +0 -7
  432. package/src/components/ChatContainer.tsx +0 -155
  433. package/src/components/ThreadSettings.tsx +0 -21
  434. package/src/functions/create-proposals.ts +0 -57
  435. package/src/functions/index.ts +0 -5
  436. /package/src/{components/testing.ts → testing/data.ts} +0 -0
@@ -5,28 +5,27 @@
5
5
  import { Atom, useAtomValue } from '@effect-atom/atom-react';
6
6
  import React, { type ChangeEvent, useCallback, useEffect, useMemo, useState } from 'react';
7
7
 
8
- import { type SurfaceComponentProps, useCapabilities, useCapability } from '@dxos/app-framework/react';
8
+ import { useCapabilities, useCapability } from '@dxos/app-framework/ui';
9
+ import { type ObjectSurfaceProps } from '@dxos/app-toolkit/ui';
9
10
  import { Context } from '@dxos/context';
10
11
  import { failUndefined } from '@dxos/debug';
11
- import { Obj } from '@dxos/echo';
12
12
  import { log } from '@dxos/log';
13
13
  import { useClient } from '@dxos/react-client';
14
14
  import { getSpace } from '@dxos/react-client/echo';
15
15
  import { useIdentity } from '@dxos/react-client/halo';
16
- import { ElevationProvider, Input, useTranslation } from '@dxos/react-ui';
17
- import { ControlGroup, ControlGroupButton, ControlItemInput } from '@dxos/react-ui-form';
18
- import { MenuProvider, ToolbarMenu, createMenuAction, createMenuItemGroup, useMenuActions } from '@dxos/react-ui-menu';
16
+ import { Button, ElevationProvider, Input, Panel, useTranslation } from '@dxos/react-ui';
17
+ import { Settings } from '@dxos/react-ui-form';
18
+ import { Menu, MenuRootProps, createMenuAction, createMenuItemGroup, useMenuActions } from '@dxos/react-ui-menu';
19
19
  import { useSoundEffect } from '@dxos/react-ui-sfx';
20
- import { StackItem } from '@dxos/react-ui-stack';
20
+ import { composable, composableProps } from '@dxos/ui-theme';
21
21
 
22
- import { meta } from '../meta';
23
- import { ThreadCapabilities } from '../types';
24
- import { type Channel } from '../types';
22
+ import { Call } from '#components';
23
+ import { meta } from '#meta';
24
+ import { ThreadCapabilities } from '#types';
25
+ import { type Channel } from '#types';
26
+ import { ChatContainer } from '../ChatContainer';
25
27
 
26
- import { Call } from './Call';
27
- import ChatContainer from './ChatContainer';
28
-
29
- export type ChannelContainerProps = SurfaceComponentProps<
28
+ export type ChannelContainerProps = ObjectSurfaceProps<
30
29
  Channel.Channel | undefined,
31
30
  {
32
31
  roomId?: string;
@@ -38,19 +37,24 @@ export type ChannelContainerProps = SurfaceComponentProps<
38
37
  * Renders a call when active, otherwise renders the channel chat.
39
38
  */
40
39
  // TODO(burdon): Create Radix style layout.
41
- export const ChannelContainer = ({ role, subject: channel, roomId: roomIdProp, fullscreen }: ChannelContainerProps) => {
40
+ export const ChannelContainer = ({
41
+ role,
42
+ subject: channel,
43
+ attendableId,
44
+ roomId: roomIdProp,
45
+ fullscreen,
46
+ }: ChannelContainerProps) => {
42
47
  const space = getSpace(channel);
43
48
  const callManager = useCapability(ThreadCapabilities.CallManager);
49
+ const extensions = useCapabilities(ThreadCapabilities.CallExtension);
44
50
  const joined = useAtomValue(callManager.joinedAtom);
45
51
  const currentRoomId = useAtomValue(callManager.roomIdAtom);
46
- const attendableId = channel ? Obj.getDXN(channel).toString() : undefined;
47
52
  const roomId = roomIdProp ?? attendableId ?? failUndefined();
48
53
  const identity = useIdentity();
49
54
  const isNamed = !!identity?.profile?.displayName;
50
55
  const joinSound = useSoundEffect('JoinCall');
51
56
  const leaveSound = useSoundEffect('LeaveCall');
52
57
 
53
- const extensions = useCapabilities(ThreadCapabilities.CallExtension);
54
58
  useEffect(() => {
55
59
  const ctx = new Context();
56
60
  callManager.left.on(ctx, (roomId) => {
@@ -118,27 +122,38 @@ export const ChannelContainer = ({ role, subject: channel, roomId: roomIdProp, f
118
122
  }, [extensions, roomId]);
119
123
 
120
124
  const isJoined = joined && currentRoomId === roomId;
125
+ if (isJoined) {
126
+ return (
127
+ <Panel.Root>
128
+ <Panel.Content>
129
+ {isNamed ? (
130
+ <Call.Root>
131
+ <Call.Grid fullscreen={fullscreen} />
132
+ <Call.Toolbar channel={channel} onLeave={handleLeave} />
133
+ </Call.Root>
134
+ ) : (
135
+ <DisplayNameMissing />
136
+ )}
137
+ </Panel.Content>
138
+ </Panel.Root>
139
+ );
140
+ }
121
141
 
122
- return (
123
- <StackItem.Content classNames={isJoined && 'bs-full'} toolbar={!isJoined}>
124
- {isJoined && !isNamed && <DisplayNameMissing />}
125
- {isJoined && isNamed && (
126
- <Call.Root>
127
- <Call.Grid fullscreen={fullscreen} />
128
- <Call.Toolbar channel={channel} onLeave={handleLeave} />
129
- </Call.Root>
130
- )}
131
- {!isJoined && channel && channel.defaultThread.target && space && (
132
- <>
142
+ if (channel && channel.defaultThread.target && space) {
143
+ return (
144
+ <Panel.Root classNames='dx-document'>
145
+ <Panel.Toolbar asChild>
133
146
  <ChannelToolbar attendableId={attendableId} role={role} onJoinCall={handleJoin} />
134
- <ChatContainer space={space} thread={channel.defaultThread.target} classNames='container-max-width' />
135
- </>
136
- )}
137
- </StackItem.Content>
138
- );
139
- };
147
+ </Panel.Toolbar>
148
+ <Panel.Content asChild>
149
+ <ChatContainer space={space} thread={channel.defaultThread.target} />
150
+ </Panel.Content>
151
+ </Panel.Root>
152
+ );
153
+ }
140
154
 
141
- export default ChannelContainer;
155
+ return null;
156
+ };
142
157
 
143
158
  const DisplayNameMissing = () => {
144
159
  const { t } = useTranslation(meta.id);
@@ -148,19 +163,19 @@ const DisplayNameMissing = () => {
148
163
  const handleSave = useCallback(() => client.halo.updateProfile({ displayName }), [client, displayName]);
149
164
 
150
165
  return (
151
- <ControlGroup classNames='p-4 place-content-center'>
152
- <ControlItemInput title={t('display name label')} description={t('display name description')}>
166
+ <div className='space-y-trim-md p-4 place-content-center'>
167
+ <Settings.Item title={t('display-name.label')} description={t('display-name.description')}>
153
168
  <Input.TextInput
154
169
  value={displayName}
155
170
  onChange={handleChange}
156
- placeholder={t('display name input placeholder')}
157
- classNames='md:min-is-64'
171
+ placeholder={t('display-name-input.placeholder')}
172
+ classNames='md:min-w-64'
158
173
  />
159
- </ControlItemInput>
160
- <ControlGroupButton disabled={!displayName} onClick={handleSave}>
161
- {t('set display name label')}
162
- </ControlGroupButton>
163
- </ControlGroup>
174
+ </Settings.Item>
175
+ <Button classNames='md:col-span-2' disabled={!displayName} onClick={handleSave}>
176
+ {t('set-display-name.label')}
177
+ </Button>
178
+ </div>
164
179
  );
165
180
  };
166
181
 
@@ -171,15 +186,15 @@ const useChannelToolbarActions = (onJoinCall?: () => void) => {
171
186
  return {
172
187
  nodes: [
173
188
  createMenuItemGroup('root', {
174
- label: ['channel toolbar title', { ns: meta.id }],
189
+ label: ['channel-toolbar.title', { ns: meta.id }],
175
190
  }),
176
191
  createMenuAction('video-call', () => onJoinCall?.(), {
177
- label: ['start video call label', { ns: meta.id }],
192
+ label: ['start-video-call.menu', { ns: meta.id }],
178
193
  icon: 'ph--video-camera--regular',
179
194
  type: 'video-call',
180
195
  }),
181
196
  ],
182
- edges: [{ source: 'root', target: 'video-call' }],
197
+ edges: [{ source: 'root', target: 'video-call', relation: 'child' }],
183
198
  };
184
199
  }),
185
200
  [],
@@ -188,20 +203,20 @@ const useChannelToolbarActions = (onJoinCall?: () => void) => {
188
203
  return useMenuActions(creator);
189
204
  };
190
205
 
191
- type ChannelToolbarProps = {
192
- attendableId?: string;
193
- role?: string;
206
+ type ChannelToolbarProps = Pick<MenuRootProps, 'attendableId'> & {
194
207
  onJoinCall?: () => void;
195
208
  };
196
209
 
197
- const ChannelToolbar = ({ attendableId, role, onJoinCall }: ChannelToolbarProps) => {
198
- const menuProps = useChannelToolbarActions(onJoinCall);
199
-
200
- return (
201
- <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>
202
- <MenuProvider {...menuProps} attendableId={attendableId}>
203
- <ToolbarMenu textBlockWidth />
204
- </MenuProvider>
205
- </ElevationProvider>
206
- );
207
- };
210
+ const ChannelToolbar = composable<HTMLDivElement, ChannelToolbarProps>(
211
+ ({ attendableId, role, onJoinCall, ...props }, forwardedRef) => {
212
+ const menuActions = useChannelToolbarActions(onJoinCall);
213
+
214
+ return (
215
+ <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>
216
+ <Menu.Root {...menuActions} attendableId={attendableId}>
217
+ <Menu.Toolbar {...composableProps(props)} ref={forwardedRef} />
218
+ </Menu.Root>
219
+ </ElevationProvider>
220
+ );
221
+ },
222
+ );
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { ChannelContainer } from './ChannelContainer';
6
+
7
+ export default ChannelContainer;
@@ -5,23 +5,24 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React, { useState } from 'react';
7
7
 
8
- import { Capability, Common, OperationPlugin } from '@dxos/app-framework';
8
+ import { Capabilities, Capability } from '@dxos/app-framework';
9
9
  import { withPluginManager } from '@dxos/app-framework/testing';
10
+ import { Surface } from '@dxos/app-framework/ui';
10
11
  import { faker } from '@dxos/random';
11
12
  import { useClient } from '@dxos/react-client';
12
13
  import { type Space } from '@dxos/react-client/echo';
13
14
  import { useIdentity } from '@dxos/react-client/halo';
14
15
  import { withClientProvider } from '@dxos/react-client/testing';
15
16
  import { useAsyncEffect } from '@dxos/react-ui';
16
- import { withTheme } from '@dxos/react-ui/testing';
17
+ import { withLayout, Loading } from '@dxos/react-ui/testing';
17
18
  import { Thread as ThreadComponent } from '@dxos/react-ui-thread';
18
- import { render } from '@dxos/storybook-utils';
19
19
  import { Message, Thread } from '@dxos/types';
20
20
 
21
- import { translations } from '../translations';
22
- import { Channel } from '../types';
21
+ import { translations } from '../../translations';
22
+ import { Channel } from '#types';
23
23
 
24
24
  import { ChatContainer } from './ChatContainer';
25
+ import { corePlugins } from '@dxos/plugin-testing';
25
26
 
26
27
  faker.seed(1);
27
28
 
@@ -41,28 +42,26 @@ const DefaultStory = () => {
41
42
  }, [identity]);
42
43
 
43
44
  if (!identity || !channel || !space || !channel.defaultThread.target) {
44
- return null;
45
+ return <Loading data={{ identity: !!identity, space: !!space, channel: !!channel }} />;
45
46
  }
46
47
 
47
- return (
48
- <main className='is-full max-is-proseMaxWidth mli-auto bs-full overflow-hidden'>
49
- <ChatContainer space={space} thread={channel.defaultThread.target} />
50
- </main>
51
- );
48
+ return <ChatContainer space={space} thread={channel.defaultThread.target} />;
52
49
  };
53
50
 
54
51
  const meta = {
55
- title: 'plugins/plugin-thread/Chat',
52
+ title: 'plugins/plugin-thread/containers/ChatContainer',
56
53
  component: ThreadComponent.Root as any,
57
- render: render(DefaultStory),
54
+ render: DefaultStory,
58
55
  decorators: [
59
- withTheme,
56
+ withLayout({ layout: 'column' }),
57
+ // TODO(wittjosiah): This shouldn't depend on app framework (use withClientProvider instead).
58
+ // Currently this is required due to useOnEditAnalytics.
60
59
  withPluginManager({
61
- plugins: [OperationPlugin()],
60
+ plugins: corePlugins(),
62
61
  capabilities: [
63
62
  Capability.contributes(
64
- Common.Capability.ReactSurface,
65
- Common.createSurface({
63
+ Capabilities.ReactSurface,
64
+ Surface.create({
66
65
  id: 'test',
67
66
  role: 'card',
68
67
  component: ({ role }) => <span>{JSON.stringify({ role })}</span>,
@@ -70,7 +69,10 @@ const meta = {
70
69
  ),
71
70
  ],
72
71
  }),
73
- withClientProvider({ createSpace: true, types: [Thread.Thread, Channel.Channel, Message.Message] }),
72
+ withClientProvider({
73
+ createSpace: true,
74
+ types: [Thread.Thread, Channel.Channel, Message.Message],
75
+ }),
74
76
  ],
75
77
  parameters: {
76
78
  layout: 'fullscreen',
@@ -0,0 +1,130 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import React, { useLayoutEffect, useMemo, useRef, useState } from 'react';
6
+
7
+ import { Obj, Ref } from '@dxos/echo';
8
+ import { type Space, useMembers } from '@dxos/react-client/echo';
9
+ import { useIdentity } from '@dxos/react-client/halo';
10
+ import { ScrollArea, type ThemedClassName, useThemeContext, useTranslation } from '@dxos/react-ui';
11
+ import {
12
+ MessageTextbox,
13
+ type MessageTextboxProps,
14
+ Thread as ThreadComponent,
15
+ type ThreadRootProps,
16
+ threadLayout,
17
+ } from '@dxos/react-ui-thread';
18
+ import { Message, type Thread } from '@dxos/types';
19
+ import { createBasicExtensions, createThemeExtensions, listener } from '@dxos/ui-editor';
20
+ import { composable, composableProps, mx } from '@dxos/ui-theme';
21
+ import { isNonNullable } from '@dxos/util';
22
+
23
+ import { MessagePanel } from '#components';
24
+ import { command } from '../../extensions';
25
+ import { useStatus } from '#hooks';
26
+ import { meta } from '#meta';
27
+ import { getMessageMetadata } from '../../util';
28
+
29
+ export type ChatContainerProps = ThemedClassName<
30
+ {
31
+ space: Space;
32
+ thread: Thread.Thread;
33
+ context?: Obj.Unknown;
34
+ autoFocusTextbox?: boolean;
35
+ } & Pick<ThreadRootProps, 'current'>
36
+ >;
37
+
38
+ export const ChatContainer = composable<HTMLDivElement, ChatContainerProps>(
39
+ ({ space, thread, context, autoFocusTextbox, current, ...props }, forwardedRef) => {
40
+ const { t } = useTranslation(meta.id);
41
+ const { themeMode } = useThemeContext();
42
+
43
+ const id = Obj.getDXN(thread).toString();
44
+ const identity = useIdentity()!;
45
+ const members = useMembers(space?.id);
46
+ const activity = useStatus(space, id);
47
+ const [autoFocus, setAutoFocus] = useState(autoFocusTextbox);
48
+ const threadScrollRef = useRef<HTMLDivElement | null>(null);
49
+
50
+ // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.
51
+ const [_count, _setCount] = useState(0);
52
+ const rerenderEditor = () => _setCount((count) => count + 1);
53
+
54
+ const textboxMetadata = getMessageMetadata(id, identity);
55
+ const messageRef = useRef('');
56
+ const extensions = useMemo(
57
+ () => [
58
+ createBasicExtensions({ placeholder: t('message.placeholder') }),
59
+ createThemeExtensions({ themeMode }),
60
+ listener({ onChange: ({ text }) => (messageRef.current = text) }),
61
+ command,
62
+ ],
63
+ [themeMode, _count],
64
+ );
65
+
66
+ // TODO(thure): Factor out.
67
+ // TODO(thure): `flex-col-reverse` does not work to start the container scrolled to the end while also using
68
+ // `ScrollArea`. This is the least-bad way I found to scroll to the end on mount. Note that 0ms was insufficient
69
+ // for the desired effect; this is likely hardware-dependent and should be reevaluated.
70
+ const scrollToEnd = (behavior: ScrollBehavior) =>
71
+ setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);
72
+
73
+ useLayoutEffect(() => {
74
+ scrollToEnd('instant');
75
+ }, []);
76
+
77
+ // TODO(burdon): Change to model.
78
+ const handleCreate: MessageTextboxProps['onSend'] = () => {
79
+ if (!messageRef.current?.length) {
80
+ return false;
81
+ }
82
+
83
+ Obj.change(thread, (obj) => {
84
+ obj.messages.push(
85
+ Ref.make(
86
+ Obj.make(Message.Message, {
87
+ created: new Date().toISOString(),
88
+ sender: { identityDid: identity.did },
89
+ blocks: [{ _tag: 'text', text: messageRef.current }],
90
+ properties: context ? { context: Ref.make(context) } : undefined,
91
+ }),
92
+ ),
93
+ );
94
+ });
95
+
96
+ messageRef.current = '';
97
+ setAutoFocus(true);
98
+ scrollToEnd('smooth');
99
+ rerenderEditor();
100
+ return true;
101
+ };
102
+
103
+ return (
104
+ <ThreadComponent.Root
105
+ {...composableProps(props, {
106
+ classNames: 'dx-container grid-rows-[1fr_min-content_min-content]',
107
+ })}
108
+ id={id}
109
+ current={current}
110
+ ref={forwardedRef}
111
+ >
112
+ <ScrollArea.Root classNames='col-span-2' orientation='vertical'>
113
+ <ScrollArea.Viewport ref={threadScrollRef}>
114
+ <div role='none' className={mx(threadLayout, 'place-self-end')}>
115
+ {thread.messages
116
+ .map((message) => message.target)
117
+ .filter(isNonNullable)
118
+ .map((message) => (
119
+ <MessagePanel key={message.id} message={message} members={members} />
120
+ ))}
121
+ </div>
122
+ </ScrollArea.Viewport>
123
+ </ScrollArea.Root>
124
+
125
+ <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleCreate} {...textboxMetadata} />
126
+ <ThreadComponent.Status activity={activity}>{t('activity.message')}</ThreadComponent.Status>
127
+ </ThreadComponent.Root>
128
+ );
129
+ },
130
+ );
@@ -0,0 +1,8 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { ChatContainer } from './ChatContainer';
6
+
7
+ export { ChatContainer };
8
+ export default ChatContainer;
@@ -5,30 +5,40 @@
5
5
  import { useAtomValue } from '@effect-atom/atom-react';
6
6
  import React, { useCallback, useMemo } from 'react';
7
7
 
8
- import { Common } from '@dxos/app-framework';
9
- import { useCapabilities, useCapability, useOperationInvoker } from '@dxos/app-framework/react';
8
+ import { Capabilities } from '@dxos/app-framework';
9
+ import { useCapabilities, useCapability, useOperationInvoker, usePluginManager } from '@dxos/app-framework/ui';
10
+ import { AppCapabilities, CollaborationOperation, LayoutOperation } from '@dxos/app-toolkit';
10
11
  import { Filter, Obj, Query, Relation } from '@dxos/echo';
11
12
  import { Ref, useQuery } from '@dxos/react-client/echo';
12
13
  import { useIdentity } from '@dxos/react-client/halo';
13
- import { useTranslation } from '@dxos/react-ui';
14
- import { useAttended } from '@dxos/react-ui-attention';
15
- import { Layout } from '@dxos/react-ui-mosaic';
14
+ import { Panel, ScrollArea, Toolbar, useTranslation } from '@dxos/react-ui';
15
+ import { getParentId, useAttention } from '@dxos/react-ui-attention';
16
16
  import { Tabs } from '@dxos/react-ui-tabs';
17
17
  import { AnchoredTo, Thread } from '@dxos/types';
18
- import { mx } from '@dxos/ui-theme';
19
18
 
20
- import { CommentsContainer, type CommentsContainerProps } from '../components';
21
- import { meta } from '../meta';
22
- import { ThreadCapabilities, ThreadOperation, type ViewState } from '../types';
19
+ import { CommentsPanel, type CommentsPanelProps } from '#components';
20
+ import { meta } from '#meta';
21
+ import { ThreadCapabilities, type ViewState } from '#types';
22
+ import { ThreadOperation } from '#operations';
23
+ import { ObjectSurfaceProps } from '@dxos/app-toolkit/ui';
23
24
 
24
25
  const initialViewState: ViewState = { showResolvedThreads: false };
25
26
 
26
- export const ThreadCompanion = ({ subject }: { subject: any }) => {
27
+ export type ThreadCompanionProps = ObjectSurfaceProps<
28
+ Thread.Thread,
29
+ {
30
+ attendableId?: string;
31
+ }
32
+ >;
33
+
34
+ export const ThreadCompanion = ({ attendableId, subject }: ThreadCompanionProps) => {
27
35
  const { t } = useTranslation(meta.id);
36
+ const manager = usePluginManager();
28
37
  const { invokePromise } = useOperationInvoker();
29
38
  const identity = useIdentity();
30
39
  const subjectId = Obj.getDXN(subject).toString();
31
- const registry = useCapability(Common.Capability.AtomRegistry);
40
+ const parentId = attendableId ? getParentId(attendableId) : undefined;
41
+ const registry = useCapability(Capabilities.AtomRegistry);
32
42
 
33
43
  const stateAtom = useCapability(ThreadCapabilities.State);
34
44
  const viewStoreAtom = useCapability(ThreadCapabilities.ViewState);
@@ -56,7 +66,7 @@ export const ThreadCompanion = ({ subject }: { subject: any }) => {
56
66
  [registry, viewStoreAtom, subjectId],
57
67
  );
58
68
 
59
- const anchorSorts = useCapabilities(Common.Capability.AnchorSort);
69
+ const anchorSorts = useCapabilities(AppCapabilities.AnchorSort);
60
70
  const sort = useMemo(
61
71
  () => anchorSorts.find(({ key }) => key === Obj.getTypename(subject))?.sort,
62
72
  [anchorSorts, subject],
@@ -69,7 +79,8 @@ export const ThreadCompanion = ({ subject }: { subject: any }) => {
69
79
  .filter((anchor) => Obj.instanceOf(Thread.Thread, Relation.getSource(anchor)))
70
80
  .concat(drafts ?? []);
71
81
 
72
- const attended = useAttended();
82
+ const { hasAttention, isAncestor, isRelated } = useAttention(parentId);
83
+ const isAttended = hasAttention || isAncestor || isRelated;
73
84
 
74
85
  const handleAttend = useCallback(
75
86
  (anchor: AnchoredTo.AnchoredTo) => {
@@ -79,17 +90,26 @@ export const ThreadCompanion = ({ subject }: { subject: any }) => {
79
90
  if (state.current !== threadId) {
80
91
  registry.set(stateAtom, { ...registry.get(stateAtom), current: threadId });
81
92
 
82
- // TODO(wittjosiah): Should this be a thread-specific intent?
83
- // The layout doesn't know about threads and this working depends on other plugins conditionally handling it.
84
- // This may be overloading this intent or highjacking its intended purpose.
85
- void invokePromise(Common.LayoutOperation.ScrollIntoView, {
86
- subject: Obj.getDXN(subject).toString(),
87
- cursor: anchor.anchor,
88
- ref: threadId,
89
- });
93
+ // Scroll plank into view (deck handler).
94
+ void invokePromise(LayoutOperation.ScrollIntoView, { subject: parentId });
95
+
96
+ // Scroll within content to anchor (metadata-driven, per typename).
97
+ if (anchor.anchor && parentId) {
98
+ const typename = Obj.getTypename(subject);
99
+ const metadata = manager.capabilities
100
+ .getAll(AppCapabilities.Metadata)
101
+ .find(({ id }) => id === typename)?.metadata;
102
+ if (metadata?.scrollToAnchor) {
103
+ void invokePromise(metadata.scrollToAnchor, {
104
+ subject: parentId,
105
+ cursor: anchor.anchor,
106
+ ref: threadId,
107
+ });
108
+ }
109
+ }
90
110
  }
91
111
  },
92
- [state.current, invokePromise, subject, registry, stateAtom],
112
+ [state.current, invokePromise, registry, stateAtom, parentId, subject, manager],
93
113
  );
94
114
 
95
115
  const handleComment = useCallback(
@@ -130,7 +150,7 @@ export const ThreadCompanion = ({ subject }: { subject: any }) => {
130
150
  [invokePromise, subject],
131
151
  );
132
152
 
133
- const handleAcceptProposal = useCallback<NonNullable<CommentsContainerProps['onAcceptProposal']>>(
153
+ const handleAcceptProposal = useCallback<NonNullable<CommentsPanelProps['onAcceptProposal']>>(
134
154
  async (anchor, messageId) => {
135
155
  const thread = Relation.getSource(anchor) as Thread.Thread;
136
156
  const messageIndex = thread.messages.findIndex(Ref.hasObjectId(messageId));
@@ -140,7 +160,7 @@ export const ThreadCompanion = ({ subject }: { subject: any }) => {
140
160
  return;
141
161
  }
142
162
 
143
- await invokePromise(Common.CollaborationOperation.AcceptProposal, {
163
+ await invokePromise(CollaborationOperation.AcceptProposal, {
144
164
  subject,
145
165
  anchor: anchor.anchor,
146
166
  proposal,
@@ -151,9 +171,9 @@ export const ThreadCompanion = ({ subject }: { subject: any }) => {
151
171
  );
152
172
 
153
173
  const comments = (
154
- <CommentsContainer
174
+ <CommentsPanel
155
175
  anchors={anchors}
156
- currentId={attended.includes(subjectId) ? state.current : undefined}
176
+ currentId={isAttended ? state.current : undefined}
157
177
  showResolvedThreads={showResolvedThreads}
158
178
  onAttend={handleAttend}
159
179
  onComment={handleComment}
@@ -165,29 +185,33 @@ export const ThreadCompanion = ({ subject }: { subject: any }) => {
165
185
  );
166
186
 
167
187
  return (
168
- <Layout.Main toolbar>
169
- <Tabs.Root
170
- value={showResolvedThreads ? 'all' : 'unresolved'}
171
- orientation='horizontal'
172
- classNames={[
173
- 'contents [&_[role="tabpanel"]]:min-bs-0 [&_[role="tabpanel"]]:overflow-y-auto [&_[role="tabpanel"]]:scrollbar-thin',
174
- ]}
175
- onValueChange={onChangeViewState}
176
- >
177
- {/* TODO(burdon): Standardize (like Tollbar). */}
178
- <Tabs.Tablist classNames={mx('bg-toolbarSurface border-be border-subduedSeparator')}>
179
- <Tabs.Tab value='unresolved' classNames='text-sm'>
180
- {t('show unresolved label')}
181
- </Tabs.Tab>
182
- <Tabs.Tab value='all' classNames='text-sm'>
183
- {t('show all label')}
184
- </Tabs.Tab>
185
- </Tabs.Tablist>
186
- <div className='overflow-y-auto'>
187
- <Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>
188
- <Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>
189
- </div>
190
- </Tabs.Root>
191
- </Layout.Main>
188
+ <Tabs.Root
189
+ orientation='horizontal'
190
+ value={showResolvedThreads ? 'all' : 'unresolved'}
191
+ onValueChange={onChangeViewState}
192
+ >
193
+ <Panel.Root>
194
+ <Panel.Toolbar asChild>
195
+ <Toolbar.Root>
196
+ <Tabs.Tablist classNames='p-0'>
197
+ <Tabs.Tab classNames='text-sm' value='unresolved'>
198
+ {t('show-unresolved.label')}
199
+ </Tabs.Tab>
200
+ <Tabs.Tab classNames='text-sm' value='all'>
201
+ {t('show-all.label')}
202
+ </Tabs.Tab>
203
+ </Tabs.Tablist>
204
+ </Toolbar.Root>
205
+ </Panel.Toolbar>
206
+ <Panel.Content asChild>
207
+ <ScrollArea.Root thin>
208
+ <ScrollArea.Viewport>
209
+ <Tabs.Panel value='all'>{showResolvedThreads && comments}</Tabs.Panel>
210
+ <Tabs.Panel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Panel>
211
+ </ScrollArea.Viewport>
212
+ </ScrollArea.Root>
213
+ </Panel.Content>
214
+ </Panel.Root>
215
+ </Tabs.Root>
192
216
  );
193
217
  };
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { ThreadCompanion } from './ThreadCompanion';
6
+
7
+ export default ThreadCompanion;
@@ -0,0 +1,11 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type ComponentType, lazy } from 'react';
6
+
7
+ export const CallDebugPanel: ComponentType<any> = lazy(() => import('./CallDebugPanel'));
8
+ export const CallSidebar: ComponentType<any> = lazy(() => import('./CallSidebar'));
9
+ export const ChannelContainer: ComponentType<any> = lazy(() => import('./ChannelContainer'));
10
+ export const ChatContainer: ComponentType<any> = lazy(() => import('./ChatContainer'));
11
+ export const ThreadCompanion: ComponentType<any> = lazy(() => import('./ThreadCompanion'));
@@ -29,7 +29,7 @@ const parser = StreamLanguage.define<{ count: number }>({
29
29
  const styles = HighlightStyle.define([
30
30
  {
31
31
  tag: tags.tagName,
32
- class: mx('dx-tag dx-tag--indigo text-baseText font-medium'),
32
+ class: mx('dx-tag dx-tag--indigo text-base-surface-text font-medium'),
33
33
  },
34
34
  ]);
35
35