@dxos/plugin-thread 0.8.4-main.28f8d3d → 0.8.4-main.2c6827d

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 (304) hide show
  1. package/dist/lib/browser/ChannelContainer-JI3ZRZ5S.mjs +17 -0
  2. package/dist/lib/browser/ChatContainer-6FVFME3R.mjs +16 -0
  3. package/dist/lib/browser/{app-graph-builder-AF3M7UWN.mjs → app-graph-builder-URVQHGMR.mjs} +32 -32
  4. package/dist/lib/browser/app-graph-builder-URVQHGMR.mjs.map +7 -0
  5. package/dist/lib/browser/blueprint-definition-TQ4JFMZZ.mjs +101 -0
  6. package/dist/lib/browser/blueprint-definition-TQ4JFMZZ.mjs.map +7 -0
  7. package/dist/lib/browser/{call-manager-XRRCAVLI.mjs → call-manager-4YFT4XA6.mjs} +8 -7
  8. package/dist/lib/{node-esm/call-manager-EI7FXRAU.mjs.map → browser/call-manager-4YFT4XA6.mjs.map} +1 -1
  9. package/dist/lib/browser/chunk-6LWKNZUV.mjs +377 -0
  10. package/dist/lib/browser/chunk-6LWKNZUV.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-CBUNHCOE.mjs +23 -0
  12. package/dist/lib/browser/chunk-CBUNHCOE.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-CFC7LEPD.mjs +18 -0
  14. package/dist/lib/browser/chunk-CFC7LEPD.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  16. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-ZJ7QBXK6.mjs → chunk-F36NHPJG.mjs} +47 -42
  18. package/dist/lib/browser/chunk-F36NHPJG.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-JGKMMI65.mjs → chunk-ISCHODBV.mjs} +54 -4
  20. package/dist/lib/browser/chunk-ISCHODBV.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  22. package/dist/lib/browser/{chunk-X5PIP5YR.mjs → chunk-KOBXMDCI.mjs} +74 -41
  23. package/dist/lib/browser/chunk-KOBXMDCI.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-QM34EZQK.mjs +20 -0
  25. package/dist/lib/browser/chunk-QM34EZQK.mjs.map +7 -0
  26. package/dist/lib/browser/chunk-R5UOPOO7.mjs +142 -0
  27. package/dist/lib/browser/chunk-R5UOPOO7.mjs.map +7 -0
  28. package/dist/lib/browser/chunk-VIRD2QSK.mjs +611 -0
  29. package/dist/lib/browser/chunk-VIRD2QSK.mjs.map +7 -0
  30. package/dist/lib/browser/{chunk-TUFWPOVS.mjs → chunk-ZCW3NSDZ.mjs} +256 -161
  31. package/dist/lib/browser/chunk-ZCW3NSDZ.mjs.map +7 -0
  32. package/dist/lib/browser/index.mjs +48 -38
  33. package/dist/lib/browser/index.mjs.map +3 -3
  34. package/dist/lib/browser/{intent-resolver-DCY4P4OX.mjs → intent-resolver-YR6W4CRP.mjs} +33 -51
  35. package/dist/lib/browser/intent-resolver-YR6W4CRP.mjs.map +7 -0
  36. package/dist/lib/browser/{markdown-WZSXCEZJ.mjs → markdown-GSOBOXA7.mjs} +26 -24
  37. package/dist/lib/browser/markdown-GSOBOXA7.mjs.map +7 -0
  38. package/dist/lib/browser/meta.json +1 -1
  39. package/dist/lib/browser/react-root-RAWRPF7Z.mjs +29 -0
  40. package/dist/lib/browser/react-root-RAWRPF7Z.mjs.map +7 -0
  41. package/dist/lib/browser/{react-surface-PYAMIADB.mjs → react-surface-GOEFSXQ6.mjs} +38 -36
  42. package/dist/lib/browser/react-surface-GOEFSXQ6.mjs.map +7 -0
  43. package/dist/lib/browser/{settings-AC6YSASL.mjs → settings-JN2HHORY.mjs} +6 -5
  44. package/dist/lib/{node-esm/settings-N52O7MLS.mjs.map → browser/settings-JN2HHORY.mjs.map} +1 -1
  45. package/dist/lib/browser/{state-2T4KDWBX.mjs → state-UYPLBGZJ.mjs} +6 -5
  46. package/dist/lib/{node-esm/state-62TQKQVB.mjs.map → browser/state-UYPLBGZJ.mjs.map} +1 -1
  47. package/dist/lib/browser/types/index.mjs +7 -10
  48. package/dist/lib/node-esm/ChannelContainer-RQY4PR4F.mjs +18 -0
  49. package/dist/lib/node-esm/ChatContainer-KWNON7EN.mjs +17 -0
  50. package/dist/lib/node-esm/ChatContainer-KWNON7EN.mjs.map +7 -0
  51. package/dist/lib/node-esm/{app-graph-builder-OLSJVCWY.mjs → app-graph-builder-2IH5RPR7.mjs} +32 -32
  52. package/dist/lib/node-esm/app-graph-builder-2IH5RPR7.mjs.map +7 -0
  53. package/dist/lib/node-esm/blueprint-definition-TSX5HHW7.mjs +102 -0
  54. package/dist/lib/node-esm/blueprint-definition-TSX5HHW7.mjs.map +7 -0
  55. package/dist/lib/node-esm/{call-manager-EI7FXRAU.mjs → call-manager-UMUXEYH5.mjs} +8 -7
  56. package/dist/lib/{browser/call-manager-XRRCAVLI.mjs.map → node-esm/call-manager-UMUXEYH5.mjs.map} +1 -1
  57. package/dist/lib/node-esm/chunk-2AEIN5MI.mjs +22 -0
  58. package/dist/lib/node-esm/chunk-2AEIN5MI.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-4TME3BR4.mjs → chunk-7KZWZS2U.mjs} +256 -161
  60. package/dist/lib/node-esm/chunk-7KZWZS2U.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
  62. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  64. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-I3O6NXMN.mjs +25 -0
  66. package/dist/lib/node-esm/chunk-I3O6NXMN.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-MEIWWPR2.mjs +143 -0
  68. package/dist/lib/node-esm/chunk-MEIWWPR2.mjs.map +7 -0
  69. package/dist/lib/node-esm/{chunk-SED3O2XO.mjs → chunk-PZH2EDU5.mjs} +74 -41
  70. package/dist/lib/node-esm/chunk-PZH2EDU5.mjs.map +7 -0
  71. package/dist/lib/node-esm/chunk-QFCIKJOD.mjs +612 -0
  72. package/dist/lib/node-esm/chunk-QFCIKJOD.mjs.map +7 -0
  73. package/dist/lib/node-esm/chunk-RT6NRL2I.mjs +19 -0
  74. package/dist/lib/node-esm/chunk-RT6NRL2I.mjs.map +7 -0
  75. package/dist/lib/node-esm/{chunk-QBHKLWGR.mjs → chunk-VBI32FGI.mjs} +54 -4
  76. package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +7 -0
  77. package/dist/lib/node-esm/{chunk-YIDU3DXK.mjs → chunk-Y3F2SGNH.mjs} +47 -42
  78. package/dist/lib/node-esm/chunk-Y3F2SGNH.mjs.map +7 -0
  79. package/dist/lib/node-esm/chunk-Z4GUSLWL.mjs +378 -0
  80. package/dist/lib/node-esm/chunk-Z4GUSLWL.mjs.map +7 -0
  81. package/dist/lib/node-esm/index.mjs +48 -38
  82. package/dist/lib/node-esm/index.mjs.map +3 -3
  83. package/dist/lib/node-esm/{intent-resolver-QGTPU6QB.mjs → intent-resolver-SJFABEE7.mjs} +33 -51
  84. package/dist/lib/node-esm/intent-resolver-SJFABEE7.mjs.map +7 -0
  85. package/dist/lib/node-esm/{markdown-3MZXUGUA.mjs → markdown-GG5566TL.mjs} +26 -24
  86. package/dist/lib/node-esm/markdown-GG5566TL.mjs.map +7 -0
  87. package/dist/lib/node-esm/meta.json +1 -1
  88. package/dist/lib/node-esm/react-root-K5OGECUS.mjs +30 -0
  89. package/dist/lib/node-esm/react-root-K5OGECUS.mjs.map +7 -0
  90. package/dist/lib/node-esm/{react-surface-UJFCSFNO.mjs → react-surface-5QDQD7MN.mjs} +38 -36
  91. package/dist/lib/node-esm/react-surface-5QDQD7MN.mjs.map +7 -0
  92. package/dist/lib/node-esm/{settings-N52O7MLS.mjs → settings-VSPM3BIM.mjs} +6 -5
  93. package/dist/lib/{browser/settings-AC6YSASL.mjs.map → node-esm/settings-VSPM3BIM.mjs.map} +1 -1
  94. package/dist/lib/node-esm/{state-62TQKQVB.mjs → state-XNWOLBNE.mjs} +6 -5
  95. package/dist/lib/{browser/state-2T4KDWBX.mjs.map → node-esm/state-XNWOLBNE.mjs.map} +1 -1
  96. package/dist/lib/node-esm/types/index.mjs +7 -10
  97. package/dist/types/src/ThreadPlugin.d.ts +1 -1
  98. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  99. package/dist/types/src/calls/media-manager.d.ts +1 -1
  100. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  101. package/dist/types/src/calls/types.d.ts.map +1 -1
  102. package/dist/types/src/calls/util/calls-service.d.ts +3 -1
  103. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  104. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  105. package/dist/types/src/calls-service.stories.d.ts +10 -9
  106. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  108. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  109. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
  110. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  111. package/dist/types/src/capabilities/call-manager.d.ts +1 -1
  112. package/dist/types/src/capabilities/capabilities.d.ts +2 -2
  113. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  114. package/dist/types/src/capabilities/index.d.ts +11 -10
  115. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  116. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  117. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  118. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  119. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  120. package/dist/types/src/capabilities/react-root.d.ts +2 -2
  121. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  122. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  123. package/dist/types/src/capabilities/settings.d.ts +1 -1
  124. package/dist/types/src/capabilities/state.d.ts +2 -2
  125. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  126. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  127. package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
  128. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  129. package/dist/types/src/components/ChannelContainer.d.ts +2 -2
  130. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  131. package/dist/types/src/components/ChannelContainer.stories.d.ts +155 -5
  132. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  133. package/dist/types/src/components/Chat.stories.d.ts +158 -5
  134. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  135. package/dist/types/src/components/ChatContainer.d.ts +6 -5
  136. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  137. package/dist/types/src/components/Comments.stories.d.ts +156 -4
  138. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  139. package/dist/types/src/components/CommentsContainer.d.ts +2 -2
  140. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  141. package/dist/types/src/components/CommentsThreadContainer.d.ts +9 -9
  142. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  143. package/dist/types/src/components/Media/VideoObject.d.ts +2 -2
  144. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  145. package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
  146. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  147. package/dist/types/src/components/MessageContainer.d.ts +6 -3
  148. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  149. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  150. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +155 -3
  151. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  152. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +157 -4
  153. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  154. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  155. package/dist/types/src/components/ThreadCompanion.d.ts +5 -0
  156. package/dist/types/src/components/ThreadCompanion.d.ts.map +1 -0
  157. package/dist/types/src/components/ThreadSettings.d.ts +1 -1
  158. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  159. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  160. package/dist/types/src/components/index.d.ts +3 -3
  161. package/dist/types/src/components/index.d.ts.map +1 -1
  162. package/dist/types/src/components/testing.d.ts +3 -2
  163. package/dist/types/src/components/testing.d.ts.map +1 -1
  164. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  165. package/dist/types/src/functions/create-proposals.d.ts +6 -0
  166. package/dist/types/src/functions/create-proposals.d.ts.map +1 -0
  167. package/dist/types/src/functions/index.d.ts +2 -0
  168. package/dist/types/src/functions/index.d.ts.map +1 -0
  169. package/dist/types/src/hooks/analytics.d.ts +2 -2
  170. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  171. package/dist/types/src/hooks/index.d.ts +2 -1
  172. package/dist/types/src/hooks/index.d.ts.map +1 -1
  173. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  174. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  175. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  176. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  177. package/dist/types/src/meta.d.ts +1 -2
  178. package/dist/types/src/meta.d.ts.map +1 -1
  179. package/dist/types/src/testing/stories.d.ts.map +1 -1
  180. package/dist/types/src/translations.d.ts +75 -7
  181. package/dist/types/src/translations.d.ts.map +1 -1
  182. package/dist/types/src/types/Channel.d.ts +16 -0
  183. package/dist/types/src/types/Channel.d.ts.map +1 -0
  184. package/dist/types/src/types/index.d.ts +1 -1
  185. package/dist/types/src/types/index.d.ts.map +1 -1
  186. package/dist/types/src/types/types.d.ts +206 -210
  187. package/dist/types/src/types/types.d.ts.map +1 -1
  188. package/dist/types/tsconfig.tsbuildinfo +1 -1
  189. package/package.json +65 -59
  190. package/src/ThreadPlugin.tsx +139 -125
  191. package/src/calls/call-manager.ts +1 -1
  192. package/src/calls/media-manager.ts +64 -35
  193. package/src/calls/types.ts +7 -3
  194. package/src/calls/util/calls-service.ts +61 -11
  195. package/src/calls/util/stub-media-streams.ts +62 -5
  196. package/src/calls-service.stories.tsx +76 -63
  197. package/src/capabilities/app-graph-builder.ts +43 -30
  198. package/src/capabilities/blueprint-definition.ts +38 -0
  199. package/src/capabilities/capabilities.ts +7 -7
  200. package/src/capabilities/index.ts +1 -0
  201. package/src/capabilities/intent-resolver.ts +23 -30
  202. package/src/capabilities/markdown.ts +5 -3
  203. package/src/capabilities/react-root.tsx +2 -2
  204. package/src/capabilities/react-surface.tsx +25 -23
  205. package/src/components/Call/Call.tsx +1 -1
  206. package/src/components/Call/Toolbar.tsx +9 -9
  207. package/src/components/CallDebugPanel.tsx +112 -55
  208. package/src/components/CallSidebar.tsx +1 -1
  209. package/src/components/ChannelContainer.stories.tsx +13 -13
  210. package/src/components/ChannelContainer.tsx +19 -15
  211. package/src/components/Chat.stories.tsx +30 -34
  212. package/src/components/ChatContainer.tsx +32 -21
  213. package/src/components/Comments.stories.tsx +36 -39
  214. package/src/components/CommentsContainer.tsx +5 -7
  215. package/src/components/CommentsThreadContainer.tsx +38 -33
  216. package/src/components/Lobby/Lobby.tsx +1 -1
  217. package/src/components/Media/VideoObject.stories.tsx +35 -28
  218. package/src/components/Media/VideoObject.tsx +1 -1
  219. package/src/components/MessageContainer.tsx +45 -12
  220. package/src/components/Participant/Participant.tsx +14 -8
  221. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +5 -6
  222. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +2 -2
  223. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +42 -41
  224. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +5 -5
  225. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +5 -2
  226. package/src/components/{ThreadComplementary.tsx → ThreadCompanion.tsx} +72 -35
  227. package/src/components/ThreadSettings.tsx +6 -7
  228. package/src/components/command-extension.ts +4 -1
  229. package/src/components/index.ts +4 -4
  230. package/src/components/testing.ts +26 -6
  231. package/src/extensions/threads.ts +26 -17
  232. package/src/functions/create-proposals.ts +56 -0
  233. package/src/functions/index.ts +5 -0
  234. package/src/hooks/analytics.ts +4 -7
  235. package/src/hooks/index.ts +3 -1
  236. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  237. package/src/hooks/useVideoStreamTrack.tsx +6 -3
  238. package/src/meta.ts +9 -5
  239. package/src/testing/stories.ts +3 -6
  240. package/src/translations.ts +7 -4
  241. package/src/types/Channel.ts +26 -0
  242. package/src/types/index.ts +1 -1
  243. package/src/types/types.ts +27 -28
  244. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  245. package/src/util.ts +1 -1
  246. package/dist/lib/browser/ChannelContainer-O2SFQJU7.mjs +0 -16
  247. package/dist/lib/browser/ChatContainer-PVT3DUZJ.mjs +0 -15
  248. package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs.map +0 -7
  249. package/dist/lib/browser/chunk-2CWJBXBH.mjs +0 -21
  250. package/dist/lib/browser/chunk-2CWJBXBH.mjs.map +0 -7
  251. package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
  252. package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
  253. package/dist/lib/browser/chunk-DW7JD64V.mjs +0 -137
  254. package/dist/lib/browser/chunk-DW7JD64V.mjs.map +0 -7
  255. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  256. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  257. package/dist/lib/browser/chunk-FY4ZRD5X.mjs +0 -367
  258. package/dist/lib/browser/chunk-FY4ZRD5X.mjs.map +0 -7
  259. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  260. package/dist/lib/browser/chunk-J3JO5NWO.mjs +0 -477
  261. package/dist/lib/browser/chunk-J3JO5NWO.mjs.map +0 -7
  262. package/dist/lib/browser/chunk-JGKMMI65.mjs.map +0 -7
  263. package/dist/lib/browser/chunk-TUFWPOVS.mjs.map +0 -7
  264. package/dist/lib/browser/chunk-X5PIP5YR.mjs.map +0 -7
  265. package/dist/lib/browser/chunk-ZJ7QBXK6.mjs.map +0 -7
  266. package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs.map +0 -7
  267. package/dist/lib/browser/markdown-WZSXCEZJ.mjs.map +0 -7
  268. package/dist/lib/browser/react-root-QXPALOUQ.mjs +0 -28
  269. package/dist/lib/browser/react-root-QXPALOUQ.mjs.map +0 -7
  270. package/dist/lib/browser/react-surface-PYAMIADB.mjs.map +0 -7
  271. package/dist/lib/node-esm/ChannelContainer-B2ZGAE4P.mjs +0 -17
  272. package/dist/lib/node-esm/ChatContainer-2CT4PJ7I.mjs +0 -16
  273. package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs.map +0 -7
  274. package/dist/lib/node-esm/chunk-4TME3BR4.mjs.map +0 -7
  275. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  276. package/dist/lib/node-esm/chunk-6CRHHOST.mjs +0 -23
  277. package/dist/lib/node-esm/chunk-6CRHHOST.mjs.map +0 -7
  278. package/dist/lib/node-esm/chunk-BF4UKS55.mjs +0 -368
  279. package/dist/lib/node-esm/chunk-BF4UKS55.mjs.map +0 -7
  280. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  281. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  282. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs +0 -19
  283. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs.map +0 -7
  284. package/dist/lib/node-esm/chunk-QBHKLWGR.mjs.map +0 -7
  285. package/dist/lib/node-esm/chunk-SED3O2XO.mjs.map +0 -7
  286. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs +0 -478
  287. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs.map +0 -7
  288. package/dist/lib/node-esm/chunk-XVKWHTH4.mjs +0 -138
  289. package/dist/lib/node-esm/chunk-XVKWHTH4.mjs.map +0 -7
  290. package/dist/lib/node-esm/chunk-YIDU3DXK.mjs.map +0 -7
  291. package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs.map +0 -7
  292. package/dist/lib/node-esm/markdown-3MZXUGUA.mjs.map +0 -7
  293. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs +0 -29
  294. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs.map +0 -7
  295. package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs.map +0 -7
  296. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  297. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  298. package/dist/types/src/types/schema.d.ts +0 -164
  299. package/dist/types/src/types/schema.d.ts.map +0 -1
  300. package/src/types/schema.ts +0 -33
  301. /package/dist/lib/browser/{ChannelContainer-O2SFQJU7.mjs.map → ChannelContainer-JI3ZRZ5S.mjs.map} +0 -0
  302. /package/dist/lib/browser/{ChatContainer-PVT3DUZJ.mjs.map → ChatContainer-6FVFME3R.mjs.map} +0 -0
  303. /package/dist/lib/{node-esm/ChannelContainer-B2ZGAE4P.mjs.map → browser/chunk-J5LGTIGS.mjs.map} +0 -0
  304. /package/dist/lib/node-esm/{ChatContainer-2CT4PJ7I.mjs.map → ChannelContainer-RQY4PR4F.mjs.map} +0 -0
@@ -5,7 +5,7 @@
5
5
  import { EditorView } from '@codemirror/view';
6
6
  import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
7
7
 
8
- import { Surface } from '@dxos/app-framework';
8
+ import { Surface } from '@dxos/app-framework/react';
9
9
  import { type Obj, Ref, type Type } from '@dxos/echo';
10
10
  import { PublicKey } from '@dxos/react-client';
11
11
  import { type SpaceMember } from '@dxos/react-client/echo';
@@ -14,23 +14,32 @@ import { IconButton, useOnTransition, useThemeContext, useTranslation } from '@d
14
14
  import { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';
15
15
  import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';
16
16
  import { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';
17
- import { type DataType } from '@dxos/schema';
17
+ import { type ContentBlock, type Message } from '@dxos/types';
18
18
 
19
19
  import { useOnEditAnalytics } from '../hooks';
20
20
  import { meta } from '../meta';
21
21
  import { getMessageMetadata } from '../util';
22
22
 
23
23
  import { command } from './command-extension';
24
- import { commentControlClassNames } from './CommentsThreadContainer';
24
+
25
+ export const buttonGroupClassNames = 'flex flex-row items-center gap-0.5 pie-2';
26
+ export const buttonClassNames = '!p-1 transition-opacity';
25
27
 
26
28
  export type MessageContainerProps = {
27
- message: DataType.Message;
29
+ message: Message.Message;
28
30
  members: SpaceMember[];
29
31
  editable?: boolean;
30
32
  onDelete?: (id: string) => void;
33
+ onAcceptProposal?: (id: string) => void;
31
34
  };
32
35
 
33
- export const MessageContainer = ({ message, members, editable = false, onDelete }: MessageContainerProps) => {
36
+ export const MessageContainer = ({
37
+ message,
38
+ members,
39
+ editable = false,
40
+ onDelete,
41
+ onAcceptProposal,
42
+ }: MessageContainerProps) => {
34
43
  const { t } = useTranslation(meta.id);
35
44
  const senderIdentity = members.find(
36
45
  (member) =>
@@ -40,8 +49,11 @@ export const MessageContainer = ({ message, members, editable = false, onDelete
40
49
  const messageMetadata = getMessageMetadata(message.id, senderIdentity);
41
50
  const userIsAuthor = useIdentity()?.did === messageMetadata.authorId;
42
51
  const [editing, setEditing] = useState(false);
52
+ const handleEdit = useCallback(() => setEditing((editing) => !editing), []);
43
53
  const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);
54
+ const handleAcceptProposal = useCallback(() => onAcceptProposal?.(message.id), [message, onAcceptProposal]);
44
55
  const textBlock = message.blocks.find((block) => block._tag === 'text');
56
+ const proposalBlock = message.blocks.find((block) => block._tag === 'proposal');
45
57
  const references = message.blocks.filter((block) => block._tag === 'reference').map((block) => block.reference);
46
58
 
47
59
  useOnEditAnalytics(message, textBlock, !!editing);
@@ -49,7 +61,7 @@ export const MessageContainer = ({ message, members, editable = false, onDelete
49
61
  return (
50
62
  <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>
51
63
  <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>
52
- <div className='flex flex-row items-center gap-0.5'>
64
+ <div role='none' className={buttonGroupClassNames}>
53
65
  {userIsAuthor && editable && (
54
66
  <IconButton
55
67
  data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}
@@ -57,8 +69,20 @@ export const MessageContainer = ({ message, members, editable = false, onDelete
57
69
  icon={editing ? 'ph--check--regular' : 'ph--pencil-simple--regular'}
58
70
  iconOnly
59
71
  label={t(editing ? 'save message label' : 'edit message label')}
60
- classNames={[commentControlClassNames, hoverableControlItem]}
61
- onClick={() => setEditing((editing) => !editing)}
72
+ classNames={[buttonClassNames, hoverableControlItem]}
73
+ onClick={handleEdit}
74
+ />
75
+ )}
76
+ {/* TODO(wittjosiah): Proposal controls should probably be hoisted to thread level. */}
77
+ {proposalBlock && onAcceptProposal && (
78
+ <IconButton
79
+ data-testid='thread.message.accept'
80
+ variant='ghost'
81
+ icon='ph--check--regular'
82
+ iconOnly
83
+ label={t('accept proposal label')}
84
+ classNames={[buttonClassNames, hoverableControlItem]}
85
+ onClick={handleAcceptProposal}
62
86
  />
63
87
  )}
64
88
  {onDelete && (
@@ -68,13 +92,14 @@ export const MessageContainer = ({ message, members, editable = false, onDelete
68
92
  icon='ph--x--regular'
69
93
  iconOnly
70
94
  label={t('delete message label')}
71
- classNames={[commentControlClassNames, hoverableControlItem]}
72
- onClick={() => handleDelete()}
95
+ classNames={[buttonClassNames, hoverableControlItem]}
96
+ onClick={handleDelete}
73
97
  />
74
98
  )}
75
99
  </div>
76
100
  </MessageHeading>
77
101
  {textBlock && <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} />}
102
+ {proposalBlock && <ProposalBlock block={proposalBlock} />}
78
103
  {Ref.Array.targets(references).map((reference, index) => (
79
104
  <MessagePart key={index} part={reference} />
80
105
  ))}
@@ -91,7 +116,7 @@ const TextboxBlock = ({
91
116
  isAuthor,
92
117
  editing,
93
118
  }: {
94
- block: DataType.MessageBlock.Text;
119
+ block: ContentBlock.Text;
95
120
  editing?: boolean;
96
121
  isAuthor?: boolean;
97
122
  identity?: Identity;
@@ -133,6 +158,14 @@ const TextboxBlock = ({
133
158
  return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;
134
159
  };
135
160
 
161
+ const ProposalBlock = ({ block }: { block: ContentBlock.Proposal }) => {
162
+ return (
163
+ <div role='none' className='mie-4 italic'>
164
+ {block.text}
165
+ </div>
166
+ );
167
+ };
168
+
136
169
  const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(({ subject }, forwardedRef) => {
137
170
  // TODO(burdon): Use annotation to get title.
138
171
  let title = (subject as any).name ?? (subject as any).title ?? (subject as any).type ?? 'Object';
@@ -143,7 +176,7 @@ const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(
143
176
  return (
144
177
  <div
145
178
  role='group'
146
- className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}
179
+ className={mx('grid col-span-3 plb-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}
147
180
  ref={forwardedRef}
148
181
  >
149
182
  <Surface role='card' limit={1} data={{ subject }} fallback={title} />
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React, { memo, useMemo } from 'react';
6
6
 
7
- import { useCapability } from '@dxos/app-framework';
7
+ import { useCapability } from '@dxos/app-framework/react';
8
8
 
9
9
  import { type EncodedTrackName, type UserState } from '../../calls';
10
10
  import { ThreadCapabilities } from '../../capabilities';
@@ -17,15 +17,21 @@ export const Participant = memo(({ item: user, debug, ...props }: ResponsiveGrid
17
17
  const call = useCapability(ThreadCapabilities.CallManager);
18
18
  const isSelf: boolean = call.self.id !== undefined && user.id !== undefined && user.id.startsWith(call.self.id);
19
19
  const isScreenshare = user.id?.endsWith(SCREENSHARE_SUFFIX);
20
- const pulledVideoStream = call.getVideoStream(
21
- isScreenshare || !isSelf ? (user.tracks?.video as EncodedTrackName) : undefined,
22
- );
20
+
21
+ const pulledVideoStream =
22
+ !isSelf && isScreenshare && user.tracks?.screenshareEnabled
23
+ ? call.getVideoStream(user.tracks?.screenshare as EncodedTrackName)
24
+ : !isSelf && !isScreenshare && user.tracks?.videoEnabled
25
+ ? call.getVideoStream(user.tracks?.video as EncodedTrackName)
26
+ : undefined;
23
27
 
24
28
  const videoStream = useMemo<MediaStream | undefined>(() => {
25
- if (isSelf && !isScreenshare) {
26
- return call.media.videoStream;
27
- } else if (isSelf && isScreenshare) {
28
- return call.media.screenshareVideoStream;
29
+ if (isSelf) {
30
+ if (isScreenshare) {
31
+ return call.media.screenshareVideoStream;
32
+ } else if (!isScreenshare) {
33
+ return call.media.videoStream;
34
+ }
29
35
  } else if (!isSelf) {
30
36
  return pulledVideoStream;
31
37
  }
@@ -2,26 +2,25 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React from 'react';
9
7
 
10
- import { withLayout, withTheme } from '@dxos/storybook-utils';
8
+ import { withTheme } from '@dxos/react-ui/testing';
11
9
 
12
10
  import { translations } from '../../translations';
13
11
  import { VideoObject as VideoObjectComponent } from '../Media';
14
12
 
15
13
  import { ResponsiveContainer } from './ResponsiveContainer';
16
14
 
17
- const meta: Meta<typeof ResponsiveContainer> = {
15
+ const meta = {
18
16
  title: 'plugins/plugin-thread/ResponsiveContainer',
19
17
  component: ResponsiveContainer,
20
- decorators: [withTheme, withLayout({ fullscreen: true })],
18
+ decorators: [withTheme],
21
19
  parameters: {
20
+ layout: 'fullscreen',
22
21
  translations,
23
22
  },
24
- };
23
+ } satisfies Meta<typeof ResponsiveContainer>;
25
24
 
26
25
  export default meta;
27
26
 
@@ -18,11 +18,11 @@ import { mx } from '@dxos/react-ui-theme';
18
18
  export const ResponsiveContainer = ({ children }: PropsWithChildren) => {
19
19
  return (
20
20
  // Outer container that takes full size of parent.
21
- <div role='none' className='relative flex w-full h-full'>
21
+ <div role='none' className='relative flex is-full bs-full'>
22
22
  {/* Absolute positioning layer for centering content. */}
23
23
  <div role='none' className='absolute inset-0 flex justify-center items-center'>
24
24
  {/* Content container that maintains given aspect ratio and proper scaling. */}
25
- <div role='none' className={mx('max-h-full max-w-full w-auto h-auto aspect-video')}>
25
+ <div role='none' className={mx('max-bs-full max-is-full is-auto bs-auto aspect-video')}>
26
26
  {children}
27
27
  </div>
28
28
  </div>
@@ -2,13 +2,11 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React, { useEffect, useState } from 'react';
9
7
 
10
8
  import { faker } from '@dxos/random';
11
- import { withLayout, withTheme } from '@dxos/storybook-utils';
9
+ import { withTheme } from '@dxos/react-ui/testing';
12
10
 
13
11
  import { translations } from '../../translations';
14
12
 
@@ -43,7 +41,7 @@ const TestCell = ({ item, ...props }: ResponsiveGridItemProps<TestItem>) => {
43
41
  {item.type === 'image' && <img className='aspect-video object-contain' src={item.imageUrl} />}
44
42
  {item.type === 'video' && (
45
43
  <video
46
- className='w-full aspect-video object-cover rounded-md'
44
+ className='is-full aspect-video object-cover rounded-md'
47
45
  src={item.videoUrl}
48
46
  playsInline
49
47
  autoPlay
@@ -57,46 +55,49 @@ const TestCell = ({ item, ...props }: ResponsiveGridItemProps<TestItem>) => {
57
55
 
58
56
  type StoryProps = ResponsiveGridProps<TestItem> & { random?: boolean; autoHideGallery?: boolean };
59
57
 
60
- const meta: Meta<StoryProps> = {
58
+ const DefaultStory = (props: StoryProps) => {
59
+ const [pinned, setPinned] = useState<string | undefined>(
60
+ (props.pinned ?? props.items.length > 1) ? props.items[0]?.id : undefined,
61
+ );
62
+ const [items, setItems] = useState<TestItem[]>(props.items);
63
+ useEffect(() => {
64
+ if (!props.random) {
65
+ return;
66
+ }
67
+
68
+ const interval = setInterval(() => {
69
+ setItems((items) => {
70
+ const p = Math.random();
71
+ if (p < 0.5) {
72
+ return items;
73
+ } else if (p < 0.99 && items.length > 1) {
74
+ return items.slice(0, -1);
75
+ } else {
76
+ return [...items, createItem(items[0]?.type)];
77
+ }
78
+ });
79
+ }, 3_000);
80
+
81
+ return () => clearInterval(interval);
82
+ }, []);
83
+
84
+ return (
85
+ <div className='grid grow p-4'>
86
+ <ResponsiveGrid {...props} Cell={TestCell} items={items} pinned={pinned} onPinnedChange={setPinned} />
87
+ </div>
88
+ );
89
+ };
90
+
91
+ const meta = {
61
92
  title: 'plugins/plugin-thread/ResponsiveGrid',
62
- component: ResponsiveGrid,
63
- render: (args) => {
64
- const [pinned, setPinned] = useState<string | undefined>(
65
- (args.pinned ?? args.items.length > 1) ? args.items[0]?.id : undefined,
66
- );
67
- const [items, setItems] = useState<TestItem[]>(args.items);
68
- useEffect(() => {
69
- if (!args.random) {
70
- return;
71
- }
72
-
73
- const interval = setInterval(() => {
74
- setItems((items) => {
75
- const p = Math.random();
76
- if (p < 0.5) {
77
- return items;
78
- } else if (p < 0.99 && items.length > 1) {
79
- return items.slice(0, -1);
80
- } else {
81
- return [...items, createItem(items[0]?.type)];
82
- }
83
- });
84
- }, 3_000);
85
-
86
- return () => clearInterval(interval);
87
- }, []);
88
-
89
- return (
90
- <div className='grid grow p-4'>
91
- <ResponsiveGrid {...args} Cell={TestCell} items={items} pinned={pinned} onPinnedChange={setPinned} />
92
- </div>
93
- );
94
- },
95
- decorators: [withTheme, withLayout({ fullscreen: true, classNames: 'justify-center' })],
93
+ component: ResponsiveGrid as any,
94
+ render: DefaultStory,
95
+ decorators: [withTheme],
96
96
  parameters: {
97
+ layout: 'fullscreen',
97
98
  translations,
98
99
  },
99
- };
100
+ } satisfies Meta<typeof DefaultStory>;
100
101
 
101
102
  const videoUrls = [
102
103
  'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4',
@@ -118,7 +119,7 @@ const createItem = (type?: 'image' | 'video') => {
118
119
 
119
120
  export default meta;
120
121
 
121
- type Story = StoryObj<StoryProps>;
122
+ type Story = StoryObj<typeof meta>;
122
123
 
123
124
  // TODO(burdon): Story to join/leave repeatedly to test stable position.
124
125
 
@@ -18,7 +18,7 @@ const MIN_GALLERY_HEIGHT = 250;
18
18
 
19
19
  const DEFAULT_GAP = 8;
20
20
 
21
- const maxImageSize = 'w-[2560px] h-[1440px]';
21
+ const maxImageSize = 'is-[2560px] bs-[1440px]';
22
22
 
23
23
  /**
24
24
  * Props for the ResponsiveGrid component.
@@ -136,13 +136,13 @@ export const ResponsiveGrid = <T extends object = any>({
136
136
  );
137
137
 
138
138
  return (
139
- <div ref={containerRef} className={mx('relative w-full h-full', classNames)}>
139
+ <div ref={containerRef} className={mx('relative is-full bs-full', classNames)}>
140
140
  {/* Placeholder elements to calculate layout. */}
141
141
  <div className='absolute inset-0 flex flex-col grow gap-2'>
142
142
  {/* Pinned item. */}
143
143
  {pinnedItem && (
144
144
  <div
145
- className={mx('flex grow-[2] shrink overflow-hidden justify-center items-center', hideGallery && 'h-full')}
145
+ className={mx('flex grow-[2] shrink overflow-hidden justify-center items-center', hideGallery && 'bs-full')}
146
146
  style={hideGallery ? {} : { height: dividerHeight }}
147
147
  >
148
148
  <SoloItem id={getId(pinnedItem)} debug={debug} />
@@ -157,7 +157,7 @@ export const ResponsiveGrid = <T extends object = any>({
157
157
  style={hideGallery ? {} : { minHeight: MIN_GALLERY_HEIGHT }}
158
158
  >
159
159
  {mainItems.length === 1 && (
160
- <div style={{ width: cellWidth }} className='flex h-full'>
160
+ <div style={{ width: cellWidth }} className='flex bs-full'>
161
161
  <SoloItem id={getId(mainItems[0])} debug={debug} />
162
162
  </div>
163
163
  )}
@@ -176,7 +176,7 @@ export const ResponsiveGrid = <T extends object = any>({
176
176
  key={getId(item)}
177
177
  {...{ 'data-grid-item': getId(item) }}
178
178
  className={mx(
179
- 'aspect-video max-h-full max-w-full w-auto h-auto',
179
+ 'aspect-video max-bs-full max-is-full is-auto bs-auto',
180
180
  debug && 'border border-primary-500',
181
181
  )}
182
182
  />
@@ -76,7 +76,7 @@ export const ResponsiveGridItem = <T extends object = any>({
76
76
  return (
77
77
  <div
78
78
  className={mx(
79
- 'relative w-full h-full group',
79
+ 'relative is-full bs-full group',
80
80
  'rounded-md outline outline-2 outline-neutral-900 transition-[outline-color] duration-500',
81
81
  speakingIndicator ? 'outline-green-500' : !video && 'outline-separator',
82
82
  classNames,
@@ -106,7 +106,10 @@ export const ResponsiveGridItem = <T extends object = any>({
106
106
  {/* {self && <Icon icon='ph--asterisk--regular' size={pinned ? 5 : 4} />} */}
107
107
  {screenshare && <Icon icon='ph--broadcast--regular' size={pinned ? 5 : 4} />}
108
108
  <div
109
- className={mx('bg-neutral-800 text-neutral-100 py-0.5 truncate rounded', pinned ? 'px-2' : 'px-1 text-xs')}
109
+ className={mx(
110
+ 'bg-neutral-800 text-neutral-100 plb-0.5 truncate rounded',
111
+ pinned ? 'pli-2' : 'pli-1 text-xs',
112
+ )}
110
113
  >
111
114
  {name}
112
115
  </div>
@@ -4,34 +4,28 @@
4
4
 
5
5
  import React, { useCallback, useMemo } from 'react';
6
6
 
7
- import {
8
- Capabilities,
9
- LayoutAction,
10
- createIntent,
11
- useCapabilities,
12
- useCapability,
13
- useIntentDispatcher,
14
- } from '@dxos/app-framework';
7
+ import { Capabilities, CollaborationActions, LayoutAction, createIntent } from '@dxos/app-framework';
8
+ import { useCapabilities, useCapability, useIntentDispatcher } from '@dxos/app-framework/react';
15
9
  import { Filter, Obj, Query, Relation } from '@dxos/echo';
16
- import { fullyQualifiedId, getSpace, useQuery } from '@dxos/react-client/echo';
10
+ import { Ref, getSpace, useQuery } from '@dxos/react-client/echo';
17
11
  import { useIdentity } from '@dxos/react-client/halo';
18
- import { useThemeContext, useTranslation } from '@dxos/react-ui';
12
+ import { useTranslation } from '@dxos/react-ui';
19
13
  import { useAttended } from '@dxos/react-ui-attention';
20
14
  import { StackItem } from '@dxos/react-ui-stack';
21
15
  import { Tabs } from '@dxos/react-ui-tabs';
22
- import { AnchoredTo } from '@dxos/schema';
16
+ import { mx } from '@dxos/react-ui-theme';
17
+ import { AnchoredTo, Thread } from '@dxos/types';
23
18
 
24
19
  import { ThreadCapabilities } from '../capabilities';
25
- import { CommentsContainer } from '../components';
20
+ import { CommentsContainer, type CommentsContainerProps } from '../components';
26
21
  import { meta } from '../meta';
27
- import { ThreadAction, ThreadType } from '../types';
22
+ import { ThreadAction } from '../types';
28
23
 
29
- export const ThreadComplementary = ({ subject }: { subject: any }) => {
24
+ export const ThreadCompanion = ({ subject }: { subject: any }) => {
30
25
  const { t } = useTranslation(meta.id);
31
26
  const { dispatchPromise: dispatch } = useIntentDispatcher();
32
27
  const identity = useIdentity();
33
- const { tx } = useThemeContext();
34
- const subjectId = fullyQualifiedId(subject);
28
+ const subjectId = Obj.getDXN(subject).toString();
35
29
 
36
30
  const { state, getViewState } = useCapability(ThreadCapabilities.MutableState);
37
31
  const drafts = state.drafts[subjectId];
@@ -51,18 +45,18 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
51
45
  );
52
46
 
53
47
  const space = getSpace(subject);
54
- const objectsAnchoredTo = useQuery(space, Query.select(Filter.ids(subject.id)).targetOf(AnchoredTo));
48
+ const objectsAnchoredTo = useQuery(space, Query.select(Filter.ids(subject.id)).targetOf(AnchoredTo.AnchoredTo));
55
49
  const anchors = objectsAnchoredTo
56
50
  .toSorted((a, b) => sort?.(a, b) ?? 0)
57
- .filter((anchor) => Obj.instanceOf(ThreadType, Relation.getSource(anchor)))
51
+ .filter((anchor) => Obj.instanceOf(Thread.Thread, Relation.getSource(anchor)))
58
52
  .concat(drafts ?? []);
59
53
 
60
54
  const attended = useAttended();
61
55
 
62
56
  const handleAttend = useCallback(
63
- (anchor: AnchoredTo) => {
64
- const thread = Relation.getSource(anchor) as ThreadType;
65
- const threadId = fullyQualifiedId(thread);
57
+ (anchor: AnchoredTo.AnchoredTo) => {
58
+ const thread = Relation.getSource(anchor) as Thread.Thread;
59
+ const threadId = Obj.getDXN(thread).toString();
66
60
 
67
61
  if (state.current !== threadId) {
68
62
  state.current = threadId;
@@ -73,7 +67,7 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
73
67
  void dispatch(
74
68
  createIntent(LayoutAction.ScrollIntoView, {
75
69
  part: 'current',
76
- subject: fullyQualifiedId(subject),
70
+ subject: Obj.getDXN(subject).toString(),
77
71
  options: {
78
72
  cursor: anchor.anchor,
79
73
  ref: threadId,
@@ -86,31 +80,68 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
86
80
  );
87
81
 
88
82
  const handleComment = useCallback(
89
- async (anchor: AnchoredTo, text: string) => {
83
+ async (anchor: AnchoredTo.AnchoredTo, text: string) => {
90
84
  await dispatch(
91
- createIntent(ThreadAction.AddMessage, { anchor, subject, sender: { identityDid: identity?.did }, text }),
85
+ createIntent(ThreadAction.AddMessage, {
86
+ anchor,
87
+ subject,
88
+ sender: { identityDid: identity?.did },
89
+ text,
90
+ }),
92
91
  );
93
92
 
94
- const thread = Relation.getSource(anchor) as ThreadType;
95
- state.current = fullyQualifiedId(thread);
93
+ const thread = Relation.getSource(anchor) as Thread.Thread;
94
+ state.current = Obj.getDXN(thread).toString();
96
95
  },
97
96
  [dispatch, identity, subject],
98
97
  );
99
98
 
100
99
  const handleResolve = useCallback(
101
- (anchor: AnchoredTo) =>
102
- dispatch(createIntent(ThreadAction.ToggleResolved, { thread: Relation.getSource(anchor) as ThreadType })),
100
+ (anchor: AnchoredTo.AnchoredTo) =>
101
+ dispatch(
102
+ createIntent(ThreadAction.ToggleResolved, {
103
+ thread: Relation.getSource(anchor) as Thread.Thread,
104
+ }),
105
+ ),
103
106
  [dispatch],
104
107
  );
105
108
 
106
109
  const handleThreadDelete = useCallback(
107
- (anchor: AnchoredTo) => dispatch(createIntent(ThreadAction.Delete, { anchor, subject })),
110
+ (anchor: AnchoredTo.AnchoredTo) => dispatch(createIntent(ThreadAction.Delete, { anchor, subject })),
108
111
  [dispatch, subject],
109
112
  );
110
113
 
111
114
  const handleMessageDelete = useCallback(
112
- (anchor: AnchoredTo, messageId: string) =>
113
- dispatch(createIntent(ThreadAction.DeleteMessage, { anchor, subject, messageId })),
115
+ (anchor: AnchoredTo.AnchoredTo, messageId: string) =>
116
+ dispatch(
117
+ createIntent(ThreadAction.DeleteMessage, {
118
+ anchor,
119
+ subject,
120
+ messageId,
121
+ }),
122
+ ),
123
+ [dispatch, subject],
124
+ );
125
+
126
+ const handleAcceptProposal = useCallback<NonNullable<CommentsContainerProps['onAcceptProposal']>>(
127
+ async (anchor, messageId) => {
128
+ const thread = Relation.getSource(anchor) as Thread.Thread;
129
+ const messageIndex = thread.messages.findIndex(Ref.hasObjectId(messageId));
130
+ const message = thread.messages[messageIndex]?.target;
131
+ const proposal = message?.blocks.find((block) => block._tag === 'proposal');
132
+ if (!proposal || !anchor.anchor) {
133
+ return;
134
+ }
135
+
136
+ await dispatch(
137
+ createIntent(CollaborationActions.AcceptProposal, {
138
+ subject,
139
+ anchor: anchor.anchor,
140
+ proposal,
141
+ }),
142
+ );
143
+ await dispatch(createIntent(ThreadAction.ToggleResolved, { thread }));
144
+ },
114
145
  [dispatch, subject],
115
146
  );
116
147
 
@@ -124,6 +155,7 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
124
155
  onResolve={handleResolve}
125
156
  onMessageDelete={handleMessageDelete}
126
157
  onThreadDelete={handleThreadDelete}
158
+ onAcceptProposal={handleAcceptProposal}
127
159
  />
128
160
  );
129
161
 
@@ -132,10 +164,13 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
132
164
  <Tabs.Root
133
165
  value={showResolvedThreads ? 'all' : 'unresolved'}
134
166
  orientation='horizontal'
135
- classNames='contents [&_[role="tabpanel"]]:min-bs-0 [&_[role="tabpanel"]]:overflow-y-auto [&_[role="tabpanel"]]:scrollbar-thin'
167
+ classNames={[
168
+ 'contents [&_[role="tabpanel"]]:min-bs-0 [&_[role="tabpanel"]]:overflow-y-auto [&_[role="tabpanel"]]:scrollbar-thin',
169
+ ]}
136
170
  onValueChange={onChangeViewState}
137
171
  >
138
- <Tabs.Tablist classNames={tx('toolbar.root', 'toolbar', {})}>
172
+ {/* TODO(burdon): Standardize (like Tollbar). */}
173
+ <Tabs.Tablist classNames={mx('bg-toolbarSurface border-be border-subduedSeparator')}>
139
174
  <Tabs.Tab value='unresolved' classNames='text-sm'>
140
175
  {t('show unresolved label')}
141
176
  </Tabs.Tab>
@@ -143,8 +178,10 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
143
178
  {t('show all label')}
144
179
  </Tabs.Tab>
145
180
  </Tabs.Tablist>
146
- <Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>
147
- <Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>
181
+ <div className='overflow-y-auto'>
182
+ <Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>
183
+ <Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>
184
+ </div>
148
185
  </Tabs.Root>
149
186
  </StackItem.Content>
150
187
  );
@@ -4,14 +4,13 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- // import { useTranslation } from '@dxos/react-ui';
8
- import { DeprecatedFormContainer } from '@dxos/react-ui-form';
7
+ import { useTranslation } from '@dxos/react-ui';
8
+ import { ControlPage } from '@dxos/react-ui-form';
9
9
 
10
- // import { meta } from '../meta';
10
+ import { meta } from '../meta';
11
11
  import type { ThreadSettingsProps } from '../types';
12
12
 
13
- export const ThreadSettings = ({ settings }: { settings: ThreadSettingsProps }) => {
14
- // const { t } = useTranslation(meta.id);
15
-
16
- return <DeprecatedFormContainer></DeprecatedFormContainer>;
13
+ export const ThreadSettings = ({ settings: _settings }: { settings: ThreadSettingsProps }) => {
14
+ const { t: _t } = useTranslation(meta.id);
15
+ return <ControlPage></ControlPage>;
17
16
  };
@@ -27,7 +27,10 @@ const parser = StreamLanguage.define<{ count: number }>({
27
27
  });
28
28
 
29
29
  const styles = HighlightStyle.define([
30
- { tag: tags.tagName, class: mx('dx-tag dx-tag--indigo text-baseText font-medium') },
30
+ {
31
+ tag: tags.tagName,
32
+ class: mx('dx-tag dx-tag--indigo text-baseText font-medium'),
33
+ },
31
34
  ]);
32
35
 
33
36
  export const command: Extension = [parser, syntaxHighlighting(styles)];
@@ -4,9 +4,6 @@
4
4
 
5
5
  import { lazy } from 'react';
6
6
 
7
- export const ChannelContainer = lazy(() => import('./ChannelContainer'));
8
- export const ChatContainer = lazy(() => import('./ChatContainer'));
9
-
10
7
  // TODO(wittjosiah): Suspense boundary for sidebar?
11
8
  export * from './Call';
12
9
  export * from './CallDebugPanel';
@@ -14,5 +11,8 @@ export * from './CallSidebar';
14
11
  export * from './CommentsContainer';
15
12
  export * from './CommentsThreadContainer';
16
13
  export * from './MessageContainer';
17
- export * from './ThreadComplementary';
14
+ export * from './ThreadCompanion';
18
15
  export * from './ThreadSettings';
16
+
17
+ export const ChannelContainer = lazy(() => import('./ChannelContainer'));
18
+ export const ChatContainer = lazy(() => import('./ChatContainer'));