@memberjunction/ng-conversations 5.42.0 → 5.44.0

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 (351) hide show
  1. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +0 -1
  2. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
  3. package/dist/lib/components/active-tasks/active-tasks-panel.component.js +56 -52
  4. package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
  5. package/dist/lib/components/artifact/artifact-share-modal.component.js +37 -41
  6. package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
  7. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  8. package/dist/lib/components/collection/collection-form-modal.component.js +10 -14
  9. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  10. package/dist/lib/components/collection/collection-share-modal.component.js +41 -45
  11. package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
  12. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  13. package/dist/lib/components/collection/collection-view.component.js +22 -36
  14. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  15. package/dist/lib/components/collection/collections-full-view.component.d.ts +4 -0
  16. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  17. package/dist/lib/components/collection/collections-full-view.component.js +134 -166
  18. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  19. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +73 -8
  20. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  21. package/dist/lib/components/conversation/conversation-chat-area.component.js +487 -123
  22. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  23. package/dist/lib/components/conversation/pinned-messages-panel.component.js +6 -9
  24. package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
  25. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
  26. package/dist/lib/components/library/library-full-view.component.js +20 -24
  27. package/dist/lib/components/library/library-full-view.component.js.map +1 -1
  28. package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
  29. package/dist/lib/components/members/members-modal.component.js +10 -11
  30. package/dist/lib/components/members/members-modal.component.js.map +1 -1
  31. package/dist/lib/components/mention/mention-dropdown.component.js +65 -26
  32. package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
  33. package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
  34. package/dist/lib/components/mention/mention-editor.component.js +31 -10
  35. package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
  36. package/dist/lib/components/message/message-input-box.component.d.ts +11 -16
  37. package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
  38. package/dist/lib/components/message/message-input-box.component.js +52 -46
  39. package/dist/lib/components/message/message-input-box.component.js.map +1 -1
  40. package/dist/lib/components/message/message-input.component.d.ts +83 -18
  41. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  42. package/dist/lib/components/message/message-input.component.js +238 -151
  43. package/dist/lib/components/message/message-input.component.js.map +1 -1
  44. package/dist/lib/components/message/message-item.component.d.ts +15 -1
  45. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  46. package/dist/lib/components/message/message-item.component.js +90 -15
  47. package/dist/lib/components/message/message-item.component.js.map +1 -1
  48. package/dist/lib/components/message/message-list.component.js +6 -9
  49. package/dist/lib/components/message/message-list.component.js.map +1 -1
  50. package/dist/lib/components/overlay/chat-overlay.component.d.ts +3 -0
  51. package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
  52. package/dist/lib/components/overlay/chat-overlay.component.js +9 -4
  53. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  54. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +45 -0
  55. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +1 -1
  56. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +10 -0
  57. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +1 -1
  58. package/dist/lib/components/realtime/channels/client-context-channel.d.ts +46 -0
  59. package/dist/lib/components/realtime/channels/client-context-channel.d.ts.map +1 -0
  60. package/dist/lib/components/realtime/channels/client-context-channel.js +174 -0
  61. package/dist/lib/components/realtime/channels/client-context-channel.js.map +1 -0
  62. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.d.ts +123 -0
  63. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.d.ts.map +1 -0
  64. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.js +397 -0
  65. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.js.map +1 -0
  66. package/dist/lib/components/realtime/media/media-channel-state.d.ts +103 -0
  67. package/dist/lib/components/realtime/media/media-channel-state.d.ts.map +1 -0
  68. package/dist/lib/components/realtime/media/media-channel-state.js +143 -0
  69. package/dist/lib/components/realtime/media/media-channel-state.js.map +1 -0
  70. package/dist/lib/components/realtime/media/media-channel-tools.d.ts +24 -0
  71. package/dist/lib/components/realtime/media/media-channel-tools.d.ts.map +1 -0
  72. package/dist/lib/components/realtime/media/media-channel-tools.js +107 -0
  73. package/dist/lib/components/realtime/media/media-channel-tools.js.map +1 -0
  74. package/dist/lib/components/realtime/media/media-channel.d.ts +89 -0
  75. package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -0
  76. package/dist/lib/components/realtime/media/media-channel.js +253 -0
  77. package/dist/lib/components/realtime/media/media-channel.js.map +1 -0
  78. package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts +141 -0
  79. package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts.map +1 -0
  80. package/dist/lib/components/realtime/media/realtime-media-surface.component.js +574 -0
  81. package/dist/lib/components/realtime/media/realtime-media-surface.component.js.map +1 -0
  82. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +59 -14
  83. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -1
  84. package/dist/lib/components/realtime/realtime-activity-rail.component.js +277 -74
  85. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
  86. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +28 -27
  87. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
  88. package/dist/lib/components/realtime/realtime-agent-banner.component.js +144 -143
  89. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
  90. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +12 -0
  91. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -1
  92. package/dist/lib/components/realtime/realtime-agent-picker.component.js +105 -43
  93. package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -1
  94. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +2 -2
  95. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -1
  96. package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -1
  97. package/dist/lib/components/realtime/realtime-composer.component.d.ts +41 -7
  98. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
  99. package/dist/lib/components/realtime/realtime-composer.component.js +216 -102
  100. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
  101. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +0 -2
  102. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -1
  103. package/dist/lib/components/realtime/realtime-delegation-card.component.js +67 -71
  104. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
  105. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +364 -44
  106. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
  107. package/dist/lib/components/realtime/realtime-session-overlay.component.js +839 -153
  108. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  109. package/dist/lib/components/realtime/realtime-session-state.d.ts +5 -5
  110. package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -1
  111. package/dist/lib/components/realtime/realtime-session-state.js.map +1 -1
  112. package/dist/lib/components/realtime/realtime-surface-tab-style.d.ts +70 -0
  113. package/dist/lib/components/realtime/realtime-surface-tab-style.d.ts.map +1 -0
  114. package/dist/lib/components/realtime/realtime-surface-tab-style.js +115 -0
  115. package/dist/lib/components/realtime/realtime-surface-tab-style.js.map +1 -0
  116. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +55 -57
  117. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -1
  118. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +165 -143
  119. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
  120. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +80 -71
  121. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -1
  122. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +83 -113
  123. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
  124. package/dist/lib/components/realtime/realtime-ui-config.d.ts +270 -0
  125. package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -0
  126. package/dist/lib/components/realtime/realtime-ui-config.js +212 -0
  127. package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -0
  128. package/dist/lib/components/search/search-panel.component.d.ts +2 -0
  129. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
  130. package/dist/lib/components/search/search-panel.component.js +92 -101
  131. package/dist/lib/components/search/search-panel.component.js.map +1 -1
  132. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
  133. package/dist/lib/components/share/share-modal.component.js +10 -11
  134. package/dist/lib/components/share/share-modal.component.js.map +1 -1
  135. package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
  136. package/dist/lib/components/shared/user-picker.component.js +12 -15
  137. package/dist/lib/components/shared/user-picker.component.js.map +1 -1
  138. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +5 -0
  139. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  140. package/dist/lib/components/workspace/conversation-workspace.component.js +18 -7
  141. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  142. package/dist/lib/conversations.module.d.ts +29 -26
  143. package/dist/lib/conversations.module.d.ts.map +1 -1
  144. package/dist/lib/conversations.module.js +37 -6
  145. package/dist/lib/conversations.module.js.map +1 -1
  146. package/dist/lib/models/conversation-state.model.d.ts +6 -3
  147. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  148. package/dist/lib/models/conversation-state.model.js.map +1 -1
  149. package/dist/lib/services/conversation-agent.service.d.ts +2 -2
  150. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  151. package/dist/lib/services/conversation-agent.service.js +6 -2
  152. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  153. package/dist/lib/services/mention-autocomplete.service.d.ts +41 -5
  154. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  155. package/dist/lib/services/mention-autocomplete.service.js +143 -19
  156. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  157. package/dist/lib/services/realtime-audio-recorder.d.ts +143 -0
  158. package/dist/lib/services/realtime-audio-recorder.d.ts.map +1 -0
  159. package/dist/lib/services/realtime-audio-recorder.js +379 -0
  160. package/dist/lib/services/realtime-audio-recorder.js.map +1 -0
  161. package/dist/lib/services/realtime-pcm-wav.d.ts +75 -0
  162. package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -0
  163. package/dist/lib/services/realtime-pcm-wav.js +205 -0
  164. package/dist/lib/services/realtime-pcm-wav.js.map +1 -0
  165. package/dist/lib/services/realtime-session-review.service.d.ts +28 -1
  166. package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -1
  167. package/dist/lib/services/realtime-session-review.service.js +12 -3
  168. package/dist/lib/services/realtime-session-review.service.js.map +1 -1
  169. package/dist/lib/services/realtime-session.service.d.ts +210 -20
  170. package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
  171. package/dist/lib/services/realtime-session.service.js +452 -21
  172. package/dist/lib/services/realtime-session.service.js.map +1 -1
  173. package/dist/lib/services/realtime-sessions-adapter.js +1 -1
  174. package/dist/lib/services/realtime-sessions-adapter.js.map +1 -1
  175. package/dist/lib/services/ui-command-handler.service.d.ts +7 -2
  176. package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
  177. package/dist/lib/services/ui-command-handler.service.js +6 -2
  178. package/dist/lib/services/ui-command-handler.service.js.map +1 -1
  179. package/dist/lib/utils/plan-mode-preference.d.ts +62 -0
  180. package/dist/lib/utils/plan-mode-preference.d.ts.map +1 -0
  181. package/dist/lib/utils/plan-mode-preference.js +130 -0
  182. package/dist/lib/utils/plan-mode-preference.js.map +1 -0
  183. package/dist/public-api.d.ts +6 -0
  184. package/dist/public-api.d.ts.map +1 -1
  185. package/dist/public-api.js +8 -0
  186. package/dist/public-api.js.map +1 -1
  187. package/package.json +28 -26
  188. package/dist/__tests__/attachment-badge.test.d.ts +0 -2
  189. package/dist/__tests__/attachment-badge.test.d.ts.map +0 -1
  190. package/dist/__tests__/attachment-badge.test.js +0 -66
  191. package/dist/__tests__/attachment-badge.test.js.map +0 -1
  192. package/dist/__tests__/channel-optional-surface.test.d.ts +0 -2
  193. package/dist/__tests__/channel-optional-surface.test.d.ts.map +0 -1
  194. package/dist/__tests__/channel-optional-surface.test.js +0 -53
  195. package/dist/__tests__/channel-optional-surface.test.js.map +0 -1
  196. package/dist/__tests__/chat-events.test.d.ts +0 -14
  197. package/dist/__tests__/chat-events.test.d.ts.map +0 -1
  198. package/dist/__tests__/chat-events.test.js +0 -109
  199. package/dist/__tests__/chat-events.test.js.map +0 -1
  200. package/dist/__tests__/collections-full-view.test.d.ts +0 -2
  201. package/dist/__tests__/collections-full-view.test.d.ts.map +0 -1
  202. package/dist/__tests__/collections-full-view.test.js +0 -225
  203. package/dist/__tests__/collections-full-view.test.js.map +0 -1
  204. package/dist/__tests__/conversation-cache.test.d.ts +0 -2
  205. package/dist/__tests__/conversation-cache.test.d.ts.map +0 -1
  206. package/dist/__tests__/conversation-cache.test.js +0 -233
  207. package/dist/__tests__/conversation-cache.test.js.map +0 -1
  208. package/dist/__tests__/conversation-naming.test.d.ts +0 -2
  209. package/dist/__tests__/conversation-naming.test.d.ts.map +0 -1
  210. package/dist/__tests__/conversation-naming.test.js +0 -110
  211. package/dist/__tests__/conversation-naming.test.js.map +0 -1
  212. package/dist/__tests__/delegation-result-parser.test.d.ts +0 -2
  213. package/dist/__tests__/delegation-result-parser.test.d.ts.map +0 -1
  214. package/dist/__tests__/delegation-result-parser.test.js +0 -107
  215. package/dist/__tests__/delegation-result-parser.test.js.map +0 -1
  216. package/dist/__tests__/distinct-artifacts.test.d.ts +0 -2
  217. package/dist/__tests__/distinct-artifacts.test.d.ts.map +0 -1
  218. package/dist/__tests__/distinct-artifacts.test.js +0 -56
  219. package/dist/__tests__/distinct-artifacts.test.js.map +0 -1
  220. package/dist/__tests__/event-wiring.test.d.ts +0 -15
  221. package/dist/__tests__/event-wiring.test.d.ts.map +0 -1
  222. package/dist/__tests__/event-wiring.test.js +0 -100
  223. package/dist/__tests__/event-wiring.test.js.map +0 -1
  224. package/dist/__tests__/index.test.d.ts +0 -2
  225. package/dist/__tests__/index.test.d.ts.map +0 -1
  226. package/dist/__tests__/index.test.js +0 -7
  227. package/dist/__tests__/index.test.js.map +0 -1
  228. package/dist/__tests__/narration-template.test.d.ts +0 -2
  229. package/dist/__tests__/narration-template.test.d.ts.map +0 -1
  230. package/dist/__tests__/narration-template.test.js +0 -76
  231. package/dist/__tests__/narration-template.test.js.map +0 -1
  232. package/dist/__tests__/notification-model.test.d.ts +0 -2
  233. package/dist/__tests__/notification-model.test.d.ts.map +0 -1
  234. package/dist/__tests__/notification-model.test.js +0 -68
  235. package/dist/__tests__/notification-model.test.js.map +0 -1
  236. package/dist/__tests__/realtime-agent-picker-models.test.d.ts +0 -2
  237. package/dist/__tests__/realtime-agent-picker-models.test.d.ts.map +0 -1
  238. package/dist/__tests__/realtime-agent-picker-models.test.js +0 -49
  239. package/dist/__tests__/realtime-agent-picker-models.test.js.map +0 -1
  240. package/dist/__tests__/realtime-audio-visuals.test.d.ts +0 -2
  241. package/dist/__tests__/realtime-audio-visuals.test.d.ts.map +0 -1
  242. package/dist/__tests__/realtime-audio-visuals.test.js +0 -123
  243. package/dist/__tests__/realtime-audio-visuals.test.js.map +0 -1
  244. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts +0 -2
  245. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts.map +0 -1
  246. package/dist/__tests__/realtime-delegation-card-cancel.test.js +0 -48
  247. package/dist/__tests__/realtime-delegation-card-cancel.test.js.map +0 -1
  248. package/dist/__tests__/realtime-disclosure.test.d.ts +0 -2
  249. package/dist/__tests__/realtime-disclosure.test.d.ts.map +0 -1
  250. package/dist/__tests__/realtime-disclosure.test.js +0 -164
  251. package/dist/__tests__/realtime-disclosure.test.js.map +0 -1
  252. package/dist/__tests__/realtime-pairing.test.d.ts +0 -2
  253. package/dist/__tests__/realtime-pairing.test.d.ts.map +0 -1
  254. package/dist/__tests__/realtime-pairing.test.js +0 -207
  255. package/dist/__tests__/realtime-pairing.test.js.map +0 -1
  256. package/dist/__tests__/realtime-review-lifecycle.test.d.ts +0 -2
  257. package/dist/__tests__/realtime-review-lifecycle.test.d.ts.map +0 -1
  258. package/dist/__tests__/realtime-review-lifecycle.test.js +0 -154
  259. package/dist/__tests__/realtime-review-lifecycle.test.js.map +0 -1
  260. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts +0 -2
  261. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts.map +0 -1
  262. package/dist/__tests__/realtime-session-cancel-usage.test.js +0 -230
  263. package/dist/__tests__/realtime-session-cancel-usage.test.js.map +0 -1
  264. package/dist/__tests__/realtime-session-channels.test.d.ts +0 -2
  265. package/dist/__tests__/realtime-session-channels.test.d.ts.map +0 -1
  266. package/dist/__tests__/realtime-session-channels.test.js +0 -252
  267. package/dist/__tests__/realtime-session-channels.test.js.map +0 -1
  268. package/dist/__tests__/realtime-session-client-tools.test.d.ts +0 -2
  269. package/dist/__tests__/realtime-session-client-tools.test.d.ts.map +0 -1
  270. package/dist/__tests__/realtime-session-client-tools.test.js +0 -103
  271. package/dist/__tests__/realtime-session-client-tools.test.js.map +0 -1
  272. package/dist/__tests__/realtime-session-minimized.test.d.ts +0 -2
  273. package/dist/__tests__/realtime-session-minimized.test.d.ts.map +0 -1
  274. package/dist/__tests__/realtime-session-minimized.test.js +0 -32
  275. package/dist/__tests__/realtime-session-minimized.test.js.map +0 -1
  276. package/dist/__tests__/realtime-session-mint.test.d.ts +0 -2
  277. package/dist/__tests__/realtime-session-mint.test.d.ts.map +0 -1
  278. package/dist/__tests__/realtime-session-mint.test.js +0 -69
  279. package/dist/__tests__/realtime-session-mint.test.js.map +0 -1
  280. package/dist/__tests__/realtime-session-policy.test.d.ts +0 -2
  281. package/dist/__tests__/realtime-session-policy.test.d.ts.map +0 -1
  282. package/dist/__tests__/realtime-session-policy.test.js +0 -303
  283. package/dist/__tests__/realtime-session-policy.test.js.map +0 -1
  284. package/dist/__tests__/realtime-session-review.service.test.d.ts +0 -2
  285. package/dist/__tests__/realtime-session-review.service.test.d.ts.map +0 -1
  286. package/dist/__tests__/realtime-session-review.service.test.js +0 -743
  287. package/dist/__tests__/realtime-session-review.service.test.js.map +0 -1
  288. package/dist/__tests__/realtime-session-state.test.d.ts +0 -2
  289. package/dist/__tests__/realtime-session-state.test.d.ts.map +0 -1
  290. package/dist/__tests__/realtime-session-state.test.js +0 -83
  291. package/dist/__tests__/realtime-session-state.test.js.map +0 -1
  292. package/dist/__tests__/realtime-session-timeline-card.test.d.ts +0 -2
  293. package/dist/__tests__/realtime-session-timeline-card.test.d.ts.map +0 -1
  294. package/dist/__tests__/realtime-session-timeline-card.test.js +0 -106
  295. package/dist/__tests__/realtime-session-timeline-card.test.js.map +0 -1
  296. package/dist/__tests__/realtime-session-timeline.test.d.ts +0 -2
  297. package/dist/__tests__/realtime-session-timeline.test.d.ts.map +0 -1
  298. package/dist/__tests__/realtime-session-timeline.test.js +0 -142
  299. package/dist/__tests__/realtime-session-timeline.test.js.map +0 -1
  300. package/dist/__tests__/realtime-sessions-adapter.test.d.ts +0 -19
  301. package/dist/__tests__/realtime-sessions-adapter.test.d.ts.map +0 -1
  302. package/dist/__tests__/realtime-sessions-adapter.test.js +0 -188
  303. package/dist/__tests__/realtime-sessions-adapter.test.js.map +0 -1
  304. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts +0 -2
  305. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts.map +0 -1
  306. package/dist/__tests__/realtime-surface-panel-prefs.test.js +0 -100
  307. package/dist/__tests__/realtime-surface-panel-prefs.test.js.map +0 -1
  308. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts +0 -2
  309. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts.map +0 -1
  310. package/dist/__tests__/realtime-surface-tabs-model.test.js +0 -193
  311. package/dist/__tests__/realtime-surface-tabs-model.test.js.map +0 -1
  312. package/dist/__tests__/remote-browser-audio-player.test.d.ts +0 -2
  313. package/dist/__tests__/remote-browser-audio-player.test.d.ts.map +0 -1
  314. package/dist/__tests__/remote-browser-audio-player.test.js +0 -137
  315. package/dist/__tests__/remote-browser-audio-player.test.js.map +0 -1
  316. package/dist/__tests__/remote-browser-channel.test.d.ts +0 -2
  317. package/dist/__tests__/remote-browser-channel.test.d.ts.map +0 -1
  318. package/dist/__tests__/remote-browser-channel.test.js +0 -585
  319. package/dist/__tests__/remote-browser-channel.test.js.map +0 -1
  320. package/dist/__tests__/search-service.test.d.ts +0 -2
  321. package/dist/__tests__/search-service.test.d.ts.map +0 -1
  322. package/dist/__tests__/search-service.test.js +0 -114
  323. package/dist/__tests__/search-service.test.js.map +0 -1
  324. package/dist/__tests__/slot-defaults.test.d.ts +0 -24
  325. package/dist/__tests__/slot-defaults.test.d.ts.map +0 -1
  326. package/dist/__tests__/slot-defaults.test.js +0 -63
  327. package/dist/__tests__/slot-defaults.test.js.map +0 -1
  328. package/dist/__tests__/toast-service.test.d.ts +0 -2
  329. package/dist/__tests__/toast-service.test.d.ts.map +0 -1
  330. package/dist/__tests__/toast-service.test.js +0 -143
  331. package/dist/__tests__/toast-service.test.js.map +0 -1
  332. package/dist/__tests__/user-authorization.test.d.ts +0 -2
  333. package/dist/__tests__/user-authorization.test.d.ts.map +0 -1
  334. package/dist/__tests__/user-authorization.test.js +0 -97
  335. package/dist/__tests__/user-authorization.test.js.map +0 -1
  336. package/dist/__tests__/voice-session-narration.test.d.ts +0 -2
  337. package/dist/__tests__/voice-session-narration.test.d.ts.map +0 -1
  338. package/dist/__tests__/voice-session-narration.test.js +0 -609
  339. package/dist/__tests__/voice-session-narration.test.js.map +0 -1
  340. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts +0 -2
  341. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts.map +0 -1
  342. package/dist/__tests__/whiteboard-artifact-viewer.test.js +0 -101
  343. package/dist/__tests__/whiteboard-artifact-viewer.test.js.map +0 -1
  344. package/dist/__tests__/whiteboard-channel.test.d.ts +0 -2
  345. package/dist/__tests__/whiteboard-channel.test.d.ts.map +0 -1
  346. package/dist/__tests__/whiteboard-channel.test.js +0 -260
  347. package/dist/__tests__/whiteboard-channel.test.js.map +0 -1
  348. package/dist/__tests__/whiteboard-restore-state.test.d.ts +0 -2
  349. package/dist/__tests__/whiteboard-restore-state.test.d.ts.map +0 -1
  350. package/dist/__tests__/whiteboard-restore-state.test.js +0 -108
  351. package/dist/__tests__/whiteboard-restore-state.test.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { Component, EventEmitter, Input, Output, ChangeDetectorRef, inject } from '@angular/core';
1
+ import { Component, EventEmitter, Input, Output, ChangeDetectorRef, ViewChild, inject } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { UserInfoEngine } from '@memberjunction/core-entities';
4
4
  import { ArtifactsModule } from '@memberjunction/ng-artifacts';
@@ -8,7 +8,6 @@ import { ChannelOnboardingPanelComponent } from './channels/channel-onboarding-p
8
8
  import { RealtimeSurfaceTabsModel } from './realtime-surface-tabs.model';
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "@angular/common";
11
- import * as i2 from "@memberjunction/ng-artifacts";
12
11
  function RealtimeSurfaceTabsComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
13
12
  const _r1 = i0.ɵɵgetCurrentView();
14
13
  i0.ɵɵelementStart(0, "div", 1)(1, "button", 2);
@@ -18,126 +17,139 @@ function RealtimeSurfaceTabsComponent_Conditional_1_Template(rf, ctx) { if (rf &
18
17
  i0.ɵɵelement(3, "i", 4);
19
18
  i0.ɵɵelementEnd();
20
19
  } }
21
- function RealtimeSurfaceTabsComponent_Conditional_2_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
22
- i0.ɵɵelement(0, "span", 14);
20
+ function RealtimeSurfaceTabsComponent_Conditional_2_For_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵelement(0, "span", 11);
22
+ } }
23
+ function RealtimeSurfaceTabsComponent_Conditional_2_For_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
24
+ i0.ɵɵelement(0, "span", 13);
25
+ } }
26
+ function RealtimeSurfaceTabsComponent_Conditional_2_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
27
+ i0.ɵɵelementStart(0, "span", 16);
28
+ i0.ɵɵtext(1);
29
+ i0.ɵɵelementEnd();
30
+ } if (rf & 2) {
31
+ const ctx_r1 = i0.ɵɵnextContext(3);
32
+ i0.ɵɵadvance();
33
+ i0.ɵɵtextInterpolate(ctx_r1.State.Cards.length);
23
34
  } }
24
35
  function RealtimeSurfaceTabsComponent_Conditional_2_For_2_Template(rf, ctx) { if (rf & 1) {
25
36
  const _r4 = i0.ɵɵgetCurrentView();
26
- i0.ɵɵelementStart(0, "button", 11);
27
- i0.ɵɵlistener("click", function RealtimeSurfaceTabsComponent_Conditional_2_For_2_Template_button_click_0_listener() { const tab_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.Model.Focus(tab_r5.Key)); });
28
- i0.ɵɵelement(1, "i", 12);
29
- i0.ɵɵelementStart(2, "span", 13);
30
- i0.ɵɵtext(3);
37
+ i0.ɵɵconditionalCreate(0, RealtimeSurfaceTabsComponent_Conditional_2_For_2_Conditional_0_Template, 1, 0, "span", 11);
38
+ i0.ɵɵelementStart(1, "button", 12);
39
+ i0.ɵɵlistener("click", function RealtimeSurfaceTabsComponent_Conditional_2_For_2_Template_button_click_1_listener() { const tab_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.Model.Focus(tab_r5.Key)); });
40
+ i0.ɵɵconditionalCreate(2, RealtimeSurfaceTabsComponent_Conditional_2_For_2_Conditional_2_Template, 1, 0, "span", 13);
41
+ i0.ɵɵelement(3, "i", 14);
42
+ i0.ɵɵelementStart(4, "span", 15);
43
+ i0.ɵɵtext(5);
31
44
  i0.ɵɵelementEnd();
32
- i0.ɵɵconditionalCreate(4, RealtimeSurfaceTabsComponent_Conditional_2_For_2_Conditional_4_Template, 1, 0, "span", 14);
45
+ i0.ɵɵconditionalCreate(6, RealtimeSurfaceTabsComponent_Conditional_2_For_2_Conditional_6_Template, 2, 1, "span", 16);
33
46
  i0.ɵɵelementEnd();
34
47
  } if (rf & 2) {
35
48
  const tab_r5 = ctx.$implicit;
36
49
  const ctx_r1 = i0.ɵɵnextContext(2);
37
- i0.ɵɵclassProp("s-tab--active", tab_r5.Key === ctx_r1.Model.ActiveKey)("s-tab--flash", tab_r5.Key === ctx_r1.Model.FlashKey)("s-tab--unseen", ctx_r1.Model.IsUnseen(tab_r5.Key));
38
- i0.ɵɵproperty("title", ctx_r1.Model.IsUnseen(tab_r5.Key) ? tab_r5.Title + " (new)" : tab_r5.Title);
50
+ i0.ɵɵconditional(tab_r5.Kind === "activity" ? 0 : -1);
51
+ i0.ɵɵadvance();
52
+ i0.ɵɵstyleProp("--tab-accent", tab_r5.Color || null);
53
+ i0.ɵɵclassProp("s-tab--activity", tab_r5.Kind === "activity")("s-tab--channel", tab_r5.Kind === "channel")("s-tab--active", tab_r5.Key === ctx_r1.Model.ActiveKey)("s-tab--flash", tab_r5.Key === ctx_r1.Model.FlashKey);
54
+ i0.ɵɵproperty("title", tab_r5.Title);
39
55
  i0.ɵɵattribute("aria-selected", tab_r5.Key === ctx_r1.Model.ActiveKey);
40
56
  i0.ɵɵadvance();
57
+ i0.ɵɵconditional(tab_r5.Kind === "channel" ? 2 : -1);
58
+ i0.ɵɵadvance();
41
59
  i0.ɵɵclassMap(tab_r5.Icon);
42
60
  i0.ɵɵadvance(2);
43
61
  i0.ɵɵtextInterpolate(tab_r5.Title);
44
62
  i0.ɵɵadvance();
45
- i0.ɵɵconditional(ctx_r1.Model.IsUnseen(tab_r5.Key) ? 4 : -1);
63
+ i0.ɵɵconditional(tab_r5.Kind === "activity" && ctx_r1.State.Cards.length > 0 ? 6 : -1);
46
64
  } }
47
65
  function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_1_Template(rf, ctx) { if (rf & 1) {
48
66
  const _r6 = i0.ɵɵgetCurrentView();
49
- i0.ɵɵelementStart(0, "mj-realtime-activity-rail", 17);
50
- i0.ɵɵlistener("OpenRunRequested", function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_1_Template_mj_realtime_activity_rail_OpenRunRequested_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenRunRequested.emit($event)); })("OpenArtifactRequested", function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_1_Template_mj_realtime_activity_rail_OpenArtifactRequested_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.FocusArtifact($event)); });
67
+ i0.ɵɵelementStart(0, "mj-realtime-activity-rail", 19);
68
+ i0.ɵɵlistener("OpenRunRequested", function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_1_Template_mj_realtime_activity_rail_OpenRunRequested_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenRunRequested.emit($event)); });
51
69
  i0.ɵɵelementEnd();
52
70
  } if (rf & 2) {
53
71
  const ctx_r1 = i0.ɵɵnextContext(3);
54
- i0.ɵɵproperty("State", ctx_r1.State)("DevMode", ctx_r1.DevMode)("Embedded", true);
72
+ i0.ɵɵproperty("State", ctx_r1.State)("DevMode", ctx_r1.DevMode)("Embedded", true)("CurrentUser", ctx_r1.CurrentUser)("EnvironmentID", ctx_r1.EnvironmentID)("ExtraArtifacts", ctx_r1.ExtraArtifacts);
55
73
  } }
56
- function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
57
- i0.ɵɵelementStart(0, "div", 18);
58
- i0.ɵɵelement(1, "mj-artifact-viewer-panel", 19);
59
- i0.ɵɵelementEnd();
60
- } if (rf & 2) {
61
- const ctx_r1 = i0.ɵɵnextContext(4);
62
- i0.ɵɵadvance();
63
- i0.ɵɵproperty("artifactId", ctx.ArtifactID)("currentUser", ctx_r1.CurrentUser)("environmentId", ctx_r1.EnvironmentID)("showHeader", false)("showTabs", false)("showSaveToCollection", false)("showCloseButton", false)("showMaximizeButton", false);
64
- } }
65
- function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_2_Template(rf, ctx) { if (rf & 1) {
66
- i0.ɵɵconditionalCreate(0, RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_2_Conditional_0_Template, 2, 8, "div", 18);
67
- } if (rf & 2) {
68
- let tmp_12_0;
69
- const tab_r7 = i0.ɵɵnextContext().$implicit;
70
- i0.ɵɵconditional((tmp_12_0 = tab_r7.Data == null ? null : tab_r7.Data.Artifact) ? 0 : -1, tmp_12_0);
71
- } }
72
- function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_3_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
73
- const _r8 = i0.ɵɵgetCurrentView();
74
+ function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_2_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
75
+ const _r7 = i0.ɵɵgetCurrentView();
74
76
  i0.ɵɵelementStart(0, "mj-channel-onboarding-panel", 24);
75
- i0.ɵɵlistener("Dismissed", function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_3_Conditional_0_Conditional_1_Template_mj_channel_onboarding_panel_Dismissed_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.DismissOnboarding()); });
77
+ i0.ɵɵlistener("Dismissed", function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_2_Conditional_0_Conditional_1_Template_mj_channel_onboarding_panel_Dismissed_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.DismissOnboarding()); });
76
78
  i0.ɵɵelementEnd();
77
79
  } if (rf & 2) {
78
80
  const ctx_r1 = i0.ɵɵnextContext(5);
79
81
  i0.ɵɵproperty("Content", ctx_r1.OnboardingContent);
80
82
  } }
81
- function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
83
+ function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
82
84
  i0.ɵɵelement(0, "mj-realtime-channel-pane", 22);
83
- i0.ɵɵconditionalCreate(1, RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_3_Conditional_0_Conditional_1_Template, 1, 1, "mj-channel-onboarding-panel", 23);
85
+ i0.ɵɵconditionalCreate(1, RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_2_Conditional_0_Conditional_1_Template, 1, 1, "mj-channel-onboarding-panel", 23);
84
86
  } if (rf & 2) {
85
- const tab_r7 = i0.ɵɵnextContext(2).$implicit;
87
+ const tab_r8 = i0.ɵɵnextContext(2).$implicit;
86
88
  const ctx_r1 = i0.ɵɵnextContext(2);
87
89
  i0.ɵɵproperty("Plugin", ctx);
88
90
  i0.ɵɵadvance();
89
- i0.ɵɵconditional(tab_r7.Key === ctx_r1.Model.ActiveKey && ctx_r1.OnboardingContent ? 1 : -1);
91
+ i0.ɵɵconditional(tab_r8.Key === ctx_r1.Model.ActiveKey && ctx_r1.OnboardingContent ? 1 : -1);
90
92
  } }
91
- function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
93
+ function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
92
94
  i0.ɵɵelementContainer(0, 20);
93
95
  } if (rf & 2) {
94
96
  i0.ɵɵproperty("ngTemplateOutlet", ctx);
95
97
  } }
96
- function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
98
+ function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
97
99
  i0.ɵɵelementStart(0, "div", 21);
98
100
  i0.ɵɵelement(1, "i", 25);
99
101
  i0.ɵɵelementStart(2, "span");
100
102
  i0.ɵɵtext(3);
101
103
  i0.ɵɵelementEnd()();
102
104
  } if (rf & 2) {
103
- const tab_r7 = i0.ɵɵnextContext(2).$implicit;
105
+ const tab_r8 = i0.ɵɵnextContext(2).$implicit;
104
106
  i0.ɵɵadvance(3);
105
- i0.ɵɵtextInterpolate1("", tab_r7.Title, " coming online\u2026");
107
+ i0.ɵɵtextInterpolate1("", tab_r8.Title, " coming online\u2026");
106
108
  } }
107
- function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_3_Template(rf, ctx) { if (rf & 1) {
108
- i0.ɵɵconditionalCreate(0, RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_3_Conditional_0_Template, 2, 2)(1, RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_3_Conditional_1_Template, 1, 1, "ng-container", 20)(2, RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_3_Conditional_2_Template, 4, 1, "div", 21);
109
+ function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_2_Template(rf, ctx) { if (rf & 1) {
110
+ i0.ɵɵconditionalCreate(0, RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_2_Conditional_0_Template, 2, 2)(1, RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_2_Conditional_1_Template, 1, 1, "ng-container", 20)(2, RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_2_Conditional_2_Template, 4, 1, "div", 21);
109
111
  } if (rf & 2) {
110
112
  let tmp_12_0;
111
- const tab_r7 = i0.ɵɵnextContext().$implicit;
112
- i0.ɵɵconditional((tmp_12_0 = tab_r7.Data == null ? null : tab_r7.Data.Plugin) ? 0 : (tmp_12_0 = tab_r7.Data == null ? null : tab_r7.Data.Content) ? 1 : 2, tmp_12_0);
113
+ const tab_r8 = i0.ɵɵnextContext().$implicit;
114
+ i0.ɵɵconditional((tmp_12_0 = tab_r8.Data == null ? null : tab_r8.Data.Plugin) ? 0 : (tmp_12_0 = tab_r8.Data == null ? null : tab_r8.Data.Content) ? 1 : 2, tmp_12_0);
113
115
  } }
114
116
  function RealtimeSurfaceTabsComponent_Conditional_2_For_7_Template(rf, ctx) { if (rf & 1) {
115
- i0.ɵɵelementStart(0, "div", 15);
116
- i0.ɵɵconditionalCreate(1, RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_1_Template, 1, 3, "mj-realtime-activity-rail", 16)(2, RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_2_Template, 1, 1)(3, RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_3_Template, 3, 1);
117
+ i0.ɵɵelementStart(0, "div", 17);
118
+ i0.ɵɵconditionalCreate(1, RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_1_Template, 1, 6, "mj-realtime-activity-rail", 18)(2, RealtimeSurfaceTabsComponent_Conditional_2_For_7_Case_2_Template, 3, 1);
117
119
  i0.ɵɵelementEnd();
118
120
  } if (rf & 2) {
119
121
  let tmp_12_0;
120
- const tab_r7 = ctx.$implicit;
122
+ const tab_r8 = ctx.$implicit;
121
123
  const ctx_r1 = i0.ɵɵnextContext(2);
122
- i0.ɵɵclassProp("s-pane--active", tab_r7.Key === ctx_r1.Model.ActiveKey);
124
+ i0.ɵɵclassProp("s-pane--active", tab_r8.Key === ctx_r1.Model.ActiveKey);
123
125
  i0.ɵɵadvance();
124
- i0.ɵɵconditional((tmp_12_0 = tab_r7.Kind) === "activity" ? 1 : tmp_12_0 === "artifact" ? 2 : tmp_12_0 === "channel" ? 3 : -1);
126
+ i0.ɵɵconditional((tmp_12_0 = tab_r8.Kind) === "activity" ? 1 : tmp_12_0 === "channel" ? 2 : -1);
127
+ } }
128
+ function RealtimeSurfaceTabsComponent_Conditional_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
129
+ i0.ɵɵelementStart(0, "div", 10);
130
+ i0.ɵɵelement(1, "i", 26);
131
+ i0.ɵɵelementStart(2, "span");
132
+ i0.ɵɵtext(3, "Surfaces appear here as the call gets going.");
133
+ i0.ɵɵelementEnd()();
125
134
  } }
126
135
  function RealtimeSurfaceTabsComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
127
136
  const _r3 = i0.ɵɵgetCurrentView();
128
137
  i0.ɵɵelementStart(0, "div", 5);
129
- i0.ɵɵrepeaterCreate(1, RealtimeSurfaceTabsComponent_Conditional_2_For_2_Template, 5, 12, "button", 6, i0.ɵɵcomponentInstance().TrackTab, true);
130
- i0.ɵɵelementStart(3, "div", 7)(4, "button", 8);
138
+ i0.ɵɵrepeaterCreate(1, RealtimeSurfaceTabsComponent_Conditional_2_For_2_Template, 7, 18, null, null, i0.ɵɵcomponentInstance().TrackTab, true);
139
+ i0.ɵɵelementStart(3, "div", 6)(4, "button", 7);
131
140
  i0.ɵɵlistener("click", function RealtimeSurfaceTabsComponent_Conditional_2_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ToggleCollapsed()); });
132
- i0.ɵɵelement(5, "i", 9);
141
+ i0.ɵɵelement(5, "i", 8);
133
142
  i0.ɵɵelementEnd()()();
134
- i0.ɵɵrepeaterCreate(6, RealtimeSurfaceTabsComponent_Conditional_2_For_7_Template, 4, 3, "div", 10, i0.ɵɵcomponentInstance().TrackTab, true);
143
+ i0.ɵɵrepeaterCreate(6, RealtimeSurfaceTabsComponent_Conditional_2_For_7_Template, 3, 3, "div", 9, i0.ɵɵcomponentInstance().TrackTab, true);
144
+ i0.ɵɵconditionalCreate(8, RealtimeSurfaceTabsComponent_Conditional_2_Conditional_8_Template, 4, 0, "div", 10);
135
145
  } if (rf & 2) {
136
146
  const ctx_r1 = i0.ɵɵnextContext();
137
147
  i0.ɵɵadvance();
138
148
  i0.ɵɵrepeater(ctx_r1.Model.Tabs);
139
149
  i0.ɵɵadvance(5);
140
150
  i0.ɵɵrepeater(ctx_r1.Model.Tabs);
151
+ i0.ɵɵadvance(2);
152
+ i0.ɵɵconditional(ctx_r1.Model.Tabs.length === 0 ? 8 : -1);
141
153
  } }
142
154
  /**
143
155
  * User-settings key (NOT localStorage — see `UserInfoEngine`) under which the per-user "which
@@ -147,36 +159,32 @@ function RealtimeSurfaceTabsComponent_Conditional_2_Template(rf, ctx) { if (rf &
147
159
  */
148
160
  const CHANNEL_ONBOARDING_SEEN_SETTING_KEY = 'mj.realtimeChannels.onboardingSeen.v1';
149
161
  /**
150
- * The call overlay's TABBED SURFACE PANEL (the right panel) — per the approved
151
- * `plans/realtime/mockups/whiteboard.html` mockup:
162
+ * The call overlay's TABBED SURFACE PANEL (the right panel) — decluttered redesign:
163
+ *
164
+ * - **Channel tabs** (LEFT cluster) — one per channel that has come into play. The whiteboard
165
+ * tabs immediately at session start; every other channel tabs only once the agent first
166
+ * USES it. Each carries a distinct accent color + its plugin icon. The pane creates the
167
+ * plugin's surface component dynamically (via `mj-realtime-channel-pane`); a placeholder
168
+ * shows the "coming online…" state until a plugin/template is supplied.
169
+ * - **Activity** (RIGHT-aligned, pinned LAST) — gated: appears only once ≥1 agent run has
170
+ * occurred (or in review mode). Hosts {@link RealtimeActivityRailComponent}, which now also
171
+ * renders inline artifact previews and a split-pane artifact viewer. Styled distinctly from
172
+ * channel tabs (activity-pulse icon + its own accent) and separated from the channel cluster
173
+ * by a flex spacer.
152
174
  *
153
- * - **Activity**always the first tab; hosts the existing
154
- * {@link RealtimeActivityRailComponent} unchanged (in `Embedded` mode, since this panel
155
- * owns the chrome + collapse).
156
- * - **One tab per artifact** produced by delegated runs: when a delegation result carries
157
- * artifacts, a tab is auto-opened, FOCUSED, and briefly flashed violet. The pane reuses
158
- * the standard `mj-artifact-viewer-panel` (read-only embed: no header/tabs/actions),
159
- * loading by ArtifactID — the latest version, i.e. the one the run just produced.
160
- * - **Channel tabs** — rendered ONLY once a channel registers via
161
- * {@link RegisterChannelTab}. The overlay shell registers one per registry-resolved
162
- * {@link BaseRealtimeChannelClient} plugin; the pane creates the plugin's surface
163
- * component dynamically (via `mj-realtime-channel-pane`). Until a registration supplies
164
- * a plugin (or legacy template), the pane shows the "coming online…" placeholder;
165
- * re-registering the same key swaps the real surface in.
175
+ * Artifacts NO LONGER get their own tab they live inside the Activity tab (cleaner than a
176
+ * row of per-artifact tabs).
166
177
  *
167
- * Panes are kept ALIVE while hidden (CSS `display:none`, mirroring the mockup's
168
- * `.s-pane.active`) so switching tabs never reloads an artifact or resets the rail.
169
- * The whole panel collapses to a slim strip via the chevron at the tab strip's end —
170
- * the collapse-to-strip behavior that used to live on the rail, lifted to the panel.
178
+ * Panes are kept ALIVE while hidden (CSS `display:none`) so switching tabs never reloads a
179
+ * channel surface or resets the rail. The whole panel collapses to a slim strip via the chevron.
171
180
  *
172
- * SIZING IS EXTERNAL: the overlay shell hosts this panel in a fixed-width flex item
173
- * and owns the width (user drag via the resize handle + persisted preference +
174
- * default tiers). This panel just fills it and REPORTS the layout signals the shell sizes from:
175
- * {@link CollapsedChange} (slim-strip toggle) and {@link WideChanged} (a content tab
176
- * is focused → the default width tier widens).
181
+ * SIZING IS EXTERNAL: the overlay shell hosts this panel in a fixed-width flex item and owns
182
+ * the width. This panel just fills it and REPORTS the layout signals the shell sizes from:
183
+ * {@link CollapsedChange} (slim-strip toggle) and {@link WideChanged} (a channel tab is focused
184
+ * the default width tier widens).
177
185
  */
178
186
  export class RealtimeSurfaceTabsComponent {
179
- /** How long a just-arrived tab keeps its violet flash highlight. */
187
+ /** How long a just-revealed channel tab keeps its flash highlight. */
180
188
  static FlashDurationMs = 1400;
181
189
  /** Shared live-session state, owned by the overlay shell (feeds the Activity rail). */
182
190
  State;
@@ -192,6 +200,27 @@ export class RealtimeSurfaceTabsComponent {
192
200
  CurrentUser = null;
193
201
  /** The active environment id, threaded to the artifact viewer panel. */
194
202
  EnvironmentID = '';
203
+ /**
204
+ * Extra (review-carryover) artifacts to surface in the Activity tab, NOT tied to a live
205
+ * activity card. Forwarded to the rail's "Session artifacts" group. Empty for a live session.
206
+ */
207
+ ExtraArtifacts = [];
208
+ /**
209
+ * Whether the gated Activity tab should be shown — driven by the overlay shell once ≥1
210
+ * agent run has occurred (or in review mode). A getter/setter so a late "first run" flips
211
+ * the tab into the strip reactively.
212
+ */
213
+ _showActivityTab = false;
214
+ set ShowActivityTab(value) {
215
+ if (value !== this._showActivityTab) {
216
+ this._showActivityTab = value;
217
+ this.Model.SetShowActivityTab(value);
218
+ this.cdr.markForCheck();
219
+ }
220
+ }
221
+ get ShowActivityTab() {
222
+ return this._showActivityTab;
223
+ }
195
224
  /** Re-emitted from the Activity rail's dev "Open run" links. */
196
225
  OpenRunRequested = new EventEmitter();
197
226
  /**
@@ -200,7 +229,7 @@ export class RealtimeSurfaceTabsComponent {
200
229
  */
201
230
  CollapsedChange = new EventEmitter();
202
231
  /**
203
- * Emitted when {@link IsWide} flips (a content tab gained / lost focus) — the
232
+ * Emitted when {@link IsWide} flips (a channel tab gained / lost focus) — the
204
233
  * overlay shell widens the panel's DEFAULT split-area size while wide (only when
205
234
  * the user has never dragged an explicit width).
206
235
  */
@@ -209,8 +238,8 @@ export class RealtimeSurfaceTabsComponent {
209
238
  Model = new RealtimeSurfaceTabsModel();
210
239
  /** Whether the panel is collapsed to its slim strip. */
211
240
  Collapsed = false;
212
- /** Artifact version ids already turned into tabs (guards the State rescan). */
213
- tabbedVersionIds = new Set();
241
+ /** The embedded Activity rail (owns the inline artifact previews + the split-pane viewer). */
242
+ activityRail;
214
243
  flashTimer = null;
215
244
  subs = [];
216
245
  lastWide = false;
@@ -227,13 +256,12 @@ export class RealtimeSurfaceTabsComponent {
227
256
  get ActiveTab() {
228
257
  return this.Model.ActiveTab;
229
258
  }
230
- /** Wide presentation when a content tab (artifact / channel) is focused. */
259
+ /** Wide presentation when a channel tab is focused (the Activity tab keeps the normal tier). */
231
260
  get IsWide() {
232
- return !this.Collapsed && this.ActiveTab.Kind !== 'activity';
261
+ return !this.Collapsed && this.ActiveTab.Kind === 'channel';
233
262
  }
234
263
  ngOnInit() {
235
- this.subs.push(this.State.Changed$.subscribe(() => this.onStateChanged()), this.Model.Changed$.subscribe(() => this.onModelChanged()));
236
- this.syncArtifactTabs();
264
+ this.subs.push(this.Model.Changed$.subscribe(() => this.onModelChanged()));
237
265
  }
238
266
  ngOnDestroy() {
239
267
  for (const s of this.subs) {
@@ -257,7 +285,7 @@ export class RealtimeSurfaceTabsComponent {
257
285
  this.syncWide();
258
286
  }
259
287
  }
260
- /** Emits {@link WideChanged} when the wide tier flips (content tab focus / collapse). */
288
+ /** Emits {@link WideChanged} when the wide tier flips (channel tab focus / collapse). */
261
289
  syncWide() {
262
290
  const wide = this.IsWide;
263
291
  if (wide !== this.lastWide) {
@@ -270,22 +298,31 @@ export class RealtimeSurfaceTabsComponent {
270
298
  return tab.Key;
271
299
  }
272
300
  /**
273
- * Focuses (opening if needed) the tab for an artifact the "View →" affordance target
274
- * on done delegation cards and rail entries. Expands the panel if it was collapsed.
301
+ * Focuses the Activity tab and opens the given artifact in the rail's split-pane viewer
302
+ * the "View →" affordance target on done delegation cards / thread entries. Expands the
303
+ * panel if it was collapsed. Replaces the old "open a tab per artifact" behavior.
275
304
  */
276
305
  FocusArtifact(artifact) {
277
- this.tabbedVersionIds.add(artifact.ArtifactVersionID);
278
- this.Model.OpenArtifactTab(artifact, true);
279
306
  this.setCollapsed(false);
307
+ // An artifact implies a run happened — ensure the Activity tab is present before focusing it.
308
+ this.Model.SetShowActivityTab(true);
309
+ this.Model.Focus(RealtimeSurfaceTabsModel.ActivityTabKey);
310
+ // The rail may not be created yet (panel just expanded) — defer so it exists.
311
+ if (this.activityRail) {
312
+ this.activityRail.OpenArtifact(artifact);
313
+ }
314
+ else {
315
+ setTimeout(() => this.activityRail?.OpenArtifact(artifact));
316
+ }
280
317
  this.cdr.markForCheck();
281
318
  }
282
319
  /**
283
- * Registers (or updates) an interactive-channel tab — one per registry-resolved channel
284
- * plugin, forwarded from `RealtimeSessionOverlayComponent.RegisterChannelTab`.
320
+ * Registers (or updates) an interactive-channel tab — one per used channel plugin,
321
+ * forwarded from `RealtimeSessionOverlayComponent.RegisterChannelTab`.
285
322
  */
286
323
  RegisterChannelTab(registration) {
287
324
  // Microtask defer: the overlay forwards this while handling agent/channel activity, which can
288
- // land mid change-detection. Adding a tab to Model.Tabs synchronously then trips NG0100 on the
325
+ // land mid change-detection. Adding a tab to Model synchronously then trips NG0100 on the
289
326
  // tab-strip bindings (s-tab--active). A microtask lands the mutation in a fresh CD turn —
290
327
  // imperceptible for an async reveal, and ordered with any follow-on RevealChannel.
291
328
  Promise.resolve().then(() => {
@@ -295,9 +332,8 @@ export class RealtimeSurfaceTabsComponent {
295
332
  }
296
333
  /**
297
334
  * AUTO-REVEALS a channel surface the moment the agent first acts on it: expands the
298
- * panel if collapsed, focuses the channel's tab and flashes it violet — so the user
299
- * discovers the whiteboard (or any channel) exists the instant it comes alive,
300
- * instead of having to find the tab themselves. No-op for unknown keys.
335
+ * panel if collapsed, focuses the channel's tab and flashes it — so the user discovers
336
+ * the whiteboard (or any channel) exists the instant it comes alive. No-op for unknown keys.
301
337
  */
302
338
  RevealChannel(key) {
303
339
  // Microtask defer (same NG0100 reason as RegisterChannelTab): the agent-activity reveal mutates
@@ -312,10 +348,10 @@ export class RealtimeSurfaceTabsComponent {
312
348
  });
313
349
  }
314
350
  /**
315
- * Removes a tab from the panel (Activity is irremovable; focus falls back to Activity
316
- * see {@link RealtimeSurfaceTabsModel.RemoveTab}). Used by the overlay shell on a
317
- * review→live continuation whose live channel set resolved WITHOUT the channel a stale
318
- * review tab represents (e.g. no Whiteboard channel → drop the read-only review board tab).
351
+ * Removes a tab from the panel (Activity is irremovable; focus falls back per the model's
352
+ * rules). Used by the overlay shell on a review→live continuation whose live channel set
353
+ * resolved WITHOUT the channel a stale review tab represents (e.g. no Whiteboard channel
354
+ * drop the read-only review board tab).
319
355
  *
320
356
  * @returns `true` when a tab was removed.
321
357
  */
@@ -327,21 +363,16 @@ export class RealtimeSurfaceTabsComponent {
327
363
  return removed;
328
364
  }
329
365
  /**
330
- * Registers an artifact tab WITHOUT stealing focus (default) the SESSION REVIEW /
331
- * resume-carryover path, where a reviewed session's (and its prior legs') history
332
- * artifacts are surfaced as tabs the user can visit, as opposed to the live
333
- * auto-open-on-arrival behavior. Idempotent per artifact version; the registered tab
334
- * survives the review→live transition (tabs are never cleared on resume).
366
+ * Registers the reviewed chain's history artifacts so they surface inside the Activity tab.
367
+ * In the redesign there are no per-artifact tabs the rail picks artifacts up from the
368
+ * session state's cards, so this only needs to ensure the Activity tab is shown (review
369
+ * mode always shows it) and, when `focus` is set, open the artifact in the split viewer.
335
370
  */
336
371
  RegisterArtifactTab(artifact, focus = false) {
337
- this.tabbedVersionIds.add(artifact.ArtifactVersionID);
338
- // History carryover is context, not news — never marked unseen (no glow).
339
- this.Model.OpenArtifactTab(artifact, focus, false);
340
- this.cdr.markForCheck();
341
- }
342
- /** On session-state changes: open tabs for newly-arrived artifacts, then re-render. */
343
- onStateChanged() {
344
- this.syncArtifactTabs();
372
+ this.Model.SetShowActivityTab(true);
373
+ if (focus) {
374
+ this.FocusArtifact(artifact);
375
+ }
345
376
  this.cdr.markForCheck();
346
377
  }
347
378
  /** On model changes: schedule the flash clear, report a wide-tier flip, re-render. */
@@ -411,27 +442,6 @@ export class RealtimeSurfaceTabsComponent {
411
442
  return {};
412
443
  }
413
444
  }
414
- /**
415
- * Scans the session's delegation cards for artifacts that don't have a tab yet and
416
- * adds one per artifact — UNFOCUSED, with the brief violet flash plus the persistent
417
- * unseen glow. Per product direction a finished artifact never steals the screen
418
- * (only the agent's first channel activity auto-reveals); the glowing tab is the
419
- * invitation, the user opens it when they want it.
420
- */
421
- syncArtifactTabs() {
422
- for (const card of this.State.Cards) {
423
- if (!card.Done || !card.Artifacts) {
424
- continue;
425
- }
426
- for (const artifact of card.Artifacts) {
427
- if (this.tabbedVersionIds.has(artifact.ArtifactVersionID)) {
428
- continue;
429
- }
430
- this.tabbedVersionIds.add(artifact.ArtifactVersionID);
431
- this.Model.OpenArtifactTab(artifact, false);
432
- }
433
- }
434
- }
435
445
  /**
436
446
  * Focuses the FIRST tab in the strip — channels lead, so a Details peek lands on the
437
447
  * marquee surface (e.g. the Whiteboard) when one exists, else on Activity.
@@ -457,23 +467,28 @@ export class RealtimeSurfaceTabsComponent {
457
467
  }, RealtimeSurfaceTabsComponent.FlashDurationMs);
458
468
  }
459
469
  static ɵfac = function RealtimeSurfaceTabsComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || RealtimeSurfaceTabsComponent)(); };
460
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RealtimeSurfaceTabsComponent, selectors: [["mj-realtime-surface-tabs"]], inputs: { State: "State", DevMode: "DevMode", Fill: "Fill", CurrentUser: "CurrentUser", EnvironmentID: "EnvironmentID" }, outputs: { OpenRunRequested: "OpenRunRequested", CollapsedChange: "CollapsedChange", WideChanged: "WideChanged" }, decls: 3, vars: 5, consts: [["aria-label", "Session surfaces", 1, "surface"], [1, "surface__strip"], ["type", "button", "title", "Show session panel", "aria-expanded", "false", 1, "surface__toggle", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-chevron-left"], ["aria-hidden", "true", "title", "Session activity", 1, "fa-solid", "fa-list-check", "surface__strip-icon"], ["role", "tablist", 1, "surface-tabs"], ["type", "button", "role", "tab", 1, "s-tab", 3, "s-tab--active", "s-tab--flash", "s-tab--unseen", "title"], [1, "tabs-end"], ["type", "button", "title", "Hide session panel", "aria-expanded", "true", 1, "surface__toggle", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-chevron-right"], ["role", "tabpanel", 1, "s-pane", 3, "s-pane--active"], ["type", "button", "role", "tab", 1, "s-tab", 3, "click", "title"], ["aria-hidden", "true"], [1, "s-tab__title"], ["aria-hidden", "true", 1, "s-tab__unseen-dot"], ["role", "tabpanel", 1, "s-pane"], [3, "State", "DevMode", "Embedded"], [3, "OpenRunRequested", "OpenArtifactRequested", "State", "DevMode", "Embedded"], [1, "artifact-pane"], [3, "artifactId", "currentUser", "environmentId", "showHeader", "showTabs", "showSaveToCollection", "showCloseButton", "showMaximizeButton"], [3, "ngTemplateOutlet"], ["role", "status", 1, "channel-placeholder"], [3, "Plugin"], [3, "Content"], [3, "Dismissed", "Content"], ["aria-hidden", "true", 1, "fa-solid", "fa-chalkboard"]], template: function RealtimeSurfaceTabsComponent_Template(rf, ctx) { if (rf & 1) {
470
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RealtimeSurfaceTabsComponent, selectors: [["mj-realtime-surface-tabs"]], viewQuery: function RealtimeSurfaceTabsComponent_Query(rf, ctx) { if (rf & 1) {
471
+ i0.ɵɵviewQuery(RealtimeActivityRailComponent, 5);
472
+ } if (rf & 2) {
473
+ let _t;
474
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.activityRail = _t.first);
475
+ } }, inputs: { State: "State", DevMode: "DevMode", Fill: "Fill", CurrentUser: "CurrentUser", EnvironmentID: "EnvironmentID", ExtraArtifacts: "ExtraArtifacts", ShowActivityTab: "ShowActivityTab" }, outputs: { OpenRunRequested: "OpenRunRequested", CollapsedChange: "CollapsedChange", WideChanged: "WideChanged" }, decls: 3, vars: 5, consts: [["aria-label", "Session surfaces", 1, "surface"], [1, "surface__strip"], ["type", "button", "title", "Show session panel", "aria-expanded", "false", 1, "surface__toggle", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-chevron-left"], ["aria-hidden", "true", "title", "Session activity", 1, "fa-solid", "fa-wave-square", "surface__strip-icon"], ["role", "tablist", 1, "surface-tabs"], [1, "tabs-end"], ["type", "button", "title", "Hide session panel", "aria-expanded", "true", 1, "surface__toggle", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-chevron-right"], ["role", "tabpanel", 1, "s-pane", 3, "s-pane--active"], ["role", "status", 1, "surface__empty"], ["aria-hidden", "true", 1, "tabs-spacer"], ["type", "button", "role", "tab", 1, "s-tab", 3, "click", "title"], ["aria-hidden", "true", 1, "s-tab__dot"], ["aria-hidden", "true"], [1, "s-tab__title"], ["aria-hidden", "true", 1, "s-tab__badge"], ["role", "tabpanel", 1, "s-pane"], [3, "State", "DevMode", "Embedded", "CurrentUser", "EnvironmentID", "ExtraArtifacts"], [3, "OpenRunRequested", "State", "DevMode", "Embedded", "CurrentUser", "EnvironmentID", "ExtraArtifacts"], [3, "ngTemplateOutlet"], ["role", "status", 1, "channel-placeholder"], [3, "Plugin"], [3, "Content"], [3, "Dismissed", "Content"], ["aria-hidden", "true", 1, "fa-solid", "fa-chalkboard"], ["aria-hidden", "true", 1, "fa-solid", "fa-wave-square"]], template: function RealtimeSurfaceTabsComponent_Template(rf, ctx) { if (rf & 1) {
461
476
  i0.ɵɵelementStart(0, "aside", 0);
462
- i0.ɵɵconditionalCreate(1, RealtimeSurfaceTabsComponent_Conditional_1_Template, 4, 0, "div", 1)(2, RealtimeSurfaceTabsComponent_Conditional_2_Template, 8, 0);
477
+ i0.ɵɵconditionalCreate(1, RealtimeSurfaceTabsComponent_Conditional_1_Template, 4, 0, "div", 1)(2, RealtimeSurfaceTabsComponent_Conditional_2_Template, 9, 1);
463
478
  i0.ɵɵelementEnd();
464
479
  } if (rf & 2) {
465
480
  i0.ɵɵclassProp("surface--collapsed", ctx.Collapsed)("surface--fill", ctx.Fill && !ctx.Collapsed);
466
481
  i0.ɵɵadvance();
467
482
  i0.ɵɵconditional(ctx.Collapsed ? 1 : 2);
468
- } }, dependencies: [CommonModule, i1.NgTemplateOutlet, ArtifactsModule, i2.ArtifactViewerPanelComponent, RealtimeActivityRailComponent, RealtimeChannelPaneComponent,
469
- ChannelOnboardingPanelComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n \n\n --sage: var(--mj-color-violet-400, #a78bfa);\n --sage-bg: color-mix(in srgb, var(--mj-color-violet-400, #a78bfa) 10%, transparent);\n --sage-border: color-mix(in srgb, var(--mj-color-violet-400, #a78bfa) 38%, transparent);\n}\n\n\n\n\n.surface[_ngcontent-%COMP%] {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n\n.surface--fill[_ngcontent-%COMP%] {\n width: 100%;\n border-left: none;\n}\n.surface--collapsed[_ngcontent-%COMP%] {\n width: 40px;\n background: var(--mj-bg-surface-card);\n}\n\n\n\n.surface__strip[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 10px 0;\n}\n.surface__strip-icon[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.surface__toggle[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n display: grid;\n place-items: center;\n background: transparent;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n color: var(--mj-text-muted);\n cursor: pointer;\n flex-shrink: 0;\n font-size: 10px;\n transition: color 140ms ease, border-color 140ms ease;\n}\n.surface__toggle[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.surface-tabs[_ngcontent-%COMP%] {\n display: flex;\n align-items: stretch;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n overflow-x: auto;\n scrollbar-width: none;\n}\n.surface-tabs[_ngcontent-%COMP%]::-webkit-scrollbar {\n display: none;\n}\n\n\n\n\n\n\n.s-tab[_ngcontent-%COMP%] {\n padding: 10px 14px;\n border: 0;\n background: transparent;\n cursor: pointer;\n font-family: inherit;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n display: inline-flex;\n align-items: center;\n gap: 7px;\n border-bottom: 3px solid transparent;\n transition: color 150ms ease, border-color 150ms ease, background 150ms ease;\n white-space: nowrap;\n flex: 0 1 auto;\n min-width: calc(11px + 7px + 8ch + 28px); \n\n}\n.s-tab[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n flex-shrink: 0;\n}\n.s-tab__title[_ngcontent-%COMP%] {\n max-width: 24ch;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n}\n.s-tab[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n.s-tab--active[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n border-bottom-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n \n\n flex-shrink: 0;\n}\n\n\n\n.s-tab--flash[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_tab-flash 1.4s ease;\n}\n@keyframes _ngcontent-%COMP%_tab-flash {\n 0% {\n background: color-mix(in srgb, var(--sage) 28%, transparent);\n border-bottom-color: var(--sage);\n color: var(--mj-text-primary);\n }\n 60% {\n background: color-mix(in srgb, var(--sage) 16%, transparent);\n border-bottom-color: var(--sage);\n }\n 100% {\n background: var(--mj-bg-surface);\n }\n}\n\n\n\n\n.s-tab--unseen[_ngcontent-%COMP%] {\n color: var(--mj-color-violet-300, var(--mj-text-secondary));\n animation: _ngcontent-%COMP%_tab-unseen 2.2s ease-in-out infinite;\n}\n@keyframes _ngcontent-%COMP%_tab-unseen {\n 0%, 100% { background: color-mix(in srgb, var(--sage) 6%, transparent); }\n 50% { background: color-mix(in srgb, var(--sage) 18%, transparent); }\n}\n.s-tab__unseen-dot[_ngcontent-%COMP%] {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n flex-shrink: 0;\n background: var(--sage);\n box-shadow: 0 0 6px var(--sage);\n}\n\n.tabs-end[_ngcontent-%COMP%] {\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 8px;\n flex-shrink: 0;\n}\n\n\n\n.s-pane[_ngcontent-%COMP%] {\n display: none;\n flex: 1;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n \n\n position: relative;\n}\n.s-pane--active[_ngcontent-%COMP%] {\n display: flex;\n}\n\n\n\n.artifact-pane[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.artifact-pane[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n}\n\n\n\n.channel-placeholder[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n color: var(--mj-text-muted);\n font-size: 12.5px;\n font-weight: 600;\n padding: 24px;\n text-align: center;\n}\n.channel-placeholder[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 22px;\n color: var(--sage);\n opacity: 0.7;\n}\n\n\n\n@media (max-width: 860px) {\n .surface[_ngcontent-%COMP%] {\n display: none;\n }\n}"] });
483
+ } }, dependencies: [CommonModule, i1.NgTemplateOutlet, ArtifactsModule, RealtimeActivityRailComponent, RealtimeChannelPaneComponent,
484
+ ChannelOnboardingPanelComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n \n\n --activity-accent: var(--mj-color-violet-400, #a78bfa);\n --activity-accent-bg: color-mix(in srgb, var(--mj-color-violet-400, #a78bfa) 12%, transparent);\n --activity-accent-border: color-mix(in srgb, var(--mj-color-violet-400, #a78bfa) 38%, transparent);\n \n\n --tab-accent: var(--mj-brand-primary);\n}\n\n\n\n\n.surface[_ngcontent-%COMP%] {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n\n.surface--fill[_ngcontent-%COMP%] {\n width: 100%;\n border-left: none;\n}\n.surface--collapsed[_ngcontent-%COMP%] {\n width: 40px;\n background: var(--mj-bg-surface-card);\n}\n\n\n\n.surface__strip[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 10px 0;\n}\n.surface__strip-icon[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.surface__toggle[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n display: grid;\n place-items: center;\n background: transparent;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n color: var(--mj-text-muted);\n cursor: pointer;\n flex-shrink: 0;\n font-size: 10px;\n transition: color 140ms ease, border-color 140ms ease;\n}\n.surface__toggle[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.surface-tabs[_ngcontent-%COMP%] {\n display: flex;\n align-items: stretch;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n overflow-x: auto;\n scrollbar-width: none;\n}\n.surface-tabs[_ngcontent-%COMP%]::-webkit-scrollbar {\n display: none;\n}\n\n\n\n.tabs-spacer[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n min-width: 12px;\n}\n\n\n\n\n.s-tab[_ngcontent-%COMP%] {\n position: relative;\n padding: 10px 14px;\n border: 0;\n background: transparent;\n cursor: pointer;\n font-family: inherit;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n display: inline-flex;\n align-items: center;\n gap: 7px;\n border-bottom: 3px solid transparent;\n transition: color 150ms ease, border-color 150ms ease, background 150ms ease;\n white-space: nowrap;\n flex: 0 1 auto;\n min-width: calc(11px + 7px + 8ch + 28px); \n\n}\n.s-tab[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n flex-shrink: 0;\n}\n.s-tab__title[_ngcontent-%COMP%] {\n max-width: 22ch;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n}\n.s-tab[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.s-tab__dot[_ngcontent-%COMP%] {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n background: var(--tab-accent);\n}\n\n\n\n.s-tab--active[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n.s-tab--channel.s-tab--active[_ngcontent-%COMP%] {\n border-bottom-color: var(--tab-accent);\n}\n.s-tab--channel.s-tab--active[_ngcontent-%COMP%] .s-tab__dot[_ngcontent-%COMP%] {\n box-shadow: 0 0 6px var(--tab-accent);\n}\n.s-tab--channel.s-tab--active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--tab-accent);\n}\n\n\n\n.s-tab--activity[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n.s-tab--activity[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--activity-accent);\n}\n.s-tab--activity.s-tab--active[_ngcontent-%COMP%] {\n border-bottom-color: var(--activity-accent);\n background: var(--activity-accent-bg);\n color: var(--mj-text-primary);\n}\n.s-tab__badge[_ngcontent-%COMP%] {\n display: inline-grid;\n place-items: center;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: var(--mj-radius-full, 9999px);\n background: var(--activity-accent);\n color: var(--mj-text-inverse);\n font-size: 9.5px;\n font-weight: 800;\n line-height: 1;\n flex-shrink: 0;\n}\n\n\n\n.s-tab--flash[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_tab-flash 1.4s ease;\n}\n@keyframes _ngcontent-%COMP%_tab-flash {\n 0% {\n background: color-mix(in srgb, var(--tab-accent) 30%, transparent);\n border-bottom-color: var(--tab-accent);\n color: var(--mj-text-primary);\n }\n 60% {\n background: color-mix(in srgb, var(--tab-accent) 16%, transparent);\n border-bottom-color: var(--tab-accent);\n }\n 100% {\n background: var(--mj-bg-surface);\n }\n}\n@media (prefers-reduced-motion: reduce) {\n .s-tab--flash[_ngcontent-%COMP%] {\n animation: none;\n background: color-mix(in srgb, var(--tab-accent) 18%, transparent);\n }\n}\n\n.tabs-end[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 8px;\n flex-shrink: 0;\n}\n\n\n\n.s-pane[_ngcontent-%COMP%] {\n display: none;\n flex: 1;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n \n\n position: relative;\n}\n.s-pane--active[_ngcontent-%COMP%] {\n display: flex;\n}\n\n\n\n.surface__empty[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n color: var(--mj-text-muted);\n font-size: 12px;\n font-weight: 500;\n padding: 24px;\n text-align: center;\n}\n.surface__empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: var(--activity-accent);\n opacity: 0.6;\n}\n\n\n\n.channel-placeholder[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n color: var(--mj-text-muted);\n font-size: 12.5px;\n font-weight: 600;\n padding: 24px;\n text-align: center;\n}\n.channel-placeholder[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 22px;\n color: var(--tab-accent);\n opacity: 0.7;\n}\n\n\n\n@media (max-width: 860px) {\n .surface[_ngcontent-%COMP%] {\n display: none;\n }\n}"] });
470
485
  }
471
486
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RealtimeSurfaceTabsComponent, [{
472
487
  type: Component,
473
488
  args: [{ standalone: true, selector: 'mj-realtime-surface-tabs', imports: [
474
489
  CommonModule, ArtifactsModule, RealtimeActivityRailComponent, RealtimeChannelPaneComponent,
475
490
  ChannelOnboardingPanelComponent
476
- ], template: "<!-- SIZING IS EXTERNAL: the overlay hosts this panel inside a fixed-width flex item and\n owns its width (drag, persistence, default tiers) \u2014 the panel just fills it. -->\n<aside class=\"surface\"\n [class.surface--collapsed]=\"Collapsed\"\n [class.surface--fill]=\"Fill && !Collapsed\"\n aria-label=\"Session surfaces\">\n\n @if (Collapsed) {\n <!-- Slim strip: the panel's collapse target (lifted from the old rail behavior) -->\n <div class=\"surface__strip\">\n <button type=\"button\"\n class=\"surface__toggle\"\n (click)=\"ToggleCollapsed()\"\n title=\"Show session panel\"\n aria-expanded=\"false\">\n <i class=\"fa-solid fa-chevron-left\" aria-hidden=\"true\"></i>\n </button>\n <i class=\"fa-solid fa-list-check surface__strip-icon\" aria-hidden=\"true\" title=\"Session activity\"></i>\n </div>\n } @else {\n <!-- Tab strip: Activity | artifact tabs\u2026 | channel tabs\u2026 -->\n <div class=\"surface-tabs\" role=\"tablist\">\n @for (tab of Model.Tabs; track TrackTab($index, tab)) {\n <button type=\"button\"\n class=\"s-tab\"\n role=\"tab\"\n [class.s-tab--active]=\"tab.Key === Model.ActiveKey\"\n [class.s-tab--flash]=\"tab.Key === Model.FlashKey\"\n [class.s-tab--unseen]=\"Model.IsUnseen(tab.Key)\"\n [attr.aria-selected]=\"tab.Key === Model.ActiveKey\"\n [title]=\"Model.IsUnseen(tab.Key) ? tab.Title + ' (new)' : tab.Title\"\n (click)=\"Model.Focus(tab.Key)\">\n <i [class]=\"tab.Icon\" aria-hidden=\"true\"></i>\n <span class=\"s-tab__title\">{{ tab.Title }}</span>\n @if (Model.IsUnseen(tab.Key)) {\n <span class=\"s-tab__unseen-dot\" aria-hidden=\"true\"></span>\n }\n </button>\n }\n <div class=\"tabs-end\">\n <button type=\"button\"\n class=\"surface__toggle\"\n (click)=\"ToggleCollapsed()\"\n title=\"Hide session panel\"\n aria-expanded=\"true\">\n <i class=\"fa-solid fa-chevron-right\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <!-- Panes: ALL kept alive; only the active one is displayed (mirrors the mockup) -->\n @for (tab of Model.Tabs; track TrackTab($index, tab)) {\n <div class=\"s-pane\" [class.s-pane--active]=\"tab.Key === Model.ActiveKey\" role=\"tabpanel\">\n @switch (tab.Kind) {\n @case ('activity') {\n <mj-realtime-activity-rail\n [State]=\"State\"\n [DevMode]=\"DevMode\"\n [Embedded]=\"true\"\n (OpenRunRequested)=\"OpenRunRequested.emit($event)\"\n (OpenArtifactRequested)=\"FocusArtifact($event)\">\n </mj-realtime-activity-rail>\n }\n @case ('artifact') {\n @if (tab.Data?.Artifact; as artifact) {\n <div class=\"artifact-pane\">\n <mj-artifact-viewer-panel\n [artifactId]=\"artifact.ArtifactID\"\n [currentUser]=\"CurrentUser!\"\n [environmentId]=\"EnvironmentID\"\n [showHeader]=\"false\"\n [showTabs]=\"false\"\n [showSaveToCollection]=\"false\"\n [showCloseButton]=\"false\"\n [showMaximizeButton]=\"false\">\n </mj-artifact-viewer-panel>\n </div>\n }\n }\n @case ('channel') {\n @if (tab.Data?.Plugin; as plugin) {\n <!-- Registry-resolved channel: the pane host creates the plugin's surface\n component dynamically and hands the instance back for binding -->\n <mj-realtime-channel-pane [Plugin]=\"plugin\"></mj-realtime-channel-pane>\n <!-- First-run intro: overlaid over the active channel pane the first time this user\n opens it; the pane host renders display:none + a sibling surface, so the overlay\n sits here (inside the positioned .s-pane) rather than inside the pane host. -->\n @if (tab.Key === Model.ActiveKey && OnboardingContent) {\n <mj-channel-onboarding-panel\n [Content]=\"OnboardingContent\"\n (Dismissed)=\"DismissOnboarding()\">\n </mj-channel-onboarding-panel>\n }\n } @else if (tab.Data?.Content; as content) {\n <ng-container [ngTemplateOutlet]=\"content\"></ng-container>\n } @else {\n <!-- Placeholder until the channel registration supplies a plugin / template -->\n <div class=\"channel-placeholder\" role=\"status\">\n <i class=\"fa-solid fa-chalkboard\" aria-hidden=\"true\"></i>\n <span>{{ tab.Title }} coming online\u2026</span>\n </div>\n }\n }\n }\n </div>\n }\n }\n</aside>\n", styles: [":host {\n display: block;\n height: 100%;\n /* sage / delegated-agent accent \u2014 same palette the rail + delegation cards use */\n --sage: var(--mj-color-violet-400, #a78bfa);\n --sage-bg: color-mix(in srgb, var(--mj-color-violet-400, #a78bfa) 10%, transparent);\n --sage-border: color-mix(in srgb, var(--mj-color-violet-400, #a78bfa) 38%, transparent);\n}\n\n/* The surface panel fills the overlay's `.call-panel` flex item \u2014 the overlay owns\n the width (user drag via the resize handle, persisted per-user, default tiers). */\n.surface {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n/* Board-focus fill: the panel owns the whole overlay (the main call column is hidden). */\n.surface--fill {\n width: 100%;\n border-left: none;\n}\n.surface--collapsed {\n width: 40px;\n background: var(--mj-bg-surface-card);\n}\n\n/* ---------- collapsed slim strip ---------- */\n.surface__strip {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 10px 0;\n}\n.surface__strip-icon {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.surface__toggle {\n width: 24px;\n height: 24px;\n display: grid;\n place-items: center;\n background: transparent;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n color: var(--mj-text-muted);\n cursor: pointer;\n flex-shrink: 0;\n font-size: 10px;\n transition: color 140ms ease, border-color 140ms ease;\n}\n.surface__toggle:hover {\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* ---------- tab strip (mirrors the whiteboard mockup's .surface-tabs) ---------- */\n.surface-tabs {\n display: flex;\n align-items: stretch;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n overflow-x: auto;\n scrollbar-width: none;\n}\n.surface-tabs::-webkit-scrollbar {\n display: none;\n}\n\n/* Tabs keep their natural width while there's room; when space gets genuinely tight\n they shrink (ellipsizing their titles) down to a readable floor (icon + ~8ch).\n The ACTIVE tab never shrinks \u2014 inactive tabs give way first. Only when everything\n is at its floor does the strip actually overflow (horizontal scroll). */\n.s-tab {\n padding: 10px 14px;\n border: 0;\n background: transparent;\n cursor: pointer;\n font-family: inherit;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n display: inline-flex;\n align-items: center;\n gap: 7px;\n border-bottom: 3px solid transparent;\n transition: color 150ms ease, border-color 150ms ease, background 150ms ease;\n white-space: nowrap;\n flex: 0 1 auto;\n min-width: calc(11px + 7px + 8ch + 28px); /* icon + gap + ~8ch + padding */\n}\n.s-tab i {\n font-size: 11px;\n flex-shrink: 0;\n}\n.s-tab__title {\n max-width: 24ch;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n}\n.s-tab:hover {\n color: var(--mj-text-secondary);\n}\n.s-tab--active {\n color: var(--mj-text-primary);\n border-bottom-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n /* the active tab stays fully readable \u2014 others shrink first */\n flex-shrink: 0;\n}\n\n/* Brief violet flash for a just-arrived artifact tab (per the mockup's accent) */\n.s-tab--flash {\n animation: tab-flash 1.4s ease;\n}\n@keyframes tab-flash {\n 0% {\n background: color-mix(in srgb, var(--sage) 28%, transparent);\n border-bottom-color: var(--sage);\n color: var(--mj-text-primary);\n }\n 60% {\n background: color-mix(in srgb, var(--sage) 16%, transparent);\n border-bottom-color: var(--sage);\n }\n 100% {\n background: var(--mj-bg-surface);\n }\n}\n\n/* PERSISTENT unseen glow: content arrived without stealing focus (e.g. a finished\n artifact) \u2014 the tab breathes violet until the user visits it. */\n.s-tab--unseen {\n color: var(--mj-color-violet-300, var(--mj-text-secondary));\n animation: tab-unseen 2.2s ease-in-out infinite;\n}\n@keyframes tab-unseen {\n 0%, 100% { background: color-mix(in srgb, var(--sage) 6%, transparent); }\n 50% { background: color-mix(in srgb, var(--sage) 18%, transparent); }\n}\n.s-tab__unseen-dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n flex-shrink: 0;\n background: var(--sage);\n box-shadow: 0 0 6px var(--sage);\n}\n\n.tabs-end {\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 8px;\n flex-shrink: 0;\n}\n\n/* ---------- panes: all alive, only the active one displayed ---------- */\n.s-pane {\n display: none;\n flex: 1;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n /* Positioning context for the first-run channel-onboarding overlay (absolute, inset:0). */\n position: relative;\n}\n.s-pane--active {\n display: flex;\n}\n\n/* Read-only embedded artifact viewer fills the pane */\n.artifact-pane {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.artifact-pane > * {\n flex: 1;\n min-height: 0;\n}\n\n/* Channel slot placeholder (\"Whiteboard coming online\u2026\") */\n.channel-placeholder {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n color: var(--mj-text-muted);\n font-size: 12.5px;\n font-weight: 600;\n padding: 24px;\n text-align: center;\n}\n.channel-placeholder i {\n font-size: 22px;\n color: var(--sage);\n opacity: 0.7;\n}\n\n/* On narrow widths the panel stacks out of the way (overlay falls back to single column) */\n@media (max-width: 860px) {\n .surface {\n display: none;\n }\n}\n"] }]
491
+ ], template: "<!-- SIZING IS EXTERNAL: the overlay hosts this panel inside a fixed-width flex item and\n owns its width (drag, persistence, default tiers) \u2014 the panel just fills it. -->\n<aside class=\"surface\"\n [class.surface--collapsed]=\"Collapsed\"\n [class.surface--fill]=\"Fill && !Collapsed\"\n aria-label=\"Session surfaces\">\n\n @if (Collapsed) {\n <!-- Slim strip: the panel's collapse target -->\n <div class=\"surface__strip\">\n <button type=\"button\"\n class=\"surface__toggle\"\n (click)=\"ToggleCollapsed()\"\n title=\"Show session panel\"\n aria-expanded=\"false\">\n <i class=\"fa-solid fa-chevron-left\" aria-hidden=\"true\"></i>\n </button>\n <i class=\"fa-solid fa-wave-square surface__strip-icon\" aria-hidden=\"true\" title=\"Session activity\"></i>\n </div>\n } @else {\n <!-- Tab strip: channel tabs (left cluster) \u2026 | spacer | Activity (right-aligned) -->\n <div class=\"surface-tabs\" role=\"tablist\">\n @for (tab of Model.Tabs; track TrackTab($index, tab)) {\n @if (tab.Kind === 'activity') {\n <!-- Flex spacer pushes the Activity tab to the far right -->\n <span class=\"tabs-spacer\" aria-hidden=\"true\"></span>\n }\n <button type=\"button\"\n class=\"s-tab\"\n role=\"tab\"\n [class.s-tab--activity]=\"tab.Kind === 'activity'\"\n [class.s-tab--channel]=\"tab.Kind === 'channel'\"\n [class.s-tab--active]=\"tab.Key === Model.ActiveKey\"\n [class.s-tab--flash]=\"tab.Key === Model.FlashKey\"\n [style.--tab-accent]=\"tab.Color || null\"\n [attr.aria-selected]=\"tab.Key === Model.ActiveKey\"\n [title]=\"tab.Title\"\n (click)=\"Model.Focus(tab.Key)\">\n @if (tab.Kind === 'channel') {\n <span class=\"s-tab__dot\" aria-hidden=\"true\"></span>\n }\n <i [class]=\"tab.Icon\" aria-hidden=\"true\"></i>\n <span class=\"s-tab__title\">{{ tab.Title }}</span>\n @if (tab.Kind === 'activity' && State.Cards.length > 0) {\n <span class=\"s-tab__badge\" aria-hidden=\"true\">{{ State.Cards.length }}</span>\n }\n </button>\n }\n <div class=\"tabs-end\">\n <button type=\"button\"\n class=\"surface__toggle\"\n (click)=\"ToggleCollapsed()\"\n title=\"Hide session panel\"\n aria-expanded=\"true\">\n <i class=\"fa-solid fa-chevron-right\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <!-- Panes: ALL kept alive; only the active one is displayed -->\n @for (tab of Model.Tabs; track TrackTab($index, tab)) {\n <div class=\"s-pane\" [class.s-pane--active]=\"tab.Key === Model.ActiveKey\" role=\"tabpanel\">\n @switch (tab.Kind) {\n @case ('activity') {\n <mj-realtime-activity-rail\n [State]=\"State\"\n [DevMode]=\"DevMode\"\n [Embedded]=\"true\"\n [CurrentUser]=\"CurrentUser\"\n [EnvironmentID]=\"EnvironmentID\"\n [ExtraArtifacts]=\"ExtraArtifacts\"\n (OpenRunRequested)=\"OpenRunRequested.emit($event)\">\n </mj-realtime-activity-rail>\n }\n @case ('channel') {\n @if (tab.Data?.Plugin; as plugin) {\n <!-- Registry-resolved channel: the pane host creates the plugin's surface\n component dynamically and hands the instance back for binding -->\n <mj-realtime-channel-pane [Plugin]=\"plugin\"></mj-realtime-channel-pane>\n <!-- First-run intro: overlaid over the active channel pane the first time this user\n opens it; the pane host renders display:none + a sibling surface, so the overlay\n sits here (inside the positioned .s-pane) rather than inside the pane host. -->\n @if (tab.Key === Model.ActiveKey && OnboardingContent) {\n <mj-channel-onboarding-panel\n [Content]=\"OnboardingContent\"\n (Dismissed)=\"DismissOnboarding()\">\n </mj-channel-onboarding-panel>\n }\n } @else if (tab.Data?.Content; as content) {\n <ng-container [ngTemplateOutlet]=\"content\"></ng-container>\n } @else {\n <!-- Placeholder until the channel registration supplies a plugin / template -->\n <div class=\"channel-placeholder\" role=\"status\">\n <i class=\"fa-solid fa-chalkboard\" aria-hidden=\"true\"></i>\n <span>{{ tab.Title }} coming online\u2026</span>\n </div>\n }\n }\n }\n </div>\n }\n\n @if (Model.Tabs.length === 0) {\n <!-- Nothing in play yet (idle voice-first session): a gentle hint, not an empty grid -->\n <div class=\"surface__empty\" role=\"status\">\n <i class=\"fa-solid fa-wave-square\" aria-hidden=\"true\"></i>\n <span>Surfaces appear here as the call gets going.</span>\n </div>\n }\n }\n</aside>\n", styles: [":host {\n display: block;\n height: 100%;\n /* activity accent \u2014 same violet palette the rail + delegation cards use */\n --activity-accent: var(--mj-color-violet-400, #a78bfa);\n --activity-accent-bg: color-mix(in srgb, var(--mj-color-violet-400, #a78bfa) 12%, transparent);\n --activity-accent-border: color-mix(in srgb, var(--mj-color-violet-400, #a78bfa) 38%, transparent);\n /* per-tab accent, set inline per channel ([style.--tab-accent]); falls back to the brand. */\n --tab-accent: var(--mj-brand-primary);\n}\n\n/* The surface panel fills the overlay's `.call-panel` flex item \u2014 the overlay owns\n the width (user drag via the resize handle, persisted per-user, default tiers). */\n.surface {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n/* Board-focus fill: the panel owns the whole overlay (the main call column is hidden). */\n.surface--fill {\n width: 100%;\n border-left: none;\n}\n.surface--collapsed {\n width: 40px;\n background: var(--mj-bg-surface-card);\n}\n\n/* ---------- collapsed slim strip ---------- */\n.surface__strip {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 10px 0;\n}\n.surface__strip-icon {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.surface__toggle {\n width: 24px;\n height: 24px;\n display: grid;\n place-items: center;\n background: transparent;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n color: var(--mj-text-muted);\n cursor: pointer;\n flex-shrink: 0;\n font-size: 10px;\n transition: color 140ms ease, border-color 140ms ease;\n}\n.surface__toggle:hover {\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* ---------- tab strip: channel cluster (left) | spacer | Activity (right) ---------- */\n.surface-tabs {\n display: flex;\n align-items: stretch;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n overflow-x: auto;\n scrollbar-width: none;\n}\n.surface-tabs::-webkit-scrollbar {\n display: none;\n}\n\n/* The flex spacer separates the channel cluster (left) from the Activity tab (right). */\n.tabs-spacer {\n flex: 1 1 auto;\n min-width: 12px;\n}\n\n/* Tabs keep their natural width while there's room; when space gets tight they shrink\n (ellipsizing their titles) down to a readable floor. The ACTIVE tab never shrinks. */\n.s-tab {\n position: relative;\n padding: 10px 14px;\n border: 0;\n background: transparent;\n cursor: pointer;\n font-family: inherit;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n display: inline-flex;\n align-items: center;\n gap: 7px;\n border-bottom: 3px solid transparent;\n transition: color 150ms ease, border-color 150ms ease, background 150ms ease;\n white-space: nowrap;\n flex: 0 1 auto;\n min-width: calc(11px + 7px + 8ch + 28px); /* icon + gap + ~8ch + padding */\n}\n.s-tab i {\n font-size: 11px;\n flex-shrink: 0;\n}\n.s-tab__title {\n max-width: 22ch;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n}\n.s-tab:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n/* Per-channel color dot \u2014 the distinct accent each channel tab carries. */\n.s-tab__dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n background: var(--tab-accent);\n}\n\n/* Active tab: filled background + a colored underline in the tab's own accent. */\n.s-tab--active {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n.s-tab--channel.s-tab--active {\n border-bottom-color: var(--tab-accent);\n}\n.s-tab--channel.s-tab--active .s-tab__dot {\n box-shadow: 0 0 6px var(--tab-accent);\n}\n.s-tab--channel.s-tab--active i {\n color: var(--tab-accent);\n}\n\n/* ---------- the Activity tab (right-aligned, distinct accent + pulse icon) ---------- */\n.s-tab--activity {\n color: var(--mj-text-secondary);\n}\n.s-tab--activity i {\n color: var(--activity-accent);\n}\n.s-tab--activity.s-tab--active {\n border-bottom-color: var(--activity-accent);\n background: var(--activity-accent-bg);\n color: var(--mj-text-primary);\n}\n.s-tab__badge {\n display: inline-grid;\n place-items: center;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: var(--mj-radius-full, 9999px);\n background: var(--activity-accent);\n color: var(--mj-text-inverse);\n font-size: 9.5px;\n font-weight: 800;\n line-height: 1;\n flex-shrink: 0;\n}\n\n/* Brief flash for a just-revealed channel tab (the agent first acted on it). */\n.s-tab--flash {\n animation: tab-flash 1.4s ease;\n}\n@keyframes tab-flash {\n 0% {\n background: color-mix(in srgb, var(--tab-accent) 30%, transparent);\n border-bottom-color: var(--tab-accent);\n color: var(--mj-text-primary);\n }\n 60% {\n background: color-mix(in srgb, var(--tab-accent) 16%, transparent);\n border-bottom-color: var(--tab-accent);\n }\n 100% {\n background: var(--mj-bg-surface);\n }\n}\n@media (prefers-reduced-motion: reduce) {\n .s-tab--flash {\n animation: none;\n background: color-mix(in srgb, var(--tab-accent) 18%, transparent);\n }\n}\n\n.tabs-end {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 8px;\n flex-shrink: 0;\n}\n\n/* ---------- panes: all alive, only the active one displayed ---------- */\n.s-pane {\n display: none;\n flex: 1;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n /* Positioning context for the first-run channel-onboarding overlay (absolute, inset:0). */\n position: relative;\n}\n.s-pane--active {\n display: flex;\n}\n\n/* Empty strip (idle voice-first session): a gentle hint rather than a bare grid. */\n.surface__empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n color: var(--mj-text-muted);\n font-size: 12px;\n font-weight: 500;\n padding: 24px;\n text-align: center;\n}\n.surface__empty i {\n font-size: 20px;\n color: var(--activity-accent);\n opacity: 0.6;\n}\n\n/* Channel slot placeholder (\"Whiteboard coming online\u2026\") */\n.channel-placeholder {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n color: var(--mj-text-muted);\n font-size: 12.5px;\n font-weight: 600;\n padding: 24px;\n text-align: center;\n}\n.channel-placeholder i {\n font-size: 22px;\n color: var(--tab-accent);\n opacity: 0.7;\n}\n\n/* On narrow widths the panel stacks out of the way (overlay falls back to single column) */\n@media (max-width: 860px) {\n .surface {\n display: none;\n }\n}\n"] }]
477
492
  }], null, { State: [{
478
493
  type: Input,
479
494
  args: [{ required: true }]
@@ -485,12 +500,19 @@ export class RealtimeSurfaceTabsComponent {
485
500
  type: Input
486
501
  }], EnvironmentID: [{
487
502
  type: Input
503
+ }], ExtraArtifacts: [{
504
+ type: Input
505
+ }], ShowActivityTab: [{
506
+ type: Input
488
507
  }], OpenRunRequested: [{
489
508
  type: Output
490
509
  }], CollapsedChange: [{
491
510
  type: Output
492
511
  }], WideChanged: [{
493
512
  type: Output
513
+ }], activityRail: [{
514
+ type: ViewChild,
515
+ args: [RealtimeActivityRailComponent]
494
516
  }] }); })();
495
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RealtimeSurfaceTabsComponent, { className: "RealtimeSurfaceTabsComponent", filePath: "src/lib/components/realtime/realtime-surface-tabs.component.ts", lineNumber: 66 }); })();
517
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RealtimeSurfaceTabsComponent, { className: "RealtimeSurfaceTabsComponent", filePath: "src/lib/components/realtime/realtime-surface-tabs.component.ts", lineNumber: 62 }); })();
496
518
  //# sourceMappingURL=realtime-surface-tabs.component.js.map