valtech-components 2.0.778 → 2.0.780

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/esm2022/lib/components/atoms/glass/glass.component.mjs +125 -0
  2. package/esm2022/lib/components/atoms/glass/types.mjs +2 -0
  3. package/esm2022/lib/components/atoms/user-avatar/types.mjs +2 -0
  4. package/esm2022/lib/components/atoms/user-avatar/user-avatar.component.mjs +162 -0
  5. package/esm2022/lib/components/molecules/notes-box/notes-box.component.mjs +70 -77
  6. package/esm2022/lib/components/organisms/toolbar/toolbar.component.mjs +32 -14
  7. package/esm2022/lib/components/types.mjs +1 -1
  8. package/esm2022/lib/services/auth/auth-state.service.mjs +29 -8
  9. package/esm2022/lib/services/auth/auth.service.mjs +18 -17
  10. package/esm2022/lib/services/auth/types.mjs +1 -1
  11. package/esm2022/lib/services/icons.service.mjs +7 -2
  12. package/esm2022/lib/version.mjs +2 -2
  13. package/esm2022/public-api.mjs +3 -1
  14. package/fesm2022/valtech-components.mjs +429 -112
  15. package/fesm2022/valtech-components.mjs.map +1 -1
  16. package/lib/components/atoms/glass/glass.component.d.ts +43 -0
  17. package/lib/components/atoms/glass/types.d.ts +70 -0
  18. package/lib/components/atoms/user-avatar/types.d.ts +74 -0
  19. package/lib/components/atoms/user-avatar/user-avatar.component.d.ts +50 -0
  20. package/lib/components/molecules/notes-box/notes-box.component.d.ts +27 -15
  21. package/lib/components/types.d.ts +11 -0
  22. package/lib/services/auth/auth-state.service.d.ts +14 -0
  23. package/lib/services/auth/auth.service.d.ts +8 -4
  24. package/lib/services/auth/types.d.ts +8 -0
  25. package/lib/version.d.ts +1 -1
  26. package/package.json +1 -1
  27. package/public-api.d.ts +4 -0
@@ -5,7 +5,7 @@ import { IonAvatar, IonCard, IonIcon, IonButton, IonSpinner, IonText, IonModal,
5
5
  import * as i1 from '@angular/common';
6
6
  import { CommonModule, NgStyle, NgFor, isPlatformBrowser, NgClass } from '@angular/common';
7
7
  import { addIcons } from 'ionicons';
8
- import { addOutline, addCircleOutline, alertOutline, alertCircleOutline, arrowBackOutline, arrowForwardOutline, arrowDownOutline, settings, settingsOutline, checkmarkCircleOutline, ellipsisHorizontalOutline, notifications, notificationsOutline, openOutline, closeOutline, chatbubblesOutline, shareOutline, heart, heartOutline, home, homeOutline, eyeOffOutline, eyeOutline, scanOutline, chevronDownOutline, chevronForwardOutline, checkmarkOutline, clipboardOutline, copyOutline, filterOutline, locationOutline, calendarOutline, businessOutline, logoTwitter, logoInstagram, logoLinkedin, logoYoutube, logoTiktok, logoFacebook, logoGoogle, createOutline, trashOutline, playOutline, phonePortraitOutline, refreshOutline, documentTextOutline, lockClosedOutline, informationCircleOutline, logoNpm, removeOutline, optionsOutline, add, close, share, create, trash, star, camera, mic, send, downloadOutline, chevronDown, language, globeOutline, checkmark, list, grid, apps, menu, search, person, helpCircle, informationCircle, documentText, mail, calendar, folder, chevronForward, ellipsisHorizontal, chevronBack, playBack, playForward, ellipse, starOutline, starHalf, heartHalf, checkmarkCircle, timeOutline, flag, trendingUp, trendingDown, remove, analytics, people, cash, cart, eye, chatbubbleOutline, thumbsUpOutline, thumbsUp, happyOutline, happy, sadOutline, sad, chevronUp, pin, pencil, callOutline, logoWhatsapp, paperPlaneOutline, mailOutline, closeCircle, alertCircle, logoApple, logoMicrosoft, linkOutline, unlinkOutline, chevronBackOutline, sendOutline, chatbubbleEllipsesOutline, swapVerticalOutline, chevronUpOutline, documentOutline, searchOutline, personOutline, cartOutline, chatbubble, compass, compassOutline, gridOutline, listOutline, folderOutline, documents, documentsOutline, statsChart, statsChartOutline, cameraOutline, bugOutline, bulbOutline, closeCircleOutline, menuOutline } from 'ionicons/icons';
8
+ import { addOutline, addCircleOutline, alertOutline, alertCircleOutline, arrowBackOutline, arrowForwardOutline, arrowDownOutline, settings, settingsOutline, checkmarkCircleOutline, ellipsisHorizontalOutline, notifications, notificationsOutline, openOutline, closeOutline, chatbubblesOutline, shareOutline, heart, heartOutline, home, homeOutline, eyeOffOutline, eyeOutline, scanOutline, chevronDownOutline, chevronForwardOutline, checkmarkOutline, clipboardOutline, copyOutline, filterOutline, locationOutline, calendarOutline, businessOutline, logoTwitter, logoInstagram, logoLinkedin, logoYoutube, logoTiktok, logoFacebook, logoGoogle, createOutline, trashOutline, playOutline, phonePortraitOutline, refreshOutline, documentTextOutline, lockClosedOutline, informationCircleOutline, logoNpm, removeOutline, optionsOutline, personOutline, shieldCheckmarkOutline, keyOutline, desktopOutline, logOutOutline, add, close, share, create, trash, star, camera, mic, send, downloadOutline, chevronDown, language, globeOutline, checkmark, list, grid, apps, menu, search, person, helpCircle, informationCircle, documentText, mail, calendar, folder, chevronForward, ellipsisHorizontal, chevronBack, playBack, playForward, ellipse, starOutline, starHalf, heartHalf, checkmarkCircle, timeOutline, flag, trendingUp, trendingDown, remove, analytics, people, cash, cart, eye, chatbubbleOutline, thumbsUpOutline, thumbsUp, happyOutline, happy, sadOutline, sad, chevronUp, pin, pencil, callOutline, logoWhatsapp, paperPlaneOutline, mailOutline, closeCircle, alertCircle, logoApple, logoMicrosoft, linkOutline, unlinkOutline, chevronBackOutline, sendOutline, chatbubbleEllipsesOutline, swapVerticalOutline, chevronUpOutline, documentOutline, searchOutline, cartOutline, chatbubble, compass, compassOutline, gridOutline, listOutline, folderOutline, documents, documentsOutline, statsChart, statsChartOutline, cameraOutline, bugOutline, bulbOutline, closeCircleOutline, menuOutline } from 'ionicons/icons';
9
9
  import * as i1$1 from '@angular/router';
10
10
  import { Router, NavigationEnd, RouterLink, RouterOutlet, RouterModule } from '@angular/router';
11
11
  import { Browser } from '@capacitor/browser';
@@ -52,7 +52,7 @@ import 'prismjs/components/prism-json';
52
52
  * Current version of valtech-components.
53
53
  * This is automatically updated during the publish process.
54
54
  */
55
- const VERSION = '2.0.778';
55
+ const VERSION = '2.0.780';
56
56
 
57
57
  /**
58
58
  * Servicio para gestionar presets de componentes.
@@ -354,6 +354,11 @@ class IconService {
354
354
  logoNpm,
355
355
  removeOutline,
356
356
  optionsOutline,
357
+ personOutline,
358
+ shieldCheckmarkOutline,
359
+ keyOutline,
360
+ desktopOutline,
361
+ logOutOutline,
357
362
  });
358
363
  }
359
364
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IconService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
@@ -6141,6 +6146,284 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6141
6146
  type: Input
6142
6147
  }] } });
6143
6148
 
6149
+ /**
6150
+ * `val-glass`
6151
+ *
6152
+ * Capa **glassmorphism** reusable. Frosted glass overlay con backdrop blur,
6153
+ * tint semi-translúcido, border sutil y shadow. Acepta cualquier contenido via
6154
+ * `<ng-content>` — desde un texto a un card entero.
6155
+ *
6156
+ * Ideal sobre backgrounds decorativos (val-pattern, gradients, imágenes) para
6157
+ * mejorar legibilidad del contenido sin tapar la decoración.
6158
+ *
6159
+ * @example Pill sobre patrón:
6160
+ * ```html
6161
+ * <val-glass><h1>Buenos días</h1></val-glass>
6162
+ * ```
6163
+ *
6164
+ * @example Card glass (block) con auto tint:
6165
+ * ```html
6166
+ * <val-glass [props]="{ tint: 'auto', display: 'block', radius: '20px', padding: '24px' }">
6167
+ * <p>Contenido del card</p>
6168
+ * </val-glass>
6169
+ * ```
6170
+ */
6171
+ class GlassComponent {
6172
+ constructor() {
6173
+ this.props_ = signal({});
6174
+ /** Snapshot reactivo de los props con defaults aplicados. */
6175
+ this.resolvedProps = computed(() => this.props_());
6176
+ /**
6177
+ * Resuelve el background según `tint` + `tintAlpha`.
6178
+ * - `'dark'` → rgba purple-dark
6179
+ * - `'light'` → rgba blanco
6180
+ * - `'auto'` → CSS var con fallback (resolved vía media/class del tema)
6181
+ * - custom string → usado tal cual
6182
+ */
6183
+ this.bgStyle = computed(() => {
6184
+ const p = this.resolvedProps();
6185
+ const tint = p.tint ?? 'dark';
6186
+ const alpha = p.tintAlpha ?? 0.55;
6187
+ if (tint === 'dark')
6188
+ return `rgba(14, 4, 32, ${alpha})`;
6189
+ if (tint === 'light')
6190
+ return `rgba(255, 255, 255, ${alpha})`;
6191
+ if (tint === 'auto') {
6192
+ // CSS var — definida en :host vía host bindings de tema. Fallback dark.
6193
+ return `var(--val-glass-auto-bg, rgba(14, 4, 32, ${alpha}))`;
6194
+ }
6195
+ return tint; // custom rgba/hsl/hex
6196
+ });
6197
+ this.filterStyle = computed(() => {
6198
+ const p = this.resolvedProps();
6199
+ const blur = p.blur ?? 10;
6200
+ const sat = p.saturate ?? 140;
6201
+ return `blur(${blur}px) saturate(${sat}%)`;
6202
+ });
6203
+ this.borderStyle = computed(() => {
6204
+ const showBorder = this.resolvedProps().border ?? true;
6205
+ if (!showBorder)
6206
+ return 'none';
6207
+ const tint = this.resolvedProps().tint ?? 'dark';
6208
+ // light tint → border más oscuro para visibilidad; dark tint → blanco.
6209
+ if (tint === 'light')
6210
+ return '1px solid rgba(0, 0, 0, 0.08)';
6211
+ return '1px solid rgba(255, 255, 255, 0.08)';
6212
+ });
6213
+ this.shadowStyle = computed(() => {
6214
+ const elevation = this.resolvedProps().elevation ?? 'md';
6215
+ switch (elevation) {
6216
+ case 'none':
6217
+ return 'none';
6218
+ case 'sm':
6219
+ return '0 2px 8px rgba(0, 0, 0, 0.15)';
6220
+ case 'lg':
6221
+ return '0 12px 40px rgba(0, 0, 0, 0.35)';
6222
+ case 'md':
6223
+ default:
6224
+ return '0 4px 24px rgba(0, 0, 0, 0.25)';
6225
+ }
6226
+ });
6227
+ }
6228
+ set props(value) {
6229
+ this.props_.set(value ?? {});
6230
+ }
6231
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GlassComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6232
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: GlassComponent, isStandalone: true, selector: "val-glass", inputs: { props: "props" }, ngImport: i0, template: `
6233
+ <div
6234
+ class="val-glass"
6235
+ [class]="resolvedProps().cssClass || ''"
6236
+ [style.background]="bgStyle()"
6237
+ [style.backdrop-filter]="filterStyle()"
6238
+ [style.-webkit-backdrop-filter]="filterStyle()"
6239
+ [style.border-radius]="resolvedProps().radius || '14px'"
6240
+ [style.padding]="resolvedProps().padding || '10px 18px'"
6241
+ [style.border]="borderStyle()"
6242
+ [style.box-shadow]="shadowStyle()"
6243
+ [style.display]="resolvedProps().display || 'inline-block'"
6244
+ >
6245
+ <ng-content />
6246
+ </div>
6247
+ `, isInline: true, styles: [":host{display:contents}.val-glass{max-width:100%;box-sizing:border-box;transition:background .2s ease,border-color .2s ease}@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))){.val-glass{background:#0e0420d9!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
6248
+ }
6249
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GlassComponent, decorators: [{
6250
+ type: Component,
6251
+ args: [{ selector: 'val-glass', standalone: true, imports: [CommonModule], template: `
6252
+ <div
6253
+ class="val-glass"
6254
+ [class]="resolvedProps().cssClass || ''"
6255
+ [style.background]="bgStyle()"
6256
+ [style.backdrop-filter]="filterStyle()"
6257
+ [style.-webkit-backdrop-filter]="filterStyle()"
6258
+ [style.border-radius]="resolvedProps().radius || '14px'"
6259
+ [style.padding]="resolvedProps().padding || '10px 18px'"
6260
+ [style.border]="borderStyle()"
6261
+ [style.box-shadow]="shadowStyle()"
6262
+ [style.display]="resolvedProps().display || 'inline-block'"
6263
+ >
6264
+ <ng-content />
6265
+ </div>
6266
+ `, styles: [":host{display:contents}.val-glass{max-width:100%;box-sizing:border-box;transition:background .2s ease,border-color .2s ease}@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))){.val-glass{background:#0e0420d9!important}}\n"] }]
6267
+ }], propDecorators: { props: [{
6268
+ type: Input
6269
+ }] } });
6270
+
6271
+ addIcons({ personOutline });
6272
+ /**
6273
+ * `val-user-avatar`
6274
+ *
6275
+ * Avatar **smart** con cadena de fallback automática:
6276
+ *
6277
+ * foto (`avatarUrl`) → iniciales (de `name`/`email`) → icono persona.
6278
+ *
6279
+ * Si la imagen falla en cargar (404, CORS, etc.), automáticamente cae a las
6280
+ * iniciales sin que el caller tenga que hacer nada. Color de fondo derivado
6281
+ * deterministicamente del user para que el mismo user tenga siempre el mismo
6282
+ * color (a menos que `background` se sobrescriba).
6283
+ *
6284
+ * @example
6285
+ * ```html
6286
+ * <val-user-avatar [props]="{ user: auth.user() }" (onClick)="goProfile()" />
6287
+ * ```
6288
+ */
6289
+ class UserAvatarComponent {
6290
+ constructor() {
6291
+ this.props_ = signal({});
6292
+ this.imageFailed = signal(false);
6293
+ this.onClick = new EventEmitter();
6294
+ this.resolvedProps = computed(() => this.props_());
6295
+ /** Resuelve los campos del user (user prop > campos sueltos). */
6296
+ this.resolvedUser = computed(() => {
6297
+ const p = this.resolvedProps();
6298
+ return {
6299
+ name: p.user?.name?.trim() || p.name?.trim() || '',
6300
+ email: p.user?.email?.trim() || p.email?.trim() || '',
6301
+ avatarUrl: p.user?.avatarUrl?.trim() || p.avatarUrl?.trim() || '',
6302
+ };
6303
+ });
6304
+ /** URL de imagen — empty si no hay o si la carga falló. */
6305
+ this.imageUrl = computed(() => this.resolvedUser().avatarUrl);
6306
+ this.showImage = computed(() => !!this.imageUrl() && !this.imageFailed());
6307
+ /** Iniciales — 1-2 chars derivados de name (preferred) o email prefix. */
6308
+ this.initials = computed(() => {
6309
+ const { name, email } = this.resolvedUser();
6310
+ if (name) {
6311
+ const parts = name.split(/\s+/).filter(Boolean);
6312
+ if (parts.length >= 2)
6313
+ return parts[0][0] + parts[1][0];
6314
+ if (parts.length === 1 && parts[0].length >= 2) {
6315
+ return parts[0].slice(0, 2);
6316
+ }
6317
+ return parts[0]?.[0] ?? '';
6318
+ }
6319
+ if (email) {
6320
+ const prefix = email.split('@')[0] ?? '';
6321
+ // Tomar 1-2 chars del prefix
6322
+ if (prefix.length >= 2)
6323
+ return prefix.slice(0, 2);
6324
+ return prefix[0] ?? '';
6325
+ }
6326
+ return '';
6327
+ });
6328
+ this.sizeClass = computed(() => this.resolvedProps().size || 'small');
6329
+ this.shapeClass = computed(() => this.resolvedProps().shape || 'circle');
6330
+ /** Background — explicito o derivado deterministicamente del user. */
6331
+ this.bgColor = computed(() => {
6332
+ const p = this.resolvedProps();
6333
+ if (p.background)
6334
+ return p.background;
6335
+ const { name, email } = this.resolvedUser();
6336
+ const seed = name || email || 'val';
6337
+ return this.colorFromSeed(seed);
6338
+ });
6339
+ this.ariaLabel = computed(() => {
6340
+ const { name, email } = this.resolvedUser();
6341
+ return name || email || 'User avatar';
6342
+ });
6343
+ }
6344
+ set props(value) {
6345
+ this.props_.set(value ?? {});
6346
+ this.imageFailed.set(false);
6347
+ }
6348
+ /** Subscribers — usado para condicionar cursor/aria. */
6349
+ get hasClick() {
6350
+ return this.onClick.observed;
6351
+ }
6352
+ onImageError() {
6353
+ this.imageFailed.set(true);
6354
+ }
6355
+ onImageLoad() {
6356
+ this.imageFailed.set(false);
6357
+ }
6358
+ /**
6359
+ * Hash determinista string → HSL color del rango Valtech (purples/blues).
6360
+ * Mismo seed → mismo color (consistencia entre sessions).
6361
+ */
6362
+ colorFromSeed(seed) {
6363
+ let hash = 0;
6364
+ for (let i = 0; i < seed.length; i++) {
6365
+ hash = (hash * 31 + seed.charCodeAt(i)) >>> 0;
6366
+ }
6367
+ // Restringir a rango violet/blue (240-290°) para coherencia con palette
6368
+ const hue = 240 + (hash % 50);
6369
+ const sat = 55 + ((hash >>> 8) % 20); // 55-75%
6370
+ const light = 38 + ((hash >>> 16) % 12); // 38-50% — siempre legible con fg blanco
6371
+ return `hsl(${hue}, ${sat}%, ${light}%)`;
6372
+ }
6373
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UserAvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6374
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UserAvatarComponent, isStandalone: true, selector: "val-user-avatar", inputs: { props: "props" }, outputs: { onClick: "onClick" }, ngImport: i0, template: `
6375
+ <button
6376
+ type="button"
6377
+ class="val-user-avatar"
6378
+ [class.bordered]="resolvedProps().bordered"
6379
+ [class.grayscale]="resolvedProps().grayscale"
6380
+ [class.has-click]="hasClick"
6381
+ [class]="shapeClass() + ' ' + sizeClass() + ' ' + (resolvedProps().cssClass || '')"
6382
+ [style.background]="!showImage() ? bgColor() : 'transparent'"
6383
+ [style.color]="resolvedProps().foreground || '#fff'"
6384
+ [attr.aria-label]="ariaLabel()"
6385
+ (click)="onClick.emit()"
6386
+ >
6387
+ @if (showImage()) {
6388
+ <img class="val-user-avatar__img" [src]="imageUrl()" alt="" (error)="onImageError()" (load)="onImageLoad()" />
6389
+ } @else if (initials()) {
6390
+ <span class="val-user-avatar__initials">{{ initials() }}</span>
6391
+ } @else {
6392
+ <ion-icon name="person-outline" class="val-user-avatar__icon" aria-hidden="true" />
6393
+ }
6394
+ </button>
6395
+ `, isInline: true, styles: [":host{display:inline-flex}.val-user-avatar{position:relative;display:inline-flex;align-items:center;justify-content:center;overflow:hidden;padding:0;margin:0;border:none;background:var(--ion-color-medium, #92949c);color:#fff;font-weight:600;font-family:inherit;line-height:1;-webkit-user-select:none;user-select:none;cursor:default;transition:transform .15s ease,box-shadow .15s ease}.val-user-avatar.has-click{cursor:pointer}.val-user-avatar.has-click:hover{transform:scale(1.04)}.val-user-avatar.has-click:active{transform:scale(.96)}.val-user-avatar.circle{border-radius:50%}.val-user-avatar.square{border-radius:8px}.val-user-avatar.xsmall{width:24px;height:24px;font-size:.625rem}.val-user-avatar.small{width:32px;height:32px;font-size:.75rem}.val-user-avatar.medium{width:48px;height:48px;font-size:1rem}.val-user-avatar.large{width:72px;height:72px;font-size:1.5rem}.val-user-avatar.xlarge{width:96px;height:96px;font-size:2rem}.val-user-avatar.bordered{box-shadow:0 0 0 2px var(--ion-background-color, #fff)}.val-user-avatar.grayscale{filter:grayscale(100%)}.val-user-avatar__img{width:100%;height:100%;object-fit:cover;display:block}.val-user-avatar__initials{text-transform:uppercase;letter-spacing:.02em}.val-user-avatar__icon{font-size:60%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
6396
+ }
6397
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UserAvatarComponent, decorators: [{
6398
+ type: Component,
6399
+ args: [{ selector: 'val-user-avatar', standalone: true, imports: [CommonModule, IonIcon], template: `
6400
+ <button
6401
+ type="button"
6402
+ class="val-user-avatar"
6403
+ [class.bordered]="resolvedProps().bordered"
6404
+ [class.grayscale]="resolvedProps().grayscale"
6405
+ [class.has-click]="hasClick"
6406
+ [class]="shapeClass() + ' ' + sizeClass() + ' ' + (resolvedProps().cssClass || '')"
6407
+ [style.background]="!showImage() ? bgColor() : 'transparent'"
6408
+ [style.color]="resolvedProps().foreground || '#fff'"
6409
+ [attr.aria-label]="ariaLabel()"
6410
+ (click)="onClick.emit()"
6411
+ >
6412
+ @if (showImage()) {
6413
+ <img class="val-user-avatar__img" [src]="imageUrl()" alt="" (error)="onImageError()" (load)="onImageLoad()" />
6414
+ } @else if (initials()) {
6415
+ <span class="val-user-avatar__initials">{{ initials() }}</span>
6416
+ } @else {
6417
+ <ion-icon name="person-outline" class="val-user-avatar__icon" aria-hidden="true" />
6418
+ }
6419
+ </button>
6420
+ `, styles: [":host{display:inline-flex}.val-user-avatar{position:relative;display:inline-flex;align-items:center;justify-content:center;overflow:hidden;padding:0;margin:0;border:none;background:var(--ion-color-medium, #92949c);color:#fff;font-weight:600;font-family:inherit;line-height:1;-webkit-user-select:none;user-select:none;cursor:default;transition:transform .15s ease,box-shadow .15s ease}.val-user-avatar.has-click{cursor:pointer}.val-user-avatar.has-click:hover{transform:scale(1.04)}.val-user-avatar.has-click:active{transform:scale(.96)}.val-user-avatar.circle{border-radius:50%}.val-user-avatar.square{border-radius:8px}.val-user-avatar.xsmall{width:24px;height:24px;font-size:.625rem}.val-user-avatar.small{width:32px;height:32px;font-size:.75rem}.val-user-avatar.medium{width:48px;height:48px;font-size:1rem}.val-user-avatar.large{width:72px;height:72px;font-size:1.5rem}.val-user-avatar.xlarge{width:96px;height:96px;font-size:2rem}.val-user-avatar.bordered{box-shadow:0 0 0 2px var(--ion-background-color, #fff)}.val-user-avatar.grayscale{filter:grayscale(100%)}.val-user-avatar__img{width:100%;height:100%;object-fit:cover;display:block}.val-user-avatar__initials{text-transform:uppercase;letter-spacing:.02em}.val-user-avatar__icon{font-size:60%}\n"] }]
6421
+ }], propDecorators: { props: [{
6422
+ type: Input
6423
+ }], onClick: [{
6424
+ type: Output
6425
+ }] } });
6426
+
6144
6427
  /**
6145
6428
  * val-alert-box
6146
6429
  *
@@ -8362,95 +8645,90 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
8362
8645
  }] } });
8363
8646
 
8364
8647
  /**
8365
- * val-notes-box
8648
+ * `val-notes-box` — callout / admonition para resaltar información dentro de un
8649
+ * flujo de texto.
8366
8650
  *
8367
- * Displays a styled notes/info box with optional prefix and configurable color, size, and padding.
8651
+ * Diseño tipo GitHub/Docusaurus: fondo tintado suave, accent en el borde
8652
+ * izquierdo, prefijo en mayúsculas pequeñas. Funciona en light & dark.
8368
8653
  *
8369
- * @example
8370
- * <val-notes-box [props]="{ text: 'Note', prefix: 'Info', color: 'primary', textColor: 'dark', size: 'medium', rounded: true, padding: '8px' }"></val-notes-box>
8654
+ * El color es un Ionic Color (primary, success, warning, danger, tertiary, …).
8655
+ * No usa `ion-card` ni `ion-color="X"` como background sino una mezcla
8656
+ * `rgba(--ion-color-X-rgb, 0.08)` para no asfixiar el contenido.
8657
+ *
8658
+ * Renderiza inline HTML (`<strong>`, links via `processLinks`) cuando los
8659
+ * flags están activos.
8371
8660
  *
8372
- * @input props: NotesBoxMetadata - Configuration for the notes box (text, prefix, color, textColor, size, rounded, padding)
8661
+ * @example
8662
+ * <val-notes-box [props]="{
8663
+ * text: 'Recordá guardar tus cambios antes de salir.',
8664
+ * prefix: 'Tip',
8665
+ * color: 'tertiary',
8666
+ * textColor: 'dark',
8667
+ * size: 'medium',
8668
+ * rounded: true,
8669
+ * allowPartialBold: true,
8670
+ * }"></val-notes-box>
8373
8671
  */
8374
8672
  class NotesBoxComponent {
8375
- constructor() { }
8376
- ngOnInit() { }
8377
8673
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NotesBoxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8378
8674
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: NotesBoxComponent, isStandalone: true, selector: "val-notes-box", inputs: { props: "props" }, ngImport: i0, template: `
8379
8675
  <div
8380
- [class.notes-box-compact]="props.compact"
8381
- [class.notes-box-align-center]="props.align === 'center'"
8382
- [class.notes-box-align-right]="props.align === 'right'"
8676
+ class="val-notes-box"
8677
+ [class.is-compact]="props.compact"
8678
+ [class.is-rounded]="props.rounded"
8679
+ [class.align-center]="props.align === 'center'"
8680
+ [class.align-right]="props.align === 'right'"
8681
+ [attr.data-color]="props.color || 'primary'"
8682
+ role="note"
8383
8683
  >
8384
- <val-box
8385
- [props]="{
8386
- icon: '',
8387
- bordered: false,
8388
- color: props.color,
8389
- leftBorder: !props.compact,
8390
- rounded: props.rounded,
8391
- padding: props.padding || (props.compact ? '6px 12px' : undefined),
8392
- }"
8393
- >
8394
- <div [ngClass]="['content-container', props.size]" body>
8395
- @if (props.prefix) {
8396
- <val-text
8397
- [props]="{ content: props.prefix, color: props.textColor, bold: true, size: props.size }"
8398
- ></val-text>
8399
- }
8400
- <val-text
8401
- [props]="{
8402
- content: props.text,
8403
- color: props.textColor,
8404
- bold: false,
8405
- size: props.size,
8406
- allowPartialBold: props.allowPartialBold,
8407
- processLinks: props.processLinks,
8408
- }"
8409
- ></val-text>
8410
- </div>
8411
- </val-box>
8684
+ @if (props.prefix) {
8685
+ <div class="val-notes-box__header">{{ props.prefix }}</div>
8686
+ }
8687
+ <div class="val-notes-box__body" [class]="'size-' + (props.size || 'medium')">
8688
+ <val-text
8689
+ [props]="{
8690
+ content: props.text,
8691
+ color: props.textColor,
8692
+ bold: false,
8693
+ size: props.size,
8694
+ allowPartialBold: props.allowPartialBold,
8695
+ processLinks: props.processLinks,
8696
+ }"
8697
+ ></val-text>
8698
+ </div>
8412
8699
  </div>
8413
- `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.content-container{display:inline-grid}.notes-box-compact{display:inline-block;width:fit-content;max-width:100%}.notes-box-compact ::ng-deep val-box ion-card{margin:0;box-shadow:none}.notes-box-align-center{text-align:center}.notes-box-align-center:not(.notes-box-compact){display:flex;justify-content:center}.notes-box-align-right{text-align:right}.notes-box-align-right:not(.notes-box-compact){display:flex;justify-content:flex-end}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: BoxComponent, selector: "val-box", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
8700
+ `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}:host{display:block}.val-notes-box{--notes-rgb: var(--ion-color-primary-rgb, 112, 38, 223);--notes-bg: rgba(var(--notes-rgb), .07);--notes-border: rgba(var(--notes-rgb), .18);--notes-accent: rgb(var(--notes-rgb));--notes-text: var(--ion-color-dark, #0a0612);--notes-link: rgb(var(--notes-rgb));position:relative;display:block;padding:14px 18px 14px 20px;background:var(--notes-bg);border:1px solid var(--notes-border);border-left:4px solid var(--notes-accent);border-radius:10px;color:var(--notes-text);margin:0;line-height:1.55}.val-notes-box.is-rounded{border-radius:12px}.val-notes-box[data-color=primary]{--notes-rgb: var(--ion-color-primary-rgb)}.val-notes-box[data-color=secondary]{--notes-rgb: var(--ion-color-secondary-rgb)}.val-notes-box[data-color=tertiary]{--notes-rgb: var(--ion-color-tertiary-rgb)}.val-notes-box[data-color=success]{--notes-rgb: var(--ion-color-success-rgb)}.val-notes-box[data-color=warning]{--notes-rgb: var(--ion-color-warning-rgb)}.val-notes-box[data-color=danger]{--notes-rgb: var(--ion-color-danger-rgb)}.val-notes-box[data-color=medium]{--notes-rgb: var(--ion-color-medium-rgb)}.val-notes-box[data-color=dark]{--notes-rgb: var(--ion-color-dark-rgb)}.val-notes-box[data-color=light]{--notes-rgb: var(--ion-color-medium-rgb)}.val-notes-box__header{display:block;margin:0 0 6px;font-weight:700;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--notes-accent);font-family:var(--ion-font-family, inherit)}.val-notes-box__body{display:block;color:var(--notes-text);font-size:14px;line-height:1.6}.val-notes-box__body.size-small{font-size:13px;line-height:1.55}.val-notes-box__body.size-large{font-size:15px;line-height:1.6}.val-notes-box__body.size-xlarge{font-size:16px;line-height:1.55}.val-notes-box__body ::ng-deep val-text{display:block;color:var(--notes-text)}.val-notes-box__body ::ng-deep val-text p{margin:0;color:inherit}.val-notes-box__body ::ng-deep val-text ion-text{color:var(--notes-text)!important}.val-notes-box__body ::ng-deep val-text strong,.val-notes-box__body ::ng-deep val-text b,.val-notes-box__body ::ng-deep .partial-bold{color:var(--notes-text);font-weight:700}.val-notes-box__body ::ng-deep val-text a{color:var(--notes-link);text-decoration:underline;text-underline-offset:2px;font-weight:600}.val-notes-box__body ::ng-deep val-text a:hover{opacity:.85}.val-notes-box.align-center,.val-notes-box.align-center .val-notes-box__header{text-align:center}.val-notes-box.align-right,.val-notes-box.align-right .val-notes-box__header{text-align:right}.val-notes-box.is-compact{display:inline-block;width:fit-content;max-width:100%;padding:5px 12px;border-left-width:1px;border-radius:999px;font-size:12px;line-height:1.3}.val-notes-box.is-compact .val-notes-box__header{display:inline;margin:0 6px 0 0;font-size:11px;letter-spacing:.06em}.val-notes-box.is-compact .val-notes-box__body{display:inline;font-size:12px}.val-notes-box.is-compact ::ng-deep val-text{display:inline}.val-notes-box.is-compact ::ng-deep val-text p{display:inline}@media (prefers-color-scheme: dark){:host-context(body:not(.light)) .val-notes-box{--notes-bg: rgba(var(--notes-rgb), .16);--notes-border: rgba(var(--notes-rgb), .3);--notes-text: var(--ion-color-light, #f4f5f8)}}:host-context(body.dark) .val-notes-box,:host-context(.theme-dark) .val-notes-box,:host-context([data-theme=dark]) .val-notes-box{--notes-bg: rgba(var(--notes-rgb), .16);--notes-border: rgba(var(--notes-rgb), .3);--notes-text: var(--ion-color-light, #f4f5f8)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
8414
8701
  }
8415
8702
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NotesBoxComponent, decorators: [{
8416
8703
  type: Component,
8417
- args: [{ selector: 'val-notes-box', standalone: true, imports: [CommonModule, BoxComponent, TextComponent], template: `
8704
+ args: [{ selector: 'val-notes-box', standalone: true, imports: [CommonModule, TextComponent], template: `
8418
8705
  <div
8419
- [class.notes-box-compact]="props.compact"
8420
- [class.notes-box-align-center]="props.align === 'center'"
8421
- [class.notes-box-align-right]="props.align === 'right'"
8706
+ class="val-notes-box"
8707
+ [class.is-compact]="props.compact"
8708
+ [class.is-rounded]="props.rounded"
8709
+ [class.align-center]="props.align === 'center'"
8710
+ [class.align-right]="props.align === 'right'"
8711
+ [attr.data-color]="props.color || 'primary'"
8712
+ role="note"
8422
8713
  >
8423
- <val-box
8424
- [props]="{
8425
- icon: '',
8426
- bordered: false,
8427
- color: props.color,
8428
- leftBorder: !props.compact,
8429
- rounded: props.rounded,
8430
- padding: props.padding || (props.compact ? '6px 12px' : undefined),
8431
- }"
8432
- >
8433
- <div [ngClass]="['content-container', props.size]" body>
8434
- @if (props.prefix) {
8435
- <val-text
8436
- [props]="{ content: props.prefix, color: props.textColor, bold: true, size: props.size }"
8437
- ></val-text>
8438
- }
8439
- <val-text
8440
- [props]="{
8441
- content: props.text,
8442
- color: props.textColor,
8443
- bold: false,
8444
- size: props.size,
8445
- allowPartialBold: props.allowPartialBold,
8446
- processLinks: props.processLinks,
8447
- }"
8448
- ></val-text>
8449
- </div>
8450
- </val-box>
8714
+ @if (props.prefix) {
8715
+ <div class="val-notes-box__header">{{ props.prefix }}</div>
8716
+ }
8717
+ <div class="val-notes-box__body" [class]="'size-' + (props.size || 'medium')">
8718
+ <val-text
8719
+ [props]="{
8720
+ content: props.text,
8721
+ color: props.textColor,
8722
+ bold: false,
8723
+ size: props.size,
8724
+ allowPartialBold: props.allowPartialBold,
8725
+ processLinks: props.processLinks,
8726
+ }"
8727
+ ></val-text>
8728
+ </div>
8451
8729
  </div>
8452
- `, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.content-container{display:inline-grid}.notes-box-compact{display:inline-block;width:fit-content;max-width:100%}.notes-box-compact ::ng-deep val-box ion-card{margin:0;box-shadow:none}.notes-box-align-center{text-align:center}.notes-box-align-center:not(.notes-box-compact){display:flex;justify-content:center}.notes-box-align-right{text-align:right}.notes-box-align-right:not(.notes-box-compact){display:flex;justify-content:flex-end}\n"] }]
8453
- }], ctorParameters: () => [], propDecorators: { props: [{
8730
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}:host{display:block}.val-notes-box{--notes-rgb: var(--ion-color-primary-rgb, 112, 38, 223);--notes-bg: rgba(var(--notes-rgb), .07);--notes-border: rgba(var(--notes-rgb), .18);--notes-accent: rgb(var(--notes-rgb));--notes-text: var(--ion-color-dark, #0a0612);--notes-link: rgb(var(--notes-rgb));position:relative;display:block;padding:14px 18px 14px 20px;background:var(--notes-bg);border:1px solid var(--notes-border);border-left:4px solid var(--notes-accent);border-radius:10px;color:var(--notes-text);margin:0;line-height:1.55}.val-notes-box.is-rounded{border-radius:12px}.val-notes-box[data-color=primary]{--notes-rgb: var(--ion-color-primary-rgb)}.val-notes-box[data-color=secondary]{--notes-rgb: var(--ion-color-secondary-rgb)}.val-notes-box[data-color=tertiary]{--notes-rgb: var(--ion-color-tertiary-rgb)}.val-notes-box[data-color=success]{--notes-rgb: var(--ion-color-success-rgb)}.val-notes-box[data-color=warning]{--notes-rgb: var(--ion-color-warning-rgb)}.val-notes-box[data-color=danger]{--notes-rgb: var(--ion-color-danger-rgb)}.val-notes-box[data-color=medium]{--notes-rgb: var(--ion-color-medium-rgb)}.val-notes-box[data-color=dark]{--notes-rgb: var(--ion-color-dark-rgb)}.val-notes-box[data-color=light]{--notes-rgb: var(--ion-color-medium-rgb)}.val-notes-box__header{display:block;margin:0 0 6px;font-weight:700;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--notes-accent);font-family:var(--ion-font-family, inherit)}.val-notes-box__body{display:block;color:var(--notes-text);font-size:14px;line-height:1.6}.val-notes-box__body.size-small{font-size:13px;line-height:1.55}.val-notes-box__body.size-large{font-size:15px;line-height:1.6}.val-notes-box__body.size-xlarge{font-size:16px;line-height:1.55}.val-notes-box__body ::ng-deep val-text{display:block;color:var(--notes-text)}.val-notes-box__body ::ng-deep val-text p{margin:0;color:inherit}.val-notes-box__body ::ng-deep val-text ion-text{color:var(--notes-text)!important}.val-notes-box__body ::ng-deep val-text strong,.val-notes-box__body ::ng-deep val-text b,.val-notes-box__body ::ng-deep .partial-bold{color:var(--notes-text);font-weight:700}.val-notes-box__body ::ng-deep val-text a{color:var(--notes-link);text-decoration:underline;text-underline-offset:2px;font-weight:600}.val-notes-box__body ::ng-deep val-text a:hover{opacity:.85}.val-notes-box.align-center,.val-notes-box.align-center .val-notes-box__header{text-align:center}.val-notes-box.align-right,.val-notes-box.align-right .val-notes-box__header{text-align:right}.val-notes-box.is-compact{display:inline-block;width:fit-content;max-width:100%;padding:5px 12px;border-left-width:1px;border-radius:999px;font-size:12px;line-height:1.3}.val-notes-box.is-compact .val-notes-box__header{display:inline;margin:0 6px 0 0;font-size:11px;letter-spacing:.06em}.val-notes-box.is-compact .val-notes-box__body{display:inline;font-size:12px}.val-notes-box.is-compact ::ng-deep val-text{display:inline}.val-notes-box.is-compact ::ng-deep val-text p{display:inline}@media (prefers-color-scheme: dark){:host-context(body:not(.light)) .val-notes-box{--notes-bg: rgba(var(--notes-rgb), .16);--notes-border: rgba(var(--notes-rgb), .3);--notes-text: var(--ion-color-light, #f4f5f8)}}:host-context(body.dark) .val-notes-box,:host-context(.theme-dark) .val-notes-box,:host-context([data-theme=dark]) .val-notes-box{--notes-bg: rgba(var(--notes-rgb), .16);--notes-border: rgba(var(--notes-rgb), .3);--notes-text: var(--ion-color-light, #f4f5f8)}\n"] }]
8731
+ }], propDecorators: { props: [{
8454
8732
  type: Input
8455
8733
  }] } });
8456
8734
 
@@ -19763,6 +20041,10 @@ class AuthStateService {
19763
20041
  return {
19764
20042
  userId: state.userId,
19765
20043
  email: state.email || '',
20044
+ name: state.name ?? undefined,
20045
+ handle: state.handle ?? undefined,
20046
+ avatarUrl: state.avatarUrl ?? undefined,
20047
+ phone: state.phone ?? undefined,
19766
20048
  roles: state.roles,
19767
20049
  permissions: state.permissions,
19768
20050
  isSuperAdmin: state.isSuperAdmin,
@@ -19776,7 +20058,7 @@ class AuthStateService {
19776
20058
  * Establece el estado de carga.
19777
20059
  */
19778
20060
  setLoading(isLoading) {
19779
- this._state.update((s) => ({ ...s, isLoading }));
20061
+ this._state.update(s => ({ ...s, isLoading }));
19780
20062
  }
19781
20063
  /**
19782
20064
  * Establece el estado de autenticación exitosa.
@@ -19802,7 +20084,7 @@ class AuthStateService {
19802
20084
  */
19803
20085
  updateAccessToken(accessToken, expiresIn) {
19804
20086
  const expiresAt = Date.now() + expiresIn * 1000;
19805
- this._state.update((s) => ({
20087
+ this._state.update(s => ({
19806
20088
  ...s,
19807
20089
  accessToken,
19808
20090
  expiresAt,
@@ -19812,7 +20094,7 @@ class AuthStateService {
19812
20094
  * Actualiza el refresh token (token rotation).
19813
20095
  */
19814
20096
  updateRefreshToken(refreshToken) {
19815
- this._state.update((s) => ({
20097
+ this._state.update(s => ({
19816
20098
  ...s,
19817
20099
  refreshToken,
19818
20100
  }));
@@ -19821,7 +20103,7 @@ class AuthStateService {
19821
20103
  * Actualiza los permisos.
19822
20104
  */
19823
20105
  updatePermissions(roles, permissions, isSuperAdmin) {
19824
- this._state.update((s) => ({
20106
+ this._state.update(s => ({
19825
20107
  ...s,
19826
20108
  roles,
19827
20109
  permissions,
@@ -19832,7 +20114,7 @@ class AuthStateService {
19832
20114
  * Establece un error de autenticación.
19833
20115
  */
19834
20116
  setError(error) {
19835
- this._state.update((s) => ({
20117
+ this._state.update(s => ({
19836
20118
  ...s,
19837
20119
  error,
19838
20120
  isLoading: false,
@@ -19842,7 +20124,7 @@ class AuthStateService {
19842
20124
  * Limpia el error.
19843
20125
  */
19844
20126
  clearError() {
19845
- this._state.update((s) => ({
20127
+ this._state.update(s => ({
19846
20128
  ...s,
19847
20129
  error: null,
19848
20130
  }));
@@ -19891,12 +20173,29 @@ class AuthStateService {
19891
20173
  * Actualiza el userId y email (después de parsear el token).
19892
20174
  */
19893
20175
  updateUserInfo(userId, email) {
19894
- this._state.update((s) => ({
20176
+ this._state.update(s => ({
19895
20177
  ...s,
19896
20178
  userId,
19897
20179
  email,
19898
20180
  }));
19899
20181
  }
20182
+ /**
20183
+ * Hidrata el state con campos del profile (nombre, handle, avatar, phone).
20184
+ * Invocado tras `getProfile()` o `updateProfile()` para que consumers de
20185
+ * `auth.user()` vean los campos enriched automáticamente.
20186
+ *
20187
+ * Cualquier campo `undefined` se ignora (no sobrescribe con null). Campos
20188
+ * `null` explícitos se persisten (signal de "limpiado").
20189
+ */
20190
+ updateProfileFields(fields) {
20191
+ this._state.update(s => ({
20192
+ ...s,
20193
+ ...(fields.name !== undefined && { name: fields.name }),
20194
+ ...(fields.handle !== undefined && { handle: fields.handle }),
20195
+ ...(fields.avatarUrl !== undefined && { avatarUrl: fields.avatarUrl }),
20196
+ ...(fields.phone !== undefined && { phone: fields.phone }),
20197
+ }));
20198
+ }
19900
20199
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuthStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
19901
20200
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AuthStateService, providedIn: 'root' }); }
19902
20201
  }
@@ -23959,29 +24258,32 @@ class AuthService {
23959
24258
  // =============================================
23960
24259
  /**
23961
24260
  * Obtiene el perfil del usuario autenticado.
23962
- * Incluye información de MFA y teléfono.
24261
+ * Incluye información de MFA y teléfono. Hidrata el state automáticamente
24262
+ * con `name/handle/avatarUrl/phone` para que `auth.user()` los retorne.
23963
24263
  */
23964
24264
  getProfile() {
23965
- return this.http
23966
- .get(`${this.baseUrl}/profile`)
23967
- .pipe(catchError(error => this.handleAuthError(error)));
24265
+ return this.http.get(`${this.baseUrl}/profile`).pipe(tap(profile => this.stateService.updateProfileFields({
24266
+ name: profile.name,
24267
+ handle: profile.handle ?? null,
24268
+ avatarUrl: profile.avatarUrl ?? null,
24269
+ phone: profile.phone ?? null,
24270
+ })), catchError(error => this.handleAuthError(error)));
23968
24271
  }
23969
24272
  /**
23970
- * Actualiza el perfil del usuario.
24273
+ * Actualiza el perfil del usuario. Sincroniza state con los nuevos values
24274
+ * (name/phone) — el backend response no los echo'a pero el caller ya tiene
24275
+ * los valores que mandó.
23971
24276
  */
23972
24277
  updateProfile(request) {
23973
- return this.http
23974
- .put(`${this.baseUrl}/profile`, request)
23975
- .pipe(catchError(error => this.handleAuthError(error)));
24278
+ return this.http.put(`${this.baseUrl}/profile`, request).pipe(tap(() => this.stateService.updateProfileFields(request)), catchError(error => this.handleAuthError(error)));
23976
24279
  }
23977
24280
  /**
23978
- * Actualiza el avatar del usuario en el backend.
23979
- * Nota: El estado local del avatar se maneja a través de getProfile().
24281
+ * Actualiza el avatar del usuario en el backend. Sincroniza state con el
24282
+ * `avatarUrl` retornado para que el header / dashboard se refresquen sin
24283
+ * necesidad de un getProfile adicional.
23980
24284
  */
23981
24285
  updateAvatar(request) {
23982
- return this.http
23983
- .put(`${this.baseUrl}/profile/avatar`, request)
23984
- .pipe(catchError(error => this.handleAuthError(error)));
24286
+ return this.http.put(`${this.baseUrl}/profile/avatar`, request).pipe(tap(res => this.stateService.updateProfileFields({ avatarUrl: res.avatarUrl })), catchError(error => this.handleAuthError(error)));
23985
24287
  }
23986
24288
  // =============================================
23987
24289
  // RECUPERACIÓN DE CONTRASEÑA
@@ -24104,9 +24406,7 @@ class AuthService {
24104
24406
  * @param handle - Nuevo handle (sin @, ej: "victorv")
24105
24407
  */
24106
24408
  updateHandle(handle) {
24107
- return this.http
24108
- .put(`${this.baseUrl}/profile/handle`, { handle })
24109
- .pipe(catchError(error => this.handleAuthError(error)));
24409
+ return this.http.put(`${this.baseUrl}/profile/handle`, { handle }).pipe(tap(() => this.stateService.updateProfileFields({ handle })), catchError(error => this.handleAuthError(error)));
24110
24410
  }
24111
24411
  /**
24112
24412
  * Verifica si un handle está disponible.
@@ -26288,11 +26588,15 @@ class ToolbarComponent {
26288
26588
  <ion-button *ngIf="action.type === actionTypes.ICON" (click)="clickHandler(action.token)">
26289
26589
  <ion-icon slot="icon-only" [name]="action.description" [color]="props.textColor"></ion-icon>
26290
26590
  </ion-button>
26291
- <val-avatar
26591
+ <val-user-avatar
26292
26592
  *ngIf="action.type === actionTypes.AVATAR"
26293
- [props]="{ size: 'small', image: action.description, default: '' }"
26593
+ [props]="{
26594
+ user: action.user,
26595
+ avatarUrl: action.description,
26596
+ size: 'small',
26597
+ }"
26294
26598
  (onClick)="clickHandler(action.token)"
26295
- ></val-avatar>
26599
+ ></val-user-avatar>
26296
26600
  <val-image
26297
26601
  *ngIf="action.type === actionTypes.IMAGE"
26298
26602
  [props]="action.image"
@@ -26317,11 +26621,15 @@ class ToolbarComponent {
26317
26621
  <ion-button *ngIf="action.type === actionTypes.ICON" (click)="clickHandler(action.token)">
26318
26622
  <ion-icon slot="icon-only" [name]="action.description" [color]="props.textColor"></ion-icon>
26319
26623
  </ion-button>
26320
- <val-avatar
26624
+ <val-user-avatar
26321
26625
  *ngIf="action.type === actionTypes.AVATAR"
26322
- [props]="{ size: 'small', image: action.description, default: '' }"
26626
+ [props]="{
26627
+ user: action.user,
26628
+ avatarUrl: action.description,
26629
+ size: 'small',
26630
+ }"
26323
26631
  (onClick)="clickHandler(action.token)"
26324
- ></val-avatar>
26632
+ ></val-user-avatar>
26325
26633
  <val-image
26326
26634
  *ngIf="action.type === actionTypes.IMAGE"
26327
26635
  [props]="action.image"
@@ -26337,7 +26645,7 @@ class ToolbarComponent {
26337
26645
  <!-- experimental -->
26338
26646
  <ng-content select="[toolbar-bottom]"></ng-content>
26339
26647
  </ion-toolbar>
26340
- `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-button{font-family:var(--ion-default-font),Arial,sans-serif}.left-buttons{margin-left:-1rem}.background{background:var(--ion-background-color)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: AvatarComponent, selector: "val-avatar", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: ImageComponent, selector: "val-image", inputs: ["props"] }, { kind: "component", type: IonMenuButton, selector: "ion-menu-button", inputs: ["autoHide", "color", "disabled", "menu", "mode", "type"] }, { kind: "component", type: LanguageSelectorComponent, selector: "val-language-selector", inputs: ["props"], outputs: ["languageChange"] }] }); }
26648
+ `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-button{font-family:var(--ion-default-font),Arial,sans-serif}.left-buttons{margin-left:-1rem}.background{background:var(--ion-background-color)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: ImageComponent, selector: "val-image", inputs: ["props"] }, { kind: "component", type: UserAvatarComponent, selector: "val-user-avatar", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: IonMenuButton, selector: "ion-menu-button", inputs: ["autoHide", "color", "disabled", "menu", "mode", "type"] }, { kind: "component", type: LanguageSelectorComponent, selector: "val-language-selector", inputs: ["props"], outputs: ["languageChange"] }] }); }
26341
26649
  }
26342
26650
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToolbarComponent, decorators: [{
26343
26651
  type: Component,
@@ -26351,6 +26659,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
26351
26659
  IonTitle,
26352
26660
  AvatarComponent,
26353
26661
  ImageComponent,
26662
+ UserAvatarComponent,
26354
26663
  IonMenuButton,
26355
26664
  LanguageSelectorComponent,
26356
26665
  ], template: `
@@ -26369,11 +26678,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
26369
26678
  <ion-button *ngIf="action.type === actionTypes.ICON" (click)="clickHandler(action.token)">
26370
26679
  <ion-icon slot="icon-only" [name]="action.description" [color]="props.textColor"></ion-icon>
26371
26680
  </ion-button>
26372
- <val-avatar
26681
+ <val-user-avatar
26373
26682
  *ngIf="action.type === actionTypes.AVATAR"
26374
- [props]="{ size: 'small', image: action.description, default: '' }"
26683
+ [props]="{
26684
+ user: action.user,
26685
+ avatarUrl: action.description,
26686
+ size: 'small',
26687
+ }"
26375
26688
  (onClick)="clickHandler(action.token)"
26376
- ></val-avatar>
26689
+ ></val-user-avatar>
26377
26690
  <val-image
26378
26691
  *ngIf="action.type === actionTypes.IMAGE"
26379
26692
  [props]="action.image"
@@ -26398,11 +26711,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
26398
26711
  <ion-button *ngIf="action.type === actionTypes.ICON" (click)="clickHandler(action.token)">
26399
26712
  <ion-icon slot="icon-only" [name]="action.description" [color]="props.textColor"></ion-icon>
26400
26713
  </ion-button>
26401
- <val-avatar
26714
+ <val-user-avatar
26402
26715
  *ngIf="action.type === actionTypes.AVATAR"
26403
- [props]="{ size: 'small', image: action.description, default: '' }"
26716
+ [props]="{
26717
+ user: action.user,
26718
+ avatarUrl: action.description,
26719
+ size: 'small',
26720
+ }"
26404
26721
  (onClick)="clickHandler(action.token)"
26405
- ></val-avatar>
26722
+ ></val-user-avatar>
26406
26723
  <val-image
26407
26724
  *ngIf="action.type === actionTypes.IMAGE"
26408
26725
  [props]="action.image"
@@ -43492,5 +43809,5 @@ function buildFooterLinks(links, t, resolver) {
43492
43809
  * Generated bundle index. Do not edit.
43493
43810
  */
43494
43811
 
43495
- export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AppConfigService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CHEV_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CookieBannerComponent, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MenuComponent, MessagingService, MetaService, ModalService, MultiSelectSearchComponent, NavigationService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PATTERN_MOTIFS, PATTERN_PALETTES, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RightsFooterComponent, RotatingTextComponent, SHAPE_KEYS, SKELETON_PRESETS, SOLID_KEYS, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, SimpleComponent, SkeletonComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UpdateBannerComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEFAULT_CONTENT, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_SOCIAL_LINKS, VERSION, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createTitleProps, docs, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideValtechAds, provideValtechAppConfig, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechPresets, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
43812
+ export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AppConfigService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CHEV_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CookieBannerComponent, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MenuComponent, MessagingService, MetaService, ModalService, MultiSelectSearchComponent, NavigationService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PATTERN_MOTIFS, PATTERN_PALETTES, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RightsFooterComponent, RotatingTextComponent, SHAPE_KEYS, SKELETON_PRESETS, SOLID_KEYS, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, SimpleComponent, SkeletonComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEFAULT_CONTENT, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_SOCIAL_LINKS, VERSION, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createTitleProps, docs, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideValtechAds, provideValtechAppConfig, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechPresets, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
43496
43813
  //# sourceMappingURL=valtech-components.mjs.map