@dxos/plugin-thread 0.8.4-main.c1de068 → 0.8.4-main.c85a9c8dae

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 (482) hide show
  1. package/dist/lib/browser/CallDebugPanel-FGCTY7Q4.mjs +182 -0
  2. package/dist/lib/browser/CallDebugPanel-FGCTY7Q4.mjs.map +7 -0
  3. package/dist/lib/browser/CallSidebar-PJCMNDIF.mjs +33 -0
  4. package/dist/lib/browser/CallSidebar-PJCMNDIF.mjs.map +7 -0
  5. package/dist/lib/browser/ChannelContainer-EPYG4QAC.mjs +15 -0
  6. package/dist/lib/browser/ChatContainer-2243UD2M.mjs +14 -0
  7. package/dist/lib/browser/ThreadCompanion-2CMLJH76.mjs +204 -0
  8. package/dist/lib/browser/ThreadCompanion-2CMLJH76.mjs.map +7 -0
  9. package/dist/lib/browser/ThreadSettings-S55YVOGA.mjs +20 -0
  10. package/dist/lib/browser/ThreadSettings-S55YVOGA.mjs.map +7 -0
  11. package/dist/lib/browser/app-graph-builder-5LCAM746.mjs +191 -0
  12. package/dist/lib/browser/app-graph-builder-5LCAM746.mjs.map +7 -0
  13. package/dist/lib/browser/blueprint-definition-42M2EJ2Y.mjs +17 -0
  14. package/dist/lib/browser/blueprint-definition-42M2EJ2Y.mjs.map +7 -0
  15. package/dist/lib/browser/blueprints/index.mjs +8 -0
  16. package/dist/lib/browser/call-manager-2PRP4QVZ.mjs +27 -0
  17. package/dist/lib/browser/call-manager-2PRP4QVZ.mjs.map +7 -0
  18. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  19. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  20. package/dist/lib/browser/{chunk-ZE7KWN36.mjs → chunk-ERK254BS.mjs} +381 -240
  21. package/dist/lib/browser/chunk-ERK254BS.mjs.map +7 -0
  22. package/dist/lib/browser/chunk-G6FJBSXX.mjs +1123 -0
  23. package/dist/lib/browser/chunk-G6FJBSXX.mjs.map +7 -0
  24. package/dist/lib/browser/{chunk-ERWASUQK.mjs → chunk-HDLDMR54.mjs} +85 -50
  25. package/dist/lib/browser/chunk-HDLDMR54.mjs.map +7 -0
  26. package/dist/lib/browser/{chunk-6NSMBO3B.mjs → chunk-ISCHODBV.mjs} +55 -5
  27. package/dist/lib/browser/chunk-ISCHODBV.mjs.map +7 -0
  28. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  29. package/dist/lib/browser/chunk-LUK4UNFA.mjs +20 -0
  30. package/dist/lib/browser/chunk-LUK4UNFA.mjs.map +7 -0
  31. package/dist/lib/browser/chunk-PDHCY236.mjs +223 -0
  32. package/dist/lib/browser/chunk-PDHCY236.mjs.map +7 -0
  33. package/dist/lib/browser/chunk-PL5LIVP4.mjs +105 -0
  34. package/dist/lib/browser/chunk-PL5LIVP4.mjs.map +7 -0
  35. package/dist/lib/browser/chunk-U32R23JO.mjs +277 -0
  36. package/dist/lib/browser/chunk-U32R23JO.mjs.map +7 -0
  37. package/dist/lib/browser/chunk-UVUCB7QO.mjs +125 -0
  38. package/dist/lib/browser/chunk-UVUCB7QO.mjs.map +7 -0
  39. package/dist/lib/browser/index.mjs +143 -137
  40. package/dist/lib/browser/index.mjs.map +4 -4
  41. package/dist/lib/browser/markdown-GRRPCZHJ.mjs +210 -0
  42. package/dist/lib/browser/markdown-GRRPCZHJ.mjs.map +7 -0
  43. package/dist/lib/browser/meta.json +1 -1
  44. package/dist/lib/browser/operation-resolver-EP7FAYEB.mjs +442 -0
  45. package/dist/lib/browser/operation-resolver-EP7FAYEB.mjs.map +7 -0
  46. package/dist/lib/browser/react-root-7UFFPPRD.mjs +26 -0
  47. package/dist/lib/browser/react-root-7UFFPPRD.mjs.map +7 -0
  48. package/dist/lib/browser/react-surface-TIHBSZPD.mjs +113 -0
  49. package/dist/lib/browser/react-surface-TIHBSZPD.mjs.map +7 -0
  50. package/dist/lib/browser/repair-TBU45SBG.mjs +40 -0
  51. package/dist/lib/browser/repair-TBU45SBG.mjs.map +7 -0
  52. package/dist/lib/browser/settings-Y75FG6XR.mjs +35 -0
  53. package/dist/lib/browser/settings-Y75FG6XR.mjs.map +7 -0
  54. package/dist/lib/browser/state-OBTMMEUZ.mjs +25 -0
  55. package/dist/lib/browser/state-OBTMMEUZ.mjs.map +7 -0
  56. package/dist/lib/browser/types/index.mjs +11 -12
  57. package/dist/lib/node-esm/CallDebugPanel-CYACANSP.mjs +183 -0
  58. package/dist/lib/node-esm/CallDebugPanel-CYACANSP.mjs.map +7 -0
  59. package/dist/lib/node-esm/CallSidebar-XD7J7EQ6.mjs +34 -0
  60. package/dist/lib/node-esm/CallSidebar-XD7J7EQ6.mjs.map +7 -0
  61. package/dist/lib/node-esm/ChannelContainer-NU4LSLB4.mjs +16 -0
  62. package/dist/lib/node-esm/ChannelContainer-NU4LSLB4.mjs.map +7 -0
  63. package/dist/lib/node-esm/ChatContainer-FPNIG33R.mjs +15 -0
  64. package/dist/lib/node-esm/ChatContainer-FPNIG33R.mjs.map +7 -0
  65. package/dist/lib/node-esm/ThreadCompanion-TLWTONG6.mjs +205 -0
  66. package/dist/lib/node-esm/ThreadCompanion-TLWTONG6.mjs.map +7 -0
  67. package/dist/lib/node-esm/ThreadSettings-EUH4AGYV.mjs +21 -0
  68. package/dist/lib/node-esm/ThreadSettings-EUH4AGYV.mjs.map +7 -0
  69. package/dist/lib/node-esm/app-graph-builder-VBLHLX75.mjs +192 -0
  70. package/dist/lib/node-esm/app-graph-builder-VBLHLX75.mjs.map +7 -0
  71. package/dist/lib/node-esm/blueprint-definition-PEXTS56K.mjs +18 -0
  72. package/dist/lib/node-esm/blueprint-definition-PEXTS56K.mjs.map +7 -0
  73. package/dist/lib/node-esm/blueprints/index.mjs +9 -0
  74. package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
  75. package/dist/lib/node-esm/call-manager-BLQCEM2F.mjs +28 -0
  76. package/dist/lib/node-esm/call-manager-BLQCEM2F.mjs.map +7 -0
  77. package/dist/lib/node-esm/chunk-6K5ACCGB.mjs +107 -0
  78. package/dist/lib/node-esm/chunk-6K5ACCGB.mjs.map +7 -0
  79. package/dist/lib/node-esm/chunk-7SZBKQUU.mjs +224 -0
  80. package/dist/lib/node-esm/chunk-7SZBKQUU.mjs.map +7 -0
  81. package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
  82. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
  83. package/dist/lib/node-esm/chunk-GPPP2MZ3.mjs +22 -0
  84. package/dist/lib/node-esm/chunk-GPPP2MZ3.mjs.map +7 -0
  85. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  86. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  87. package/dist/lib/node-esm/chunk-IQUV7DR6.mjs +1124 -0
  88. package/dist/lib/node-esm/chunk-IQUV7DR6.mjs.map +7 -0
  89. package/dist/lib/node-esm/{chunk-IHDNQLLR.mjs → chunk-QP3KQOPQ.mjs} +381 -240
  90. package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs.map +7 -0
  91. package/dist/lib/node-esm/chunk-QYAVWNVM.mjs +278 -0
  92. package/dist/lib/node-esm/chunk-QYAVWNVM.mjs.map +7 -0
  93. package/dist/lib/node-esm/chunk-V2GXQ2UB.mjs +126 -0
  94. package/dist/lib/node-esm/chunk-V2GXQ2UB.mjs.map +7 -0
  95. package/dist/lib/node-esm/{chunk-OU5BYIDO.mjs → chunk-VBI32FGI.mjs} +55 -5
  96. package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +7 -0
  97. package/dist/lib/node-esm/{chunk-25ABSYP2.mjs → chunk-YN2Y7GPW.mjs} +85 -50
  98. package/dist/lib/node-esm/chunk-YN2Y7GPW.mjs.map +7 -0
  99. package/dist/lib/node-esm/index.mjs +143 -137
  100. package/dist/lib/node-esm/index.mjs.map +4 -4
  101. package/dist/lib/node-esm/markdown-WHWUESF7.mjs +211 -0
  102. package/dist/lib/node-esm/markdown-WHWUESF7.mjs.map +7 -0
  103. package/dist/lib/node-esm/meta.json +1 -1
  104. package/dist/lib/node-esm/operation-resolver-R7QJW3TW.mjs +443 -0
  105. package/dist/lib/node-esm/operation-resolver-R7QJW3TW.mjs.map +7 -0
  106. package/dist/lib/node-esm/react-root-D7CWS5XP.mjs +27 -0
  107. package/dist/lib/node-esm/react-root-D7CWS5XP.mjs.map +7 -0
  108. package/dist/lib/node-esm/react-surface-WWZFSK5Y.mjs +114 -0
  109. package/dist/lib/node-esm/react-surface-WWZFSK5Y.mjs.map +7 -0
  110. package/dist/lib/node-esm/repair-7JEKRNR3.mjs +41 -0
  111. package/dist/lib/node-esm/repair-7JEKRNR3.mjs.map +7 -0
  112. package/dist/lib/node-esm/settings-W4JN2YKJ.mjs +36 -0
  113. package/dist/lib/node-esm/settings-W4JN2YKJ.mjs.map +7 -0
  114. package/dist/lib/node-esm/state-7UWCSIWQ.mjs +26 -0
  115. package/dist/lib/node-esm/state-7UWCSIWQ.mjs.map +7 -0
  116. package/dist/lib/node-esm/types/index.mjs +11 -12
  117. package/dist/types/src/ThreadPlugin.d.ts +2 -1
  118. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  119. package/dist/types/src/blueprints/index.d.ts +2 -0
  120. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  121. package/dist/types/src/blueprints/thread-blueprint.d.ts +4 -0
  122. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
  123. package/dist/types/src/calls/call-manager.d.ts +40 -30
  124. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  125. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +2 -2
  126. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  127. package/dist/types/src/calls/media-manager.d.ts +2 -2
  128. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  129. package/dist/types/src/calls/types.d.ts +1 -1
  130. package/dist/types/src/calls/types.d.ts.map +1 -1
  131. package/dist/types/src/calls/util/calls-service.d.ts +5 -3
  132. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  133. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  134. package/dist/types/src/calls/util/task-scheduling.d.ts +2 -2
  135. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
  136. package/dist/types/src/calls-service.stories.d.ts +10 -9
  137. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  138. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  139. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  140. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  141. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  142. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +6 -0
  143. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
  144. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
  145. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -0
  146. package/dist/types/src/capabilities/call-manager/call-manager.d.ts +6 -0
  147. package/dist/types/src/capabilities/call-manager/call-manager.d.ts.map +1 -0
  148. package/dist/types/src/capabilities/call-manager/index.d.ts +3 -0
  149. package/dist/types/src/capabilities/call-manager/index.d.ts.map +1 -0
  150. package/dist/types/src/capabilities/index.d.ts +10 -15
  151. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  152. package/dist/types/src/capabilities/markdown/index.d.ts +3 -0
  153. package/dist/types/src/capabilities/markdown/index.d.ts.map +1 -0
  154. package/dist/types/src/capabilities/markdown/markdown.d.ts +5 -0
  155. package/dist/types/src/capabilities/markdown/markdown.d.ts.map +1 -0
  156. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  157. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  158. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  159. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  160. package/dist/types/src/capabilities/react-root/index.d.ts +6 -0
  161. package/dist/types/src/capabilities/react-root/index.d.ts.map +1 -0
  162. package/dist/types/src/capabilities/react-root/react-root.d.ts +9 -0
  163. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -0
  164. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  165. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  166. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  167. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  168. package/dist/types/src/capabilities/repair/index.d.ts +3 -0
  169. package/dist/types/src/capabilities/repair/index.d.ts.map +1 -0
  170. package/dist/types/src/capabilities/repair/repair.d.ts +6 -0
  171. package/dist/types/src/capabilities/repair/repair.d.ts.map +1 -0
  172. package/dist/types/src/capabilities/settings/index.d.ts +3 -0
  173. package/dist/types/src/capabilities/settings/index.d.ts.map +1 -0
  174. package/dist/types/src/capabilities/settings/settings.d.ts +6 -0
  175. package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -0
  176. package/dist/types/src/capabilities/state/index.d.ts +3 -0
  177. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  178. package/dist/types/src/capabilities/state/state.d.ts +7 -0
  179. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  180. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  181. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  182. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  183. package/dist/types/src/components/Comments.stories.d.ts +160 -4
  184. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  185. package/dist/types/src/components/CommentsContainer.d.ts +2 -2
  186. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  187. package/dist/types/src/components/CommentsThreadContainer.d.ts +9 -9
  188. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  189. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  190. package/dist/types/src/components/Media/VideoObject.d.ts +3 -3
  191. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  192. package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
  193. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  194. package/dist/types/src/components/MessageContainer.d.ts +7 -3
  195. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  196. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  197. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  198. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +159 -3
  199. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  200. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +161 -4
  201. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  202. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  203. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  204. package/dist/types/src/components/index.d.ts +0 -6
  205. package/dist/types/src/components/index.d.ts.map +1 -1
  206. package/dist/types/src/components/testing.d.ts +3 -2
  207. package/dist/types/src/components/testing.d.ts.map +1 -1
  208. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts +15 -0
  209. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +1 -0
  210. package/dist/types/src/containers/CallDebugPanel/index.d.ts +3 -0
  211. package/dist/types/src/containers/CallDebugPanel/index.d.ts.map +1 -0
  212. package/dist/types/src/{components → containers/CallSidebar}/CallSidebar.d.ts +0 -1
  213. package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts.map +1 -0
  214. package/dist/types/src/containers/CallSidebar/index.d.ts +3 -0
  215. package/dist/types/src/containers/CallSidebar/index.d.ts.map +1 -0
  216. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +12 -0
  217. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +1 -0
  218. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +164 -0
  219. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +1 -0
  220. package/dist/types/src/containers/ChannelContainer/index.d.ts +3 -0
  221. package/dist/types/src/containers/ChannelContainer/index.d.ts.map +1 -0
  222. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts +17 -0
  223. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +1 -0
  224. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts +164 -0
  225. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts.map +1 -0
  226. package/dist/types/src/containers/ChatContainer/index.d.ts +3 -0
  227. package/dist/types/src/containers/ChatContainer/index.d.ts.map +1 -0
  228. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts +5 -0
  229. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -0
  230. package/dist/types/src/containers/ThreadCompanion/index.d.ts +3 -0
  231. package/dist/types/src/containers/ThreadCompanion/index.d.ts.map +1 -0
  232. package/dist/types/src/containers/ThreadSettings/ThreadSettings.d.ts +8 -0
  233. package/dist/types/src/containers/ThreadSettings/ThreadSettings.d.ts.map +1 -0
  234. package/dist/types/src/containers/ThreadSettings/index.d.ts +3 -0
  235. package/dist/types/src/containers/ThreadSettings/index.d.ts.map +1 -0
  236. package/dist/types/src/containers/index.d.ts +8 -0
  237. package/dist/types/src/containers/index.d.ts.map +1 -0
  238. package/dist/types/src/extensions/threads.d.ts +8 -3
  239. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  240. package/dist/types/src/functions/create-proposals.d.ts +13 -0
  241. package/dist/types/src/functions/create-proposals.d.ts.map +1 -0
  242. package/dist/types/src/functions/index.d.ts +14 -0
  243. package/dist/types/src/functions/index.d.ts.map +1 -0
  244. package/dist/types/src/hooks/analytics.d.ts +2 -3
  245. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  246. package/dist/types/src/hooks/index.d.ts +2 -1
  247. package/dist/types/src/hooks/index.d.ts.map +1 -1
  248. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  249. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  250. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  251. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  252. package/dist/types/src/index.d.ts +1 -1
  253. package/dist/types/src/index.d.ts.map +1 -1
  254. package/dist/types/src/meta.d.ts +3 -4
  255. package/dist/types/src/meta.d.ts.map +1 -1
  256. package/dist/types/src/testing/stories.d.ts +2 -1
  257. package/dist/types/src/testing/stories.d.ts.map +1 -1
  258. package/dist/types/src/translations.d.ts +79 -7
  259. package/dist/types/src/translations.d.ts.map +1 -1
  260. package/dist/types/src/types/Channel.d.ts +711 -0
  261. package/dist/types/src/types/Channel.d.ts.map +1 -0
  262. package/dist/types/src/types/capabilities.d.ts +23 -0
  263. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  264. package/dist/types/src/types/index.d.ts +2 -1
  265. package/dist/types/src/types/index.d.ts.map +1 -1
  266. package/dist/types/src/types/types.d.ts +3300 -365
  267. package/dist/types/src/types/types.d.ts.map +1 -1
  268. package/dist/types/tsconfig.tsbuildinfo +1 -1
  269. package/package.json +93 -66
  270. package/src/ThreadPlugin.tsx +97 -130
  271. package/src/blueprints/index.ts +5 -0
  272. package/src/blueprints/thread-blueprint.ts +40 -0
  273. package/src/calls/call-manager.ts +78 -54
  274. package/src/calls/call-swarm-synchronizer.ts +3 -3
  275. package/src/calls/media-manager.ts +67 -38
  276. package/src/calls/types.ts +8 -4
  277. package/src/calls/util/calls-service.ts +66 -15
  278. package/src/calls/util/stub-media-streams.ts +64 -7
  279. package/src/calls/util/task-scheduling.ts +4 -4
  280. package/src/calls-service.stories.tsx +79 -66
  281. package/src/capabilities/app-graph-builder/app-graph-builder.ts +202 -0
  282. package/src/capabilities/app-graph-builder/index.ts +7 -0
  283. package/src/capabilities/blueprint-definition/blueprint-definition.ts +17 -0
  284. package/src/capabilities/blueprint-definition/index.ts +7 -0
  285. package/src/capabilities/call-manager/call-manager.ts +26 -0
  286. package/src/capabilities/call-manager/index.ts +7 -0
  287. package/src/capabilities/index.ts +10 -12
  288. package/src/capabilities/markdown/index.ts +7 -0
  289. package/src/capabilities/markdown/markdown.ts +82 -0
  290. package/src/capabilities/operation-resolver/index.ts +7 -0
  291. package/src/capabilities/operation-resolver/operation-resolver.ts +399 -0
  292. package/src/capabilities/react-root/index.ts +7 -0
  293. package/src/capabilities/react-root/react-root.tsx +20 -0
  294. package/src/capabilities/react-surface/index.ts +7 -0
  295. package/src/capabilities/react-surface/react-surface.tsx +98 -0
  296. package/src/capabilities/repair/index.ts +7 -0
  297. package/src/capabilities/repair/repair.ts +55 -0
  298. package/src/capabilities/settings/index.ts +7 -0
  299. package/src/capabilities/settings/settings.ts +34 -0
  300. package/src/capabilities/state/index.ts +7 -0
  301. package/src/capabilities/state/state.ts +22 -0
  302. package/src/components/Call/Call.tsx +11 -6
  303. package/src/components/Call/Toolbar.tsx +40 -33
  304. package/src/components/Comments.stories.tsx +55 -53
  305. package/src/components/CommentsContainer.tsx +16 -16
  306. package/src/components/CommentsThreadContainer.tsx +50 -45
  307. package/src/components/Lobby/Lobby.tsx +10 -8
  308. package/src/components/Media/AudioStream.tsx +2 -2
  309. package/src/components/Media/VideoObject.stories.tsx +36 -28
  310. package/src/components/Media/VideoObject.tsx +1 -1
  311. package/src/components/MessageContainer.tsx +98 -33
  312. package/src/components/Participant/Participant.tsx +34 -15
  313. package/src/components/Participant/ParticipantGrid.tsx +2 -1
  314. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +9 -9
  315. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +1 -1
  316. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +45 -43
  317. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +2 -2
  318. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +9 -6
  319. package/src/components/command-extension.ts +7 -4
  320. package/src/components/index.ts +0 -10
  321. package/src/components/testing.ts +26 -6
  322. package/src/containers/CallDebugPanel/CallDebugPanel.tsx +172 -0
  323. package/src/containers/CallDebugPanel/index.ts +7 -0
  324. package/src/containers/CallSidebar/CallSidebar.tsx +17 -0
  325. package/src/containers/CallSidebar/index.ts +7 -0
  326. package/src/containers/ChannelContainer/ChannelContainer.stories.tsx +60 -0
  327. package/src/{components → containers/ChannelContainer}/ChannelContainer.tsx +76 -59
  328. package/src/containers/ChannelContainer/index.ts +7 -0
  329. package/src/containers/ChatContainer/ChatContainer.stories.tsx +88 -0
  330. package/src/{components → containers/ChatContainer}/ChatContainer.tsx +58 -50
  331. package/src/containers/ChatContainer/index.ts +7 -0
  332. package/src/containers/ThreadCompanion/ThreadCompanion.tsx +197 -0
  333. package/src/containers/ThreadCompanion/index.ts +7 -0
  334. package/src/containers/ThreadSettings/ThreadSettings.tsx +22 -0
  335. package/src/containers/ThreadSettings/index.ts +7 -0
  336. package/src/containers/index.ts +12 -0
  337. package/src/extensions/threads.ts +88 -44
  338. package/src/functions/create-proposals.ts +57 -0
  339. package/src/functions/index.ts +9 -0
  340. package/src/hooks/analytics.ts +22 -21
  341. package/src/hooks/index.ts +3 -1
  342. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  343. package/src/hooks/useDebugMode.ts +1 -1
  344. package/src/hooks/useVideoStreamTrack.tsx +6 -3
  345. package/src/index.ts +1 -1
  346. package/src/meta.ts +11 -7
  347. package/src/testing/stories.ts +18 -16
  348. package/src/translations.ts +9 -4
  349. package/src/types/Channel.ts +30 -0
  350. package/src/types/capabilities.ts +34 -0
  351. package/src/types/index.ts +2 -1
  352. package/src/types/types.ts +170 -82
  353. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  354. package/src/typings.d.ts +8 -0
  355. package/src/util.ts +1 -1
  356. package/dist/lib/browser/ChannelContainer-IY2UIRLF.mjs +0 -16
  357. package/dist/lib/browser/ChatContainer-AIGIWAUG.mjs +0 -15
  358. package/dist/lib/browser/app-graph-builder-N7BE5TYW.mjs +0 -171
  359. package/dist/lib/browser/app-graph-builder-N7BE5TYW.mjs.map +0 -7
  360. package/dist/lib/browser/call-manager-NIPDYUVD.mjs +0 -24
  361. package/dist/lib/browser/call-manager-NIPDYUVD.mjs.map +0 -7
  362. package/dist/lib/browser/chunk-4OYAYON2.mjs +0 -21
  363. package/dist/lib/browser/chunk-4OYAYON2.mjs.map +0 -7
  364. package/dist/lib/browser/chunk-6NSMBO3B.mjs.map +0 -7
  365. package/dist/lib/browser/chunk-ERWASUQK.mjs.map +0 -7
  366. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  367. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  368. package/dist/lib/browser/chunk-GCLD5ESP.mjs +0 -137
  369. package/dist/lib/browser/chunk-GCLD5ESP.mjs.map +0 -7
  370. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  371. package/dist/lib/browser/chunk-KWPRNHTK.mjs +0 -984
  372. package/dist/lib/browser/chunk-KWPRNHTK.mjs.map +0 -7
  373. package/dist/lib/browser/chunk-LGSDKXPF.mjs +0 -18
  374. package/dist/lib/browser/chunk-LGSDKXPF.mjs.map +0 -7
  375. package/dist/lib/browser/chunk-VUWC4IJM.mjs +0 -479
  376. package/dist/lib/browser/chunk-VUWC4IJM.mjs.map +0 -7
  377. package/dist/lib/browser/chunk-XLPJXUKO.mjs +0 -367
  378. package/dist/lib/browser/chunk-XLPJXUKO.mjs.map +0 -7
  379. package/dist/lib/browser/chunk-ZE7KWN36.mjs.map +0 -7
  380. package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs +0 -369
  381. package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs.map +0 -7
  382. package/dist/lib/browser/markdown-GEXBVJYN.mjs +0 -169
  383. package/dist/lib/browser/markdown-GEXBVJYN.mjs.map +0 -7
  384. package/dist/lib/browser/react-root-X4UIVGTX.mjs +0 -28
  385. package/dist/lib/browser/react-root-X4UIVGTX.mjs.map +0 -7
  386. package/dist/lib/browser/react-surface-YCYEFBPM.mjs +0 -109
  387. package/dist/lib/browser/react-surface-YCYEFBPM.mjs.map +0 -7
  388. package/dist/lib/browser/settings-E32MTL7A.mjs +0 -22
  389. package/dist/lib/browser/settings-E32MTL7A.mjs.map +0 -7
  390. package/dist/lib/browser/state-H6CYONWE.mjs +0 -34
  391. package/dist/lib/browser/state-H6CYONWE.mjs.map +0 -7
  392. package/dist/lib/node-esm/ChannelContainer-DET6T5N2.mjs +0 -17
  393. package/dist/lib/node-esm/ChatContainer-IQUWU426.mjs +0 -16
  394. package/dist/lib/node-esm/app-graph-builder-VCW76Z6V.mjs +0 -172
  395. package/dist/lib/node-esm/app-graph-builder-VCW76Z6V.mjs.map +0 -7
  396. package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs +0 -25
  397. package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs.map +0 -7
  398. package/dist/lib/node-esm/chunk-25ABSYP2.mjs.map +0 -7
  399. package/dist/lib/node-esm/chunk-2MFNK53T.mjs +0 -480
  400. package/dist/lib/node-esm/chunk-2MFNK53T.mjs.map +0 -7
  401. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  402. package/dist/lib/node-esm/chunk-75RJ5DJI.mjs +0 -19
  403. package/dist/lib/node-esm/chunk-75RJ5DJI.mjs.map +0 -7
  404. package/dist/lib/node-esm/chunk-C3XFMUAY.mjs +0 -985
  405. package/dist/lib/node-esm/chunk-C3XFMUAY.mjs.map +0 -7
  406. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  407. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  408. package/dist/lib/node-esm/chunk-GW37AAM4.mjs +0 -23
  409. package/dist/lib/node-esm/chunk-GW37AAM4.mjs.map +0 -7
  410. package/dist/lib/node-esm/chunk-IHDNQLLR.mjs.map +0 -7
  411. package/dist/lib/node-esm/chunk-J4NSON5Q.mjs +0 -368
  412. package/dist/lib/node-esm/chunk-J4NSON5Q.mjs.map +0 -7
  413. package/dist/lib/node-esm/chunk-OU5BYIDO.mjs.map +0 -7
  414. package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs +0 -138
  415. package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs.map +0 -7
  416. package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs +0 -370
  417. package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs.map +0 -7
  418. package/dist/lib/node-esm/markdown-LIJZDK2J.mjs +0 -170
  419. package/dist/lib/node-esm/markdown-LIJZDK2J.mjs.map +0 -7
  420. package/dist/lib/node-esm/react-root-M7J6PZVW.mjs +0 -29
  421. package/dist/lib/node-esm/react-root-M7J6PZVW.mjs.map +0 -7
  422. package/dist/lib/node-esm/react-surface-IRSEKM42.mjs +0 -110
  423. package/dist/lib/node-esm/react-surface-IRSEKM42.mjs.map +0 -7
  424. package/dist/lib/node-esm/settings-SJ24YG7M.mjs +0 -23
  425. package/dist/lib/node-esm/settings-SJ24YG7M.mjs.map +0 -7
  426. package/dist/lib/node-esm/state-D7WNDT3N.mjs +0 -35
  427. package/dist/lib/node-esm/state-D7WNDT3N.mjs.map +0 -7
  428. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  429. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  430. package/dist/types/src/capabilities/call-manager.d.ts +0 -5
  431. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  432. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  433. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  434. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  435. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  436. package/dist/types/src/capabilities/markdown.d.ts +0 -4
  437. package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
  438. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  439. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  440. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  441. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  442. package/dist/types/src/capabilities/settings.d.ts +0 -4
  443. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  444. package/dist/types/src/capabilities/state.d.ts +0 -7
  445. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  446. package/dist/types/src/components/CallDebugPanel.d.ts +0 -8
  447. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  448. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  449. package/dist/types/src/components/ChannelContainer.d.ts +0 -14
  450. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  451. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -10
  452. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  453. package/dist/types/src/components/Chat.stories.d.ts +0 -7
  454. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  455. package/dist/types/src/components/ChatContainer.d.ts +0 -17
  456. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  457. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  458. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  459. package/dist/types/src/components/ThreadSettings.d.ts +0 -6
  460. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  461. package/dist/types/src/types/schema.d.ts +0 -162
  462. package/dist/types/src/types/schema.d.ts.map +0 -1
  463. package/src/capabilities/app-graph-builder.ts +0 -180
  464. package/src/capabilities/call-manager.ts +0 -19
  465. package/src/capabilities/capabilities.ts +0 -33
  466. package/src/capabilities/intent-resolver.ts +0 -314
  467. package/src/capabilities/markdown.ts +0 -68
  468. package/src/capabilities/react-root.tsx +0 -17
  469. package/src/capabilities/react-surface.tsx +0 -88
  470. package/src/capabilities/settings.ts +0 -19
  471. package/src/capabilities/state.ts +0 -25
  472. package/src/components/CallDebugPanel.tsx +0 -115
  473. package/src/components/CallSidebar.tsx +0 -17
  474. package/src/components/ChannelContainer.stories.tsx +0 -58
  475. package/src/components/Chat.stories.tsx +0 -88
  476. package/src/components/ThreadComplementary.tsx +0 -151
  477. package/src/components/ThreadSettings.tsx +0 -17
  478. package/src/types/schema.ts +0 -33
  479. /package/dist/lib/browser/{ChannelContainer-IY2UIRLF.mjs.map → ChannelContainer-EPYG4QAC.mjs.map} +0 -0
  480. /package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs.map → ChatContainer-2243UD2M.mjs.map} +0 -0
  481. /package/dist/lib/{node-esm/ChannelContainer-DET6T5N2.mjs.map → browser/blueprints/index.mjs.map} +0 -0
  482. /package/dist/lib/{node-esm/ChatContainer-IQUWU426.mjs.map → browser/chunk-J5LGTIGS.mjs.map} +0 -0
@@ -0,0 +1,1124 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ useDebugMode,
4
+ useOnEditAnalytics,
5
+ useStatus
6
+ } from "./chunk-YN2Y7GPW.mjs";
7
+ import {
8
+ getMessageMetadata
9
+ } from "./chunk-ABUFOZVX.mjs";
10
+ import {
11
+ ThreadCapabilities
12
+ } from "./chunk-QYAVWNVM.mjs";
13
+ import {
14
+ meta
15
+ } from "./chunk-GPPP2MZ3.mjs";
16
+
17
+ // src/components/Call/Call.tsx
18
+ import { useAtomValue as useAtomValue3 } from "@effect-atom/atom-react";
19
+ import React9 from "react";
20
+ import { useCapability as useCapability3 } from "@dxos/app-framework/ui";
21
+
22
+ // src/components/Media/AudioStream.tsx
23
+ import React, { useEffect, useRef } from "react";
24
+ var AudioStream = ({ tracks }) => {
25
+ const mediaStreamRef = useRef(new MediaStream());
26
+ const ref = useRef(null);
27
+ useEffect(() => {
28
+ const audio = ref.current;
29
+ if (!audio) {
30
+ return;
31
+ }
32
+ const mediaStream = mediaStreamRef.current;
33
+ audio.srcObject = mediaStream;
34
+ }, []);
35
+ const resetSrcObject = () => {
36
+ const audio = ref.current;
37
+ const mediaStream = mediaStreamRef.current;
38
+ if (!audio || !mediaStream) {
39
+ return;
40
+ }
41
+ audio.addEventListener("canplay", () => audio.play(), {
42
+ once: true
43
+ });
44
+ audio.srcObject = mediaStream;
45
+ };
46
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("audio", {
47
+ ref,
48
+ autoPlay: true
49
+ }), tracks.map((track) => /* @__PURE__ */ React.createElement(AudioTrack, {
50
+ key: track.id,
51
+ track,
52
+ mediaStream: mediaStreamRef.current,
53
+ resetSrcObject
54
+ })));
55
+ };
56
+ var AudioTrack = ({ track, mediaStream, resetSrcObject }) => {
57
+ useEffect(() => {
58
+ const currentTrack = track;
59
+ mediaStream.addTrack(currentTrack);
60
+ resetSrcObject();
61
+ return () => {
62
+ mediaStream.removeTrack(currentTrack);
63
+ resetSrcObject();
64
+ };
65
+ }, [
66
+ track,
67
+ mediaStream
68
+ ]);
69
+ return null;
70
+ };
71
+
72
+ // src/components/Media/VideoObject.tsx
73
+ import React2, { forwardRef, memo, useEffect as useEffect2, useRef as useRef2 } from "react";
74
+ import { mx } from "@dxos/ui-theme";
75
+ var VideoObject = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef(({ videoStream, classNames, flip, contain, ...rest }, ref) => {
76
+ const internalRef = useRef2(null);
77
+ useEffect2(() => {
78
+ const video = internalRef.current;
79
+ if (video && videoStream) {
80
+ video.srcObject = videoStream;
81
+ video.setAttribute("autoplay", "true");
82
+ video.setAttribute("playsinline", "true");
83
+ }
84
+ }, [
85
+ videoStream,
86
+ internalRef.current
87
+ ]);
88
+ return /* @__PURE__ */ React2.createElement("video", {
89
+ className: mx("w-full aspect-video", flip && "scale-x-[-1]", contain ? "object-contain" : "object-cover", classNames),
90
+ ref: (v) => {
91
+ internalRef.current = v;
92
+ if (ref === null) {
93
+ return;
94
+ }
95
+ if (typeof ref === "function") {
96
+ ref(v);
97
+ } else {
98
+ ref.current = v;
99
+ }
100
+ },
101
+ ...rest
102
+ });
103
+ }));
104
+ VideoObject.displayName = "VideoObject";
105
+
106
+ // src/components/Participant/Participant.tsx
107
+ import { useAtomValue } from "@effect-atom/atom-react";
108
+ import React6, { memo as memo2, useMemo as useMemo2 } from "react";
109
+ import { useCapability } from "@dxos/app-framework/ui";
110
+
111
+ // src/components/ResponsiveGrid/ResponsiveContainer.tsx
112
+ import React3 from "react";
113
+ import { mx as mx2 } from "@dxos/ui-theme";
114
+ var ResponsiveContainer = ({ children }) => {
115
+ return (
116
+ // Outer container that takes full size of parent.
117
+ /* @__PURE__ */ React3.createElement("div", {
118
+ role: "none",
119
+ className: "relative flex w-full h-full"
120
+ }, /* @__PURE__ */ React3.createElement("div", {
121
+ role: "none",
122
+ className: "absolute inset-0 flex justify-center items-center"
123
+ }, /* @__PURE__ */ React3.createElement("div", {
124
+ role: "none",
125
+ className: mx2("max-h-full max-w-full w-auto h-auto aspect-video")
126
+ }, children)))
127
+ );
128
+ };
129
+
130
+ // src/components/ResponsiveGrid/ResponsiveGrid.tsx
131
+ import React4, { useCallback, useEffect as useEffect3, useLayoutEffect, useMemo, useState } from "react";
132
+ import { useResizeDetector } from "react-resize-detector";
133
+ import { invariant } from "@dxos/invariant";
134
+ import { mx as mx3 } from "@dxos/ui-theme";
135
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/components/ResponsiveGrid/ResponsiveGrid.tsx";
136
+ var ASPECT_RATIO = 16 / 9;
137
+ var MIN_GALLERY_HEIGHT = 250;
138
+ var DEFAULT_GAP = 8;
139
+ var maxImageSize = "w-[2560px] h-[1440px]";
140
+ var defaultGetId = (item) => item.id;
141
+ var ResponsiveGrid = ({ classNames, Cell, gap = DEFAULT_GAP, getId: getId2 = defaultGetId, items, pinned, autoHideGallery = false, debug, onPinnedChange }) => {
142
+ const { width: containerWidth = 0, height: containerHeight = 0, ref: containerRef } = useResizeDetector({
143
+ refreshRate: 100
144
+ });
145
+ const [dividerHeight, setDividerHeight] = useState(0);
146
+ useEffect3(() => {
147
+ if (containerWidth && containerHeight) {
148
+ const { height: height2 } = fitAspectRatio(containerWidth, containerHeight, ASPECT_RATIO);
149
+ setDividerHeight(Math.min(height2, containerHeight - MIN_GALLERY_HEIGHT));
150
+ }
151
+ }, [
152
+ containerWidth,
153
+ containerHeight
154
+ ]);
155
+ const pinnedItem = useMemo(() => items.find((item) => getId2(item) === pinned), [
156
+ items,
157
+ pinned
158
+ ]);
159
+ const mainItems = useMemo(() => items.filter((item) => getId2(item) !== pinned), [
160
+ items,
161
+ pinned
162
+ ]);
163
+ const hideGallery = autoHideGallery && pinnedItem !== void 0;
164
+ const [{ time, columns, cellWidth }, setLayout] = useState({
165
+ time: 0,
166
+ columns: 0,
167
+ cellWidth: 0
168
+ });
169
+ const { width = 0, height = 0, ref: gridContainerRef } = useResizeDetector({
170
+ refreshRate: 200
171
+ });
172
+ useEffect3(() => {
173
+ if (containerHeight && width && height) {
174
+ const layout = calculateLayout(width, height, mainItems.length, gap);
175
+ setLayout({
176
+ time: Date.now(),
177
+ ...layout
178
+ });
179
+ }
180
+ }, [
181
+ containerHeight,
182
+ width,
183
+ height,
184
+ mainItems.length,
185
+ gap,
186
+ pinned
187
+ ]);
188
+ const [bounds, setBounds] = useState([]);
189
+ useLayoutEffect(() => {
190
+ if (!hideGallery && !gridContainerRef.current || !containerHeight) {
191
+ return;
192
+ }
193
+ const t = setTimeout(() => {
194
+ setBounds(items.filter((item) => !hideGallery || item === pinnedItem).map((item) => {
195
+ invariant(containerRef.current, void 0, {
196
+ F: __dxlog_file,
197
+ L: 117,
198
+ S: void 0,
199
+ A: [
200
+ "containerRef.current",
201
+ ""
202
+ ]
203
+ });
204
+ const el = containerRef.current.querySelector(`[data-grid-item="${getId2(item)}"]`);
205
+ if (!el) {
206
+ return null;
207
+ }
208
+ const bounds2 = getRelativeBounds(containerRef.current, el);
209
+ return [
210
+ item,
211
+ bounds2
212
+ ];
213
+ }).filter((item) => item !== null));
214
+ });
215
+ return () => clearTimeout(t);
216
+ }, [
217
+ containerHeight,
218
+ items,
219
+ pinnedItem,
220
+ hideGallery,
221
+ time
222
+ ]);
223
+ const handleClick = useCallback((item) => onPinnedChange?.(getId2(item) === pinned ? void 0 : getId2(item)), [
224
+ pinned,
225
+ onPinnedChange
226
+ ]);
227
+ return /* @__PURE__ */ React4.createElement("div", {
228
+ ref: containerRef,
229
+ className: mx3("relative w-full h-full", classNames)
230
+ }, /* @__PURE__ */ React4.createElement("div", {
231
+ className: "absolute inset-0 flex flex-col grow gap-2"
232
+ }, pinnedItem && /* @__PURE__ */ React4.createElement("div", {
233
+ className: mx3("flex grow-[2] shrink overflow-hidden justify-center items-center", hideGallery && "h-full"),
234
+ style: hideGallery ? {} : {
235
+ height: dividerHeight
236
+ }
237
+ }, /* @__PURE__ */ React4.createElement(SoloItem, {
238
+ id: getId2(pinnedItem),
239
+ debug
240
+ })), !hideGallery && /* @__PURE__ */ React4.createElement("div", {
241
+ ref: gridContainerRef,
242
+ className: "flex grow-[1] overflow-hidden justify-center items-center",
243
+ style: hideGallery ? {} : {
244
+ minHeight: MIN_GALLERY_HEIGHT
245
+ }
246
+ }, mainItems.length === 1 && /* @__PURE__ */ React4.createElement("div", {
247
+ style: {
248
+ width: cellWidth
249
+ },
250
+ className: "flex h-full"
251
+ }, /* @__PURE__ */ React4.createElement(SoloItem, {
252
+ id: getId2(mainItems[0]),
253
+ debug
254
+ })), mainItems.length > 1 && columns > 0 && /* @__PURE__ */ React4.createElement("div", {
255
+ role: "grid",
256
+ style: {
257
+ display: "grid",
258
+ gridTemplateColumns: `repeat(${columns}, ${cellWidth}px)`,
259
+ gap: `${gap}px`
260
+ }
261
+ }, mainItems.map((item) => /* @__PURE__ */ React4.createElement("div", {
262
+ key: getId2(item),
263
+ "data-grid-item": getId2(item),
264
+ className: mx3("aspect-video max-h-full max-w-full w-auto h-auto", debug && "border border-primary-500")
265
+ }))))), /* @__PURE__ */ React4.createElement("div", {
266
+ className: mx3(debug && "opacity-10")
267
+ }, bounds.map(([item, bounds2]) => /* @__PURE__ */ React4.createElement(Cell, {
268
+ key: getId2(item),
269
+ classNames: "absolute transition-all duration-500",
270
+ item,
271
+ style: bounds2,
272
+ pinned: getId2(item) === pinned,
273
+ onClick: items.length > 1 ? handleClick : void 0
274
+ }))));
275
+ };
276
+ var SoloItem = ({ debug, id }) => {
277
+ return /* @__PURE__ */ React4.createElement(ResponsiveContainer, null, /* @__PURE__ */ React4.createElement("div", {
278
+ "data-grid-item": id,
279
+ className: mx3("aspect-video overflow-hidden", debug && "z-20 border-2 border-primary-500")
280
+ }, /* @__PURE__ */ React4.createElement("img", {
281
+ alt: "placeholder video",
282
+ className: mx3("opacity-0", maxImageSize)
283
+ })));
284
+ };
285
+ var getRelativeBounds = (container, el) => {
286
+ const containerRect = container.getBoundingClientRect();
287
+ const elementRect = el.getBoundingClientRect();
288
+ return {
289
+ top: elementRect.top - containerRect.top,
290
+ left: elementRect.left - containerRect.left,
291
+ width: elementRect.width,
292
+ height: elementRect.height
293
+ };
294
+ };
295
+ var calculateLayout = (containerWidth, containerHeight, count, gap, aspectRatio = ASPECT_RATIO) => {
296
+ if (count === 0) {
297
+ return {
298
+ columns: 1,
299
+ cellWidth: 1
300
+ };
301
+ }
302
+ let minWastedSpace = Infinity;
303
+ let bestColumns = 1;
304
+ let cellWidth = 0;
305
+ for (let rows = 1; rows <= count; rows++) {
306
+ const cols = Math.ceil(count / rows);
307
+ const { width: itemWidth, height: itemHeight } = fitItemsToGrid(containerWidth, containerHeight, cols, rows, aspectRatio, gap);
308
+ const usedWidth = itemWidth * cols + gap * cols - 1;
309
+ const usedHeight = itemHeight * rows + gap * rows - 1;
310
+ const wastedSpace = containerWidth * containerHeight - usedWidth * usedHeight;
311
+ if (wastedSpace < minWastedSpace) {
312
+ minWastedSpace = wastedSpace;
313
+ bestColumns = cols;
314
+ cellWidth = itemWidth;
315
+ }
316
+ }
317
+ return {
318
+ columns: bestColumns,
319
+ cellWidth
320
+ };
321
+ };
322
+ var fitItemsToGrid = (outerWidth, outerHeight, numCols, numRows, aspectRatio, gap) => {
323
+ const availableWidth = outerWidth - gap * (numCols - 1);
324
+ const availableHeight = outerHeight - gap * (numRows - 1);
325
+ const maxCellWidth = availableWidth / numCols;
326
+ const maxCellHeight = availableHeight / numRows;
327
+ return fitAspectRatio(maxCellWidth, maxCellHeight, aspectRatio);
328
+ };
329
+ var fitAspectRatio = (outerWidth, outerHeight, aspectRatio) => {
330
+ if (outerWidth <= 0 || outerHeight <= 0 || aspectRatio <= 0) {
331
+ return {
332
+ width: 0,
333
+ height: 0
334
+ };
335
+ }
336
+ let width = outerWidth;
337
+ let height = width / aspectRatio;
338
+ if (height > outerHeight) {
339
+ height = outerHeight;
340
+ width = height * aspectRatio;
341
+ }
342
+ return {
343
+ width,
344
+ height
345
+ };
346
+ };
347
+
348
+ // src/components/ResponsiveGrid/ResponsiveGridItem.tsx
349
+ import React5, { useEffect as useEffect4, useState as useState2 } from "react";
350
+ import { Icon, IconButton, useTranslation } from "@dxos/react-ui";
351
+ import { Waveform } from "@dxos/react-ui-sfx";
352
+ import { groupHoverControlItemWithTransition, mx as mx4 } from "@dxos/ui-theme";
353
+ var ResponsiveGridItem = ({ children, classNames, item, style, name, self, pinned, screenshare, video, mute, wave, speaking, onClick }) => {
354
+ const { t } = useTranslation(meta.id);
355
+ const iconProps = {
356
+ wave: {
357
+ icon: "ph--hand-waving--duotone",
358
+ label: t("icon wave"),
359
+ classNames: "animate-pulse bg-orange-500"
360
+ },
361
+ mute: {
362
+ icon: "ph--microphone-slash--regular",
363
+ label: t("icon muted")
364
+ }
365
+ };
366
+ const props = wave && !pinned ? iconProps.wave : mute ? iconProps.mute : speaking ? iconProps.speaking : void 0;
367
+ const [speakingIndicator, setSpeakingIndicator] = useState2(speaking);
368
+ useEffect4(() => {
369
+ if (speaking) {
370
+ setSpeakingIndicator(true);
371
+ } else {
372
+ const timeout = setTimeout(() => {
373
+ setSpeakingIndicator(false);
374
+ }, 1e3);
375
+ return () => clearTimeout(timeout);
376
+ }
377
+ }, [
378
+ speaking
379
+ ]);
380
+ return /* @__PURE__ */ React5.createElement("div", {
381
+ className: mx4("relative w-full h-full group", "rounded-md outline outline-2 outline-neutral-900 transition-[outline-color] duration-500", speakingIndicator ? "outline-green-500" : !video && "outline-separator", classNames),
382
+ style
383
+ }, children, onClick && /* @__PURE__ */ React5.createElement("div", {
384
+ className: "z-10 absolute top-1 right-1 flex"
385
+ }, /* @__PURE__ */ React5.createElement(IconButton, {
386
+ classNames: mx4("p-1 min-h-1 rounded-sm", groupHoverControlItemWithTransition),
387
+ iconOnly: true,
388
+ icon: pinned ? "ph--x--regular" : "ph--arrows-out--regular",
389
+ size: pinned ? 5 : 4,
390
+ label: pinned ? t("icon unpin") : t("icon pin"),
391
+ onClick: () => onClick?.(item)
392
+ })), name && /* @__PURE__ */ React5.createElement("div", {
393
+ className: "z-10 absolute bottom-1 left-8 right-1 flex justify-end gap-1 items-center"
394
+ }, screenshare && /* @__PURE__ */ React5.createElement(Icon, {
395
+ icon: "ph--broadcast--regular",
396
+ size: pinned ? 5 : 4
397
+ }), /* @__PURE__ */ React5.createElement("div", {
398
+ className: mx4("bg-neutral-800 text-neutral-100 py-0.5 truncate rounded-sm", pinned ? "px-2" : "px-1 text-xs")
399
+ }, name)), /* @__PURE__ */ React5.createElement("div", {
400
+ className: "z-10 absolute bottom-1 left-1 flex"
401
+ }, speaking && /* @__PURE__ */ React5.createElement(Waveform, {
402
+ active: true,
403
+ size: pinned ? 5 : 4
404
+ }) || props && /* @__PURE__ */ React5.createElement(IconButton, {
405
+ classNames: mx4("p-1 min-h-1 rounded-sm", props?.classNames),
406
+ icon: props?.icon,
407
+ label: props?.label,
408
+ size: pinned ? 5 : 4,
409
+ iconOnly: true
410
+ })));
411
+ };
412
+
413
+ // src/components/Participant/Participant.tsx
414
+ var SCREENSHARE_SUFFIX = "_screenshare";
415
+ var Participant = /* @__PURE__ */ memo2(({ item: user, debug, ...props }) => {
416
+ const call = useCapability(ThreadCapabilities.CallManager);
417
+ const self = useAtomValue(call.selfAtom);
418
+ const media = useAtomValue(call.mediaAtom);
419
+ const isSelf = self.id !== void 0 && user.id !== void 0 && user.id.startsWith(self.id);
420
+ const isScreenshare = user.id?.endsWith(SCREENSHARE_SUFFIX);
421
+ const pulledVideoStream = useMemo2(() => {
422
+ if (isSelf) {
423
+ return void 0;
424
+ }
425
+ const trackName = isScreenshare && user.tracks?.screenshareEnabled ? user.tracks?.screenshare : !isScreenshare && user.tracks?.videoEnabled ? user.tracks?.video : void 0;
426
+ return trackName ? media.pulledVideoStreams[trackName]?.stream : void 0;
427
+ }, [
428
+ isSelf,
429
+ isScreenshare,
430
+ media.pulledVideoStreams,
431
+ user.tracks?.screenshare,
432
+ user.tracks?.video,
433
+ user.tracks?.screenshareEnabled,
434
+ user.tracks?.videoEnabled
435
+ ]);
436
+ const videoStream = useMemo2(() => {
437
+ if (isSelf) {
438
+ return isScreenshare ? media.screenshareVideoStream : media.videoStream;
439
+ }
440
+ return pulledVideoStream;
441
+ }, [
442
+ isSelf,
443
+ isScreenshare,
444
+ media.videoStream,
445
+ media.screenshareVideoStream,
446
+ pulledVideoStream
447
+ ]);
448
+ return /* @__PURE__ */ React6.createElement(ResponsiveGridItem, {
449
+ ...props,
450
+ item: user,
451
+ name: user.name,
452
+ self: isSelf,
453
+ screenshare: !!media.screenshareVideoStream,
454
+ video: media.videoEnabled,
455
+ mute: user ? !user.tracks?.audioEnabled : false,
456
+ wave: user.raisedHand,
457
+ speaking: user.speaking,
458
+ debug
459
+ }, /* @__PURE__ */ React6.createElement(VideoObject, {
460
+ videoStream,
461
+ flip: isSelf && !isScreenshare,
462
+ contain: !!isScreenshare,
463
+ classNames: "rounded-md"
464
+ }));
465
+ });
466
+ Participant.displayName = "Participant";
467
+
468
+ // src/components/Participant/ParticipantGrid.tsx
469
+ import React7, { useEffect as useEffect5, useMemo as useMemo3, useState as useState3 } from "react";
470
+ var getId = (user) => user.id;
471
+ var ParticipantGrid = ({ classNames, self, users, fullscreen, debug }) => {
472
+ const [pinned, setPinned] = useState3();
473
+ const allUsers = useMemo3(() => {
474
+ const allUsers2 = [];
475
+ users.forEach((user) => {
476
+ if (!user.joined) {
477
+ return;
478
+ }
479
+ allUsers2.push({
480
+ ...user,
481
+ isSelf: user.id === self.id
482
+ });
483
+ if (user.tracks?.screenshareEnabled) {
484
+ const screenshare = {
485
+ ...user,
486
+ id: user.id + SCREENSHARE_SUFFIX,
487
+ tracks: {
488
+ ...user.tracks,
489
+ video: user.tracks.screenshare,
490
+ videoEnabled: user.tracks.screenshareEnabled
491
+ }
492
+ };
493
+ allUsers2.push(screenshare);
494
+ }
495
+ });
496
+ return allUsers2;
497
+ }, [
498
+ self,
499
+ users
500
+ ]);
501
+ useEffect5(() => {
502
+ if (pinned) {
503
+ if (!allUsers.find((user) => user.id === pinned)) {
504
+ setPinned(void 0);
505
+ }
506
+ }
507
+ }, [
508
+ pinned,
509
+ allUsers
510
+ ]);
511
+ const sortedUsers = allUsers.sort((a, b) => {
512
+ if (a.isSelf) {
513
+ return 1;
514
+ } else if (b.isSelf) {
515
+ return -1;
516
+ } else if (a.tracks?.screenshareEnabled) {
517
+ return -1;
518
+ } else if (b.tracks?.screenshareEnabled) {
519
+ return 1;
520
+ } else {
521
+ return 0;
522
+ }
523
+ });
524
+ return /* @__PURE__ */ React7.createElement(ResponsiveGrid, {
525
+ classNames,
526
+ Cell: Participant,
527
+ debug,
528
+ getId,
529
+ items: sortedUsers,
530
+ pinned,
531
+ autoHideGallery: fullscreen,
532
+ onPinnedChange: setPinned
533
+ });
534
+ };
535
+
536
+ // src/components/Call/Toolbar.tsx
537
+ import { useAtomValue as useAtomValue2 } from "@effect-atom/atom-react";
538
+ import React8 from "react";
539
+ import { useCapability as useCapability2 } from "@dxos/app-framework/ui";
540
+ import { useAppGraph } from "@dxos/app-toolkit/ui";
541
+ import { Obj } from "@dxos/echo";
542
+ import { Node, useActionRunner } from "@dxos/plugin-graph";
543
+ import { useActions, useNode } from "@dxos/plugin-graph";
544
+ import { Icon as Icon2, IconButton as IconButton2, Toolbar as NaturalToolbar, toLocalizedString, useTranslation as useTranslation2 } from "@dxos/react-ui";
545
+ import { groupHoverControlItemWithTransition as groupHoverControlItemWithTransition2, mx as mx5 } from "@dxos/ui-theme";
546
+ var Toolbar = ({ classNames, channel, participants, autoHideControls = true, onJoin, onLeave }) => {
547
+ const { t } = useTranslation2(meta.id);
548
+ const { graph } = useAppGraph();
549
+ const runAction = useActionRunner();
550
+ const call = useCapability2(ThreadCapabilities.CallManager);
551
+ const media = useAtomValue2(call.mediaAtom);
552
+ const joined = useAtomValue2(call.joinedAtom);
553
+ const raisedHand = useAtomValue2(call.raisedHandAtom);
554
+ const node = useNode(graph, channel && Obj.getDXN(channel).toString());
555
+ const actions = useActions(graph, node?.id).filter((action) => action.properties.disposition === "toolbar");
556
+ const isScreensharing = media.screenshareTrack !== void 0;
557
+ const canSharescreen = typeof navigator.mediaDevices !== "undefined" && navigator.mediaDevices.getDisplayMedia !== void 0;
558
+ return /* @__PURE__ */ React8.createElement("div", {
559
+ className: mx5("z-20 flex justify-center m-8", autoHideControls && groupHoverControlItemWithTransition2)
560
+ }, /* @__PURE__ */ React8.createElement(NaturalToolbar.Root, {
561
+ classNames: [
562
+ "p-2 bg-modal-surface rounded-md shadow-md",
563
+ classNames
564
+ ]
565
+ }, /* @__PURE__ */ React8.createElement(ToggleButton, {
566
+ active: media.audioEnabled,
567
+ state: {
568
+ on: {
569
+ icon: "ph--microphone--regular",
570
+ label: t("mic off"),
571
+ onClick: () => call.turnAudioOff(),
572
+ classNames: "bg-call-active"
573
+ },
574
+ off: {
575
+ icon: "ph--microphone-slash--duotone",
576
+ label: t("mic on"),
577
+ onClick: () => call.turnAudioOn()
578
+ }
579
+ }
580
+ }), /* @__PURE__ */ React8.createElement(ToggleButton, {
581
+ active: media.videoEnabled,
582
+ state: {
583
+ on: {
584
+ icon: "ph--video-camera--regular",
585
+ label: t("camera off"),
586
+ onClick: () => call.turnVideoOff()
587
+ },
588
+ off: {
589
+ icon: "ph--video-camera-slash--duotone",
590
+ label: t("camera on"),
591
+ onClick: () => call.turnVideoOn()
592
+ }
593
+ }
594
+ }), participants !== void 0 && /* @__PURE__ */ React8.createElement("div", {
595
+ className: "flex justify-center items-center gap-2 w-[5rem] text-xs text-subdued"
596
+ }, /* @__PURE__ */ React8.createElement(Icon2, {
597
+ icon: "ph--users--regular",
598
+ size: 4
599
+ }), /* @__PURE__ */ React8.createElement("div", null, participants)) || /* @__PURE__ */ React8.createElement(NaturalToolbar.Separator, {
600
+ variant: "gap"
601
+ }), joined && /* @__PURE__ */ React8.createElement(React8.Fragment, null, /* @__PURE__ */ React8.createElement(ToggleButton, {
602
+ disabled: !canSharescreen,
603
+ active: isScreensharing,
604
+ state: {
605
+ on: {
606
+ icon: "ph--monitor--regular",
607
+ label: t("screenshare off"),
608
+ onClick: () => call.turnScreenshareOff()
609
+ },
610
+ off: {
611
+ icon: "ph--monitor-arrow-up--duotone",
612
+ label: t("screenshare on"),
613
+ onClick: () => call.turnScreenshareOn()
614
+ }
615
+ }
616
+ }), actions.filter((action) => Node.isAction(action)).map((action) => /* @__PURE__ */ React8.createElement(IconButton2, {
617
+ key: action.id,
618
+ ...defaultButtonProps,
619
+ icon: action.properties.icon,
620
+ label: toLocalizedString(action.properties.label, t),
621
+ classNames: action.properties.classNames,
622
+ onClick: () => node && void runAction(action, {
623
+ parent: node
624
+ })
625
+ })), /* @__PURE__ */ React8.createElement(ToggleButton, {
626
+ active: raisedHand,
627
+ state: {
628
+ on: {
629
+ icon: "ph--hand-waving--regular",
630
+ label: t("lower hand"),
631
+ onClick: () => call.setRaisedHand(false)
632
+ },
633
+ off: {
634
+ icon: "ph--hand-palm--duotone",
635
+ label: t("raise hand"),
636
+ onClick: () => call.setRaisedHand(true)
637
+ }
638
+ }
639
+ })), joined ? /* @__PURE__ */ React8.createElement(IconButton2, {
640
+ variant: "destructive",
641
+ icon: "ph--phone-x--regular",
642
+ label: t("leave call"),
643
+ onClick: onLeave
644
+ }) : /* @__PURE__ */ React8.createElement(IconButton2, {
645
+ variant: "primary",
646
+ icon: "ph--phone-incoming--regular",
647
+ label: t("join call"),
648
+ onClick: onJoin
649
+ })));
650
+ };
651
+ Toolbar.displayName = "MeetingToolbar";
652
+ var defaultButtonProps = {
653
+ size: 5,
654
+ iconOnly: true
655
+ };
656
+ var ToggleButton = ({ active, state }) => /* @__PURE__ */ React8.createElement(IconButton2, {
657
+ ...defaultButtonProps,
658
+ classNames: [
659
+ active ? state.on.classNames ?? "bg-call-active" : state.off.classNames
660
+ ],
661
+ icon: active ? state.on.icon : state.off.icon,
662
+ label: active ? state.on.label : state.off.label,
663
+ onClick: active ? state.on.onClick : state.off.onClick
664
+ });
665
+
666
+ // src/components/Call/Call.tsx
667
+ var CallRoot = ({ children }) => {
668
+ return /* @__PURE__ */ React9.createElement("div", {
669
+ className: "relative flex flex-col grow overflow-hidden"
670
+ }, children);
671
+ };
672
+ CallRoot.displayName = "CallRoot";
673
+ var CallAudio = () => {
674
+ const call = useCapability3(ThreadCapabilities.CallManager);
675
+ const audioTracksToPlay = useAtomValue3(call.audioTracksToPlayAtom);
676
+ return /* @__PURE__ */ React9.createElement(AudioStream, {
677
+ tracks: audioTracksToPlay
678
+ });
679
+ };
680
+ CallAudio.displayName = "CallAudio";
681
+ var CallGrid = ({ fullscreen }) => {
682
+ const debug = useDebugMode();
683
+ const call = useCapability3(ThreadCapabilities.CallManager);
684
+ const self = useAtomValue3(call.selfAtom);
685
+ const users = useAtomValue3(call.usersAtom);
686
+ return /* @__PURE__ */ React9.createElement("div", {
687
+ className: "grid grow p-4 dark:bg-neutral-900"
688
+ }, /* @__PURE__ */ React9.createElement(ParticipantGrid, {
689
+ self,
690
+ users,
691
+ debug,
692
+ fullscreen
693
+ }));
694
+ };
695
+ CallGrid.displayName = "CallGrid";
696
+ var CallToolbar = (props) => {
697
+ return /* @__PURE__ */ React9.createElement("div", {
698
+ className: "absolute bottom-0 left-0 right-0 flex justify-center"
699
+ }, /* @__PURE__ */ React9.createElement(Toolbar, {
700
+ isInRoom: true,
701
+ ...props
702
+ }));
703
+ };
704
+ CallToolbar.displayName = "CallToolbar";
705
+ var Call = {
706
+ Root: CallRoot,
707
+ Grid: CallGrid,
708
+ Audio: CallAudio,
709
+ Toolbar: CallToolbar
710
+ };
711
+
712
+ // src/components/CommentsContainer.tsx
713
+ import React12, { useEffect as useEffect7 } from "react";
714
+ import { Obj as Obj3, Relation as Relation2 } from "@dxos/echo";
715
+ import { Icon as Icon3, Message, Trans, useTranslation as useTranslation5 } from "@dxos/react-ui";
716
+
717
+ // src/components/CommentsThreadContainer.tsx
718
+ import React11, { useCallback as useCallback3, useMemo as useMemo4, useRef as useRef4, useState as useState5 } from "react";
719
+ import { Obj as Obj2, Relation } from "@dxos/echo";
720
+ import { useObject as useObject2 } from "@dxos/echo-react";
721
+ import { getSpace, useMembers } from "@dxos/react-client/echo";
722
+ import { useIdentity as useIdentity2 } from "@dxos/react-client/halo";
723
+ import { IconButton as IconButton4, Tag, Tooltip, useThemeContext as useThemeContext2, useTranslation as useTranslation4 } from "@dxos/react-ui";
724
+ import { MessageTextbox, Thread as ThreadComponent } from "@dxos/react-ui-thread";
725
+ import { createBasicExtensions as createBasicExtensions2, createThemeExtensions as createThemeExtensions2, listener } from "@dxos/ui-editor";
726
+ import { hoverableControlItem as hoverableControlItem2, hoverableControls as hoverableControls2, hoverableFocusedWithinControls as hoverableFocusedWithinControls2, mx as mx8 } from "@dxos/ui-theme";
727
+
728
+ // src/components/command-extension.ts
729
+ import { HighlightStyle, StreamLanguage, syntaxHighlighting } from "@codemirror/language";
730
+ import { tags } from "@dxos/ui-editor";
731
+ import { mx as mx6 } from "@dxos/ui-theme";
732
+ var parser = StreamLanguage.define({
733
+ startState: () => ({
734
+ count: 0
735
+ }),
736
+ token: (stream, state) => {
737
+ state.count++;
738
+ if (stream.eatSpace()) {
739
+ return null;
740
+ }
741
+ if (state.count === 1 && stream.match(/^(\/\w+)/)) {
742
+ return "tagName";
743
+ }
744
+ stream.next();
745
+ return null;
746
+ }
747
+ });
748
+ var styles = HighlightStyle.define([
749
+ {
750
+ tag: tags.tagName,
751
+ class: mx6("dx-tag dx-tag--indigo text-base-surface-text font-medium")
752
+ }
753
+ ]);
754
+ var command = [
755
+ parser,
756
+ syntaxHighlighting(styles)
757
+ ];
758
+
759
+ // src/components/MessageContainer.tsx
760
+ import { EditorView } from "@codemirror/view";
761
+ import React10, { forwardRef as forwardRef2, useCallback as useCallback2, useEffect as useEffect6, useRef as useRef3, useState as useState4 } from "react";
762
+ import { Surface } from "@dxos/app-framework/ui";
763
+ import { Ref } from "@dxos/echo";
764
+ import { useObject } from "@dxos/echo-react";
765
+ import { PublicKey } from "@dxos/react-client";
766
+ import { useIdentity } from "@dxos/react-client/halo";
767
+ import { IconButton as IconButton3, useOnTransition, useThemeContext, useTranslation as useTranslation3 } from "@dxos/react-ui";
768
+ import { Card } from "@dxos/react-ui";
769
+ import { useTextEditor } from "@dxos/react-ui-editor";
770
+ import { MessageHeading, MessageRoot } from "@dxos/react-ui-thread";
771
+ import { createBasicExtensions, createThemeExtensions } from "@dxos/ui-editor";
772
+ import { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx as mx7 } from "@dxos/ui-theme";
773
+ var buttonGroupClassNames = "flex flex-row items-center gap-0.5 pe-2";
774
+ var buttonClassNames = "p-1! transition-opacity";
775
+ var MessageContainer = ({ message: messageOrRef, members, editable = false, onDelete, onAcceptProposal }) => {
776
+ const { t } = useTranslation3(meta.id);
777
+ const [message, updateMessage] = useObject(messageOrRef);
778
+ const identity = useIdentity();
779
+ const [editing, setEditing] = useState4(false);
780
+ const textBlockIndex = message?.blocks.findIndex((block) => block._tag === "text") ?? -1;
781
+ const handleEdit = useCallback2(() => setEditing((editing2) => !editing2), []);
782
+ const handleDelete = useCallback2(() => message && onDelete?.(message.id), [
783
+ message,
784
+ onDelete
785
+ ]);
786
+ const handleAcceptProposal = useCallback2(() => message && onAcceptProposal?.(message.id), [
787
+ message,
788
+ onAcceptProposal
789
+ ]);
790
+ const handleTextBlockChange = useCallback2((newText) => {
791
+ updateMessage((m) => {
792
+ const targetBlock = m.blocks[textBlockIndex];
793
+ if (targetBlock && targetBlock._tag === "text") {
794
+ targetBlock.text = newText;
795
+ }
796
+ });
797
+ }, [
798
+ updateMessage,
799
+ textBlockIndex
800
+ ]);
801
+ const textBlock = message && textBlockIndex !== -1 ? message.blocks[textBlockIndex] : void 0;
802
+ useOnEditAnalytics(message, textBlock, !!editing);
803
+ if (!message) {
804
+ return null;
805
+ }
806
+ const senderIdentity = members.find((member) => message.sender.identityDid && member.identity.did === message.sender.identityDid || message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey))?.identity;
807
+ const messageMetadata = getMessageMetadata(message.id, senderIdentity);
808
+ const userIsAuthor = identity?.did === messageMetadata.authorId;
809
+ const proposalBlock = message.blocks.find((block) => block._tag === "proposal");
810
+ const references = message.blocks.filter((block) => block._tag === "reference").map((block) => block.reference);
811
+ return /* @__PURE__ */ React10.createElement(MessageRoot, {
812
+ ...messageMetadata,
813
+ classNames: [
814
+ hoverableControls,
815
+ hoverableFocusedWithinControls
816
+ ]
817
+ }, /* @__PURE__ */ React10.createElement(MessageHeading, {
818
+ authorName: messageMetadata.authorName,
819
+ timestamp: messageMetadata.timestamp
820
+ }, /* @__PURE__ */ React10.createElement("div", {
821
+ role: "none",
822
+ className: buttonGroupClassNames
823
+ }, userIsAuthor && editable && /* @__PURE__ */ React10.createElement(IconButton3, {
824
+ "data-testid": editing ? "thread.message.save" : "thread.message.edit",
825
+ variant: "ghost",
826
+ icon: editing ? "ph--check--regular" : "ph--pencil-simple--regular",
827
+ iconOnly: true,
828
+ label: t(editing ? "save message label" : "edit message label"),
829
+ classNames: [
830
+ buttonClassNames,
831
+ hoverableControlItem
832
+ ],
833
+ onClick: handleEdit
834
+ }), proposalBlock && onAcceptProposal && /* @__PURE__ */ React10.createElement(IconButton3, {
835
+ "data-testid": "thread.message.accept",
836
+ variant: "ghost",
837
+ icon: "ph--check--regular",
838
+ iconOnly: true,
839
+ label: t("accept proposal label"),
840
+ classNames: [
841
+ buttonClassNames,
842
+ hoverableControlItem
843
+ ],
844
+ onClick: handleAcceptProposal
845
+ }), onDelete && /* @__PURE__ */ React10.createElement(IconButton3, {
846
+ "data-testid": "thread.message.delete",
847
+ variant: "ghost",
848
+ icon: "ph--x--regular",
849
+ iconOnly: true,
850
+ label: t("delete message label"),
851
+ classNames: [
852
+ buttonClassNames,
853
+ hoverableControlItem
854
+ ],
855
+ onClick: handleDelete
856
+ }))), textBlock && /* @__PURE__ */ React10.createElement(TextboxBlock, {
857
+ block: textBlock,
858
+ isAuthor: userIsAuthor,
859
+ editing,
860
+ onSave: handleTextBlockChange
861
+ }), proposalBlock && /* @__PURE__ */ React10.createElement(ProposalBlock, {
862
+ block: proposalBlock
863
+ }), Ref.Array.targets(references).map((reference, index) => /* @__PURE__ */ React10.createElement(MessagePart, {
864
+ key: index,
865
+ part: reference
866
+ })));
867
+ };
868
+ var MessagePart = ({ part }) => {
869
+ return /* @__PURE__ */ React10.createElement(MessageBlockObjectTile, {
870
+ subject: part
871
+ });
872
+ };
873
+ var TextboxBlock = ({ block, isAuthor, editing, onSave }) => {
874
+ const { themeMode } = useThemeContext();
875
+ const inMemoryContentRef = useRef3(block.text);
876
+ const handleDocumentChange = useCallback2((newState) => {
877
+ inMemoryContentRef.current = newState;
878
+ }, []);
879
+ const saveDocumentChange = useCallback2(() => {
880
+ onSave?.(inMemoryContentRef.current);
881
+ }, [
882
+ onSave
883
+ ]);
884
+ useOnTransition(editing, true, false, saveDocumentChange);
885
+ const { parentRef, focusAttributes, view } = useTextEditor(() => ({
886
+ initialValue: block.text,
887
+ extensions: [
888
+ createBasicExtensions({
889
+ readOnly: !isAuthor || !editing
890
+ }),
891
+ createThemeExtensions({
892
+ themeMode
893
+ }),
894
+ command,
895
+ EditorView.updateListener.of((update) => {
896
+ if (update.docChanged) {
897
+ handleDocumentChange(update.state.doc.toString());
898
+ }
899
+ })
900
+ ]
901
+ }), [
902
+ block.text,
903
+ editing,
904
+ isAuthor,
905
+ themeMode,
906
+ handleDocumentChange
907
+ ]);
908
+ useEffect6(() => {
909
+ editing && view?.focus();
910
+ }, [
911
+ editing,
912
+ view
913
+ ]);
914
+ return /* @__PURE__ */ React10.createElement("div", {
915
+ role: "none",
916
+ ref: parentRef,
917
+ className: "me-4",
918
+ ...focusAttributes
919
+ });
920
+ };
921
+ var ProposalBlock = ({ block }) => {
922
+ return /* @__PURE__ */ React10.createElement("div", {
923
+ role: "none",
924
+ className: "me-4 italic"
925
+ }, block.text);
926
+ };
927
+ var MessageBlockObjectTile = /* @__PURE__ */ forwardRef2(({ subject }, forwardedRef) => {
928
+ let title = subject.name ?? subject.title ?? subject.type ?? "Object";
929
+ if (typeof title !== "string") {
930
+ title = title?.content ?? "";
931
+ }
932
+ return /* @__PURE__ */ React10.createElement(Card.Root, {
933
+ className: mx7("grid col-span-3 py-1 pr-4", hoverableControls, hoverableFocusedWithinControls),
934
+ ref: forwardedRef
935
+ }, /* @__PURE__ */ React10.createElement(Surface.Surface, {
936
+ role: "card--content",
937
+ limit: 1,
938
+ data: {
939
+ subject
940
+ },
941
+ fallback: title
942
+ }));
943
+ });
944
+
945
+ // src/components/CommentsThreadContainer.tsx
946
+ var CommentsThreadContainer = ({ anchor, current, onAttend, onComment, onResolve, onMessageDelete, onThreadDelete, onAcceptProposal }) => {
947
+ const { themeMode } = useThemeContext2();
948
+ const { t } = useTranslation4(meta.id);
949
+ const identity = useIdentity2();
950
+ const space = getSpace(anchor);
951
+ const members = useMembers(space?.id);
952
+ const detached = !anchor.anchor;
953
+ const thread = Relation.getSource(anchor);
954
+ const [messages] = useObject2(thread, "messages");
955
+ const activity = useStatus(space, Obj2.getDXN(thread).toString());
956
+ const threadScrollRef = useRef4(null);
957
+ const textboxMetadata = getMessageMetadata(Obj2.getDXN(thread).toString(), identity);
958
+ const [state, setState] = useState5({});
959
+ const messageRef = useRef4("");
960
+ const extensions = useMemo4(() => [
961
+ createBasicExtensions2({
962
+ placeholder: t("message placeholder")
963
+ }),
964
+ createThemeExtensions2({
965
+ themeMode
966
+ }),
967
+ listener({
968
+ onChange: ({ text }) => messageRef.current = text
969
+ }),
970
+ command
971
+ ], [
972
+ state
973
+ ]);
974
+ const scrollToEnd = (behavior) => setTimeout(() => threadScrollRef.current?.scrollIntoView({
975
+ behavior,
976
+ block: "end"
977
+ }), 10);
978
+ const handleAttend = useCallback3(() => onAttend?.(anchor), [
979
+ onAttend,
980
+ anchor
981
+ ]);
982
+ const handleResolve = useCallback3(() => onResolve?.(anchor), [
983
+ onResolve,
984
+ anchor
985
+ ]);
986
+ const handleMessageDelete = useCallback3((id) => onMessageDelete?.(anchor, id), [
987
+ onMessageDelete,
988
+ anchor
989
+ ]);
990
+ const handleThreadDelete = useCallback3(() => onThreadDelete?.(anchor), [
991
+ onThreadDelete,
992
+ anchor
993
+ ]);
994
+ const handleAcceptProposal = useCallback3((id) => onAcceptProposal?.(anchor, id), [
995
+ onAcceptProposal,
996
+ anchor
997
+ ]);
998
+ const handleComment = useCallback3(() => {
999
+ if (!messageRef.current) {
1000
+ return false;
1001
+ }
1002
+ onComment?.(anchor, messageRef.current);
1003
+ messageRef.current = "";
1004
+ scrollToEnd("instant");
1005
+ setState({});
1006
+ return true;
1007
+ }, [
1008
+ anchor,
1009
+ identity
1010
+ ]);
1011
+ return /* @__PURE__ */ React11.createElement(ThreadComponent.Root, {
1012
+ id: Obj2.getDXN(thread).toString(),
1013
+ classNames: "pt-2 border-b border-subdued-separator last:border-none",
1014
+ current,
1015
+ onClickCapture: handleAttend,
1016
+ onFocusCapture: handleAttend
1017
+ }, /* @__PURE__ */ React11.createElement("div", {
1018
+ role: "none",
1019
+ className: mx8("col-span-2 grid grid-cols-[var(--dx-rail-size)_1fr_min-content]", hoverableControls2, hoverableFocusedWithinControls2)
1020
+ }, detached ? /* @__PURE__ */ React11.createElement(Tooltip.Trigger, {
1021
+ asChild: true,
1022
+ content: t("detached thread label"),
1023
+ side: "top"
1024
+ }, /* @__PURE__ */ React11.createElement(ThreadComponent.Header, {
1025
+ detached: true
1026
+ }, thread.name)) : /* @__PURE__ */ React11.createElement(ThreadComponent.Header, null, thread.name), /* @__PURE__ */ React11.createElement("div", {
1027
+ role: "none",
1028
+ className: buttonGroupClassNames
1029
+ }, thread.status === "staged" && /* @__PURE__ */ React11.createElement(Tag, {
1030
+ palette: "neutral"
1031
+ }, t("draft button")), onResolve && !(thread?.status === "staged") && /* @__PURE__ */ React11.createElement(IconButton4, {
1032
+ "data-testid": "thread.resolve",
1033
+ variant: "ghost",
1034
+ icon: thread?.status === "resolved" ? "ph--check--fill" : "ph--check--regular",
1035
+ iconOnly: true,
1036
+ label: t("resolve thread label"),
1037
+ classNames: [
1038
+ buttonClassNames,
1039
+ thread?.status !== "resolved" && hoverableControlItem2
1040
+ ],
1041
+ onClick: handleResolve
1042
+ }), onThreadDelete && /* @__PURE__ */ React11.createElement(IconButton4, {
1043
+ "data-testid": "thread.delete",
1044
+ variant: "ghost",
1045
+ icon: "ph--x--regular",
1046
+ iconOnly: true,
1047
+ label: t("delete thread label"),
1048
+ classNames: [
1049
+ buttonClassNames,
1050
+ hoverableControlItem2
1051
+ ],
1052
+ onClick: handleThreadDelete
1053
+ }))), messages?.map((ref) => /* @__PURE__ */ React11.createElement(MessageContainer, {
1054
+ key: ref.dxn.toString(),
1055
+ editable: true,
1056
+ message: ref,
1057
+ members,
1058
+ onDelete: handleMessageDelete,
1059
+ onAcceptProposal: handleAcceptProposal
1060
+ })), /* @__PURE__ */ React11.createElement(MessageTextbox, {
1061
+ extensions,
1062
+ onSend: handleComment,
1063
+ ...textboxMetadata
1064
+ }), /* @__PURE__ */ React11.createElement(ThreadComponent.Status, {
1065
+ activity
1066
+ }, t("activity message")), /* @__PURE__ */ React11.createElement("div", {
1067
+ role: "none",
1068
+ className: "h-px -mt-px",
1069
+ ref: threadScrollRef
1070
+ }));
1071
+ };
1072
+
1073
+ // src/components/CommentsContainer.tsx
1074
+ var CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props }) => {
1075
+ const { t } = useTranslation5(meta.id);
1076
+ const filteredAnchors = showResolvedThreads ? anchors.filter((anchor) => !!Relation2.getSource(anchor)) : anchors.filter((anchor) => {
1077
+ const thread = Relation2.getSource(anchor);
1078
+ return thread && thread.status !== "resolved";
1079
+ });
1080
+ useEffect7(() => {
1081
+ if (currentId) {
1082
+ document.getElementById(currentId)?.scrollIntoView({
1083
+ behavior: "smooth",
1084
+ block: "end"
1085
+ });
1086
+ }
1087
+ }, [
1088
+ currentId
1089
+ ]);
1090
+ if (filteredAnchors.length === 0) {
1091
+ return /* @__PURE__ */ React12.createElement("div", {
1092
+ role: "none",
1093
+ className: "p-form-padding"
1094
+ }, /* @__PURE__ */ React12.createElement(Message.Root, null, /* @__PURE__ */ React12.createElement(Message.Title, null, /* @__PURE__ */ React12.createElement(Trans, {
1095
+ t,
1096
+ i18nKey: "no comments message",
1097
+ components: {
1098
+ commentIcon: /* @__PURE__ */ React12.createElement(Icon3, {
1099
+ icon: "ph--chat-text--regular",
1100
+ size: 4,
1101
+ classNames: "w-block"
1102
+ })
1103
+ }
1104
+ }))));
1105
+ }
1106
+ return /* @__PURE__ */ React12.createElement("div", null, filteredAnchors.map((anchor) => {
1107
+ const thread = Relation2.getSource(anchor);
1108
+ const threadId = Obj3.getDXN(thread).toString();
1109
+ return /* @__PURE__ */ React12.createElement(CommentsThreadContainer, {
1110
+ key: threadId,
1111
+ anchor,
1112
+ current: currentId === threadId,
1113
+ ...props
1114
+ });
1115
+ }));
1116
+ };
1117
+
1118
+ export {
1119
+ Call,
1120
+ command,
1121
+ MessageContainer,
1122
+ CommentsContainer
1123
+ };
1124
+ //# sourceMappingURL=chunk-IQUV7DR6.mjs.map