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

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 (397) hide show
  1. package/dist/lib/browser/app-graph-builder-SPAZN5XL.mjs +188 -0
  2. package/dist/lib/browser/app-graph-builder-SPAZN5XL.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-YBRTG6T3.mjs +26 -0
  7. package/dist/lib/browser/call-manager-YBRTG6T3.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  9. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-RI3Z6MK3.mjs → chunk-DLO2G3DM.mjs} +79 -76
  11. package/dist/lib/browser/chunk-DLO2G3DM.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-ZCEU5K23.mjs → chunk-ERK254BS.mjs} +207 -287
  13. package/dist/lib/browser/chunk-ERK254BS.mjs.map +7 -0
  14. package/dist/lib/browser/{chunk-XYUJXHYV.mjs → chunk-ISCHODBV.mjs} +1 -1
  15. package/dist/lib/browser/{chunk-XYUJXHYV.mjs.map → chunk-ISCHODBV.mjs.map} +2 -2
  16. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  17. package/dist/lib/browser/chunk-TAWDJPMD.mjs +293 -0
  18. package/dist/lib/browser/chunk-TAWDJPMD.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-VZICDGBW.mjs +1813 -0
  20. package/dist/lib/browser/chunk-VZICDGBW.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 +127 -120
  24. package/dist/lib/browser/index.mjs.map +4 -4
  25. package/dist/lib/browser/markdown-TSXOA3GV.mjs +210 -0
  26. package/dist/lib/browser/markdown-TSXOA3GV.mjs.map +7 -0
  27. package/dist/lib/browser/meta.json +1 -1
  28. package/dist/lib/browser/operation-resolver-MDMEBYH2.mjs +441 -0
  29. package/dist/lib/browser/operation-resolver-MDMEBYH2.mjs.map +7 -0
  30. package/dist/lib/browser/react-root-Q7U5D3DA.mjs +25 -0
  31. package/dist/lib/browser/react-root-Q7U5D3DA.mjs.map +7 -0
  32. package/dist/lib/browser/react-surface-WDZQSDWH.mjs +110 -0
  33. package/dist/lib/browser/react-surface-WDZQSDWH.mjs.map +7 -0
  34. package/dist/lib/browser/repair-TDKAFAGH.mjs +38 -0
  35. package/dist/lib/browser/repair-TDKAFAGH.mjs.map +7 -0
  36. package/dist/lib/browser/settings-OOKKVXV7.mjs +32 -0
  37. package/dist/lib/browser/settings-OOKKVXV7.mjs.map +7 -0
  38. package/dist/lib/browser/state-3LKZHDRI.mjs +24 -0
  39. package/dist/lib/browser/state-3LKZHDRI.mjs.map +7 -0
  40. package/dist/lib/browser/types/index.mjs +10 -12
  41. package/dist/lib/node-esm/app-graph-builder-3LJAPDUW.mjs +189 -0
  42. package/dist/lib/node-esm/app-graph-builder-3LJAPDUW.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-MMCTNFOH.mjs +27 -0
  47. package/dist/lib/node-esm/call-manager-MMCTNFOH.mjs.map +7 -0
  48. package/dist/lib/node-esm/chunk-3RD3IVVD.mjs +1814 -0
  49. package/dist/lib/node-esm/chunk-3RD3IVVD.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-ARTUUKTM.mjs +294 -0
  55. package/dist/lib/node-esm/chunk-ARTUUKTM.mjs.map +7 -0
  56. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  57. package/dist/lib/node-esm/{chunk-JNPKMT7O.mjs → chunk-KRBZBJRI.mjs} +79 -76
  58. package/dist/lib/node-esm/chunk-KRBZBJRI.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-TIPIOH2J.mjs → chunk-QP3KQOPQ.mjs} +207 -287
  60. package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-2V3WSLUZ.mjs → chunk-VBI32FGI.mjs} +1 -1
  62. package/dist/lib/node-esm/{chunk-2V3WSLUZ.mjs.map → chunk-VBI32FGI.mjs.map} +2 -2
  63. package/dist/lib/node-esm/index.mjs +127 -120
  64. package/dist/lib/node-esm/index.mjs.map +4 -4
  65. package/dist/lib/node-esm/markdown-N2UJ3D6L.mjs +211 -0
  66. package/dist/lib/node-esm/markdown-N2UJ3D6L.mjs.map +7 -0
  67. package/dist/lib/node-esm/meta.json +1 -1
  68. package/dist/lib/node-esm/operation-resolver-7PHDJZA2.mjs +442 -0
  69. package/dist/lib/node-esm/operation-resolver-7PHDJZA2.mjs.map +7 -0
  70. package/dist/lib/node-esm/react-root-SZIGQRDZ.mjs +26 -0
  71. package/dist/lib/node-esm/react-root-SZIGQRDZ.mjs.map +7 -0
  72. package/dist/lib/node-esm/react-surface-24PNWUDX.mjs +111 -0
  73. package/dist/lib/node-esm/react-surface-24PNWUDX.mjs.map +7 -0
  74. package/dist/lib/node-esm/repair-LHLLGXKF.mjs +39 -0
  75. package/dist/lib/node-esm/repair-LHLLGXKF.mjs.map +7 -0
  76. package/dist/lib/node-esm/settings-LXZQXSPL.mjs +33 -0
  77. package/dist/lib/node-esm/settings-LXZQXSPL.mjs.map +7 -0
  78. package/dist/lib/node-esm/state-YYAK5ENM.mjs +25 -0
  79. package/dist/lib/node-esm/state-YYAK5ENM.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 +1 -1
  92. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  93. package/dist/types/src/calls/util/calls-service.d.ts +1 -1
  94. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  95. package/dist/types/src/calls/util/task-scheduling.d.ts +2 -2
  96. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
  97. package/dist/types/src/calls-service.stories.d.ts +0 -1
  98. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  100. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  101. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  102. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  103. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +9 -0
  104. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
  105. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
  106. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -0
  107. package/dist/types/src/capabilities/call-manager/call-manager.d.ts +6 -0
  108. package/dist/types/src/capabilities/call-manager/call-manager.d.ts.map +1 -0
  109. package/dist/types/src/capabilities/call-manager/index.d.ts +3 -0
  110. package/dist/types/src/capabilities/call-manager/index.d.ts.map +1 -0
  111. package/dist/types/src/capabilities/index.d.ts +10 -16
  112. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  113. package/dist/types/src/capabilities/markdown/index.d.ts +3 -0
  114. package/dist/types/src/capabilities/markdown/index.d.ts.map +1 -0
  115. package/dist/types/src/capabilities/markdown/markdown.d.ts +5 -0
  116. package/dist/types/src/capabilities/markdown/markdown.d.ts.map +1 -0
  117. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  118. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  119. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  120. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  121. package/dist/types/src/capabilities/react-root/index.d.ts +6 -0
  122. package/dist/types/src/capabilities/react-root/index.d.ts.map +1 -0
  123. package/dist/types/src/capabilities/react-root/react-root.d.ts +9 -0
  124. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -0
  125. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  126. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  127. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  128. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  129. package/dist/types/src/capabilities/repair/index.d.ts +3 -0
  130. package/dist/types/src/capabilities/repair/index.d.ts.map +1 -0
  131. package/dist/types/src/capabilities/repair/repair.d.ts +6 -0
  132. package/dist/types/src/capabilities/repair/repair.d.ts.map +1 -0
  133. package/dist/types/src/capabilities/settings/index.d.ts +3 -0
  134. package/dist/types/src/capabilities/settings/index.d.ts.map +1 -0
  135. package/dist/types/src/capabilities/settings/settings.d.ts +5 -0
  136. package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -0
  137. package/dist/types/src/capabilities/state/index.d.ts +3 -0
  138. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  139. package/dist/types/src/capabilities/state/state.d.ts +7 -0
  140. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  141. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  142. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  143. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  144. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  145. package/dist/types/src/components/CallSidebar.d.ts.map +1 -1
  146. package/dist/types/src/components/ChannelContainer.d.ts +5 -6
  147. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  148. package/dist/types/src/components/ChannelContainer.stories.d.ts +78 -9
  149. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  150. package/dist/types/src/components/Chat.stories.d.ts +77 -6
  151. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  152. package/dist/types/src/components/ChatContainer.d.ts +7 -6
  153. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  154. package/dist/types/src/components/Comments.stories.d.ts +5 -2
  155. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  156. package/dist/types/src/components/CommentsContainer.d.ts +2 -2
  157. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  158. package/dist/types/src/components/CommentsThreadContainer.d.ts +8 -8
  159. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  160. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  161. package/dist/types/src/components/Media/VideoObject.d.ts +3 -3
  162. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  163. package/dist/types/src/components/Media/VideoObject.stories.d.ts +6 -4
  164. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  165. package/dist/types/src/components/MessageContainer.d.ts +4 -3
  166. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  167. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  168. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +6 -2
  169. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  170. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +6 -2
  171. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  172. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  173. package/dist/types/src/components/ThreadCompanion.d.ts +5 -0
  174. package/dist/types/src/components/ThreadCompanion.d.ts.map +1 -0
  175. package/dist/types/src/components/ThreadSettings.d.ts +4 -2
  176. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  177. package/dist/types/src/components/index.d.ts +3 -3
  178. package/dist/types/src/components/index.d.ts.map +1 -1
  179. package/dist/types/src/components/testing.d.ts +3 -3
  180. package/dist/types/src/components/testing.d.ts.map +1 -1
  181. package/dist/types/src/extensions/threads.d.ts +7 -2
  182. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  183. package/dist/types/src/functions/create-proposals.d.ts +6 -0
  184. package/dist/types/src/functions/create-proposals.d.ts.map +1 -0
  185. package/dist/types/src/functions/index.d.ts +2 -0
  186. package/dist/types/src/functions/index.d.ts.map +1 -0
  187. package/dist/types/src/hooks/analytics.d.ts +2 -3
  188. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  189. package/dist/types/src/hooks/index.d.ts +2 -2
  190. package/dist/types/src/hooks/index.d.ts.map +1 -1
  191. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  192. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  193. package/dist/types/src/index.d.ts +1 -1
  194. package/dist/types/src/index.d.ts.map +1 -1
  195. package/dist/types/src/meta.d.ts +3 -4
  196. package/dist/types/src/meta.d.ts.map +1 -1
  197. package/dist/types/src/testing/stories.d.ts +2 -1
  198. package/dist/types/src/testing/stories.d.ts.map +1 -1
  199. package/dist/types/src/translations.d.ts +76 -6
  200. package/dist/types/src/translations.d.ts.map +1 -1
  201. package/dist/types/src/types/Channel.d.ts +695 -0
  202. package/dist/types/src/types/Channel.d.ts.map +1 -0
  203. package/dist/types/src/types/capabilities.d.ts +23 -0
  204. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  205. package/dist/types/src/types/index.d.ts +2 -1
  206. package/dist/types/src/types/index.d.ts.map +1 -1
  207. package/dist/types/src/types/types.d.ts +3214 -441
  208. package/dist/types/src/types/types.d.ts.map +1 -1
  209. package/dist/types/tsconfig.tsbuildinfo +1 -1
  210. package/package.json +88 -67
  211. package/src/ThreadPlugin.tsx +106 -135
  212. package/src/blueprints/index.ts +5 -0
  213. package/src/blueprints/thread-blueprint.ts +32 -0
  214. package/src/calls/call-manager.ts +76 -52
  215. package/src/calls/call-swarm-synchronizer.ts +2 -2
  216. package/src/calls/media-manager.ts +10 -7
  217. package/src/calls/util/calls-service.ts +1 -1
  218. package/src/calls/util/stub-media-streams.ts +2 -2
  219. package/src/calls/util/task-scheduling.ts +4 -4
  220. package/src/calls-service.stories.tsx +2 -5
  221. package/src/capabilities/app-graph-builder/app-graph-builder.ts +201 -0
  222. package/src/capabilities/app-graph-builder/index.ts +7 -0
  223. package/src/capabilities/blueprint-definition/blueprint-definition.ts +23 -0
  224. package/src/capabilities/blueprint-definition/index.ts +7 -0
  225. package/src/capabilities/call-manager/call-manager.ts +26 -0
  226. package/src/capabilities/call-manager/index.ts +7 -0
  227. package/src/capabilities/index.ts +10 -13
  228. package/src/capabilities/markdown/index.ts +7 -0
  229. package/src/capabilities/markdown/markdown.ts +83 -0
  230. package/src/capabilities/operation-resolver/index.ts +7 -0
  231. package/src/capabilities/operation-resolver/operation-resolver.ts +400 -0
  232. package/src/capabilities/react-root/index.ts +7 -0
  233. package/src/capabilities/react-root/react-root.tsx +20 -0
  234. package/src/capabilities/react-surface/index.ts +7 -0
  235. package/src/capabilities/react-surface/react-surface.tsx +97 -0
  236. package/src/capabilities/repair/index.ts +7 -0
  237. package/src/capabilities/repair/repair.ts +51 -0
  238. package/src/capabilities/settings/index.ts +7 -0
  239. package/src/capabilities/settings/settings.ts +33 -0
  240. package/src/capabilities/state/index.ts +7 -0
  241. package/src/capabilities/state/state.ts +22 -0
  242. package/src/components/Call/Call.tsx +8 -4
  243. package/src/components/Call/Toolbar.tsx +33 -25
  244. package/src/components/CallDebugPanel.tsx +12 -14
  245. package/src/components/CallSidebar.tsx +5 -3
  246. package/src/components/ChannelContainer.stories.tsx +17 -15
  247. package/src/components/ChannelContainer.tsx +31 -25
  248. package/src/components/Chat.stories.tsx +20 -25
  249. package/src/components/ChatContainer.tsx +35 -27
  250. package/src/components/Comments.stories.tsx +30 -33
  251. package/src/components/CommentsContainer.tsx +5 -7
  252. package/src/components/CommentsThreadContainer.tsx +39 -35
  253. package/src/components/Lobby/Lobby.tsx +9 -7
  254. package/src/components/Media/AudioStream.tsx +2 -2
  255. package/src/components/Media/VideoObject.stories.tsx +12 -7
  256. package/src/components/Media/VideoObject.tsx +2 -2
  257. package/src/components/MessageContainer.tsx +59 -28
  258. package/src/components/Participant/Participant.tsx +32 -19
  259. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +3 -4
  260. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +3 -3
  261. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +4 -5
  262. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +6 -6
  263. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +6 -3
  264. package/src/components/ThreadCompanion.tsx +193 -0
  265. package/src/components/ThreadSettings.tsx +6 -1
  266. package/src/components/command-extension.ts +2 -2
  267. package/src/components/index.ts +4 -7
  268. package/src/components/testing.ts +7 -9
  269. package/src/extensions/threads.ts +86 -42
  270. package/src/functions/create-proposals.ts +57 -0
  271. package/src/functions/index.ts +5 -0
  272. package/src/hooks/analytics.ts +21 -21
  273. package/src/hooks/index.ts +3 -2
  274. package/src/hooks/useVideoStreamTrack.tsx +1 -1
  275. package/src/index.ts +1 -1
  276. package/src/meta.ts +11 -7
  277. package/src/testing/stories.ts +17 -16
  278. package/src/translations.ts +6 -3
  279. package/src/types/Channel.ts +30 -0
  280. package/src/types/capabilities.ts +34 -0
  281. package/src/types/index.ts +2 -1
  282. package/src/types/types.ts +168 -89
  283. package/src/util.ts +1 -1
  284. package/dist/lib/browser/ChannelContainer-EICZI7H6.mjs +0 -16
  285. package/dist/lib/browser/ChatContainer-EXNNREYB.mjs +0 -15
  286. package/dist/lib/browser/app-graph-builder-B5GYUSJ2.mjs +0 -171
  287. package/dist/lib/browser/app-graph-builder-B5GYUSJ2.mjs.map +0 -7
  288. package/dist/lib/browser/call-manager-ZXNHLSXU.mjs +0 -24
  289. package/dist/lib/browser/call-manager-ZXNHLSXU.mjs.map +0 -7
  290. package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
  291. package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
  292. package/dist/lib/browser/chunk-5GOEKXWF.mjs +0 -620
  293. package/dist/lib/browser/chunk-5GOEKXWF.mjs.map +0 -7
  294. package/dist/lib/browser/chunk-6L5JSXLF.mjs +0 -23
  295. package/dist/lib/browser/chunk-6L5JSXLF.mjs.map +0 -7
  296. package/dist/lib/browser/chunk-7W7QK5ZP.mjs +0 -986
  297. package/dist/lib/browser/chunk-7W7QK5ZP.mjs.map +0 -7
  298. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  299. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  300. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  301. package/dist/lib/browser/chunk-KTWYVC5X.mjs +0 -147
  302. package/dist/lib/browser/chunk-KTWYVC5X.mjs.map +0 -7
  303. package/dist/lib/browser/chunk-PBMNFG3B.mjs +0 -376
  304. package/dist/lib/browser/chunk-PBMNFG3B.mjs.map +0 -7
  305. package/dist/lib/browser/chunk-RI3Z6MK3.mjs.map +0 -7
  306. package/dist/lib/browser/chunk-ZCEU5K23.mjs.map +0 -7
  307. package/dist/lib/browser/intent-resolver-UZNJ2YDK.mjs +0 -427
  308. package/dist/lib/browser/intent-resolver-UZNJ2YDK.mjs.map +0 -7
  309. package/dist/lib/browser/markdown-II2YTQDX.mjs +0 -169
  310. package/dist/lib/browser/markdown-II2YTQDX.mjs.map +0 -7
  311. package/dist/lib/browser/react-root-5SOWYI62.mjs +0 -28
  312. package/dist/lib/browser/react-root-5SOWYI62.mjs.map +0 -7
  313. package/dist/lib/browser/react-surface-3Z3WJYVP.mjs +0 -109
  314. package/dist/lib/browser/react-surface-3Z3WJYVP.mjs.map +0 -7
  315. package/dist/lib/browser/settings-OR2QP3OU.mjs +0 -22
  316. package/dist/lib/browser/settings-OR2QP3OU.mjs.map +0 -7
  317. package/dist/lib/browser/state-JAWCHYCK.mjs +0 -34
  318. package/dist/lib/browser/state-JAWCHYCK.mjs.map +0 -7
  319. package/dist/lib/browser/toolkit-AU6POUKA.mjs +0 -80
  320. package/dist/lib/browser/toolkit-AU6POUKA.mjs.map +0 -7
  321. package/dist/lib/node-esm/ChannelContainer-FLZZCFBA.mjs +0 -17
  322. package/dist/lib/node-esm/ChatContainer-QVQKFBWA.mjs +0 -16
  323. package/dist/lib/node-esm/app-graph-builder-MQ6T5HPO.mjs +0 -172
  324. package/dist/lib/node-esm/app-graph-builder-MQ6T5HPO.mjs.map +0 -7
  325. package/dist/lib/node-esm/call-manager-KUWBOOOE.mjs +0 -25
  326. package/dist/lib/node-esm/call-manager-KUWBOOOE.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  328. package/dist/lib/node-esm/chunk-DKCQCENK.mjs +0 -377
  329. package/dist/lib/node-esm/chunk-DKCQCENK.mjs.map +0 -7
  330. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  331. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  332. package/dist/lib/node-esm/chunk-JNPKMT7O.mjs.map +0 -7
  333. package/dist/lib/node-esm/chunk-LKQE2HID.mjs +0 -25
  334. package/dist/lib/node-esm/chunk-LKQE2HID.mjs.map +0 -7
  335. package/dist/lib/node-esm/chunk-P6E247RF.mjs +0 -148
  336. package/dist/lib/node-esm/chunk-P6E247RF.mjs.map +0 -7
  337. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs +0 -19
  338. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs.map +0 -7
  339. package/dist/lib/node-esm/chunk-SNKFZQST.mjs +0 -987
  340. package/dist/lib/node-esm/chunk-SNKFZQST.mjs.map +0 -7
  341. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs.map +0 -7
  342. package/dist/lib/node-esm/chunk-XXMQULU7.mjs +0 -621
  343. package/dist/lib/node-esm/chunk-XXMQULU7.mjs.map +0 -7
  344. package/dist/lib/node-esm/intent-resolver-HFCMCWWL.mjs +0 -428
  345. package/dist/lib/node-esm/intent-resolver-HFCMCWWL.mjs.map +0 -7
  346. package/dist/lib/node-esm/markdown-5ULETN3T.mjs +0 -170
  347. package/dist/lib/node-esm/markdown-5ULETN3T.mjs.map +0 -7
  348. package/dist/lib/node-esm/react-root-YNTMWDXR.mjs +0 -29
  349. package/dist/lib/node-esm/react-root-YNTMWDXR.mjs.map +0 -7
  350. package/dist/lib/node-esm/react-surface-QMNLDBFM.mjs +0 -110
  351. package/dist/lib/node-esm/react-surface-QMNLDBFM.mjs.map +0 -7
  352. package/dist/lib/node-esm/settings-WGHLJ37H.mjs +0 -23
  353. package/dist/lib/node-esm/settings-WGHLJ37H.mjs.map +0 -7
  354. package/dist/lib/node-esm/state-VN6GE5MY.mjs +0 -35
  355. package/dist/lib/node-esm/state-VN6GE5MY.mjs.map +0 -7
  356. package/dist/lib/node-esm/toolkit-TLMJIYXI.mjs +0 -81
  357. package/dist/lib/node-esm/toolkit-TLMJIYXI.mjs.map +0 -7
  358. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  359. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  360. package/dist/types/src/capabilities/call-manager.d.ts +0 -5
  361. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  362. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  363. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  364. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  365. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  366. package/dist/types/src/capabilities/markdown.d.ts +0 -4
  367. package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
  368. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  369. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  370. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  371. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  372. package/dist/types/src/capabilities/settings.d.ts +0 -4
  373. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  374. package/dist/types/src/capabilities/state.d.ts +0 -7
  375. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  376. package/dist/types/src/capabilities/toolkit.d.ts +0 -5
  377. package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
  378. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  379. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  380. package/dist/types/src/types/schema.d.ts +0 -177
  381. package/dist/types/src/types/schema.d.ts.map +0 -1
  382. package/src/capabilities/app-graph-builder.ts +0 -183
  383. package/src/capabilities/call-manager.ts +0 -20
  384. package/src/capabilities/capabilities.ts +0 -33
  385. package/src/capabilities/intent-resolver.ts +0 -348
  386. package/src/capabilities/markdown.ts +0 -69
  387. package/src/capabilities/react-root.tsx +0 -17
  388. package/src/capabilities/react-surface.tsx +0 -89
  389. package/src/capabilities/settings.ts +0 -19
  390. package/src/capabilities/state.ts +0 -26
  391. package/src/capabilities/toolkit.ts +0 -78
  392. package/src/components/ThreadComplementary.tsx +0 -181
  393. package/src/types/schema.ts +0 -33
  394. /package/dist/lib/browser/{ChannelContainer-EICZI7H6.mjs.map → blueprints/index.mjs.map} +0 -0
  395. /package/dist/lib/browser/{ChatContainer-EXNNREYB.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  396. /package/dist/lib/node-esm/{ChannelContainer-FLZZCFBA.mjs.map → blueprints/index.mjs.map} +0 -0
  397. /package/dist/lib/node-esm/{ChatContainer-QVQKFBWA.mjs.map → chunk-HSLMI22Q.mjs.map} +0 -0
@@ -5,16 +5,19 @@
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
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
22
  import { useOnEditAnalytics } from '../hooks';
20
23
  import { meta } from '../meta';
@@ -26,7 +29,7 @@ export const buttonGroupClassNames = 'flex flex-row items-center gap-0.5 pie-2';
26
29
  export const buttonClassNames = '!p-1 transition-opacity';
27
30
 
28
31
  export type MessageContainerProps = {
29
- message: DataType.Message;
32
+ message: Obj.Obj<Message.Message> | Ref.Ref<Obj.Obj<Message.Message>>;
30
33
  members: SpaceMember[];
31
34
  editable?: boolean;
32
35
  onDelete?: (id: string) => void;
@@ -34,30 +37,55 @@ export type MessageContainerProps = {
34
37
  };
35
38
 
36
39
  export const MessageContainer = ({
37
- message,
40
+ message: messageOrRef,
38
41
  members,
39
42
  editable = false,
40
43
  onDelete,
41
44
  onAcceptProposal,
42
45
  }: MessageContainerProps) => {
43
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
+
44
79
  const senderIdentity = members.find(
45
80
  (member) =>
46
81
  (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||
47
82
  (message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey)),
48
83
  )?.identity;
49
84
  const messageMetadata = getMessageMetadata(message.id, senderIdentity);
50
- const userIsAuthor = useIdentity()?.did === messageMetadata.authorId;
51
- const [editing, setEditing] = useState(false);
52
- const handleEdit = useCallback(() => setEditing((editing) => !editing), []);
53
- const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);
54
- const handleAcceptProposal = useCallback(() => onAcceptProposal?.(message.id), [message, onAcceptProposal]);
55
- const textBlock = message.blocks.find((block) => block._tag === 'text');
85
+ const userIsAuthor = identity?.did === messageMetadata.authorId;
56
86
  const proposalBlock = message.blocks.find((block) => block._tag === 'proposal');
57
87
  const references = message.blocks.filter((block) => block._tag === 'reference').map((block) => block.reference);
58
88
 
59
- useOnEditAnalytics(message, textBlock, !!editing);
60
-
61
89
  return (
62
90
  <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>
63
91
  <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>
@@ -98,16 +126,18 @@ export const MessageContainer = ({
98
126
  )}
99
127
  </div>
100
128
  </MessageHeading>
101
- {textBlock && <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} />}
129
+ {textBlock && (
130
+ <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} onSave={handleTextBlockChange} />
131
+ )}
102
132
  {proposalBlock && <ProposalBlock block={proposalBlock} />}
103
133
  {Ref.Array.targets(references).map((reference, index) => (
104
- <MessagePart key={index} part={reference} />
134
+ <MessagePart key={index} part={reference as Obj.Unknown} />
105
135
  ))}
106
136
  </MessageRoot>
107
137
  );
108
138
  };
109
139
 
110
- const MessagePart = ({ part }: { part: Type.Expando }) => {
140
+ const MessagePart = ({ part }: { part: Obj.Unknown }) => {
111
141
  return <MessageBlockObjectTile subject={part} />;
112
142
  };
113
143
 
@@ -115,11 +145,13 @@ const TextboxBlock = ({
115
145
  block,
116
146
  isAuthor,
117
147
  editing,
148
+ onSave,
118
149
  }: {
119
- block: DataType.MessageBlock.Text;
150
+ block: ContentBlock.Text;
120
151
  editing?: boolean;
121
152
  isAuthor?: boolean;
122
153
  identity?: Identity;
154
+ onSave?: (newText: string) => void;
123
155
  }) => {
124
156
  const { themeMode } = useThemeContext();
125
157
  const inMemoryContentRef = useRef(block.text);
@@ -129,8 +161,8 @@ const TextboxBlock = ({
129
161
  }, []);
130
162
 
131
163
  const saveDocumentChange = useCallback(() => {
132
- block.text = inMemoryContentRef.current;
133
- }, [block]);
164
+ onSave?.(inMemoryContentRef.current);
165
+ }, [onSave]);
134
166
 
135
167
  useOnTransition(editing, true, false, saveDocumentChange);
136
168
 
@@ -158,7 +190,7 @@ const TextboxBlock = ({
158
190
  return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;
159
191
  };
160
192
 
161
- const ProposalBlock = ({ block }: { block: DataType.MessageBlock.Proposal }) => {
193
+ const ProposalBlock = ({ block }: { block: ContentBlock.Proposal }) => {
162
194
  return (
163
195
  <div role='none' className='mie-4 italic'>
164
196
  {block.text}
@@ -166,7 +198,7 @@ const ProposalBlock = ({ block }: { block: DataType.MessageBlock.Proposal }) =>
166
198
  );
167
199
  };
168
200
 
169
- const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(({ subject }, forwardedRef) => {
201
+ const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Unknown }>(({ subject }, forwardedRef) => {
170
202
  // TODO(burdon): Use annotation to get title.
171
203
  let title = (subject as any).name ?? (subject as any).title ?? (subject as any).type ?? 'Object';
172
204
  if (typeof title !== 'string') {
@@ -174,12 +206,11 @@ const MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(
174
206
  }
175
207
 
176
208
  return (
177
- <div
178
- role='group'
179
- 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)}
180
211
  ref={forwardedRef}
181
212
  >
182
- <Surface role='card' limit={1} data={{ subject }} fallback={title} />
183
- </div>
213
+ <Surface role='card-content' limit={1} data={{ subject }} fallback={title} />
214
+ </Card.Root>
184
215
  );
185
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,27 +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
23
 
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;
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
+ ]);
27
45
 
28
46
  const videoStream = useMemo<MediaStream | undefined>(() => {
29
47
  if (isSelf) {
30
- if (isScreenshare) {
31
- return call.media.screenshareVideoStream;
32
- } else if (!isScreenshare) {
33
- return call.media.videoStream;
34
- }
35
- } else if (!isSelf) {
36
- return pulledVideoStream;
48
+ return isScreenshare ? media.screenshareVideoStream : media.videoStream;
37
49
  }
38
- }, [isSelf, isScreenshare, call.media.videoStream, call.media.screenshareVideoStream, pulledVideoStream]);
50
+ return pulledVideoStream;
51
+ }, [isSelf, isScreenshare, media.videoStream, media.screenshareVideoStream, pulledVideoStream]);
39
52
 
40
53
  return (
41
54
  <ResponsiveGridItem
@@ -43,8 +56,8 @@ export const Participant = memo(({ item: user, debug, ...props }: ResponsiveGrid
43
56
  item={user}
44
57
  name={user.name}
45
58
  self={isSelf}
46
- screenshare={!!call.media.screenshareVideoStream}
47
- video={call.media.videoEnabled}
59
+ screenshare={!!media.screenshareVideoStream}
60
+ video={media.videoEnabled}
48
61
  mute={user ? !user.tracks?.audioEnabled : false}
49
62
  wave={user.raisedHand}
50
63
  speaking={user.speaking}
@@ -2,12 +2,10 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React from 'react';
9
7
 
10
- import { withLayout, withTheme } from '@dxos/storybook-utils';
8
+ import { withTheme } from '@dxos/react-ui/testing';
11
9
 
12
10
  import { translations } from '../../translations';
13
11
  import { VideoObject as VideoObjectComponent } from '../Media';
@@ -17,8 +15,9 @@ import { ResponsiveContainer } from './ResponsiveContainer';
17
15
  const meta = {
18
16
  title: 'plugins/plugin-thread/ResponsiveContainer',
19
17
  component: ResponsiveContainer,
20
- decorators: [withTheme, withLayout({ fullscreen: true })],
18
+ decorators: [withTheme],
21
19
  parameters: {
20
+ layout: 'fullscreen',
22
21
  translations,
23
22
  },
24
23
  } satisfies Meta<typeof ResponsiveContainer>;
@@ -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,13 +2,11 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React, { useEffect, useState } from 'react';
9
7
 
10
8
  import { faker } from '@dxos/random';
11
- import { withLayout, withTheme } from '@dxos/storybook-utils';
9
+ import { withTheme } from '@dxos/react-ui/testing';
12
10
 
13
11
  import { translations } from '../../translations';
14
12
 
@@ -43,7 +41,7 @@ const TestCell = ({ item, ...props }: ResponsiveGridItemProps<TestItem>) => {
43
41
  {item.type === 'image' && <img className='aspect-video object-contain' src={item.imageUrl} />}
44
42
  {item.type === 'video' && (
45
43
  <video
46
- className='w-full aspect-video object-cover rounded-md'
44
+ className='is-full aspect-video object-cover rounded-md'
47
45
  src={item.videoUrl}
48
46
  playsInline
49
47
  autoPlay
@@ -94,8 +92,9 @@ const meta = {
94
92
  title: 'plugins/plugin-thread/ResponsiveGrid',
95
93
  component: ResponsiveGrid as any,
96
94
  render: DefaultStory,
97
- decorators: [withTheme, withLayout({ fullscreen: true, classNames: 'justify-center' })],
95
+ decorators: [withTheme],
98
96
  parameters: {
97
+ layout: 'fullscreen',
99
98
  translations,
100
99
  },
101
100
  } satisfies Meta<typeof DefaultStory>;
@@ -8,7 +8,7 @@ import { useResizeDetector } from 'react-resize-detector';
8
8
  import { invariant } from '@dxos/invariant';
9
9
  import { type ThemedClassName } from '@dxos/react-ui';
10
10
  import { type Size } from '@dxos/react-ui-dnd';
11
- import { mx } from '@dxos/react-ui-theme';
11
+ import { mx } from '@dxos/ui-theme';
12
12
 
13
13
  import { ResponsiveContainer } from './ResponsiveContainer';
14
14
  import { type ResponsiveGridItemProps } from './ResponsiveGridItem';
@@ -18,7 +18,7 @@ const MIN_GALLERY_HEIGHT = 250;
18
18
 
19
19
  const DEFAULT_GAP = 8;
20
20
 
21
- const maxImageSize = 'w-[2560px] h-[1440px]';
21
+ const maxImageSize = 'is-[2560px] bs-[1440px]';
22
22
 
23
23
  /**
24
24
  * Props for the ResponsiveGrid component.
@@ -136,13 +136,13 @@ export const ResponsiveGrid = <T extends object = any>({
136
136
  );
137
137
 
138
138
  return (
139
- <div ref={containerRef} className={mx('relative w-full h-full', classNames)}>
139
+ <div ref={containerRef} className={mx('relative is-full bs-full', classNames)}>
140
140
  {/* Placeholder elements to calculate layout. */}
141
141
  <div className='absolute inset-0 flex flex-col grow gap-2'>
142
142
  {/* Pinned item. */}
143
143
  {pinnedItem && (
144
144
  <div
145
- className={mx('flex grow-[2] shrink overflow-hidden justify-center items-center', hideGallery && 'h-full')}
145
+ className={mx('flex grow-[2] shrink overflow-hidden justify-center items-center', hideGallery && 'bs-full')}
146
146
  style={hideGallery ? {} : { height: dividerHeight }}
147
147
  >
148
148
  <SoloItem id={getId(pinnedItem)} debug={debug} />
@@ -157,7 +157,7 @@ export const ResponsiveGrid = <T extends object = any>({
157
157
  style={hideGallery ? {} : { minHeight: MIN_GALLERY_HEIGHT }}
158
158
  >
159
159
  {mainItems.length === 1 && (
160
- <div style={{ width: cellWidth }} className='flex h-full'>
160
+ <div style={{ width: cellWidth }} className='flex bs-full'>
161
161
  <SoloItem id={getId(mainItems[0])} debug={debug} />
162
162
  </div>
163
163
  )}
@@ -176,7 +176,7 @@ export const ResponsiveGrid = <T extends object = any>({
176
176
  key={getId(item)}
177
177
  {...{ 'data-grid-item': getId(item) }}
178
178
  className={mx(
179
- 'aspect-video max-h-full max-w-full w-auto h-auto',
179
+ 'aspect-video max-bs-full max-is-full is-auto bs-auto',
180
180
  debug && 'border border-primary-500',
181
181
  )}
182
182
  />
@@ -6,7 +6,7 @@ import React, { type CSSProperties, type PropsWithChildren, useEffect, useState
6
6
 
7
7
  import { Icon, IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';
8
8
  import { Waveform } from '@dxos/react-ui-sfx';
9
- import { groupHoverControlItemWithTransition, mx } from '@dxos/react-ui-theme';
9
+ import { groupHoverControlItemWithTransition, mx } from '@dxos/ui-theme';
10
10
 
11
11
  import { meta } from '../../meta';
12
12
 
@@ -76,7 +76,7 @@ export const ResponsiveGridItem = <T extends object = any>({
76
76
  return (
77
77
  <div
78
78
  className={mx(
79
- 'relative w-full h-full group',
79
+ 'relative is-full bs-full group',
80
80
  'rounded-md outline outline-2 outline-neutral-900 transition-[outline-color] duration-500',
81
81
  speakingIndicator ? 'outline-green-500' : !video && 'outline-separator',
82
82
  classNames,
@@ -106,7 +106,10 @@ export const ResponsiveGridItem = <T extends object = any>({
106
106
  {/* {self && <Icon icon='ph--asterisk--regular' size={pinned ? 5 : 4} />} */}
107
107
  {screenshare && <Icon icon='ph--broadcast--regular' size={pinned ? 5 : 4} />}
108
108
  <div
109
- className={mx('bg-neutral-800 text-neutral-100 py-0.5 truncate rounded', pinned ? 'px-2' : 'px-1 text-xs')}
109
+ className={mx(
110
+ 'bg-neutral-800 text-neutral-100 plb-0.5 truncate rounded',
111
+ pinned ? 'pli-2' : 'pli-1 text-xs',
112
+ )}
110
113
  >
111
114
  {name}
112
115
  </div>
@@ -0,0 +1,193 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { useAtomValue } from '@effect-atom/atom-react';
6
+ import React, { useCallback, useMemo } from 'react';
7
+
8
+ import { Common } from '@dxos/app-framework';
9
+ import { useCapabilities, useCapability, useOperationInvoker } from '@dxos/app-framework/react';
10
+ import { Filter, Obj, Query, Relation } from '@dxos/echo';
11
+ import { Ref, useQuery } from '@dxos/react-client/echo';
12
+ import { useIdentity } from '@dxos/react-client/halo';
13
+ import { useTranslation } from '@dxos/react-ui';
14
+ import { useAttended } from '@dxos/react-ui-attention';
15
+ import { Layout } from '@dxos/react-ui-mosaic';
16
+ import { Tabs } from '@dxos/react-ui-tabs';
17
+ import { AnchoredTo, Thread } from '@dxos/types';
18
+ import { mx } from '@dxos/ui-theme';
19
+
20
+ import { CommentsContainer, type CommentsContainerProps } from '../components';
21
+ import { meta } from '../meta';
22
+ import { ThreadCapabilities, ThreadOperation, type ViewState } from '../types';
23
+
24
+ const initialViewState: ViewState = { showResolvedThreads: false };
25
+
26
+ export const ThreadCompanion = ({ subject }: { subject: any }) => {
27
+ const { t } = useTranslation(meta.id);
28
+ const { invokePromise } = useOperationInvoker();
29
+ const identity = useIdentity();
30
+ const subjectId = Obj.getDXN(subject).toString();
31
+ const registry = useCapability(Common.Capability.AtomRegistry);
32
+
33
+ const stateAtom = useCapability(ThreadCapabilities.State);
34
+ const viewStoreAtom = useCapability(ThreadCapabilities.ViewState);
35
+ const state = useAtomValue(stateAtom);
36
+ const viewStore = useAtomValue(viewStoreAtom);
37
+ const drafts = state.drafts[subjectId];
38
+
39
+ // Get or initialize view state for this subject.
40
+ const viewState = useMemo(() => {
41
+ if (!viewStore[subjectId]) {
42
+ registry.set(viewStoreAtom, { ...viewStore, [subjectId]: { ...initialViewState } });
43
+ return initialViewState;
44
+ }
45
+ return viewStore[subjectId];
46
+ }, [viewStore, subjectId, registry, viewStoreAtom]);
47
+ const { showResolvedThreads } = viewState;
48
+
49
+ const onChangeViewState = useCallback(
50
+ (nextValue: string) => {
51
+ registry.set(viewStoreAtom, {
52
+ ...registry.get(viewStoreAtom),
53
+ [subjectId]: { ...registry.get(viewStoreAtom)[subjectId], showResolvedThreads: nextValue === 'all' },
54
+ });
55
+ },
56
+ [registry, viewStoreAtom, subjectId],
57
+ );
58
+
59
+ const anchorSorts = useCapabilities(Common.Capability.AnchorSort);
60
+ const sort = useMemo(
61
+ () => anchorSorts.find(({ key }) => key === Obj.getTypename(subject))?.sort,
62
+ [anchorSorts, subject],
63
+ );
64
+
65
+ const db = Obj.getDatabase(subject);
66
+ const objectsAnchoredTo = useQuery(db, Query.select(Filter.id(subject.id)).targetOf(AnchoredTo.AnchoredTo));
67
+ const anchors = objectsAnchoredTo
68
+ .toSorted((a, b) => sort?.(a, b) ?? 0)
69
+ .filter((anchor) => Obj.instanceOf(Thread.Thread, Relation.getSource(anchor)))
70
+ .concat(drafts ?? []);
71
+
72
+ const attended = useAttended();
73
+
74
+ const handleAttend = useCallback(
75
+ (anchor: AnchoredTo.AnchoredTo) => {
76
+ const thread = Relation.getSource(anchor) as Thread.Thread;
77
+ const threadId = Obj.getDXN(thread).toString();
78
+
79
+ if (state.current !== threadId) {
80
+ registry.set(stateAtom, { ...registry.get(stateAtom), current: threadId });
81
+
82
+ // TODO(wittjosiah): Should this be a thread-specific intent?
83
+ // The layout doesn't know about threads and this working depends on other plugins conditionally handling it.
84
+ // This may be overloading this intent or highjacking its intended purpose.
85
+ void invokePromise(Common.LayoutOperation.ScrollIntoView, {
86
+ subject: Obj.getDXN(subject).toString(),
87
+ cursor: anchor.anchor,
88
+ ref: threadId,
89
+ });
90
+ }
91
+ },
92
+ [state.current, invokePromise, subject, registry, stateAtom],
93
+ );
94
+
95
+ const handleComment = useCallback(
96
+ async (anchor: AnchoredTo.AnchoredTo, text: string) => {
97
+ await invokePromise(ThreadOperation.AddMessage, {
98
+ anchor,
99
+ subject,
100
+ sender: { identityDid: identity?.did },
101
+ text,
102
+ });
103
+
104
+ const thread = Relation.getSource(anchor) as Thread.Thread;
105
+ registry.set(stateAtom, { ...registry.get(stateAtom), current: Obj.getDXN(thread).toString() });
106
+ },
107
+ [invokePromise, identity, subject, registry, stateAtom],
108
+ );
109
+
110
+ const handleResolve = useCallback(
111
+ (anchor: AnchoredTo.AnchoredTo) =>
112
+ invokePromise(ThreadOperation.ToggleResolved, {
113
+ thread: Relation.getSource(anchor) as Thread.Thread,
114
+ }),
115
+ [invokePromise],
116
+ );
117
+
118
+ const handleThreadDelete = useCallback(
119
+ (anchor: AnchoredTo.AnchoredTo) => invokePromise(ThreadOperation.Delete, { anchor, subject }),
120
+ [invokePromise, subject],
121
+ );
122
+
123
+ const handleMessageDelete = useCallback(
124
+ (anchor: AnchoredTo.AnchoredTo, messageId: string) =>
125
+ invokePromise(ThreadOperation.DeleteMessage, {
126
+ anchor,
127
+ subject,
128
+ messageId,
129
+ }),
130
+ [invokePromise, subject],
131
+ );
132
+
133
+ const handleAcceptProposal = useCallback<NonNullable<CommentsContainerProps['onAcceptProposal']>>(
134
+ async (anchor, messageId) => {
135
+ const thread = Relation.getSource(anchor) as Thread.Thread;
136
+ const messageIndex = thread.messages.findIndex(Ref.hasObjectId(messageId));
137
+ const message = thread.messages[messageIndex]?.target;
138
+ const proposal = message?.blocks.find((block) => block._tag === 'proposal');
139
+ if (!proposal || !anchor.anchor) {
140
+ return;
141
+ }
142
+
143
+ await invokePromise(Common.CollaborationOperation.AcceptProposal, {
144
+ subject,
145
+ anchor: anchor.anchor,
146
+ proposal,
147
+ });
148
+ await invokePromise(ThreadOperation.ToggleResolved, { thread });
149
+ },
150
+ [invokePromise, subject],
151
+ );
152
+
153
+ const comments = (
154
+ <CommentsContainer
155
+ anchors={anchors}
156
+ currentId={attended.includes(subjectId) ? state.current : undefined}
157
+ showResolvedThreads={showResolvedThreads}
158
+ onAttend={handleAttend}
159
+ onComment={handleComment}
160
+ onResolve={handleResolve}
161
+ onMessageDelete={handleMessageDelete}
162
+ onThreadDelete={handleThreadDelete}
163
+ onAcceptProposal={handleAcceptProposal}
164
+ />
165
+ );
166
+
167
+ return (
168
+ <Layout.Main toolbar>
169
+ <Tabs.Root
170
+ value={showResolvedThreads ? 'all' : 'unresolved'}
171
+ orientation='horizontal'
172
+ classNames={[
173
+ 'contents [&_[role="tabpanel"]]:min-bs-0 [&_[role="tabpanel"]]:overflow-y-auto [&_[role="tabpanel"]]:scrollbar-thin',
174
+ ]}
175
+ onValueChange={onChangeViewState}
176
+ >
177
+ {/* TODO(burdon): Standardize (like Tollbar). */}
178
+ <Tabs.Tablist classNames={mx('bg-toolbarSurface border-be border-subduedSeparator')}>
179
+ <Tabs.Tab value='unresolved' classNames='text-sm'>
180
+ {t('show unresolved label')}
181
+ </Tabs.Tab>
182
+ <Tabs.Tab value='all' classNames='text-sm'>
183
+ {t('show all label')}
184
+ </Tabs.Tab>
185
+ </Tabs.Tablist>
186
+ <div className='overflow-y-auto'>
187
+ <Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>
188
+ <Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>
189
+ </div>
190
+ </Tabs.Root>
191
+ </Layout.Main>
192
+ );
193
+ };
@@ -10,7 +10,12 @@ import { ControlPage } from '@dxos/react-ui-form';
10
10
  import { meta } from '../meta';
11
11
  import type { ThreadSettingsProps } from '../types';
12
12
 
13
- export const ThreadSettings = ({ settings: _settings }: { settings: ThreadSettingsProps }) => {
13
+ export type ThreadSettingsComponentProps = {
14
+ settings: ThreadSettingsProps;
15
+ onSettingsChange: (fn: (current: ThreadSettingsProps) => ThreadSettingsProps) => void;
16
+ };
17
+
18
+ export const ThreadSettings = ({ settings: _settings }: ThreadSettingsComponentProps) => {
14
19
  const { t: _t } = useTranslation(meta.id);
15
20
  return <ControlPage></ControlPage>;
16
21
  };
@@ -5,8 +5,8 @@
5
5
  import { HighlightStyle, StreamLanguage, syntaxHighlighting } from '@codemirror/language';
6
6
  import { type Extension } from '@codemirror/state';
7
7
 
8
- import { tags } from '@dxos/react-ui-editor';
9
- import { mx } from '@dxos/react-ui-theme';
8
+ import { tags } from '@dxos/ui-editor';
9
+ import { mx } from '@dxos/ui-theme';
10
10
 
11
11
  /**
12
12
  * https://github.com/codemirror/stream-parser/blob/main/test/test-stream-parser.ts
@@ -2,17 +2,14 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { lazy } from 'react';
6
-
7
- export const ChannelContainer = lazy(() => import('./ChannelContainer'));
8
- export const ChatContainer = lazy(() => import('./ChatContainer'));
9
-
10
- // TODO(wittjosiah): Suspense boundary for sidebar?
11
5
  export * from './Call';
12
6
  export * from './CallDebugPanel';
13
7
  export * from './CallSidebar';
14
8
  export * from './CommentsContainer';
15
9
  export * from './CommentsThreadContainer';
16
10
  export * from './MessageContainer';
17
- export * from './ThreadComplementary';
11
+ export * from './ThreadCompanion';
18
12
  export * from './ThreadSettings';
13
+
14
+ export { ChannelContainer } from './ChannelContainer';
15
+ export { ChatContainer } from './ChatContainer';