@dxos/plugin-thread 0.8.4-main.bc674ce → 0.8.4-main.c351d160a8

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