@dxos/plugin-thread 0.8.4-main.937b3ca → 0.8.4-main.9be5663bfe

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 (446) hide show
  1. package/dist/lib/browser/add-message-A33GVGQX.mjs +97 -0
  2. package/dist/lib/browser/add-message-A33GVGQX.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-2QNKWX4H.mjs +259 -0
  6. package/dist/lib/browser/chunk-2QNKWX4H.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-7T7J6ZR6.mjs +61 -0
  8. package/dist/lib/browser/chunk-7T7J6ZR6.mjs.map +7 -0
  9. package/dist/lib/browser/create-N2ZVTONJ.mjs +55 -0
  10. package/dist/lib/browser/create-N2ZVTONJ.mjs.map +7 -0
  11. package/dist/lib/browser/create-channel-Y4H3535D.mjs +21 -0
  12. package/dist/lib/browser/create-channel-Y4H3535D.mjs.map +7 -0
  13. package/dist/lib/browser/create-channel-thread-6N7TKEAW.mjs +28 -0
  14. package/dist/lib/browser/create-channel-thread-6N7TKEAW.mjs.map +7 -0
  15. package/dist/lib/browser/create-proposals-VTOSWUOX.mjs +57 -0
  16. package/dist/lib/browser/create-proposals-VTOSWUOX.mjs.map +7 -0
  17. package/dist/lib/browser/delete-QZZE655Y.mjs +59 -0
  18. package/dist/lib/browser/delete-QZZE655Y.mjs.map +7 -0
  19. package/dist/lib/browser/delete-message-WQAZLYBO.mjs +64 -0
  20. package/dist/lib/browser/delete-message-WQAZLYBO.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-2UGS234J.mjs +25 -0
  25. package/dist/lib/browser/on-create-space-2UGS234J.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-KKQHFLYO.mjs +33 -0
  29. package/dist/lib/browser/restore-KKQHFLYO.mjs.map +7 -0
  30. package/dist/lib/browser/restore-message-VOP2UE7N.mjs +42 -0
  31. package/dist/lib/browser/restore-message-VOP2UE7N.mjs.map +7 -0
  32. package/dist/lib/browser/select-VBJ3MBLN.mjs +26 -0
  33. package/dist/lib/browser/select-VBJ3MBLN.mjs.map +7 -0
  34. package/dist/lib/browser/toggle-resolved-GIYF3KWJ.mjs +45 -0
  35. package/dist/lib/browser/toggle-resolved-GIYF3KWJ.mjs.map +7 -0
  36. package/dist/lib/browser/types/index.mjs +5 -7
  37. package/dist/lib/node-esm/add-message-E6XC6E3Z.mjs +98 -0
  38. package/dist/lib/node-esm/add-message-E6XC6E3Z.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-I6LAZYVU.mjs +260 -0
  42. package/dist/lib/node-esm/chunk-I6LAZYVU.mjs.map +7 -0
  43. package/dist/lib/node-esm/chunk-UGSMYQLZ.mjs +62 -0
  44. package/dist/lib/node-esm/chunk-UGSMYQLZ.mjs.map +7 -0
  45. package/dist/lib/node-esm/create-A6XQZR7M.mjs +56 -0
  46. package/dist/lib/node-esm/create-A6XQZR7M.mjs.map +7 -0
  47. package/dist/lib/node-esm/create-channel-KA5T23ZS.mjs +22 -0
  48. package/dist/lib/node-esm/create-channel-KA5T23ZS.mjs.map +7 -0
  49. package/dist/lib/node-esm/create-channel-thread-44PXAPGM.mjs +29 -0
  50. package/dist/lib/node-esm/create-channel-thread-44PXAPGM.mjs.map +7 -0
  51. package/dist/lib/node-esm/create-proposals-HDBVDNUX.mjs +58 -0
  52. package/dist/lib/node-esm/create-proposals-HDBVDNUX.mjs.map +7 -0
  53. package/dist/lib/node-esm/delete-3RAWD5GG.mjs +60 -0
  54. package/dist/lib/node-esm/delete-3RAWD5GG.mjs.map +7 -0
  55. package/dist/lib/node-esm/delete-message-W4XFE4KW.mjs +65 -0
  56. package/dist/lib/node-esm/delete-message-W4XFE4KW.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-ZURB6UKR.mjs +26 -0
  61. package/dist/lib/node-esm/on-create-space-ZURB6UKR.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-PDYEKDE3.mjs +34 -0
  65. package/dist/lib/node-esm/restore-PDYEKDE3.mjs.map +7 -0
  66. package/dist/lib/node-esm/restore-message-O5XC34MW.mjs +43 -0
  67. package/dist/lib/node-esm/restore-message-O5XC34MW.mjs.map +7 -0
  68. package/dist/lib/node-esm/select-6KETLVWY.mjs +27 -0
  69. package/dist/lib/node-esm/select-6KETLVWY.mjs.map +7 -0
  70. package/dist/lib/node-esm/toggle-resolved-QR3SOXR7.mjs +46 -0
  71. package/dist/lib/node-esm/toggle-resolved-QR3SOXR7.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/util/calls-service.d.ts.map +1 -1
  79. package/dist/types/src/calls-service.stories.d.ts +2 -2
  80. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/app-graph-builder.d.ts +6 -0
  82. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  83. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  84. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  85. package/dist/types/src/capabilities/call-manager.d.ts +6 -0
  86. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -0
  87. package/dist/types/src/capabilities/index.d.ts +15 -10
  88. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/markdown.d.ts +5 -0
  90. package/dist/types/src/capabilities/markdown.d.ts.map +1 -0
  91. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  92. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  93. package/dist/types/src/capabilities/{react-root/react-root.d.ts → react-root.d.ts} +1 -1
  94. package/dist/types/src/capabilities/react-root.d.ts.map +1 -0
  95. package/dist/types/src/capabilities/react-surface.d.ts +5 -0
  96. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  97. package/dist/types/src/capabilities/settings.d.ts +6 -0
  98. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  99. package/dist/types/src/capabilities/state.d.ts +7 -0
  100. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  101. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  102. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  103. package/dist/types/src/components/Call/Toolbar.d.ts +1 -1
  104. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  105. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts +13 -0
  106. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
  107. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +160 -0
  108. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -0
  109. package/dist/types/src/components/{CommentsThreadContainer.d.ts → CommentsPanel/CommentsThread.d.ts} +3 -3
  110. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -0
  111. package/dist/types/src/components/CommentsPanel/index.d.ts +3 -0
  112. package/dist/types/src/components/CommentsPanel/index.d.ts.map +1 -0
  113. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  114. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  115. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts +15 -0
  116. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -0
  117. package/dist/types/src/components/MessagePanel/index.d.ts +2 -0
  118. package/dist/types/src/components/MessagePanel/index.d.ts.map +1 -0
  119. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  120. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  121. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +1 -1
  122. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +142 -144
  123. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  124. package/dist/types/src/components/ResponsiveGrid/{ResponsiveContainer.d.ts → ResponsivePanel.d.ts} +4 -4
  125. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts.map +1 -0
  126. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts +164 -0
  127. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts.map +1 -0
  128. package/dist/types/src/components/ResponsiveGrid/index.d.ts +1 -1
  129. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +1 -1
  130. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts +6 -0
  131. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -0
  132. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +161 -0
  133. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -0
  134. package/dist/types/src/components/ThreadSettings/index.d.ts +2 -0
  135. package/dist/types/src/components/ThreadSettings/index.d.ts.map +1 -0
  136. package/dist/types/src/components/index.d.ts +4 -9
  137. package/dist/types/src/components/index.d.ts.map +1 -1
  138. package/dist/types/src/{components → containers/CallDebugPanel}/CallDebugPanel.d.ts +1 -1
  139. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +1 -0
  140. package/dist/types/src/containers/CallDebugPanel/index.d.ts +2 -0
  141. package/dist/types/src/containers/CallDebugPanel/index.d.ts.map +1 -0
  142. package/dist/types/src/{components → containers/CallSidebar}/CallSidebar.d.ts +0 -1
  143. package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts.map +1 -0
  144. package/dist/types/src/containers/CallSidebar/index.d.ts +2 -0
  145. package/dist/types/src/containers/CallSidebar/index.d.ts.map +1 -0
  146. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +12 -0
  147. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +1 -0
  148. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +162 -0
  149. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +1 -0
  150. package/dist/types/src/containers/ChannelContainer/index.d.ts +2 -0
  151. package/dist/types/src/containers/ChannelContainer/index.d.ts.map +1 -0
  152. package/dist/types/src/{components → containers/ChatContainer}/ChatContainer.d.ts +3 -5
  153. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +1 -0
  154. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts +162 -0
  155. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts.map +1 -0
  156. package/dist/types/src/containers/ChatContainer/index.d.ts +4 -0
  157. package/dist/types/src/containers/ChatContainer/index.d.ts.map +1 -0
  158. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts +8 -0
  159. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -0
  160. package/dist/types/src/containers/ThreadCompanion/index.d.ts +2 -0
  161. package/dist/types/src/containers/ThreadCompanion/index.d.ts.map +1 -0
  162. package/dist/types/src/containers/index.d.ts +7 -0
  163. package/dist/types/src/containers/index.d.ts.map +1 -0
  164. package/dist/types/src/{components/command-extension.d.ts → extensions/command.d.ts} +1 -1
  165. package/dist/types/src/extensions/command.d.ts.map +1 -0
  166. package/dist/types/src/extensions/index.d.ts +1 -0
  167. package/dist/types/src/extensions/index.d.ts.map +1 -1
  168. package/dist/types/src/extensions/threads.d.ts +1 -1
  169. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  170. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  171. package/dist/types/src/operations/add-message.d.ts +5 -0
  172. package/dist/types/src/operations/add-message.d.ts.map +1 -0
  173. package/dist/types/src/operations/create-channel-thread.d.ts +5 -0
  174. package/dist/types/src/operations/create-channel-thread.d.ts.map +1 -0
  175. package/dist/types/src/operations/create-channel.d.ts +5 -0
  176. package/dist/types/src/operations/create-channel.d.ts.map +1 -0
  177. package/dist/types/src/operations/create-proposals.d.ts +5 -0
  178. package/dist/types/src/operations/create-proposals.d.ts.map +1 -0
  179. package/dist/types/src/operations/create.d.ts +5 -0
  180. package/dist/types/src/operations/create.d.ts.map +1 -0
  181. package/dist/types/src/operations/definitions.d.ts +2789 -0
  182. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  183. package/dist/types/src/operations/delete-message.d.ts +5 -0
  184. package/dist/types/src/operations/delete-message.d.ts.map +1 -0
  185. package/dist/types/src/operations/delete.d.ts +5 -0
  186. package/dist/types/src/operations/delete.d.ts.map +1 -0
  187. package/dist/types/src/operations/index.d.ts +4 -0
  188. package/dist/types/src/operations/index.d.ts.map +1 -0
  189. package/dist/types/src/operations/on-create-space.d.ts +5 -0
  190. package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
  191. package/dist/types/src/operations/restore-message.d.ts +5 -0
  192. package/dist/types/src/operations/restore-message.d.ts.map +1 -0
  193. package/dist/types/src/operations/restore.d.ts +5 -0
  194. package/dist/types/src/operations/restore.d.ts.map +1 -0
  195. package/dist/types/src/operations/select.d.ts +5 -0
  196. package/dist/types/src/operations/select.d.ts.map +1 -0
  197. package/dist/types/src/operations/toggle-resolved.d.ts +5 -0
  198. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -0
  199. package/dist/types/src/{components/testing.d.ts → testing/data.d.ts} +1 -1
  200. package/dist/types/src/testing/data.d.ts.map +1 -0
  201. package/dist/types/src/testing/stories.d.ts.map +1 -1
  202. package/dist/types/src/translations.d.ts +140 -142
  203. package/dist/types/src/translations.d.ts.map +1 -1
  204. package/dist/types/src/types/Channel.d.ts +439 -423
  205. package/dist/types/src/types/Channel.d.ts.map +1 -1
  206. package/dist/types/src/types/Settings.d.ts +4 -0
  207. package/dist/types/src/types/Settings.d.ts.map +1 -0
  208. package/dist/types/src/types/capabilities.d.ts.map +1 -1
  209. package/dist/types/src/types/types.d.ts +1 -3227
  210. package/dist/types/src/types/types.d.ts.map +1 -1
  211. package/dist/types/src/util.d.ts.map +1 -1
  212. package/dist/types/tsconfig.tsbuildinfo +1 -1
  213. package/package.json +88 -66
  214. package/src/ThreadPlugin.tsx +54 -56
  215. package/src/blueprints/index.ts +1 -1
  216. package/src/blueprints/thread-blueprint.ts +13 -8
  217. package/src/calls/util/calls-service.ts +0 -1
  218. package/src/calls-service.stories.tsx +10 -9
  219. package/src/capabilities/{app-graph-builder/app-graph-builder.ts → app-graph-builder.ts} +42 -50
  220. package/src/capabilities/blueprint-definition.ts +17 -0
  221. package/src/capabilities/{call-manager/call-manager.ts → call-manager.ts} +6 -5
  222. package/src/capabilities/index.ts +16 -10
  223. package/src/capabilities/{markdown/markdown.ts → markdown.ts} +14 -15
  224. package/src/capabilities/operation-handler.ts +16 -0
  225. package/src/capabilities/{react-root/react-root.tsx → react-root.tsx} +4 -4
  226. package/src/capabilities/react-surface.tsx +90 -0
  227. package/src/capabilities/{settings/settings.ts → settings.ts} +9 -7
  228. package/src/capabilities/{state/state.ts → state.ts} +1 -1
  229. package/src/capabilities/undo-mappings.ts +46 -0
  230. package/src/components/Call/Call.tsx +5 -5
  231. package/src/components/Call/Toolbar.tsx +30 -21
  232. package/src/components/{Comments.stories.tsx → CommentsPanel/CommentsPanel.stories.tsx} +16 -16
  233. package/src/components/{CommentsContainer.tsx → CommentsPanel/CommentsPanel.tsx} +15 -14
  234. package/src/components/{CommentsThreadContainer.tsx → CommentsPanel/CommentsThread.tsx} +19 -20
  235. package/src/components/CommentsPanel/index.ts +6 -0
  236. package/src/components/Lobby/Lobby.tsx +8 -7
  237. package/src/components/Media/VideoObject.stories.tsx +6 -7
  238. package/src/components/Media/VideoObject.tsx +1 -1
  239. package/src/components/{MessageContainer.tsx → MessagePanel/MessagePanel.tsx} +24 -18
  240. package/src/components/MessagePanel/index.ts +5 -0
  241. package/src/components/Participant/Participant.tsx +3 -2
  242. package/src/components/Participant/ParticipantGrid.tsx +0 -1
  243. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +10 -11
  244. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +8 -8
  245. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +9 -9
  246. package/src/components/ResponsiveGrid/{ResponsiveContainer.stories.tsx → ResponsivePanel.stories.tsx} +7 -8
  247. package/src/components/ResponsiveGrid/{ResponsiveContainer.tsx → ResponsivePanel.tsx} +5 -5
  248. package/src/components/ResponsiveGrid/index.ts +1 -1
  249. package/src/components/ThreadSettings/ThreadSettings.stories.tsx +31 -0
  250. package/src/components/ThreadSettings/ThreadSettings.tsx +20 -0
  251. package/src/components/ThreadSettings/index.ts +5 -0
  252. package/src/components/index.ts +5 -9
  253. package/src/{components → containers/CallDebugPanel}/CallDebugPanel.tsx +8 -7
  254. package/src/containers/CallDebugPanel/index.ts +5 -0
  255. package/src/{components → containers/CallSidebar}/CallSidebar.tsx +4 -6
  256. package/src/containers/CallSidebar/index.ts +5 -0
  257. package/src/{components → containers/ChannelContainer}/ChannelContainer.stories.tsx +14 -14
  258. package/src/{components → containers/ChannelContainer}/ChannelContainer.tsx +75 -59
  259. package/src/containers/ChannelContainer/index.ts +5 -0
  260. package/src/{components/Chat.stories.tsx → containers/ChatContainer/ChatContainer.stories.tsx} +22 -20
  261. package/src/containers/ChatContainer/ChatContainer.tsx +131 -0
  262. package/src/containers/ChatContainer/index.ts +8 -0
  263. package/src/{components → containers/ThreadCompanion}/ThreadCompanion.tsx +74 -50
  264. package/src/containers/ThreadCompanion/index.ts +5 -0
  265. package/src/containers/index.ts +11 -0
  266. package/src/{components/command-extension.ts → extensions/command.ts} +1 -1
  267. package/src/extensions/index.ts +1 -0
  268. package/src/extensions/threads.ts +14 -13
  269. package/src/hooks/analytics.ts +3 -2
  270. package/src/meta.ts +2 -2
  271. package/src/operations/add-message.ts +81 -0
  272. package/src/operations/create-channel-thread.ts +26 -0
  273. package/src/operations/create-channel.ts +20 -0
  274. package/src/operations/create-proposals.ts +49 -0
  275. package/src/operations/create.ts +48 -0
  276. package/src/operations/definitions.ts +177 -0
  277. package/src/operations/delete-message.ts +53 -0
  278. package/src/operations/delete.ts +63 -0
  279. package/src/operations/index.ts +22 -0
  280. package/src/operations/on-create-space.ts +27 -0
  281. package/src/operations/restore-message.ts +38 -0
  282. package/src/operations/restore.ts +38 -0
  283. package/src/operations/select.ts +24 -0
  284. package/src/operations/toggle-resolved.ts +41 -0
  285. package/src/{components/testing.ts → testing/data.ts} +7 -7
  286. package/src/testing/stories.ts +7 -11
  287. package/src/translations.ts +72 -76
  288. package/src/types/Channel.ts +11 -4
  289. package/src/types/Settings.ts +10 -0
  290. package/src/types/capabilities.ts +9 -7
  291. package/src/types/types.ts +2 -184
  292. package/src/util.ts +1 -1
  293. package/dist/lib/browser/app-graph-builder-SPAZN5XL.mjs +0 -188
  294. package/dist/lib/browser/app-graph-builder-SPAZN5XL.mjs.map +0 -7
  295. package/dist/lib/browser/blueprint-definition-UQ63QKQG.mjs +0 -17
  296. package/dist/lib/browser/blueprint-definition-UQ63QKQG.mjs.map +0 -7
  297. package/dist/lib/browser/call-manager-YBRTG6T3.mjs +0 -26
  298. package/dist/lib/browser/call-manager-YBRTG6T3.mjs.map +0 -7
  299. package/dist/lib/browser/chunk-CP7E2HRE.mjs +0 -31
  300. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +0 -7
  301. package/dist/lib/browser/chunk-DLO2G3DM.mjs +0 -184
  302. package/dist/lib/browser/chunk-DLO2G3DM.mjs.map +0 -7
  303. package/dist/lib/browser/chunk-ERK254BS.mjs +0 -1810
  304. package/dist/lib/browser/chunk-ERK254BS.mjs.map +0 -7
  305. package/dist/lib/browser/chunk-ISCHODBV.mjs +0 -106
  306. package/dist/lib/browser/chunk-ISCHODBV.mjs.map +0 -7
  307. package/dist/lib/browser/chunk-TAWDJPMD.mjs +0 -293
  308. package/dist/lib/browser/chunk-TAWDJPMD.mjs.map +0 -7
  309. package/dist/lib/browser/chunk-VZICDGBW.mjs +0 -1813
  310. package/dist/lib/browser/chunk-VZICDGBW.mjs.map +0 -7
  311. package/dist/lib/browser/chunk-ZFLSTQSE.mjs +0 -106
  312. package/dist/lib/browser/chunk-ZFLSTQSE.mjs.map +0 -7
  313. package/dist/lib/browser/markdown-TSXOA3GV.mjs +0 -210
  314. package/dist/lib/browser/markdown-TSXOA3GV.mjs.map +0 -7
  315. package/dist/lib/browser/operation-resolver-MDMEBYH2.mjs +0 -441
  316. package/dist/lib/browser/operation-resolver-MDMEBYH2.mjs.map +0 -7
  317. package/dist/lib/browser/react-root-Q7U5D3DA.mjs +0 -25
  318. package/dist/lib/browser/react-root-Q7U5D3DA.mjs.map +0 -7
  319. package/dist/lib/browser/react-surface-WDZQSDWH.mjs +0 -110
  320. package/dist/lib/browser/react-surface-WDZQSDWH.mjs.map +0 -7
  321. package/dist/lib/browser/repair-TDKAFAGH.mjs +0 -38
  322. package/dist/lib/browser/repair-TDKAFAGH.mjs.map +0 -7
  323. package/dist/lib/browser/settings-OOKKVXV7.mjs +0 -32
  324. package/dist/lib/browser/settings-OOKKVXV7.mjs.map +0 -7
  325. package/dist/lib/browser/state-3LKZHDRI.mjs +0 -24
  326. package/dist/lib/browser/state-3LKZHDRI.mjs.map +0 -7
  327. package/dist/lib/node-esm/app-graph-builder-3LJAPDUW.mjs +0 -189
  328. package/dist/lib/node-esm/app-graph-builder-3LJAPDUW.mjs.map +0 -7
  329. package/dist/lib/node-esm/blueprint-definition-MZZXXL37.mjs +0 -18
  330. package/dist/lib/node-esm/blueprint-definition-MZZXXL37.mjs.map +0 -7
  331. package/dist/lib/node-esm/call-manager-MMCTNFOH.mjs +0 -27
  332. package/dist/lib/node-esm/call-manager-MMCTNFOH.mjs.map +0 -7
  333. package/dist/lib/node-esm/chunk-3RD3IVVD.mjs +0 -1814
  334. package/dist/lib/node-esm/chunk-3RD3IVVD.mjs.map +0 -7
  335. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs +0 -33
  336. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +0 -7
  337. package/dist/lib/node-esm/chunk-AQHPP6ZX.mjs +0 -107
  338. package/dist/lib/node-esm/chunk-AQHPP6ZX.mjs.map +0 -7
  339. package/dist/lib/node-esm/chunk-ARTUUKTM.mjs +0 -294
  340. package/dist/lib/node-esm/chunk-ARTUUKTM.mjs.map +0 -7
  341. package/dist/lib/node-esm/chunk-KRBZBJRI.mjs +0 -185
  342. package/dist/lib/node-esm/chunk-KRBZBJRI.mjs.map +0 -7
  343. package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs +0 -1811
  344. package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs.map +0 -7
  345. package/dist/lib/node-esm/chunk-VBI32FGI.mjs +0 -108
  346. package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +0 -7
  347. package/dist/lib/node-esm/markdown-N2UJ3D6L.mjs +0 -211
  348. package/dist/lib/node-esm/markdown-N2UJ3D6L.mjs.map +0 -7
  349. package/dist/lib/node-esm/operation-resolver-7PHDJZA2.mjs +0 -442
  350. package/dist/lib/node-esm/operation-resolver-7PHDJZA2.mjs.map +0 -7
  351. package/dist/lib/node-esm/react-root-SZIGQRDZ.mjs +0 -26
  352. package/dist/lib/node-esm/react-root-SZIGQRDZ.mjs.map +0 -7
  353. package/dist/lib/node-esm/react-surface-24PNWUDX.mjs +0 -111
  354. package/dist/lib/node-esm/react-surface-24PNWUDX.mjs.map +0 -7
  355. package/dist/lib/node-esm/repair-LHLLGXKF.mjs +0 -39
  356. package/dist/lib/node-esm/repair-LHLLGXKF.mjs.map +0 -7
  357. package/dist/lib/node-esm/settings-LXZQXSPL.mjs +0 -33
  358. package/dist/lib/node-esm/settings-LXZQXSPL.mjs.map +0 -7
  359. package/dist/lib/node-esm/state-YYAK5ENM.mjs +0 -25
  360. package/dist/lib/node-esm/state-YYAK5ENM.mjs.map +0 -7
  361. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +0 -6
  362. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +0 -1
  363. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +0 -3
  364. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +0 -1
  365. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +0 -9
  366. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +0 -1
  367. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +0 -3
  368. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +0 -1
  369. package/dist/types/src/capabilities/call-manager/call-manager.d.ts +0 -6
  370. package/dist/types/src/capabilities/call-manager/call-manager.d.ts.map +0 -1
  371. package/dist/types/src/capabilities/call-manager/index.d.ts +0 -3
  372. package/dist/types/src/capabilities/call-manager/index.d.ts.map +0 -1
  373. package/dist/types/src/capabilities/markdown/index.d.ts +0 -3
  374. package/dist/types/src/capabilities/markdown/index.d.ts.map +0 -1
  375. package/dist/types/src/capabilities/markdown/markdown.d.ts +0 -5
  376. package/dist/types/src/capabilities/markdown/markdown.d.ts.map +0 -1
  377. package/dist/types/src/capabilities/operation-resolver/index.d.ts +0 -3
  378. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +0 -1
  379. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +0 -5
  380. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +0 -1
  381. package/dist/types/src/capabilities/react-root/index.d.ts +0 -6
  382. package/dist/types/src/capabilities/react-root/index.d.ts.map +0 -1
  383. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +0 -1
  384. package/dist/types/src/capabilities/react-surface/index.d.ts +0 -3
  385. package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
  386. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +0 -5
  387. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
  388. package/dist/types/src/capabilities/repair/index.d.ts +0 -3
  389. package/dist/types/src/capabilities/repair/index.d.ts.map +0 -1
  390. package/dist/types/src/capabilities/repair/repair.d.ts +0 -6
  391. package/dist/types/src/capabilities/repair/repair.d.ts.map +0 -1
  392. package/dist/types/src/capabilities/settings/index.d.ts +0 -3
  393. package/dist/types/src/capabilities/settings/index.d.ts.map +0 -1
  394. package/dist/types/src/capabilities/settings/settings.d.ts +0 -5
  395. package/dist/types/src/capabilities/settings/settings.d.ts.map +0 -1
  396. package/dist/types/src/capabilities/state/index.d.ts +0 -3
  397. package/dist/types/src/capabilities/state/index.d.ts.map +0 -1
  398. package/dist/types/src/capabilities/state/state.d.ts +0 -7
  399. package/dist/types/src/capabilities/state/state.d.ts.map +0 -1
  400. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  401. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  402. package/dist/types/src/components/ChannelContainer.d.ts +0 -13
  403. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  404. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -164
  405. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  406. package/dist/types/src/components/Chat.stories.d.ts +0 -164
  407. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  408. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  409. package/dist/types/src/components/Comments.stories.d.ts +0 -162
  410. package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
  411. package/dist/types/src/components/CommentsContainer.d.ts +0 -13
  412. package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
  413. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +0 -1
  414. package/dist/types/src/components/MessageContainer.d.ts +0 -15
  415. package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
  416. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
  417. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -166
  418. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
  419. package/dist/types/src/components/ThreadCompanion.d.ts +0 -5
  420. package/dist/types/src/components/ThreadCompanion.d.ts.map +0 -1
  421. package/dist/types/src/components/ThreadSettings.d.ts +0 -8
  422. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  423. package/dist/types/src/components/command-extension.d.ts.map +0 -1
  424. package/dist/types/src/components/testing.d.ts.map +0 -1
  425. package/dist/types/src/functions/create-proposals.d.ts +0 -6
  426. package/dist/types/src/functions/create-proposals.d.ts.map +0 -1
  427. package/dist/types/src/functions/index.d.ts +0 -2
  428. package/dist/types/src/functions/index.d.ts.map +0 -1
  429. package/src/capabilities/app-graph-builder/index.ts +0 -7
  430. package/src/capabilities/blueprint-definition/blueprint-definition.ts +0 -23
  431. package/src/capabilities/blueprint-definition/index.ts +0 -7
  432. package/src/capabilities/call-manager/index.ts +0 -7
  433. package/src/capabilities/markdown/index.ts +0 -7
  434. package/src/capabilities/operation-resolver/index.ts +0 -7
  435. package/src/capabilities/operation-resolver/operation-resolver.ts +0 -400
  436. package/src/capabilities/react-root/index.ts +0 -7
  437. package/src/capabilities/react-surface/index.ts +0 -7
  438. package/src/capabilities/react-surface/react-surface.tsx +0 -97
  439. package/src/capabilities/repair/index.ts +0 -7
  440. package/src/capabilities/repair/repair.ts +0 -51
  441. package/src/capabilities/settings/index.ts +0 -7
  442. package/src/capabilities/state/index.ts +0 -7
  443. package/src/components/ChatContainer.tsx +0 -153
  444. package/src/components/ThreadSettings.tsx +0 -21
  445. package/src/functions/create-proposals.ts +0 -57
  446. package/src/functions/index.ts +0 -5
@@ -5,28 +5,28 @@
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 AppSurface } 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';
25
26
 
26
- import { Call } from './Call';
27
- import ChatContainer from './ChatContainer';
27
+ import { ChatContainer } from '../ChatContainer';
28
28
 
29
- export type ChannelContainerProps = SurfaceComponentProps<
29
+ export type ChannelContainerProps = AppSurface.ObjectArticleProps<
30
30
  Channel.Channel | undefined,
31
31
  {
32
32
  roomId?: string;
@@ -38,19 +38,24 @@ export type ChannelContainerProps = SurfaceComponentProps<
38
38
  * Renders a call when active, otherwise renders the channel chat.
39
39
  */
40
40
  // TODO(burdon): Create Radix style layout.
41
- export const ChannelContainer = ({ role, subject: channel, roomId: roomIdProp, fullscreen }: ChannelContainerProps) => {
41
+ export const ChannelContainer = ({
42
+ role,
43
+ subject: channel,
44
+ attendableId,
45
+ roomId: roomIdProp,
46
+ fullscreen,
47
+ }: ChannelContainerProps) => {
42
48
  const space = getSpace(channel);
43
49
  const callManager = useCapability(ThreadCapabilities.CallManager);
50
+ const extensions = useCapabilities(ThreadCapabilities.CallExtension);
44
51
  const joined = useAtomValue(callManager.joinedAtom);
45
52
  const currentRoomId = useAtomValue(callManager.roomIdAtom);
46
- const attendableId = channel ? Obj.getDXN(channel).toString() : undefined;
47
53
  const roomId = roomIdProp ?? attendableId ?? failUndefined();
48
54
  const identity = useIdentity();
49
55
  const isNamed = !!identity?.profile?.displayName;
50
56
  const joinSound = useSoundEffect('JoinCall');
51
57
  const leaveSound = useSoundEffect('LeaveCall');
52
58
 
53
- const extensions = useCapabilities(ThreadCapabilities.CallExtension);
54
59
  useEffect(() => {
55
60
  const ctx = new Context();
56
61
  callManager.left.on(ctx, (roomId) => {
@@ -118,27 +123,38 @@ export const ChannelContainer = ({ role, subject: channel, roomId: roomIdProp, f
118
123
  }, [extensions, roomId]);
119
124
 
120
125
  const isJoined = joined && currentRoomId === roomId;
126
+ if (isJoined) {
127
+ return (
128
+ <Panel.Root>
129
+ <Panel.Content>
130
+ {isNamed ? (
131
+ <Call.Root>
132
+ <Call.Grid fullscreen={fullscreen} />
133
+ <Call.Toolbar channel={channel} onLeave={handleLeave} />
134
+ </Call.Root>
135
+ ) : (
136
+ <DisplayNameMissing />
137
+ )}
138
+ </Panel.Content>
139
+ </Panel.Root>
140
+ );
141
+ }
121
142
 
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
- <>
143
+ if (channel && channel.defaultThread.target && space) {
144
+ return (
145
+ <Panel.Root classNames='dx-document'>
146
+ <Panel.Toolbar asChild>
133
147
  <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
- };
148
+ </Panel.Toolbar>
149
+ <Panel.Content asChild>
150
+ <ChatContainer space={space} thread={channel.defaultThread.target} />
151
+ </Panel.Content>
152
+ </Panel.Root>
153
+ );
154
+ }
140
155
 
141
- export default ChannelContainer;
156
+ return null;
157
+ };
142
158
 
143
159
  const DisplayNameMissing = () => {
144
160
  const { t } = useTranslation(meta.id);
@@ -148,19 +164,19 @@ const DisplayNameMissing = () => {
148
164
  const handleSave = useCallback(() => client.halo.updateProfile({ displayName }), [client, displayName]);
149
165
 
150
166
  return (
151
- <ControlGroup classNames='p-4 place-content-center'>
152
- <ControlItemInput title={t('display name label')} description={t('display name description')}>
167
+ <div className='space-y-trim-md p-4 place-content-center'>
168
+ <Settings.Item title={t('display-name.label')} description={t('display-name.description')}>
153
169
  <Input.TextInput
154
170
  value={displayName}
155
171
  onChange={handleChange}
156
- placeholder={t('display name input placeholder')}
157
- classNames='md:min-is-64'
172
+ placeholder={t('display-name-input.placeholder')}
173
+ classNames='md:min-w-64'
158
174
  />
159
- </ControlItemInput>
160
- <ControlGroupButton disabled={!displayName} onClick={handleSave}>
161
- {t('set display name label')}
162
- </ControlGroupButton>
163
- </ControlGroup>
175
+ </Settings.Item>
176
+ <Button classNames='md:col-span-2' disabled={!displayName} onClick={handleSave}>
177
+ {t('set-display-name.label')}
178
+ </Button>
179
+ </div>
164
180
  );
165
181
  };
166
182
 
@@ -171,15 +187,15 @@ const useChannelToolbarActions = (onJoinCall?: () => void) => {
171
187
  return {
172
188
  nodes: [
173
189
  createMenuItemGroup('root', {
174
- label: ['channel toolbar title', { ns: meta.id }],
190
+ label: ['channel-toolbar.title', { ns: meta.id }],
175
191
  }),
176
192
  createMenuAction('video-call', () => onJoinCall?.(), {
177
- label: ['start video call label', { ns: meta.id }],
193
+ label: ['start-video-call.menu', { ns: meta.id }],
178
194
  icon: 'ph--video-camera--regular',
179
195
  type: 'video-call',
180
196
  }),
181
197
  ],
182
- edges: [{ source: 'root', target: 'video-call' }],
198
+ edges: [{ source: 'root', target: 'video-call', relation: 'child' }],
183
199
  };
184
200
  }),
185
201
  [],
@@ -188,20 +204,20 @@ const useChannelToolbarActions = (onJoinCall?: () => void) => {
188
204
  return useMenuActions(creator);
189
205
  };
190
206
 
191
- type ChannelToolbarProps = {
192
- attendableId?: string;
193
- role?: string;
207
+ type ChannelToolbarProps = Pick<MenuRootProps, 'attendableId'> & {
194
208
  onJoinCall?: () => void;
195
209
  };
196
210
 
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
- };
211
+ const ChannelToolbar = composable<HTMLDivElement, ChannelToolbarProps>(
212
+ ({ attendableId, role, onJoinCall, ...props }, forwardedRef) => {
213
+ const menuActions = useChannelToolbarActions(onJoinCall);
214
+
215
+ return (
216
+ <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>
217
+ <Menu.Root {...menuActions} attendableId={attendableId}>
218
+ <Menu.Toolbar {...composableProps(props)} ref={forwardedRef} />
219
+ </Menu.Root>
220
+ </ElevationProvider>
221
+ );
222
+ },
223
+ );
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export { ChannelContainer as default } from './ChannelContainer';
@@ -5,25 +5,26 @@
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 { faker } from '@dxos/random';
10
+ import { Surface } from '@dxos/app-framework/ui';
11
+ import { corePlugins } from '@dxos/plugin-testing';
12
+ import { random } from '@dxos/random';
11
13
  import { useClient } from '@dxos/react-client';
12
14
  import { type Space } from '@dxos/react-client/echo';
13
15
  import { useIdentity } from '@dxos/react-client/halo';
14
16
  import { withClientProvider } from '@dxos/react-client/testing';
15
17
  import { useAsyncEffect } from '@dxos/react-ui';
16
- import { withTheme } from '@dxos/react-ui/testing';
17
18
  import { Thread as ThreadComponent } from '@dxos/react-ui-thread';
18
- import { render } from '@dxos/storybook-utils';
19
+ import { withLayout, Loading } from '@dxos/react-ui/testing';
19
20
  import { Message, Thread } from '@dxos/types';
20
21
 
21
- import { translations } from '../translations';
22
- import { Channel } from '../types';
22
+ import { Channel } from '#types';
23
23
 
24
+ import { translations } from '../../translations';
24
25
  import { ChatContainer } from './ChatContainer';
25
26
 
26
- faker.seed(1);
27
+ random.seed(1);
27
28
 
28
29
  const DefaultStory = () => {
29
30
  const client = useClient();
@@ -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,131 @@
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 { useStatus } from '#hooks';
25
+ import { meta } from '#meta';
26
+
27
+ import { command } from '../../extensions';
28
+ import { getMessageMetadata } from '../../util';
29
+
30
+ export type ChatContainerProps = ThemedClassName<
31
+ {
32
+ space: Space;
33
+ thread: Thread.Thread;
34
+ context?: Obj.Unknown;
35
+ autoFocusTextbox?: boolean;
36
+ } & Pick<ThreadRootProps, 'current'>
37
+ >;
38
+
39
+ export const ChatContainer = composable<HTMLDivElement, ChatContainerProps>(
40
+ ({ space, thread, context, autoFocusTextbox, current, ...props }, forwardedRef) => {
41
+ const { t } = useTranslation(meta.id);
42
+ const { themeMode } = useThemeContext();
43
+
44
+ const id = Obj.getDXN(thread).toString();
45
+ const identity = useIdentity()!;
46
+ const members = useMembers(space?.id);
47
+ const activity = useStatus(space, id);
48
+ const [autoFocus, setAutoFocus] = useState(autoFocusTextbox);
49
+ const threadScrollRef = useRef<HTMLDivElement | null>(null);
50
+
51
+ // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.
52
+ const [_count, _setCount] = useState(0);
53
+ const rerenderEditor = () => _setCount((count) => count + 1);
54
+
55
+ const textboxMetadata = getMessageMetadata(id, identity);
56
+ const messageRef = useRef('');
57
+ const extensions = useMemo(
58
+ () => [
59
+ createBasicExtensions({ placeholder: t('message.placeholder') }),
60
+ createThemeExtensions({ themeMode }),
61
+ listener({ onChange: ({ text }) => (messageRef.current = text) }),
62
+ command,
63
+ ],
64
+ [themeMode, _count],
65
+ );
66
+
67
+ // TODO(thure): Factor out.
68
+ // TODO(thure): `flex-col-reverse` does not work to start the container scrolled to the end while also using
69
+ // `ScrollArea`. This is the least-bad way I found to scroll to the end on mount. Note that 0ms was insufficient
70
+ // for the desired effect; this is likely hardware-dependent and should be reevaluated.
71
+ const scrollToEnd = (behavior: ScrollBehavior) =>
72
+ setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);
73
+
74
+ useLayoutEffect(() => {
75
+ scrollToEnd('instant');
76
+ }, []);
77
+
78
+ // TODO(burdon): Change to model.
79
+ const handleCreate: MessageTextboxProps['onSend'] = () => {
80
+ if (!messageRef.current?.length) {
81
+ return false;
82
+ }
83
+
84
+ Obj.change(thread, (thread) => {
85
+ thread.messages.push(
86
+ Ref.make(
87
+ Obj.make(Message.Message, {
88
+ created: new Date().toISOString(),
89
+ sender: { identityDid: identity.did },
90
+ blocks: [{ _tag: 'text', text: messageRef.current }],
91
+ properties: context ? { context: Ref.make(context) } : undefined,
92
+ }),
93
+ ),
94
+ );
95
+ });
96
+
97
+ messageRef.current = '';
98
+ setAutoFocus(true);
99
+ scrollToEnd('smooth');
100
+ rerenderEditor();
101
+ return true;
102
+ };
103
+
104
+ return (
105
+ <ThreadComponent.Root
106
+ {...composableProps(props, {
107
+ classNames: 'dx-container grid-rows-[1fr_min-content_min-content]',
108
+ })}
109
+ id={id}
110
+ current={current}
111
+ ref={forwardedRef}
112
+ >
113
+ <ScrollArea.Root classNames='col-span-2' orientation='vertical'>
114
+ <ScrollArea.Viewport ref={threadScrollRef}>
115
+ <div role='none' className={mx(threadLayout, 'place-self-end')}>
116
+ {thread.messages
117
+ .map((message) => message.target)
118
+ .filter(isNonNullable)
119
+ .map((message) => (
120
+ <MessagePanel key={message.id} message={message} members={members} />
121
+ ))}
122
+ </div>
123
+ </ScrollArea.Viewport>
124
+ </ScrollArea.Root>
125
+
126
+ <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleCreate} {...textboxMetadata} />
127
+ <ThreadComponent.Status activity={activity}>{t('activity.message')}</ThreadComponent.Status>
128
+ </ThreadComponent.Root>
129
+ );
130
+ },
131
+ );
@@ -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';
11
+ import { type AppSurface } from '@dxos/app-toolkit/ui';
10
12
  import { Filter, Obj, Query, Relation } from '@dxos/echo';
11
13
  import { Ref, useQuery } from '@dxos/react-client/echo';
12
14
  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';
15
+ import { Panel, ScrollArea, Toolbar, useTranslation } from '@dxos/react-ui';
16
+ import { getParentId, useAttention } from '@dxos/react-ui-attention';
16
17
  import { Tabs } from '@dxos/react-ui-tabs';
17
18
  import { AnchoredTo, Thread } from '@dxos/types';
18
- import { mx } from '@dxos/ui-theme';
19
19
 
20
- import { CommentsContainer, type CommentsContainerProps } from '../components';
21
- import { meta } from '../meta';
22
- import { ThreadCapabilities, ThreadOperation, type ViewState } from '../types';
20
+ import { CommentsPanel, type CommentsPanelProps } from '#components';
21
+ import { meta } from '#meta';
22
+ import { ThreadOperation } from '#operations';
23
+ import { ThreadCapabilities, type ViewState } from '#types';
23
24
 
24
25
  const initialViewState: ViewState = { showResolvedThreads: false };
25
26
 
26
- export const ThreadCompanion = ({ subject }: { subject: any }) => {
27
+ export type ThreadCompanionProps = AppSurface.ObjectArticleProps<
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,5 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export { ThreadCompanion as default } from './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'));