@acorex/components 21.0.2-next.20 → 21.0.2-next.22

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.
@@ -6043,6 +6043,17 @@ class AXComposerService {
6043
6043
  this._replyMessage.set(null);
6044
6044
  this._editMessage.set(null);
6045
6045
  }
6046
+ /**
6047
+ * Persist draft for the previous conversation and reset composer UI state when switching conversations.
6048
+ */
6049
+ onConversationChanged(previousConversationId, currentConversationId) {
6050
+ if (previousConversationId && previousConversationId !== currentConversationId && !this.editMessage()) {
6051
+ this.saveDraft(previousConversationId, this.draftText());
6052
+ }
6053
+ this.clear();
6054
+ this.attachments.set([]);
6055
+ this.draftText.set(currentConversationId ? this.loadDraft(currentConversationId) : '');
6056
+ }
6046
6057
  async sendTypingIndicator(conversationId) {
6047
6058
  await this.conversationService.sendTypingIndicator(conversationId);
6048
6059
  }
@@ -9021,8 +9032,8 @@ class AXVideoPickerComponent {
9021
9032
  mediaId: video.mediaId,
9022
9033
  mimeType: video.file.type,
9023
9034
  size: video.file.size,
9024
- thumbnailUrl: video.preview,
9025
- }, video.duration ?? 0, video.preview));
9035
+ // thumbnailUrl: video.preview,
9036
+ }, video.duration ?? 0));
9026
9037
  if (videos.length === 0) {
9027
9038
  return;
9028
9039
  }
@@ -9172,7 +9183,9 @@ class AXVideoPickerComponent {
9172
9183
  class="ax-cnv-picker__remove"
9173
9184
  (click)="removeVideo($index)"
9174
9185
  [attr.aria-label]="
9175
- video.uploading ? getCancelUploadLabel() : translation.translateSync('@acorex:chat.pickers.common.remove')
9186
+ video.uploading
9187
+ ? getCancelUploadLabel()
9188
+ : translation.translateSync('@acorex:chat.pickers.common.remove')
9176
9189
  "
9177
9190
  >
9178
9191
  <i class="fa-light fa-xmark"></i>
@@ -9287,7 +9300,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
9287
9300
  class="ax-cnv-picker__remove"
9288
9301
  (click)="removeVideo($index)"
9289
9302
  [attr.aria-label]="
9290
- video.uploading ? getCancelUploadLabel() : translation.translateSync('@acorex:chat.pickers.common.remove')
9303
+ video.uploading
9304
+ ? getCancelUploadLabel()
9305
+ : translation.translateSync('@acorex:chat.pickers.common.remove')
9291
9306
  "
9292
9307
  >
9293
9308
  <i class="fa-light fa-xmark"></i>
@@ -11188,7 +11203,8 @@ class AXConversationMessageRendererStateComponent {
11188
11203
  this.hasVisibleChrome = computed(() => this.showSending() || this.showFailed() || this.showContentError(), ...(ngDevMode ? [{ debugName: "hasVisibleChrome" }] : []));
11189
11204
  this.showRetryButton = computed(() => this.showFailed(), ...(ngDevMode ? [{ debugName: "showRetryButton" }] : []));
11190
11205
  this.contentErrorText = computed(() => this.contentErrorLabel() ?? this.translation.translateSync('@acorex:chat.renderer-state.could-not-load-content'), ...(ngDevMode ? [{ debugName: "contentErrorText" }] : []));
11191
- this.deliveryFailedText = computed(() => this.deliveryFailedLabel() ?? this.translation.translateSync('@acorex:chat.renderer-state.could-not-send-message'), ...(ngDevMode ? [{ debugName: "deliveryFailedText" }] : []));
11206
+ this.deliveryFailedText = computed(() => this.deliveryFailedLabel() ??
11207
+ this.translation.translateSync('@acorex:chat.renderer-state.could-not-send-message'), ...(ngDevMode ? [{ debugName: "deliveryFailedText" }] : []));
11192
11208
  }
11193
11209
  async onRetry() {
11194
11210
  const msg = this.message();
@@ -11586,7 +11602,7 @@ class AXAudioAttachmentComponent {
11586
11602
  <span class="ax-cnv-audio__time">{{ durationLabel() }}</span>
11587
11603
  } -->
11588
11604
  </div>
11589
- `, isInline: true, styles: [":host{display:block}.ax-cnv-audio{display:flex;align-items:center;gap:.5rem;width:100%;min-width:18rem;min-height:2.75rem;padding:.5rem .625rem;border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface))}.ax-cnv-audio__icon{flex-shrink:0;width:2rem;height:2rem;display:flex;align-items:center;justify-content:center;border-radius:50%;background:rgba(var(--ax-sys-color-primary-500),.1);color:rgb(var(--ax-sys-color-primary-500));font-size:.875rem}.ax-cnv-audio__main{flex:1;min-width:0;display:flex;flex-direction:column;gap:.25rem}.ax-cnv-audio__title{font-size:.75rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:rgb(var(--ax-sys-color-on-surface))}.ax-cnv-audio__el{width:100%;height:1.75rem}.ax-cnv-audio__time{flex-shrink:0;font-size:.6875rem;font-variant-numeric:tabular-nums;color:rgba(var(--ax-sys-color-on-surface),.65)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11605
+ `, isInline: true, styles: [":host{display:block}.ax-cnv-audio{display:flex;align-items:center;gap:.5rem;width:100%;min-width:22rem;min-height:2.75rem;padding:.5rem .625rem;border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface))}.ax-cnv-audio__icon{flex-shrink:0;width:2rem;height:2rem;display:flex;align-items:center;justify-content:center;border-radius:50%;background:rgba(var(--ax-sys-color-primary-500),.1);color:rgb(var(--ax-sys-color-primary-500));font-size:.875rem}.ax-cnv-audio__main{flex:1;min-width:0;display:flex;flex-direction:column;gap:.25rem}.ax-cnv-audio__title{font-size:.75rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:rgb(var(--ax-sys-color-on-surface))}.ax-cnv-audio__el{width:100%;height:1.75rem}.ax-cnv-audio__time{flex-shrink:0;font-size:.6875rem;font-variant-numeric:tabular-nums;color:rgba(var(--ax-sys-color-on-surface),.65)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11590
11606
  }
11591
11607
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXAudioAttachmentComponent, decorators: [{
11592
11608
  type: Component,
@@ -11613,16 +11629,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
11613
11629
  <span class="ax-cnv-audio__time">{{ durationLabel() }}</span>
11614
11630
  } -->
11615
11631
  </div>
11616
- `, styles: [":host{display:block}.ax-cnv-audio{display:flex;align-items:center;gap:.5rem;width:100%;min-width:18rem;min-height:2.75rem;padding:.5rem .625rem;border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface))}.ax-cnv-audio__icon{flex-shrink:0;width:2rem;height:2rem;display:flex;align-items:center;justify-content:center;border-radius:50%;background:rgba(var(--ax-sys-color-primary-500),.1);color:rgb(var(--ax-sys-color-primary-500));font-size:.875rem}.ax-cnv-audio__main{flex:1;min-width:0;display:flex;flex-direction:column;gap:.25rem}.ax-cnv-audio__title{font-size:.75rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:rgb(var(--ax-sys-color-on-surface))}.ax-cnv-audio__el{width:100%;height:1.75rem}.ax-cnv-audio__time{flex-shrink:0;font-size:.6875rem;font-variant-numeric:tabular-nums;color:rgba(var(--ax-sys-color-on-surface),.65)}\n"] }]
11632
+ `, styles: [":host{display:block}.ax-cnv-audio{display:flex;align-items:center;gap:.5rem;width:100%;min-width:22rem;min-height:2.75rem;padding:.5rem .625rem;border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface))}.ax-cnv-audio__icon{flex-shrink:0;width:2rem;height:2rem;display:flex;align-items:center;justify-content:center;border-radius:50%;background:rgba(var(--ax-sys-color-primary-500),.1);color:rgb(var(--ax-sys-color-primary-500));font-size:.875rem}.ax-cnv-audio__main{flex:1;min-width:0;display:flex;flex-direction:column;gap:.25rem}.ax-cnv-audio__title{font-size:.75rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:rgb(var(--ax-sys-color-on-surface))}.ax-cnv-audio__el{width:100%;height:1.75rem}.ax-cnv-audio__time{flex-shrink:0;font-size:.6875rem;font-variant-numeric:tabular-nums;color:rgba(var(--ax-sys-color-on-surface),.65)}\n"] }]
11617
11633
  }], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }], playingChange: [{ type: i0.Output, args: ["playingChange"] }], timeUpdate: [{ type: i0.Output, args: ["timeUpdate"] }], durationChange: [{ type: i0.Output, args: ["durationChange"] }], playbackEnded: [{ type: i0.Output, args: ["playbackEnded"] }], playbackError: [{ type: i0.Output, args: ["playbackError"] }], audioElementRef: [{ type: i0.ViewChild, args: ['audioElement', { isSignal: true }] }] } });
11618
11634
 
11619
- /** Push playback state to the info-bar banner for a message. */
11620
- function syncPlaybackInfoBarBanner(infoBar, message, inputs, options) {
11621
- const forceOpen = options?.forceOpen ?? false;
11622
- const shouldOpen = forceOpen || inputs.isPlaying || infoBar.isMessageBannerActive(message.id);
11623
- if (!shouldOpen) {
11624
- return;
11625
- }
11635
+ function buildPlaybackBannerPayload(inputs) {
11626
11636
  const payload = {
11627
11637
  title: inputs.title,
11628
11638
  currentTime: inputs.currentTime ?? 0,
@@ -11640,8 +11650,21 @@ function syncPlaybackInfoBarBanner(infoBar, message, inputs, options) {
11640
11650
  if (inputs.showSpeedControl !== undefined) {
11641
11651
  payload['showSpeedControl'] = inputs.showSpeedControl;
11642
11652
  }
11653
+ return payload;
11654
+ }
11655
+ /** Push playback state to the info-bar banner for a message. */
11656
+ function syncPlaybackInfoBarBanner(infoBar, message, inputs, options) {
11657
+ const forceOpen = options?.forceOpen ?? false;
11658
+ const shouldOpen = forceOpen || inputs.isPlaying || infoBar.isMessageBannerActive(message.id);
11659
+ if (!shouldOpen) {
11660
+ return;
11661
+ }
11662
+ const payload = buildPlaybackBannerPayload(inputs);
11663
+ if (infoBar.isMessageBannerActive(message.id)) {
11664
+ infoBar.updateMessageBannerInputs(message.id, payload);
11665
+ return;
11666
+ }
11643
11667
  infoBar.showMessageBanner(message, payload);
11644
- infoBar.updateMessageBannerInputs(message.id, payload);
11645
11668
  }
11646
11669
 
11647
11670
  /**
@@ -11657,21 +11680,6 @@ const RENDERER_SHARED_STYLES = `
11657
11680
  display: flex;
11658
11681
  flex-direction: column;
11659
11682
  gap: 0.375rem;
11660
- max-width: min(100%, 18.5rem);
11661
- }
11662
-
11663
- .ax-cnv-msg--wide {
11664
- max-width: min(100%, 22rem);
11665
- }
11666
-
11667
- @media (min-width: 480px) {
11668
- .ax-cnv-msg {
11669
- max-width: min(100%, 24rem);
11670
- }
11671
-
11672
- .ax-cnv-msg--wide {
11673
- max-width: min(100%, 28rem);
11674
- }
11675
11683
  }
11676
11684
 
11677
11685
  .ax-cnv-msg__stack {
@@ -11703,11 +11711,13 @@ const RENDERER_SHARED_STYLES = `
11703
11711
 
11704
11712
  .ax-cnv-msg__grid--multi {
11705
11713
  grid-template-columns: repeat(3, 1fr);
11714
+ grid-auto-rows: 10rem;
11706
11715
  }
11707
11716
 
11708
11717
  @media (max-width: 380px) {
11709
11718
  .ax-cnv-msg__grid--multi {
11710
11719
  grid-template-columns: repeat(2, 1fr);
11720
+ grid-auto-rows: 10rem;
11711
11721
  }
11712
11722
  }
11713
11723
 
@@ -11720,6 +11730,30 @@ const RENDERER_SHARED_STYLES = `
11720
11730
  opacity: 0.88;
11721
11731
  }
11722
11732
 
11733
+ /* Flush layout: media fills the message bubble edge-to-edge (image / video). */
11734
+ .ax-cnv-msg--flush {
11735
+ width: 100%;
11736
+ max-width: 100%;
11737
+ gap: 0;
11738
+ }
11739
+
11740
+ .ax-cnv-msg--flush .ax-cnv-msg__caption {
11741
+ padding: 0.375rem 0.625rem 0;
11742
+ }
11743
+
11744
+ .ax-cnv-msg--flush .ax-cnv-msg__grid {
11745
+ border-radius: 0;
11746
+ background: transparent;
11747
+ }
11748
+
11749
+ .ax-cnv-msg--flush .ax-cnv-msg__stack {
11750
+ gap: 2px;
11751
+ }
11752
+
11753
+ .ax-cnv-msg--flush ::ng-deep .ax-cnv-video {
11754
+ border-radius: 0;
11755
+ }
11756
+
11723
11757
  .ax-cnv-msg__card {
11724
11758
  border-radius: var(--ax-sys-border-radius, 0.5rem);
11725
11759
  border: 1px solid rgb(var(--ax-sys-color-border-light-surface));
@@ -11840,7 +11874,7 @@ class AXAudioRendererComponent {
11840
11874
  <p class="ax-cnv-msg__caption">{{ caption() }}</p>
11841
11875
  }
11842
11876
  </div>
11843
- `, isInline: true, styles: [":host{display:block;max-width:100%}.ax-cnv-msg{display:flex;flex-direction:column;gap:.375rem;max-width:min(100%,18.5rem)}.ax-cnv-msg--wide{max-width:min(100%,22rem)}@media(min-width:480px){.ax-cnv-msg{max-width:min(100%,24rem)}.ax-cnv-msg--wide{max-width:min(100%,28rem)}}.ax-cnv-msg__stack{display:flex;flex-direction:column;gap:.375rem}.ax-cnv-msg__grid{display:grid;gap:2px;width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-border-light-surface))}.ax-cnv-msg__grid--single{grid-template-columns:1fr}.ax-cnv-msg__grid--single ::ng-deep .ax-cnv-image-attachment{max-height:min(50dvh,20rem)}.ax-cnv-msg__grid--dual{grid-template-columns:repeat(2,1fr)}.ax-cnv-msg__grid--multi{grid-template-columns:repeat(3,1fr)}@media(max-width:380px){.ax-cnv-msg__grid--multi{grid-template-columns:repeat(2,1fr)}}.ax-cnv-msg__caption{margin:0;padding:0 .125rem;font-size:.8125rem;line-height:1.4;word-break:break-word;opacity:.88}.ax-cnv-msg__card{border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface));overflow:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXAudioAttachmentComponent, selector: "ax-cnv-audio-attachment", inputs: ["item"], outputs: ["playingChange", "timeUpdate", "durationChange", "playbackEnded", "playbackError"] }, { kind: "component", type: AXConversationMessageRendererStateComponent, selector: "ax-conversation-message-renderer-state", inputs: ["rendererState", "message", "contentErrorLabel", "deliveryFailedLabel", "showContentErrorChrome", "contentErrorStyle", "contentErrorIconClass", "placement", "contentRetryEnabled"], outputs: ["contentRetry"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11877
+ `, isInline: true, styles: [":host{display:block;max-width:100%}.ax-cnv-msg,.ax-cnv-msg__stack{display:flex;flex-direction:column;gap:.375rem}.ax-cnv-msg__grid{display:grid;gap:2px;width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-border-light-surface))}.ax-cnv-msg__grid--single{grid-template-columns:1fr}.ax-cnv-msg__grid--single ::ng-deep .ax-cnv-image-attachment{max-height:min(50dvh,20rem)}.ax-cnv-msg__grid--dual{grid-template-columns:repeat(2,1fr)}.ax-cnv-msg__grid--multi{grid-template-columns:repeat(3,1fr);grid-auto-rows:10rem}@media(max-width:380px){.ax-cnv-msg__grid--multi{grid-template-columns:repeat(2,1fr);grid-auto-rows:10rem}}.ax-cnv-msg__caption{margin:0;padding:0 .125rem;font-size:.8125rem;line-height:1.4;word-break:break-word;opacity:.88}.ax-cnv-msg--flush{width:100%;max-width:100%;gap:0}.ax-cnv-msg--flush .ax-cnv-msg__caption{padding:.375rem .625rem 0}.ax-cnv-msg--flush .ax-cnv-msg__grid{border-radius:0;background:transparent}.ax-cnv-msg--flush .ax-cnv-msg__stack{gap:2px}.ax-cnv-msg--flush ::ng-deep .ax-cnv-video{border-radius:0}.ax-cnv-msg__card{border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface));overflow:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXAudioAttachmentComponent, selector: "ax-cnv-audio-attachment", inputs: ["item"], outputs: ["playingChange", "timeUpdate", "durationChange", "playbackEnded", "playbackError"] }, { kind: "component", type: AXConversationMessageRendererStateComponent, selector: "ax-conversation-message-renderer-state", inputs: ["rendererState", "message", "contentErrorLabel", "deliveryFailedLabel", "showContentErrorChrome", "contentErrorStyle", "contentErrorIconClass", "placement", "contentRetryEnabled"], outputs: ["contentRetry"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11844
11878
  }
11845
11879
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXAudioRendererComponent, decorators: [{
11846
11880
  type: Component,
@@ -11863,7 +11897,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
11863
11897
  <p class="ax-cnv-msg__caption">{{ caption() }}</p>
11864
11898
  }
11865
11899
  </div>
11866
- `, styles: [":host{display:block;max-width:100%}.ax-cnv-msg{display:flex;flex-direction:column;gap:.375rem;max-width:min(100%,18.5rem)}.ax-cnv-msg--wide{max-width:min(100%,22rem)}@media(min-width:480px){.ax-cnv-msg{max-width:min(100%,24rem)}.ax-cnv-msg--wide{max-width:min(100%,28rem)}}.ax-cnv-msg__stack{display:flex;flex-direction:column;gap:.375rem}.ax-cnv-msg__grid{display:grid;gap:2px;width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-border-light-surface))}.ax-cnv-msg__grid--single{grid-template-columns:1fr}.ax-cnv-msg__grid--single ::ng-deep .ax-cnv-image-attachment{max-height:min(50dvh,20rem)}.ax-cnv-msg__grid--dual{grid-template-columns:repeat(2,1fr)}.ax-cnv-msg__grid--multi{grid-template-columns:repeat(3,1fr)}@media(max-width:380px){.ax-cnv-msg__grid--multi{grid-template-columns:repeat(2,1fr)}}.ax-cnv-msg__caption{margin:0;padding:0 .125rem;font-size:.8125rem;line-height:1.4;word-break:break-word;opacity:.88}.ax-cnv-msg__card{border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface));overflow:hidden}\n"] }]
11900
+ `, styles: [":host{display:block;max-width:100%}.ax-cnv-msg,.ax-cnv-msg__stack{display:flex;flex-direction:column;gap:.375rem}.ax-cnv-msg__grid{display:grid;gap:2px;width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-border-light-surface))}.ax-cnv-msg__grid--single{grid-template-columns:1fr}.ax-cnv-msg__grid--single ::ng-deep .ax-cnv-image-attachment{max-height:min(50dvh,20rem)}.ax-cnv-msg__grid--dual{grid-template-columns:repeat(2,1fr)}.ax-cnv-msg__grid--multi{grid-template-columns:repeat(3,1fr);grid-auto-rows:10rem}@media(max-width:380px){.ax-cnv-msg__grid--multi{grid-template-columns:repeat(2,1fr);grid-auto-rows:10rem}}.ax-cnv-msg__caption{margin:0;padding:0 .125rem;font-size:.8125rem;line-height:1.4;word-break:break-word;opacity:.88}.ax-cnv-msg--flush{width:100%;max-width:100%;gap:0}.ax-cnv-msg--flush .ax-cnv-msg__caption{padding:.375rem .625rem 0}.ax-cnv-msg--flush .ax-cnv-msg__grid{border-radius:0;background:transparent}.ax-cnv-msg--flush .ax-cnv-msg__stack{gap:2px}.ax-cnv-msg--flush ::ng-deep .ax-cnv-video{border-radius:0}.ax-cnv-msg__card{border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface));overflow:hidden}\n"] }]
11867
11901
  }], ctorParameters: () => [], propDecorators: { attachments: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => AXAudioAttachmentComponent), { isSignal: true }] }], message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: true }] }] } });
11868
11902
 
11869
11903
  class AXFallbackRendererComponent {
@@ -11982,7 +12016,7 @@ class AXFileRendererComponent {
11982
12016
  <p class="ax-cnv-msg__caption">{{ caption() }}</p>
11983
12017
  }
11984
12018
  </div>
11985
- `, isInline: true, styles: [":host{display:block;max-width:100%}.ax-cnv-msg{display:flex;flex-direction:column;gap:.375rem;max-width:min(100%,18.5rem)}.ax-cnv-msg--wide{max-width:min(100%,22rem)}@media(min-width:480px){.ax-cnv-msg{max-width:min(100%,24rem)}.ax-cnv-msg--wide{max-width:min(100%,28rem)}}.ax-cnv-msg__stack{display:flex;flex-direction:column;gap:.375rem}.ax-cnv-msg__grid{display:grid;gap:2px;width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-border-light-surface))}.ax-cnv-msg__grid--single{grid-template-columns:1fr}.ax-cnv-msg__grid--single ::ng-deep .ax-cnv-image-attachment{max-height:min(50dvh,20rem)}.ax-cnv-msg__grid--dual{grid-template-columns:repeat(2,1fr)}.ax-cnv-msg__grid--multi{grid-template-columns:repeat(3,1fr)}@media(max-width:380px){.ax-cnv-msg__grid--multi{grid-template-columns:repeat(2,1fr)}}.ax-cnv-msg__caption{margin:0;padding:0 .125rem;font-size:.8125rem;line-height:1.4;word-break:break-word;opacity:.88}.ax-cnv-msg__card{border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface));overflow:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXFileAttachmentComponent, selector: "ax-cnv-file-attachment", inputs: ["item"] }, { kind: "component", type: AXConversationMessageRendererStateComponent, selector: "ax-conversation-message-renderer-state", inputs: ["rendererState", "message", "contentErrorLabel", "deliveryFailedLabel", "showContentErrorChrome", "contentErrorStyle", "contentErrorIconClass", "placement", "contentRetryEnabled"], outputs: ["contentRetry"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12019
+ `, isInline: true, styles: [":host{display:block;max-width:100%}.ax-cnv-msg,.ax-cnv-msg__stack{display:flex;flex-direction:column;gap:.375rem}.ax-cnv-msg__grid{display:grid;gap:2px;width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-border-light-surface))}.ax-cnv-msg__grid--single{grid-template-columns:1fr}.ax-cnv-msg__grid--single ::ng-deep .ax-cnv-image-attachment{max-height:min(50dvh,20rem)}.ax-cnv-msg__grid--dual{grid-template-columns:repeat(2,1fr)}.ax-cnv-msg__grid--multi{grid-template-columns:repeat(3,1fr);grid-auto-rows:10rem}@media(max-width:380px){.ax-cnv-msg__grid--multi{grid-template-columns:repeat(2,1fr);grid-auto-rows:10rem}}.ax-cnv-msg__caption{margin:0;padding:0 .125rem;font-size:.8125rem;line-height:1.4;word-break:break-word;opacity:.88}.ax-cnv-msg--flush{width:100%;max-width:100%;gap:0}.ax-cnv-msg--flush .ax-cnv-msg__caption{padding:.375rem .625rem 0}.ax-cnv-msg--flush .ax-cnv-msg__grid{border-radius:0;background:transparent}.ax-cnv-msg--flush .ax-cnv-msg__stack{gap:2px}.ax-cnv-msg--flush ::ng-deep .ax-cnv-video{border-radius:0}.ax-cnv-msg__card{border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface));overflow:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXFileAttachmentComponent, selector: "ax-cnv-file-attachment", inputs: ["item"] }, { kind: "component", type: AXConversationMessageRendererStateComponent, selector: "ax-conversation-message-renderer-state", inputs: ["rendererState", "message", "contentErrorLabel", "deliveryFailedLabel", "showContentErrorChrome", "contentErrorStyle", "contentErrorIconClass", "placement", "contentRetryEnabled"], outputs: ["contentRetry"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11986
12020
  }
11987
12021
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXFileRendererComponent, decorators: [{
11988
12022
  type: Component,
@@ -11998,7 +12032,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
11998
12032
  <p class="ax-cnv-msg__caption">{{ caption() }}</p>
11999
12033
  }
12000
12034
  </div>
12001
- `, styles: [":host{display:block;max-width:100%}.ax-cnv-msg{display:flex;flex-direction:column;gap:.375rem;max-width:min(100%,18.5rem)}.ax-cnv-msg--wide{max-width:min(100%,22rem)}@media(min-width:480px){.ax-cnv-msg{max-width:min(100%,24rem)}.ax-cnv-msg--wide{max-width:min(100%,28rem)}}.ax-cnv-msg__stack{display:flex;flex-direction:column;gap:.375rem}.ax-cnv-msg__grid{display:grid;gap:2px;width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-border-light-surface))}.ax-cnv-msg__grid--single{grid-template-columns:1fr}.ax-cnv-msg__grid--single ::ng-deep .ax-cnv-image-attachment{max-height:min(50dvh,20rem)}.ax-cnv-msg__grid--dual{grid-template-columns:repeat(2,1fr)}.ax-cnv-msg__grid--multi{grid-template-columns:repeat(3,1fr)}@media(max-width:380px){.ax-cnv-msg__grid--multi{grid-template-columns:repeat(2,1fr)}}.ax-cnv-msg__caption{margin:0;padding:0 .125rem;font-size:.8125rem;line-height:1.4;word-break:break-word;opacity:.88}.ax-cnv-msg__card{border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface));overflow:hidden}\n"] }]
12035
+ `, styles: [":host{display:block;max-width:100%}.ax-cnv-msg,.ax-cnv-msg__stack{display:flex;flex-direction:column;gap:.375rem}.ax-cnv-msg__grid{display:grid;gap:2px;width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-border-light-surface))}.ax-cnv-msg__grid--single{grid-template-columns:1fr}.ax-cnv-msg__grid--single ::ng-deep .ax-cnv-image-attachment{max-height:min(50dvh,20rem)}.ax-cnv-msg__grid--dual{grid-template-columns:repeat(2,1fr)}.ax-cnv-msg__grid--multi{grid-template-columns:repeat(3,1fr);grid-auto-rows:10rem}@media(max-width:380px){.ax-cnv-msg__grid--multi{grid-template-columns:repeat(2,1fr);grid-auto-rows:10rem}}.ax-cnv-msg__caption{margin:0;padding:0 .125rem;font-size:.8125rem;line-height:1.4;word-break:break-word;opacity:.88}.ax-cnv-msg--flush{width:100%;max-width:100%;gap:0}.ax-cnv-msg--flush .ax-cnv-msg__caption{padding:.375rem .625rem 0}.ax-cnv-msg--flush .ax-cnv-msg__grid{border-radius:0;background:transparent}.ax-cnv-msg--flush .ax-cnv-msg__stack{gap:2px}.ax-cnv-msg--flush ::ng-deep .ax-cnv-video{border-radius:0}.ax-cnv-msg__card{border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface));overflow:hidden}\n"] }]
12002
12036
  }], propDecorators: { message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: true }] }] } });
12003
12037
 
12004
12038
  class AXImageAttachmentComponent {
@@ -12022,7 +12056,7 @@ class AXImageAttachmentComponent {
12022
12056
  >
12023
12057
  <img [src]="thumbnailUrl()" [alt]="alt()" loading="lazy" (load)="ready.set(true)" />
12024
12058
  </button>
12025
- `, isInline: true, styles: [":host{display:block;min-width:0;min-height:0}.ax-cnv-image-attachment{display:block;width:100%;height:100%;min-height:4.5rem;padding:0;border:none;background:rgb(var(--ax-sys-color-light-surface));cursor:pointer;overflow:hidden}.ax-cnv-image-attachment img{width:100%;height:100%;object-fit:cover;opacity:0;transition:opacity .15s ease}.ax-cnv-image-attachment--ready img{opacity:1}.ax-cnv-image-attachment:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-500));outline-offset:2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12059
+ `, isInline: true, styles: [":host{display:block;min-width:0;min-height:0}.ax-cnv-image-attachment{display:block;width:100%;height:100%;min-height:4.5rem;padding:0;border-radius:.5rem;border:none;background:rgb(var(--ax-sys-color-light-surface));cursor:pointer;overflow:hidden}.ax-cnv-image-attachment img{width:100%;height:100%;object-fit:cover;opacity:0;transition:opacity .15s ease}.ax-cnv-image-attachment--ready img{opacity:1}.ax-cnv-image-attachment:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-500));outline-offset:2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12026
12060
  }
12027
12061
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXImageAttachmentComponent, decorators: [{
12028
12062
  type: Component,
@@ -12036,7 +12070,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
12036
12070
  >
12037
12071
  <img [src]="thumbnailUrl()" [alt]="alt()" loading="lazy" (load)="ready.set(true)" />
12038
12072
  </button>
12039
- `, styles: [":host{display:block;min-width:0;min-height:0}.ax-cnv-image-attachment{display:block;width:100%;height:100%;min-height:4.5rem;padding:0;border:none;background:rgb(var(--ax-sys-color-light-surface));cursor:pointer;overflow:hidden}.ax-cnv-image-attachment img{width:100%;height:100%;object-fit:cover;opacity:0;transition:opacity .15s ease}.ax-cnv-image-attachment--ready img{opacity:1}.ax-cnv-image-attachment:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-500));outline-offset:2px}\n"] }]
12073
+ `, styles: [":host{display:block;min-width:0;min-height:0}.ax-cnv-image-attachment{display:block;width:100%;height:100%;min-height:4.5rem;padding:0;border-radius:.5rem;border:none;background:rgb(var(--ax-sys-color-light-surface));cursor:pointer;overflow:hidden}.ax-cnv-image-attachment img{width:100%;height:100%;object-fit:cover;opacity:0;transition:opacity .15s ease}.ax-cnv-image-attachment--ready img{opacity:1}.ax-cnv-image-attachment:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-500));outline-offset:2px}\n"] }]
12040
12074
  }], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }], alt: [{ type: i0.Input, args: [{ isSignal: true, alias: "alt", required: false }] }], imageClick: [{ type: i0.Output, args: ["imageClick"] }] } });
12041
12075
 
12042
12076
  class AXImageRendererComponent {
@@ -12069,14 +12103,10 @@ class AXImageRendererComponent {
12069
12103
  }
12070
12104
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXImageRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12071
12105
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AXImageRendererComponent, isStandalone: true, selector: "ax-conversation-image-renderer", inputs: { message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { imageClick: "imageClick" }, ngImport: i0, template: `
12072
- <div class="ax-cnv-msg">
12106
+ <div class="ax-cnv-msg ax-cnv-msg--flush">
12073
12107
  <div class="ax-cnv-msg__grid" [class]="gridModeClass()">
12074
12108
  @for (image of images(); track image.mediaId ?? image.url) {
12075
- <ax-cnv-image-attachment
12076
- [item]="image"
12077
- [alt]="caption() || 'Image'"
12078
- (imageClick)="onImageClick(image)"
12079
- />
12109
+ <ax-cnv-image-attachment [item]="image" [alt]="caption() || 'Image'" (imageClick)="onImageClick(image)" />
12080
12110
  }
12081
12111
  </div>
12082
12112
  @if (caption()) {
@@ -12090,19 +12120,15 @@ class AXImageRendererComponent {
12090
12120
  placement="below"
12091
12121
  />
12092
12122
  </div>
12093
- `, isInline: true, styles: [":host{display:block;max-width:100%}.ax-cnv-msg{display:flex;flex-direction:column;gap:.375rem;max-width:min(100%,18.5rem)}.ax-cnv-msg--wide{max-width:min(100%,22rem)}@media(min-width:480px){.ax-cnv-msg{max-width:min(100%,24rem)}.ax-cnv-msg--wide{max-width:min(100%,28rem)}}.ax-cnv-msg__stack{display:flex;flex-direction:column;gap:.375rem}.ax-cnv-msg__grid{display:grid;gap:2px;width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-border-light-surface))}.ax-cnv-msg__grid--single{grid-template-columns:1fr}.ax-cnv-msg__grid--single ::ng-deep .ax-cnv-image-attachment{max-height:min(50dvh,20rem)}.ax-cnv-msg__grid--dual{grid-template-columns:repeat(2,1fr)}.ax-cnv-msg__grid--multi{grid-template-columns:repeat(3,1fr)}@media(max-width:380px){.ax-cnv-msg__grid--multi{grid-template-columns:repeat(2,1fr)}}.ax-cnv-msg__caption{margin:0;padding:0 .125rem;font-size:.8125rem;line-height:1.4;word-break:break-word;opacity:.88}.ax-cnv-msg__card{border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface));overflow:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXImageAttachmentComponent, selector: "ax-cnv-image-attachment", inputs: ["item", "alt"], outputs: ["imageClick"] }, { kind: "component", type: AXConversationMessageRendererStateComponent, selector: "ax-conversation-message-renderer-state", inputs: ["rendererState", "message", "contentErrorLabel", "deliveryFailedLabel", "showContentErrorChrome", "contentErrorStyle", "contentErrorIconClass", "placement", "contentRetryEnabled"], outputs: ["contentRetry"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12123
+ `, isInline: true, styles: [":host{display:block;max-width:100%}.ax-cnv-msg,.ax-cnv-msg__stack{display:flex;flex-direction:column;gap:.375rem}.ax-cnv-msg__grid{display:grid;gap:2px;width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-border-light-surface))}.ax-cnv-msg__grid--single{grid-template-columns:1fr}.ax-cnv-msg__grid--single ::ng-deep .ax-cnv-image-attachment{max-height:min(50dvh,20rem)}.ax-cnv-msg__grid--dual{grid-template-columns:repeat(2,1fr)}.ax-cnv-msg__grid--multi{grid-template-columns:repeat(3,1fr);grid-auto-rows:10rem}@media(max-width:380px){.ax-cnv-msg__grid--multi{grid-template-columns:repeat(2,1fr);grid-auto-rows:10rem}}.ax-cnv-msg__caption{margin:0;padding:0 .125rem;font-size:.8125rem;line-height:1.4;word-break:break-word;opacity:.88}.ax-cnv-msg--flush{width:100%;max-width:100%;gap:0}.ax-cnv-msg--flush .ax-cnv-msg__caption{padding:.375rem .625rem 0}.ax-cnv-msg--flush .ax-cnv-msg__grid{border-radius:0;background:transparent}.ax-cnv-msg--flush .ax-cnv-msg__stack{gap:2px}.ax-cnv-msg--flush ::ng-deep .ax-cnv-video{border-radius:0}.ax-cnv-msg__card{border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface));overflow:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXImageAttachmentComponent, selector: "ax-cnv-image-attachment", inputs: ["item", "alt"], outputs: ["imageClick"] }, { kind: "component", type: AXConversationMessageRendererStateComponent, selector: "ax-conversation-message-renderer-state", inputs: ["rendererState", "message", "contentErrorLabel", "deliveryFailedLabel", "showContentErrorChrome", "contentErrorStyle", "contentErrorIconClass", "placement", "contentRetryEnabled"], outputs: ["contentRetry"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12094
12124
  }
12095
12125
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXImageRendererComponent, decorators: [{
12096
12126
  type: Component,
12097
12127
  args: [{ selector: 'ax-conversation-image-renderer', imports: [CommonModule, AXImageAttachmentComponent, AXConversationMessageRendererStateComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
12098
- <div class="ax-cnv-msg">
12128
+ <div class="ax-cnv-msg ax-cnv-msg--flush">
12099
12129
  <div class="ax-cnv-msg__grid" [class]="gridModeClass()">
12100
12130
  @for (image of images(); track image.mediaId ?? image.url) {
12101
- <ax-cnv-image-attachment
12102
- [item]="image"
12103
- [alt]="caption() || 'Image'"
12104
- (imageClick)="onImageClick(image)"
12105
- />
12131
+ <ax-cnv-image-attachment [item]="image" [alt]="caption() || 'Image'" (imageClick)="onImageClick(image)" />
12106
12132
  }
12107
12133
  </div>
12108
12134
  @if (caption()) {
@@ -12116,7 +12142,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
12116
12142
  placement="below"
12117
12143
  />
12118
12144
  </div>
12119
- `, styles: [":host{display:block;max-width:100%}.ax-cnv-msg{display:flex;flex-direction:column;gap:.375rem;max-width:min(100%,18.5rem)}.ax-cnv-msg--wide{max-width:min(100%,22rem)}@media(min-width:480px){.ax-cnv-msg{max-width:min(100%,24rem)}.ax-cnv-msg--wide{max-width:min(100%,28rem)}}.ax-cnv-msg__stack{display:flex;flex-direction:column;gap:.375rem}.ax-cnv-msg__grid{display:grid;gap:2px;width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-border-light-surface))}.ax-cnv-msg__grid--single{grid-template-columns:1fr}.ax-cnv-msg__grid--single ::ng-deep .ax-cnv-image-attachment{max-height:min(50dvh,20rem)}.ax-cnv-msg__grid--dual{grid-template-columns:repeat(2,1fr)}.ax-cnv-msg__grid--multi{grid-template-columns:repeat(3,1fr)}@media(max-width:380px){.ax-cnv-msg__grid--multi{grid-template-columns:repeat(2,1fr)}}.ax-cnv-msg__caption{margin:0;padding:0 .125rem;font-size:.8125rem;line-height:1.4;word-break:break-word;opacity:.88}.ax-cnv-msg__card{border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface));overflow:hidden}\n"] }]
12145
+ `, styles: [":host{display:block;max-width:100%}.ax-cnv-msg,.ax-cnv-msg__stack{display:flex;flex-direction:column;gap:.375rem}.ax-cnv-msg__grid{display:grid;gap:2px;width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-border-light-surface))}.ax-cnv-msg__grid--single{grid-template-columns:1fr}.ax-cnv-msg__grid--single ::ng-deep .ax-cnv-image-attachment{max-height:min(50dvh,20rem)}.ax-cnv-msg__grid--dual{grid-template-columns:repeat(2,1fr)}.ax-cnv-msg__grid--multi{grid-template-columns:repeat(3,1fr);grid-auto-rows:10rem}@media(max-width:380px){.ax-cnv-msg__grid--multi{grid-template-columns:repeat(2,1fr);grid-auto-rows:10rem}}.ax-cnv-msg__caption{margin:0;padding:0 .125rem;font-size:.8125rem;line-height:1.4;word-break:break-word;opacity:.88}.ax-cnv-msg--flush{width:100%;max-width:100%;gap:0}.ax-cnv-msg--flush .ax-cnv-msg__caption{padding:.375rem .625rem 0}.ax-cnv-msg--flush .ax-cnv-msg__grid{border-radius:0;background:transparent}.ax-cnv-msg--flush .ax-cnv-msg__stack{gap:2px}.ax-cnv-msg--flush ::ng-deep .ax-cnv-video{border-radius:0}.ax-cnv-msg__card{border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface));overflow:hidden}\n"] }]
12120
12146
  }], propDecorators: { message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: true }] }], imageClick: [{ type: i0.Output, args: ["imageClick"] }] } });
12121
12147
 
12122
12148
  class AXLocationRendererComponent {
@@ -12458,147 +12484,101 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
12458
12484
  class AXVideoAttachmentComponent {
12459
12485
  constructor() {
12460
12486
  this.item = input.required(...(ngDevMode ? [{ debugName: "item" }] : []));
12461
- this.playbackActive = output();
12462
- this.playbackIdle = output();
12463
- this.playbackTimeUpdate = output();
12464
- this.playbackPlayingChange = output();
12487
+ this.playingChange = output();
12488
+ this.timeUpdate = output();
12489
+ this.durationChange = output();
12490
+ this.playbackEnded = output();
12465
12491
  this.videoElementRef = viewChild('videoEl', ...(ngDevMode ? [{ debugName: "videoElementRef" }] : []));
12466
- this.showPlayer = signal(false, ...(ngDevMode ? [{ debugName: "showPlayer" }] : []));
12467
12492
  this.playbackReference = computed(() => toUploaderReference(this.item()), ...(ngDevMode ? [{ debugName: "playbackReference" }] : []));
12468
- this.thumbReference = computed(() => ({
12469
- ...toUploaderReference(this.item()),
12470
- url: this.item().thumbnailUrl ?? this.item().url,
12471
- }), ...(ngDevMode ? [{ debugName: "thumbReference" }] : []));
12472
12493
  this.resolvedPlaybackUrl = createResolvedMediaUrlSignal(this.playbackReference);
12473
- this.resolvedThumbnailUrl = createResolvedMediaUrlSignal(this.thumbReference);
12474
12494
  this.playbackUrl = computed(() => this.resolvedPlaybackUrl() ?? this.item().url ?? '', ...(ngDevMode ? [{ debugName: "playbackUrl" }] : []));
12475
- this.thumbnailUrl = computed(() => this.resolvedThumbnailUrl() ?? this.item().thumbnailUrl, ...(ngDevMode ? [{ debugName: "thumbnailUrl" }] : []));
12476
12495
  this.duration = computed(() => this.item().duration ?? 0, ...(ngDevMode ? [{ debugName: "duration" }] : []));
12477
12496
  this.durationLabel = computed(() => formatMediaDuration(this.duration()), ...(ngDevMode ? [{ debugName: "durationLabel" }] : []));
12478
- this.playAriaLabel = computed(() => {
12479
- const d = this.duration();
12480
- return d > 0 ? `Play video, ${this.durationLabel()}` : 'Play video';
12481
- }, ...(ngDevMode ? [{ debugName: "playAriaLabel" }] : []));
12497
+ }
12498
+ togglePlay() {
12499
+ const el = this.videoElementRef()?.nativeElement;
12500
+ if (!el) {
12501
+ return;
12502
+ }
12503
+ if (el.paused) {
12504
+ void el.play();
12505
+ }
12506
+ else {
12507
+ el.pause();
12508
+ }
12509
+ }
12510
+ pause() {
12511
+ this.videoElementRef()?.nativeElement?.pause();
12482
12512
  }
12483
12513
  onLoadedMetadata() {
12484
- this.emitPlaybackState();
12485
12514
  const el = this.videoElementRef()?.nativeElement;
12486
- if (el) {
12487
- this.playbackActive.emit(el);
12515
+ if (el && Number.isFinite(el.duration)) {
12516
+ this.durationChange.emit(el.duration);
12488
12517
  }
12489
12518
  }
12490
12519
  onTimeUpdate() {
12491
- this.emitPlaybackState();
12520
+ const el = this.videoElementRef()?.nativeElement;
12521
+ if (el) {
12522
+ this.timeUpdate.emit(el.currentTime);
12523
+ }
12492
12524
  }
12493
12525
  onPlay() {
12494
- this.playbackPlayingChange.emit(true);
12495
- this.emitPlaybackState();
12526
+ this.playingChange.emit(true);
12496
12527
  }
12497
12528
  onPause() {
12498
- this.playbackPlayingChange.emit(false);
12499
- this.emitPlaybackState();
12529
+ this.playingChange.emit(false);
12500
12530
  }
12501
12531
  onEnded() {
12502
- this.playbackPlayingChange.emit(false);
12503
- this.emitPlaybackState();
12504
- }
12505
- emitPlaybackState() {
12506
- const el = this.videoElementRef()?.nativeElement;
12507
- if (!el) {
12508
- return;
12509
- }
12510
- this.playbackTimeUpdate.emit({
12511
- currentTime: el.currentTime,
12512
- duration: Number.isFinite(el.duration) ? el.duration : this.duration(),
12513
- });
12532
+ this.playingChange.emit(false);
12533
+ this.playbackEnded.emit();
12514
12534
  }
12515
12535
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXVideoAttachmentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12516
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AXVideoAttachmentComponent, isStandalone: true, selector: "ax-cnv-video-attachment", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { playbackActive: "playbackActive", playbackIdle: "playbackIdle", playbackTimeUpdate: "playbackTimeUpdate", playbackPlayingChange: "playbackPlayingChange" }, viewQueries: [{ propertyName: "videoElementRef", first: true, predicate: ["videoEl"], descendants: true, isSignal: true }], ngImport: i0, template: `
12536
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.1.3", type: AXVideoAttachmentComponent, isStandalone: true, selector: "ax-cnv-video-attachment", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { playingChange: "playingChange", timeUpdate: "timeUpdate", durationChange: "durationChange", playbackEnded: "playbackEnded" }, viewQueries: [{ propertyName: "videoElementRef", first: true, predicate: ["videoEl"], descendants: true, isSignal: true }], ngImport: i0, template: `
12517
12537
  <div class="ax-cnv-video">
12518
- @if (!showPlayer()) {
12519
- <button
12520
- type="button"
12521
- class="ax-cnv-video__preview"
12522
- (click)="showPlayer.set(true)"
12523
- [disabled]="!playbackUrl()"
12524
- [attr.aria-label]="playAriaLabel()"
12525
- >
12526
- @if (thumbnailUrl()) {
12527
- <img class="ax-cnv-video__thumb" [src]="thumbnailUrl()!" alt="" loading="lazy" />
12528
- } @else {
12529
- <span class="ax-cnv-video__placeholder"><i class="fa-light fa-video"></i></span>
12530
- }
12531
- <span class="ax-cnv-video__play" aria-hidden="true"><i class="fa-solid fa-play"></i></span>
12532
- @if (duration() > 0) {
12533
- <span class="ax-cnv-video__duration">{{ durationLabel() }}</span>
12534
- }
12535
- </button>
12536
- } @else {
12537
- <video
12538
- #videoEl
12539
- class="ax-cnv-video__player"
12540
- [src]="playbackUrl()"
12541
- controls
12542
- playsinline
12543
- preload="metadata"
12544
- (loadedmetadata)="onLoadedMetadata()"
12545
- (timeupdate)="onTimeUpdate()"
12546
- (play)="onPlay()"
12547
- (pause)="onPause()"
12548
- (ended)="onEnded()"
12549
- ></video>
12550
- }
12538
+ <video
12539
+ #videoEl
12540
+ class="ax-cnv-video__player"
12541
+ [src]="playbackUrl()"
12542
+ controls
12543
+ playsinline
12544
+ preload="metadata"
12545
+ (loadedmetadata)="onLoadedMetadata()"
12546
+ (timeupdate)="onTimeUpdate()"
12547
+ (play)="onPlay()"
12548
+ (pause)="onPause()"
12549
+ (ended)="onEnded()"
12550
+ ></video>
12551
12551
  </div>
12552
- `, isInline: true, styles: [":host{display:block}.ax-cnv-video{width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-darker-surface))}.ax-cnv-video__preview{position:relative;display:block;width:100%;min-height:7rem;padding:0;border:none;cursor:pointer;background:rgb(var(--ax-sys-color-darker-surface));touch-action:manipulation}.ax-cnv-video__thumb{width:100%;max-height:min(40dvh,14rem);object-fit:cover;display:block}.ax-cnv-video__placeholder{display:flex;align-items:center;justify-content:center;min-height:7rem;color:rgba(var(--ax-sys-color-on-surface),.45);font-size:2rem}.ax-cnv-video__play{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;background:#00000047;color:rgb(var(--ax-sys-color-light));font-size:1.75rem}.ax-cnv-video__duration{position:absolute;inset-inline-end:.375rem;inset-block-end:.375rem;padding:.125rem .375rem;border-radius:var(--ax-sys-border-radius, .25rem);background:#000000a6;color:rgb(var(--ax-sys-color-light));font-size:.6875rem;font-variant-numeric:tabular-nums}.ax-cnv-video__player{width:100%;max-height:min(40dvh,14rem);display:block;vertical-align:middle}.ax-cnv-video__preview:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-500));outline-offset:2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12552
+ `, isInline: true, styles: [":host{display:block}.ax-cnv-video{width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-darker-surface))}.ax-cnv-video__player{width:100%;max-height:min(40dvh,14rem);display:block;vertical-align:middle}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12553
12553
  }
12554
12554
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXVideoAttachmentComponent, decorators: [{
12555
12555
  type: Component,
12556
12556
  args: [{ selector: 'ax-cnv-video-attachment', imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
12557
12557
  <div class="ax-cnv-video">
12558
- @if (!showPlayer()) {
12559
- <button
12560
- type="button"
12561
- class="ax-cnv-video__preview"
12562
- (click)="showPlayer.set(true)"
12563
- [disabled]="!playbackUrl()"
12564
- [attr.aria-label]="playAriaLabel()"
12565
- >
12566
- @if (thumbnailUrl()) {
12567
- <img class="ax-cnv-video__thumb" [src]="thumbnailUrl()!" alt="" loading="lazy" />
12568
- } @else {
12569
- <span class="ax-cnv-video__placeholder"><i class="fa-light fa-video"></i></span>
12570
- }
12571
- <span class="ax-cnv-video__play" aria-hidden="true"><i class="fa-solid fa-play"></i></span>
12572
- @if (duration() > 0) {
12573
- <span class="ax-cnv-video__duration">{{ durationLabel() }}</span>
12574
- }
12575
- </button>
12576
- } @else {
12577
- <video
12578
- #videoEl
12579
- class="ax-cnv-video__player"
12580
- [src]="playbackUrl()"
12581
- controls
12582
- playsinline
12583
- preload="metadata"
12584
- (loadedmetadata)="onLoadedMetadata()"
12585
- (timeupdate)="onTimeUpdate()"
12586
- (play)="onPlay()"
12587
- (pause)="onPause()"
12588
- (ended)="onEnded()"
12589
- ></video>
12590
- }
12558
+ <video
12559
+ #videoEl
12560
+ class="ax-cnv-video__player"
12561
+ [src]="playbackUrl()"
12562
+ controls
12563
+ playsinline
12564
+ preload="metadata"
12565
+ (loadedmetadata)="onLoadedMetadata()"
12566
+ (timeupdate)="onTimeUpdate()"
12567
+ (play)="onPlay()"
12568
+ (pause)="onPause()"
12569
+ (ended)="onEnded()"
12570
+ ></video>
12591
12571
  </div>
12592
- `, styles: [":host{display:block}.ax-cnv-video{width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-darker-surface))}.ax-cnv-video__preview{position:relative;display:block;width:100%;min-height:7rem;padding:0;border:none;cursor:pointer;background:rgb(var(--ax-sys-color-darker-surface));touch-action:manipulation}.ax-cnv-video__thumb{width:100%;max-height:min(40dvh,14rem);object-fit:cover;display:block}.ax-cnv-video__placeholder{display:flex;align-items:center;justify-content:center;min-height:7rem;color:rgba(var(--ax-sys-color-on-surface),.45);font-size:2rem}.ax-cnv-video__play{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;background:#00000047;color:rgb(var(--ax-sys-color-light));font-size:1.75rem}.ax-cnv-video__duration{position:absolute;inset-inline-end:.375rem;inset-block-end:.375rem;padding:.125rem .375rem;border-radius:var(--ax-sys-border-radius, .25rem);background:#000000a6;color:rgb(var(--ax-sys-color-light));font-size:.6875rem;font-variant-numeric:tabular-nums}.ax-cnv-video__player{width:100%;max-height:min(40dvh,14rem);display:block;vertical-align:middle}.ax-cnv-video__preview:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-500));outline-offset:2px}\n"] }]
12593
- }], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }], playbackActive: [{ type: i0.Output, args: ["playbackActive"] }], playbackIdle: [{ type: i0.Output, args: ["playbackIdle"] }], playbackTimeUpdate: [{ type: i0.Output, args: ["playbackTimeUpdate"] }], playbackPlayingChange: [{ type: i0.Output, args: ["playbackPlayingChange"] }], videoElementRef: [{ type: i0.ViewChild, args: ['videoEl', { isSignal: true }] }] } });
12572
+ `, styles: [":host{display:block}.ax-cnv-video{width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-darker-surface))}.ax-cnv-video__player{width:100%;max-height:min(40dvh,14rem);display:block;vertical-align:middle}\n"] }]
12573
+ }], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }], playingChange: [{ type: i0.Output, args: ["playingChange"] }], timeUpdate: [{ type: i0.Output, args: ["timeUpdate"] }], durationChange: [{ type: i0.Output, args: ["durationChange"] }], playbackEnded: [{ type: i0.Output, args: ["playbackEnded"] }], videoElementRef: [{ type: i0.ViewChild, args: ['videoEl', { isSignal: true }] }] } });
12594
12574
 
12595
12575
  class AXVideoRendererComponent {
12596
12576
  constructor() {
12597
12577
  this.platformId = inject(PLATFORM_ID);
12598
12578
  this.destroyRef = inject(DestroyRef);
12599
12579
  this.infoBarService = inject(AXInfoBarService);
12600
- this.activeVideoEl = null;
12601
- this.activeVideoIndex = signal(null, ...(ngDevMode ? [{ debugName: "activeVideoIndex" }] : []));
12580
+ this.attachments = viewChildren(AXVideoAttachmentComponent, ...(ngDevMode ? [{ debugName: "attachments" }] : []));
12581
+ this.activeVideoIndex = signal(0, ...(ngDevMode ? [{ debugName: "activeVideoIndex" }] : []));
12602
12582
  this.message = input.required(...(ngDevMode ? [{ debugName: "message" }] : []));
12603
12583
  this.rendererState = computed(() => ({
12604
12584
  deliveryStatus: this.message().status,
@@ -12617,62 +12597,62 @@ class AXVideoRendererComponent {
12617
12597
  }
12618
12598
  });
12619
12599
  }
12620
- onPlaybackActive(element, index) {
12621
- this.activeVideoEl = element;
12622
- this.activeVideoIndex.set(index);
12623
- this.duration.set(Number.isFinite(element.duration) ? element.duration : this.videos()[index]?.duration ?? 0);
12624
- this.syncInfoBarBanner(true);
12600
+ onPlayingChange(index, playing) {
12601
+ if (playing) {
12602
+ this.activeVideoIndex.set(index);
12603
+ this.pauseOtherVideos(index);
12604
+ this.isPlaying.set(true);
12605
+ this.syncInfoBarBanner(true);
12606
+ return;
12607
+ }
12608
+ if (this.activeVideoIndex() === index) {
12609
+ this.isPlaying.set(false);
12610
+ this.syncInfoBarBanner();
12611
+ }
12625
12612
  }
12626
- onPlaybackIdle(index) {
12613
+ onTimeUpdate(index, time) {
12627
12614
  if (this.activeVideoIndex() !== index) {
12628
12615
  return;
12629
12616
  }
12630
- this.activeVideoEl = null;
12631
- this.activeVideoIndex.set(null);
12632
- this.isPlaying.set(false);
12633
- this.currentTime.set(0);
12634
- this.infoBarService.hideMessageBanner(this.message().id);
12617
+ this.currentTime.set(time);
12618
+ this.syncInfoBarBanner();
12635
12619
  }
12636
- onPlaybackTimeUpdate(event) {
12637
- this.currentTime.set(event.currentTime);
12638
- if (event.duration > 0) {
12639
- this.duration.set(event.duration);
12620
+ onDurationChange(index, duration) {
12621
+ if (this.activeVideoIndex() !== index) {
12622
+ return;
12640
12623
  }
12624
+ this.duration.set(duration);
12641
12625
  this.syncInfoBarBanner();
12642
12626
  }
12643
- onPlaybackPlayingChange(playing) {
12644
- this.isPlaying.set(playing);
12645
- this.syncInfoBarBanner(playing);
12627
+ onPlaybackEnded(index) {
12628
+ if (this.activeVideoIndex() !== index) {
12629
+ return;
12630
+ }
12631
+ this.isPlaying.set(false);
12632
+ this.currentTime.set(0);
12633
+ this.syncInfoBarBanner();
12646
12634
  }
12647
12635
  togglePlay() {
12648
- if (!isPlatformBrowser(this.platformId) || !this.activeVideoEl) {
12636
+ if (!isPlatformBrowser(this.platformId)) {
12649
12637
  return;
12650
12638
  }
12651
- const el = this.activeVideoEl;
12652
- if (el.paused) {
12653
- void el.play();
12654
- this.isPlaying.set(true);
12655
- }
12656
- else {
12657
- el.pause();
12658
- this.isPlaying.set(false);
12659
- }
12660
- this.syncInfoBarBanner();
12639
+ this.attachments()[this.activeVideoIndex()]?.togglePlay();
12640
+ }
12641
+ pauseOtherVideos(activeIndex) {
12642
+ this.attachments().forEach((attachment, index) => {
12643
+ if (index !== activeIndex) {
12644
+ attachment.pause();
12645
+ }
12646
+ });
12661
12647
  }
12662
12648
  pausePlayback() {
12663
- if (this.activeVideoEl) {
12664
- this.activeVideoEl.pause();
12665
- }
12649
+ this.attachments()[this.activeVideoIndex()]?.pause();
12666
12650
  this.isPlaying.set(false);
12667
12651
  }
12668
12652
  syncInfoBarBanner(forceOpen = false) {
12669
12653
  const message = this.message();
12670
12654
  const index = this.activeVideoIndex();
12671
- if (index === null) {
12672
- return;
12673
- }
12674
- const title = this.payload().caption?.trim() ||
12675
- (this.videos().length > 1 ? `Video ${index + 1}` : 'Video');
12655
+ const title = this.payload().caption?.trim() || (this.videos().length > 1 ? `Video ${index + 1}` : 'Video');
12676
12656
  syncPlaybackInfoBarBanner(this.infoBarService, message, {
12677
12657
  title,
12678
12658
  currentTime: this.currentTime(),
@@ -12683,17 +12663,17 @@ class AXVideoRendererComponent {
12683
12663
  }, { forceOpen });
12684
12664
  }
12685
12665
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXVideoRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12686
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AXVideoRendererComponent, isStandalone: true, selector: "ax-conversation-video-renderer", inputs: { message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
12666
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AXVideoRendererComponent, isStandalone: true, selector: "ax-conversation-video-renderer", inputs: { message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "attachments", predicate: AXVideoAttachmentComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
12687
12667
  <div class="ax-cnv-msg">
12688
12668
  <ax-conversation-message-renderer-state [rendererState]="rendererState()" [message]="message()" />
12689
12669
  <div class="ax-cnv-msg__stack">
12690
12670
  @for (video of videos(); track video.mediaId ?? video.url; let i = $index) {
12691
12671
  <ax-cnv-video-attachment
12692
12672
  [item]="video"
12693
- (playbackActive)="onPlaybackActive($event, i)"
12694
- (playbackIdle)="onPlaybackIdle(i)"
12695
- (playbackTimeUpdate)="onPlaybackTimeUpdate($event)"
12696
- (playbackPlayingChange)="onPlaybackPlayingChange($event)"
12673
+ (playingChange)="onPlayingChange(i, $event)"
12674
+ (timeUpdate)="onTimeUpdate(i, $event)"
12675
+ (durationChange)="onDurationChange(i, $event)"
12676
+ (playbackEnded)="onPlaybackEnded(i)"
12697
12677
  />
12698
12678
  }
12699
12679
  </div>
@@ -12701,7 +12681,7 @@ class AXVideoRendererComponent {
12701
12681
  <p class="ax-cnv-msg__caption">{{ caption() }}</p>
12702
12682
  }
12703
12683
  </div>
12704
- `, isInline: true, styles: [":host{display:block;max-width:100%}.ax-cnv-msg{display:flex;flex-direction:column;gap:.375rem;max-width:min(100%,18.5rem)}.ax-cnv-msg--wide{max-width:min(100%,22rem)}@media(min-width:480px){.ax-cnv-msg{max-width:min(100%,24rem)}.ax-cnv-msg--wide{max-width:min(100%,28rem)}}.ax-cnv-msg__stack{display:flex;flex-direction:column;gap:.375rem}.ax-cnv-msg__grid{display:grid;gap:2px;width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-border-light-surface))}.ax-cnv-msg__grid--single{grid-template-columns:1fr}.ax-cnv-msg__grid--single ::ng-deep .ax-cnv-image-attachment{max-height:min(50dvh,20rem)}.ax-cnv-msg__grid--dual{grid-template-columns:repeat(2,1fr)}.ax-cnv-msg__grid--multi{grid-template-columns:repeat(3,1fr)}@media(max-width:380px){.ax-cnv-msg__grid--multi{grid-template-columns:repeat(2,1fr)}}.ax-cnv-msg__caption{margin:0;padding:0 .125rem;font-size:.8125rem;line-height:1.4;word-break:break-word;opacity:.88}.ax-cnv-msg__card{border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface));overflow:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXVideoAttachmentComponent, selector: "ax-cnv-video-attachment", inputs: ["item"], outputs: ["playbackActive", "playbackIdle", "playbackTimeUpdate", "playbackPlayingChange"] }, { kind: "component", type: AXConversationMessageRendererStateComponent, selector: "ax-conversation-message-renderer-state", inputs: ["rendererState", "message", "contentErrorLabel", "deliveryFailedLabel", "showContentErrorChrome", "contentErrorStyle", "contentErrorIconClass", "placement", "contentRetryEnabled"], outputs: ["contentRetry"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12684
+ `, isInline: true, styles: [":host{display:block;max-width:100%}.ax-cnv-msg,.ax-cnv-msg__stack{display:flex;flex-direction:column;gap:.375rem}.ax-cnv-msg__grid{display:grid;gap:2px;width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-border-light-surface))}.ax-cnv-msg__grid--single{grid-template-columns:1fr}.ax-cnv-msg__grid--single ::ng-deep .ax-cnv-image-attachment{max-height:min(50dvh,20rem)}.ax-cnv-msg__grid--dual{grid-template-columns:repeat(2,1fr)}.ax-cnv-msg__grid--multi{grid-template-columns:repeat(3,1fr);grid-auto-rows:10rem}@media(max-width:380px){.ax-cnv-msg__grid--multi{grid-template-columns:repeat(2,1fr);grid-auto-rows:10rem}}.ax-cnv-msg__caption{margin:0;padding:0 .125rem;font-size:.8125rem;line-height:1.4;word-break:break-word;opacity:.88}.ax-cnv-msg--flush{width:100%;max-width:100%;gap:0}.ax-cnv-msg--flush .ax-cnv-msg__caption{padding:.375rem .625rem 0}.ax-cnv-msg--flush .ax-cnv-msg__grid{border-radius:0;background:transparent}.ax-cnv-msg--flush .ax-cnv-msg__stack{gap:2px}.ax-cnv-msg--flush ::ng-deep .ax-cnv-video{border-radius:0}.ax-cnv-msg__card{border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface));overflow:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXVideoAttachmentComponent, selector: "ax-cnv-video-attachment", inputs: ["item"], outputs: ["playingChange", "timeUpdate", "durationChange", "playbackEnded"] }, { kind: "component", type: AXConversationMessageRendererStateComponent, selector: "ax-conversation-message-renderer-state", inputs: ["rendererState", "message", "contentErrorLabel", "deliveryFailedLabel", "showContentErrorChrome", "contentErrorStyle", "contentErrorIconClass", "placement", "contentRetryEnabled"], outputs: ["contentRetry"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12705
12685
  }
12706
12686
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXVideoRendererComponent, decorators: [{
12707
12687
  type: Component,
@@ -12712,10 +12692,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
12712
12692
  @for (video of videos(); track video.mediaId ?? video.url; let i = $index) {
12713
12693
  <ax-cnv-video-attachment
12714
12694
  [item]="video"
12715
- (playbackActive)="onPlaybackActive($event, i)"
12716
- (playbackIdle)="onPlaybackIdle(i)"
12717
- (playbackTimeUpdate)="onPlaybackTimeUpdate($event)"
12718
- (playbackPlayingChange)="onPlaybackPlayingChange($event)"
12695
+ (playingChange)="onPlayingChange(i, $event)"
12696
+ (timeUpdate)="onTimeUpdate(i, $event)"
12697
+ (durationChange)="onDurationChange(i, $event)"
12698
+ (playbackEnded)="onPlaybackEnded(i)"
12719
12699
  />
12720
12700
  }
12721
12701
  </div>
@@ -12723,8 +12703,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
12723
12703
  <p class="ax-cnv-msg__caption">{{ caption() }}</p>
12724
12704
  }
12725
12705
  </div>
12726
- `, styles: [":host{display:block;max-width:100%}.ax-cnv-msg{display:flex;flex-direction:column;gap:.375rem;max-width:min(100%,18.5rem)}.ax-cnv-msg--wide{max-width:min(100%,22rem)}@media(min-width:480px){.ax-cnv-msg{max-width:min(100%,24rem)}.ax-cnv-msg--wide{max-width:min(100%,28rem)}}.ax-cnv-msg__stack{display:flex;flex-direction:column;gap:.375rem}.ax-cnv-msg__grid{display:grid;gap:2px;width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-border-light-surface))}.ax-cnv-msg__grid--single{grid-template-columns:1fr}.ax-cnv-msg__grid--single ::ng-deep .ax-cnv-image-attachment{max-height:min(50dvh,20rem)}.ax-cnv-msg__grid--dual{grid-template-columns:repeat(2,1fr)}.ax-cnv-msg__grid--multi{grid-template-columns:repeat(3,1fr)}@media(max-width:380px){.ax-cnv-msg__grid--multi{grid-template-columns:repeat(2,1fr)}}.ax-cnv-msg__caption{margin:0;padding:0 .125rem;font-size:.8125rem;line-height:1.4;word-break:break-word;opacity:.88}.ax-cnv-msg__card{border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface));overflow:hidden}\n"] }]
12727
- }], ctorParameters: () => [], propDecorators: { message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: true }] }] } });
12706
+ `, styles: [":host{display:block;max-width:100%}.ax-cnv-msg,.ax-cnv-msg__stack{display:flex;flex-direction:column;gap:.375rem}.ax-cnv-msg__grid{display:grid;gap:2px;width:100%;border-radius:var(--ax-sys-border-radius, .5rem);overflow:hidden;background:rgb(var(--ax-sys-color-border-light-surface))}.ax-cnv-msg__grid--single{grid-template-columns:1fr}.ax-cnv-msg__grid--single ::ng-deep .ax-cnv-image-attachment{max-height:min(50dvh,20rem)}.ax-cnv-msg__grid--dual{grid-template-columns:repeat(2,1fr)}.ax-cnv-msg__grid--multi{grid-template-columns:repeat(3,1fr);grid-auto-rows:10rem}@media(max-width:380px){.ax-cnv-msg__grid--multi{grid-template-columns:repeat(2,1fr);grid-auto-rows:10rem}}.ax-cnv-msg__caption{margin:0;padding:0 .125rem;font-size:.8125rem;line-height:1.4;word-break:break-word;opacity:.88}.ax-cnv-msg--flush{width:100%;max-width:100%;gap:0}.ax-cnv-msg--flush .ax-cnv-msg__caption{padding:.375rem .625rem 0}.ax-cnv-msg--flush .ax-cnv-msg__grid{border-radius:0;background:transparent}.ax-cnv-msg--flush .ax-cnv-msg__stack{gap:2px}.ax-cnv-msg--flush ::ng-deep .ax-cnv-video{border-radius:0}.ax-cnv-msg__card{border-radius:var(--ax-sys-border-radius, .5rem);border:1px solid rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-surface));overflow:hidden}\n"] }]
12707
+ }], ctorParameters: () => [], propDecorators: { attachments: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => AXVideoAttachmentComponent), { isSignal: true }] }], message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: true }] }] } });
12728
12708
 
12729
12709
  /** Decorative bars when payload has no waveform (deterministic, no random). */
12730
12710
  const FALLBACK_WAVEFORM = [
@@ -15212,39 +15192,33 @@ class AXComposerComponent {
15212
15192
  this.replyingToMessage.set(null);
15213
15193
  }
15214
15194
  }, ...(ngDevMode ? [{ debugName: "#controllerEffect" }] : []));
15215
- // Reset composer state when conversation changes
15195
+ // Close composer popovers when conversation changes (draft/reply/edit reset is handled by message-list).
15216
15196
  this.#previousConversationId = undefined;
15217
- this.#conversationChangeEffect = effect(() => {
15218
- const conversation = this.activeConversation();
15219
- const currentId = conversation?.id;
15220
- // Save draft for previous conversation
15221
- if (this.#previousConversationId && this.#previousConversationId !== currentId) {
15222
- this.composerService.saveDraft(this.#previousConversationId, this.draftText());
15223
- }
15224
- // Only reset if conversation ID actually changed (not on initial load)
15225
- if (currentId !== this.#previousConversationId && this.#previousConversationId !== undefined) {
15226
- this.resetComposerState();
15227
- }
15228
- // Load draft for new conversation
15229
- if (currentId && currentId !== this.#previousConversationId) {
15230
- const draft = this.composerService.loadDraft(currentId);
15231
- if (draft) {
15232
- this.draftText.set(draft);
15233
- }
15197
+ this.#conversationUiResetEffect = effect(() => {
15198
+ const currentId = this.activeConversation()?.id;
15199
+ if (this.#previousConversationId !== undefined && this.#previousConversationId !== currentId) {
15200
+ this.emojiPopoverTarget.set(null);
15201
+ this.editingMessage.set(null);
15202
+ this.replyingToMessage.set(null);
15234
15203
  }
15235
15204
  this.#previousConversationId = currentId;
15236
- }, ...(ngDevMode ? [{ debugName: "#conversationChangeEffect" }] : []));
15205
+ }, ...(ngDevMode ? [{ debugName: "#conversationUiResetEffect" }] : []));
15237
15206
  // Auto-save draft on text change
15238
15207
  this.#draftAutoSaveEffect = effect(() => {
15239
15208
  const text = this.draftText();
15240
15209
  const conversation = this.activeConversation();
15241
- if (conversation?.id) {
15210
+ const isEditing = !!this.composerService.editMessage();
15211
+ if (conversation?.id && !isEditing) {
15212
+ const conversationId = conversation.id;
15242
15213
  // Debounce auto-save
15243
15214
  if (this.draftSaveTimeout) {
15244
15215
  clearTimeout(this.draftSaveTimeout);
15245
15216
  }
15246
15217
  this.draftSaveTimeout = window.setTimeout(() => {
15247
- this.composerService.saveDraft(conversation.id, text);
15218
+ if (this.activeConversation()?.id !== conversationId || this.composerService.editMessage()) {
15219
+ return;
15220
+ }
15221
+ this.composerService.saveDraft(conversationId, text);
15248
15222
  }, 500);
15249
15223
  }
15250
15224
  }, ...(ngDevMode ? [{ debugName: "#draftAutoSaveEffect" }] : []));
@@ -15274,9 +15248,9 @@ class AXComposerComponent {
15274
15248
  #focusComposerEffect;
15275
15249
  // React to controller signals (reply/edit)
15276
15250
  #controllerEffect;
15277
- // Reset composer state when conversation changes
15251
+ // Close composer popovers when conversation changes (draft/reply/edit reset is handled by message-list).
15278
15252
  #previousConversationId;
15279
- #conversationChangeEffect;
15253
+ #conversationUiResetEffect;
15280
15254
  // Auto-save draft on text change
15281
15255
  #draftAutoSaveEffect;
15282
15256
  /** Handle key down */
@@ -15310,7 +15284,7 @@ class AXComposerComponent {
15310
15284
  this.typingSubject.complete();
15311
15285
  // Save draft before destroying
15312
15286
  const conversation = this.activeConversation();
15313
- if (conversation?.id) {
15287
+ if (conversation?.id && !this.composerService.editMessage()) {
15314
15288
  this.composerService.saveDraft(conversation.id, this.draftText());
15315
15289
  }
15316
15290
  // Clear timeout
@@ -15483,20 +15457,6 @@ class AXComposerComponent {
15483
15457
  this.replyingToMessage.set(null);
15484
15458
  this.composerService.clear();
15485
15459
  }
15486
- /** Reset all composer states (used when switching conversations) */
15487
- resetComposerState() {
15488
- // Clear edit/reply states
15489
- this.editingMessage.set(null);
15490
- this.replyingToMessage.set(null);
15491
- // Clear service states (reply/edit messages, active component)
15492
- this.composerService.clear();
15493
- // Close any open popover/popup
15494
- this.emojiPopoverTarget.set(null);
15495
- // Clear attachments
15496
- this.attachments.set([]);
15497
- // Clear draft text
15498
- this.draftText.set('');
15499
- }
15500
15460
  /** Start editing a message */
15501
15461
  startEdit(message) {
15502
15462
  this.editingMessage.set(message);
@@ -16331,10 +16291,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
16331
16291
  * Manages info bar state and actions
16332
16292
  */
16333
16293
  class AXInfoBarService {
16334
- // Access registry through conversation service
16335
- get registry() {
16336
- return this.conversationService.registry;
16337
- }
16338
16294
  constructor() {
16339
16295
  this.conversationService = inject(AXConversationService);
16340
16296
  this.injector = inject(Injector);
@@ -16354,13 +16310,17 @@ class AXInfoBarService {
16354
16310
  /** Current search result index */
16355
16311
  this._currentSearchIndex = signal(0, ...(ngDevMode ? [{ debugName: "_currentSearchIndex" }] : []));
16356
16312
  this.currentSearchIndex = this._currentSearchIndex.asReadonly();
16357
- effect(() => {
16358
- const activeConversationId = this.activeConversation()?.id;
16359
- const activeBanner = this._activeBanner();
16360
- if (activeBanner && activeBanner.message.conversationId !== activeConversationId) {
16361
- this._activeBanner.set(null);
16362
- }
16363
- });
16313
+ }
16314
+ // Access registry through conversation service
16315
+ get registry() {
16316
+ return this.conversationService.registry;
16317
+ }
16318
+ /**
16319
+ * Reset info-bar overlays when the active conversation changes.
16320
+ */
16321
+ onConversationChanged() {
16322
+ this.hideMessageBanner();
16323
+ this.hideComponent();
16364
16324
  }
16365
16325
  /**
16366
16326
  * Get actions for the active conversation
@@ -16445,6 +16405,10 @@ class AXInfoBarService {
16445
16405
  return;
16446
16406
  }
16447
16407
  const current = this._activeBanner();
16408
+ if (current?.message.id === message.id) {
16409
+ this.updateMessageBannerInputs(message.id, inputs ?? {});
16410
+ return;
16411
+ }
16448
16412
  if (current && current.message.id !== message.id) {
16449
16413
  this.hideMessageBanner(current.message.id);
16450
16414
  }
@@ -16565,7 +16529,7 @@ class AXInfoBarService {
16565
16529
  }
16566
16530
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXInfoBarService, decorators: [{
16567
16531
  type: Injectable
16568
- }], ctorParameters: () => [] });
16532
+ }] });
16569
16533
 
16570
16534
  /**
16571
16535
  * Members Popover Component
@@ -17756,6 +17720,8 @@ class AXMessageListComponent {
17756
17720
  constructor() {
17757
17721
  this.conversationService = inject(AXConversationService);
17758
17722
  this.messageListService = inject(AXMessageListService);
17723
+ this.composerService = inject(AXComposerService);
17724
+ this.infoBarService = inject(AXInfoBarService);
17759
17725
  this.translation = inject(AXTranslationService);
17760
17726
  this.config = inject(CONVERSATION_CONFIG);
17761
17727
  /** Fallback when no conversation is active and no `ax-conversation-message-list-no-active` content is projected. */
@@ -17834,6 +17800,8 @@ class AXMessageListComponent {
17834
17800
  untracked(() => {
17835
17801
  if (currentConversationId !== previousConversationId) {
17836
17802
  this.contextMenuMessageId.set(null);
17803
+ this.composerService.onConversationChanged(previousConversationId, currentConversationId);
17804
+ this.infoBarService.onConversationChanged();
17837
17805
  }
17838
17806
  // Only scroll if the conversation ID actually changed (not just updated)
17839
17807
  if (currentConversationId && currentConversationId !== previousConversationId) {