@dxos/plugin-thread 0.8.4-main.69d29f4 → 0.8.4-main.6fa680abb7

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