valtech-components 2.0.293 → 2.0.294

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,21 +1,21 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { EventEmitter, Component, Input, Output, Injectable, inject, InjectionToken, Inject, Pipe, ChangeDetectionStrategy, ViewChild, ChangeDetectorRef } from '@angular/core';
3
- import { IonAvatar, IonCard, IonIcon, IonButton, IonSpinner, IonText, IonProgressBar, IonCardContent, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCheckbox, IonButtons, IonTextarea, IonDatetime, IonDatetimeButton, IonModal, IonInput, IonRadioGroup, IonRadio, IonSearchbar, IonSelect, IonSelectOption, IonToolbar, IonTitle, IonMenuButton, IonFooter, IonHeader, IonList, IonListHeader, IonLabel, IonNote, IonItem, IonContent } from '@ionic/angular/standalone';
3
+ import { IonAvatar, IonCard, IonIcon, IonButton, IonSpinner, IonText, IonProgressBar, IonCardContent, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCheckbox, IonButtons, IonTextarea, IonDatetime, IonDatetimeButton, IonModal, IonInput, IonSelect, IonSelectOption, IonItem, IonLabel, IonRadioGroup, IonRadio, IonSearchbar, IonToolbar, IonTitle, IonMenuButton, IonFooter, IonHeader, IonList, IonListHeader, IonNote, IonContent } from '@ionic/angular/standalone';
4
4
  import * as i1 from '@angular/common';
5
5
  import { CommonModule, NgStyle, AsyncPipe, NgFor, NgClass } from '@angular/common';
6
6
  import { addIcons } from 'ionicons';
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, chevronBackOutline } from 'ionicons/icons';
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
8
  import { map, BehaviorSubject, distinctUntilChanged, Subscription, of } 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';
12
12
  import * as i1$2 from '@angular/forms';
13
13
  import { ReactiveFormsModule, FormsModule, Validators } from '@angular/forms';
14
+ import { map as map$1 } from 'rxjs/operators';
14
15
  import * as i1$3 from 'ng-otp-input';
15
16
  import { NgOtpInputComponent, NgOtpInputModule } from 'ng-otp-input';
16
17
  import * as i2 from '@ionic/angular';
17
18
  import { IonicModule } from '@ionic/angular';
18
- import { map as map$1 } from 'rxjs/operators';
19
19
 
20
20
  /**
21
21
  * val-avatar
@@ -3771,6 +3771,378 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
3771
3771
  type: Input
3772
3772
  }] } });
3773
3773
 
3774
+ /**
3775
+ * val-popover-selector
3776
+ *
3777
+ * A generic reusable popover selector component that can be used for any type of selection.
3778
+ * Provides a button trigger that opens a popover with selectable options.
3779
+ *
3780
+ * @example
3781
+ * // Basic usage
3782
+ * <val-popover-selector
3783
+ * [props]="selectorProps"
3784
+ * (selectionChange)="onSelectionChange($event)">
3785
+ * </val-popover-selector>
3786
+ *
3787
+ * @example
3788
+ * // With icon and custom styling
3789
+ * const selectorProps: PopoverSelectorMetadata = {
3790
+ * options: [
3791
+ * { value: 'option1', label: 'Option 1', icon: 'star' },
3792
+ * { value: 'option2', label: 'Option 2', icon: 'heart' }
3793
+ * ],
3794
+ * selectedValue: 'option1',
3795
+ * label: 'Choose option',
3796
+ * icon: 'settings',
3797
+ * color: 'primary',
3798
+ * size: 'large',
3799
+ * fill: 'solid'
3800
+ * };
3801
+ *
3802
+ * @input props: PopoverSelectorMetadata - Configuration for the selector
3803
+ * @output selectionChange: EventEmitter<string | string[]> - Emitted when selection changes
3804
+ */
3805
+ class PopoverSelectorComponent {
3806
+ constructor() {
3807
+ /**
3808
+ * Event emitted when the selection changes.
3809
+ * Emits the selected value(s).
3810
+ */
3811
+ this.selectionChange = new EventEmitter();
3812
+ // Register required icons
3813
+ addIcons({ chevronDown });
3814
+ }
3815
+ /**
3816
+ * Handle selection change from the ion-select.
3817
+ * @param event - The ion-select change event
3818
+ */
3819
+ onSelectionChange(event) {
3820
+ const selectedValue = event.detail.value;
3821
+ this.selectionChange.emit(selectedValue);
3822
+ }
3823
+ /**
3824
+ * Get the display text for the trigger button.
3825
+ * Shows the selected option's label or placeholder.
3826
+ * @returns The display text
3827
+ */
3828
+ getDisplayText() {
3829
+ if (!this.props.selectedValue) {
3830
+ return this.props.placeholder || 'Seleccionar...';
3831
+ }
3832
+ if (Array.isArray(this.props.selectedValue)) {
3833
+ // Multiple selection
3834
+ if (this.props.selectedValue.length === 0) {
3835
+ return this.props.placeholder || 'Seleccionar...';
3836
+ }
3837
+ if (this.props.selectedValue.length === 1) {
3838
+ const option = this.props.options.find(opt => opt.value === this.props.selectedValue[0]);
3839
+ return option?.label || this.props.selectedValue[0];
3840
+ }
3841
+ return `${this.props.selectedValue.length} seleccionados`;
3842
+ }
3843
+ // Single selection
3844
+ const selectedOption = this.props.options.find(opt => opt.value === this.props.selectedValue);
3845
+ return selectedOption?.label || this.props.selectedValue;
3846
+ }
3847
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3848
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PopoverSelectorComponent, isStandalone: true, selector: "val-popover-selector", inputs: { props: "props" }, outputs: { selectionChange: "selectionChange" }, ngImport: i0, template: `
3849
+ <ion-item [disabled]="props.disabled" lines="none">
3850
+ <ion-label *ngIf="props.label" position="stacked">{{ props.label }}</ion-label>
3851
+ <ion-select
3852
+ [value]="props.selectedValue"
3853
+ [placeholder]="props.placeholder || 'Seleccionar...'"
3854
+ [interface]="props.interface || 'popover'"
3855
+ [multiple]="props.multiple || false"
3856
+ [disabled]="props.disabled || false"
3857
+ [cancelText]="props.cancelText || 'Cancelar'"
3858
+ [okText]="props.okText || 'Aceptar'"
3859
+ (ionChange)="onSelectionChange($event)"
3860
+ class="popover-selector-select"
3861
+ >
3862
+ <ion-button
3863
+ slot="trigger"
3864
+ [fill]="props.fill || 'outline'"
3865
+ [size]="props.size || 'default'"
3866
+ [shape]="props.shape"
3867
+ [expand]="props.expand"
3868
+ [color]="props.color || 'medium'"
3869
+ [disabled]="props.disabled || false"
3870
+ class="selector-trigger"
3871
+ >
3872
+ <ion-icon *ngIf="props.icon" [name]="props.icon" slot="start"> </ion-icon>
3873
+
3874
+ <span class="trigger-text">{{ getDisplayText() }}</span>
3875
+
3876
+ <ion-icon name="chevron-down" slot="end" class="chevron-icon"> </ion-icon>
3877
+ </ion-button>
3878
+
3879
+ <ion-select-option *ngFor="let option of props.options" [value]="option.value" [disabled]="option.disabled">
3880
+ <div class="option-content">
3881
+ <ion-icon *ngIf="option.icon" [name]="option.icon" class="option-icon"> </ion-icon>
3882
+ <span>{{ option.label }}</span>
3883
+ </div>
3884
+ </ion-select-option>
3885
+ </ion-select>
3886
+ </ion-item>
3887
+ `, isInline: true, styles: [".popover-selector-select{width:100%}.popover-selector-select .selector-trigger{width:100%;justify-content:space-between;text-align:left}.popover-selector-select .selector-trigger .trigger-text{flex:1;text-align:start;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.popover-selector-select .selector-trigger .chevron-icon{margin-left:auto;transition:transform .2s ease}.popover-selector-select .selector-trigger.select-expanded .chevron-icon{transform:rotate(180deg)}.option-content{display:flex;align-items:center;gap:8px}.option-content .option-icon{font-size:16px;width:16px;height:16px}.popover-selector-select.size-small .selector-trigger{--padding-start: 8px;--padding-end: 8px;font-size:14px}.popover-selector-select.size-large .selector-trigger{--padding-start: 16px;--padding-end: 16px;font-size:18px}ion-item[disabled]{opacity:.6;pointer-events:none}\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: 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"] }] }); }
3888
+ }
3889
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverSelectorComponent, decorators: [{
3890
+ type: Component,
3891
+ args: [{ selector: 'val-popover-selector', standalone: true, imports: [CommonModule, IonButton, IonIcon, IonSelect, IonSelectOption, IonItem, IonLabel], template: `
3892
+ <ion-item [disabled]="props.disabled" lines="none">
3893
+ <ion-label *ngIf="props.label" position="stacked">{{ props.label }}</ion-label>
3894
+ <ion-select
3895
+ [value]="props.selectedValue"
3896
+ [placeholder]="props.placeholder || 'Seleccionar...'"
3897
+ [interface]="props.interface || 'popover'"
3898
+ [multiple]="props.multiple || false"
3899
+ [disabled]="props.disabled || false"
3900
+ [cancelText]="props.cancelText || 'Cancelar'"
3901
+ [okText]="props.okText || 'Aceptar'"
3902
+ (ionChange)="onSelectionChange($event)"
3903
+ class="popover-selector-select"
3904
+ >
3905
+ <ion-button
3906
+ slot="trigger"
3907
+ [fill]="props.fill || 'outline'"
3908
+ [size]="props.size || 'default'"
3909
+ [shape]="props.shape"
3910
+ [expand]="props.expand"
3911
+ [color]="props.color || 'medium'"
3912
+ [disabled]="props.disabled || false"
3913
+ class="selector-trigger"
3914
+ >
3915
+ <ion-icon *ngIf="props.icon" [name]="props.icon" slot="start"> </ion-icon>
3916
+
3917
+ <span class="trigger-text">{{ getDisplayText() }}</span>
3918
+
3919
+ <ion-icon name="chevron-down" slot="end" class="chevron-icon"> </ion-icon>
3920
+ </ion-button>
3921
+
3922
+ <ion-select-option *ngFor="let option of props.options" [value]="option.value" [disabled]="option.disabled">
3923
+ <div class="option-content">
3924
+ <ion-icon *ngIf="option.icon" [name]="option.icon" class="option-icon"> </ion-icon>
3925
+ <span>{{ option.label }}</span>
3926
+ </div>
3927
+ </ion-select-option>
3928
+ </ion-select>
3929
+ </ion-item>
3930
+ `, styles: [".popover-selector-select{width:100%}.popover-selector-select .selector-trigger{width:100%;justify-content:space-between;text-align:left}.popover-selector-select .selector-trigger .trigger-text{flex:1;text-align:start;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.popover-selector-select .selector-trigger .chevron-icon{margin-left:auto;transition:transform .2s ease}.popover-selector-select .selector-trigger.select-expanded .chevron-icon{transform:rotate(180deg)}.option-content{display:flex;align-items:center;gap:8px}.option-content .option-icon{font-size:16px;width:16px;height:16px}.popover-selector-select.size-small .selector-trigger{--padding-start: 8px;--padding-end: 8px;font-size:14px}.popover-selector-select.size-large .selector-trigger{--padding-start: 16px;--padding-end: 16px;font-size:18px}ion-item[disabled]{opacity:.6;pointer-events:none}\n"] }]
3931
+ }], ctorParameters: () => [], propDecorators: { props: [{
3932
+ type: Input
3933
+ }], selectionChange: [{
3934
+ type: Output
3935
+ }] } });
3936
+
3937
+ /**
3938
+ * val-language-selector
3939
+ *
3940
+ * A specialized language selector component that integrates with the LangService.
3941
+ * Uses the popover-selector component internally and provides language-specific functionality.
3942
+ *
3943
+ * @example
3944
+ * // Basic usage (auto-detects languages from LangService)
3945
+ * <val-language-selector
3946
+ * [props]="{ showLabel: true, showFlags: true }">
3947
+ * </val-language-selector>
3948
+ *
3949
+ * @example
3950
+ * // Custom configuration
3951
+ * const languageProps: LanguageSelectorMetadata = {
3952
+ * showLabel: true,
3953
+ * label: 'Choose Language',
3954
+ * showFlags: true,
3955
+ * color: 'primary',
3956
+ * size: 'large',
3957
+ * fill: 'outline',
3958
+ * customLanguageNames: {
3959
+ * 'es': 'Español',
3960
+ * 'en': 'English',
3961
+ * 'fr': 'Français'
3962
+ * }
3963
+ * };
3964
+ *
3965
+ * @example
3966
+ * // With reactive content
3967
+ * const languageProps: LanguageSelectorMetadata = {
3968
+ * showLabel: true,
3969
+ * labelConfig: {
3970
+ * className: 'myComponent',
3971
+ * key: 'languageLabel',
3972
+ * fallback: 'Language'
3973
+ * },
3974
+ * color: 'tertiary'
3975
+ * };
3976
+ *
3977
+ * @input props: LanguageSelectorMetadata - Configuration for the language selector
3978
+ * @output languageChange: EventEmitter<string> - Emitted when language changes
3979
+ */
3980
+ class LanguageSelectorComponent {
3981
+ constructor(langService, contentService) {
3982
+ this.langService = langService;
3983
+ this.contentService = contentService;
3984
+ /**
3985
+ * Language selector configuration object.
3986
+ * @type {LanguageSelectorMetadata}
3987
+ */
3988
+ this.props = {};
3989
+ /**
3990
+ * Event emitted when the language selection changes.
3991
+ * Emits the selected language code.
3992
+ */
3993
+ this.languageChange = new EventEmitter();
3994
+ this.subscriptions = new Subscription();
3995
+ /** Default language display names */
3996
+ this.defaultLanguageNames = {
3997
+ es: 'Español',
3998
+ en: 'English',
3999
+ fr: 'Français',
4000
+ de: 'Deutsch',
4001
+ pt: 'Português',
4002
+ it: 'Italiano',
4003
+ zh: '中文',
4004
+ ja: '日本語',
4005
+ ko: '한국어',
4006
+ ru: 'Русский',
4007
+ ar: 'العربية',
4008
+ };
4009
+ /** Default flag icons for languages */
4010
+ this.defaultLanguageFlags = {
4011
+ es: '🇪🇸',
4012
+ en: '🇺🇸',
4013
+ fr: '🇫🇷',
4014
+ de: '🇩🇪',
4015
+ pt: '🇵🇹',
4016
+ it: '🇮🇹',
4017
+ zh: '🇨🇳',
4018
+ ja: '🇯🇵',
4019
+ ko: '🇰🇷',
4020
+ ru: '🇷🇺',
4021
+ ar: '🇸🇦',
4022
+ };
4023
+ // Register required icons
4024
+ addIcons({ language, globe });
4025
+ }
4026
+ ngOnInit() {
4027
+ this.initializeLanguageState();
4028
+ this.initializeLabel();
4029
+ this.initializePopoverProps();
4030
+ }
4031
+ ngOnDestroy() {
4032
+ this.subscriptions.unsubscribe();
4033
+ }
4034
+ initializeLanguageState() {
4035
+ // Get current language and available languages from LangService
4036
+ this.currentLanguage$ = this.langService.currentLang$;
4037
+ this.availableLanguages$ = this.currentLanguage$.pipe(map$1(() => this.props.availableLanguages || this.langService.availableLangs));
4038
+ }
4039
+ initializeLabel() {
4040
+ // Initialize label observable based on configuration
4041
+ if (this.props.label !== undefined) {
4042
+ // Static label
4043
+ this.label$ = of(this.props.label);
4044
+ }
4045
+ else if (this.props.labelConfig) {
4046
+ // Reactive label
4047
+ this.label$ = this.contentService.fromContent({
4048
+ className: this.props.labelConfig.className || '_global',
4049
+ key: this.props.labelConfig.key,
4050
+ fallback: this.props.labelConfig.fallback || 'Language',
4051
+ interpolation: this.props.labelConfig.interpolation,
4052
+ });
4053
+ }
4054
+ else {
4055
+ // Default label from global content
4056
+ this.label$ = this.contentService.fromContent({
4057
+ className: '_global',
4058
+ key: 'language',
4059
+ fallback: 'Idioma',
4060
+ });
4061
+ }
4062
+ }
4063
+ initializePopoverProps() {
4064
+ // Subscribe to language state changes to update popover props
4065
+ const languageSubscription = this.availableLanguages$.subscribe(availableLanguages => {
4066
+ const currentLanguageSubscription = this.currentLanguage$.subscribe(currentLanguage => {
4067
+ this.updatePopoverProps(availableLanguages, currentLanguage);
4068
+ });
4069
+ this.subscriptions.add(currentLanguageSubscription);
4070
+ });
4071
+ this.subscriptions.add(languageSubscription);
4072
+ // Subscribe to label changes
4073
+ const labelSubscription = this.label$.subscribe(label => {
4074
+ if (this.popoverProps) {
4075
+ this.popoverProps = {
4076
+ ...this.popoverProps,
4077
+ label: this.props.showLabel !== false ? label : undefined,
4078
+ };
4079
+ }
4080
+ });
4081
+ this.subscriptions.add(labelSubscription);
4082
+ }
4083
+ updatePopoverProps(availableLanguages, currentLanguage) {
4084
+ // Convert language codes to popover options
4085
+ const options = availableLanguages.map(lang => ({
4086
+ value: lang,
4087
+ label: this.getLanguageDisplayName(lang),
4088
+ icon: this.props.showFlags ? undefined : undefined, // We'll use text flags instead
4089
+ }));
4090
+ // Create popover configuration
4091
+ this.popoverProps = {
4092
+ options,
4093
+ selectedValue: currentLanguage,
4094
+ label: this.props.showLabel !== false ? '' : undefined, // Will be set by label subscription
4095
+ icon: 'language',
4096
+ placeholder: 'Seleccionar idioma...',
4097
+ color: this.props.color || 'medium',
4098
+ size: this.props.size || 'default',
4099
+ fill: this.props.fill || 'outline',
4100
+ shape: this.props.shape,
4101
+ expand: this.props.expand,
4102
+ disabled: this.props.disabled || false,
4103
+ interface: 'popover',
4104
+ showCheckmark: true,
4105
+ multiple: false,
4106
+ cancelText: 'Cancelar',
4107
+ okText: 'Aceptar',
4108
+ };
4109
+ }
4110
+ getLanguageDisplayName(languageCode) {
4111
+ // Use custom names if provided, otherwise use defaults, otherwise use the code itself
4112
+ const customName = this.props.customLanguageNames?.[languageCode];
4113
+ const defaultName = this.defaultLanguageNames[languageCode];
4114
+ const flag = this.props.showFlags ? this.defaultLanguageFlags[languageCode] : '';
4115
+ const displayName = customName || defaultName || languageCode.toUpperCase();
4116
+ return flag ? `${flag} ${displayName}` : displayName;
4117
+ }
4118
+ /**
4119
+ * Handle language selection change.
4120
+ * @param selectedLanguage - The selected language code(s)
4121
+ */
4122
+ onLanguageChange(selectedLanguage) {
4123
+ if (typeof selectedLanguage === 'string') {
4124
+ // Update the language service
4125
+ this.langService.setLang(selectedLanguage);
4126
+ // Emit the change event
4127
+ this.languageChange.emit(selectedLanguage);
4128
+ }
4129
+ }
4130
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LanguageSelectorComponent, deps: [{ token: LangService }, { token: ContentService }], target: i0.ɵɵFactoryTarget.Component }); }
4131
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LanguageSelectorComponent, isStandalone: true, selector: "val-language-selector", inputs: { props: "props" }, outputs: { languageChange: "languageChange" }, ngImport: i0, template: `
4132
+ <val-popover-selector [props]="popoverProps" (selectionChange)="onLanguageChange($event)"> </val-popover-selector>
4133
+ `, isInline: true, styles: [":host{display:block}val-popover-selector .selector-trigger .trigger-text{display:flex;align-items:center;gap:8px}.language-flag{font-size:1.2em;margin-right:4px}@media (max-width: 768px){val-popover-selector .selector-trigger{--padding-start: 8px;--padding-end: 8px}val-popover-selector .selector-trigger .trigger-text{font-size:14px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: PopoverSelectorComponent, selector: "val-popover-selector", inputs: ["props"], outputs: ["selectionChange"] }] }); }
4134
+ }
4135
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LanguageSelectorComponent, decorators: [{
4136
+ type: Component,
4137
+ args: [{ selector: 'val-language-selector', standalone: true, imports: [CommonModule, PopoverSelectorComponent], template: `
4138
+ <val-popover-selector [props]="popoverProps" (selectionChange)="onLanguageChange($event)"> </val-popover-selector>
4139
+ `, styles: [":host{display:block}val-popover-selector .selector-trigger .trigger-text{display:flex;align-items:center;gap:8px}.language-flag{font-size:1.2em;margin-right:4px}@media (max-width: 768px){val-popover-selector .selector-trigger{--padding-start: 8px;--padding-end: 8px}val-popover-selector .selector-trigger .trigger-text{font-size:14px}}\n"] }]
4140
+ }], ctorParameters: () => [{ type: LangService }, { type: ContentService }], propDecorators: { props: [{
4141
+ type: Input
4142
+ }], languageChange: [{
4143
+ type: Output
4144
+ }] } });
4145
+
3774
4146
  /**
3775
4147
  * Service for managing application themes (light, dark, auto).
3776
4148
  * Handles user preferences, system theme detection, and theme toggling.
@@ -7314,6 +7686,19 @@ class DisplayDemoComponent {
7314
7686
  this.langService = langService;
7315
7687
  // Contador para ejemplos dinámicos
7316
7688
  this.counter = 0;
7689
+ // Configuración del selector de idioma
7690
+ this.languageSelectorProps = {
7691
+ showLabel: true,
7692
+ labelConfig: {
7693
+ className: '_global',
7694
+ key: 'language',
7695
+ fallback: 'Idioma',
7696
+ },
7697
+ showFlags: true,
7698
+ color: 'primary',
7699
+ size: 'default',
7700
+ fill: 'outline',
7701
+ };
7317
7702
  // Configuraciones de ejemplo - ESTÁTICAS
7318
7703
  this.smallStaticDisplay = {
7319
7704
  content: 'Texto pequeño estático',
@@ -7365,7 +7750,7 @@ class DisplayDemoComponent {
7365
7750
  this.welcomeDisplay = {
7366
7751
  contentConfig: {
7367
7752
  className: 'displayDemo',
7368
- key: 'welcome.title',
7753
+ key: 'welcomeTitle',
7369
7754
  fallback: 'Bienvenido a la aplicación',
7370
7755
  },
7371
7756
  color: 'primary',
@@ -7374,7 +7759,7 @@ class DisplayDemoComponent {
7374
7759
  this.descriptionDisplay = {
7375
7760
  contentConfig: {
7376
7761
  className: 'displayDemo',
7377
- key: 'welcome.description',
7762
+ key: 'welcomeDescription',
7378
7763
  fallback: 'Esta es una descripción de ejemplo',
7379
7764
  },
7380
7765
  color: 'medium',
@@ -7383,7 +7768,7 @@ class DisplayDemoComponent {
7383
7768
  this.statusDisplay = {
7384
7769
  contentConfig: {
7385
7770
  className: 'displayDemo',
7386
- key: 'status.online',
7771
+ key: 'statusOnline',
7387
7772
  fallback: 'En línea',
7388
7773
  },
7389
7774
  color: 'success',
@@ -7393,7 +7778,7 @@ class DisplayDemoComponent {
7393
7778
  this.userWelcomeDisplay = {
7394
7779
  contentConfig: {
7395
7780
  className: 'displayDemo',
7396
- key: 'welcome.user',
7781
+ key: 'welcomeUser',
7397
7782
  fallback: 'Hola, {{userName}}!',
7398
7783
  interpolation: {
7399
7784
  userName: 'Juan Pérez',
@@ -7405,7 +7790,7 @@ class DisplayDemoComponent {
7405
7790
  this.counterDisplay = {
7406
7791
  contentConfig: {
7407
7792
  className: 'displayDemo',
7408
- key: 'counter.current',
7793
+ key: 'counterCurrent',
7409
7794
  fallback: 'Contador: {{count}}',
7410
7795
  interpolation: {
7411
7796
  count: this.counter,
@@ -7442,7 +7827,7 @@ class DisplayDemoComponent {
7442
7827
  this.reactiveMixedDisplay = {
7443
7828
  contentConfig: {
7444
7829
  className: 'displayDemo',
7445
- key: 'mixed.reactive',
7830
+ key: 'mixedReactive',
7446
7831
  fallback: 'Este contenido sí cambia con el idioma',
7447
7832
  },
7448
7833
  color: 'primary',
@@ -7452,7 +7837,7 @@ class DisplayDemoComponent {
7452
7837
  this.dynamicCounterDisplay = {
7453
7838
  contentConfig: {
7454
7839
  className: 'displayDemo',
7455
- key: 'dynamic.counter',
7840
+ key: 'dynamicContent',
7456
7841
  fallback: 'Clics: {{count}}',
7457
7842
  interpolation: {
7458
7843
  count: this.counter,
@@ -7470,7 +7855,7 @@ class DisplayDemoComponent {
7470
7855
  // Contenido de la página
7471
7856
  this.demoTitle$ = this.contentService.fromContent({
7472
7857
  className: 'displayDemo',
7473
- key: 'page.title',
7858
+ key: 'pageTitle',
7474
7859
  fallback: 'Demostración del Componente Display',
7475
7860
  });
7476
7861
  this.languageLabel$ = this.contentService.fromContent({
@@ -7480,67 +7865,67 @@ class DisplayDemoComponent {
7480
7865
  });
7481
7866
  this.staticSectionTitle$ = this.contentService.fromContent({
7482
7867
  className: 'displayDemo',
7483
- key: 'sections.static',
7868
+ key: 'sectionsStatic',
7484
7869
  fallback: 'Ejemplos Estáticos',
7485
7870
  });
7486
7871
  this.reactiveSectionTitle$ = this.contentService.fromContent({
7487
7872
  className: 'displayDemo',
7488
- key: 'sections.reactive',
7873
+ key: 'sectionsReactive',
7489
7874
  fallback: 'Ejemplos Reactivos',
7490
7875
  });
7491
7876
  this.mixedSectionTitle$ = this.contentService.fromContent({
7492
7877
  className: 'displayDemo',
7493
- key: 'sections.mixed',
7878
+ key: 'sectionsMixed',
7494
7879
  fallback: 'Ejemplos Mixtos',
7495
7880
  });
7496
7881
  this.dynamicSectionTitle$ = this.contentService.fromContent({
7497
7882
  className: 'displayDemo',
7498
- key: 'sections.dynamic',
7883
+ key: 'sectionsDynamic',
7499
7884
  fallback: 'Ejemplos Dinámicos',
7500
7885
  });
7501
7886
  this.analysisTitle$ = this.contentService.fromContent({
7502
7887
  className: 'displayDemo',
7503
- key: 'sections.analysis',
7888
+ key: 'sectionsAnalysis',
7504
7889
  fallback: 'Análisis de Idioma',
7505
7890
  });
7506
7891
  this.reactiveContentTitle$ = this.contentService.fromContent({
7507
7892
  className: 'displayDemo',
7508
- key: 'subsections.reactiveContent',
7893
+ key: 'subsectionsReactiveContent',
7509
7894
  fallback: 'Contenido reactivo básico:',
7510
7895
  });
7511
7896
  this.interpolationTitle$ = this.contentService.fromContent({
7512
7897
  className: 'displayDemo',
7513
- key: 'subsections.interpolation',
7898
+ key: 'subsectionsInterpolation',
7514
7899
  fallback: 'Contenido con interpolación:',
7515
7900
  });
7516
7901
  this.fallbackTitle$ = this.contentService.fromContent({
7517
7902
  className: 'displayDemo',
7518
- key: 'subsections.fallback',
7903
+ key: 'subsectionsFallback',
7519
7904
  fallback: 'Demostración de fallbacks:',
7520
7905
  });
7521
7906
  this.mixedContentTitle$ = this.contentService.fromContent({
7522
7907
  className: 'displayDemo',
7523
- key: 'subsections.mixedContent',
7908
+ key: 'subsectionsMixedContent',
7524
7909
  fallback: 'Contenido estático vs reactivo:',
7525
7910
  });
7526
7911
  this.dynamicContentTitle$ = this.contentService.fromContent({
7527
7912
  className: 'displayDemo',
7528
- key: 'subsections.dynamicContent',
7913
+ key: 'subsectionsDynamicContent',
7529
7914
  fallback: 'Contenido que se actualiza dinámicamente:',
7530
7915
  });
7531
7916
  this.updateButtonText$ = this.contentService.fromContent({
7532
7917
  className: 'displayDemo',
7533
- key: 'buttons.updateCounter',
7918
+ key: 'buttonsUpdateCounter',
7534
7919
  fallback: 'Actualizar Contador',
7535
7920
  });
7536
7921
  this.currentLangLabel$ = this.contentService.fromContent({
7537
7922
  className: 'displayDemo',
7538
- key: 'analysis.currentLanguage',
7923
+ key: 'analysisCurrentLanguage',
7539
7924
  fallback: 'Idioma actual',
7540
7925
  });
7541
7926
  this.availableLangsLabel$ = this.contentService.fromContent({
7542
7927
  className: 'displayDemo',
7543
- key: 'analysis.availableLanguages',
7928
+ key: 'analysisAvailableLanguages',
7544
7929
  fallback: 'Idiomas disponibles',
7545
7930
  });
7546
7931
  }
@@ -7551,6 +7936,11 @@ class DisplayDemoComponent {
7551
7936
  changeLanguage(language) {
7552
7937
  this.langService.setLang(language);
7553
7938
  }
7939
+ onLanguageChange(language) {
7940
+ console.log('Language changed to:', language);
7941
+ // El language selector ya maneja el cambio de idioma internamente
7942
+ // pero podemos agregar lógica adicional aquí si es necesario
7943
+ }
7554
7944
  updateCounter() {
7555
7945
  this.counter++;
7556
7946
  // Actualizar los displays que usan el contador
@@ -7583,18 +7973,10 @@ class DisplayDemoComponent {
7583
7973
 
7584
7974
  <ion-card-content>
7585
7975
  <!-- Selector de idioma -->
7586
- <ion-item>
7587
- <ion-label>{{ languageLabel$ | async }}</ion-label>
7588
- <ion-select
7589
- interface="popover"
7590
- [value]="currentLanguage$ | async"
7591
- (ionChange)="changeLanguage($event.detail.value)"
7592
- >
7593
- <ion-select-option *ngFor="let lang of availableLanguages$ | async" [value]="lang">
7594
- {{ lang | uppercase }}
7595
- </ion-select-option>
7596
- </ion-select>
7597
- </ion-item>
7976
+ <div class="language-selector-container">
7977
+ <val-language-selector [props]="languageSelectorProps" (languageChange)="onLanguageChange($event)">
7978
+ </val-language-selector>
7979
+ </div>
7598
7980
 
7599
7981
  <!-- Ejemplos estáticos -->
7600
7982
  <div class="section">
@@ -7684,7 +8066,7 @@ class DisplayDemoComponent {
7684
8066
  </ion-card-content>
7685
8067
  </ion-card>
7686
8068
  </div>
7687
- `, isInline: true, styles: [".display-demo{padding:16px}.section{margin:24px 0;border-bottom:1px solid var(--ion-color-light);padding-bottom:16px}.example-group{margin:16px 0;padding:12px;background:var(--ion-color-light);border-radius:8px}.example-group h4{margin:0 0 12px;color:var(--ion-color-medium)}.mixed-examples{display:flex;flex-direction:column;gap:8px}.analysis-info{background:var(--ion-color-step-50);padding:16px;border-radius:8px;margin-top:16px}val-display{display:block;margin:8px 0}\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: 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: DisplayComponent, selector: "val-display", inputs: ["props"] }] }); }
8069
+ `, isInline: true, styles: [".display-demo{padding:16px}.language-selector-container{margin:16px 0;padding:12px;background:var(--ion-color-step-50);border-radius:8px}.section{margin:24px 0;border-bottom:1px solid var(--ion-color-light);padding-bottom:16px}.example-group{margin:16px 0;padding:12px;background:var(--ion-color-light);border-radius:8px}.example-group h4{margin:0 0 12px;color:var(--ion-color-medium)}.mixed-examples{display:flex;flex-direction:column;gap:8px}.analysis-info{background:var(--ion-color-step-50);padding:16px;border-radius:8px;margin-top:16px}val-display{display:block;margin:8px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: 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: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: LanguageSelectorComponent, selector: "val-language-selector", inputs: ["props"], outputs: ["languageChange"] }] }); }
7688
8070
  }
7689
8071
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DisplayDemoComponent, decorators: [{
7690
8072
  type: Component,
@@ -7694,12 +8076,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
7694
8076
  IonCardContent,
7695
8077
  IonCardHeader,
7696
8078
  IonCardTitle,
7697
- IonSelect,
7698
- IonSelectOption,
7699
- IonItem,
7700
- IonLabel,
7701
8079
  IonButton,
7702
8080
  DisplayComponent,
8081
+ LanguageSelectorComponent,
7703
8082
  ], template: `
7704
8083
  <div class="display-demo">
7705
8084
  <ion-card>
@@ -7709,18 +8088,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
7709
8088
 
7710
8089
  <ion-card-content>
7711
8090
  <!-- Selector de idioma -->
7712
- <ion-item>
7713
- <ion-label>{{ languageLabel$ | async }}</ion-label>
7714
- <ion-select
7715
- interface="popover"
7716
- [value]="currentLanguage$ | async"
7717
- (ionChange)="changeLanguage($event.detail.value)"
7718
- >
7719
- <ion-select-option *ngFor="let lang of availableLanguages$ | async" [value]="lang">
7720
- {{ lang | uppercase }}
7721
- </ion-select-option>
7722
- </ion-select>
7723
- </ion-item>
8091
+ <div class="language-selector-container">
8092
+ <val-language-selector [props]="languageSelectorProps" (languageChange)="onLanguageChange($event)">
8093
+ </val-language-selector>
8094
+ </div>
7724
8095
 
7725
8096
  <!-- Ejemplos estáticos -->
7726
8097
  <div class="section">
@@ -7810,7 +8181,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
7810
8181
  </ion-card-content>
7811
8182
  </ion-card>
7812
8183
  </div>
7813
- `, styles: [".display-demo{padding:16px}.section{margin:24px 0;border-bottom:1px solid var(--ion-color-light);padding-bottom:16px}.example-group{margin:16px 0;padding:12px;background:var(--ion-color-light);border-radius:8px}.example-group h4{margin:0 0 12px;color:var(--ion-color-medium)}.mixed-examples{display:flex;flex-direction:column;gap:8px}.analysis-info{background:var(--ion-color-step-50);padding:16px;border-radius:8px;margin-top:16px}val-display{display:block;margin:8px 0}\n"] }]
8184
+ `, styles: [".display-demo{padding:16px}.language-selector-container{margin:16px 0;padding:12px;background:var(--ion-color-step-50);border-radius:8px}.section{margin:24px 0;border-bottom:1px solid var(--ion-color-light);padding-bottom:16px}.example-group{margin:16px 0;padding:12px;background:var(--ion-color-light);border-radius:8px}.example-group h4{margin:0 0 12px;color:var(--ion-color-medium)}.mixed-examples{display:flex;flex-direction:column;gap:8px}.analysis-info{background:var(--ion-color-step-50);padding:16px;border-radius:8px;margin-top:16px}val-display{display:block;margin:8px 0}\n"] }]
7814
8185
  }], ctorParameters: () => [{ type: ContentService }, { type: LangService }] });
7815
8186
 
7816
8187
  /**
@@ -8537,6 +8908,210 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
8537
8908
  `, 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"] }]
8538
8909
  }], ctorParameters: () => [{ type: ContentService }, { type: LangService }] });
8539
8910
 
8911
+ /**
8912
+ * Ejemplo de uso de los componentes popover-selector y language-selector
8913
+ */
8914
+ class SelectorExamplesComponent {
8915
+ constructor() {
8916
+ // ✅ Ejemplos de Popover Selector Genérico
8917
+ this.categorySelector = {
8918
+ options: [
8919
+ { value: 'work', label: 'Trabajo', icon: 'briefcase' },
8920
+ { value: 'personal', label: 'Personal', icon: 'person' },
8921
+ { value: 'travel', label: 'Viajes', icon: 'airplane' },
8922
+ { value: 'health', label: 'Salud', icon: 'fitness' },
8923
+ ],
8924
+ selectedValue: 'work',
8925
+ label: 'Categoría',
8926
+ icon: 'folder',
8927
+ color: 'primary',
8928
+ size: 'default',
8929
+ fill: 'outline',
8930
+ };
8931
+ this.prioritySelector = {
8932
+ options: [
8933
+ { value: 'low', label: 'Baja', icon: 'arrow-down', disabled: false },
8934
+ { value: 'medium', label: 'Media', icon: 'remove' },
8935
+ { value: 'high', label: 'Alta', icon: 'arrow-up' },
8936
+ { value: 'urgent', label: 'Urgente', icon: 'warning' },
8937
+ ],
8938
+ selectedValue: 'medium',
8939
+ label: 'Prioridad',
8940
+ icon: 'flag',
8941
+ color: 'warning',
8942
+ size: 'large',
8943
+ fill: 'solid',
8944
+ shape: 'round',
8945
+ };
8946
+ this.multipleSelector = {
8947
+ options: [
8948
+ { value: 'email', label: 'Email', icon: 'mail' },
8949
+ { value: 'sms', label: 'SMS', icon: 'chatbox' },
8950
+ { value: 'push', label: 'Push', icon: 'notifications' },
8951
+ { value: 'in-app', label: 'In-App', icon: 'apps' },
8952
+ ],
8953
+ selectedValue: ['email', 'push'],
8954
+ label: 'Notificaciones',
8955
+ icon: 'notifications-circle',
8956
+ multiple: true,
8957
+ color: 'tertiary',
8958
+ size: 'default',
8959
+ fill: 'outline',
8960
+ showCheckmark: true,
8961
+ };
8962
+ // ✅ Ejemplos de Language Selector
8963
+ this.basicLanguageSelector = {
8964
+ showLabel: true,
8965
+ label: 'Idioma',
8966
+ color: 'medium',
8967
+ size: 'default',
8968
+ fill: 'outline',
8969
+ };
8970
+ this.flagLanguageSelector = {
8971
+ showLabel: true,
8972
+ label: 'Language / Idioma',
8973
+ showFlags: true,
8974
+ color: 'primary',
8975
+ size: 'large',
8976
+ fill: 'solid',
8977
+ };
8978
+ this.customLanguageSelector = {
8979
+ showLabel: true,
8980
+ labelConfig: {
8981
+ className: '_global',
8982
+ key: 'language',
8983
+ fallback: 'Idioma',
8984
+ },
8985
+ showFlags: true,
8986
+ color: 'secondary',
8987
+ size: 'default',
8988
+ fill: 'outline',
8989
+ shape: 'round',
8990
+ customLanguageNames: {
8991
+ es: 'Español (España)',
8992
+ en: 'English (US)',
8993
+ fr: 'Français',
8994
+ de: 'Deutsch',
8995
+ },
8996
+ };
8997
+ }
8998
+ // ✅ Event Handlers
8999
+ onCategoryChange(category) {
9000
+ console.log('Category changed:', category);
9001
+ }
9002
+ onPriorityChange(priority) {
9003
+ console.log('Priority changed:', priority);
9004
+ }
9005
+ onMultipleChange(notifications) {
9006
+ console.log('Notifications changed:', notifications);
9007
+ }
9008
+ onLanguageChange(language) {
9009
+ console.log('Language changed:', language);
9010
+ }
9011
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectorExamplesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9012
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SelectorExamplesComponent, isStandalone: true, selector: "app-selector-examples", ngImport: i0, template: `
9013
+ <div class="selector-examples">
9014
+ <h2>Ejemplos de Selectores</h2>
9015
+
9016
+ <!-- Popover Selector Genérico -->
9017
+ <div class="section">
9018
+ <h3>Popover Selector Genérico</h3>
9019
+
9020
+ <div class="example-group">
9021
+ <h4>Selector de Categorías:</h4>
9022
+ <val-popover-selector [props]="categorySelector" (selectionChange)="onCategoryChange($event)">
9023
+ </val-popover-selector>
9024
+ </div>
9025
+
9026
+ <div class="example-group">
9027
+ <h4>Selector de Prioridad:</h4>
9028
+ <val-popover-selector [props]="prioritySelector" (selectionChange)="onPriorityChange($event)">
9029
+ </val-popover-selector>
9030
+ </div>
9031
+
9032
+ <div class="example-group">
9033
+ <h4>Selector Múltiple:</h4>
9034
+ <val-popover-selector [props]="multipleSelector" (selectionChange)="onMultipleChange($event)">
9035
+ </val-popover-selector>
9036
+ </div>
9037
+ </div>
9038
+
9039
+ <!-- Language Selector -->
9040
+ <div class="section">
9041
+ <h3>Selector de Idioma</h3>
9042
+
9043
+ <div class="example-group">
9044
+ <h4>Selector Básico:</h4>
9045
+ <val-language-selector [props]="basicLanguageSelector"> </val-language-selector>
9046
+ </div>
9047
+
9048
+ <div class="example-group">
9049
+ <h4>Selector con Banderas:</h4>
9050
+ <val-language-selector [props]="flagLanguageSelector"> </val-language-selector>
9051
+ </div>
9052
+
9053
+ <div class="example-group">
9054
+ <h4>Selector Personalizado:</h4>
9055
+ <val-language-selector [props]="customLanguageSelector" (languageChange)="onLanguageChange($event)">
9056
+ </val-language-selector>
9057
+ </div>
9058
+ </div>
9059
+ </div>
9060
+ `, 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"] }] }); }
9061
+ }
9062
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectorExamplesComponent, decorators: [{
9063
+ type: Component,
9064
+ args: [{ selector: 'app-selector-examples', standalone: true, imports: [PopoverSelectorComponent, LanguageSelectorComponent], template: `
9065
+ <div class="selector-examples">
9066
+ <h2>Ejemplos de Selectores</h2>
9067
+
9068
+ <!-- Popover Selector Genérico -->
9069
+ <div class="section">
9070
+ <h3>Popover Selector Genérico</h3>
9071
+
9072
+ <div class="example-group">
9073
+ <h4>Selector de Categorías:</h4>
9074
+ <val-popover-selector [props]="categorySelector" (selectionChange)="onCategoryChange($event)">
9075
+ </val-popover-selector>
9076
+ </div>
9077
+
9078
+ <div class="example-group">
9079
+ <h4>Selector de Prioridad:</h4>
9080
+ <val-popover-selector [props]="prioritySelector" (selectionChange)="onPriorityChange($event)">
9081
+ </val-popover-selector>
9082
+ </div>
9083
+
9084
+ <div class="example-group">
9085
+ <h4>Selector Múltiple:</h4>
9086
+ <val-popover-selector [props]="multipleSelector" (selectionChange)="onMultipleChange($event)">
9087
+ </val-popover-selector>
9088
+ </div>
9089
+ </div>
9090
+
9091
+ <!-- Language Selector -->
9092
+ <div class="section">
9093
+ <h3>Selector de Idioma</h3>
9094
+
9095
+ <div class="example-group">
9096
+ <h4>Selector Básico:</h4>
9097
+ <val-language-selector [props]="basicLanguageSelector"> </val-language-selector>
9098
+ </div>
9099
+
9100
+ <div class="example-group">
9101
+ <h4>Selector con Banderas:</h4>
9102
+ <val-language-selector [props]="flagLanguageSelector"> </val-language-selector>
9103
+ </div>
9104
+
9105
+ <div class="example-group">
9106
+ <h4>Selector Personalizado:</h4>
9107
+ <val-language-selector [props]="customLanguageSelector" (languageChange)="onLanguageChange($event)">
9108
+ </val-language-selector>
9109
+ </div>
9110
+ </div>
9111
+ </div>
9112
+ `, 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"] }]
9113
+ }] });
9114
+
8540
9115
  const text = {
8541
9116
  es: {
8542
9117
  spanish: 'Español',
@@ -8717,5 +9292,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
8717
9292
  * Generated bundle index. Do not edit.
8718
9293
  */
8719
9294
 
8720
- 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, LayeredCardComponent, LayoutComponent, LinkComponent, LinkProcessingExampleComponent, LinkProcessorService, LinksCakeComponent, ListContentHelper, LocalStorageService, MOTION, MultiLanguageDemoComponent, NavigationService, NoContentComponent, NotesBoxComponent, NumberInputComponent, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PasswordInputComponent, PinInputComponent, 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, 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 };
9295
+ 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 };
8721
9296
  //# sourceMappingURL=valtech-components.mjs.map