@dxos/plugin-thread 0.8.4-main.406dc2a → 0.8.4-main.4a85c3132b

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