valtech-components 4.0.5 → 4.0.6
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.
- package/esm2022/lib/components/atoms/button/button.component.mjs +15 -5
- package/esm2022/lib/components/atoms/fab/fab.component.mjs +8 -18
- package/esm2022/lib/components/atoms/horizontal-scroll/horizontal-scroll.component.mjs +5 -7
- package/esm2022/lib/components/atoms/progress-bar/progress-bar.component.mjs +3 -1
- package/esm2022/lib/components/atoms/progress-bar/types.mjs +1 -1
- package/esm2022/lib/components/molecules/accordion/accordion.component.mjs +4 -6
- package/esm2022/lib/components/molecules/action-card/action-card.component.mjs +5 -5
- package/esm2022/lib/components/molecules/breadcrumb/breadcrumb.component.mjs +5 -5
- package/esm2022/lib/components/molecules/card/card.component.mjs +19 -9
- package/esm2022/lib/components/molecules/chip-group/chip-group.component.mjs +21 -13
- package/esm2022/lib/components/molecules/code-display/code-display.component.mjs +5 -5
- package/esm2022/lib/components/molecules/comment/comment.component.mjs +29 -56
- package/esm2022/lib/components/molecules/content-loader/content-loader.component.mjs +13 -3
- package/esm2022/lib/components/molecules/date-picker/date-picker.component.mjs +7 -15
- package/esm2022/lib/components/molecules/date-range-input/date-range-input.component.mjs +6 -10
- package/esm2022/lib/components/molecules/docs-code-example/docs-code-example.component.mjs +13 -5
- package/esm2022/lib/components/molecules/docs-nav-links/docs-nav-links.component.mjs +7 -13
- package/esm2022/lib/components/molecules/docs-search/docs-search.component.mjs +12 -28
- package/esm2022/lib/components/molecules/features-list/features-list.component.mjs +5 -5
- package/esm2022/lib/components/molecules/feedback-form/feedback-form.component.mjs +5 -5
- package/esm2022/lib/components/molecules/file-input/file-input.component.mjs +9 -3
- package/esm2022/lib/components/molecules/glow-card/glow-card.component.mjs +17 -15
- package/esm2022/lib/components/molecules/language-selector/language-selector.component.mjs +7 -5
- package/esm2022/lib/components/molecules/link/link.component.mjs +3 -3
- package/esm2022/lib/components/molecules/media-object/media-object.component.mjs +3 -3
- package/esm2022/lib/components/molecules/metric-card/metric-card.component.mjs +5 -3
- package/esm2022/lib/components/molecules/password-input/password-input.component.mjs +11 -3
- package/esm2022/lib/components/molecules/pill/pill.component.mjs +7 -7
- package/esm2022/lib/components/molecules/popover-selector/popover-selector.component.mjs +7 -7
- package/esm2022/lib/components/molecules/segment-control/segment-control.component.mjs +3 -3
- package/esm2022/lib/components/molecules/select-search/select-search.component.mjs +15 -3
- package/esm2022/lib/components/molecules/share-buttons/share-buttons.component.mjs +3 -1
- package/esm2022/lib/components/molecules/stats-card/stats-card.component.mjs +5 -5
- package/esm2022/lib/components/molecules/stepper/stepper.component.mjs +11 -13
- package/esm2022/lib/components/molecules/tabs/tabs.component.mjs +4 -6
- package/esm2022/lib/components/molecules/ticket-card/ticket-card.component.mjs +3 -3
- package/esm2022/lib/components/organisms/cookie-banner/cookie-banner.component.mjs +3 -1
- package/esm2022/lib/components/organisms/cookie-banner/types.mjs +1 -1
- package/esm2022/lib/components/organisms/data-table/data-table.component.mjs +11 -7
- package/esm2022/lib/components/organisms/login/login.component.mjs +3 -3
- package/esm2022/lib/services/page-state/page-state.i18n.mjs +19 -0
- package/esm2022/lib/services/page-state/page-state.mjs +101 -0
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +4 -1
- package/fesm2022/valtech-components.mjs +403 -278
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/progress-bar/types.d.ts +2 -0
- package/lib/components/atoms/rights-footer/rights-footer.component.d.ts +2 -2
- package/lib/components/atoms/text/text.component.d.ts +1 -1
- package/lib/components/atoms/user-avatar/user-avatar.component.d.ts +1 -1
- package/lib/components/molecules/features-list/features-list.component.d.ts +1 -1
- package/lib/components/organisms/article/article.component.d.ts +4 -4
- package/lib/components/organisms/cookie-banner/types.d.ts +2 -0
- package/lib/components/organisms/landing-steps/landing-steps.component.d.ts +1 -1
- package/lib/services/page-state/page-state.d.ts +74 -0
- package/lib/services/page-state/page-state.i18n.d.ts +6 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -56,7 +56,7 @@ import { BrowserMultiFormatReader } from '@zxing/browser';
|
|
|
56
56
|
* Current version of valtech-components.
|
|
57
57
|
* This is automatically updated during the publish process.
|
|
58
58
|
*/
|
|
59
|
-
const VERSION = '4.0.
|
|
59
|
+
const VERSION = '4.0.6';
|
|
60
60
|
|
|
61
61
|
// Control de estado de refresco (singleton a nivel de módulo)
|
|
62
62
|
let isRefreshing = false;
|
|
@@ -10576,8 +10576,13 @@ class ButtonComponent {
|
|
|
10576
10576
|
[disabled]="resolvedProps.state === states.DISABLED"
|
|
10577
10577
|
[ngClass]="resolvedProps.size ? [resolvedProps.size] : []"
|
|
10578
10578
|
>
|
|
10579
|
-
<ion-icon
|
|
10580
|
-
|
|
10579
|
+
<ion-icon
|
|
10580
|
+
*ngIf="resolvedProps.icon"
|
|
10581
|
+
[slot]="resolvedProps.icon.slot"
|
|
10582
|
+
[name]="resolvedProps.icon.name"
|
|
10583
|
+
aria-hidden="true"
|
|
10584
|
+
></ion-icon>
|
|
10585
|
+
<ion-spinner *ngIf="resolvedProps.state === states.WORKING" name="circular" aria-label="Cargando"></ion-spinner>
|
|
10581
10586
|
<ion-text *ngIf="resolvedProps.state !== states.WORKING">{{ displayText }}</ion-text>
|
|
10582
10587
|
</ion-button>
|
|
10583
10588
|
`, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-button{font-family:var(--ion-default-font),Arial,sans-serif;min-width:6.25rem;margin:0}ion-button.small{--padding-bottom: 12px;--padding-end: 14px;--padding-start: 14px;--padding-top: 12px}ion-button.button-clear{padding:0;margin:0}ion-button ion-spinner{--color: currentColor}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { 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: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }] }); }
|
|
@@ -10600,8 +10605,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
10600
10605
|
[disabled]="resolvedProps.state === states.DISABLED"
|
|
10601
10606
|
[ngClass]="resolvedProps.size ? [resolvedProps.size] : []"
|
|
10602
10607
|
>
|
|
10603
|
-
<ion-icon
|
|
10604
|
-
|
|
10608
|
+
<ion-icon
|
|
10609
|
+
*ngIf="resolvedProps.icon"
|
|
10610
|
+
[slot]="resolvedProps.icon.slot"
|
|
10611
|
+
[name]="resolvedProps.icon.name"
|
|
10612
|
+
aria-hidden="true"
|
|
10613
|
+
></ion-icon>
|
|
10614
|
+
<ion-spinner *ngIf="resolvedProps.state === states.WORKING" name="circular" aria-label="Cargando"></ion-spinner>
|
|
10605
10615
|
<ion-text *ngIf="resolvedProps.state !== states.WORKING">{{ displayText }}</ion-text>
|
|
10606
10616
|
</ion-button>
|
|
10607
10617
|
`, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-button{font-family:var(--ion-default-font),Arial,sans-serif;min-width:6.25rem;margin:0}ion-button.small{--padding-bottom: 12px;--padding-end: 14px;--padding-start: 14px;--padding-top: 12px}ion-button.button-clear{padding:0;margin:0}ion-button ion-spinner{--color: currentColor}\n"] }]
|
|
@@ -11383,6 +11393,7 @@ class ProgressBarComponent {
|
|
|
11383
11393
|
[color]="resolvedProps.color"
|
|
11384
11394
|
[buffer]="resolvedProps.buffer"
|
|
11385
11395
|
[type]="resolvedProps.type"
|
|
11396
|
+
[attr.aria-label]="resolvedProps.label || 'Progreso'"
|
|
11386
11397
|
></ion-progress-bar>
|
|
11387
11398
|
`, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-progress-bar.rounded{border-radius:.5rem}.medium{height:.25rem}.large{height:.375rem}.xlarge{height:.5rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IonProgressBar, selector: "ion-progress-bar", inputs: ["buffer", "color", "mode", "reversed", "type", "value"] }] }); }
|
|
11388
11399
|
}
|
|
@@ -11396,6 +11407,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
11396
11407
|
[color]="resolvedProps.color"
|
|
11397
11408
|
[buffer]="resolvedProps.buffer"
|
|
11398
11409
|
[type]="resolvedProps.type"
|
|
11410
|
+
[attr.aria-label]="resolvedProps.label || 'Progreso'"
|
|
11399
11411
|
></ion-progress-bar>
|
|
11400
11412
|
`, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-progress-bar.rounded{border-radius:.5rem}.medium{height:.25rem}.large{height:.375rem}.xlarge{height:.5rem}\n"] }]
|
|
11401
11413
|
}], propDecorators: { preset: [{
|
|
@@ -12348,9 +12360,7 @@ class FabComponent {
|
|
|
12348
12360
|
* Explicit props take precedence over preset values.
|
|
12349
12361
|
*/
|
|
12350
12362
|
resolveProps() {
|
|
12351
|
-
const presetProps = this.preset
|
|
12352
|
-
? this.presets.get('fab', this.preset)
|
|
12353
|
-
: {};
|
|
12363
|
+
const presetProps = this.preset ? this.presets.get('fab', this.preset) : {};
|
|
12354
12364
|
this.resolvedProps = {
|
|
12355
12365
|
...presetProps,
|
|
12356
12366
|
...this.props,
|
|
@@ -12394,11 +12404,7 @@ class FabComponent {
|
|
|
12394
12404
|
}
|
|
12395
12405
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
12396
12406
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FabComponent, isStandalone: true, selector: "val-fab", inputs: { preset: "preset", props: "props" }, outputs: { fabClick: "fabClick", actionClick: "actionClick" }, usesOnChanges: true, ngImport: i0, template: `
|
|
12397
|
-
<ion-fab
|
|
12398
|
-
[vertical]="getVertical()"
|
|
12399
|
-
[horizontal]="getHorizontal()"
|
|
12400
|
-
[activated]="isActivated"
|
|
12401
|
-
>
|
|
12407
|
+
<ion-fab [vertical]="getVertical()" [horizontal]="getHorizontal()" [activated]="isActivated">
|
|
12402
12408
|
<ion-fab-button
|
|
12403
12409
|
[color]="resolvedProps.color || 'primary'"
|
|
12404
12410
|
[size]="resolvedProps.size"
|
|
@@ -12406,7 +12412,7 @@ class FabComponent {
|
|
|
12406
12412
|
[translucent]="resolvedProps.translucent"
|
|
12407
12413
|
(click)="onMainClick()"
|
|
12408
12414
|
>
|
|
12409
|
-
<ion-icon [name]="getMainIcon()"></ion-icon>
|
|
12415
|
+
<ion-icon [name]="getMainIcon()" aria-hidden="true"></ion-icon>
|
|
12410
12416
|
</ion-fab-button>
|
|
12411
12417
|
|
|
12412
12418
|
@if (resolvedProps.actions && resolvedProps.actions.length > 0) {
|
|
@@ -12417,7 +12423,7 @@ class FabComponent {
|
|
|
12417
12423
|
[disabled]="action.disabled"
|
|
12418
12424
|
(click)="onActionClick(action)"
|
|
12419
12425
|
>
|
|
12420
|
-
<ion-icon [name]="action.icon"></ion-icon>
|
|
12426
|
+
<ion-icon [name]="action.icon" aria-hidden="true"></ion-icon>
|
|
12421
12427
|
</ion-fab-button>
|
|
12422
12428
|
}
|
|
12423
12429
|
</ion-fab-list>
|
|
@@ -12428,11 +12434,7 @@ class FabComponent {
|
|
|
12428
12434
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FabComponent, decorators: [{
|
|
12429
12435
|
type: Component,
|
|
12430
12436
|
args: [{ selector: 'val-fab', standalone: true, imports: [CommonModule, IonFab, IonFabButton, IonFabList, IonIcon, IonLabel], template: `
|
|
12431
|
-
<ion-fab
|
|
12432
|
-
[vertical]="getVertical()"
|
|
12433
|
-
[horizontal]="getHorizontal()"
|
|
12434
|
-
[activated]="isActivated"
|
|
12435
|
-
>
|
|
12437
|
+
<ion-fab [vertical]="getVertical()" [horizontal]="getHorizontal()" [activated]="isActivated">
|
|
12436
12438
|
<ion-fab-button
|
|
12437
12439
|
[color]="resolvedProps.color || 'primary'"
|
|
12438
12440
|
[size]="resolvedProps.size"
|
|
@@ -12440,7 +12442,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
12440
12442
|
[translucent]="resolvedProps.translucent"
|
|
12441
12443
|
(click)="onMainClick()"
|
|
12442
12444
|
>
|
|
12443
|
-
<ion-icon [name]="getMainIcon()"></ion-icon>
|
|
12445
|
+
<ion-icon [name]="getMainIcon()" aria-hidden="true"></ion-icon>
|
|
12444
12446
|
</ion-fab-button>
|
|
12445
12447
|
|
|
12446
12448
|
@if (resolvedProps.actions && resolvedProps.actions.length > 0) {
|
|
@@ -12451,7 +12453,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
12451
12453
|
[disabled]="action.disabled"
|
|
12452
12454
|
(click)="onActionClick(action)"
|
|
12453
12455
|
>
|
|
12454
|
-
<ion-icon [name]="action.icon"></ion-icon>
|
|
12456
|
+
<ion-icon [name]="action.icon" aria-hidden="true"></ion-icon>
|
|
12455
12457
|
</ion-fab-button>
|
|
12456
12458
|
}
|
|
12457
12459
|
</ion-fab-list>
|
|
@@ -13865,13 +13867,12 @@ class HorizontalScrollComponent {
|
|
|
13865
13867
|
[class.snap-start]="props?.snapAlign === 'start'"
|
|
13866
13868
|
[class.snap-center]="props?.snapAlign === 'center'"
|
|
13867
13869
|
[style.padding]="props?.padding || '0px'"
|
|
13870
|
+
tabindex="0"
|
|
13868
13871
|
>
|
|
13869
13872
|
<div class="items-wrapper" [style.gap]="props?.gap || '0px'">
|
|
13870
13873
|
@for (item of items; track $index) {
|
|
13871
13874
|
<div class="scroll-item">
|
|
13872
|
-
<ng-container
|
|
13873
|
-
*ngTemplateOutlet="itemTemplate; context: { $implicit: item, index: $index }"
|
|
13874
|
-
></ng-container>
|
|
13875
|
+
<ng-container *ngTemplateOutlet="itemTemplate; context: { $implicit: item, index: $index }"></ng-container>
|
|
13875
13876
|
</div>
|
|
13876
13877
|
}
|
|
13877
13878
|
</div>
|
|
@@ -13887,13 +13888,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
13887
13888
|
[class.snap-start]="props?.snapAlign === 'start'"
|
|
13888
13889
|
[class.snap-center]="props?.snapAlign === 'center'"
|
|
13889
13890
|
[style.padding]="props?.padding || '0px'"
|
|
13891
|
+
tabindex="0"
|
|
13890
13892
|
>
|
|
13891
13893
|
<div class="items-wrapper" [style.gap]="props?.gap || '0px'">
|
|
13892
13894
|
@for (item of items; track $index) {
|
|
13893
13895
|
<div class="scroll-item">
|
|
13894
|
-
<ng-container
|
|
13895
|
-
*ngTemplateOutlet="itemTemplate; context: { $implicit: item, index: $index }"
|
|
13896
|
-
></ng-container>
|
|
13896
|
+
<ng-container *ngTemplateOutlet="itemTemplate; context: { $implicit: item, index: $index }"></ng-container>
|
|
13897
13897
|
</div>
|
|
13898
13898
|
}
|
|
13899
13899
|
</div>
|
|
@@ -15194,9 +15194,10 @@ class CardComponent {
|
|
|
15194
15194
|
<ng-container *ngFor="let action of resolvedProps.leftActions">
|
|
15195
15195
|
<ion-button
|
|
15196
15196
|
*ngIf="action.type === actionTypes.ICON"
|
|
15197
|
+
[attr.aria-label]="action.description"
|
|
15197
15198
|
(click)="clickHandler(sections.headerLeft, action.token)"
|
|
15198
15199
|
>
|
|
15199
|
-
<ion-icon slot="icon-only" [name]="action.description" color="dark"></ion-icon>
|
|
15200
|
+
<ion-icon slot="icon-only" [name]="action.description" color="dark" aria-hidden="true"></ion-icon>
|
|
15200
15201
|
</ion-button>
|
|
15201
15202
|
<val-avatar
|
|
15202
15203
|
style="margin-right: 4px; cursor: pointer"
|
|
@@ -15224,9 +15225,10 @@ class CardComponent {
|
|
|
15224
15225
|
<ng-container *ngFor="let action of resolvedProps.rightActions">
|
|
15225
15226
|
<ion-button
|
|
15226
15227
|
*ngIf="action.type === actionTypes.ICON"
|
|
15228
|
+
[attr.aria-label]="action.description"
|
|
15227
15229
|
(click)="clickHandler(sections.headerRight, action.token)"
|
|
15228
15230
|
>
|
|
15229
|
-
<ion-icon slot="icon-only" [name]="action.description" color="dark"></ion-icon>
|
|
15231
|
+
<ion-icon slot="icon-only" [name]="action.description" color="dark" aria-hidden="true"></ion-icon>
|
|
15230
15232
|
</ion-button>
|
|
15231
15233
|
<val-avatar
|
|
15232
15234
|
style="margin-right: 4px; cursor: pointer"
|
|
@@ -15268,7 +15270,9 @@ class CardComponent {
|
|
|
15268
15270
|
@if (resolvedProps.image) {
|
|
15269
15271
|
<img [alt]="resolvedProps.title || 'Card image'" [src]="resolvedProps.image" />
|
|
15270
15272
|
}
|
|
15271
|
-
<ion-card-content *ngIf="resolvedProps.content" class="complex-content">{{
|
|
15273
|
+
<ion-card-content *ngIf="resolvedProps.content" class="complex-content">{{
|
|
15274
|
+
resolvedProps.content
|
|
15275
|
+
}}</ion-card-content>
|
|
15272
15276
|
</div>
|
|
15273
15277
|
@if (resolvedProps.footerActions && resolvedProps.footerActions.length > 0) {
|
|
15274
15278
|
<div class="card-actions">
|
|
@@ -15286,9 +15290,10 @@ class CardComponent {
|
|
|
15286
15290
|
<ng-container *ngFor="let action of resolvedProps.footerComplexActions">
|
|
15287
15291
|
<ion-button
|
|
15288
15292
|
*ngIf="action.type === actionTypes.ICON"
|
|
15293
|
+
[attr.aria-label]="action.description"
|
|
15289
15294
|
(click)="clickHandler(sections.footerExtra, action.token)"
|
|
15290
15295
|
>
|
|
15291
|
-
<ion-icon slot="icon-only" [name]="action.description" color="dark"></ion-icon>
|
|
15296
|
+
<ion-icon slot="icon-only" [name]="action.description" color="dark" aria-hidden="true"></ion-icon>
|
|
15292
15297
|
</ion-button>
|
|
15293
15298
|
<val-avatar
|
|
15294
15299
|
style="margin-right: 4px; cursor: pointer"
|
|
@@ -15404,9 +15409,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
15404
15409
|
<ng-container *ngFor="let action of resolvedProps.leftActions">
|
|
15405
15410
|
<ion-button
|
|
15406
15411
|
*ngIf="action.type === actionTypes.ICON"
|
|
15412
|
+
[attr.aria-label]="action.description"
|
|
15407
15413
|
(click)="clickHandler(sections.headerLeft, action.token)"
|
|
15408
15414
|
>
|
|
15409
|
-
<ion-icon slot="icon-only" [name]="action.description" color="dark"></ion-icon>
|
|
15415
|
+
<ion-icon slot="icon-only" [name]="action.description" color="dark" aria-hidden="true"></ion-icon>
|
|
15410
15416
|
</ion-button>
|
|
15411
15417
|
<val-avatar
|
|
15412
15418
|
style="margin-right: 4px; cursor: pointer"
|
|
@@ -15434,9 +15440,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
15434
15440
|
<ng-container *ngFor="let action of resolvedProps.rightActions">
|
|
15435
15441
|
<ion-button
|
|
15436
15442
|
*ngIf="action.type === actionTypes.ICON"
|
|
15443
|
+
[attr.aria-label]="action.description"
|
|
15437
15444
|
(click)="clickHandler(sections.headerRight, action.token)"
|
|
15438
15445
|
>
|
|
15439
|
-
<ion-icon slot="icon-only" [name]="action.description" color="dark"></ion-icon>
|
|
15446
|
+
<ion-icon slot="icon-only" [name]="action.description" color="dark" aria-hidden="true"></ion-icon>
|
|
15440
15447
|
</ion-button>
|
|
15441
15448
|
<val-avatar
|
|
15442
15449
|
style="margin-right: 4px; cursor: pointer"
|
|
@@ -15478,7 +15485,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
15478
15485
|
@if (resolvedProps.image) {
|
|
15479
15486
|
<img [alt]="resolvedProps.title || 'Card image'" [src]="resolvedProps.image" />
|
|
15480
15487
|
}
|
|
15481
|
-
<ion-card-content *ngIf="resolvedProps.content" class="complex-content">{{
|
|
15488
|
+
<ion-card-content *ngIf="resolvedProps.content" class="complex-content">{{
|
|
15489
|
+
resolvedProps.content
|
|
15490
|
+
}}</ion-card-content>
|
|
15482
15491
|
</div>
|
|
15483
15492
|
@if (resolvedProps.footerActions && resolvedProps.footerActions.length > 0) {
|
|
15484
15493
|
<div class="card-actions">
|
|
@@ -15496,9 +15505,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
15496
15505
|
<ng-container *ngFor="let action of resolvedProps.footerComplexActions">
|
|
15497
15506
|
<ion-button
|
|
15498
15507
|
*ngIf="action.type === actionTypes.ICON"
|
|
15508
|
+
[attr.aria-label]="action.description"
|
|
15499
15509
|
(click)="clickHandler(sections.footerExtra, action.token)"
|
|
15500
15510
|
>
|
|
15501
|
-
<ion-icon slot="icon-only" [name]="action.description" color="dark"></ion-icon>
|
|
15511
|
+
<ion-icon slot="icon-only" [name]="action.description" color="dark" aria-hidden="true"></ion-icon>
|
|
15502
15512
|
</ion-button>
|
|
15503
15513
|
<val-avatar
|
|
15504
15514
|
style="margin-right: 4px; cursor: pointer"
|
|
@@ -15720,7 +15730,12 @@ class ContentLoaderComponent {
|
|
|
15720
15730
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContentLoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
15721
15731
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ContentLoaderComponent, isStandalone: true, selector: "val-content-loader", inputs: { props: "props" }, ngImport: i0, template: `
|
|
15722
15732
|
<div [ngClass]="['spinner-wrapper', props.size]">
|
|
15723
|
-
<ion-spinner
|
|
15733
|
+
<ion-spinner
|
|
15734
|
+
[ngClass]="[props.size]"
|
|
15735
|
+
[name]="props.name"
|
|
15736
|
+
[color]="props.color"
|
|
15737
|
+
[attr.aria-label]="props.text || 'Cargando'"
|
|
15738
|
+
></ion-spinner>
|
|
15724
15739
|
<ion-text [color]="props.color">
|
|
15725
15740
|
<p>{{ props.text }}</p>
|
|
15726
15741
|
</ion-text>
|
|
@@ -15731,7 +15746,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
15731
15746
|
type: Component,
|
|
15732
15747
|
args: [{ selector: 'val-content-loader', standalone: true, imports: [CommonModule, IonSpinner, IonText], template: `
|
|
15733
15748
|
<div [ngClass]="['spinner-wrapper', props.size]">
|
|
15734
|
-
<ion-spinner
|
|
15749
|
+
<ion-spinner
|
|
15750
|
+
[ngClass]="[props.size]"
|
|
15751
|
+
[name]="props.name"
|
|
15752
|
+
[color]="props.color"
|
|
15753
|
+
[attr.aria-label]="props.text || 'Cargando'"
|
|
15754
|
+
></ion-spinner>
|
|
15735
15755
|
<ion-text [color]="props.color">
|
|
15736
15756
|
<p>{{ props.text }}</p>
|
|
15737
15757
|
</ion-text>
|
|
@@ -16144,7 +16164,10 @@ class FileInputComponent {
|
|
|
16144
16164
|
<div class="file-container">
|
|
16145
16165
|
<input style="display: none" type="file" (change)="onFileSelected($event)" #fileInput [accept]="props.accept" />
|
|
16146
16166
|
<div class="name-container">
|
|
16147
|
-
<ion-icon
|
|
16167
|
+
<ion-icon
|
|
16168
|
+
[name]="selectedFile ? 'checkmark-circle-outline' : 'alert-circle-outline'"
|
|
16169
|
+
aria-hidden="true"
|
|
16170
|
+
></ion-icon>
|
|
16148
16171
|
<val-text
|
|
16149
16172
|
style="margin-left: 4px;"
|
|
16150
16173
|
[props]="{
|
|
@@ -16165,7 +16188,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
16165
16188
|
<div class="file-container">
|
|
16166
16189
|
<input style="display: none" type="file" (change)="onFileSelected($event)" #fileInput [accept]="props.accept" />
|
|
16167
16190
|
<div class="name-container">
|
|
16168
|
-
<ion-icon
|
|
16191
|
+
<ion-icon
|
|
16192
|
+
[name]="selectedFile ? 'checkmark-circle-outline' : 'alert-circle-outline'"
|
|
16193
|
+
aria-hidden="true"
|
|
16194
|
+
></ion-icon>
|
|
16169
16195
|
<val-text
|
|
16170
16196
|
style="margin-left: 4px;"
|
|
16171
16197
|
[props]="{
|
|
@@ -16411,16 +16437,16 @@ class PopoverSelectorComponent {
|
|
|
16411
16437
|
[disabled]="props.disabled || false"
|
|
16412
16438
|
class="selector-trigger"
|
|
16413
16439
|
>
|
|
16414
|
-
<ion-icon *ngIf="props.icon" [name]="props.icon" slot="start"> </ion-icon>
|
|
16440
|
+
<ion-icon *ngIf="props.icon" [name]="props.icon" slot="start" aria-hidden="true"> </ion-icon>
|
|
16415
16441
|
|
|
16416
16442
|
<span class="trigger-text">{{ getDisplayText() }}</span>
|
|
16417
16443
|
|
|
16418
|
-
<ion-icon name="chevron-down-outline" slot="end" class="chevron-icon"> </ion-icon>
|
|
16444
|
+
<ion-icon name="chevron-down-outline" slot="end" class="chevron-icon" aria-hidden="true"> </ion-icon>
|
|
16419
16445
|
</ion-button>
|
|
16420
16446
|
|
|
16421
16447
|
<ion-select-option *ngFor="let option of props.options" [value]="option.value" [disabled]="option.disabled">
|
|
16422
16448
|
<div class="option-content">
|
|
16423
|
-
<ion-icon *ngIf="option.icon" [name]="option.icon" class="option-icon"> </ion-icon>
|
|
16449
|
+
<ion-icon *ngIf="option.icon" [name]="option.icon" class="option-icon" aria-hidden="true"> </ion-icon>
|
|
16424
16450
|
<span>{{ option.label }}</span>
|
|
16425
16451
|
</div>
|
|
16426
16452
|
</ion-select-option>
|
|
@@ -16453,16 +16479,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
16453
16479
|
[disabled]="props.disabled || false"
|
|
16454
16480
|
class="selector-trigger"
|
|
16455
16481
|
>
|
|
16456
|
-
<ion-icon *ngIf="props.icon" [name]="props.icon" slot="start"> </ion-icon>
|
|
16482
|
+
<ion-icon *ngIf="props.icon" [name]="props.icon" slot="start" aria-hidden="true"> </ion-icon>
|
|
16457
16483
|
|
|
16458
16484
|
<span class="trigger-text">{{ getDisplayText() }}</span>
|
|
16459
16485
|
|
|
16460
|
-
<ion-icon name="chevron-down-outline" slot="end" class="chevron-icon"> </ion-icon>
|
|
16486
|
+
<ion-icon name="chevron-down-outline" slot="end" class="chevron-icon" aria-hidden="true"> </ion-icon>
|
|
16461
16487
|
</ion-button>
|
|
16462
16488
|
|
|
16463
16489
|
<ion-select-option *ngFor="let option of props.options" [value]="option.value" [disabled]="option.disabled">
|
|
16464
16490
|
<div class="option-content">
|
|
16465
|
-
<ion-icon *ngIf="option.icon" [name]="option.icon" class="option-icon"> </ion-icon>
|
|
16491
|
+
<ion-icon *ngIf="option.icon" [name]="option.icon" class="option-icon" aria-hidden="true"> </ion-icon>
|
|
16466
16492
|
<span>{{ option.label }}</span>
|
|
16467
16493
|
</div>
|
|
16468
16494
|
</ion-select-option>
|
|
@@ -16611,9 +16637,10 @@ class LanguageSelectorComponent {
|
|
|
16611
16637
|
[fill]="props.fill || 'clear'"
|
|
16612
16638
|
[size]="props.size || 'default'"
|
|
16613
16639
|
[disabled]="props.disabled"
|
|
16640
|
+
[attr.aria-label]="'Cambiar idioma'"
|
|
16614
16641
|
class="icon-mode-button"
|
|
16615
16642
|
>
|
|
16616
|
-
<ion-icon slot="icon-only" [name]="props.icon || 'globe-outline'"></ion-icon>
|
|
16643
|
+
<ion-icon slot="icon-only" [name]="props.icon || 'globe-outline'" aria-hidden="true"></ion-icon>
|
|
16617
16644
|
</ion-button>
|
|
16618
16645
|
|
|
16619
16646
|
<ion-popover [trigger]="popoverId" [dismissOnSelect]="true">
|
|
@@ -16628,7 +16655,7 @@ class LanguageSelectorComponent {
|
|
|
16628
16655
|
>
|
|
16629
16656
|
<ion-label>{{ getLanguageDisplayName(lang) }}</ion-label>
|
|
16630
16657
|
@if (lang === currentLanguage) {
|
|
16631
|
-
<ion-icon slot="end" name="checkmark" color="primary"></ion-icon>
|
|
16658
|
+
<ion-icon slot="end" name="checkmark" color="primary" aria-hidden="true"></ion-icon>
|
|
16632
16659
|
}
|
|
16633
16660
|
</ion-item>
|
|
16634
16661
|
}
|
|
@@ -16654,9 +16681,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
16654
16681
|
[fill]="props.fill || 'clear'"
|
|
16655
16682
|
[size]="props.size || 'default'"
|
|
16656
16683
|
[disabled]="props.disabled"
|
|
16684
|
+
[attr.aria-label]="'Cambiar idioma'"
|
|
16657
16685
|
class="icon-mode-button"
|
|
16658
16686
|
>
|
|
16659
|
-
<ion-icon slot="icon-only" [name]="props.icon || 'globe-outline'"></ion-icon>
|
|
16687
|
+
<ion-icon slot="icon-only" [name]="props.icon || 'globe-outline'" aria-hidden="true"></ion-icon>
|
|
16660
16688
|
</ion-button>
|
|
16661
16689
|
|
|
16662
16690
|
<ion-popover [trigger]="popoverId" [dismissOnSelect]="true">
|
|
@@ -16671,7 +16699,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
16671
16699
|
>
|
|
16672
16700
|
<ion-label>{{ getLanguageDisplayName(lang) }}</ion-label>
|
|
16673
16701
|
@if (lang === currentLanguage) {
|
|
16674
|
-
<ion-icon slot="end" name="checkmark" color="primary"></ion-icon>
|
|
16702
|
+
<ion-icon slot="end" name="checkmark" color="primary" aria-hidden="true"></ion-icon>
|
|
16675
16703
|
}
|
|
16676
16704
|
</ion-item>
|
|
16677
16705
|
}
|
|
@@ -17111,7 +17139,7 @@ class LinkComponent {
|
|
|
17111
17139
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: LinkComponent, isStandalone: true, selector: "val-link", inputs: { props: "props" }, outputs: { onClick: "onClick" }, ngImport: i0, template: `
|
|
17112
17140
|
<div>
|
|
17113
17141
|
<ion-button type="button" [color]="props.color" fill="clear" [size]="props.size" (click)="onClickHandler()">
|
|
17114
|
-
<ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
17142
|
+
<ion-icon slot="end" name="chevron-forward-outline" aria-hidden="true"></ion-icon>
|
|
17115
17143
|
<ion-text>{{ props.text }}</ion-text>
|
|
17116
17144
|
</ion-button>
|
|
17117
17145
|
</div>
|
|
@@ -17122,7 +17150,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
17122
17150
|
args: [{ selector: 'val-link', standalone: true, imports: [IonButton, IonIcon, IonText], template: `
|
|
17123
17151
|
<div>
|
|
17124
17152
|
<ion-button type="button" [color]="props.color" fill="clear" [size]="props.size" (click)="onClickHandler()">
|
|
17125
|
-
<ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
17153
|
+
<ion-icon slot="end" name="chevron-forward-outline" aria-hidden="true"></ion-icon>
|
|
17126
17154
|
<ion-text>{{ props.text }}</ion-text>
|
|
17127
17155
|
</ion-button>
|
|
17128
17156
|
</div>
|
|
@@ -17634,7 +17662,11 @@ class PasswordInputComponent {
|
|
|
17634
17662
|
[attr.aria-label]="toggleLabel()"
|
|
17635
17663
|
[attr.aria-pressed]="!hidePassword"
|
|
17636
17664
|
>
|
|
17637
|
-
<ion-icon
|
|
17665
|
+
<ion-icon
|
|
17666
|
+
slot="icon-only"
|
|
17667
|
+
[name]="hidePassword ? 'eye-off-outline' : 'eye-outline'"
|
|
17668
|
+
aria-hidden="true"
|
|
17669
|
+
></ion-icon>
|
|
17638
17670
|
</ion-button>
|
|
17639
17671
|
</div>
|
|
17640
17672
|
`, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:var(--val-form-field-gap, .5rem) 0}@media (min-width: 768px){.input{margin:var(--val-form-field-gap, .75rem) 0}}.submit-actions--sticky{position:sticky;bottom:0;z-index:1;background:var(--ion-background-color);border-top:1px solid var(--ion-color-step-150, rgba(0, 0, 0, .08));padding:.75rem 0 calc(.75rem + env(safe-area-inset-bottom))}.field-description{display:block;font-size:.75rem;color:var(--ion-color-dark);margin-bottom:.25rem;line-height:1.4}.input-container{display:flex;align-items:center;flex-direction:row}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.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"] }] }); }
|
|
@@ -17657,7 +17689,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
17657
17689
|
[attr.aria-label]="toggleLabel()"
|
|
17658
17690
|
[attr.aria-pressed]="!hidePassword"
|
|
17659
17691
|
>
|
|
17660
|
-
<ion-icon
|
|
17692
|
+
<ion-icon
|
|
17693
|
+
slot="icon-only"
|
|
17694
|
+
[name]="hidePassword ? 'eye-off-outline' : 'eye-outline'"
|
|
17695
|
+
aria-hidden="true"
|
|
17696
|
+
></ion-icon>
|
|
17661
17697
|
</ion-button>
|
|
17662
17698
|
</div>
|
|
17663
17699
|
`, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:var(--val-form-field-gap, .5rem) 0}@media (min-width: 768px){.input{margin:var(--val-form-field-gap, .75rem) 0}}.submit-actions--sticky{position:sticky;bottom:0;z-index:1;background:var(--ion-background-color);border-top:1px solid var(--ion-color-step-150, rgba(0, 0, 0, .08));padding:.75rem 0 calc(.75rem + env(safe-area-inset-bottom))}.field-description{display:block;font-size:.75rem;color:var(--ion-color-dark);margin-bottom:.25rem;line-height:1.4}.input-container{display:flex;align-items:center;flex-direction:row}\n"] }]
|
|
@@ -18818,7 +18854,13 @@ class SelectSearchComponent {
|
|
|
18818
18854
|
<ion-list>
|
|
18819
18855
|
<ion-item *ngFor="let item of filteredItems" button (click)="selectItem(item)" detail="false">
|
|
18820
18856
|
<ion-label>{{ item[labelProperty] }}</ion-label>
|
|
18821
|
-
<ion-icon
|
|
18857
|
+
<ion-icon
|
|
18858
|
+
*ngIf="isItemSelected(item)"
|
|
18859
|
+
name="checkmark-outline"
|
|
18860
|
+
slot="end"
|
|
18861
|
+
color="primary"
|
|
18862
|
+
aria-hidden="true"
|
|
18863
|
+
></ion-icon>
|
|
18822
18864
|
</ion-item>
|
|
18823
18865
|
<ion-item *ngIf="filteredItems.length === 0" lines="none">
|
|
18824
18866
|
<ion-label color="dark">{{ getNoResultsText() }}</ion-label>
|
|
@@ -18859,7 +18901,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
18859
18901
|
<ion-list>
|
|
18860
18902
|
<ion-item *ngFor="let item of filteredItems" button (click)="selectItem(item)" detail="false">
|
|
18861
18903
|
<ion-label>{{ item[labelProperty] }}</ion-label>
|
|
18862
|
-
<ion-icon
|
|
18904
|
+
<ion-icon
|
|
18905
|
+
*ngIf="isItemSelected(item)"
|
|
18906
|
+
name="checkmark-outline"
|
|
18907
|
+
slot="end"
|
|
18908
|
+
color="primary"
|
|
18909
|
+
aria-hidden="true"
|
|
18910
|
+
></ion-icon>
|
|
18863
18911
|
</ion-item>
|
|
18864
18912
|
<ion-item *ngIf="filteredItems.length === 0" lines="none">
|
|
18865
18913
|
<ion-label color="dark">{{ getNoResultsText() }}</ion-label>
|
|
@@ -18965,7 +19013,7 @@ class SegmentControlComponent {
|
|
|
18965
19013
|
@for (option of resolvedProps.options; track option.value) {
|
|
18966
19014
|
<ion-segment-button [value]="option.value" [disabled]="option.disabled" [layout]="option.layout || 'icon-top'">
|
|
18967
19015
|
@if (option.icon) {
|
|
18968
|
-
<ion-icon [name]="option.icon"></ion-icon>
|
|
19016
|
+
<ion-icon [name]="option.icon" aria-hidden="true"></ion-icon>
|
|
18969
19017
|
}
|
|
18970
19018
|
@if (getOptionLabel(option)) {
|
|
18971
19019
|
<ion-label>{{ getOptionLabel(option) }}</ion-label>
|
|
@@ -18990,7 +19038,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
18990
19038
|
@for (option of resolvedProps.options; track option.value) {
|
|
18991
19039
|
<ion-segment-button [value]="option.value" [disabled]="option.disabled" [layout]="option.layout || 'icon-top'">
|
|
18992
19040
|
@if (option.icon) {
|
|
18993
|
-
<ion-icon [name]="option.icon"></ion-icon>
|
|
19041
|
+
<ion-icon [name]="option.icon" aria-hidden="true"></ion-icon>
|
|
18994
19042
|
}
|
|
18995
19043
|
@if (getOptionLabel(option)) {
|
|
18996
19044
|
<ion-label>{{ getOptionLabel(option) }}</ion-label>
|
|
@@ -19309,8 +19357,8 @@ class CodeDisplayComponent {
|
|
|
19309
19357
|
</div>
|
|
19310
19358
|
<div class="code-content">
|
|
19311
19359
|
<div class="copy-button-wrapper">
|
|
19312
|
-
<ion-button fill="clear" class="copy-button" (click)="copyToClipboard()">
|
|
19313
|
-
<ion-icon name="copy-outline"></ion-icon>
|
|
19360
|
+
<ion-button fill="clear" class="copy-button" [attr.aria-label]="'Copiar'" (click)="copyToClipboard()">
|
|
19361
|
+
<ion-icon name="copy-outline" aria-hidden="true"></ion-icon>
|
|
19314
19362
|
</ion-button>
|
|
19315
19363
|
</div>
|
|
19316
19364
|
<pre><code [class]="'language-' + (props.tabs[selectedTab]?.language || props.language)" #codeElement></code></pre>
|
|
@@ -19334,8 +19382,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
19334
19382
|
</div>
|
|
19335
19383
|
<div class="code-content">
|
|
19336
19384
|
<div class="copy-button-wrapper">
|
|
19337
|
-
<ion-button fill="clear" class="copy-button" (click)="copyToClipboard()">
|
|
19338
|
-
<ion-icon name="copy-outline"></ion-icon>
|
|
19385
|
+
<ion-button fill="clear" class="copy-button" [attr.aria-label]="'Copiar'" (click)="copyToClipboard()">
|
|
19386
|
+
<ion-icon name="copy-outline" aria-hidden="true"></ion-icon>
|
|
19339
19387
|
</ion-button>
|
|
19340
19388
|
</div>
|
|
19341
19389
|
<pre><code [class]="'language-' + (props.tabs[selectedTab]?.language || props.language)" #codeElement></code></pre>
|
|
@@ -19457,7 +19505,7 @@ class PillComponent {
|
|
|
19457
19505
|
<div class="notif-pill" [attr.aria-live]="'polite'">
|
|
19458
19506
|
@if (resolvedProps.notification?.icon) {
|
|
19459
19507
|
<div class="notif-pill__icon-wrap" [style.color]="getIconColor()">
|
|
19460
|
-
<ion-icon [name]="resolvedProps.notification!.icon!" />
|
|
19508
|
+
<ion-icon [name]="resolvedProps.notification!.icon!" aria-hidden="true" />
|
|
19461
19509
|
</div>
|
|
19462
19510
|
}
|
|
19463
19511
|
|
|
@@ -19479,7 +19527,7 @@ class PillComponent {
|
|
|
19479
19527
|
[attr.aria-label]="action.ariaLabel || action.token"
|
|
19480
19528
|
(click)="onActionClick(action.token, $event)"
|
|
19481
19529
|
>
|
|
19482
|
-
<ion-icon [name]="action.icon" />
|
|
19530
|
+
<ion-icon [name]="action.icon" aria-hidden="true" />
|
|
19483
19531
|
</button>
|
|
19484
19532
|
}
|
|
19485
19533
|
</div>
|
|
@@ -19508,7 +19556,7 @@ class PillComponent {
|
|
|
19508
19556
|
(keydown.space)="onPillClick($event)"
|
|
19509
19557
|
>
|
|
19510
19558
|
@if (resolvedProps.icon) {
|
|
19511
|
-
<ion-icon class="val-pill__icon" [name]="resolvedProps.icon" />
|
|
19559
|
+
<ion-icon class="val-pill__icon" [name]="resolvedProps.icon" aria-hidden="true" />
|
|
19512
19560
|
}
|
|
19513
19561
|
<span class="val-pill__label">{{ resolvedProps.label }}</span>
|
|
19514
19562
|
</span>
|
|
@@ -19523,7 +19571,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
19523
19571
|
<div class="notif-pill" [attr.aria-live]="'polite'">
|
|
19524
19572
|
@if (resolvedProps.notification?.icon) {
|
|
19525
19573
|
<div class="notif-pill__icon-wrap" [style.color]="getIconColor()">
|
|
19526
|
-
<ion-icon [name]="resolvedProps.notification!.icon!" />
|
|
19574
|
+
<ion-icon [name]="resolvedProps.notification!.icon!" aria-hidden="true" />
|
|
19527
19575
|
</div>
|
|
19528
19576
|
}
|
|
19529
19577
|
|
|
@@ -19545,7 +19593,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
19545
19593
|
[attr.aria-label]="action.ariaLabel || action.token"
|
|
19546
19594
|
(click)="onActionClick(action.token, $event)"
|
|
19547
19595
|
>
|
|
19548
|
-
<ion-icon [name]="action.icon" />
|
|
19596
|
+
<ion-icon [name]="action.icon" aria-hidden="true" />
|
|
19549
19597
|
</button>
|
|
19550
19598
|
}
|
|
19551
19599
|
</div>
|
|
@@ -19574,7 +19622,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
19574
19622
|
(keydown.space)="onPillClick($event)"
|
|
19575
19623
|
>
|
|
19576
19624
|
@if (resolvedProps.icon) {
|
|
19577
|
-
<ion-icon class="val-pill__icon" [name]="resolvedProps.icon" />
|
|
19625
|
+
<ion-icon class="val-pill__icon" [name]="resolvedProps.icon" aria-hidden="true" />
|
|
19578
19626
|
}
|
|
19579
19627
|
<span class="val-pill__label">{{ resolvedProps.label }}</span>
|
|
19580
19628
|
</span>
|
|
@@ -19804,9 +19852,7 @@ class AccordionComponent {
|
|
|
19804
19852
|
}
|
|
19805
19853
|
}
|
|
19806
19854
|
resolveProps() {
|
|
19807
|
-
const presetProps = this.preset
|
|
19808
|
-
? this.presets.get('accordion', this.preset)
|
|
19809
|
-
: {};
|
|
19855
|
+
const presetProps = this.preset ? this.presets.get('accordion', this.preset) : {};
|
|
19810
19856
|
this.resolvedProps = {
|
|
19811
19857
|
...presetProps,
|
|
19812
19858
|
...this.props,
|
|
@@ -19834,7 +19880,7 @@ class AccordionComponent {
|
|
|
19834
19880
|
<ion-accordion [value]="item.value" [disabled]="item.disabled">
|
|
19835
19881
|
<ion-item slot="header" [color]="resolvedProps.color || 'light'">
|
|
19836
19882
|
@if (item.icon) {
|
|
19837
|
-
<ion-icon [name]="item.icon" slot="start"></ion-icon>
|
|
19883
|
+
<ion-icon [name]="item.icon" slot="start" aria-hidden="true"></ion-icon>
|
|
19838
19884
|
}
|
|
19839
19885
|
<ion-label>{{ getItemHeader(item) }}</ion-label>
|
|
19840
19886
|
</ion-item>
|
|
@@ -19860,7 +19906,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
19860
19906
|
<ion-accordion [value]="item.value" [disabled]="item.disabled">
|
|
19861
19907
|
<ion-item slot="header" [color]="resolvedProps.color || 'light'">
|
|
19862
19908
|
@if (item.icon) {
|
|
19863
|
-
<ion-icon [name]="item.icon" slot="start"></ion-icon>
|
|
19909
|
+
<ion-icon [name]="item.icon" slot="start" aria-hidden="true"></ion-icon>
|
|
19864
19910
|
}
|
|
19865
19911
|
<ion-label>{{ getItemHeader(item) }}</ion-label>
|
|
19866
19912
|
</ion-item>
|
|
@@ -19929,9 +19975,7 @@ class TabsComponent {
|
|
|
19929
19975
|
* Explicit props take precedence over preset values.
|
|
19930
19976
|
*/
|
|
19931
19977
|
resolveProps() {
|
|
19932
|
-
const presetProps = this.preset
|
|
19933
|
-
? this.presets.get('tabs', this.preset)
|
|
19934
|
-
: {};
|
|
19978
|
+
const presetProps = this.preset ? this.presets.get('tabs', this.preset) : {};
|
|
19935
19979
|
this.resolvedProps = {
|
|
19936
19980
|
...presetProps,
|
|
19937
19981
|
...this.props,
|
|
@@ -19961,7 +20005,7 @@ class TabsComponent {
|
|
|
19961
20005
|
(click)="onTabClick(tab)"
|
|
19962
20006
|
>
|
|
19963
20007
|
@if (tab.icon && resolvedProps.layout !== 'icon-hide') {
|
|
19964
|
-
<ion-icon [name]="tab.icon"></ion-icon>
|
|
20008
|
+
<ion-icon [name]="tab.icon" aria-hidden="true"></ion-icon>
|
|
19965
20009
|
}
|
|
19966
20010
|
@if (getTabLabel(tab) && resolvedProps.layout !== 'label-hide') {
|
|
19967
20011
|
<ion-label>{{ getTabLabel(tab) }}</ion-label>
|
|
@@ -19991,7 +20035,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
19991
20035
|
(click)="onTabClick(tab)"
|
|
19992
20036
|
>
|
|
19993
20037
|
@if (tab.icon && resolvedProps.layout !== 'icon-hide') {
|
|
19994
|
-
<ion-icon [name]="tab.icon"></ion-icon>
|
|
20038
|
+
<ion-icon [name]="tab.icon" aria-hidden="true"></ion-icon>
|
|
19995
20039
|
}
|
|
19996
20040
|
@if (getTabLabel(tab) && resolvedProps.layout !== 'label-hide') {
|
|
19997
20041
|
<ion-label>{{ getTabLabel(tab) }}</ion-label>
|
|
@@ -20085,11 +20129,11 @@ class BreadcrumbComponent {
|
|
|
20085
20129
|
(click)="onBreadcrumbClick($event, item, $index)"
|
|
20086
20130
|
>
|
|
20087
20131
|
@if (item.icon) {
|
|
20088
|
-
<ion-icon [name]="item.icon" slot="start"></ion-icon>
|
|
20132
|
+
<ion-icon [name]="item.icon" slot="start" aria-hidden="true"></ion-icon>
|
|
20089
20133
|
}
|
|
20090
20134
|
{{ getItemLabel(item) }}
|
|
20091
20135
|
@if (!isLast && resolvedProps.separatorIcon) {
|
|
20092
|
-
<ion-icon [name]="resolvedProps.separatorIcon" slot="separator"></ion-icon>
|
|
20136
|
+
<ion-icon [name]="resolvedProps.separatorIcon" slot="separator" aria-hidden="true"></ion-icon>
|
|
20093
20137
|
}
|
|
20094
20138
|
</ion-breadcrumb>
|
|
20095
20139
|
}
|
|
@@ -20114,11 +20158,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
20114
20158
|
(click)="onBreadcrumbClick($event, item, $index)"
|
|
20115
20159
|
>
|
|
20116
20160
|
@if (item.icon) {
|
|
20117
|
-
<ion-icon [name]="item.icon" slot="start"></ion-icon>
|
|
20161
|
+
<ion-icon [name]="item.icon" slot="start" aria-hidden="true"></ion-icon>
|
|
20118
20162
|
}
|
|
20119
20163
|
{{ getItemLabel(item) }}
|
|
20120
20164
|
@if (!isLast && resolvedProps.separatorIcon) {
|
|
20121
|
-
<ion-icon [name]="resolvedProps.separatorIcon" slot="separator"></ion-icon>
|
|
20165
|
+
<ion-icon [name]="resolvedProps.separatorIcon" slot="separator" aria-hidden="true"></ion-icon>
|
|
20122
20166
|
}
|
|
20123
20167
|
</ion-breadcrumb>
|
|
20124
20168
|
}
|
|
@@ -20489,9 +20533,7 @@ class StepperComponent {
|
|
|
20489
20533
|
}
|
|
20490
20534
|
}
|
|
20491
20535
|
resolveProps() {
|
|
20492
|
-
const presetProps = this.preset
|
|
20493
|
-
? this.presets.get('stepper', this.preset)
|
|
20494
|
-
: {};
|
|
20536
|
+
const presetProps = this.preset ? this.presets.get('stepper', this.preset) : {};
|
|
20495
20537
|
this.resolvedProps = {
|
|
20496
20538
|
...presetProps,
|
|
20497
20539
|
...this.props,
|
|
@@ -20502,7 +20544,7 @@ class StepperComponent {
|
|
|
20502
20544
|
return this.resolvedProps.currentIndex;
|
|
20503
20545
|
}
|
|
20504
20546
|
if (this.resolvedProps.currentStep) {
|
|
20505
|
-
return this.resolvedProps.steps?.findIndex(
|
|
20547
|
+
return this.resolvedProps.steps?.findIndex(s => s.value === this.resolvedProps.currentStep) ?? 0;
|
|
20506
20548
|
}
|
|
20507
20549
|
return 0;
|
|
20508
20550
|
}
|
|
@@ -20577,15 +20619,15 @@ class StepperComponent {
|
|
|
20577
20619
|
<div class="step-indicator">
|
|
20578
20620
|
<div class="step-circle" [style.--step-color]="getStepColor(step, i)">
|
|
20579
20621
|
@if (getStepStatus(step, i) === 'completed') {
|
|
20580
|
-
<ion-icon name="checkmark"></ion-icon>
|
|
20622
|
+
<ion-icon name="checkmark" aria-hidden="true"></ion-icon>
|
|
20581
20623
|
} @else if (getStepStatus(step, i) === 'error') {
|
|
20582
|
-
<ion-icon name="close"></ion-icon>
|
|
20624
|
+
<ion-icon name="close" aria-hidden="true"></ion-icon>
|
|
20583
20625
|
} @else if (step.icon) {
|
|
20584
|
-
<ion-icon [name]="step.icon"></ion-icon>
|
|
20626
|
+
<ion-icon [name]="step.icon" aria-hidden="true"></ion-icon>
|
|
20585
20627
|
} @else if (resolvedProps.showNumbers !== false) {
|
|
20586
20628
|
<span class="step-number">{{ i + 1 }}</span>
|
|
20587
20629
|
} @else {
|
|
20588
|
-
<ion-icon name="ellipse"></ion-icon>
|
|
20630
|
+
<ion-icon name="ellipse" aria-hidden="true"></ion-icon>
|
|
20589
20631
|
}
|
|
20590
20632
|
</div>
|
|
20591
20633
|
@if (!isLast && resolvedProps.connectorStyle !== 'none') {
|
|
@@ -20637,15 +20679,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
20637
20679
|
<div class="step-indicator">
|
|
20638
20680
|
<div class="step-circle" [style.--step-color]="getStepColor(step, i)">
|
|
20639
20681
|
@if (getStepStatus(step, i) === 'completed') {
|
|
20640
|
-
<ion-icon name="checkmark"></ion-icon>
|
|
20682
|
+
<ion-icon name="checkmark" aria-hidden="true"></ion-icon>
|
|
20641
20683
|
} @else if (getStepStatus(step, i) === 'error') {
|
|
20642
|
-
<ion-icon name="close"></ion-icon>
|
|
20684
|
+
<ion-icon name="close" aria-hidden="true"></ion-icon>
|
|
20643
20685
|
} @else if (step.icon) {
|
|
20644
|
-
<ion-icon [name]="step.icon"></ion-icon>
|
|
20686
|
+
<ion-icon [name]="step.icon" aria-hidden="true"></ion-icon>
|
|
20645
20687
|
} @else if (resolvedProps.showNumbers !== false) {
|
|
20646
20688
|
<span class="step-number">{{ i + 1 }}</span>
|
|
20647
20689
|
} @else {
|
|
20648
|
-
<ion-icon name="ellipse"></ion-icon>
|
|
20690
|
+
<ion-icon name="ellipse" aria-hidden="true"></ion-icon>
|
|
20649
20691
|
}
|
|
20650
20692
|
</div>
|
|
20651
20693
|
@if (!isLast && resolvedProps.connectorStyle !== 'none') {
|
|
@@ -20746,9 +20788,7 @@ class ChipGroupComponent {
|
|
|
20746
20788
|
}
|
|
20747
20789
|
}
|
|
20748
20790
|
resolveProps() {
|
|
20749
|
-
const presetProps = this.preset
|
|
20750
|
-
? this.presets.get('chipGroup', this.preset)
|
|
20751
|
-
: {};
|
|
20791
|
+
const presetProps = this.preset ? this.presets.get('chipGroup', this.preset) : {};
|
|
20752
20792
|
this.resolvedProps = {
|
|
20753
20793
|
...presetProps,
|
|
20754
20794
|
...this.props,
|
|
@@ -20774,7 +20814,7 @@ class ChipGroupComponent {
|
|
|
20774
20814
|
}
|
|
20775
20815
|
else {
|
|
20776
20816
|
// Single selection: deselect all others
|
|
20777
|
-
this.resolvedProps.chips.forEach(
|
|
20817
|
+
this.resolvedProps.chips.forEach(c => {
|
|
20778
20818
|
c.selected = c.value === chip.value ? !c.selected : false;
|
|
20779
20819
|
});
|
|
20780
20820
|
}
|
|
@@ -20792,8 +20832,8 @@ class ChipGroupComponent {
|
|
|
20792
20832
|
}
|
|
20793
20833
|
}
|
|
20794
20834
|
emitSelectionChange() {
|
|
20795
|
-
const selected = this.resolvedProps.chips.filter(
|
|
20796
|
-
const values = selected.map(
|
|
20835
|
+
const selected = this.resolvedProps.chips.filter(c => c.selected);
|
|
20836
|
+
const values = selected.map(c => c.value);
|
|
20797
20837
|
this.selectionChange.emit({
|
|
20798
20838
|
selected: this.resolvedProps.multiple ? selected : selected[0],
|
|
20799
20839
|
values: this.resolvedProps.multiple ? values : values[0],
|
|
@@ -20815,14 +20855,19 @@ class ChipGroupComponent {
|
|
|
20815
20855
|
(keydown.space)="onChipKey($event, chip)"
|
|
20816
20856
|
>
|
|
20817
20857
|
@if (chip.icon) {
|
|
20818
|
-
<ion-icon [name]="chip.icon"></ion-icon>
|
|
20858
|
+
<ion-icon [name]="chip.icon" aria-hidden="true"></ion-icon>
|
|
20819
20859
|
}
|
|
20820
20860
|
@if (chip.selected && resolvedProps.selectable) {
|
|
20821
|
-
<ion-icon name="checkmark" class="selected-icon"></ion-icon>
|
|
20861
|
+
<ion-icon name="checkmark" class="selected-icon" aria-hidden="true"></ion-icon>
|
|
20822
20862
|
}
|
|
20823
20863
|
<ion-label>{{ getChipLabel(chip) }}</ion-label>
|
|
20824
20864
|
@if (resolvedProps.removable && !chip.disabled) {
|
|
20825
|
-
<button
|
|
20865
|
+
<button
|
|
20866
|
+
type="button"
|
|
20867
|
+
class="remove-button"
|
|
20868
|
+
[attr.aria-label]="removeLabel(chip)"
|
|
20869
|
+
(click)="onRemoveChip($event, chip)"
|
|
20870
|
+
>
|
|
20826
20871
|
<ion-icon name="close" class="remove-icon" aria-hidden="true"></ion-icon>
|
|
20827
20872
|
</button>
|
|
20828
20873
|
}
|
|
@@ -20848,14 +20893,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
20848
20893
|
(keydown.space)="onChipKey($event, chip)"
|
|
20849
20894
|
>
|
|
20850
20895
|
@if (chip.icon) {
|
|
20851
|
-
<ion-icon [name]="chip.icon"></ion-icon>
|
|
20896
|
+
<ion-icon [name]="chip.icon" aria-hidden="true"></ion-icon>
|
|
20852
20897
|
}
|
|
20853
20898
|
@if (chip.selected && resolvedProps.selectable) {
|
|
20854
|
-
<ion-icon name="checkmark" class="selected-icon"></ion-icon>
|
|
20899
|
+
<ion-icon name="checkmark" class="selected-icon" aria-hidden="true"></ion-icon>
|
|
20855
20900
|
}
|
|
20856
20901
|
<ion-label>{{ getChipLabel(chip) }}</ion-label>
|
|
20857
20902
|
@if (resolvedProps.removable && !chip.disabled) {
|
|
20858
|
-
<button
|
|
20903
|
+
<button
|
|
20904
|
+
type="button"
|
|
20905
|
+
class="remove-button"
|
|
20906
|
+
[attr.aria-label]="removeLabel(chip)"
|
|
20907
|
+
(click)="onRemoveChip($event, chip)"
|
|
20908
|
+
>
|
|
20859
20909
|
<ion-icon name="close" class="remove-icon" aria-hidden="true"></ion-icon>
|
|
20860
20910
|
</button>
|
|
20861
20911
|
}
|
|
@@ -21326,7 +21376,7 @@ class StatsCardComponent {
|
|
|
21326
21376
|
<div class="stats-header">
|
|
21327
21377
|
<span class="stats-title">{{ resolvedProps.title }}</span>
|
|
21328
21378
|
@if (resolvedProps.icon) {
|
|
21329
|
-
<ion-icon [name]="resolvedProps.icon" class="stats-icon"></ion-icon>
|
|
21379
|
+
<ion-icon [name]="resolvedProps.icon" class="stats-icon" aria-hidden="true"></ion-icon>
|
|
21330
21380
|
}
|
|
21331
21381
|
</div>
|
|
21332
21382
|
|
|
@@ -21346,7 +21396,7 @@ class StatsCardComponent {
|
|
|
21346
21396
|
|
|
21347
21397
|
@if (resolvedProps.trend && !resolvedProps.loading) {
|
|
21348
21398
|
<div class="stats-trend" [class]="getTrendClass()">
|
|
21349
|
-
<ion-icon [name]="getTrendIcon()"></ion-icon>
|
|
21399
|
+
<ion-icon [name]="getTrendIcon()" aria-hidden="true"></ion-icon>
|
|
21350
21400
|
<span class="trend-value">{{ Math.abs(resolvedProps.trend.value) }}%</span>
|
|
21351
21401
|
@if (resolvedProps.trend.label) {
|
|
21352
21402
|
<span class="trend-label">{{ resolvedProps.trend.label }}</span>
|
|
@@ -21390,7 +21440,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
21390
21440
|
<div class="stats-header">
|
|
21391
21441
|
<span class="stats-title">{{ resolvedProps.title }}</span>
|
|
21392
21442
|
@if (resolvedProps.icon) {
|
|
21393
|
-
<ion-icon [name]="resolvedProps.icon" class="stats-icon"></ion-icon>
|
|
21443
|
+
<ion-icon [name]="resolvedProps.icon" class="stats-icon" aria-hidden="true"></ion-icon>
|
|
21394
21444
|
}
|
|
21395
21445
|
</div>
|
|
21396
21446
|
|
|
@@ -21410,7 +21460,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
21410
21460
|
|
|
21411
21461
|
@if (resolvedProps.trend && !resolvedProps.loading) {
|
|
21412
21462
|
<div class="stats-trend" [class]="getTrendClass()">
|
|
21413
|
-
<ion-icon [name]="getTrendIcon()"></ion-icon>
|
|
21463
|
+
<ion-icon [name]="getTrendIcon()" aria-hidden="true"></ion-icon>
|
|
21414
21464
|
<span class="trend-value">{{ Math.abs(resolvedProps.trend.value) }}%</span>
|
|
21415
21465
|
@if (resolvedProps.trend.label) {
|
|
21416
21466
|
<span class="trend-label">{{ resolvedProps.trend.label }}</span>
|
|
@@ -21540,7 +21590,7 @@ class CommentComponent {
|
|
|
21540
21590
|
getInitials(name) {
|
|
21541
21591
|
return name
|
|
21542
21592
|
.split(' ')
|
|
21543
|
-
.map(
|
|
21593
|
+
.map(n => n[0])
|
|
21544
21594
|
.join('')
|
|
21545
21595
|
.substring(0, 2)
|
|
21546
21596
|
.toUpperCase();
|
|
@@ -21625,8 +21675,8 @@ class CommentComponent {
|
|
|
21625
21675
|
return item.label || item.contentFallback || '';
|
|
21626
21676
|
}
|
|
21627
21677
|
hasChildren() {
|
|
21628
|
-
return !!(this.props.children && this.props.children.length > 0) ||
|
|
21629
|
-
!!(this.props.replyCount && this.props.replyCount > 0);
|
|
21678
|
+
return (!!(this.props.children && this.props.children.length > 0) ||
|
|
21679
|
+
!!(this.props.replyCount && this.props.replyCount > 0));
|
|
21630
21680
|
}
|
|
21631
21681
|
canShowChildren() {
|
|
21632
21682
|
const maxDepth = this.props.maxDepth ?? 3;
|
|
@@ -21699,7 +21749,7 @@ class CommentComponent {
|
|
|
21699
21749
|
>
|
|
21700
21750
|
@if (props.pinned) {
|
|
21701
21751
|
<div class="pinned-indicator">
|
|
21702
|
-
<ion-icon name="pin"></ion-icon>
|
|
21752
|
+
<ion-icon name="pin" aria-hidden="true"></ion-icon>
|
|
21703
21753
|
<span>{{ i18n.t('pinned') }}</span>
|
|
21704
21754
|
</div>
|
|
21705
21755
|
}
|
|
@@ -21720,7 +21770,7 @@ class CommentComponent {
|
|
|
21720
21770
|
<button type="button" class="author-info" [attr.aria-label]="authorLabel()" (click)="onAuthorClick()">
|
|
21721
21771
|
<span class="author-name">{{ props.author.name }}</span>
|
|
21722
21772
|
@if (props.author.verified) {
|
|
21723
|
-
<ion-icon name="checkmark-circle" class="verified-badge"></ion-icon>
|
|
21773
|
+
<ion-icon name="checkmark-circle" class="verified-badge" aria-hidden="true"></ion-icon>
|
|
21724
21774
|
}
|
|
21725
21775
|
@if (props.author.username) {
|
|
21726
21776
|
<span class="author-username">@{{ props.author.username }}</span>
|
|
@@ -21740,14 +21790,12 @@ class CommentComponent {
|
|
|
21740
21790
|
size="small"
|
|
21741
21791
|
class="more-button"
|
|
21742
21792
|
[id]="'menu-trigger-' + props.token"
|
|
21793
|
+
[attr.aria-label]="'Más opciones'"
|
|
21743
21794
|
>
|
|
21744
|
-
<ion-icon name="ellipsis-horizontal" slot="icon-only"></ion-icon>
|
|
21795
|
+
<ion-icon name="ellipsis-horizontal" slot="icon-only" aria-hidden="true"></ion-icon>
|
|
21745
21796
|
</ion-button>
|
|
21746
21797
|
|
|
21747
|
-
<ion-popover
|
|
21748
|
-
[trigger]="'menu-trigger-' + props.token"
|
|
21749
|
-
[dismissOnSelect]="true"
|
|
21750
|
-
>
|
|
21798
|
+
<ion-popover [trigger]="'menu-trigger-' + props.token" [dismissOnSelect]="true">
|
|
21751
21799
|
<ng-template>
|
|
21752
21800
|
<ion-list>
|
|
21753
21801
|
@for (item of props.menuItems; track item.token) {
|
|
@@ -21761,11 +21809,7 @@ class CommentComponent {
|
|
|
21761
21809
|
(click)="onMenuItemClick(item)"
|
|
21762
21810
|
>
|
|
21763
21811
|
@if (item.icon) {
|
|
21764
|
-
<ion-icon
|
|
21765
|
-
[name]="item.icon"
|
|
21766
|
-
slot="start"
|
|
21767
|
-
[color]="item.color"
|
|
21768
|
-
></ion-icon>
|
|
21812
|
+
<ion-icon [name]="item.icon" slot="start" [color]="item.color" aria-hidden="true"></ion-icon>
|
|
21769
21813
|
}
|
|
21770
21814
|
<ion-label [color]="item.color">
|
|
21771
21815
|
{{ getMenuItemLabel(item) }}
|
|
@@ -21779,10 +21823,7 @@ class CommentComponent {
|
|
|
21779
21823
|
</div>
|
|
21780
21824
|
|
|
21781
21825
|
@if (!props.collapsed) {
|
|
21782
|
-
<div
|
|
21783
|
-
class="comment-content"
|
|
21784
|
-
[innerHTML]="processContent(displayContent)"
|
|
21785
|
-
></div>
|
|
21826
|
+
<div class="comment-content" [innerHTML]="processContent(displayContent)"></div>
|
|
21786
21827
|
|
|
21787
21828
|
@if (props.reactions && props.reactions.length > 0) {
|
|
21788
21829
|
<div class="comment-reactions">
|
|
@@ -21793,7 +21834,7 @@ class CommentComponent {
|
|
|
21793
21834
|
[style.--reaction-color]="getReactionColor(reaction)"
|
|
21794
21835
|
(click)="onReactionClick(reaction)"
|
|
21795
21836
|
>
|
|
21796
|
-
<ion-icon [name]="reaction.icon"></ion-icon>
|
|
21837
|
+
<ion-icon [name]="reaction.icon" aria-hidden="true"></ion-icon>
|
|
21797
21838
|
@if (reaction.count > 0) {
|
|
21798
21839
|
<span class="reaction-count">{{ formatCount(reaction.count) }}</span>
|
|
21799
21840
|
}
|
|
@@ -21813,7 +21854,7 @@ class CommentComponent {
|
|
|
21813
21854
|
(click)="onActionClick(action)"
|
|
21814
21855
|
>
|
|
21815
21856
|
@if (action.icon) {
|
|
21816
|
-
<ion-icon [name]="action.icon" slot="start"></ion-icon>
|
|
21857
|
+
<ion-icon [name]="action.icon" slot="start" aria-hidden="true"></ion-icon>
|
|
21817
21858
|
}
|
|
21818
21859
|
{{ getActionLabel(action) }}
|
|
21819
21860
|
</ion-button>
|
|
@@ -21822,7 +21863,7 @@ class CommentComponent {
|
|
|
21822
21863
|
}
|
|
21823
21864
|
} @else {
|
|
21824
21865
|
<button class="expand-button" (click)="onToggleCollapse()">
|
|
21825
|
-
<ion-icon name="chevron-down"></ion-icon>
|
|
21866
|
+
<ion-icon name="chevron-down" aria-hidden="true"></ion-icon>
|
|
21826
21867
|
<span>{{ i18n.t('showComment') }}</span>
|
|
21827
21868
|
</button>
|
|
21828
21869
|
}
|
|
@@ -21833,7 +21874,7 @@ class CommentComponent {
|
|
|
21833
21874
|
<div class="comment-children">
|
|
21834
21875
|
@if (props.collapsed) {
|
|
21835
21876
|
<button class="collapse-button" (click)="onToggleCollapse()">
|
|
21836
|
-
<ion-icon name="chevron-up"></ion-icon>
|
|
21877
|
+
<ion-icon name="chevron-up" aria-hidden="true"></ion-icon>
|
|
21837
21878
|
<span>{{ i18n.t('hideReplies') }}</span>
|
|
21838
21879
|
</button>
|
|
21839
21880
|
}
|
|
@@ -21853,7 +21894,7 @@ class CommentComponent {
|
|
|
21853
21894
|
|
|
21854
21895
|
@if (hasMoreReplies()) {
|
|
21855
21896
|
<button class="load-more-button" (click)="onLoadMoreClick()">
|
|
21856
|
-
<ion-icon name="chatbubble-outline"></ion-icon>
|
|
21897
|
+
<ion-icon name="chatbubble-outline" aria-hidden="true"></ion-icon>
|
|
21857
21898
|
<span>{{ getLoadMoreRepliesText() }}</span>
|
|
21858
21899
|
</button>
|
|
21859
21900
|
}
|
|
@@ -21870,16 +21911,7 @@ class CommentComponent {
|
|
|
21870
21911
|
}
|
|
21871
21912
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CommentComponent, decorators: [{
|
|
21872
21913
|
type: Component,
|
|
21873
|
-
args: [{ selector: 'val-comment', standalone: true, imports: [
|
|
21874
|
-
CommonModule,
|
|
21875
|
-
IonIcon,
|
|
21876
|
-
IonButton,
|
|
21877
|
-
IonPopover,
|
|
21878
|
-
IonList,
|
|
21879
|
-
IonItem,
|
|
21880
|
-
IonLabel,
|
|
21881
|
-
AvatarComponent,
|
|
21882
|
-
], template: `
|
|
21914
|
+
args: [{ selector: 'val-comment', standalone: true, imports: [CommonModule, IonIcon, IonButton, IonPopover, IonList, IonItem, IonLabel, AvatarComponent], template: `
|
|
21883
21915
|
<div
|
|
21884
21916
|
class="comment"
|
|
21885
21917
|
[class.highlighted]="props.highlighted"
|
|
@@ -21889,7 +21921,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
21889
21921
|
>
|
|
21890
21922
|
@if (props.pinned) {
|
|
21891
21923
|
<div class="pinned-indicator">
|
|
21892
|
-
<ion-icon name="pin"></ion-icon>
|
|
21924
|
+
<ion-icon name="pin" aria-hidden="true"></ion-icon>
|
|
21893
21925
|
<span>{{ i18n.t('pinned') }}</span>
|
|
21894
21926
|
</div>
|
|
21895
21927
|
}
|
|
@@ -21910,7 +21942,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
21910
21942
|
<button type="button" class="author-info" [attr.aria-label]="authorLabel()" (click)="onAuthorClick()">
|
|
21911
21943
|
<span class="author-name">{{ props.author.name }}</span>
|
|
21912
21944
|
@if (props.author.verified) {
|
|
21913
|
-
<ion-icon name="checkmark-circle" class="verified-badge"></ion-icon>
|
|
21945
|
+
<ion-icon name="checkmark-circle" class="verified-badge" aria-hidden="true"></ion-icon>
|
|
21914
21946
|
}
|
|
21915
21947
|
@if (props.author.username) {
|
|
21916
21948
|
<span class="author-username">@{{ props.author.username }}</span>
|
|
@@ -21930,14 +21962,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
21930
21962
|
size="small"
|
|
21931
21963
|
class="more-button"
|
|
21932
21964
|
[id]="'menu-trigger-' + props.token"
|
|
21965
|
+
[attr.aria-label]="'Más opciones'"
|
|
21933
21966
|
>
|
|
21934
|
-
<ion-icon name="ellipsis-horizontal" slot="icon-only"></ion-icon>
|
|
21967
|
+
<ion-icon name="ellipsis-horizontal" slot="icon-only" aria-hidden="true"></ion-icon>
|
|
21935
21968
|
</ion-button>
|
|
21936
21969
|
|
|
21937
|
-
<ion-popover
|
|
21938
|
-
[trigger]="'menu-trigger-' + props.token"
|
|
21939
|
-
[dismissOnSelect]="true"
|
|
21940
|
-
>
|
|
21970
|
+
<ion-popover [trigger]="'menu-trigger-' + props.token" [dismissOnSelect]="true">
|
|
21941
21971
|
<ng-template>
|
|
21942
21972
|
<ion-list>
|
|
21943
21973
|
@for (item of props.menuItems; track item.token) {
|
|
@@ -21951,11 +21981,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
21951
21981
|
(click)="onMenuItemClick(item)"
|
|
21952
21982
|
>
|
|
21953
21983
|
@if (item.icon) {
|
|
21954
|
-
<ion-icon
|
|
21955
|
-
[name]="item.icon"
|
|
21956
|
-
slot="start"
|
|
21957
|
-
[color]="item.color"
|
|
21958
|
-
></ion-icon>
|
|
21984
|
+
<ion-icon [name]="item.icon" slot="start" [color]="item.color" aria-hidden="true"></ion-icon>
|
|
21959
21985
|
}
|
|
21960
21986
|
<ion-label [color]="item.color">
|
|
21961
21987
|
{{ getMenuItemLabel(item) }}
|
|
@@ -21969,10 +21995,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
21969
21995
|
</div>
|
|
21970
21996
|
|
|
21971
21997
|
@if (!props.collapsed) {
|
|
21972
|
-
<div
|
|
21973
|
-
class="comment-content"
|
|
21974
|
-
[innerHTML]="processContent(displayContent)"
|
|
21975
|
-
></div>
|
|
21998
|
+
<div class="comment-content" [innerHTML]="processContent(displayContent)"></div>
|
|
21976
21999
|
|
|
21977
22000
|
@if (props.reactions && props.reactions.length > 0) {
|
|
21978
22001
|
<div class="comment-reactions">
|
|
@@ -21983,7 +22006,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
21983
22006
|
[style.--reaction-color]="getReactionColor(reaction)"
|
|
21984
22007
|
(click)="onReactionClick(reaction)"
|
|
21985
22008
|
>
|
|
21986
|
-
<ion-icon [name]="reaction.icon"></ion-icon>
|
|
22009
|
+
<ion-icon [name]="reaction.icon" aria-hidden="true"></ion-icon>
|
|
21987
22010
|
@if (reaction.count > 0) {
|
|
21988
22011
|
<span class="reaction-count">{{ formatCount(reaction.count) }}</span>
|
|
21989
22012
|
}
|
|
@@ -22003,7 +22026,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
22003
22026
|
(click)="onActionClick(action)"
|
|
22004
22027
|
>
|
|
22005
22028
|
@if (action.icon) {
|
|
22006
|
-
<ion-icon [name]="action.icon" slot="start"></ion-icon>
|
|
22029
|
+
<ion-icon [name]="action.icon" slot="start" aria-hidden="true"></ion-icon>
|
|
22007
22030
|
}
|
|
22008
22031
|
{{ getActionLabel(action) }}
|
|
22009
22032
|
</ion-button>
|
|
@@ -22012,7 +22035,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
22012
22035
|
}
|
|
22013
22036
|
} @else {
|
|
22014
22037
|
<button class="expand-button" (click)="onToggleCollapse()">
|
|
22015
|
-
<ion-icon name="chevron-down"></ion-icon>
|
|
22038
|
+
<ion-icon name="chevron-down" aria-hidden="true"></ion-icon>
|
|
22016
22039
|
<span>{{ i18n.t('showComment') }}</span>
|
|
22017
22040
|
</button>
|
|
22018
22041
|
}
|
|
@@ -22023,7 +22046,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
22023
22046
|
<div class="comment-children">
|
|
22024
22047
|
@if (props.collapsed) {
|
|
22025
22048
|
<button class="collapse-button" (click)="onToggleCollapse()">
|
|
22026
|
-
<ion-icon name="chevron-up"></ion-icon>
|
|
22049
|
+
<ion-icon name="chevron-up" aria-hidden="true"></ion-icon>
|
|
22027
22050
|
<span>{{ i18n.t('hideReplies') }}</span>
|
|
22028
22051
|
</button>
|
|
22029
22052
|
}
|
|
@@ -22043,7 +22066,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
22043
22066
|
|
|
22044
22067
|
@if (hasMoreReplies()) {
|
|
22045
22068
|
<button class="load-more-button" (click)="onLoadMoreClick()">
|
|
22046
|
-
<ion-icon name="chatbubble-outline"></ion-icon>
|
|
22069
|
+
<ion-icon name="chatbubble-outline" aria-hidden="true"></ion-icon>
|
|
22047
22070
|
<span>{{ getLoadMoreRepliesText() }}</span>
|
|
22048
22071
|
</button>
|
|
22049
22072
|
}
|
|
@@ -23882,7 +23905,7 @@ class DateRangeInputComponent {
|
|
|
23882
23905
|
|
|
23883
23906
|
<!-- Separator -->
|
|
23884
23907
|
<div class="date-separator">
|
|
23885
|
-
<ion-icon name="arrow-forward-outline"></ion-icon>
|
|
23908
|
+
<ion-icon name="arrow-forward-outline" aria-hidden="true"></ion-icon>
|
|
23886
23909
|
</div>
|
|
23887
23910
|
|
|
23888
23911
|
<!-- End Date -->
|
|
@@ -23916,9 +23939,7 @@ class DateRangeInputComponent {
|
|
|
23916
23939
|
</div>
|
|
23917
23940
|
|
|
23918
23941
|
@if (showDayCount && dayCount !== null) {
|
|
23919
|
-
<div class="day-count">
|
|
23920
|
-
{{ dayCount }} {{ getDayLabel() }}
|
|
23921
|
-
</div>
|
|
23942
|
+
<div class="day-count">{{ dayCount }} {{ getDayLabel() }}</div>
|
|
23922
23943
|
}
|
|
23923
23944
|
|
|
23924
23945
|
@if (props.hint && !hasError) {
|
|
@@ -23980,7 +24001,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
23980
24001
|
|
|
23981
24002
|
<!-- Separator -->
|
|
23982
24003
|
<div class="date-separator">
|
|
23983
|
-
<ion-icon name="arrow-forward-outline"></ion-icon>
|
|
24004
|
+
<ion-icon name="arrow-forward-outline" aria-hidden="true"></ion-icon>
|
|
23984
24005
|
</div>
|
|
23985
24006
|
|
|
23986
24007
|
<!-- End Date -->
|
|
@@ -24014,9 +24035,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
24014
24035
|
</div>
|
|
24015
24036
|
|
|
24016
24037
|
@if (showDayCount && dayCount !== null) {
|
|
24017
|
-
<div class="day-count">
|
|
24018
|
-
{{ dayCount }} {{ getDayLabel() }}
|
|
24019
|
-
</div>
|
|
24038
|
+
<div class="day-count">{{ dayCount }} {{ getDayLabel() }}</div>
|
|
24020
24039
|
}
|
|
24021
24040
|
|
|
24022
24041
|
@if (props.hint && !hasError) {
|
|
@@ -24703,6 +24722,7 @@ class ShareButtonsComponent {
|
|
|
24703
24722
|
<ion-icon
|
|
24704
24723
|
[slot]="props.showLabels === false || props.variant === 'icon-only' ? 'icon-only' : 'start'"
|
|
24705
24724
|
[name]="getButtonIcon(button)"
|
|
24725
|
+
aria-hidden="true"
|
|
24706
24726
|
></ion-icon>
|
|
24707
24727
|
@if (props.showLabels !== false && props.variant !== 'icon-only') {
|
|
24708
24728
|
{{ getButtonLabel(button) }}
|
|
@@ -24744,6 +24764,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
24744
24764
|
<ion-icon
|
|
24745
24765
|
[slot]="props.showLabels === false || props.variant === 'icon-only' ? 'icon-only' : 'start'"
|
|
24746
24766
|
[name]="getButtonIcon(button)"
|
|
24767
|
+
aria-hidden="true"
|
|
24747
24768
|
></ion-icon>
|
|
24748
24769
|
@if (props.showLabels !== false && props.variant !== 'icon-only') {
|
|
24749
24770
|
{{ getButtonLabel(button) }}
|
|
@@ -24794,9 +24815,7 @@ class GlowCardComponent {
|
|
|
24794
24815
|
}
|
|
24795
24816
|
}
|
|
24796
24817
|
resolveProps() {
|
|
24797
|
-
const presetProps = this.preset
|
|
24798
|
-
? this.presets.get('glowCard', this.preset)
|
|
24799
|
-
: {};
|
|
24818
|
+
const presetProps = this.preset ? this.presets.get('glowCard', this.preset) : {};
|
|
24800
24819
|
this.resolvedProps = {
|
|
24801
24820
|
...presetProps,
|
|
24802
24821
|
...this.props,
|
|
@@ -24810,7 +24829,17 @@ class GlowCardComponent {
|
|
|
24810
24829
|
this.i18n = inject(I18nService);
|
|
24811
24830
|
this.navigationService = inject(NavigationService);
|
|
24812
24831
|
this.themeService = inject(ThemeService);
|
|
24813
|
-
this.ionicColors = [
|
|
24832
|
+
this.ionicColors = [
|
|
24833
|
+
'primary',
|
|
24834
|
+
'secondary',
|
|
24835
|
+
'tertiary',
|
|
24836
|
+
'success',
|
|
24837
|
+
'warning',
|
|
24838
|
+
'danger',
|
|
24839
|
+
'light',
|
|
24840
|
+
'medium',
|
|
24841
|
+
'dark',
|
|
24842
|
+
];
|
|
24814
24843
|
// RGB values with SPACE separator for CSS rgb(var() / alpha) syntax
|
|
24815
24844
|
this.colorRgbMap = {
|
|
24816
24845
|
primary: '112 38 223',
|
|
@@ -24976,15 +25005,12 @@ class GlowCardComponent {
|
|
|
24976
25005
|
</p>
|
|
24977
25006
|
|
|
24978
25007
|
<!-- CTA Link with expanding animation -->
|
|
24979
|
-
<a
|
|
24980
|
-
class="glow-card__cta"
|
|
24981
|
-
[href]="resolvedProps.cta?.url"
|
|
24982
|
-
(click)="onCtaClick($event)"
|
|
24983
|
-
>
|
|
25008
|
+
<a class="glow-card__cta" [href]="resolvedProps.cta?.url" (click)="onCtaClick($event)">
|
|
24984
25009
|
<span class="glow-card__cta-text">{{ getCtaText() }}</span>
|
|
24985
25010
|
<ion-icon
|
|
24986
25011
|
class="glow-card__cta-icon"
|
|
24987
25012
|
[name]="resolvedProps.cta?.icon || 'arrow-forward-outline'"
|
|
25013
|
+
aria-hidden="true"
|
|
24988
25014
|
></ion-icon>
|
|
24989
25015
|
</a>
|
|
24990
25016
|
</div>
|
|
@@ -25040,15 +25066,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
25040
25066
|
</p>
|
|
25041
25067
|
|
|
25042
25068
|
<!-- CTA Link with expanding animation -->
|
|
25043
|
-
<a
|
|
25044
|
-
class="glow-card__cta"
|
|
25045
|
-
[href]="resolvedProps.cta?.url"
|
|
25046
|
-
(click)="onCtaClick($event)"
|
|
25047
|
-
>
|
|
25069
|
+
<a class="glow-card__cta" [href]="resolvedProps.cta?.url" (click)="onCtaClick($event)">
|
|
25048
25070
|
<span class="glow-card__cta-text">{{ getCtaText() }}</span>
|
|
25049
25071
|
<ion-icon
|
|
25050
25072
|
class="glow-card__cta-icon"
|
|
25051
25073
|
[name]="resolvedProps.cta?.icon || 'arrow-forward-outline'"
|
|
25074
|
+
aria-hidden="true"
|
|
25052
25075
|
></ion-icon>
|
|
25053
25076
|
</a>
|
|
25054
25077
|
</div>
|
|
@@ -25574,7 +25597,7 @@ class FeaturesListComponent {
|
|
|
25574
25597
|
<path [attr.d]="feature.svgPath" />
|
|
25575
25598
|
</svg>
|
|
25576
25599
|
} @else if (feature.icon) {
|
|
25577
|
-
<ion-icon [name]="feature.icon" [style.font-size.px]="config().iconSize"></ion-icon>
|
|
25600
|
+
<ion-icon [name]="feature.icon" [style.font-size.px]="config().iconSize" aria-hidden="true"></ion-icon>
|
|
25578
25601
|
}
|
|
25579
25602
|
</div>
|
|
25580
25603
|
<div class="feature__content">
|
|
@@ -25611,7 +25634,7 @@ class FeaturesListComponent {
|
|
|
25611
25634
|
<path [attr.d]="feature.svgPath" />
|
|
25612
25635
|
</svg>
|
|
25613
25636
|
} @else if (feature.icon) {
|
|
25614
|
-
<ion-icon [name]="feature.icon" [style.font-size.px]="config().iconSize"></ion-icon>
|
|
25637
|
+
<ion-icon [name]="feature.icon" [style.font-size.px]="config().iconSize" aria-hidden="true"></ion-icon>
|
|
25615
25638
|
}
|
|
25616
25639
|
</div>
|
|
25617
25640
|
<div class="feature__content">
|
|
@@ -25683,7 +25706,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
25683
25706
|
<path [attr.d]="feature.svgPath" />
|
|
25684
25707
|
</svg>
|
|
25685
25708
|
} @else if (feature.icon) {
|
|
25686
|
-
<ion-icon [name]="feature.icon" [style.font-size.px]="config().iconSize"></ion-icon>
|
|
25709
|
+
<ion-icon [name]="feature.icon" [style.font-size.px]="config().iconSize" aria-hidden="true"></ion-icon>
|
|
25687
25710
|
}
|
|
25688
25711
|
</div>
|
|
25689
25712
|
<div class="feature__content">
|
|
@@ -25720,7 +25743,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
25720
25743
|
<path [attr.d]="feature.svgPath" />
|
|
25721
25744
|
</svg>
|
|
25722
25745
|
} @else if (feature.icon) {
|
|
25723
|
-
<ion-icon [name]="feature.icon" [style.font-size.px]="config().iconSize"></ion-icon>
|
|
25746
|
+
<ion-icon [name]="feature.icon" [style.font-size.px]="config().iconSize" aria-hidden="true"></ion-icon>
|
|
25724
25747
|
}
|
|
25725
25748
|
</div>
|
|
25726
25749
|
<div class="feature__content">
|
|
@@ -27592,7 +27615,7 @@ class ActionCardComponent {
|
|
|
27592
27615
|
<!-- Icon Container -->
|
|
27593
27616
|
<div class="action-card__icon" [style.color]="getIconColor()" [style.background-color]="getIconBackgroundColor()">
|
|
27594
27617
|
@if (config().icon?.ionicon) {
|
|
27595
|
-
<ion-icon [name]="config().icon!.ionicon!"></ion-icon>
|
|
27618
|
+
<ion-icon [name]="config().icon!.ionicon!" aria-hidden="true"></ion-icon>
|
|
27596
27619
|
} @else if (config().icon?.svgPath) {
|
|
27597
27620
|
<svg
|
|
27598
27621
|
viewBox="0 0 24 24"
|
|
@@ -27619,7 +27642,7 @@ class ActionCardComponent {
|
|
|
27619
27642
|
|
|
27620
27643
|
<!-- Chevron (optional) -->
|
|
27621
27644
|
@if (config().showChevron && !config().disabled) {
|
|
27622
|
-
<ion-icon name="chevron-forward-outline" class="action-card__chevron"></ion-icon>
|
|
27645
|
+
<ion-icon name="chevron-forward-outline" class="action-card__chevron" aria-hidden="true"></ion-icon>
|
|
27623
27646
|
}
|
|
27624
27647
|
</article>
|
|
27625
27648
|
`, isInline: true, styles: [":host{display:flex;flex-direction:column}.action-card{position:relative;display:flex;align-items:center;flex:1;gap:1rem;padding:1rem;background:var(--card-bg, var(--ion-card-background, var(--ion-background-color)));border-radius:12px;cursor:pointer;transition:transform .2s ease,box-shadow .2s ease,background-color .2s ease;text-decoration:none;overflow:hidden;--ripple-color: var(--ion-color-primary)}.action-card--small{padding:.75rem;gap:.75rem}.action-card--small .action-card__icon{width:36px;height:36px;font-size:1.125rem;border-radius:8px}.action-card--small .action-card__icon svg{width:18px;height:18px}.action-card--small .action-card__title{font-size:.9rem}.action-card--small .action-card__description{font-size:.8rem}.action-card--medium{padding:1rem;gap:1rem}.action-card--medium .action-card__icon{width:48px;height:48px;font-size:1.5rem;border-radius:10px}.action-card--medium .action-card__icon svg{width:24px;height:24px}.action-card--medium .action-card__title{font-size:1rem}.action-card--medium .action-card__description{font-size:.875rem}.action-card--large{padding:1.25rem;gap:1.25rem}.action-card--large .action-card__icon{width:56px;height:56px;font-size:1.75rem;border-radius:12px}.action-card--large .action-card__icon svg{width:28px;height:28px}.action-card--large .action-card__title{font-size:1.1rem}.action-card--large .action-card__description{font-size:.9rem}.action-card--bordered{border:1px solid var(--card-border-color, var(--ion-color-light-shade))}.action-card--shadowed{box-shadow:0 2px 8px #00000014}.action-card--clickable:hover{transform:translateY(-2px);box-shadow:0 4px 16px #0000001f}.action-card--clickable:focus-visible{outline:2px solid var(--ion-color-primary);outline-offset:2px}.action-card--clickable:active{transform:translateY(0)}.action-card--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.action-card__badge{position:absolute;top:8px;right:8px;padding:2px 8px;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;border-radius:10px;z-index:1}.action-card__icon{flex-shrink:0;display:flex;align-items:center;justify-content:center}.action-card__icon ion-icon{font-size:inherit}.action-card__icon svg{display:block}.action-card__icon-image{width:100%;height:100%;object-fit:cover;border-radius:8px}.action-card__content{flex:1;min-width:0}.action-card__title{margin:0 0 .25rem;font-weight:600;color:var(--ion-text-color);line-height:1.3}.action-card__description{margin:0;color:var(--ion-color-medium);line-height:1.4}.action-card__chevron{flex-shrink:0;font-size:1.25rem;color:var(--ion-color-medium);transition:transform .2s ease}.action-card--clickable:hover .action-card__chevron{transform:translate(4px)}:host-context(.dark) .action-card--shadowed,:host-context(.ion-palette-dark) .action-card--shadowed,:host-context(html.ion-palette-dark) .action-card--shadowed,:host-context(body.dark) .action-card--shadowed,:host-context([data-theme=dark]) .action-card--shadowed{box-shadow:0 2px 8px #0000004d}:host-context(.dark) .action-card--clickable:hover,:host-context(.ion-palette-dark) .action-card--clickable:hover,:host-context(html.ion-palette-dark) .action-card--clickable:hover,:host-context(body.dark) .action-card--clickable:hover,:host-context([data-theme=dark]) .action-card--clickable:hover{box-shadow:0 4px 16px #0006}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonRippleEffect, selector: "ion-ripple-effect", inputs: ["type"] }] }); }
|
|
@@ -27660,7 +27683,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
27660
27683
|
<!-- Icon Container -->
|
|
27661
27684
|
<div class="action-card__icon" [style.color]="getIconColor()" [style.background-color]="getIconBackgroundColor()">
|
|
27662
27685
|
@if (config().icon?.ionicon) {
|
|
27663
|
-
<ion-icon [name]="config().icon!.ionicon!"></ion-icon>
|
|
27686
|
+
<ion-icon [name]="config().icon!.ionicon!" aria-hidden="true"></ion-icon>
|
|
27664
27687
|
} @else if (config().icon?.svgPath) {
|
|
27665
27688
|
<svg
|
|
27666
27689
|
viewBox="0 0 24 24"
|
|
@@ -27687,7 +27710,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
27687
27710
|
|
|
27688
27711
|
<!-- Chevron (optional) -->
|
|
27689
27712
|
@if (config().showChevron && !config().disabled) {
|
|
27690
|
-
<ion-icon name="chevron-forward-outline" class="action-card__chevron"></ion-icon>
|
|
27713
|
+
<ion-icon name="chevron-forward-outline" class="action-card__chevron" aria-hidden="true"></ion-icon>
|
|
27691
27714
|
}
|
|
27692
27715
|
</article>
|
|
27693
27716
|
`, styles: [":host{display:flex;flex-direction:column}.action-card{position:relative;display:flex;align-items:center;flex:1;gap:1rem;padding:1rem;background:var(--card-bg, var(--ion-card-background, var(--ion-background-color)));border-radius:12px;cursor:pointer;transition:transform .2s ease,box-shadow .2s ease,background-color .2s ease;text-decoration:none;overflow:hidden;--ripple-color: var(--ion-color-primary)}.action-card--small{padding:.75rem;gap:.75rem}.action-card--small .action-card__icon{width:36px;height:36px;font-size:1.125rem;border-radius:8px}.action-card--small .action-card__icon svg{width:18px;height:18px}.action-card--small .action-card__title{font-size:.9rem}.action-card--small .action-card__description{font-size:.8rem}.action-card--medium{padding:1rem;gap:1rem}.action-card--medium .action-card__icon{width:48px;height:48px;font-size:1.5rem;border-radius:10px}.action-card--medium .action-card__icon svg{width:24px;height:24px}.action-card--medium .action-card__title{font-size:1rem}.action-card--medium .action-card__description{font-size:.875rem}.action-card--large{padding:1.25rem;gap:1.25rem}.action-card--large .action-card__icon{width:56px;height:56px;font-size:1.75rem;border-radius:12px}.action-card--large .action-card__icon svg{width:28px;height:28px}.action-card--large .action-card__title{font-size:1.1rem}.action-card--large .action-card__description{font-size:.9rem}.action-card--bordered{border:1px solid var(--card-border-color, var(--ion-color-light-shade))}.action-card--shadowed{box-shadow:0 2px 8px #00000014}.action-card--clickable:hover{transform:translateY(-2px);box-shadow:0 4px 16px #0000001f}.action-card--clickable:focus-visible{outline:2px solid var(--ion-color-primary);outline-offset:2px}.action-card--clickable:active{transform:translateY(0)}.action-card--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.action-card__badge{position:absolute;top:8px;right:8px;padding:2px 8px;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;border-radius:10px;z-index:1}.action-card__icon{flex-shrink:0;display:flex;align-items:center;justify-content:center}.action-card__icon ion-icon{font-size:inherit}.action-card__icon svg{display:block}.action-card__icon-image{width:100%;height:100%;object-fit:cover;border-radius:8px}.action-card__content{flex:1;min-width:0}.action-card__title{margin:0 0 .25rem;font-weight:600;color:var(--ion-text-color);line-height:1.3}.action-card__description{margin:0;color:var(--ion-color-medium);line-height:1.4}.action-card__chevron{flex-shrink:0;font-size:1.25rem;color:var(--ion-color-medium);transition:transform .2s ease}.action-card--clickable:hover .action-card__chevron{transform:translate(4px)}:host-context(.dark) .action-card--shadowed,:host-context(.ion-palette-dark) .action-card--shadowed,:host-context(html.ion-palette-dark) .action-card--shadowed,:host-context(body.dark) .action-card--shadowed,:host-context([data-theme=dark]) .action-card--shadowed{box-shadow:0 2px 8px #0000004d}:host-context(.dark) .action-card--clickable:hover,:host-context(.ion-palette-dark) .action-card--clickable:hover,:host-context(html.ion-palette-dark) .action-card--clickable:hover,:host-context(body.dark) .action-card--clickable:hover,:host-context([data-theme=dark]) .action-card--clickable:hover{box-shadow:0 4px 16px #0006}\n"] }]
|
|
@@ -27774,7 +27797,7 @@ class MediaObjectComponent {
|
|
|
27774
27797
|
@if (config().image) {
|
|
27775
27798
|
<img [src]="config().image" [alt]="config().imageAlt || config().title" />
|
|
27776
27799
|
} @else if (config().icon) {
|
|
27777
|
-
<ion-icon [name]="config().icon!"></ion-icon>
|
|
27800
|
+
<ion-icon [name]="config().icon!" aria-hidden="true"></ion-icon>
|
|
27778
27801
|
}
|
|
27779
27802
|
</div>
|
|
27780
27803
|
|
|
@@ -27815,7 +27838,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
27815
27838
|
@if (config().image) {
|
|
27816
27839
|
<img [src]="config().image" [alt]="config().imageAlt || config().title" />
|
|
27817
27840
|
} @else if (config().icon) {
|
|
27818
|
-
<ion-icon [name]="config().icon!"></ion-icon>
|
|
27841
|
+
<ion-icon [name]="config().icon!" aria-hidden="true"></ion-icon>
|
|
27819
27842
|
}
|
|
27820
27843
|
</div>
|
|
27821
27844
|
|
|
@@ -33766,6 +33789,7 @@ class CookieBannerComponent {
|
|
|
33766
33789
|
role="dialog"
|
|
33767
33790
|
aria-modal="false"
|
|
33768
33791
|
aria-live="polite"
|
|
33792
|
+
[attr.aria-label]="props.ariaLabel || 'Aviso de cookies'"
|
|
33769
33793
|
>
|
|
33770
33794
|
<div class="val-cookie-banner__inner" [style.max-width]="props.maxWidth || '1200px'">
|
|
33771
33795
|
@if (props.dismissible) {
|
|
@@ -33842,6 +33866,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
33842
33866
|
role="dialog"
|
|
33843
33867
|
aria-modal="false"
|
|
33844
33868
|
aria-live="polite"
|
|
33869
|
+
[attr.aria-label]="props.ariaLabel || 'Aviso de cookies'"
|
|
33845
33870
|
>
|
|
33846
33871
|
<div class="val-cookie-banner__inner" [style.max-width]="props.maxWidth || '1200px'">
|
|
33847
33872
|
@if (props.dismissible) {
|
|
@@ -36899,9 +36924,9 @@ class DataTableComponent {
|
|
|
36899
36924
|
<!-- Loading overlay -->
|
|
36900
36925
|
@if (props.loadingState?.loading) {
|
|
36901
36926
|
<div class="loading-overlay">
|
|
36902
|
-
<ion-spinner name="circular"></ion-spinner>
|
|
36927
|
+
<ion-spinner name="circular" [attr.aria-label]="props.loadingState?.message || 'Cargando'"></ion-spinner>
|
|
36903
36928
|
@if (props.loadingState?.message) {
|
|
36904
|
-
<span class="loading-message">{{ props.loadingState.message }}</span>
|
|
36929
|
+
<span class="loading-message" aria-hidden="true">{{ props.loadingState.message }}</span>
|
|
36905
36930
|
}
|
|
36906
36931
|
</div>
|
|
36907
36932
|
}
|
|
@@ -36920,11 +36945,12 @@ class DataTableComponent {
|
|
|
36920
36945
|
<tr>
|
|
36921
36946
|
<!-- Selection column -->
|
|
36922
36947
|
@if (props.showSelectionColumn && props.selection?.mode === 'multiple') {
|
|
36923
|
-
<th class="selection-cell">
|
|
36948
|
+
<th class="selection-cell" scope="col" aria-label="Selección">
|
|
36924
36949
|
<ion-checkbox
|
|
36925
36950
|
[checked]="isAllSelected"
|
|
36926
36951
|
[indeterminate]="isIndeterminate"
|
|
36927
36952
|
(ionChange)="toggleSelectAll($event)"
|
|
36953
|
+
aria-label="Seleccionar todo"
|
|
36928
36954
|
></ion-checkbox>
|
|
36929
36955
|
</th>
|
|
36930
36956
|
}
|
|
@@ -37016,6 +37042,7 @@ class DataTableComponent {
|
|
|
37016
37042
|
[checked]="isRowSelected(row)"
|
|
37017
37043
|
(ionChange)="toggleRowSelection(row, $event)"
|
|
37018
37044
|
(click)="$event.stopPropagation()"
|
|
37045
|
+
aria-label="Seleccionar fila"
|
|
37019
37046
|
></ion-checkbox>
|
|
37020
37047
|
} @else if (props.selection?.mode === 'single') {
|
|
37021
37048
|
<input
|
|
@@ -37254,9 +37281,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
37254
37281
|
<!-- Loading overlay -->
|
|
37255
37282
|
@if (props.loadingState?.loading) {
|
|
37256
37283
|
<div class="loading-overlay">
|
|
37257
|
-
<ion-spinner name="circular"></ion-spinner>
|
|
37284
|
+
<ion-spinner name="circular" [attr.aria-label]="props.loadingState?.message || 'Cargando'"></ion-spinner>
|
|
37258
37285
|
@if (props.loadingState?.message) {
|
|
37259
|
-
<span class="loading-message">{{ props.loadingState.message }}</span>
|
|
37286
|
+
<span class="loading-message" aria-hidden="true">{{ props.loadingState.message }}</span>
|
|
37260
37287
|
}
|
|
37261
37288
|
</div>
|
|
37262
37289
|
}
|
|
@@ -37275,11 +37302,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
37275
37302
|
<tr>
|
|
37276
37303
|
<!-- Selection column -->
|
|
37277
37304
|
@if (props.showSelectionColumn && props.selection?.mode === 'multiple') {
|
|
37278
|
-
<th class="selection-cell">
|
|
37305
|
+
<th class="selection-cell" scope="col" aria-label="Selección">
|
|
37279
37306
|
<ion-checkbox
|
|
37280
37307
|
[checked]="isAllSelected"
|
|
37281
37308
|
[indeterminate]="isIndeterminate"
|
|
37282
37309
|
(ionChange)="toggleSelectAll($event)"
|
|
37310
|
+
aria-label="Seleccionar todo"
|
|
37283
37311
|
></ion-checkbox>
|
|
37284
37312
|
</th>
|
|
37285
37313
|
}
|
|
@@ -37371,6 +37399,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
37371
37399
|
[checked]="isRowSelected(row)"
|
|
37372
37400
|
(ionChange)="toggleRowSelection(row, $event)"
|
|
37373
37401
|
(click)="$event.stopPropagation()"
|
|
37402
|
+
aria-label="Seleccionar fila"
|
|
37374
37403
|
></ion-checkbox>
|
|
37375
37404
|
} @else if (props.selection?.mode === 'single') {
|
|
37376
37405
|
<input
|
|
@@ -40352,7 +40381,7 @@ class LoginComponent {
|
|
|
40352
40381
|
this.stopResetResendCooldown();
|
|
40353
40382
|
}
|
|
40354
40383
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
40355
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LoginComponent, isStandalone: true, selector: "val-login", inputs: { props: "props" }, outputs: { onSuccess: "onSuccess", onError: "onError", onMFARequired: "onMFARequired" }, ngImport: i0, template: "<div class=\"val-login\" [class.val-login--card]=\"config.showCard\">\n <!-- Logo -->\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n\n <!-- Login Form -->\n <val-form [props]=\"loginFormProps()\" (onSubmit)=\"loginHandler($event)\" />\n\n <!-- OAuth Section -->\n @if (config.showOAuth && config.oauthProviders.length > 0) {\n <div class=\"oauth-separator\">\n <span>{{ t('orContinueWith') }}</span>\n </div>\n\n <div class=\"oauth-buttons\">\n @for (provider of config.oauthProviders; track provider) {\n <ion-button\n expand=\"block\"\n fill=\"outline\"\n color=\"dark\"\n (click)=\"loginWithOAuth(provider)\"\n [disabled]=\"isOAuthLoading\"\n >\n @switch (provider) { @case ('google') {\n <ion-icon slot=\"start\" name=\"logo-google\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithGoogle') }} } @case ('apple') {\n <ion-icon slot=\"start\" name=\"logo-apple\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithApple') }} } @case ('microsoft') {\n <ion-icon slot=\"start\" name=\"logo-microsoft\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithMicrosoft') }} } }\n </ion-button>\n }\n </div>\n }\n\n <!-- Register Link -->\n @if (config.showRegister) {\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('noAccount') }}\n <a (click)=\"openRegisterModal()\">{{ t('register') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Forgot Password Link -->\n @if (config.showForgotPassword) {\n <div class=\"auth-link forgot-password\">\n <ion-text color=\"dark\">\n {{ t('forgotLink') }}\n <a (click)=\"openForgotPasswordModal()\">{{ t('recoverPassword') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Legal Notice -->\n @if (props.legal) {\n <div class=\"legal-notice\">\n <ion-text color=\"dark\">\n <p>\n {{ t('legalPrefix') }} @if (resolvedCompanyLink) {\n <a [href]=\"resolvedCompanyLink\" target=\"_blank\" rel=\"noopener noreferrer\"\n ><strong>{{ props.legal.companyName }}</strong></a\n >\n } @else {\n <strong>{{ props.legal.companyName }}</strong>\n } {{ t('legalSuffix') }} @if (props.legal.termsLink) {\n <a [href]=\"props.legal.termsLink\">{{ t('termsAndConditions') }}</a>\n } @else {\n <span>{{ t('termsAndConditions') }}</span>\n } {{ t('and') }} @if (props.legal.privacyLink) {\n <a [href]=\"props.legal.privacyLink\">{{ t('privacyPolicy') }}</a>\n } @else {\n <span>{{ t('privacyPolicy') }}</span>\n }.\n </p>\n </ion-text>\n </div>\n }\n</div>\n\n<!-- Register Modal -->\n<ion-modal [isOpen]=\"isRegisterModalOpen\" (didDismiss)=\"closeRegisterModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" (click)=\"closeRegisterModal()\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"registerFormProps()\" (onSubmit)=\"registerHandler($event)\" />\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('hasAccount') }}\n <a (click)=\"closeRegisterModal()\">{{ t('signIn') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Verify Email Modal -->\n<ion-modal [isOpen]=\"isVerifyModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" (click)=\"closeVerifyModal()\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"verifyFormProps()\" (onSubmit)=\"verifyHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Forgot Password Modal -->\n<ion-modal [isOpen]=\"isForgotPasswordModalOpen\" (didDismiss)=\"closeForgotPasswordModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" (click)=\"closeForgotPasswordModal()\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"forgotPasswordFormProps()\" (onSubmit)=\"forgotPasswordHandler($event)\" />\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Reset Password Modal -->\n<ion-modal [isOpen]=\"isResetPasswordModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" (click)=\"closeResetPasswordModal()\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"resetPasswordFormProps()\" (onSubmit)=\"resetPasswordHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resetResendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resetResendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendResetCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Verify Modal -->\n<ion-modal [isOpen]=\"isMFAVerifyModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"onMFAVerifyDismissed()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" (click)=\"closeMFAVerifyModal()\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"mfaVerifyFormProps()\" (onSubmit)=\"verifyMFAHandler($event)\" />\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".val-login{width:100%}.val-login--card{padding:1rem .75rem;background:var(--ion-color-light);border-radius:16px;box-shadow:0 2px 8px #00000014}.logo-container{max-width:130px;margin-bottom:1.5rem}.auth-link{text-align:center;margin-top:1rem;font-size:.9rem}.auth-link a{color:var(--ion-color-primary);text-decoration:none;font-weight:500;cursor:pointer}.auth-link a:hover{text-decoration:underline}.oauth-separator{display:flex;align-items:center;margin:1.5rem 0}.oauth-separator:before,.oauth-separator:after{content:\"\";flex:1;height:1px;background:var(--ion-color-medium-tint)}.oauth-separator span{padding:0 1rem;color:var(--ion-color-dark);font-size:.85rem}.oauth-buttons{margin-bottom:1rem}.oauth-buttons ion-button{--border-radius: 8px;--border-width: 1px}.oauth-buttons ion-icon{font-size:1.2rem;margin-right:.5rem}.legal-notice{margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--ion-color-medium-tint)}.legal-notice p{font-size:.75rem;line-height:1.5;text-align:center;margin:0}.legal-notice a{color:var(--ion-color-primary);text-decoration:none}.legal-notice a:hover{text-decoration:underline}.resend-link{text-align:center;margin-top:1rem;font-size:.9rem}.resend-link a{color:var(--ion-color-primary);cursor:pointer;font-weight:500}.resend-link a:hover{text-decoration:underline}.resend-link .cooldown{color:var(--ion-color-medium)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: ImageComponent, selector: "val-image", inputs: ["props"] }] }); }
|
|
40384
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LoginComponent, isStandalone: true, selector: "val-login", inputs: { props: "props" }, outputs: { onSuccess: "onSuccess", onError: "onError", onMFARequired: "onMFARequired" }, ngImport: i0, template: "<div class=\"val-login\" [class.val-login--card]=\"config.showCard\">\n <!-- Logo -->\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n\n <!-- Login Form -->\n <val-form [props]=\"loginFormProps()\" (onSubmit)=\"loginHandler($event)\" />\n\n <!-- OAuth Section -->\n @if (config.showOAuth && config.oauthProviders.length > 0) {\n <div class=\"oauth-separator\">\n <span>{{ t('orContinueWith') }}</span>\n </div>\n\n <div class=\"oauth-buttons\">\n @for (provider of config.oauthProviders; track provider) {\n <ion-button\n expand=\"block\"\n fill=\"outline\"\n color=\"dark\"\n (click)=\"loginWithOAuth(provider)\"\n [disabled]=\"isOAuthLoading\"\n >\n @switch (provider) { @case ('google') {\n <ion-icon slot=\"start\" name=\"logo-google\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithGoogle') }} } @case ('apple') {\n <ion-icon slot=\"start\" name=\"logo-apple\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithApple') }} } @case ('microsoft') {\n <ion-icon slot=\"start\" name=\"logo-microsoft\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithMicrosoft') }} } }\n </ion-button>\n }\n </div>\n }\n\n <!-- Register Link -->\n @if (config.showRegister) {\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('noAccount') }}\n <a (click)=\"openRegisterModal()\">{{ t('register') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Forgot Password Link -->\n @if (config.showForgotPassword) {\n <div class=\"auth-link forgot-password\">\n <ion-text color=\"dark\">\n {{ t('forgotLink') }}\n <a (click)=\"openForgotPasswordModal()\">{{ t('recoverPassword') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Legal Notice -->\n @if (props.legal) {\n <div class=\"legal-notice\">\n <ion-text color=\"dark\">\n <p>\n {{ t('legalPrefix') }} @if (resolvedCompanyLink) {\n <a [href]=\"resolvedCompanyLink\" target=\"_blank\" rel=\"noopener noreferrer\"\n ><strong>{{ props.legal.companyName }}</strong></a\n >\n } @else {\n <strong>{{ props.legal.companyName }}</strong>\n } {{ t('legalSuffix') }} @if (props.legal.termsLink) {\n <a [href]=\"props.legal.termsLink\">{{ t('termsAndConditions') }}</a>\n } @else {\n <span>{{ t('termsAndConditions') }}</span>\n } {{ t('and') }} @if (props.legal.privacyLink) {\n <a [href]=\"props.legal.privacyLink\">{{ t('privacyPolicy') }}</a>\n } @else {\n <span>{{ t('privacyPolicy') }}</span>\n }.\n </p>\n </ion-text>\n </div>\n }\n</div>\n\n<!-- Register Modal -->\n<ion-modal [isOpen]=\"isRegisterModalOpen\" (didDismiss)=\"closeRegisterModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" [attr.aria-label]=\"t('close')\" (click)=\"closeRegisterModal()\">\n <ion-icon name=\"close-outline\" aria-hidden=\"true\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"registerFormProps()\" (onSubmit)=\"registerHandler($event)\" />\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('hasAccount') }}\n <a (click)=\"closeRegisterModal()\">{{ t('signIn') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Verify Email Modal -->\n<ion-modal [isOpen]=\"isVerifyModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" [attr.aria-label]=\"t('close')\" (click)=\"closeVerifyModal()\">\n <ion-icon name=\"close-outline\" aria-hidden=\"true\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"verifyFormProps()\" (onSubmit)=\"verifyHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Forgot Password Modal -->\n<ion-modal [isOpen]=\"isForgotPasswordModalOpen\" (didDismiss)=\"closeForgotPasswordModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" [attr.aria-label]=\"t('close')\" (click)=\"closeForgotPasswordModal()\">\n <ion-icon name=\"close-outline\" aria-hidden=\"true\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"forgotPasswordFormProps()\" (onSubmit)=\"forgotPasswordHandler($event)\" />\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Reset Password Modal -->\n<ion-modal [isOpen]=\"isResetPasswordModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" [attr.aria-label]=\"t('close')\" (click)=\"closeResetPasswordModal()\">\n <ion-icon name=\"close-outline\" aria-hidden=\"true\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"resetPasswordFormProps()\" (onSubmit)=\"resetPasswordHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resetResendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resetResendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendResetCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Verify Modal -->\n<ion-modal [isOpen]=\"isMFAVerifyModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"onMFAVerifyDismissed()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" (click)=\"closeMFAVerifyModal()\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"mfaVerifyFormProps()\" (onSubmit)=\"verifyMFAHandler($event)\" />\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".val-login{width:100%}.val-login--card{padding:1rem .75rem;background:var(--ion-color-light);border-radius:16px;box-shadow:0 2px 8px #00000014}.logo-container{max-width:130px;margin-bottom:1.5rem}.auth-link{text-align:center;margin-top:1rem;font-size:.9rem}.auth-link a{color:var(--ion-color-primary);text-decoration:none;font-weight:500;cursor:pointer}.auth-link a:hover{text-decoration:underline}.oauth-separator{display:flex;align-items:center;margin:1.5rem 0}.oauth-separator:before,.oauth-separator:after{content:\"\";flex:1;height:1px;background:var(--ion-color-medium-tint)}.oauth-separator span{padding:0 1rem;color:var(--ion-color-dark);font-size:.85rem}.oauth-buttons{margin-bottom:1rem}.oauth-buttons ion-button{--border-radius: 8px;--border-width: 1px}.oauth-buttons ion-icon{font-size:1.2rem;margin-right:.5rem}.legal-notice{margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--ion-color-medium-tint)}.legal-notice p{font-size:.75rem;line-height:1.5;text-align:center;margin:0}.legal-notice a{color:var(--ion-color-primary);text-decoration:none}.legal-notice a:hover{text-decoration:underline}.resend-link{text-align:center;margin-top:1rem;font-size:.9rem}.resend-link a{color:var(--ion-color-primary);cursor:pointer;font-weight:500}.resend-link a:hover{text-decoration:underline}.resend-link .cooldown{color:var(--ion-color-medium)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: ImageComponent, selector: "val-image", inputs: ["props"] }] }); }
|
|
40356
40385
|
}
|
|
40357
40386
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LoginComponent, decorators: [{
|
|
40358
40387
|
type: Component,
|
|
@@ -40368,7 +40397,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
40368
40397
|
IonToolbar,
|
|
40369
40398
|
FormComponent,
|
|
40370
40399
|
ImageComponent,
|
|
40371
|
-
], template: "<div class=\"val-login\" [class.val-login--card]=\"config.showCard\">\n <!-- Logo -->\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n\n <!-- Login Form -->\n <val-form [props]=\"loginFormProps()\" (onSubmit)=\"loginHandler($event)\" />\n\n <!-- OAuth Section -->\n @if (config.showOAuth && config.oauthProviders.length > 0) {\n <div class=\"oauth-separator\">\n <span>{{ t('orContinueWith') }}</span>\n </div>\n\n <div class=\"oauth-buttons\">\n @for (provider of config.oauthProviders; track provider) {\n <ion-button\n expand=\"block\"\n fill=\"outline\"\n color=\"dark\"\n (click)=\"loginWithOAuth(provider)\"\n [disabled]=\"isOAuthLoading\"\n >\n @switch (provider) { @case ('google') {\n <ion-icon slot=\"start\" name=\"logo-google\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithGoogle') }} } @case ('apple') {\n <ion-icon slot=\"start\" name=\"logo-apple\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithApple') }} } @case ('microsoft') {\n <ion-icon slot=\"start\" name=\"logo-microsoft\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithMicrosoft') }} } }\n </ion-button>\n }\n </div>\n }\n\n <!-- Register Link -->\n @if (config.showRegister) {\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('noAccount') }}\n <a (click)=\"openRegisterModal()\">{{ t('register') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Forgot Password Link -->\n @if (config.showForgotPassword) {\n <div class=\"auth-link forgot-password\">\n <ion-text color=\"dark\">\n {{ t('forgotLink') }}\n <a (click)=\"openForgotPasswordModal()\">{{ t('recoverPassword') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Legal Notice -->\n @if (props.legal) {\n <div class=\"legal-notice\">\n <ion-text color=\"dark\">\n <p>\n {{ t('legalPrefix') }} @if (resolvedCompanyLink) {\n <a [href]=\"resolvedCompanyLink\" target=\"_blank\" rel=\"noopener noreferrer\"\n ><strong>{{ props.legal.companyName }}</strong></a\n >\n } @else {\n <strong>{{ props.legal.companyName }}</strong>\n } {{ t('legalSuffix') }} @if (props.legal.termsLink) {\n <a [href]=\"props.legal.termsLink\">{{ t('termsAndConditions') }}</a>\n } @else {\n <span>{{ t('termsAndConditions') }}</span>\n } {{ t('and') }} @if (props.legal.privacyLink) {\n <a [href]=\"props.legal.privacyLink\">{{ t('privacyPolicy') }}</a>\n } @else {\n <span>{{ t('privacyPolicy') }}</span>\n }.\n </p>\n </ion-text>\n </div>\n }\n</div>\n\n<!-- Register Modal -->\n<ion-modal [isOpen]=\"isRegisterModalOpen\" (didDismiss)=\"closeRegisterModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" (click)=\"closeRegisterModal()\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"registerFormProps()\" (onSubmit)=\"registerHandler($event)\" />\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('hasAccount') }}\n <a (click)=\"closeRegisterModal()\">{{ t('signIn') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Verify Email Modal -->\n<ion-modal [isOpen]=\"isVerifyModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" (click)=\"closeVerifyModal()\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"verifyFormProps()\" (onSubmit)=\"verifyHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Forgot Password Modal -->\n<ion-modal [isOpen]=\"isForgotPasswordModalOpen\" (didDismiss)=\"closeForgotPasswordModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" (click)=\"closeForgotPasswordModal()\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"forgotPasswordFormProps()\" (onSubmit)=\"forgotPasswordHandler($event)\" />\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Reset Password Modal -->\n<ion-modal [isOpen]=\"isResetPasswordModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" (click)=\"closeResetPasswordModal()\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"resetPasswordFormProps()\" (onSubmit)=\"resetPasswordHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resetResendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resetResendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendResetCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Verify Modal -->\n<ion-modal [isOpen]=\"isMFAVerifyModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"onMFAVerifyDismissed()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" (click)=\"closeMFAVerifyModal()\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"mfaVerifyFormProps()\" (onSubmit)=\"verifyMFAHandler($event)\" />\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".val-login{width:100%}.val-login--card{padding:1rem .75rem;background:var(--ion-color-light);border-radius:16px;box-shadow:0 2px 8px #00000014}.logo-container{max-width:130px;margin-bottom:1.5rem}.auth-link{text-align:center;margin-top:1rem;font-size:.9rem}.auth-link a{color:var(--ion-color-primary);text-decoration:none;font-weight:500;cursor:pointer}.auth-link a:hover{text-decoration:underline}.oauth-separator{display:flex;align-items:center;margin:1.5rem 0}.oauth-separator:before,.oauth-separator:after{content:\"\";flex:1;height:1px;background:var(--ion-color-medium-tint)}.oauth-separator span{padding:0 1rem;color:var(--ion-color-dark);font-size:.85rem}.oauth-buttons{margin-bottom:1rem}.oauth-buttons ion-button{--border-radius: 8px;--border-width: 1px}.oauth-buttons ion-icon{font-size:1.2rem;margin-right:.5rem}.legal-notice{margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--ion-color-medium-tint)}.legal-notice p{font-size:.75rem;line-height:1.5;text-align:center;margin:0}.legal-notice a{color:var(--ion-color-primary);text-decoration:none}.legal-notice a:hover{text-decoration:underline}.resend-link{text-align:center;margin-top:1rem;font-size:.9rem}.resend-link a{color:var(--ion-color-primary);cursor:pointer;font-weight:500}.resend-link a:hover{text-decoration:underline}.resend-link .cooldown{color:var(--ion-color-medium)}\n"] }]
|
|
40400
|
+
], template: "<div class=\"val-login\" [class.val-login--card]=\"config.showCard\">\n <!-- Logo -->\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n\n <!-- Login Form -->\n <val-form [props]=\"loginFormProps()\" (onSubmit)=\"loginHandler($event)\" />\n\n <!-- OAuth Section -->\n @if (config.showOAuth && config.oauthProviders.length > 0) {\n <div class=\"oauth-separator\">\n <span>{{ t('orContinueWith') }}</span>\n </div>\n\n <div class=\"oauth-buttons\">\n @for (provider of config.oauthProviders; track provider) {\n <ion-button\n expand=\"block\"\n fill=\"outline\"\n color=\"dark\"\n (click)=\"loginWithOAuth(provider)\"\n [disabled]=\"isOAuthLoading\"\n >\n @switch (provider) { @case ('google') {\n <ion-icon slot=\"start\" name=\"logo-google\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithGoogle') }} } @case ('apple') {\n <ion-icon slot=\"start\" name=\"logo-apple\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithApple') }} } @case ('microsoft') {\n <ion-icon slot=\"start\" name=\"logo-microsoft\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithMicrosoft') }} } }\n </ion-button>\n }\n </div>\n }\n\n <!-- Register Link -->\n @if (config.showRegister) {\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('noAccount') }}\n <a (click)=\"openRegisterModal()\">{{ t('register') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Forgot Password Link -->\n @if (config.showForgotPassword) {\n <div class=\"auth-link forgot-password\">\n <ion-text color=\"dark\">\n {{ t('forgotLink') }}\n <a (click)=\"openForgotPasswordModal()\">{{ t('recoverPassword') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Legal Notice -->\n @if (props.legal) {\n <div class=\"legal-notice\">\n <ion-text color=\"dark\">\n <p>\n {{ t('legalPrefix') }} @if (resolvedCompanyLink) {\n <a [href]=\"resolvedCompanyLink\" target=\"_blank\" rel=\"noopener noreferrer\"\n ><strong>{{ props.legal.companyName }}</strong></a\n >\n } @else {\n <strong>{{ props.legal.companyName }}</strong>\n } {{ t('legalSuffix') }} @if (props.legal.termsLink) {\n <a [href]=\"props.legal.termsLink\">{{ t('termsAndConditions') }}</a>\n } @else {\n <span>{{ t('termsAndConditions') }}</span>\n } {{ t('and') }} @if (props.legal.privacyLink) {\n <a [href]=\"props.legal.privacyLink\">{{ t('privacyPolicy') }}</a>\n } @else {\n <span>{{ t('privacyPolicy') }}</span>\n }.\n </p>\n </ion-text>\n </div>\n }\n</div>\n\n<!-- Register Modal -->\n<ion-modal [isOpen]=\"isRegisterModalOpen\" (didDismiss)=\"closeRegisterModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" [attr.aria-label]=\"t('close')\" (click)=\"closeRegisterModal()\">\n <ion-icon name=\"close-outline\" aria-hidden=\"true\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"registerFormProps()\" (onSubmit)=\"registerHandler($event)\" />\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('hasAccount') }}\n <a (click)=\"closeRegisterModal()\">{{ t('signIn') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Verify Email Modal -->\n<ion-modal [isOpen]=\"isVerifyModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" [attr.aria-label]=\"t('close')\" (click)=\"closeVerifyModal()\">\n <ion-icon name=\"close-outline\" aria-hidden=\"true\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"verifyFormProps()\" (onSubmit)=\"verifyHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Forgot Password Modal -->\n<ion-modal [isOpen]=\"isForgotPasswordModalOpen\" (didDismiss)=\"closeForgotPasswordModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" [attr.aria-label]=\"t('close')\" (click)=\"closeForgotPasswordModal()\">\n <ion-icon name=\"close-outline\" aria-hidden=\"true\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"forgotPasswordFormProps()\" (onSubmit)=\"forgotPasswordHandler($event)\" />\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Reset Password Modal -->\n<ion-modal [isOpen]=\"isResetPasswordModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" [attr.aria-label]=\"t('close')\" (click)=\"closeResetPasswordModal()\">\n <ion-icon name=\"close-outline\" aria-hidden=\"true\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"resetPasswordFormProps()\" (onSubmit)=\"resetPasswordHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resetResendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resetResendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendResetCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Verify Modal -->\n<ion-modal [isOpen]=\"isMFAVerifyModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"onMFAVerifyDismissed()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" (click)=\"closeMFAVerifyModal()\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n @if (props.logo) {\n <div class=\"logo-container\">\n <val-image [props]=\"props.logo\" />\n </div>\n }\n <val-form [props]=\"mfaVerifyFormProps()\" (onSubmit)=\"verifyMFAHandler($event)\" />\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".val-login{width:100%}.val-login--card{padding:1rem .75rem;background:var(--ion-color-light);border-radius:16px;box-shadow:0 2px 8px #00000014}.logo-container{max-width:130px;margin-bottom:1.5rem}.auth-link{text-align:center;margin-top:1rem;font-size:.9rem}.auth-link a{color:var(--ion-color-primary);text-decoration:none;font-weight:500;cursor:pointer}.auth-link a:hover{text-decoration:underline}.oauth-separator{display:flex;align-items:center;margin:1.5rem 0}.oauth-separator:before,.oauth-separator:after{content:\"\";flex:1;height:1px;background:var(--ion-color-medium-tint)}.oauth-separator span{padding:0 1rem;color:var(--ion-color-dark);font-size:.85rem}.oauth-buttons{margin-bottom:1rem}.oauth-buttons ion-button{--border-radius: 8px;--border-width: 1px}.oauth-buttons ion-icon{font-size:1.2rem;margin-right:.5rem}.legal-notice{margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--ion-color-medium-tint)}.legal-notice p{font-size:.75rem;line-height:1.5;text-align:center;margin:0}.legal-notice a{color:var(--ion-color-primary);text-decoration:none}.legal-notice a:hover{text-decoration:underline}.resend-link{text-align:center;margin-top:1rem;font-size:.9rem}.resend-link a{color:var(--ion-color-primary);cursor:pointer;font-weight:500}.resend-link a:hover{text-decoration:underline}.resend-link .cooldown{color:var(--ion-color-medium)}\n"] }]
|
|
40372
40401
|
}], propDecorators: { props: [{
|
|
40373
40402
|
type: Input
|
|
40374
40403
|
}], onSuccess: [{
|
|
@@ -55401,7 +55430,7 @@ const FIELD_LIST_I18N = {
|
|
|
55401
55430
|
};
|
|
55402
55431
|
|
|
55403
55432
|
addIcons({ addOutline, trashOutline });
|
|
55404
|
-
const I18N_NS$
|
|
55433
|
+
const I18N_NS$2 = 'FieldList';
|
|
55405
55434
|
/**
|
|
55406
55435
|
* `val-field-list` — editor de listas de campos repetibles (premios, rondas,
|
|
55407
55436
|
* integrantes, etc.). Cada ítem es una **card** con sus campos apilados y un botón
|
|
@@ -55455,8 +55484,8 @@ class FieldListComponent {
|
|
|
55455
55484
|
const max = this.props.max;
|
|
55456
55485
|
return max == null || this.rowsSig().length < max;
|
|
55457
55486
|
});
|
|
55458
|
-
if (!this.i18n.hasNamespace(I18N_NS$
|
|
55459
|
-
this.i18n.registerContent(I18N_NS$
|
|
55487
|
+
if (!this.i18n.hasNamespace(I18N_NS$2)) {
|
|
55488
|
+
this.i18n.registerContent(I18N_NS$2, FIELD_LIST_I18N);
|
|
55460
55489
|
}
|
|
55461
55490
|
}
|
|
55462
55491
|
ngOnChanges(changes) {
|
|
@@ -55472,7 +55501,7 @@ class FieldListComponent {
|
|
|
55472
55501
|
}
|
|
55473
55502
|
}
|
|
55474
55503
|
t(key) {
|
|
55475
|
-
return this.i18n.t(key, I18N_NS$
|
|
55504
|
+
return this.i18n.t(key, I18N_NS$2);
|
|
55476
55505
|
}
|
|
55477
55506
|
/** Reemplaza `{n}` por el número de fila (1-based) en el rótulo de la card. */
|
|
55478
55507
|
rowLabel(template, index) {
|
|
@@ -55644,7 +55673,7 @@ const DATE_PICKER_I18N = {
|
|
|
55644
55673
|
};
|
|
55645
55674
|
|
|
55646
55675
|
addIcons({ calendarOutline, closeOutline });
|
|
55647
|
-
const I18N_NS = 'DatePicker';
|
|
55676
|
+
const I18N_NS$1 = 'DatePicker';
|
|
55648
55677
|
/**
|
|
55649
55678
|
* `val-date-picker` — selector de fecha con calendario vanilla-calendar-pro v3
|
|
55650
55679
|
* (NO ion-datetime). Se presenta como **sheet modal** (bottom sheet), igual que
|
|
@@ -55666,8 +55695,8 @@ class DatePickerComponent {
|
|
|
55666
55695
|
this.sheetOpen = signal(false);
|
|
55667
55696
|
/** true cuando el calendario ya se construyó y es visible (fade-in). */
|
|
55668
55697
|
this.calReady = signal(false);
|
|
55669
|
-
if (!this.i18n.hasNamespace(I18N_NS)) {
|
|
55670
|
-
this.i18n.registerContent(I18N_NS, DATE_PICKER_I18N);
|
|
55698
|
+
if (!this.i18n.hasNamespace(I18N_NS$1)) {
|
|
55699
|
+
this.i18n.registerContent(I18N_NS$1, DATE_PICKER_I18N);
|
|
55671
55700
|
}
|
|
55672
55701
|
}
|
|
55673
55702
|
get triggerId() {
|
|
@@ -55710,7 +55739,7 @@ class DatePickerComponent {
|
|
|
55710
55739
|
this.destroyCalendar();
|
|
55711
55740
|
}
|
|
55712
55741
|
t(key) {
|
|
55713
|
-
return this.i18n.t(key, I18N_NS);
|
|
55742
|
+
return this.i18n.t(key, I18N_NS$1);
|
|
55714
55743
|
}
|
|
55715
55744
|
onSheetPresent() {
|
|
55716
55745
|
this.calReady.set(false);
|
|
@@ -55736,7 +55765,7 @@ class DatePickerComponent {
|
|
|
55736
55765
|
selectedDates: value ? [value] : [],
|
|
55737
55766
|
displayDateMin: (this.props.min ?? undefined),
|
|
55738
55767
|
displayDateMax: (this.props.max ?? undefined),
|
|
55739
|
-
onClickDate:
|
|
55768
|
+
onClickDate: self => {
|
|
55740
55769
|
const picked = self.context.selectedDates[0] ?? null;
|
|
55741
55770
|
if (picked)
|
|
55742
55771
|
this.apply(picked);
|
|
@@ -55801,7 +55830,7 @@ class DatePickerComponent {
|
|
|
55801
55830
|
[class.is-placeholder]="!displayValue"
|
|
55802
55831
|
(click)="sheetOpen.set(true)"
|
|
55803
55832
|
>
|
|
55804
|
-
<ion-icon name="calendar-outline" slot="start" />
|
|
55833
|
+
<ion-icon name="calendar-outline" slot="start" aria-hidden="true" />
|
|
55805
55834
|
{{ displayValue || placeholderText }}
|
|
55806
55835
|
</ion-button>
|
|
55807
55836
|
</div>
|
|
@@ -55840,11 +55869,7 @@ class DatePickerComponent {
|
|
|
55840
55869
|
}
|
|
55841
55870
|
|
|
55842
55871
|
<!-- Calendario: siempre en el DOM para que #cal exista; fade-in al estar listo -->
|
|
55843
|
-
<div
|
|
55844
|
-
#cal
|
|
55845
|
-
class="vdp-sheet__cal"
|
|
55846
|
-
[class.is-ready]="calReady()"
|
|
55847
|
-
></div>
|
|
55872
|
+
<div #cal class="vdp-sheet__cal" [class.is-ready]="calReady()"></div>
|
|
55848
55873
|
|
|
55849
55874
|
@if (props.clearable && displayValue) {
|
|
55850
55875
|
<ion-button expand="block" fill="clear" color="medium" (click)="clear()">
|
|
@@ -55886,7 +55911,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
55886
55911
|
[class.is-placeholder]="!displayValue"
|
|
55887
55912
|
(click)="sheetOpen.set(true)"
|
|
55888
55913
|
>
|
|
55889
|
-
<ion-icon name="calendar-outline" slot="start" />
|
|
55914
|
+
<ion-icon name="calendar-outline" slot="start" aria-hidden="true" />
|
|
55890
55915
|
{{ displayValue || placeholderText }}
|
|
55891
55916
|
</ion-button>
|
|
55892
55917
|
</div>
|
|
@@ -55925,11 +55950,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
55925
55950
|
}
|
|
55926
55951
|
|
|
55927
55952
|
<!-- Calendario: siempre en el DOM para que #cal exista; fade-in al estar listo -->
|
|
55928
|
-
<div
|
|
55929
|
-
#cal
|
|
55930
|
-
class="vdp-sheet__cal"
|
|
55931
|
-
[class.is-ready]="calReady()"
|
|
55932
|
-
></div>
|
|
55953
|
+
<div #cal class="vdp-sheet__cal" [class.is-ready]="calReady()"></div>
|
|
55933
55954
|
|
|
55934
55955
|
@if (props.clearable && displayValue) {
|
|
55935
55956
|
<ion-button expand="block" fill="clear" color="medium" (click)="clear()">
|
|
@@ -58434,6 +58455,122 @@ function beautifyLegalArticle(article) {
|
|
|
58434
58455
|
* Soporta modo one-shot y real-time, con gate de `firebaseAuthReady`.
|
|
58435
58456
|
*/
|
|
58436
58457
|
|
|
58458
|
+
/**
|
|
58459
|
+
* Defaults i18n embebidos en `createPageState`. Namespace `PageState`.
|
|
58460
|
+
* Auto-registrados la primera vez que se llama al helper.
|
|
58461
|
+
*/
|
|
58462
|
+
const PAGE_STATE_I18N = {
|
|
58463
|
+
es: {
|
|
58464
|
+
errorTitle: 'No pudimos cargar la página',
|
|
58465
|
+
offlineTitle: 'Sin conexión',
|
|
58466
|
+
offlineHint: 'Revisá tu conexión e intentá de nuevo.',
|
|
58467
|
+
retry: 'Reintentar',
|
|
58468
|
+
},
|
|
58469
|
+
en: {
|
|
58470
|
+
errorTitle: "We couldn't load the page",
|
|
58471
|
+
offlineTitle: "You're offline",
|
|
58472
|
+
offlineHint: 'Check your connection and try again.',
|
|
58473
|
+
retry: 'Retry',
|
|
58474
|
+
},
|
|
58475
|
+
};
|
|
58476
|
+
|
|
58477
|
+
/**
|
|
58478
|
+
* createPageState — helper estándar para el patrón loading/error/data de una
|
|
58479
|
+
* página con datos remotos (HTTP o Firestore one-shot).
|
|
58480
|
+
*
|
|
58481
|
+
* Encapsula el boilerplate repetido en cada vista:
|
|
58482
|
+
* - `loading` signal (true mientras carga o recarga).
|
|
58483
|
+
* - `loadError` signal (el error crudo o null).
|
|
58484
|
+
* - `errorState` computed que convierte el error a `EmptyStateMetadata` listo
|
|
58485
|
+
* para `<val-empty-state>`, reactivo al idioma.
|
|
58486
|
+
* - `reload()` function que re-ejecuta el `loader` async.
|
|
58487
|
+
*
|
|
58488
|
+
* El caller controla el template; `createPageState` solo maneja el estado:
|
|
58489
|
+
*
|
|
58490
|
+
* ```ts
|
|
58491
|
+
* readonly page = createPageState(
|
|
58492
|
+
* this.i18n,
|
|
58493
|
+
* async () => {
|
|
58494
|
+
* const res = await firstValueFrom(this.svc.getData());
|
|
58495
|
+
* this.items.set(res.items);
|
|
58496
|
+
* },
|
|
58497
|
+
* { errorTitle: () => this.t('errorTitle'), retryLabel: () => this.t('retry') }
|
|
58498
|
+
* );
|
|
58499
|
+
* ```
|
|
58500
|
+
*
|
|
58501
|
+
* Template:
|
|
58502
|
+
* ```html
|
|
58503
|
+
* @if (page.loading()) { <val-skeleton-layout [props]="{ preset: 'list' }" /> }
|
|
58504
|
+
* @else if (page.errorState(); as e) { <val-empty-state [props]="e" /> }
|
|
58505
|
+
* @else { <!-- content --> }
|
|
58506
|
+
* ```
|
|
58507
|
+
*
|
|
58508
|
+
* El helper llama a `reload()` automáticamente al construirse (carga inicial),
|
|
58509
|
+
* igual que el patrón clásico `void this.load()` en el constructor.
|
|
58510
|
+
* Para deshabilitar la carga automática, pasar `{ autoLoad: false }`.
|
|
58511
|
+
*
|
|
58512
|
+
* Para pull-to-refresh usar `connectPageRefresh(() => page.reload())` como siempre.
|
|
58513
|
+
*/
|
|
58514
|
+
const I18N_NS = 'PageState';
|
|
58515
|
+
/**
|
|
58516
|
+
* Crea el estado de carga de una página.
|
|
58517
|
+
*
|
|
58518
|
+
* @param i18n - `I18nService` inyectado en la page (para reactividad al idioma).
|
|
58519
|
+
* @param loader - función async que carga los datos y los siembra en signals
|
|
58520
|
+
* propias de la page. Si lanza, el error se captura en `loadError`.
|
|
58521
|
+
* @param labels - labels i18n opcionales. Si se omiten usa defaults genéricos.
|
|
58522
|
+
* @param options - `autoLoad`: si false no carga al construirse (default true).
|
|
58523
|
+
*/
|
|
58524
|
+
function createPageState(i18n, loader, labels, options) {
|
|
58525
|
+
if (!i18n.hasNamespace(I18N_NS)) {
|
|
58526
|
+
i18n.registerContent(I18N_NS, PAGE_STATE_I18N);
|
|
58527
|
+
}
|
|
58528
|
+
const loading = signal(false);
|
|
58529
|
+
const loadError = signal(null);
|
|
58530
|
+
const errorState = computed(() => {
|
|
58531
|
+
i18n.lang(); // reactividad al cambiar idioma
|
|
58532
|
+
const err = loadError();
|
|
58533
|
+
if (!err)
|
|
58534
|
+
return null;
|
|
58535
|
+
const interpreted = interpretError(err);
|
|
58536
|
+
return createErrorStateProps(err, {
|
|
58537
|
+
title: {
|
|
58538
|
+
error: labels?.errorTitle?.() ?? i18n.t('errorTitle', 'PageState'),
|
|
58539
|
+
offline: labels?.offlineTitle?.() ?? i18n.t('offlineTitle', 'PageState'),
|
|
58540
|
+
},
|
|
58541
|
+
description: {
|
|
58542
|
+
error: labels?.errorDescription?.(err) ?? interpreted.message,
|
|
58543
|
+
offline: labels?.offlineHint?.() ?? i18n.t('offlineHint', 'PageState'),
|
|
58544
|
+
},
|
|
58545
|
+
retryLabel: labels?.retryLabel?.() ?? i18n.t('retry', 'PageState'),
|
|
58546
|
+
onRetry: () => void reload(),
|
|
58547
|
+
retrying: loading(),
|
|
58548
|
+
});
|
|
58549
|
+
});
|
|
58550
|
+
async function reload() {
|
|
58551
|
+
loading.set(true);
|
|
58552
|
+
try {
|
|
58553
|
+
await loader();
|
|
58554
|
+
loadError.set(null);
|
|
58555
|
+
}
|
|
58556
|
+
catch (err) {
|
|
58557
|
+
loadError.set(err);
|
|
58558
|
+
}
|
|
58559
|
+
finally {
|
|
58560
|
+
loading.set(false);
|
|
58561
|
+
}
|
|
58562
|
+
}
|
|
58563
|
+
if (options?.autoLoad !== false) {
|
|
58564
|
+
void reload();
|
|
58565
|
+
}
|
|
58566
|
+
return {
|
|
58567
|
+
loading: loading.asReadonly(),
|
|
58568
|
+
loadError: loadError.asReadonly(),
|
|
58569
|
+
errorState,
|
|
58570
|
+
reload,
|
|
58571
|
+
};
|
|
58572
|
+
}
|
|
58573
|
+
|
|
58437
58574
|
/**
|
|
58438
58575
|
* Cross-Platform Version Helpers
|
|
58439
58576
|
*
|
|
@@ -62419,14 +62556,14 @@ class FeedbackFormComponent {
|
|
|
62419
62556
|
|
|
62420
62557
|
@if (error()) {
|
|
62421
62558
|
<div class="feedback-alert error">
|
|
62422
|
-
<ion-icon name="close-circle-outline"></ion-icon>
|
|
62559
|
+
<ion-icon name="close-circle-outline" aria-hidden="true"></ion-icon>
|
|
62423
62560
|
<span>{{ error() }}</span>
|
|
62424
62561
|
</div>
|
|
62425
62562
|
}
|
|
62426
62563
|
|
|
62427
62564
|
@if (isSuccess()) {
|
|
62428
62565
|
<div class="feedback-alert success">
|
|
62429
|
-
<ion-icon name="checkmark-circle-outline"></ion-icon>
|
|
62566
|
+
<ion-icon name="checkmark-circle-outline" aria-hidden="true"></ion-icon>
|
|
62430
62567
|
<span>{{ props.successMessage || i18n.t('feedbackSuccess') }}</span>
|
|
62431
62568
|
</div>
|
|
62432
62569
|
}
|
|
@@ -62454,14 +62591,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
62454
62591
|
|
|
62455
62592
|
@if (error()) {
|
|
62456
62593
|
<div class="feedback-alert error">
|
|
62457
|
-
<ion-icon name="close-circle-outline"></ion-icon>
|
|
62594
|
+
<ion-icon name="close-circle-outline" aria-hidden="true"></ion-icon>
|
|
62458
62595
|
<span>{{ error() }}</span>
|
|
62459
62596
|
</div>
|
|
62460
62597
|
}
|
|
62461
62598
|
|
|
62462
62599
|
@if (isSuccess()) {
|
|
62463
62600
|
<div class="feedback-alert success">
|
|
62464
|
-
<ion-icon name="checkmark-circle-outline"></ion-icon>
|
|
62601
|
+
<ion-icon name="checkmark-circle-outline" aria-hidden="true"></ion-icon>
|
|
62465
62602
|
<span>{{ props.successMessage || i18n.t('feedbackSuccess') }}</span>
|
|
62466
62603
|
</div>
|
|
62467
62604
|
}
|
|
@@ -63495,7 +63632,7 @@ class DocsNavLinksComponent {
|
|
|
63495
63632
|
[href]="getHref(props.previous.route)"
|
|
63496
63633
|
(click)="onNavigate($event, props.previous.route)"
|
|
63497
63634
|
>
|
|
63498
|
-
<ion-icon name="arrow-back-outline" class="docs-nav-links__icon"></ion-icon>
|
|
63635
|
+
<ion-icon name="arrow-back-outline" class="docs-nav-links__icon" aria-hidden="true"></ion-icon>
|
|
63499
63636
|
<div class="docs-nav-links__text">
|
|
63500
63637
|
<span class="docs-nav-links__label">{{ props.previous.label || previousLabel() }}</span>
|
|
63501
63638
|
<span class="docs-nav-links__title">{{ props.previous.title }}</span>
|
|
@@ -63505,10 +63642,7 @@ class DocsNavLinksComponent {
|
|
|
63505
63642
|
</div>
|
|
63506
63643
|
|
|
63507
63644
|
<!-- Next -->
|
|
63508
|
-
<div
|
|
63509
|
-
class="docs-nav-links__item docs-nav-links__item--next"
|
|
63510
|
-
[class.docs-nav-links__item--empty]="!props.next"
|
|
63511
|
-
>
|
|
63645
|
+
<div class="docs-nav-links__item docs-nav-links__item--next" [class.docs-nav-links__item--empty]="!props.next">
|
|
63512
63646
|
@if (props.next) {
|
|
63513
63647
|
<a
|
|
63514
63648
|
class="docs-nav-links__link"
|
|
@@ -63519,7 +63653,7 @@ class DocsNavLinksComponent {
|
|
|
63519
63653
|
<span class="docs-nav-links__label">{{ props.next.label || nextLabel() }}</span>
|
|
63520
63654
|
<span class="docs-nav-links__title">{{ props.next.title }}</span>
|
|
63521
63655
|
</div>
|
|
63522
|
-
<ion-icon name="arrow-forward-outline" class="docs-nav-links__icon"></ion-icon>
|
|
63656
|
+
<ion-icon name="arrow-forward-outline" class="docs-nav-links__icon" aria-hidden="true"></ion-icon>
|
|
63523
63657
|
</a>
|
|
63524
63658
|
}
|
|
63525
63659
|
</div>
|
|
@@ -63541,7 +63675,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
63541
63675
|
[href]="getHref(props.previous.route)"
|
|
63542
63676
|
(click)="onNavigate($event, props.previous.route)"
|
|
63543
63677
|
>
|
|
63544
|
-
<ion-icon name="arrow-back-outline" class="docs-nav-links__icon"></ion-icon>
|
|
63678
|
+
<ion-icon name="arrow-back-outline" class="docs-nav-links__icon" aria-hidden="true"></ion-icon>
|
|
63545
63679
|
<div class="docs-nav-links__text">
|
|
63546
63680
|
<span class="docs-nav-links__label">{{ props.previous.label || previousLabel() }}</span>
|
|
63547
63681
|
<span class="docs-nav-links__title">{{ props.previous.title }}</span>
|
|
@@ -63551,10 +63685,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
63551
63685
|
</div>
|
|
63552
63686
|
|
|
63553
63687
|
<!-- Next -->
|
|
63554
|
-
<div
|
|
63555
|
-
class="docs-nav-links__item docs-nav-links__item--next"
|
|
63556
|
-
[class.docs-nav-links__item--empty]="!props.next"
|
|
63557
|
-
>
|
|
63688
|
+
<div class="docs-nav-links__item docs-nav-links__item--next" [class.docs-nav-links__item--empty]="!props.next">
|
|
63558
63689
|
@if (props.next) {
|
|
63559
63690
|
<a
|
|
63560
63691
|
class="docs-nav-links__link"
|
|
@@ -63565,7 +63696,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
63565
63696
|
<span class="docs-nav-links__label">{{ props.next.label || nextLabel() }}</span>
|
|
63566
63697
|
<span class="docs-nav-links__title">{{ props.next.title }}</span>
|
|
63567
63698
|
</div>
|
|
63568
|
-
<ion-icon name="arrow-forward-outline" class="docs-nav-links__icon"></ion-icon>
|
|
63699
|
+
<ion-icon name="arrow-forward-outline" class="docs-nav-links__icon" aria-hidden="true"></ion-icon>
|
|
63569
63700
|
</a>
|
|
63570
63701
|
}
|
|
63571
63702
|
</div>
|
|
@@ -63894,7 +64025,7 @@ class DocsCodeExampleComponent {
|
|
|
63894
64025
|
rel="noopener noreferrer"
|
|
63895
64026
|
>
|
|
63896
64027
|
{{ props.externalLink.label || 'Open in StackBlitz' }}
|
|
63897
|
-
<ion-icon name="open-outline"></ion-icon>
|
|
64028
|
+
<ion-icon name="open-outline" aria-hidden="true"></ion-icon>
|
|
63898
64029
|
</a>
|
|
63899
64030
|
}
|
|
63900
64031
|
</div>
|
|
@@ -63935,7 +64066,11 @@ class DocsCodeExampleComponent {
|
|
|
63935
64066
|
[attr.aria-label]="copied() ? 'Code copied' : 'Copy code'"
|
|
63936
64067
|
(click)="copyCode()"
|
|
63937
64068
|
>
|
|
63938
|
-
<ion-icon
|
|
64069
|
+
<ion-icon
|
|
64070
|
+
slot="icon-only"
|
|
64071
|
+
[name]="copied() ? 'checkmark-outline' : 'copy-outline'"
|
|
64072
|
+
aria-hidden="true"
|
|
64073
|
+
></ion-icon>
|
|
63939
64074
|
</ion-button>
|
|
63940
64075
|
}
|
|
63941
64076
|
</div>
|
|
@@ -63974,7 +64109,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
63974
64109
|
rel="noopener noreferrer"
|
|
63975
64110
|
>
|
|
63976
64111
|
{{ props.externalLink.label || 'Open in StackBlitz' }}
|
|
63977
|
-
<ion-icon name="open-outline"></ion-icon>
|
|
64112
|
+
<ion-icon name="open-outline" aria-hidden="true"></ion-icon>
|
|
63978
64113
|
</a>
|
|
63979
64114
|
}
|
|
63980
64115
|
</div>
|
|
@@ -64015,7 +64150,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
64015
64150
|
[attr.aria-label]="copied() ? 'Code copied' : 'Copy code'"
|
|
64016
64151
|
(click)="copyCode()"
|
|
64017
64152
|
>
|
|
64018
|
-
<ion-icon
|
|
64153
|
+
<ion-icon
|
|
64154
|
+
slot="icon-only"
|
|
64155
|
+
[name]="copied() ? 'checkmark-outline' : 'copy-outline'"
|
|
64156
|
+
aria-hidden="true"
|
|
64157
|
+
></ion-icon>
|
|
64019
64158
|
</ion-button>
|
|
64020
64159
|
}
|
|
64021
64160
|
</div>
|
|
@@ -64095,9 +64234,7 @@ class DocsSearchComponent {
|
|
|
64095
64234
|
});
|
|
64096
64235
|
return results.slice(0, 10); // Limit results
|
|
64097
64236
|
});
|
|
64098
|
-
this.searchSubject
|
|
64099
|
-
.pipe(debounceTime$1(this.props.debounceMs || 150), takeUntil$1(this.destroy$))
|
|
64100
|
-
.subscribe((query) => {
|
|
64237
|
+
this.searchSubject.pipe(debounceTime$1(this.props.debounceMs || 150), takeUntil$1(this.destroy$)).subscribe(query => {
|
|
64101
64238
|
this.search.emit(query);
|
|
64102
64239
|
});
|
|
64103
64240
|
}
|
|
@@ -64129,11 +64266,11 @@ class DocsSearchComponent {
|
|
|
64129
64266
|
switch (event.key) {
|
|
64130
64267
|
case 'ArrowDown':
|
|
64131
64268
|
event.preventDefault();
|
|
64132
|
-
this.selectedIndex.update(
|
|
64269
|
+
this.selectedIndex.update(i => Math.min(i + 1, resultsArray.length - 1));
|
|
64133
64270
|
break;
|
|
64134
64271
|
case 'ArrowUp':
|
|
64135
64272
|
event.preventDefault();
|
|
64136
|
-
this.selectedIndex.update(
|
|
64273
|
+
this.selectedIndex.update(i => Math.max(i - 1, 0));
|
|
64137
64274
|
break;
|
|
64138
64275
|
case 'Enter':
|
|
64139
64276
|
event.preventDefault();
|
|
@@ -64162,7 +64299,7 @@ class DocsSearchComponent {
|
|
|
64162
64299
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DocsSearchComponent, isStandalone: true, selector: "val-docs-search", inputs: { props: "props" }, outputs: { navigate: "navigate", search: "search" }, host: { listeners: { "document:keydown": "onGlobalKeydown($event)" } }, viewQueries: [{ propertyName: "searchInputEl", first: true, predicate: ["searchInput"], descendants: true }], ngImport: i0, template: `
|
|
64163
64300
|
<div class="docs-search" [class]="props.cssClass">
|
|
64164
64301
|
<div class="docs-search__input-wrapper">
|
|
64165
|
-
<ion-icon name="search-outline" class="docs-search__icon"></ion-icon>
|
|
64302
|
+
<ion-icon name="search-outline" class="docs-search__icon" aria-hidden="true"></ion-icon>
|
|
64166
64303
|
<input
|
|
64167
64304
|
#searchInput
|
|
64168
64305
|
type="text"
|
|
@@ -64177,13 +64314,8 @@ class DocsSearchComponent {
|
|
|
64177
64314
|
autocomplete="off"
|
|
64178
64315
|
/>
|
|
64179
64316
|
@if (searchQuery()) {
|
|
64180
|
-
<button
|
|
64181
|
-
|
|
64182
|
-
class="docs-search__clear"
|
|
64183
|
-
(click)="clearSearch()"
|
|
64184
|
-
aria-label="Clear search"
|
|
64185
|
-
>
|
|
64186
|
-
<ion-icon name="close-outline"></ion-icon>
|
|
64317
|
+
<button type="button" class="docs-search__clear" (click)="clearSearch()" aria-label="Clear search">
|
|
64318
|
+
<ion-icon name="close-outline" aria-hidden="true"></ion-icon>
|
|
64187
64319
|
</button>
|
|
64188
64320
|
} @else if (props.showShortcut) {
|
|
64189
64321
|
<span class="docs-search__shortcut">{{ isMac ? '⌘' : 'Ctrl' }}+K</span>
|
|
@@ -64213,9 +64345,7 @@ class DocsSearchComponent {
|
|
|
64213
64345
|
}
|
|
64214
64346
|
|
|
64215
64347
|
@if (showResults() && searchQuery() && results().length === 0) {
|
|
64216
|
-
<div class="docs-search__no-results">
|
|
64217
|
-
No results found for "{{ searchQuery() }}"
|
|
64218
|
-
</div>
|
|
64348
|
+
<div class="docs-search__no-results">No results found for "{{ searchQuery() }}"</div>
|
|
64219
64349
|
}
|
|
64220
64350
|
</div>
|
|
64221
64351
|
`, isInline: true, styles: [".docs-search{--search-bg: var(--ion-background-color, #fff);--search-border: var(--ion-border-color, #e0e0e0);--search-text: var(--ion-text-color, #1a1a1a);--search-placeholder: var(--ion-color-medium, #666);--search-hover-bg: rgba(0, 0, 0, .03);--search-active-bg: rgba(0, 0, 0, .05);position:relative;font-family:var(--ion-font-family, system-ui, sans-serif)}.docs-search__input-wrapper{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:var(--search-bg);border:1px solid var(--search-border);border-radius:8px;transition:all .15s ease}.docs-search__input-wrapper:focus-within{border-color:#1a1a1a;box-shadow:0 0 0 3px #0000000d}.docs-search__icon{font-size:1rem;color:var(--search-placeholder);flex-shrink:0}.docs-search__input{flex:1;border:none;outline:none;background:transparent;font-size:.875rem;color:var(--search-text);min-width:0}.docs-search__input::placeholder{color:var(--search-placeholder)}.docs-search__clear{display:flex;align-items:center;justify-content:center;padding:.25rem;border:none;background:transparent;color:var(--search-placeholder);cursor:pointer;border-radius:4px;transition:all .15s ease}.docs-search__clear:hover{background:var(--search-hover-bg);color:var(--search-text)}.docs-search__clear:focus-visible{outline:2px solid #1a1a1a;outline-offset:2px}.docs-search__clear ion-icon{font-size:.875rem}.docs-search__shortcut{font-size:.6875rem;font-weight:500;color:var(--search-placeholder);background:var(--search-hover-bg);padding:.125rem .375rem;border-radius:4px;white-space:nowrap}.docs-search__results{position:absolute;top:calc(100% + 4px);left:0;right:0;max-height:400px;overflow-y:auto;background:var(--search-bg);border:1px solid var(--search-border);border-radius:8px;box-shadow:0 4px 16px #0000001a;z-index:100}.docs-search__result{display:flex;flex-direction:column;gap:.125rem;width:100%;padding:.75rem 1rem;border:none;background:transparent;text-align:left;cursor:pointer;transition:background .15s ease;border-bottom:1px solid var(--search-border)}.docs-search__result:last-child{border-bottom:none}.docs-search__result:hover,.docs-search__result--active{background:var(--search-hover-bg)}.docs-search__result:focus-visible{outline:2px solid #1a1a1a;outline-offset:-2px}.docs-search__result-section{font-size:.625rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--search-placeholder)}.docs-search__result-label{font-size:.875rem;font-weight:500;color:var(--search-text)}.docs-search__result-description{font-size:.75rem;color:var(--search-placeholder);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-search__no-results{padding:1.5rem 1rem;text-align:center;font-size:.875rem;color:var(--search-placeholder);background:var(--search-bg);border:1px solid var(--search-border);border-radius:8px;box-shadow:0 4px 16px #0000001a;position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:100}:host-context(.dark) .docs-search,:host-context([color-scheme=dark]) .docs-search{--search-bg: #1e1e1e;--search-border: #3a3a3a;--search-text: #f4f5f8;--search-placeholder: #a0a0a0;--search-hover-bg: rgba(255, 255, 255, .05);--search-active-bg: rgba(255, 255, 255, .08)}:host-context(.dark) .docs-search__input-wrapper:focus-within,:host-context([color-scheme=dark]) .docs-search__input-wrapper:focus-within{border-color:#f4f5f8;box-shadow:0 0 0 3px #ffffff0d}:host-context(.dark) .docs-search__results,:host-context(.dark) .docs-search__no-results,:host-context([color-scheme=dark]) .docs-search__results,:host-context([color-scheme=dark]) .docs-search__no-results{box-shadow:0 4px 16px #0000004d}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
|
|
@@ -64225,7 +64355,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
64225
64355
|
args: [{ selector: 'val-docs-search', standalone: true, imports: [CommonModule, FormsModule, IonIcon], template: `
|
|
64226
64356
|
<div class="docs-search" [class]="props.cssClass">
|
|
64227
64357
|
<div class="docs-search__input-wrapper">
|
|
64228
|
-
<ion-icon name="search-outline" class="docs-search__icon"></ion-icon>
|
|
64358
|
+
<ion-icon name="search-outline" class="docs-search__icon" aria-hidden="true"></ion-icon>
|
|
64229
64359
|
<input
|
|
64230
64360
|
#searchInput
|
|
64231
64361
|
type="text"
|
|
@@ -64240,13 +64370,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
64240
64370
|
autocomplete="off"
|
|
64241
64371
|
/>
|
|
64242
64372
|
@if (searchQuery()) {
|
|
64243
|
-
<button
|
|
64244
|
-
|
|
64245
|
-
class="docs-search__clear"
|
|
64246
|
-
(click)="clearSearch()"
|
|
64247
|
-
aria-label="Clear search"
|
|
64248
|
-
>
|
|
64249
|
-
<ion-icon name="close-outline"></ion-icon>
|
|
64373
|
+
<button type="button" class="docs-search__clear" (click)="clearSearch()" aria-label="Clear search">
|
|
64374
|
+
<ion-icon name="close-outline" aria-hidden="true"></ion-icon>
|
|
64250
64375
|
</button>
|
|
64251
64376
|
} @else if (props.showShortcut) {
|
|
64252
64377
|
<span class="docs-search__shortcut">{{ isMac ? '⌘' : 'Ctrl' }}+K</span>
|
|
@@ -64276,9 +64401,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
64276
64401
|
}
|
|
64277
64402
|
|
|
64278
64403
|
@if (showResults() && searchQuery() && results().length === 0) {
|
|
64279
|
-
<div class="docs-search__no-results">
|
|
64280
|
-
No results found for "{{ searchQuery() }}"
|
|
64281
|
-
</div>
|
|
64404
|
+
<div class="docs-search__no-results">No results found for "{{ searchQuery() }}"</div>
|
|
64282
64405
|
}
|
|
64283
64406
|
</div>
|
|
64284
64407
|
`, styles: [".docs-search{--search-bg: var(--ion-background-color, #fff);--search-border: var(--ion-border-color, #e0e0e0);--search-text: var(--ion-text-color, #1a1a1a);--search-placeholder: var(--ion-color-medium, #666);--search-hover-bg: rgba(0, 0, 0, .03);--search-active-bg: rgba(0, 0, 0, .05);position:relative;font-family:var(--ion-font-family, system-ui, sans-serif)}.docs-search__input-wrapper{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:var(--search-bg);border:1px solid var(--search-border);border-radius:8px;transition:all .15s ease}.docs-search__input-wrapper:focus-within{border-color:#1a1a1a;box-shadow:0 0 0 3px #0000000d}.docs-search__icon{font-size:1rem;color:var(--search-placeholder);flex-shrink:0}.docs-search__input{flex:1;border:none;outline:none;background:transparent;font-size:.875rem;color:var(--search-text);min-width:0}.docs-search__input::placeholder{color:var(--search-placeholder)}.docs-search__clear{display:flex;align-items:center;justify-content:center;padding:.25rem;border:none;background:transparent;color:var(--search-placeholder);cursor:pointer;border-radius:4px;transition:all .15s ease}.docs-search__clear:hover{background:var(--search-hover-bg);color:var(--search-text)}.docs-search__clear:focus-visible{outline:2px solid #1a1a1a;outline-offset:2px}.docs-search__clear ion-icon{font-size:.875rem}.docs-search__shortcut{font-size:.6875rem;font-weight:500;color:var(--search-placeholder);background:var(--search-hover-bg);padding:.125rem .375rem;border-radius:4px;white-space:nowrap}.docs-search__results{position:absolute;top:calc(100% + 4px);left:0;right:0;max-height:400px;overflow-y:auto;background:var(--search-bg);border:1px solid var(--search-border);border-radius:8px;box-shadow:0 4px 16px #0000001a;z-index:100}.docs-search__result{display:flex;flex-direction:column;gap:.125rem;width:100%;padding:.75rem 1rem;border:none;background:transparent;text-align:left;cursor:pointer;transition:background .15s ease;border-bottom:1px solid var(--search-border)}.docs-search__result:last-child{border-bottom:none}.docs-search__result:hover,.docs-search__result--active{background:var(--search-hover-bg)}.docs-search__result:focus-visible{outline:2px solid #1a1a1a;outline-offset:-2px}.docs-search__result-section{font-size:.625rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--search-placeholder)}.docs-search__result-label{font-size:.875rem;font-weight:500;color:var(--search-text)}.docs-search__result-description{font-size:.75rem;color:var(--search-placeholder);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-search__no-results{padding:1.5rem 1rem;text-align:center;font-size:.875rem;color:var(--search-placeholder);background:var(--search-bg);border:1px solid var(--search-border);border-radius:8px;box-shadow:0 4px 16px #0000001a;position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:100}:host-context(.dark) .docs-search,:host-context([color-scheme=dark]) .docs-search{--search-bg: #1e1e1e;--search-border: #3a3a3a;--search-text: #f4f5f8;--search-placeholder: #a0a0a0;--search-hover-bg: rgba(255, 255, 255, .05);--search-active-bg: rgba(255, 255, 255, .08)}:host-context(.dark) .docs-search__input-wrapper:focus-within,:host-context([color-scheme=dark]) .docs-search__input-wrapper:focus-within{border-color:#f4f5f8;box-shadow:0 0 0 3px #ffffff0d}:host-context(.dark) .docs-search__results,:host-context(.dark) .docs-search__no-results,:host-context([color-scheme=dark]) .docs-search__results,:host-context([color-scheme=dark]) .docs-search__no-results{box-shadow:0 4px 16px #0000004d}\n"] }]
|
|
@@ -65849,9 +65972,10 @@ class MetricCardComponent {
|
|
|
65849
65972
|
fill="clear"
|
|
65850
65973
|
size="small"
|
|
65851
65974
|
[disabled]="action.disabled ?? false"
|
|
65975
|
+
[attr.aria-label]="action.token"
|
|
65852
65976
|
(click)="onAction.emit(action.token)"
|
|
65853
65977
|
>
|
|
65854
|
-
<ion-icon [name]="action.icon" slot="icon-only"></ion-icon>
|
|
65978
|
+
<ion-icon [name]="action.icon" slot="icon-only" aria-hidden="true"></ion-icon>
|
|
65855
65979
|
</ion-button>
|
|
65856
65980
|
}
|
|
65857
65981
|
</div>
|
|
@@ -65901,9 +66025,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
65901
66025
|
fill="clear"
|
|
65902
66026
|
size="small"
|
|
65903
66027
|
[disabled]="action.disabled ?? false"
|
|
66028
|
+
[attr.aria-label]="action.token"
|
|
65904
66029
|
(click)="onAction.emit(action.token)"
|
|
65905
66030
|
>
|
|
65906
|
-
<ion-icon [name]="action.icon" slot="icon-only"></ion-icon>
|
|
66031
|
+
<ion-icon [name]="action.icon" slot="icon-only" aria-hidden="true"></ion-icon>
|
|
65907
66032
|
</ion-button>
|
|
65908
66033
|
}
|
|
65909
66034
|
</div>
|
|
@@ -66249,7 +66374,7 @@ class TicketCardComponent {
|
|
|
66249
66374
|
<div class="ticket-card__qr-fallback">{{ tokenShort() }}</div>
|
|
66250
66375
|
} @else {
|
|
66251
66376
|
<div class="ticket-card__qr-loading">
|
|
66252
|
-
<ion-spinner name="crescent" />
|
|
66377
|
+
<ion-spinner name="crescent" aria-label="Generando QR" />
|
|
66253
66378
|
</div>
|
|
66254
66379
|
}
|
|
66255
66380
|
</div>
|
|
@@ -66283,7 +66408,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
66283
66408
|
<div class="ticket-card__qr-fallback">{{ tokenShort() }}</div>
|
|
66284
66409
|
} @else {
|
|
66285
66410
|
<div class="ticket-card__qr-loading">
|
|
66286
|
-
<ion-spinner name="crescent" />
|
|
66411
|
+
<ion-spinner name="crescent" aria-label="Generando QR" />
|
|
66287
66412
|
</div>
|
|
66288
66413
|
}
|
|
66289
66414
|
</div>
|
|
@@ -66641,5 +66766,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
66641
66766
|
* Generated bundle index. Do not edit.
|
|
66642
66767
|
*/
|
|
66643
66768
|
|
|
66644
|
-
export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentService, ContentTransformer, CookieBannerComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_BUTTON_PRESETS, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_PRESETS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DatePickerComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EditOrgModalComponent, EmptyStateComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, IONIC_COLORS$5 as IONIC_COLORS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METRIC_CARD_DEFAULTS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MenuComponent, MessagingService, MetaService, MetricCardComponent, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PermissionCatalogService, PermissionSelectorComponent, PermissionsViewComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, ProcessLinksPipe, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestService, RightsFooterComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TicketCardComponent, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VERSION, ValtechErrorService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildSettingsCards, button, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createPermissionLabeler, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAuth, provideValtechAuthInterceptor, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, storagePaths, superAdminGuard, toArticle };
|
|
66769
|
+
export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentService, ContentTransformer, CookieBannerComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_BUTTON_PRESETS, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_PRESETS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DatePickerComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EditOrgModalComponent, EmptyStateComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FontSizeOption, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, IONIC_COLORS$5 as IONIC_COLORS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METRIC_CARD_DEFAULTS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MenuComponent, MessagingService, MetaService, MetricCardComponent, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PermissionCatalogService, PermissionSelectorComponent, PermissionsViewComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, ProcessLinksPipe, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestService, RightsFooterComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TicketCardComponent, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VERSION, ValtechErrorService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildSettingsCards, button, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAuth, provideValtechAuthInterceptor, provideValtechContent, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, storagePaths, superAdminGuard, toArticle };
|
|
66645
66770
|
//# sourceMappingURL=valtech-components.mjs.map
|