valtech-components 2.0.396 → 2.0.397

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,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, Component, Input, Output, Injectable, inject, InjectionToken, Inject, ChangeDetectorRef, HostListener, Pipe, ChangeDetectionStrategy, ViewChild, forwardRef } from '@angular/core';
3
- import { IonAvatar, IonCard, IonIcon, IonButton, IonSpinner, IonText, IonModal, IonHeader, IonToolbar, IonContent, IonButtons, IonTitle, IonProgressBar, IonCardContent, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCheckbox, IonTextarea, IonDatetime, IonDatetimeButton, IonInput, IonSelect, IonSelectOption, IonLabel, IonSearchbar, IonRadioGroup, IonRadio, IonMenuButton, IonFooter, IonList, IonListHeader, IonNote, IonItem } from '@ionic/angular/standalone';
2
+ import { EventEmitter, Component, Input, Output, Injectable, inject, InjectionToken, Inject, ChangeDetectorRef, HostListener, Pipe, ChangeDetectionStrategy, ViewChild } from '@angular/core';
3
+ import { IonAvatar, IonCard, IonIcon, IonButton, IonSpinner, IonText, IonModal, IonHeader, IonToolbar, IonContent, IonButtons, IonTitle, IonProgressBar, IonCardContent, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCheckbox, IonTextarea, IonDatetime, IonDatetimeButton, IonInput, IonSelect, IonSelectOption, IonLabel, IonRadioGroup, IonRadio, IonSearchbar, IonMenuButton, IonFooter, IonList, IonListHeader, IonNote, IonItem } from '@ionic/angular/standalone';
4
4
  import * as i1 from '@angular/common';
5
5
  import { CommonModule, NgStyle, Location, AsyncPipe, NgFor, NgClass } from '@angular/common';
6
6
  import { addIcons } from 'ionicons';
@@ -9,19 +9,19 @@ import { BehaviorSubject, distinctUntilChanged, shareReplay, map, Subscription,
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
- import { Clipboard } from '@capacitor/clipboard';
12
+ import * as i1$2 from '@angular/forms';
13
+ import { ReactiveFormsModule, FormsModule, Validators } from '@angular/forms';
14
+ import { map as map$1, distinctUntilChanged as distinctUntilChanged$1 } from 'rxjs/operators';
15
+ import * as i1$3 from 'ng-otp-input';
16
+ import { NgOtpInputComponent, NgOtpInputModule } from 'ng-otp-input';
13
17
  import * as i2 from '@ionic/angular';
14
- import { ToastController, IonicModule } from '@ionic/angular';
18
+ import { IonicModule, ToastController } from '@ionic/angular';
19
+ import { Clipboard } from '@capacitor/clipboard';
15
20
  import * as Prism from 'prismjs';
16
21
  import 'prismjs/components/prism-css';
17
22
  import 'prismjs/components/prism-javascript';
18
23
  import 'prismjs/components/prism-markup';
19
24
  import 'prismjs/components/prism-typescript';
20
- import * as i1$2 from '@angular/forms';
21
- import { ReactiveFormsModule, FormsModule, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
22
- import { map as map$1, distinctUntilChanged as distinctUntilChanged$1 } from 'rxjs/operators';
23
- import * as i1$3 from 'ng-otp-input';
24
- import { NgOtpInputComponent, NgOtpInputModule } from 'ng-otp-input';
25
25
  import 'prismjs/components/prism-bash';
26
26
 
27
27
  /**
@@ -3043,27 +3043,6 @@ function createTitleProps(styleConfig, contentConfig) {
3043
3043
  };
3044
3044
  }
3045
3045
 
3046
- class ActionHeaderComponent {
3047
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ActionHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3048
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ActionHeaderComponent, isStandalone: true, selector: "val-action-header", inputs: { props: "props" }, ngImport: i0, template: `
3049
- <section class="header-content-container">
3050
- <val-display [props]="props.title" />
3051
- <val-button [props]="props.action" />
3052
- </section>
3053
- `, isInline: true, styles: [".header-content-container{width:100%;display:flex;align-items:center;justify-content:space-between}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["props"], outputs: ["onClick"] }] }); }
3054
- }
3055
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ActionHeaderComponent, decorators: [{
3056
- type: Component,
3057
- args: [{ selector: 'val-action-header', standalone: true, imports: [CommonModule, DisplayComponent, ButtonComponent], template: `
3058
- <section class="header-content-container">
3059
- <val-display [props]="props.title" />
3060
- <val-button [props]="props.action" />
3061
- </section>
3062
- `, styles: [".header-content-container{width:100%;display:flex;align-items:center;justify-content:space-between}\n"] }]
3063
- }], propDecorators: { props: [{
3064
- type: Input
3065
- }] } });
3066
-
3067
3046
  /**
3068
3047
  * val-alert-box
3069
3048
  *
@@ -3613,150 +3592,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
3613
3592
  args: [{ selector: 'val-check-input', standalone: true, imports: [CommonModule, IonCheckbox], template: ` <ion-checkbox>I agree to the terms and conditions</ion-checkbox> ` }]
3614
3593
  }], ctorParameters: () => [] });
3615
3594
 
3616
- class CodeDisplayComponent {
3617
- constructor(cdr) {
3618
- this.cdr = cdr;
3619
- this.toast = inject(ToastController);
3620
- this.langService = inject(LangService);
3621
- this.selectedTab = 0;
3622
- }
3623
- ngOnChanges(changes) {
3624
- if (changes['code'] || changes['language'] || changes['tabs']) {
3625
- this.cdr.detectChanges();
3626
- setTimeout(() => this.highlightCode());
3627
- }
3628
- }
3629
- ngAfterViewInit() {
3630
- setTimeout(() => this.highlightCode());
3631
- }
3632
- selectTab(i) {
3633
- this.selectedTab = i;
3634
- this.cdr.detectChanges();
3635
- setTimeout(() => this.highlightCode());
3636
- }
3637
- highlightCode() {
3638
- if (this.codeElement) {
3639
- const code = this.props.tabs.length > 0 ? this.props.tabs[this.selectedTab]?.code : this.props.code;
3640
- this.codeElement.nativeElement.textContent = code || '';
3641
- Prism.highlightElement(this.codeElement.nativeElement);
3642
- }
3643
- }
3644
- async copyToClipboard() {
3645
- try {
3646
- const code = this.props.tabs.length > 0 ? this.props.tabs[this.selectedTab]?.code : this.props.code;
3647
- await Clipboard.write({ string: code || '' });
3648
- const copiedMessage = this.langService.getText('_global', 'copied', '¡Copiado al portapapeles!');
3649
- this.presentToast(copiedMessage);
3650
- }
3651
- catch (error) {
3652
- console.error('Error al copiar al portapapeles:', error);
3653
- }
3654
- }
3655
- async presentToast(message) {
3656
- const toast = await this.toast.create({
3657
- message: message,
3658
- duration: 2000,
3659
- position: 'bottom',
3660
- color: 'dark',
3661
- });
3662
- toast.present();
3663
- }
3664
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CodeDisplayComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
3665
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CodeDisplayComponent, isStandalone: true, selector: "val-code-display", inputs: { props: "props" }, viewQueries: [{ propertyName: "codeElement", first: true, predicate: ["codeElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
3666
- <div class="code-viewer-container">
3667
- <div class="tab-bar">
3668
- <div
3669
- class="tab"
3670
- *ngFor="let tab of props.tabs; let i = index"
3671
- [class.active]="i === selectedTab"
3672
- (click)="selectTab(i)"
3673
- >
3674
- <span class="tab-label">{{ tab.label }}</span>
3675
- </div>
3676
- </div>
3677
- <div class="code-content">
3678
- <!-- <span class="language-badge">{{ props.tabs[selectedTab]?.language || props.language }}</span> -->
3679
- <ion-button fill="clear" class="copy-button" (click)="copyToClipboard()">
3680
- <ion-icon name="copy-outline"></ion-icon>
3681
- </ion-button>
3682
- <pre><code [class]="'language-' + (props.tabs[selectedTab]?.language || props.language)" #codeElement></code></pre>
3683
- </div>
3684
- </div>
3685
- `, 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)}.code-viewer-container{background-color:#fff;border-radius:24px;overflow:hidden;box-shadow:0 2px 4px #0000000d;border:1px solid #f2f6f7;position:relative;min-width:320px;max-width:100%}.tab-bar{display:flex;background:#f6f9fa;border-bottom:1px solid #f2f6f7;gap:2px;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;scrollbar-color:#e0e0e0 #f6f9fa;-webkit-overflow-scrolling:touch;max-width:100%;font-size:12px}.tab-bar::-webkit-scrollbar{height:6px;background:#f6f9fa}.tab-bar::-webkit-scrollbar-thumb{background:#e0e0e0;border-radius:4px}.tab{padding:10px 18px 8px;font-family:Roboto Mono,monospace;font-size:.95em;color:#899396;cursor:pointer;border-radius:8px 8px 0 0;background:transparent;transition:background .2s,color .2s;margin-bottom:-1px;border:1px solid transparent;border-bottom:none}.tab:hover{background:#e8eef2}.tab.active{background:#fff;color:#19422d;border:1px solid #f2f6f7;border-bottom:1px solid #ffffff;z-index:2}.tab-label{font-weight:500}.code-content{overflow-x:auto;overflow-y:auto;max-height:30rem;min-height:5rem;background:#fff;position:relative}.language-badge{position:absolute;top:15px;left:15px;background:#f6f9fa;color:#899396;font-family:Roboto Mono,monospace;font-size:.8em;font-weight:500;border-radius:6px;padding:2px 8px;z-index:3;pointer-events:none;text-transform:uppercase}.copy-button{position:absolute;top:10px;right:15px;z-index:10;--padding-start: 2px;--padding-end: 2px;--padding-top: 2px;--padding-bottom: 2px;min-width:28px;min-height:28px;height:28px;width:28px;color:var(--ion-color-primary);background:#ffffffb3;border-radius:6px;box-shadow:0 1px 4px #0000000d;display:flex;align-items:center;justify-content:center;transition:background .2s ease}.copy-button:hover{background:#ffffffe6}.copy-button ion-icon{font-size:1.2em;margin:0}pre{margin:0;padding:0;background-color:transparent;min-width:100%;min-height:100%;white-space:pre;word-break:normal;font-family:Roboto Mono,monospace}code{font-family:Roboto Mono,monospace;font-size:.9em;line-height:1.5;display:block;white-space:inherit;word-break:normal}@media (max-width: 600px){.code-viewer-container{border-radius:24px}.tab-bar{font-size:11px}.language-badge{font-size:.7em;padding:1px 6px;top:10px;left:10px}.copy-button{top:10px;right:10px}.code-content{max-height:20rem}code{font-size:.7em}}@media (min-width: 600px){code{font-size:.8em}}@media (prefers-color-scheme: dark){.code-viewer-container{background-color:#21252b;box-shadow:0 4px 15px #0009;border:1px solid #3b4048}.tab-bar{background:#1a1a1a;border-bottom:1px solid #3b4048;scrollbar-color:#3b4048 #1a1a1a}.tab-bar::-webkit-scrollbar{background:#1a1a1a}.tab-bar::-webkit-scrollbar-thumb{background:#3b4048}.tab{color:#8b949e}.tab:hover{background:#21252b}.tab.active{background:#282c34;color:#c9d1d9;border:1px solid #3b4048;border-bottom:1px solid #282c34}.code-content{background:#161b22}.language-badge{background:#3e4451;color:#8b949e}.copy-button{background:#0006}.copy-button:hover{background:#0009}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { 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"] }] }); }
3686
- }
3687
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CodeDisplayComponent, decorators: [{
3688
- type: Component,
3689
- args: [{ selector: 'val-code-display', standalone: true, imports: [CommonModule, IonIcon, IonButton], template: `
3690
- <div class="code-viewer-container">
3691
- <div class="tab-bar">
3692
- <div
3693
- class="tab"
3694
- *ngFor="let tab of props.tabs; let i = index"
3695
- [class.active]="i === selectedTab"
3696
- (click)="selectTab(i)"
3697
- >
3698
- <span class="tab-label">{{ tab.label }}</span>
3699
- </div>
3700
- </div>
3701
- <div class="code-content">
3702
- <!-- <span class="language-badge">{{ props.tabs[selectedTab]?.language || props.language }}</span> -->
3703
- <ion-button fill="clear" class="copy-button" (click)="copyToClipboard()">
3704
- <ion-icon name="copy-outline"></ion-icon>
3705
- </ion-button>
3706
- <pre><code [class]="'language-' + (props.tabs[selectedTab]?.language || props.language)" #codeElement></code></pre>
3707
- </div>
3708
- </div>
3709
- `, 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)}.code-viewer-container{background-color:#fff;border-radius:24px;overflow:hidden;box-shadow:0 2px 4px #0000000d;border:1px solid #f2f6f7;position:relative;min-width:320px;max-width:100%}.tab-bar{display:flex;background:#f6f9fa;border-bottom:1px solid #f2f6f7;gap:2px;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;scrollbar-color:#e0e0e0 #f6f9fa;-webkit-overflow-scrolling:touch;max-width:100%;font-size:12px}.tab-bar::-webkit-scrollbar{height:6px;background:#f6f9fa}.tab-bar::-webkit-scrollbar-thumb{background:#e0e0e0;border-radius:4px}.tab{padding:10px 18px 8px;font-family:Roboto Mono,monospace;font-size:.95em;color:#899396;cursor:pointer;border-radius:8px 8px 0 0;background:transparent;transition:background .2s,color .2s;margin-bottom:-1px;border:1px solid transparent;border-bottom:none}.tab:hover{background:#e8eef2}.tab.active{background:#fff;color:#19422d;border:1px solid #f2f6f7;border-bottom:1px solid #ffffff;z-index:2}.tab-label{font-weight:500}.code-content{overflow-x:auto;overflow-y:auto;max-height:30rem;min-height:5rem;background:#fff;position:relative}.language-badge{position:absolute;top:15px;left:15px;background:#f6f9fa;color:#899396;font-family:Roboto Mono,monospace;font-size:.8em;font-weight:500;border-radius:6px;padding:2px 8px;z-index:3;pointer-events:none;text-transform:uppercase}.copy-button{position:absolute;top:10px;right:15px;z-index:10;--padding-start: 2px;--padding-end: 2px;--padding-top: 2px;--padding-bottom: 2px;min-width:28px;min-height:28px;height:28px;width:28px;color:var(--ion-color-primary);background:#ffffffb3;border-radius:6px;box-shadow:0 1px 4px #0000000d;display:flex;align-items:center;justify-content:center;transition:background .2s ease}.copy-button:hover{background:#ffffffe6}.copy-button ion-icon{font-size:1.2em;margin:0}pre{margin:0;padding:0;background-color:transparent;min-width:100%;min-height:100%;white-space:pre;word-break:normal;font-family:Roboto Mono,monospace}code{font-family:Roboto Mono,monospace;font-size:.9em;line-height:1.5;display:block;white-space:inherit;word-break:normal}@media (max-width: 600px){.code-viewer-container{border-radius:24px}.tab-bar{font-size:11px}.language-badge{font-size:.7em;padding:1px 6px;top:10px;left:10px}.copy-button{top:10px;right:10px}.code-content{max-height:20rem}code{font-size:.7em}}@media (min-width: 600px){code{font-size:.8em}}@media (prefers-color-scheme: dark){.code-viewer-container{background-color:#21252b;box-shadow:0 4px 15px #0009;border:1px solid #3b4048}.tab-bar{background:#1a1a1a;border-bottom:1px solid #3b4048;scrollbar-color:#3b4048 #1a1a1a}.tab-bar::-webkit-scrollbar{background:#1a1a1a}.tab-bar::-webkit-scrollbar-thumb{background:#3b4048}.tab{color:#8b949e}.tab:hover{background:#21252b}.tab.active{background:#282c34;color:#c9d1d9;border:1px solid #3b4048;border-bottom:1px solid #282c34}.code-content{background:#161b22}.language-badge{background:#3e4451;color:#8b949e}.copy-button{background:#0006}.copy-button:hover{background:#0009}}\n"] }]
3710
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { codeElement: [{
3711
- type: ViewChild,
3712
- args: ['codeElement']
3713
- }], props: [{
3714
- type: Input
3715
- }] } });
3716
-
3717
- class CommandDisplayComponent {
3718
- constructor() {
3719
- this.toast = inject(ToastController);
3720
- this.langService = inject(LangService);
3721
- }
3722
- async copyCommand() {
3723
- if (this.props.text) {
3724
- await Clipboard.write({
3725
- string: this.props.text,
3726
- });
3727
- const copiedMessage = this.langService.getText('_global', 'copied', '¡Copiado al portapapeles!');
3728
- this.presentToast(copiedMessage);
3729
- }
3730
- }
3731
- async presentToast(message) {
3732
- const toast = await this.toast.create({
3733
- message: message,
3734
- duration: 2000,
3735
- position: 'bottom',
3736
- color: 'dark',
3737
- });
3738
- toast.present();
3739
- }
3740
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CommandDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3741
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CommandDisplayComponent, isStandalone: true, selector: "val-command-display", inputs: { props: "props" }, ngImport: i0, template: `
3742
- <div class="command-container">
3743
- <div class="command-text">$ {{ props.text }}</div>
3744
- <ion-icon name="copy-outline" class="copy-icon" (click)="copyCommand()"></ion-icon>
3745
- </div>
3746
- `, isInline: true, styles: [".command-container{display:flex;align-items:center;justify-content:space-between;background-color:var(--ion-color-light, #f2f2f2);border-radius:24px;padding:12px 16px;box-shadow:0 2px 4px #0000001a}.command-text{flex-grow:1;font-family:monospace;font-size:.8rem;color:var(--ion-color-dark, #333);margin-right:10px}.copy-icon{font-size:1.3rem;color:var(--ion-color-medium, #92949c);cursor:pointer;transition:color .2s ease-in-out}.copy-icon:hover{color:var(--ion-color-primary, #3880ff)}@media (min-width: 600px){.command-text,.copy-icon{font-size:1.2rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
3747
- }
3748
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CommandDisplayComponent, decorators: [{
3749
- type: Component,
3750
- args: [{ selector: 'val-command-display', standalone: true, imports: [CommonModule, IonIcon], template: `
3751
- <div class="command-container">
3752
- <div class="command-text">$ {{ props.text }}</div>
3753
- <ion-icon name="copy-outline" class="copy-icon" (click)="copyCommand()"></ion-icon>
3754
- </div>
3755
- `, styles: [".command-container{display:flex;align-items:center;justify-content:space-between;background-color:var(--ion-color-light, #f2f2f2);border-radius:24px;padding:12px 16px;box-shadow:0 2px 4px #0000001a}.command-text{flex-grow:1;font-family:monospace;font-size:.8rem;color:var(--ion-color-dark, #333);margin-right:10px}.copy-icon{font-size:1.3rem;color:var(--ion-color-medium, #92949c);cursor:pointer;transition:color .2s ease-in-out}.copy-icon:hover{color:var(--ion-color-primary, #3880ff)}@media (min-width: 600px){.command-text,.copy-icon{font-size:1.2rem}}\n"] }]
3756
- }], ctorParameters: () => [], propDecorators: { props: [{
3757
- type: Input
3758
- }] } });
3759
-
3760
3595
  /**
3761
3596
  * val-comment-input
3762
3597
  *
@@ -4315,247 +4150,52 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
4315
4150
  }] } });
4316
4151
 
4317
4152
  /**
4318
- * val-link
4153
+ * val-popover-selector
4319
4154
  *
4320
- * A stylized link button with navigation support for internal, in-app, or new tab links.
4155
+ * A generic reusable popover selector component that can be used for any type of selection.
4156
+ * Provides a button trigger that opens a popover with selectable options.
4321
4157
  *
4322
4158
  * @example
4323
- * <val-link [props]="{ text: 'Go', color: 'primary', link: '/home', type: 'internal' }" (onClick)="handler($event)"></val-link>
4159
+ * // Basic usage
4160
+ * <val-popover-selector
4161
+ * [props]="selectorProps"
4162
+ * (selectionChange)="onSelectionChange($event)">
4163
+ * </val-popover-selector>
4324
4164
  *
4325
- * @input props: LinkMetadata - Configuration for the link (text, color, link, type, etc.)
4326
- * @output onClick - Emits the token of the clicked link
4165
+ * @example
4166
+ * // With icon and custom styling
4167
+ * const selectorProps: PopoverSelectorMetadata = {
4168
+ * options: [
4169
+ * { value: 'option1', label: 'Option 1', icon: 'star' },
4170
+ * { value: 'option2', label: 'Option 2', icon: 'heart' }
4171
+ * ],
4172
+ * selectedValue: 'option1',
4173
+ * label: 'Choose option',
4174
+ * icon: 'settings',
4175
+ * color: 'primary',
4176
+ * size: 'large',
4177
+ * fill: 'solid'
4178
+ * };
4179
+ *
4180
+ * @input props: PopoverSelectorMetadata - Configuration for the selector
4181
+ * @output selectionChange: EventEmitter<string | string[]> - Emitted when selection changes
4327
4182
  */
4328
- class LinkComponent {
4183
+ class PopoverSelectorComponent {
4329
4184
  constructor() {
4330
- this.onClick = new EventEmitter();
4331
- this.service = inject(NavigationService);
4332
- addIcons({ chevronForwardOutline });
4185
+ /**
4186
+ * Event emitted when the selection changes.
4187
+ * Emits the selected value(s).
4188
+ */
4189
+ this.selectionChange = new EventEmitter();
4190
+ this.langService = inject(LangService);
4191
+ // Register required icons
4192
+ addIcons({ chevronDown });
4333
4193
  }
4334
- ngOnInit() { }
4335
- onClickHandler() {
4336
- this.onClick.emit(this.props.token);
4337
- switch (this.props.type) {
4338
- case 'internal':
4339
- this.service.navigateByUrl(this.props.link);
4340
- break;
4341
- case 'browse':
4342
- this.service.navigateInApp(this.props.link);
4343
- break;
4344
- case 'tab':
4345
- this.service.openInNewTab(this.props.link);
4346
- break;
4347
- }
4348
- }
4349
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4350
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LinkComponent, isStandalone: true, selector: "val-link", inputs: { props: "props" }, outputs: { onClick: "onClick" }, ngImport: i0, template: `
4351
- <div>
4352
- <ion-button type="button" [color]="props.color" fill="clear" [size]="props.size" (click)="onClickHandler()">
4353
- <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
4354
- <ion-text>{{ props.text }}</ion-text>
4355
- </ion-button>
4356
- </div>
4357
- `, 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)}ion-button{font-family:var(--ion-default-font),Arial,sans-serif;margin:0;--padding-bottom: 0;--padding-top: 0;--padding-start: 0;--padding-end: 0}\n"], dependencies: [{ kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }] }); }
4358
- }
4359
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkComponent, decorators: [{
4360
- type: Component,
4361
- args: [{ selector: 'val-link', standalone: true, imports: [IonButton, IonIcon, IonText], template: `
4362
- <div>
4363
- <ion-button type="button" [color]="props.color" fill="clear" [size]="props.size" (click)="onClickHandler()">
4364
- <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
4365
- <ion-text>{{ props.text }}</ion-text>
4366
- </ion-button>
4367
- </div>
4368
- `, 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)}ion-button{font-family:var(--ion-default-font),Arial,sans-serif;margin:0;--padding-bottom: 0;--padding-top: 0;--padding-start: 0;--padding-end: 0}\n"] }]
4369
- }], ctorParameters: () => [], propDecorators: { props: [{
4370
- type: Input
4371
- }], onClick: [{
4372
- type: Output
4373
- }] } });
4374
-
4375
- /**
4376
- * val-title-block
4377
- *
4378
- * Displays a block of titles (above, main, below) with configurable styles and positions.
4379
- *
4380
- * @example
4381
- * <val-title-block [props]="{ title: {...}, aboveTitle: {...}, bellowTitle: {...}, position: 'center' }"></val-title-block>
4382
- *
4383
- * @input props: TitleBlockMetada - Configuration for the title block (title, aboveTitle, bellowTitle, position)
4384
- */
4385
- class TitleBlockComponent {
4386
- constructor(cdr) {
4387
- this.cdr = cdr;
4388
- }
4389
- ngOnInit() { }
4390
- ngOnChanges(changes) {
4391
- if (changes['props']) {
4392
- // Forzar detección de cambios múltiple
4393
- this.cdr.detectChanges();
4394
- setTimeout(() => {
4395
- this.cdr.detectChanges();
4396
- }, 0);
4397
- }
4398
- }
4399
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TitleBlockComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
4400
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TitleBlockComponent, isStandalone: true, selector: "val-title-block", inputs: { props: "props" }, usesOnChanges: true, ngImport: i0, template: `
4401
- <div [ngClass]="['titles-container', props.position]">
4402
- <val-title
4403
- *ngIf="props.aboveTitle"
4404
- [props]="{
4405
- content: props.aboveTitle.content | uppercase,
4406
- color: props.aboveTitle.color,
4407
- bold: false,
4408
- size: props.aboveTitle.size,
4409
- }"
4410
- ></val-title>
4411
- <val-display
4412
- *ngIf="props.title"
4413
- [props]="{
4414
- content: props.title.content,
4415
- color: props.title.color,
4416
- size: props.title.size,
4417
- }"
4418
- ></val-display>
4419
- <val-title
4420
- style="margin-top: 16px;"
4421
- *ngIf="props.bellowTitle"
4422
- [props]="{
4423
- content: props.bellowTitle.content,
4424
- color: props.bellowTitle.color,
4425
- bold: false,
4426
- size: props.bellowTitle.size,
4427
- thin: props.bellowTitle.thin,
4428
- }"
4429
- ></val-title>
4430
- </div>
4431
- `, 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)}val-button,val-title,val-display{display:inline-block}.titles-container{width:100%;display:flex;flex-direction:column;flex-wrap:wrap}.titles-container.left{align-content:flex-start;align-items:start;text-align:left}.titles-container.center{align-content:center;align-items:center;text-align:center}.titles-container.right{align-content:flex-end;align-items:end;text-align:end}.titles-container.leftocenter{align-content:flex-start;align-items:start;text-align:left}@media (min-width: 768px){.titles-container.leftocenter{align-content:center;align-items:center;text-align:center}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }] }); }
4432
- }
4433
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TitleBlockComponent, decorators: [{
4434
- type: Component,
4435
- args: [{ selector: 'val-title-block', standalone: true, imports: [CommonModule, TitleComponent, DisplayComponent], template: `
4436
- <div [ngClass]="['titles-container', props.position]">
4437
- <val-title
4438
- *ngIf="props.aboveTitle"
4439
- [props]="{
4440
- content: props.aboveTitle.content | uppercase,
4441
- color: props.aboveTitle.color,
4442
- bold: false,
4443
- size: props.aboveTitle.size,
4444
- }"
4445
- ></val-title>
4446
- <val-display
4447
- *ngIf="props.title"
4448
- [props]="{
4449
- content: props.title.content,
4450
- color: props.title.color,
4451
- size: props.title.size,
4452
- }"
4453
- ></val-display>
4454
- <val-title
4455
- style="margin-top: 16px;"
4456
- *ngIf="props.bellowTitle"
4457
- [props]="{
4458
- content: props.bellowTitle.content,
4459
- color: props.bellowTitle.color,
4460
- bold: false,
4461
- size: props.bellowTitle.size,
4462
- thin: props.bellowTitle.thin,
4463
- }"
4464
- ></val-title>
4465
- </div>
4466
- `, 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)}val-button,val-title,val-display{display:inline-block}.titles-container{width:100%;display:flex;flex-direction:column;flex-wrap:wrap}.titles-container.left{align-content:flex-start;align-items:start;text-align:left}.titles-container.center{align-content:center;align-items:center;text-align:center}.titles-container.right{align-content:flex-end;align-items:end;text-align:end}.titles-container.leftocenter{align-content:flex-start;align-items:start;text-align:left}@media (min-width: 768px){.titles-container.leftocenter{align-content:center;align-items:center;text-align:center}}\n"] }]
4467
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { props: [{
4468
- type: Input
4469
- }] } });
4470
-
4471
- // src/app/layout/layout.component.ts (solo la parte de styles)
4472
- class InfoComponent {
4473
- constructor() {
4474
- this.icon = inject(IconService);
4475
- }
4476
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4477
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: InfoComponent, isStandalone: true, selector: "val-info", inputs: { props: "props" }, ngImport: i0, template: `
4478
- @if (props.image) {
4479
- <val-image style="display: contents;" [props]="props.image" />
4480
- }
4481
- <val-title-block style="display: block;margin-top: 16px;" [props]="props.title" />
4482
-
4483
- @if (props.link) {
4484
- <val-link [props]="props.link" />
4485
- }
4486
-
4487
- @if (props.actions) {
4488
- <val-button-group [props]="props.actions" />
4489
- }
4490
- `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: LinkComponent, selector: "val-link", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: TitleBlockComponent, selector: "val-title-block", inputs: ["props"] }, { kind: "component", type: ImageComponent, selector: "val-image", inputs: ["props"] }, { kind: "component", type: ButtonGroupComponent, selector: "val-button-group", inputs: ["props"], outputs: ["onClick"] }] }); }
4491
- }
4492
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InfoComponent, decorators: [{
4493
- type: Component,
4494
- args: [{ selector: 'val-info', standalone: true, imports: [CommonModule, LinkComponent, TitleBlockComponent, ImageComponent, ButtonGroupComponent], template: `
4495
- @if (props.image) {
4496
- <val-image style="display: contents;" [props]="props.image" />
4497
- }
4498
- <val-title-block style="display: block;margin-top: 16px;" [props]="props.title" />
4499
-
4500
- @if (props.link) {
4501
- <val-link [props]="props.link" />
4502
- }
4503
-
4504
- @if (props.actions) {
4505
- <val-button-group [props]="props.actions" />
4506
- }
4507
- ` }]
4508
- }], propDecorators: { props: [{
4509
- type: Input
4510
- }] } });
4511
-
4512
- /**
4513
- * val-popover-selector
4514
- *
4515
- * A generic reusable popover selector component that can be used for any type of selection.
4516
- * Provides a button trigger that opens a popover with selectable options.
4517
- *
4518
- * @example
4519
- * // Basic usage
4520
- * <val-popover-selector
4521
- * [props]="selectorProps"
4522
- * (selectionChange)="onSelectionChange($event)">
4523
- * </val-popover-selector>
4524
- *
4525
- * @example
4526
- * // With icon and custom styling
4527
- * const selectorProps: PopoverSelectorMetadata = {
4528
- * options: [
4529
- * { value: 'option1', label: 'Option 1', icon: 'star' },
4530
- * { value: 'option2', label: 'Option 2', icon: 'heart' }
4531
- * ],
4532
- * selectedValue: 'option1',
4533
- * label: 'Choose option',
4534
- * icon: 'settings',
4535
- * color: 'primary',
4536
- * size: 'large',
4537
- * fill: 'solid'
4538
- * };
4539
- *
4540
- * @input props: PopoverSelectorMetadata - Configuration for the selector
4541
- * @output selectionChange: EventEmitter<string | string[]> - Emitted when selection changes
4542
- */
4543
- class PopoverSelectorComponent {
4544
- constructor() {
4545
- /**
4546
- * Event emitted when the selection changes.
4547
- * Emits the selected value(s).
4548
- */
4549
- this.selectionChange = new EventEmitter();
4550
- this.langService = inject(LangService);
4551
- // Register required icons
4552
- addIcons({ chevronDown });
4553
- }
4554
- /**
4555
- * Get reactive placeholder text.
4556
- */
4557
- getPlaceholderText() {
4558
- return this.props.placeholder || this.langService.getText('_global', 'select', 'Seleccionar...');
4194
+ /**
4195
+ * Get reactive placeholder text.
4196
+ */
4197
+ getPlaceholderText() {
4198
+ return this.props.placeholder || this.langService.getText('_global', 'select', 'Seleccionar...');
4559
4199
  }
4560
4200
  /**
4561
4201
  * Get reactive cancel text.
@@ -5039,52 +4679,148 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
5039
4679
  }]
5040
4680
  }], ctorParameters: () => [] });
5041
4681
 
5042
- class LayeredCardComponent {
5043
- constructor() {
5044
- this.theme = inject(ThemeService);
4682
+ /**
4683
+ * val-title-block
4684
+ *
4685
+ * Displays a block of titles (above, main, below) with configurable styles and positions.
4686
+ *
4687
+ * @example
4688
+ * <val-title-block [props]="{ title: {...}, aboveTitle: {...}, bellowTitle: {...}, position: 'center' }"></val-title-block>
4689
+ *
4690
+ * @input props: TitleBlockMetada - Configuration for the title block (title, aboveTitle, bellowTitle, position)
4691
+ */
4692
+ class TitleBlockComponent {
4693
+ constructor(cdr) {
4694
+ this.cdr = cdr;
5045
4695
  }
5046
- color(background) {
5047
- if (!background) {
5048
- return '';
4696
+ ngOnInit() { }
4697
+ ngOnChanges(changes) {
4698
+ if (changes['props']) {
4699
+ // Forzar detección de cambios múltiple
4700
+ this.cdr.detectChanges();
4701
+ setTimeout(() => {
4702
+ this.cdr.detectChanges();
4703
+ }, 0);
5049
4704
  }
5050
- return resolveColor(background);
5051
4705
  }
5052
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LayeredCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5053
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: LayeredCardComponent, isStandalone: true, selector: "layered-card", inputs: { props: "props" }, ngImport: i0, template: `
5054
- <div
5055
- class="fun-card"
5056
- [class.big-space]="props.bigSpace"
5057
- [class.hoverable]="props.hoverable"
5058
- [class.layered]="props.mode === 'layered'"
5059
- [class.poster]="props.mode === 'poster'"
5060
- [ngStyle]="{
5061
- background: theme.IsDark ? 'var(--ion-background-color)' : color(props.background),
5062
- minHeight: props.withMin ? '340px' : 'auto',
5063
- }"
5064
- >
5065
- @if (props.mode === 'poster') {
5066
- <img
5067
- class="poster-image"
5068
- [class.dark]="props.dark"
5069
- [class.with-opacity]="props.withOpacity"
5070
- alt="image"
5071
- [src]="props.image"
5072
- />
5073
- }
5074
- @if (props.mode === 'layered') {
5075
- <img
5076
- class="layer-image"
5077
- [class.dark]="props.dark"
5078
- [class.with-opacity]="props.withOpacity"
5079
- alt="image"
5080
- [src]="props.image"
5081
- />
5082
- }
5083
-
5084
- <section>
5085
- <val-title-block [props]="props.content" />
5086
- @if (props.actions) {
5087
- <val-button-group style="display:block; margin-top: 16px;" [props]="props.actions" />
4706
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TitleBlockComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
4707
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TitleBlockComponent, isStandalone: true, selector: "val-title-block", inputs: { props: "props" }, usesOnChanges: true, ngImport: i0, template: `
4708
+ <div [ngClass]="['titles-container', props.position]">
4709
+ <val-title
4710
+ *ngIf="props.aboveTitle"
4711
+ [props]="{
4712
+ content: props.aboveTitle.content | uppercase,
4713
+ color: props.aboveTitle.color,
4714
+ bold: false,
4715
+ size: props.aboveTitle.size,
4716
+ }"
4717
+ ></val-title>
4718
+ <val-display
4719
+ *ngIf="props.title"
4720
+ [props]="{
4721
+ content: props.title.content,
4722
+ color: props.title.color,
4723
+ size: props.title.size,
4724
+ }"
4725
+ ></val-display>
4726
+ <val-title
4727
+ style="margin-top: 16px;"
4728
+ *ngIf="props.bellowTitle"
4729
+ [props]="{
4730
+ content: props.bellowTitle.content,
4731
+ color: props.bellowTitle.color,
4732
+ bold: false,
4733
+ size: props.bellowTitle.size,
4734
+ thin: props.bellowTitle.thin,
4735
+ }"
4736
+ ></val-title>
4737
+ </div>
4738
+ `, 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)}val-button,val-title,val-display{display:inline-block}.titles-container{width:100%;display:flex;flex-direction:column;flex-wrap:wrap}.titles-container.left{align-content:flex-start;align-items:start;text-align:left}.titles-container.center{align-content:center;align-items:center;text-align:center}.titles-container.right{align-content:flex-end;align-items:end;text-align:end}.titles-container.leftocenter{align-content:flex-start;align-items:start;text-align:left}@media (min-width: 768px){.titles-container.leftocenter{align-content:center;align-items:center;text-align:center}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }] }); }
4739
+ }
4740
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TitleBlockComponent, decorators: [{
4741
+ type: Component,
4742
+ args: [{ selector: 'val-title-block', standalone: true, imports: [CommonModule, TitleComponent, DisplayComponent], template: `
4743
+ <div [ngClass]="['titles-container', props.position]">
4744
+ <val-title
4745
+ *ngIf="props.aboveTitle"
4746
+ [props]="{
4747
+ content: props.aboveTitle.content | uppercase,
4748
+ color: props.aboveTitle.color,
4749
+ bold: false,
4750
+ size: props.aboveTitle.size,
4751
+ }"
4752
+ ></val-title>
4753
+ <val-display
4754
+ *ngIf="props.title"
4755
+ [props]="{
4756
+ content: props.title.content,
4757
+ color: props.title.color,
4758
+ size: props.title.size,
4759
+ }"
4760
+ ></val-display>
4761
+ <val-title
4762
+ style="margin-top: 16px;"
4763
+ *ngIf="props.bellowTitle"
4764
+ [props]="{
4765
+ content: props.bellowTitle.content,
4766
+ color: props.bellowTitle.color,
4767
+ bold: false,
4768
+ size: props.bellowTitle.size,
4769
+ thin: props.bellowTitle.thin,
4770
+ }"
4771
+ ></val-title>
4772
+ </div>
4773
+ `, 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)}val-button,val-title,val-display{display:inline-block}.titles-container{width:100%;display:flex;flex-direction:column;flex-wrap:wrap}.titles-container.left{align-content:flex-start;align-items:start;text-align:left}.titles-container.center{align-content:center;align-items:center;text-align:center}.titles-container.right{align-content:flex-end;align-items:end;text-align:end}.titles-container.leftocenter{align-content:flex-start;align-items:start;text-align:left}@media (min-width: 768px){.titles-container.leftocenter{align-content:center;align-items:center;text-align:center}}\n"] }]
4774
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { props: [{
4775
+ type: Input
4776
+ }] } });
4777
+
4778
+ class LayeredCardComponent {
4779
+ constructor() {
4780
+ this.theme = inject(ThemeService);
4781
+ }
4782
+ color(background) {
4783
+ if (!background) {
4784
+ return '';
4785
+ }
4786
+ return resolveColor(background);
4787
+ }
4788
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LayeredCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4789
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: LayeredCardComponent, isStandalone: true, selector: "layered-card", inputs: { props: "props" }, ngImport: i0, template: `
4790
+ <div
4791
+ class="fun-card"
4792
+ [class.big-space]="props.bigSpace"
4793
+ [class.hoverable]="props.hoverable"
4794
+ [class.layered]="props.mode === 'layered'"
4795
+ [class.poster]="props.mode === 'poster'"
4796
+ [ngStyle]="{
4797
+ background: theme.IsDark ? 'var(--ion-background-color)' : color(props.background),
4798
+ minHeight: props.withMin ? '340px' : 'auto',
4799
+ }"
4800
+ >
4801
+ @if (props.mode === 'poster') {
4802
+ <img
4803
+ class="poster-image"
4804
+ [class.dark]="props.dark"
4805
+ [class.with-opacity]="props.withOpacity"
4806
+ alt="image"
4807
+ [src]="props.image"
4808
+ />
4809
+ }
4810
+ @if (props.mode === 'layered') {
4811
+ <img
4812
+ class="layer-image"
4813
+ [class.dark]="props.dark"
4814
+ [class.with-opacity]="props.withOpacity"
4815
+ alt="image"
4816
+ [src]="props.image"
4817
+ />
4818
+ }
4819
+
4820
+ <section>
4821
+ <val-title-block [props]="props.content" />
4822
+ @if (props.actions) {
4823
+ <val-button-group style="display:block; margin-top: 16px;" [props]="props.actions" />
5088
4824
  }
5089
4825
  </section>
5090
4826
  </div>
@@ -5135,6 +4871,64 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
5135
4871
  type: Input
5136
4872
  }] } });
5137
4873
 
4874
+ /**
4875
+ * val-link
4876
+ *
4877
+ * A stylized link button with navigation support for internal, in-app, or new tab links.
4878
+ *
4879
+ * @example
4880
+ * <val-link [props]="{ text: 'Go', color: 'primary', link: '/home', type: 'internal' }" (onClick)="handler($event)"></val-link>
4881
+ *
4882
+ * @input props: LinkMetadata - Configuration for the link (text, color, link, type, etc.)
4883
+ * @output onClick - Emits the token of the clicked link
4884
+ */
4885
+ class LinkComponent {
4886
+ constructor() {
4887
+ this.onClick = new EventEmitter();
4888
+ this.service = inject(NavigationService);
4889
+ addIcons({ chevronForwardOutline });
4890
+ }
4891
+ ngOnInit() { }
4892
+ onClickHandler() {
4893
+ this.onClick.emit(this.props.token);
4894
+ switch (this.props.type) {
4895
+ case 'internal':
4896
+ this.service.navigateByUrl(this.props.link);
4897
+ break;
4898
+ case 'browse':
4899
+ this.service.navigateInApp(this.props.link);
4900
+ break;
4901
+ case 'tab':
4902
+ this.service.openInNewTab(this.props.link);
4903
+ break;
4904
+ }
4905
+ }
4906
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4907
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LinkComponent, isStandalone: true, selector: "val-link", inputs: { props: "props" }, outputs: { onClick: "onClick" }, ngImport: i0, template: `
4908
+ <div>
4909
+ <ion-button type="button" [color]="props.color" fill="clear" [size]="props.size" (click)="onClickHandler()">
4910
+ <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
4911
+ <ion-text>{{ props.text }}</ion-text>
4912
+ </ion-button>
4913
+ </div>
4914
+ `, 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)}ion-button{font-family:var(--ion-default-font),Arial,sans-serif;margin:0;--padding-bottom: 0;--padding-top: 0;--padding-start: 0;--padding-end: 0}\n"], dependencies: [{ kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }] }); }
4915
+ }
4916
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkComponent, decorators: [{
4917
+ type: Component,
4918
+ args: [{ selector: 'val-link', standalone: true, imports: [IonButton, IonIcon, IonText], template: `
4919
+ <div>
4920
+ <ion-button type="button" [color]="props.color" fill="clear" [size]="props.size" (click)="onClickHandler()">
4921
+ <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
4922
+ <ion-text>{{ props.text }}</ion-text>
4923
+ </ion-button>
4924
+ </div>
4925
+ `, 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)}ion-button{font-family:var(--ion-default-font),Arial,sans-serif;margin:0;--padding-bottom: 0;--padding-top: 0;--padding-start: 0;--padding-end: 0}\n"] }]
4926
+ }], ctorParameters: () => [], propDecorators: { props: [{
4927
+ type: Input
4928
+ }], onClick: [{
4929
+ type: Output
4930
+ }] } });
4931
+
5138
4932
  /**
5139
4933
  * val-links-cake
5140
4934
  *
@@ -5181,1935 +4975,1414 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
5181
4975
  }] } });
5182
4976
 
5183
4977
  /**
5184
- * Removes diacritical marks (accents) from a string using Unicode normalization.
5185
- * Useful for text search and comparison.
4978
+ * val-notes-box
5186
4979
  *
5187
- * @param text The input string
5188
- * @returns The normalized string without diacritical marks
4980
+ * Displays a styled notes/info box with optional prefix and configurable color, size, and padding.
5189
4981
  *
5190
4982
  * @example
5191
- * replaceSpecialChars('canción') // returns 'cancion'
4983
+ * <val-notes-box [props]="{ text: 'Note', prefix: 'Info', color: 'primary', textColor: 'dark', size: 'medium', rounded: true, padding: '8px' }"></val-notes-box>
4984
+ *
4985
+ * @input props: NotesBoxMetadata - Configuration for the notes box (text, prefix, color, textColor, size, rounded, padding)
5192
4986
  */
5193
- const replaceSpecialChars = (text) => text.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
4987
+ class NotesBoxComponent {
4988
+ constructor() { }
4989
+ ngOnInit() { }
4990
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotesBoxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4991
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: NotesBoxComponent, isStandalone: true, selector: "val-notes-box", inputs: { props: "props" }, ngImport: i0, template: `
4992
+ <val-box
4993
+ [props]="{
4994
+ icon: '',
4995
+ bordered: false,
4996
+ color: props.color,
4997
+ leftBorder: true,
4998
+ rounded: props.rounded,
4999
+ padding: props.padding,
5000
+ }"
5001
+ >
5002
+ <div [ngClass]="['content-container', props.size]" body>
5003
+ @if (props.prefix) {
5004
+ <val-text
5005
+ [props]="{ content: props.prefix, color: props.textColor, bold: true, size: props.size }"
5006
+ ></val-text>
5007
+ }
5008
+ <val-text [props]="{ content: props.text, color: props.textColor, bold: false, size: props.size }"></val-text>
5009
+ </div>
5010
+ </val-box>
5011
+ `, 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)}.content-container{display:inline-grid}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: BoxComponent, selector: "val-box", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
5012
+ }
5013
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotesBoxComponent, decorators: [{
5014
+ type: Component,
5015
+ args: [{ selector: 'val-notes-box', standalone: true, imports: [CommonModule, BoxComponent, TextComponent], template: `
5016
+ <val-box
5017
+ [props]="{
5018
+ icon: '',
5019
+ bordered: false,
5020
+ color: props.color,
5021
+ leftBorder: true,
5022
+ rounded: props.rounded,
5023
+ padding: props.padding,
5024
+ }"
5025
+ >
5026
+ <div [ngClass]="['content-container', props.size]" body>
5027
+ @if (props.prefix) {
5028
+ <val-text
5029
+ [props]="{ content: props.prefix, color: props.textColor, bold: true, size: props.size }"
5030
+ ></val-text>
5031
+ }
5032
+ <val-text [props]="{ content: props.text, color: props.textColor, bold: false, size: props.size }"></val-text>
5033
+ </div>
5034
+ </val-box>
5035
+ `, 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)}.content-container{display:inline-grid}\n"] }]
5036
+ }], ctorParameters: () => [], propDecorators: { props: [{
5037
+ type: Input
5038
+ }] } });
5194
5039
 
5195
5040
  /**
5196
- * val-searchbar
5041
+ * val-number-input
5197
5042
  *
5198
- * A search bar component with debounce and event emitters for filtering, focus, and blur.
5043
+ * A number input field integrated with Angular forms.
5199
5044
  *
5200
5045
  * @example
5201
- * <val-searchbar (filterEvent)="onFilter($event)" (focusEvent)="onFocus()" (blurEvent)="onBlur()"></val-searchbar>
5046
+ * <val-number-input [props]="{ control: myControl, placeholder: 'Enter a number' }"></val-number-input>
5202
5047
  *
5203
- * @input disabled - Whether the searchbar is disabled.
5204
- * @output filterEvent - Emits the search term on input.
5205
- * @output focusEvent - Emits when the searchbar gains focus.
5206
- * @output blurEvent - Emits when the searchbar loses focus.
5048
+ * @input props: InputMetadata - Configuration for the input (form control, placeholder, etc.)
5207
5049
  */
5208
- class SearchbarComponent {
5209
- constructor() {
5210
- /**
5211
- * Emits the search term on input.
5212
- */
5213
- this.filterEvent = new EventEmitter();
5214
- /**
5215
- * Emits when the searchbar gains focus.
5216
- */
5217
- this.focusEvent = new EventEmitter();
5218
- /**
5219
- * Emits when the searchbar loses focus.
5220
- */
5221
- this.blurEvent = new EventEmitter();
5222
- }
5223
- onSearch($event) {
5224
- const searchTerm = $event.detail.value;
5225
- this.filterEvent.emit(searchTerm);
5226
- }
5227
- onFocus() {
5228
- this.focusEvent.emit();
5229
- }
5230
- onBlur() {
5231
- this.blurEvent.emit();
5050
+ class NumberInputComponent {
5051
+ constructor() { }
5052
+ ngOnInit() {
5053
+ // Apply default values on initialization
5054
+ if (this.props?.withDefault || this.props?.value) {
5055
+ applyDefaultValueToControl(this.props);
5056
+ }
5232
5057
  }
5233
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5234
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchbarComponent, isStandalone: true, selector: "val-searchbar", inputs: { disabled: "disabled" }, outputs: { filterEvent: "filterEvent", focusEvent: "focusEvent", blurEvent: "blurEvent" }, ngImport: i0, template: `
5235
- <ion-searchbar
5236
- mode="ios"
5237
- debounce="500"
5238
- placeholder="Búsqueda"
5239
- [disabled]="disabled"
5240
- showCancelButton="focus"
5241
- cancelButtonText="Cancelar"
5242
- (ionInput)="onSearch($event)"
5243
- (ionBlur)="onBlur()"
5244
- (ionFocus)="onFocus()"
5245
- >
5246
- </ion-searchbar>
5247
- `, 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)}ion-searchbar{--cancel-button-color: var(--ion-color-dark);--background: var(--ion-color-light);font-family:var(--ion-default-font),Arial,sans-serif}\n"], dependencies: [{ kind: "component", type: IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }] }); }
5058
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumberInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5059
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NumberInputComponent, isStandalone: true, selector: "val-number-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-input [formControl]="props.control" type="number" [placeholder]="props.placeholder"></ion-input> `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
5248
5060
  }
5249
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchbarComponent, decorators: [{
5061
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumberInputComponent, decorators: [{
5250
5062
  type: Component,
5251
- args: [{ selector: 'val-searchbar', standalone: true, imports: [IonSearchbar], template: `
5252
- <ion-searchbar
5253
- mode="ios"
5254
- debounce="500"
5255
- placeholder="Búsqueda"
5256
- [disabled]="disabled"
5257
- showCancelButton="focus"
5258
- cancelButtonText="Cancelar"
5259
- (ionInput)="onSearch($event)"
5260
- (ionBlur)="onBlur()"
5261
- (ionFocus)="onFocus()"
5262
- >
5263
- </ion-searchbar>
5264
- `, 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)}ion-searchbar{--cancel-button-color: var(--ion-color-dark);--background: var(--ion-color-light);font-family:var(--ion-default-font),Arial,sans-serif}\n"] }]
5265
- }], ctorParameters: () => [], propDecorators: { disabled: [{
5063
+ args: [{ selector: 'val-number-input', standalone: true, imports: [ReactiveFormsModule, IonInput], template: ` <ion-input [formControl]="props.control" type="number" [placeholder]="props.placeholder"></ion-input> ` }]
5064
+ }], ctorParameters: () => [], propDecorators: { props: [{
5266
5065
  type: Input
5267
- }], filterEvent: [{
5268
- type: Output
5269
- }], focusEvent: [{
5270
- type: Output
5271
- }], blurEvent: [{
5272
- type: Output
5273
5066
  }] } });
5274
5067
 
5275
- class MultiSelectSearchComponent {
5276
- constructor() {
5277
- this.labelProperty = 'name';
5278
- this.valueProperty = 'id';
5279
- this.langService = inject(LangService);
5280
- this.icon = inject(IconService);
5281
- this.changeDetector = inject(ChangeDetectorRef);
5282
- this.searchTerm = '';
5283
- this.filteredItems = [];
5284
- this.selectedItems = [];
5285
- this.tempSelectedItems = [];
5286
- this.displayValue = '';
5287
- this.previousOptions = [];
5288
- this.isProcessingChanges = false;
5289
- this.label = this.langService.getText('_global', 'selectMultiple', 'Seleccionar múltiples');
5290
- this.placeholder = this.langService.getText('_global', 'selectOptions', 'Seleccione opciones');
5291
- }
5068
+ class NumberFromToComponent {
5069
+ constructor() { }
5292
5070
  ngOnInit() {
5293
- this.applyDefaultValue();
5294
- this.initializeItems();
5295
- this.syncControlValueWithSelectedItems();
5296
- this.updateDisplayValue();
5297
- this.subscribeToValueChanges();
5298
- }
5299
- ngOnDestroy() {
5300
- if (this.valueChangesSubscription) {
5301
- this.valueChangesSubscription.unsubscribe();
5302
- }
5303
- }
5304
- ngOnChanges(changes) {
5305
- if (this.isProcessingChanges) {
5306
- return;
5307
- }
5308
- if (changes['props']) {
5309
- try {
5310
- this.isProcessingChanges = true;
5311
- if (this.valueChangesSubscription) {
5312
- this.valueChangesSubscription.unsubscribe();
5313
- }
5314
- if (this.props?.options) {
5315
- const optionsChanged = !this.areOptionsEqual(this.previousOptions, this.props.options);
5316
- if (optionsChanged) {
5317
- this.previousOptions = [...this.props.options];
5318
- this.initializeItems();
5319
- }
5320
- }
5321
- this.syncControlValueWithSelectedItems();
5322
- this.updateDisplayValue();
5323
- this.subscribeToValueChanges();
5324
- }
5325
- finally {
5326
- this.isProcessingChanges = false;
5327
- }
5328
- }
5329
- }
5330
- ionViewWillEnter() {
5331
- if (this.isProcessingChanges) {
5332
- return;
5333
- }
5334
- try {
5335
- this.isProcessingChanges = true;
5336
- this.initializeItems();
5337
- this.syncControlValueWithSelectedItems();
5338
- this.updateDisplayValue();
5339
- this.subscribeToValueChanges();
5340
- }
5341
- finally {
5342
- this.isProcessingChanges = false;
5071
+ // Apply default values if configured
5072
+ if (this.props?.withDefault || this.props?.value) {
5073
+ this.applyDefaultValues();
5343
5074
  }
5344
5075
  }
5345
- subscribeToValueChanges() {
5346
- if (!this.props?.control)
5347
- return;
5348
- this.valueChangesSubscription = this.props.control.valueChanges.subscribe(() => {
5349
- if (this.isProcessingChanges)
5350
- return;
5351
- try {
5352
- this.isProcessingChanges = true;
5353
- this.syncControlValueWithSelectedItems();
5354
- this.updateDisplayValue();
5355
- }
5356
- finally {
5357
- this.isProcessingChanges = false;
5076
+ applyDefaultValues() {
5077
+ const defaultValue = this.resolveDefaultValue();
5078
+ if (defaultValue !== null) {
5079
+ if (typeof defaultValue === 'object' && defaultValue.from !== undefined) {
5080
+ this.fromControl?.setValue(defaultValue.from);
5081
+ this.toControl?.setValue(defaultValue.to);
5358
5082
  }
5359
- });
5360
- }
5361
- areOptionsEqual(prevOptions, newOptions) {
5362
- if (prevOptions === newOptions)
5363
- return true;
5364
- if (!prevOptions || !newOptions)
5365
- return prevOptions === newOptions;
5366
- if (prevOptions.length !== newOptions.length)
5367
- return false;
5368
- for (let i = 0; i < prevOptions.length; i++) {
5369
- if (prevOptions[i][this.valueProperty] !== newOptions[i][this.valueProperty]) {
5370
- return false;
5083
+ else {
5084
+ // Si es un valor simple, aplicarlo a ambos controles
5085
+ this.fromControl?.setValue(defaultValue);
5086
+ this.toControl?.setValue(defaultValue);
5371
5087
  }
5088
+ this.fromControl?.markAsPristine();
5089
+ this.toControl?.markAsPristine();
5090
+ this.fromControl?.updateValueAndValidity();
5091
+ this.toControl?.updateValueAndValidity();
5372
5092
  }
5373
- return true;
5374
- }
5375
- initializeItems() {
5376
- this.filteredItems = this.props?.options || [];
5377
5093
  }
5378
- syncControlValueWithSelectedItems() {
5379
- if (!this.props?.control) {
5380
- this.selectedItems = [];
5381
- return;
5382
- }
5383
- const controlValue = this.props.control.value;
5384
- if (!controlValue || controlValue === '') {
5385
- this.selectedItems = [];
5386
- return;
5387
- }
5388
- // Handle both array and string formats
5389
- let valueArray = [];
5390
- if (Array.isArray(controlValue)) {
5391
- valueArray = controlValue;
5392
- }
5393
- else if (typeof controlValue === 'string') {
5394
- valueArray = controlValue.split(',').filter(v => v.trim() !== '');
5094
+ resolveDefaultValue() {
5095
+ // Explicit value takes precedence
5096
+ if (this.props.value !== undefined && this.props.value !== null && this.props.value !== '') {
5097
+ return this.parseValue(this.props.value);
5395
5098
  }
5396
- if (this.props.options && this.props.options.length > 0) {
5397
- const map = new Map(this.props.options.map(opt => [opt[this.valueProperty], opt]));
5398
- this.selectedItems = valueArray
5399
- .map(value => map.get(value.toString().trim()))
5400
- .filter(item => item !== undefined);
5099
+ // No default configuration
5100
+ if (!this.props.withDefault) {
5101
+ return null;
5401
5102
  }
5402
- else {
5403
- this.selectedItems = [];
5103
+ // Custom default value
5104
+ if (typeof this.props.withDefault === 'string') {
5105
+ return this.parseValue(this.props.withDefault);
5404
5106
  }
5107
+ // Auto default value (withDefault === true)
5108
+ return { from: 0, to: 0 };
5405
5109
  }
5406
- applyDefaultValue() {
5407
- applyDefaultValueToControl(this.props);
5408
- }
5409
- onFilter(event) {
5410
- if (!event || event.trim() === '') {
5411
- this.filteredItems = this.props?.options ? [...this.props.options] : [];
5412
- this.changeDetector.detectChanges();
5413
- return;
5110
+ parseValue(value) {
5111
+ try {
5112
+ // Try to parse as JSON first (for object values)
5113
+ return JSON.parse(value);
5414
5114
  }
5415
- if (!this.props?.options || this.props.options.length === 0) {
5416
- this.filteredItems = [];
5417
- this.changeDetector.detectChanges();
5418
- return;
5115
+ catch {
5116
+ // If not JSON, treat as number
5117
+ const numValue = parseFloat(value) || 0;
5118
+ return { from: numValue, to: numValue };
5419
5119
  }
5420
- const search = replaceSpecialChars(event.toLowerCase());
5421
- this.filteredItems = this.props.options.filter(element => {
5422
- const label = element[this.labelProperty]
5423
- ? replaceSpecialChars(String(element[this.labelProperty]).toLowerCase())
5424
- : '';
5425
- const value = element[this.valueProperty]
5426
- ? replaceSpecialChars(String(element[this.valueProperty]).toLowerCase())
5427
- : '';
5428
- return label.includes(search) || value.includes(search);
5429
- });
5430
- this.changeDetector.detectChanges();
5431
- }
5432
- onFocus() {
5433
- console.log('onFocus');
5434
- }
5435
- onBlur() {
5436
- console.log('onBlur');
5437
5120
  }
5438
- openModal() {
5439
- this.syncControlValueWithSelectedItems();
5440
- this.tempSelectedItems = [...this.selectedItems];
5441
- this.updateDisplayValue();
5442
- if (this.modal) {
5443
- this.modal.present();
5444
- }
5121
+ get fromControl() {
5122
+ return this.props.fromControl;
5445
5123
  }
5446
- preventDefaultBehavior(event) {
5447
- event.preventDefault();
5448
- event.stopPropagation();
5449
- this.openModal();
5124
+ get toControl() {
5125
+ return this.props.toControl;
5450
5126
  }
5451
- cancelModal() {
5452
- // Reset filter and show all options when closing modal
5453
- this.searchTerm = '';
5454
- this.filteredItems = this.props?.options ? [...this.props.options] : [];
5455
- this.changeDetector.detectChanges();
5456
- if (this.modal) {
5457
- this.modal.dismiss();
5458
- }
5459
- }
5460
- selectItem(item) {
5461
- const index = this.tempSelectedItems.findIndex(selectedItem => selectedItem[this.valueProperty] === item[this.valueProperty]);
5462
- if (index === -1) {
5463
- this.tempSelectedItems.push(item);
5464
- }
5465
- else {
5466
- this.tempSelectedItems.splice(index, 1);
5467
- }
5468
- }
5469
- isItemSelected(item) {
5470
- return this.tempSelectedItems.some(selectedItem => selectedItem[this.valueProperty] === item[this.valueProperty]);
5471
- }
5472
- clearSelection() {
5473
- this.tempSelectedItems = [];
5474
- }
5475
- applySelection() {
5476
- this.selectedItems = [...this.tempSelectedItems];
5477
- this.updateDisplayValue();
5478
- this.applyChanges();
5479
- this.cancelModal();
5480
- }
5481
- updateDisplayValue() {
5482
- if (this.selectedItems.length === 0) {
5483
- this.displayValue = '';
5484
- return;
5485
- }
5486
- if (this.selectedItems.length === 1) {
5487
- this.displayValue = this.selectedItems[0][this.labelProperty];
5488
- }
5489
- else {
5490
- this.displayValue = `${this.selectedItems.length} elementos seleccionados`;
5491
- }
5492
- }
5493
- applyChanges() {
5494
- if (!this.props?.control) {
5495
- return;
5496
- }
5497
- try {
5498
- this.isProcessingChanges = true;
5499
- const values = this.selectedItems.map(item => item[this.valueProperty]);
5500
- const stringValue = values.join(',');
5501
- this.props.control.setValue(stringValue);
5502
- this.props.control.markAsDirty();
5503
- this.props.control.markAsTouched();
5504
- this.props.control.updateValueAndValidity();
5505
- // Debug validators if still having issues
5506
- if (this.props.control.invalid) {
5507
- console.warn('Control is invalid after setValue:', {
5508
- value: this.props.control.value,
5509
- errors: this.props.control.errors,
5510
- validators: this.props.control.validator
5511
- });
5512
- }
5513
- }
5514
- finally {
5515
- this.isProcessingChanges = false;
5516
- }
5517
- }
5518
- reset() {
5519
- this.selectedItems = [];
5520
- this.displayValue = '';
5521
- if (this.props?.control) {
5522
- this.props.control.setValue('');
5523
- }
5524
- this.changeDetector.detectChanges();
5525
- }
5526
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiSelectSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5527
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiSelectSearchComponent, isStandalone: true, selector: "val-multi-select-search", inputs: { label: "label", labelProperty: "labelProperty", valueProperty: "valueProperty", placeholder: "placeholder", props: "props" }, viewQueries: [{ propertyName: "modal", first: true, predicate: ["modal"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
5528
- <ion-input
5529
- type="text"
5530
- [value]="displayValue"
5531
- [placeholder]="props?.placeholder || placeholder"
5532
- readonly
5533
- (mousedown)="preventDefaultBehavior($event)"
5534
- />
5535
-
5536
- <ion-input style="position: absolute;" [formControl]="props.control" type="hidden"></ion-input>
5127
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumberFromToComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5128
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NumberFromToComponent, isStandalone: true, selector: "val-number-from-to", inputs: { props: "props" }, ngImport: i0, template: `
5129
+ <div class="number-from-to-container">
5130
+ <ion-label position="stacked">{{ props.fromLabel || 'Inicial' }}</ion-label>
5131
+ <ion-input
5132
+ [formControl]="fromControl"
5133
+ type="number"
5134
+ [placeholder]="props.fromPlaceholder || props.placeholder"
5135
+ [min]="props.range?.min"
5136
+ [max]="props.range?.max"
5137
+ >
5138
+ </ion-input>
5537
5139
 
5538
- <ion-modal
5539
- #modal
5540
- [initialBreakpoint]="1"
5541
- [breakpoints]="[0, 0.5, 0.75, 1]"
5542
- (didDismiss)="cancelModal()"
5543
- >
5544
- <ng-template>
5545
- <ion-header>
5546
- <ion-toolbar>
5547
- <ion-title>{{ label }}</ion-title>
5548
- <ion-buttons slot="end">
5549
- <ion-button (click)="cancelModal()">Cerrar</ion-button>
5550
- </ion-buttons>
5551
- </ion-toolbar>
5552
- <ion-toolbar>
5553
- <val-searchbar (filterEvent)="onFilter($event)" (focusEvent)="onFocus()" (blurEvent)="onBlur()" />
5554
- </ion-toolbar>
5555
- </ion-header>
5556
- <ion-content>
5557
- <ion-item *ngIf="tempSelectedItems.length > 0" lines="none" color="light">
5558
- <ion-icon name="checkmark-circle-outline" slot="start" color="success"></ion-icon>
5559
- <ion-label>
5560
- <h3>{{ tempSelectedItems.length }} item{{ tempSelectedItems.length === 1 ? '' : 's' }} seleccionado{{ tempSelectedItems.length === 1 ? '' : 's' }}</h3>
5561
- </ion-label>
5562
- </ion-item>
5563
- <ion-list>
5564
- <ion-item *ngFor="let item of filteredItems" button (click)="selectItem(item)" detail="false">
5565
- <ion-checkbox
5566
- [checked]="isItemSelected(item)"
5567
- slot="start"
5568
- [disabled]="true"
5569
- ></ion-checkbox>
5570
- <ion-label>{{ item[labelProperty] }}</ion-label>
5571
- </ion-item>
5572
- <ion-item *ngIf="filteredItems.length === 0" lines="none">
5573
- <ion-label color="dark">No se encontraron resultados</ion-label>
5574
- </ion-item>
5575
- </ion-list>
5576
- </ion-content>
5577
- <ion-footer *ngIf="tempSelectedItems.length > 0">
5578
- <ion-toolbar>
5579
- <ion-buttons slot="end">
5580
- <ion-button (click)="clearSelection()">Limpiar</ion-button>
5581
- <ion-button fill="solid" (click)="applySelection()">Aplicar ({{ tempSelectedItems.length }})</ion-button>
5582
- </ion-buttons>
5583
- </ion-toolbar>
5584
- </ion-footer>
5585
- </ng-template>
5586
- </ion-modal>
5587
- `, isInline: true, styles: ["ion-header{padding:8px 8px 0}\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: "ngmodule", type: IonicModule }, { kind: "component", type: i2.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: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCheckbox, selector: "ion-checkbox", inputs: ["alignment", "checked", "color", "disabled", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonModal, selector: "ion-modal" }, { kind: "directive", type: i2.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: SearchbarComponent, selector: "val-searchbar", inputs: ["disabled"], outputs: ["filterEvent", "focusEvent", "blurEvent"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
5140
+ <ion-label position="stacked">{{ props.toLabel || 'Final' }}</ion-label>
5141
+ <ion-input
5142
+ [formControl]="toControl"
5143
+ type="number"
5144
+ [placeholder]="props.toPlaceholder || props.placeholder"
5145
+ [min]="props.range?.min"
5146
+ [max]="props.range?.max"
5147
+ >
5148
+ </ion-input>
5149
+ </div>
5150
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }] }); }
5588
5151
  }
5589
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiSelectSearchComponent, decorators: [{
5152
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumberFromToComponent, decorators: [{
5590
5153
  type: Component,
5591
- args: [{ selector: 'val-multi-select-search', standalone: true, imports: [CommonModule, IonicModule, FormsModule, SearchbarComponent, ReactiveFormsModule], template: `
5592
- <ion-input
5593
- type="text"
5594
- [value]="displayValue"
5595
- [placeholder]="props?.placeholder || placeholder"
5596
- readonly
5597
- (mousedown)="preventDefaultBehavior($event)"
5598
- />
5599
-
5600
- <ion-input style="position: absolute;" [formControl]="props.control" type="hidden"></ion-input>
5154
+ args: [{ selector: 'val-number-from-to', standalone: true, imports: [ReactiveFormsModule, IonInput, IonLabel], template: `
5155
+ <div class="number-from-to-container">
5156
+ <ion-label position="stacked">{{ props.fromLabel || 'Inicial' }}</ion-label>
5157
+ <ion-input
5158
+ [formControl]="fromControl"
5159
+ type="number"
5160
+ [placeholder]="props.fromPlaceholder || props.placeholder"
5161
+ [min]="props.range?.min"
5162
+ [max]="props.range?.max"
5163
+ >
5164
+ </ion-input>
5601
5165
 
5602
- <ion-modal
5603
- #modal
5604
- [initialBreakpoint]="1"
5605
- [breakpoints]="[0, 0.5, 0.75, 1]"
5606
- (didDismiss)="cancelModal()"
5607
- >
5608
- <ng-template>
5609
- <ion-header>
5610
- <ion-toolbar>
5611
- <ion-title>{{ label }}</ion-title>
5612
- <ion-buttons slot="end">
5613
- <ion-button (click)="cancelModal()">Cerrar</ion-button>
5614
- </ion-buttons>
5615
- </ion-toolbar>
5616
- <ion-toolbar>
5617
- <val-searchbar (filterEvent)="onFilter($event)" (focusEvent)="onFocus()" (blurEvent)="onBlur()" />
5618
- </ion-toolbar>
5619
- </ion-header>
5620
- <ion-content>
5621
- <ion-item *ngIf="tempSelectedItems.length > 0" lines="none" color="light">
5622
- <ion-icon name="checkmark-circle-outline" slot="start" color="success"></ion-icon>
5623
- <ion-label>
5624
- <h3>{{ tempSelectedItems.length }} item{{ tempSelectedItems.length === 1 ? '' : 's' }} seleccionado{{ tempSelectedItems.length === 1 ? '' : 's' }}</h3>
5625
- </ion-label>
5626
- </ion-item>
5627
- <ion-list>
5628
- <ion-item *ngFor="let item of filteredItems" button (click)="selectItem(item)" detail="false">
5629
- <ion-checkbox
5630
- [checked]="isItemSelected(item)"
5631
- slot="start"
5632
- [disabled]="true"
5633
- ></ion-checkbox>
5634
- <ion-label>{{ item[labelProperty] }}</ion-label>
5635
- </ion-item>
5636
- <ion-item *ngIf="filteredItems.length === 0" lines="none">
5637
- <ion-label color="dark">No se encontraron resultados</ion-label>
5638
- </ion-item>
5639
- </ion-list>
5640
- </ion-content>
5641
- <ion-footer *ngIf="tempSelectedItems.length > 0">
5642
- <ion-toolbar>
5643
- <ion-buttons slot="end">
5644
- <ion-button (click)="clearSelection()">Limpiar</ion-button>
5645
- <ion-button fill="solid" (click)="applySelection()">Aplicar ({{ tempSelectedItems.length }})</ion-button>
5646
- </ion-buttons>
5647
- </ion-toolbar>
5648
- </ion-footer>
5649
- </ng-template>
5650
- </ion-modal>
5651
- `, styles: ["ion-header{padding:8px 8px 0}\n"] }]
5652
- }], ctorParameters: () => [], propDecorators: { modal: [{
5653
- type: ViewChild,
5654
- args: ['modal']
5655
- }], label: [{
5656
- type: Input
5657
- }], labelProperty: [{
5658
- type: Input
5659
- }], valueProperty: [{
5660
- type: Input
5661
- }], placeholder: [{
5662
- type: Input
5663
- }], props: [{
5166
+ <ion-label position="stacked">{{ props.toLabel || 'Final' }}</ion-label>
5167
+ <ion-input
5168
+ [formControl]="toControl"
5169
+ type="number"
5170
+ [placeholder]="props.toPlaceholder || props.placeholder"
5171
+ [min]="props.range?.min"
5172
+ [max]="props.range?.max"
5173
+ >
5174
+ </ion-input>
5175
+ </div>
5176
+ ` }]
5177
+ }], ctorParameters: () => [], propDecorators: { props: [{
5664
5178
  type: Input
5665
5179
  }] } });
5666
5180
 
5667
- class MultiSelectSimpleComponent {
5668
- constructor() {
5669
- this.labelProperty = 'name';
5670
- this.valueProperty = 'id';
5671
- this.placeholder = '';
5672
- this.langService = inject(LangService);
5673
- this.changeDetector = inject(ChangeDetectorRef);
5674
- // Classic Angular properties
5675
- this.isOpen = false;
5676
- this.searchTerm = '';
5677
- this.selectedValues = [];
5678
- this.displayValue = '';
5679
- this.filteredOptions = [];
5680
- this.searchPlaceholder = '';
5681
- // ControlValueAccessor
5682
- this.onChange = (_value) => { };
5683
- this.onTouched = () => { };
5684
- this.placeholder = this.langService.getText('_global', 'selectOptions', 'Seleccione opciones');
5685
- this.searchPlaceholder = this.langService.getText('_global', 'search', 'Buscar');
5686
- // Close dropdown when clicking outside
5687
- document.addEventListener('click', this.handleClickOutside.bind(this));
5688
- }
5689
- ngOnInit() {
5690
- this.applyDefaultValue();
5691
- this.initializeOptions();
5692
- this.syncSelectedValues();
5693
- this.updateDisplayValue();
5694
- }
5695
- ngOnDestroy() {
5696
- document.removeEventListener('click', this.handleClickOutside.bind(this));
5697
- }
5698
- ngOnChanges(changes) {
5699
- if (changes['props'] && this.props) {
5700
- this.initializeOptions();
5701
- this.syncSelectedValues();
5702
- this.updateDisplayValue();
5703
- this.changeDetector.detectChanges();
5704
- }
5705
- }
5706
- // ControlValueAccessor implementation
5707
- writeValue(value) {
5708
- const valueArray = this.parseValue(value);
5709
- this.selectedValues = valueArray;
5710
- this.updateDisplayValue();
5711
- }
5712
- registerOnChange(fn) {
5713
- this.onChange = fn;
5714
- }
5715
- registerOnTouched(fn) {
5716
- this.onTouched = fn;
5717
- }
5718
- setDisabledState(_isDisabled) {
5719
- // Handle disabled state if needed
5720
- }
5721
- // Component methods
5722
- toggleDropdown(event) {
5723
- event.stopPropagation();
5724
- this.isOpen = !this.isOpen;
5725
- if (this.isOpen) {
5726
- this.onTouched();
5727
- // Focus search bar when opening
5728
- setTimeout(() => {
5729
- const searchbar = this.dropdownRef?.nativeElement?.querySelector('ion-searchbar');
5730
- if (searchbar) {
5731
- searchbar.setFocus();
5732
- }
5733
- }, 100);
5734
- }
5735
- }
5736
- onSearch(event) {
5737
- this.searchTerm = event.detail.value || '';
5738
- this.filterOptions();
5739
- }
5740
- toggleOption(option) {
5741
- const value = String(option[this.valueProperty]);
5742
- if (this.isSelected(option)) {
5743
- // Remove from selection
5744
- this.selectedValues = this.selectedValues.filter(v => v !== value);
5745
- }
5746
- else {
5747
- // Add to selection
5748
- this.selectedValues = [...this.selectedValues, value];
5749
- }
5750
- this.updateDisplayValue();
5751
- this.emitValue();
5752
- }
5753
- selectAll() {
5754
- const allValues = this.filteredOptions.map(option => String(option[this.valueProperty]));
5755
- // Add only new values to avoid duplicates
5756
- const newValues = allValues.filter(value => !this.selectedValues.includes(value));
5757
- this.selectedValues = [...this.selectedValues, ...newValues];
5758
- this.updateDisplayValue();
5759
- this.emitValue();
5760
- }
5761
- clearAll() {
5762
- this.selectedValues = [];
5763
- this.updateDisplayValue();
5764
- this.emitValue();
5765
- }
5766
- isSelected(option) {
5767
- return this.selectedValues.includes(String(option[this.valueProperty]));
5768
- }
5769
- trackByFn(_index, option) {
5770
- return option[this.valueProperty];
5771
- }
5772
- handleClickOutside(event) {
5773
- if (this.isOpen &&
5774
- !this.mainInputRef?.nativeElement?.contains(event.target) &&
5775
- !this.dropdownRef?.nativeElement?.contains(event.target)) {
5776
- this.isOpen = false;
5777
- this.searchTerm = '';
5778
- this.initializeOptions();
5779
- }
5181
+ /**
5182
+ * val-password-input
5183
+ *
5184
+ * A password input field with show/hide toggle, integrated with Angular forms.
5185
+ *
5186
+ * @example
5187
+ * <val-password-input [props]="{ control: myControl, placeholder: 'Enter password' }"></val-password-input>
5188
+ *
5189
+ * @input props: InputMetadata - Configuration for the input (form control, placeholder, etc.)
5190
+ */
5191
+ class PasswordInputComponent {
5192
+ constructor(icon) {
5193
+ this.hidePassword = true;
5780
5194
  }
5781
- parseValue(value) {
5782
- if (!value)
5783
- return [];
5784
- if (Array.isArray(value))
5785
- return value.map(v => String(v));
5786
- if (typeof value === 'string') {
5787
- return value.split(',').map(v => v.trim()).filter(v => v !== '');
5788
- }
5789
- return [String(value)];
5790
- }
5791
- emitValue() {
5792
- const value = this.selectedValues.join(',');
5793
- this.onChange(value);
5794
- if (this.props?.control) {
5795
- this.props.control.setValue(value);
5796
- this.props.control.markAsDirty();
5797
- this.props.control.markAsTouched();
5798
- }
5799
- }
5800
- getOptionByValue(value) {
5801
- return this.filteredOptions.find(option => String(option[this.valueProperty]) === String(value));
5195
+ ngOnInit() { }
5196
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PasswordInputComponent, deps: [{ token: IconService }], target: i0.ɵɵFactoryTarget.Component }); }
5197
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PasswordInputComponent, isStandalone: true, selector: "val-password-input", inputs: { props: "props" }, ngImport: i0, template: `
5198
+ <div class="input-container">
5199
+ <ion-input
5200
+ class="sign-in__input-password"
5201
+ [formControl]="props.control"
5202
+ [type]="hidePassword ? 'password' : 'text'"
5203
+ [placeholder]="props.placeholder"
5204
+ ></ion-input>
5205
+ <ion-button color="dark" fill="clear" (click)="hidePassword = !hidePassword" size="small">
5206
+ <ion-icon slot="icon-only" [name]="hidePassword ? 'eye-off-outline' : 'eye-outline'"></ion-icon>
5207
+ </ion-button>
5208
+ </div>
5209
+ `, 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)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.input-container{display:flex;align-items:center;flex-direction:row}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { 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"] }] }); }
5210
+ }
5211
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PasswordInputComponent, decorators: [{
5212
+ type: Component,
5213
+ args: [{ selector: 'val-password-input', standalone: true, imports: [ReactiveFormsModule, IonInput, IonButton, IonIcon], template: `
5214
+ <div class="input-container">
5215
+ <ion-input
5216
+ class="sign-in__input-password"
5217
+ [formControl]="props.control"
5218
+ [type]="hidePassword ? 'password' : 'text'"
5219
+ [placeholder]="props.placeholder"
5220
+ ></ion-input>
5221
+ <ion-button color="dark" fill="clear" (click)="hidePassword = !hidePassword" size="small">
5222
+ <ion-icon slot="icon-only" [name]="hidePassword ? 'eye-off-outline' : 'eye-outline'"></ion-icon>
5223
+ </ion-button>
5224
+ </div>
5225
+ `, 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)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.input-container{display:flex;align-items:center;flex-direction:row}\n"] }]
5226
+ }], ctorParameters: () => [{ type: IconService }], propDecorators: { props: [{
5227
+ type: Input
5228
+ }] } });
5229
+
5230
+ /**
5231
+ * val-pin-input
5232
+ *
5233
+ * A PIN code input using ng-otp-input, integrated with Angular forms.
5234
+ *
5235
+ * @example
5236
+ * <val-pin-input [props]="{ control: myControl }"></val-pin-input>
5237
+ *
5238
+ * @input props: InputMetadata - Configuration for the PIN input (form control, etc.)
5239
+ */
5240
+ class PinInputComponent {
5241
+ constructor() {
5242
+ this.codeLength = 5;
5243
+ this.otpInputConfig = {
5244
+ inputStyles: {
5245
+ 'font-size': '32px',
5246
+ width: '58px',
5247
+ height: '60px',
5248
+ },
5249
+ inputClass: 'otp-input-box',
5250
+ length: this.codeLength,
5251
+ allowNumbersOnly: true,
5252
+ };
5802
5253
  }
5803
- applyDefaultValue() {
5804
- if (this.props) {
5805
- applyDefaultValueToControl(this.props);
5254
+ ngOnInit() { }
5255
+ reset() {
5256
+ if (this.pinCode) {
5257
+ this.pinCode.setValue('');
5806
5258
  }
5807
5259
  }
5808
- initializeOptions() {
5809
- this.filteredOptions = this.props?.options || [];
5260
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PinInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5261
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PinInputComponent, isStandalone: true, selector: "val-pin-input", inputs: { props: "props" }, viewQueries: [{ propertyName: "pinCode", first: true, predicate: NgOtpInputComponent, descendants: true }], ngImport: i0, template: `
5262
+ <div class="otp">
5263
+ <ng-otp-input [formCtrl]="props.control" [config]="otpInputConfig"></ng-otp-input>
5264
+ </div>
5265
+ `, 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)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.otp{text-align:center;margin-top:.25rem;font-family:var(--ion-default-font),Arial,sans-serif}.otp-input-box:focus{border-color:#0ff}\n"], dependencies: [{ kind: "ngmodule", type: NgOtpInputModule }, { kind: "component", type: i1$3.NgOtpInputComponent, selector: "ng-otp-input", inputs: ["config", "formCtrl"], outputs: ["onInputChange"] }] }); }
5266
+ }
5267
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PinInputComponent, decorators: [{
5268
+ type: Component,
5269
+ args: [{ selector: 'val-pin-input', standalone: true, imports: [NgOtpInputModule], template: `
5270
+ <div class="otp">
5271
+ <ng-otp-input [formCtrl]="props.control" [config]="otpInputConfig"></ng-otp-input>
5272
+ </div>
5273
+ `, 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)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.otp{text-align:center;margin-top:.25rem;font-family:var(--ion-default-font),Arial,sans-serif}.otp-input-box:focus{border-color:#0ff}\n"] }]
5274
+ }], ctorParameters: () => [], propDecorators: { pinCode: [{
5275
+ type: ViewChild,
5276
+ args: [NgOtpInputComponent, { static: false }]
5277
+ }], props: [{
5278
+ type: Input
5279
+ }] } });
5280
+
5281
+ //TODO: support automatic or manual interval for messages. Include the interval number as a parameter.
5282
+ /**
5283
+ * val-progress-status
5284
+ *
5285
+ * Displays a progress bar with status messages and titles, useful for multi-step or loading processes.
5286
+ *
5287
+ * @example
5288
+ * <val-progress-status [props]="{ progress: 0.5, color: 'primary', size: 'medium', titles: {...}, messages: [...] }"></val-progress-status>
5289
+ *
5290
+ * @input props: ProgressStatusMetadata - Configuration for the progress status (progress, color, size, titles, messages)
5291
+ */
5292
+ class ProgressStatusComponent {
5293
+ constructor() {
5294
+ this.currentIndex = 0;
5295
+ this.blinking = false;
5810
5296
  }
5811
- filterOptions() {
5812
- if (!this.searchTerm) {
5813
- this.initializeOptions();
5814
- return;
5815
- }
5816
- const search = replaceSpecialChars(this.searchTerm.toLowerCase());
5817
- this.filteredOptions = (this.props?.options || []).filter(option => {
5818
- const label = option[this.labelProperty]
5819
- ? replaceSpecialChars(String(option[this.labelProperty]).toLowerCase())
5820
- : '';
5821
- const value = option[this.valueProperty]
5822
- ? replaceSpecialChars(String(option[this.valueProperty]).toLowerCase())
5823
- : '';
5824
- return label.includes(search) || value.includes(search);
5825
- });
5297
+ ngOnInit() {
5298
+ setInterval(() => {
5299
+ this.blinking = !this.blinking;
5300
+ }, 1000);
5301
+ setInterval(() => {
5302
+ this.getNextMessage();
5303
+ }, 9000);
5826
5304
  }
5827
- updateDisplayValue() {
5828
- if (this.selectedValues.length === 0) {
5829
- this.displayValue = '';
5830
- return;
5831
- }
5832
- if (this.selectedValues.length === 1) {
5833
- const option = this.getOptionByValue(this.selectedValues[0]);
5834
- this.displayValue = option ? option[this.labelProperty] : '';
5835
- }
5836
- else {
5837
- this.displayValue = `${this.selectedValues.length} elementos seleccionados`;
5838
- }
5305
+ get Content() {
5306
+ return this.props.messages[this.currentIndex];
5839
5307
  }
5840
- syncSelectedValues() {
5841
- if (this.props?.control?.value) {
5842
- const valueArray = this.parseValue(this.props.control.value);
5843
- this.selectedValues = valueArray;
5844
- }
5308
+ getNextMessage() {
5309
+ this.currentIndex = (this.currentIndex + 1) % this.props.messages.length;
5845
5310
  }
5846
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiSelectSimpleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5847
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiSelectSimpleComponent, isStandalone: true, selector: "val-multi-select-simple", inputs: { props: "props", labelProperty: "labelProperty", valueProperty: "valueProperty", placeholder: "placeholder" }, providers: [
5848
- {
5849
- provide: NG_VALUE_ACCESSOR,
5850
- useExisting: forwardRef(() => MultiSelectSimpleComponent),
5851
- multi: true
5852
- }
5853
- ], viewQueries: [{ propertyName: "dropdownRef", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "mainInputRef", first: true, predicate: ["mainInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
5854
- <div class="multi-select-container" (click)="toggleDropdown($event)">
5855
- <!-- Main input display -->
5856
- <ion-input
5857
- #mainInput
5858
- type="text"
5859
- [value]="displayValue"
5860
- [placeholder]="props?.placeholder || placeholder"
5861
- readonly
5862
- class="main-input"
5863
- [class.is-open]="isOpen"
5864
- />
5865
-
5866
- <!-- Dropdown icon -->
5867
- <ion-icon
5868
- name="chevron-down-outline"
5869
- class="dropdown-icon"
5870
- [class.rotated]="isOpen"
5871
- ></ion-icon>
5872
-
5873
- <!-- Hidden input for form control -->
5874
- <ion-input
5875
- style="position: absolute; opacity: 0; pointer-events: none;"
5876
- [formControl]="props?.control"
5877
- type="hidden"
5878
- />
5879
- </div>
5880
-
5881
- <!-- Dropdown overlay -->
5882
- <div
5883
- class="dropdown-overlay"
5884
- [class.visible]="isOpen"
5885
- #dropdown
5886
- >
5887
- <!-- Search bar -->
5888
- <div class="search-container">
5889
- <ion-searchbar
5890
- #searchbar
5891
- [placeholder]="searchPlaceholder"
5892
- (ionInput)="onSearch($event)"
5893
- [value]="searchTerm"
5894
- show-clear-button="focus"
5895
- ></ion-searchbar>
5311
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProgressStatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5312
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ProgressStatusComponent, isStandalone: true, selector: "val-progress-status", inputs: { props: "props" }, ngImport: i0, template: `
5313
+ <div class="status-container">
5314
+ <div class="title-container">
5315
+ <val-title-block
5316
+ [props]="{
5317
+ position: 'center',
5318
+ aboveTitle: props.titles.aboveTitle,
5319
+ title: props.titles.title,
5320
+ bellowTitle: props.titles.bellowTitle,
5321
+ }"
5322
+ ></val-title-block>
5896
5323
  </div>
5897
-
5898
- <!-- Action buttons -->
5899
- <div class="actions-container">
5900
- <ion-button
5901
- fill="clear"
5902
- size="small"
5903
- (click)="selectAll()"
5904
- [disabled]="filteredOptions.length === 0"
5905
- >
5906
- Seleccionar todos
5907
- </ion-button>
5908
- <ion-button
5909
- fill="clear"
5910
- size="small"
5911
- color="medium"
5912
- (click)="clearAll()"
5913
- [disabled]="selectedValues.length === 0"
5914
- >
5915
- Limpiar
5916
- </ion-button>
5324
+ <div class="progress-bar-container">
5325
+ <val-progress-bar
5326
+ [props]="{
5327
+ progress: props.progress,
5328
+ size: 'xlarge',
5329
+ color: props.color,
5330
+ rounded: true,
5331
+ type: 'determinate',
5332
+ buffer: 1,
5333
+ }"
5334
+ ></val-progress-bar>
5917
5335
  </div>
5918
-
5919
- <!-- Options list -->
5920
- <div class="options-container">
5921
- <ion-list class="options-list">
5922
- <ion-item
5923
- *ngFor="let option of filteredOptions; trackBy: trackByFn"
5924
- button
5925
- (click)="toggleOption(option)"
5926
- class="option-item"
5927
- >
5928
- <ion-checkbox
5929
- slot="start"
5930
- [checked]="isSelected(option)"
5931
- ></ion-checkbox>
5932
- <ion-label>{{ option[labelProperty] }}</ion-label>
5933
- </ion-item>
5934
-
5935
- <!-- No results message -->
5936
- <ion-item *ngIf="filteredOptions.length === 0" class="no-results">
5937
- <ion-label color="medium">
5938
- {{ searchTerm ? 'No se encontraron resultados' : 'No hay opciones disponibles' }}
5939
- </ion-label>
5940
- </ion-item>
5941
- </ion-list>
5336
+ <div class="subtitle-container">
5337
+ <div class="subtitle" [class.blink]="blinking">
5338
+ <val-text [props]="{ content: Content, color: 'medium', bold: false, size: props.size }"></val-text>
5339
+ </div>
5942
5340
  </div>
5943
5341
  </div>
5944
- `, isInline: true, styles: [":host{display:block;position:relative;width:100%}.multi-select-container{position:relative;display:flex;align-items:center;cursor:pointer}.multi-select-container .main-input{flex:1;cursor:pointer}.multi-select-container .main-input.is-open{--border-color: var(--ion-color-primary)}.multi-select-container .dropdown-icon{position:absolute;right:12px;font-size:16px;color:var(--ion-color-medium);transition:transform .2s ease;pointer-events:none;z-index:2}.multi-select-container .dropdown-icon.rotated{transform:rotate(180deg)}.dropdown-overlay{position:absolute;top:100%;left:0;right:0;background:var(--ion-background-color);border:1px solid var(--ion-color-light);border-radius:8px;box-shadow:0 4px 16px #0000001a;z-index:1000;max-height:400px;opacity:0;transform:translateY(-8px);pointer-events:none;transition:all .2s ease}.dropdown-overlay.visible{opacity:1;transform:translateY(4px);pointer-events:all}.search-container{padding:12px;border-bottom:1px solid var(--ion-color-light)}.search-container ion-searchbar{--background: var(--ion-color-light);--border-radius: 8px;--box-shadow: none;--padding-start: 12px;--padding-end: 12px;height:40px}.actions-container{display:flex;justify-content:space-between;padding:8px 12px;border-bottom:1px solid var(--ion-color-light)}.actions-container ion-button{--padding-start: 8px;--padding-end: 8px;height:32px;font-size:14px}.options-container{max-height:240px;overflow-y:auto}.options-container .options-list{padding:0}.options-container .option-item{--padding-start: 16px;--padding-end: 16px;--min-height: 48px;cursor:pointer}.options-container .option-item:hover{--background: var(--ion-color-light)}.options-container .option-item ion-checkbox{--size: 20px;margin-right:12px}.options-container .option-item ion-label{font-size:16px;line-height:1.4}.options-container .no-results{--padding-start: 16px;--padding-end: 16px;--min-height: 48px;text-align:center}.options-container .no-results ion-label{font-style:italic;font-size:14px}@media (max-width: 768px){.dropdown-overlay{max-height:300px}.options-container{max-height:200px}.actions-container ion-button{font-size:12px;--padding-start: 6px;--padding-end: 6px}}@media (prefers-color-scheme: dark){.dropdown-overlay{box-shadow:0 4px 16px #0000004d}}.option-item:focus-within{--background: var(--ion-color-primary-tint);outline:2px solid var(--ion-color-primary);outline-offset:-2px}.option-item{transition:background-color .15s ease}.dropdown-icon{transition:transform .2s cubic-bezier(.4,0,.2,1)}\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: "ngmodule", type: IonicModule }, { kind: "component", type: i2.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: i2.IonCheckbox, selector: "ion-checkbox", inputs: ["alignment", "checked", "color", "disabled", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocapitalize", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "maxlength", "minlength", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }, { kind: "directive", type: i2.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
5342
+ `, 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)}.status-container{min-height:6.25rem;margin:1rem .5rem}.progress-bar-container{max-width:60%;margin:0 auto}.title-container{margin-bottom:.5rem}.subtitle-container{width:100%;display:flex}.subtitle{padding:1rem;margin:0 auto;height:1rem}.blink{animation:blink 1s infinite alternate ease-in}@keyframes blink{0%{opacity:0;margin-top:6px}to{opacity:1;margin-top:0}}\n"], dependencies: [{ kind: "component", type: TitleBlockComponent, selector: "val-title-block", inputs: ["props"] }, { kind: "component", type: ProgressBarComponent, selector: "val-progress-bar", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
5945
5343
  }
5946
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiSelectSimpleComponent, decorators: [{
5344
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProgressStatusComponent, decorators: [{
5947
5345
  type: Component,
5948
- args: [{ selector: 'val-multi-select-simple', standalone: true, imports: [CommonModule, IonicModule, FormsModule, ReactiveFormsModule], providers: [
5949
- {
5950
- provide: NG_VALUE_ACCESSOR,
5951
- useExisting: forwardRef(() => MultiSelectSimpleComponent),
5952
- multi: true
5953
- }
5954
- ], template: `
5955
- <div class="multi-select-container" (click)="toggleDropdown($event)">
5956
- <!-- Main input display -->
5957
- <ion-input
5958
- #mainInput
5959
- type="text"
5960
- [value]="displayValue"
5961
- [placeholder]="props?.placeholder || placeholder"
5962
- readonly
5963
- class="main-input"
5964
- [class.is-open]="isOpen"
5965
- />
5966
-
5967
- <!-- Dropdown icon -->
5968
- <ion-icon
5969
- name="chevron-down-outline"
5970
- class="dropdown-icon"
5971
- [class.rotated]="isOpen"
5972
- ></ion-icon>
5973
-
5974
- <!-- Hidden input for form control -->
5975
- <ion-input
5976
- style="position: absolute; opacity: 0; pointer-events: none;"
5977
- [formControl]="props?.control"
5978
- type="hidden"
5979
- />
5980
- </div>
5981
-
5982
- <!-- Dropdown overlay -->
5983
- <div
5984
- class="dropdown-overlay"
5985
- [class.visible]="isOpen"
5986
- #dropdown
5987
- >
5988
- <!-- Search bar -->
5989
- <div class="search-container">
5990
- <ion-searchbar
5991
- #searchbar
5992
- [placeholder]="searchPlaceholder"
5993
- (ionInput)="onSearch($event)"
5994
- [value]="searchTerm"
5995
- show-clear-button="focus"
5996
- ></ion-searchbar>
5346
+ args: [{ selector: 'val-progress-status', standalone: true, imports: [TitleBlockComponent, ProgressBarComponent, TextComponent], template: `
5347
+ <div class="status-container">
5348
+ <div class="title-container">
5349
+ <val-title-block
5350
+ [props]="{
5351
+ position: 'center',
5352
+ aboveTitle: props.titles.aboveTitle,
5353
+ title: props.titles.title,
5354
+ bellowTitle: props.titles.bellowTitle,
5355
+ }"
5356
+ ></val-title-block>
5997
5357
  </div>
5998
-
5999
- <!-- Action buttons -->
6000
- <div class="actions-container">
6001
- <ion-button
6002
- fill="clear"
6003
- size="small"
6004
- (click)="selectAll()"
6005
- [disabled]="filteredOptions.length === 0"
6006
- >
6007
- Seleccionar todos
6008
- </ion-button>
6009
- <ion-button
6010
- fill="clear"
6011
- size="small"
6012
- color="medium"
6013
- (click)="clearAll()"
6014
- [disabled]="selectedValues.length === 0"
6015
- >
6016
- Limpiar
6017
- </ion-button>
5358
+ <div class="progress-bar-container">
5359
+ <val-progress-bar
5360
+ [props]="{
5361
+ progress: props.progress,
5362
+ size: 'xlarge',
5363
+ color: props.color,
5364
+ rounded: true,
5365
+ type: 'determinate',
5366
+ buffer: 1,
5367
+ }"
5368
+ ></val-progress-bar>
6018
5369
  </div>
6019
-
6020
- <!-- Options list -->
6021
- <div class="options-container">
6022
- <ion-list class="options-list">
6023
- <ion-item
6024
- *ngFor="let option of filteredOptions; trackBy: trackByFn"
6025
- button
6026
- (click)="toggleOption(option)"
6027
- class="option-item"
6028
- >
6029
- <ion-checkbox
6030
- slot="start"
6031
- [checked]="isSelected(option)"
6032
- ></ion-checkbox>
6033
- <ion-label>{{ option[labelProperty] }}</ion-label>
6034
- </ion-item>
6035
-
6036
- <!-- No results message -->
6037
- <ion-item *ngIf="filteredOptions.length === 0" class="no-results">
6038
- <ion-label color="medium">
6039
- {{ searchTerm ? 'No se encontraron resultados' : 'No hay opciones disponibles' }}
6040
- </ion-label>
6041
- </ion-item>
6042
- </ion-list>
5370
+ <div class="subtitle-container">
5371
+ <div class="subtitle" [class.blink]="blinking">
5372
+ <val-text [props]="{ content: Content, color: 'medium', bold: false, size: props.size }"></val-text>
5373
+ </div>
6043
5374
  </div>
6044
5375
  </div>
6045
- `, styles: [":host{display:block;position:relative;width:100%}.multi-select-container{position:relative;display:flex;align-items:center;cursor:pointer}.multi-select-container .main-input{flex:1;cursor:pointer}.multi-select-container .main-input.is-open{--border-color: var(--ion-color-primary)}.multi-select-container .dropdown-icon{position:absolute;right:12px;font-size:16px;color:var(--ion-color-medium);transition:transform .2s ease;pointer-events:none;z-index:2}.multi-select-container .dropdown-icon.rotated{transform:rotate(180deg)}.dropdown-overlay{position:absolute;top:100%;left:0;right:0;background:var(--ion-background-color);border:1px solid var(--ion-color-light);border-radius:8px;box-shadow:0 4px 16px #0000001a;z-index:1000;max-height:400px;opacity:0;transform:translateY(-8px);pointer-events:none;transition:all .2s ease}.dropdown-overlay.visible{opacity:1;transform:translateY(4px);pointer-events:all}.search-container{padding:12px;border-bottom:1px solid var(--ion-color-light)}.search-container ion-searchbar{--background: var(--ion-color-light);--border-radius: 8px;--box-shadow: none;--padding-start: 12px;--padding-end: 12px;height:40px}.actions-container{display:flex;justify-content:space-between;padding:8px 12px;border-bottom:1px solid var(--ion-color-light)}.actions-container ion-button{--padding-start: 8px;--padding-end: 8px;height:32px;font-size:14px}.options-container{max-height:240px;overflow-y:auto}.options-container .options-list{padding:0}.options-container .option-item{--padding-start: 16px;--padding-end: 16px;--min-height: 48px;cursor:pointer}.options-container .option-item:hover{--background: var(--ion-color-light)}.options-container .option-item ion-checkbox{--size: 20px;margin-right:12px}.options-container .option-item ion-label{font-size:16px;line-height:1.4}.options-container .no-results{--padding-start: 16px;--padding-end: 16px;--min-height: 48px;text-align:center}.options-container .no-results ion-label{font-style:italic;font-size:14px}@media (max-width: 768px){.dropdown-overlay{max-height:300px}.options-container{max-height:200px}.actions-container ion-button{font-size:12px;--padding-start: 6px;--padding-end: 6px}}@media (prefers-color-scheme: dark){.dropdown-overlay{box-shadow:0 4px 16px #0000004d}}.option-item:focus-within{--background: var(--ion-color-primary-tint);outline:2px solid var(--ion-color-primary);outline-offset:-2px}.option-item{transition:background-color .15s ease}.dropdown-icon{transition:transform .2s cubic-bezier(.4,0,.2,1)}\n"] }]
6046
- }], ctorParameters: () => [], propDecorators: { dropdownRef: [{
6047
- type: ViewChild,
6048
- args: ['dropdown']
6049
- }], mainInputRef: [{
6050
- type: ViewChild,
6051
- args: ['mainInput']
6052
- }], props: [{
6053
- type: Input
6054
- }], labelProperty: [{
6055
- type: Input
6056
- }], valueProperty: [{
6057
- type: Input
6058
- }], placeholder: [{
5376
+ `, 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)}.status-container{min-height:6.25rem;margin:1rem .5rem}.progress-bar-container{max-width:60%;margin:0 auto}.title-container{margin-bottom:.5rem}.subtitle-container{width:100%;display:flex}.subtitle{padding:1rem;margin:0 auto;height:1rem}.blink{animation:blink 1s infinite alternate ease-in}@keyframes blink{0%{opacity:0;margin-top:6px}to{opacity:1;margin-top:0}}\n"] }]
5377
+ }], ctorParameters: () => [], propDecorators: { props: [{
6059
5378
  type: Input
6060
5379
  }] } });
6061
5380
 
6062
5381
  /**
6063
- * val-notes-box
5382
+ * val-prompter
6064
5383
  *
6065
- * Displays a styled notes/info box with optional prefix and configurable color, size, and padding.
5384
+ * Displays a prompt/info box with text, actions (buttons/links), and custom styles.
6066
5385
  *
6067
5386
  * @example
6068
- * <val-notes-box [props]="{ text: 'Note', prefix: 'Info', color: 'primary', textColor: 'dark', size: 'medium', rounded: true, padding: '8px' }"></val-notes-box>
5387
+ * <val-prompter [props]="{ content: 'Message', buttons: [...], hrefs: [...], color: 'primary', size: 'medium' }"></val-prompter>
6069
5388
  *
6070
- * @input props: NotesBoxMetadata - Configuration for the notes box (text, prefix, color, textColor, size, rounded, padding)
5389
+ * @input props: PrompterMetadata - Configuration for the prompter (content, buttons, hrefs, color, size, etc.)
5390
+ * @output onClick - Emits when an action is clicked
6071
5391
  */
6072
- class NotesBoxComponent {
6073
- constructor() { }
5392
+ class PrompterComponent {
5393
+ constructor() {
5394
+ this.onClick = new EventEmitter();
5395
+ }
6074
5396
  ngOnInit() { }
6075
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotesBoxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6076
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: NotesBoxComponent, isStandalone: true, selector: "val-notes-box", inputs: { props: "props" }, ngImport: i0, template: `
5397
+ clickHandler(token) {
5398
+ this.onClick.emit(token);
5399
+ }
5400
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PrompterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5401
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: PrompterComponent, isStandalone: true, selector: "val-prompter", inputs: { props: "props" }, outputs: { onClick: "onClick" }, ngImport: i0, template: `
6077
5402
  <val-box
6078
- [props]="{
6079
- icon: '',
6080
- bordered: false,
6081
- color: props.color,
6082
- leftBorder: true,
6083
- rounded: props.rounded,
6084
- padding: props.padding,
6085
- }"
6086
- >
6087
- <div [ngClass]="['content-container', props.size]" body>
6088
- @if (props.prefix) {
5403
+ class="teleprompter-container"
5404
+ [props]="{ icon: '', bordered: props.bordered, color: props.color, leftBorder: false, padding: props.padding }"
5405
+ (onClick)="clickHandler()"
5406
+ >
5407
+ <div class="container" [class.teleprompter-content]="props.teleprompter" body>
5408
+ <div>
6089
5409
  <val-text
6090
- [props]="{ content: props.prefix, color: props.textColor, bold: true, size: props.size }"
5410
+ [props]="{
5411
+ content: props.content,
5412
+ color: '',
5413
+ bold: true,
5414
+ size: props.size,
5415
+ }"
6091
5416
  ></val-text>
5417
+ </div>
5418
+ @if (props.buttons || props.hrefs) {
5419
+ <div class="actions-container">
5420
+ <val-button-group
5421
+ class="buttons-container"
5422
+ [props]="{ buttons: props.buttons, position: 'right', columned: false }"
5423
+ (onClick)="clickHandler($event)"
5424
+ ></val-button-group>
5425
+ <val-href
5426
+ class="link"
5427
+ *ngFor="let l of props.hrefs"
5428
+ [props]="l"
5429
+ (onClick)="clickHandler($event)"
5430
+ ></val-href>
5431
+ </div>
6092
5432
  }
6093
- <val-text [props]="{ content: props.text, color: props.textColor, bold: false, size: props.size }"></val-text>
6094
5433
  </div>
6095
5434
  </val-box>
6096
- `, 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)}.content-container{display:inline-grid}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: BoxComponent, selector: "val-box", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
5435
+ `, isInline: true, styles: ["@charset \"UTF-8\";: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)}.container{display:flex;align-items:center;justify-content:space-between;flex-direction:column}@media (min-width: 768px){.container{flex-direction:row}}.teleprompter-container{overflow:hidden;width:100%}.teleprompter-content{white-space:nowrap;animation:scroll-left 15s linear infinite}@keyframes scroll-left{0%{transform:translate(100%)}to{transform:translate(-100%)}}.link{margin:0 .5rem;width:max-content}.actions-container{display:flex;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: BoxComponent, selector: "val-box", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: ButtonGroupComponent, selector: "val-button-group", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: HrefComponent, selector: "val-href", inputs: ["props"], outputs: ["onClick"] }] }); }
6097
5436
  }
6098
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotesBoxComponent, decorators: [{
5437
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PrompterComponent, decorators: [{
6099
5438
  type: Component,
6100
- args: [{ selector: 'val-notes-box', standalone: true, imports: [CommonModule, BoxComponent, TextComponent], template: `
5439
+ args: [{ selector: 'val-prompter', standalone: true, imports: [CommonModule, BoxComponent, ButtonGroupComponent, TextComponent, HrefComponent], template: `
6101
5440
  <val-box
6102
- [props]="{
6103
- icon: '',
6104
- bordered: false,
6105
- color: props.color,
6106
- leftBorder: true,
6107
- rounded: props.rounded,
6108
- padding: props.padding,
6109
- }"
5441
+ class="teleprompter-container"
5442
+ [props]="{ icon: '', bordered: props.bordered, color: props.color, leftBorder: false, padding: props.padding }"
5443
+ (onClick)="clickHandler()"
6110
5444
  >
6111
- <div [ngClass]="['content-container', props.size]" body>
6112
- @if (props.prefix) {
5445
+ <div class="container" [class.teleprompter-content]="props.teleprompter" body>
5446
+ <div>
6113
5447
  <val-text
6114
- [props]="{ content: props.prefix, color: props.textColor, bold: true, size: props.size }"
5448
+ [props]="{
5449
+ content: props.content,
5450
+ color: '',
5451
+ bold: true,
5452
+ size: props.size,
5453
+ }"
6115
5454
  ></val-text>
5455
+ </div>
5456
+ @if (props.buttons || props.hrefs) {
5457
+ <div class="actions-container">
5458
+ <val-button-group
5459
+ class="buttons-container"
5460
+ [props]="{ buttons: props.buttons, position: 'right', columned: false }"
5461
+ (onClick)="clickHandler($event)"
5462
+ ></val-button-group>
5463
+ <val-href
5464
+ class="link"
5465
+ *ngFor="let l of props.hrefs"
5466
+ [props]="l"
5467
+ (onClick)="clickHandler($event)"
5468
+ ></val-href>
5469
+ </div>
6116
5470
  }
6117
- <val-text [props]="{ content: props.text, color: props.textColor, bold: false, size: props.size }"></val-text>
6118
5471
  </div>
6119
5472
  </val-box>
6120
- `, 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)}.content-container{display:inline-grid}\n"] }]
6121
- }], ctorParameters: () => [], propDecorators: { props: [{
6122
- type: Input
6123
- }] } });
6124
-
6125
- class NumberFromToComponent {
6126
- constructor() { }
6127
- ngOnInit() {
6128
- // Apply default values if configured
6129
- if (this.props?.withDefault || this.props?.value) {
6130
- this.applyDefaultValues();
6131
- }
6132
- }
6133
- applyDefaultValues() {
6134
- const defaultValue = this.resolveDefaultValue();
6135
- if (defaultValue !== null) {
6136
- if (typeof defaultValue === 'object' && defaultValue.from !== undefined) {
6137
- this.fromControl?.setValue(defaultValue.from);
6138
- this.toControl?.setValue(defaultValue.to);
6139
- }
6140
- else {
6141
- // Si es un valor simple, aplicarlo a ambos controles
6142
- this.fromControl?.setValue(defaultValue);
6143
- this.toControl?.setValue(defaultValue);
6144
- }
6145
- this.fromControl?.markAsPristine();
6146
- this.toControl?.markAsPristine();
6147
- this.fromControl?.updateValueAndValidity();
6148
- this.toControl?.updateValueAndValidity();
6149
- }
6150
- }
6151
- resolveDefaultValue() {
6152
- // Explicit value takes precedence
6153
- if (this.props.value !== undefined && this.props.value !== null && this.props.value !== '') {
6154
- return this.parseValue(this.props.value);
6155
- }
6156
- // No default configuration
6157
- if (!this.props.withDefault) {
6158
- return null;
6159
- }
6160
- // Custom default value
6161
- if (typeof this.props.withDefault === 'string') {
6162
- return this.parseValue(this.props.withDefault);
6163
- }
6164
- // Auto default value (withDefault === true)
6165
- return { from: 0, to: 0 };
6166
- }
6167
- parseValue(value) {
6168
- try {
6169
- // Try to parse as JSON first (for object values)
6170
- return JSON.parse(value);
6171
- }
6172
- catch {
6173
- // If not JSON, treat as number
6174
- const numValue = parseFloat(value) || 0;
6175
- return { from: numValue, to: numValue };
6176
- }
6177
- }
6178
- get fromControl() {
6179
- return this.props.fromControl;
6180
- }
6181
- get toControl() {
6182
- return this.props.toControl;
6183
- }
6184
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumberFromToComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6185
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NumberFromToComponent, isStandalone: true, selector: "val-number-from-to", inputs: { props: "props" }, ngImport: i0, template: `
6186
- <div class="number-from-to-container">
6187
- <ion-label position="stacked">{{ props.fromLabel || 'Inicial' }}</ion-label>
6188
- <ion-input
6189
- [formControl]="fromControl"
6190
- type="number"
6191
- [placeholder]="props.fromPlaceholder || props.placeholder"
6192
- [min]="props.range?.min"
6193
- [max]="props.range?.max"
6194
- >
6195
- </ion-input>
6196
-
6197
- <ion-label position="stacked">{{ props.toLabel || 'Final' }}</ion-label>
6198
- <ion-input
6199
- [formControl]="toControl"
6200
- type="number"
6201
- [placeholder]="props.toPlaceholder || props.placeholder"
6202
- [min]="props.range?.min"
6203
- [max]="props.range?.max"
6204
- >
6205
- </ion-input>
6206
- </div>
6207
- `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }] }); }
6208
- }
6209
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumberFromToComponent, decorators: [{
6210
- type: Component,
6211
- args: [{ selector: 'val-number-from-to', standalone: true, imports: [ReactiveFormsModule, IonInput, IonLabel], template: `
6212
- <div class="number-from-to-container">
6213
- <ion-label position="stacked">{{ props.fromLabel || 'Inicial' }}</ion-label>
6214
- <ion-input
6215
- [formControl]="fromControl"
6216
- type="number"
6217
- [placeholder]="props.fromPlaceholder || props.placeholder"
6218
- [min]="props.range?.min"
6219
- [max]="props.range?.max"
6220
- >
6221
- </ion-input>
6222
-
6223
- <ion-label position="stacked">{{ props.toLabel || 'Final' }}</ion-label>
6224
- <ion-input
6225
- [formControl]="toControl"
6226
- type="number"
6227
- [placeholder]="props.toPlaceholder || props.placeholder"
6228
- [min]="props.range?.min"
6229
- [max]="props.range?.max"
6230
- >
6231
- </ion-input>
6232
- </div>
6233
- ` }]
5473
+ `, styles: ["@charset \"UTF-8\";: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)}.container{display:flex;align-items:center;justify-content:space-between;flex-direction:column}@media (min-width: 768px){.container{flex-direction:row}}.teleprompter-container{overflow:hidden;width:100%}.teleprompter-content{white-space:nowrap;animation:scroll-left 15s linear infinite}@keyframes scroll-left{0%{transform:translate(100%)}to{transform:translate(-100%)}}.link{margin:0 .5rem;width:max-content}.actions-container{display:flex;align-items:center}\n"] }]
6234
5474
  }], ctorParameters: () => [], propDecorators: { props: [{
6235
5475
  type: Input
5476
+ }], onClick: [{
5477
+ type: Output
6236
5478
  }] } });
6237
5479
 
6238
5480
  /**
6239
- * val-number-input
5481
+ * val-radio-input
6240
5482
  *
6241
- * A number input field integrated with Angular forms.
5483
+ * A radio group input for selecting one option, integrated with Angular forms.
6242
5484
  *
6243
5485
  * @example
6244
- * <val-number-input [props]="{ control: myControl, placeholder: 'Enter a number' }"></val-number-input>
5486
+ * <val-radio-input [props]="{ control: myControl, options: [{ id: '1', name: 'Option 1' }] }"></val-radio-input>
6245
5487
  *
6246
- * @input props: InputMetadata - Configuration for the input (form control, placeholder, etc.)
5488
+ * @input props: InputMetadata - Configuration for the radio input (form control, options, etc.)
6247
5489
  */
6248
- class NumberInputComponent {
5490
+ class RadioInputComponent {
6249
5491
  constructor() { }
6250
- ngOnInit() {
6251
- // Apply default values on initialization
6252
- if (this.props?.withDefault || this.props?.value) {
6253
- applyDefaultValueToControl(this.props);
6254
- }
6255
- }
6256
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumberInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6257
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NumberInputComponent, isStandalone: true, selector: "val-number-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-input [formControl]="props.control" type="number" [placeholder]="props.placeholder"></ion-input> `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
5492
+ ngOnInit() { }
5493
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RadioInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5494
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: RadioInputComponent, isStandalone: true, selector: "val-radio-input", inputs: { props: "props" }, ngImport: i0, template: `
5495
+ <ion-radio-group [allowEmptySelection]="true" [formControl]="props.control">
5496
+ <ng-container *ngFor="let o of props.options">
5497
+ <ion-radio [value]="o.id">{{ o.name }}</ion-radio>
5498
+ <br />
5499
+ </ng-container>
5500
+ </ion-radio-group>
5501
+ `, isInline: true, styles: [""], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonRadioGroup, selector: "ion-radio-group", inputs: ["allowEmptySelection", "name", "value"] }, { kind: "component", type: IonRadio, selector: "ion-radio", inputs: ["alignment", "color", "disabled", "justify", "labelPlacement", "mode", "name", "value"] }] }); }
6258
5502
  }
6259
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumberInputComponent, decorators: [{
5503
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RadioInputComponent, decorators: [{
6260
5504
  type: Component,
6261
- args: [{ selector: 'val-number-input', standalone: true, imports: [ReactiveFormsModule, IonInput], template: ` <ion-input [formControl]="props.control" type="number" [placeholder]="props.placeholder"></ion-input> ` }]
5505
+ args: [{ selector: 'val-radio-input', standalone: true, imports: [NgFor, ReactiveFormsModule, IonRadioGroup, IonRadio], template: `
5506
+ <ion-radio-group [allowEmptySelection]="true" [formControl]="props.control">
5507
+ <ng-container *ngFor="let o of props.options">
5508
+ <ion-radio [value]="o.id">{{ o.name }}</ion-radio>
5509
+ <br />
5510
+ </ng-container>
5511
+ </ion-radio-group>
5512
+ ` }]
6262
5513
  }], ctorParameters: () => [], propDecorators: { props: [{
6263
5514
  type: Input
6264
5515
  }] } });
6265
5516
 
6266
5517
  /**
6267
- * val-password-input
5518
+ * val-searchbar
6268
5519
  *
6269
- * A password input field with show/hide toggle, integrated with Angular forms.
5520
+ * A search bar component with debounce and event emitters for filtering, focus, and blur.
6270
5521
  *
6271
5522
  * @example
6272
- * <val-password-input [props]="{ control: myControl, placeholder: 'Enter password' }"></val-password-input>
5523
+ * <val-searchbar (filterEvent)="onFilter($event)" (focusEvent)="onFocus()" (blurEvent)="onBlur()"></val-searchbar>
6273
5524
  *
6274
- * @input props: InputMetadata - Configuration for the input (form control, placeholder, etc.)
5525
+ * @input disabled - Whether the searchbar is disabled.
5526
+ * @output filterEvent - Emits the search term on input.
5527
+ * @output focusEvent - Emits when the searchbar gains focus.
5528
+ * @output blurEvent - Emits when the searchbar loses focus.
6275
5529
  */
6276
- class PasswordInputComponent {
6277
- constructor(icon) {
6278
- this.hidePassword = true;
6279
- }
6280
- ngOnInit() { }
6281
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PasswordInputComponent, deps: [{ token: IconService }], target: i0.ɵɵFactoryTarget.Component }); }
6282
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PasswordInputComponent, isStandalone: true, selector: "val-password-input", inputs: { props: "props" }, ngImport: i0, template: `
6283
- <div class="input-container">
6284
- <ion-input
6285
- class="sign-in__input-password"
6286
- [formControl]="props.control"
6287
- [type]="hidePassword ? 'password' : 'text'"
6288
- [placeholder]="props.placeholder"
6289
- ></ion-input>
6290
- <ion-button color="dark" fill="clear" (click)="hidePassword = !hidePassword" size="small">
6291
- <ion-icon slot="icon-only" [name]="hidePassword ? 'eye-off-outline' : 'eye-outline'"></ion-icon>
6292
- </ion-button>
6293
- </div>
6294
- `, 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)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.input-container{display:flex;align-items:center;flex-direction:row}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { 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"] }] }); }
6295
- }
6296
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PasswordInputComponent, decorators: [{
6297
- type: Component,
6298
- args: [{ selector: 'val-password-input', standalone: true, imports: [ReactiveFormsModule, IonInput, IonButton, IonIcon], template: `
6299
- <div class="input-container">
6300
- <ion-input
6301
- class="sign-in__input-password"
6302
- [formControl]="props.control"
6303
- [type]="hidePassword ? 'password' : 'text'"
6304
- [placeholder]="props.placeholder"
6305
- ></ion-input>
6306
- <ion-button color="dark" fill="clear" (click)="hidePassword = !hidePassword" size="small">
6307
- <ion-icon slot="icon-only" [name]="hidePassword ? 'eye-off-outline' : 'eye-outline'"></ion-icon>
6308
- </ion-button>
6309
- </div>
6310
- `, 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)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.input-container{display:flex;align-items:center;flex-direction:row}\n"] }]
6311
- }], ctorParameters: () => [{ type: IconService }], propDecorators: { props: [{
6312
- type: Input
6313
- }] } });
6314
-
6315
- class PillComponent {
5530
+ class SearchbarComponent {
6316
5531
  constructor() {
6317
- this.theme = inject(ThemeService);
5532
+ /**
5533
+ * Emits the search term on input.
5534
+ */
5535
+ this.filterEvent = new EventEmitter();
5536
+ /**
5537
+ * Emits when the searchbar gains focus.
5538
+ */
5539
+ this.focusEvent = new EventEmitter();
5540
+ /**
5541
+ * Emits when the searchbar loses focus.
5542
+ */
5543
+ this.blurEvent = new EventEmitter();
6318
5544
  }
6319
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PillComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6320
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PillComponent, isStandalone: true, selector: "val-pill", inputs: { props: "props" }, ngImport: i0, template: `
6321
- <div
6322
- [id]="props.token"
6323
- class="fun-card"
6324
- [class.bordered]="props.bordered"
6325
- [class.hoverable]="props.hoverable"
6326
- [ngStyle]="{
6327
- background: theme.IsDark ? 'var(--ion-background-color)' : props.background,
6328
- }"
5545
+ onSearch($event) {
5546
+ const searchTerm = $event.detail.value;
5547
+ this.filterEvent.emit(searchTerm);
5548
+ }
5549
+ onFocus() {
5550
+ this.focusEvent.emit();
5551
+ }
5552
+ onBlur() {
5553
+ this.blurEvent.emit();
5554
+ }
5555
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5556
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchbarComponent, isStandalone: true, selector: "val-searchbar", inputs: { disabled: "disabled" }, outputs: { filterEvent: "filterEvent", focusEvent: "focusEvent", blurEvent: "blurEvent" }, ngImport: i0, template: `
5557
+ <ion-searchbar
5558
+ mode="ios"
5559
+ debounce="500"
5560
+ placeholder="Búsqueda"
5561
+ [disabled]="disabled"
5562
+ showCancelButton="focus"
5563
+ cancelButtonText="Cancelar"
5564
+ (ionInput)="onSearch($event)"
5565
+ (ionBlur)="onBlur()"
5566
+ (ionFocus)="onFocus()"
6329
5567
  >
6330
- <val-action-header style="width: 100%;" [props]="props.content" />
6331
- </div>
6332
- `, 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)}.fun-card{z-index:0;position:relative;margin-bottom:8px;cursor:pointer;background:var(--ion-card-background, var(--ion-item-background, var(--ion-background-color, #fff)));display:flex;border-radius:48px;align-items:start;padding:8px 8px 8px 24px;flex-direction:column;box-shadow:0 .25rem .75rem #12195412}.fun-card.hoverable{transition:transform .3s ease,box-shadow .3s ease}.fun-card.hoverable:hover{transform:scale(1.01);box-shadow:.1875rem .625rem .5rem #1219541a}.bordered{border:.0625rem solid var(--ion-color-medium)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ActionHeaderComponent, selector: "val-action-header", inputs: ["props"] }] }); }
5568
+ </ion-searchbar>
5569
+ `, 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)}ion-searchbar{--cancel-button-color: var(--ion-color-dark);--background: var(--ion-color-light);font-family:var(--ion-default-font),Arial,sans-serif}\n"], dependencies: [{ kind: "component", type: IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }] }); }
6333
5570
  }
6334
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PillComponent, decorators: [{
5571
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchbarComponent, decorators: [{
6335
5572
  type: Component,
6336
- args: [{ selector: 'val-pill', standalone: true, imports: [CommonModule, ActionHeaderComponent], template: `
6337
- <div
6338
- [id]="props.token"
6339
- class="fun-card"
6340
- [class.bordered]="props.bordered"
6341
- [class.hoverable]="props.hoverable"
6342
- [ngStyle]="{
6343
- background: theme.IsDark ? 'var(--ion-background-color)' : props.background,
6344
- }"
5573
+ args: [{ selector: 'val-searchbar', standalone: true, imports: [IonSearchbar], template: `
5574
+ <ion-searchbar
5575
+ mode="ios"
5576
+ debounce="500"
5577
+ placeholder="Búsqueda"
5578
+ [disabled]="disabled"
5579
+ showCancelButton="focus"
5580
+ cancelButtonText="Cancelar"
5581
+ (ionInput)="onSearch($event)"
5582
+ (ionBlur)="onBlur()"
5583
+ (ionFocus)="onFocus()"
6345
5584
  >
6346
- <val-action-header style="width: 100%;" [props]="props.content" />
6347
- </div>
6348
- `, 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)}.fun-card{z-index:0;position:relative;margin-bottom:8px;cursor:pointer;background:var(--ion-card-background, var(--ion-item-background, var(--ion-background-color, #fff)));display:flex;border-radius:48px;align-items:start;padding:8px 8px 8px 24px;flex-direction:column;box-shadow:0 .25rem .75rem #12195412}.fun-card.hoverable{transition:transform .3s ease,box-shadow .3s ease}.fun-card.hoverable:hover{transform:scale(1.01);box-shadow:.1875rem .625rem .5rem #1219541a}.bordered{border:.0625rem solid var(--ion-color-medium)}\n"] }]
6349
- }], propDecorators: { props: [{
5585
+ </ion-searchbar>
5586
+ `, 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)}ion-searchbar{--cancel-button-color: var(--ion-color-dark);--background: var(--ion-color-light);font-family:var(--ion-default-font),Arial,sans-serif}\n"] }]
5587
+ }], ctorParameters: () => [], propDecorators: { disabled: [{
6350
5588
  type: Input
5589
+ }], filterEvent: [{
5590
+ type: Output
5591
+ }], focusEvent: [{
5592
+ type: Output
5593
+ }], blurEvent: [{
5594
+ type: Output
6351
5595
  }] } });
6352
5596
 
6353
5597
  /**
6354
- * val-pin-input
5598
+ * val-select-input
6355
5599
  *
6356
- * A PIN code input using ng-otp-input, integrated with Angular forms.
5600
+ * A select/dropdown input integrated with Angular forms, using Ionic's select component.
6357
5601
  *
6358
5602
  * @example
6359
- * <val-pin-input [props]="{ control: myControl }"></val-pin-input>
5603
+ * <val-select-input [props]="{ control: myControl, label: 'Choose', options: [{ id: '1', name: 'Option 1' }] }"></val-select-input>
6360
5604
  *
6361
- * @input props: InputMetadata - Configuration for the PIN input (form control, etc.)
5605
+ * @input props: InputMetadata - Configuration for the select input (form control, label, options, etc.)
6362
5606
  */
6363
- class PinInputComponent {
5607
+ class SearchSelectorComponent {
6364
5608
  constructor() {
6365
- this.codeLength = 5;
6366
- this.otpInputConfig = {
6367
- inputStyles: {
6368
- 'font-size': '32px',
6369
- width: '58px',
6370
- height: '60px',
6371
- },
6372
- inputClass: 'otp-input-box',
6373
- length: this.codeLength,
6374
- allowNumbersOnly: true,
5609
+ this.customModalOptions = {
5610
+ header: 'Seleccione',
5611
+ breakpoints: [0, 0.6],
5612
+ initialBreakpoint: 0.6,
6375
5613
  };
6376
5614
  }
6377
- ngOnInit() { }
6378
- reset() {
6379
- if (this.pinCode) {
6380
- this.pinCode.setValue('');
5615
+ ngOnInit() {
5616
+ if (this.props?.withDefault || this.props?.value) {
5617
+ applyDefaultValueToControl(this.props);
6381
5618
  }
5619
+ this.customModalOptions.header = this.props.label;
6382
5620
  }
6383
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PinInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6384
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PinInputComponent, isStandalone: true, selector: "val-pin-input", inputs: { props: "props" }, viewQueries: [{ propertyName: "pinCode", first: true, predicate: NgOtpInputComponent, descendants: true }], ngImport: i0, template: `
6385
- <div class="otp">
6386
- <ng-otp-input [formCtrl]="props.control" [config]="otpInputConfig"></ng-otp-input>
6387
- </div>
6388
- `, 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)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.otp{text-align:center;margin-top:.25rem;font-family:var(--ion-default-font),Arial,sans-serif}.otp-input-box:focus{border-color:#0ff}\n"], dependencies: [{ kind: "ngmodule", type: NgOtpInputModule }, { kind: "component", type: i1$3.NgOtpInputComponent, selector: "ng-otp-input", inputs: ["config", "formCtrl"], outputs: ["onInputChange"] }] }); }
5621
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5622
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: SearchSelectorComponent, isStandalone: true, selector: "val-select-input", inputs: { props: "props" }, ngImport: i0, template: `
5623
+ <ion-select
5624
+ [formControl]="props.control"
5625
+ [label]="props.label"
5626
+ [interfaceOptions]="customModalOptions"
5627
+ interface="modal"
5628
+ [placeholder]="[props.placeholder]"
5629
+ cancelText="Cancelar"
5630
+ okText="Ok"
5631
+ >
5632
+ @for (o of props.options; track o.id) {
5633
+ <ion-select-option [value]="o.id">{{ o.name }}</ion-select-option>
5634
+ }
5635
+ </ion-select>
5636
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { 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"] }] }); }
6389
5637
  }
6390
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PinInputComponent, decorators: [{
5638
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchSelectorComponent, decorators: [{
6391
5639
  type: Component,
6392
- args: [{ selector: 'val-pin-input', standalone: true, imports: [NgOtpInputModule], template: `
6393
- <div class="otp">
6394
- <ng-otp-input [formCtrl]="props.control" [config]="otpInputConfig"></ng-otp-input>
6395
- </div>
6396
- `, 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)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.otp{text-align:center;margin-top:.25rem;font-family:var(--ion-default-font),Arial,sans-serif}.otp-input-box:focus{border-color:#0ff}\n"] }]
6397
- }], ctorParameters: () => [], propDecorators: { pinCode: [{
6398
- type: ViewChild,
6399
- args: [NgOtpInputComponent, { static: false }]
6400
- }], props: [{
5640
+ args: [{ selector: 'val-select-input', standalone: true, imports: [ReactiveFormsModule, IonSelect, IonSelectOption], template: `
5641
+ <ion-select
5642
+ [formControl]="props.control"
5643
+ [label]="props.label"
5644
+ [interfaceOptions]="customModalOptions"
5645
+ interface="modal"
5646
+ [placeholder]="[props.placeholder]"
5647
+ cancelText="Cancelar"
5648
+ okText="Ok"
5649
+ >
5650
+ @for (o of props.options; track o.id) {
5651
+ <ion-select-option [value]="o.id">{{ o.name }}</ion-select-option>
5652
+ }
5653
+ </ion-select>
5654
+ ` }]
5655
+ }], ctorParameters: () => [], propDecorators: { props: [{
6401
5656
  type: Input
6402
5657
  }] } });
6403
5658
 
6404
- class PlainCodeBoxComponent {
5659
+ /**
5660
+ * Removes diacritical marks (accents) from a string using Unicode normalization.
5661
+ * Useful for text search and comparison.
5662
+ *
5663
+ * @param text The input string
5664
+ * @returns The normalized string without diacritical marks
5665
+ *
5666
+ * @example
5667
+ * replaceSpecialChars('canción') // returns 'cancion'
5668
+ */
5669
+ const replaceSpecialChars = (text) => text.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
5670
+
5671
+ /**
5672
+ * val-select-search
5673
+ *
5674
+ * A searchable select/dropdown input with modal and filtering, integrated with Angular forms.
5675
+ *
5676
+ * @example
5677
+ * <val-select-search [props]="{ control: myControl, label: 'Choose', options: [{ id: '1', name: 'Option 1' }] }"></val-select-search>
5678
+ *
5679
+ * @input props: InputMetadata - Configuration for the select input (form control, label, options, etc.)
5680
+ */
5681
+ class SelectSearchComponent {
6405
5682
  constructor() {
6406
- this.toast = inject(ToastController);
6407
- this.cdr = inject(ChangeDetectorRef);
5683
+ this.labelProperty = 'name';
5684
+ this.valueProperty = 'id';
5685
+ this.multiple = false;
6408
5686
  this.langService = inject(LangService);
6409
- this.props = { lines: [] };
6410
- }
6411
- ngOnChanges(changes) {
6412
- if (changes['props'] && !changes['props'].firstChange) {
6413
- this.cdr.detectChanges();
6414
- setTimeout(() => this.highlightCode());
6415
- }
5687
+ this.icon = inject(IconService);
5688
+ this.changeDetector = inject(ChangeDetectorRef);
5689
+ this.searchTerm = '';
5690
+ this.filteredItems = [];
5691
+ this.selectedItems = [];
5692
+ this.displayValue = '';
5693
+ this.previousOptions = [];
5694
+ this.isProcessingChanges = false;
5695
+ this.label = this.langService.getText('_global', 'select', 'Seleccionar');
5696
+ this.placeholder = this.langService.getText('_global', 'selectOption', 'Seleccione una opción');
6416
5697
  }
6417
- ngAfterViewInit() {
6418
- setTimeout(() => this.highlightCode());
5698
+ ngOnInit() {
5699
+ this.applyDefaultValue();
5700
+ this.initializeItems();
5701
+ this.syncControlValueWithSelectedItems();
5702
+ this.updateDisplayValue();
5703
+ this.subscribeToValueChanges();
6419
5704
  }
6420
- highlightCode() {
6421
- if (this.codeBlock && this.props.lines && this.props.lines.length > 0) {
6422
- Prism.highlightElement(this.codeBlock.nativeElement);
5705
+ ngOnDestroy() {
5706
+ // Limpiar suscripciones para evitar memory leaks
5707
+ if (this.valueChangesSubscription) {
5708
+ this.valueChangesSubscription.unsubscribe();
6423
5709
  }
6424
5710
  }
6425
- async copyCode() {
6426
- const fullCode = this.props.lines.map(line => line.text).join('\n');
6427
- if (fullCode) {
6428
- await Clipboard.write({
6429
- string: fullCode,
6430
- });
6431
- const copiedMessage = this.langService.getText('_global', 'copied', '¡Copiado al portapapeles!');
6432
- this.presentToast(copiedMessage);
6433
- }
5711
+ ngOnChanges(changes) {
5712
+ // Evitar bucles infinitos
5713
+ if (this.isProcessingChanges) {
5714
+ return;
5715
+ }
5716
+ // Cuando cambia props o props.options
5717
+ if (changes['props']) {
5718
+ try {
5719
+ this.isProcessingChanges = true;
5720
+ // Desuscribirse del antiguo control si existe
5721
+ if (this.valueChangesSubscription) {
5722
+ this.valueChangesSubscription.unsubscribe();
5723
+ }
5724
+ if (this.props?.options) {
5725
+ // Verificar si las opciones han cambiado realmente
5726
+ const optionsChanged = !this.areOptionsEqual(this.previousOptions, this.props.options);
5727
+ if (optionsChanged) {
5728
+ this.previousOptions = [...this.props.options];
5729
+ this.initializeItems();
5730
+ }
5731
+ }
5732
+ // Sincronizar con el nuevo control si existe
5733
+ this.syncControlValueWithSelectedItems();
5734
+ this.updateDisplayValue();
5735
+ // Suscribirse al nuevo control
5736
+ this.subscribeToValueChanges();
5737
+ }
5738
+ finally {
5739
+ this.isProcessingChanges = false;
5740
+ }
5741
+ }
6434
5742
  }
6435
- async presentToast(message) {
6436
- const toast = await this.toast.create({
6437
- message: message,
6438
- duration: 2000,
6439
- position: 'bottom',
6440
- color: 'dark',
5743
+ ionViewWillEnter() {
5744
+ if (this.isProcessingChanges) {
5745
+ return;
5746
+ }
5747
+ try {
5748
+ this.isProcessingChanges = true;
5749
+ this.initializeItems();
5750
+ this.syncControlValueWithSelectedItems();
5751
+ this.updateDisplayValue();
5752
+ this.subscribeToValueChanges();
5753
+ }
5754
+ finally {
5755
+ this.isProcessingChanges = false;
5756
+ }
5757
+ }
5758
+ // Suscribirse a cambios en el FormControl
5759
+ subscribeToValueChanges() {
5760
+ if (!this.props?.control)
5761
+ return;
5762
+ this.valueChangesSubscription = this.props.control.valueChanges.subscribe(value => {
5763
+ if (this.isProcessingChanges)
5764
+ return;
5765
+ try {
5766
+ this.isProcessingChanges = true;
5767
+ this.syncControlValueWithSelectedItems();
5768
+ this.updateDisplayValue();
5769
+ }
5770
+ finally {
5771
+ this.isProcessingChanges = false;
5772
+ }
6441
5773
  });
6442
- toast.present();
6443
5774
  }
6444
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PlainCodeBoxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6445
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PlainCodeBoxComponent, isStandalone: true, selector: "val-plain-code-box", inputs: { props: "props" }, viewQueries: [{ propertyName: "codeBlock", first: true, predicate: ["codeBlock"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
6446
- <div class="code-box-container">
6447
- <ion-button *ngIf="props.showCopyButton !== false" fill="clear" class="copy-button" (click)="copyCode()">
6448
- <ion-icon name="copy-outline"></ion-icon>
6449
- </ion-button>
6450
- <pre><code [class]="'language-' + (props.language || 'bash')" #codeBlock><ng-container *ngFor="let line of props.lines; let i = index"><span [class]="line.type ? 'line-' + line.type : 'line-normal'">{{ line.text }}</span><br *ngIf="i < props.lines.length - 1">
6451
- </ng-container></code></pre>
6452
- </div>
6453
- `, isInline: true, styles: [".code-box-container{position:relative;background-color:#282c34;border-radius:16px;overflow:hidden;box-shadow:0 4px 15px #0009;margin:0}@media (prefers-color-scheme: light){.code-box-container{background-color:#fff;box-shadow:0 2px 4px #0000001a}}.copy-button{position:absolute;top:8px;right:8px;z-index:10;--padding-start: 2px;--padding-end: 2px;--padding-top: 2px;--padding-bottom: 2px;min-width:28px;min-height:28px;height:28px;width:28px;color:#61afef;background:#0006;border-radius:6px;box-shadow:0 1px 4px #0000000d;display:flex;align-items:center;justify-content:center;transition:background .2s ease,color .2s ease}.copy-button:hover{background:#00000080;color:#8cc4ff}.copy-button ion-icon{font-size:1.2em;margin:0}@media (prefers-color-scheme: light){.copy-button{color:var(--ion-color-primary, #007bff);background:#ffffffb3}.copy-button:hover{background:#ffffffe6;color:var(--ion-color-primary-tint, #3880ff)}}pre{margin:0;padding:0;background-color:transparent;min-width:100%;min-height:100%;white-space:pre-wrap;word-break:normal;font-family:Roboto Mono,monospace}code{font-family:Roboto Mono,monospace;font-size:.9em;line-height:1.6;display:block;white-space:inherit;word-break:inherit;color:#abb2bf;margin:0}@media (prefers-color-scheme: light){code{color:#333}}code .line-normal{color:#abb2bf}@media (prefers-color-scheme: light){code .line-normal{color:#333}}code .line-command{color:#c678dd}@media (prefers-color-scheme: light){code .line-command{color:var(--ion-color-primary, #3880ff)}}code .line-error{color:#e06c75}@media (prefers-color-scheme: light){code .line-error{color:var(--ion-color-danger, #eb445a)}}code .line-success{color:#98c379}@media (prefers-color-scheme: light){code .line-success{color:var(--ion-color-success, #2dd36f)}}code .token.comment{color:#5c6370}code .token.selector,code .token.string{color:#98c379}code .token.punctuation{color:#abb2bf}code .token.operator{color:#c678dd}code .token.boolean,code .token.number{color:#d19a66}code .token.function{color:#61afef}code .token.keyword{color:#c678dd}code .token.class-name{color:#e6c07b}code .token.tag{color:#e06c75}code .token.attr-name{color:#d19a66}code .token.attr-value{color:#98c379}code .token.property{color:#56b6c2}code .token.variable{color:#e06c75}@media (max-width: 600px){.code-box-container{border-radius:16px}.copy-button{top:6px;right:6px;min-width:24px;min-height:24px;height:24px;width:24px}.copy-button ion-icon{font-size:1em}pre{padding:0;margin:0}code{font-size:.8em;line-height:1.5;margin:0}}@media (min-width: 601px) and (max-width: 1024px){code{font-size:.9em}}@media (min-width: 1025px){code{font-size:1em}}\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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { 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"] }] }); }
6454
- }
6455
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PlainCodeBoxComponent, decorators: [{
6456
- type: Component,
6457
- args: [{ selector: 'val-plain-code-box', standalone: true, imports: [CommonModule, IonIcon, IonButton], template: `
6458
- <div class="code-box-container">
6459
- <ion-button *ngIf="props.showCopyButton !== false" fill="clear" class="copy-button" (click)="copyCode()">
6460
- <ion-icon name="copy-outline"></ion-icon>
6461
- </ion-button>
6462
- <pre><code [class]="'language-' + (props.language || 'bash')" #codeBlock><ng-container *ngFor="let line of props.lines; let i = index"><span [class]="line.type ? 'line-' + line.type : 'line-normal'">{{ line.text }}</span><br *ngIf="i < props.lines.length - 1">
6463
- </ng-container></code></pre>
6464
- </div>
6465
- `, styles: [".code-box-container{position:relative;background-color:#282c34;border-radius:16px;overflow:hidden;box-shadow:0 4px 15px #0009;margin:0}@media (prefers-color-scheme: light){.code-box-container{background-color:#fff;box-shadow:0 2px 4px #0000001a}}.copy-button{position:absolute;top:8px;right:8px;z-index:10;--padding-start: 2px;--padding-end: 2px;--padding-top: 2px;--padding-bottom: 2px;min-width:28px;min-height:28px;height:28px;width:28px;color:#61afef;background:#0006;border-radius:6px;box-shadow:0 1px 4px #0000000d;display:flex;align-items:center;justify-content:center;transition:background .2s ease,color .2s ease}.copy-button:hover{background:#00000080;color:#8cc4ff}.copy-button ion-icon{font-size:1.2em;margin:0}@media (prefers-color-scheme: light){.copy-button{color:var(--ion-color-primary, #007bff);background:#ffffffb3}.copy-button:hover{background:#ffffffe6;color:var(--ion-color-primary-tint, #3880ff)}}pre{margin:0;padding:0;background-color:transparent;min-width:100%;min-height:100%;white-space:pre-wrap;word-break:normal;font-family:Roboto Mono,monospace}code{font-family:Roboto Mono,monospace;font-size:.9em;line-height:1.6;display:block;white-space:inherit;word-break:inherit;color:#abb2bf;margin:0}@media (prefers-color-scheme: light){code{color:#333}}code .line-normal{color:#abb2bf}@media (prefers-color-scheme: light){code .line-normal{color:#333}}code .line-command{color:#c678dd}@media (prefers-color-scheme: light){code .line-command{color:var(--ion-color-primary, #3880ff)}}code .line-error{color:#e06c75}@media (prefers-color-scheme: light){code .line-error{color:var(--ion-color-danger, #eb445a)}}code .line-success{color:#98c379}@media (prefers-color-scheme: light){code .line-success{color:var(--ion-color-success, #2dd36f)}}code .token.comment{color:#5c6370}code .token.selector,code .token.string{color:#98c379}code .token.punctuation{color:#abb2bf}code .token.operator{color:#c678dd}code .token.boolean,code .token.number{color:#d19a66}code .token.function{color:#61afef}code .token.keyword{color:#c678dd}code .token.class-name{color:#e6c07b}code .token.tag{color:#e06c75}code .token.attr-name{color:#d19a66}code .token.attr-value{color:#98c379}code .token.property{color:#56b6c2}code .token.variable{color:#e06c75}@media (max-width: 600px){.code-box-container{border-radius:16px}.copy-button{top:6px;right:6px;min-width:24px;min-height:24px;height:24px;width:24px}.copy-button ion-icon{font-size:1em}pre{padding:0;margin:0}code{font-size:.8em;line-height:1.5;margin:0}}@media (min-width: 601px) and (max-width: 1024px){code{font-size:.9em}}@media (min-width: 1025px){code{font-size:1em}}\n"] }]
6466
- }], ctorParameters: () => [], propDecorators: { props: [{
6467
- type: Input
6468
- }], codeBlock: [{
6469
- type: ViewChild,
6470
- args: ['codeBlock']
6471
- }] } });
6472
-
6473
- //TODO: support automatic or manual interval for messages. Include the interval number as a parameter.
6474
- /**
6475
- * val-progress-status
6476
- *
6477
- * Displays a progress bar with status messages and titles, useful for multi-step or loading processes.
6478
- *
6479
- * @example
6480
- * <val-progress-status [props]="{ progress: 0.5, color: 'primary', size: 'medium', titles: {...}, messages: [...] }"></val-progress-status>
6481
- *
6482
- * @input props: ProgressStatusMetadata - Configuration for the progress status (progress, color, size, titles, messages)
6483
- */
6484
- class ProgressStatusComponent {
6485
- constructor() {
6486
- this.currentIndex = 0;
6487
- this.blinking = false;
5775
+ // Compara si dos arrays de opciones son iguales
5776
+ areOptionsEqual(prevOptions, newOptions) {
5777
+ // PERF: Use reference equality first for fast path
5778
+ if (prevOptions === newOptions)
5779
+ return true;
5780
+ if (!prevOptions || !newOptions)
5781
+ return prevOptions === newOptions;
5782
+ if (prevOptions.length !== newOptions.length)
5783
+ return false;
5784
+ // Only compare valueProperty for equality
5785
+ for (let i = 0; i < prevOptions.length; i++) {
5786
+ if (prevOptions[i][this.valueProperty] !== newOptions[i][this.valueProperty]) {
5787
+ return false;
5788
+ }
5789
+ }
5790
+ return true;
6488
5791
  }
6489
- ngOnInit() {
6490
- setInterval(() => {
6491
- this.blinking = !this.blinking;
6492
- }, 1000);
6493
- setInterval(() => {
6494
- this.getNextMessage();
6495
- }, 9000);
5792
+ initializeItems() {
5793
+ // PERF: Avoid unnecessary array copies
5794
+ this.filteredItems = this.props?.options || [];
6496
5795
  }
6497
- get Content() {
6498
- return this.props.messages[this.currentIndex];
5796
+ syncControlValueWithSelectedItems() {
5797
+ if (!this.props?.control) {
5798
+ this.selectedItems = [];
5799
+ return;
5800
+ }
5801
+ const controlValue = this.props.control.value;
5802
+ if (controlValue === null || controlValue === undefined) {
5803
+ this.selectedItems = [];
5804
+ return;
5805
+ }
5806
+ // PERF: Use a Map for faster lookup if options are large
5807
+ if (this.props.options && this.props.options.length > 0) {
5808
+ const map = new Map(this.props.options.map(opt => [opt[this.valueProperty], opt]));
5809
+ const selectedOption = map.get(controlValue);
5810
+ this.selectedItems = selectedOption ? [selectedOption] : [];
5811
+ }
5812
+ else {
5813
+ this.selectedItems = [];
5814
+ }
6499
5815
  }
6500
- getNextMessage() {
6501
- this.currentIndex = (this.currentIndex + 1) % this.props.messages.length;
5816
+ applyDefaultValue() {
5817
+ applyDefaultValueToControl(this.props);
6502
5818
  }
6503
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProgressStatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6504
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ProgressStatusComponent, isStandalone: true, selector: "val-progress-status", inputs: { props: "props" }, ngImport: i0, template: `
6505
- <div class="status-container">
6506
- <div class="title-container">
6507
- <val-title-block
6508
- [props]="{
6509
- position: 'center',
6510
- aboveTitle: props.titles.aboveTitle,
6511
- title: props.titles.title,
6512
- bellowTitle: props.titles.bellowTitle,
6513
- }"
6514
- ></val-title-block>
6515
- </div>
6516
- <div class="progress-bar-container">
6517
- <val-progress-bar
6518
- [props]="{
6519
- progress: props.progress,
6520
- size: 'xlarge',
6521
- color: props.color,
6522
- rounded: true,
6523
- type: 'determinate',
6524
- buffer: 1,
6525
- }"
6526
- ></val-progress-bar>
6527
- </div>
6528
- <div class="subtitle-container">
6529
- <div class="subtitle" [class.blink]="blinking">
6530
- <val-text [props]="{ content: Content, color: 'medium', bold: false, size: props.size }"></val-text>
6531
- </div>
6532
- </div>
6533
- </div>
6534
- `, 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)}.status-container{min-height:6.25rem;margin:1rem .5rem}.progress-bar-container{max-width:60%;margin:0 auto}.title-container{margin-bottom:.5rem}.subtitle-container{width:100%;display:flex}.subtitle{padding:1rem;margin:0 auto;height:1rem}.blink{animation:blink 1s infinite alternate ease-in}@keyframes blink{0%{opacity:0;margin-top:6px}to{opacity:1;margin-top:0}}\n"], dependencies: [{ kind: "component", type: TitleBlockComponent, selector: "val-title-block", inputs: ["props"] }, { kind: "component", type: ProgressBarComponent, selector: "val-progress-bar", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
6535
- }
6536
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProgressStatusComponent, decorators: [{
6537
- type: Component,
6538
- args: [{ selector: 'val-progress-status', standalone: true, imports: [TitleBlockComponent, ProgressBarComponent, TextComponent], template: `
6539
- <div class="status-container">
6540
- <div class="title-container">
6541
- <val-title-block
6542
- [props]="{
6543
- position: 'center',
6544
- aboveTitle: props.titles.aboveTitle,
6545
- title: props.titles.title,
6546
- bellowTitle: props.titles.bellowTitle,
6547
- }"
6548
- ></val-title-block>
6549
- </div>
6550
- <div class="progress-bar-container">
6551
- <val-progress-bar
6552
- [props]="{
6553
- progress: props.progress,
6554
- size: 'xlarge',
6555
- color: props.color,
6556
- rounded: true,
6557
- type: 'determinate',
6558
- buffer: 1,
6559
- }"
6560
- ></val-progress-bar>
6561
- </div>
6562
- <div class="subtitle-container">
6563
- <div class="subtitle" [class.blink]="blinking">
6564
- <val-text [props]="{ content: Content, color: 'medium', bold: false, size: props.size }"></val-text>
6565
- </div>
6566
- </div>
6567
- </div>
6568
- `, 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)}.status-container{min-height:6.25rem;margin:1rem .5rem}.progress-bar-container{max-width:60%;margin:0 auto}.title-container{margin-bottom:.5rem}.subtitle-container{width:100%;display:flex}.subtitle{padding:1rem;margin:0 auto;height:1rem}.blink{animation:blink 1s infinite alternate ease-in}@keyframes blink{0%{opacity:0;margin-top:6px}to{opacity:1;margin-top:0}}\n"] }]
6569
- }], ctorParameters: () => [], propDecorators: { props: [{
6570
- type: Input
6571
- }] } });
6572
-
6573
- /**
6574
- * val-prompter
6575
- *
6576
- * Displays a prompt/info box with text, actions (buttons/links), and custom styles.
6577
- *
6578
- * @example
6579
- * <val-prompter [props]="{ content: 'Message', buttons: [...], hrefs: [...], color: 'primary', size: 'medium' }"></val-prompter>
6580
- *
6581
- * @input props: PrompterMetadata - Configuration for the prompter (content, buttons, hrefs, color, size, etc.)
6582
- * @output onClick - Emits when an action is clicked
6583
- */
6584
- class PrompterComponent {
6585
- constructor() {
6586
- this.onClick = new EventEmitter();
5819
+ onFilter(event) {
5820
+ // If no search term, show all options
5821
+ if (!event || event.trim() === '') {
5822
+ this.filteredItems = this.props?.options ? [...this.props.options] : [];
5823
+ this.changeDetector.detectChanges();
5824
+ return;
5825
+ }
5826
+ // If no options, nothing to filter
5827
+ if (!this.props?.options || this.props.options.length === 0) {
5828
+ this.filteredItems = [];
5829
+ this.changeDetector.detectChanges();
5830
+ return;
5831
+ }
5832
+ // PERF: Avoid repeated replaceSpecialChars and toLowerCase for each option
5833
+ const search = replaceSpecialChars(event.toLowerCase());
5834
+ this.filteredItems = this.props.options.filter(element => {
5835
+ // Only use labelProperty and valueProperty for filtering (faster)
5836
+ const label = element[this.labelProperty]
5837
+ ? replaceSpecialChars(String(element[this.labelProperty]).toLowerCase())
5838
+ : '';
5839
+ const value = element[this.valueProperty]
5840
+ ? replaceSpecialChars(String(element[this.valueProperty]).toLowerCase())
5841
+ : '';
5842
+ return label.includes(search) || value.includes(search);
5843
+ });
5844
+ this.changeDetector.detectChanges();
6587
5845
  }
6588
- ngOnInit() { }
6589
- clickHandler(token) {
6590
- this.onClick.emit(token);
5846
+ onFocus() {
5847
+ console.log('onFocus');
6591
5848
  }
6592
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PrompterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6593
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: PrompterComponent, isStandalone: true, selector: "val-prompter", inputs: { props: "props" }, outputs: { onClick: "onClick" }, ngImport: i0, template: `
6594
- <val-box
6595
- class="teleprompter-container"
6596
- [props]="{ icon: '', bordered: props.bordered, color: props.color, leftBorder: false, padding: props.padding }"
6597
- (onClick)="clickHandler()"
6598
- >
6599
- <div class="container" [class.teleprompter-content]="props.teleprompter" body>
6600
- <div>
6601
- <val-text
6602
- [props]="{
6603
- content: props.content,
6604
- color: '',
6605
- bold: true,
6606
- size: props.size,
6607
- }"
6608
- ></val-text>
6609
- </div>
6610
- @if (props.buttons || props.hrefs) {
6611
- <div class="actions-container">
6612
- <val-button-group
6613
- class="buttons-container"
6614
- [props]="{ buttons: props.buttons, position: 'right', columned: false }"
6615
- (onClick)="clickHandler($event)"
6616
- ></val-button-group>
6617
- <val-href
6618
- class="link"
6619
- *ngFor="let l of props.hrefs"
6620
- [props]="l"
6621
- (onClick)="clickHandler($event)"
6622
- ></val-href>
6623
- </div>
5849
+ onBlur() {
5850
+ console.log('onBlur');
5851
+ }
5852
+ openModal() {
5853
+ if (this.modal) {
5854
+ this.modal.present();
6624
5855
  }
6625
- </div>
6626
- </val-box>
6627
- `, isInline: true, styles: ["@charset \"UTF-8\";: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)}.container{display:flex;align-items:center;justify-content:space-between;flex-direction:column}@media (min-width: 768px){.container{flex-direction:row}}.teleprompter-container{overflow:hidden;width:100%}.teleprompter-content{white-space:nowrap;animation:scroll-left 15s linear infinite}@keyframes scroll-left{0%{transform:translate(100%)}to{transform:translate(-100%)}}.link{margin:0 .5rem;width:max-content}.actions-container{display:flex;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: BoxComponent, selector: "val-box", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: ButtonGroupComponent, selector: "val-button-group", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: HrefComponent, selector: "val-href", inputs: ["props"], outputs: ["onClick"] }] }); }
6628
- }
6629
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PrompterComponent, decorators: [{
6630
- type: Component,
6631
- args: [{ selector: 'val-prompter', standalone: true, imports: [CommonModule, BoxComponent, ButtonGroupComponent, TextComponent, HrefComponent], template: `
6632
- <val-box
6633
- class="teleprompter-container"
6634
- [props]="{ icon: '', bordered: props.bordered, color: props.color, leftBorder: false, padding: props.padding }"
6635
- (onClick)="clickHandler()"
6636
- >
6637
- <div class="container" [class.teleprompter-content]="props.teleprompter" body>
6638
- <div>
6639
- <val-text
6640
- [props]="{
6641
- content: props.content,
6642
- color: '',
6643
- bold: true,
6644
- size: props.size,
6645
- }"
6646
- ></val-text>
6647
- </div>
6648
- @if (props.buttons || props.hrefs) {
6649
- <div class="actions-container">
6650
- <val-button-group
6651
- class="buttons-container"
6652
- [props]="{ buttons: props.buttons, position: 'right', columned: false }"
6653
- (onClick)="clickHandler($event)"
6654
- ></val-button-group>
6655
- <val-href
6656
- class="link"
6657
- *ngFor="let l of props.hrefs"
6658
- [props]="l"
6659
- (onClick)="clickHandler($event)"
6660
- ></val-href>
6661
- </div>
5856
+ }
5857
+ preventDefaultBehavior(event) {
5858
+ event.preventDefault();
5859
+ event.stopPropagation();
5860
+ this.openModal();
5861
+ }
5862
+ cancelModal() {
5863
+ // Reset filter and show all options when closing modal
5864
+ this.searchTerm = '';
5865
+ this.filteredItems = this.props?.options ? [...this.props.options] : [];
5866
+ this.changeDetector.detectChanges();
5867
+ if (this.modal) {
5868
+ this.modal.dismiss();
6662
5869
  }
6663
- </div>
6664
- </val-box>
6665
- `, styles: ["@charset \"UTF-8\";: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)}.container{display:flex;align-items:center;justify-content:space-between;flex-direction:column}@media (min-width: 768px){.container{flex-direction:row}}.teleprompter-container{overflow:hidden;width:100%}.teleprompter-content{white-space:nowrap;animation:scroll-left 15s linear infinite}@keyframes scroll-left{0%{transform:translate(100%)}to{transform:translate(-100%)}}.link{margin:0 .5rem;width:max-content}.actions-container{display:flex;align-items:center}\n"] }]
6666
- }], ctorParameters: () => [], propDecorators: { props: [{
6667
- type: Input
6668
- }], onClick: [{
6669
- type: Output
6670
- }] } });
5870
+ }
5871
+ selectItem(item) {
5872
+ if (this.multiple) {
5873
+ const index = this.selectedItems.findIndex(selectedItem => selectedItem[this.valueProperty] === item[this.valueProperty]);
5874
+ if (index === -1) {
5875
+ this.selectedItems.push(item);
5876
+ }
5877
+ else {
5878
+ this.selectedItems.splice(index, 1);
5879
+ }
5880
+ }
5881
+ else {
5882
+ this.selectedItems = [item];
5883
+ this.cancelModal();
5884
+ }
5885
+ this.updateDisplayValue();
5886
+ this.applyChanges();
5887
+ }
5888
+ isItemSelected(item) {
5889
+ return this.selectedItems.some(selectedItem => selectedItem[this.valueProperty] === item[this.valueProperty]);
5890
+ }
5891
+ updateDisplayValue() {
5892
+ if (this.selectedItems.length === 0) {
5893
+ this.displayValue = '';
5894
+ return;
5895
+ }
5896
+ if (this.multiple) {
5897
+ if (this.selectedItems.length === 1) {
5898
+ this.displayValue = this.selectedItems[0][this.labelProperty];
5899
+ }
5900
+ else {
5901
+ this.displayValue = `${this.selectedItems.length} elementos seleccionados`;
5902
+ }
5903
+ }
5904
+ else {
5905
+ this.displayValue = this.selectedItems[0][this.labelProperty];
5906
+ }
5907
+ }
5908
+ applyChanges() {
5909
+ if (!this.props?.control) {
5910
+ return;
5911
+ }
5912
+ try {
5913
+ this.isProcessingChanges = true;
5914
+ if (this.selectedItems.length > 0) {
5915
+ this.props.control.setValue(this.selectedItems[0][this.valueProperty]);
5916
+ }
5917
+ else {
5918
+ this.props.control.setValue(null);
5919
+ }
5920
+ this.props.control.markAsDirty();
5921
+ this.props.control.updateValueAndValidity();
5922
+ }
5923
+ finally {
5924
+ this.isProcessingChanges = false;
5925
+ }
5926
+ }
5927
+ // Método público para reiniciar el componente
5928
+ reset() {
5929
+ this.selectedItems = [];
5930
+ this.displayValue = '';
5931
+ if (this.props?.control) {
5932
+ this.props.control.setValue(null);
5933
+ }
5934
+ this.changeDetector.detectChanges();
5935
+ }
5936
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5937
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SelectSearchComponent, isStandalone: true, selector: "val-select-search", inputs: { label: "label", labelProperty: "labelProperty", valueProperty: "valueProperty", multiple: "multiple", placeholder: "placeholder", props: "props" }, viewQueries: [{ propertyName: "modal", first: true, predicate: ["modal"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
5938
+ <ion-input
5939
+ type="text"
5940
+ [value]="displayValue"
5941
+ [placeholder]="props?.placeholder || placeholder"
5942
+ readonly
5943
+ (mousedown)="preventDefaultBehavior($event)"
5944
+ />
6671
5945
 
6672
- /**
6673
- * val-radio-input
6674
- *
6675
- * A radio group input for selecting one option, integrated with Angular forms.
6676
- *
6677
- * @example
6678
- * <val-radio-input [props]="{ control: myControl, options: [{ id: '1', name: 'Option 1' }] }"></val-radio-input>
6679
- *
6680
- * @input props: InputMetadata - Configuration for the radio input (form control, options, etc.)
6681
- */
6682
- class RadioInputComponent {
6683
- constructor() { }
6684
- ngOnInit() { }
6685
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RadioInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6686
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: RadioInputComponent, isStandalone: true, selector: "val-radio-input", inputs: { props: "props" }, ngImport: i0, template: `
6687
- <ion-radio-group [allowEmptySelection]="true" [formControl]="props.control">
6688
- <ng-container *ngFor="let o of props.options">
6689
- <ion-radio [value]="o.id">{{ o.name }}</ion-radio>
6690
- <br />
6691
- </ng-container>
6692
- </ion-radio-group>
6693
- `, isInline: true, styles: [""], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonRadioGroup, selector: "ion-radio-group", inputs: ["allowEmptySelection", "name", "value"] }, { kind: "component", type: IonRadio, selector: "ion-radio", inputs: ["alignment", "color", "disabled", "justify", "labelPlacement", "mode", "name", "value"] }] }); }
5946
+ <ion-input style="position: absolute;" [formControl]="props.control" type="hidden"></ion-input>
5947
+
5948
+ <ion-modal
5949
+ #modal
5950
+ trigger="open-modal"
5951
+ [initialBreakpoint]="1"
5952
+ [breakpoints]="[0, 0.5, 0.75, 1]"
5953
+ (didDismiss)="cancelModal()"
5954
+ >
5955
+ <ng-template>
5956
+ <ion-header>
5957
+ <ion-toolbar>
5958
+ <ion-title>{{ label }}</ion-title>
5959
+ <ion-buttons slot="end">
5960
+ <ion-button (click)="cancelModal()">Cerrar</ion-button>
5961
+ </ion-buttons>
5962
+ </ion-toolbar>
5963
+ <ion-toolbar>
5964
+ <val-searchbar (filterEvent)="onFilter($event)" (focusEvent)="onFocus()" (blurEvent)="onBlur()" />
5965
+ </ion-toolbar>
5966
+ </ion-header>
5967
+ <ion-content>
5968
+ <ion-list>
5969
+ <ion-item *ngFor="let item of filteredItems" button (click)="selectItem(item)" detail="false">
5970
+ <ion-label>{{ item[labelProperty] }}</ion-label>
5971
+ <ion-icon *ngIf="isItemSelected(item)" name="checkmark-outline" slot="end" color="primary"></ion-icon>
5972
+ </ion-item>
5973
+ <ion-item *ngIf="filteredItems.length === 0" lines="none">
5974
+ <ion-label color="dark">No se encontraron resultados</ion-label>
5975
+ </ion-item>
5976
+ </ion-list>
5977
+ </ion-content>
5978
+ </ng-template>
5979
+ </ion-modal>
5980
+ `, isInline: true, styles: ["ion-header{padding:8px 8px 0}\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: "ngmodule", type: IonicModule }, { kind: "component", type: i2.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: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonModal, selector: "ion-modal" }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: SearchbarComponent, selector: "val-searchbar", inputs: ["disabled"], outputs: ["filterEvent", "focusEvent", "blurEvent"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
6694
5981
  }
6695
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RadioInputComponent, decorators: [{
5982
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectSearchComponent, decorators: [{
6696
5983
  type: Component,
6697
- args: [{ selector: 'val-radio-input', standalone: true, imports: [NgFor, ReactiveFormsModule, IonRadioGroup, IonRadio], template: `
6698
- <ion-radio-group [allowEmptySelection]="true" [formControl]="props.control">
6699
- <ng-container *ngFor="let o of props.options">
6700
- <ion-radio [value]="o.id">{{ o.name }}</ion-radio>
6701
- <br />
6702
- </ng-container>
6703
- </ion-radio-group>
6704
- ` }]
6705
- }], ctorParameters: () => [], propDecorators: { props: [{
5984
+ args: [{ selector: 'val-select-search', standalone: true, imports: [CommonModule, IonicModule, FormsModule, SearchbarComponent, ReactiveFormsModule], template: `
5985
+ <ion-input
5986
+ type="text"
5987
+ [value]="displayValue"
5988
+ [placeholder]="props?.placeholder || placeholder"
5989
+ readonly
5990
+ (mousedown)="preventDefaultBehavior($event)"
5991
+ />
5992
+
5993
+ <ion-input style="position: absolute;" [formControl]="props.control" type="hidden"></ion-input>
5994
+
5995
+ <ion-modal
5996
+ #modal
5997
+ trigger="open-modal"
5998
+ [initialBreakpoint]="1"
5999
+ [breakpoints]="[0, 0.5, 0.75, 1]"
6000
+ (didDismiss)="cancelModal()"
6001
+ >
6002
+ <ng-template>
6003
+ <ion-header>
6004
+ <ion-toolbar>
6005
+ <ion-title>{{ label }}</ion-title>
6006
+ <ion-buttons slot="end">
6007
+ <ion-button (click)="cancelModal()">Cerrar</ion-button>
6008
+ </ion-buttons>
6009
+ </ion-toolbar>
6010
+ <ion-toolbar>
6011
+ <val-searchbar (filterEvent)="onFilter($event)" (focusEvent)="onFocus()" (blurEvent)="onBlur()" />
6012
+ </ion-toolbar>
6013
+ </ion-header>
6014
+ <ion-content>
6015
+ <ion-list>
6016
+ <ion-item *ngFor="let item of filteredItems" button (click)="selectItem(item)" detail="false">
6017
+ <ion-label>{{ item[labelProperty] }}</ion-label>
6018
+ <ion-icon *ngIf="isItemSelected(item)" name="checkmark-outline" slot="end" color="primary"></ion-icon>
6019
+ </ion-item>
6020
+ <ion-item *ngIf="filteredItems.length === 0" lines="none">
6021
+ <ion-label color="dark">No se encontraron resultados</ion-label>
6022
+ </ion-item>
6023
+ </ion-list>
6024
+ </ion-content>
6025
+ </ng-template>
6026
+ </ion-modal>
6027
+ `, styles: ["ion-header{padding:8px 8px 0}\n"] }]
6028
+ }], ctorParameters: () => [], propDecorators: { modal: [{
6029
+ type: ViewChild,
6030
+ args: ['modal']
6031
+ }], label: [{
6032
+ type: Input
6033
+ }], labelProperty: [{
6034
+ type: Input
6035
+ }], valueProperty: [{
6036
+ type: Input
6037
+ }], multiple: [{
6038
+ type: Input
6039
+ }], placeholder: [{
6040
+ type: Input
6041
+ }], props: [{
6706
6042
  type: Input
6707
6043
  }] } });
6708
6044
 
6709
6045
  /**
6710
- * val-select-input
6046
+ * val-text-input
6711
6047
  *
6712
- * A select/dropdown input integrated with Angular forms, using Ionic's select component.
6048
+ * A text input field integrated with Angular forms.
6713
6049
  *
6714
6050
  * @example
6715
- * <val-select-input [props]="{ control: myControl, label: 'Choose', options: [{ id: '1', name: 'Option 1' }] }"></val-select-input>
6051
+ * <val-text-input [props]="{ control: myControl, placeholder: 'Enter text', ... }"></val-text-input>
6716
6052
  *
6717
- * @input props: InputMetadata - Configuration for the select input (form control, label, options, etc.)
6053
+ * @input props: InputMetadata - Configuration for the input (form control, placeholder, label, etc.)
6718
6054
  */
6719
- class SearchSelectorComponent {
6055
+ class TextInputComponent {
6720
6056
  constructor() {
6721
- this.customModalOptions = {
6722
- header: 'Seleccione',
6723
- breakpoints: [0, 0.6],
6724
- initialBreakpoint: 0.6,
6725
- };
6057
+ this.states = ComponentStates;
6726
6058
  }
6727
6059
  ngOnInit() {
6060
+ // Apply default values on initialization
6728
6061
  if (this.props?.withDefault || this.props?.value) {
6729
6062
  applyDefaultValueToControl(this.props);
6730
6063
  }
6731
- this.customModalOptions.header = this.props.label;
6732
6064
  }
6733
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6734
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: SearchSelectorComponent, isStandalone: true, selector: "val-select-input", inputs: { props: "props" }, ngImport: i0, template: `
6735
- <ion-select
6736
- [formControl]="props.control"
6737
- [label]="props.label"
6738
- [interfaceOptions]="customModalOptions"
6739
- interface="modal"
6740
- [placeholder]="[props.placeholder]"
6741
- cancelText="Cancelar"
6742
- okText="Ok"
6065
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6066
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TextInputComponent, isStandalone: true, selector: "val-text-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-input [formControl]="props.control" type="text" [placeholder]="props.placeholder" /> `, 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)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
6067
+ }
6068
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextInputComponent, decorators: [{
6069
+ type: Component,
6070
+ args: [{ selector: 'val-text-input', standalone: true, imports: [ReactiveFormsModule, IonInput], template: ` <ion-input [formControl]="props.control" type="text" [placeholder]="props.placeholder" /> `, 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)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"] }]
6071
+ }], ctorParameters: () => [], propDecorators: { props: [{
6072
+ type: Input
6073
+ }] } });
6074
+
6075
+ class CodeDisplayComponent {
6076
+ constructor(cdr) {
6077
+ this.cdr = cdr;
6078
+ this.toast = inject(ToastController);
6079
+ this.langService = inject(LangService);
6080
+ this.selectedTab = 0;
6081
+ }
6082
+ ngOnChanges(changes) {
6083
+ if (changes['code'] || changes['language'] || changes['tabs']) {
6084
+ this.cdr.detectChanges();
6085
+ setTimeout(() => this.highlightCode());
6086
+ }
6087
+ }
6088
+ ngAfterViewInit() {
6089
+ setTimeout(() => this.highlightCode());
6090
+ }
6091
+ selectTab(i) {
6092
+ this.selectedTab = i;
6093
+ this.cdr.detectChanges();
6094
+ setTimeout(() => this.highlightCode());
6095
+ }
6096
+ highlightCode() {
6097
+ if (this.codeElement) {
6098
+ const code = this.props.tabs.length > 0 ? this.props.tabs[this.selectedTab]?.code : this.props.code;
6099
+ this.codeElement.nativeElement.textContent = code || '';
6100
+ Prism.highlightElement(this.codeElement.nativeElement);
6101
+ }
6102
+ }
6103
+ async copyToClipboard() {
6104
+ try {
6105
+ const code = this.props.tabs.length > 0 ? this.props.tabs[this.selectedTab]?.code : this.props.code;
6106
+ await Clipboard.write({ string: code || '' });
6107
+ const copiedMessage = this.langService.getText('_global', 'copied', '¡Copiado al portapapeles!');
6108
+ this.presentToast(copiedMessage);
6109
+ }
6110
+ catch (error) {
6111
+ console.error('Error al copiar al portapapeles:', error);
6112
+ }
6113
+ }
6114
+ async presentToast(message) {
6115
+ const toast = await this.toast.create({
6116
+ message: message,
6117
+ duration: 2000,
6118
+ position: 'bottom',
6119
+ color: 'dark',
6120
+ });
6121
+ toast.present();
6122
+ }
6123
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CodeDisplayComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
6124
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CodeDisplayComponent, isStandalone: true, selector: "val-code-display", inputs: { props: "props" }, viewQueries: [{ propertyName: "codeElement", first: true, predicate: ["codeElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
6125
+ <div class="code-viewer-container">
6126
+ <div class="tab-bar">
6127
+ <div
6128
+ class="tab"
6129
+ *ngFor="let tab of props.tabs; let i = index"
6130
+ [class.active]="i === selectedTab"
6131
+ (click)="selectTab(i)"
6132
+ >
6133
+ <span class="tab-label">{{ tab.label }}</span>
6134
+ </div>
6135
+ </div>
6136
+ <div class="code-content">
6137
+ <!-- <span class="language-badge">{{ props.tabs[selectedTab]?.language || props.language }}</span> -->
6138
+ <ion-button fill="clear" class="copy-button" (click)="copyToClipboard()">
6139
+ <ion-icon name="copy-outline"></ion-icon>
6140
+ </ion-button>
6141
+ <pre><code [class]="'language-' + (props.tabs[selectedTab]?.language || props.language)" #codeElement></code></pre>
6142
+ </div>
6143
+ </div>
6144
+ `, 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)}.code-viewer-container{background-color:#fff;border-radius:24px;overflow:hidden;box-shadow:0 2px 4px #0000000d;border:1px solid #f2f6f7;position:relative;min-width:320px;max-width:100%}.tab-bar{display:flex;background:#f6f9fa;border-bottom:1px solid #f2f6f7;gap:2px;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;scrollbar-color:#e0e0e0 #f6f9fa;-webkit-overflow-scrolling:touch;max-width:100%;font-size:12px}.tab-bar::-webkit-scrollbar{height:6px;background:#f6f9fa}.tab-bar::-webkit-scrollbar-thumb{background:#e0e0e0;border-radius:4px}.tab{padding:10px 18px 8px;font-family:Roboto Mono,monospace;font-size:.95em;color:#899396;cursor:pointer;border-radius:8px 8px 0 0;background:transparent;transition:background .2s,color .2s;margin-bottom:-1px;border:1px solid transparent;border-bottom:none}.tab:hover{background:#e8eef2}.tab.active{background:#fff;color:#19422d;border:1px solid #f2f6f7;border-bottom:1px solid #ffffff;z-index:2}.tab-label{font-weight:500}.code-content{overflow-x:auto;overflow-y:auto;max-height:30rem;min-height:5rem;background:#fff;position:relative}.language-badge{position:absolute;top:15px;left:15px;background:#f6f9fa;color:#899396;font-family:Roboto Mono,monospace;font-size:.8em;font-weight:500;border-radius:6px;padding:2px 8px;z-index:3;pointer-events:none;text-transform:uppercase}.copy-button{position:absolute;top:10px;right:15px;z-index:10;--padding-start: 2px;--padding-end: 2px;--padding-top: 2px;--padding-bottom: 2px;min-width:28px;min-height:28px;height:28px;width:28px;color:var(--ion-color-primary);background:#ffffffb3;border-radius:6px;box-shadow:0 1px 4px #0000000d;display:flex;align-items:center;justify-content:center;transition:background .2s ease}.copy-button:hover{background:#ffffffe6}.copy-button ion-icon{font-size:1.2em;margin:0}pre{margin:0;padding:0;background-color:transparent;min-width:100%;min-height:100%;white-space:pre;word-break:normal;font-family:Roboto Mono,monospace}code{font-family:Roboto Mono,monospace;font-size:.9em;line-height:1.5;display:block;white-space:inherit;word-break:normal}@media (max-width: 600px){.code-viewer-container{border-radius:24px}.tab-bar{font-size:11px}.language-badge{font-size:.7em;padding:1px 6px;top:10px;left:10px}.copy-button{top:10px;right:10px}.code-content{max-height:20rem}code{font-size:.7em}}@media (min-width: 600px){code{font-size:.8em}}@media (prefers-color-scheme: dark){.code-viewer-container{background-color:#21252b;box-shadow:0 4px 15px #0009;border:1px solid #3b4048}.tab-bar{background:#1a1a1a;border-bottom:1px solid #3b4048;scrollbar-color:#3b4048 #1a1a1a}.tab-bar::-webkit-scrollbar{background:#1a1a1a}.tab-bar::-webkit-scrollbar-thumb{background:#3b4048}.tab{color:#8b949e}.tab:hover{background:#21252b}.tab.active{background:#282c34;color:#c9d1d9;border:1px solid #3b4048;border-bottom:1px solid #282c34}.code-content{background:#161b22}.language-badge{background:#3e4451;color:#8b949e}.copy-button{background:#0006}.copy-button:hover{background:#0009}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { 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"] }] }); }
6145
+ }
6146
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CodeDisplayComponent, decorators: [{
6147
+ type: Component,
6148
+ args: [{ selector: 'val-code-display', standalone: true, imports: [CommonModule, IonIcon, IonButton], template: `
6149
+ <div class="code-viewer-container">
6150
+ <div class="tab-bar">
6151
+ <div
6152
+ class="tab"
6153
+ *ngFor="let tab of props.tabs; let i = index"
6154
+ [class.active]="i === selectedTab"
6155
+ (click)="selectTab(i)"
6156
+ >
6157
+ <span class="tab-label">{{ tab.label }}</span>
6158
+ </div>
6159
+ </div>
6160
+ <div class="code-content">
6161
+ <!-- <span class="language-badge">{{ props.tabs[selectedTab]?.language || props.language }}</span> -->
6162
+ <ion-button fill="clear" class="copy-button" (click)="copyToClipboard()">
6163
+ <ion-icon name="copy-outline"></ion-icon>
6164
+ </ion-button>
6165
+ <pre><code [class]="'language-' + (props.tabs[selectedTab]?.language || props.language)" #codeElement></code></pre>
6166
+ </div>
6167
+ </div>
6168
+ `, 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)}.code-viewer-container{background-color:#fff;border-radius:24px;overflow:hidden;box-shadow:0 2px 4px #0000000d;border:1px solid #f2f6f7;position:relative;min-width:320px;max-width:100%}.tab-bar{display:flex;background:#f6f9fa;border-bottom:1px solid #f2f6f7;gap:2px;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;scrollbar-color:#e0e0e0 #f6f9fa;-webkit-overflow-scrolling:touch;max-width:100%;font-size:12px}.tab-bar::-webkit-scrollbar{height:6px;background:#f6f9fa}.tab-bar::-webkit-scrollbar-thumb{background:#e0e0e0;border-radius:4px}.tab{padding:10px 18px 8px;font-family:Roboto Mono,monospace;font-size:.95em;color:#899396;cursor:pointer;border-radius:8px 8px 0 0;background:transparent;transition:background .2s,color .2s;margin-bottom:-1px;border:1px solid transparent;border-bottom:none}.tab:hover{background:#e8eef2}.tab.active{background:#fff;color:#19422d;border:1px solid #f2f6f7;border-bottom:1px solid #ffffff;z-index:2}.tab-label{font-weight:500}.code-content{overflow-x:auto;overflow-y:auto;max-height:30rem;min-height:5rem;background:#fff;position:relative}.language-badge{position:absolute;top:15px;left:15px;background:#f6f9fa;color:#899396;font-family:Roboto Mono,monospace;font-size:.8em;font-weight:500;border-radius:6px;padding:2px 8px;z-index:3;pointer-events:none;text-transform:uppercase}.copy-button{position:absolute;top:10px;right:15px;z-index:10;--padding-start: 2px;--padding-end: 2px;--padding-top: 2px;--padding-bottom: 2px;min-width:28px;min-height:28px;height:28px;width:28px;color:var(--ion-color-primary);background:#ffffffb3;border-radius:6px;box-shadow:0 1px 4px #0000000d;display:flex;align-items:center;justify-content:center;transition:background .2s ease}.copy-button:hover{background:#ffffffe6}.copy-button ion-icon{font-size:1.2em;margin:0}pre{margin:0;padding:0;background-color:transparent;min-width:100%;min-height:100%;white-space:pre;word-break:normal;font-family:Roboto Mono,monospace}code{font-family:Roboto Mono,monospace;font-size:.9em;line-height:1.5;display:block;white-space:inherit;word-break:normal}@media (max-width: 600px){.code-viewer-container{border-radius:24px}.tab-bar{font-size:11px}.language-badge{font-size:.7em;padding:1px 6px;top:10px;left:10px}.copy-button{top:10px;right:10px}.code-content{max-height:20rem}code{font-size:.7em}}@media (min-width: 600px){code{font-size:.8em}}@media (prefers-color-scheme: dark){.code-viewer-container{background-color:#21252b;box-shadow:0 4px 15px #0009;border:1px solid #3b4048}.tab-bar{background:#1a1a1a;border-bottom:1px solid #3b4048;scrollbar-color:#3b4048 #1a1a1a}.tab-bar::-webkit-scrollbar{background:#1a1a1a}.tab-bar::-webkit-scrollbar-thumb{background:#3b4048}.tab{color:#8b949e}.tab:hover{background:#21252b}.tab.active{background:#282c34;color:#c9d1d9;border:1px solid #3b4048;border-bottom:1px solid #282c34}.code-content{background:#161b22}.language-badge{background:#3e4451;color:#8b949e}.copy-button{background:#0006}.copy-button:hover{background:#0009}}\n"] }]
6169
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { codeElement: [{
6170
+ type: ViewChild,
6171
+ args: ['codeElement']
6172
+ }], props: [{
6173
+ type: Input
6174
+ }] } });
6175
+
6176
+ class ActionHeaderComponent {
6177
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ActionHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6178
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ActionHeaderComponent, isStandalone: true, selector: "val-action-header", inputs: { props: "props" }, ngImport: i0, template: `
6179
+ <section class="header-content-container">
6180
+ <val-display [props]="props.title" />
6181
+ <val-button [props]="props.action" />
6182
+ </section>
6183
+ `, isInline: true, styles: [".header-content-container{width:100%;display:flex;align-items:center;justify-content:space-between}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["props"], outputs: ["onClick"] }] }); }
6184
+ }
6185
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ActionHeaderComponent, decorators: [{
6186
+ type: Component,
6187
+ args: [{ selector: 'val-action-header', standalone: true, imports: [CommonModule, DisplayComponent, ButtonComponent], template: `
6188
+ <section class="header-content-container">
6189
+ <val-display [props]="props.title" />
6190
+ <val-button [props]="props.action" />
6191
+ </section>
6192
+ `, styles: [".header-content-container{width:100%;display:flex;align-items:center;justify-content:space-between}\n"] }]
6193
+ }], propDecorators: { props: [{
6194
+ type: Input
6195
+ }] } });
6196
+
6197
+ class PillComponent {
6198
+ constructor() {
6199
+ this.theme = inject(ThemeService);
6200
+ }
6201
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PillComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6202
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PillComponent, isStandalone: true, selector: "val-pill", inputs: { props: "props" }, ngImport: i0, template: `
6203
+ <div
6204
+ [id]="props.token"
6205
+ class="fun-card"
6206
+ [class.bordered]="props.bordered"
6207
+ [class.hoverable]="props.hoverable"
6208
+ [ngStyle]="{
6209
+ background: theme.IsDark ? 'var(--ion-background-color)' : props.background,
6210
+ }"
6743
6211
  >
6744
- @for (o of props.options; track o.id) {
6745
- <ion-select-option [value]="o.id">{{ o.name }}</ion-select-option>
6746
- }
6747
- </ion-select>
6748
- `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { 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"] }] }); }
6212
+ <val-action-header style="width: 100%;" [props]="props.content" />
6213
+ </div>
6214
+ `, 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)}.fun-card{z-index:0;position:relative;margin-bottom:8px;cursor:pointer;background:var(--ion-card-background, var(--ion-item-background, var(--ion-background-color, #fff)));display:flex;border-radius:48px;align-items:start;padding:8px 8px 8px 24px;flex-direction:column;box-shadow:0 .25rem .75rem #12195412}.fun-card.hoverable{transition:transform .3s ease,box-shadow .3s ease}.fun-card.hoverable:hover{transform:scale(1.01);box-shadow:.1875rem .625rem .5rem #1219541a}.bordered{border:.0625rem solid var(--ion-color-medium)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ActionHeaderComponent, selector: "val-action-header", inputs: ["props"] }] }); }
6749
6215
  }
6750
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchSelectorComponent, decorators: [{
6216
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PillComponent, decorators: [{
6751
6217
  type: Component,
6752
- args: [{ selector: 'val-select-input', standalone: true, imports: [ReactiveFormsModule, IonSelect, IonSelectOption], template: `
6753
- <ion-select
6754
- [formControl]="props.control"
6755
- [label]="props.label"
6756
- [interfaceOptions]="customModalOptions"
6757
- interface="modal"
6758
- [placeholder]="[props.placeholder]"
6759
- cancelText="Cancelar"
6760
- okText="Ok"
6218
+ args: [{ selector: 'val-pill', standalone: true, imports: [CommonModule, ActionHeaderComponent], template: `
6219
+ <div
6220
+ [id]="props.token"
6221
+ class="fun-card"
6222
+ [class.bordered]="props.bordered"
6223
+ [class.hoverable]="props.hoverable"
6224
+ [ngStyle]="{
6225
+ background: theme.IsDark ? 'var(--ion-background-color)' : props.background,
6226
+ }"
6761
6227
  >
6762
- @for (o of props.options; track o.id) {
6763
- <ion-select-option [value]="o.id">{{ o.name }}</ion-select-option>
6764
- }
6765
- </ion-select>
6766
- ` }]
6767
- }], ctorParameters: () => [], propDecorators: { props: [{
6228
+ <val-action-header style="width: 100%;" [props]="props.content" />
6229
+ </div>
6230
+ `, 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)}.fun-card{z-index:0;position:relative;margin-bottom:8px;cursor:pointer;background:var(--ion-card-background, var(--ion-item-background, var(--ion-background-color, #fff)));display:flex;border-radius:48px;align-items:start;padding:8px 8px 8px 24px;flex-direction:column;box-shadow:0 .25rem .75rem #12195412}.fun-card.hoverable{transition:transform .3s ease,box-shadow .3s ease}.fun-card.hoverable:hover{transform:scale(1.01);box-shadow:.1875rem .625rem .5rem #1219541a}.bordered{border:.0625rem solid var(--ion-color-medium)}\n"] }]
6231
+ }], propDecorators: { props: [{
6768
6232
  type: Input
6769
6233
  }] } });
6770
6234
 
6771
- class SelectSearchComponent {
6235
+ class CommandDisplayComponent {
6772
6236
  constructor() {
6773
- this.labelProperty = 'name';
6774
- this.valueProperty = 'id';
6775
- this.placeholder = '';
6237
+ this.toast = inject(ToastController);
6776
6238
  this.langService = inject(LangService);
6777
- this.changeDetector = inject(ChangeDetectorRef);
6778
- // Classic Angular properties
6779
- this.isOpen = false;
6780
- this.searchTerm = '';
6781
- this.selectedValue = null;
6782
- this.displayValue = '';
6783
- this.filteredOptions = [];
6784
- this.placeholder = this.langService.getText('_global', 'selectOption', 'Seleccione una opción');
6785
- // Close dropdown when clicking outside
6786
- document.addEventListener('click', this.handleClickOutside.bind(this));
6787
- }
6788
- ngOnInit() {
6789
- this.applyDefaultValue();
6790
- this.initializeOptions();
6791
- this.syncSelectedValue();
6792
- this.updateDisplayValue();
6793
- }
6794
- ngOnDestroy() {
6795
- document.removeEventListener('click', this.handleClickOutside.bind(this));
6796
6239
  }
6797
- ngOnChanges(changes) {
6798
- if (changes['props'] && this.props) {
6799
- this.initializeOptions();
6800
- this.syncSelectedValue();
6801
- this.updateDisplayValue();
6802
- this.changeDetector.detectChanges();
6240
+ async copyCommand() {
6241
+ if (this.props.text) {
6242
+ await Clipboard.write({
6243
+ string: this.props.text,
6244
+ });
6245
+ const copiedMessage = this.langService.getText('_global', 'copied', '¡Copiado al portapapeles!');
6246
+ this.presentToast(copiedMessage);
6803
6247
  }
6804
6248
  }
6805
- // Component methods
6806
- toggleDropdown(event) {
6807
- event.stopPropagation();
6808
- this.isOpen = !this.isOpen;
6809
- if (this.isOpen) {
6810
- // Focus search bar when opening if available
6811
- setTimeout(() => {
6812
- const searchbar = this.dropdownRef?.nativeElement?.querySelector('ion-searchbar');
6813
- if (searchbar) {
6814
- searchbar.setFocus();
6815
- }
6816
- }, 100);
6817
- }
6249
+ async presentToast(message) {
6250
+ const toast = await this.toast.create({
6251
+ message: message,
6252
+ duration: 2000,
6253
+ position: 'bottom',
6254
+ color: 'dark',
6255
+ });
6256
+ toast.present();
6818
6257
  }
6819
- onSearch(event) {
6820
- this.searchTerm = event.detail.value || '';
6821
- this.filterOptions();
6258
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CommandDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6259
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CommandDisplayComponent, isStandalone: true, selector: "val-command-display", inputs: { props: "props" }, ngImport: i0, template: `
6260
+ <div class="command-container">
6261
+ <div class="command-text">$ {{ props.text }}</div>
6262
+ <ion-icon name="copy-outline" class="copy-icon" (click)="copyCommand()"></ion-icon>
6263
+ </div>
6264
+ `, isInline: true, styles: [".command-container{display:flex;align-items:center;justify-content:space-between;background-color:var(--ion-color-light, #f2f2f2);border-radius:24px;padding:12px 16px;box-shadow:0 2px 4px #0000001a}.command-text{flex-grow:1;font-family:monospace;font-size:.8rem;color:var(--ion-color-dark, #333);margin-right:10px}.copy-icon{font-size:1.3rem;color:var(--ion-color-medium, #92949c);cursor:pointer;transition:color .2s ease-in-out}.copy-icon:hover{color:var(--ion-color-primary, #3880ff)}@media (min-width: 600px){.command-text,.copy-icon{font-size:1.2rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
6265
+ }
6266
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CommandDisplayComponent, decorators: [{
6267
+ type: Component,
6268
+ args: [{ selector: 'val-command-display', standalone: true, imports: [CommonModule, IonIcon], template: `
6269
+ <div class="command-container">
6270
+ <div class="command-text">$ {{ props.text }}</div>
6271
+ <ion-icon name="copy-outline" class="copy-icon" (click)="copyCommand()"></ion-icon>
6272
+ </div>
6273
+ `, styles: [".command-container{display:flex;align-items:center;justify-content:space-between;background-color:var(--ion-color-light, #f2f2f2);border-radius:24px;padding:12px 16px;box-shadow:0 2px 4px #0000001a}.command-text{flex-grow:1;font-family:monospace;font-size:.8rem;color:var(--ion-color-dark, #333);margin-right:10px}.copy-icon{font-size:1.3rem;color:var(--ion-color-medium, #92949c);cursor:pointer;transition:color .2s ease-in-out}.copy-icon:hover{color:var(--ion-color-primary, #3880ff)}@media (min-width: 600px){.command-text,.copy-icon{font-size:1.2rem}}\n"] }]
6274
+ }], ctorParameters: () => [], propDecorators: { props: [{
6275
+ type: Input
6276
+ }] } });
6277
+
6278
+ // src/app/layout/layout.component.ts (solo la parte de styles)
6279
+ class InfoComponent {
6280
+ constructor() {
6281
+ this.icon = inject(IconService);
6822
6282
  }
6823
- selectOption(option) {
6824
- const value = String(option[this.valueProperty]);
6825
- this.selectedValue = value;
6826
- this.isOpen = false;
6827
- this.searchTerm = '';
6828
- this.updateDisplayValue();
6829
- this.initializeOptions(); // Reset filter
6830
- // Update form control
6831
- if (this.props?.control) {
6832
- this.props.control.setValue(value);
6833
- this.props.control.markAsDirty();
6834
- this.props.control.markAsTouched();
6835
- }
6283
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6284
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: InfoComponent, isStandalone: true, selector: "val-info", inputs: { props: "props" }, ngImport: i0, template: `
6285
+ @if (props.image) {
6286
+ <val-image style="display: contents;" [props]="props.image" />
6836
6287
  }
6837
- isSelected(option) {
6838
- return String(this.selectedValue) === String(option[this.valueProperty]);
6288
+ <val-title-block style="display: block;margin-top: 16px;" [props]="props.title" />
6289
+
6290
+ @if (props.link) {
6291
+ <val-link [props]="props.link" />
6839
6292
  }
6840
- trackByFn(_index, option) {
6841
- return option[this.valueProperty];
6293
+
6294
+ @if (props.actions) {
6295
+ <val-button-group [props]="props.actions" />
6842
6296
  }
6843
- handleClickOutside(event) {
6844
- if (this.isOpen &&
6845
- !this.mainInputRef?.nativeElement?.contains(event.target) &&
6846
- !this.dropdownRef?.nativeElement?.contains(event.target)) {
6847
- this.isOpen = false;
6848
- this.searchTerm = '';
6849
- this.initializeOptions();
6850
- }
6297
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: LinkComponent, selector: "val-link", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: TitleBlockComponent, selector: "val-title-block", inputs: ["props"] }, { kind: "component", type: ImageComponent, selector: "val-image", inputs: ["props"] }, { kind: "component", type: ButtonGroupComponent, selector: "val-button-group", inputs: ["props"], outputs: ["onClick"] }] }); }
6298
+ }
6299
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InfoComponent, decorators: [{
6300
+ type: Component,
6301
+ args: [{ selector: 'val-info', standalone: true, imports: [CommonModule, LinkComponent, TitleBlockComponent, ImageComponent, ButtonGroupComponent], template: `
6302
+ @if (props.image) {
6303
+ <val-image style="display: contents;" [props]="props.image" />
6851
6304
  }
6852
- getOptionByValue(value) {
6853
- return this.filteredOptions.find(option => String(option[this.valueProperty]) === String(value));
6305
+ <val-title-block style="display: block;margin-top: 16px;" [props]="props.title" />
6306
+
6307
+ @if (props.link) {
6308
+ <val-link [props]="props.link" />
6854
6309
  }
6855
- initializeOptions() {
6856
- this.filteredOptions = this.props?.options || [];
6310
+
6311
+ @if (props.actions) {
6312
+ <val-button-group [props]="props.actions" />
6857
6313
  }
6858
- filterOptions() {
6859
- if (!this.searchTerm) {
6860
- this.initializeOptions();
6861
- return;
6314
+ ` }]
6315
+ }], propDecorators: { props: [{
6316
+ type: Input
6317
+ }] } });
6318
+
6319
+ class PlainCodeBoxComponent {
6320
+ constructor() {
6321
+ this.toast = inject(ToastController);
6322
+ this.cdr = inject(ChangeDetectorRef);
6323
+ this.langService = inject(LangService);
6324
+ this.props = { lines: [] };
6325
+ }
6326
+ ngOnChanges(changes) {
6327
+ if (changes['props'] && !changes['props'].firstChange) {
6328
+ this.cdr.detectChanges();
6329
+ setTimeout(() => this.highlightCode());
6862
6330
  }
6863
- const search = replaceSpecialChars(this.searchTerm.toLowerCase());
6864
- this.filteredOptions = (this.props?.options || []).filter(option => {
6865
- const label = option[this.labelProperty]
6866
- ? replaceSpecialChars(String(option[this.labelProperty]).toLowerCase())
6867
- : '';
6868
- const value = option[this.valueProperty]
6869
- ? replaceSpecialChars(String(option[this.valueProperty]).toLowerCase())
6870
- : '';
6871
- return label.includes(search) || value.includes(search);
6872
- });
6873
6331
  }
6874
- updateDisplayValue() {
6875
- if (!this.selectedValue) {
6876
- this.displayValue = '';
6877
- return;
6332
+ ngAfterViewInit() {
6333
+ setTimeout(() => this.highlightCode());
6334
+ }
6335
+ highlightCode() {
6336
+ if (this.codeBlock && this.props.lines && this.props.lines.length > 0) {
6337
+ Prism.highlightElement(this.codeBlock.nativeElement);
6878
6338
  }
6879
- const option = this.getOptionByValue(this.selectedValue);
6880
- this.displayValue = option ? option[this.labelProperty] : '';
6881
6339
  }
6882
- applyDefaultValue() {
6883
- if (this.props) {
6884
- applyDefaultValueToControl(this.props);
6340
+ async copyCode() {
6341
+ const fullCode = this.props.lines.map(line => line.text).join('\n');
6342
+ if (fullCode) {
6343
+ await Clipboard.write({
6344
+ string: fullCode,
6345
+ });
6346
+ const copiedMessage = this.langService.getText('_global', 'copied', '¡Copiado al portapapeles!');
6347
+ this.presentToast(copiedMessage);
6885
6348
  }
6886
6349
  }
6887
- debugOptions() {
6888
- console.log('[SelectSearch] DEBUG CLICK:', {
6889
- props: this.props,
6890
- filteredOptions: this.filteredOptions,
6891
- searchTerm: this.searchTerm,
6892
- propsOptions: this.props?.options,
6893
- displayValue: this.displayValue,
6894
- selectedValue: this.selectedValue,
6895
- isOpen: this.isOpen
6350
+ async presentToast(message) {
6351
+ const toast = await this.toast.create({
6352
+ message: message,
6353
+ duration: 2000,
6354
+ position: 'bottom',
6355
+ color: 'dark',
6896
6356
  });
6357
+ toast.present();
6897
6358
  }
6898
- syncSelectedValue() {
6899
- if (this.props?.control?.value) {
6900
- this.selectedValue = String(this.props.control.value);
6901
- }
6902
- }
6903
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6904
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SelectSearchComponent, isStandalone: true, selector: "val-select-search", inputs: { props: "props", labelProperty: "labelProperty", valueProperty: "valueProperty", placeholder: "placeholder" }, viewQueries: [{ propertyName: "dropdownRef", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "mainInputRef", first: true, predicate: ["mainInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
6905
- <div class="select-container" (click)="toggleDropdown($event)">
6906
- <!-- Main input display -->
6907
- <ion-input
6908
- #mainInput
6909
- type="text"
6910
- [value]="displayValue"
6911
- [placeholder]="props?.placeholder || placeholder"
6912
- readonly
6913
- class="main-input"
6914
- [class.is-open]="isOpen"
6915
- />
6916
-
6917
- <!-- Dropdown icon -->
6918
- <ion-icon
6919
- name="chevron-down-outline"
6920
- class="dropdown-icon"
6921
- [class.rotated]="isOpen"
6922
- ></ion-icon>
6923
-
6924
- <!-- Hidden input for form control -->
6925
- <ion-input
6926
- style="position: absolute; opacity: 0; pointer-events: none;"
6927
- [formControl]="props?.control"
6928
- type="hidden"
6929
- />
6930
- </div>
6931
-
6932
- <!-- Dropdown overlay -->
6933
- <div
6934
- class="dropdown-overlay"
6935
- [class.visible]="isOpen"
6936
- #dropdown
6937
- >
6938
- <!-- Debug button -->
6939
- <div class="search-container" style="background: red; color: white; padding: 4px;">
6940
- <button (click)="debugOptions()">DEBUG: {{ filteredOptions.length }} opciones</button>
6941
- </div>
6942
-
6943
- <!-- Search bar -->
6944
- <div class="search-container" *ngIf="props?.options && props.options.length > 5">
6945
- <ion-searchbar
6946
- #searchbar
6947
- [placeholder]="'Buscar'"
6948
- (ionInput)="onSearch($event)"
6949
- [value]="searchTerm"
6950
- show-clear-button="focus"
6951
- [debounce]="200"
6952
- ></ion-searchbar>
6953
- </div>
6954
-
6955
- <!-- Options list -->
6956
- <div class="options-container">
6957
- <ion-list class="options-list">
6958
- <ion-item
6959
- *ngFor="let option of filteredOptions; trackBy: trackByFn"
6960
- button
6961
- (click)="selectOption(option)"
6962
- class="option-item"
6963
- >
6964
- <ion-label>{{ option[labelProperty] }}</ion-label>
6965
- <ion-icon
6966
- *ngIf="isSelected(option)"
6967
- name="checkmark-outline"
6968
- slot="end"
6969
- color="primary"
6970
- ></ion-icon>
6971
- </ion-item>
6972
-
6973
- <!-- No results message -->
6974
- <ion-item *ngIf="filteredOptions.length === 0" class="no-results">
6975
- <ion-label color="medium">
6976
- {{ searchTerm ? 'No se encontraron resultados' : 'No hay opciones disponibles' }}
6977
- <!-- Debug info -->
6978
- <br><small>Debug: {{ filteredOptions.length }} opciones | Props: {{ !!props }} | Search: "{{ searchTerm }}"</small>
6979
- </ion-label>
6980
- </ion-item>
6981
- </ion-list>
6982
- </div>
6359
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PlainCodeBoxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6360
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PlainCodeBoxComponent, isStandalone: true, selector: "val-plain-code-box", inputs: { props: "props" }, viewQueries: [{ propertyName: "codeBlock", first: true, predicate: ["codeBlock"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
6361
+ <div class="code-box-container">
6362
+ <ion-button *ngIf="props.showCopyButton !== false" fill="clear" class="copy-button" (click)="copyCode()">
6363
+ <ion-icon name="copy-outline"></ion-icon>
6364
+ </ion-button>
6365
+ <pre><code [class]="'language-' + (props.language || 'bash')" #codeBlock><ng-container *ngFor="let line of props.lines; let i = index"><span [class]="line.type ? 'line-' + line.type : 'line-normal'">{{ line.text }}</span><br *ngIf="i < props.lines.length - 1">
6366
+ </ng-container></code></pre>
6983
6367
  </div>
6984
- `, isInline: true, styles: [":host{display:block;position:relative;width:100%}.select-container{position:relative;display:flex;align-items:center;cursor:pointer}.select-container .main-input{flex:1;cursor:pointer}.select-container .main-input.is-open{--border-color: var(--ion-color-primary)}.select-container .dropdown-icon{position:absolute;right:12px;font-size:16px;color:var(--ion-color-medium);transition:transform .2s ease;pointer-events:none;z-index:2}.select-container .dropdown-icon.rotated{transform:rotate(180deg)}.dropdown-overlay{position:absolute;top:100%;left:0;right:0;background:var(--ion-background-color);border:1px solid var(--ion-color-light);border-radius:8px;box-shadow:0 4px 16px #0000001a;z-index:1000;max-height:300px;opacity:0;transform:translateY(-8px);pointer-events:none;transition:all .2s ease}.dropdown-overlay.visible{opacity:1;transform:translateY(4px);pointer-events:all}.search-container{padding:12px;border-bottom:1px solid var(--ion-color-light)}.search-container ion-searchbar{--background: var(--ion-color-light);--border-radius: 8px;--box-shadow: none;--padding-start: 12px;--padding-end: 12px;height:40px}.options-container{max-height:240px;overflow-y:auto}.options-container .options-list{padding:0}.options-container .option-item{--padding-start: 16px;--padding-end: 16px;--min-height: 48px;cursor:pointer}.options-container .option-item:hover{--background: var(--ion-color-light)}.options-container .option-item ion-label{font-size:16px;line-height:1.4}.options-container .option-item ion-icon{font-size:20px}.options-container .no-results{--padding-start: 16px;--padding-end: 16px;--min-height: 48px;text-align:center}.options-container .no-results ion-label{font-style:italic;font-size:14px}@media (max-width: 768px){.dropdown-overlay{max-height:250px}.options-container{max-height:200px}}@media (prefers-color-scheme: dark){.dropdown-overlay{box-shadow:0 4px 16px #0000004d}}.option-item:focus-within{--background: var(--ion-color-primary-tint);outline:2px solid var(--ion-color-primary);outline-offset:-2px}.option-item{transition:background-color .15s ease}.dropdown-icon{transition:transform .2s cubic-bezier(.4,0,.2,1)}\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: "ngmodule", type: IonicModule }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocapitalize", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "maxlength", "minlength", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
6368
+ `, isInline: true, styles: [".code-box-container{position:relative;background-color:#282c34;border-radius:16px;overflow:hidden;box-shadow:0 4px 15px #0009;margin:0}@media (prefers-color-scheme: light){.code-box-container{background-color:#fff;box-shadow:0 2px 4px #0000001a}}.copy-button{position:absolute;top:8px;right:8px;z-index:10;--padding-start: 2px;--padding-end: 2px;--padding-top: 2px;--padding-bottom: 2px;min-width:28px;min-height:28px;height:28px;width:28px;color:#61afef;background:#0006;border-radius:6px;box-shadow:0 1px 4px #0000000d;display:flex;align-items:center;justify-content:center;transition:background .2s ease,color .2s ease}.copy-button:hover{background:#00000080;color:#8cc4ff}.copy-button ion-icon{font-size:1.2em;margin:0}@media (prefers-color-scheme: light){.copy-button{color:var(--ion-color-primary, #007bff);background:#ffffffb3}.copy-button:hover{background:#ffffffe6;color:var(--ion-color-primary-tint, #3880ff)}}pre{margin:0;padding:0;background-color:transparent;min-width:100%;min-height:100%;white-space:pre-wrap;word-break:normal;font-family:Roboto Mono,monospace}code{font-family:Roboto Mono,monospace;font-size:.9em;line-height:1.6;display:block;white-space:inherit;word-break:inherit;color:#abb2bf;margin:0}@media (prefers-color-scheme: light){code{color:#333}}code .line-normal{color:#abb2bf}@media (prefers-color-scheme: light){code .line-normal{color:#333}}code .line-command{color:#c678dd}@media (prefers-color-scheme: light){code .line-command{color:var(--ion-color-primary, #3880ff)}}code .line-error{color:#e06c75}@media (prefers-color-scheme: light){code .line-error{color:var(--ion-color-danger, #eb445a)}}code .line-success{color:#98c379}@media (prefers-color-scheme: light){code .line-success{color:var(--ion-color-success, #2dd36f)}}code .token.comment{color:#5c6370}code .token.selector,code .token.string{color:#98c379}code .token.punctuation{color:#abb2bf}code .token.operator{color:#c678dd}code .token.boolean,code .token.number{color:#d19a66}code .token.function{color:#61afef}code .token.keyword{color:#c678dd}code .token.class-name{color:#e6c07b}code .token.tag{color:#e06c75}code .token.attr-name{color:#d19a66}code .token.attr-value{color:#98c379}code .token.property{color:#56b6c2}code .token.variable{color:#e06c75}@media (max-width: 600px){.code-box-container{border-radius:16px}.copy-button{top:6px;right:6px;min-width:24px;min-height:24px;height:24px;width:24px}.copy-button ion-icon{font-size:1em}pre{padding:0;margin:0}code{font-size:.8em;line-height:1.5;margin:0}}@media (min-width: 601px) and (max-width: 1024px){code{font-size:.9em}}@media (min-width: 1025px){code{font-size:1em}}\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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { 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"] }] }); }
6985
6369
  }
6986
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectSearchComponent, decorators: [{
6370
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PlainCodeBoxComponent, decorators: [{
6987
6371
  type: Component,
6988
- args: [{ selector: 'val-select-search', standalone: true, imports: [CommonModule, IonicModule, FormsModule, ReactiveFormsModule], template: `
6989
- <div class="select-container" (click)="toggleDropdown($event)">
6990
- <!-- Main input display -->
6991
- <ion-input
6992
- #mainInput
6993
- type="text"
6994
- [value]="displayValue"
6995
- [placeholder]="props?.placeholder || placeholder"
6996
- readonly
6997
- class="main-input"
6998
- [class.is-open]="isOpen"
6999
- />
7000
-
7001
- <!-- Dropdown icon -->
7002
- <ion-icon
7003
- name="chevron-down-outline"
7004
- class="dropdown-icon"
7005
- [class.rotated]="isOpen"
7006
- ></ion-icon>
7007
-
7008
- <!-- Hidden input for form control -->
7009
- <ion-input
7010
- style="position: absolute; opacity: 0; pointer-events: none;"
7011
- [formControl]="props?.control"
7012
- type="hidden"
7013
- />
7014
- </div>
7015
-
7016
- <!-- Dropdown overlay -->
7017
- <div
7018
- class="dropdown-overlay"
7019
- [class.visible]="isOpen"
7020
- #dropdown
7021
- >
7022
- <!-- Debug button -->
7023
- <div class="search-container" style="background: red; color: white; padding: 4px;">
7024
- <button (click)="debugOptions()">DEBUG: {{ filteredOptions.length }} opciones</button>
7025
- </div>
7026
-
7027
- <!-- Search bar -->
7028
- <div class="search-container" *ngIf="props?.options && props.options.length > 5">
7029
- <ion-searchbar
7030
- #searchbar
7031
- [placeholder]="'Buscar'"
7032
- (ionInput)="onSearch($event)"
7033
- [value]="searchTerm"
7034
- show-clear-button="focus"
7035
- [debounce]="200"
7036
- ></ion-searchbar>
7037
- </div>
7038
-
7039
- <!-- Options list -->
7040
- <div class="options-container">
7041
- <ion-list class="options-list">
7042
- <ion-item
7043
- *ngFor="let option of filteredOptions; trackBy: trackByFn"
7044
- button
7045
- (click)="selectOption(option)"
7046
- class="option-item"
7047
- >
7048
- <ion-label>{{ option[labelProperty] }}</ion-label>
7049
- <ion-icon
7050
- *ngIf="isSelected(option)"
7051
- name="checkmark-outline"
7052
- slot="end"
7053
- color="primary"
7054
- ></ion-icon>
7055
- </ion-item>
7056
-
7057
- <!-- No results message -->
7058
- <ion-item *ngIf="filteredOptions.length === 0" class="no-results">
7059
- <ion-label color="medium">
7060
- {{ searchTerm ? 'No se encontraron resultados' : 'No hay opciones disponibles' }}
7061
- <!-- Debug info -->
7062
- <br><small>Debug: {{ filteredOptions.length }} opciones | Props: {{ !!props }} | Search: "{{ searchTerm }}"</small>
7063
- </ion-label>
7064
- </ion-item>
7065
- </ion-list>
7066
- </div>
6372
+ args: [{ selector: 'val-plain-code-box', standalone: true, imports: [CommonModule, IonIcon, IonButton], template: `
6373
+ <div class="code-box-container">
6374
+ <ion-button *ngIf="props.showCopyButton !== false" fill="clear" class="copy-button" (click)="copyCode()">
6375
+ <ion-icon name="copy-outline"></ion-icon>
6376
+ </ion-button>
6377
+ <pre><code [class]="'language-' + (props.language || 'bash')" #codeBlock><ng-container *ngFor="let line of props.lines; let i = index"><span [class]="line.type ? 'line-' + line.type : 'line-normal'">{{ line.text }}</span><br *ngIf="i < props.lines.length - 1">
6378
+ </ng-container></code></pre>
7067
6379
  </div>
7068
- `, styles: [":host{display:block;position:relative;width:100%}.select-container{position:relative;display:flex;align-items:center;cursor:pointer}.select-container .main-input{flex:1;cursor:pointer}.select-container .main-input.is-open{--border-color: var(--ion-color-primary)}.select-container .dropdown-icon{position:absolute;right:12px;font-size:16px;color:var(--ion-color-medium);transition:transform .2s ease;pointer-events:none;z-index:2}.select-container .dropdown-icon.rotated{transform:rotate(180deg)}.dropdown-overlay{position:absolute;top:100%;left:0;right:0;background:var(--ion-background-color);border:1px solid var(--ion-color-light);border-radius:8px;box-shadow:0 4px 16px #0000001a;z-index:1000;max-height:300px;opacity:0;transform:translateY(-8px);pointer-events:none;transition:all .2s ease}.dropdown-overlay.visible{opacity:1;transform:translateY(4px);pointer-events:all}.search-container{padding:12px;border-bottom:1px solid var(--ion-color-light)}.search-container ion-searchbar{--background: var(--ion-color-light);--border-radius: 8px;--box-shadow: none;--padding-start: 12px;--padding-end: 12px;height:40px}.options-container{max-height:240px;overflow-y:auto}.options-container .options-list{padding:0}.options-container .option-item{--padding-start: 16px;--padding-end: 16px;--min-height: 48px;cursor:pointer}.options-container .option-item:hover{--background: var(--ion-color-light)}.options-container .option-item ion-label{font-size:16px;line-height:1.4}.options-container .option-item ion-icon{font-size:20px}.options-container .no-results{--padding-start: 16px;--padding-end: 16px;--min-height: 48px;text-align:center}.options-container .no-results ion-label{font-style:italic;font-size:14px}@media (max-width: 768px){.dropdown-overlay{max-height:250px}.options-container{max-height:200px}}@media (prefers-color-scheme: dark){.dropdown-overlay{box-shadow:0 4px 16px #0000004d}}.option-item:focus-within{--background: var(--ion-color-primary-tint);outline:2px solid var(--ion-color-primary);outline-offset:-2px}.option-item{transition:background-color .15s ease}.dropdown-icon{transition:transform .2s cubic-bezier(.4,0,.2,1)}\n"] }]
7069
- }], ctorParameters: () => [], propDecorators: { dropdownRef: [{
7070
- type: ViewChild,
7071
- args: ['dropdown']
7072
- }], mainInputRef: [{
7073
- type: ViewChild,
7074
- args: ['mainInput']
7075
- }], props: [{
7076
- type: Input
7077
- }], labelProperty: [{
7078
- type: Input
7079
- }], valueProperty: [{
7080
- type: Input
7081
- }], placeholder: [{
7082
- type: Input
7083
- }] } });
7084
-
7085
- /**
7086
- * val-text-input
7087
- *
7088
- * A text input field integrated with Angular forms.
7089
- *
7090
- * @example
7091
- * <val-text-input [props]="{ control: myControl, placeholder: 'Enter text', ... }"></val-text-input>
7092
- *
7093
- * @input props: InputMetadata - Configuration for the input (form control, placeholder, label, etc.)
7094
- */
7095
- class TextInputComponent {
7096
- constructor() {
7097
- this.states = ComponentStates;
7098
- }
7099
- ngOnInit() {
7100
- // Apply default values on initialization
7101
- if (this.props?.withDefault || this.props?.value) {
7102
- applyDefaultValueToControl(this.props);
7103
- }
7104
- }
7105
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
7106
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TextInputComponent, isStandalone: true, selector: "val-text-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-input [formControl]="props.control" type="text" [placeholder]="props.placeholder" /> `, 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)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
7107
- }
7108
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextInputComponent, decorators: [{
7109
- type: Component,
7110
- args: [{ selector: 'val-text-input', standalone: true, imports: [ReactiveFormsModule, IonInput], template: ` <ion-input [formControl]="props.control" type="text" [placeholder]="props.placeholder" /> `, 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)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\n"] }]
6380
+ `, styles: [".code-box-container{position:relative;background-color:#282c34;border-radius:16px;overflow:hidden;box-shadow:0 4px 15px #0009;margin:0}@media (prefers-color-scheme: light){.code-box-container{background-color:#fff;box-shadow:0 2px 4px #0000001a}}.copy-button{position:absolute;top:8px;right:8px;z-index:10;--padding-start: 2px;--padding-end: 2px;--padding-top: 2px;--padding-bottom: 2px;min-width:28px;min-height:28px;height:28px;width:28px;color:#61afef;background:#0006;border-radius:6px;box-shadow:0 1px 4px #0000000d;display:flex;align-items:center;justify-content:center;transition:background .2s ease,color .2s ease}.copy-button:hover{background:#00000080;color:#8cc4ff}.copy-button ion-icon{font-size:1.2em;margin:0}@media (prefers-color-scheme: light){.copy-button{color:var(--ion-color-primary, #007bff);background:#ffffffb3}.copy-button:hover{background:#ffffffe6;color:var(--ion-color-primary-tint, #3880ff)}}pre{margin:0;padding:0;background-color:transparent;min-width:100%;min-height:100%;white-space:pre-wrap;word-break:normal;font-family:Roboto Mono,monospace}code{font-family:Roboto Mono,monospace;font-size:.9em;line-height:1.6;display:block;white-space:inherit;word-break:inherit;color:#abb2bf;margin:0}@media (prefers-color-scheme: light){code{color:#333}}code .line-normal{color:#abb2bf}@media (prefers-color-scheme: light){code .line-normal{color:#333}}code .line-command{color:#c678dd}@media (prefers-color-scheme: light){code .line-command{color:var(--ion-color-primary, #3880ff)}}code .line-error{color:#e06c75}@media (prefers-color-scheme: light){code .line-error{color:var(--ion-color-danger, #eb445a)}}code .line-success{color:#98c379}@media (prefers-color-scheme: light){code .line-success{color:var(--ion-color-success, #2dd36f)}}code .token.comment{color:#5c6370}code .token.selector,code .token.string{color:#98c379}code .token.punctuation{color:#abb2bf}code .token.operator{color:#c678dd}code .token.boolean,code .token.number{color:#d19a66}code .token.function{color:#61afef}code .token.keyword{color:#c678dd}code .token.class-name{color:#e6c07b}code .token.tag{color:#e06c75}code .token.attr-name{color:#d19a66}code .token.attr-value{color:#98c379}code .token.property{color:#56b6c2}code .token.variable{color:#e06c75}@media (max-width: 600px){.code-box-container{border-radius:16px}.copy-button{top:6px;right:6px;min-width:24px;min-height:24px;height:24px;width:24px}.copy-button ion-icon{font-size:1em}pre{padding:0;margin:0}code{font-size:.8em;line-height:1.5;margin:0}}@media (min-width: 601px) and (max-width: 1024px){code{font-size:.9em}}@media (min-width: 1025px){code{font-size:1em}}\n"] }]
7111
6381
  }], ctorParameters: () => [], propDecorators: { props: [{
7112
6382
  type: Input
6383
+ }], codeBlock: [{
6384
+ type: ViewChild,
6385
+ args: ['codeBlock']
7113
6386
  }] } });
7114
6387
 
7115
6388
  /**
@@ -8479,12 +7752,6 @@ class FormComponent {
8479
7752
  <ng-container *ngIf="f.type === types.SEARCH_SELECT">
8480
7753
  <val-select-search [props]="f"></val-select-search>
8481
7754
  </ng-container>
8482
- <ng-container *ngIf="f.type === types.MULTI_SELECT">
8483
- <val-multi-select-search [props]="f"></val-multi-select-search>
8484
- </ng-container>
8485
- <ng-container *ngIf="f.type === types.MULTI_SELECT_SIMPLE">
8486
- <val-multi-select-simple [props]="f"></val-multi-select-simple>
8487
- </ng-container>
8488
7755
  <val-hint [props]="f"></val-hint>
8489
7756
  </div>
8490
7757
  <val-divider [props]="{ fill: 'solid', size: 'medium', color: 'medium' }"></val-divider>
@@ -8496,7 +7763,7 @@ class FormComponent {
8496
7763
  ></val-button-group>
8497
7764
  </form>
8498
7765
  </div>
8499
- `, 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)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\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: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["props"] }, { kind: "component", type: CheckInputComponent, selector: "val-check-input" }, { kind: "component", type: ButtonGroupComponent, selector: "val-button-group", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: DividerComponent, selector: "val-divider", inputs: ["props"] }, { kind: "component", type: HintComponent, selector: "val-hint", inputs: ["props"] }, { kind: "component", type: CommentInputComponent, selector: "val-comment-input", inputs: ["props"] }, { kind: "component", type: DateInputComponent, selector: "val-date-input", inputs: ["props"] }, { kind: "component", type: FileInputComponent, selector: "val-file-input", inputs: ["props"] }, { kind: "component", type: HourInputComponent, selector: "val-hour-input", inputs: ["props"] }, { kind: "component", type: EmailInputComponent, selector: "val-email-input", inputs: ["props"] }, { kind: "component", type: NumberInputComponent, selector: "val-number-input", inputs: ["props"] }, { kind: "component", type: NumberFromToComponent, selector: "val-number-from-to", inputs: ["props"] }, { kind: "component", type: RadioInputComponent, selector: "val-radio-input", inputs: ["props"] }, { kind: "component", type: PasswordInputComponent, selector: "val-password-input", inputs: ["props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }, { kind: "component", type: SelectSearchComponent, selector: "val-select-search", inputs: ["props", "labelProperty", "valueProperty", "placeholder"] }, { kind: "component", type: MultiSelectSearchComponent, selector: "val-multi-select-search", inputs: ["label", "labelProperty", "valueProperty", "placeholder", "props"] }, { kind: "component", type: MultiSelectSimpleComponent, selector: "val-multi-select-simple", inputs: ["props", "labelProperty", "valueProperty", "placeholder"] }, { kind: "component", type: SearchSelectorComponent, selector: "val-select-input", inputs: ["props"] }] }); }
7766
+ `, 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)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}\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: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["props"] }, { kind: "component", type: CheckInputComponent, selector: "val-check-input" }, { kind: "component", type: ButtonGroupComponent, selector: "val-button-group", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: DividerComponent, selector: "val-divider", inputs: ["props"] }, { kind: "component", type: HintComponent, selector: "val-hint", inputs: ["props"] }, { kind: "component", type: CommentInputComponent, selector: "val-comment-input", inputs: ["props"] }, { kind: "component", type: DateInputComponent, selector: "val-date-input", inputs: ["props"] }, { kind: "component", type: FileInputComponent, selector: "val-file-input", inputs: ["props"] }, { kind: "component", type: HourInputComponent, selector: "val-hour-input", inputs: ["props"] }, { kind: "component", type: EmailInputComponent, selector: "val-email-input", inputs: ["props"] }, { kind: "component", type: NumberInputComponent, selector: "val-number-input", inputs: ["props"] }, { kind: "component", type: NumberFromToComponent, selector: "val-number-from-to", inputs: ["props"] }, { kind: "component", type: RadioInputComponent, selector: "val-radio-input", inputs: ["props"] }, { kind: "component", type: PasswordInputComponent, selector: "val-password-input", inputs: ["props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }, { kind: "component", type: SelectSearchComponent, selector: "val-select-search", inputs: ["label", "labelProperty", "valueProperty", "multiple", "placeholder", "props"] }, { kind: "component", type: SearchSelectorComponent, selector: "val-select-input", inputs: ["props"] }] }); }
8500
7767
  }
8501
7768
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormComponent, decorators: [{
8502
7769
  type: Component,
@@ -8521,8 +7788,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
8521
7788
  PasswordInputComponent,
8522
7789
  PinInputComponent,
8523
7790
  SelectSearchComponent,
8524
- MultiSelectSearchComponent,
8525
- MultiSelectSimpleComponent,
8526
7791
  SearchSelectorComponent,
8527
7792
  ], template: `
8528
7793
  <div class="container">
@@ -8581,12 +7846,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
8581
7846
  <ng-container *ngIf="f.type === types.SEARCH_SELECT">
8582
7847
  <val-select-search [props]="f"></val-select-search>
8583
7848
  </ng-container>
8584
- <ng-container *ngIf="f.type === types.MULTI_SELECT">
8585
- <val-multi-select-search [props]="f"></val-multi-select-search>
8586
- </ng-container>
8587
- <ng-container *ngIf="f.type === types.MULTI_SELECT_SIMPLE">
8588
- <val-multi-select-simple [props]="f"></val-multi-select-simple>
8589
- </ng-container>
8590
7849
  <val-hint [props]="f"></val-hint>
8591
7850
  </div>
8592
7851
  <val-divider [props]="{ fill: 'solid', size: 'medium', color: 'medium' }"></val-divider>
@@ -9927,5 +9186,5 @@ function createContentHelper(langService, className) {
9927
9186
  * Generated bundle index. Do not edit.
9928
9187
  */
9929
9188
 
9930
- export { ARTICLE_SPACING, ActionHeaderComponent, ActionType, AlertBoxComponent, ArticleBuilder, ArticleComponent, AvatarComponent, BannerComponent, BaseDefault, BoxComponent, ButtonComponent, ButtonGroupComponent, CardComponent, CardSection, CardType, CheckInputComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentInputComponent, ComponentStates, ContentLoaderComponent, DateInputComponent, DisplayComponent, DividerComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FileInputComponent, FooterComponent, FormComponent, FormFooterComponent, GlobalContent, HeaderComponent, HintComponent, HourInputComponent, HrefComponent, Icon, IconComponent, IconService, ImageComponent, InAppBrowserService, InfoComponent, InputType, ItemListComponent, LANGUAGES, LangService, LanguageSelectorComponent, LayeredCardComponent, LayoutComponent, LinkComponent, LinkProcessorService, LinksCakeComponent, LocalStorageService, MOTION, MultiSelectSearchComponent, MultiSelectSimpleComponent, NavigationService, NoContentComponent, NotesBoxComponent, NumberFromToComponent, NumberInputComponent, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PasswordInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, 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, 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, createButtonProps, createContentHelper, createDisplayProps, createNumberFromToField, createReactiveContentMetadata, createTextProps, createTitleProps, extractContentConfig, extractContentConfigWithInterpolation, fromContent, fromContentWithInterpolation, fromMultipleContent, globalContentData, goToTop, interpolateContent, interpolateStaticContent, isAtEnd, maxLength, replaceSpecialChars, resolveColor, resolveInputDefaultValue, shouldUseReactiveContent, shouldUseReactiveContentWithInterpolation };
9189
+ export { ARTICLE_SPACING, ActionHeaderComponent, ActionType, AlertBoxComponent, ArticleBuilder, ArticleComponent, AvatarComponent, BannerComponent, BaseDefault, BoxComponent, ButtonComponent, ButtonGroupComponent, CardComponent, CardSection, CardType, CheckInputComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentInputComponent, ComponentStates, ContentLoaderComponent, DateInputComponent, DisplayComponent, DividerComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FileInputComponent, FooterComponent, FormComponent, FormFooterComponent, GlobalContent, HeaderComponent, HintComponent, HourInputComponent, HrefComponent, Icon, IconComponent, IconService, ImageComponent, InAppBrowserService, InfoComponent, InputType, ItemListComponent, LANGUAGES, LangService, LanguageSelectorComponent, LayeredCardComponent, LayoutComponent, LinkComponent, LinkProcessorService, LinksCakeComponent, LocalStorageService, MOTION, NavigationService, NoContentComponent, NotesBoxComponent, NumberFromToComponent, NumberInputComponent, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PasswordInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, 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, 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, createButtonProps, createContentHelper, createDisplayProps, createNumberFromToField, createReactiveContentMetadata, createTextProps, createTitleProps, extractContentConfig, extractContentConfigWithInterpolation, fromContent, fromContentWithInterpolation, fromMultipleContent, globalContentData, goToTop, interpolateContent, interpolateStaticContent, isAtEnd, maxLength, replaceSpecialChars, resolveColor, resolveInputDefaultValue, shouldUseReactiveContent, shouldUseReactiveContentWithInterpolation };
9931
9190
  //# sourceMappingURL=valtech-components.mjs.map