@dxos/plugin-thread 0.8.4-main.67995b8 → 0.8.4-main.69d29f4

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 (406) hide show
  1. package/dist/lib/browser/app-graph-builder-7C2QW32W.mjs +188 -0
  2. package/dist/lib/browser/app-graph-builder-7C2QW32W.mjs.map +7 -0
  3. package/dist/lib/browser/blueprint-definition-UQ63QKQG.mjs +17 -0
  4. package/dist/lib/browser/blueprint-definition-UQ63QKQG.mjs.map +7 -0
  5. package/dist/lib/browser/blueprints/index.mjs +8 -0
  6. package/dist/lib/browser/call-manager-4P536YNX.mjs +26 -0
  7. package/dist/lib/browser/call-manager-4P536YNX.mjs.map +7 -0
  8. package/dist/lib/browser/chunk-2FIHSX35.mjs +293 -0
  9. package/dist/lib/browser/chunk-2FIHSX35.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  11. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-ERWASUQK.mjs → chunk-DLO2G3DM.mjs} +85 -50
  13. package/dist/lib/browser/chunk-DLO2G3DM.mjs.map +7 -0
  14. package/dist/lib/browser/{chunk-ZE7KWN36.mjs → chunk-ERK254BS.mjs} +381 -240
  15. package/dist/lib/browser/chunk-ERK254BS.mjs.map +7 -0
  16. package/dist/lib/browser/{chunk-6NSMBO3B.mjs → chunk-ISCHODBV.mjs} +55 -5
  17. package/dist/lib/browser/chunk-ISCHODBV.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  19. package/dist/lib/browser/chunk-YSHXWAL3.mjs +1815 -0
  20. package/dist/lib/browser/chunk-YSHXWAL3.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-ZFLSTQSE.mjs +106 -0
  22. package/dist/lib/browser/chunk-ZFLSTQSE.mjs.map +7 -0
  23. package/dist/lib/browser/index.mjs +132 -114
  24. package/dist/lib/browser/index.mjs.map +4 -4
  25. package/dist/lib/browser/markdown-QMJLRR6R.mjs +210 -0
  26. package/dist/lib/browser/markdown-QMJLRR6R.mjs.map +7 -0
  27. package/dist/lib/browser/meta.json +1 -1
  28. package/dist/lib/browser/operation-resolver-T63EP5TY.mjs +441 -0
  29. package/dist/lib/browser/operation-resolver-T63EP5TY.mjs.map +7 -0
  30. package/dist/lib/browser/react-root-56MJI77R.mjs +25 -0
  31. package/dist/lib/browser/react-root-56MJI77R.mjs.map +7 -0
  32. package/dist/lib/browser/react-surface-DMBHQOXJ.mjs +110 -0
  33. package/dist/lib/browser/react-surface-DMBHQOXJ.mjs.map +7 -0
  34. package/dist/lib/browser/repair-6OZ75AUU.mjs +38 -0
  35. package/dist/lib/browser/repair-6OZ75AUU.mjs.map +7 -0
  36. package/dist/lib/browser/settings-WZMJMML3.mjs +32 -0
  37. package/dist/lib/browser/settings-WZMJMML3.mjs.map +7 -0
  38. package/dist/lib/browser/state-SJR2GL5G.mjs +24 -0
  39. package/dist/lib/browser/state-SJR2GL5G.mjs.map +7 -0
  40. package/dist/lib/browser/types/index.mjs +10 -12
  41. package/dist/lib/node-esm/app-graph-builder-JCSVFRVY.mjs +189 -0
  42. package/dist/lib/node-esm/app-graph-builder-JCSVFRVY.mjs.map +7 -0
  43. package/dist/lib/node-esm/blueprint-definition-MZZXXL37.mjs +18 -0
  44. package/dist/lib/node-esm/blueprint-definition-MZZXXL37.mjs.map +7 -0
  45. package/dist/lib/node-esm/blueprints/index.mjs +9 -0
  46. package/dist/lib/node-esm/call-manager-FMLRR5S5.mjs +27 -0
  47. package/dist/lib/node-esm/call-manager-FMLRR5S5.mjs.map +7 -0
  48. package/dist/lib/node-esm/chunk-7XQLXMX7.mjs +1816 -0
  49. package/dist/lib/node-esm/chunk-7XQLXMX7.mjs.map +7 -0
  50. package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
  51. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
  52. package/dist/lib/node-esm/chunk-AQHPP6ZX.mjs +107 -0
  53. package/dist/lib/node-esm/chunk-AQHPP6ZX.mjs.map +7 -0
  54. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  55. package/dist/lib/node-esm/{chunk-25ABSYP2.mjs → chunk-KRBZBJRI.mjs} +85 -50
  56. package/dist/lib/node-esm/chunk-KRBZBJRI.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-IHDNQLLR.mjs → chunk-QP3KQOPQ.mjs} +381 -240
  58. package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-OU5BYIDO.mjs → chunk-VBI32FGI.mjs} +55 -5
  60. package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-WMWUXWAS.mjs +294 -0
  62. package/dist/lib/node-esm/chunk-WMWUXWAS.mjs.map +7 -0
  63. package/dist/lib/node-esm/index.mjs +132 -114
  64. package/dist/lib/node-esm/index.mjs.map +4 -4
  65. package/dist/lib/node-esm/markdown-L6LLQLIN.mjs +211 -0
  66. package/dist/lib/node-esm/markdown-L6LLQLIN.mjs.map +7 -0
  67. package/dist/lib/node-esm/meta.json +1 -1
  68. package/dist/lib/node-esm/operation-resolver-G6GZPBRP.mjs +442 -0
  69. package/dist/lib/node-esm/operation-resolver-G6GZPBRP.mjs.map +7 -0
  70. package/dist/lib/node-esm/react-root-V4W4X5GL.mjs +26 -0
  71. package/dist/lib/node-esm/react-root-V4W4X5GL.mjs.map +7 -0
  72. package/dist/lib/node-esm/react-surface-ELDSTUA3.mjs +111 -0
  73. package/dist/lib/node-esm/react-surface-ELDSTUA3.mjs.map +7 -0
  74. package/dist/lib/node-esm/repair-6777EPOM.mjs +39 -0
  75. package/dist/lib/node-esm/repair-6777EPOM.mjs.map +7 -0
  76. package/dist/lib/node-esm/settings-37CO3SNR.mjs +33 -0
  77. package/dist/lib/node-esm/settings-37CO3SNR.mjs.map +7 -0
  78. package/dist/lib/node-esm/state-5R3TZJQE.mjs +25 -0
  79. package/dist/lib/node-esm/state-5R3TZJQE.mjs.map +7 -0
  80. package/dist/lib/node-esm/types/index.mjs +10 -12
  81. package/dist/types/src/ThreadPlugin.d.ts +2 -1
  82. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  83. package/dist/types/src/blueprints/index.d.ts +2 -0
  84. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  85. package/dist/types/src/blueprints/thread-blueprint.d.ts +21 -0
  86. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
  87. package/dist/types/src/calls/call-manager.d.ts +40 -30
  88. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  89. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +2 -2
  90. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  91. package/dist/types/src/calls/media-manager.d.ts +2 -2
  92. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  93. package/dist/types/src/calls/types.d.ts +1 -1
  94. package/dist/types/src/calls/types.d.ts.map +1 -1
  95. package/dist/types/src/calls/util/calls-service.d.ts +5 -3
  96. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  97. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  98. package/dist/types/src/calls/util/task-scheduling.d.ts +2 -2
  99. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
  100. package/dist/types/src/calls-service.stories.d.ts +10 -9
  101. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  102. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  103. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  104. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  105. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  106. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +9 -0
  107. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
  108. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
  109. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -0
  110. package/dist/types/src/capabilities/call-manager/call-manager.d.ts +6 -0
  111. package/dist/types/src/capabilities/call-manager/call-manager.d.ts.map +1 -0
  112. package/dist/types/src/capabilities/call-manager/index.d.ts +3 -0
  113. package/dist/types/src/capabilities/call-manager/index.d.ts.map +1 -0
  114. package/dist/types/src/capabilities/index.d.ts +10 -15
  115. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  116. package/dist/types/src/capabilities/markdown/index.d.ts +3 -0
  117. package/dist/types/src/capabilities/markdown/index.d.ts.map +1 -0
  118. package/dist/types/src/capabilities/markdown/markdown.d.ts +5 -0
  119. package/dist/types/src/capabilities/markdown/markdown.d.ts.map +1 -0
  120. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  121. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  122. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  123. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  124. package/dist/types/src/capabilities/react-root/index.d.ts +6 -0
  125. package/dist/types/src/capabilities/react-root/index.d.ts.map +1 -0
  126. package/dist/types/src/capabilities/react-root/react-root.d.ts +9 -0
  127. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -0
  128. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  129. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  130. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  131. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  132. package/dist/types/src/capabilities/repair/index.d.ts +3 -0
  133. package/dist/types/src/capabilities/repair/index.d.ts.map +1 -0
  134. package/dist/types/src/capabilities/repair/repair.d.ts +6 -0
  135. package/dist/types/src/capabilities/repair/repair.d.ts.map +1 -0
  136. package/dist/types/src/capabilities/settings/index.d.ts +3 -0
  137. package/dist/types/src/capabilities/settings/index.d.ts.map +1 -0
  138. package/dist/types/src/capabilities/settings/settings.d.ts +5 -0
  139. package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -0
  140. package/dist/types/src/capabilities/state/index.d.ts +3 -0
  141. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  142. package/dist/types/src/capabilities/state/state.d.ts +7 -0
  143. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  144. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  145. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  146. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  147. package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
  148. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  149. package/dist/types/src/components/CallSidebar.d.ts.map +1 -1
  150. package/dist/types/src/components/ChannelContainer.d.ts +5 -6
  151. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  152. package/dist/types/src/components/ChannelContainer.stories.d.ts +159 -5
  153. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  154. package/dist/types/src/components/Chat.stories.d.ts +162 -5
  155. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  156. package/dist/types/src/components/ChatContainer.d.ts +7 -6
  157. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  158. package/dist/types/src/components/Comments.stories.d.ts +160 -4
  159. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  160. package/dist/types/src/components/CommentsContainer.d.ts +2 -2
  161. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  162. package/dist/types/src/components/CommentsThreadContainer.d.ts +9 -9
  163. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  164. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  165. package/dist/types/src/components/Media/VideoObject.d.ts +3 -3
  166. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  167. package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
  168. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  169. package/dist/types/src/components/MessageContainer.d.ts +7 -3
  170. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  171. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  172. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  173. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +159 -3
  174. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  175. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +161 -4
  176. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  177. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  178. package/dist/types/src/components/ThreadCompanion.d.ts +5 -0
  179. package/dist/types/src/components/ThreadCompanion.d.ts.map +1 -0
  180. package/dist/types/src/components/ThreadSettings.d.ts +4 -2
  181. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  182. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  183. package/dist/types/src/components/index.d.ts +3 -3
  184. package/dist/types/src/components/index.d.ts.map +1 -1
  185. package/dist/types/src/components/testing.d.ts +3 -2
  186. package/dist/types/src/components/testing.d.ts.map +1 -1
  187. package/dist/types/src/extensions/threads.d.ts +7 -2
  188. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  189. package/dist/types/src/functions/create-proposals.d.ts +6 -0
  190. package/dist/types/src/functions/create-proposals.d.ts.map +1 -0
  191. package/dist/types/src/functions/index.d.ts +2 -0
  192. package/dist/types/src/functions/index.d.ts.map +1 -0
  193. package/dist/types/src/hooks/analytics.d.ts +2 -3
  194. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  195. package/dist/types/src/hooks/index.d.ts +2 -1
  196. package/dist/types/src/hooks/index.d.ts.map +1 -1
  197. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  198. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  199. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  200. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  201. package/dist/types/src/index.d.ts +1 -1
  202. package/dist/types/src/index.d.ts.map +1 -1
  203. package/dist/types/src/meta.d.ts +3 -4
  204. package/dist/types/src/meta.d.ts.map +1 -1
  205. package/dist/types/src/testing/stories.d.ts +2 -1
  206. package/dist/types/src/testing/stories.d.ts.map +1 -1
  207. package/dist/types/src/translations.d.ts +79 -7
  208. package/dist/types/src/translations.d.ts.map +1 -1
  209. package/dist/types/src/types/Channel.d.ts +695 -0
  210. package/dist/types/src/types/Channel.d.ts.map +1 -0
  211. package/dist/types/src/types/capabilities.d.ts +23 -0
  212. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  213. package/dist/types/src/types/index.d.ts +2 -1
  214. package/dist/types/src/types/index.d.ts.map +1 -1
  215. package/dist/types/src/types/types.d.ts +3223 -365
  216. package/dist/types/src/types/types.d.ts.map +1 -1
  217. package/dist/types/tsconfig.tsbuildinfo +1 -1
  218. package/package.json +89 -66
  219. package/src/ThreadPlugin.tsx +107 -129
  220. package/src/blueprints/index.ts +5 -0
  221. package/src/blueprints/thread-blueprint.ts +32 -0
  222. package/src/calls/call-manager.ts +78 -54
  223. package/src/calls/call-swarm-synchronizer.ts +3 -3
  224. package/src/calls/media-manager.ts +67 -38
  225. package/src/calls/types.ts +8 -4
  226. package/src/calls/util/calls-service.ts +66 -15
  227. package/src/calls/util/stub-media-streams.ts +64 -7
  228. package/src/calls/util/task-scheduling.ts +4 -4
  229. package/src/calls-service.stories.tsx +78 -65
  230. package/src/capabilities/app-graph-builder/app-graph-builder.ts +201 -0
  231. package/src/capabilities/app-graph-builder/index.ts +7 -0
  232. package/src/capabilities/blueprint-definition/blueprint-definition.ts +23 -0
  233. package/src/capabilities/blueprint-definition/index.ts +7 -0
  234. package/src/capabilities/call-manager/call-manager.ts +26 -0
  235. package/src/capabilities/call-manager/index.ts +7 -0
  236. package/src/capabilities/index.ts +10 -12
  237. package/src/capabilities/markdown/index.ts +7 -0
  238. package/src/capabilities/markdown/markdown.ts +83 -0
  239. package/src/capabilities/operation-resolver/index.ts +7 -0
  240. package/src/capabilities/operation-resolver/operation-resolver.ts +400 -0
  241. package/src/capabilities/react-root/index.ts +7 -0
  242. package/src/capabilities/react-root/react-root.tsx +20 -0
  243. package/src/capabilities/react-surface/index.ts +7 -0
  244. package/src/capabilities/react-surface/react-surface.tsx +97 -0
  245. package/src/capabilities/repair/index.ts +7 -0
  246. package/src/capabilities/repair/repair.ts +51 -0
  247. package/src/capabilities/settings/index.ts +7 -0
  248. package/src/capabilities/settings/settings.ts +33 -0
  249. package/src/capabilities/state/index.ts +7 -0
  250. package/src/capabilities/state/state.ts +22 -0
  251. package/src/components/Call/Call.tsx +11 -6
  252. package/src/components/Call/Toolbar.tsx +38 -30
  253. package/src/components/CallDebugPanel.tsx +112 -55
  254. package/src/components/CallSidebar.tsx +6 -3
  255. package/src/components/ChannelContainer.stories.tsx +22 -19
  256. package/src/components/ChannelContainer.tsx +36 -29
  257. package/src/components/Chat.stories.tsx +37 -40
  258. package/src/components/ChatContainer.tsx +52 -38
  259. package/src/components/Comments.stories.tsx +52 -51
  260. package/src/components/CommentsContainer.tsx +7 -8
  261. package/src/components/CommentsThreadContainer.tsx +47 -41
  262. package/src/components/Lobby/Lobby.tsx +10 -8
  263. package/src/components/Media/AudioStream.tsx +2 -2
  264. package/src/components/Media/VideoObject.stories.tsx +36 -28
  265. package/src/components/Media/VideoObject.tsx +2 -2
  266. package/src/components/MessageContainer.tsx +98 -33
  267. package/src/components/Participant/Participant.tsx +34 -15
  268. package/src/components/Participant/ParticipantGrid.tsx +2 -1
  269. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +8 -8
  270. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +3 -3
  271. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +45 -43
  272. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +7 -7
  273. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +8 -5
  274. package/src/components/ThreadCompanion.tsx +193 -0
  275. package/src/components/ThreadSettings.tsx +10 -6
  276. package/src/components/command-extension.ts +7 -4
  277. package/src/components/index.ts +4 -7
  278. package/src/components/testing.ts +26 -6
  279. package/src/extensions/threads.ts +86 -42
  280. package/src/functions/create-proposals.ts +57 -0
  281. package/src/functions/index.ts +5 -0
  282. package/src/hooks/analytics.ts +21 -21
  283. package/src/hooks/index.ts +3 -1
  284. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  285. package/src/hooks/useDebugMode.ts +1 -1
  286. package/src/hooks/useVideoStreamTrack.tsx +6 -3
  287. package/src/index.ts +1 -1
  288. package/src/meta.ts +11 -7
  289. package/src/testing/stories.ts +17 -16
  290. package/src/translations.ts +9 -4
  291. package/src/types/Channel.ts +30 -0
  292. package/src/types/capabilities.ts +34 -0
  293. package/src/types/index.ts +2 -1
  294. package/src/types/types.ts +170 -82
  295. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  296. package/src/typings.d.ts +8 -0
  297. package/src/util.ts +1 -1
  298. package/dist/lib/browser/ChannelContainer-3GIE7ASU.mjs +0 -16
  299. package/dist/lib/browser/ChatContainer-AIGIWAUG.mjs +0 -15
  300. package/dist/lib/browser/app-graph-builder-N7BE5TYW.mjs +0 -171
  301. package/dist/lib/browser/app-graph-builder-N7BE5TYW.mjs.map +0 -7
  302. package/dist/lib/browser/call-manager-NIPDYUVD.mjs +0 -24
  303. package/dist/lib/browser/call-manager-NIPDYUVD.mjs.map +0 -7
  304. package/dist/lib/browser/chunk-3SGRT4NM.mjs +0 -367
  305. package/dist/lib/browser/chunk-3SGRT4NM.mjs.map +0 -7
  306. package/dist/lib/browser/chunk-6NSMBO3B.mjs.map +0 -7
  307. package/dist/lib/browser/chunk-ERWASUQK.mjs.map +0 -7
  308. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  309. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  310. package/dist/lib/browser/chunk-FR7KJPNY.mjs +0 -21
  311. package/dist/lib/browser/chunk-FR7KJPNY.mjs.map +0 -7
  312. package/dist/lib/browser/chunk-GCLD5ESP.mjs +0 -137
  313. package/dist/lib/browser/chunk-GCLD5ESP.mjs.map +0 -7
  314. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  315. package/dist/lib/browser/chunk-KWPRNHTK.mjs +0 -984
  316. package/dist/lib/browser/chunk-KWPRNHTK.mjs.map +0 -7
  317. package/dist/lib/browser/chunk-LGSDKXPF.mjs +0 -18
  318. package/dist/lib/browser/chunk-LGSDKXPF.mjs.map +0 -7
  319. package/dist/lib/browser/chunk-VUWC4IJM.mjs +0 -479
  320. package/dist/lib/browser/chunk-VUWC4IJM.mjs.map +0 -7
  321. package/dist/lib/browser/chunk-ZE7KWN36.mjs.map +0 -7
  322. package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs +0 -369
  323. package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs.map +0 -7
  324. package/dist/lib/browser/markdown-M3FMR7OD.mjs +0 -169
  325. package/dist/lib/browser/markdown-M3FMR7OD.mjs.map +0 -7
  326. package/dist/lib/browser/react-root-JEUSQXI6.mjs +0 -28
  327. package/dist/lib/browser/react-root-JEUSQXI6.mjs.map +0 -7
  328. package/dist/lib/browser/react-surface-XWS6GIZY.mjs +0 -109
  329. package/dist/lib/browser/react-surface-XWS6GIZY.mjs.map +0 -7
  330. package/dist/lib/browser/settings-E32MTL7A.mjs +0 -22
  331. package/dist/lib/browser/settings-E32MTL7A.mjs.map +0 -7
  332. package/dist/lib/browser/state-H6CYONWE.mjs +0 -34
  333. package/dist/lib/browser/state-H6CYONWE.mjs.map +0 -7
  334. package/dist/lib/node-esm/ChannelContainer-7FXCKO7X.mjs +0 -17
  335. package/dist/lib/node-esm/ChatContainer-IQUWU426.mjs +0 -16
  336. package/dist/lib/node-esm/app-graph-builder-VCW76Z6V.mjs +0 -172
  337. package/dist/lib/node-esm/app-graph-builder-VCW76Z6V.mjs.map +0 -7
  338. package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs +0 -25
  339. package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs.map +0 -7
  340. package/dist/lib/node-esm/chunk-25ABSYP2.mjs.map +0 -7
  341. package/dist/lib/node-esm/chunk-2CXOK2TD.mjs +0 -23
  342. package/dist/lib/node-esm/chunk-2CXOK2TD.mjs.map +0 -7
  343. package/dist/lib/node-esm/chunk-2MFNK53T.mjs +0 -480
  344. package/dist/lib/node-esm/chunk-2MFNK53T.mjs.map +0 -7
  345. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  346. package/dist/lib/node-esm/chunk-75RJ5DJI.mjs +0 -19
  347. package/dist/lib/node-esm/chunk-75RJ5DJI.mjs.map +0 -7
  348. package/dist/lib/node-esm/chunk-C3XFMUAY.mjs +0 -985
  349. package/dist/lib/node-esm/chunk-C3XFMUAY.mjs.map +0 -7
  350. package/dist/lib/node-esm/chunk-FLBFYGBK.mjs +0 -368
  351. package/dist/lib/node-esm/chunk-FLBFYGBK.mjs.map +0 -7
  352. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  353. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  354. package/dist/lib/node-esm/chunk-IHDNQLLR.mjs.map +0 -7
  355. package/dist/lib/node-esm/chunk-OU5BYIDO.mjs.map +0 -7
  356. package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs +0 -138
  357. package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs.map +0 -7
  358. package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs +0 -370
  359. package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs.map +0 -7
  360. package/dist/lib/node-esm/markdown-INKTE4MH.mjs +0 -170
  361. package/dist/lib/node-esm/markdown-INKTE4MH.mjs.map +0 -7
  362. package/dist/lib/node-esm/react-root-XYYY2JXZ.mjs +0 -29
  363. package/dist/lib/node-esm/react-root-XYYY2JXZ.mjs.map +0 -7
  364. package/dist/lib/node-esm/react-surface-MJ33KPYE.mjs +0 -110
  365. package/dist/lib/node-esm/react-surface-MJ33KPYE.mjs.map +0 -7
  366. package/dist/lib/node-esm/settings-SJ24YG7M.mjs +0 -23
  367. package/dist/lib/node-esm/settings-SJ24YG7M.mjs.map +0 -7
  368. package/dist/lib/node-esm/state-D7WNDT3N.mjs +0 -35
  369. package/dist/lib/node-esm/state-D7WNDT3N.mjs.map +0 -7
  370. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  371. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  372. package/dist/types/src/capabilities/call-manager.d.ts +0 -5
  373. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  374. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  375. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  376. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  377. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  378. package/dist/types/src/capabilities/markdown.d.ts +0 -4
  379. package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
  380. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  381. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  382. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  383. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  384. package/dist/types/src/capabilities/settings.d.ts +0 -4
  385. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  386. package/dist/types/src/capabilities/state.d.ts +0 -7
  387. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  388. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  389. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  390. package/dist/types/src/types/schema.d.ts +0 -162
  391. package/dist/types/src/types/schema.d.ts.map +0 -1
  392. package/src/capabilities/app-graph-builder.ts +0 -180
  393. package/src/capabilities/call-manager.ts +0 -19
  394. package/src/capabilities/capabilities.ts +0 -33
  395. package/src/capabilities/intent-resolver.ts +0 -314
  396. package/src/capabilities/markdown.ts +0 -68
  397. package/src/capabilities/react-root.tsx +0 -17
  398. package/src/capabilities/react-surface.tsx +0 -88
  399. package/src/capabilities/settings.ts +0 -19
  400. package/src/capabilities/state.ts +0 -25
  401. package/src/components/ThreadComplementary.tsx +0 -151
  402. package/src/types/schema.ts +0 -33
  403. /package/dist/lib/browser/{ChannelContainer-3GIE7ASU.mjs.map → blueprints/index.mjs.map} +0 -0
  404. /package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  405. /package/dist/lib/node-esm/{ChannelContainer-7FXCKO7X.mjs.map → blueprints/index.mjs.map} +0 -0
  406. /package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs.map → chunk-HSLMI22Q.mjs.map} +0 -0
@@ -2,14 +2,15 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import { useAtomValue } from '@effect-atom/atom-react';
5
6
  import React, { type FC, type PropsWithChildren, useEffect, useState } from 'react';
6
7
 
7
- import { useCapability } from '@dxos/app-framework';
8
- import { useTranslation, type ThemedClassName } from '@dxos/react-ui';
9
- import { mx } from '@dxos/react-ui-theme';
8
+ import { useCapability } from '@dxos/app-framework/react';
9
+ import { type ThemedClassName, useTranslation } from '@dxos/react-ui';
10
+ import { mx } from '@dxos/ui-theme';
10
11
 
11
- import { ThreadCapabilities } from '../../capabilities';
12
12
  import { meta } from '../../meta';
13
+ import { ThreadCapabilities } from '../../types';
13
14
  import { Toolbar, type ToolbarProps } from '../Call';
14
15
  import { VideoObject } from '../Media';
15
16
  import { ResponsiveContainer } from '../ResponsiveGrid';
@@ -39,9 +40,10 @@ type LobbyPreviewProps = {};
39
40
  const LobbyPreview: FC<LobbyPreviewProps> = () => {
40
41
  const { t } = useTranslation(meta.id);
41
42
  const call = useCapability(ThreadCapabilities.CallManager);
43
+ const media = useAtomValue(call.mediaAtom);
42
44
  const [classNames, setClassNames] = useState('');
43
45
  useEffect(() => {
44
- if (!call.media.videoEnabled) {
46
+ if (!media.videoEnabled) {
45
47
  setClassNames('');
46
48
  return;
47
49
  }
@@ -52,14 +54,14 @@ const LobbyPreview: FC<LobbyPreviewProps> = () => {
52
54
  }, 500);
53
55
 
54
56
  return () => clearTimeout(timeout);
55
- }, [call.media.videoEnabled]);
57
+ }, [media.videoEnabled]);
56
58
 
57
59
  return (
58
60
  <div className='grid grow p-4'>
59
61
  <ResponsiveContainer>
60
- {(call.media.videoEnabled && (
62
+ {(media.videoEnabled && (
61
63
  <VideoObject
62
- videoStream={call.media.videoStream}
64
+ videoStream={media.videoStream}
63
65
  flip
64
66
  muted
65
67
  classNames={mx(
@@ -46,13 +46,13 @@ export const AudioStream: FC<AudioStreamProps> = ({ tracks }) => {
46
46
  );
47
47
  };
48
48
 
49
- type AudioTrackProps = {
49
+ type AudioTrackParams = {
50
50
  track: MediaStreamTrack;
51
51
  mediaStream: MediaStream;
52
52
  resetSrcObject: () => void;
53
53
  };
54
54
 
55
- const AudioTrack = ({ track, mediaStream, resetSrcObject }: AudioTrackProps) => {
55
+ const AudioTrack = ({ track, mediaStream, resetSrcObject }: AudioTrackParams) => {
56
56
  useEffect(() => {
57
57
  const currentTrack = track;
58
58
  mediaStream.addTrack(currentTrack);
@@ -2,47 +2,55 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type StoryObj, type Meta } from '@storybook/react-vite';
5
+ import { type StoryObj } from '@storybook/react-vite';
8
6
  import React, { useEffect, useState } from 'react';
9
7
 
10
8
  import { scheduleTask } from '@dxos/async';
11
9
  import { Context } from '@dxos/context';
12
10
  import { log } from '@dxos/log';
13
- import { withTheme, withLayout } from '@dxos/storybook-utils';
11
+ import { withTheme } from '@dxos/react-ui/testing';
14
12
 
15
- import { VideoObject } from './VideoObject';
16
13
  import { getUserMediaTrack } from '../../calls';
17
14
  import { ResponsiveContainer } from '../ResponsiveGrid';
18
15
 
19
- const meta: Meta<typeof VideoObject> = {
20
- title: 'plugins/plugin-thread/VideoObject',
21
- component: VideoObject,
22
- render: (args) => {
23
- log.info('render');
24
- const [videoStream, setVideoStream] = useState<MediaStream>();
25
- useEffect(() => {
26
- const ctx = new Context();
27
- scheduleTask(ctx, async () => {
16
+ import { VideoObject, type VideoObjectProps } from './VideoObject';
17
+
18
+ const DefaultStory = (props: VideoObjectProps) => {
19
+ log.info('render');
20
+ const [videoStream, setVideoStream] = useState<MediaStream>();
21
+ useEffect(() => {
22
+ const ctx = new Context();
23
+ scheduleTask(ctx, async () => {
24
+ try {
28
25
  const stream = new MediaStream();
29
26
  stream.addTrack(await getUserMediaTrack('videoinput'));
30
27
  setVideoStream(stream);
31
- });
32
-
33
- return () => {
34
- void ctx.dispose();
35
- videoStream?.getTracks().forEach((track) => track.stop());
36
- };
37
- }, []);
38
-
39
- return (
40
- <ResponsiveContainer>
41
- <VideoObject videoStream={videoStream} {...args} flip />
42
- </ResponsiveContainer>
43
- );
28
+ } catch (err) {
29
+ log.catch(err);
30
+ }
31
+ });
32
+
33
+ return () => {
34
+ void ctx.dispose();
35
+ videoStream?.getTracks().forEach((track) => track.stop());
36
+ };
37
+ }, []);
38
+
39
+ return (
40
+ <ResponsiveContainer>
41
+ <VideoObject videoStream={videoStream} flip {...props} />
42
+ </ResponsiveContainer>
43
+ );
44
+ };
45
+
46
+ const meta = {
47
+ title: 'plugins/plugin-thread/VideoObject',
48
+ component: VideoObject,
49
+ render: DefaultStory,
50
+ decorators: [withTheme],
51
+ parameters: {
52
+ layout: 'fullscreen',
44
53
  },
45
- decorators: [withTheme, withLayout({ fullscreen: true, classNames: 'justify-center' })],
46
54
  };
47
55
 
48
56
  export default meta;
@@ -5,7 +5,7 @@
5
5
  import React, { type JSX, forwardRef, memo, useEffect, useRef } from 'react';
6
6
 
7
7
  import { type ThemedClassName } from '@dxos/react-ui';
8
- import { mx } from '@dxos/react-ui-theme';
8
+ import { mx } from '@dxos/ui-theme';
9
9
 
10
10
  export type VideoObjectProps = Omit<JSX.IntrinsicElements['video'], 'className' | 'ref'> &
11
11
  ThemedClassName<{
@@ -32,7 +32,7 @@ export const VideoObject = memo(
32
32
  return (
33
33
  <video
34
34
  className={mx(
35
- 'w-full aspect-video',
35
+ 'is-full aspect-video',
36
36
  flip && 'scale-x-[-1]',
37
37
  contain ? 'object-contain' : 'object-cover',
38
38
  classNames,
@@ -5,50 +5,91 @@
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';
9
- import { type Obj, Ref, type Type } from '@dxos/echo';
8
+ import { Surface } from '@dxos/app-framework/react';
9
+ import { type Obj, Ref } from '@dxos/echo';
10
+ import { useObject } from '@dxos/echo-react';
10
11
  import { PublicKey } from '@dxos/react-client';
11
12
  import { type SpaceMember } from '@dxos/react-client/echo';
12
- import { useIdentity, type Identity } from '@dxos/react-client/halo';
13
+ import { type Identity, useIdentity } from '@dxos/react-client/halo';
13
14
  import { IconButton, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';
14
- import { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';
15
- import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';
15
+ import { useTextEditor } from '@dxos/react-ui-editor';
16
+ import { Card } from '@dxos/react-ui-mosaic';
16
17
  import { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';
17
- import { type DataType } from '@dxos/schema';
18
+ import { type ContentBlock, type Message } from '@dxos/types';
19
+ import { createBasicExtensions, createThemeExtensions } from '@dxos/ui-editor';
20
+ import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';
18
21
 
19
- import { commentControlClassNames } from './CommentsThreadContainer';
20
- import { command } from './command-extension';
21
22
  import { useOnEditAnalytics } from '../hooks';
22
23
  import { meta } from '../meta';
23
24
  import { getMessageMetadata } from '../util';
24
25
 
26
+ import { command } from './command-extension';
27
+
28
+ export const buttonGroupClassNames = 'flex flex-row items-center gap-0.5 pie-2';
29
+ export const buttonClassNames = '!p-1 transition-opacity';
30
+
25
31
  export type MessageContainerProps = {
26
- message: DataType.Message;
32
+ message: Obj.Obj<Message.Message> | Ref.Ref<Obj.Obj<Message.Message>>;
27
33
  members: SpaceMember[];
28
34
  editable?: boolean;
29
35
  onDelete?: (id: string) => void;
36
+ onAcceptProposal?: (id: string) => void;
30
37
  };
31
38
 
32
- export const MessageContainer = ({ message, members, editable = false, onDelete }: MessageContainerProps) => {
39
+ export const MessageContainer = ({
40
+ message: messageOrRef,
41
+ members,
42
+ editable = false,
43
+ onDelete,
44
+ onAcceptProposal,
45
+ }: MessageContainerProps) => {
33
46
  const { t } = useTranslation(meta.id);
47
+ const [message, updateMessage] = useObject(messageOrRef);
48
+ const identity = useIdentity();
49
+ const [editing, setEditing] = useState(false);
50
+
51
+ const textBlockIndex = message?.blocks.findIndex((block) => block._tag === 'text') ?? -1;
52
+
53
+ const handleEdit = useCallback(() => setEditing((editing) => !editing), []);
54
+ const handleDelete = useCallback(() => message && onDelete?.(message.id), [message, onDelete]);
55
+ const handleAcceptProposal = useCallback(
56
+ () => message && onAcceptProposal?.(message.id),
57
+ [message, onAcceptProposal],
58
+ );
59
+ const handleTextBlockChange = useCallback(
60
+ (newText: string) => {
61
+ updateMessage((m) => {
62
+ const targetBlock = m.blocks[textBlockIndex];
63
+ if (targetBlock && targetBlock._tag === 'text') {
64
+ targetBlock.text = newText;
65
+ }
66
+ });
67
+ },
68
+ [updateMessage, textBlockIndex],
69
+ );
70
+
71
+ const textBlock =
72
+ message && textBlockIndex !== -1 ? (message.blocks[textBlockIndex] as ContentBlock.Text) : undefined;
73
+ useOnEditAnalytics(message, textBlock, !!editing);
74
+
75
+ if (!message) {
76
+ return null;
77
+ }
78
+
34
79
  const senderIdentity = members.find(
35
80
  (member) =>
36
81
  (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||
37
82
  (message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey)),
38
83
  )?.identity;
39
84
  const messageMetadata = getMessageMetadata(message.id, senderIdentity);
40
- const userIsAuthor = useIdentity()?.did === messageMetadata.authorId;
41
- const [editing, setEditing] = useState(false);
42
- const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);
43
- const textBlock = message.blocks.find((block) => block._tag === 'text');
85
+ const userIsAuthor = identity?.did === messageMetadata.authorId;
86
+ const proposalBlock = message.blocks.find((block) => block._tag === 'proposal');
44
87
  const references = message.blocks.filter((block) => block._tag === 'reference').map((block) => block.reference);
45
88
 
46
- useOnEditAnalytics(message, textBlock, !!editing);
47
-
48
89
  return (
49
90
  <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>
50
91
  <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>
51
- <div className='flex flex-row items-center gap-0.5'>
92
+ <div role='none' className={buttonGroupClassNames}>
52
93
  {userIsAuthor && editable && (
53
94
  <IconButton
54
95
  data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}
@@ -56,8 +97,20 @@ export const MessageContainer = ({ message, members, editable = false, onDelete
56
97
  icon={editing ? 'ph--check--regular' : 'ph--pencil-simple--regular'}
57
98
  iconOnly
58
99
  label={t(editing ? 'save message label' : 'edit message label')}
59
- classNames={[commentControlClassNames, hoverableControlItem]}
60
- onClick={() => setEditing((editing) => !editing)}
100
+ classNames={[buttonClassNames, hoverableControlItem]}
101
+ onClick={handleEdit}
102
+ />
103
+ )}
104
+ {/* TODO(wittjosiah): Proposal controls should probably be hoisted to thread level. */}
105
+ {proposalBlock && onAcceptProposal && (
106
+ <IconButton
107
+ data-testid='thread.message.accept'
108
+ variant='ghost'
109
+ icon='ph--check--regular'
110
+ iconOnly
111
+ label={t('accept proposal label')}
112
+ classNames={[buttonClassNames, hoverableControlItem]}
113
+ onClick={handleAcceptProposal}
61
114
  />
62
115
  )}
63
116
  {onDelete && (
@@ -67,21 +120,24 @@ export const MessageContainer = ({ message, members, editable = false, onDelete
67
120
  icon='ph--x--regular'
68
121
  iconOnly
69
122
  label={t('delete message label')}
70
- classNames={[commentControlClassNames, hoverableControlItem]}
71
- onClick={() => handleDelete()}
123
+ classNames={[buttonClassNames, hoverableControlItem]}
124
+ onClick={handleDelete}
72
125
  />
73
126
  )}
74
127
  </div>
75
128
  </MessageHeading>
76
- {textBlock && <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} />}
129
+ {textBlock && (
130
+ <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} onSave={handleTextBlockChange} />
131
+ )}
132
+ {proposalBlock && <ProposalBlock block={proposalBlock} />}
77
133
  {Ref.Array.targets(references).map((reference, index) => (
78
- <MessagePart key={index} part={reference} />
134
+ <MessagePart key={index} part={reference as Obj.Unknown} />
79
135
  ))}
80
136
  </MessageRoot>
81
137
  );
82
138
  };
83
139
 
84
- const MessagePart = ({ part }: { part: Type.Expando }) => {
140
+ const MessagePart = ({ part }: { part: Obj.Unknown }) => {
85
141
  return <MessageBlockObjectTile subject={part} />;
86
142
  };
87
143
 
@@ -89,11 +145,13 @@ const TextboxBlock = ({
89
145
  block,
90
146
  isAuthor,
91
147
  editing,
148
+ onSave,
92
149
  }: {
93
- block: DataType.MessageBlock.Text;
150
+ block: ContentBlock.Text;
94
151
  editing?: boolean;
95
152
  isAuthor?: boolean;
96
153
  identity?: Identity;
154
+ onSave?: (newText: string) => void;
97
155
  }) => {
98
156
  const { themeMode } = useThemeContext();
99
157
  const inMemoryContentRef = useRef(block.text);
@@ -103,8 +161,8 @@ const TextboxBlock = ({
103
161
  }, []);
104
162
 
105
163
  const saveDocumentChange = useCallback(() => {
106
- block.text = inMemoryContentRef.current;
107
- }, [block]);
164
+ onSave?.(inMemoryContentRef.current);
165
+ }, [onSave]);
108
166
 
109
167
  useOnTransition(editing, true, false, saveDocumentChange);
110
168
 
@@ -132,7 +190,15 @@ const TextboxBlock = ({
132
190
  return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;
133
191
  };
134
192
 
135
- const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(({ subject }, forwardedRef) => {
193
+ const ProposalBlock = ({ block }: { block: ContentBlock.Proposal }) => {
194
+ return (
195
+ <div role='none' className='mie-4 italic'>
196
+ {block.text}
197
+ </div>
198
+ );
199
+ };
200
+
201
+ const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Unknown }>(({ subject }, forwardedRef) => {
136
202
  // TODO(burdon): Use annotation to get title.
137
203
  let title = (subject as any).name ?? (subject as any).title ?? (subject as any).type ?? 'Object';
138
204
  if (typeof title !== 'string') {
@@ -140,12 +206,11 @@ const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(
140
206
  }
141
207
 
142
208
  return (
143
- <div
144
- role='group'
145
- className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}
209
+ <Card.Root
210
+ className={mx('grid col-span-3 plb-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}
146
211
  ref={forwardedRef}
147
212
  >
148
- <Surface role='card' limit={1} data={{ subject }} fallback={title} />
149
- </div>
213
+ <Surface role='card-content' limit={1} data={{ subject }} fallback={title} />
214
+ </Card.Root>
150
215
  );
151
216
  });
@@ -2,12 +2,13 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import { useAtomValue } from '@effect-atom/atom-react';
5
6
  import React, { memo, useMemo } from 'react';
6
7
 
7
- import { useCapability } from '@dxos/app-framework';
8
+ import { useCapability } from '@dxos/app-framework/react';
8
9
 
9
10
  import { type EncodedTrackName, type UserState } from '../../calls';
10
- import { ThreadCapabilities } from '../../capabilities';
11
+ import { ThreadCapabilities } from '../../types';
11
12
  import { VideoObject } from '../Media';
12
13
  import { ResponsiveGridItem, type ResponsiveGridItemProps } from '../ResponsiveGrid';
13
14
 
@@ -15,21 +16,39 @@ export const SCREENSHARE_SUFFIX = '_screenshare';
15
16
 
16
17
  export const Participant = memo(({ item: user, debug, ...props }: ResponsiveGridItemProps<UserState>) => {
17
18
  const call = useCapability(ThreadCapabilities.CallManager);
18
- const isSelf: boolean = call.self.id !== undefined && user.id !== undefined && user.id.startsWith(call.self.id);
19
+ const self = useAtomValue(call.selfAtom);
20
+ const media = useAtomValue(call.mediaAtom);
21
+ const isSelf: boolean = self.id !== undefined && user.id !== undefined && user.id.startsWith(self.id);
19
22
  const isScreenshare = user.id?.endsWith(SCREENSHARE_SUFFIX);
20
- const pulledVideoStream = call.getVideoStream(
21
- isScreenshare || !isSelf ? (user.tracks?.video as EncodedTrackName) : undefined,
22
- );
23
+
24
+ // Get pulled video stream for non-self users.
25
+ const pulledVideoStream = useMemo<MediaStream | undefined>(() => {
26
+ if (isSelf) {
27
+ return undefined;
28
+ }
29
+ const trackName =
30
+ isScreenshare && user.tracks?.screenshareEnabled
31
+ ? (user.tracks?.screenshare as EncodedTrackName)
32
+ : !isScreenshare && user.tracks?.videoEnabled
33
+ ? (user.tracks?.video as EncodedTrackName)
34
+ : undefined;
35
+ return trackName ? media.pulledVideoStreams[trackName]?.stream : undefined;
36
+ }, [
37
+ isSelf,
38
+ isScreenshare,
39
+ media.pulledVideoStreams,
40
+ user.tracks?.screenshare,
41
+ user.tracks?.video,
42
+ user.tracks?.screenshareEnabled,
43
+ user.tracks?.videoEnabled,
44
+ ]);
23
45
 
24
46
  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
- } else if (!isSelf) {
30
- return pulledVideoStream;
47
+ if (isSelf) {
48
+ return isScreenshare ? media.screenshareVideoStream : media.videoStream;
31
49
  }
32
- }, [isSelf, isScreenshare, call.media.videoStream, call.media.screenshareVideoStream, pulledVideoStream]);
50
+ return pulledVideoStream;
51
+ }, [isSelf, isScreenshare, media.videoStream, media.screenshareVideoStream, pulledVideoStream]);
33
52
 
34
53
  return (
35
54
  <ResponsiveGridItem
@@ -37,8 +56,8 @@ export const Participant = memo(({ item: user, debug, ...props }: ResponsiveGrid
37
56
  item={user}
38
57
  name={user.name}
39
58
  self={isSelf}
40
- screenshare={!!call.media.screenshareVideoStream}
41
- video={call.media.videoEnabled}
59
+ screenshare={!!media.screenshareVideoStream}
60
+ video={media.videoEnabled}
42
61
  mute={user ? !user.tracks?.audioEnabled : false}
43
62
  wave={user.raisedHand}
44
63
  speaking={user.speaking}
@@ -6,10 +6,11 @@ import React, { useEffect, useMemo, useState } from 'react';
6
6
 
7
7
  import { type ThemedClassName } from '@dxos/react-ui';
8
8
 
9
- import { Participant, SCREENSHARE_SUFFIX } from './Participant';
10
9
  import { type UserState } from '../../calls';
11
10
  import { ResponsiveGrid } from '../ResponsiveGrid';
12
11
 
12
+ import { Participant, SCREENSHARE_SUFFIX } from './Participant';
13
+
13
14
  const getId = (user: UserState): string => user.id!;
14
15
 
15
16
  export type ParticipantGridProps = ThemedClassName<{
@@ -2,25 +2,25 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type StoryObj, type Meta } from '@storybook/react-vite';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React from 'react';
9
7
 
10
- import { withTheme, withLayout } from '@dxos/storybook-utils';
8
+ import { withTheme } from '@dxos/react-ui/testing';
11
9
 
12
- import { ResponsiveContainer } from './ResponsiveContainer';
13
10
  import { translations } from '../../translations';
14
11
  import { VideoObject as VideoObjectComponent } from '../Media';
15
12
 
16
- const meta: Meta<typeof ResponsiveContainer> = {
13
+ import { ResponsiveContainer } from './ResponsiveContainer';
14
+
15
+ const meta = {
17
16
  title: 'plugins/plugin-thread/ResponsiveContainer',
18
17
  component: ResponsiveContainer,
19
- decorators: [withTheme, withLayout({ fullscreen: true })],
18
+ decorators: [withTheme],
20
19
  parameters: {
20
+ layout: 'fullscreen',
21
21
  translations,
22
22
  },
23
- };
23
+ } satisfies Meta<typeof ResponsiveContainer>;
24
24
 
25
25
  export default meta;
26
26
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React, { type PropsWithChildren } from 'react';
6
6
 
7
- import { mx } from '@dxos/react-ui-theme';
7
+ import { mx } from '@dxos/ui-theme';
8
8
 
9
9
  /**
10
10
  * A container component that maintains the child's aspect ratio while centering its content.
@@ -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,17 +2,16 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type StoryObj, type Meta } from '@storybook/react-vite';
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 { withTheme, withLayout } from '@dxos/storybook-utils';
9
+ import { withTheme } from '@dxos/react-ui/testing';
10
+
11
+ import { translations } from '../../translations';
12
12
 
13
13
  import { ResponsiveGrid, type ResponsiveGridProps } from './ResponsiveGrid';
14
14
  import { ResponsiveGridItem, type ResponsiveGridItemProps } from './ResponsiveGridItem';
15
- import { translations } from '../../translations';
16
15
 
17
16
  type TestItem = {
18
17
  id: string;
@@ -42,7 +41,7 @@ const TestCell = ({ item, ...props }: ResponsiveGridItemProps<TestItem>) => {
42
41
  {item.type === 'image' && <img className='aspect-video object-contain' src={item.imageUrl} />}
43
42
  {item.type === 'video' && (
44
43
  <video
45
- className='w-full aspect-video object-cover rounded-md'
44
+ className='is-full aspect-video object-cover rounded-md'
46
45
  src={item.videoUrl}
47
46
  playsInline
48
47
  autoPlay
@@ -56,46 +55,49 @@ const TestCell = ({ item, ...props }: ResponsiveGridItemProps<TestItem>) => {
56
55
 
57
56
  type StoryProps = ResponsiveGridProps<TestItem> & { random?: boolean; autoHideGallery?: boolean };
58
57
 
59
- 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 = {
60
92
  title: 'plugins/plugin-thread/ResponsiveGrid',
61
- component: ResponsiveGrid,
62
- render: (args) => {
63
- const [pinned, setPinned] = useState<string | undefined>(
64
- (args.pinned ?? args.items.length > 1) ? args.items[0]?.id : undefined,
65
- );
66
- const [items, setItems] = useState<TestItem[]>(args.items);
67
- useEffect(() => {
68
- if (!args.random) {
69
- return;
70
- }
71
-
72
- const interval = setInterval(() => {
73
- setItems((items) => {
74
- const p = Math.random();
75
- if (p < 0.5) {
76
- return items;
77
- } else if (p < 0.99 && items.length > 1) {
78
- return items.slice(0, -1);
79
- } else {
80
- return [...items, createItem(items[0]?.type)];
81
- }
82
- });
83
- }, 3_000);
84
-
85
- return () => clearInterval(interval);
86
- }, []);
87
-
88
- return (
89
- <div className='grid grow p-4'>
90
- <ResponsiveGrid {...args} Cell={TestCell} items={items} pinned={pinned} onPinnedChange={setPinned} />
91
- </div>
92
- );
93
- },
94
- decorators: [withTheme, withLayout({ fullscreen: true, classNames: 'justify-center' })],
93
+ component: ResponsiveGrid as any,
94
+ render: DefaultStory,
95
+ decorators: [withTheme],
95
96
  parameters: {
97
+ layout: 'fullscreen',
96
98
  translations,
97
99
  },
98
- };
100
+ } satisfies Meta<typeof DefaultStory>;
99
101
 
100
102
  const videoUrls = [
101
103
  'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4',
@@ -117,7 +119,7 @@ const createItem = (type?: 'image' | 'video') => {
117
119
 
118
120
  export default meta;
119
121
 
120
- type Story = StoryObj<StoryProps>;
122
+ type Story = StoryObj<typeof meta>;
121
123
 
122
124
  // TODO(burdon): Story to join/leave repeatedly to test stable position.
123
125