@dxos/plugin-thread 0.8.3 → 0.8.4-main.1da679c

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 (325) hide show
  1. package/dist/lib/browser/ChannelContainer-EICZI7H6.mjs +16 -0
  2. package/dist/lib/browser/ChatContainer-EXNNREYB.mjs +15 -0
  3. package/dist/lib/browser/{app-graph-builder-OY7R7EJP.mjs → app-graph-builder-B5GYUSJ2.mjs} +10 -10
  4. package/dist/lib/browser/app-graph-builder-B5GYUSJ2.mjs.map +7 -0
  5. package/dist/lib/browser/{call-manager-APQAZWHT.mjs → call-manager-ZXNHLSXU.mjs} +8 -7
  6. package/dist/lib/browser/call-manager-ZXNHLSXU.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-R5MDLUPC.mjs → chunk-4APCDRSH.mjs} +3 -3
  8. package/dist/lib/browser/{chunk-R5MDLUPC.mjs.map → chunk-4APCDRSH.mjs.map} +1 -1
  9. package/dist/lib/browser/{chunk-PG5CTFKK.mjs → chunk-5GOEKXWF.mjs} +230 -160
  10. package/dist/lib/browser/chunk-5GOEKXWF.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-6L5JSXLF.mjs +23 -0
  12. package/dist/lib/browser/{chunk-6NBVNXTM.mjs.map → chunk-6L5JSXLF.mjs.map} +3 -3
  13. package/dist/lib/browser/{chunk-XZKBN3NS.mjs → chunk-7W7QK5ZP.mjs} +253 -250
  14. package/dist/lib/browser/chunk-7W7QK5ZP.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-IIUTBDVB.mjs → chunk-EV4JWI7L.mjs} +2 -2
  16. package/dist/lib/browser/{chunk-JKQUJOTX.mjs → chunk-GERVMFQW.mjs} +2 -2
  17. package/dist/lib/browser/{chunk-AEXWNS6Z.mjs → chunk-KTWYVC5X.mjs} +34 -15
  18. package/dist/lib/browser/chunk-KTWYVC5X.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-TAFSCSUR.mjs → chunk-PBMNFG3B.mjs} +97 -72
  20. package/dist/lib/browser/chunk-PBMNFG3B.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-RI3Z6MK3.mjs +181 -0
  22. package/dist/lib/browser/chunk-RI3Z6MK3.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-XYUJXHYV.mjs +106 -0
  24. package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +7 -0
  25. package/dist/lib/browser/{chunk-4H4A264L.mjs → chunk-ZCEU5K23.mjs} +490 -308
  26. package/dist/lib/browser/chunk-ZCEU5K23.mjs.map +7 -0
  27. package/dist/lib/browser/index.mjs +49 -44
  28. package/dist/lib/browser/index.mjs.map +3 -3
  29. package/dist/lib/browser/{intent-resolver-FK2MDVDT.mjs → intent-resolver-UZNJ2YDK.mjs} +92 -18
  30. package/dist/lib/browser/intent-resolver-UZNJ2YDK.mjs.map +7 -0
  31. package/dist/lib/browser/{markdown-TE5SWWNJ.mjs → markdown-II2YTQDX.mjs} +10 -10
  32. package/dist/lib/browser/markdown-II2YTQDX.mjs.map +7 -0
  33. package/dist/lib/browser/meta.json +1 -1
  34. package/dist/lib/browser/react-root-5SOWYI62.mjs +28 -0
  35. package/dist/lib/{node-esm/react-root-RUXOAQNW.mjs.map → browser/react-root-5SOWYI62.mjs.map} +1 -1
  36. package/dist/lib/browser/{react-surface-VXUJKSOG.mjs → react-surface-3Z3WJYVP.mjs} +14 -13
  37. package/dist/lib/browser/react-surface-3Z3WJYVP.mjs.map +7 -0
  38. package/dist/lib/browser/{settings-RB2RSLXV.mjs → settings-OR2QP3OU.mjs} +6 -6
  39. package/dist/lib/browser/{settings-RB2RSLXV.mjs.map → settings-OR2QP3OU.mjs.map} +1 -1
  40. package/dist/lib/browser/{state-RKL5MSDP.mjs → state-JAWCHYCK.mjs} +6 -6
  41. package/dist/lib/browser/state-JAWCHYCK.mjs.map +7 -0
  42. package/dist/lib/browser/toolkit-AU6POUKA.mjs +80 -0
  43. package/dist/lib/browser/toolkit-AU6POUKA.mjs.map +7 -0
  44. package/dist/lib/browser/types/index.mjs +2 -2
  45. package/dist/lib/node-esm/ChannelContainer-FLZZCFBA.mjs +17 -0
  46. package/dist/lib/node-esm/{ChatContainer-F6CSADV7.mjs → ChatContainer-QVQKFBWA.mjs} +6 -5
  47. package/dist/lib/node-esm/{app-graph-builder-BAHBHYWI.mjs → app-graph-builder-MQ6T5HPO.mjs} +10 -10
  48. package/dist/lib/node-esm/app-graph-builder-MQ6T5HPO.mjs.map +7 -0
  49. package/dist/lib/node-esm/{call-manager-UUYXLF4T.mjs → call-manager-KUWBOOOE.mjs} +8 -7
  50. package/dist/lib/node-esm/call-manager-KUWBOOOE.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs +108 -0
  52. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +7 -0
  53. package/dist/lib/node-esm/{chunk-PGRP3O4O.mjs → chunk-57XR3LEF.mjs} +2 -2
  54. package/dist/lib/node-esm/{chunk-P6RLFCNT.mjs → chunk-DKCQCENK.mjs} +97 -72
  55. package/dist/lib/node-esm/chunk-DKCQCENK.mjs.map +7 -0
  56. package/dist/lib/node-esm/{chunk-ESQC6SYE.mjs → chunk-GRLRWTRU.mjs} +2 -2
  57. package/dist/lib/node-esm/chunk-JNPKMT7O.mjs +182 -0
  58. package/dist/lib/node-esm/chunk-JNPKMT7O.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-LKQE2HID.mjs +25 -0
  60. package/dist/lib/node-esm/{chunk-O63QJPQX.mjs.map → chunk-LKQE2HID.mjs.map} +3 -3
  61. package/dist/lib/node-esm/{chunk-UJMPYKT3.mjs → chunk-P6E247RF.mjs} +34 -15
  62. package/dist/lib/node-esm/chunk-P6E247RF.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-K4KAUOKT.mjs → chunk-PYTVBN5J.mjs} +3 -3
  64. package/dist/lib/node-esm/{chunk-K4KAUOKT.mjs.map → chunk-PYTVBN5J.mjs.map} +1 -1
  65. package/dist/lib/node-esm/{chunk-2RNIPFDA.mjs → chunk-SNKFZQST.mjs} +253 -250
  66. package/dist/lib/node-esm/chunk-SNKFZQST.mjs.map +7 -0
  67. package/dist/lib/node-esm/{chunk-WXNPD542.mjs → chunk-TIPIOH2J.mjs} +489 -308
  68. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs.map +7 -0
  69. package/dist/lib/node-esm/{chunk-UZWVVFT3.mjs → chunk-XXMQULU7.mjs} +230 -160
  70. package/dist/lib/node-esm/chunk-XXMQULU7.mjs.map +7 -0
  71. package/dist/lib/node-esm/index.mjs +49 -44
  72. package/dist/lib/node-esm/index.mjs.map +3 -3
  73. package/dist/lib/node-esm/{intent-resolver-BU73VYW3.mjs → intent-resolver-HFCMCWWL.mjs} +92 -18
  74. package/dist/lib/node-esm/intent-resolver-HFCMCWWL.mjs.map +7 -0
  75. package/dist/lib/node-esm/{markdown-HJUWNBLS.mjs → markdown-5ULETN3T.mjs} +10 -10
  76. package/dist/lib/node-esm/markdown-5ULETN3T.mjs.map +7 -0
  77. package/dist/lib/node-esm/meta.json +1 -1
  78. package/dist/lib/node-esm/react-root-YNTMWDXR.mjs +29 -0
  79. package/dist/lib/{browser/react-root-NK3A4VG7.mjs.map → node-esm/react-root-YNTMWDXR.mjs.map} +1 -1
  80. package/dist/lib/node-esm/{react-surface-ELXFYKP6.mjs → react-surface-QMNLDBFM.mjs} +14 -13
  81. package/dist/lib/node-esm/react-surface-QMNLDBFM.mjs.map +7 -0
  82. package/dist/lib/node-esm/{settings-EA7DFSM6.mjs → settings-WGHLJ37H.mjs} +6 -6
  83. package/dist/lib/node-esm/{settings-EA7DFSM6.mjs.map → settings-WGHLJ37H.mjs.map} +1 -1
  84. package/dist/lib/node-esm/{state-6AUTNROZ.mjs → state-VN6GE5MY.mjs} +6 -6
  85. package/dist/lib/node-esm/state-VN6GE5MY.mjs.map +7 -0
  86. package/dist/lib/node-esm/toolkit-TLMJIYXI.mjs +81 -0
  87. package/dist/lib/node-esm/toolkit-TLMJIYXI.mjs.map +7 -0
  88. package/dist/lib/node-esm/types/index.mjs +2 -2
  89. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  90. package/dist/types/src/calls/call-manager.d.ts +1 -1
  91. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  92. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  93. package/dist/types/src/calls/media-manager.d.ts +1 -1
  94. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  95. package/dist/types/src/calls/types.d.ts +1 -1
  96. package/dist/types/src/calls/types.d.ts.map +1 -1
  97. package/dist/types/src/calls/util/calls-service.d.ts +8 -3
  98. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  99. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  100. package/dist/types/src/calls-service.stories.d.ts +24 -0
  101. package/dist/types/src/calls-service.stories.d.ts.map +1 -0
  102. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  103. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  104. package/dist/types/src/capabilities/call-manager.d.ts +1 -1
  105. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
  106. package/dist/types/src/capabilities/capabilities.d.ts +2 -2
  107. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  108. package/dist/types/src/capabilities/index.d.ts +11 -10
  109. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  110. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  111. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  112. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  113. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  114. package/dist/types/src/capabilities/react-root.d.ts +2 -2
  115. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  116. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  117. package/dist/types/src/capabilities/settings.d.ts +1 -1
  118. package/dist/types/src/capabilities/state.d.ts +2 -2
  119. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  120. package/dist/types/src/capabilities/toolkit.d.ts +5 -0
  121. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
  122. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  123. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  124. package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
  125. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  126. package/dist/types/src/components/CallSidebar.d.ts.map +1 -1
  127. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  128. package/dist/types/src/components/ChannelContainer.stories.d.ts +89 -4
  129. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  130. package/dist/types/src/components/Chat.stories.d.ts +90 -3
  131. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  132. package/dist/types/src/components/ChatContainer.d.ts +2 -2
  133. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  134. package/dist/types/src/components/Comments.stories.d.ts +156 -3
  135. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  136. package/dist/types/src/components/CommentsContainer.d.ts +4 -4
  137. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  138. package/dist/types/src/components/CommentsThreadContainer.d.ts +14 -0
  139. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -0
  140. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  141. package/dist/types/src/components/Media/VideoObject.d.ts +1 -1
  142. package/dist/types/src/components/Media/VideoObject.stories.d.ts +15 -3
  143. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  144. package/dist/types/src/components/MessageContainer.d.ts +4 -1
  145. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  146. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  147. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  148. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +154 -2
  149. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  150. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +156 -3
  151. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  152. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  153. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  154. package/dist/types/src/components/ThreadSettings.d.ts +1 -1
  155. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  156. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  157. package/dist/types/src/components/index.d.ts +1 -1
  158. package/dist/types/src/components/index.d.ts.map +1 -1
  159. package/dist/types/src/components/testing.d.ts +1 -0
  160. package/dist/types/src/components/testing.d.ts.map +1 -1
  161. package/dist/types/src/extensions/threads.d.ts +2 -2
  162. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  163. package/dist/types/src/hooks/index.d.ts +3 -0
  164. package/dist/types/src/hooks/index.d.ts.map +1 -1
  165. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  166. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  167. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +2 -0
  168. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +1 -0
  169. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +3 -0
  170. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -0
  171. package/dist/types/src/testing/stories.d.ts.map +1 -1
  172. package/dist/types/src/translations.d.ts +76 -194
  173. package/dist/types/src/translations.d.ts.map +1 -1
  174. package/dist/types/src/types/schema.d.ts +125 -81
  175. package/dist/types/src/types/schema.d.ts.map +1 -1
  176. package/dist/types/src/types/types.d.ts +270 -139
  177. package/dist/types/src/types/types.d.ts.map +1 -1
  178. package/dist/types/src/util.d.ts +17 -2
  179. package/dist/types/src/util.d.ts.map +1 -1
  180. package/dist/types/tsconfig.tsbuildinfo +1 -1
  181. package/package.json +56 -53
  182. package/src/ThreadPlugin.tsx +16 -24
  183. package/src/calls/call-manager.ts +8 -4
  184. package/src/calls/call-swarm-synchronizer.ts +1 -1
  185. package/src/calls/media-manager.ts +70 -37
  186. package/src/calls/types.ts +8 -4
  187. package/src/calls/util/calls-service.ts +72 -18
  188. package/src/calls/util/stub-media-streams.ts +62 -8
  189. package/src/calls-service.stories.tsx +232 -0
  190. package/src/capabilities/app-graph-builder.ts +8 -5
  191. package/src/capabilities/call-manager.ts +3 -2
  192. package/src/capabilities/capabilities.ts +2 -2
  193. package/src/capabilities/index.ts +1 -0
  194. package/src/capabilities/intent-resolver.ts +60 -8
  195. package/src/capabilities/markdown.ts +4 -3
  196. package/src/capabilities/react-surface.tsx +5 -4
  197. package/src/capabilities/state.ts +2 -1
  198. package/src/capabilities/toolkit.ts +78 -0
  199. package/src/components/Call/Call.tsx +4 -3
  200. package/src/components/Call/Toolbar.tsx +8 -8
  201. package/src/components/CallDebugPanel.tsx +110 -51
  202. package/src/components/CallSidebar.tsx +2 -1
  203. package/src/components/ChannelContainer.stories.tsx +11 -10
  204. package/src/components/ChannelContainer.tsx +13 -11
  205. package/src/components/Chat.stories.tsx +29 -27
  206. package/src/components/ChatContainer.tsx +20 -15
  207. package/src/components/Comments.stories.tsx +52 -41
  208. package/src/components/CommentsContainer.tsx +17 -11
  209. package/src/components/{CommentContainer.tsx → CommentsThreadContainer.tsx} +53 -82
  210. package/src/components/Lobby/Lobby.tsx +1 -1
  211. package/src/components/Media/VideoObject.stories.tsx +30 -27
  212. package/src/components/MessageContainer.tsx +65 -47
  213. package/src/components/Participant/Participant.tsx +13 -7
  214. package/src/components/Participant/ParticipantGrid.tsx +2 -1
  215. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +7 -6
  216. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +42 -39
  217. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +1 -1
  218. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +4 -4
  219. package/src/components/ThreadComplementary.tsx +40 -10
  220. package/src/components/ThreadSettings.tsx +6 -7
  221. package/src/components/command-extension.ts +5 -2
  222. package/src/components/index.ts +1 -1
  223. package/src/components/testing.ts +24 -2
  224. package/src/extensions/threads.ts +6 -6
  225. package/src/hooks/index.ts +3 -0
  226. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  227. package/src/hooks/useDebugMode.ts +1 -1
  228. package/src/hooks/useInaudibleAudioStreamTrack.tsx +27 -0
  229. package/src/hooks/useVideoStreamTrack.tsx +36 -0
  230. package/src/testing/stories.ts +7 -3
  231. package/src/translations.ts +14 -9
  232. package/src/types/types.ts +28 -11
  233. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  234. package/src/typings.d.ts +8 -0
  235. package/dist/lib/browser/ChannelContainer-PKFBVENP.mjs +0 -15
  236. package/dist/lib/browser/ChatContainer-RSOKYAMK.mjs +0 -14
  237. package/dist/lib/browser/app-graph-builder-OY7R7EJP.mjs.map +0 -7
  238. package/dist/lib/browser/call-manager-APQAZWHT.mjs.map +0 -7
  239. package/dist/lib/browser/chunk-4H4A264L.mjs.map +0 -7
  240. package/dist/lib/browser/chunk-5P5BH5GE.mjs +0 -88
  241. package/dist/lib/browser/chunk-5P5BH5GE.mjs.map +0 -7
  242. package/dist/lib/browser/chunk-6NBVNXTM.mjs +0 -21
  243. package/dist/lib/browser/chunk-AEXWNS6Z.mjs.map +0 -7
  244. package/dist/lib/browser/chunk-PG5CTFKK.mjs.map +0 -7
  245. package/dist/lib/browser/chunk-TAFSCSUR.mjs.map +0 -7
  246. package/dist/lib/browser/chunk-XZKBN3NS.mjs.map +0 -7
  247. package/dist/lib/browser/intent-resolver-FK2MDVDT.mjs.map +0 -7
  248. package/dist/lib/browser/markdown-TE5SWWNJ.mjs.map +0 -7
  249. package/dist/lib/browser/react-root-NK3A4VG7.mjs +0 -27
  250. package/dist/lib/browser/react-surface-VXUJKSOG.mjs.map +0 -7
  251. package/dist/lib/browser/state-RKL5MSDP.mjs.map +0 -7
  252. package/dist/lib/node/ChannelContainer-YS5YT2ML.cjs +0 -36
  253. package/dist/lib/node/ChannelContainer-YS5YT2ML.cjs.map +0 -7
  254. package/dist/lib/node/ChatContainer-GCOM3M56.cjs +0 -35
  255. package/dist/lib/node/ChatContainer-GCOM3M56.cjs.map +0 -7
  256. package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs +0 -179
  257. package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs.map +0 -7
  258. package/dist/lib/node/call-manager-HV2XJW5O.cjs +0 -37
  259. package/dist/lib/node/call-manager-HV2XJW5O.cjs.map +0 -7
  260. package/dist/lib/node/chunk-44I33JDT.cjs +0 -1731
  261. package/dist/lib/node/chunk-44I33JDT.cjs.map +0 -7
  262. package/dist/lib/node/chunk-4YSNVPWU.cjs +0 -37
  263. package/dist/lib/node/chunk-4YSNVPWU.cjs.map +0 -7
  264. package/dist/lib/node/chunk-E3WBZTTI.cjs +0 -371
  265. package/dist/lib/node/chunk-E3WBZTTI.cjs.map +0 -7
  266. package/dist/lib/node/chunk-ERG7G6FF.cjs +0 -59
  267. package/dist/lib/node/chunk-ERG7G6FF.cjs.map +0 -7
  268. package/dist/lib/node/chunk-FUXJAVFZ.cjs +0 -108
  269. package/dist/lib/node/chunk-FUXJAVFZ.cjs.map +0 -7
  270. package/dist/lib/node/chunk-HLMCEE5K.cjs +0 -41
  271. package/dist/lib/node/chunk-HLMCEE5K.cjs.map +0 -7
  272. package/dist/lib/node/chunk-IP533AMV.cjs +0 -554
  273. package/dist/lib/node/chunk-IP533AMV.cjs.map +0 -7
  274. package/dist/lib/node/chunk-LR5NENBE.cjs +0 -54
  275. package/dist/lib/node/chunk-LR5NENBE.cjs.map +0 -7
  276. package/dist/lib/node/chunk-UM36TPCT.cjs +0 -984
  277. package/dist/lib/node/chunk-UM36TPCT.cjs.map +0 -7
  278. package/dist/lib/node/chunk-ZGDN3XBR.cjs +0 -149
  279. package/dist/lib/node/chunk-ZGDN3XBR.cjs.map +0 -7
  280. package/dist/lib/node/index.cjs +0 -310
  281. package/dist/lib/node/index.cjs.map +0 -7
  282. package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs +0 -363
  283. package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs.map +0 -7
  284. package/dist/lib/node/markdown-GQIPJS2F.cjs +0 -178
  285. package/dist/lib/node/markdown-GQIPJS2F.cjs.map +0 -7
  286. package/dist/lib/node/meta.json +0 -1
  287. package/dist/lib/node/react-root-6HHDMULJ.cjs +0 -51
  288. package/dist/lib/node/react-root-6HHDMULJ.cjs.map +0 -7
  289. package/dist/lib/node/react-surface-NBH42NN2.cjs +0 -122
  290. package/dist/lib/node/react-surface-NBH42NN2.cjs.map +0 -7
  291. package/dist/lib/node/settings-4LQSFEDK.cjs +0 -36
  292. package/dist/lib/node/settings-4LQSFEDK.cjs.map +0 -7
  293. package/dist/lib/node/state-IY5XX3H2.cjs +0 -50
  294. package/dist/lib/node/state-IY5XX3H2.cjs.map +0 -7
  295. package/dist/lib/node/types/index.cjs +0 -38
  296. package/dist/lib/node/types/index.cjs.map +0 -7
  297. package/dist/lib/node-esm/ChannelContainer-O4QJII2P.mjs +0 -16
  298. package/dist/lib/node-esm/app-graph-builder-BAHBHYWI.mjs.map +0 -7
  299. package/dist/lib/node-esm/call-manager-UUYXLF4T.mjs.map +0 -7
  300. package/dist/lib/node-esm/chunk-2RNIPFDA.mjs.map +0 -7
  301. package/dist/lib/node-esm/chunk-O3V45YJP.mjs +0 -90
  302. package/dist/lib/node-esm/chunk-O3V45YJP.mjs.map +0 -7
  303. package/dist/lib/node-esm/chunk-O63QJPQX.mjs +0 -23
  304. package/dist/lib/node-esm/chunk-P6RLFCNT.mjs.map +0 -7
  305. package/dist/lib/node-esm/chunk-UJMPYKT3.mjs.map +0 -7
  306. package/dist/lib/node-esm/chunk-UZWVVFT3.mjs.map +0 -7
  307. package/dist/lib/node-esm/chunk-WXNPD542.mjs.map +0 -7
  308. package/dist/lib/node-esm/intent-resolver-BU73VYW3.mjs.map +0 -7
  309. package/dist/lib/node-esm/markdown-HJUWNBLS.mjs.map +0 -7
  310. package/dist/lib/node-esm/react-root-RUXOAQNW.mjs +0 -28
  311. package/dist/lib/node-esm/react-surface-ELXFYKP6.mjs.map +0 -7
  312. package/dist/lib/node-esm/state-6AUTNROZ.mjs.map +0 -7
  313. package/dist/types/src/components/CommentContainer.d.ts +0 -13
  314. package/dist/types/src/components/CommentContainer.d.ts.map +0 -1
  315. package/dist/types/src/peers.stories.d.ts +0 -11
  316. package/dist/types/src/peers.stories.d.ts.map +0 -1
  317. package/src/peers.stories.tsx +0 -189
  318. /package/dist/lib/browser/{ChannelContainer-PKFBVENP.mjs.map → ChannelContainer-EICZI7H6.mjs.map} +0 -0
  319. /package/dist/lib/browser/{ChatContainer-RSOKYAMK.mjs.map → ChatContainer-EXNNREYB.mjs.map} +0 -0
  320. /package/dist/lib/browser/{chunk-IIUTBDVB.mjs.map → chunk-EV4JWI7L.mjs.map} +0 -0
  321. /package/dist/lib/browser/{chunk-JKQUJOTX.mjs.map → chunk-GERVMFQW.mjs.map} +0 -0
  322. /package/dist/lib/node-esm/{ChannelContainer-O4QJII2P.mjs.map → ChannelContainer-FLZZCFBA.mjs.map} +0 -0
  323. /package/dist/lib/node-esm/{ChatContainer-F6CSADV7.mjs.map → ChatContainer-QVQKFBWA.mjs.map} +0 -0
  324. /package/dist/lib/node-esm/{chunk-PGRP3O4O.mjs.map → chunk-57XR3LEF.mjs.map} +0 -0
  325. /package/dist/lib/node-esm/{chunk-ESQC6SYE.mjs.map → chunk-GRLRWTRU.mjs.map} +0 -0
@@ -2,97 +2,37 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { CheckCircle, X } from '@phosphor-icons/react';
6
5
  import React, { useCallback, useMemo, useRef, useState } from 'react';
7
6
 
8
- import { Relation } from '@dxos/echo';
9
- import { RefArray } from '@dxos/live-object';
7
+ import { Ref, Relation } from '@dxos/echo';
10
8
  import { fullyQualifiedId, getSpace, useMembers } from '@dxos/react-client/echo';
11
9
  import { useIdentity } from '@dxos/react-client/halo';
12
- import { Button, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';
10
+ import { IconButton, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';
13
11
  import { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';
14
- import {
15
- getSize,
16
- hoverableControlItem,
17
- hoverableControls,
18
- hoverableFocusedWithinControls,
19
- mx,
20
- } from '@dxos/react-ui-theme';
21
- import {
22
- MessageTextbox,
23
- type MessageTextboxProps,
24
- Thread,
25
- ThreadFooter,
26
- ThreadHeading,
27
- type ThreadProps,
28
- } from '@dxos/react-ui-thread';
12
+ import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';
13
+ import { MessageTextbox, type MessageTextboxProps, Thread, type ThreadRootProps } from '@dxos/react-ui-thread';
29
14
  import { type AnchoredTo } from '@dxos/schema';
30
15
  import { isNonNullable } from '@dxos/util';
31
16
 
32
- import { MessageContainer } from './MessageContainer';
33
- import { command } from './command-extension';
34
17
  import { useStatus } from '../hooks';
35
- import { THREAD_PLUGIN } from '../meta';
18
+ import { meta } from '../meta';
36
19
  import { type ThreadType } from '../types';
37
20
  import { getMessageMetadata } from '../util';
38
21
 
39
- const sizeClass = getSize(4);
40
-
41
- // TODO(thure): #8149
42
- const commentControlClassNames = '!p-1 !min-bs-0 transition-opacity';
43
-
44
- const ToggleResolvedButton = ({
45
- isResolved,
46
- onResolve,
47
- }: {
48
- isResolved: boolean | undefined;
49
- onResolve: () => void;
50
- }) => {
51
- const { t } = useTranslation(THREAD_PLUGIN);
52
- const label = t(isResolved ? 'mark as unresolved label' : 'mark as resolved label');
53
- return (
54
- <Tooltip.Trigger asChild content={label}>
55
- <Button
56
- variant='ghost'
57
- data-testid='thread.toggle-resolved'
58
- onClick={onResolve}
59
- classNames={[commentControlClassNames, !isResolved && hoverableControlItem]}
60
- >
61
- <span className='sr-only'>{label}</span>
62
- {isResolved ? <CheckCircle className={sizeClass} weight='fill' /> : <CheckCircle className={sizeClass} />}
63
- </Button>
64
- </Tooltip.Trigger>
65
- );
66
- };
67
-
68
- const DeleteThreadButton = ({ onDelete }: { onDelete: () => void }) => {
69
- const { t } = useTranslation(THREAD_PLUGIN);
70
- const label = t('delete thread label');
71
- return (
72
- <Tooltip.Trigger asChild content={label}>
73
- <Button
74
- variant='ghost'
75
- data-testid='thread.delete'
76
- onClick={onDelete}
77
- classNames={[commentControlClassNames, hoverableControlItem]}
78
- >
79
- <span className='sr-only'>{label}</span>
80
- <X className={sizeClass} />
81
- </Button>
82
- </Tooltip.Trigger>
83
- );
84
- };
22
+ import { command } from './command-extension';
23
+ import { MessageContainer, buttonClassNames, buttonGroupClassNames } from './MessageContainer';
85
24
 
86
- export type CommentContainerProps = {
25
+ export type CommentsThreadContainerProps = {
87
26
  anchor: AnchoredTo;
88
27
  onAttend?: (anchor: AnchoredTo) => void;
89
28
  onComment?: (anchor: AnchoredTo, message: string) => void;
90
29
  onResolve?: (anchor: AnchoredTo) => void;
91
30
  onMessageDelete?: (anchor: AnchoredTo, messageId: string) => void;
92
31
  onThreadDelete?: (anchor: AnchoredTo) => void;
93
- } & Pick<ThreadProps, 'current'>;
32
+ onAcceptProposal?: (anchor: AnchoredTo, messageId: string) => void;
33
+ } & Pick<ThreadRootProps, 'current'>;
94
34
 
95
- export const CommentContainer = ({
35
+ export const CommentsThreadContainer = ({
96
36
  anchor,
97
37
  current,
98
38
  onAttend,
@@ -100,14 +40,15 @@ export const CommentContainer = ({
100
40
  onResolve,
101
41
  onMessageDelete,
102
42
  onThreadDelete,
103
- }: CommentContainerProps) => {
43
+ onAcceptProposal,
44
+ }: CommentsThreadContainerProps) => {
45
+ const { t } = useTranslation(meta.id);
104
46
  const identity = useIdentity()!;
105
47
  const space = getSpace(anchor);
106
48
  const members = useMembers(space?.key);
107
49
  const detached = !anchor.anchor;
108
50
  const thread = Relation.getSource(anchor) as ThreadType;
109
51
  const activity = useStatus(space, fullyQualifiedId(thread));
110
- const { t } = useTranslation(THREAD_PLUGIN);
111
52
  const threadScrollRef = useRef<HTMLDivElement | null>(null);
112
53
  const { themeMode } = useThemeContext();
113
54
 
@@ -134,6 +75,7 @@ export const CommentContainer = ({
134
75
  const handleResolve = useCallback(() => onResolve?.(anchor), [onResolve, anchor]);
135
76
  const handleMessageDelete = useCallback((id: string) => onMessageDelete?.(anchor, id), [onMessageDelete, anchor]);
136
77
  const handleThreadDelete = useCallback(() => onThreadDelete?.(anchor), [onThreadDelete, anchor]);
78
+ const handleAcceptProposal = useCallback((id: string) => onAcceptProposal?.(anchor, id), [onAcceptProposal, anchor]);
137
79
 
138
80
  const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {
139
81
  if (!messageRef.current) {
@@ -149,7 +91,13 @@ export const CommentContainer = ({
149
91
  }, [anchor, identity]);
150
92
 
151
93
  return (
152
- <Thread onClickCapture={handleAttend} onFocusCapture={handleAttend} current={current} id={fullyQualifiedId(thread)}>
94
+ <Thread.Root
95
+ id={fullyQualifiedId(thread)}
96
+ classNames='pbs-2 border-be border-subduedSeparator last:border-none'
97
+ current={current}
98
+ onClickCapture={handleAttend}
99
+ onFocusCapture={handleAttend}
100
+ >
153
101
  <div
154
102
  role='none'
155
103
  className={mx(
@@ -160,29 +108,50 @@ export const CommentContainer = ({
160
108
  >
161
109
  {detached ? (
162
110
  <Tooltip.Trigger asChild content={t('detached thread label')} side='top'>
163
- <ThreadHeading detached>{thread.name}</ThreadHeading>
111
+ <Thread.Header detached>{thread.name}</Thread.Header>
164
112
  </Tooltip.Trigger>
165
113
  ) : (
166
- <ThreadHeading>{thread.name}</ThreadHeading>
114
+ <Thread.Header>{thread.name}</Thread.Header>
167
115
  )}
168
- <div className='flex flex-row items-center pli-1'>
116
+ <div role='none' className={buttonGroupClassNames}>
169
117
  {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}
170
118
  {onResolve && !(thread?.status === 'staged') && (
171
- <ToggleResolvedButton isResolved={thread?.status === 'resolved'} onResolve={handleResolve} />
119
+ <IconButton
120
+ data-testid='thread.resolve'
121
+ variant='ghost'
122
+ icon={thread?.status === 'resolved' ? 'ph--check--fill' : 'ph--check--regular'}
123
+ iconOnly
124
+ label={t('resolve thread label')}
125
+ classNames={[buttonClassNames, thread?.status !== 'resolved' && hoverableControlItem]}
126
+ onClick={handleResolve}
127
+ />
128
+ )}
129
+ {onThreadDelete && (
130
+ <IconButton
131
+ data-testid='thread.delete'
132
+ variant='ghost'
133
+ icon='ph--x--regular'
134
+ iconOnly
135
+ label={t('delete thread label')}
136
+ classNames={[buttonClassNames, hoverableControlItem]}
137
+ onClick={handleThreadDelete}
138
+ />
172
139
  )}
173
- {onThreadDelete && <DeleteThreadButton onDelete={handleThreadDelete} />}
174
140
  </div>
175
141
  </div>
142
+
176
143
  {/** TODO(dmaretskyi): How's `thread.messages` undefined? */}
177
- {RefArray.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (
144
+ {Ref.Array.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (
178
145
  <MessageContainer
179
146
  key={message.id}
180
147
  editable
181
148
  message={message}
182
149
  members={members}
183
150
  onDelete={handleMessageDelete}
151
+ onAcceptProposal={handleAcceptProposal}
184
152
  />
185
153
  ))}
154
+
186
155
  {/*
187
156
  TODO(wittjosiah): Can't autofocus this generally.
188
157
  There can be multiple threads with inputs and they can't all be focused.
@@ -190,9 +159,11 @@ export const CommentContainer = ({
190
159
  Need to find a way to autofocus in one scenario only: when a new thread is created.
191
160
  */}
192
161
  <MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />
193
- <ThreadFooter activity={activity}>{t('activity message')}</ThreadFooter>
162
+
163
+ <Thread.Status activity={activity}>{t('activity message')}</Thread.Status>
164
+
194
165
  {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}
195
166
  <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />
196
- </Thread>
167
+ </Thread.Root>
197
168
  );
198
169
  };
@@ -5,7 +5,7 @@
5
5
  import React, { type FC, type PropsWithChildren, useEffect, useState } from 'react';
6
6
 
7
7
  import { useCapability } from '@dxos/app-framework';
8
- import { useTranslation, type ThemedClassName } from '@dxos/react-ui';
8
+ import { type ThemedClassName, useTranslation } from '@dxos/react-ui';
9
9
  import { mx } from '@dxos/react-ui-theme';
10
10
 
11
11
  import { ThreadCapabilities } from '../../capabilities';
@@ -4,44 +4,47 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type StoryObj, type Meta } from '@storybook/react';
7
+ import { type StoryObj } from '@storybook/react-vite';
8
8
  import React, { useEffect, useState } from 'react';
9
9
 
10
10
  import { scheduleTask } from '@dxos/async';
11
11
  import { Context } from '@dxos/context';
12
12
  import { log } from '@dxos/log';
13
- import { withTheme, withLayout } from '@dxos/storybook-utils';
13
+ import { withLayout, withTheme } from '@dxos/storybook-utils';
14
14
 
15
- import { VideoObject } from './VideoObject';
16
15
  import { getUserMediaTrack } from '../../calls';
17
16
  import { ResponsiveContainer } from '../ResponsiveGrid';
18
17
 
19
- const meta: Meta<typeof VideoObject> = {
18
+ import { VideoObject, type VideoObjectProps } from './VideoObject';
19
+
20
+ const DefaultStory = (props: VideoObjectProps) => {
21
+ log.info('render');
22
+ const [videoStream, setVideoStream] = useState<MediaStream>();
23
+ useEffect(() => {
24
+ const ctx = new Context();
25
+ scheduleTask(ctx, async () => {
26
+ const stream = new MediaStream();
27
+ stream.addTrack(await getUserMediaTrack('videoinput'));
28
+ setVideoStream(stream);
29
+ });
30
+
31
+ return () => {
32
+ void ctx.dispose();
33
+ videoStream?.getTracks().forEach((track) => track.stop());
34
+ };
35
+ }, []);
36
+
37
+ return (
38
+ <ResponsiveContainer>
39
+ <VideoObject videoStream={videoStream} flip {...props} />
40
+ </ResponsiveContainer>
41
+ );
42
+ };
43
+
44
+ const meta = {
20
45
  title: 'plugins/plugin-thread/VideoObject',
21
46
  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 () => {
28
- const stream = new MediaStream();
29
- stream.addTrack(await getUserMediaTrack('videoinput'));
30
- 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
- );
44
- },
47
+ render: DefaultStory,
45
48
  decorators: [withTheme, withLayout({ fullscreen: true, classNames: 'justify-center' })],
46
49
  };
47
50
 
@@ -3,43 +3,44 @@
3
3
  //
4
4
 
5
5
  import { EditorView } from '@codemirror/view';
6
- import { Check, PencilSimple, X } from '@phosphor-icons/react';
7
6
  import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
8
7
 
9
8
  import { Surface } from '@dxos/app-framework';
10
- import { type Obj, type Type } from '@dxos/echo';
11
- import { RefArray } from '@dxos/live-object';
9
+ import { type Obj, Ref, type Type } from '@dxos/echo';
12
10
  import { PublicKey } from '@dxos/react-client';
13
11
  import { type SpaceMember } from '@dxos/react-client/echo';
14
- import { useIdentity, type Identity } from '@dxos/react-client/halo';
15
- import { Button, ButtonGroup, Tooltip, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';
12
+ import { type Identity, useIdentity } from '@dxos/react-client/halo';
13
+ import { IconButton, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';
16
14
  import { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';
17
- import {
18
- getSize,
19
- hoverableControlItem,
20
- hoverableControls,
21
- hoverableFocusedWithinControls,
22
- mx,
23
- } from '@dxos/react-ui-theme';
15
+ import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';
24
16
  import { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';
25
17
  import { type DataType } from '@dxos/schema';
26
18
 
27
- import { command } from './command-extension';
28
19
  import { useOnEditAnalytics } from '../hooks';
29
- import { THREAD_PLUGIN } from '../meta';
20
+ import { meta } from '../meta';
30
21
  import { getMessageMetadata } from '../util';
31
22
 
32
- // TODO(thure): #8149
33
- const messageControlClassNames = ['!p-1 !min-bs-0 transition-opacity', hoverableControlItem];
23
+ import { command } from './command-extension';
24
+
25
+ export const buttonGroupClassNames = 'flex flex-row items-center gap-0.5 pie-2';
26
+ export const buttonClassNames = '!p-1 transition-opacity';
34
27
 
35
28
  export type MessageContainerProps = {
36
29
  message: DataType.Message;
37
30
  members: SpaceMember[];
38
31
  editable?: boolean;
39
32
  onDelete?: (id: string) => void;
33
+ onAcceptProposal?: (id: string) => void;
40
34
  };
41
35
 
42
- 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) => {
43
+ const { t } = useTranslation(meta.id);
43
44
  const senderIdentity = members.find(
44
45
  (member) =>
45
46
  (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||
@@ -48,49 +49,58 @@ export const MessageContainer = ({ message, members, editable = false, onDelete
48
49
  const messageMetadata = getMessageMetadata(message.id, senderIdentity);
49
50
  const userIsAuthor = useIdentity()?.did === messageMetadata.authorId;
50
51
  const [editing, setEditing] = useState(false);
52
+ const handleEdit = useCallback(() => setEditing((editing) => !editing), []);
51
53
  const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);
52
- const { t } = useTranslation(THREAD_PLUGIN);
53
- const editLabel = t(editing ? 'save message label' : 'edit message label');
54
- const deleteLabel = t('delete message label');
55
- const textBlock = message.blocks.find((block) => block.type === 'text');
56
- const references = message.blocks.filter((block) => block.type === 'reference').map((block) => block.reference);
54
+ const handleAcceptProposal = useCallback(() => onAcceptProposal?.(message.id), [message, onAcceptProposal]);
55
+ const textBlock = message.blocks.find((block) => block._tag === 'text');
56
+ const proposalBlock = message.blocks.find((block) => block._tag === 'proposal');
57
+ const references = message.blocks.filter((block) => block._tag === 'reference').map((block) => block.reference);
57
58
 
58
59
  useOnEditAnalytics(message, textBlock, !!editing);
59
60
 
60
61
  return (
61
62
  <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>
62
63
  <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>
63
- <ButtonGroup classNames='mie-1'>
64
+ <div role='none' className={buttonGroupClassNames}>
64
65
  {userIsAuthor && editable && (
65
- <Tooltip.Trigger asChild content={editLabel}>
66
- <Button
67
- variant='ghost'
68
- data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}
69
- classNames={messageControlClassNames}
70
- onClick={() => setEditing((editing) => !editing)}
71
- >
72
- <span className='sr-only'>{editLabel}</span>
73
- {editing ? <Check className={getSize(4)} /> : <PencilSimple className={getSize(4)} />}
74
- </Button>
75
- </Tooltip.Trigger>
66
+ <IconButton
67
+ data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}
68
+ variant='ghost'
69
+ icon={editing ? 'ph--check--regular' : 'ph--pencil-simple--regular'}
70
+ iconOnly
71
+ label={t(editing ? 'save message label' : 'edit message label')}
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}
86
+ />
76
87
  )}
77
88
  {onDelete && (
78
- <Tooltip.Trigger asChild content={deleteLabel}>
79
- <Button
80
- variant='ghost'
81
- data-testid='thread.message.delete'
82
- classNames={messageControlClassNames}
83
- onClick={() => handleDelete()}
84
- >
85
- <span className='sr-only'>{deleteLabel}</span>
86
- <X className={getSize(4)} />
87
- </Button>
88
- </Tooltip.Trigger>
89
+ <IconButton
90
+ data-testid='thread.message.delete'
91
+ variant='ghost'
92
+ icon='ph--x--regular'
93
+ iconOnly
94
+ label={t('delete message label')}
95
+ classNames={[buttonClassNames, hoverableControlItem]}
96
+ onClick={handleDelete}
97
+ />
89
98
  )}
90
- </ButtonGroup>
99
+ </div>
91
100
  </MessageHeading>
92
101
  {textBlock && <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} />}
93
- {RefArray.targets(references).map((reference, index) => (
102
+ {proposalBlock && <ProposalBlock block={proposalBlock} />}
103
+ {Ref.Array.targets(references).map((reference, index) => (
94
104
  <MessagePart key={index} part={reference} />
95
105
  ))}
96
106
  </MessageRoot>
@@ -148,6 +158,14 @@ const TextboxBlock = ({
148
158
  return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;
149
159
  };
150
160
 
161
+ const ProposalBlock = ({ block }: { block: DataType.MessageBlock.Proposal }) => {
162
+ return (
163
+ <div role='none' className='mie-4 italic'>
164
+ {block.text}
165
+ </div>
166
+ );
167
+ };
168
+
151
169
  const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(({ subject }, forwardedRef) => {
152
170
  // TODO(burdon): Use annotation to get title.
153
171
  let title = (subject as any).name ?? (subject as any).title ?? (subject as any).type ?? 'Object';
@@ -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
  }
@@ -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<{
@@ -4,23 +4,24 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type StoryObj, type Meta } from '@storybook/react';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
8
  import React from 'react';
9
9
 
10
- import { withTheme, withLayout } from '@dxos/storybook-utils';
10
+ import { withLayout, withTheme } from '@dxos/storybook-utils';
11
11
 
12
- import { ResponsiveContainer } from './ResponsiveContainer';
13
- import translations from '../../translations';
12
+ import { translations } from '../../translations';
14
13
  import { VideoObject as VideoObjectComponent } from '../Media';
15
14
 
16
- const meta: Meta<typeof ResponsiveContainer> = {
15
+ import { ResponsiveContainer } from './ResponsiveContainer';
16
+
17
+ const meta = {
17
18
  title: 'plugins/plugin-thread/ResponsiveContainer',
18
19
  component: ResponsiveContainer,
19
20
  decorators: [withTheme, withLayout({ fullscreen: true })],
20
21
  parameters: {
21
22
  translations,
22
23
  },
23
- };
24
+ } satisfies Meta<typeof ResponsiveContainer>;
24
25
 
25
26
  export default meta;
26
27
 
@@ -4,15 +4,16 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type StoryObj, type Meta } from '@storybook/react';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
8
  import React, { useEffect, useState } from 'react';
9
9
 
10
10
  import { faker } from '@dxos/random';
11
- import { withTheme, withLayout } from '@dxos/storybook-utils';
11
+ import { withLayout, withTheme } from '@dxos/storybook-utils';
12
+
13
+ import { translations } from '../../translations';
12
14
 
13
15
  import { ResponsiveGrid, type ResponsiveGridProps } from './ResponsiveGrid';
14
16
  import { ResponsiveGridItem, type ResponsiveGridItemProps } from './ResponsiveGridItem';
15
- import translations from '../../translations';
16
17
 
17
18
  type TestItem = {
18
19
  id: string;
@@ -56,46 +57,48 @@ const TestCell = ({ item, ...props }: ResponsiveGridItemProps<TestItem>) => {
56
57
 
57
58
  type StoryProps = ResponsiveGridProps<TestItem> & { random?: boolean; autoHideGallery?: boolean };
58
59
 
59
- const meta: Meta<StoryProps> = {
60
+ const DefaultStory = (props: StoryProps) => {
61
+ const [pinned, setPinned] = useState<string | undefined>(
62
+ (props.pinned ?? props.items.length > 1) ? props.items[0]?.id : undefined,
63
+ );
64
+ const [items, setItems] = useState<TestItem[]>(props.items);
65
+ useEffect(() => {
66
+ if (!props.random) {
67
+ return;
68
+ }
69
+
70
+ const interval = setInterval(() => {
71
+ setItems((items) => {
72
+ const p = Math.random();
73
+ if (p < 0.5) {
74
+ return items;
75
+ } else if (p < 0.99 && items.length > 1) {
76
+ return items.slice(0, -1);
77
+ } else {
78
+ return [...items, createItem(items[0]?.type)];
79
+ }
80
+ });
81
+ }, 3_000);
82
+
83
+ return () => clearInterval(interval);
84
+ }, []);
85
+
86
+ return (
87
+ <div className='grid grow p-4'>
88
+ <ResponsiveGrid {...props} Cell={TestCell} items={items} pinned={pinned} onPinnedChange={setPinned} />
89
+ </div>
90
+ );
91
+ };
92
+
93
+ const meta = {
60
94
  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
- },
95
+ component: ResponsiveGrid as any,
96
+ render: DefaultStory,
94
97
  decorators: [withTheme, withLayout({ fullscreen: true, classNames: 'justify-center' })],
95
98
  parameters: {
96
99
  translations,
97
100
  },
98
- };
101
+ } satisfies Meta<typeof DefaultStory>;
99
102
 
100
103
  const videoUrls = [
101
104
  'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4',
@@ -117,7 +120,7 @@ const createItem = (type?: 'image' | 'video') => {
117
120
 
118
121
  export default meta;
119
122
 
120
- type Story = StoryObj<StoryProps>;
123
+ type Story = StoryObj<typeof meta>;
121
124
 
122
125
  // TODO(burdon): Story to join/leave repeatedly to test stable position.
123
126
 
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { type ComponentType, type FC, useLayoutEffect, useState, useEffect, useMemo, useCallback } from 'react';
5
+ import React, { type ComponentType, type FC, useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'react';
6
6
  import { useResizeDetector } from 'react-resize-detector';
7
7
 
8
8
  import { invariant } from '@dxos/invariant';