valtech-components 4.0.941 → 4.0.943

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.
@@ -57,6 +57,7 @@ import { Capacitor } from '@capacitor/core';
57
57
  import { Calendar } from 'vanilla-calendar-pro';
58
58
  import Compressor from 'compressorjs';
59
59
  import { ImageCropperComponent } from 'ngx-image-cropper';
60
+ import { trigger, transition, style, animate } from '@angular/animations';
60
61
  import 'prismjs/components/prism-scss';
61
62
  import 'prismjs/components/prism-json';
62
63
  import { BrowserMultiFormatReader } from '@zxing/browser';
@@ -66,7 +67,7 @@ import fixWebmDuration from 'fix-webm-duration';
66
67
  * Current version of valtech-components.
67
68
  * This is automatically updated during the publish process.
68
69
  */
69
- const VERSION = '4.0.941';
70
+ const VERSION = '4.0.943';
70
71
 
71
72
  function evaluateValtechAccess(rule, context, features = {}, visitedFeatures = new Set()) {
72
73
  if (rule == null)
@@ -31294,7 +31295,7 @@ class LinksAccordionComponent {
31294
31295
  </ng-container>
31295
31296
  </ion-accordion-group>
31296
31297
  </div>
31297
- `, isInline: true, styles: [".links-accordion .accordion-label{font-size:1.3rem}.links-accordion .accordion-item-label{font-size:1.1rem}.links-accordion ion-item{--background: var(--ion-color-light-tint)}.links-accordion ion-accordion{background:transparent}:host-context(body.dark) .links-accordion ion-item,:host-context(html.ion-palette-dark) .links-accordion ion-item{--background: rgba(255, 255, 255, .045)}@media (min-width: 1200px){:host-context([data-menu=collapsed]) .links-accordion .accordion-label{display:none}:host-context([data-menu=collapsed]) .links-accordion ion-item{--padding-start: 0;--inner-padding-end: 0;--min-height: 48px}:host-context([data-menu=collapsed]) .links-accordion .section-icon{margin:0 auto;font-size:1.5rem}:host-context([data-menu=collapsed]) .links-accordion ion-item:not(:has(.section-icon)){display:none}:host-context([data-menu=collapsed]) .links-accordion ion-accordion [slot=content]{display:none}:host-context([data-menu=collapsed]) .links-accordion ::ng-deep .ion-accordion-toggle-icon{display:none}:host-context([data-menu=collapsed]) .links-accordion ion-item{--padding-end: 0;--detail-icon-opacity: 0}:host-context([data-menu=collapsed]) .links-accordion ion-item::part(detail-icon){display:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: IonAccordionGroup, selector: "ion-accordion-group", inputs: ["animated", "disabled", "expand", "mode", "multiple", "readonly", "value"] }, { kind: "component", type: IonAccordion, selector: "ion-accordion", inputs: ["disabled", "mode", "readonly", "toggleIcon", "toggleIconSlot", "value"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
31298
+ `, isInline: true, styles: [".links-accordion .accordion-label{font-size:1.3rem}.links-accordion .accordion-item-label{font-size:1.1rem}.links-accordion ion-item{--background: var(--ion-color-light-tint)}.links-accordion ion-accordion{background:transparent}:host-context(body.dark) .links-accordion ion-item,:host-context(html.ion-palette-dark) .links-accordion ion-item{--background: rgba(255, 255, 255, .045)}@media (min-width: 1200px){:host-context([data-menu=collapsed]) .links-accordion .accordion-label{display:none}:host-context([data-menu=collapsed]) .links-accordion ion-item{--padding-start: 0;--inner-padding-end: 0;--min-height: 48px}:host-context([data-menu=collapsed]) .links-accordion ion-item::part(native){justify-content:center}:host-context([data-menu=collapsed]) .links-accordion .section-icon{margin:0;font-size:1.5rem}:host-context([data-menu=collapsed]) .links-accordion ion-item:not(:has(.section-icon)){display:none}:host-context([data-menu=collapsed]) .links-accordion ion-accordion [slot=content]{display:none}:host-context([data-menu=collapsed]) .links-accordion ::ng-deep .ion-accordion-toggle-icon{display:none}:host-context([data-menu=collapsed]) .links-accordion ion-item{--padding-end: 0;--detail-icon-opacity: 0}:host-context([data-menu=collapsed]) .links-accordion ion-item::part(detail-icon){display:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: IonAccordionGroup, selector: "ion-accordion-group", inputs: ["animated", "disabled", "expand", "mode", "multiple", "readonly", "value"] }, { kind: "component", type: IonAccordion, selector: "ion-accordion", inputs: ["disabled", "mode", "readonly", "toggleIcon", "toggleIconSlot", "value"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
31298
31299
  }
31299
31300
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LinksAccordionComponent, decorators: [{
31300
31301
  type: Component,
@@ -31362,7 +31363,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
31362
31363
  </ng-container>
31363
31364
  </ion-accordion-group>
31364
31365
  </div>
31365
- `, styles: [".links-accordion .accordion-label{font-size:1.3rem}.links-accordion .accordion-item-label{font-size:1.1rem}.links-accordion ion-item{--background: var(--ion-color-light-tint)}.links-accordion ion-accordion{background:transparent}:host-context(body.dark) .links-accordion ion-item,:host-context(html.ion-palette-dark) .links-accordion ion-item{--background: rgba(255, 255, 255, .045)}@media (min-width: 1200px){:host-context([data-menu=collapsed]) .links-accordion .accordion-label{display:none}:host-context([data-menu=collapsed]) .links-accordion ion-item{--padding-start: 0;--inner-padding-end: 0;--min-height: 48px}:host-context([data-menu=collapsed]) .links-accordion .section-icon{margin:0 auto;font-size:1.5rem}:host-context([data-menu=collapsed]) .links-accordion ion-item:not(:has(.section-icon)){display:none}:host-context([data-menu=collapsed]) .links-accordion ion-accordion [slot=content]{display:none}:host-context([data-menu=collapsed]) .links-accordion ::ng-deep .ion-accordion-toggle-icon{display:none}:host-context([data-menu=collapsed]) .links-accordion ion-item{--padding-end: 0;--detail-icon-opacity: 0}:host-context([data-menu=collapsed]) .links-accordion ion-item::part(detail-icon){display:none}}\n"] }]
31366
+ `, styles: [".links-accordion .accordion-label{font-size:1.3rem}.links-accordion .accordion-item-label{font-size:1.1rem}.links-accordion ion-item{--background: var(--ion-color-light-tint)}.links-accordion ion-accordion{background:transparent}:host-context(body.dark) .links-accordion ion-item,:host-context(html.ion-palette-dark) .links-accordion ion-item{--background: rgba(255, 255, 255, .045)}@media (min-width: 1200px){:host-context([data-menu=collapsed]) .links-accordion .accordion-label{display:none}:host-context([data-menu=collapsed]) .links-accordion ion-item{--padding-start: 0;--inner-padding-end: 0;--min-height: 48px}:host-context([data-menu=collapsed]) .links-accordion ion-item::part(native){justify-content:center}:host-context([data-menu=collapsed]) .links-accordion .section-icon{margin:0;font-size:1.5rem}:host-context([data-menu=collapsed]) .links-accordion ion-item:not(:has(.section-icon)){display:none}:host-context([data-menu=collapsed]) .links-accordion ion-accordion [slot=content]{display:none}:host-context([data-menu=collapsed]) .links-accordion ::ng-deep .ion-accordion-toggle-icon{display:none}:host-context([data-menu=collapsed]) .links-accordion ion-item{--padding-end: 0;--detail-icon-opacity: 0}:host-context([data-menu=collapsed]) .links-accordion ion-item::part(detail-icon){display:none}}\n"] }]
31366
31367
  }], ctorParameters: () => [{ type: i1$6.Router }, { type: i1$5.MenuController }], propDecorators: { props: [{
31367
31368
  type: Input
31368
31369
  }], navigate: [{
@@ -46182,6 +46183,279 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
46182
46183
  type: Output
46183
46184
  }] } });
46184
46185
 
46186
+ class ValCommentThreadComponent {
46187
+ set data(value) {
46188
+ this._comments.set(value.comments || []);
46189
+ this._isLoading.set(value.isLoading ?? false);
46190
+ this._currentUserId.set(value.currentUserId ?? '');
46191
+ }
46192
+ constructor(fb) {
46193
+ this.fb = fb;
46194
+ this.title = 'Comentarios';
46195
+ this.canComment = true;
46196
+ this.canDelete = false;
46197
+ this.commentAdded = new EventEmitter();
46198
+ this.commentDeleted = new EventEmitter();
46199
+ this.maxChars = 1000;
46200
+ this._comments = signal([]);
46201
+ this._isLoading = signal(false);
46202
+ this._isSubmitting = signal(false);
46203
+ this._currentUserId = signal('');
46204
+ this.comments = this._comments.asReadonly();
46205
+ this.isLoading = this._isLoading.asReadonly();
46206
+ this.isSubmitting = this._isSubmitting.asReadonly();
46207
+ this.commentCount = computed(() => this._comments().length);
46208
+ this.charCount = computed(() => this.form.get('body')?.value?.length ?? 0);
46209
+ this.form = this.fb.group({
46210
+ body: ['', [Validators.required, Validators.maxLength(this.maxChars)]],
46211
+ });
46212
+ }
46213
+ ngOnInit() { }
46214
+ isOwnComment(comment) {
46215
+ return comment.author.userId === this._currentUserId();
46216
+ }
46217
+ getInitials(name) {
46218
+ return name
46219
+ .split(' ')
46220
+ .map(w => w[0])
46221
+ .join('')
46222
+ .toUpperCase()
46223
+ .slice(0, 2);
46224
+ }
46225
+ roleLabel(role) {
46226
+ const labels = {
46227
+ submitter: 'Postulante',
46228
+ reviewer: 'Revisor',
46229
+ admin: 'Administrador',
46230
+ };
46231
+ return labels[role] || role;
46232
+ }
46233
+ formatTime(isoString) {
46234
+ const date = new Date(isoString);
46235
+ const now = new Date();
46236
+ const diffMs = now.getTime() - date.getTime();
46237
+ const diffMins = Math.floor(diffMs / 60000);
46238
+ const diffHours = Math.floor(diffMs / 3600000);
46239
+ const diffDays = Math.floor(diffMs / 86400000);
46240
+ if (diffMins < 1)
46241
+ return 'hace unos segundos';
46242
+ if (diffMins < 60)
46243
+ return `hace ${diffMins}m`;
46244
+ if (diffHours < 24)
46245
+ return `hace ${diffHours}h`;
46246
+ if (diffDays < 7)
46247
+ return `hace ${diffDays}d`;
46248
+ return date.toLocaleDateString('es-CL', { month: 'short', day: 'numeric' });
46249
+ }
46250
+ onSubmit() {
46251
+ if (!this.form.valid)
46252
+ return;
46253
+ this._isSubmitting.set(true);
46254
+ const body = this.form.get('body')?.value;
46255
+ this.commentAdded.emit(body);
46256
+ // Reset form after short delay
46257
+ setTimeout(() => {
46258
+ this.form.reset();
46259
+ this._isSubmitting.set(false);
46260
+ }, 300);
46261
+ }
46262
+ onDeleteComment(commentId) {
46263
+ if (confirm('¿Eliminar este comentario?')) {
46264
+ this.commentDeleted.emit(commentId);
46265
+ }
46266
+ }
46267
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ValCommentThreadComponent, deps: [{ token: i1$8.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
46268
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ValCommentThreadComponent, isStandalone: true, selector: "val-comment-thread", inputs: { title: "title", canComment: "canComment", canDelete: "canDelete", data: "data" }, outputs: { commentAdded: "commentAdded", commentDeleted: "commentDeleted" }, ngImport: i0, template: `
46269
+ <div class="comment-thread">
46270
+ <!-- Header -->
46271
+ <div class="comment-header">
46272
+ <h3>{{ title }}</h3>
46273
+ <span class="comment-count" *ngIf="commentCount() > 0">
46274
+ {{ commentCount() }} {{ commentCount() === 1 ? 'comentario' : 'comentarios' }}
46275
+ </span>
46276
+ </div>
46277
+
46278
+ <!-- Comments list -->
46279
+ <div class="comments-list" @fadeIn *ngIf="!isLoading()">
46280
+ <div *ngIf="comments().length === 0" class="empty-state">
46281
+ <p>Sin comentarios aún. Sé el primero en comentar.</p>
46282
+ </div>
46283
+
46284
+ <div
46285
+ *ngFor="let comment of comments(); let last = last"
46286
+ class="comment-item"
46287
+ [class.is-own]="isOwnComment(comment)"
46288
+ @slideIn
46289
+ >
46290
+ <!-- Avatar + header -->
46291
+ <div class="comment-header-row">
46292
+ <div class="avatar">{{ getInitials(comment.author.name) }}</div>
46293
+ <div class="meta">
46294
+ <div class="author-line">
46295
+ <span class="author-name">{{ comment.author.name }}</span>
46296
+ <span *ngIf="comment.author.role" class="author-role"> ({{ roleLabel(comment.author.role) }}) </span>
46297
+ </div>
46298
+ <time class="timestamp">{{ formatTime(comment.createdAt) }}</time>
46299
+ </div>
46300
+ <button
46301
+ *ngIf="isOwnComment(comment) && canDelete"
46302
+ class="btn-delete"
46303
+ (click)="onDeleteComment(comment.commentId)"
46304
+ aria-label="Eliminar comentario"
46305
+ >
46306
+
46307
+ </button>
46308
+ </div>
46309
+
46310
+ <!-- Body -->
46311
+ <div class="comment-body">{{ comment.body }}</div>
46312
+
46313
+ <!-- Divider (not on last) -->
46314
+ <div *ngIf="!last" class="comment-divider"></div>
46315
+ </div>
46316
+ </div>
46317
+
46318
+ <!-- Loading -->
46319
+ <div *ngIf="isLoading()" class="loading-state">
46320
+ <div class="spinner"></div>
46321
+ <p>Cargando comentarios...</p>
46322
+ </div>
46323
+
46324
+ <!-- New comment form -->
46325
+ <div *ngIf="canComment" class="comment-form" [formGroup]="form">
46326
+ <textarea
46327
+ formControlName="body"
46328
+ placeholder="Escribe un comentario..."
46329
+ class="textarea"
46330
+ rows="3"
46331
+ (keydown.ctrl.enter)="onSubmit()"
46332
+ (keydown.meta.enter)="onSubmit()"
46333
+ >
46334
+ </textarea>
46335
+ <div class="form-actions">
46336
+ <span class="char-count" [class.near-limit]="charCount() > maxChars * 0.9">
46337
+ {{ charCount() }} / {{ maxChars }}
46338
+ </span>
46339
+ <button type="button" class="btn-submit" [disabled]="!form.valid || isSubmitting()" (click)="onSubmit()">
46340
+ {{ isSubmitting() ? 'Enviando...' : 'Comentar' }}
46341
+ </button>
46342
+ </div>
46343
+ <div *ngIf="form.get('body')?.hasError('maxlength')" class="error-msg">Máximo {{ maxChars }} caracteres</div>
46344
+ </div>
46345
+ </div>
46346
+ `, isInline: true, styles: [".comment-thread{display:flex;flex-direction:column;gap:1.5rem;padding:1.5rem;border-radius:.75rem;background:var(--color-bg-secondary, #f9f9f9);border:1px solid var(--color-border, #e0e0e0)}.comment-header{display:flex;align-items:center;justify-content:space-between;gap:1rem;h3{margin:0;font-size:1rem;font-weight:700;color:var(--color-text-primary, #090f1b)}}.comment-count{font-size:.875rem;color:var(--color-text-muted, #6b7280);background:var(--color-bg-tertiary, #f3f3f3);padding:.25rem .75rem;border-radius:999px}.comments-list{display:flex;flex-direction:column;gap:0}.empty-state{text-align:center;padding:2rem 1rem;color:var(--color-text-muted, #6b7280);p{margin:0}}.comment-item{padding:1rem 0;display:flex;flex-direction:column;gap:.75rem;&.is-own{background:var(--color-bg-highlight, rgba(112, 38, 223, .05));padding:.75rem;border-radius:.5rem}}.comment-header-row{display:flex;align-items:flex-start;gap:.75rem}.avatar{width:2rem;height:2rem;border-radius:50%;background:var(--color-primary, #7026df);color:#fff;display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:700;flex-shrink:0}.meta{flex:1}.author-line{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.author-name{font-weight:600;color:var(--color-text-primary, #090f1b);font-size:.95rem}.author-role{font-size:.8rem;color:var(--color-text-muted, #6b7280);background:var(--color-bg-tertiary, #f3f3f3);padding:.125rem .5rem;border-radius:.25rem}.timestamp{display:block;font-size:.8rem;color:var(--color-text-muted, #6b7280);margin-top:.25rem}.btn-delete{background:transparent;border:none;color:var(--color-text-muted, #6b7280);cursor:pointer;font-size:1.25rem;padding:.25rem .5rem;transition:color .2s;&:hover{color:var(--color-error, #ef4444)}}.comment-body{color:var(--color-text-primary, #090f1b);line-height:1.6;word-wrap:break-word;white-space:pre-wrap;font-size:.95rem;padding-left:2.75rem}.comment-divider{height:1px;background:var(--color-border, #e0e0e0);margin:.75rem 0}.loading-state{display:flex;flex-direction:column;align-items:center;gap:1rem;padding:2rem 1rem;color:var(--color-text-muted, #6b7280);p{margin:0}}.spinner{width:1.5rem;height:1.5rem;border:2px solid var(--color-border, #e0e0e0);border-top-color:var(--color-primary, #7026df);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.comment-form{display:flex;flex-direction:column;gap:.75rem;padding:1rem;background:#fff;border:1px solid var(--color-border, #e0e0e0);border-radius:.5rem}.textarea{width:100%;padding:.75rem;border:1px solid var(--color-border, #e0e0e0);border-radius:.5rem;font-family:inherit;font-size:.95rem;resize:vertical;min-height:3rem;&:focus{outline:none;border-color:var(--color-primary, #7026df);box-shadow:0 0 0 3px var(--color-primary-light, rgba(112, 38, 223, .1))}}.form-actions{display:flex;align-items:center;justify-content:space-between;gap:1rem}.char-count{font-size:.8rem;color:var(--color-text-muted, #6b7280);&.near-limit{color:var(--color-warning, #f59e0b)}}.btn-submit{background:var(--color-primary, #7026df);color:#fff;border:none;padding:.5rem 1.5rem;border-radius:.5rem;font-weight:600;cursor:pointer;transition:background .2s,opacity .2s;&:hover:not(:disabled){background:var(--color-primary-dark, #5a1fb5)}&:disabled{opacity:.5;cursor:not-allowed}}.error-msg{font-size:.8rem;color:var(--color-error, #ef4444);margin-top:.25rem}@media (max-width: 640px){.comment-thread{padding:1rem}.comment-body{padding-left:0;margin-top:.5rem}.form-actions{flex-direction:column-reverse}.btn-submit{width:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$8.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$8.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], animations: [
46347
+ trigger('fadeIn', [transition(':enter', [style({ opacity: 0 }), animate('200ms ease-in', style({ opacity: 1 }))])]),
46348
+ trigger('slideIn', [
46349
+ transition(':enter', [
46350
+ style({ opacity: 0, transform: 'translateY(-0.5rem)' }),
46351
+ animate('200ms ease-out', style({ opacity: 1, transform: 'translateY(0)' })),
46352
+ ]),
46353
+ ]),
46354
+ ] }); }
46355
+ }
46356
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ValCommentThreadComponent, decorators: [{
46357
+ type: Component,
46358
+ args: [{ selector: 'val-comment-thread', standalone: true, imports: [CommonModule, FormsModule, ReactiveFormsModule], template: `
46359
+ <div class="comment-thread">
46360
+ <!-- Header -->
46361
+ <div class="comment-header">
46362
+ <h3>{{ title }}</h3>
46363
+ <span class="comment-count" *ngIf="commentCount() > 0">
46364
+ {{ commentCount() }} {{ commentCount() === 1 ? 'comentario' : 'comentarios' }}
46365
+ </span>
46366
+ </div>
46367
+
46368
+ <!-- Comments list -->
46369
+ <div class="comments-list" @fadeIn *ngIf="!isLoading()">
46370
+ <div *ngIf="comments().length === 0" class="empty-state">
46371
+ <p>Sin comentarios aún. Sé el primero en comentar.</p>
46372
+ </div>
46373
+
46374
+ <div
46375
+ *ngFor="let comment of comments(); let last = last"
46376
+ class="comment-item"
46377
+ [class.is-own]="isOwnComment(comment)"
46378
+ @slideIn
46379
+ >
46380
+ <!-- Avatar + header -->
46381
+ <div class="comment-header-row">
46382
+ <div class="avatar">{{ getInitials(comment.author.name) }}</div>
46383
+ <div class="meta">
46384
+ <div class="author-line">
46385
+ <span class="author-name">{{ comment.author.name }}</span>
46386
+ <span *ngIf="comment.author.role" class="author-role"> ({{ roleLabel(comment.author.role) }}) </span>
46387
+ </div>
46388
+ <time class="timestamp">{{ formatTime(comment.createdAt) }}</time>
46389
+ </div>
46390
+ <button
46391
+ *ngIf="isOwnComment(comment) && canDelete"
46392
+ class="btn-delete"
46393
+ (click)="onDeleteComment(comment.commentId)"
46394
+ aria-label="Eliminar comentario"
46395
+ >
46396
+
46397
+ </button>
46398
+ </div>
46399
+
46400
+ <!-- Body -->
46401
+ <div class="comment-body">{{ comment.body }}</div>
46402
+
46403
+ <!-- Divider (not on last) -->
46404
+ <div *ngIf="!last" class="comment-divider"></div>
46405
+ </div>
46406
+ </div>
46407
+
46408
+ <!-- Loading -->
46409
+ <div *ngIf="isLoading()" class="loading-state">
46410
+ <div class="spinner"></div>
46411
+ <p>Cargando comentarios...</p>
46412
+ </div>
46413
+
46414
+ <!-- New comment form -->
46415
+ <div *ngIf="canComment" class="comment-form" [formGroup]="form">
46416
+ <textarea
46417
+ formControlName="body"
46418
+ placeholder="Escribe un comentario..."
46419
+ class="textarea"
46420
+ rows="3"
46421
+ (keydown.ctrl.enter)="onSubmit()"
46422
+ (keydown.meta.enter)="onSubmit()"
46423
+ >
46424
+ </textarea>
46425
+ <div class="form-actions">
46426
+ <span class="char-count" [class.near-limit]="charCount() > maxChars * 0.9">
46427
+ {{ charCount() }} / {{ maxChars }}
46428
+ </span>
46429
+ <button type="button" class="btn-submit" [disabled]="!form.valid || isSubmitting()" (click)="onSubmit()">
46430
+ {{ isSubmitting() ? 'Enviando...' : 'Comentar' }}
46431
+ </button>
46432
+ </div>
46433
+ <div *ngIf="form.get('body')?.hasError('maxlength')" class="error-msg">Máximo {{ maxChars }} caracteres</div>
46434
+ </div>
46435
+ </div>
46436
+ `, animations: [
46437
+ trigger('fadeIn', [transition(':enter', [style({ opacity: 0 }), animate('200ms ease-in', style({ opacity: 1 }))])]),
46438
+ trigger('slideIn', [
46439
+ transition(':enter', [
46440
+ style({ opacity: 0, transform: 'translateY(-0.5rem)' }),
46441
+ animate('200ms ease-out', style({ opacity: 1, transform: 'translateY(0)' })),
46442
+ ]),
46443
+ ]),
46444
+ ], styles: [".comment-thread{display:flex;flex-direction:column;gap:1.5rem;padding:1.5rem;border-radius:.75rem;background:var(--color-bg-secondary, #f9f9f9);border:1px solid var(--color-border, #e0e0e0)}.comment-header{display:flex;align-items:center;justify-content:space-between;gap:1rem;h3{margin:0;font-size:1rem;font-weight:700;color:var(--color-text-primary, #090f1b)}}.comment-count{font-size:.875rem;color:var(--color-text-muted, #6b7280);background:var(--color-bg-tertiary, #f3f3f3);padding:.25rem .75rem;border-radius:999px}.comments-list{display:flex;flex-direction:column;gap:0}.empty-state{text-align:center;padding:2rem 1rem;color:var(--color-text-muted, #6b7280);p{margin:0}}.comment-item{padding:1rem 0;display:flex;flex-direction:column;gap:.75rem;&.is-own{background:var(--color-bg-highlight, rgba(112, 38, 223, .05));padding:.75rem;border-radius:.5rem}}.comment-header-row{display:flex;align-items:flex-start;gap:.75rem}.avatar{width:2rem;height:2rem;border-radius:50%;background:var(--color-primary, #7026df);color:#fff;display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:700;flex-shrink:0}.meta{flex:1}.author-line{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.author-name{font-weight:600;color:var(--color-text-primary, #090f1b);font-size:.95rem}.author-role{font-size:.8rem;color:var(--color-text-muted, #6b7280);background:var(--color-bg-tertiary, #f3f3f3);padding:.125rem .5rem;border-radius:.25rem}.timestamp{display:block;font-size:.8rem;color:var(--color-text-muted, #6b7280);margin-top:.25rem}.btn-delete{background:transparent;border:none;color:var(--color-text-muted, #6b7280);cursor:pointer;font-size:1.25rem;padding:.25rem .5rem;transition:color .2s;&:hover{color:var(--color-error, #ef4444)}}.comment-body{color:var(--color-text-primary, #090f1b);line-height:1.6;word-wrap:break-word;white-space:pre-wrap;font-size:.95rem;padding-left:2.75rem}.comment-divider{height:1px;background:var(--color-border, #e0e0e0);margin:.75rem 0}.loading-state{display:flex;flex-direction:column;align-items:center;gap:1rem;padding:2rem 1rem;color:var(--color-text-muted, #6b7280);p{margin:0}}.spinner{width:1.5rem;height:1.5rem;border:2px solid var(--color-border, #e0e0e0);border-top-color:var(--color-primary, #7026df);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.comment-form{display:flex;flex-direction:column;gap:.75rem;padding:1rem;background:#fff;border:1px solid var(--color-border, #e0e0e0);border-radius:.5rem}.textarea{width:100%;padding:.75rem;border:1px solid var(--color-border, #e0e0e0);border-radius:.5rem;font-family:inherit;font-size:.95rem;resize:vertical;min-height:3rem;&:focus{outline:none;border-color:var(--color-primary, #7026df);box-shadow:0 0 0 3px var(--color-primary-light, rgba(112, 38, 223, .1))}}.form-actions{display:flex;align-items:center;justify-content:space-between;gap:1rem}.char-count{font-size:.8rem;color:var(--color-text-muted, #6b7280);&.near-limit{color:var(--color-warning, #f59e0b)}}.btn-submit{background:var(--color-primary, #7026df);color:#fff;border:none;padding:.5rem 1.5rem;border-radius:.5rem;font-weight:600;cursor:pointer;transition:background .2s,opacity .2s;&:hover:not(:disabled){background:var(--color-primary-dark, #5a1fb5)}&:disabled{opacity:.5;cursor:not-allowed}}.error-msg{font-size:.8rem;color:var(--color-error, #ef4444);margin-top:.25rem}@media (max-width: 640px){.comment-thread{padding:1rem}.comment-body{padding-left:0;margin-top:.5rem}.form-actions{flex-direction:column-reverse}.btn-submit{width:100%}}\n"] }]
46445
+ }], ctorParameters: () => [{ type: i1$8.FormBuilder }], propDecorators: { title: [{
46446
+ type: Input
46447
+ }], canComment: [{
46448
+ type: Input
46449
+ }], canDelete: [{
46450
+ type: Input
46451
+ }], data: [{
46452
+ type: Input
46453
+ }], commentAdded: [{
46454
+ type: Output
46455
+ }], commentDeleted: [{
46456
+ type: Output
46457
+ }] } });
46458
+
46185
46459
  /**
46186
46460
  * Default pagination options.
46187
46461
  */
@@ -89220,5 +89494,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
89220
89494
  * Generated bundle index. Do not edit.
89221
89495
  */
89222
89496
 
89223
- export { ACCESS_REQUEST_TYPE, ACCESS_REQUEST_VIEW_I18N, ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, APP_VERSION_PLATFORM_PLUGIN, APP_VERSION_REMOTE_PLUGIN, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccessControlService, AccessRequestViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimalCardComponent, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BackButtonComponent, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, BubbleBlitzGameComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CanAccessDirective, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, ChatComposerComponent, ChatInputComponent, ChatWindowComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ChipSelectComponent, ClientTelemetryService, CodeDisplayComponent, CodeValidatorComponent, CollectionsService, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ConfirmationDialogV2Component, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentReactionModalComponent, ContentService, ContentTransformer, ConversationListItemComponent, ConversationService, CookieBannerComponent, CookieSettingsComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_BUTTON_PRESETS, DEFAULT_CANCEL_BUTTON, DEFAULT_CANONICAL_FIELD_ALIASES, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_LOGIN_LOGO, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_POST_UPDATE_GRACE_MS, DEFAULT_PRESETS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DangerSectionComponent, DataTableComponent, DatasetPaginationService, DateInputComponent, DatePickerComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EXPECTED_NOT_FOUND, EditOrgModalComponent, EmptyStateComponent, EntityCardComponent, EntityFeedService, EntradaSerializada, ExpandableTextComponent, ExternalBrowserService, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeatureControlService, FeatureGuardDirective, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FieldOptionsEditorComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FolderTabsComponent, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormFieldComponent, FormSchemaBuilderService, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GAME_AVATAR_CATALOG_SIZE_PER_STYLE, GameAvatarComponent, GameProfileService, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, GroupMembersComponent, GroupPickerComponent, GroupsService, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandleService, HandoffService, HapticsService, HasPermissionDirective, HeaderActionsService, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, HtmlViewerModalComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, IONIC_COLORS$5 as IONIC_COLORS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, KNOWN_ROUTES, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGGED_IN_HINT_COOKIE, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LanguageSelectorV2Component, LayeredCardComponent, LegalContentService, LegalLinkService, LightRippleDirective, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LiveReadFallbackService, LoadMoreComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METADATA_LIST_DEFAULTS, META_SCHEMA_VERSION, METRIC_CARD_DEFAULTS, MINI_GAMES_I18N, MINI_GAME_PLAYER_AVATARS, MINI_GAME_PLAYER_COLORS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MediaViewerModalComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MemoryGameComponent, MenuComponent, MessageBubbleComponent, MessagingService, MetaService, MetadataListComponent, MeteringService, MetricCardComponent, MfaModalComponent, MiniGameCalloutComponent, MiniGamePlayerProfileService, MiniGameScorePopComponent, MiniGamesMenuComponent, ModalLayoutComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NoticeComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberPickerComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OperationReferenceComponent, OptionCardsComponent, OptionSheetComponent, OptionSheetService, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PERSONA_CONFIG, PLATFORM_CONFIGS, POST_UPDATE_TS_KEY, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PdfService, PermissionCatalogService, PermissionSelectorComponent, PermissionsModalComponent, PermissionsViewComponent, PersonaService, PhoneDisplayComponent, PhoneFormatService, PhoneInputComponent, PickerV2Component, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, PricingTableComponent, ProcessLinksPipe, ProfileCardComponent, ProfileContentComponent, ProfileModalComponent, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrBrandValidationError, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RbacService, ReactionBarComponent, ReactionsService, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestFormComponent, RequestModalComponent, RequestReviewPanelComponent, RequestService, RetroAudioService, RightsFooterComponent, RoleManagerComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SectionHeaderComponent, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SessionTransitionOverlayComponent, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimonGameComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashComponent, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SupportTicketCtaComponent, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeSelectorComponent, ThemeService, ThreadPanelComponent, TicketCardComponent, TicketCardImageService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, TypingIndicatorComponent, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UsageMetersComponent, UsageService, UserAvatarComponent, UsernameInputComponent, VALTECH_ACCESS_FEATURES, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_CHAT_CONFIG, VALTECH_COLLECTIONS_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_COPYRIGHT_TEMPLATE, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DIAGRAMS, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_LEGAL_ENTITY, VALTECH_MENU_I18N, VALTECH_NETWORK_ERROR_KEY, VALTECH_REACTIONS_CONFIG, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VALTECH_WHATSAPP_CONFIG, VAL_REGISTERED_ICONS, VERSION, ValQuotaWarningComponent, ValtechErrorService, VerifyViewComponent, WhatsappFabComponent, WhatsappService, WizardComponent, WizardFooterComponent, WorkflowService, accessGuard, accessGuardFromRoute, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildPlatformMenu, buildSettingsCards, buildSideNavItemsFromBottomNav, button, canSubmitRequestType, classifyChip, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGameAvatarCatalog, createGameAvatarProps, createGlowCardProps, createInitialDatasetState, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, datasetPageFromLegacyCursor, defaultQrBrand, docs, errorLoggingInterceptor, evaluateValtechAccess, extractPathParams, firmaDeSesionDeCustomToken, formatClockTime, formatDateSeparator, formatRelativeTime, gameAvatarCatalogEntryToMetadata, gameAvatarDataUri, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, groupPermissionsByScope, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isKnownRoute, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, providePersona, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccessFeatures, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAppVersionHttp, provideValtechAuth, provideValtechAuthInterceptor, provideValtechChat, provideValtechCollections, provideValtechContent, provideValtechDebugConsole, provideValtechDiagrams, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationClickActions, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechReactions, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, provideValtechWhatsapp, qrContrastRatio, qrErrorCorrectionFor, query, rbacGuard, renderGameAvatarSvg, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resolveColor, resolveCopyrightTemplate, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, roleOf, selectableRequestTypes, storagePaths, suggestEmailFix, superAdminGuard, supportedGameAvatarStyles, toArticle, validateQrBrand, validateRoutes };
89497
+ export { ACCESS_REQUEST_TYPE, ACCESS_REQUEST_VIEW_I18N, ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, APP_VERSION_PLATFORM_PLUGIN, APP_VERSION_REMOTE_PLUGIN, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccessControlService, AccessRequestViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimalCardComponent, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BackButtonComponent, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, BubbleBlitzGameComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CanAccessDirective, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, ChatComposerComponent, ChatInputComponent, ChatWindowComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ChipSelectComponent, ClientTelemetryService, CodeDisplayComponent, CodeValidatorComponent, CollectionsService, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ConfirmationDialogV2Component, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentReactionModalComponent, ContentService, ContentTransformer, ConversationListItemComponent, ConversationService, CookieBannerComponent, CookieSettingsComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_BUTTON_PRESETS, DEFAULT_CANCEL_BUTTON, DEFAULT_CANONICAL_FIELD_ALIASES, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_LOGIN_LOGO, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_POST_UPDATE_GRACE_MS, DEFAULT_PRESETS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DangerSectionComponent, DataTableComponent, DatasetPaginationService, DateInputComponent, DatePickerComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EXPECTED_NOT_FOUND, EditOrgModalComponent, EmptyStateComponent, EntityCardComponent, EntityFeedService, EntradaSerializada, ExpandableTextComponent, ExternalBrowserService, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeatureControlService, FeatureGuardDirective, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FieldOptionsEditorComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FolderTabsComponent, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormFieldComponent, FormSchemaBuilderService, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GAME_AVATAR_CATALOG_SIZE_PER_STYLE, GameAvatarComponent, GameProfileService, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, GroupMembersComponent, GroupPickerComponent, GroupsService, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandleService, HandoffService, HapticsService, HasPermissionDirective, HeaderActionsService, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, HtmlViewerModalComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, IONIC_COLORS$5 as IONIC_COLORS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, KNOWN_ROUTES, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGGED_IN_HINT_COOKIE, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LanguageSelectorV2Component, LayeredCardComponent, LegalContentService, LegalLinkService, LightRippleDirective, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LiveReadFallbackService, LoadMoreComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METADATA_LIST_DEFAULTS, META_SCHEMA_VERSION, METRIC_CARD_DEFAULTS, MINI_GAMES_I18N, MINI_GAME_PLAYER_AVATARS, MINI_GAME_PLAYER_COLORS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MediaViewerModalComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MemoryGameComponent, MenuComponent, MessageBubbleComponent, MessagingService, MetaService, MetadataListComponent, MeteringService, MetricCardComponent, MfaModalComponent, MiniGameCalloutComponent, MiniGamePlayerProfileService, MiniGameScorePopComponent, MiniGamesMenuComponent, ModalLayoutComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NoticeComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberPickerComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OperationReferenceComponent, OptionCardsComponent, OptionSheetComponent, OptionSheetService, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PERSONA_CONFIG, PLATFORM_CONFIGS, POST_UPDATE_TS_KEY, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PdfService, PermissionCatalogService, PermissionSelectorComponent, PermissionsModalComponent, PermissionsViewComponent, PersonaService, PhoneDisplayComponent, PhoneFormatService, PhoneInputComponent, PickerV2Component, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, PricingTableComponent, ProcessLinksPipe, ProfileCardComponent, ProfileContentComponent, ProfileModalComponent, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrBrandValidationError, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RbacService, ReactionBarComponent, ReactionsService, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestFormComponent, RequestModalComponent, RequestReviewPanelComponent, RequestService, RetroAudioService, RightsFooterComponent, RoleManagerComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SectionHeaderComponent, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SessionTransitionOverlayComponent, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimonGameComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashComponent, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SupportTicketCtaComponent, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeSelectorComponent, ThemeService, ThreadPanelComponent, TicketCardComponent, TicketCardImageService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, TypingIndicatorComponent, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UsageMetersComponent, UsageService, UserAvatarComponent, UsernameInputComponent, VALTECH_ACCESS_FEATURES, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_CHAT_CONFIG, VALTECH_COLLECTIONS_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_COPYRIGHT_TEMPLATE, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DIAGRAMS, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_LEGAL_ENTITY, VALTECH_MENU_I18N, VALTECH_NETWORK_ERROR_KEY, VALTECH_REACTIONS_CONFIG, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VALTECH_WHATSAPP_CONFIG, VAL_REGISTERED_ICONS, VERSION, ValCommentThreadComponent, ValQuotaWarningComponent, ValtechErrorService, VerifyViewComponent, WhatsappFabComponent, WhatsappService, WizardComponent, WizardFooterComponent, WorkflowService, accessGuard, accessGuardFromRoute, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildPlatformMenu, buildSettingsCards, buildSideNavItemsFromBottomNav, button, canSubmitRequestType, classifyChip, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGameAvatarCatalog, createGameAvatarProps, createGlowCardProps, createInitialDatasetState, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, datasetPageFromLegacyCursor, defaultQrBrand, docs, errorLoggingInterceptor, evaluateValtechAccess, extractPathParams, firmaDeSesionDeCustomToken, formatClockTime, formatDateSeparator, formatRelativeTime, gameAvatarCatalogEntryToMetadata, gameAvatarDataUri, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, groupPermissionsByScope, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isKnownRoute, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, providePersona, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccessFeatures, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAppVersionHttp, provideValtechAuth, provideValtechAuthInterceptor, provideValtechChat, provideValtechCollections, provideValtechContent, provideValtechDebugConsole, provideValtechDiagrams, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationClickActions, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechReactions, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, provideValtechWhatsapp, qrContrastRatio, qrErrorCorrectionFor, query, rbacGuard, renderGameAvatarSvg, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resolveColor, resolveCopyrightTemplate, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, roleOf, selectableRequestTypes, storagePaths, suggestEmailFix, superAdminGuard, supportedGameAvatarStyles, toArticle, validateQrBrand, validateRoutes };
89224
89498
  //# sourceMappingURL=valtech-components.mjs.map