valtech-components 2.0.298 → 2.0.299

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.
@@ -5,7 +5,7 @@ import * as i1 from '@angular/common';
5
5
  import { CommonModule, NgStyle, AsyncPipe, NgFor, NgClass } from '@angular/common';
6
6
  import { addIcons } from 'ionicons';
7
7
  import { addOutline, addCircleOutline, alertOutline, alertCircleOutline, arrowBackOutline, arrowForwardOutline, arrowDownOutline, checkmarkCircleOutline, ellipsisHorizontalOutline, notificationsOutline, openOutline, closeOutline, chatbubblesOutline, shareOutline, heart, heartOutline, homeOutline, eyeOffOutline, eyeOutline, scanOutline, chevronDownOutline, chevronForwardOutline, checkmarkOutline, clipboardOutline, copyOutline, filterOutline, locationOutline, calendarOutline, businessOutline, logoTwitter, logoInstagram, logoLinkedin, logoYoutube, logoTiktok, logoFacebook, createOutline, trashOutline, playOutline, refreshOutline, documentTextOutline, lockClosedOutline, informationCircleOutline, logoNpm, chevronDown, language, globe, chevronBackOutline } from 'ionicons/icons';
8
- import { map, BehaviorSubject, distinctUntilChanged, Subscription, of } from 'rxjs';
8
+ import { map, BehaviorSubject, distinctUntilChanged, Subscription, of, combineLatest } from 'rxjs';
9
9
  import { Router, RouterLink } from '@angular/router';
10
10
  import { Browser } from '@capacitor/browser';
11
11
  import * as i1$1 from '@angular/platform-browser';
@@ -911,7 +911,7 @@ class LangService {
911
911
  console.warn(`LangService: Content "${className}.${key}" not available in "${lang}".`, `Using "${result.actualLang}" instead. Available languages:`, this.availableLanguages);
912
912
  }
913
913
  return result.content || fallback || `[${className}.${key}]`;
914
- }), distinctUntilChanged());
914
+ }), distinctUntilChanged((prev, curr) => prev === curr));
915
915
  }
916
916
  /**
917
917
  * Get reactive content for multiple keys at once.
@@ -3883,7 +3883,7 @@ class PopoverSelectorComponent {
3883
3883
  </ion-select-option>
3884
3884
  </ion-select>
3885
3885
  </div>
3886
- `, isInline: true, styles: [":root{--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)}@media (prefers-color-scheme: dark){:root{--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)}.popover-selector-container{display:inline-block;width:auto}.popover-selector-container .selector-label{display:block;margin-bottom:8px;font-weight:600;color:var(--ion-color-dark, #1a1a1a)}.popover-selector-select{display:inline-block;width:auto}.popover-selector-select .selector-trigger{--background: transparent;--background-hover: transparent;--background-activated: transparent;--background-focused: transparent;--box-shadow: none;--border-radius: 24px;display:inline-flex;align-items:center;min-width:auto;width:auto;height:auto;min-height:40px;padding:10px 16px;margin:0;background:var(--ion-color-light, #f8f9fa);border:none;border-radius:24px;box-shadow:0 2px 8px #00000014;transition:all .2s ease}.popover-selector-select .selector-trigger:hover:not([disabled]){background:var(--ion-color-light-shade, #e9ecef);transform:translateY(-1px);box-shadow:0 4px 12px #0000001f}.popover-selector-select .selector-trigger:active{transform:translateY(0);box-shadow:0 2px 6px #00000026}.popover-selector-select .selector-trigger:focus-visible{outline:2px solid var(--ion-color-primary, #3880ff);outline-offset:2px}.popover-selector-select .selector-trigger .trigger-text{display:inline-block;margin:0 8px 0 0;font-weight:600;font-size:14px;color:var(--ion-color-dark, #1a1a1a);white-space:nowrap;line-height:1.4}.popover-selector-select .selector-trigger .chevron-icon{font-size:16px;color:var(--ion-color-medium, #92949c);transition:transform .2s ease;margin-left:4px}.popover-selector-select .selector-trigger ion-icon[slot=start]{margin-right:8px;font-size:16px;color:var(--ion-color-medium-shade, #808289)}.popover-selector-select .selector-trigger.select-expanded{background:var(--ion-color-light-shade, #e9ecef)}.popover-selector-select .selector-trigger.select-expanded .chevron-icon{transform:rotate(180deg);color:var(--ion-color-primary, #3880ff)}.popover-selector-select .selector-trigger[disabled]{opacity:.6;pointer-events:none;background:var(--ion-color-light-tint, #f4f5f8);box-shadow:none;transform:none}.option-content{display:flex;align-items:center;gap:12px;padding:6px 0}.option-content .option-icon{font-size:18px;width:18px;height:18px;opacity:.8;color:var(--ion-color-medium-shade, #808289)}.option-content span{font-weight:500;color:var(--ion-color-dark, #1a1a1a);line-height:1.4}.popover-selector-container.size-small .selector-trigger{min-height:32px;padding:6px 12px;border-radius:18px}.popover-selector-container.size-small .selector-trigger .trigger-text{font-size:12px}.popover-selector-container.size-small .selector-trigger .chevron-icon,.popover-selector-container.size-small .selector-trigger ion-icon[slot=start]{font-size:14px}.popover-selector-container.size-large .selector-trigger{min-height:48px;padding:14px 20px;border-radius:28px}.popover-selector-container.size-large .selector-trigger .trigger-text{font-size:16px}.popover-selector-container.size-large .selector-trigger .chevron-icon,.popover-selector-container.size-large .selector-trigger ion-icon[slot=start]{font-size:18px}@media (max-width: 768px){.popover-selector-container .selector-trigger{min-height:38px;padding:9px 14px}.popover-selector-container .selector-trigger .trigger-text{font-size:13px}}@media (prefers-color-scheme: dark){.popover-selector-container .selector-label{color:var(--ion-color-light, #f4f5f8)}.popover-selector-container .selector-trigger{background:var(--ion-color-dark-tint, #383a3e)}.popover-selector-container .selector-trigger:hover:not([disabled]){background:var(--ion-color-dark-shade, #2f2f2f)}.popover-selector-container .selector-trigger .trigger-text{color:var(--ion-color-light, #f4f5f8)}.popover-selector-container .selector-trigger .chevron-icon,.popover-selector-container .selector-trigger ion-icon[slot=start]{color:var(--ion-color-light-shade, #d7d8da)}.popover-selector-container .selector-trigger.select-expanded{background:var(--ion-color-dark-shade, #2f2f2f)}}ion-select{border-radius:8px;padding:4px;border:.125rem solid var(--ion-color-light)!important}\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: 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: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "expandedIcon", "fill", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }] }); }
3886
+ `, isInline: true, styles: [":root{--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)}@media (prefers-color-scheme: dark){:root{--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)}.popover-selector-container{display:inline-block;width:auto}.popover-selector-container .selector-label{display:block;margin-bottom:8px;font-weight:600;color:var(--ion-color-dark, #1a1a1a)}.popover-selector-select{display:inline-block;width:auto}.popover-selector-select .selector-trigger{--background: transparent;--background-hover: transparent;--background-activated: transparent;--background-focused: transparent;--box-shadow: none;--border-radius: 24px;display:inline-flex;align-items:center;min-width:auto;width:auto;height:auto;min-height:40px;padding:10px 16px;margin:0;background:var(--ion-color-light, #f8f9fa);border:none;border-radius:24px;box-shadow:0 2px 8px #00000014;transition:all .2s ease}.popover-selector-select .selector-trigger:hover:not([disabled]){background:var(--ion-color-light-shade, #e9ecef);transform:translateY(-1px);box-shadow:0 4px 12px #0000001f}.popover-selector-select .selector-trigger:active{transform:translateY(0);box-shadow:0 2px 6px #00000026}.popover-selector-select .selector-trigger:focus-visible{outline:2px solid var(--ion-color-primary, #3880ff);outline-offset:2px}.popover-selector-select .selector-trigger .trigger-text{display:inline-block;margin:0 8px 0 0;font-weight:600;font-size:14px;color:var(--ion-color-dark, #1a1a1a);white-space:nowrap;line-height:1.4}.popover-selector-select .selector-trigger .chevron-icon{font-size:16px;color:var(--ion-color-medium, #92949c);transition:transform .2s ease;margin-left:4px}.popover-selector-select .selector-trigger ion-icon[slot=start]{margin-right:8px;font-size:16px;color:var(--ion-color-medium-shade, #808289)}.popover-selector-select .selector-trigger.select-expanded{background:var(--ion-color-light-shade, #e9ecef)}.popover-selector-select .selector-trigger.select-expanded .chevron-icon{transform:rotate(180deg);color:var(--ion-color-primary, #3880ff)}.popover-selector-select .selector-trigger[disabled]{opacity:.6;pointer-events:none;background:var(--ion-color-light-tint, #f4f5f8);box-shadow:none;transform:none}.option-content{display:flex;align-items:center;gap:12px;padding:6px 0}.option-content .option-icon{font-size:18px;width:18px;height:18px;opacity:.8;color:var(--ion-color-medium-shade, #808289)}.option-content span{font-weight:500;color:var(--ion-color-dark, #1a1a1a);line-height:1.4}.popover-selector-container.size-small .selector-trigger{min-height:32px;padding:6px 12px;border-radius:18px}.popover-selector-container.size-small .selector-trigger .trigger-text{font-size:12px}.popover-selector-container.size-small .selector-trigger .chevron-icon,.popover-selector-container.size-small .selector-trigger ion-icon[slot=start]{font-size:14px}.popover-selector-container.size-large .selector-trigger{min-height:48px;padding:14px 20px;border-radius:28px}.popover-selector-container.size-large .selector-trigger .trigger-text{font-size:16px}.popover-selector-container.size-large .selector-trigger .chevron-icon,.popover-selector-container.size-large .selector-trigger ion-icon[slot=start]{font-size:18px}@media (max-width: 768px){.popover-selector-container .selector-trigger{min-height:38px;padding:9px 14px}.popover-selector-container .selector-trigger .trigger-text{font-size:13px}}@media (prefers-color-scheme: dark){.popover-selector-container .selector-label{color:var(--ion-color-light, #f4f5f8)}.popover-selector-container .selector-trigger{background:var(--ion-color-dark-tint, #383a3e)}.popover-selector-container .selector-trigger:hover:not([disabled]){background:var(--ion-color-dark-shade, #2f2f2f)}.popover-selector-container .selector-trigger .trigger-text{color:var(--ion-color-light, #f4f5f8)}.popover-selector-container .selector-trigger .chevron-icon,.popover-selector-container .selector-trigger ion-icon[slot=start]{color:var(--ion-color-light-shade, #d7d8da)}.popover-selector-container .selector-trigger.select-expanded{background:var(--ion-color-dark-shade, #2f2f2f)}}ion-select{border-radius:8px;padding:.625rem;border:.125rem solid var(--ion-color-light)!important}\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: 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: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "expandedIcon", "fill", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }] }); }
3887
3887
  }
3888
3888
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverSelectorComponent, decorators: [{
3889
3889
  type: Component,
@@ -3925,7 +3925,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
3925
3925
  </ion-select-option>
3926
3926
  </ion-select>
3927
3927
  </div>
3928
- `, styles: [":root{--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)}@media (prefers-color-scheme: dark){:root{--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)}.popover-selector-container{display:inline-block;width:auto}.popover-selector-container .selector-label{display:block;margin-bottom:8px;font-weight:600;color:var(--ion-color-dark, #1a1a1a)}.popover-selector-select{display:inline-block;width:auto}.popover-selector-select .selector-trigger{--background: transparent;--background-hover: transparent;--background-activated: transparent;--background-focused: transparent;--box-shadow: none;--border-radius: 24px;display:inline-flex;align-items:center;min-width:auto;width:auto;height:auto;min-height:40px;padding:10px 16px;margin:0;background:var(--ion-color-light, #f8f9fa);border:none;border-radius:24px;box-shadow:0 2px 8px #00000014;transition:all .2s ease}.popover-selector-select .selector-trigger:hover:not([disabled]){background:var(--ion-color-light-shade, #e9ecef);transform:translateY(-1px);box-shadow:0 4px 12px #0000001f}.popover-selector-select .selector-trigger:active{transform:translateY(0);box-shadow:0 2px 6px #00000026}.popover-selector-select .selector-trigger:focus-visible{outline:2px solid var(--ion-color-primary, #3880ff);outline-offset:2px}.popover-selector-select .selector-trigger .trigger-text{display:inline-block;margin:0 8px 0 0;font-weight:600;font-size:14px;color:var(--ion-color-dark, #1a1a1a);white-space:nowrap;line-height:1.4}.popover-selector-select .selector-trigger .chevron-icon{font-size:16px;color:var(--ion-color-medium, #92949c);transition:transform .2s ease;margin-left:4px}.popover-selector-select .selector-trigger ion-icon[slot=start]{margin-right:8px;font-size:16px;color:var(--ion-color-medium-shade, #808289)}.popover-selector-select .selector-trigger.select-expanded{background:var(--ion-color-light-shade, #e9ecef)}.popover-selector-select .selector-trigger.select-expanded .chevron-icon{transform:rotate(180deg);color:var(--ion-color-primary, #3880ff)}.popover-selector-select .selector-trigger[disabled]{opacity:.6;pointer-events:none;background:var(--ion-color-light-tint, #f4f5f8);box-shadow:none;transform:none}.option-content{display:flex;align-items:center;gap:12px;padding:6px 0}.option-content .option-icon{font-size:18px;width:18px;height:18px;opacity:.8;color:var(--ion-color-medium-shade, #808289)}.option-content span{font-weight:500;color:var(--ion-color-dark, #1a1a1a);line-height:1.4}.popover-selector-container.size-small .selector-trigger{min-height:32px;padding:6px 12px;border-radius:18px}.popover-selector-container.size-small .selector-trigger .trigger-text{font-size:12px}.popover-selector-container.size-small .selector-trigger .chevron-icon,.popover-selector-container.size-small .selector-trigger ion-icon[slot=start]{font-size:14px}.popover-selector-container.size-large .selector-trigger{min-height:48px;padding:14px 20px;border-radius:28px}.popover-selector-container.size-large .selector-trigger .trigger-text{font-size:16px}.popover-selector-container.size-large .selector-trigger .chevron-icon,.popover-selector-container.size-large .selector-trigger ion-icon[slot=start]{font-size:18px}@media (max-width: 768px){.popover-selector-container .selector-trigger{min-height:38px;padding:9px 14px}.popover-selector-container .selector-trigger .trigger-text{font-size:13px}}@media (prefers-color-scheme: dark){.popover-selector-container .selector-label{color:var(--ion-color-light, #f4f5f8)}.popover-selector-container .selector-trigger{background:var(--ion-color-dark-tint, #383a3e)}.popover-selector-container .selector-trigger:hover:not([disabled]){background:var(--ion-color-dark-shade, #2f2f2f)}.popover-selector-container .selector-trigger .trigger-text{color:var(--ion-color-light, #f4f5f8)}.popover-selector-container .selector-trigger .chevron-icon,.popover-selector-container .selector-trigger ion-icon[slot=start]{color:var(--ion-color-light-shade, #d7d8da)}.popover-selector-container .selector-trigger.select-expanded{background:var(--ion-color-dark-shade, #2f2f2f)}}ion-select{border-radius:8px;padding:4px;border:.125rem solid var(--ion-color-light)!important}\n"] }]
3928
+ `, styles: [":root{--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)}@media (prefers-color-scheme: dark){:root{--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)}.popover-selector-container{display:inline-block;width:auto}.popover-selector-container .selector-label{display:block;margin-bottom:8px;font-weight:600;color:var(--ion-color-dark, #1a1a1a)}.popover-selector-select{display:inline-block;width:auto}.popover-selector-select .selector-trigger{--background: transparent;--background-hover: transparent;--background-activated: transparent;--background-focused: transparent;--box-shadow: none;--border-radius: 24px;display:inline-flex;align-items:center;min-width:auto;width:auto;height:auto;min-height:40px;padding:10px 16px;margin:0;background:var(--ion-color-light, #f8f9fa);border:none;border-radius:24px;box-shadow:0 2px 8px #00000014;transition:all .2s ease}.popover-selector-select .selector-trigger:hover:not([disabled]){background:var(--ion-color-light-shade, #e9ecef);transform:translateY(-1px);box-shadow:0 4px 12px #0000001f}.popover-selector-select .selector-trigger:active{transform:translateY(0);box-shadow:0 2px 6px #00000026}.popover-selector-select .selector-trigger:focus-visible{outline:2px solid var(--ion-color-primary, #3880ff);outline-offset:2px}.popover-selector-select .selector-trigger .trigger-text{display:inline-block;margin:0 8px 0 0;font-weight:600;font-size:14px;color:var(--ion-color-dark, #1a1a1a);white-space:nowrap;line-height:1.4}.popover-selector-select .selector-trigger .chevron-icon{font-size:16px;color:var(--ion-color-medium, #92949c);transition:transform .2s ease;margin-left:4px}.popover-selector-select .selector-trigger ion-icon[slot=start]{margin-right:8px;font-size:16px;color:var(--ion-color-medium-shade, #808289)}.popover-selector-select .selector-trigger.select-expanded{background:var(--ion-color-light-shade, #e9ecef)}.popover-selector-select .selector-trigger.select-expanded .chevron-icon{transform:rotate(180deg);color:var(--ion-color-primary, #3880ff)}.popover-selector-select .selector-trigger[disabled]{opacity:.6;pointer-events:none;background:var(--ion-color-light-tint, #f4f5f8);box-shadow:none;transform:none}.option-content{display:flex;align-items:center;gap:12px;padding:6px 0}.option-content .option-icon{font-size:18px;width:18px;height:18px;opacity:.8;color:var(--ion-color-medium-shade, #808289)}.option-content span{font-weight:500;color:var(--ion-color-dark, #1a1a1a);line-height:1.4}.popover-selector-container.size-small .selector-trigger{min-height:32px;padding:6px 12px;border-radius:18px}.popover-selector-container.size-small .selector-trigger .trigger-text{font-size:12px}.popover-selector-container.size-small .selector-trigger .chevron-icon,.popover-selector-container.size-small .selector-trigger ion-icon[slot=start]{font-size:14px}.popover-selector-container.size-large .selector-trigger{min-height:48px;padding:14px 20px;border-radius:28px}.popover-selector-container.size-large .selector-trigger .trigger-text{font-size:16px}.popover-selector-container.size-large .selector-trigger .chevron-icon,.popover-selector-container.size-large .selector-trigger ion-icon[slot=start]{font-size:18px}@media (max-width: 768px){.popover-selector-container .selector-trigger{min-height:38px;padding:9px 14px}.popover-selector-container .selector-trigger .trigger-text{font-size:13px}}@media (prefers-color-scheme: dark){.popover-selector-container .selector-label{color:var(--ion-color-light, #f4f5f8)}.popover-selector-container .selector-trigger{background:var(--ion-color-dark-tint, #383a3e)}.popover-selector-container .selector-trigger:hover:not([disabled]){background:var(--ion-color-dark-shade, #2f2f2f)}.popover-selector-container .selector-trigger .trigger-text{color:var(--ion-color-light, #f4f5f8)}.popover-selector-container .selector-trigger .chevron-icon,.popover-selector-container .selector-trigger ion-icon[slot=start]{color:var(--ion-color-light-shade, #d7d8da)}.popover-selector-container .selector-trigger.select-expanded{background:var(--ion-color-dark-shade, #2f2f2f)}}ion-select{border-radius:8px;padding:.625rem;border:.125rem solid var(--ion-color-light)!important}\n"] }]
3929
3929
  }], ctorParameters: () => [], propDecorators: { props: [{
3930
3930
  type: Input
3931
3931
  }], selectionChange: [{
@@ -4059,12 +4059,13 @@ class LanguageSelectorComponent {
4059
4059
  }
4060
4060
  }
4061
4061
  initializePopoverProps() {
4062
- // Subscribe to language state changes to update popover props
4063
- const languageSubscription = this.availableLanguages$.subscribe(availableLanguages => {
4064
- const currentLanguageSubscription = this.currentLanguage$.subscribe(currentLanguage => {
4065
- this.updatePopoverProps(availableLanguages, currentLanguage);
4066
- });
4067
- this.subscriptions.add(currentLanguageSubscription);
4062
+ // Subscribe to language state changes and content changes to update popover props
4063
+ const languageSubscription = combineLatest([
4064
+ this.availableLanguages$,
4065
+ this.currentLanguage$,
4066
+ this.langService.currentLang$, // This will trigger updates when language changes
4067
+ ]).subscribe(([availableLanguages, currentLanguage]) => {
4068
+ this.updatePopoverProps(availableLanguages, currentLanguage);
4068
4069
  });
4069
4070
  this.subscriptions.add(languageSubscription);
4070
4071
  // Subscribe to label changes
@@ -4106,12 +4107,22 @@ class LanguageSelectorComponent {
4106
4107
  };
4107
4108
  }
4108
4109
  getLanguageDisplayName(languageCode) {
4109
- // Use custom names if provided, otherwise use defaults, otherwise use the code itself
4110
- const customName = this.props.customLanguageNames?.[languageCode];
4111
- const defaultName = this.defaultLanguageNames[languageCode];
4110
+ // Use custom names if provided
4111
+ if (this.props.customLanguageNames?.[languageCode]) {
4112
+ const customName = this.props.customLanguageNames[languageCode];
4113
+ const flag = this.props.showFlags ? this.defaultLanguageFlags[languageCode] : '';
4114
+ return flag ? `${flag} ${customName}` : customName;
4115
+ }
4116
+ // Use reactive content for translated language names
4117
+ // Note: This will use the current language since getLanguageDisplayName is called during subscription updates
4118
+ const translatedName = this.langService.getText('_global', `languageName_${languageCode}`);
4112
4119
  const flag = this.props.showFlags ? this.defaultLanguageFlags[languageCode] : '';
4113
- const displayName = customName || defaultName || languageCode.toUpperCase();
4114
- return flag ? `${flag} ${displayName}` : displayName;
4120
+ if (translatedName && translatedName !== `languageName_${languageCode}`) {
4121
+ return flag ? `${flag} ${translatedName}` : translatedName;
4122
+ }
4123
+ // Fallback to default names, then to code
4124
+ const defaultName = this.defaultLanguageNames[languageCode] || languageCode.toUpperCase();
4125
+ return flag ? `${flag} ${defaultName}` : defaultName;
4115
4126
  }
4116
4127
  /**
4117
4128
  * Handle language selection change.
@@ -8906,6 +8917,492 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
8906
8917
  `, styles: [".multi-lang-demo{padding:20px;max-width:800px}.language-info,.content-examples,.warning-info,.component-analysis{margin:20px 0;padding:15px;border:1px solid var(--ion-color-light, #f4f5f8);border-radius:8px;background:var(--ion-color-light-tint, #f5f6f9)}.button-group{display:flex;gap:10px;flex-wrap:wrap}.button-group button{padding:8px 16px;border:1px solid var(--ion-color-primary, #3880ff);background:#fff;color:var(--ion-color-primary, #3880ff);border-radius:4px;cursor:pointer;transition:all .2s}.button-group button:hover{background:var(--ion-color-primary-tint, #4992ff);color:#fff}.button-group button.active{background:var(--ion-color-primary, #3880ff);color:#fff}.example-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px;margin-top:10px}.analysis-results{margin-top:10px;padding:10px;background:#fff;border-radius:4px}h2{color:var(--ion-color-primary, #3880ff)}h3{color:var(--ion-color-dark, #222428);margin-bottom:10px}\n"] }]
8907
8918
  }], ctorParameters: () => [{ type: ContentService }, { type: LangService }] });
8908
8919
 
8920
+ /**
8921
+ * Simple demo component showcasing reactive content patterns
8922
+ * for buttons and alert boxes.
8923
+ *
8924
+ * Demonstrates:
8925
+ * - Button components with reactive text
8926
+ * - Alert boxes with reactive content
8927
+ * - Language switching
8928
+ * - Static vs reactive content patterns
8929
+ */
8930
+ class ReactiveComponentsDemoComponent {
8931
+ constructor(contentService, langService) {
8932
+ this.contentService = contentService;
8933
+ this.langService = langService;
8934
+ this.subscriptions = new Subscription();
8935
+ }
8936
+ ngOnInit() {
8937
+ this.initializeContent();
8938
+ this.initializeComponents();
8939
+ }
8940
+ ngOnDestroy() {
8941
+ this.subscriptions.unsubscribe();
8942
+ }
8943
+ initializeContent() {
8944
+ // Page-level content
8945
+ this.pageTitle$ = this.contentService.fromContent({
8946
+ className: 'reactiveDemo',
8947
+ key: 'title',
8948
+ fallback: 'Reactive Components Demo',
8949
+ });
8950
+ this.languageLabel$ = this.contentService.fromContent({
8951
+ className: '_global',
8952
+ key: 'language',
8953
+ fallback: 'Language',
8954
+ });
8955
+ this.buttonSectionTitle$ = this.contentService.fromContent({
8956
+ className: 'reactiveDemo',
8957
+ key: 'buttons.title',
8958
+ fallback: 'Reactive Buttons',
8959
+ });
8960
+ this.alertSectionTitle$ = this.contentService.fromContent({
8961
+ className: 'reactiveDemo',
8962
+ key: 'alerts.title',
8963
+ fallback: 'Reactive Alerts',
8964
+ });
8965
+ // Language state
8966
+ this.currentLanguage$ = this.langService.currentLang$;
8967
+ this.availableLanguages$ = this.langService.currentLang$.pipe(map(() => this.langService.availableLangs));
8968
+ }
8969
+ initializeComponents() {
8970
+ // Reactive buttons with common actions
8971
+ this.saveButton = {
8972
+ color: 'primary',
8973
+ fill: 'solid',
8974
+ type: 'button',
8975
+ state: ComponentStates.ENABLED,
8976
+ textConfig: {
8977
+ className: '_global',
8978
+ key: 'save',
8979
+ fallback: 'Save',
8980
+ },
8981
+ handler: () => this.handleSave(),
8982
+ };
8983
+ this.cancelButton = {
8984
+ color: 'medium',
8985
+ fill: 'outline',
8986
+ type: 'button',
8987
+ state: ComponentStates.ENABLED,
8988
+ textConfig: {
8989
+ className: '_global',
8990
+ key: 'cancel',
8991
+ fallback: 'Cancel',
8992
+ },
8993
+ handler: () => this.handleCancel(),
8994
+ };
8995
+ // Static button for comparison
8996
+ this.staticButton = {
8997
+ color: 'tertiary',
8998
+ fill: 'outline',
8999
+ type: 'button',
9000
+ state: ComponentStates.ENABLED,
9001
+ text: 'Static Button', // Static text
9002
+ handler: () => this.handleStatic(),
9003
+ };
9004
+ // Reactive alert boxes
9005
+ this.warningAlert = {
9006
+ box: {
9007
+ color: 'warning',
9008
+ rounded: true,
9009
+ bordered: false,
9010
+ icon: 'warning',
9011
+ },
9012
+ icon: {
9013
+ name: 'warning',
9014
+ color: 'warning',
9015
+ size: 'medium',
9016
+ },
9017
+ textConfig: {
9018
+ className: 'reactiveDemo',
9019
+ key: 'alerts.warning',
9020
+ fallback: 'This is a warning message',
9021
+ },
9022
+ textStyle: {
9023
+ size: 'medium',
9024
+ bold: false,
9025
+ },
9026
+ };
9027
+ this.successAlert = {
9028
+ box: {
9029
+ color: 'success',
9030
+ rounded: true,
9031
+ bordered: false,
9032
+ icon: 'checkmark-circle',
9033
+ },
9034
+ icon: {
9035
+ name: 'checkmark-circle',
9036
+ color: 'success',
9037
+ size: 'medium',
9038
+ },
9039
+ textConfig: {
9040
+ className: 'reactiveDemo',
9041
+ key: 'alerts.success',
9042
+ fallback: 'Operation completed successfully!',
9043
+ },
9044
+ textStyle: {
9045
+ size: 'medium',
9046
+ bold: true,
9047
+ },
9048
+ };
9049
+ // Static alert for comparison
9050
+ this.staticAlert = {
9051
+ box: {
9052
+ color: 'dark',
9053
+ rounded: true,
9054
+ bordered: false,
9055
+ icon: 'information-circle',
9056
+ },
9057
+ icon: {
9058
+ name: 'information-circle',
9059
+ color: 'dark',
9060
+ size: 'medium',
9061
+ },
9062
+ text: 'This is a static alert message', // Static text
9063
+ textStyle: {
9064
+ size: 'medium',
9065
+ bold: false,
9066
+ },
9067
+ };
9068
+ }
9069
+ // Event handlers
9070
+ changeLanguage(language) {
9071
+ this.langService.setLang(language);
9072
+ }
9073
+ handleSave() {
9074
+ console.log('Save button clicked');
9075
+ }
9076
+ handleCancel() {
9077
+ console.log('Cancel button clicked');
9078
+ }
9079
+ handleStatic() {
9080
+ console.log('Static button clicked');
9081
+ }
9082
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactiveComponentsDemoComponent, deps: [{ token: ContentService }, { token: LangService }], target: i0.ɵɵFactoryTarget.Component }); }
9083
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ReactiveComponentsDemoComponent, isStandalone: true, selector: "val-reactive-components-demo", ngImport: i0, template: `
9084
+ <div class="reactive-components-demo">
9085
+ <ion-card>
9086
+ <ion-card-header>
9087
+ <ion-card-title>{{ pageTitle$ | async }}</ion-card-title>
9088
+ </ion-card-header>
9089
+
9090
+ <ion-card-content>
9091
+ <!-- Language Selector -->
9092
+ <ion-item>
9093
+ <ion-label>{{ languageLabel$ | async }}</ion-label>
9094
+ <ion-select
9095
+ interface="popover"
9096
+ [value]="currentLanguage$ | async"
9097
+ (ionChange)="changeLanguage($event.detail.value)"
9098
+ >
9099
+ <ion-select-option *ngFor="let lang of availableLanguages$ | async" [value]="lang">
9100
+ {{ lang | uppercase }}
9101
+ </ion-select-option>
9102
+ </ion-select>
9103
+ </ion-item>
9104
+
9105
+ <!-- Reactive Buttons Demo -->
9106
+ <div class="section">
9107
+ <h3>{{ buttonSectionTitle$ | async }}</h3>
9108
+
9109
+ <!-- Common action buttons with reactive text -->
9110
+ <div class="button-grid">
9111
+ <val-button [props]="saveButton"></val-button>
9112
+ <val-button [props]="cancelButton"></val-button>
9113
+ <val-button [props]="staticButton"></val-button>
9114
+ </div>
9115
+ </div>
9116
+
9117
+ <!-- Reactive Alert Boxes Demo -->
9118
+ <div class="section">
9119
+ <h3>{{ alertSectionTitle$ | async }}</h3>
9120
+
9121
+ <!-- Alert with reactive content -->
9122
+ <val-alert-box [props]="warningAlert"></val-alert-box>
9123
+ <val-alert-box [props]="successAlert"></val-alert-box>
9124
+ <val-alert-box [props]="staticAlert"></val-alert-box>
9125
+ </div>
9126
+
9127
+ <!-- Analysis -->
9128
+ <div class="section">
9129
+ <h3>Analysis</h3>
9130
+ <div class="analysis-info">
9131
+ <p><strong>Current Language:</strong> {{ currentLanguage$ | async | uppercase }}</p>
9132
+ <p><strong>Available Languages:</strong> {{ (availableLanguages$ | async)?.join(', ') | uppercase }}</p>
9133
+ </div>
9134
+ </div>
9135
+ </ion-card-content>
9136
+ </ion-card>
9137
+ </div>
9138
+ `, isInline: true, styles: [".reactive-components-demo{padding:16px}.section{margin:24px 0}.button-grid{display:flex;gap:12px;flex-wrap:wrap;margin:16px 0}.analysis-info{background:var(--ion-color-light);padding:16px;border-radius:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "expandedIcon", "fill", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "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: ButtonComponent, selector: "val-button", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: AlertBoxComponent, selector: "val-alert-box", inputs: ["props"] }] }); }
9139
+ }
9140
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactiveComponentsDemoComponent, decorators: [{
9141
+ type: Component,
9142
+ args: [{ selector: 'val-reactive-components-demo', standalone: true, imports: [
9143
+ CommonModule,
9144
+ IonCard,
9145
+ IonCardContent,
9146
+ IonCardHeader,
9147
+ IonCardTitle,
9148
+ IonSelect,
9149
+ IonSelectOption,
9150
+ IonItem,
9151
+ IonLabel,
9152
+ ButtonComponent,
9153
+ AlertBoxComponent,
9154
+ ], template: `
9155
+ <div class="reactive-components-demo">
9156
+ <ion-card>
9157
+ <ion-card-header>
9158
+ <ion-card-title>{{ pageTitle$ | async }}</ion-card-title>
9159
+ </ion-card-header>
9160
+
9161
+ <ion-card-content>
9162
+ <!-- Language Selector -->
9163
+ <ion-item>
9164
+ <ion-label>{{ languageLabel$ | async }}</ion-label>
9165
+ <ion-select
9166
+ interface="popover"
9167
+ [value]="currentLanguage$ | async"
9168
+ (ionChange)="changeLanguage($event.detail.value)"
9169
+ >
9170
+ <ion-select-option *ngFor="let lang of availableLanguages$ | async" [value]="lang">
9171
+ {{ lang | uppercase }}
9172
+ </ion-select-option>
9173
+ </ion-select>
9174
+ </ion-item>
9175
+
9176
+ <!-- Reactive Buttons Demo -->
9177
+ <div class="section">
9178
+ <h3>{{ buttonSectionTitle$ | async }}</h3>
9179
+
9180
+ <!-- Common action buttons with reactive text -->
9181
+ <div class="button-grid">
9182
+ <val-button [props]="saveButton"></val-button>
9183
+ <val-button [props]="cancelButton"></val-button>
9184
+ <val-button [props]="staticButton"></val-button>
9185
+ </div>
9186
+ </div>
9187
+
9188
+ <!-- Reactive Alert Boxes Demo -->
9189
+ <div class="section">
9190
+ <h3>{{ alertSectionTitle$ | async }}</h3>
9191
+
9192
+ <!-- Alert with reactive content -->
9193
+ <val-alert-box [props]="warningAlert"></val-alert-box>
9194
+ <val-alert-box [props]="successAlert"></val-alert-box>
9195
+ <val-alert-box [props]="staticAlert"></val-alert-box>
9196
+ </div>
9197
+
9198
+ <!-- Analysis -->
9199
+ <div class="section">
9200
+ <h3>Analysis</h3>
9201
+ <div class="analysis-info">
9202
+ <p><strong>Current Language:</strong> {{ currentLanguage$ | async | uppercase }}</p>
9203
+ <p><strong>Available Languages:</strong> {{ (availableLanguages$ | async)?.join(', ') | uppercase }}</p>
9204
+ </div>
9205
+ </div>
9206
+ </ion-card-content>
9207
+ </ion-card>
9208
+ </div>
9209
+ `, styles: [".reactive-components-demo{padding:16px}.section{margin:24px 0}.button-grid{display:flex;gap:12px;flex-wrap:wrap;margin:16px 0}.analysis-info{background:var(--ion-color-light);padding:16px;border-radius:8px}\n"] }]
9210
+ }], ctorParameters: () => [{ type: ContentService }, { type: LangService }] });
9211
+
9212
+ /**
9213
+ * Test component to diagnose reactive content behavior.
9214
+ * Compares fromContent vs fromMultipleContent reactivity.
9215
+ */
9216
+ class ReactivityTestComponent {
9217
+ constructor() {
9218
+ this.contentService = inject(ContentService);
9219
+ this.langService = inject(LangService);
9220
+ // Observable for current language
9221
+ this.currentLang$ = this.langService.currentLang$;
9222
+ // Single key content observables (using fromContent)
9223
+ this.singleWelcome$ = this.contentService.fromContent({
9224
+ className: 'testReactivity',
9225
+ key: 'welcomeMessage',
9226
+ fallback: 'Welcome',
9227
+ });
9228
+ this.singleSave$ = this.contentService.fromContent({
9229
+ className: 'testReactivity',
9230
+ key: 'saveButton',
9231
+ fallback: 'Save',
9232
+ });
9233
+ this.singleCancel$ = this.contentService.fromContent({
9234
+ className: 'testReactivity',
9235
+ key: 'cancelButton',
9236
+ fallback: 'Cancel',
9237
+ });
9238
+ // Multiple keys content observable (using fromMultipleContent)
9239
+ this.multipleContent$ = this.contentService.fromMultipleContent('testReactivity', [
9240
+ 'welcomeMessage',
9241
+ 'saveButton',
9242
+ 'cancelButton',
9243
+ ]);
9244
+ // Direct LangService tests
9245
+ this.directSingle$ = this.langService.getContent('testReactivity', 'welcomeMessage', 'Welcome');
9246
+ this.directMultiple$ = this.langService.getMultipleContent('testReactivity', ['welcomeMessage']);
9247
+ // Update counters
9248
+ this.singleUpdateCount = 0;
9249
+ this.multipleUpdateCount = 0;
9250
+ this.directSingleUpdateCount = 0;
9251
+ this.directMultipleUpdateCount = 0;
9252
+ }
9253
+ ngOnInit() {
9254
+ // Subscribe to observables to count updates
9255
+ this.singleWelcome$.subscribe(() => {
9256
+ this.singleUpdateCount++;
9257
+ console.log('Single key updated:', this.singleUpdateCount);
9258
+ });
9259
+ this.multipleContent$.subscribe(() => {
9260
+ this.multipleUpdateCount++;
9261
+ console.log('Multiple keys updated:', this.multipleUpdateCount);
9262
+ });
9263
+ this.directSingle$.subscribe(() => {
9264
+ this.directSingleUpdateCount++;
9265
+ console.log('Direct single updated:', this.directSingleUpdateCount);
9266
+ });
9267
+ this.directMultiple$.subscribe(() => {
9268
+ this.directMultipleUpdateCount++;
9269
+ console.log('Direct multiple updated:', this.directMultipleUpdateCount);
9270
+ });
9271
+ }
9272
+ switchToSpanish() {
9273
+ this.langService.setLang('es');
9274
+ }
9275
+ switchToEnglish() {
9276
+ this.langService.setLang('en');
9277
+ }
9278
+ switchToFrench() {
9279
+ this.langService.setLang('fr');
9280
+ }
9281
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactivityTestComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9282
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ReactivityTestComponent, isStandalone: true, selector: "val-reactivity-test", ngImport: i0, template: `
9283
+ <div style="padding: 20px; border: 1px solid #ccc; margin: 10px;">
9284
+ <h3>Reactivity Test Component</h3>
9285
+
9286
+ <!-- Current Language -->
9287
+ <div style="margin-bottom: 20px;"><strong>Current Language:</strong> {{ currentLang$ | async }}</div>
9288
+
9289
+ <!-- Language Switch Buttons -->
9290
+ <div style="margin-bottom: 20px;">
9291
+ <button (click)="switchToSpanish()" style="margin-right: 10px;">Switch to ES</button>
9292
+ <button (click)="switchToEnglish()" style="margin-right: 10px;">Switch to EN</button>
9293
+ <button (click)="switchToFrench()">Switch to FR</button>
9294
+ </div>
9295
+
9296
+ <!-- Single Key Tests -->
9297
+ <div style="margin-bottom: 20px;">
9298
+ <h4>Single Key Tests (fromContent)</h4>
9299
+ <div><strong>welcomeMessage (fromContent):</strong> {{ singleWelcome$ | async }}</div>
9300
+ <div><strong>saveButton (fromContent):</strong> {{ singleSave$ | async }}</div>
9301
+ <div><strong>cancelButton (fromContent):</strong> {{ singleCancel$ | async }}</div>
9302
+ </div>
9303
+
9304
+ <!-- Multiple Keys Test -->
9305
+ <div style="margin-bottom: 20px;">
9306
+ <h4>Multiple Keys Test (fromMultipleContent)</h4>
9307
+ <div>
9308
+ <strong>welcomeMessage (multiple):</strong>
9309
+ {{ (multipleContent$ | async)?.['welcomeMessage'] || 'Loading...' }}
9310
+ </div>
9311
+ <div>
9312
+ <strong>saveButton (multiple):</strong> {{ (multipleContent$ | async)?.['saveButton'] || 'Loading...' }}
9313
+ </div>
9314
+ <div>
9315
+ <strong>cancelButton (multiple):</strong> {{ (multipleContent$ | async)?.['cancelButton'] || 'Loading...' }}
9316
+ </div>
9317
+ </div>
9318
+
9319
+ <!-- Direct LangService Tests -->
9320
+ <div style="margin-bottom: 20px;">
9321
+ <h4>Direct LangService Tests</h4>
9322
+ <div><strong>welcomeMessage (direct single):</strong> {{ directSingle$ | async }}</div>
9323
+ <div>
9324
+ <strong>welcomeMessage (direct multiple):</strong>
9325
+ {{ (directMultiple$ | async)?.['welcomeMessage'] || 'Loading...' }}
9326
+ </div>
9327
+ </div>
9328
+
9329
+ <!-- Update Counter -->
9330
+ <div>
9331
+ <h4>Update Counters</h4>
9332
+ <div><strong>Single key updates:</strong> {{ singleUpdateCount }}</div>
9333
+ <div><strong>Multiple keys updates:</strong> {{ multipleUpdateCount }}</div>
9334
+ <div><strong>Direct single updates:</strong> {{ directSingleUpdateCount }}</div>
9335
+ <div><strong>Direct multiple updates:</strong> {{ directMultipleUpdateCount }}</div>
9336
+ </div>
9337
+ </div>
9338
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] }); }
9339
+ }
9340
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactivityTestComponent, decorators: [{
9341
+ type: Component,
9342
+ args: [{
9343
+ selector: 'val-reactivity-test',
9344
+ standalone: true,
9345
+ imports: [CommonModule],
9346
+ template: `
9347
+ <div style="padding: 20px; border: 1px solid #ccc; margin: 10px;">
9348
+ <h3>Reactivity Test Component</h3>
9349
+
9350
+ <!-- Current Language -->
9351
+ <div style="margin-bottom: 20px;"><strong>Current Language:</strong> {{ currentLang$ | async }}</div>
9352
+
9353
+ <!-- Language Switch Buttons -->
9354
+ <div style="margin-bottom: 20px;">
9355
+ <button (click)="switchToSpanish()" style="margin-right: 10px;">Switch to ES</button>
9356
+ <button (click)="switchToEnglish()" style="margin-right: 10px;">Switch to EN</button>
9357
+ <button (click)="switchToFrench()">Switch to FR</button>
9358
+ </div>
9359
+
9360
+ <!-- Single Key Tests -->
9361
+ <div style="margin-bottom: 20px;">
9362
+ <h4>Single Key Tests (fromContent)</h4>
9363
+ <div><strong>welcomeMessage (fromContent):</strong> {{ singleWelcome$ | async }}</div>
9364
+ <div><strong>saveButton (fromContent):</strong> {{ singleSave$ | async }}</div>
9365
+ <div><strong>cancelButton (fromContent):</strong> {{ singleCancel$ | async }}</div>
9366
+ </div>
9367
+
9368
+ <!-- Multiple Keys Test -->
9369
+ <div style="margin-bottom: 20px;">
9370
+ <h4>Multiple Keys Test (fromMultipleContent)</h4>
9371
+ <div>
9372
+ <strong>welcomeMessage (multiple):</strong>
9373
+ {{ (multipleContent$ | async)?.['welcomeMessage'] || 'Loading...' }}
9374
+ </div>
9375
+ <div>
9376
+ <strong>saveButton (multiple):</strong> {{ (multipleContent$ | async)?.['saveButton'] || 'Loading...' }}
9377
+ </div>
9378
+ <div>
9379
+ <strong>cancelButton (multiple):</strong> {{ (multipleContent$ | async)?.['cancelButton'] || 'Loading...' }}
9380
+ </div>
9381
+ </div>
9382
+
9383
+ <!-- Direct LangService Tests -->
9384
+ <div style="margin-bottom: 20px;">
9385
+ <h4>Direct LangService Tests</h4>
9386
+ <div><strong>welcomeMessage (direct single):</strong> {{ directSingle$ | async }}</div>
9387
+ <div>
9388
+ <strong>welcomeMessage (direct multiple):</strong>
9389
+ {{ (directMultiple$ | async)?.['welcomeMessage'] || 'Loading...' }}
9390
+ </div>
9391
+ </div>
9392
+
9393
+ <!-- Update Counter -->
9394
+ <div>
9395
+ <h4>Update Counters</h4>
9396
+ <div><strong>Single key updates:</strong> {{ singleUpdateCount }}</div>
9397
+ <div><strong>Multiple keys updates:</strong> {{ multipleUpdateCount }}</div>
9398
+ <div><strong>Direct single updates:</strong> {{ directSingleUpdateCount }}</div>
9399
+ <div><strong>Direct multiple updates:</strong> {{ directMultipleUpdateCount }}</div>
9400
+ </div>
9401
+ </div>
9402
+ `,
9403
+ }]
9404
+ }] });
9405
+
8909
9406
  /**
8910
9407
  * Ejemplo de uso de los componentes popover-selector y language-selector
8911
9408
  */
@@ -8957,7 +9454,9 @@ class SelectorExamplesComponent {
8957
9454
  fill: 'outline',
8958
9455
  showCheckmark: true,
8959
9456
  };
8960
- // ✅ Ejemplos de Language Selector
9457
+ // ✅ Ejemplos de Language Selector (con soporte multiidioma)
9458
+ // Los nombres de idiomas se obtienen automáticamente del sistema de contenido
9459
+ // y se muestran traducidos según el idioma actual de la aplicación
8961
9460
  this.basicLanguageSelector = {
8962
9461
  showLabel: true,
8963
9462
  label: 'Idioma',
@@ -8965,6 +9464,7 @@ class SelectorExamplesComponent {
8965
9464
  size: 'default',
8966
9465
  fill: 'outline',
8967
9466
  };
9467
+ // Con banderas y nombres traducidos automáticamente
8968
9468
  this.flagLanguageSelector = {
8969
9469
  showLabel: true,
8970
9470
  label: 'Language / Idioma',
@@ -8973,6 +9473,7 @@ class SelectorExamplesComponent {
8973
9473
  size: 'large',
8974
9474
  fill: 'solid',
8975
9475
  };
9476
+ // Con nombres personalizados (sobrescribe las traducciones automáticas)
8976
9477
  this.customLanguageSelector = {
8977
9478
  showLabel: true,
8978
9479
  labelConfig: {
@@ -8992,6 +9493,14 @@ class SelectorExamplesComponent {
8992
9493
  de: 'Deutsch',
8993
9494
  },
8994
9495
  };
9496
+ // Compacto sin etiqueta, solo banderas y nombres traducidos
9497
+ this.compactLanguageSelector = {
9498
+ showLabel: false,
9499
+ showFlags: true,
9500
+ color: 'tertiary',
9501
+ size: 'small',
9502
+ fill: 'clear',
9503
+ };
8995
9504
  }
8996
9505
  // ✅ Event Handlers
8997
9506
  onCategoryChange(category) {
@@ -9004,7 +9513,9 @@ class SelectorExamplesComponent {
9004
9513
  console.log('Notifications changed:', notifications);
9005
9514
  }
9006
9515
  onLanguageChange(language) {
9007
- console.log('Language changed:', language);
9516
+ console.log('Language changed to:', language);
9517
+ // La aplicación automáticamente actualizará todos los nombres de idiomas
9518
+ // según la nueva configuración de idioma seleccionada
9008
9519
  }
9009
9520
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectorExamplesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9010
9521
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SelectorExamplesComponent, isStandalone: true, selector: "app-selector-examples", ngImport: i0, template: `
@@ -9036,23 +9547,29 @@ class SelectorExamplesComponent {
9036
9547
 
9037
9548
  <!-- Language Selector -->
9038
9549
  <div class="section">
9039
- <h3>Selector de Idioma</h3>
9550
+ <h3>Selector de Idioma (Multiidioma)</h3>
9551
+ <p>Los nombres de idiomas se muestran traducidos según el idioma actual:</p>
9040
9552
 
9041
9553
  <div class="example-group">
9042
- <h4>Selector Básico:</h4>
9554
+ <h4>Selector Básico (nombres traducidos):</h4>
9043
9555
  <val-language-selector [props]="basicLanguageSelector"> </val-language-selector>
9044
9556
  </div>
9045
9557
 
9046
9558
  <div class="example-group">
9047
- <h4>Selector con Banderas:</h4>
9559
+ <h4>Selector con Banderas (nombres traducidos):</h4>
9048
9560
  <val-language-selector [props]="flagLanguageSelector"> </val-language-selector>
9049
9561
  </div>
9050
9562
 
9051
9563
  <div class="example-group">
9052
- <h4>Selector Personalizado:</h4>
9564
+ <h4>Selector Personalizado (nombres propios):</h4>
9053
9565
  <val-language-selector [props]="customLanguageSelector" (languageChange)="onLanguageChange($event)">
9054
9566
  </val-language-selector>
9055
9567
  </div>
9568
+
9569
+ <div class="example-group">
9570
+ <h4>Selector Compacto:</h4>
9571
+ <val-language-selector [props]="compactLanguageSelector"> </val-language-selector>
9572
+ </div>
9056
9573
  </div>
9057
9574
  </div>
9058
9575
  `, isInline: true, styles: [".selector-examples{padding:20px;max-width:800px;margin:0 auto}.section{margin:30px 0;padding:20px;border:1px solid var(--ion-color-light);border-radius:8px;background:var(--ion-color-step-50)}.section h3{margin:0 0 20px;color:var(--ion-color-primary)}.example-group{margin:20px 0;padding:15px;background:#fff;border-radius:8px;box-shadow:0 2px 4px #0000001a}.example-group h4{margin:0 0 15px;color:var(--ion-color-medium)}\n"], dependencies: [{ kind: "component", type: PopoverSelectorComponent, selector: "val-popover-selector", inputs: ["props"], outputs: ["selectionChange"] }, { kind: "component", type: LanguageSelectorComponent, selector: "val-language-selector", inputs: ["props"], outputs: ["languageChange"] }] }); }
@@ -9088,23 +9605,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
9088
9605
 
9089
9606
  <!-- Language Selector -->
9090
9607
  <div class="section">
9091
- <h3>Selector de Idioma</h3>
9608
+ <h3>Selector de Idioma (Multiidioma)</h3>
9609
+ <p>Los nombres de idiomas se muestran traducidos según el idioma actual:</p>
9092
9610
 
9093
9611
  <div class="example-group">
9094
- <h4>Selector Básico:</h4>
9612
+ <h4>Selector Básico (nombres traducidos):</h4>
9095
9613
  <val-language-selector [props]="basicLanguageSelector"> </val-language-selector>
9096
9614
  </div>
9097
9615
 
9098
9616
  <div class="example-group">
9099
- <h4>Selector con Banderas:</h4>
9617
+ <h4>Selector con Banderas (nombres traducidos):</h4>
9100
9618
  <val-language-selector [props]="flagLanguageSelector"> </val-language-selector>
9101
9619
  </div>
9102
9620
 
9103
9621
  <div class="example-group">
9104
- <h4>Selector Personalizado:</h4>
9622
+ <h4>Selector Personalizado (nombres propios):</h4>
9105
9623
  <val-language-selector [props]="customLanguageSelector" (languageChange)="onLanguageChange($event)">
9106
9624
  </val-language-selector>
9107
9625
  </div>
9626
+
9627
+ <div class="example-group">
9628
+ <h4>Selector Compacto:</h4>
9629
+ <val-language-selector [props]="compactLanguageSelector"> </val-language-selector>
9630
+ </div>
9108
9631
  </div>
9109
9632
  </div>
9110
9633
  `, styles: [".selector-examples{padding:20px;max-width:800px;margin:0 auto}.section{margin:30px 0;padding:20px;border:1px solid var(--ion-color-light);border-radius:8px;background:var(--ion-color-step-50)}.section h3{margin:0 0 20px;color:var(--ion-color-primary)}.example-group{margin:20px 0;padding:15px;background:#fff;border-radius:8px;box-shadow:0 2px 4px #0000001a}.example-group h4{margin:0 0 15px;color:var(--ion-color-medium)}\n"] }]
@@ -9161,6 +9684,18 @@ const globalContentData = {
9161
9684
  language: 'Idioma',
9162
9685
  // Common confirmations
9163
9686
  areYouSure: '¿Estás seguro?',
9687
+ // Language names (translated) - flat keys for type compatibility
9688
+ languageName_es: 'Español',
9689
+ languageName_en: 'Inglés',
9690
+ languageName_fr: 'Francés',
9691
+ languageName_de: 'Alemán',
9692
+ languageName_pt: 'Portugués',
9693
+ languageName_it: 'Italiano',
9694
+ languageName_zh: 'Chino',
9695
+ languageName_ja: 'Japonés',
9696
+ languageName_ko: 'Coreano',
9697
+ languageName_ru: 'Ruso',
9698
+ languageName_ar: 'Árabe',
9164
9699
  deleteConfirmation: '¿Estás seguro de que deseas eliminar {itemName}?',
9165
9700
  unsavedChanges: 'Tienes cambios sin guardar. ¿Deseas continuar?',
9166
9701
  // Common placeholders
@@ -9193,8 +9728,21 @@ const globalContentData = {
9193
9728
  success: 'Success',
9194
9729
  warning: 'Warning',
9195
9730
  info: 'Information',
9731
+ language: 'Language',
9196
9732
  // Common confirmations
9197
9733
  areYouSure: 'Are you sure?',
9734
+ // Language names (translated) - flat keys for type compatibility
9735
+ languageName_es: 'Spanish',
9736
+ languageName_en: 'English',
9737
+ languageName_fr: 'French',
9738
+ languageName_de: 'German',
9739
+ languageName_pt: 'Portuguese',
9740
+ languageName_it: 'Italian',
9741
+ languageName_zh: 'Chinese',
9742
+ languageName_ja: 'Japanese',
9743
+ languageName_ko: 'Korean',
9744
+ languageName_ru: 'Russian',
9745
+ languageName_ar: 'Arabic',
9198
9746
  deleteConfirmation: 'Are you sure you want to delete {itemName}?',
9199
9747
  unsavedChanges: 'You have unsaved changes. Do you want to continue?',
9200
9748
  // Common placeholders
@@ -9215,6 +9763,19 @@ const globalContentData = {
9215
9763
  success: 'Succès',
9216
9764
  // Common confirmations
9217
9765
  areYouSure: 'Êtes-vous sûr?',
9766
+ // Language names (translated) - flat keys for type compatibility
9767
+ languageName_es: 'Espagnol',
9768
+ languageName_en: 'Anglais',
9769
+ languageName_fr: 'Français',
9770
+ languageName_de: 'Allemand',
9771
+ languageName_pt: 'Portugais',
9772
+ languageName_it: 'Italien',
9773
+ languageName_zh: 'Chinois',
9774
+ languageName_ja: 'Japonais',
9775
+ languageName_ko: 'Coréen',
9776
+ languageName_ru: 'Russe',
9777
+ languageName_ar: 'Arabe',
9778
+ language: 'Langue',
9218
9779
  },
9219
9780
  de: {
9220
9781
  // Common buttons - Another example of partial translation
@@ -9227,12 +9788,42 @@ const globalContentData = {
9227
9788
  error: 'Fehler',
9228
9789
  // Common confirmations
9229
9790
  areYouSure: 'Sind Sie sicher?',
9791
+ // Language names (translated) - flat keys for type compatibility
9792
+ languageName_es: 'Spanisch',
9793
+ languageName_en: 'Englisch',
9794
+ languageName_fr: 'Französisch',
9795
+ languageName_de: 'Deutsch',
9796
+ languageName_pt: 'Portugiesisch',
9797
+ languageName_it: 'Italienisch',
9798
+ languageName_zh: 'Chinesisch',
9799
+ languageName_ja: 'Japanisch',
9800
+ languageName_ko: 'Koreanisch',
9801
+ languageName_ru: 'Russisch',
9802
+ languageName_ar: 'Arabisch',
9803
+ language: 'Sprache',
9230
9804
  },
9231
9805
  };
9232
9806
  const GlobalContent = new TextContent(globalContentData);
9233
9807
  const content = {
9234
9808
  _global: GlobalContent,
9235
9809
  LangSettings,
9810
+ testReactivity: new TextContent({
9811
+ es: {
9812
+ welcomeMessage: '¡Bienvenido!',
9813
+ saveButton: 'Guardar',
9814
+ cancelButton: 'Cancelar',
9815
+ },
9816
+ en: {
9817
+ welcomeMessage: 'Welcome!',
9818
+ saveButton: 'Save',
9819
+ cancelButton: 'Cancel',
9820
+ },
9821
+ fr: {
9822
+ welcomeMessage: 'Bienvenue!',
9823
+ saveButton: 'Enregistrer',
9824
+ cancelButton: 'Annuler',
9825
+ },
9826
+ }),
9236
9827
  };
9237
9828
 
9238
9829
  /**
@@ -9290,5 +9881,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
9290
9881
  * Generated bundle index. Do not edit.
9291
9882
  */
9292
9883
 
9293
- export { ActionType, AlertBoxComponent, AvatarComponent, BannerComponent, BaseDefault, BoxComponent, ButtonComponent, ButtonGroupComponent, CardComponent, CardSection, CardType, CheckInputComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CommentInputComponent, ComponentContentHelper, ComponentStates, ComprehensiveLinkTestComponent, ContentLoaderComponent, ContentService, CustomContentDemoComponent, DateInputComponent, DisplayComponent, DisplayDemoComponent, DisplayExampleComponent, DividerComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FileInputComponent, FooterComponent, FormComponent, FormFooterComponent, GlobalContent, HeaderComponent, HintComponent, HourInputComponent, HrefComponent, Icon, IconComponent, IconService, ImageComponent, InAppBrowserService, InputType, ItemListComponent, LANGUAGES, LangService, LanguageSelectorComponent, LayeredCardComponent, LayoutComponent, LinkComponent, LinkProcessingExampleComponent, LinkProcessorService, LinksCakeComponent, ListContentHelper, LocalStorageService, MOTION, MultiLanguageDemoComponent, NavigationService, NoContentComponent, NotesBoxComponent, NumberInputComponent, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PasswordInputComponent, PinInputComponent, PopoverSelectorComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProgressBarComponent, ProgressStatusComponent, PrompterComponent, RadioInputComponent, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SelectSearchComponent, SelectorExamplesComponent, SimpleComponent, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, TextComponent, TextContent, TextInputComponent, ThemeOption, ThemeService, TitleBlockComponent, TitleComponent, ToastService, ToolbarActionType, ToolbarComponent, ValtechConfigService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, content, createComponentContentHelper, createContentHelper, createReactiveProps, createTextProps, createTitleProps, fromContent, fromContentWithInterpolation, fromMultipleContent, globalContentData, goToTop, interpolateContent, isAtEnd, maxLength, replaceSpecialChars, resolveColor, resolveInputDefaultValue, shouldUseReactiveContent };
9884
+ export { ActionType, AlertBoxComponent, AvatarComponent, BannerComponent, BaseDefault, BoxComponent, ButtonComponent, ButtonGroupComponent, CardComponent, CardSection, CardType, CheckInputComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CommentInputComponent, ComponentContentHelper, ComponentStates, ComprehensiveLinkTestComponent, ContentLoaderComponent, ContentService, CustomContentDemoComponent, DateInputComponent, DisplayComponent, DisplayDemoComponent, DisplayExampleComponent, DividerComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FileInputComponent, FooterComponent, FormComponent, FormFooterComponent, GlobalContent, HeaderComponent, HintComponent, HourInputComponent, HrefComponent, Icon, IconComponent, IconService, ImageComponent, InAppBrowserService, InputType, ItemListComponent, LANGUAGES, LangService, LanguageSelectorComponent, LayeredCardComponent, LayoutComponent, LinkComponent, LinkProcessingExampleComponent, LinkProcessorService, LinksCakeComponent, ListContentHelper, LocalStorageService, MOTION, MultiLanguageDemoComponent, NavigationService, NoContentComponent, NotesBoxComponent, NumberInputComponent, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PasswordInputComponent, PinInputComponent, PopoverSelectorComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProgressBarComponent, ProgressStatusComponent, PrompterComponent, RadioInputComponent, ReactiveComponentsDemoComponent, ReactivityTestComponent, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SelectSearchComponent, SelectorExamplesComponent, SimpleComponent, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, TextComponent, TextContent, TextInputComponent, ThemeOption, ThemeService, TitleBlockComponent, TitleComponent, ToastService, ToolbarActionType, ToolbarComponent, ValtechConfigService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, content, createComponentContentHelper, createContentHelper, createReactiveProps, createTextProps, createTitleProps, fromContent, fromContentWithInterpolation, fromMultipleContent, globalContentData, goToTop, interpolateContent, isAtEnd, maxLength, replaceSpecialChars, resolveColor, resolveInputDefaultValue, shouldUseReactiveContent };
9294
9885
  //# sourceMappingURL=valtech-components.mjs.map