@acorex/components 22.4.18 → 22.4.20

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.
@@ -1,7 +1,7 @@
1
1
  import { AXComponent } from '@acorex/cdk/common';
2
2
  import { isPlatformBrowser, AsyncPipe, NgTemplateOutlet } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
- import { inject, DOCUMENT, PLATFORM_ID, contentChild, ChangeDetectionStrategy, ViewEncapsulation, Component, Directive, input, model, viewChild, output, computed, afterNextRender, DestroyRef, signal, effect, untracked, NgModule } from '@angular/core';
4
+ import { inject, DOCUMENT, PLATFORM_ID, contentChild, ChangeDetectionStrategy, ViewEncapsulation, Component, Directive, input, output, signal, computed, effect, untracked, viewChild, afterNextRender, DestroyRef, InjectionToken, model, NgModule } from '@angular/core';
5
5
  import { AXAvatarComponent } from '@acorex/components/avatar';
6
6
  import { AXBadgeComponent, AXBadgeModule } from '@acorex/components/badge';
7
7
  import { AXButtonItemListComponent, AXButtonModule } from '@acorex/components/button';
@@ -139,19 +139,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
139
139
  */
140
140
  class AXCommentLikeComponent {
141
141
  constructor() {
142
- this.like = model.required(/* @ts-ignore */
142
+ /** Current like state from the parent. Later parent values replace a local toggle. */
143
+ this.like = input.required(/* @ts-ignore */
143
144
  ...(ngDevMode ? [{ debugName: "like" }] : /* istanbul ignore next */ []));
145
+ this.likeChange = output();
146
+ this.optimistic = signal(null, /* @ts-ignore */
147
+ ...(ngDevMode ? [{ debugName: "optimistic" }] : /* istanbul ignore next */ []));
148
+ this.seenLike = false;
149
+ this.hasSeenLike = false;
150
+ /** Parent value, unless the user just toggled and the parent has not caught up. */
151
+ this.pressed = computed(() => this.optimistic() ?? this.like(), /* @ts-ignore */
152
+ ...(ngDevMode ? [{ debugName: "pressed" }] : /* istanbul ignore next */ []));
153
+ effect(() => {
154
+ const incoming = this.like();
155
+ untracked(() => {
156
+ if (!this.hasSeenLike || incoming !== this.seenLike) {
157
+ this.hasSeenLike = true;
158
+ this.seenLike = incoming;
159
+ this.optimistic.set(null);
160
+ }
161
+ });
162
+ });
144
163
  }
145
164
  toggleLike() {
146
- this.like.update((prev) => !prev);
165
+ const next = !this.pressed();
166
+ this.optimistic.set(next);
167
+ this.likeChange.emit(next);
147
168
  }
148
169
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AXCommentLikeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
149
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: AXCommentLikeComponent, isStandalone: true, selector: "ax-comment-like", inputs: { like: { classPropertyName: "like", publicName: "like", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { like: "likeChange" }, providers: [{ provide: AXComponent, useExisting: AXCommentLikeComponent }], ngImport: i0, template: "<button\n type=\"button\"\n class=\"ax-comment-like-button\"\n [class.ax-state-liked]=\"like()\"\n [attr.aria-pressed]=\"like()\"\n (click)=\"toggleLike()\"\n>\n <ax-icon [icon]=\"like() ? 'ax-icon ax-icon-solid ax-icon-heart' : 'ax-icon ax-icon-heart'\"></ax-icon>\n <ax-text><ng-content /></ax-text>\n</button>\n", styles: ["@layer properties;@layer components{ax-comment-like{display:inline-flex}.ax-comment-like-button{display:inline-flex;min-height:calc(var(--spacing, .25rem) * 7);cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:12.5px;--tw-leading: calc(var(--spacing, .25rem) * 4);line-height:calc(var(--spacing, .25rem) * 4);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s))}@supports (color: color-mix(in lab,red,red)){.ax-comment-like-button{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 70%,transparent)}}.ax-comment-like-button ax-icon{font-size:14px;--tw-leading: 1;line-height:1}.ax-comment-like-button:hover:not(.ax-state-liked){color:rgba(var(--ax-sys-color-danger-400))}.ax-comment-like-button.ax-state-liked{color:rgba(var(--ax-sys-color-danger-surface))}.ax-comment-like-button:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color: rgba(var(--ax-sys-color-primary-surface));--tw-ring-offset-width: 2px;--tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style: none;outline-style:none}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-leading: initial;--tw-font-weight: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "component", type: AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
170
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: AXCommentLikeComponent, isStandalone: true, selector: "ax-comment-like", inputs: { like: { classPropertyName: "like", publicName: "like", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { likeChange: "likeChange" }, providers: [{ provide: AXComponent, useExisting: AXCommentLikeComponent }], ngImport: i0, template: "<button\n type=\"button\"\n class=\"ax-comment-like-button\"\n [class.ax-state-liked]=\"pressed()\"\n [attr.aria-pressed]=\"pressed()\"\n (click)=\"toggleLike()\"\n>\n <ax-icon [icon]=\"pressed() ? 'ax-icon ax-icon-solid ax-icon-heart' : 'ax-icon ax-icon-heart'\"></ax-icon>\n <ax-text><ng-content /></ax-text>\n</button>\n", styles: ["@layer properties;@layer components{ax-comment-like{display:inline-flex}.ax-comment-like-button{display:inline-flex;min-height:calc(var(--spacing, .25rem) * 7);cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:12.5px;--tw-leading: calc(var(--spacing, .25rem) * 4);line-height:calc(var(--spacing, .25rem) * 4);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s))}@supports (color: color-mix(in lab,red,red)){.ax-comment-like-button{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 70%,transparent)}}.ax-comment-like-button ax-icon{font-size:14px;--tw-leading: 1;line-height:1}.ax-comment-like-button:hover:not(.ax-state-liked){color:rgba(var(--ax-sys-color-danger-400))}.ax-comment-like-button.ax-state-liked{color:rgba(var(--ax-sys-color-danger-surface))}.ax-comment-like-button:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color: rgba(var(--ax-sys-color-primary-surface));--tw-ring-offset-width: 2px;--tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style: none;outline-style:none}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-leading: initial;--tw-font-weight: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "component", type: AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
150
171
  }
151
172
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AXCommentLikeComponent, decorators: [{
152
173
  type: Component,
153
- args: [{ selector: 'ax-comment-like', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [AXDecoratorIconComponent, AXDecoratorGenericComponent], providers: [{ provide: AXComponent, useExisting: AXCommentLikeComponent }], template: "<button\n type=\"button\"\n class=\"ax-comment-like-button\"\n [class.ax-state-liked]=\"like()\"\n [attr.aria-pressed]=\"like()\"\n (click)=\"toggleLike()\"\n>\n <ax-icon [icon]=\"like() ? 'ax-icon ax-icon-solid ax-icon-heart' : 'ax-icon ax-icon-heart'\"></ax-icon>\n <ax-text><ng-content /></ax-text>\n</button>\n", styles: ["@layer properties;@layer components{ax-comment-like{display:inline-flex}.ax-comment-like-button{display:inline-flex;min-height:calc(var(--spacing, .25rem) * 7);cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:12.5px;--tw-leading: calc(var(--spacing, .25rem) * 4);line-height:calc(var(--spacing, .25rem) * 4);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s))}@supports (color: color-mix(in lab,red,red)){.ax-comment-like-button{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 70%,transparent)}}.ax-comment-like-button ax-icon{font-size:14px;--tw-leading: 1;line-height:1}.ax-comment-like-button:hover:not(.ax-state-liked){color:rgba(var(--ax-sys-color-danger-400))}.ax-comment-like-button.ax-state-liked{color:rgba(var(--ax-sys-color-danger-surface))}.ax-comment-like-button:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color: rgba(var(--ax-sys-color-primary-surface));--tw-ring-offset-width: 2px;--tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style: none;outline-style:none}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-leading: initial;--tw-font-weight: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
154
- }], propDecorators: { like: [{ type: i0.Input, args: [{ isSignal: true, alias: "like", required: true }] }, { type: i0.Output, args: ["likeChange"] }] } });
174
+ args: [{ selector: 'ax-comment-like', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [AXDecoratorIconComponent, AXDecoratorGenericComponent], providers: [{ provide: AXComponent, useExisting: AXCommentLikeComponent }], template: "<button\n type=\"button\"\n class=\"ax-comment-like-button\"\n [class.ax-state-liked]=\"pressed()\"\n [attr.aria-pressed]=\"pressed()\"\n (click)=\"toggleLike()\"\n>\n <ax-icon [icon]=\"pressed() ? 'ax-icon ax-icon-solid ax-icon-heart' : 'ax-icon ax-icon-heart'\"></ax-icon>\n <ax-text><ng-content /></ax-text>\n</button>\n", styles: ["@layer properties;@layer components{ax-comment-like{display:inline-flex}.ax-comment-like-button{display:inline-flex;min-height:calc(var(--spacing, .25rem) * 7);cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:12.5px;--tw-leading: calc(var(--spacing, .25rem) * 4);line-height:calc(var(--spacing, .25rem) * 4);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s))}@supports (color: color-mix(in lab,red,red)){.ax-comment-like-button{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 70%,transparent)}}.ax-comment-like-button ax-icon{font-size:14px;--tw-leading: 1;line-height:1}.ax-comment-like-button:hover:not(.ax-state-liked){color:rgba(var(--ax-sys-color-danger-400))}.ax-comment-like-button.ax-state-liked{color:rgba(var(--ax-sys-color-danger-surface))}.ax-comment-like-button:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color: rgba(var(--ax-sys-color-primary-surface));--tw-ring-offset-width: 2px;--tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style: none;outline-style:none}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-leading: initial;--tw-font-weight: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
175
+ }], ctorParameters: () => [], propDecorators: { like: [{ type: i0.Input, args: [{ isSignal: true, alias: "like", required: true }] }], likeChange: [{ type: i0.Output, args: ["likeChange"] }] } });
155
176
 
156
177
  /**
157
178
  * A component for displaying the reply action on a comment.
@@ -195,9 +216,14 @@ class AXCommentItemComponent {
195
216
  ...(ngDevMode ? [{ debugName: "item" }] : /* istanbul ignore next */ []));
196
217
  this.replyCount = input(/* @ts-ignore */
197
218
  ...(ngDevMode ? [undefined, { debugName: "replyCount" }] : /* istanbul ignore next */ []));
198
- /** Two-way bindable state controlling whether nested replies are visible. */
199
- this.repliesExpanded = model(false, /* @ts-ignore */
219
+ /** Whether nested replies are visible. A later parent value replaces a local toggle. */
220
+ this.repliesExpanded = input(false, /* @ts-ignore */
200
221
  ...(ngDevMode ? [{ debugName: "repliesExpanded" }] : /* istanbul ignore next */ []));
222
+ this.repliesExpandedChange = output();
223
+ this.expanded = signal(false, /* @ts-ignore */
224
+ ...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
225
+ this.seenExpanded = false;
226
+ this.hasSeenExpanded = false;
201
227
  /** Whether replies for this item are currently being loaded. */
202
228
  this.loading = input(false, /* @ts-ignore */
203
229
  ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
@@ -224,12 +250,46 @@ class AXCommentItemComponent {
224
250
  ...(ngDevMode ? [{ debugName: "showOverflowMenu" }] : /* istanbul ignore next */ []));
225
251
  this.overflowItems = computed(() => this.toButtonItems(this.itemActions()), /* @ts-ignore */
226
252
  ...(ngDevMode ? [{ debugName: "overflowItems" }] : /* istanbul ignore next */ []));
253
+ this.templateContexts = computed(() => {
254
+ const ctx = this.itemContext();
255
+ return ctx ? [ctx] : [];
256
+ }, /* @ts-ignore */
257
+ ...(ngDevMode ? [{ debugName: "templateContexts" }] : /* istanbul ignore next */ []));
258
+ effect(() => {
259
+ const incoming = this.repliesExpanded();
260
+ untracked(() => {
261
+ if (!this.hasSeenExpanded || incoming !== this.seenExpanded) {
262
+ this.hasSeenExpanded = true;
263
+ this.seenExpanded = incoming;
264
+ this.expanded.set(incoming);
265
+ }
266
+ });
267
+ });
227
268
  afterNextRender(() => {
228
269
  if (this.itemTemplate())
229
270
  return;
230
271
  (this.projectedAvatar() ?? this.viewAvatar())?.size?.set(this.avatarSize);
231
272
  });
232
273
  }
274
+ /**
275
+ * Recreates the custom item template when the rendered snapshot changes.
276
+ * The outlet otherwise keeps the first context on screen.
277
+ */
278
+ templateContextKey(ctx) {
279
+ const item = ctx.item;
280
+ return [
281
+ item.id,
282
+ item.author,
283
+ item.content ?? '',
284
+ item.date ?? '',
285
+ item.edited ? 1 : 0,
286
+ item.editedAt ?? '',
287
+ ctx.likes,
288
+ ctx.liked ? 1 : 0,
289
+ ctx.replyCount,
290
+ ctx.repliesExpanded ? 1 : 0,
291
+ ].join('|');
292
+ }
233
293
  getColor(data) {
234
294
  return data.color ?? 'default';
235
295
  }
@@ -288,22 +348,26 @@ class AXCommentItemComponent {
288
348
  * Toggles the collapse state of the comment replies section.
289
349
  */
290
350
  toggleReplies() {
291
- this.repliesExpanded.update((v) => !v);
351
+ this.setExpanded(!this.expanded());
292
352
  }
293
353
  /**
294
354
  * Expands the nested replies section.
295
355
  */
296
356
  showReplies() {
297
- this.repliesExpanded.set(true);
357
+ this.setExpanded(true);
298
358
  }
299
359
  /**
300
360
  * Collapses the nested replies section.
301
361
  */
302
362
  hideReplies() {
303
- this.repliesExpanded.set(false);
363
+ this.setExpanded(false);
364
+ }
365
+ setExpanded(expanded) {
366
+ this.expanded.set(expanded);
367
+ this.repliesExpandedChange.emit(expanded);
304
368
  }
305
369
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AXCommentItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
306
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: AXCommentItemComponent, isStandalone: true, selector: "ax-comment-item", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: false, transformFunction: null }, replyCount: { classPropertyName: "replyCount", publicName: "replyCount", isSignal: true, isRequired: false, transformFunction: null }, repliesExpanded: { classPropertyName: "repliesExpanded", publicName: "repliesExpanded", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null }, itemContext: { classPropertyName: "itemContext", publicName: "itemContext", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { repliesExpanded: "repliesExpandedChange", likeChange: "likeChange", replyClick: "replyClick", actionClick: "actionClick" }, host: { properties: { "class.ax-comment-item-reply": "isReply", "class.ax-comment-item-custom": "!!itemTemplate()" } }, providers: [{ provide: AXComponent, useExisting: AXCommentItemComponent }], queries: [{ propertyName: "projectedAvatar", first: true, predicate: AXAvatarComponent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "viewAvatar", first: true, predicate: AXAvatarComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"ax-comment-layout\">\n @if (showDefaultDataLayout()) {\n @if (item(); as data) {\n <ax-avatar [color]=\"getColor(data)\" [size]=\"avatarSize\" look=\"twotone\" shape=\"rounded\">\n @if (data.avatar) {\n <ax-image [src]=\"data.avatar\"></ax-image>\n } @else {\n <ax-text>{{ getInitials(data) }}</ax-text>\n }\n </ax-avatar>\n }\n }\n <ng-content select=\"ax-avatar\" />\n\n <div class=\"ax-comment-main\">\n @if (itemTemplate(); as tpl) {\n <div class=\"ax-comment-custom-body\">\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"itemContext()\" />\n </div>\n } @else if (showDefaultDataLayout()) {\n @if (item(); as data) {\n <div class=\"ax-comment-header\">\n <div class=\"ax-comment-header-meta\">\n <ax-title>{{ data.author }}</ax-title>\n @if (data.isYou) {\n <ax-badge\n class=\"ax-sm ax-pill ax-comment-you-badge\"\n look=\"twotone\"\n color=\"primary\"\n [text]=\"('@acorex:comment.you' | translate | async) ?? 'You'\"\n ></ax-badge>\n }\n @if (showEdited(data)) {\n <ax-comment-edited [editedAt]=\"data.editedAt\" />\n }\n @if (data.date) {\n <ax-comment-date>{{ data.date }}</ax-comment-date>\n }\n </div>\n @if (showOverflowMenu()) {\n <ax-dropdown-button\n class=\"ax-sm ax-comment-menu-trigger\"\n mode=\"dropdown\"\n look=\"blank\"\n [iconOnly]=\"true\"\n text=\"More\"\n >\n <ax-prefix>\n <ax-icon icon=\"ax-icon ax-icon-more-horizontal\"></ax-icon>\n </ax-prefix>\n <ax-button-item-list [items]=\"overflowItems()\" (onItemClick)=\"handleOverflowClick($event)\">\n </ax-button-item-list>\n </ax-dropdown-button>\n }\n </div>\n <div class=\"ax-comment-body\">\n <ax-content>\n <div [innerHTML]=\"data.content\"></div>\n </ax-content>\n </div>\n }\n }\n\n <div class=\"ax-comment-default\" [hidden]=\"!useProjectedSlots()\">\n <div class=\"ax-comment-header\">\n <div class=\"ax-comment-header-meta\">\n <ng-content select=\"ax-title\" />\n <ng-content select=\"ax-subtitle\" />\n <ng-content select=\"ax-badge\" />\n <ng-content select=\"ax-comment-edited\" />\n <ng-content select=\"ax-comment-date\" />\n </div>\n <ng-content select=\"ax-comment-menu-options\" />\n </div>\n <div class=\"ax-comment-body\">\n <ng-content select=\"ax-content\" />\n </div>\n </div>\n\n <div class=\"ax-comment-actions\">\n @if (item(); as data) {\n <ax-comment-like [like]=\"!!data.liked\" (likeChange)=\"handleLike($event)\">\n {{ data.likes ?? 0 }}\n </ax-comment-like>\n <ax-comment-reply-text (click)=\"handleReply($event)\"></ax-comment-reply-text>\n }\n <ng-content select=\"ax-comment-like\" />\n <ng-content select=\"ax-comment-reply-text\" />\n @if (replyCount()) {\n <button\n type=\"button\"\n class=\"ax-comment-replies-toggle\"\n [attr.aria-expanded]=\"repliesExpanded()\"\n [attr.aria-busy]=\"loading()\"\n [disabled]=\"loading()\"\n (click)=\"toggleReplies()\"\n >\n <ax-icon\n [icon]=\"\n loading()\n ? 'ax-icon ax-icon-reload'\n : repliesExpanded()\n ? 'ax-icon ax-icon-chevron-up'\n : 'ax-icon ax-icon-chevron-down'\n \"\n [class.ax-comment-loading-icon]=\"loading()\"\n ></ax-icon>\n <span>\n {{ replyCount() }}\n {{ ((replyCount() ?? 0) > 1 ? '@acorex:comment.replies' : '@acorex:comment.reply') | translate | async }}\n </span>\n </button>\n }\n </div>\n\n <div class=\"ax-comment-replies\" [hidden]=\"!(replyCount() && repliesExpanded())\">\n @if (loading()) {\n <div class=\"ax-comment-replies-loading\">\n <ax-icon icon=\"ax-icon ax-icon-reload\" class=\"ax-comment-loading-icon\"></ax-icon>\n </div>\n }\n <ng-content select=\"ax-comment-item\" />\n <ng-content select=\"ax-comment-reply-more\" />\n <ng-content />\n </div>\n </div>\n</div>\n", styles: ["@layer properties;@layer components{ax-comment-item{display:block;transition-property:background-color;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s));--tw-duration: .7s;transition-duration:.7s;--tw-ease: var(--ease-in-out, cubic-bezier(.4, 0, .2, 1));transition-timing-function:var(--ease-in-out, cubic-bezier(.4, 0, .2, 1));padding-block:var(--ax-comp-comment-padding-y, 12px)}ax-comment-item.ax-state-highlight{background-color:color-mix(in srgb,rgba(var(--ax-sys-color-primary-surface)) 8%,transparent);border-radius:8px}@supports (color: color-mix(in lab,red,red)){ax-comment-item.ax-state-highlight{background-color:color-mix(in srgb,var(--color-primary) 8%,transparent)}}ax-comment-item .ax-comment-layout{display:flex;min-width:calc(var(--spacing, .25rem) * 0);align-items:flex-start;gap:var(--ax-comp-comment-gap, .5rem)}ax-comment-item .ax-comment-layout>ax-avatar{flex-shrink:0}ax-comment-item .ax-comment-main{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column}ax-comment-item .ax-comment-default[hidden]{display:none}ax-comment-item .ax-comment-header{display:flex;min-width:calc(var(--spacing, .25rem) * 0);align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 2)}ax-comment-item .ax-comment-custom-body{width:100%;min-width:calc(var(--spacing, .25rem) * 0)}ax-comment-item .ax-comment-menu-trigger{flex-shrink:0}@media(hover:hover){ax-comment-item .ax-comment-menu-trigger{opacity:0%;transition:opacity .15s ease}ax-comment-item .ax-comment-layout:has(>ax-avatar:hover)>.ax-comment-main>.ax-comment-header>.ax-comment-menu-trigger,ax-comment-item .ax-comment-main:has(>.ax-comment-header:hover)>.ax-comment-header>.ax-comment-menu-trigger,ax-comment-item .ax-comment-main:has(>.ax-comment-body:hover)>.ax-comment-header>.ax-comment-menu-trigger,ax-comment-item .ax-comment-main:has(>.ax-comment-actions:hover)>.ax-comment-header>.ax-comment-menu-trigger,ax-comment-item .ax-comment-header:focus-within>.ax-comment-menu-trigger{opacity:100%}}ax-comment-item .ax-comment-header-meta{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex-wrap:wrap;align-items:center}ax-comment-item ax-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface))}ax-comment-item ax-subtitle{margin-inline-start:calc(var(--spacing, .25rem) * 1.5);font-size:11px;--tw-leading: calc(var(--spacing, .25rem) * 4);line-height:calc(var(--spacing, .25rem) * 4);--tw-font-weight: var(--font-weight-normal, 400);font-weight:var(--font-weight-normal, 400);color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){ax-comment-item ax-subtitle{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 55%,transparent)}}ax-comment-item .ax-comment-you-badge{margin-inline-start:calc(var(--spacing, .25rem) * 1.5);flex-shrink:0}ax-comment-item .ax-comment-body{margin-top:calc(var(--spacing, .25rem) * 1)}ax-comment-item ax-content{display:block;font-size:13.5px;overflow-wrap:break-word;color:rgba(var(--ax-sys-color-on-surface));line-height:1.6}ax-comment-item ax-content a,ax-comment-item ax-content .ax-mention{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-primary-surface));text-decoration-line:none}ax-comment-item ax-content a:hover,ax-comment-item ax-content .ax-mention:hover{text-decoration-line:underline}ax-comment-item ax-content ul,ax-comment-item ax-content ol{margin-top:calc(var(--spacing, .25rem) * 1);margin-bottom:calc(var(--spacing, .25rem) * 0);padding-inline-start:calc(var(--spacing, .25rem) * 5)}ax-comment-item ax-content li{margin-block:calc(var(--spacing, .25rem) * .5)}ax-comment-item ax-content p{margin:calc(var(--spacing, .25rem) * 0)}ax-comment-item .ax-comment-actions{margin-top:calc(var(--spacing, .25rem) * 1);display:flex;min-height:calc(var(--spacing, .25rem) * 7);flex-wrap:wrap;align-items:center;gap:calc(var(--spacing, .25rem) * 5)}ax-comment-item ax-comment-like,ax-comment-item ax-comment-reply-text,ax-comment-item .ax-comment-replies-toggle{-webkit-user-select:none;user-select:none}ax-comment-item .ax-comment-replies-toggle{display:inline-flex;min-height:calc(var(--spacing, .25rem) * 7);cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 1);border-radius:var(--radius-md, .375rem);border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:12.5px;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-primary-surface))}ax-comment-item .ax-comment-replies-toggle ax-icon{font-size:11px;--tw-leading: 1;line-height:1}ax-comment-item .ax-comment-replies-toggle:hover:not(:disabled){text-decoration-line:underline}ax-comment-item .ax-comment-replies-toggle:disabled{cursor:wait;opacity:70%}ax-comment-item .ax-comment-replies-toggle:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color: rgba(var(--ax-sys-color-primary-surface));--tw-ring-offset-width: 2px;--tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style: none;outline-style:none}ax-comment-item .ax-comment-loading-icon{animation:var(--animate-spin, spin 1s linear infinite)}ax-comment-item .ax-comment-replies-loading{display:flex;min-height:calc(var(--spacing, .25rem) * 8);align-items:center;padding-block:calc(var(--spacing, .25rem) * 1);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){ax-comment-item .ax-comment-replies-loading{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 40%,transparent)}}ax-comment-item .ax-comment-replies{margin-top:calc(var(--spacing, .25rem) * 3);display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex-direction:column}ax-comment-item .ax-comment-replies[hidden]{display:none}ax-comment-item ax-comment-reply-more{margin-top:calc(var(--spacing, .25rem) * 1);cursor:pointer;font-size:12.5px;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-primary-surface))}ax-comment-item ax-comment-reply-more:hover{text-decoration-line:underline}ax-comment-item ax-comment-menu-options{margin-inline-end:calc(var(--spacing, .25rem) * -1);margin-top:calc(var(--spacing, .25rem) * -1);flex-shrink:0}ax-comment-item.ax-comment-item-reply{padding-block:10px}ax-comment-item.ax-comment-item-custom .ax-comment-actions{margin-top:calc(var(--spacing, .25rem) * 2)}ax-comment-item.ax-comment-item-custom .ax-comment-replies{margin-inline-start:.5rem;padding-inline-start:1.25rem;border-inline-start:2px solid color-mix(in srgb,rgba(var(--ax-sys-color-primary-surface)) 35%,transparent)}@supports (color: color-mix(in lab,red,red)){ax-comment-item.ax-comment-item-custom .ax-comment-replies{border-inline-start:2px solid color-mix(in srgb,var(--color-primary) 35%,transparent)}}ax-comment-item.ax-comment-item-custom.ax-comment-item-reply{padding-block:8px}}@property --tw-duration{syntax: \"*\"; inherits: false;}@property --tw-ease{syntax: \"*\"; inherits: false;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@keyframes spin{to{transform:rotate(360deg)}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-duration: initial;--tw-ease: initial;--tw-leading: initial;--tw-font-weight: initial;--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "component", type: AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXCommentDateComponent, selector: "ax-comment-date" }, { kind: "component", type: AXCommentEditedComponent, selector: "ax-comment-edited", inputs: ["editedAt"] }, { kind: "component", type: AXCommentLikeComponent, selector: "ax-comment-like", inputs: ["like"], outputs: ["likeChange"] }, { kind: "component", type: AXCommentReplyTextComponent, selector: "ax-comment-reply-text" }, { kind: "component", type: AXDropdownButtonComponent, selector: "ax-dropdown-button", inputs: ["disabled", "size", "text", "selected", "color", "look", "type", "mode", "iconOnly"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "lookChange", "colorChange", "disabledChange"] }, { kind: "component", type: AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
370
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: AXCommentItemComponent, isStandalone: true, selector: "ax-comment-item", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: false, transformFunction: null }, replyCount: { classPropertyName: "replyCount", publicName: "replyCount", isSignal: true, isRequired: false, transformFunction: null }, repliesExpanded: { classPropertyName: "repliesExpanded", publicName: "repliesExpanded", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null }, itemContext: { classPropertyName: "itemContext", publicName: "itemContext", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { repliesExpandedChange: "repliesExpandedChange", likeChange: "likeChange", replyClick: "replyClick", actionClick: "actionClick" }, host: { properties: { "class.ax-comment-item-reply": "isReply", "class.ax-comment-item-custom": "!!itemTemplate()" } }, providers: [{ provide: AXComponent, useExisting: AXCommentItemComponent }], queries: [{ propertyName: "projectedAvatar", first: true, predicate: AXAvatarComponent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "viewAvatar", first: true, predicate: AXAvatarComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"ax-comment-layout\">\n @if (showDefaultDataLayout()) {\n @if (item(); as data) {\n <ax-avatar [color]=\"getColor(data)\" [size]=\"avatarSize\" look=\"twotone\" shape=\"rounded\">\n @if (data.avatar) {\n <ax-image [src]=\"data.avatar\"></ax-image>\n } @else {\n <ax-text>{{ getInitials(data) }}</ax-text>\n }\n </ax-avatar>\n }\n }\n <ng-content select=\"ax-avatar\" />\n\n <div class=\"ax-comment-main\">\n @if (itemTemplate(); as tpl) {\n @for (ctx of templateContexts(); track templateContextKey(ctx)) {\n <div class=\"ax-comment-custom-body\">\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"ctx\" />\n </div>\n }\n } @else if (showDefaultDataLayout()) {\n @if (item(); as data) {\n <div class=\"ax-comment-header\">\n <div class=\"ax-comment-header-meta\">\n <ax-title>{{ data.author }}</ax-title>\n @if (data.isYou) {\n <ax-badge\n class=\"ax-sm ax-pill ax-comment-you-badge\"\n look=\"twotone\"\n color=\"primary\"\n [text]=\"('@acorex:comment.you' | translate | async) ?? 'You'\"\n ></ax-badge>\n }\n @if (showEdited(data)) {\n <ax-comment-edited [editedAt]=\"data.editedAt\" />\n }\n @if (data.date) {\n <ax-comment-date>{{ data.date }}</ax-comment-date>\n }\n </div>\n @if (showOverflowMenu()) {\n <ax-dropdown-button\n class=\"ax-sm ax-comment-menu-trigger\"\n mode=\"dropdown\"\n look=\"blank\"\n [iconOnly]=\"true\"\n text=\"More\"\n >\n <ax-prefix>\n <ax-icon icon=\"ax-icon ax-icon-more-horizontal\"></ax-icon>\n </ax-prefix>\n <ax-button-item-list [items]=\"overflowItems()\" (onItemClick)=\"handleOverflowClick($event)\">\n </ax-button-item-list>\n </ax-dropdown-button>\n }\n </div>\n <div class=\"ax-comment-body\">\n <ax-content>\n <div [innerHTML]=\"data.content\"></div>\n </ax-content>\n </div>\n }\n }\n\n <div class=\"ax-comment-default\" [hidden]=\"!useProjectedSlots()\">\n <div class=\"ax-comment-header\">\n <div class=\"ax-comment-header-meta\">\n <ng-content select=\"ax-title\" />\n <ng-content select=\"ax-subtitle\" />\n <ng-content select=\"ax-badge\" />\n <ng-content select=\"ax-comment-edited\" />\n <ng-content select=\"ax-comment-date\" />\n </div>\n <ng-content select=\"ax-comment-menu-options\" />\n </div>\n <div class=\"ax-comment-body\">\n <ng-content select=\"ax-content\" />\n </div>\n </div>\n\n <div class=\"ax-comment-actions\">\n @if (item(); as data) {\n <ax-comment-like [like]=\"!!data.liked\" (likeChange)=\"handleLike($event)\">\n {{ data.likes ?? 0 }}\n </ax-comment-like>\n <ax-comment-reply-text (click)=\"handleReply($event)\"></ax-comment-reply-text>\n }\n <ng-content select=\"ax-comment-like\" />\n <ng-content select=\"ax-comment-reply-text\" />\n @if (replyCount()) {\n <button\n type=\"button\"\n class=\"ax-comment-replies-toggle\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-busy]=\"loading()\"\n [disabled]=\"loading()\"\n (click)=\"toggleReplies()\"\n >\n <ax-icon\n [icon]=\"\n loading()\n ? 'ax-icon ax-icon-reload'\n : expanded()\n ? 'ax-icon ax-icon-chevron-up'\n : 'ax-icon ax-icon-chevron-down'\n \"\n [class.ax-comment-loading-icon]=\"loading()\"\n ></ax-icon>\n <span>\n {{ replyCount() }}\n {{ ((replyCount() ?? 0) > 1 ? '@acorex:comment.replies' : '@acorex:comment.reply') | translate | async }}\n </span>\n </button>\n }\n </div>\n\n <div class=\"ax-comment-replies\" [hidden]=\"!(replyCount() && expanded())\">\n @if (loading()) {\n <div class=\"ax-comment-replies-loading\">\n <ax-icon icon=\"ax-icon ax-icon-reload\" class=\"ax-comment-loading-icon\"></ax-icon>\n </div>\n }\n <ng-content select=\"ax-comment-item\" />\n <ng-content select=\"ax-comment-reply-more\" />\n <ng-content />\n </div>\n </div>\n</div>\n", styles: ["@layer properties;@layer components{ax-comment-item{display:block;transition-property:background-color;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s));--tw-duration: .7s;transition-duration:.7s;--tw-ease: var(--ease-in-out, cubic-bezier(.4, 0, .2, 1));transition-timing-function:var(--ease-in-out, cubic-bezier(.4, 0, .2, 1));padding-block:var(--ax-comp-comment-padding-y, 12px)}ax-comment-item.ax-state-highlight{background-color:color-mix(in srgb,rgba(var(--ax-sys-color-primary-surface)) 8%,transparent);border-radius:8px}@supports (color: color-mix(in lab,red,red)){ax-comment-item.ax-state-highlight{background-color:color-mix(in srgb,var(--color-primary) 8%,transparent)}}ax-comment-item .ax-comment-layout{display:flex;min-width:calc(var(--spacing, .25rem) * 0);align-items:flex-start;gap:var(--ax-comp-comment-gap, .5rem)}ax-comment-item .ax-comment-layout>ax-avatar{flex-shrink:0}ax-comment-item .ax-comment-main{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column}ax-comment-item .ax-comment-default[hidden]{display:none}ax-comment-item .ax-comment-header{display:flex;min-width:calc(var(--spacing, .25rem) * 0);align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 2)}ax-comment-item .ax-comment-custom-body{width:100%;min-width:calc(var(--spacing, .25rem) * 0)}ax-comment-item .ax-comment-menu-trigger{flex-shrink:0}@media(hover:hover){ax-comment-item .ax-comment-menu-trigger{opacity:0%;transition:opacity .15s ease}ax-comment-item .ax-comment-layout:has(>ax-avatar:hover)>.ax-comment-main>.ax-comment-header>.ax-comment-menu-trigger,ax-comment-item .ax-comment-main:has(>.ax-comment-header:hover)>.ax-comment-header>.ax-comment-menu-trigger,ax-comment-item .ax-comment-main:has(>.ax-comment-body:hover)>.ax-comment-header>.ax-comment-menu-trigger,ax-comment-item .ax-comment-main:has(>.ax-comment-actions:hover)>.ax-comment-header>.ax-comment-menu-trigger,ax-comment-item .ax-comment-header:focus-within>.ax-comment-menu-trigger{opacity:100%}}ax-comment-item .ax-comment-header-meta{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex-wrap:wrap;align-items:center}ax-comment-item ax-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface))}ax-comment-item ax-subtitle{margin-inline-start:calc(var(--spacing, .25rem) * 1.5);font-size:11px;--tw-leading: calc(var(--spacing, .25rem) * 4);line-height:calc(var(--spacing, .25rem) * 4);--tw-font-weight: var(--font-weight-normal, 400);font-weight:var(--font-weight-normal, 400);color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){ax-comment-item ax-subtitle{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 55%,transparent)}}ax-comment-item .ax-comment-you-badge{margin-inline-start:calc(var(--spacing, .25rem) * 1.5);flex-shrink:0}ax-comment-item .ax-comment-body{margin-top:calc(var(--spacing, .25rem) * 1)}ax-comment-item ax-content{display:block;font-size:13.5px;overflow-wrap:break-word;color:rgba(var(--ax-sys-color-on-surface));line-height:1.6}ax-comment-item ax-content a,ax-comment-item ax-content .ax-mention{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-primary-surface));text-decoration-line:none}ax-comment-item ax-content a:hover,ax-comment-item ax-content .ax-mention:hover{text-decoration-line:underline}ax-comment-item ax-content ul,ax-comment-item ax-content ol{margin-top:calc(var(--spacing, .25rem) * 1);margin-bottom:calc(var(--spacing, .25rem) * 0);padding-inline-start:calc(var(--spacing, .25rem) * 5)}ax-comment-item ax-content li{margin-block:calc(var(--spacing, .25rem) * .5)}ax-comment-item ax-content p{margin:calc(var(--spacing, .25rem) * 0)}ax-comment-item .ax-comment-actions{margin-top:calc(var(--spacing, .25rem) * 1);display:flex;min-height:calc(var(--spacing, .25rem) * 7);flex-wrap:wrap;align-items:center;gap:calc(var(--spacing, .25rem) * 5)}ax-comment-item ax-comment-like,ax-comment-item ax-comment-reply-text,ax-comment-item .ax-comment-replies-toggle{-webkit-user-select:none;user-select:none}ax-comment-item .ax-comment-replies-toggle{display:inline-flex;min-height:calc(var(--spacing, .25rem) * 7);cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 1);border-radius:var(--radius-md, .375rem);border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:12.5px;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-primary-surface))}ax-comment-item .ax-comment-replies-toggle ax-icon{font-size:11px;--tw-leading: 1;line-height:1}ax-comment-item .ax-comment-replies-toggle:hover:not(:disabled){text-decoration-line:underline}ax-comment-item .ax-comment-replies-toggle:disabled{cursor:wait;opacity:70%}ax-comment-item .ax-comment-replies-toggle:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color: rgba(var(--ax-sys-color-primary-surface));--tw-ring-offset-width: 2px;--tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style: none;outline-style:none}ax-comment-item .ax-comment-loading-icon{animation:var(--animate-spin, spin 1s linear infinite)}ax-comment-item .ax-comment-replies-loading{display:flex;min-height:calc(var(--spacing, .25rem) * 8);align-items:center;padding-block:calc(var(--spacing, .25rem) * 1);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){ax-comment-item .ax-comment-replies-loading{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 40%,transparent)}}ax-comment-item .ax-comment-replies{margin-top:calc(var(--spacing, .25rem) * 3);display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex-direction:column}ax-comment-item .ax-comment-replies[hidden]{display:none}ax-comment-item ax-comment-reply-more{margin-top:calc(var(--spacing, .25rem) * 1);cursor:pointer;font-size:12.5px;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-primary-surface))}ax-comment-item ax-comment-reply-more:hover{text-decoration-line:underline}ax-comment-item ax-comment-menu-options{margin-inline-end:calc(var(--spacing, .25rem) * -1);margin-top:calc(var(--spacing, .25rem) * -1);flex-shrink:0}ax-comment-item.ax-comment-item-reply{padding-block:10px}ax-comment-item.ax-comment-item-custom .ax-comment-actions{margin-top:calc(var(--spacing, .25rem) * 2)}ax-comment-item.ax-comment-item-custom .ax-comment-replies{margin-inline-start:.5rem;padding-inline-start:1.25rem;border-inline-start:2px solid color-mix(in srgb,rgba(var(--ax-sys-color-primary-surface)) 35%,transparent)}@supports (color: color-mix(in lab,red,red)){ax-comment-item.ax-comment-item-custom .ax-comment-replies{border-inline-start:2px solid color-mix(in srgb,var(--color-primary) 35%,transparent)}}ax-comment-item.ax-comment-item-custom.ax-comment-item-reply{padding-block:8px}}@property --tw-duration{syntax: \"*\"; inherits: false;}@property --tw-ease{syntax: \"*\"; inherits: false;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@keyframes spin{to{transform:rotate(360deg)}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-duration: initial;--tw-ease: initial;--tw-leading: initial;--tw-font-weight: initial;--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "component", type: AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXCommentDateComponent, selector: "ax-comment-date" }, { kind: "component", type: AXCommentEditedComponent, selector: "ax-comment-edited", inputs: ["editedAt"] }, { kind: "component", type: AXCommentLikeComponent, selector: "ax-comment-like", inputs: ["like"], outputs: ["likeChange"] }, { kind: "component", type: AXCommentReplyTextComponent, selector: "ax-comment-reply-text" }, { kind: "component", type: AXDropdownButtonComponent, selector: "ax-dropdown-button", inputs: ["disabled", "size", "text", "selected", "color", "look", "type", "mode", "iconOnly"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "lookChange", "colorChange", "disabledChange"] }, { kind: "component", type: AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
307
371
  }
308
372
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AXCommentItemComponent, decorators: [{
309
373
  type: Component,
@@ -325,8 +389,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
325
389
  ], providers: [{ provide: AXComponent, useExisting: AXCommentItemComponent }], host: {
326
390
  '[class.ax-comment-item-reply]': 'isReply',
327
391
  '[class.ax-comment-item-custom]': '!!itemTemplate()',
328
- }, template: "<div class=\"ax-comment-layout\">\n @if (showDefaultDataLayout()) {\n @if (item(); as data) {\n <ax-avatar [color]=\"getColor(data)\" [size]=\"avatarSize\" look=\"twotone\" shape=\"rounded\">\n @if (data.avatar) {\n <ax-image [src]=\"data.avatar\"></ax-image>\n } @else {\n <ax-text>{{ getInitials(data) }}</ax-text>\n }\n </ax-avatar>\n }\n }\n <ng-content select=\"ax-avatar\" />\n\n <div class=\"ax-comment-main\">\n @if (itemTemplate(); as tpl) {\n <div class=\"ax-comment-custom-body\">\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"itemContext()\" />\n </div>\n } @else if (showDefaultDataLayout()) {\n @if (item(); as data) {\n <div class=\"ax-comment-header\">\n <div class=\"ax-comment-header-meta\">\n <ax-title>{{ data.author }}</ax-title>\n @if (data.isYou) {\n <ax-badge\n class=\"ax-sm ax-pill ax-comment-you-badge\"\n look=\"twotone\"\n color=\"primary\"\n [text]=\"('@acorex:comment.you' | translate | async) ?? 'You'\"\n ></ax-badge>\n }\n @if (showEdited(data)) {\n <ax-comment-edited [editedAt]=\"data.editedAt\" />\n }\n @if (data.date) {\n <ax-comment-date>{{ data.date }}</ax-comment-date>\n }\n </div>\n @if (showOverflowMenu()) {\n <ax-dropdown-button\n class=\"ax-sm ax-comment-menu-trigger\"\n mode=\"dropdown\"\n look=\"blank\"\n [iconOnly]=\"true\"\n text=\"More\"\n >\n <ax-prefix>\n <ax-icon icon=\"ax-icon ax-icon-more-horizontal\"></ax-icon>\n </ax-prefix>\n <ax-button-item-list [items]=\"overflowItems()\" (onItemClick)=\"handleOverflowClick($event)\">\n </ax-button-item-list>\n </ax-dropdown-button>\n }\n </div>\n <div class=\"ax-comment-body\">\n <ax-content>\n <div [innerHTML]=\"data.content\"></div>\n </ax-content>\n </div>\n }\n }\n\n <div class=\"ax-comment-default\" [hidden]=\"!useProjectedSlots()\">\n <div class=\"ax-comment-header\">\n <div class=\"ax-comment-header-meta\">\n <ng-content select=\"ax-title\" />\n <ng-content select=\"ax-subtitle\" />\n <ng-content select=\"ax-badge\" />\n <ng-content select=\"ax-comment-edited\" />\n <ng-content select=\"ax-comment-date\" />\n </div>\n <ng-content select=\"ax-comment-menu-options\" />\n </div>\n <div class=\"ax-comment-body\">\n <ng-content select=\"ax-content\" />\n </div>\n </div>\n\n <div class=\"ax-comment-actions\">\n @if (item(); as data) {\n <ax-comment-like [like]=\"!!data.liked\" (likeChange)=\"handleLike($event)\">\n {{ data.likes ?? 0 }}\n </ax-comment-like>\n <ax-comment-reply-text (click)=\"handleReply($event)\"></ax-comment-reply-text>\n }\n <ng-content select=\"ax-comment-like\" />\n <ng-content select=\"ax-comment-reply-text\" />\n @if (replyCount()) {\n <button\n type=\"button\"\n class=\"ax-comment-replies-toggle\"\n [attr.aria-expanded]=\"repliesExpanded()\"\n [attr.aria-busy]=\"loading()\"\n [disabled]=\"loading()\"\n (click)=\"toggleReplies()\"\n >\n <ax-icon\n [icon]=\"\n loading()\n ? 'ax-icon ax-icon-reload'\n : repliesExpanded()\n ? 'ax-icon ax-icon-chevron-up'\n : 'ax-icon ax-icon-chevron-down'\n \"\n [class.ax-comment-loading-icon]=\"loading()\"\n ></ax-icon>\n <span>\n {{ replyCount() }}\n {{ ((replyCount() ?? 0) > 1 ? '@acorex:comment.replies' : '@acorex:comment.reply') | translate | async }}\n </span>\n </button>\n }\n </div>\n\n <div class=\"ax-comment-replies\" [hidden]=\"!(replyCount() && repliesExpanded())\">\n @if (loading()) {\n <div class=\"ax-comment-replies-loading\">\n <ax-icon icon=\"ax-icon ax-icon-reload\" class=\"ax-comment-loading-icon\"></ax-icon>\n </div>\n }\n <ng-content select=\"ax-comment-item\" />\n <ng-content select=\"ax-comment-reply-more\" />\n <ng-content />\n </div>\n </div>\n</div>\n", styles: ["@layer properties;@layer components{ax-comment-item{display:block;transition-property:background-color;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s));--tw-duration: .7s;transition-duration:.7s;--tw-ease: var(--ease-in-out, cubic-bezier(.4, 0, .2, 1));transition-timing-function:var(--ease-in-out, cubic-bezier(.4, 0, .2, 1));padding-block:var(--ax-comp-comment-padding-y, 12px)}ax-comment-item.ax-state-highlight{background-color:color-mix(in srgb,rgba(var(--ax-sys-color-primary-surface)) 8%,transparent);border-radius:8px}@supports (color: color-mix(in lab,red,red)){ax-comment-item.ax-state-highlight{background-color:color-mix(in srgb,var(--color-primary) 8%,transparent)}}ax-comment-item .ax-comment-layout{display:flex;min-width:calc(var(--spacing, .25rem) * 0);align-items:flex-start;gap:var(--ax-comp-comment-gap, .5rem)}ax-comment-item .ax-comment-layout>ax-avatar{flex-shrink:0}ax-comment-item .ax-comment-main{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column}ax-comment-item .ax-comment-default[hidden]{display:none}ax-comment-item .ax-comment-header{display:flex;min-width:calc(var(--spacing, .25rem) * 0);align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 2)}ax-comment-item .ax-comment-custom-body{width:100%;min-width:calc(var(--spacing, .25rem) * 0)}ax-comment-item .ax-comment-menu-trigger{flex-shrink:0}@media(hover:hover){ax-comment-item .ax-comment-menu-trigger{opacity:0%;transition:opacity .15s ease}ax-comment-item .ax-comment-layout:has(>ax-avatar:hover)>.ax-comment-main>.ax-comment-header>.ax-comment-menu-trigger,ax-comment-item .ax-comment-main:has(>.ax-comment-header:hover)>.ax-comment-header>.ax-comment-menu-trigger,ax-comment-item .ax-comment-main:has(>.ax-comment-body:hover)>.ax-comment-header>.ax-comment-menu-trigger,ax-comment-item .ax-comment-main:has(>.ax-comment-actions:hover)>.ax-comment-header>.ax-comment-menu-trigger,ax-comment-item .ax-comment-header:focus-within>.ax-comment-menu-trigger{opacity:100%}}ax-comment-item .ax-comment-header-meta{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex-wrap:wrap;align-items:center}ax-comment-item ax-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface))}ax-comment-item ax-subtitle{margin-inline-start:calc(var(--spacing, .25rem) * 1.5);font-size:11px;--tw-leading: calc(var(--spacing, .25rem) * 4);line-height:calc(var(--spacing, .25rem) * 4);--tw-font-weight: var(--font-weight-normal, 400);font-weight:var(--font-weight-normal, 400);color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){ax-comment-item ax-subtitle{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 55%,transparent)}}ax-comment-item .ax-comment-you-badge{margin-inline-start:calc(var(--spacing, .25rem) * 1.5);flex-shrink:0}ax-comment-item .ax-comment-body{margin-top:calc(var(--spacing, .25rem) * 1)}ax-comment-item ax-content{display:block;font-size:13.5px;overflow-wrap:break-word;color:rgba(var(--ax-sys-color-on-surface));line-height:1.6}ax-comment-item ax-content a,ax-comment-item ax-content .ax-mention{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-primary-surface));text-decoration-line:none}ax-comment-item ax-content a:hover,ax-comment-item ax-content .ax-mention:hover{text-decoration-line:underline}ax-comment-item ax-content ul,ax-comment-item ax-content ol{margin-top:calc(var(--spacing, .25rem) * 1);margin-bottom:calc(var(--spacing, .25rem) * 0);padding-inline-start:calc(var(--spacing, .25rem) * 5)}ax-comment-item ax-content li{margin-block:calc(var(--spacing, .25rem) * .5)}ax-comment-item ax-content p{margin:calc(var(--spacing, .25rem) * 0)}ax-comment-item .ax-comment-actions{margin-top:calc(var(--spacing, .25rem) * 1);display:flex;min-height:calc(var(--spacing, .25rem) * 7);flex-wrap:wrap;align-items:center;gap:calc(var(--spacing, .25rem) * 5)}ax-comment-item ax-comment-like,ax-comment-item ax-comment-reply-text,ax-comment-item .ax-comment-replies-toggle{-webkit-user-select:none;user-select:none}ax-comment-item .ax-comment-replies-toggle{display:inline-flex;min-height:calc(var(--spacing, .25rem) * 7);cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 1);border-radius:var(--radius-md, .375rem);border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:12.5px;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-primary-surface))}ax-comment-item .ax-comment-replies-toggle ax-icon{font-size:11px;--tw-leading: 1;line-height:1}ax-comment-item .ax-comment-replies-toggle:hover:not(:disabled){text-decoration-line:underline}ax-comment-item .ax-comment-replies-toggle:disabled{cursor:wait;opacity:70%}ax-comment-item .ax-comment-replies-toggle:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color: rgba(var(--ax-sys-color-primary-surface));--tw-ring-offset-width: 2px;--tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style: none;outline-style:none}ax-comment-item .ax-comment-loading-icon{animation:var(--animate-spin, spin 1s linear infinite)}ax-comment-item .ax-comment-replies-loading{display:flex;min-height:calc(var(--spacing, .25rem) * 8);align-items:center;padding-block:calc(var(--spacing, .25rem) * 1);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){ax-comment-item .ax-comment-replies-loading{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 40%,transparent)}}ax-comment-item .ax-comment-replies{margin-top:calc(var(--spacing, .25rem) * 3);display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex-direction:column}ax-comment-item .ax-comment-replies[hidden]{display:none}ax-comment-item ax-comment-reply-more{margin-top:calc(var(--spacing, .25rem) * 1);cursor:pointer;font-size:12.5px;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-primary-surface))}ax-comment-item ax-comment-reply-more:hover{text-decoration-line:underline}ax-comment-item ax-comment-menu-options{margin-inline-end:calc(var(--spacing, .25rem) * -1);margin-top:calc(var(--spacing, .25rem) * -1);flex-shrink:0}ax-comment-item.ax-comment-item-reply{padding-block:10px}ax-comment-item.ax-comment-item-custom .ax-comment-actions{margin-top:calc(var(--spacing, .25rem) * 2)}ax-comment-item.ax-comment-item-custom .ax-comment-replies{margin-inline-start:.5rem;padding-inline-start:1.25rem;border-inline-start:2px solid color-mix(in srgb,rgba(var(--ax-sys-color-primary-surface)) 35%,transparent)}@supports (color: color-mix(in lab,red,red)){ax-comment-item.ax-comment-item-custom .ax-comment-replies{border-inline-start:2px solid color-mix(in srgb,var(--color-primary) 35%,transparent)}}ax-comment-item.ax-comment-item-custom.ax-comment-item-reply{padding-block:8px}}@property --tw-duration{syntax: \"*\"; inherits: false;}@property --tw-ease{syntax: \"*\"; inherits: false;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@keyframes spin{to{transform:rotate(360deg)}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-duration: initial;--tw-ease: initial;--tw-leading: initial;--tw-font-weight: initial;--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
329
- }], ctorParameters: () => [], propDecorators: { projectedAvatar: [{ type: i0.ContentChild, args: [i0.forwardRef(() => AXAvatarComponent), { isSignal: true }] }], viewAvatar: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXAvatarComponent), { isSignal: true }] }], item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: false }] }], replyCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "replyCount", required: false }] }], repliesExpanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "repliesExpanded", required: false }] }, { type: i0.Output, args: ["repliesExpandedChange"] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], itemTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemTemplate", required: false }] }], itemContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemContext", required: false }] }], likeChange: [{ type: i0.Output, args: ["likeChange"] }], replyClick: [{ type: i0.Output, args: ["replyClick"] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }] } });
392
+ }, template: "<div class=\"ax-comment-layout\">\n @if (showDefaultDataLayout()) {\n @if (item(); as data) {\n <ax-avatar [color]=\"getColor(data)\" [size]=\"avatarSize\" look=\"twotone\" shape=\"rounded\">\n @if (data.avatar) {\n <ax-image [src]=\"data.avatar\"></ax-image>\n } @else {\n <ax-text>{{ getInitials(data) }}</ax-text>\n }\n </ax-avatar>\n }\n }\n <ng-content select=\"ax-avatar\" />\n\n <div class=\"ax-comment-main\">\n @if (itemTemplate(); as tpl) {\n @for (ctx of templateContexts(); track templateContextKey(ctx)) {\n <div class=\"ax-comment-custom-body\">\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"ctx\" />\n </div>\n }\n } @else if (showDefaultDataLayout()) {\n @if (item(); as data) {\n <div class=\"ax-comment-header\">\n <div class=\"ax-comment-header-meta\">\n <ax-title>{{ data.author }}</ax-title>\n @if (data.isYou) {\n <ax-badge\n class=\"ax-sm ax-pill ax-comment-you-badge\"\n look=\"twotone\"\n color=\"primary\"\n [text]=\"('@acorex:comment.you' | translate | async) ?? 'You'\"\n ></ax-badge>\n }\n @if (showEdited(data)) {\n <ax-comment-edited [editedAt]=\"data.editedAt\" />\n }\n @if (data.date) {\n <ax-comment-date>{{ data.date }}</ax-comment-date>\n }\n </div>\n @if (showOverflowMenu()) {\n <ax-dropdown-button\n class=\"ax-sm ax-comment-menu-trigger\"\n mode=\"dropdown\"\n look=\"blank\"\n [iconOnly]=\"true\"\n text=\"More\"\n >\n <ax-prefix>\n <ax-icon icon=\"ax-icon ax-icon-more-horizontal\"></ax-icon>\n </ax-prefix>\n <ax-button-item-list [items]=\"overflowItems()\" (onItemClick)=\"handleOverflowClick($event)\">\n </ax-button-item-list>\n </ax-dropdown-button>\n }\n </div>\n <div class=\"ax-comment-body\">\n <ax-content>\n <div [innerHTML]=\"data.content\"></div>\n </ax-content>\n </div>\n }\n }\n\n <div class=\"ax-comment-default\" [hidden]=\"!useProjectedSlots()\">\n <div class=\"ax-comment-header\">\n <div class=\"ax-comment-header-meta\">\n <ng-content select=\"ax-title\" />\n <ng-content select=\"ax-subtitle\" />\n <ng-content select=\"ax-badge\" />\n <ng-content select=\"ax-comment-edited\" />\n <ng-content select=\"ax-comment-date\" />\n </div>\n <ng-content select=\"ax-comment-menu-options\" />\n </div>\n <div class=\"ax-comment-body\">\n <ng-content select=\"ax-content\" />\n </div>\n </div>\n\n <div class=\"ax-comment-actions\">\n @if (item(); as data) {\n <ax-comment-like [like]=\"!!data.liked\" (likeChange)=\"handleLike($event)\">\n {{ data.likes ?? 0 }}\n </ax-comment-like>\n <ax-comment-reply-text (click)=\"handleReply($event)\"></ax-comment-reply-text>\n }\n <ng-content select=\"ax-comment-like\" />\n <ng-content select=\"ax-comment-reply-text\" />\n @if (replyCount()) {\n <button\n type=\"button\"\n class=\"ax-comment-replies-toggle\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-busy]=\"loading()\"\n [disabled]=\"loading()\"\n (click)=\"toggleReplies()\"\n >\n <ax-icon\n [icon]=\"\n loading()\n ? 'ax-icon ax-icon-reload'\n : expanded()\n ? 'ax-icon ax-icon-chevron-up'\n : 'ax-icon ax-icon-chevron-down'\n \"\n [class.ax-comment-loading-icon]=\"loading()\"\n ></ax-icon>\n <span>\n {{ replyCount() }}\n {{ ((replyCount() ?? 0) > 1 ? '@acorex:comment.replies' : '@acorex:comment.reply') | translate | async }}\n </span>\n </button>\n }\n </div>\n\n <div class=\"ax-comment-replies\" [hidden]=\"!(replyCount() && expanded())\">\n @if (loading()) {\n <div class=\"ax-comment-replies-loading\">\n <ax-icon icon=\"ax-icon ax-icon-reload\" class=\"ax-comment-loading-icon\"></ax-icon>\n </div>\n }\n <ng-content select=\"ax-comment-item\" />\n <ng-content select=\"ax-comment-reply-more\" />\n <ng-content />\n </div>\n </div>\n</div>\n", styles: ["@layer properties;@layer components{ax-comment-item{display:block;transition-property:background-color;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s));--tw-duration: .7s;transition-duration:.7s;--tw-ease: var(--ease-in-out, cubic-bezier(.4, 0, .2, 1));transition-timing-function:var(--ease-in-out, cubic-bezier(.4, 0, .2, 1));padding-block:var(--ax-comp-comment-padding-y, 12px)}ax-comment-item.ax-state-highlight{background-color:color-mix(in srgb,rgba(var(--ax-sys-color-primary-surface)) 8%,transparent);border-radius:8px}@supports (color: color-mix(in lab,red,red)){ax-comment-item.ax-state-highlight{background-color:color-mix(in srgb,var(--color-primary) 8%,transparent)}}ax-comment-item .ax-comment-layout{display:flex;min-width:calc(var(--spacing, .25rem) * 0);align-items:flex-start;gap:var(--ax-comp-comment-gap, .5rem)}ax-comment-item .ax-comment-layout>ax-avatar{flex-shrink:0}ax-comment-item .ax-comment-main{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column}ax-comment-item .ax-comment-default[hidden]{display:none}ax-comment-item .ax-comment-header{display:flex;min-width:calc(var(--spacing, .25rem) * 0);align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 2)}ax-comment-item .ax-comment-custom-body{width:100%;min-width:calc(var(--spacing, .25rem) * 0)}ax-comment-item .ax-comment-menu-trigger{flex-shrink:0}@media(hover:hover){ax-comment-item .ax-comment-menu-trigger{opacity:0%;transition:opacity .15s ease}ax-comment-item .ax-comment-layout:has(>ax-avatar:hover)>.ax-comment-main>.ax-comment-header>.ax-comment-menu-trigger,ax-comment-item .ax-comment-main:has(>.ax-comment-header:hover)>.ax-comment-header>.ax-comment-menu-trigger,ax-comment-item .ax-comment-main:has(>.ax-comment-body:hover)>.ax-comment-header>.ax-comment-menu-trigger,ax-comment-item .ax-comment-main:has(>.ax-comment-actions:hover)>.ax-comment-header>.ax-comment-menu-trigger,ax-comment-item .ax-comment-header:focus-within>.ax-comment-menu-trigger{opacity:100%}}ax-comment-item .ax-comment-header-meta{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex-wrap:wrap;align-items:center}ax-comment-item ax-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;--tw-leading: calc(var(--spacing, .25rem) * 5);line-height:calc(var(--spacing, .25rem) * 5);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-on-surface))}ax-comment-item ax-subtitle{margin-inline-start:calc(var(--spacing, .25rem) * 1.5);font-size:11px;--tw-leading: calc(var(--spacing, .25rem) * 4);line-height:calc(var(--spacing, .25rem) * 4);--tw-font-weight: var(--font-weight-normal, 400);font-weight:var(--font-weight-normal, 400);color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){ax-comment-item ax-subtitle{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 55%,transparent)}}ax-comment-item .ax-comment-you-badge{margin-inline-start:calc(var(--spacing, .25rem) * 1.5);flex-shrink:0}ax-comment-item .ax-comment-body{margin-top:calc(var(--spacing, .25rem) * 1)}ax-comment-item ax-content{display:block;font-size:13.5px;overflow-wrap:break-word;color:rgba(var(--ax-sys-color-on-surface));line-height:1.6}ax-comment-item ax-content a,ax-comment-item ax-content .ax-mention{--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-primary-surface));text-decoration-line:none}ax-comment-item ax-content a:hover,ax-comment-item ax-content .ax-mention:hover{text-decoration-line:underline}ax-comment-item ax-content ul,ax-comment-item ax-content ol{margin-top:calc(var(--spacing, .25rem) * 1);margin-bottom:calc(var(--spacing, .25rem) * 0);padding-inline-start:calc(var(--spacing, .25rem) * 5)}ax-comment-item ax-content li{margin-block:calc(var(--spacing, .25rem) * .5)}ax-comment-item ax-content p{margin:calc(var(--spacing, .25rem) * 0)}ax-comment-item .ax-comment-actions{margin-top:calc(var(--spacing, .25rem) * 1);display:flex;min-height:calc(var(--spacing, .25rem) * 7);flex-wrap:wrap;align-items:center;gap:calc(var(--spacing, .25rem) * 5)}ax-comment-item ax-comment-like,ax-comment-item ax-comment-reply-text,ax-comment-item .ax-comment-replies-toggle{-webkit-user-select:none;user-select:none}ax-comment-item .ax-comment-replies-toggle{display:inline-flex;min-height:calc(var(--spacing, .25rem) * 7);cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 1);border-radius:var(--radius-md, .375rem);border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0);font-size:12.5px;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-primary-surface))}ax-comment-item .ax-comment-replies-toggle ax-icon{font-size:11px;--tw-leading: 1;line-height:1}ax-comment-item .ax-comment-replies-toggle:hover:not(:disabled){text-decoration-line:underline}ax-comment-item .ax-comment-replies-toggle:disabled{cursor:wait;opacity:70%}ax-comment-item .ax-comment-replies-toggle:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color: rgba(var(--ax-sys-color-primary-surface));--tw-ring-offset-width: 2px;--tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style: none;outline-style:none}ax-comment-item .ax-comment-loading-icon{animation:var(--animate-spin, spin 1s linear infinite)}ax-comment-item .ax-comment-replies-loading{display:flex;min-height:calc(var(--spacing, .25rem) * 8);align-items:center;padding-block:calc(var(--spacing, .25rem) * 1);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){ax-comment-item .ax-comment-replies-loading{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 40%,transparent)}}ax-comment-item .ax-comment-replies{margin-top:calc(var(--spacing, .25rem) * 3);display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex-direction:column}ax-comment-item .ax-comment-replies[hidden]{display:none}ax-comment-item ax-comment-reply-more{margin-top:calc(var(--spacing, .25rem) * 1);cursor:pointer;font-size:12.5px;--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgba(var(--ax-sys-color-primary-surface))}ax-comment-item ax-comment-reply-more:hover{text-decoration-line:underline}ax-comment-item ax-comment-menu-options{margin-inline-end:calc(var(--spacing, .25rem) * -1);margin-top:calc(var(--spacing, .25rem) * -1);flex-shrink:0}ax-comment-item.ax-comment-item-reply{padding-block:10px}ax-comment-item.ax-comment-item-custom .ax-comment-actions{margin-top:calc(var(--spacing, .25rem) * 2)}ax-comment-item.ax-comment-item-custom .ax-comment-replies{margin-inline-start:.5rem;padding-inline-start:1.25rem;border-inline-start:2px solid color-mix(in srgb,rgba(var(--ax-sys-color-primary-surface)) 35%,transparent)}@supports (color: color-mix(in lab,red,red)){ax-comment-item.ax-comment-item-custom .ax-comment-replies{border-inline-start:2px solid color-mix(in srgb,var(--color-primary) 35%,transparent)}}ax-comment-item.ax-comment-item-custom.ax-comment-item-reply{padding-block:8px}}@property --tw-duration{syntax: \"*\"; inherits: false;}@property --tw-ease{syntax: \"*\"; inherits: false;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@keyframes spin{to{transform:rotate(360deg)}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-duration: initial;--tw-ease: initial;--tw-leading: initial;--tw-font-weight: initial;--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
393
+ }], ctorParameters: () => [], propDecorators: { projectedAvatar: [{ type: i0.ContentChild, args: [i0.forwardRef(() => AXAvatarComponent), { isSignal: true }] }], viewAvatar: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXAvatarComponent), { isSignal: true }] }], item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: false }] }], replyCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "replyCount", required: false }] }], repliesExpanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "repliesExpanded", required: false }] }], repliesExpandedChange: [{ type: i0.Output, args: ["repliesExpandedChange"] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], itemTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemTemplate", required: false }] }], itemContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemContext", required: false }] }], likeChange: [{ type: i0.Output, args: ["likeChange"] }], replyClick: [{ type: i0.Output, args: ["replyClick"] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }] } });
330
394
 
331
395
  /**
332
396
  * A component for displaying and managing menu options on a comment.
@@ -521,6 +585,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
521
585
  }]
522
586
  }] });
523
587
 
588
+ const AX_COMMENT_THREAD_HOST = new InjectionToken('AX_COMMENT_THREAD_HOST');
589
+
590
+ /**
591
+ * Renders one level of the comment tree.
592
+ * A real component input (instead of `ngTemplateOutlet`) so OnPush checks this
593
+ * level again whenever the parent replaces the items array.
594
+ *
595
+ * @category Components
596
+ */
597
+ class AXCommentThreadComponent {
598
+ constructor() {
599
+ this.host = inject(AX_COMMENT_THREAD_HOST);
600
+ this.items = input.required(/* @ts-ignore */
601
+ ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
602
+ this.level = input(0, /* @ts-ignore */
603
+ ...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
604
+ this.itemTemplate = input(null, /* @ts-ignore */
605
+ ...(ngDevMode ? [{ debugName: "itemTemplate" }] : /* istanbul ignore next */ []));
606
+ }
607
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AXCommentThreadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
608
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: AXCommentThreadComponent, isStandalone: true, selector: "ax-comment-thread", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null } }, host: { styleAttribute: "display: contents" }, ngImport: i0, template: "@for (item of items(); track host.trackItem(item)) {\n <ax-comment-item\n [attr.id]=\"'comment-' + host.getId(item)\"\n [item]=\"item\"\n [replyCount]=\"host.getReplyCount(item)\"\n [repliesExpanded]=\"host.isExpanded(item)\"\n [loading]=\"host.isItemLoading(item)\"\n [itemTemplate]=\"itemTemplate()\"\n [itemContext]=\"itemTemplate() ? host.getTemplateContext(item, level()) : null\"\n (repliesExpandedChange)=\"host.onRepliesExpandedChange(item, $event)\"\n (likeChange)=\"host.toggleLike(item, $event)\"\n (replyClick)=\"host.replyTo(item, $event)\"\n (actionClick)=\"host.emitAction(item, $event)\"\n >\n <ax-comment-thread [items]=\"host.getReplies(item)\" [level]=\"level() + 1\" [itemTemplate]=\"itemTemplate()\" />\n </ax-comment-item>\n}\n", dependencies: [{ kind: "component", type: AXCommentThreadComponent, selector: "ax-comment-thread", inputs: ["items", "level", "itemTemplate"] }, { kind: "component", type: AXCommentItemComponent, selector: "ax-comment-item", inputs: ["item", "replyCount", "repliesExpanded", "loading", "itemTemplate", "itemContext"], outputs: ["repliesExpandedChange", "likeChange", "replyClick", "actionClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
609
+ }
610
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AXCommentThreadComponent, decorators: [{
611
+ type: Component,
612
+ args: [{ selector: 'ax-comment-thread', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [AXCommentItemComponent, AXCommentThreadComponent], host: {
613
+ style: 'display: contents',
614
+ }, template: "@for (item of items(); track host.trackItem(item)) {\n <ax-comment-item\n [attr.id]=\"'comment-' + host.getId(item)\"\n [item]=\"item\"\n [replyCount]=\"host.getReplyCount(item)\"\n [repliesExpanded]=\"host.isExpanded(item)\"\n [loading]=\"host.isItemLoading(item)\"\n [itemTemplate]=\"itemTemplate()\"\n [itemContext]=\"itemTemplate() ? host.getTemplateContext(item, level()) : null\"\n (repliesExpandedChange)=\"host.onRepliesExpandedChange(item, $event)\"\n (likeChange)=\"host.toggleLike(item, $event)\"\n (replyClick)=\"host.replyTo(item, $event)\"\n (actionClick)=\"host.emitAction(item, $event)\"\n >\n <ax-comment-thread [items]=\"host.getReplies(item)\" [level]=\"level() + 1\" [itemTemplate]=\"itemTemplate()\" />\n </ax-comment-item>\n}\n" }]
615
+ }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], itemTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemTemplate", required: false }] }] } });
616
+
524
617
  /**
525
618
  * Renders a comment thread from a datasource (array or lazy callback).
526
619
  * Provide `itemTemplate` or `<ng-template axCommentItem>` to customize item UI;
@@ -553,7 +646,7 @@ class AXCommentViewComponent {
553
646
  ...(ngDevMode ? [{ debugName: "_isLoading" }] : /* istanbul ignore next */ []));
554
647
  this.isLoading = this._isLoading.asReadonly();
555
648
  this.loadGeneration = 0;
556
- this.syncingFromDatasource = false;
649
+ this.emptyReplies = [];
557
650
  this.isLazyDataSource = computed(() => typeof this.datasource() === 'function', /* @ts-ignore */
558
651
  ...(ngDevMode ? [{ debugName: "isLazyDataSource" }] : /* istanbul ignore next */ []));
559
652
  this.hasDatasource = computed(() => this.datasource() != null, /* @ts-ignore */
@@ -562,8 +655,6 @@ class AXCommentViewComponent {
562
655
  ...(ngDevMode ? [{ debugName: "resolvedTemplate" }] : /* istanbul ignore next */ []));
563
656
  effect(() => {
564
657
  const ds = this.datasource();
565
- if (this.syncingFromDatasource)
566
- return;
567
658
  untracked(() => void this.applyDatasource(ds));
568
659
  });
569
660
  }
@@ -696,8 +787,26 @@ class AXCommentViewComponent {
696
787
  getId(item) {
697
788
  return String(item.id);
698
789
  }
790
+ /**
791
+ * Identity includes the fields the row renders. A same-id edit, like, or reply
792
+ * must refresh the row instead of leaving the previous snapshot on screen.
793
+ */
794
+ trackItem(item) {
795
+ const replies = (item.replies ?? []).map((reply) => this.trackItem(reply)).join(',');
796
+ return [
797
+ this.getId(item),
798
+ item.content ?? '',
799
+ item.likes ?? 0,
800
+ item.liked ? 1 : 0,
801
+ item.edited ? 1 : 0,
802
+ item.editedAt ?? '',
803
+ item.replyCount ?? item.replies?.length ?? 0,
804
+ item.repliesExpanded ? 1 : 0,
805
+ replies,
806
+ ].join(':');
807
+ }
699
808
  getReplies(item) {
700
- return item.replies ?? [];
809
+ return item.replies?.length ? item.replies : this.emptyReplies;
701
810
  }
702
811
  getReplyCount(item) {
703
812
  return item.replyCount ?? item.replies?.length ?? 0;
@@ -767,7 +876,7 @@ class AXCommentViewComponent {
767
876
  return;
768
877
  }
769
878
  if (Array.isArray(ds)) {
770
- this.items.set(ds);
879
+ this.items.set(ds.slice());
771
880
  return;
772
881
  }
773
882
  await this.loadRootItems(ds);
@@ -849,16 +958,9 @@ class AXCommentViewComponent {
849
958
  }
850
959
  }
851
960
  refreshItems() {
852
- const current = this.items();
853
- this.items.set([...current]);
854
- const ds = this.datasource();
855
- if (Array.isArray(ds)) {
856
- this.syncingFromDatasource = true;
857
- this.datasource.set([...current]);
858
- queueMicrotask(() => {
859
- this.syncingFromDatasource = false;
860
- });
861
- }
961
+ // Keep the parent datasource as the source of truth. Writing it back here
962
+ // used to drop the next array the parent pushed in.
963
+ this.items.set(this.items().slice());
862
964
  }
863
965
  findInTree(items, id) {
864
966
  for (const item of items) {
@@ -882,11 +984,17 @@ class AXCommentViewComponent {
882
984
  return null;
883
985
  }
884
986
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AXCommentViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
885
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: AXCommentViewComponent, isStandalone: true, selector: "ax-comment-view", inputs: { datasource: { classPropertyName: "datasource", publicName: "datasource", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { datasource: "datasourceChange", onReply: "onReply", onLikeChange: "onLikeChange", onRepliesToggle: "onRepliesToggle", onAction: "onAction" }, providers: [{ provide: AXComponent, useExisting: AXCommentViewComponent }], queries: [{ propertyName: "projectedItemTemplate", first: true, predicate: AXCommentItemTemplateDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (hasDatasource()) {\n @if (isLoading()) {\n <div class=\"ax-comment-view-skeleton\">\n @for (row of [1, 2, 3]; track row) {\n <div class=\"ax-comment-skeleton-row\">\n <ax-skeleton class=\"ax-comment-skeleton-avatar\"></ax-skeleton>\n <div class=\"ax-comment-skeleton-main\">\n <ax-skeleton class=\"ax-comment-skeleton-title\"></ax-skeleton>\n <ax-skeleton class=\"ax-comment-skeleton-body\"></ax-skeleton>\n </div>\n </div>\n }\n </div>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"itemsTpl\"\n [ngTemplateOutletContext]=\"{ items: items(), level: 0 }\"\n ></ng-container>\n }\n} @else {\n <ng-content select=\"ax-comment-item\" />\n}\n\n<ng-template #itemsTpl let-items=\"items\" let-level=\"level\">\n @for (item of items; track getId(item)) {\n <ax-comment-item\n [attr.id]=\"'comment-' + getId(item)\"\n [item]=\"item\"\n [replyCount]=\"getReplyCount(item)\"\n [repliesExpanded]=\"isExpanded(item)\"\n [loading]=\"isItemLoading(item)\"\n [itemTemplate]=\"resolvedTemplate()\"\n [itemContext]=\"resolvedTemplate() ? getTemplateContext(item, level) : null\"\n (repliesExpandedChange)=\"onRepliesExpandedChange(item, $event)\"\n (likeChange)=\"toggleLike(item, $event)\"\n (replyClick)=\"replyTo(item, $event)\"\n (actionClick)=\"emitAction(item, $event)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"itemsTpl\"\n [ngTemplateOutletContext]=\"{ items: getReplies(item), level: level + 1 }\"\n ></ng-container>\n </ax-comment-item>\n }\n</ng-template>\n", styles: ["@layer components{ax-comment-view{display:block}ax-comment-view>ax-comment-item:not(:last-child){border-bottom:1px solid color-mix(in srgb,rgba(var(--ax-sys-color-on-surface)) 8%,transparent)}@supports (color: color-mix(in lab,red,red)){ax-comment-view>ax-comment-item:not(:last-child){border-bottom:1px solid color-mix(in srgb,var(--color-on-surface) 8%,transparent)}}.ax-comment-view-skeleton{display:flex;flex-direction:column}.ax-comment-skeleton-row{display:flex;align-items:flex-start;gap:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 3)}.ax-comment-skeleton-avatar{width:calc(var(--spacing, .25rem) * 12);height:calc(var(--spacing, .25rem) * 12);flex-shrink:0;border-radius:calc(infinity * 1px)}.ax-comment-skeleton-main{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2)}.ax-comment-skeleton-title{height:calc(var(--spacing, .25rem) * 3);width:calc(var(--spacing, .25rem) * 32);border-radius:.25rem}.ax-comment-skeleton-body{height:calc(var(--spacing, .25rem) * 3);width:100%;max-width:var(--container-md, 28rem);border-radius:.25rem}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AXCommentItemComponent, selector: "ax-comment-item", inputs: ["item", "replyCount", "repliesExpanded", "loading", "itemTemplate", "itemContext"], outputs: ["repliesExpandedChange", "likeChange", "replyClick", "actionClick"] }, { kind: "component", type: AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
987
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: AXCommentViewComponent, isStandalone: true, selector: "ax-comment-view", inputs: { datasource: { classPropertyName: "datasource", publicName: "datasource", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { datasource: "datasourceChange", onReply: "onReply", onLikeChange: "onLikeChange", onRepliesToggle: "onRepliesToggle", onAction: "onAction" }, providers: [
988
+ { provide: AXComponent, useExisting: AXCommentViewComponent },
989
+ { provide: AX_COMMENT_THREAD_HOST, useExisting: AXCommentViewComponent },
990
+ ], queries: [{ propertyName: "projectedItemTemplate", first: true, predicate: AXCommentItemTemplateDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (hasDatasource()) {\n @if (isLoading()) {\n <div class=\"ax-comment-view-skeleton\">\n @for (row of [1, 2, 3]; track row) {\n <div class=\"ax-comment-skeleton-row\">\n <ax-skeleton class=\"ax-comment-skeleton-avatar\"></ax-skeleton>\n <div class=\"ax-comment-skeleton-main\">\n <ax-skeleton class=\"ax-comment-skeleton-title\"></ax-skeleton>\n <ax-skeleton class=\"ax-comment-skeleton-body\"></ax-skeleton>\n </div>\n </div>\n }\n </div>\n } @else {\n <ax-comment-thread [items]=\"items()\" [level]=\"0\" [itemTemplate]=\"resolvedTemplate()\" />\n }\n} @else {\n <ng-content select=\"ax-comment-item\" />\n}\n", styles: ["@layer components{ax-comment-view{display:block}ax-comment-view>ax-comment-thread>ax-comment-item:not(:last-child){border-bottom:1px solid color-mix(in srgb,rgba(var(--ax-sys-color-on-surface)) 8%,transparent)}@supports (color: color-mix(in lab,red,red)){ax-comment-view>ax-comment-thread>ax-comment-item:not(:last-child){border-bottom:1px solid color-mix(in srgb,var(--color-on-surface) 8%,transparent)}}.ax-comment-view-skeleton{display:flex;flex-direction:column}.ax-comment-skeleton-row{display:flex;align-items:flex-start;gap:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 3)}.ax-comment-skeleton-avatar{width:calc(var(--spacing, .25rem) * 12);height:calc(var(--spacing, .25rem) * 12);flex-shrink:0;border-radius:calc(infinity * 1px)}.ax-comment-skeleton-main{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2)}.ax-comment-skeleton-title{height:calc(var(--spacing, .25rem) * 3);width:calc(var(--spacing, .25rem) * 32);border-radius:.25rem}.ax-comment-skeleton-body{height:calc(var(--spacing, .25rem) * 3);width:100%;max-width:var(--container-md, 28rem);border-radius:.25rem}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "component", type: AXCommentThreadComponent, selector: "ax-comment-thread", inputs: ["items", "level", "itemTemplate"] }, { kind: "component", type: AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
886
991
  }
887
992
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: AXCommentViewComponent, decorators: [{
888
993
  type: Component,
889
- args: [{ selector: 'ax-comment-view', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet, AXCommentItemComponent, AXSkeletonComponent], providers: [{ provide: AXComponent, useExisting: AXCommentViewComponent }], template: "@if (hasDatasource()) {\n @if (isLoading()) {\n <div class=\"ax-comment-view-skeleton\">\n @for (row of [1, 2, 3]; track row) {\n <div class=\"ax-comment-skeleton-row\">\n <ax-skeleton class=\"ax-comment-skeleton-avatar\"></ax-skeleton>\n <div class=\"ax-comment-skeleton-main\">\n <ax-skeleton class=\"ax-comment-skeleton-title\"></ax-skeleton>\n <ax-skeleton class=\"ax-comment-skeleton-body\"></ax-skeleton>\n </div>\n </div>\n }\n </div>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"itemsTpl\"\n [ngTemplateOutletContext]=\"{ items: items(), level: 0 }\"\n ></ng-container>\n }\n} @else {\n <ng-content select=\"ax-comment-item\" />\n}\n\n<ng-template #itemsTpl let-items=\"items\" let-level=\"level\">\n @for (item of items; track getId(item)) {\n <ax-comment-item\n [attr.id]=\"'comment-' + getId(item)\"\n [item]=\"item\"\n [replyCount]=\"getReplyCount(item)\"\n [repliesExpanded]=\"isExpanded(item)\"\n [loading]=\"isItemLoading(item)\"\n [itemTemplate]=\"resolvedTemplate()\"\n [itemContext]=\"resolvedTemplate() ? getTemplateContext(item, level) : null\"\n (repliesExpandedChange)=\"onRepliesExpandedChange(item, $event)\"\n (likeChange)=\"toggleLike(item, $event)\"\n (replyClick)=\"replyTo(item, $event)\"\n (actionClick)=\"emitAction(item, $event)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"itemsTpl\"\n [ngTemplateOutletContext]=\"{ items: getReplies(item), level: level + 1 }\"\n ></ng-container>\n </ax-comment-item>\n }\n</ng-template>\n", styles: ["@layer components{ax-comment-view{display:block}ax-comment-view>ax-comment-item:not(:last-child){border-bottom:1px solid color-mix(in srgb,rgba(var(--ax-sys-color-on-surface)) 8%,transparent)}@supports (color: color-mix(in lab,red,red)){ax-comment-view>ax-comment-item:not(:last-child){border-bottom:1px solid color-mix(in srgb,var(--color-on-surface) 8%,transparent)}}.ax-comment-view-skeleton{display:flex;flex-direction:column}.ax-comment-skeleton-row{display:flex;align-items:flex-start;gap:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 3)}.ax-comment-skeleton-avatar{width:calc(var(--spacing, .25rem) * 12);height:calc(var(--spacing, .25rem) * 12);flex-shrink:0;border-radius:calc(infinity * 1px)}.ax-comment-skeleton-main{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2)}.ax-comment-skeleton-title{height:calc(var(--spacing, .25rem) * 3);width:calc(var(--spacing, .25rem) * 32);border-radius:.25rem}.ax-comment-skeleton-body{height:calc(var(--spacing, .25rem) * 3);width:100%;max-width:var(--container-md, 28rem);border-radius:.25rem}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
994
+ args: [{ selector: 'ax-comment-view', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [AXCommentThreadComponent, AXSkeletonComponent], providers: [
995
+ { provide: AXComponent, useExisting: AXCommentViewComponent },
996
+ { provide: AX_COMMENT_THREAD_HOST, useExisting: AXCommentViewComponent },
997
+ ], template: "@if (hasDatasource()) {\n @if (isLoading()) {\n <div class=\"ax-comment-view-skeleton\">\n @for (row of [1, 2, 3]; track row) {\n <div class=\"ax-comment-skeleton-row\">\n <ax-skeleton class=\"ax-comment-skeleton-avatar\"></ax-skeleton>\n <div class=\"ax-comment-skeleton-main\">\n <ax-skeleton class=\"ax-comment-skeleton-title\"></ax-skeleton>\n <ax-skeleton class=\"ax-comment-skeleton-body\"></ax-skeleton>\n </div>\n </div>\n }\n </div>\n } @else {\n <ax-comment-thread [items]=\"items()\" [level]=\"0\" [itemTemplate]=\"resolvedTemplate()\" />\n }\n} @else {\n <ng-content select=\"ax-comment-item\" />\n}\n", styles: ["@layer components{ax-comment-view{display:block}ax-comment-view>ax-comment-thread>ax-comment-item:not(:last-child){border-bottom:1px solid color-mix(in srgb,rgba(var(--ax-sys-color-on-surface)) 8%,transparent)}@supports (color: color-mix(in lab,red,red)){ax-comment-view>ax-comment-thread>ax-comment-item:not(:last-child){border-bottom:1px solid color-mix(in srgb,var(--color-on-surface) 8%,transparent)}}.ax-comment-view-skeleton{display:flex;flex-direction:column}.ax-comment-skeleton-row{display:flex;align-items:flex-start;gap:calc(var(--spacing, .25rem) * 2);padding-block:calc(var(--spacing, .25rem) * 3)}.ax-comment-skeleton-avatar{width:calc(var(--spacing, .25rem) * 12);height:calc(var(--spacing, .25rem) * 12);flex-shrink:0;border-radius:calc(infinity * 1px)}.ax-comment-skeleton-main{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2)}.ax-comment-skeleton-title{height:calc(var(--spacing, .25rem) * 3);width:calc(var(--spacing, .25rem) * 32);border-radius:.25rem}.ax-comment-skeleton-body{height:calc(var(--spacing, .25rem) * 3);width:100%;max-width:var(--container-md, 28rem);border-radius:.25rem}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
890
998
  }], ctorParameters: () => [], propDecorators: { datasource: [{ type: i0.Input, args: [{ isSignal: true, alias: "datasource", required: false }] }, { type: i0.Output, args: ["datasourceChange"] }], itemTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemTemplate", required: false }] }], onReply: [{ type: i0.Output, args: ["onReply"] }], onLikeChange: [{ type: i0.Output, args: ["onLikeChange"] }], onRepliesToggle: [{ type: i0.Output, args: ["onRepliesToggle"] }], onAction: [{ type: i0.Output, args: ["onAction"] }], projectedItemTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => AXCommentItemTemplateDirective), { isSignal: true }] }] } });
891
999
 
892
1000
  const COMPONENTS = [
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-components-comment.mjs","sources":["../../../../packages/components/comment/src/lib/comment-container/comment-container.component.ts","../../../../packages/components/comment/src/lib/comment-item-template.directive.ts","../../../../packages/components/comment/src/lib/comment-tools/comment-date/comment-date.component.ts","../../../../packages/components/comment/src/lib/comment-tools/comment-edited/comment-edited.component.ts","../../../../packages/components/comment/src/lib/comment-tools/comment-like/comment-like.component.ts","../../../../packages/components/comment/src/lib/comment-tools/comment-like/comment-like.component.html","../../../../packages/components/comment/src/lib/comment-tools/comment-reply-text/comment-reply-text.component.ts","../../../../packages/components/comment/src/lib/comment-item/comment-item.component.ts","../../../../packages/components/comment/src/lib/comment-item/comment-item.component.html","../../../../packages/components/comment/src/lib/comment-tools/comment-menu-options/comment-menu-options.component.ts","../../../../packages/components/comment/src/lib/comment-tools/comment-reply/comment-reply.component.ts","../../../../packages/components/comment/src/lib/comment-tools/comment-reply-more/comment-reply-more.component.ts","../../../../packages/components/comment/src/lib/comment-view/comment-view.component.ts","../../../../packages/components/comment/src/lib/comment-view/comment-view.component.html","../../../../packages/components/comment/src/lib/comment.module.ts","../../../../packages/components/comment/src/acorex-components-comment.ts"],"sourcesContent":["import { AXComponent } from '@acorex/cdk/common';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n contentChild,\n DOCUMENT,\n inject,\n PLATFORM_ID,\n ViewEncapsulation,\n} from '@angular/core';\n\n/**\n * A container component for displaying and managing comments.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-container',\n template: `\n <ng-content select=\"ax-header\" />\n <ng-content />\n <ng-content select=\"ax-footer\" />\n `,\n styleUrl: './comment-container.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: AXComponent, useExisting: AXCommentContainerComponent }],\n host: {\n '[class.ax-has-header]': '!!projectedHeader()',\n '[class.ax-has-footer]': '!!projectedFooter()',\n },\n})\nexport class AXCommentContainerComponent {\n private document = inject(DOCUMENT);\n private platformID = inject(PLATFORM_ID);\n\n protected readonly projectedHeader = contentChild('ax-header');\n protected readonly projectedFooter = contentChild('ax-footer');\n\n /**\n * Scrolls to a specific comment reply by its ID and highlights it temporarily.\n *\n * @param id - The ID of the comment reply to scroll to\n */\n scrollToReply(id: string) {\n if (!isPlatformBrowser(this.platformID)) return;\n\n const key = String(id);\n const el =\n (this.document.querySelector(`ax-comment-item[id=\"${key}\"]`) as HTMLElement | null) ??\n (this.document.querySelector(`ax-comment-item[id=\"comment-${key}\"]`) as HTMLElement | null);\n if (!el) return;\n\n el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n el.classList.add('ax-state-highlight');\n setTimeout(() => el.classList.remove('ax-state-highlight'), 1500);\n }\n}\n","import { Directive, TemplateRef } from '@angular/core';\nimport { AXCommentItemTemplateContext } from './comment.types';\n\n/**\n * Marks an `ng-template` as a custom comment item renderer.\n * When omitted, `ax-comment-view` uses the built-in layout.\n * Like and reply stay in the item actions row either way.\n *\n * @example\n * ```html\n * <ax-comment-view [datasource]=\"comments\">\n * <ng-template axCommentItem let-item>\n * <ax-avatar [color]=\"item.color\" look=\"twotone\" shape=\"rounded\">\n * <ax-text>{{ item.initials }}</ax-text>\n * </ax-avatar>\n * <ax-title>{{ item.author }}</ax-title>\n * <ax-content>{{ item.content }}</ax-content>\n * </ng-template>\n * </ax-comment-view>\n * ```\n */\n@Directive({\n selector: 'ng-template[axCommentItem]',\n})\nexport class AXCommentItemTemplateDirective {\n constructor(readonly template: TemplateRef<AXCommentItemTemplateContext>) {}\n}\n","import { AXComponent } from '@acorex/cdk/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n/**\n * A component for displaying date on a comment.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-date',\n template: '<ng-content />',\n styleUrl: './comment-date.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: AXComponent, useExisting: AXCommentDateComponent }],\n})\nexport class AXCommentDateComponent {}\n","import { AXComponent } from '@acorex/cdk/common';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\n\n/**\n * Muted “edited” label shown next to the comment timestamp.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-edited',\n template: `{{ '@acorex:comment.edited' | translate | async }}`,\n styleUrl: './comment-edited.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ax-comment-edited',\n '[attr.title]': 'editedAt() || null',\n '[attr.aria-label]': 'editedAt() || null',\n },\n imports: [AXTranslatorPipe, AsyncPipe],\n providers: [{ provide: AXComponent, useExisting: AXCommentEditedComponent }],\n})\nexport class AXCommentEditedComponent {\n /** Optional tooltip (for example the time the comment was last edited). */\n readonly editedAt = input<string>();\n}\n","import { AXComponent } from '@acorex/cdk/common';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { ChangeDetectionStrategy, Component, model, ViewEncapsulation } from '@angular/core';\n\n/**\n * A component for displaying and managing likes on a comment.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-like',\n templateUrl: './comment-like.component.html',\n styleUrl: './comment-like.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXDecoratorIconComponent, AXDecoratorGenericComponent],\n providers: [{ provide: AXComponent, useExisting: AXCommentLikeComponent }],\n})\nexport class AXCommentLikeComponent {\n like = model.required<boolean>();\n\n protected toggleLike() {\n this.like.update((prev) => !prev);\n }\n}\n","<button\n type=\"button\"\n class=\"ax-comment-like-button\"\n [class.ax-state-liked]=\"like()\"\n [attr.aria-pressed]=\"like()\"\n (click)=\"toggleLike()\"\n>\n <ax-icon [icon]=\"like() ? 'ax-icon ax-icon-solid ax-icon-heart' : 'ax-icon ax-icon-heart'\"></ax-icon>\n <ax-text><ng-content /></ax-text>\n</button>\n","import { AXComponent } from '@acorex/cdk/common';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n/**\n * A component for displaying the reply action on a comment.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-reply-text',\n template: `\n <button type=\"button\" class=\"ax-comment-reply-button\">\n <ax-icon icon=\"ax-icon ax-icon-arrow-turn-left\"></ax-icon>\n <ax-text>{{ '@acorex:comment.reply' | translate | async }}</ax-text>\n </button>\n `,\n styleUrl: './comment-reply-text.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXDecoratorGenericComponent, AXDecoratorIconComponent, AXTranslatorPipe, AsyncPipe],\n providers: [{ provide: AXComponent, useExisting: AXCommentReplyTextComponent }],\n})\nexport class AXCommentReplyTextComponent {}\n","import { AXComponent, AXItemClickEvent, AXStyleColorType } from '@acorex/cdk/common';\nimport { AXAvatarComponent } from '@acorex/components/avatar';\nimport { AXBadgeComponent } from '@acorex/components/badge';\nimport {\n AXButtonItemComponent,\n AXButtonItemListComponent,\n type AXButtonItemListItem,\n} from '@acorex/components/button';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXDropdownButtonComponent } from '@acorex/components/dropdown-button';\nimport { AXImageComponent } from '@acorex/components/image';\nimport type { AXMenuItem } from '@acorex/components/menu';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n inject,\n input,\n model,\n output,\n TemplateRef,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXCommentDateComponent } from '../comment-tools/comment-date/comment-date.component';\nimport { AXCommentEditedComponent } from '../comment-tools/comment-edited/comment-edited.component';\nimport { AXCommentLikeComponent } from '../comment-tools/comment-like/comment-like.component';\nimport { AXCommentReplyTextComponent } from '../comment-tools/comment-reply-text/comment-reply-text.component';\nimport { AXCommentItem, AXCommentItemTemplateContext } from '../comment.types';\n\n/**\n * A component that represents an individual comment item in the comment system.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-item',\n templateUrl: './comment-item.component.html',\n styleUrl: './comment-item.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AXTranslatorPipe,\n AsyncPipe,\n AXDecoratorIconComponent,\n AXDecoratorGenericComponent,\n NgTemplateOutlet,\n AXAvatarComponent,\n AXBadgeComponent,\n AXImageComponent,\n AXCommentDateComponent,\n AXCommentEditedComponent,\n AXCommentLikeComponent,\n AXCommentReplyTextComponent,\n AXDropdownButtonComponent,\n AXButtonItemListComponent,\n ],\n providers: [{ provide: AXComponent, useExisting: AXCommentItemComponent }],\n host: {\n '[class.ax-comment-item-reply]': 'isReply',\n '[class.ax-comment-item-custom]': '!!itemTemplate()',\n },\n})\nexport class AXCommentItemComponent {\n private readonly parentComment = inject(AXCommentItemComponent, { optional: true, skipSelf: true });\n\n protected readonly isReply = this.parentComment != null;\n\n private readonly projectedAvatar = contentChild(AXAvatarComponent);\n private readonly viewAvatar = viewChild(AXAvatarComponent);\n\n /** Data item used by `ax-comment-view`. When set, the default layout is rendered internally. */\n readonly item = input<AXCommentItem | null>(null);\n\n readonly replyCount = input<number>();\n\n /** Two-way bindable state controlling whether nested replies are visible. */\n readonly repliesExpanded = model(false);\n\n /** Whether replies for this item are currently being loaded. */\n readonly loading = input(false);\n\n /**\n * Custom renderer for the item body. When omitted, the default layout\n * (or projected slots) is used.\n */\n readonly itemTemplate = input<TemplateRef<AXCommentItemTemplateContext> | null>(null);\n\n /** Context passed to `itemTemplate`. */\n readonly itemContext = input<AXCommentItemTemplateContext | null>(null);\n\n readonly likeChange = output<boolean>();\n readonly replyClick = output<Event>();\n readonly actionClick = output<AXMenuItem>();\n\n protected readonly avatarSize = 48;\n\n protected readonly showDefaultDataLayout = computed(() => !!this.item() && !this.itemTemplate());\n protected readonly useProjectedSlots = computed(() => !this.item() && !this.itemTemplate());\n protected readonly itemActions = computed(() => this.item()?.actions ?? []);\n protected readonly showOverflowMenu = computed(\n () => this.showDefaultDataLayout() && this.itemActions().length > 0,\n );\n protected readonly overflowItems = computed(() => this.toButtonItems(this.itemActions()));\n\n constructor() {\n afterNextRender(() => {\n if (this.itemTemplate()) return;\n (this.projectedAvatar() ?? this.viewAvatar())?.size?.set(this.avatarSize);\n });\n }\n\n protected getColor(data: AXCommentItem): AXStyleColorType {\n return data.color ?? 'default';\n }\n\n protected showEdited(data: AXCommentItem): boolean {\n return data.edited === true;\n }\n\n protected getInitials(data: AXCommentItem): string {\n if (data.initials) return data.initials;\n return (data.author || '')\n .split(/\\s+/)\n .filter(Boolean)\n .map((part) => part[0])\n .join('')\n .slice(0, 2)\n .toUpperCase();\n }\n\n protected handleLike(liked: boolean) {\n this.likeChange.emit(liked);\n }\n\n protected handleReply(event: Event) {\n this.replyClick.emit(event);\n }\n\n protected handleOverflowClick(event: AXItemClickEvent<AXButtonItemComponent>) {\n const action =\n this.findAction(this.itemActions(), event.name) ?? {\n text: event.item?.text ?? event.name ?? '',\n name: event.name,\n data: event.data,\n };\n this.actionClick.emit(action);\n }\n\n private toButtonItems(items: AXMenuItem[]): AXButtonItemListItem[] {\n return items.map((item) => ({\n name: item.name ?? item.text,\n text: item.text,\n icon: item.icon ?? '',\n color: item.color,\n disabled: item.disabled,\n divided: item.break,\n items: item.items?.length ? this.toButtonItems(item.items) : undefined,\n }));\n }\n\n private findAction(items: AXMenuItem[], name?: string): AXMenuItem | undefined {\n if (name == null) return undefined;\n for (const item of items) {\n if ((item.name ?? item.text) === name) return item;\n const nested = item.items?.length ? this.findAction(item.items, name) : undefined;\n if (nested) return nested;\n }\n return undefined;\n }\n\n /**\n * Toggles the collapse state of the comment replies section.\n */\n toggleReplies() {\n this.repliesExpanded.update((v) => !v);\n }\n\n /**\n * Expands the nested replies section.\n */\n showReplies() {\n this.repliesExpanded.set(true);\n }\n\n /**\n * Collapses the nested replies section.\n */\n hideReplies() {\n this.repliesExpanded.set(false);\n }\n}\n","<div class=\"ax-comment-layout\">\n @if (showDefaultDataLayout()) {\n @if (item(); as data) {\n <ax-avatar [color]=\"getColor(data)\" [size]=\"avatarSize\" look=\"twotone\" shape=\"rounded\">\n @if (data.avatar) {\n <ax-image [src]=\"data.avatar\"></ax-image>\n } @else {\n <ax-text>{{ getInitials(data) }}</ax-text>\n }\n </ax-avatar>\n }\n }\n <ng-content select=\"ax-avatar\" />\n\n <div class=\"ax-comment-main\">\n @if (itemTemplate(); as tpl) {\n <div class=\"ax-comment-custom-body\">\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"itemContext()\" />\n </div>\n } @else if (showDefaultDataLayout()) {\n @if (item(); as data) {\n <div class=\"ax-comment-header\">\n <div class=\"ax-comment-header-meta\">\n <ax-title>{{ data.author }}</ax-title>\n @if (data.isYou) {\n <ax-badge\n class=\"ax-sm ax-pill ax-comment-you-badge\"\n look=\"twotone\"\n color=\"primary\"\n [text]=\"('@acorex:comment.you' | translate | async) ?? 'You'\"\n ></ax-badge>\n }\n @if (showEdited(data)) {\n <ax-comment-edited [editedAt]=\"data.editedAt\" />\n }\n @if (data.date) {\n <ax-comment-date>{{ data.date }}</ax-comment-date>\n }\n </div>\n @if (showOverflowMenu()) {\n <ax-dropdown-button\n class=\"ax-sm ax-comment-menu-trigger\"\n mode=\"dropdown\"\n look=\"blank\"\n [iconOnly]=\"true\"\n text=\"More\"\n >\n <ax-prefix>\n <ax-icon icon=\"ax-icon ax-icon-more-horizontal\"></ax-icon>\n </ax-prefix>\n <ax-button-item-list [items]=\"overflowItems()\" (onItemClick)=\"handleOverflowClick($event)\">\n </ax-button-item-list>\n </ax-dropdown-button>\n }\n </div>\n <div class=\"ax-comment-body\">\n <ax-content>\n <div [innerHTML]=\"data.content\"></div>\n </ax-content>\n </div>\n }\n }\n\n <div class=\"ax-comment-default\" [hidden]=\"!useProjectedSlots()\">\n <div class=\"ax-comment-header\">\n <div class=\"ax-comment-header-meta\">\n <ng-content select=\"ax-title\" />\n <ng-content select=\"ax-subtitle\" />\n <ng-content select=\"ax-badge\" />\n <ng-content select=\"ax-comment-edited\" />\n <ng-content select=\"ax-comment-date\" />\n </div>\n <ng-content select=\"ax-comment-menu-options\" />\n </div>\n <div class=\"ax-comment-body\">\n <ng-content select=\"ax-content\" />\n </div>\n </div>\n\n <div class=\"ax-comment-actions\">\n @if (item(); as data) {\n <ax-comment-like [like]=\"!!data.liked\" (likeChange)=\"handleLike($event)\">\n {{ data.likes ?? 0 }}\n </ax-comment-like>\n <ax-comment-reply-text (click)=\"handleReply($event)\"></ax-comment-reply-text>\n }\n <ng-content select=\"ax-comment-like\" />\n <ng-content select=\"ax-comment-reply-text\" />\n @if (replyCount()) {\n <button\n type=\"button\"\n class=\"ax-comment-replies-toggle\"\n [attr.aria-expanded]=\"repliesExpanded()\"\n [attr.aria-busy]=\"loading()\"\n [disabled]=\"loading()\"\n (click)=\"toggleReplies()\"\n >\n <ax-icon\n [icon]=\"\n loading()\n ? 'ax-icon ax-icon-reload'\n : repliesExpanded()\n ? 'ax-icon ax-icon-chevron-up'\n : 'ax-icon ax-icon-chevron-down'\n \"\n [class.ax-comment-loading-icon]=\"loading()\"\n ></ax-icon>\n <span>\n {{ replyCount() }}\n {{ ((replyCount() ?? 0) > 1 ? '@acorex:comment.replies' : '@acorex:comment.reply') | translate | async }}\n </span>\n </button>\n }\n </div>\n\n <div class=\"ax-comment-replies\" [hidden]=\"!(replyCount() && repliesExpanded())\">\n @if (loading()) {\n <div class=\"ax-comment-replies-loading\">\n <ax-icon icon=\"ax-icon ax-icon-reload\" class=\"ax-comment-loading-icon\"></ax-icon>\n </div>\n }\n <ng-content select=\"ax-comment-item\" />\n <ng-content select=\"ax-comment-reply-more\" />\n <ng-content />\n </div>\n </div>\n</div>\n","import { AXComponent } from '@acorex/cdk/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n/**\n * A component for displaying and managing menu options on a comment.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-menu-options',\n template: '<ng-content />',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: AXComponent, useExisting: AXMenuOptionsComponent }],\n})\nexport class AXMenuOptionsComponent {}\n","import { AXComponent } from '@acorex/cdk/common';\nimport { AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n DOCUMENT,\n inject,\n input,\n output,\n PLATFORM_ID,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXCommentItem } from '../../comment.types';\n\n/**\n * Composer chrome shown while writing a reply. Projects the editor below a\n * compact reply-context bar; hide the bar by leaving `item` empty.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-reply',\n template: `\n @if (item(); as target) {\n <div class=\"ax-comment-reply-banner\">\n <button type=\"button\" class=\"ax-comment-reply-target\" (click)=\"revealTarget()\">\n <ax-icon\n class=\"ax-comment-reply-lead-icon\"\n icon=\"ax-icon ax-icon-arrow-turn-left\"\n aria-hidden=\"true\"\n ></ax-icon>\n <span class=\"ax-comment-reply-copy\">\n <span class=\"ax-comment-reply-label\">\n {{ '@acorex:comment.replying-to' | translate | async }}\n <span class=\"ax-comment-reply-author\">\n @if (target.isYou) {\n {{ '@acorex:comment.you' | translate | async }}\n } @else {\n {{ target.author }}\n }\n </span>\n </span>\n @if (preview(); as excerpt) {\n <span class=\"ax-comment-reply-preview\" [title]=\"excerpt\">{{ excerpt }}</span>\n }\n </span>\n </button>\n <button\n type=\"button\"\n class=\"ax-comment-reply-close\"\n [attr.aria-label]=\"'@acorex:common.general.close' | translate | async\"\n (click)=\"close()\"\n >\n <ax-icon icon=\"ax-icon ax-icon-close\" aria-hidden=\"true\"></ax-icon>\n </button>\n </div>\n }\n <div class=\"ax-comment-reply-composer\">\n <ng-content />\n </div>\n `,\n styleUrl: './comment-reply.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXDecoratorIconComponent, AXTranslatorPipe, AsyncPipe],\n providers: [{ provide: AXComponent, useExisting: AXCommentReplyComponent }],\n host: {\n class: 'ax-comment-reply',\n '[class.ax-comment-reply-open]': '!!item()',\n },\n})\nexport class AXCommentReplyComponent {\n private readonly document = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n private highlightTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n if (this.highlightTimer) clearTimeout(this.highlightTimer);\n });\n }\n\n /** Comment currently being replied to. When null, only the projected composer is shown. */\n readonly item = input<AXCommentItem | null>(null);\n\n /** Emitted when the close control on the reply banner is clicked. */\n readonly onClose = output<void>();\n\n /** Emitted when the banner is clicked to jump to the target comment. */\n readonly onTargetClick = output<string>();\n\n protected readonly preview = computed(() => this.toPreview(this.item()?.content));\n\n protected close() {\n this.onClose.emit();\n }\n\n protected revealTarget() {\n const item = this.item();\n if (!item) return;\n const id = String(item.id);\n this.onTargetClick.emit(id);\n this.scrollToComment(id);\n }\n\n private scrollToComment(id: string) {\n if (!isPlatformBrowser(this.platformId)) return;\n const el =\n (this.document.querySelector(`ax-comment-item[id=\"${id}\"]`) as HTMLElement | null) ??\n (this.document.querySelector(`ax-comment-item[id=\"comment-${id}\"]`) as HTMLElement | null);\n if (!el) return;\n\n el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n el.classList.add('ax-state-highlight');\n if (this.highlightTimer) clearTimeout(this.highlightTimer);\n this.highlightTimer = setTimeout(() => {\n el.classList.remove('ax-state-highlight');\n this.highlightTimer = null;\n }, 1500);\n }\n\n private toPreview(content?: string): string {\n return String(content ?? '')\n .replace(/<[^>]+>/g, ' ')\n .replace(/&nbsp;|&#160;/gi, ' ')\n .replace(/&amp;/gi, '&')\n .replace(/&lt;/gi, '<')\n .replace(/&gt;/gi, '>')\n .replace(/&quot;/gi, '\"')\n .replace(/&#39;|&apos;/gi, \"'\")\n .replace(/\\s+/g, ' ')\n .trim();\n }\n}\n","import { AXComponent } from '@acorex/cdk/common';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n/**\n * A component for displaying \"show more replies\" action on a comment.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-reply-more',\n template: '<ax-text><ng-content /></ax-text>',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXDecoratorGenericComponent],\n providers: [{ provide: AXComponent, useExisting: AXCommentReplyMoreComponent }],\n})\nexport class AXCommentReplyMoreComponent {}\n","import { AXComponent } from '@acorex/cdk/common';\nimport type { AXMenuItem } from '@acorex/components/menu';\nimport { AXSkeletonComponent } from '@acorex/components/skeleton';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n TemplateRef,\n computed,\n contentChild,\n effect,\n input,\n model,\n output,\n signal,\n untracked,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXCommentItemTemplateDirective } from '../comment-item-template.directive';\nimport { AXCommentItemComponent } from '../comment-item/comment-item.component';\nimport {\n AXCommentCallback,\n AXCommentDataSource,\n AXCommentItem,\n AXCommentItemTemplateContext,\n AXCommentActionEvent,\n AXCommentLikeChangeEvent,\n AXCommentRepliesToggleEvent,\n AXCommentReplyEvent,\n} from '../comment.types';\n\n/**\n * Renders a comment thread from a datasource (array or lazy callback).\n * Provide `itemTemplate` or `<ng-template axCommentItem>` to customize item UI;\n * otherwise the built-in layout is used.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-view',\n templateUrl: './comment-view.component.html',\n styleUrl: './comment-view.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, AXCommentItemComponent, AXSkeletonComponent],\n providers: [{ provide: AXComponent, useExisting: AXCommentViewComponent }],\n})\nexport class AXCommentViewComponent {\n /** Comment data — a static array or a lazy-loading function. */\n readonly datasource = model<AXCommentDataSource | null>(null);\n\n /**\n * Custom item template. When omitted, the default comment layout is used.\n * You can also project `<ng-template axCommentItem>`.\n */\n readonly itemTemplate = input<TemplateRef<AXCommentItemTemplateContext>>();\n\n readonly onReply = output<AXCommentReplyEvent>();\n readonly onLikeChange = output<AXCommentLikeChangeEvent>();\n readonly onRepliesToggle = output<AXCommentRepliesToggleEvent>();\n readonly onAction = output<AXCommentActionEvent>();\n\n private readonly projectedItemTemplate = contentChild(AXCommentItemTemplateDirective);\n\n protected readonly items = signal<AXCommentItem[]>([]);\n private readonly loadingIds = signal<Set<string>>(new Set());\n private readonly _isLoading = signal(false);\n readonly isLoading = this._isLoading.asReadonly();\n\n private loadGeneration = 0;\n private syncingFromDatasource = false;\n\n private readonly isLazyDataSource = computed(() => typeof this.datasource() === 'function');\n\n protected readonly hasDatasource = computed(() => this.datasource() != null);\n\n protected readonly resolvedTemplate = computed(\n () => this.itemTemplate() ?? this.projectedItemTemplate()?.template ?? null,\n );\n\n constructor() {\n effect(() => {\n const ds = this.datasource();\n if (this.syncingFromDatasource) return;\n untracked(() => void this.applyDatasource(ds));\n });\n }\n\n /**\n * Reloads root comments from the datasource.\n *\n * @returns Promise that resolves when the reload is complete.\n */\n async reloadData(): Promise<void> {\n await this.applyDatasource(this.datasource());\n }\n\n /**\n * Appends a comment to the current root list.\n *\n * @param item - The comment to append.\n * @returns void\n */\n appendItem(item: AXCommentItem): void {\n this.items.update((list) => [...list, item]);\n }\n\n /**\n * Appends a reply under a loaded comment and expands that thread.\n *\n * @param parentId - The parent comment id.\n * @param item - The reply to append.\n * @returns Promise that resolves when any needed lazy load and the append are complete.\n */\n async appendReply(parentId: string, item: AXCommentItem): Promise<void> {\n const parent = this.findItem(parentId);\n if (!parent) return;\n if (this.canLazyLoad(parent)) {\n await this.loadReplies(parent);\n }\n parent.replies = [...(parent.replies ?? []), item];\n parent.replyCount = parent.replies.length;\n parent.repliesExpanded = true;\n this.refreshItems();\n }\n\n /**\n * Finds a comment by id in the loaded tree.\n *\n * @param id - The comment id.\n * @returns The matching item, or null if it is not loaded.\n */\n findItem(id: string): AXCommentItem | null {\n return this.findInTree(this.items(), id);\n }\n\n /**\n * Removes a comment from the loaded tree. Nested replies are removed with it.\n *\n * @param id - The comment id.\n * @returns True when the comment was found and removed.\n */\n removeItem(id: string): boolean {\n const key = String(id);\n const roots = this.items();\n if (roots.some((item) => this.getId(item) === key)) {\n this.items.set(roots.filter((item) => this.getId(item) !== key));\n this.refreshItems();\n return true;\n }\n const parent = this.findParent(roots, key);\n if (!parent?.replies?.length) return false;\n const before = parent.replies.length;\n parent.replies = parent.replies.filter((child) => this.getId(child) !== key);\n const removed = before - parent.replies.length;\n if (!removed) return false;\n parent.replyCount = Math.max(0, (parent.replyCount ?? before) - removed);\n this.refreshItems();\n return true;\n }\n\n /**\n * Patches a loaded comment in place.\n *\n * @param id - The comment id.\n * @param patch - Fields to merge onto the existing item. The original id is kept.\n * @returns The updated item, or null if it is not loaded.\n */\n updateItem(id: string, patch: Partial<AXCommentItem>): AXCommentItem | null {\n const key = String(id);\n let updated: AXCommentItem | null = null;\n\n const apply = (items: AXCommentItem[]): AXCommentItem[] | null => {\n const index = items.findIndex((item) => this.getId(item) === key);\n if (index >= 0) {\n const current = items[index];\n if (!current) return null;\n const nextItem: AXCommentItem = { ...current, ...patch, id: current.id };\n updated = nextItem;\n const next = items.slice();\n next[index] = nextItem;\n return next;\n }\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (!item.replies?.length) continue;\n const replies = apply(item.replies);\n if (!replies) continue;\n const next = items.slice();\n next[i] = { ...item, replies };\n return next;\n }\n return null;\n };\n\n const next = apply(this.items());\n if (!next || !updated) return null;\n this.items.set(next);\n this.refreshItems();\n return updated;\n }\n\n /**\n * Expands or collapses replies for a comment, loading them when needed.\n *\n * @param id - The comment id.\n * @param expanded - Whether replies should be visible.\n * @returns Promise that resolves when expansion and any lazy load are complete.\n */\n async setExpanded(id: string, expanded: boolean): Promise<void> {\n const item = this.findItem(id);\n if (!item) return;\n await this.setItemExpanded(item, expanded);\n }\n\n protected getId(item: AXCommentItem): string {\n return String(item.id);\n }\n\n protected getReplies(item: AXCommentItem): AXCommentItem[] {\n return item.replies ?? [];\n }\n\n protected getReplyCount(item: AXCommentItem): number {\n return item.replyCount ?? item.replies?.length ?? 0;\n }\n\n protected isExpanded(item: AXCommentItem): boolean {\n return !!item.repliesExpanded;\n }\n\n protected isItemLoading(item: AXCommentItem): boolean {\n return this.loadingIds().has(this.getId(item));\n }\n\n protected getTemplateContext(item: AXCommentItem, level: number): AXCommentItemTemplateContext {\n return {\n $implicit: item,\n item,\n level,\n repliesExpanded: this.isExpanded(item),\n replyCount: this.getReplyCount(item),\n loading: this.isItemLoading(item),\n liked: !!item.liked,\n likes: item.likes ?? 0,\n toggleReplies: () => void this.setItemExpanded(item, !this.isExpanded(item)),\n toggleLike: () => this.toggleLike(item),\n reply: (event?: Event) => this.replyTo(item, event),\n };\n }\n\n protected async onRepliesExpandedChange(item: AXCommentItem, expanded: boolean): Promise<void> {\n await this.setItemExpanded(item, expanded);\n }\n\n protected toggleLike(item: AXCommentItem, liked = !item.liked): void {\n const next = liked;\n const current = !!item.liked;\n if (next === current) {\n this.refreshItems();\n return;\n }\n item.liked = next;\n item.likes = Math.max(0, (item.likes ?? 0) + (next ? 1 : -1));\n this.refreshItems();\n this.onLikeChange.emit({\n component: this,\n item,\n liked: next,\n likes: item.likes ?? 0,\n isUserInteraction: true,\n });\n }\n\n protected replyTo(item: AXCommentItem, event?: Event): void {\n this.onReply.emit({\n component: this,\n item,\n nativeEvent: event,\n isUserInteraction: true,\n });\n }\n\n protected emitAction(item: AXCommentItem, action: AXMenuItem): void {\n this.onAction.emit({\n component: this,\n item,\n action,\n isUserInteraction: true,\n });\n }\n\n private async applyDatasource(ds: AXCommentDataSource | null): Promise<void> {\n if (ds == null) {\n this.items.set([]);\n this._isLoading.set(false);\n return;\n }\n\n if (Array.isArray(ds)) {\n this.items.set(ds);\n return;\n }\n\n await this.loadRootItems(ds);\n }\n\n private async loadRootItems(loadFn: AXCommentCallback): Promise<void> {\n const generation = ++this.loadGeneration;\n this._isLoading.set(true);\n try {\n const result = loadFn();\n const roots = result instanceof Promise ? await result : result;\n if (generation !== this.loadGeneration) return;\n this.items.set(roots);\n await this.hydrateExpanded(roots);\n } catch {\n if (generation !== this.loadGeneration) return;\n this.items.set([]);\n } finally {\n if (generation === this.loadGeneration) {\n this._isLoading.set(false);\n }\n }\n }\n\n private async hydrateExpanded(items: AXCommentItem[]): Promise<void> {\n for (const item of items) {\n if (item.repliesExpanded && this.canLazyLoad(item)) {\n await this.loadReplies(item);\n }\n const replies = this.getReplies(item);\n if (replies.length) {\n await this.hydrateExpanded(replies);\n }\n }\n }\n\n private canLazyLoad(item: AXCommentItem): boolean {\n return this.isLazyDataSource() && this.getReplyCount(item) > 0 && this.getReplies(item).length === 0;\n }\n\n private async setItemExpanded(item: AXCommentItem, expanded: boolean): Promise<void> {\n item.repliesExpanded = expanded;\n if (expanded && this.canLazyLoad(item)) {\n await this.loadReplies(item);\n }\n this.refreshItems();\n this.onRepliesToggle.emit({\n component: this,\n item,\n expanded,\n isUserInteraction: true,\n });\n }\n\n private async loadReplies(item: AXCommentItem): Promise<void> {\n const ds = this.datasource();\n if (typeof ds !== 'function') return;\n\n const id = this.getId(item);\n if (this.loadingIds().has(id) || this.getReplies(item).length > 0) return;\n\n this.loadingIds.update((set) => new Set(set).add(id));\n this.refreshItems();\n\n try {\n const result = ds(id);\n const replies = result instanceof Promise ? await result : result;\n item.replies = replies;\n item.replyCount = replies.length;\n } catch {\n item.replyCount = 0;\n } finally {\n this.loadingIds.update((set) => {\n const next = new Set(set);\n next.delete(id);\n return next;\n });\n this.refreshItems();\n }\n }\n\n private refreshItems(): void {\n const current = this.items();\n this.items.set([...current]);\n\n const ds = this.datasource();\n if (Array.isArray(ds)) {\n this.syncingFromDatasource = true;\n this.datasource.set([...current]);\n queueMicrotask(() => {\n this.syncingFromDatasource = false;\n });\n }\n }\n\n private findInTree(items: AXCommentItem[], id: string): AXCommentItem | null {\n for (const item of items) {\n if (this.getId(item) === id) return item;\n const found = this.findInTree(this.getReplies(item), id);\n if (found) return found;\n }\n return null;\n }\n\n private findParent(items: AXCommentItem[], id: string): AXCommentItem | null {\n for (const item of items) {\n const replies = this.getReplies(item);\n if (replies.some((child) => this.getId(child) === id)) return item;\n const nested = this.findParent(replies, id);\n if (nested) return nested;\n }\n return null;\n }\n}\n","@if (hasDatasource()) {\n @if (isLoading()) {\n <div class=\"ax-comment-view-skeleton\">\n @for (row of [1, 2, 3]; track row) {\n <div class=\"ax-comment-skeleton-row\">\n <ax-skeleton class=\"ax-comment-skeleton-avatar\"></ax-skeleton>\n <div class=\"ax-comment-skeleton-main\">\n <ax-skeleton class=\"ax-comment-skeleton-title\"></ax-skeleton>\n <ax-skeleton class=\"ax-comment-skeleton-body\"></ax-skeleton>\n </div>\n </div>\n }\n </div>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"itemsTpl\"\n [ngTemplateOutletContext]=\"{ items: items(), level: 0 }\"\n ></ng-container>\n }\n} @else {\n <ng-content select=\"ax-comment-item\" />\n}\n\n<ng-template #itemsTpl let-items=\"items\" let-level=\"level\">\n @for (item of items; track getId(item)) {\n <ax-comment-item\n [attr.id]=\"'comment-' + getId(item)\"\n [item]=\"item\"\n [replyCount]=\"getReplyCount(item)\"\n [repliesExpanded]=\"isExpanded(item)\"\n [loading]=\"isItemLoading(item)\"\n [itemTemplate]=\"resolvedTemplate()\"\n [itemContext]=\"resolvedTemplate() ? getTemplateContext(item, level) : null\"\n (repliesExpandedChange)=\"onRepliesExpandedChange(item, $event)\"\n (likeChange)=\"toggleLike(item, $event)\"\n (replyClick)=\"replyTo(item, $event)\"\n (actionClick)=\"emitAction(item, $event)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"itemsTpl\"\n [ngTemplateOutletContext]=\"{ items: getReplies(item), level: level + 1 }\"\n ></ng-container>\n </ax-comment-item>\n }\n</ng-template>\n","import { AXBadgeModule } from '@acorex/components/badge';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTextAreaModule } from '@acorex/components/text-area';\nimport { AXWysiwygModule } from '@acorex/components/wysiwyg';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { NgModule } from '@angular/core';\nimport { AXCommentContainerComponent } from './comment-container/comment-container.component';\nimport { AXCommentItemTemplateDirective } from './comment-item-template.directive';\nimport { AXCommentItemComponent } from './comment-item/comment-item.component';\nimport { AXCommentDateComponent } from './comment-tools/comment-date/comment-date.component';\nimport { AXCommentEditedComponent } from './comment-tools/comment-edited/comment-edited.component';\nimport { AXCommentLikeComponent } from './comment-tools/comment-like/comment-like.component';\nimport { AXMenuOptionsComponent } from './comment-tools/comment-menu-options/comment-menu-options.component';\nimport { AXCommentReplyComponent } from './comment-tools/comment-reply/comment-reply.component';\nimport { AXCommentReplyMoreComponent } from './comment-tools/comment-reply-more/comment-reply-more.component';\nimport { AXCommentReplyTextComponent } from './comment-tools/comment-reply-text/comment-reply-text.component';\nimport { AXCommentViewComponent } from './comment-view/comment-view.component';\n\nconst COMPONENTS = [\n AXCommentViewComponent,\n AXCommentContainerComponent,\n AXCommentItemComponent,\n AXCommentLikeComponent,\n AXMenuOptionsComponent,\n AXCommentReplyComponent,\n AXCommentReplyTextComponent,\n AXCommentDateComponent,\n AXCommentEditedComponent,\n AXCommentReplyMoreComponent,\n AXCommentItemTemplateDirective,\n];\n\nconst MODULES = [\n AXDecoratorModule,\n AXWysiwygModule,\n AXBadgeModule,\n AXButtonModule,\n AXTextAreaModule,\n AXTranslationModule,\n];\n\n@NgModule({\n imports: [...MODULES, ...COMPONENTS],\n exports: [...COMPONENTS],\n})\nexport class AXCommentModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-components-comment.mjs","sources":["../../../../packages/components/comment/src/lib/comment-container/comment-container.component.ts","../../../../packages/components/comment/src/lib/comment-item-template.directive.ts","../../../../packages/components/comment/src/lib/comment-tools/comment-date/comment-date.component.ts","../../../../packages/components/comment/src/lib/comment-tools/comment-edited/comment-edited.component.ts","../../../../packages/components/comment/src/lib/comment-tools/comment-like/comment-like.component.ts","../../../../packages/components/comment/src/lib/comment-tools/comment-like/comment-like.component.html","../../../../packages/components/comment/src/lib/comment-tools/comment-reply-text/comment-reply-text.component.ts","../../../../packages/components/comment/src/lib/comment-item/comment-item.component.ts","../../../../packages/components/comment/src/lib/comment-item/comment-item.component.html","../../../../packages/components/comment/src/lib/comment-tools/comment-menu-options/comment-menu-options.component.ts","../../../../packages/components/comment/src/lib/comment-tools/comment-reply/comment-reply.component.ts","../../../../packages/components/comment/src/lib/comment-tools/comment-reply-more/comment-reply-more.component.ts","../../../../packages/components/comment/src/lib/comment-view/comment-thread.host.ts","../../../../packages/components/comment/src/lib/comment-view/comment-thread.component.ts","../../../../packages/components/comment/src/lib/comment-view/comment-thread.component.html","../../../../packages/components/comment/src/lib/comment-view/comment-view.component.ts","../../../../packages/components/comment/src/lib/comment-view/comment-view.component.html","../../../../packages/components/comment/src/lib/comment.module.ts","../../../../packages/components/comment/src/acorex-components-comment.ts"],"sourcesContent":["import { AXComponent } from '@acorex/cdk/common';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n contentChild,\n DOCUMENT,\n inject,\n PLATFORM_ID,\n ViewEncapsulation,\n} from '@angular/core';\n\n/**\n * A container component for displaying and managing comments.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-container',\n template: `\n <ng-content select=\"ax-header\" />\n <ng-content />\n <ng-content select=\"ax-footer\" />\n `,\n styleUrl: './comment-container.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: AXComponent, useExisting: AXCommentContainerComponent }],\n host: {\n '[class.ax-has-header]': '!!projectedHeader()',\n '[class.ax-has-footer]': '!!projectedFooter()',\n },\n})\nexport class AXCommentContainerComponent {\n private document = inject(DOCUMENT);\n private platformID = inject(PLATFORM_ID);\n\n protected readonly projectedHeader = contentChild('ax-header');\n protected readonly projectedFooter = contentChild('ax-footer');\n\n /**\n * Scrolls to a specific comment reply by its ID and highlights it temporarily.\n *\n * @param id - The ID of the comment reply to scroll to\n */\n scrollToReply(id: string) {\n if (!isPlatformBrowser(this.platformID)) return;\n\n const key = String(id);\n const el =\n (this.document.querySelector(`ax-comment-item[id=\"${key}\"]`) as HTMLElement | null) ??\n (this.document.querySelector(`ax-comment-item[id=\"comment-${key}\"]`) as HTMLElement | null);\n if (!el) return;\n\n el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n el.classList.add('ax-state-highlight');\n setTimeout(() => el.classList.remove('ax-state-highlight'), 1500);\n }\n}\n","import { Directive, TemplateRef } from '@angular/core';\nimport { AXCommentItemTemplateContext } from './comment.types';\n\n/**\n * Marks an `ng-template` as a custom comment item renderer.\n * When omitted, `ax-comment-view` uses the built-in layout.\n * Like and reply stay in the item actions row either way.\n *\n * @example\n * ```html\n * <ax-comment-view [datasource]=\"comments\">\n * <ng-template axCommentItem let-item>\n * <ax-avatar [color]=\"item.color\" look=\"twotone\" shape=\"rounded\">\n * <ax-text>{{ item.initials }}</ax-text>\n * </ax-avatar>\n * <ax-title>{{ item.author }}</ax-title>\n * <ax-content>{{ item.content }}</ax-content>\n * </ng-template>\n * </ax-comment-view>\n * ```\n */\n@Directive({\n selector: 'ng-template[axCommentItem]',\n})\nexport class AXCommentItemTemplateDirective {\n constructor(readonly template: TemplateRef<AXCommentItemTemplateContext>) {}\n}\n","import { AXComponent } from '@acorex/cdk/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n/**\n * A component for displaying date on a comment.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-date',\n template: '<ng-content />',\n styleUrl: './comment-date.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: AXComponent, useExisting: AXCommentDateComponent }],\n})\nexport class AXCommentDateComponent {}\n","import { AXComponent } from '@acorex/cdk/common';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\n\n/**\n * Muted “edited” label shown next to the comment timestamp.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-edited',\n template: `{{ '@acorex:comment.edited' | translate | async }}`,\n styleUrl: './comment-edited.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ax-comment-edited',\n '[attr.title]': 'editedAt() || null',\n '[attr.aria-label]': 'editedAt() || null',\n },\n imports: [AXTranslatorPipe, AsyncPipe],\n providers: [{ provide: AXComponent, useExisting: AXCommentEditedComponent }],\n})\nexport class AXCommentEditedComponent {\n /** Optional tooltip (for example the time the comment was last edited). */\n readonly editedAt = input<string>();\n}\n","import { AXComponent } from '@acorex/cdk/common';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n output,\n signal,\n untracked,\n ViewEncapsulation,\n} from '@angular/core';\n\n/**\n * A component for displaying and managing likes on a comment.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-like',\n templateUrl: './comment-like.component.html',\n styleUrl: './comment-like.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXDecoratorIconComponent, AXDecoratorGenericComponent],\n providers: [{ provide: AXComponent, useExisting: AXCommentLikeComponent }],\n})\nexport class AXCommentLikeComponent {\n /** Current like state from the parent. Later parent values replace a local toggle. */\n readonly like = input.required<boolean>();\n\n readonly likeChange = output<boolean>();\n\n private readonly optimistic = signal<boolean | null>(null);\n private seenLike = false;\n private hasSeenLike = false;\n\n /** Parent value, unless the user just toggled and the parent has not caught up. */\n protected readonly pressed = computed(() => this.optimistic() ?? this.like());\n\n constructor() {\n effect(() => {\n const incoming = this.like();\n untracked(() => {\n if (!this.hasSeenLike || incoming !== this.seenLike) {\n this.hasSeenLike = true;\n this.seenLike = incoming;\n this.optimistic.set(null);\n }\n });\n });\n }\n\n protected toggleLike(): void {\n const next = !this.pressed();\n this.optimistic.set(next);\n this.likeChange.emit(next);\n }\n}\n","<button\n type=\"button\"\n class=\"ax-comment-like-button\"\n [class.ax-state-liked]=\"pressed()\"\n [attr.aria-pressed]=\"pressed()\"\n (click)=\"toggleLike()\"\n>\n <ax-icon [icon]=\"pressed() ? 'ax-icon ax-icon-solid ax-icon-heart' : 'ax-icon ax-icon-heart'\"></ax-icon>\n <ax-text><ng-content /></ax-text>\n</button>\n","import { AXComponent } from '@acorex/cdk/common';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n/**\n * A component for displaying the reply action on a comment.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-reply-text',\n template: `\n <button type=\"button\" class=\"ax-comment-reply-button\">\n <ax-icon icon=\"ax-icon ax-icon-arrow-turn-left\"></ax-icon>\n <ax-text>{{ '@acorex:comment.reply' | translate | async }}</ax-text>\n </button>\n `,\n styleUrl: './comment-reply-text.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXDecoratorGenericComponent, AXDecoratorIconComponent, AXTranslatorPipe, AsyncPipe],\n providers: [{ provide: AXComponent, useExisting: AXCommentReplyTextComponent }],\n})\nexport class AXCommentReplyTextComponent {}\n","import { AXComponent, AXItemClickEvent, AXStyleColorType } from '@acorex/cdk/common';\nimport { AXAvatarComponent } from '@acorex/components/avatar';\nimport { AXBadgeComponent } from '@acorex/components/badge';\nimport {\n AXButtonItemComponent,\n AXButtonItemListComponent,\n type AXButtonItemListItem,\n} from '@acorex/components/button';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXDropdownButtonComponent } from '@acorex/components/dropdown-button';\nimport { AXImageComponent } from '@acorex/components/image';\nimport type { AXMenuItem } from '@acorex/components/menu';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n effect,\n inject,\n input,\n output,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXCommentDateComponent } from '../comment-tools/comment-date/comment-date.component';\nimport { AXCommentEditedComponent } from '../comment-tools/comment-edited/comment-edited.component';\nimport { AXCommentLikeComponent } from '../comment-tools/comment-like/comment-like.component';\nimport { AXCommentReplyTextComponent } from '../comment-tools/comment-reply-text/comment-reply-text.component';\nimport { AXCommentItem, AXCommentItemTemplateContext } from '../comment.types';\n\n/**\n * A component that represents an individual comment item in the comment system.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-item',\n templateUrl: './comment-item.component.html',\n styleUrl: './comment-item.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AXTranslatorPipe,\n AsyncPipe,\n AXDecoratorIconComponent,\n AXDecoratorGenericComponent,\n NgTemplateOutlet,\n AXAvatarComponent,\n AXBadgeComponent,\n AXImageComponent,\n AXCommentDateComponent,\n AXCommentEditedComponent,\n AXCommentLikeComponent,\n AXCommentReplyTextComponent,\n AXDropdownButtonComponent,\n AXButtonItemListComponent,\n ],\n providers: [{ provide: AXComponent, useExisting: AXCommentItemComponent }],\n host: {\n '[class.ax-comment-item-reply]': 'isReply',\n '[class.ax-comment-item-custom]': '!!itemTemplate()',\n },\n})\nexport class AXCommentItemComponent {\n private readonly parentComment = inject(AXCommentItemComponent, { optional: true, skipSelf: true });\n\n protected readonly isReply = this.parentComment != null;\n\n private readonly projectedAvatar = contentChild(AXAvatarComponent);\n private readonly viewAvatar = viewChild(AXAvatarComponent);\n\n /** Data item used by `ax-comment-view`. When set, the default layout is rendered internally. */\n readonly item = input<AXCommentItem | null>(null);\n\n readonly replyCount = input<number>();\n\n /** Whether nested replies are visible. A later parent value replaces a local toggle. */\n readonly repliesExpanded = input(false);\n\n readonly repliesExpandedChange = output<boolean>();\n\n protected readonly expanded = signal(false);\n private seenExpanded = false;\n private hasSeenExpanded = false;\n\n /** Whether replies for this item are currently being loaded. */\n readonly loading = input(false);\n\n /**\n * Custom renderer for the item body. When omitted, the default layout\n * (or projected slots) is used.\n */\n readonly itemTemplate = input<TemplateRef<AXCommentItemTemplateContext> | null>(null);\n\n /** Context passed to `itemTemplate`. */\n readonly itemContext = input<AXCommentItemTemplateContext | null>(null);\n\n readonly likeChange = output<boolean>();\n readonly replyClick = output<Event>();\n readonly actionClick = output<AXMenuItem>();\n\n protected readonly avatarSize = 48;\n\n protected readonly showDefaultDataLayout = computed(() => !!this.item() && !this.itemTemplate());\n protected readonly useProjectedSlots = computed(() => !this.item() && !this.itemTemplate());\n protected readonly itemActions = computed(() => this.item()?.actions ?? []);\n protected readonly showOverflowMenu = computed(\n () => this.showDefaultDataLayout() && this.itemActions().length > 0,\n );\n protected readonly overflowItems = computed(() => this.toButtonItems(this.itemActions()));\n\n protected readonly templateContexts = computed(() => {\n const ctx = this.itemContext();\n return ctx ? [ctx] : [];\n });\n\n constructor() {\n effect(() => {\n const incoming = this.repliesExpanded();\n untracked(() => {\n if (!this.hasSeenExpanded || incoming !== this.seenExpanded) {\n this.hasSeenExpanded = true;\n this.seenExpanded = incoming;\n this.expanded.set(incoming);\n }\n });\n });\n\n afterNextRender(() => {\n if (this.itemTemplate()) return;\n (this.projectedAvatar() ?? this.viewAvatar())?.size?.set(this.avatarSize);\n });\n }\n\n /**\n * Recreates the custom item template when the rendered snapshot changes.\n * The outlet otherwise keeps the first context on screen.\n */\n protected templateContextKey(ctx: AXCommentItemTemplateContext): string {\n const item = ctx.item;\n return [\n item.id,\n item.author,\n item.content ?? '',\n item.date ?? '',\n item.edited ? 1 : 0,\n item.editedAt ?? '',\n ctx.likes,\n ctx.liked ? 1 : 0,\n ctx.replyCount,\n ctx.repliesExpanded ? 1 : 0,\n ].join('|');\n }\n\n protected getColor(data: AXCommentItem): AXStyleColorType {\n return data.color ?? 'default';\n }\n\n protected showEdited(data: AXCommentItem): boolean {\n return data.edited === true;\n }\n\n protected getInitials(data: AXCommentItem): string {\n if (data.initials) return data.initials;\n return (data.author || '')\n .split(/\\s+/)\n .filter(Boolean)\n .map((part) => part[0])\n .join('')\n .slice(0, 2)\n .toUpperCase();\n }\n\n protected handleLike(liked: boolean) {\n this.likeChange.emit(liked);\n }\n\n protected handleReply(event: Event) {\n this.replyClick.emit(event);\n }\n\n protected handleOverflowClick(event: AXItemClickEvent<AXButtonItemComponent>) {\n const action =\n this.findAction(this.itemActions(), event.name) ?? {\n text: event.item?.text ?? event.name ?? '',\n name: event.name,\n data: event.data,\n };\n this.actionClick.emit(action);\n }\n\n private toButtonItems(items: AXMenuItem[]): AXButtonItemListItem[] {\n return items.map((item) => ({\n name: item.name ?? item.text,\n text: item.text,\n icon: item.icon ?? '',\n color: item.color,\n disabled: item.disabled,\n divided: item.break,\n items: item.items?.length ? this.toButtonItems(item.items) : undefined,\n }));\n }\n\n private findAction(items: AXMenuItem[], name?: string): AXMenuItem | undefined {\n if (name == null) return undefined;\n for (const item of items) {\n if ((item.name ?? item.text) === name) return item;\n const nested = item.items?.length ? this.findAction(item.items, name) : undefined;\n if (nested) return nested;\n }\n return undefined;\n }\n\n /**\n * Toggles the collapse state of the comment replies section.\n */\n toggleReplies() {\n this.setExpanded(!this.expanded());\n }\n\n /**\n * Expands the nested replies section.\n */\n showReplies() {\n this.setExpanded(true);\n }\n\n /**\n * Collapses the nested replies section.\n */\n hideReplies() {\n this.setExpanded(false);\n }\n\n private setExpanded(expanded: boolean): void {\n this.expanded.set(expanded);\n this.repliesExpandedChange.emit(expanded);\n }\n}\n","<div class=\"ax-comment-layout\">\n @if (showDefaultDataLayout()) {\n @if (item(); as data) {\n <ax-avatar [color]=\"getColor(data)\" [size]=\"avatarSize\" look=\"twotone\" shape=\"rounded\">\n @if (data.avatar) {\n <ax-image [src]=\"data.avatar\"></ax-image>\n } @else {\n <ax-text>{{ getInitials(data) }}</ax-text>\n }\n </ax-avatar>\n }\n }\n <ng-content select=\"ax-avatar\" />\n\n <div class=\"ax-comment-main\">\n @if (itemTemplate(); as tpl) {\n @for (ctx of templateContexts(); track templateContextKey(ctx)) {\n <div class=\"ax-comment-custom-body\">\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"ctx\" />\n </div>\n }\n } @else if (showDefaultDataLayout()) {\n @if (item(); as data) {\n <div class=\"ax-comment-header\">\n <div class=\"ax-comment-header-meta\">\n <ax-title>{{ data.author }}</ax-title>\n @if (data.isYou) {\n <ax-badge\n class=\"ax-sm ax-pill ax-comment-you-badge\"\n look=\"twotone\"\n color=\"primary\"\n [text]=\"('@acorex:comment.you' | translate | async) ?? 'You'\"\n ></ax-badge>\n }\n @if (showEdited(data)) {\n <ax-comment-edited [editedAt]=\"data.editedAt\" />\n }\n @if (data.date) {\n <ax-comment-date>{{ data.date }}</ax-comment-date>\n }\n </div>\n @if (showOverflowMenu()) {\n <ax-dropdown-button\n class=\"ax-sm ax-comment-menu-trigger\"\n mode=\"dropdown\"\n look=\"blank\"\n [iconOnly]=\"true\"\n text=\"More\"\n >\n <ax-prefix>\n <ax-icon icon=\"ax-icon ax-icon-more-horizontal\"></ax-icon>\n </ax-prefix>\n <ax-button-item-list [items]=\"overflowItems()\" (onItemClick)=\"handleOverflowClick($event)\">\n </ax-button-item-list>\n </ax-dropdown-button>\n }\n </div>\n <div class=\"ax-comment-body\">\n <ax-content>\n <div [innerHTML]=\"data.content\"></div>\n </ax-content>\n </div>\n }\n }\n\n <div class=\"ax-comment-default\" [hidden]=\"!useProjectedSlots()\">\n <div class=\"ax-comment-header\">\n <div class=\"ax-comment-header-meta\">\n <ng-content select=\"ax-title\" />\n <ng-content select=\"ax-subtitle\" />\n <ng-content select=\"ax-badge\" />\n <ng-content select=\"ax-comment-edited\" />\n <ng-content select=\"ax-comment-date\" />\n </div>\n <ng-content select=\"ax-comment-menu-options\" />\n </div>\n <div class=\"ax-comment-body\">\n <ng-content select=\"ax-content\" />\n </div>\n </div>\n\n <div class=\"ax-comment-actions\">\n @if (item(); as data) {\n <ax-comment-like [like]=\"!!data.liked\" (likeChange)=\"handleLike($event)\">\n {{ data.likes ?? 0 }}\n </ax-comment-like>\n <ax-comment-reply-text (click)=\"handleReply($event)\"></ax-comment-reply-text>\n }\n <ng-content select=\"ax-comment-like\" />\n <ng-content select=\"ax-comment-reply-text\" />\n @if (replyCount()) {\n <button\n type=\"button\"\n class=\"ax-comment-replies-toggle\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-busy]=\"loading()\"\n [disabled]=\"loading()\"\n (click)=\"toggleReplies()\"\n >\n <ax-icon\n [icon]=\"\n loading()\n ? 'ax-icon ax-icon-reload'\n : expanded()\n ? 'ax-icon ax-icon-chevron-up'\n : 'ax-icon ax-icon-chevron-down'\n \"\n [class.ax-comment-loading-icon]=\"loading()\"\n ></ax-icon>\n <span>\n {{ replyCount() }}\n {{ ((replyCount() ?? 0) > 1 ? '@acorex:comment.replies' : '@acorex:comment.reply') | translate | async }}\n </span>\n </button>\n }\n </div>\n\n <div class=\"ax-comment-replies\" [hidden]=\"!(replyCount() && expanded())\">\n @if (loading()) {\n <div class=\"ax-comment-replies-loading\">\n <ax-icon icon=\"ax-icon ax-icon-reload\" class=\"ax-comment-loading-icon\"></ax-icon>\n </div>\n }\n <ng-content select=\"ax-comment-item\" />\n <ng-content select=\"ax-comment-reply-more\" />\n <ng-content />\n </div>\n </div>\n</div>\n","import { AXComponent } from '@acorex/cdk/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n/**\n * A component for displaying and managing menu options on a comment.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-menu-options',\n template: '<ng-content />',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: AXComponent, useExisting: AXMenuOptionsComponent }],\n})\nexport class AXMenuOptionsComponent {}\n","import { AXComponent } from '@acorex/cdk/common';\nimport { AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n DOCUMENT,\n inject,\n input,\n output,\n PLATFORM_ID,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXCommentItem } from '../../comment.types';\n\n/**\n * Composer chrome shown while writing a reply. Projects the editor below a\n * compact reply-context bar; hide the bar by leaving `item` empty.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-reply',\n template: `\n @if (item(); as target) {\n <div class=\"ax-comment-reply-banner\">\n <button type=\"button\" class=\"ax-comment-reply-target\" (click)=\"revealTarget()\">\n <ax-icon\n class=\"ax-comment-reply-lead-icon\"\n icon=\"ax-icon ax-icon-arrow-turn-left\"\n aria-hidden=\"true\"\n ></ax-icon>\n <span class=\"ax-comment-reply-copy\">\n <span class=\"ax-comment-reply-label\">\n {{ '@acorex:comment.replying-to' | translate | async }}\n <span class=\"ax-comment-reply-author\">\n @if (target.isYou) {\n {{ '@acorex:comment.you' | translate | async }}\n } @else {\n {{ target.author }}\n }\n </span>\n </span>\n @if (preview(); as excerpt) {\n <span class=\"ax-comment-reply-preview\" [title]=\"excerpt\">{{ excerpt }}</span>\n }\n </span>\n </button>\n <button\n type=\"button\"\n class=\"ax-comment-reply-close\"\n [attr.aria-label]=\"'@acorex:common.general.close' | translate | async\"\n (click)=\"close()\"\n >\n <ax-icon icon=\"ax-icon ax-icon-close\" aria-hidden=\"true\"></ax-icon>\n </button>\n </div>\n }\n <div class=\"ax-comment-reply-composer\">\n <ng-content />\n </div>\n `,\n styleUrl: './comment-reply.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXDecoratorIconComponent, AXTranslatorPipe, AsyncPipe],\n providers: [{ provide: AXComponent, useExisting: AXCommentReplyComponent }],\n host: {\n class: 'ax-comment-reply',\n '[class.ax-comment-reply-open]': '!!item()',\n },\n})\nexport class AXCommentReplyComponent {\n private readonly document = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n private highlightTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n if (this.highlightTimer) clearTimeout(this.highlightTimer);\n });\n }\n\n /** Comment currently being replied to. When null, only the projected composer is shown. */\n readonly item = input<AXCommentItem | null>(null);\n\n /** Emitted when the close control on the reply banner is clicked. */\n readonly onClose = output<void>();\n\n /** Emitted when the banner is clicked to jump to the target comment. */\n readonly onTargetClick = output<string>();\n\n protected readonly preview = computed(() => this.toPreview(this.item()?.content));\n\n protected close() {\n this.onClose.emit();\n }\n\n protected revealTarget() {\n const item = this.item();\n if (!item) return;\n const id = String(item.id);\n this.onTargetClick.emit(id);\n this.scrollToComment(id);\n }\n\n private scrollToComment(id: string) {\n if (!isPlatformBrowser(this.platformId)) return;\n const el =\n (this.document.querySelector(`ax-comment-item[id=\"${id}\"]`) as HTMLElement | null) ??\n (this.document.querySelector(`ax-comment-item[id=\"comment-${id}\"]`) as HTMLElement | null);\n if (!el) return;\n\n el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n el.classList.add('ax-state-highlight');\n if (this.highlightTimer) clearTimeout(this.highlightTimer);\n this.highlightTimer = setTimeout(() => {\n el.classList.remove('ax-state-highlight');\n this.highlightTimer = null;\n }, 1500);\n }\n\n private toPreview(content?: string): string {\n return String(content ?? '')\n .replace(/<[^>]+>/g, ' ')\n .replace(/&nbsp;|&#160;/gi, ' ')\n .replace(/&amp;/gi, '&')\n .replace(/&lt;/gi, '<')\n .replace(/&gt;/gi, '>')\n .replace(/&quot;/gi, '\"')\n .replace(/&#39;|&apos;/gi, \"'\")\n .replace(/\\s+/g, ' ')\n .trim();\n }\n}\n","import { AXComponent } from '@acorex/cdk/common';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n/**\n * A component for displaying \"show more replies\" action on a comment.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-reply-more',\n template: '<ax-text><ng-content /></ax-text>',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXDecoratorGenericComponent],\n providers: [{ provide: AXComponent, useExisting: AXCommentReplyMoreComponent }],\n})\nexport class AXCommentReplyMoreComponent {}\n","import type { AXMenuItem } from '@acorex/components/menu';\nimport { InjectionToken } from '@angular/core';\nimport type { AXCommentItem, AXCommentItemTemplateContext } from '../comment.types';\n\n/**\n * Callbacks the recursive thread uses from `ax-comment-view`.\n * Kept as a token so the thread component does not import the view class.\n */\nexport interface AXCommentThreadHost {\n trackItem(item: AXCommentItem): string;\n getId(item: AXCommentItem): string;\n getReplies(item: AXCommentItem): AXCommentItem[];\n getReplyCount(item: AXCommentItem): number;\n isExpanded(item: AXCommentItem): boolean;\n isItemLoading(item: AXCommentItem): boolean;\n getTemplateContext(item: AXCommentItem, level: number): AXCommentItemTemplateContext;\n onRepliesExpandedChange(item: AXCommentItem, expanded: boolean): Promise<void>;\n toggleLike(item: AXCommentItem, liked?: boolean): void;\n replyTo(item: AXCommentItem, event?: Event): void;\n emitAction(item: AXCommentItem, action: AXMenuItem): void;\n}\n\nexport const AX_COMMENT_THREAD_HOST = new InjectionToken<AXCommentThreadHost>('AX_COMMENT_THREAD_HOST');\n","import { ChangeDetectionStrategy, Component, inject, input, ViewEncapsulation } from '@angular/core';\nimport type { TemplateRef } from '@angular/core';\nimport { AXCommentItemComponent } from '../comment-item/comment-item.component';\nimport type { AXCommentItem, AXCommentItemTemplateContext } from '../comment.types';\nimport { AX_COMMENT_THREAD_HOST } from './comment-thread.host';\n\n/**\n * Renders one level of the comment tree.\n * A real component input (instead of `ngTemplateOutlet`) so OnPush checks this\n * level again whenever the parent replaces the items array.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-thread',\n templateUrl: './comment-thread.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXCommentItemComponent, AXCommentThreadComponent],\n host: {\n style: 'display: contents',\n },\n})\nexport class AXCommentThreadComponent {\n protected readonly host = inject(AX_COMMENT_THREAD_HOST);\n\n readonly items = input.required<AXCommentItem[]>();\n readonly level = input(0);\n readonly itemTemplate = input<TemplateRef<AXCommentItemTemplateContext> | null>(null);\n}\n","@for (item of items(); track host.trackItem(item)) {\n <ax-comment-item\n [attr.id]=\"'comment-' + host.getId(item)\"\n [item]=\"item\"\n [replyCount]=\"host.getReplyCount(item)\"\n [repliesExpanded]=\"host.isExpanded(item)\"\n [loading]=\"host.isItemLoading(item)\"\n [itemTemplate]=\"itemTemplate()\"\n [itemContext]=\"itemTemplate() ? host.getTemplateContext(item, level()) : null\"\n (repliesExpandedChange)=\"host.onRepliesExpandedChange(item, $event)\"\n (likeChange)=\"host.toggleLike(item, $event)\"\n (replyClick)=\"host.replyTo(item, $event)\"\n (actionClick)=\"host.emitAction(item, $event)\"\n >\n <ax-comment-thread [items]=\"host.getReplies(item)\" [level]=\"level() + 1\" [itemTemplate]=\"itemTemplate()\" />\n </ax-comment-item>\n}\n","import { AXComponent } from '@acorex/cdk/common';\nimport type { AXMenuItem } from '@acorex/components/menu';\nimport { AXSkeletonComponent } from '@acorex/components/skeleton';\nimport {\n ChangeDetectionStrategy,\n Component,\n TemplateRef,\n computed,\n contentChild,\n effect,\n input,\n model,\n output,\n signal,\n untracked,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXCommentItemTemplateDirective } from '../comment-item-template.directive';\nimport { AXCommentThreadComponent } from './comment-thread.component';\nimport { AX_COMMENT_THREAD_HOST, type AXCommentThreadHost } from './comment-thread.host';\nimport {\n AXCommentCallback,\n AXCommentDataSource,\n AXCommentItem,\n AXCommentItemTemplateContext,\n AXCommentActionEvent,\n AXCommentLikeChangeEvent,\n AXCommentRepliesToggleEvent,\n AXCommentReplyEvent,\n} from '../comment.types';\n\n/**\n * Renders a comment thread from a datasource (array or lazy callback).\n * Provide `itemTemplate` or `<ng-template axCommentItem>` to customize item UI;\n * otherwise the built-in layout is used.\n *\n * @category Components\n */\n@Component({\n selector: 'ax-comment-view',\n templateUrl: './comment-view.component.html',\n styleUrl: './comment-view.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXCommentThreadComponent, AXSkeletonComponent],\n providers: [\n { provide: AXComponent, useExisting: AXCommentViewComponent },\n { provide: AX_COMMENT_THREAD_HOST, useExisting: AXCommentViewComponent },\n ],\n})\nexport class AXCommentViewComponent implements AXCommentThreadHost {\n /** Comment data — a static array or a lazy-loading function. */\n readonly datasource = model<AXCommentDataSource | null>(null);\n\n /**\n * Custom item template. When omitted, the default comment layout is used.\n * You can also project `<ng-template axCommentItem>`.\n */\n readonly itemTemplate = input<TemplateRef<AXCommentItemTemplateContext>>();\n\n readonly onReply = output<AXCommentReplyEvent>();\n readonly onLikeChange = output<AXCommentLikeChangeEvent>();\n readonly onRepliesToggle = output<AXCommentRepliesToggleEvent>();\n readonly onAction = output<AXCommentActionEvent>();\n\n private readonly projectedItemTemplate = contentChild(AXCommentItemTemplateDirective);\n\n protected readonly items = signal<AXCommentItem[]>([]);\n private readonly loadingIds = signal<Set<string>>(new Set());\n private readonly _isLoading = signal(false);\n readonly isLoading = this._isLoading.asReadonly();\n\n private loadGeneration = 0;\n private readonly emptyReplies: AXCommentItem[] = [];\n\n private readonly isLazyDataSource = computed(() => typeof this.datasource() === 'function');\n\n protected readonly hasDatasource = computed(() => this.datasource() != null);\n\n protected readonly resolvedTemplate = computed(\n () => this.itemTemplate() ?? this.projectedItemTemplate()?.template ?? null,\n );\n\n constructor() {\n effect(() => {\n const ds = this.datasource();\n untracked(() => void this.applyDatasource(ds));\n });\n }\n\n /**\n * Reloads root comments from the datasource.\n *\n * @returns Promise that resolves when the reload is complete.\n */\n async reloadData(): Promise<void> {\n await this.applyDatasource(this.datasource());\n }\n\n /**\n * Appends a comment to the current root list.\n *\n * @param item - The comment to append.\n * @returns void\n */\n appendItem(item: AXCommentItem): void {\n this.items.update((list) => [...list, item]);\n }\n\n /**\n * Appends a reply under a loaded comment and expands that thread.\n *\n * @param parentId - The parent comment id.\n * @param item - The reply to append.\n * @returns Promise that resolves when any needed lazy load and the append are complete.\n */\n async appendReply(parentId: string, item: AXCommentItem): Promise<void> {\n const parent = this.findItem(parentId);\n if (!parent) return;\n if (this.canLazyLoad(parent)) {\n await this.loadReplies(parent);\n }\n parent.replies = [...(parent.replies ?? []), item];\n parent.replyCount = parent.replies.length;\n parent.repliesExpanded = true;\n this.refreshItems();\n }\n\n /**\n * Finds a comment by id in the loaded tree.\n *\n * @param id - The comment id.\n * @returns The matching item, or null if it is not loaded.\n */\n findItem(id: string): AXCommentItem | null {\n return this.findInTree(this.items(), id);\n }\n\n /**\n * Removes a comment from the loaded tree. Nested replies are removed with it.\n *\n * @param id - The comment id.\n * @returns True when the comment was found and removed.\n */\n removeItem(id: string): boolean {\n const key = String(id);\n const roots = this.items();\n if (roots.some((item) => this.getId(item) === key)) {\n this.items.set(roots.filter((item) => this.getId(item) !== key));\n this.refreshItems();\n return true;\n }\n const parent = this.findParent(roots, key);\n if (!parent?.replies?.length) return false;\n const before = parent.replies.length;\n parent.replies = parent.replies.filter((child) => this.getId(child) !== key);\n const removed = before - parent.replies.length;\n if (!removed) return false;\n parent.replyCount = Math.max(0, (parent.replyCount ?? before) - removed);\n this.refreshItems();\n return true;\n }\n\n /**\n * Patches a loaded comment in place.\n *\n * @param id - The comment id.\n * @param patch - Fields to merge onto the existing item. The original id is kept.\n * @returns The updated item, or null if it is not loaded.\n */\n updateItem(id: string, patch: Partial<AXCommentItem>): AXCommentItem | null {\n const key = String(id);\n let updated: AXCommentItem | null = null;\n\n const apply = (items: AXCommentItem[]): AXCommentItem[] | null => {\n const index = items.findIndex((item) => this.getId(item) === key);\n if (index >= 0) {\n const current = items[index];\n if (!current) return null;\n const nextItem: AXCommentItem = { ...current, ...patch, id: current.id };\n updated = nextItem;\n const next = items.slice();\n next[index] = nextItem;\n return next;\n }\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (!item.replies?.length) continue;\n const replies = apply(item.replies);\n if (!replies) continue;\n const next = items.slice();\n next[i] = { ...item, replies };\n return next;\n }\n return null;\n };\n\n const next = apply(this.items());\n if (!next || !updated) return null;\n this.items.set(next);\n this.refreshItems();\n return updated;\n }\n\n /**\n * Expands or collapses replies for a comment, loading them when needed.\n *\n * @param id - The comment id.\n * @param expanded - Whether replies should be visible.\n * @returns Promise that resolves when expansion and any lazy load are complete.\n */\n async setExpanded(id: string, expanded: boolean): Promise<void> {\n const item = this.findItem(id);\n if (!item) return;\n await this.setItemExpanded(item, expanded);\n }\n\n getId(item: AXCommentItem): string {\n return String(item.id);\n }\n\n /**\n * Identity includes the fields the row renders. A same-id edit, like, or reply\n * must refresh the row instead of leaving the previous snapshot on screen.\n */\n trackItem(item: AXCommentItem): string {\n const replies = (item.replies ?? []).map((reply) => this.trackItem(reply)).join(',');\n return [\n this.getId(item),\n item.content ?? '',\n item.likes ?? 0,\n item.liked ? 1 : 0,\n item.edited ? 1 : 0,\n item.editedAt ?? '',\n item.replyCount ?? item.replies?.length ?? 0,\n item.repliesExpanded ? 1 : 0,\n replies,\n ].join(':');\n }\n\n getReplies(item: AXCommentItem): AXCommentItem[] {\n return item.replies?.length ? item.replies : this.emptyReplies;\n }\n\n getReplyCount(item: AXCommentItem): number {\n return item.replyCount ?? item.replies?.length ?? 0;\n }\n\n isExpanded(item: AXCommentItem): boolean {\n return !!item.repliesExpanded;\n }\n\n isItemLoading(item: AXCommentItem): boolean {\n return this.loadingIds().has(this.getId(item));\n }\n\n getTemplateContext(item: AXCommentItem, level: number): AXCommentItemTemplateContext {\n return {\n $implicit: item,\n item,\n level,\n repliesExpanded: this.isExpanded(item),\n replyCount: this.getReplyCount(item),\n loading: this.isItemLoading(item),\n liked: !!item.liked,\n likes: item.likes ?? 0,\n toggleReplies: () => void this.setItemExpanded(item, !this.isExpanded(item)),\n toggleLike: () => this.toggleLike(item),\n reply: (event?: Event) => this.replyTo(item, event),\n };\n }\n\n async onRepliesExpandedChange(item: AXCommentItem, expanded: boolean): Promise<void> {\n await this.setItemExpanded(item, expanded);\n }\n\n toggleLike(item: AXCommentItem, liked = !item.liked): void {\n const next = liked;\n const current = !!item.liked;\n if (next === current) {\n this.refreshItems();\n return;\n }\n item.liked = next;\n item.likes = Math.max(0, (item.likes ?? 0) + (next ? 1 : -1));\n this.refreshItems();\n this.onLikeChange.emit({\n component: this,\n item,\n liked: next,\n likes: item.likes ?? 0,\n isUserInteraction: true,\n });\n }\n\n replyTo(item: AXCommentItem, event?: Event): void {\n this.onReply.emit({\n component: this,\n item,\n nativeEvent: event,\n isUserInteraction: true,\n });\n }\n\n emitAction(item: AXCommentItem, action: AXMenuItem): void {\n this.onAction.emit({\n component: this,\n item,\n action,\n isUserInteraction: true,\n });\n }\n\n private async applyDatasource(ds: AXCommentDataSource | null): Promise<void> {\n if (ds == null) {\n this.items.set([]);\n this._isLoading.set(false);\n return;\n }\n\n if (Array.isArray(ds)) {\n this.items.set(ds.slice());\n return;\n }\n\n await this.loadRootItems(ds);\n }\n\n private async loadRootItems(loadFn: AXCommentCallback): Promise<void> {\n const generation = ++this.loadGeneration;\n this._isLoading.set(true);\n try {\n const result = loadFn();\n const roots = result instanceof Promise ? await result : result;\n if (generation !== this.loadGeneration) return;\n this.items.set(roots);\n await this.hydrateExpanded(roots);\n } catch {\n if (generation !== this.loadGeneration) return;\n this.items.set([]);\n } finally {\n if (generation === this.loadGeneration) {\n this._isLoading.set(false);\n }\n }\n }\n\n private async hydrateExpanded(items: AXCommentItem[]): Promise<void> {\n for (const item of items) {\n if (item.repliesExpanded && this.canLazyLoad(item)) {\n await this.loadReplies(item);\n }\n const replies = this.getReplies(item);\n if (replies.length) {\n await this.hydrateExpanded(replies);\n }\n }\n }\n\n private canLazyLoad(item: AXCommentItem): boolean {\n return this.isLazyDataSource() && this.getReplyCount(item) > 0 && this.getReplies(item).length === 0;\n }\n\n private async setItemExpanded(item: AXCommentItem, expanded: boolean): Promise<void> {\n item.repliesExpanded = expanded;\n if (expanded && this.canLazyLoad(item)) {\n await this.loadReplies(item);\n }\n this.refreshItems();\n this.onRepliesToggle.emit({\n component: this,\n item,\n expanded,\n isUserInteraction: true,\n });\n }\n\n private async loadReplies(item: AXCommentItem): Promise<void> {\n const ds = this.datasource();\n if (typeof ds !== 'function') return;\n\n const id = this.getId(item);\n if (this.loadingIds().has(id) || this.getReplies(item).length > 0) return;\n\n this.loadingIds.update((set) => new Set(set).add(id));\n this.refreshItems();\n\n try {\n const result = ds(id);\n const replies = result instanceof Promise ? await result : result;\n item.replies = replies;\n item.replyCount = replies.length;\n } catch {\n item.replyCount = 0;\n } finally {\n this.loadingIds.update((set) => {\n const next = new Set(set);\n next.delete(id);\n return next;\n });\n this.refreshItems();\n }\n }\n\n private refreshItems(): void {\n // Keep the parent datasource as the source of truth. Writing it back here\n // used to drop the next array the parent pushed in.\n this.items.set(this.items().slice());\n }\n\n private findInTree(items: AXCommentItem[], id: string): AXCommentItem | null {\n for (const item of items) {\n if (this.getId(item) === id) return item;\n const found = this.findInTree(this.getReplies(item), id);\n if (found) return found;\n }\n return null;\n }\n\n private findParent(items: AXCommentItem[], id: string): AXCommentItem | null {\n for (const item of items) {\n const replies = this.getReplies(item);\n if (replies.some((child) => this.getId(child) === id)) return item;\n const nested = this.findParent(replies, id);\n if (nested) return nested;\n }\n return null;\n }\n}\n","@if (hasDatasource()) {\n @if (isLoading()) {\n <div class=\"ax-comment-view-skeleton\">\n @for (row of [1, 2, 3]; track row) {\n <div class=\"ax-comment-skeleton-row\">\n <ax-skeleton class=\"ax-comment-skeleton-avatar\"></ax-skeleton>\n <div class=\"ax-comment-skeleton-main\">\n <ax-skeleton class=\"ax-comment-skeleton-title\"></ax-skeleton>\n <ax-skeleton class=\"ax-comment-skeleton-body\"></ax-skeleton>\n </div>\n </div>\n }\n </div>\n } @else {\n <ax-comment-thread [items]=\"items()\" [level]=\"0\" [itemTemplate]=\"resolvedTemplate()\" />\n }\n} @else {\n <ng-content select=\"ax-comment-item\" />\n}\n","import { AXBadgeModule } from '@acorex/components/badge';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTextAreaModule } from '@acorex/components/text-area';\nimport { AXWysiwygModule } from '@acorex/components/wysiwyg';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { NgModule } from '@angular/core';\nimport { AXCommentContainerComponent } from './comment-container/comment-container.component';\nimport { AXCommentItemTemplateDirective } from './comment-item-template.directive';\nimport { AXCommentItemComponent } from './comment-item/comment-item.component';\nimport { AXCommentDateComponent } from './comment-tools/comment-date/comment-date.component';\nimport { AXCommentEditedComponent } from './comment-tools/comment-edited/comment-edited.component';\nimport { AXCommentLikeComponent } from './comment-tools/comment-like/comment-like.component';\nimport { AXMenuOptionsComponent } from './comment-tools/comment-menu-options/comment-menu-options.component';\nimport { AXCommentReplyComponent } from './comment-tools/comment-reply/comment-reply.component';\nimport { AXCommentReplyMoreComponent } from './comment-tools/comment-reply-more/comment-reply-more.component';\nimport { AXCommentReplyTextComponent } from './comment-tools/comment-reply-text/comment-reply-text.component';\nimport { AXCommentViewComponent } from './comment-view/comment-view.component';\n\nconst COMPONENTS = [\n AXCommentViewComponent,\n AXCommentContainerComponent,\n AXCommentItemComponent,\n AXCommentLikeComponent,\n AXMenuOptionsComponent,\n AXCommentReplyComponent,\n AXCommentReplyTextComponent,\n AXCommentDateComponent,\n AXCommentEditedComponent,\n AXCommentReplyMoreComponent,\n AXCommentItemTemplateDirective,\n];\n\nconst MODULES = [\n AXDecoratorModule,\n AXWysiwygModule,\n AXBadgeModule,\n AXButtonModule,\n AXTextAreaModule,\n AXTranslationModule,\n];\n\n@NgModule({\n imports: [...MODULES, ...COMPONENTS],\n exports: [...COMPONENTS],\n})\nexport class AXCommentModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@acorex/components",
3
- "version": "22.4.18",
3
+ "version": "22.4.20",
4
4
  "peerDependencies": {
5
- "@acorex/core": "22.4.18",
6
- "@acorex/cdk": "22.4.18",
5
+ "@acorex/core": "22.4.20",
6
+ "@acorex/cdk": "22.4.20",
7
7
  "@angular/aria": ">=22.1.0",
8
8
  "polytype": ">=0.17.0",
9
9
  "hammerjs": ">=2.0.8",
@@ -140,8 +140,12 @@ declare class AXCommentItemComponent {
140
140
  /** Data item used by `ax-comment-view`. When set, the default layout is rendered internally. */
141
141
  readonly item: _angular_core.InputSignal<AXCommentItem>;
142
142
  readonly replyCount: _angular_core.InputSignal<number>;
143
- /** Two-way bindable state controlling whether nested replies are visible. */
144
- readonly repliesExpanded: _angular_core.ModelSignal<boolean>;
143
+ /** Whether nested replies are visible. A later parent value replaces a local toggle. */
144
+ readonly repliesExpanded: _angular_core.InputSignal<boolean>;
145
+ readonly repliesExpandedChange: _angular_core.OutputEmitterRef<boolean>;
146
+ protected readonly expanded: _angular_core.WritableSignal<boolean>;
147
+ private seenExpanded;
148
+ private hasSeenExpanded;
145
149
  /** Whether replies for this item are currently being loaded. */
146
150
  readonly loading: _angular_core.InputSignal<boolean>;
147
151
  /**
@@ -160,7 +164,13 @@ declare class AXCommentItemComponent {
160
164
  protected readonly itemActions: _angular_core.Signal<AXMenuItem[]>;
161
165
  protected readonly showOverflowMenu: _angular_core.Signal<boolean>;
162
166
  protected readonly overflowItems: _angular_core.Signal<AXButtonItemListItem[]>;
167
+ protected readonly templateContexts: _angular_core.Signal<AXCommentItemTemplateContext[]>;
163
168
  constructor();
169
+ /**
170
+ * Recreates the custom item template when the rendered snapshot changes.
171
+ * The outlet otherwise keeps the first context on screen.
172
+ */
173
+ protected templateContextKey(ctx: AXCommentItemTemplateContext): string;
164
174
  protected getColor(data: AXCommentItem): AXStyleColorType;
165
175
  protected showEdited(data: AXCommentItem): boolean;
166
176
  protected getInitials(data: AXCommentItem): string;
@@ -181,8 +191,9 @@ declare class AXCommentItemComponent {
181
191
  * Collapses the nested replies section.
182
192
  */
183
193
  hideReplies(): void;
194
+ private setExpanded;
184
195
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXCommentItemComponent, never>;
185
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXCommentItemComponent, "ax-comment-item", never, { "item": { "alias": "item"; "required": false; "isSignal": true; }; "replyCount": { "alias": "replyCount"; "required": false; "isSignal": true; }; "repliesExpanded": { "alias": "repliesExpanded"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; "isSignal": true; }; "itemContext": { "alias": "itemContext"; "required": false; "isSignal": true; }; }, { "repliesExpanded": "repliesExpandedChange"; "likeChange": "likeChange"; "replyClick": "replyClick"; "actionClick": "actionClick"; }, ["projectedAvatar"], ["ax-avatar", "ax-title", "ax-subtitle", "ax-badge", "ax-comment-edited", "ax-comment-date", "ax-comment-menu-options", "ax-content", "ax-comment-like", "ax-comment-reply-text", "ax-comment-item", "ax-comment-reply-more", "*"], true, never>;
196
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXCommentItemComponent, "ax-comment-item", never, { "item": { "alias": "item"; "required": false; "isSignal": true; }; "replyCount": { "alias": "replyCount"; "required": false; "isSignal": true; }; "repliesExpanded": { "alias": "repliesExpanded"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; "isSignal": true; }; "itemContext": { "alias": "itemContext"; "required": false; "isSignal": true; }; }, { "repliesExpandedChange": "repliesExpandedChange"; "likeChange": "likeChange"; "replyClick": "replyClick"; "actionClick": "actionClick"; }, ["projectedAvatar"], ["ax-avatar", "ax-title", "ax-subtitle", "ax-badge", "ax-comment-edited", "ax-comment-date", "ax-comment-menu-options", "ax-content", "ax-comment-like", "ax-comment-reply-text", "ax-comment-item", "ax-comment-reply-more", "*"], true, never>;
186
197
  }
187
198
 
188
199
  /**
@@ -213,10 +224,18 @@ declare class AXCommentEditedComponent {
213
224
  * @category Components
214
225
  */
215
226
  declare class AXCommentLikeComponent {
216
- like: _angular_core.ModelSignal<boolean>;
227
+ /** Current like state from the parent. Later parent values replace a local toggle. */
228
+ readonly like: _angular_core.InputSignal<boolean>;
229
+ readonly likeChange: _angular_core.OutputEmitterRef<boolean>;
230
+ private readonly optimistic;
231
+ private seenLike;
232
+ private hasSeenLike;
233
+ /** Parent value, unless the user just toggled and the parent has not caught up. */
234
+ protected readonly pressed: _angular_core.Signal<boolean>;
235
+ constructor();
217
236
  protected toggleLike(): void;
218
237
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXCommentLikeComponent, never>;
219
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXCommentLikeComponent, "ax-comment-like", never, { "like": { "alias": "like"; "required": true; "isSignal": true; }; }, { "like": "likeChange"; }, never, ["*"], true, never>;
238
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXCommentLikeComponent, "ax-comment-like", never, { "like": { "alias": "like"; "required": true; "isSignal": true; }; }, { "likeChange": "likeChange"; }, never, ["*"], true, never>;
220
239
  }
221
240
 
222
241
  /**
@@ -276,6 +295,24 @@ declare class AXCommentReplyTextComponent {
276
295
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXCommentReplyTextComponent, "ax-comment-reply-text", never, {}, {}, never, never, true, never>;
277
296
  }
278
297
 
298
+ /**
299
+ * Callbacks the recursive thread uses from `ax-comment-view`.
300
+ * Kept as a token so the thread component does not import the view class.
301
+ */
302
+ interface AXCommentThreadHost {
303
+ trackItem(item: AXCommentItem): string;
304
+ getId(item: AXCommentItem): string;
305
+ getReplies(item: AXCommentItem): AXCommentItem[];
306
+ getReplyCount(item: AXCommentItem): number;
307
+ isExpanded(item: AXCommentItem): boolean;
308
+ isItemLoading(item: AXCommentItem): boolean;
309
+ getTemplateContext(item: AXCommentItem, level: number): AXCommentItemTemplateContext;
310
+ onRepliesExpandedChange(item: AXCommentItem, expanded: boolean): Promise<void>;
311
+ toggleLike(item: AXCommentItem, liked?: boolean): void;
312
+ replyTo(item: AXCommentItem, event?: Event): void;
313
+ emitAction(item: AXCommentItem, action: AXMenuItem): void;
314
+ }
315
+
279
316
  /**
280
317
  * Renders a comment thread from a datasource (array or lazy callback).
281
318
  * Provide `itemTemplate` or `<ng-template axCommentItem>` to customize item UI;
@@ -283,7 +320,7 @@ declare class AXCommentReplyTextComponent {
283
320
  *
284
321
  * @category Components
285
322
  */
286
- declare class AXCommentViewComponent {
323
+ declare class AXCommentViewComponent implements AXCommentThreadHost {
287
324
  /** Comment data — a static array or a lazy-loading function. */
288
325
  readonly datasource: _angular_core.ModelSignal<AXCommentDataSource>;
289
326
  /**
@@ -301,7 +338,7 @@ declare class AXCommentViewComponent {
301
338
  private readonly _isLoading;
302
339
  readonly isLoading: _angular_core.Signal<boolean>;
303
340
  private loadGeneration;
304
- private syncingFromDatasource;
341
+ private readonly emptyReplies;
305
342
  private readonly isLazyDataSource;
306
343
  protected readonly hasDatasource: _angular_core.Signal<boolean>;
307
344
  protected readonly resolvedTemplate: _angular_core.Signal<TemplateRef<AXCommentItemTemplateContext>>;
@@ -357,16 +394,21 @@ declare class AXCommentViewComponent {
357
394
  * @returns Promise that resolves when expansion and any lazy load are complete.
358
395
  */
359
396
  setExpanded(id: string, expanded: boolean): Promise<void>;
360
- protected getId(item: AXCommentItem): string;
361
- protected getReplies(item: AXCommentItem): AXCommentItem[];
362
- protected getReplyCount(item: AXCommentItem): number;
363
- protected isExpanded(item: AXCommentItem): boolean;
364
- protected isItemLoading(item: AXCommentItem): boolean;
365
- protected getTemplateContext(item: AXCommentItem, level: number): AXCommentItemTemplateContext;
366
- protected onRepliesExpandedChange(item: AXCommentItem, expanded: boolean): Promise<void>;
367
- protected toggleLike(item: AXCommentItem, liked?: boolean): void;
368
- protected replyTo(item: AXCommentItem, event?: Event): void;
369
- protected emitAction(item: AXCommentItem, action: AXMenuItem): void;
397
+ getId(item: AXCommentItem): string;
398
+ /**
399
+ * Identity includes the fields the row renders. A same-id edit, like, or reply
400
+ * must refresh the row instead of leaving the previous snapshot on screen.
401
+ */
402
+ trackItem(item: AXCommentItem): string;
403
+ getReplies(item: AXCommentItem): AXCommentItem[];
404
+ getReplyCount(item: AXCommentItem): number;
405
+ isExpanded(item: AXCommentItem): boolean;
406
+ isItemLoading(item: AXCommentItem): boolean;
407
+ getTemplateContext(item: AXCommentItem, level: number): AXCommentItemTemplateContext;
408
+ onRepliesExpandedChange(item: AXCommentItem, expanded: boolean): Promise<void>;
409
+ toggleLike(item: AXCommentItem, liked?: boolean): void;
410
+ replyTo(item: AXCommentItem, event?: Event): void;
411
+ emitAction(item: AXCommentItem, action: AXMenuItem): void;
370
412
  private applyDatasource;
371
413
  private loadRootItems;
372
414
  private hydrateExpanded;