valtech-components 2.0.1034 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/esm2022/lib/components/atoms/box/box.component.mjs +6 -8
  2. package/esm2022/lib/components/atoms/button/factory.mjs +24 -217
  3. package/esm2022/lib/components/atoms/divider/divider.component.mjs +2 -4
  4. package/esm2022/lib/components/atoms/href/href.component.mjs +1 -2
  5. package/esm2022/lib/components/atoms/image/image.component.mjs +36 -3
  6. package/esm2022/lib/components/molecules/action-card/action-card.component.mjs +4 -9
  7. package/esm2022/lib/components/molecules/breadcrumb/breadcrumb.component.mjs +4 -4
  8. package/esm2022/lib/components/molecules/card/card.component.mjs +53 -10
  9. package/esm2022/lib/components/molecules/checkbox-radio-input/checkbox-radio-input.component.mjs +27 -36
  10. package/esm2022/lib/components/molecules/chip-group/chip-group.component.mjs +44 -6
  11. package/esm2022/lib/components/molecules/command-display/command-display.component.mjs +32 -7
  12. package/esm2022/lib/components/molecules/comment/comment.component.mjs +28 -12
  13. package/esm2022/lib/components/molecules/cta-card/cta-card.component.mjs +4 -9
  14. package/esm2022/lib/components/molecules/date-picker/date-picker.component.mjs +240 -0
  15. package/esm2022/lib/components/molecules/date-picker/date-picker.i18n.mjs +6 -0
  16. package/esm2022/lib/components/molecules/date-picker/types.mjs +2 -0
  17. package/esm2022/lib/components/molecules/expandable-text/expandable-text.component.mjs +7 -7
  18. package/esm2022/lib/components/molecules/features-list/features-list.component.mjs +159 -71
  19. package/esm2022/lib/components/molecules/file-input/file-input.component.mjs +7 -3
  20. package/esm2022/lib/components/molecules/hint/hint.component.mjs +30 -5
  21. package/esm2022/lib/components/molecules/pagination/pagination.component.mjs +75 -19
  22. package/esm2022/lib/components/molecules/password-input/password-input.component.mjs +42 -9
  23. package/esm2022/lib/components/molecules/permission-selector/types.mjs +1 -1
  24. package/esm2022/lib/components/molecules/rating/rating.component.mjs +88 -12
  25. package/esm2022/lib/components/molecules/stepper/stepper.component.mjs +15 -7
  26. package/esm2022/lib/components/molecules/text-input/text-input.component.mjs +93 -7
  27. package/esm2022/lib/components/organisms/change-email-modal/change-email-modal.component.mjs +5 -5
  28. package/esm2022/lib/components/organisms/change-password-modal/change-password-modal.component.mjs +4 -4
  29. package/esm2022/lib/components/organisms/form/form.component.mjs +62 -20
  30. package/esm2022/lib/components/organisms/login/login.component.mjs +8 -8
  31. package/esm2022/lib/components/organisms/mfa-modal/mfa-modal.component.mjs +3 -3
  32. package/esm2022/lib/components/types.mjs +1 -1
  33. package/esm2022/lib/services/presets/default-presets.mjs +45 -0
  34. package/esm2022/lib/services/presets/index.mjs +3 -1
  35. package/esm2022/lib/services/presets/preset.service.mjs +17 -4
  36. package/esm2022/lib/services/requests/request-form-builder.service.mjs +8 -3
  37. package/esm2022/lib/shared/utils/ionic-color.mjs +36 -0
  38. package/esm2022/lib/version.mjs +2 -2
  39. package/esm2022/public-api.mjs +4 -8
  40. package/fesm2022/valtech-components.mjs +1381 -1027
  41. package/fesm2022/valtech-components.mjs.map +1 -1
  42. package/lib/components/atoms/box/box.component.d.ts +2 -5
  43. package/lib/components/atoms/button/factory.d.ts +15 -69
  44. package/lib/components/atoms/divider/divider.component.d.ts +1 -4
  45. package/lib/components/atoms/href/href.component.d.ts +2 -3
  46. package/lib/components/atoms/image/image.component.d.ts +5 -0
  47. package/lib/components/molecules/action-card/action-card.component.d.ts +1 -1
  48. package/lib/components/molecules/card/card.component.d.ts +2 -1
  49. package/lib/components/molecules/checkbox-radio-input/checkbox-radio-input.component.d.ts +2 -3
  50. package/lib/components/molecules/chip-group/chip-group.component.d.ts +5 -0
  51. package/lib/components/molecules/command-display/command-display.component.d.ts +4 -0
  52. package/lib/components/molecules/comment/comment.component.d.ts +3 -0
  53. package/lib/components/molecules/cta-card/cta-card.component.d.ts +0 -1
  54. package/lib/components/molecules/date-picker/date-picker.component.d.ts +50 -0
  55. package/lib/components/molecules/date-picker/date-picker.i18n.d.ts +3 -0
  56. package/lib/components/molecules/date-picker/types.d.ts +30 -0
  57. package/lib/components/molecules/hint/hint.component.d.ts +11 -1
  58. package/lib/components/molecules/pagination/pagination.component.d.ts +5 -0
  59. package/lib/components/molecules/password-input/password-input.component.d.ts +4 -2
  60. package/lib/components/molecules/permission-selector/types.d.ts +1 -0
  61. package/lib/components/molecules/rating/rating.component.d.ts +11 -0
  62. package/lib/components/molecules/text-input/text-input.component.d.ts +21 -0
  63. package/lib/components/organisms/form/form.component.d.ts +19 -0
  64. package/lib/components/types.d.ts +21 -1
  65. package/lib/services/presets/default-presets.d.ts +22 -0
  66. package/lib/services/presets/index.d.ts +1 -0
  67. package/lib/services/presets/preset.service.d.ts +4 -0
  68. package/lib/shared/utils/ionic-color.d.ts +20 -0
  69. package/lib/version.d.ts +1 -1
  70. package/package.json +3 -2
  71. package/public-api.d.ts +3 -7
  72. package/src/lib/components/styles/mixins.scss +16 -0
  73. package/esm2022/lib/components/molecules/content-card/content-card.component.mjs +0 -86
  74. package/esm2022/lib/components/molecules/content-card/types.mjs +0 -11
  75. package/esm2022/lib/components/molecules/email-input/email-input.component.mjs +0 -68
  76. package/esm2022/lib/components/molecules/hour-input/hour-input.component.mjs +0 -28
  77. package/esm2022/lib/components/molecules/info-card/info-card.component.mjs +0 -126
  78. package/esm2022/lib/components/molecules/info-card/types.mjs +0 -11
  79. package/esm2022/lib/components/molecules/number-input/number-input.component.mjs +0 -34
  80. package/lib/components/molecules/content-card/content-card.component.d.ts +0 -26
  81. package/lib/components/molecules/content-card/types.d.ts +0 -30
  82. package/lib/components/molecules/email-input/email-input.component.d.ts +0 -34
  83. package/lib/components/molecules/hour-input/hour-input.component.d.ts +0 -15
  84. package/lib/components/molecules/info-card/info-card.component.d.ts +0 -37
  85. package/lib/components/molecules/info-card/types.d.ts +0 -44
  86. package/lib/components/molecules/number-input/number-input.component.d.ts +0 -16
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, InjectionToken, makeEnvironmentProviders, APP_INITIALIZER, ErrorHandler, Injectable, DestroyRef, Inject, signal, computed, PLATFORM_ID, isDevMode, Optional, runInInjectionContext, effect, Pipe, TemplateRef, ViewContainerRef, input, Directive, EventEmitter, Component, Input, Output, ChangeDetectionStrategy, HostBinding, HostListener, NgZone, ViewChild, ChangeDetectorRef, output, ContentChild, model, ElementRef, viewChild, untracked, Injector, isSignal, ViewEncapsulation } from '@angular/core';
2
+ import { inject, InjectionToken, makeEnvironmentProviders, APP_INITIALIZER, ErrorHandler, Injectable, DestroyRef, Inject, signal, computed, PLATFORM_ID, isDevMode, Optional, runInInjectionContext, effect, Pipe, TemplateRef, ViewContainerRef, input, Directive, EventEmitter, Component, Input, Output, ChangeDetectionStrategy, HostBinding, HostListener, NgZone, ViewChild, ChangeDetectorRef, output, ContentChild, model, ElementRef, viewChild, untracked, Injector, ViewEncapsulation, isSignal } from '@angular/core';
3
3
  import { BehaviorSubject, throwError, Subject, map, distinctUntilChanged, filter as filter$1, take as take$1, firstValueFrom, of, from, EMPTY, Observable, interval, debounceTime, switchMap as switchMap$1, catchError as catchError$1, takeUntil, isObservable, forkJoin, race, timer, shareReplay } from 'rxjs';
4
4
  import { catchError, switchMap, finalize, filter, take, map as map$1, tap, distinctUntilChanged as distinctUntilChanged$1, retry, timeout, debounceTime as debounceTime$1, takeUntil as takeUntil$1 } from 'rxjs/operators';
5
5
  import * as i1$3 from '@angular/common/http';
@@ -23,7 +23,7 @@ import { IonicModule, ToastController, NavController } from '@ionic/angular';
23
23
  import { isSupported, getMessaging as getMessaging$1 } from 'firebase/messaging';
24
24
  import { getApps, getApp, initializeApp as initializeApp$1 } from 'firebase/app';
25
25
  import * as i2$1 from '@ionic/angular/standalone';
26
- import { AlertController, IonAvatar, IonCard, IonIcon, IonButton, IonSpinner, IonText, IonModal, IonHeader, IonToolbar, IonContent, IonButtons, IonTitle, IonProgressBar, IonSkeletonText, IonFab, IonFabButton, IonFabList, IonLabel, IonCardContent, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCheckbox, IonTextarea, IonDatetime, IonInput, IonSelect, IonSelectOption, IonPopover, IonList, IonItem, IonRadioGroup, IonRadio, IonRange, IonSearchbar, IonSegment, IonSegmentButton, IonToggle, IonRippleEffect, IonAccordion, IonAccordionGroup, IonTabBar, IonTabButton, IonBadge, IonBreadcrumb, IonBreadcrumbs, IonChip, IonNote, IonDatetimeButton, ToastController as ToastController$1, IonCol, IonRow, IonRefresher, IonRefresherContent, IonMenuButton, IonFooter, IonListHeader, IonInfiniteScroll, IonInfiniteScrollContent, IonGrid, MenuController, IonMenu, IonMenuToggle, IonSplitPane } from '@ionic/angular/standalone';
26
+ import { AlertController, IonAvatar, IonCard, IonIcon, IonButton, IonSpinner, IonText, IonModal, IonHeader, IonToolbar, IonContent, IonButtons, IonTitle, IonProgressBar, IonSkeletonText, IonFab, IonFabButton, IonFabList, IonLabel, IonCardContent, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCheckbox, IonRadio, IonRadioGroup, IonTextarea, IonDatetime, IonSelect, IonSelectOption, IonPopover, IonList, IonItem, IonInput, IonRange, IonSearchbar, IonSegment, IonSegmentButton, IonToggle, IonRippleEffect, IonAccordion, IonAccordionGroup, IonTabBar, IonTabButton, IonBadge, IonBreadcrumb, IonBreadcrumbs, IonChip, IonNote, IonDatetimeButton, ToastController as ToastController$1, IonCol, IonRow, IonRefresher, IonRefresherContent, IonMenuButton, IonFooter, IonListHeader, IonInfiniteScroll, IonInfiniteScrollContent, IonGrid, MenuController, IonMenu, IonMenuToggle, IonSplitPane } from '@ionic/angular/standalone';
27
27
  import { addIcons } from 'ionicons';
28
28
  import { addOutline, addCircleOutline, alertOutline, alertCircleOutline, arrowBackOutline, arrowForwardOutline, arrowDownOutline, settings, settingsOutline, checkmarkCircleOutline, ellipsisHorizontalOutline, notifications, notificationsOutline, openOutline, closeOutline, chatbubblesOutline, shareOutline, heart, heartOutline, home, homeOutline, eyeOffOutline, eyeOutline, scanOutline, chevronDownOutline, chevronForwardOutline, checkmarkOutline, clipboardOutline, copyOutline, filterOutline, locationOutline, calendarOutline, businessOutline, logoTwitter, logoInstagram, logoLinkedin, logoYoutube, logoTiktok, logoFacebook, logoGoogle, createOutline, trashOutline, playOutline, peopleOutline, phonePortraitOutline, refreshOutline, documentTextOutline, lockClosedOutline, informationCircleOutline, logoNpm, removeOutline, optionsOutline, personOutline, shieldCheckmarkOutline, keyOutline, desktopOutline, logOutOutline, cloudDownloadOutline, cloudOutline, gitBranchOutline, layersOutline, serverOutline, warningOutline, bulbOutline, lockOpenOutline, diamondOutline, add, close, share, create, trash, star, camera, mic, send, downloadOutline, chevronDown, language, globeOutline, checkmark, list, grid, apps, menu, search, person, helpCircle, informationCircle, documentText, mail, calendar, folder, chevronForward, ellipsisHorizontal, chevronBack, playBack, playForward, ellipse, starOutline, starHalf, heartHalf, checkmarkCircle, timeOutline, flag, trendingUp, trendingDown, remove, analytics, people, cash, cart, eye, chatbubbleOutline, thumbsUpOutline, thumbsUp, happyOutline, happy, sadOutline, sad, chevronUp, pin, pencil, callOutline, logoWhatsapp, paperPlaneOutline, mailOutline, chevronDownCircleOutline, closeCircle, alertCircle, logoApple, logoMicrosoft, linkOutline, unlinkOutline, cloudOfflineOutline, documentOutline, attachOutline, cameraOutline, closeCircleOutline, imageOutline, chevronBackOutline, sendOutline, chatbubbleEllipsesOutline, swapVerticalOutline, chevronUpOutline, searchOutline, cartOutline, chatbubble, compass, compassOutline, gridOutline, listOutline, folderOutline, documents, documentsOutline, statsChart, statsChartOutline, laptopOutline, swapHorizontalOutline, cloudUploadOutline, notificationsOffOutline, alarmOutline, chatboxEllipsesOutline, checkmarkDoneOutline, cogOutline, shareSocialOutline, helpCircleOutline, menuOutline, stopCircleOutline, videocamOffOutline } from 'ionicons/icons';
29
29
  import { Browser } from '@capacitor/browser';
@@ -46,6 +46,7 @@ import { Navigation, Pagination, EffectFade, EffectCube, EffectCoverflow, Effect
46
46
  import { SwUpdate } from '@angular/service-worker';
47
47
  import { ImageCropperComponent } from 'ngx-image-cropper';
48
48
  import Compressor from 'compressorjs';
49
+ import { Calendar } from 'vanilla-calendar-pro';
49
50
  import { Capacitor } from '@capacitor/core';
50
51
  import 'prismjs/components/prism-scss';
51
52
  import 'prismjs/components/prism-json';
@@ -55,7 +56,7 @@ import { BrowserMultiFormatReader } from '@zxing/browser';
55
56
  * Current version of valtech-components.
56
57
  * This is automatically updated during the publish process.
57
58
  */
58
- const VERSION = '2.0.1034';
59
+ const VERSION = '4.0.0';
59
60
 
60
61
  // Control de estado de refresco (singleton a nivel de módulo)
61
62
  let isRefreshing = false;
@@ -9441,6 +9442,51 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
9441
9442
  }]
9442
9443
  }], ctorParameters: () => [] });
9443
9444
 
9445
+ /**
9446
+ * Presets de botón por defecto provistos por la librería.
9447
+ *
9448
+ * Son el reemplazo recomendado de las factories deprecadas de
9449
+ * `atoms/button/factory.ts`: en vez de construir el `ButtonMetadata` a mano,
9450
+ * el consumer usa `<val-button preset="primary-round" [props]="{ text }">`.
9451
+ *
9452
+ * Cada preset define solo el ESTILO reutilizable (color/fill/shape/expand/size).
9453
+ * El `text`, `type`, `state`, `icon` y `href` se pasan por `[props]` en cada uso.
9454
+ *
9455
+ * Disponibles sin configuración: `PresetService` los siembra de fábrica y
9456
+ * `provideValtechPresets` los preserva (las apps EXTIENDEN estos defaults en
9457
+ * vez de pisarlos). Una app puede sobrescribir un preset declarando la misma
9458
+ * clave bajo `button` en su `APP_PRESETS`.
9459
+ */
9460
+ const DEFAULT_BUTTON_PRESETS = {
9461
+ // Primary
9462
+ primary: { color: 'primary', fill: 'solid' },
9463
+ 'primary-round': { color: 'primary', fill: 'solid', shape: 'round' },
9464
+ 'primary-block': { color: 'primary', fill: 'solid', expand: 'block' },
9465
+ 'primary-full': { color: 'primary', fill: 'solid', expand: 'full' },
9466
+ // Secondary
9467
+ secondary: { color: 'secondary', fill: 'solid' },
9468
+ 'secondary-round': { color: 'secondary', fill: 'solid', shape: 'round' },
9469
+ // Generic solid (color-agnostic — color comes from val-button default / props)
9470
+ solid: { fill: 'solid' },
9471
+ 'solid-round': { fill: 'solid', shape: 'round' },
9472
+ 'solid-block': { color: 'primary', fill: 'solid', expand: 'block' },
9473
+ // Outline / Clear
9474
+ outline: { fill: 'outline' },
9475
+ 'outline-round': { fill: 'outline', shape: 'round' },
9476
+ clear: { fill: 'clear' },
9477
+ 'clear-round': { fill: 'clear', shape: 'round' },
9478
+ // Intent
9479
+ danger: { color: 'danger', fill: 'solid' },
9480
+ 'danger-round': { color: 'danger', fill: 'solid', shape: 'round' },
9481
+ };
9482
+ /**
9483
+ * Presets que la librería siembra de fábrica en `PresetService`.
9484
+ * Hoy solo botón; agregar otros componentes acá a medida que se definan.
9485
+ */
9486
+ const DEFAULT_PRESETS = {
9487
+ button: DEFAULT_BUTTON_PRESETS,
9488
+ };
9489
+
9444
9490
  /**
9445
9491
  * Servicio para gestionar presets de componentes.
9446
9492
  *
@@ -9458,7 +9504,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
9458
9504
  */
9459
9505
  class PresetService {
9460
9506
  constructor() {
9461
- this._presets = signal({});
9507
+ // Seeded with library defaults (e.g. button presets). Apps EXTEND these via
9508
+ // registerPresets (merge), so the defaults survive app-level registration.
9509
+ this._presets = signal(structuredClone(DEFAULT_PRESETS));
9462
9510
  }
9463
9511
  /**
9464
9512
  * Obtiene un preset específico para un componente
@@ -9498,6 +9546,10 @@ class PresetService {
9498
9546
  *
9499
9547
  * @param presets Configuración de presets
9500
9548
  *
9549
+ * Hace MERGE por componente sobre lo ya registrado (incluidos los defaults
9550
+ * de la librería), así que las apps EXTIENDEN los presets existentes en vez
9551
+ * de reemplazarlos. Para sobrescribir un preset, declarar la misma clave.
9552
+ *
9501
9553
  * @example
9502
9554
  * presets.registerPresets({
9503
9555
  * button: {
@@ -9509,13 +9561,19 @@ class PresetService {
9509
9561
  * });
9510
9562
  */
9511
9563
  registerPresets(presets) {
9512
- this._presets.set(presets);
9564
+ this._presets.update(current => {
9565
+ const merged = { ...current };
9566
+ for (const [component, componentPresets] of Object.entries(presets)) {
9567
+ merged[component] = { ...(current[component] ?? {}), ...componentPresets };
9568
+ }
9569
+ return merged;
9570
+ });
9513
9571
  }
9514
9572
  /**
9515
9573
  * Agrega presets para un componente específico (merge con existentes)
9516
9574
  */
9517
9575
  registerComponentPresets(component, presets) {
9518
- this._presets.update((current) => ({
9576
+ this._presets.update(current => ({
9519
9577
  ...current,
9520
9578
  [component]: {
9521
9579
  ...current[component],
@@ -9679,95 +9737,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
9679
9737
  type: Output
9680
9738
  }] } });
9681
9739
 
9682
- /* eslint-disable no-underscore-dangle */
9683
- /**
9684
- * Service for registering and managing custom Ionicons icons in the application.
9685
- * Automatically registers a set of commonly used icons on initialization.
9686
- */
9687
- class IconService {
9688
- /**
9689
- * Registers a set of Ionicons icons for use throughout the app.
9690
- */
9691
- constructor() {
9692
- addIcons({
9693
- addOutline,
9694
- addCircleOutline,
9695
- alertOutline,
9696
- alertCircleOutline,
9697
- arrowBackOutline,
9698
- arrowForwardOutline,
9699
- arrowDownOutline,
9700
- settings,
9701
- settingsOutline,
9702
- checkmarkCircleOutline,
9703
- ellipsisHorizontalOutline,
9704
- notifications,
9705
- notificationsOutline,
9706
- openOutline,
9707
- closeOutline,
9708
- chatbubblesOutline,
9709
- shareOutline,
9710
- heart,
9711
- heartOutline,
9712
- home,
9713
- homeOutline,
9714
- eyeOffOutline,
9715
- eyeOutline,
9716
- scanOutline,
9717
- chevronDownOutline,
9718
- chevronForwardOutline,
9719
- checkmarkOutline,
9720
- clipboardOutline,
9721
- copyOutline,
9722
- filterOutline,
9723
- locationOutline,
9724
- calendarOutline,
9725
- businessOutline,
9726
- logoTwitter,
9727
- logoInstagram,
9728
- logoLinkedin,
9729
- logoYoutube,
9730
- logoTiktok,
9731
- logoFacebook,
9732
- logoGoogle,
9733
- createOutline,
9734
- trashOutline,
9735
- playOutline,
9736
- peopleOutline,
9737
- phonePortraitOutline,
9738
- refreshOutline,
9739
- documentTextOutline,
9740
- lockClosedOutline,
9741
- informationCircleOutline,
9742
- logoNpm,
9743
- removeOutline,
9744
- optionsOutline,
9745
- personOutline,
9746
- shieldCheckmarkOutline,
9747
- keyOutline,
9748
- desktopOutline,
9749
- logOutOutline,
9750
- cloudDownloadOutline,
9751
- cloudOutline,
9752
- gitBranchOutline,
9753
- layersOutline,
9754
- serverOutline,
9755
- warningOutline,
9756
- bulbOutline,
9757
- lockOpenOutline,
9758
- diamondOutline,
9759
- });
9760
- }
9761
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IconService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
9762
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IconService, providedIn: 'root' }); }
9763
- }
9764
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IconService, decorators: [{
9765
- type: Injectable,
9766
- args: [{
9767
- providedIn: 'root',
9768
- }]
9769
- }], ctorParameters: () => [] });
9770
-
9771
9740
  /**
9772
9741
  * val-box
9773
9742
  *
@@ -9782,17 +9751,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
9782
9751
  * @output onClick - Emits when the box or its icon is clicked
9783
9752
  */
9784
9753
  class BoxComponent {
9785
- constructor(icon) {
9754
+ constructor() {
9786
9755
  /**
9787
9756
  * Event emitted when the box or its icon is clicked.
9788
9757
  */
9789
9758
  this.onClick = new EventEmitter();
9790
9759
  }
9791
- ngOnInit() { }
9792
9760
  clickHandler() {
9793
9761
  this.onClick.emit();
9794
9762
  }
9795
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BoxComponent, deps: [{ token: IconService }], target: i0.ɵɵFactoryTarget.Component }); }
9763
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BoxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9796
9764
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: BoxComponent, isStandalone: true, selector: "val-box", inputs: { props: "props" }, outputs: { onClick: "onClick" }, ngImport: i0, template: `
9797
9765
  <ion-card
9798
9766
  class="box"
@@ -9844,7 +9812,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
9844
9812
  </div>
9845
9813
  </ion-card>
9846
9814
  `, 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)}.bordered{border:.0625rem solid var(--ion-color-medium)}.box{width:100%;margin:0rem;border-radius:0rem;box-shadow:none;padding:0rem}.box.rounded{border-radius:1.125rem}.icon{cursor:pointer;margin:0rem;padding:0rem;position:absolute;right:.25rem;top:.25rem;font-size:1.5rem}@media (min-width: 768px){.icon{right:.5rem;top:.5rem;font-size:2rem}}.left-border{border-left:.1875rem solid #dde3ed}.left-border.small{border-width:.1875rem}.left-border.medium{border-width:.375rem}.left-border.large{border-width:.4375rem}.left-border.xlarge{border-width:.5rem}.transparent{--background: transparent}\n"] }]
9847
- }], ctorParameters: () => [{ type: IconService }], propDecorators: { props: [{
9815
+ }], propDecorators: { props: [{
9848
9816
  type: Input
9849
9817
  }], onClick: [{
9850
9818
  type: Output
@@ -10132,6 +10100,95 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
10132
10100
  }]
10133
10101
  }] });
10134
10102
 
10103
+ /* eslint-disable no-underscore-dangle */
10104
+ /**
10105
+ * Service for registering and managing custom Ionicons icons in the application.
10106
+ * Automatically registers a set of commonly used icons on initialization.
10107
+ */
10108
+ class IconService {
10109
+ /**
10110
+ * Registers a set of Ionicons icons for use throughout the app.
10111
+ */
10112
+ constructor() {
10113
+ addIcons({
10114
+ addOutline,
10115
+ addCircleOutline,
10116
+ alertOutline,
10117
+ alertCircleOutline,
10118
+ arrowBackOutline,
10119
+ arrowForwardOutline,
10120
+ arrowDownOutline,
10121
+ settings,
10122
+ settingsOutline,
10123
+ checkmarkCircleOutline,
10124
+ ellipsisHorizontalOutline,
10125
+ notifications,
10126
+ notificationsOutline,
10127
+ openOutline,
10128
+ closeOutline,
10129
+ chatbubblesOutline,
10130
+ shareOutline,
10131
+ heart,
10132
+ heartOutline,
10133
+ home,
10134
+ homeOutline,
10135
+ eyeOffOutline,
10136
+ eyeOutline,
10137
+ scanOutline,
10138
+ chevronDownOutline,
10139
+ chevronForwardOutline,
10140
+ checkmarkOutline,
10141
+ clipboardOutline,
10142
+ copyOutline,
10143
+ filterOutline,
10144
+ locationOutline,
10145
+ calendarOutline,
10146
+ businessOutline,
10147
+ logoTwitter,
10148
+ logoInstagram,
10149
+ logoLinkedin,
10150
+ logoYoutube,
10151
+ logoTiktok,
10152
+ logoFacebook,
10153
+ logoGoogle,
10154
+ createOutline,
10155
+ trashOutline,
10156
+ playOutline,
10157
+ peopleOutline,
10158
+ phonePortraitOutline,
10159
+ refreshOutline,
10160
+ documentTextOutline,
10161
+ lockClosedOutline,
10162
+ informationCircleOutline,
10163
+ logoNpm,
10164
+ removeOutline,
10165
+ optionsOutline,
10166
+ personOutline,
10167
+ shieldCheckmarkOutline,
10168
+ keyOutline,
10169
+ desktopOutline,
10170
+ logOutOutline,
10171
+ cloudDownloadOutline,
10172
+ cloudOutline,
10173
+ gitBranchOutline,
10174
+ layersOutline,
10175
+ serverOutline,
10176
+ warningOutline,
10177
+ bulbOutline,
10178
+ lockOpenOutline,
10179
+ diamondOutline,
10180
+ });
10181
+ }
10182
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IconService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
10183
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IconService, providedIn: 'root' }); }
10184
+ }
10185
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IconService, decorators: [{
10186
+ type: Injectable,
10187
+ args: [{
10188
+ providedIn: 'root',
10189
+ }]
10190
+ }], ctorParameters: () => [] });
10191
+
10135
10192
  /**
10136
10193
  * Configuracion por defecto para header tipo 'home'
10137
10194
  */
@@ -10555,222 +10612,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
10555
10612
  type: Output
10556
10613
  }] } });
10557
10614
 
10558
- const Icon = (name, slot) => {
10559
- return {
10560
- name,
10561
- slot,
10562
- };
10563
- };
10564
- /* name convention: COLOR FILL SIZE [optionals: SHAPE EXPAND ICON HREF/DOWNLOAD] TYPE */
10565
- const BaseDefault = (text, type) => {
10566
- return {
10567
- color: 'primary',
10568
- state: 'ENABLED',
10569
- text,
10570
- size: 'default',
10571
- type,
10572
- };
10573
- };
10574
- const ClearDefault = (text, type) => {
10575
- return { ...BaseDefault(text, type), fill: 'clear' };
10576
- };
10577
- const ClearDefaultRound = (text, type) => {
10578
- return { ...ClearDefault(text, type), shape: 'round' };
10579
- };
10580
- const SolidDefault = (text, type) => {
10581
- return { ...BaseDefault(text, type), fill: 'solid' };
10582
- };
10583
- const SolidDefaultRound = (text, type) => {
10584
- return { ...SolidDefault(text, type), shape: 'round' };
10585
- };
10586
- const OutlineDefault = (text, type) => {
10587
- return { ...BaseDefault(text, type), fill: 'outline' };
10588
- };
10589
- const OutlineDefaultRound = (text, type) => {
10590
- return { ...OutlineDefault(text, type), shape: 'round' };
10591
- };
10592
- const ClearDefaultFull = (text, type) => {
10593
- return { ...ClearDefault(text, type), expand: 'full' };
10594
- };
10595
- const ClearDefaultRoundFull = (text, type) => {
10596
- return { ...ClearDefaultRound(text, type), expand: 'full' };
10597
- };
10598
- const ClearDefaultBlock = (text, type) => {
10599
- return { ...ClearDefault(text, type), expand: 'block' };
10600
- };
10601
- const ClearDefaultRoundBlock = (text, type) => {
10602
- return { ...ClearDefaultRound(text, type), expand: 'block' };
10603
- };
10604
- const SolidDefaultFull = (text, type) => {
10605
- return { ...SolidDefault(text, type), expand: 'full' };
10606
- };
10607
- const SolidDefaultRoundFull = (text, type) => {
10608
- return { ...SolidDefaultRound(text, type), expand: 'full' };
10609
- };
10610
- const SolidDefaultBlock = (text, type) => {
10611
- return { ...SolidDefault(text, type), expand: 'block' };
10612
- };
10613
- const SolidDefaultRoundBlock = (text, type) => {
10614
- return { ...SolidDefaultRound(text, type), expand: 'block' };
10615
- };
10616
- const OutlineDefaultFull = (text, type) => {
10617
- return { ...OutlineDefault(text, type), expand: 'full' };
10618
- };
10619
- const OutlineDefaultRoundFull = (text, type) => {
10620
- return { ...OutlineDefaultRound(text, type), expand: 'full' };
10621
- };
10622
- const OutlineDefaultBlock = (text, type) => {
10623
- return { ...OutlineDefault(text, type), expand: 'block' };
10624
- };
10625
- const OutlineDefaultRoundBlock = (text, type) => {
10626
- return { ...OutlineDefaultRound(text, type), expand: 'block' };
10627
- };
10628
- const SolidDefaultButton = (text) => {
10629
- return SolidDefault(text, 'button');
10630
- };
10631
- const SolidSmallButton = (text) => {
10632
- return { ...SolidDefault(text, 'button'), size: 'small' };
10633
- };
10634
- const SolidLargeButton = (text) => {
10635
- return { ...SolidDefault(text, 'button'), size: 'large' };
10636
- };
10637
- const SolidDefaultRoundButton = (text) => {
10638
- return SolidDefaultRound(text, 'button');
10639
- };
10640
- const SolidSmallRoundButton = (text) => {
10641
- return { ...SolidDefaultRound(text, 'button'), size: 'small' };
10642
- };
10643
- const SolidLargeRoundButton = (text) => {
10644
- return { ...SolidDefaultRound(text, 'button'), size: 'large' };
10645
- };
10646
- const SolidFullButton = (text) => {
10647
- return SolidDefaultFull(text, 'button');
10648
- };
10649
- const SolidBlockButton = (text) => {
10650
- return SolidDefaultBlock(text, 'button');
10651
- };
10652
- /** PRIMARY */
10653
- const PrimarySolidDefaultRoundButton = (text) => {
10654
- return { ...SolidDefaultRoundButton(text), color: 'primary' };
10655
- };
10656
- const PrimarySolidDefaultRoundIconButton = (text, icon) => {
10657
- return { ...PrimarySolidDefaultRoundButton(text), icon };
10658
- };
10659
- const PrimarySolidDefaultRoundHrefButton = (text, href, target) => {
10660
- return { ...PrimarySolidDefaultRoundButton(text), href, target };
10661
- };
10662
- const PrimarySolidDefaultRoundIconHrefButton = (text, icon, href, target) => {
10663
- return { ...PrimarySolidDefaultRoundIconButton(text, icon), href, target };
10664
- };
10665
- const PrimarySolidSmallRoundButton = (text) => {
10666
- return { ...SolidSmallRoundButton(text), color: 'primary' };
10667
- };
10668
- const PrimarySolidSmallRoundIconButton = (text, icon) => {
10669
- return { ...PrimarySolidSmallRoundButton(text), icon };
10670
- };
10671
- const PrimarySolidSmallRoundHrefButton = (text, href, target) => {
10672
- return { ...PrimarySolidSmallRoundButton(text), href, target };
10673
- };
10674
- const PrimarySolidSmallRoundIconHrefButton = (text, icon, href, target) => {
10675
- return { ...PrimarySolidSmallRoundIconButton(text, icon), href, target };
10676
- };
10677
- const PrimarySolidLargeRoundButton = (text) => {
10678
- return { ...SolidLargeRoundButton(text), color: 'primary' };
10679
- };
10680
- const PrimarySolidLargeRoundIconButton = (text, icon) => {
10681
- return { ...PrimarySolidLargeRoundButton(text), icon };
10682
- };
10683
- const PrimarySolidLargeRoundHrefButton = (text, href, target) => {
10684
- return { ...PrimarySolidLargeRoundButton(text), href, target };
10685
- };
10686
- const PrimarySolidLargeRoundIconHrefButton = (text, icon, href, target) => {
10687
- return { ...PrimarySolidLargeRoundIconButton(text, icon), href, target };
10688
- };
10689
- const PrimarySolidBlockButton = (text) => {
10690
- return { ...SolidBlockButton(text), color: 'primary' };
10691
- };
10692
- const PrimarySolidBlockIconButton = (text, icon) => {
10693
- return { ...PrimarySolidBlockButton(text), icon };
10694
- };
10695
- const PrimarySolidBlockHrefButton = (text, href, target) => {
10696
- return { ...PrimarySolidBlockButton(text), href, target };
10697
- };
10698
- const PrimarySolidBlockIconHrefButton = (text, icon, href, target) => {
10699
- return { ...PrimarySolidBlockIconButton(text, icon), href, target };
10700
- };
10701
- const PrimarySolidFullButton = (text) => {
10702
- return { ...SolidFullButton(text), color: 'primary' };
10703
- };
10704
- const PrimarySolidFullIconButton = (text, icon) => {
10705
- return { ...PrimarySolidFullButton(text), icon };
10706
- };
10707
- const PrimarySolidFullHrefButton = (text, href, target) => {
10708
- return { ...PrimarySolidFullButton(text), href, target };
10709
- };
10710
- const PrimarySolidFullIconHrefButton = (text, icon, href, target) => {
10711
- return { ...PrimarySolidFullIconButton(text, icon), href, target };
10712
- };
10713
- /** SECONDARY */
10714
- const SecondarySolidDefaultRoundButton = (text) => {
10715
- return { ...SolidDefaultRoundButton(text), color: 'secondary' };
10716
- };
10717
- const SecondarySolidDefaultRoundIconButton = (text, icon) => {
10718
- return { ...SecondarySolidDefaultRoundButton(text), icon };
10719
- };
10720
- const SecondarySolidDefaultRoundHrefButton = (text, href, target) => {
10721
- return { ...SecondarySolidDefaultRoundButton(text), href, target };
10722
- };
10723
- const SecondarySolidDefaultRoundIconHrefButton = (text, icon, href, target) => {
10724
- return { ...SecondarySolidDefaultRoundIconButton(text, icon), href, target };
10725
- };
10726
- const SecondarySolidSmallRoundButton = (text) => {
10727
- return { ...SolidSmallRoundButton(text), color: 'secondary' };
10728
- };
10729
- const SecondarySolidSmallRoundIconButton = (text, icon) => {
10730
- return { ...SecondarySolidSmallRoundButton(text), icon };
10731
- };
10732
- const SecondarySolidSmallRoundHrefButton = (text, href, target) => {
10733
- return { ...SecondarySolidSmallRoundButton(text), href, target };
10734
- };
10735
- const SecondarySolidSmallRoundIconHrefButton = (text, icon, href, target) => {
10736
- return { ...SecondarySolidSmallRoundIconButton(text, icon), href, target };
10737
- };
10738
- const SecondarySolidLargeRoundButton = (text) => {
10739
- return { ...SolidLargeRoundButton(text), color: 'secondary' };
10740
- };
10741
- const SecondarySolidLargeRoundIconButton = (text, icon) => {
10742
- return { ...SecondarySolidLargeRoundButton(text), icon };
10743
- };
10744
- const SecondarySolidLargeRoundHrefButton = (text, href, target) => {
10745
- return { ...SecondarySolidLargeRoundButton(text), href, target };
10746
- };
10747
- const SecondarySolidLargeRoundIconHrefButton = (text, icon, href, target) => {
10748
- return { ...SecondarySolidLargeRoundIconButton(text, icon), href, target };
10749
- };
10750
- const SecondarySolidFullButton = (text) => {
10751
- return { ...SolidFullButton(text), color: 'secondary' };
10752
- };
10753
- const SecondarySolidFullIconButton = (text, icon) => {
10754
- return { ...SecondarySolidFullButton(text), icon };
10755
- };
10756
- const SecondarySolidFullHrefButton = (text, href, target) => {
10757
- return { ...SecondarySolidFullButton(text), href, target };
10758
- };
10759
- const SecondarySolidFullIconHrefButton = (text, icon, href, target) => {
10760
- return { ...SecondarySolidFullIconButton(text, icon), href, target };
10761
- };
10762
- const SecondarySolidBlockButton = (text) => {
10763
- return { ...SolidBlockButton(text), color: 'secondary' };
10764
- };
10765
- const SecondarySolidBlockIconButton = (text, icon) => {
10766
- return { ...SecondarySolidBlockButton(text), icon };
10767
- };
10768
- const SecondarySolidBlockHrefButton = (text, href, target) => {
10769
- return { ...SecondarySolidBlockButton(text), href, target };
10770
- };
10771
- const SecondarySolidBlockIconHrefButton = (text, icon, href, target) => {
10772
- return { ...SecondarySolidBlockIconButton(text, icon), href, target };
10773
- };
10615
+ const Icon = (name, slot) => ({ name, slot });
10616
+ /**
10617
+ * Single source of truth for building a `ButtonMetadata`.
10618
+ *
10619
+ * Applies the shared defaults (`primary` color, `ENABLED` state, `default`
10620
+ * size, `button` type) and merges any overrides. This builder (and
10621
+ * `iconButton`) is the canonical way to construct a button in code; for
10622
+ * templates prefer a registered `<val-button preset="...">` (channel `button`
10623
+ * of the PresetService).
10624
+ *
10625
+ * @example
10626
+ * button({ text: 'Save', fill: 'solid', shape: 'round', expand: 'full' })
10627
+ */
10628
+ const button = (overrides = {}) => ({
10629
+ color: 'primary',
10630
+ state: 'ENABLED',
10631
+ size: 'default',
10632
+ type: 'button',
10633
+ text: '',
10634
+ ...overrides,
10635
+ });
10636
+ /** Convenience builder for a button with a leading/trailing icon. */
10637
+ const iconButton = (text, icon, overrides = {}) => button({ text, icon, ...overrides });
10774
10638
 
10775
10639
  /**
10776
10640
  * val-display
@@ -10830,15 +10694,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
10830
10694
  * @input props: DividerMetadata - Configuration for the divider (size, color, fill)
10831
10695
  */
10832
10696
  class DividerComponent {
10833
- constructor() { }
10834
- ngOnInit() { }
10835
10697
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DividerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10836
10698
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DividerComponent, isStandalone: true, selector: "val-divider", inputs: { props: "props" }, ngImport: i0, template: ` <div [ngClass]="['divider', props.size, props.color, props.fill]"></div> `, 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)}.solid{border-top:.0625rem solid #878ca0}.gradient{height:.125rem}.gradient.primary{background:linear-gradient(to right,var(--ion-color-primary),var(--ion-color-light))}.gradient.secondary{background:linear-gradient(to right,var(--ion-color-secondary),var(--ion-color-light))}.gradient.dark{background:linear-gradient(to right,var(--ion-color-dark),var(--ion-color-light))}.gradient.light{background:linear-gradient(to right,var(--ion-color-light),#ffffff)}.gradient.medium{background:linear-gradient(to right,var(--ion-color-medium),#ffffff)}.small{margin:1rem}.medium{margin:1.5rem 1rem}.large{margin:2.25rem 1rem}.primary{border-color:var(--ion-color-primary)}.secondary{border-color:var(--ion-color-secondary)}.dark{border-color:var(--ion-color-dark)}.light{border-color:var(--ion-color-light)}.medium{border-color:var(--ion-color-medium)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
10837
10699
  }
10838
10700
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DividerComponent, decorators: [{
10839
10701
  type: Component,
10840
10702
  args: [{ selector: 'val-divider', standalone: true, imports: [CommonModule], template: ` <div [ngClass]="['divider', props.size, props.color, props.fill]"></div> `, 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)}.solid{border-top:.0625rem solid #878ca0}.gradient{height:.125rem}.gradient.primary{background:linear-gradient(to right,var(--ion-color-primary),var(--ion-color-light))}.gradient.secondary{background:linear-gradient(to right,var(--ion-color-secondary),var(--ion-color-light))}.gradient.dark{background:linear-gradient(to right,var(--ion-color-dark),var(--ion-color-light))}.gradient.light{background:linear-gradient(to right,var(--ion-color-light),#ffffff)}.gradient.medium{background:linear-gradient(to right,var(--ion-color-medium),#ffffff)}.small{margin:1rem}.medium{margin:1.5rem 1rem}.large{margin:2.25rem 1rem}.primary{border-color:var(--ion-color-primary)}.secondary{border-color:var(--ion-color-secondary)}.dark{border-color:var(--ion-color-dark)}.light{border-color:var(--ion-color-light)}.medium{border-color:var(--ion-color-medium)}\n"] }]
10841
- }], ctorParameters: () => [], propDecorators: { props: [{
10703
+ }], propDecorators: { props: [{
10842
10704
  type: Input
10843
10705
  }] } });
10844
10706
 
@@ -10858,7 +10720,6 @@ class HrefComponent {
10858
10720
  this.downloadService = downloadService;
10859
10721
  this.onClick = new EventEmitter();
10860
10722
  }
10861
- ngOnInit() { }
10862
10723
  getFileName() {
10863
10724
  return this.downloadService.getFileNameFromUrl(this.props.url);
10864
10725
  }
@@ -11006,6 +10867,19 @@ class ImageComponent {
11006
10867
  this.isPreviewOpen = true;
11007
10868
  this.resetZoom();
11008
10869
  }
10870
+ /**
10871
+ * Keyboard activation of the preview trigger. Space must preventDefault to
10872
+ * avoid scrolling the page when the focused image is activated.
10873
+ */
10874
+ onPreviewKeydown(event) {
10875
+ if (!this.props.previewMode)
10876
+ return;
10877
+ const key = event.key;
10878
+ if (key === ' ' || key === 'Spacebar') {
10879
+ event.preventDefault();
10880
+ }
10881
+ this.openPreview();
10882
+ }
11009
10883
  closePreview() {
11010
10884
  this.isPreviewOpen = false;
11011
10885
  }
@@ -11169,6 +11043,11 @@ class ImageComponent {
11169
11043
  [style.max-width.rem]="props.width"
11170
11044
  [style.height.px]="props.height"
11171
11045
  (click)="props.previewMode ? openPreview() : null"
11046
+ (keydown.enter)="props.previewMode ? openPreview() : null"
11047
+ (keydown.space)="onPreviewKeydown($event)"
11048
+ [attr.role]="props.previewMode ? 'button' : null"
11049
+ [attr.tabindex]="props.previewMode ? 0 : null"
11050
+ [attr.aria-haspopup]="props.previewMode ? 'dialog' : null"
11172
11051
  />
11173
11052
  } @else {
11174
11053
  <img
@@ -11189,6 +11068,11 @@ class ImageComponent {
11189
11068
  [style.max-width.rem]="props.width"
11190
11069
  [style.height.px]="props.height"
11191
11070
  (click)="props.previewMode ? openPreview() : null"
11071
+ (keydown.enter)="props.previewMode ? openPreview() : null"
11072
+ (keydown.space)="onPreviewKeydown($event)"
11073
+ [attr.role]="props.previewMode ? 'button' : null"
11074
+ [attr.tabindex]="props.previewMode ? 0 : null"
11075
+ [attr.aria-haspopup]="props.previewMode ? 'dialog' : null"
11192
11076
  />
11193
11077
  }
11194
11078
  </div>
@@ -11273,7 +11157,7 @@ class ImageComponent {
11273
11157
  </ion-content>
11274
11158
  </ng-template>
11275
11159
  </ion-modal>
11276
- `, 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)}.val-image-container{margin:0;padding:0;max-width:100%}.val-image-container--left{margin-right:auto;text-align:left}.val-image-container--center{margin-left:auto;margin-right:auto;text-align:center}.val-image-container--right{margin-left:auto;text-align:right}.val-image-wrapper{display:inline-block;position:relative}.val-image{width:100%;height:auto;display:block;opacity:1;max-width:100%}.val-image.center{margin:0 auto}.val-image.rounded{border-radius:.5rem}.val-image.circular{border-radius:50%;aspect-ratio:1;object-fit:cover}.val-image.box{border-radius:0}.val-image.bordered{border:.0625rem solid var(--ion-color-medium)}.val-image.shaded{box-shadow:.1875rem .625rem .5rem #1219541a}body.dark .val-image.dark,html.ion-palette-dark .val-image.dark,body[data-theme=dark] .val-image.dark{filter:invert(1)}.val-image.limited{max-width:100%}@media (max-width: 768px){.val-image .val-image-wrapper.small{width:40%}.val-image .val-image-wrapper.medium{width:60%}.val-image .val-image-wrapper.large{width:80%}.val-image .val-image-wrapper.xlarge{width:100%}}.val-image.small{width:30%}.val-image.medium{width:50%}.val-image.large{width:70%}.val-image.xlarge{width:100%}.val-image-caption{margin-top:.5rem;color:var(--ion-color-medium-shade, #666);font-style:italic;line-height:1.4}.val-image-caption--small{font-size:.75rem}.val-image-caption--medium{font-size:.875rem}.val-image-caption--large{font-size:1rem}.val-image.visible{animation:appearance ease-in 1s forwards}@keyframes appearance{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.val-image-container{flex-shrink:0;align-self:flex-start}.flexbox-container .val-image-container--left{align-self:flex-start}.flexbox-container .val-image-container--center{align-self:center}.flexbox-container .val-image-container--right{align-self:flex-end}.val-image--preview-enabled{cursor:pointer;transition:opacity .2s ease,transform .2s ease}.val-image--preview-enabled:hover{opacity:.9;transform:scale(1.02)}ion-modal ion-content{position:relative;--padding-start: 0;--padding-end: 0;--padding-top: 0;--padding-bottom: 0}.val-image-preview-controls{position:absolute;bottom:20px;left:50%;transform:translate(-50%);z-index:1000;display:flex;align-items:center;gap:15px;background:rgba(var(--ion-background-color-rgb, 255, 255, 255),.9);padding:4px 8px;border-radius:25px;backdrop-filter:blur(10px);box-shadow:0 4px 20px #00000026}.val-image-preview-zoom-level{font-size:.875rem;font-weight:600;min-width:50px;text-align:center;color:var(--ion-text-color)}.val-image-preview-viewport{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;touch-action:none}.val-image-preview-img{max-width:90vw;max-height:90vh;object-fit:contain;transition:transform .1s ease-out;transform-origin:center center;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}@media (max-width: 768px){.val-image-preview-controls{bottom:10px;padding:8px 16px;gap:10px}.val-image-preview-zoom-level{font-size:.75rem;min-width:40px}.val-image-preview-img{max-width:95vw;max-height:85vh}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { 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: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }] }); }
11160
+ `, 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)}.val-image-container{margin:0;padding:0;max-width:100%}.val-image-container--left{margin-right:auto;text-align:left}.val-image-container--center{margin-left:auto;margin-right:auto;text-align:center}.val-image-container--right{margin-left:auto;text-align:right}.val-image-wrapper{display:inline-block;position:relative}.val-image{width:100%;height:auto;display:block;opacity:1;max-width:100%}.val-image.center{margin:0 auto}.val-image.rounded{border-radius:.5rem}.val-image.circular{border-radius:50%;aspect-ratio:1;object-fit:cover}.val-image.box{border-radius:0}.val-image.bordered{border:.0625rem solid var(--ion-color-medium)}.val-image.shaded{box-shadow:.1875rem .625rem .5rem #1219541a}body.dark .val-image.dark,html.ion-palette-dark .val-image.dark,body[data-theme=dark] .val-image.dark{filter:invert(1)}.val-image.limited{max-width:100%}@media (max-width: 768px){.val-image .val-image-wrapper.small{width:40%}.val-image .val-image-wrapper.medium{width:60%}.val-image .val-image-wrapper.large{width:80%}.val-image .val-image-wrapper.xlarge{width:100%}}.val-image.small{width:30%}.val-image.medium{width:50%}.val-image.large{width:70%}.val-image.xlarge{width:100%}.val-image-caption{margin-top:.5rem;color:var(--ion-color-medium-shade, #666);font-style:italic;line-height:1.4}.val-image-caption--small{font-size:.75rem}.val-image-caption--medium{font-size:.875rem}.val-image-caption--large{font-size:1rem}.val-image.visible{animation:appearance ease-in 1s forwards}@keyframes appearance{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.val-image-container{flex-shrink:0;align-self:flex-start}.flexbox-container .val-image-container--left{align-self:flex-start}.flexbox-container .val-image-container--center{align-self:center}.flexbox-container .val-image-container--right{align-self:flex-end}.val-image--preview-enabled{cursor:pointer;transition:opacity .2s ease,transform .2s ease}.val-image--preview-enabled:hover{opacity:.9;transform:scale(1.02)}.val-image--preview-enabled:focus-visible:focus{outline:none}.val-image--preview-enabled:focus-visible:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}ion-modal ion-content{position:relative;--padding-start: 0;--padding-end: 0;--padding-top: 0;--padding-bottom: 0}.val-image-preview-controls{position:absolute;bottom:20px;left:50%;transform:translate(-50%);z-index:1000;display:flex;align-items:center;gap:15px;background:rgba(var(--ion-background-color-rgb, 255, 255, 255),.9);padding:4px 8px;border-radius:25px;backdrop-filter:blur(10px);box-shadow:0 4px 20px #00000026}.val-image-preview-zoom-level{font-size:.875rem;font-weight:600;min-width:50px;text-align:center;color:var(--ion-text-color)}.val-image-preview-viewport{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;touch-action:none}.val-image-preview-img{max-width:90vw;max-height:90vh;object-fit:contain;transition:transform .1s ease-out;transform-origin:center center;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}@media (max-width: 768px){.val-image-preview-controls{bottom:10px;padding:8px 16px;gap:10px}.val-image-preview-zoom-level{font-size:.75rem;min-width:40px}.val-image-preview-img{max-width:95vw;max-height:85vh}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { 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: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }] }); }
11277
11161
  }
11278
11162
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ImageComponent, decorators: [{
11279
11163
  type: Component,
@@ -11312,6 +11196,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
11312
11196
  [style.max-width.rem]="props.width"
11313
11197
  [style.height.px]="props.height"
11314
11198
  (click)="props.previewMode ? openPreview() : null"
11199
+ (keydown.enter)="props.previewMode ? openPreview() : null"
11200
+ (keydown.space)="onPreviewKeydown($event)"
11201
+ [attr.role]="props.previewMode ? 'button' : null"
11202
+ [attr.tabindex]="props.previewMode ? 0 : null"
11203
+ [attr.aria-haspopup]="props.previewMode ? 'dialog' : null"
11315
11204
  />
11316
11205
  } @else {
11317
11206
  <img
@@ -11332,6 +11221,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
11332
11221
  [style.max-width.rem]="props.width"
11333
11222
  [style.height.px]="props.height"
11334
11223
  (click)="props.previewMode ? openPreview() : null"
11224
+ (keydown.enter)="props.previewMode ? openPreview() : null"
11225
+ (keydown.space)="onPreviewKeydown($event)"
11226
+ [attr.role]="props.previewMode ? 'button' : null"
11227
+ [attr.tabindex]="props.previewMode ? 0 : null"
11228
+ [attr.aria-haspopup]="props.previewMode ? 'dialog' : null"
11335
11229
  />
11336
11230
  }
11337
11231
  </div>
@@ -11416,7 +11310,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
11416
11310
  </ion-content>
11417
11311
  </ng-template>
11418
11312
  </ion-modal>
11419
- `, 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)}.val-image-container{margin:0;padding:0;max-width:100%}.val-image-container--left{margin-right:auto;text-align:left}.val-image-container--center{margin-left:auto;margin-right:auto;text-align:center}.val-image-container--right{margin-left:auto;text-align:right}.val-image-wrapper{display:inline-block;position:relative}.val-image{width:100%;height:auto;display:block;opacity:1;max-width:100%}.val-image.center{margin:0 auto}.val-image.rounded{border-radius:.5rem}.val-image.circular{border-radius:50%;aspect-ratio:1;object-fit:cover}.val-image.box{border-radius:0}.val-image.bordered{border:.0625rem solid var(--ion-color-medium)}.val-image.shaded{box-shadow:.1875rem .625rem .5rem #1219541a}body.dark .val-image.dark,html.ion-palette-dark .val-image.dark,body[data-theme=dark] .val-image.dark{filter:invert(1)}.val-image.limited{max-width:100%}@media (max-width: 768px){.val-image .val-image-wrapper.small{width:40%}.val-image .val-image-wrapper.medium{width:60%}.val-image .val-image-wrapper.large{width:80%}.val-image .val-image-wrapper.xlarge{width:100%}}.val-image.small{width:30%}.val-image.medium{width:50%}.val-image.large{width:70%}.val-image.xlarge{width:100%}.val-image-caption{margin-top:.5rem;color:var(--ion-color-medium-shade, #666);font-style:italic;line-height:1.4}.val-image-caption--small{font-size:.75rem}.val-image-caption--medium{font-size:.875rem}.val-image-caption--large{font-size:1rem}.val-image.visible{animation:appearance ease-in 1s forwards}@keyframes appearance{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.val-image-container{flex-shrink:0;align-self:flex-start}.flexbox-container .val-image-container--left{align-self:flex-start}.flexbox-container .val-image-container--center{align-self:center}.flexbox-container .val-image-container--right{align-self:flex-end}.val-image--preview-enabled{cursor:pointer;transition:opacity .2s ease,transform .2s ease}.val-image--preview-enabled:hover{opacity:.9;transform:scale(1.02)}ion-modal ion-content{position:relative;--padding-start: 0;--padding-end: 0;--padding-top: 0;--padding-bottom: 0}.val-image-preview-controls{position:absolute;bottom:20px;left:50%;transform:translate(-50%);z-index:1000;display:flex;align-items:center;gap:15px;background:rgba(var(--ion-background-color-rgb, 255, 255, 255),.9);padding:4px 8px;border-radius:25px;backdrop-filter:blur(10px);box-shadow:0 4px 20px #00000026}.val-image-preview-zoom-level{font-size:.875rem;font-weight:600;min-width:50px;text-align:center;color:var(--ion-text-color)}.val-image-preview-viewport{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;touch-action:none}.val-image-preview-img{max-width:90vw;max-height:90vh;object-fit:contain;transition:transform .1s ease-out;transform-origin:center center;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}@media (max-width: 768px){.val-image-preview-controls{bottom:10px;padding:8px 16px;gap:10px}.val-image-preview-zoom-level{font-size:.75rem;min-width:40px}.val-image-preview-img{max-width:95vw;max-height:85vh}}\n"] }]
11313
+ `, 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)}.val-image-container{margin:0;padding:0;max-width:100%}.val-image-container--left{margin-right:auto;text-align:left}.val-image-container--center{margin-left:auto;margin-right:auto;text-align:center}.val-image-container--right{margin-left:auto;text-align:right}.val-image-wrapper{display:inline-block;position:relative}.val-image{width:100%;height:auto;display:block;opacity:1;max-width:100%}.val-image.center{margin:0 auto}.val-image.rounded{border-radius:.5rem}.val-image.circular{border-radius:50%;aspect-ratio:1;object-fit:cover}.val-image.box{border-radius:0}.val-image.bordered{border:.0625rem solid var(--ion-color-medium)}.val-image.shaded{box-shadow:.1875rem .625rem .5rem #1219541a}body.dark .val-image.dark,html.ion-palette-dark .val-image.dark,body[data-theme=dark] .val-image.dark{filter:invert(1)}.val-image.limited{max-width:100%}@media (max-width: 768px){.val-image .val-image-wrapper.small{width:40%}.val-image .val-image-wrapper.medium{width:60%}.val-image .val-image-wrapper.large{width:80%}.val-image .val-image-wrapper.xlarge{width:100%}}.val-image.small{width:30%}.val-image.medium{width:50%}.val-image.large{width:70%}.val-image.xlarge{width:100%}.val-image-caption{margin-top:.5rem;color:var(--ion-color-medium-shade, #666);font-style:italic;line-height:1.4}.val-image-caption--small{font-size:.75rem}.val-image-caption--medium{font-size:.875rem}.val-image-caption--large{font-size:1rem}.val-image.visible{animation:appearance ease-in 1s forwards}@keyframes appearance{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.val-image-container{flex-shrink:0;align-self:flex-start}.flexbox-container .val-image-container--left{align-self:flex-start}.flexbox-container .val-image-container--center{align-self:center}.flexbox-container .val-image-container--right{align-self:flex-end}.val-image--preview-enabled{cursor:pointer;transition:opacity .2s ease,transform .2s ease}.val-image--preview-enabled:hover{opacity:.9;transform:scale(1.02)}.val-image--preview-enabled:focus-visible:focus{outline:none}.val-image--preview-enabled:focus-visible:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}ion-modal ion-content{position:relative;--padding-start: 0;--padding-end: 0;--padding-top: 0;--padding-bottom: 0}.val-image-preview-controls{position:absolute;bottom:20px;left:50%;transform:translate(-50%);z-index:1000;display:flex;align-items:center;gap:15px;background:rgba(var(--ion-background-color-rgb, 255, 255, 255),.9);padding:4px 8px;border-radius:25px;backdrop-filter:blur(10px);box-shadow:0 4px 20px #00000026}.val-image-preview-zoom-level{font-size:.875rem;font-weight:600;min-width:50px;text-align:center;color:var(--ion-text-color)}.val-image-preview-viewport{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;touch-action:none}.val-image-preview-img{max-width:90vw;max-height:90vh;object-fit:contain;transition:transform .1s ease-out;transform-origin:center center;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}@media (max-width: 768px){.val-image-preview-controls{bottom:10px;padding:8px 16px;gap:10px}.val-image-preview-zoom-level{font-size:.75rem;min-width:40px}.val-image-preview-img{max-width:95vw;max-height:85vh}}\n"] }]
11420
11314
  }], ctorParameters: () => [], propDecorators: { props: [{
11421
11315
  type: Input
11422
11316
  }], onKeyDown: [{
@@ -15219,6 +15113,11 @@ class CardComponent {
15219
15113
  clickHandler(section, token) {
15220
15114
  this.onClick.emit({ section, token });
15221
15115
  }
15116
+ /** Activación por teclado con Space — previene el scroll de la página. */
15117
+ onKeyActivate(event, section, token) {
15118
+ event.preventDefault();
15119
+ this.clickHandler(section, token);
15120
+ }
15222
15121
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
15223
15122
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CardComponent, isStandalone: true, selector: "val-card", inputs: { preset: "preset", props: "props" }, outputs: { onClick: "onClick" }, usesOnChanges: true, ngImport: i0, template: `
15224
15123
  <ion-card *ngIf="resolvedProps.type === types.native">
@@ -15245,8 +15144,13 @@ class CardComponent {
15245
15144
 
15246
15145
  <ion-card
15247
15146
  *ngIf="resolvedProps.type === types.tappable"
15248
- (click)="clickHandler(sections.content, resolvedProps.token)"
15249
15147
  class="tapable"
15148
+ role="button"
15149
+ tabindex="0"
15150
+ [attr.aria-label]="resolvedProps.title || resolvedProps.overtitle || null"
15151
+ (click)="clickHandler(sections.content, resolvedProps.token)"
15152
+ (keydown.enter)="clickHandler(sections.content, resolvedProps.token)"
15153
+ (keydown.space)="onKeyActivate($event, sections.content, resolvedProps.token)"
15250
15154
  >
15251
15155
  @if (resolvedProps.image) {
15252
15156
  <img [alt]="resolvedProps.title || 'Card image'" [src]="resolvedProps.image" />
@@ -15261,8 +15165,14 @@ class CardComponent {
15261
15165
 
15262
15166
  <ion-card
15263
15167
  *ngIf="resolvedProps.type === types.checker"
15264
- (click)="clickHandler(sections.content, resolvedProps.token)"
15265
15168
  class="tapable"
15169
+ role="button"
15170
+ tabindex="0"
15171
+ [attr.aria-pressed]="!!resolvedProps.selected"
15172
+ [attr.aria-label]="resolvedProps.title || resolvedProps.overtitle || null"
15173
+ (click)="clickHandler(sections.content, resolvedProps.token)"
15174
+ (keydown.enter)="clickHandler(sections.content, resolvedProps.token)"
15175
+ (keydown.space)="onKeyActivate($event, sections.content, resolvedProps.token)"
15266
15176
  >
15267
15177
  <ion-card-header *ngIf="resolvedProps.title || resolvedProps.overtitle" class="checker">
15268
15178
  <div>
@@ -15338,7 +15248,15 @@ class CardComponent {
15338
15248
  </ion-buttons>
15339
15249
  </ion-card-header>
15340
15250
 
15341
- <div class="tapable" (click)="clickHandler(sections.content, resolvedProps.token)">
15251
+ <div
15252
+ class="tapable"
15253
+ role="button"
15254
+ tabindex="0"
15255
+ [attr.aria-label]="resolvedProps.title || resolvedProps.overtitle || null"
15256
+ (click)="clickHandler(sections.content, resolvedProps.token)"
15257
+ (keydown.enter)="clickHandler(sections.content, resolvedProps.token)"
15258
+ (keydown.space)="onKeyActivate($event, sections.content, resolvedProps.token)"
15259
+ >
15342
15260
  <ion-card-header *ngIf="resolvedProps.title || resolvedProps.overtitle" class="complex-header">
15343
15261
  <div>
15344
15262
  <ion-card-subtitle *ngIf="resolvedProps.overtitle">{{ resolvedProps.overtitle }}</ion-card-subtitle>
@@ -15392,7 +15310,7 @@ class CardComponent {
15392
15310
  </ng-container>
15393
15311
  </ion-buttons>
15394
15312
  </ion-card>
15395
- `, 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-card.tapable{transition:transform .3s ease,box-shadow .3s ease}ion-card.tapable:hover{transform:scale(1.01);box-shadow:.1875rem .625rem .5rem #1219541a}.tapable{cursor:pointer}.checker{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.complex-header{padding:10px;display:flex;flex-direction:row;justify-content:space-between;align-items:center}.complex-content{padding-left:10px;padding-top:4px;padding-bottom:10px}.complex{border-radius:16px}img{width:100%;height:auto;max-height:250px;object-fit:cover;display:block;border-radius:24px}.card-actions{display:flex;gap:.5rem;padding:0 16px 16px;flex-wrap:wrap}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: AvatarComponent, selector: "val-avatar", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: ImageComponent, selector: "val-image", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: IonCardSubtitle, selector: "ion-card-subtitle", inputs: ["color", "mode"] }, { kind: "component", type: IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "errorText", "helperText", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
15313
+ `, 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-card.tapable{transition:transform .3s ease,box-shadow .3s ease}ion-card.tapable:hover{transform:scale(1.01);box-shadow:.1875rem .625rem .5rem #1219541a}.tapable{cursor:pointer}.tapable:focus{outline:none}.tapable:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}.checker{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.complex-header{padding:10px;display:flex;flex-direction:row;justify-content:space-between;align-items:center}.complex-content{padding-left:10px;padding-top:4px;padding-bottom:10px}.complex{border-radius:16px}img{width:100%;height:auto;max-height:250px;object-fit:cover;display:block;border-radius:24px}.card-actions{display:flex;gap:.5rem;padding:0 16px 16px;flex-wrap:wrap}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: AvatarComponent, selector: "val-avatar", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: ImageComponent, selector: "val-image", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: IonCardSubtitle, selector: "ion-card-subtitle", inputs: ["color", "mode"] }, { kind: "component", type: IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "errorText", "helperText", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
15396
15314
  }
15397
15315
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CardComponent, decorators: [{
15398
15316
  type: Component,
@@ -15436,8 +15354,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15436
15354
 
15437
15355
  <ion-card
15438
15356
  *ngIf="resolvedProps.type === types.tappable"
15439
- (click)="clickHandler(sections.content, resolvedProps.token)"
15440
15357
  class="tapable"
15358
+ role="button"
15359
+ tabindex="0"
15360
+ [attr.aria-label]="resolvedProps.title || resolvedProps.overtitle || null"
15361
+ (click)="clickHandler(sections.content, resolvedProps.token)"
15362
+ (keydown.enter)="clickHandler(sections.content, resolvedProps.token)"
15363
+ (keydown.space)="onKeyActivate($event, sections.content, resolvedProps.token)"
15441
15364
  >
15442
15365
  @if (resolvedProps.image) {
15443
15366
  <img [alt]="resolvedProps.title || 'Card image'" [src]="resolvedProps.image" />
@@ -15452,8 +15375,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15452
15375
 
15453
15376
  <ion-card
15454
15377
  *ngIf="resolvedProps.type === types.checker"
15455
- (click)="clickHandler(sections.content, resolvedProps.token)"
15456
15378
  class="tapable"
15379
+ role="button"
15380
+ tabindex="0"
15381
+ [attr.aria-pressed]="!!resolvedProps.selected"
15382
+ [attr.aria-label]="resolvedProps.title || resolvedProps.overtitle || null"
15383
+ (click)="clickHandler(sections.content, resolvedProps.token)"
15384
+ (keydown.enter)="clickHandler(sections.content, resolvedProps.token)"
15385
+ (keydown.space)="onKeyActivate($event, sections.content, resolvedProps.token)"
15457
15386
  >
15458
15387
  <ion-card-header *ngIf="resolvedProps.title || resolvedProps.overtitle" class="checker">
15459
15388
  <div>
@@ -15529,7 +15458,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15529
15458
  </ion-buttons>
15530
15459
  </ion-card-header>
15531
15460
 
15532
- <div class="tapable" (click)="clickHandler(sections.content, resolvedProps.token)">
15461
+ <div
15462
+ class="tapable"
15463
+ role="button"
15464
+ tabindex="0"
15465
+ [attr.aria-label]="resolvedProps.title || resolvedProps.overtitle || null"
15466
+ (click)="clickHandler(sections.content, resolvedProps.token)"
15467
+ (keydown.enter)="clickHandler(sections.content, resolvedProps.token)"
15468
+ (keydown.space)="onKeyActivate($event, sections.content, resolvedProps.token)"
15469
+ >
15533
15470
  <ion-card-header *ngIf="resolvedProps.title || resolvedProps.overtitle" class="complex-header">
15534
15471
  <div>
15535
15472
  <ion-card-subtitle *ngIf="resolvedProps.overtitle">{{ resolvedProps.overtitle }}</ion-card-subtitle>
@@ -15583,8 +15520,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15583
15520
  </ng-container>
15584
15521
  </ion-buttons>
15585
15522
  </ion-card>
15586
- `, 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-card.tapable{transition:transform .3s ease,box-shadow .3s ease}ion-card.tapable:hover{transform:scale(1.01);box-shadow:.1875rem .625rem .5rem #1219541a}.tapable{cursor:pointer}.checker{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.complex-header{padding:10px;display:flex;flex-direction:row;justify-content:space-between;align-items:center}.complex-content{padding-left:10px;padding-top:4px;padding-bottom:10px}.complex{border-radius:16px}img{width:100%;height:auto;max-height:250px;object-fit:cover;display:block;border-radius:24px}.card-actions{display:flex;gap:.5rem;padding:0 16px 16px;flex-wrap:wrap}\n"] }]
15587
- }], ctorParameters: () => [], propDecorators: { preset: [{
15523
+ `, 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-card.tapable{transition:transform .3s ease,box-shadow .3s ease}ion-card.tapable:hover{transform:scale(1.01);box-shadow:.1875rem .625rem .5rem #1219541a}.tapable{cursor:pointer}.tapable:focus{outline:none}.tapable:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}.checker{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.complex-header{padding:10px;display:flex;flex-direction:row;justify-content:space-between;align-items:center}.complex-content{padding-left:10px;padding-top:4px;padding-bottom:10px}.complex{border-radius:16px}img{width:100%;height:auto;max-height:250px;object-fit:cover;display:block;border-radius:24px}.card-actions{display:flex;gap:.5rem;padding:0 16px 16px;flex-wrap:wrap}\n"] }]
15524
+ }], propDecorators: { preset: [{
15588
15525
  type: Input
15589
15526
  }], props: [{
15590
15527
  type: Input
@@ -15689,52 +15626,43 @@ class CheckboxRadioInputComponent {
15689
15626
  this.states = ComponentStates;
15690
15627
  }
15691
15628
  ngOnInit() { }
15692
- isSelected(option) {
15693
- return this.props.control?.value === option.id;
15694
- }
15695
- onOptionSelect(option, event) {
15696
- if (event.detail.checked) {
15697
- // Seleccionar esta opción
15698
- this.props.control?.setValue(option.id);
15699
- }
15700
- else {
15701
- // Si se deselecciona la opción actual, limpiar
15702
- if (this.props.control?.value === option.id) {
15703
- this.props.control?.setValue(null);
15704
- }
15705
- }
15629
+ onSelectionChange(event) {
15630
+ // ion-radio-group con allowEmptySelection: re-clickear la opción activa la
15631
+ // deselecciona (value === undefined) → mapear a null para limpiar el control.
15632
+ const value = event.detail.value;
15633
+ this.props.control?.setValue(value ?? null);
15706
15634
  }
15707
15635
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CheckboxRadioInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
15708
15636
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CheckboxRadioInputComponent, isStandalone: true, selector: "val-checkbox-radio-input", inputs: { props: "props" }, ngImport: i0, template: `
15709
- <div class="checkbox-radio-group">
15637
+ <ion-radio-group
15638
+ class="checkbox-radio-group"
15639
+ [value]="props.control?.value"
15640
+ [allowEmptySelection]="true"
15641
+ (ionChange)="onSelectionChange($event)"
15642
+ >
15710
15643
  @for (option of props.options; track option.id) {
15711
- <ion-checkbox
15712
- [checked]="isSelected(option)"
15713
- [disabled]="props.state === states.DISABLED"
15714
- [labelPlacement]="'end'"
15715
- (ionChange)="onOptionSelect(option, $event)"
15716
- >
15644
+ <ion-radio [value]="option.id" [disabled]="props.state === states.DISABLED" labelPlacement="end">
15717
15645
  {{ option.name }}
15718
- </ion-checkbox>
15646
+ </ion-radio>
15719
15647
  }
15720
- </div>
15721
- `, isInline: true, styles: [".checkbox-radio-group{display:flex;flex-direction:row;gap:12px;margin-top:.5rem}.checkbox-radio-group ion-checkbox{--size: 24px;--checkbox-background-checked: var(--ion-color-primary);--checkmark-color: var(--ion-color-primary-contrast)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "errorText", "helperText", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }] }); }
15648
+ </ion-radio-group>
15649
+ `, isInline: true, styles: [".checkbox-radio-group{display:flex;flex-direction:row;gap:12px;margin-top:.5rem}.checkbox-radio-group ion-checkbox{--size: 24px;--checkbox-background-checked: var(--ion-color-primary);--checkmark-color: var(--ion-color-primary-contrast)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: IonRadio, selector: "ion-radio", inputs: ["alignment", "color", "disabled", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonRadioGroup, selector: "ion-radio-group", inputs: ["allowEmptySelection", "compareWith", "errorText", "helperText", "name", "value"] }] }); }
15722
15650
  }
15723
15651
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CheckboxRadioInputComponent, decorators: [{
15724
15652
  type: Component,
15725
- args: [{ selector: 'val-checkbox-radio-input', standalone: true, imports: [CommonModule, ReactiveFormsModule, IonCheckbox], template: `
15726
- <div class="checkbox-radio-group">
15653
+ args: [{ selector: 'val-checkbox-radio-input', standalone: true, imports: [CommonModule, ReactiveFormsModule, IonRadio, IonRadioGroup], template: `
15654
+ <ion-radio-group
15655
+ class="checkbox-radio-group"
15656
+ [value]="props.control?.value"
15657
+ [allowEmptySelection]="true"
15658
+ (ionChange)="onSelectionChange($event)"
15659
+ >
15727
15660
  @for (option of props.options; track option.id) {
15728
- <ion-checkbox
15729
- [checked]="isSelected(option)"
15730
- [disabled]="props.state === states.DISABLED"
15731
- [labelPlacement]="'end'"
15732
- (ionChange)="onOptionSelect(option, $event)"
15733
- >
15661
+ <ion-radio [value]="option.id" [disabled]="props.state === states.DISABLED" labelPlacement="end">
15734
15662
  {{ option.name }}
15735
- </ion-checkbox>
15663
+ </ion-radio>
15736
15664
  }
15737
- </div>
15665
+ </ion-radio-group>
15738
15666
  `, styles: [".checkbox-radio-group{display:flex;flex-direction:row;gap:12px;margin-top:.5rem}.checkbox-radio-group ion-checkbox{--size: 24px;--checkbox-background-checked: var(--ion-color-primary);--checkmark-color: var(--ion-color-primary-contrast)}\n"] }]
15739
15667
  }], propDecorators: { props: [{
15740
15668
  type: Input
@@ -16061,67 +15989,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
16061
15989
  type: Input
16062
15990
  }] } });
16063
15991
 
16064
- /**
16065
- * val-email-input
16066
- *
16067
- * An email input field integrated with Angular forms.
16068
- * Supports presets for reusable configurations.
16069
- *
16070
- * @example With preset (recommended):
16071
- * <val-email-input preset="form-field" [props]="{ control: myControl, placeholder: 'Email' }"></val-email-input>
16072
- *
16073
- * @example Static (backwards compatible):
16074
- * <val-email-input [props]="{ control: myControl, placeholder: 'Enter your email' }"></val-email-input>
16075
- *
16076
- * @input preset: string - Name of preset to apply (e.g., 'form-field')
16077
- * @input props: InputMetadata - Configuration for the input (overrides preset values)
16078
- */
16079
- class EmailInputComponent {
16080
- constructor() {
16081
- this.presets = inject(PresetService);
16082
- /**
16083
- * Input configuration object. Values here override preset values.
16084
- * @type {InputMetadata}
16085
- * @property control - The Angular FormControl for the input.
16086
- * @property placeholder - The placeholder text.
16087
- */
16088
- this.props = {};
16089
- /**
16090
- * Resolved props after merging preset + explicit props.
16091
- */
16092
- this.resolvedProps = {};
16093
- }
16094
- ngOnInit() {
16095
- this.resolveProps();
16096
- }
16097
- ngOnChanges(changes) {
16098
- if (changes['preset'] || changes['props']) {
16099
- this.resolveProps();
16100
- }
16101
- }
16102
- /**
16103
- * Merge preset configuration with explicit props.
16104
- * Explicit props take precedence over preset values.
16105
- */
16106
- resolveProps() {
16107
- const presetProps = this.preset ? this.presets.get('emailInput', this.preset) : {};
16108
- this.resolvedProps = {
16109
- ...presetProps,
16110
- ...this.props,
16111
- };
16112
- }
16113
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EmailInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
16114
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: EmailInputComponent, isStandalone: true, selector: "val-email-input", inputs: { preset: "preset", props: "props" }, usesOnChanges: true, ngImport: i0, template: ` <ion-input [formControl]="resolvedProps.control" type="email" [placeholder]="resolvedProps.placeholder"></ion-input> `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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"] }] }); }
16115
- }
16116
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EmailInputComponent, decorators: [{
16117
- type: Component,
16118
- args: [{ selector: 'val-email-input', standalone: true, imports: [CommonModule, ReactiveFormsModule, IonInput], template: ` <ion-input [formControl]="resolvedProps.control" type="email" [placeholder]="resolvedProps.placeholder"></ion-input> ` }]
16119
- }], propDecorators: { preset: [{
16120
- type: Input
16121
- }], props: [{
16122
- type: Input
16123
- }] } });
16124
-
16125
15992
  /**
16126
15993
  * Resolves a color string to a valid CSS value for use in styles.
16127
15994
  * Supports Ionic color names, CSS variables, and custom colors.
@@ -16134,7 +16001,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
16134
16001
  * resolveColor('--my-custom-color'); // returns 'var(--my-custom-color)'
16135
16002
  * resolveColor('#ff0000'); // returns '#ff0000'
16136
16003
  */
16137
- function resolveColor$1(color) {
16004
+ function resolveColor(color) {
16138
16005
  // Si el color empieza con "--", se asume que es una variable CSS válida
16139
16006
  if (color.startsWith('--')) {
16140
16007
  return `var(${color})`;
@@ -16189,7 +16056,7 @@ class ExpandableTextComponent {
16189
16056
  this.expanded = !this.expanded;
16190
16057
  }
16191
16058
  color() {
16192
- return resolveColor$1(this.props.color || this.defaultColor);
16059
+ return resolveColor(this.props.color || this.defaultColor);
16193
16060
  }
16194
16061
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ExpandableTextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
16195
16062
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ExpandableTextComponent, isStandalone: true, selector: "val-expandable-text", inputs: { props: "props" }, ngImport: i0, template: `
@@ -16202,12 +16069,12 @@ class ExpandableTextComponent {
16202
16069
  </ion-text>
16203
16070
  </div>
16204
16071
  @if (!expanded && isTruncated) {
16205
- <span class="see-more" [style.color]="this.color()" (click)="toggleExpand()">
16072
+ <button type="button" class="see-more" [style.color]="this.color()" [attr.aria-expanded]="expanded" (click)="toggleExpand()">
16206
16073
  {{ getExpandText() }}
16207
- </span>
16074
+ </button>
16208
16075
  }
16209
16076
  </div>
16210
- `, isInline: true, styles: [".description-container{position:relative;overflow:hidden;transition:max-height .3s ease-in-out}.description-container:not(.expanded){max-height:10rem}.description-container.expanded{max-height:none}.content-wrapper{overflow:hidden}.description-container:not(.expanded).has-gradient .content-wrapper{-webkit-mask-image:linear-gradient(to bottom,black 50%,transparent 100%);mask-image:linear-gradient(to bottom,black 50%,transparent 100%)}.description{margin:0}.see-more{display:block;font-weight:700;cursor:pointer;margin-top:.25rem}\n"], dependencies: [{ kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }] }); }
16077
+ `, isInline: true, styles: [".description-container{position:relative;overflow:hidden;transition:max-height .3s ease-in-out}.description-container:not(.expanded){max-height:10rem}.description-container.expanded{max-height:none}.content-wrapper{overflow:hidden}.description-container:not(.expanded).has-gradient .content-wrapper{-webkit-mask-image:linear-gradient(to bottom,black 50%,transparent 100%);mask-image:linear-gradient(to bottom,black 50%,transparent 100%)}.description{margin:0}.see-more{display:block;cursor:pointer;margin-top:.25rem;padding:0;border:none;background:none;font:inherit;font-weight:700;text-align:left}.see-more:focus{outline:none}.see-more:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:4px}\n"], dependencies: [{ kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }] }); }
16211
16078
  }
16212
16079
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ExpandableTextComponent, decorators: [{
16213
16080
  type: Component,
@@ -16221,12 +16088,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
16221
16088
  </ion-text>
16222
16089
  </div>
16223
16090
  @if (!expanded && isTruncated) {
16224
- <span class="see-more" [style.color]="this.color()" (click)="toggleExpand()">
16091
+ <button type="button" class="see-more" [style.color]="this.color()" [attr.aria-expanded]="expanded" (click)="toggleExpand()">
16225
16092
  {{ getExpandText() }}
16226
- </span>
16093
+ </button>
16227
16094
  }
16228
16095
  </div>
16229
- `, styles: [".description-container{position:relative;overflow:hidden;transition:max-height .3s ease-in-out}.description-container:not(.expanded){max-height:10rem}.description-container.expanded{max-height:none}.content-wrapper{overflow:hidden}.description-container:not(.expanded).has-gradient .content-wrapper{-webkit-mask-image:linear-gradient(to bottom,black 50%,transparent 100%);mask-image:linear-gradient(to bottom,black 50%,transparent 100%)}.description{margin:0}.see-more{display:block;font-weight:700;cursor:pointer;margin-top:.25rem}\n"] }]
16096
+ `, styles: [".description-container{position:relative;overflow:hidden;transition:max-height .3s ease-in-out}.description-container:not(.expanded){max-height:10rem}.description-container.expanded{max-height:none}.content-wrapper{overflow:hidden}.description-container:not(.expanded).has-gradient .content-wrapper{-webkit-mask-image:linear-gradient(to bottom,black 50%,transparent 100%);mask-image:linear-gradient(to bottom,black 50%,transparent 100%)}.description{margin:0}.see-more{display:block;cursor:pointer;margin-top:.25rem;padding:0;border:none;background:none;font:inherit;font-weight:700;text-align:left}.see-more:focus{outline:none}.see-more:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:4px}\n"] }]
16230
16097
  }], propDecorators: { props: [{
16231
16098
  type: Input
16232
16099
  }] } });
@@ -16248,7 +16115,11 @@ class FileInputComponent {
16248
16115
  ngOnInit() {
16249
16116
  // Initialize button with i18n text
16250
16117
  this.contrastButton = {
16251
- ...PrimarySolidDefaultRoundButton(this.props?.buttonText || this.i18n.t('uploadFile')),
16118
+ ...button({
16119
+ text: this.props?.buttonText || this.i18n.t('uploadFile'),
16120
+ fill: 'solid',
16121
+ shape: 'round',
16122
+ }),
16252
16123
  color: 'light',
16253
16124
  };
16254
16125
  }
@@ -16318,14 +16189,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
16318
16189
  * val-hint
16319
16190
  *
16320
16191
  * Displays validation error messages for a form input, using Angular forms.
16192
+ * Cuando muestra un error, el contenedor se anuncia a tecnologías asistivas
16193
+ * (`role="alert"` + `aria-live="assertive"`). Acepta un `id` para que el input
16194
+ * asociado lo referencie vía `aria-describedby`.
16321
16195
  *
16322
16196
  * @example
16323
- * <val-hint [props]="{ control: myControl, errors: { required: 'Required field' } }"></val-hint>
16197
+ * <val-hint [props]="{ control: myControl, errors: { required: 'Required field' } }" id="email-error"></val-hint>
16324
16198
  *
16325
16199
  * @input props: InputMetadata - Configuration for the input (form control, errors, etc.)
16200
+ * @input id: string - Id del contenedor, para enlace `aria-describedby` desde el input.
16326
16201
  */
16327
16202
  class HintComponent {
16328
16203
  constructor() {
16204
+ /**
16205
+ * Si el hint representa un error (vs un hint informativo). Hoy `val-hint`
16206
+ * siempre muestra errores de validación, así que por defecto es `true`.
16207
+ */
16208
+ this.isError = true;
16329
16209
  this.i18n = inject(I18nService);
16330
16210
  }
16331
16211
  ngOnInit() { }
@@ -16365,8 +16245,14 @@ class HintComponent {
16365
16245
  return errors;
16366
16246
  }
16367
16247
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HintComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
16368
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: HintComponent, isStandalone: true, selector: "val-hint", inputs: { props: "props" }, ngImport: i0, template: `
16369
- <div class="hint-container" *ngIf="shouldShowErrors">
16248
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: HintComponent, isStandalone: true, selector: "val-hint", inputs: { props: "props", id: "id", isError: "isError" }, ngImport: i0, template: `
16249
+ <div
16250
+ class="hint-container"
16251
+ *ngIf="shouldShowErrors"
16252
+ [attr.id]="id"
16253
+ [attr.role]="isError ? 'alert' : 'status'"
16254
+ [attr.aria-live]="isError ? 'assertive' : 'polite'"
16255
+ >
16370
16256
  <val-text
16371
16257
  *ngFor="let e of Errors"
16372
16258
  [props]="{
@@ -16382,7 +16268,13 @@ class HintComponent {
16382
16268
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HintComponent, decorators: [{
16383
16269
  type: Component,
16384
16270
  args: [{ selector: 'val-hint', standalone: true, imports: [CommonModule, TextComponent], template: `
16385
- <div class="hint-container" *ngIf="shouldShowErrors">
16271
+ <div
16272
+ class="hint-container"
16273
+ *ngIf="shouldShowErrors"
16274
+ [attr.id]="id"
16275
+ [attr.role]="isError ? 'alert' : 'status'"
16276
+ [attr.aria-live]="isError ? 'assertive' : 'polite'"
16277
+ >
16386
16278
  <val-text
16387
16279
  *ngFor="let e of Errors"
16388
16280
  [props]="{
@@ -16396,28 +16288,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
16396
16288
  `, 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}.hint-container{margin-top:.25rem}\n"] }]
16397
16289
  }], ctorParameters: () => [], propDecorators: { props: [{
16398
16290
  type: Input
16399
- }] } });
16400
-
16401
- /**
16402
- * val-hour-input
16403
- *
16404
- * A time picker input integrated with Angular forms, using Ionic's datetime component.
16405
- *
16406
- * @example
16407
- * <val-hour-input [props]="{ control: myControl }"></val-hour-input>
16408
- *
16409
- * @input props: InputMetadata - Configuration for the time input (form control, etc.)
16410
- */
16411
- class HourInputComponent {
16412
- constructor() { }
16413
- ngOnInit() { }
16414
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HourInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
16415
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: HourInputComponent, isStandalone: true, selector: "val-hour-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-datetime [formControl]="props.control" presentation="time"></ion-datetime>`, isInline: true, styles: [""], 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: IonDatetime, selector: "ion-datetime", inputs: ["cancelText", "clearText", "color", "dayValues", "disabled", "doneText", "firstDayOfWeek", "formatOptions", "highlightedDates", "hourCycle", "hourValues", "isDateEnabled", "locale", "max", "min", "minuteValues", "mode", "monthValues", "multiple", "name", "preferWheel", "presentation", "readonly", "showAdjacentDays", "showClearButton", "showDefaultButtons", "showDefaultTimeLabel", "showDefaultTitle", "size", "titleSelectedDatesFormatter", "value", "yearValues"] }] }); }
16416
- }
16417
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HourInputComponent, decorators: [{
16418
- type: Component,
16419
- args: [{ selector: 'val-hour-input', standalone: true, imports: [ReactiveFormsModule, IonDatetime], template: ` <ion-datetime [formControl]="props.control" presentation="time"></ion-datetime>` }]
16420
- }], ctorParameters: () => [], propDecorators: { props: [{
16291
+ }], id: [{
16292
+ type: Input
16293
+ }], isError: [{
16421
16294
  type: Input
16422
16295
  }] } });
16423
16296
 
@@ -17113,7 +16986,7 @@ class LayeredCardComponent {
17113
16986
  if (!background) {
17114
16987
  return '';
17115
16988
  }
17116
- return resolveColor$1(background);
16989
+ return resolveColor(background);
17117
16990
  }
17118
16991
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LayeredCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17119
16992
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LayeredCardComponent, isStandalone: true, selector: "layered-card", inputs: { props: "props" }, ngImport: i0, template: `
@@ -17537,145 +17410,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
17537
17410
  args: [{ required: true }]
17538
17411
  }] } });
17539
17412
 
17540
- /**
17541
- * Utilities for handling default values in form inputs based on InputMetadata configuration.
17542
- */
17543
- /**
17544
- * Resolves the initial value for a form input based on its configuration.
17545
- *
17546
- * @param input - The input metadata configuration
17547
- * @returns The resolved initial value
17548
- *
17549
- * @example
17550
- * // Custom default value
17551
- * const customValue = resolveInputDefaultValue({ withDefault: '2025-06-24', type: InputType.DATE });
17552
- *
17553
- * // Auto default value
17554
- * const autoValue = resolveInputDefaultValue({ withDefault: true, type: InputType.NUMBER });
17555
- *
17556
- * // Explicit value (takes precedence)
17557
- * const explicitValue = resolveInputDefaultValue({ value: 'explicit', withDefault: true, type: InputType.TEXT });
17558
- */
17559
- function resolveInputDefaultValue(input) {
17560
- // Explicit value takes precedence
17561
- if (input.value !== undefined && input.value !== null && input.value !== '') {
17562
- return parseValueByType(input.value, input.type);
17563
- }
17564
- // No default configuration
17565
- if (!input.withDefault) {
17566
- return null;
17567
- }
17568
- // Custom default value
17569
- if (typeof input.withDefault === 'string') {
17570
- return parseValueByType(input.withDefault, input.type);
17571
- }
17572
- // Auto default value (withDefault === true)
17573
- return getAutoDefaultValue(input.type);
17574
- }
17575
- /**
17576
- * Parses a string value to the appropriate type based on the input type.
17577
- *
17578
- * @param value - The string value to parse
17579
- * @param type - The input type
17580
- * @returns The parsed value
17581
- */
17582
- function parseValueByType(value, type) {
17583
- switch (type) {
17584
- case InputType.DATE:
17585
- return new Date(value).toISOString();
17586
- case InputType.NUMBER:
17587
- return parseFloat(value) || 0;
17588
- case InputType.CHECK:
17589
- return value === 'true' || value === '1';
17590
- case InputType.TEXT:
17591
- case InputType.EMAIL:
17592
- case InputType.PASSWORD:
17593
- case InputType.COMMENT:
17594
- case InputType.PIN_CODE:
17595
- case InputType.HOUR:
17596
- case InputType.RADIO:
17597
- case InputType.SELECT:
17598
- case InputType.SEARCH_SELECT:
17599
- case InputType.FILE:
17600
- default:
17601
- return value;
17602
- }
17603
- }
17604
- /**
17605
- * Gets the automatic default value for a given input type.
17606
- *
17607
- * @param type - The input type
17608
- * @returns The auto default value
17609
- */
17610
- function getAutoDefaultValue(type) {
17611
- switch (type) {
17612
- case InputType.DATE:
17613
- return new Date().toISOString();
17614
- case InputType.NUMBER:
17615
- return 0;
17616
- case InputType.CHECK:
17617
- return false;
17618
- case InputType.TEXT:
17619
- case InputType.EMAIL:
17620
- case InputType.PASSWORD:
17621
- case InputType.COMMENT:
17622
- case InputType.PIN_CODE:
17623
- case InputType.HOUR:
17624
- case InputType.RADIO:
17625
- case InputType.SELECT:
17626
- case InputType.SEARCH_SELECT:
17627
- case InputType.FILE:
17628
- default:
17629
- return '';
17630
- }
17631
- }
17632
- /**
17633
- * Applies the resolved default value to a FormControl.
17634
- *
17635
- * @param input - The input metadata configuration
17636
- * @example
17637
- * const input = { control: myFormControl, type: InputType.DATE, withDefault: true };
17638
- * applyDefaultValueToControl(input);
17639
- */
17640
- function applyDefaultValueToControl(input) {
17641
- if (!input.control)
17642
- return;
17643
- const defaultValue = resolveInputDefaultValue(input);
17644
- if (defaultValue !== null) {
17645
- input.control.setValue(defaultValue);
17646
- input.control.markAsPristine();
17647
- input.control.updateValueAndValidity();
17648
- }
17649
- }
17650
-
17651
- /**
17652
- * val-number-input
17653
- *
17654
- * A number input field integrated with Angular forms.
17655
- *
17656
- * @example
17657
- * <val-number-input [props]="{ control: myControl, placeholder: 'Enter a number' }"></val-number-input>
17658
- *
17659
- * @input props: InputMetadata - Configuration for the input (form control, placeholder, etc.)
17660
- */
17661
- class NumberInputComponent {
17662
- constructor() { }
17663
- ngOnInit() {
17664
- // Apply default values on initialization
17665
- if (this.props?.withDefault || this.props?.value) {
17666
- applyDefaultValueToControl(this.props);
17667
- }
17668
- }
17669
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NumberInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17670
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: NumberInputComponent, isStandalone: true, selector: "val-number-input", inputs: { props: "props" }, ngImport: i0, template: ` <ion-input [formControl]="props.control" type="number" [placeholder]="props.placeholder"></ion-input> `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$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"] }] }); }
17671
- }
17672
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NumberInputComponent, decorators: [{
17673
- type: Component,
17674
- args: [{ selector: 'val-number-input', standalone: true, imports: [ReactiveFormsModule, IonInput], template: ` <ion-input [formControl]="props.control" type="number" [placeholder]="props.placeholder"></ion-input> ` }]
17675
- }], ctorParameters: () => [], propDecorators: { props: [{
17676
- type: Input
17677
- }] } });
17678
-
17679
17413
  /**
17680
17414
  * val-number-from-to
17681
17415
  *
@@ -17813,6 +17547,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
17813
17547
  type: Input
17814
17548
  }] } });
17815
17549
 
17550
+ /**
17551
+ * Defaults i18n (es/en) — auto-registrados si el consumer no proveyó el
17552
+ * namespace `PasswordInput`. Cubre el aria-label del toggle mostrar/ocultar.
17553
+ */
17554
+ const PASSWORD_INPUT_I18N = {
17555
+ es: { showPassword: 'Mostrar contraseña', hidePassword: 'Ocultar contraseña' },
17556
+ en: { showPassword: 'Show password', hidePassword: 'Hide password' },
17557
+ };
17816
17558
  /**
17817
17559
  * val-password-input
17818
17560
  *
@@ -17829,8 +17571,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
17829
17571
  * @input props: InputMetadata - Configuration for the input (overrides preset values)
17830
17572
  */
17831
17573
  class PasswordInputComponent {
17832
- constructor(icon) {
17574
+ constructor() {
17833
17575
  this.presets = inject(PresetService);
17576
+ this.i18n = inject(I18nService);
17834
17577
  /**
17835
17578
  * Input configuration object. Values here override preset values.
17836
17579
  * @type {InputMetadata}
@@ -17843,6 +17586,16 @@ class PasswordInputComponent {
17843
17586
  */
17844
17587
  this.resolvedProps = {};
17845
17588
  this.hidePassword = true;
17589
+ if (!this.i18n.hasNamespace('PasswordInput')) {
17590
+ this.i18n.registerContent('PasswordInput', PASSWORD_INPUT_I18N);
17591
+ }
17592
+ }
17593
+ /** Aria-label del botón mostrar/ocultar según el estado de visibilidad. */
17594
+ toggleLabel() {
17595
+ this.i18n.lang();
17596
+ return this.hidePassword
17597
+ ? this.i18n.t('showPassword', 'PasswordInput')
17598
+ : this.i18n.t('hidePassword', 'PasswordInput');
17846
17599
  }
17847
17600
  ngOnInit() {
17848
17601
  this.resolveProps();
@@ -17863,7 +17616,7 @@ class PasswordInputComponent {
17863
17616
  ...this.props,
17864
17617
  };
17865
17618
  }
17866
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PasswordInputComponent, deps: [{ token: IconService }], target: i0.ɵɵFactoryTarget.Component }); }
17619
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PasswordInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17867
17620
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: PasswordInputComponent, isStandalone: true, selector: "val-password-input", inputs: { preset: "preset", props: "props" }, usesOnChanges: true, ngImport: i0, template: `
17868
17621
  <div class="input-container">
17869
17622
  <ion-input
@@ -17872,7 +17625,14 @@ class PasswordInputComponent {
17872
17625
  [type]="hidePassword ? 'password' : 'text'"
17873
17626
  [placeholder]="resolvedProps.placeholder"
17874
17627
  ></ion-input>
17875
- <ion-button color="dark" fill="clear" (click)="hidePassword = !hidePassword" size="small">
17628
+ <ion-button
17629
+ color="dark"
17630
+ fill="clear"
17631
+ (click)="hidePassword = !hidePassword"
17632
+ size="small"
17633
+ [attr.aria-label]="toggleLabel()"
17634
+ [attr.aria-pressed]="!hidePassword"
17635
+ >
17876
17636
  <ion-icon slot="icon-only" [name]="hidePassword ? 'eye-off-outline' : 'eye-outline'"></ion-icon>
17877
17637
  </ion-button>
17878
17638
  </div>
@@ -17888,12 +17648,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
17888
17648
  [type]="hidePassword ? 'password' : 'text'"
17889
17649
  [placeholder]="resolvedProps.placeholder"
17890
17650
  ></ion-input>
17891
- <ion-button color="dark" fill="clear" (click)="hidePassword = !hidePassword" size="small">
17651
+ <ion-button
17652
+ color="dark"
17653
+ fill="clear"
17654
+ (click)="hidePassword = !hidePassword"
17655
+ size="small"
17656
+ [attr.aria-label]="toggleLabel()"
17657
+ [attr.aria-pressed]="!hidePassword"
17658
+ >
17892
17659
  <ion-icon slot="icon-only" [name]="hidePassword ? 'eye-off-outline' : 'eye-outline'"></ion-icon>
17893
17660
  </ion-button>
17894
17661
  </div>
17895
17662
  `, 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"] }]
17896
- }], ctorParameters: () => [{ type: IconService }], propDecorators: { preset: [{
17663
+ }], ctorParameters: () => [], propDecorators: { preset: [{
17897
17664
  type: Input
17898
17665
  }], props: [{
17899
17666
  type: Input
@@ -18446,6 +18213,117 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
18446
18213
  type: Output
18447
18214
  }] } });
18448
18215
 
18216
+ /**
18217
+ * Utilities for handling default values in form inputs based on InputMetadata configuration.
18218
+ */
18219
+ /**
18220
+ * Resolves the initial value for a form input based on its configuration.
18221
+ *
18222
+ * @param input - The input metadata configuration
18223
+ * @returns The resolved initial value
18224
+ *
18225
+ * @example
18226
+ * // Custom default value
18227
+ * const customValue = resolveInputDefaultValue({ withDefault: '2025-06-24', type: InputType.DATE });
18228
+ *
18229
+ * // Auto default value
18230
+ * const autoValue = resolveInputDefaultValue({ withDefault: true, type: InputType.NUMBER });
18231
+ *
18232
+ * // Explicit value (takes precedence)
18233
+ * const explicitValue = resolveInputDefaultValue({ value: 'explicit', withDefault: true, type: InputType.TEXT });
18234
+ */
18235
+ function resolveInputDefaultValue(input) {
18236
+ // Explicit value takes precedence
18237
+ if (input.value !== undefined && input.value !== null && input.value !== '') {
18238
+ return parseValueByType(input.value, input.type);
18239
+ }
18240
+ // No default configuration
18241
+ if (!input.withDefault) {
18242
+ return null;
18243
+ }
18244
+ // Custom default value
18245
+ if (typeof input.withDefault === 'string') {
18246
+ return parseValueByType(input.withDefault, input.type);
18247
+ }
18248
+ // Auto default value (withDefault === true)
18249
+ return getAutoDefaultValue(input.type);
18250
+ }
18251
+ /**
18252
+ * Parses a string value to the appropriate type based on the input type.
18253
+ *
18254
+ * @param value - The string value to parse
18255
+ * @param type - The input type
18256
+ * @returns The parsed value
18257
+ */
18258
+ function parseValueByType(value, type) {
18259
+ switch (type) {
18260
+ case InputType.DATE:
18261
+ return new Date(value).toISOString();
18262
+ case InputType.NUMBER:
18263
+ return parseFloat(value) || 0;
18264
+ case InputType.CHECK:
18265
+ return value === 'true' || value === '1';
18266
+ case InputType.TEXT:
18267
+ case InputType.EMAIL:
18268
+ case InputType.PASSWORD:
18269
+ case InputType.COMMENT:
18270
+ case InputType.PIN_CODE:
18271
+ case InputType.HOUR:
18272
+ case InputType.RADIO:
18273
+ case InputType.SELECT:
18274
+ case InputType.SEARCH_SELECT:
18275
+ case InputType.FILE:
18276
+ default:
18277
+ return value;
18278
+ }
18279
+ }
18280
+ /**
18281
+ * Gets the automatic default value for a given input type.
18282
+ *
18283
+ * @param type - The input type
18284
+ * @returns The auto default value
18285
+ */
18286
+ function getAutoDefaultValue(type) {
18287
+ switch (type) {
18288
+ case InputType.DATE:
18289
+ return new Date().toISOString();
18290
+ case InputType.NUMBER:
18291
+ return 0;
18292
+ case InputType.CHECK:
18293
+ return false;
18294
+ case InputType.TEXT:
18295
+ case InputType.EMAIL:
18296
+ case InputType.PASSWORD:
18297
+ case InputType.COMMENT:
18298
+ case InputType.PIN_CODE:
18299
+ case InputType.HOUR:
18300
+ case InputType.RADIO:
18301
+ case InputType.SELECT:
18302
+ case InputType.SEARCH_SELECT:
18303
+ case InputType.FILE:
18304
+ default:
18305
+ return '';
18306
+ }
18307
+ }
18308
+ /**
18309
+ * Applies the resolved default value to a FormControl.
18310
+ *
18311
+ * @param input - The input metadata configuration
18312
+ * @example
18313
+ * const input = { control: myFormControl, type: InputType.DATE, withDefault: true };
18314
+ * applyDefaultValueToControl(input);
18315
+ */
18316
+ function applyDefaultValueToControl(input) {
18317
+ if (!input.control)
18318
+ return;
18319
+ const defaultValue = resolveInputDefaultValue(input);
18320
+ if (defaultValue !== null) {
18321
+ input.control.setValue(defaultValue);
18322
+ input.control.markAsPristine();
18323
+ input.control.updateValueAndValidity();
18324
+ }
18325
+ }
18326
+
18449
18327
  /**
18450
18328
  * val-select-input
18451
18329
  *
@@ -19128,17 +19006,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
19128
19006
  type: Output
19129
19007
  }] } });
19130
19008
 
19009
+ /** Contador estático para generar ids únicos por instancia. */
19010
+ let textInputUid = 0;
19131
19011
  /**
19132
19012
  * val-text-input
19133
19013
  *
19134
- * A text input field integrated with Angular forms.
19014
+ * A text input field integrated with Angular forms. Renders the native HTML
19015
+ * input type from `props.inputType` (default 'text'). Collapses the former
19016
+ * `val-email-input` / `val-number-input` / `val-hour-input` molecules:
19017
+ * - `inputType: 'email' | 'number' | 'tel' | 'password' | ...` → `<ion-input [type]>`
19018
+ * - `inputType: 'time'` → `<ion-datetime presentation="time">` (ex `val-hour-input`)
19019
+ *
19135
19020
  * Supports presets for reusable configurations.
19136
19021
  *
19137
19022
  * @example With preset (recommended):
19138
19023
  * <val-text-input preset="form-field" [props]="{ control: myControl, placeholder: 'Enter text' }"></val-text-input>
19139
19024
  *
19140
- * @example Static (backwards compatible):
19141
- * <val-text-input [props]="{ control: myControl, placeholder: 'Enter text' }"></val-text-input>
19025
+ * @example Email:
19026
+ * <val-text-input [props]="{ control: emailControl, inputType: 'email' }"></val-text-input>
19027
+ *
19028
+ * @example Time picker (ex val-hour-input):
19029
+ * <val-text-input [props]="{ control: timeControl, inputType: 'time' }"></val-text-input>
19142
19030
  *
19143
19031
  * @input preset: string - Name of preset to apply (e.g., 'form-field', 'search')
19144
19032
  * @input props: InputMetadata - Configuration for the input (overrides preset values)
@@ -19151,6 +19039,7 @@ class TextInputComponent {
19151
19039
  * @type {InputMetadata}
19152
19040
  * @property control - The Angular FormControl for the input.
19153
19041
  * @property placeholder - The placeholder text.
19042
+ * @property inputType - Native HTML input type ('text' | 'email' | 'number' | 'tel' | 'password' | 'time' | ...).
19154
19043
  * @property label, name, hint, type, validators, etc. - See InputMetadata for all options.
19155
19044
  */
19156
19045
  this.props = {};
@@ -19160,6 +19049,23 @@ class TextInputComponent {
19160
19049
  */
19161
19050
  this.resolvedProps = {};
19162
19051
  this.states = ComponentStates;
19052
+ /** Ids únicos por instancia para el wiring de accesibilidad label↔input↔error. */
19053
+ this.uid = `val-text-input-${textInputUid++}`;
19054
+ this.inputId = `${this.uid}-control`;
19055
+ }
19056
+ /**
19057
+ * Id del label visible. Si `val-form` orquesta el campo, pasa el id del
19058
+ * `<val-title>` externo vía `props.labelId`; si no, se usa el id interno.
19059
+ */
19060
+ get labelId() {
19061
+ return this.resolvedProps?.labelId ?? `${this.uid}-label`;
19062
+ }
19063
+ /**
19064
+ * Id del contenedor de error. Si `val-form` orquesta el campo, pasa el id del
19065
+ * `<val-hint>` externo vía `props.errorId`; si no, se usa el id interno.
19066
+ */
19067
+ get errorId() {
19068
+ return this.resolvedProps?.errorId ?? `${this.uid}-error`;
19163
19069
  }
19164
19070
  ngOnInit() {
19165
19071
  this.resolveProps();
@@ -19173,6 +19079,18 @@ class TextInputComponent {
19173
19079
  this.resolveProps();
19174
19080
  }
19175
19081
  }
19082
+ /**
19083
+ * Native HTML input type, defaulting to 'text'. Drives both the `[type]` of the
19084
+ * `<ion-input>` and the branch between `<ion-input>` and `<ion-datetime>`.
19085
+ */
19086
+ get resolvedType() {
19087
+ return this.resolvedProps?.inputType ?? 'text';
19088
+ }
19089
+ /** Para `aria-invalid` / `aria-describedby`: error visible solo si tocado. */
19090
+ get isInvalid() {
19091
+ const control = this.resolvedProps?.control;
19092
+ return !!(control && control.invalid && control.touched);
19093
+ }
19176
19094
  /**
19177
19095
  * Merge preset configuration with explicit props.
19178
19096
  * Explicit props take precedence over preset values.
@@ -19186,11 +19104,57 @@ class TextInputComponent {
19186
19104
  };
19187
19105
  }
19188
19106
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TextInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
19189
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TextInputComponent, isStandalone: true, selector: "val-text-input", inputs: { preset: "preset", props: "props" }, usesOnChanges: true, ngImport: i0, template: ` <ion-input [formControl]="resolvedProps.control" type="text" [placeholder]="resolvedProps.placeholder" /> `, 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}\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"] }] }); }
19107
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TextInputComponent, isStandalone: true, selector: "val-text-input", inputs: { preset: "preset", props: "props" }, usesOnChanges: true, ngImport: i0, template: `
19108
+ @if (resolvedType === 'time') {
19109
+ <ion-datetime
19110
+ [formControl]="resolvedProps.control"
19111
+ presentation="time"
19112
+ [attr.id]="inputId"
19113
+ [attr.aria-label]="resolvedProps.label || null"
19114
+ [attr.aria-labelledby]="resolvedProps.label ? labelId : null"
19115
+ [attr.aria-invalid]="isInvalid"
19116
+ [attr.aria-describedby]="isInvalid ? errorId : null"
19117
+ ></ion-datetime>
19118
+ } @else {
19119
+ <ion-input
19120
+ [formControl]="resolvedProps.control"
19121
+ [type]="resolvedType"
19122
+ [placeholder]="resolvedProps.placeholder"
19123
+ [attr.id]="inputId"
19124
+ [attr.aria-label]="resolvedProps.label || null"
19125
+ [attr.aria-labelledby]="resolvedProps.label ? labelId : null"
19126
+ [attr.aria-invalid]="isInvalid"
19127
+ [attr.aria-describedby]="isInvalid ? errorId : null"
19128
+ />
19129
+ }
19130
+ `, 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}\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: IonDatetime, selector: "ion-datetime", inputs: ["cancelText", "clearText", "color", "dayValues", "disabled", "doneText", "firstDayOfWeek", "formatOptions", "highlightedDates", "hourCycle", "hourValues", "isDateEnabled", "locale", "max", "min", "minuteValues", "mode", "monthValues", "multiple", "name", "preferWheel", "presentation", "readonly", "showAdjacentDays", "showClearButton", "showDefaultButtons", "showDefaultTimeLabel", "showDefaultTitle", "size", "titleSelectedDatesFormatter", "value", "yearValues"] }] }); }
19190
19131
  }
19191
19132
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TextInputComponent, decorators: [{
19192
19133
  type: Component,
19193
- args: [{ selector: 'val-text-input', standalone: true, imports: [ReactiveFormsModule, IonInput], template: ` <ion-input [formControl]="resolvedProps.control" type="text" [placeholder]="resolvedProps.placeholder" /> `, 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}\n"] }]
19134
+ args: [{ selector: 'val-text-input', standalone: true, imports: [ReactiveFormsModule, IonInput, IonDatetime], template: `
19135
+ @if (resolvedType === 'time') {
19136
+ <ion-datetime
19137
+ [formControl]="resolvedProps.control"
19138
+ presentation="time"
19139
+ [attr.id]="inputId"
19140
+ [attr.aria-label]="resolvedProps.label || null"
19141
+ [attr.aria-labelledby]="resolvedProps.label ? labelId : null"
19142
+ [attr.aria-invalid]="isInvalid"
19143
+ [attr.aria-describedby]="isInvalid ? errorId : null"
19144
+ ></ion-datetime>
19145
+ } @else {
19146
+ <ion-input
19147
+ [formControl]="resolvedProps.control"
19148
+ [type]="resolvedType"
19149
+ [placeholder]="resolvedProps.placeholder"
19150
+ [attr.id]="inputId"
19151
+ [attr.aria-label]="resolvedProps.label || null"
19152
+ [attr.aria-labelledby]="resolvedProps.label ? labelId : null"
19153
+ [attr.aria-invalid]="isInvalid"
19154
+ [attr.aria-describedby]="isInvalid ? errorId : null"
19155
+ />
19156
+ }
19157
+ `, 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}\n"] }]
19194
19158
  }], propDecorators: { preset: [{
19195
19159
  type: Input
19196
19160
  }], props: [{
@@ -19433,7 +19397,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
19433
19397
  type: Input
19434
19398
  }] } });
19435
19399
 
19436
- const IONIC_COLORS$9 = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];
19400
+ const IONIC_COLORS$6 = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];
19437
19401
  class PillComponent {
19438
19402
  constructor() {
19439
19403
  this.presets = inject(PresetService);
@@ -19473,7 +19437,7 @@ class PillComponent {
19473
19437
  }
19474
19438
  getIconColor() {
19475
19439
  const c = this.resolvedProps.notification?.iconColor || 'warning';
19476
- return IONIC_COLORS$9.includes(c) ? `var(--ion-color-${c})` : c;
19440
+ return IONIC_COLORS$6.includes(c) ? `var(--ion-color-${c})` : c;
19477
19441
  }
19478
19442
  onPillClick(event) {
19479
19443
  if (!this.resolvedProps.clickable)
@@ -19625,17 +19589,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
19625
19589
  type: Output
19626
19590
  }] } });
19627
19591
 
19592
+ /**
19593
+ * Defaults i18n (es/en) — auto-registrados si el consumer no proveyó el
19594
+ * namespace `CommandDisplay`. Cubre el aria-label del botón copiar.
19595
+ */
19596
+ const COMMAND_DISPLAY_I18N = {
19597
+ es: { copy: 'Copiar comando' },
19598
+ en: { copy: 'Copy command' },
19599
+ };
19628
19600
  class CommandDisplayComponent {
19629
19601
  constructor() {
19630
19602
  this.toast = inject(ToastController);
19631
19603
  this.i18n = inject(I18nService);
19604
+ /** Mensaje anunciado por el lector de pantalla al copiar. */
19605
+ this.copiedMessage = '';
19606
+ if (!this.i18n.hasNamespace('CommandDisplay')) {
19607
+ this.i18n.registerContent('CommandDisplay', COMMAND_DISPLAY_I18N);
19608
+ }
19609
+ }
19610
+ copyLabel() {
19611
+ this.i18n.lang();
19612
+ return this.i18n.t('copy', 'CommandDisplay');
19632
19613
  }
19633
19614
  async copyCommand() {
19634
19615
  if (this.props.text) {
19635
19616
  await Clipboard.write({
19636
19617
  string: this.props.text,
19637
19618
  });
19638
- this.presentToast(this.i18n.t('copiedToClipboard'));
19619
+ const message = this.i18n.t('copiedToClipboard');
19620
+ this.copiedMessage = message;
19621
+ this.presentToast(message);
19639
19622
  }
19640
19623
  }
19641
19624
  async presentToast(message) {
@@ -19651,19 +19634,25 @@ class CommandDisplayComponent {
19651
19634
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CommandDisplayComponent, isStandalone: true, selector: "val-command-display", inputs: { props: "props" }, ngImport: i0, template: `
19652
19635
  <div class="command-container">
19653
19636
  <div class="command-text">$ {{ props.text }}</div>
19654
- <ion-icon name="copy-outline" class="copy-icon" (click)="copyCommand()"></ion-icon>
19637
+ <button type="button" class="copy-button" [attr.aria-label]="copyLabel()" (click)="copyCommand()">
19638
+ <ion-icon name="copy-outline" class="copy-icon" aria-hidden="true"></ion-icon>
19639
+ </button>
19655
19640
  </div>
19656
- `, isInline: true, styles: [".command-container{display:flex;align-items:center;justify-content:space-between;background-color:var(--ion-color-light, #f2f2f2);border-radius:24px;padding:12px 16px;box-shadow:0 2px 4px #0000001a}.command-text{flex-grow:1;font-family:monospace;font-size:.8rem;color:var(--ion-color-dark, #333);margin-right:10px}.copy-icon{font-size:1.3rem;color:var(--ion-color-medium, #92949c);cursor:pointer;transition:color .2s ease-in-out}.copy-icon:hover{color:var(--ion-color-primary, #3880ff)}@media (min-width: 600px){.command-text,.copy-icon{font-size:1.2rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
19641
+ <span class="sr-only" role="status" aria-live="polite">{{ copiedMessage }}</span>
19642
+ `, 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)}.command-container{display:flex;align-items:center;justify-content:space-between;background-color:var(--ion-color-light, #f2f2f2);border-radius:24px;padding:12px 16px;box-shadow:0 2px 4px #0000001a}.command-text{flex-grow:1;font-family:monospace;font-size:.8rem;color:var(--ion-color-dark, #333);margin-right:10px}.copy-button{display:inline-flex;align-items:center;justify-content:center;padding:4px;margin:0;border:none;background:none;line-height:0;cursor:pointer;border-radius:8px}.copy-button:focus{outline:none}.copy-button:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}.copy-button:hover .copy-icon{color:var(--ion-color-primary, #3880ff)}.copy-icon{font-size:1.3rem;color:var(--ion-color-medium, #92949c);transition:color .2s ease-in-out}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@media (min-width: 600px){.command-text,.copy-icon{font-size:1.2rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
19657
19643
  }
19658
19644
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CommandDisplayComponent, decorators: [{
19659
19645
  type: Component,
19660
19646
  args: [{ selector: 'val-command-display', standalone: true, imports: [CommonModule, IonIcon], template: `
19661
19647
  <div class="command-container">
19662
19648
  <div class="command-text">$ {{ props.text }}</div>
19663
- <ion-icon name="copy-outline" class="copy-icon" (click)="copyCommand()"></ion-icon>
19649
+ <button type="button" class="copy-button" [attr.aria-label]="copyLabel()" (click)="copyCommand()">
19650
+ <ion-icon name="copy-outline" class="copy-icon" aria-hidden="true"></ion-icon>
19651
+ </button>
19664
19652
  </div>
19665
- `, styles: [".command-container{display:flex;align-items:center;justify-content:space-between;background-color:var(--ion-color-light, #f2f2f2);border-radius:24px;padding:12px 16px;box-shadow:0 2px 4px #0000001a}.command-text{flex-grow:1;font-family:monospace;font-size:.8rem;color:var(--ion-color-dark, #333);margin-right:10px}.copy-icon{font-size:1.3rem;color:var(--ion-color-medium, #92949c);cursor:pointer;transition:color .2s ease-in-out}.copy-icon:hover{color:var(--ion-color-primary, #3880ff)}@media (min-width: 600px){.command-text,.copy-icon{font-size:1.2rem}}\n"] }]
19666
- }], propDecorators: { props: [{
19653
+ <span class="sr-only" role="status" aria-live="polite">{{ copiedMessage }}</span>
19654
+ `, 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)}.command-container{display:flex;align-items:center;justify-content:space-between;background-color:var(--ion-color-light, #f2f2f2);border-radius:24px;padding:12px 16px;box-shadow:0 2px 4px #0000001a}.command-text{flex-grow:1;font-family:monospace;font-size:.8rem;color:var(--ion-color-dark, #333);margin-right:10px}.copy-button{display:inline-flex;align-items:center;justify-content:center;padding:4px;margin:0;border:none;background:none;line-height:0;cursor:pointer;border-radius:8px}.copy-button:focus{outline:none}.copy-button:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}.copy-button:hover .copy-icon{color:var(--ion-color-primary, #3880ff)}.copy-icon{font-size:1.3rem;color:var(--ion-color-medium, #92949c);transition:color .2s ease-in-out}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@media (min-width: 600px){.command-text,.copy-icon{font-size:1.2rem}}\n"] }]
19655
+ }], ctorParameters: () => [], propDecorators: { props: [{
19667
19656
  type: Input
19668
19657
  }] } });
19669
19658
 
@@ -20061,9 +20050,7 @@ class BreadcrumbComponent {
20061
20050
  }
20062
20051
  }
20063
20052
  resolveProps() {
20064
- const presetProps = this.preset
20065
- ? this.presets.get('breadcrumb', this.preset)
20066
- : {};
20053
+ const presetProps = this.preset ? this.presets.get('breadcrumb', this.preset) : {};
20067
20054
  this.resolvedProps = {
20068
20055
  ...presetProps,
20069
20056
  ...this.props,
@@ -20093,6 +20080,7 @@ class BreadcrumbComponent {
20093
20080
  [active]="item.active || isLast"
20094
20081
  [disabled]="item.disabled"
20095
20082
  [separator]="!isLast"
20083
+ [attr.aria-current]="item.active || isLast ? 'page' : null"
20096
20084
  (click)="onBreadcrumbClick($event, item, $index)"
20097
20085
  >
20098
20086
  @if (item.icon) {
@@ -20121,6 +20109,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
20121
20109
  [active]="item.active || isLast"
20122
20110
  [disabled]="item.disabled"
20123
20111
  [separator]="!isLast"
20112
+ [attr.aria-current]="item.active || isLast ? 'page' : null"
20124
20113
  (click)="onBreadcrumbClick($event, item, $index)"
20125
20114
  >
20126
20115
  @if (item.icon) {
@@ -20145,6 +20134,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
20145
20134
  }] } });
20146
20135
 
20147
20136
  addIcons({ chevronBack, chevronForward, playBack, playForward });
20137
+ /**
20138
+ * Defaults i18n (es/en) — auto-registrados si el consumer no proveyó el
20139
+ * namespace `Pagination`. Cubre los aria-label de la navegación y sus botones.
20140
+ */
20141
+ const PAGINATION_I18N = {
20142
+ es: {
20143
+ nav: 'Paginación',
20144
+ first: 'Primera página',
20145
+ previous: 'Página anterior',
20146
+ next: 'Página siguiente',
20147
+ last: 'Última página',
20148
+ page: 'Página {page}',
20149
+ pageInfo: 'Página {current} de {total}',
20150
+ },
20151
+ en: {
20152
+ nav: 'Pagination',
20153
+ first: 'First page',
20154
+ previous: 'Previous page',
20155
+ next: 'Next page',
20156
+ last: 'Last page',
20157
+ page: 'Page {page}',
20158
+ pageInfo: 'Page {current} of {total}',
20159
+ },
20160
+ };
20148
20161
  /**
20149
20162
  * val-pagination
20150
20163
  *
@@ -20170,9 +20183,28 @@ addIcons({ chevronBack, chevronForward, playBack, playForward });
20170
20183
  */
20171
20184
  class PaginationComponent {
20172
20185
  constructor() {
20186
+ this.i18n = inject(I18nService);
20173
20187
  this.pageChange = new EventEmitter();
20174
20188
  this.visiblePages = [];
20175
20189
  this.totalPages = 1;
20190
+ if (!this.i18n.hasNamespace('Pagination')) {
20191
+ this.i18n.registerContent('Pagination', PAGINATION_I18N);
20192
+ }
20193
+ }
20194
+ t(key) {
20195
+ this.i18n.lang();
20196
+ return this.i18n.t(key, 'Pagination');
20197
+ }
20198
+ pageLabel(page) {
20199
+ this.i18n.lang();
20200
+ return this.i18n.t('page', 'Pagination', { page: page.toString() });
20201
+ }
20202
+ pageInfo() {
20203
+ this.i18n.lang();
20204
+ return this.i18n.t('pageInfo', 'Pagination', {
20205
+ current: this.props.currentPage.toString(),
20206
+ total: this.totalPages.toString(),
20207
+ });
20176
20208
  }
20177
20209
  ngOnChanges(changes) {
20178
20210
  if (changes['props']) {
@@ -20241,16 +20273,17 @@ class PaginationComponent {
20241
20273
  }
20242
20274
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
20243
20275
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PaginationComponent, isStandalone: true, selector: "val-pagination", inputs: { props: "props" }, outputs: { pageChange: "pageChange" }, usesOnChanges: true, ngImport: i0, template: `
20244
- <div class="pagination-container" [class.disabled]="props.disabled">
20276
+ <nav class="pagination-container" [class.disabled]="props.disabled" [attr.aria-label]="t('nav')">
20245
20277
  @if (props.showFirstLast !== false) {
20246
20278
  <ion-button
20247
20279
  fill="clear"
20248
20280
  [size]="props.size || 'default'"
20249
20281
  [color]="props.color || 'primary'"
20250
20282
  [disabled]="props.disabled || props.currentPage <= 1"
20283
+ [attr.aria-label]="t('first')"
20251
20284
  (click)="goToPage(1)"
20252
20285
  >
20253
- <ion-icon slot="icon-only" name="play-back"></ion-icon>
20286
+ <ion-icon slot="icon-only" name="play-back" aria-hidden="true"></ion-icon>
20254
20287
  </ion-button>
20255
20288
  }
20256
20289
 
@@ -20260,21 +20293,24 @@ class PaginationComponent {
20260
20293
  [size]="props.size || 'default'"
20261
20294
  [color]="props.color || 'primary'"
20262
20295
  [disabled]="props.disabled || props.currentPage <= 1"
20296
+ [attr.aria-label]="t('previous')"
20263
20297
  (click)="goToPage(props.currentPage - 1)"
20264
20298
  >
20265
- <ion-icon slot="icon-only" name="chevron-back"></ion-icon>
20299
+ <ion-icon slot="icon-only" name="chevron-back" aria-hidden="true"></ion-icon>
20266
20300
  </ion-button>
20267
20301
  }
20268
20302
 
20269
20303
  @for (page of visiblePages; track page) {
20270
20304
  @if (page === -1) {
20271
- <span class="ellipsis">...</span>
20305
+ <span class="ellipsis" aria-hidden="true">...</span>
20272
20306
  } @else {
20273
20307
  <ion-button
20274
20308
  [fill]="page === props.currentPage ? 'solid' : 'clear'"
20275
20309
  [size]="props.size || 'default'"
20276
20310
  [color]="props.color || 'primary'"
20277
20311
  [disabled]="props.disabled"
20312
+ [attr.aria-label]="pageLabel(page)"
20313
+ [attr.aria-current]="page === props.currentPage ? 'page' : null"
20278
20314
  (click)="goToPage(page)"
20279
20315
  >
20280
20316
  {{ page }}
@@ -20288,9 +20324,10 @@ class PaginationComponent {
20288
20324
  [size]="props.size || 'default'"
20289
20325
  [color]="props.color || 'primary'"
20290
20326
  [disabled]="props.disabled || props.currentPage >= totalPages"
20327
+ [attr.aria-label]="t('next')"
20291
20328
  (click)="goToPage(props.currentPage + 1)"
20292
20329
  >
20293
- <ion-icon slot="icon-only" name="chevron-forward"></ion-icon>
20330
+ <ion-icon slot="icon-only" name="chevron-forward" aria-hidden="true"></ion-icon>
20294
20331
  </ion-button>
20295
20332
  }
20296
20333
 
@@ -20300,31 +20337,33 @@ class PaginationComponent {
20300
20337
  [size]="props.size || 'default'"
20301
20338
  [color]="props.color || 'primary'"
20302
20339
  [disabled]="props.disabled || props.currentPage >= totalPages"
20340
+ [attr.aria-label]="t('last')"
20303
20341
  (click)="goToPage(totalPages)"
20304
20342
  >
20305
- <ion-icon slot="icon-only" name="play-forward"></ion-icon>
20343
+ <ion-icon slot="icon-only" name="play-forward" aria-hidden="true"></ion-icon>
20306
20344
  </ion-button>
20307
20345
  }
20308
20346
 
20309
20347
  @if (props.showPageInfo) {
20310
- <span class="page-info">Page {{ props.currentPage }} of {{ totalPages }}</span>
20348
+ <span class="page-info">{{ pageInfo() }}</span>
20311
20349
  }
20312
- </div>
20350
+ </nav>
20313
20351
  `, isInline: true, styles: [":host{display:block}.pagination-container{display:flex;align-items:center;justify-content:center;gap:4px;flex-wrap:wrap}.pagination-container.disabled{opacity:.5;pointer-events:none}ion-button{--padding-start: 8px;--padding-end: 8px;min-width:36px;font-weight:500}ion-button[size=small]{--padding-start: 6px;--padding-end: 6px;min-width:28px;font-size:.75rem}ion-button[size=large]{--padding-start: 12px;--padding-end: 12px;min-width:44px;font-size:1rem}.ellipsis{padding:0 8px;color:var(--ion-color-medium);font-size:.875rem}.page-info{margin-left:16px;color:var(--ion-color-medium);font-size:.875rem;white-space:nowrap}\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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
20314
20352
  }
20315
20353
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PaginationComponent, decorators: [{
20316
20354
  type: Component,
20317
20355
  args: [{ selector: 'val-pagination', standalone: true, imports: [CommonModule, IonButton, IonIcon], template: `
20318
- <div class="pagination-container" [class.disabled]="props.disabled">
20356
+ <nav class="pagination-container" [class.disabled]="props.disabled" [attr.aria-label]="t('nav')">
20319
20357
  @if (props.showFirstLast !== false) {
20320
20358
  <ion-button
20321
20359
  fill="clear"
20322
20360
  [size]="props.size || 'default'"
20323
20361
  [color]="props.color || 'primary'"
20324
20362
  [disabled]="props.disabled || props.currentPage <= 1"
20363
+ [attr.aria-label]="t('first')"
20325
20364
  (click)="goToPage(1)"
20326
20365
  >
20327
- <ion-icon slot="icon-only" name="play-back"></ion-icon>
20366
+ <ion-icon slot="icon-only" name="play-back" aria-hidden="true"></ion-icon>
20328
20367
  </ion-button>
20329
20368
  }
20330
20369
 
@@ -20334,21 +20373,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
20334
20373
  [size]="props.size || 'default'"
20335
20374
  [color]="props.color || 'primary'"
20336
20375
  [disabled]="props.disabled || props.currentPage <= 1"
20376
+ [attr.aria-label]="t('previous')"
20337
20377
  (click)="goToPage(props.currentPage - 1)"
20338
20378
  >
20339
- <ion-icon slot="icon-only" name="chevron-back"></ion-icon>
20379
+ <ion-icon slot="icon-only" name="chevron-back" aria-hidden="true"></ion-icon>
20340
20380
  </ion-button>
20341
20381
  }
20342
20382
 
20343
20383
  @for (page of visiblePages; track page) {
20344
20384
  @if (page === -1) {
20345
- <span class="ellipsis">...</span>
20385
+ <span class="ellipsis" aria-hidden="true">...</span>
20346
20386
  } @else {
20347
20387
  <ion-button
20348
20388
  [fill]="page === props.currentPage ? 'solid' : 'clear'"
20349
20389
  [size]="props.size || 'default'"
20350
20390
  [color]="props.color || 'primary'"
20351
20391
  [disabled]="props.disabled"
20392
+ [attr.aria-label]="pageLabel(page)"
20393
+ [attr.aria-current]="page === props.currentPage ? 'page' : null"
20352
20394
  (click)="goToPage(page)"
20353
20395
  >
20354
20396
  {{ page }}
@@ -20362,9 +20404,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
20362
20404
  [size]="props.size || 'default'"
20363
20405
  [color]="props.color || 'primary'"
20364
20406
  [disabled]="props.disabled || props.currentPage >= totalPages"
20407
+ [attr.aria-label]="t('next')"
20365
20408
  (click)="goToPage(props.currentPage + 1)"
20366
20409
  >
20367
- <ion-icon slot="icon-only" name="chevron-forward"></ion-icon>
20410
+ <ion-icon slot="icon-only" name="chevron-forward" aria-hidden="true"></ion-icon>
20368
20411
  </ion-button>
20369
20412
  }
20370
20413
 
@@ -20374,18 +20417,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
20374
20417
  [size]="props.size || 'default'"
20375
20418
  [color]="props.color || 'primary'"
20376
20419
  [disabled]="props.disabled || props.currentPage >= totalPages"
20420
+ [attr.aria-label]="t('last')"
20377
20421
  (click)="goToPage(totalPages)"
20378
20422
  >
20379
- <ion-icon slot="icon-only" name="play-forward"></ion-icon>
20423
+ <ion-icon slot="icon-only" name="play-forward" aria-hidden="true"></ion-icon>
20380
20424
  </ion-button>
20381
20425
  }
20382
20426
 
20383
20427
  @if (props.showPageInfo) {
20384
- <span class="page-info">Page {{ props.currentPage }} of {{ totalPages }}</span>
20428
+ <span class="page-info">{{ pageInfo() }}</span>
20385
20429
  }
20386
- </div>
20430
+ </nav>
20387
20431
  `, styles: [":host{display:block}.pagination-container{display:flex;align-items:center;justify-content:center;gap:4px;flex-wrap:wrap}.pagination-container.disabled{opacity:.5;pointer-events:none}ion-button{--padding-start: 8px;--padding-end: 8px;min-width:36px;font-weight:500}ion-button[size=small]{--padding-start: 6px;--padding-end: 6px;min-width:28px;font-size:.75rem}ion-button[size=large]{--padding-start: 12px;--padding-end: 12px;min-width:44px;font-size:1rem}.ellipsis{padding:0 8px;color:var(--ion-color-medium);font-size:.875rem}.page-info{margin-left:16px;color:var(--ion-color-medium);font-size:.875rem;white-space:nowrap}\n"] }]
20388
- }], propDecorators: { props: [{
20432
+ }], ctorParameters: () => [], propDecorators: { props: [{
20389
20433
  type: Input
20390
20434
  }], pageChange: [{
20391
20435
  type: Output
@@ -20516,13 +20560,17 @@ class StepperComponent {
20516
20560
  [class.vertical]="resolvedProps.orientation === 'vertical'"
20517
20561
  >
20518
20562
  @for (step of resolvedProps.steps; track step.value; let i = $index; let isLast = $last) {
20519
- <div
20563
+ <button
20564
+ type="button"
20520
20565
  class="step"
20521
20566
  [class.current]="getStepStatus(step, i) === 'current'"
20522
20567
  [class.completed]="getStepStatus(step, i) === 'completed'"
20523
20568
  [class.error]="getStepStatus(step, i) === 'error'"
20524
20569
  [class.disabled]="step.disabled"
20525
20570
  [class.clickable]="isStepClickable(step, i)"
20571
+ [disabled]="!isStepClickable(step, i)"
20572
+ [attr.aria-current]="getStepStatus(step, i) === 'current' ? 'step' : null"
20573
+ [attr.aria-label]="getStepLabel(step)"
20526
20574
  (click)="onStepClick(step, i)"
20527
20575
  >
20528
20576
  <div class="step-indicator">
@@ -20558,10 +20606,10 @@ class StepperComponent {
20558
20606
  <div class="step-description">{{ step.description }}</div>
20559
20607
  }
20560
20608
  </div>
20561
- </div>
20609
+ </button>
20562
20610
  }
20563
20611
  </div>
20564
- `, isInline: true, styles: [":host{display:block}.stepper-container{display:flex}.stepper-container.horizontal{flex-direction:row;align-items:flex-start}.stepper-container.horizontal .step{flex:1;flex-direction:column;align-items:center;text-align:center}.stepper-container.horizontal .step .step-indicator{flex-direction:row;width:100%;justify-content:center}.stepper-container.horizontal .step .step-connector{flex:1;height:2px;margin:0 8px;align-self:center}.stepper-container.vertical{flex-direction:column}.stepper-container.vertical .step{flex-direction:row;align-items:flex-start}.stepper-container.vertical .step .step-indicator{flex-direction:column;align-items:center}.stepper-container.vertical .step .step-connector{width:2px;flex:1;min-height:24px;margin:8px 0}.stepper-container.vertical .step .step-content{margin-left:12px;padding-bottom:24px}.step{display:flex;cursor:default}.step.clickable{cursor:pointer}.step.clickable:hover .step-circle{transform:scale(1.1)}.step.disabled{opacity:.5;pointer-events:none}.step.current .step-circle{box-shadow:0 0 0 4px rgba(var(--ion-color-primary-rgb),.2)}.step-indicator{display:flex;position:relative}.step-circle{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;background-color:var(--step-color, var(--ion-color-medium));color:#fff;font-weight:600;font-size:.875rem;transition:transform .2s,box-shadow .2s;flex-shrink:0}.step-circle ion-icon{font-size:1.125rem}.step-connector{background-color:var(--ion-color-light-shade);transition:background-color .3s}.step-connector.completed{background-color:var(--ion-color-primary)}.step-connector.dashed{background:repeating-linear-gradient(90deg,var(--ion-color-light-shade),var(--ion-color-light-shade) 4px,transparent 4px,transparent 8px)}.step-connector.dashed.completed{background:repeating-linear-gradient(90deg,var(--ion-color-primary),var(--ion-color-primary) 4px,transparent 4px,transparent 8px)}.step-content{margin-top:8px}.step-label{font-weight:500;font-size:.875rem;color:var(--ion-text-color)}.step-label .optional-text{font-weight:400;font-size:.75rem;color:var(--ion-color-medium);margin-left:4px}.step-description{font-size:.75rem;color:var(--ion-color-medium);margin-top:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
20612
+ `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}:host{display:block}.stepper-container{display:flex}.stepper-container.horizontal{flex-direction:row;align-items:flex-start}.stepper-container.horizontal .step{flex:1;flex-direction:column;align-items:center;text-align:center}.stepper-container.horizontal .step .step-indicator{flex-direction:row;width:100%;justify-content:center}.stepper-container.horizontal .step .step-connector{flex:1;height:2px;margin:0 8px;align-self:center}.stepper-container.vertical{flex-direction:column}.stepper-container.vertical .step{flex-direction:row;align-items:flex-start}.stepper-container.vertical .step .step-indicator{flex-direction:column;align-items:center}.stepper-container.vertical .step .step-connector{width:2px;flex:1;min-height:24px;margin:8px 0}.stepper-container.vertical .step .step-content{margin-left:12px;padding-bottom:24px}.step{display:flex;cursor:default;padding:0;border:none;background:none;font:inherit;text-align:inherit;color:inherit}.step:focus{outline:none}.step:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}.step.clickable{cursor:pointer}.step.clickable:hover .step-circle{transform:scale(1.1)}.step.disabled{opacity:.5}.step:disabled{cursor:default}.step.current .step-circle{box-shadow:0 0 0 4px rgba(var(--ion-color-primary-rgb),.2)}.step-indicator{display:flex;position:relative}.step-circle{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;background-color:var(--step-color, var(--ion-color-medium));color:#fff;font-weight:600;font-size:.875rem;transition:transform .2s,box-shadow .2s;flex-shrink:0}.step-circle ion-icon{font-size:1.125rem}.step-connector{background-color:var(--ion-color-light-shade);transition:background-color .3s}.step-connector.completed{background-color:var(--ion-color-primary)}.step-connector.dashed{background:repeating-linear-gradient(90deg,var(--ion-color-light-shade),var(--ion-color-light-shade) 4px,transparent 4px,transparent 8px)}.step-connector.dashed.completed{background:repeating-linear-gradient(90deg,var(--ion-color-primary),var(--ion-color-primary) 4px,transparent 4px,transparent 8px)}.step-content{margin-top:8px}.step-label{font-weight:500;font-size:.875rem;color:var(--ion-text-color)}.step-label .optional-text{font-weight:400;font-size:.75rem;color:var(--ion-color-medium);margin-left:4px}.step-description{font-size:.75rem;color:var(--ion-color-medium);margin-top:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
20565
20613
  }
20566
20614
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StepperComponent, decorators: [{
20567
20615
  type: Component,
@@ -20572,13 +20620,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
20572
20620
  [class.vertical]="resolvedProps.orientation === 'vertical'"
20573
20621
  >
20574
20622
  @for (step of resolvedProps.steps; track step.value; let i = $index; let isLast = $last) {
20575
- <div
20623
+ <button
20624
+ type="button"
20576
20625
  class="step"
20577
20626
  [class.current]="getStepStatus(step, i) === 'current'"
20578
20627
  [class.completed]="getStepStatus(step, i) === 'completed'"
20579
20628
  [class.error]="getStepStatus(step, i) === 'error'"
20580
20629
  [class.disabled]="step.disabled"
20581
20630
  [class.clickable]="isStepClickable(step, i)"
20631
+ [disabled]="!isStepClickable(step, i)"
20632
+ [attr.aria-current]="getStepStatus(step, i) === 'current' ? 'step' : null"
20633
+ [attr.aria-label]="getStepLabel(step)"
20582
20634
  (click)="onStepClick(step, i)"
20583
20635
  >
20584
20636
  <div class="step-indicator">
@@ -20614,10 +20666,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
20614
20666
  <div class="step-description">{{ step.description }}</div>
20615
20667
  }
20616
20668
  </div>
20617
- </div>
20669
+ </button>
20618
20670
  }
20619
20671
  </div>
20620
- `, styles: [":host{display:block}.stepper-container{display:flex}.stepper-container.horizontal{flex-direction:row;align-items:flex-start}.stepper-container.horizontal .step{flex:1;flex-direction:column;align-items:center;text-align:center}.stepper-container.horizontal .step .step-indicator{flex-direction:row;width:100%;justify-content:center}.stepper-container.horizontal .step .step-connector{flex:1;height:2px;margin:0 8px;align-self:center}.stepper-container.vertical{flex-direction:column}.stepper-container.vertical .step{flex-direction:row;align-items:flex-start}.stepper-container.vertical .step .step-indicator{flex-direction:column;align-items:center}.stepper-container.vertical .step .step-connector{width:2px;flex:1;min-height:24px;margin:8px 0}.stepper-container.vertical .step .step-content{margin-left:12px;padding-bottom:24px}.step{display:flex;cursor:default}.step.clickable{cursor:pointer}.step.clickable:hover .step-circle{transform:scale(1.1)}.step.disabled{opacity:.5;pointer-events:none}.step.current .step-circle{box-shadow:0 0 0 4px rgba(var(--ion-color-primary-rgb),.2)}.step-indicator{display:flex;position:relative}.step-circle{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;background-color:var(--step-color, var(--ion-color-medium));color:#fff;font-weight:600;font-size:.875rem;transition:transform .2s,box-shadow .2s;flex-shrink:0}.step-circle ion-icon{font-size:1.125rem}.step-connector{background-color:var(--ion-color-light-shade);transition:background-color .3s}.step-connector.completed{background-color:var(--ion-color-primary)}.step-connector.dashed{background:repeating-linear-gradient(90deg,var(--ion-color-light-shade),var(--ion-color-light-shade) 4px,transparent 4px,transparent 8px)}.step-connector.dashed.completed{background:repeating-linear-gradient(90deg,var(--ion-color-primary),var(--ion-color-primary) 4px,transparent 4px,transparent 8px)}.step-content{margin-top:8px}.step-label{font-weight:500;font-size:.875rem;color:var(--ion-text-color)}.step-label .optional-text{font-weight:400;font-size:.75rem;color:var(--ion-color-medium);margin-left:4px}.step-description{font-size:.75rem;color:var(--ion-color-medium);margin-top:4px}\n"] }]
20672
+ `, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}:host{display:block}.stepper-container{display:flex}.stepper-container.horizontal{flex-direction:row;align-items:flex-start}.stepper-container.horizontal .step{flex:1;flex-direction:column;align-items:center;text-align:center}.stepper-container.horizontal .step .step-indicator{flex-direction:row;width:100%;justify-content:center}.stepper-container.horizontal .step .step-connector{flex:1;height:2px;margin:0 8px;align-self:center}.stepper-container.vertical{flex-direction:column}.stepper-container.vertical .step{flex-direction:row;align-items:flex-start}.stepper-container.vertical .step .step-indicator{flex-direction:column;align-items:center}.stepper-container.vertical .step .step-connector{width:2px;flex:1;min-height:24px;margin:8px 0}.stepper-container.vertical .step .step-content{margin-left:12px;padding-bottom:24px}.step{display:flex;cursor:default;padding:0;border:none;background:none;font:inherit;text-align:inherit;color:inherit}.step:focus{outline:none}.step:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}.step.clickable{cursor:pointer}.step.clickable:hover .step-circle{transform:scale(1.1)}.step.disabled{opacity:.5}.step:disabled{cursor:default}.step.current .step-circle{box-shadow:0 0 0 4px rgba(var(--ion-color-primary-rgb),.2)}.step-indicator{display:flex;position:relative}.step-circle{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;background-color:var(--step-color, var(--ion-color-medium));color:#fff;font-weight:600;font-size:.875rem;transition:transform .2s,box-shadow .2s;flex-shrink:0}.step-circle ion-icon{font-size:1.125rem}.step-connector{background-color:var(--ion-color-light-shade);transition:background-color .3s}.step-connector.completed{background-color:var(--ion-color-primary)}.step-connector.dashed{background:repeating-linear-gradient(90deg,var(--ion-color-light-shade),var(--ion-color-light-shade) 4px,transparent 4px,transparent 8px)}.step-connector.dashed.completed{background:repeating-linear-gradient(90deg,var(--ion-color-primary),var(--ion-color-primary) 4px,transparent 4px,transparent 8px)}.step-content{margin-top:8px}.step-label{font-weight:500;font-size:.875rem;color:var(--ion-text-color)}.step-label .optional-text{font-weight:400;font-size:.75rem;color:var(--ion-color-medium);margin-left:4px}.step-description{font-size:.75rem;color:var(--ion-color-medium);margin-top:4px}\n"] }]
20621
20673
  }], propDecorators: { preset: [{
20622
20674
  type: Input
20623
20675
  }], props: [{
@@ -20627,6 +20679,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
20627
20679
  }] } });
20628
20680
 
20629
20681
  addIcons({ close, checkmark });
20682
+ /**
20683
+ * Defaults i18n (es/en) — auto-registrados si el consumer no proveyó el
20684
+ * namespace `ChipGroup`. Cubre el aria-label del botón eliminar.
20685
+ */
20686
+ const CHIP_GROUP_I18N = {
20687
+ es: { remove: 'Eliminar {label}' },
20688
+ en: { remove: 'Remove {label}' },
20689
+ };
20630
20690
  /**
20631
20691
  * val-chip-group
20632
20692
  *
@@ -20655,15 +20715,30 @@ addIcons({ close, checkmark });
20655
20715
  class ChipGroupComponent {
20656
20716
  constructor() {
20657
20717
  this.presets = inject(PresetService);
20718
+ this.i18n = inject(I18nService);
20658
20719
  this.props = {};
20659
20720
  this.resolvedProps = {};
20660
20721
  this.selectionChange = new EventEmitter();
20661
20722
  this.chipRemove = new EventEmitter();
20662
20723
  this.chipClick = new EventEmitter();
20724
+ if (!this.i18n.hasNamespace('ChipGroup')) {
20725
+ this.i18n.registerContent('ChipGroup', CHIP_GROUP_I18N);
20726
+ }
20663
20727
  }
20664
20728
  ngOnInit() {
20665
20729
  this.resolveProps();
20666
20730
  }
20731
+ removeLabel(chip) {
20732
+ this.i18n.lang();
20733
+ return this.i18n.t('remove', 'ChipGroup', { label: this.getChipLabel(chip) });
20734
+ }
20735
+ /** Activación de chip selectable por teclado (Enter/Space). */
20736
+ onChipKey(event, chip) {
20737
+ if (!this.resolvedProps.selectable)
20738
+ return;
20739
+ event.preventDefault();
20740
+ this.onChipClick(chip);
20741
+ }
20667
20742
  ngOnChanges(changes) {
20668
20743
  if (changes['preset'] || changes['props']) {
20669
20744
  this.resolveProps();
@@ -20731,7 +20806,12 @@ class ChipGroupComponent {
20731
20806
  [color]="getChipColor(chip)"
20732
20807
  [outline]="resolvedProps.outline && !chip.selected"
20733
20808
  [disabled]="chip.disabled"
20809
+ [attr.role]="resolvedProps.selectable ? 'button' : null"
20810
+ [attr.tabindex]="resolvedProps.selectable && !chip.disabled ? 0 : null"
20811
+ [attr.aria-pressed]="resolvedProps.selectable ? !!chip.selected : null"
20734
20812
  (click)="onChipClick(chip)"
20813
+ (keydown.enter)="onChipKey($event, chip)"
20814
+ (keydown.space)="onChipKey($event, chip)"
20735
20815
  >
20736
20816
  @if (chip.icon) {
20737
20817
  <ion-icon [name]="chip.icon"></ion-icon>
@@ -20741,12 +20821,14 @@ class ChipGroupComponent {
20741
20821
  }
20742
20822
  <ion-label>{{ getChipLabel(chip) }}</ion-label>
20743
20823
  @if (resolvedProps.removable && !chip.disabled) {
20744
- <ion-icon name="close" class="remove-icon" (click)="onRemoveChip($event, chip)"></ion-icon>
20824
+ <button type="button" class="remove-button" [attr.aria-label]="removeLabel(chip)" (click)="onRemoveChip($event, chip)">
20825
+ <ion-icon name="close" class="remove-icon" aria-hidden="true"></ion-icon>
20826
+ </button>
20745
20827
  }
20746
20828
  </ion-chip>
20747
20829
  }
20748
20830
  </div>
20749
- `, isInline: true, styles: [":host{display:block}.chip-group{display:flex;gap:8px}.chip-group.wrap{flex-wrap:wrap}.chip-group:not(.wrap){overflow-x:auto;padding-bottom:4px}.chip-group:not(.wrap)::-webkit-scrollbar{height:4px}.chip-group:not(.wrap)::-webkit-scrollbar-thumb{background:var(--ion-color-light-shade);border-radius:2px}ion-chip{margin:0;cursor:pointer;transition:transform .2s,box-shadow .2s}ion-chip:hover:not([disabled]){transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}ion-chip:active:not([disabled]){transform:translateY(0)}ion-chip[disabled]{opacity:.5;cursor:not-allowed}ion-chip ion-icon{font-size:1rem}ion-chip .selected-icon{margin-right:4px}ion-chip .remove-icon{margin-left:4px;cursor:pointer;opacity:.7;transition:opacity .2s}ion-chip .remove-icon:hover{opacity:1}ion-chip ion-label{font-size:.875rem;font-weight:500}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonChip, selector: "ion-chip", inputs: ["color", "disabled", "mode", "outline"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }] }); }
20831
+ `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}:host{display:block}.chip-group{display:flex;gap:8px}.chip-group.wrap{flex-wrap:wrap}.chip-group:not(.wrap){overflow-x:auto;padding-bottom:4px}.chip-group:not(.wrap)::-webkit-scrollbar{height:4px}.chip-group:not(.wrap)::-webkit-scrollbar-thumb{background:var(--ion-color-light-shade);border-radius:2px}ion-chip{margin:0;cursor:pointer;transition:transform .2s,box-shadow .2s}ion-chip:focus{outline:none}ion-chip:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}ion-chip:hover:not([disabled]){transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}ion-chip:active:not([disabled]){transform:translateY(0)}ion-chip[disabled]{opacity:.5;cursor:not-allowed}ion-chip ion-icon{font-size:1rem}ion-chip .selected-icon{margin-right:4px}ion-chip .remove-button{display:inline-flex;align-items:center;justify-content:center;margin-left:4px;padding:0;border:none;background:none;line-height:0;cursor:pointer;border-radius:50%}ion-chip .remove-button:focus{outline:none}ion-chip .remove-button:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}ion-chip .remove-icon{opacity:.7;transition:opacity .2s}.remove-button:hover ion-chip .remove-icon{opacity:1}ion-chip ion-label{font-size:.875rem;font-weight:500}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonChip, selector: "ion-chip", inputs: ["color", "disabled", "mode", "outline"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }] }); }
20750
20832
  }
20751
20833
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChipGroupComponent, decorators: [{
20752
20834
  type: Component,
@@ -20757,7 +20839,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
20757
20839
  [color]="getChipColor(chip)"
20758
20840
  [outline]="resolvedProps.outline && !chip.selected"
20759
20841
  [disabled]="chip.disabled"
20842
+ [attr.role]="resolvedProps.selectable ? 'button' : null"
20843
+ [attr.tabindex]="resolvedProps.selectable && !chip.disabled ? 0 : null"
20844
+ [attr.aria-pressed]="resolvedProps.selectable ? !!chip.selected : null"
20760
20845
  (click)="onChipClick(chip)"
20846
+ (keydown.enter)="onChipKey($event, chip)"
20847
+ (keydown.space)="onChipKey($event, chip)"
20761
20848
  >
20762
20849
  @if (chip.icon) {
20763
20850
  <ion-icon [name]="chip.icon"></ion-icon>
@@ -20767,13 +20854,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
20767
20854
  }
20768
20855
  <ion-label>{{ getChipLabel(chip) }}</ion-label>
20769
20856
  @if (resolvedProps.removable && !chip.disabled) {
20770
- <ion-icon name="close" class="remove-icon" (click)="onRemoveChip($event, chip)"></ion-icon>
20857
+ <button type="button" class="remove-button" [attr.aria-label]="removeLabel(chip)" (click)="onRemoveChip($event, chip)">
20858
+ <ion-icon name="close" class="remove-icon" aria-hidden="true"></ion-icon>
20859
+ </button>
20771
20860
  }
20772
20861
  </ion-chip>
20773
20862
  }
20774
20863
  </div>
20775
- `, styles: [":host{display:block}.chip-group{display:flex;gap:8px}.chip-group.wrap{flex-wrap:wrap}.chip-group:not(.wrap){overflow-x:auto;padding-bottom:4px}.chip-group:not(.wrap)::-webkit-scrollbar{height:4px}.chip-group:not(.wrap)::-webkit-scrollbar-thumb{background:var(--ion-color-light-shade);border-radius:2px}ion-chip{margin:0;cursor:pointer;transition:transform .2s,box-shadow .2s}ion-chip:hover:not([disabled]){transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}ion-chip:active:not([disabled]){transform:translateY(0)}ion-chip[disabled]{opacity:.5;cursor:not-allowed}ion-chip ion-icon{font-size:1rem}ion-chip .selected-icon{margin-right:4px}ion-chip .remove-icon{margin-left:4px;cursor:pointer;opacity:.7;transition:opacity .2s}ion-chip .remove-icon:hover{opacity:1}ion-chip ion-label{font-size:.875rem;font-weight:500}\n"] }]
20776
- }], propDecorators: { preset: [{
20864
+ `, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}:host{display:block}.chip-group{display:flex;gap:8px}.chip-group.wrap{flex-wrap:wrap}.chip-group:not(.wrap){overflow-x:auto;padding-bottom:4px}.chip-group:not(.wrap)::-webkit-scrollbar{height:4px}.chip-group:not(.wrap)::-webkit-scrollbar-thumb{background:var(--ion-color-light-shade);border-radius:2px}ion-chip{margin:0;cursor:pointer;transition:transform .2s,box-shadow .2s}ion-chip:focus{outline:none}ion-chip:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}ion-chip:hover:not([disabled]){transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}ion-chip:active:not([disabled]){transform:translateY(0)}ion-chip[disabled]{opacity:.5;cursor:not-allowed}ion-chip ion-icon{font-size:1rem}ion-chip .selected-icon{margin-right:4px}ion-chip .remove-button{display:inline-flex;align-items:center;justify-content:center;margin-left:4px;padding:0;border:none;background:none;line-height:0;cursor:pointer;border-radius:50%}ion-chip .remove-button:focus{outline:none}ion-chip .remove-button:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}ion-chip .remove-icon{opacity:.7;transition:opacity .2s}.remove-button:hover ion-chip .remove-icon{opacity:1}ion-chip ion-label{font-size:.875rem;font-weight:500}\n"] }]
20865
+ }], ctorParameters: () => [], propDecorators: { preset: [{
20777
20866
  type: Input
20778
20867
  }], props: [{
20779
20868
  type: Input
@@ -20786,6 +20875,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
20786
20875
  }] } });
20787
20876
 
20788
20877
  addIcons({ star, starOutline, starHalf, heart, heartOutline, heartHalf });
20878
+ /**
20879
+ * Defaults i18n (es/en) — auto-registrados si el consumer no proveyó el
20880
+ * namespace `Rating`. Cubre el aria-label del grupo y de cada estrella.
20881
+ */
20882
+ const RATING_I18N = {
20883
+ es: { groupLabel: 'Valoración', starLabel: '{value} de {max}' },
20884
+ en: { groupLabel: 'Rating', starLabel: '{value} of {max}' },
20885
+ };
20789
20886
  /**
20790
20887
  * val-rating
20791
20888
  *
@@ -20809,10 +20906,14 @@ addIcons({ star, starOutline, starHalf, heart, heartOutline, heartHalf });
20809
20906
  class RatingComponent {
20810
20907
  constructor() {
20811
20908
  this.presets = inject(PresetService);
20909
+ this.i18n = inject(I18nService);
20812
20910
  this.props = {};
20813
20911
  this.resolvedProps = {};
20814
20912
  this.ratingChange = new EventEmitter();
20815
20913
  this.hoverValue = null;
20914
+ if (!this.i18n.hasNamespace('Rating')) {
20915
+ this.i18n.registerContent('Rating', RATING_I18N);
20916
+ }
20816
20917
  }
20817
20918
  ngOnInit() {
20818
20919
  this.resolveProps();
@@ -20838,6 +20939,43 @@ class RatingComponent {
20838
20939
  const max = this.resolvedProps.max || 5;
20839
20940
  return Array.from({ length: max }, (_, i) => i + 1);
20840
20941
  }
20942
+ groupLabel() {
20943
+ this.i18n.lang();
20944
+ return this.i18n.t('groupLabel', 'Rating');
20945
+ }
20946
+ starLabel(position) {
20947
+ this.i18n.lang();
20948
+ return this.i18n.t('starLabel', 'Rating', {
20949
+ value: position.toString(),
20950
+ max: (this.resolvedProps.max || 5).toString(),
20951
+ });
20952
+ }
20953
+ /**
20954
+ * Roving tabindex: solo una estrella es tabbable. La estrella del valor
20955
+ * actual (o la primera si no hay valor) recibe `0`, el resto `-1`.
20956
+ */
20957
+ getStarTabindex(position) {
20958
+ if (this.resolvedProps.readonly || this.resolvedProps.disabled)
20959
+ return -1;
20960
+ const value = this.resolvedProps.value || 0;
20961
+ const focusIndex = value >= 1 ? Math.ceil(value) : 1;
20962
+ return position === focusIndex ? 0 : -1;
20963
+ }
20964
+ /** Navegación con flechas: mueve el foco y selecciona la estrella vecina. */
20965
+ onArrow(event, delta) {
20966
+ if (this.resolvedProps.readonly || this.resolvedProps.disabled)
20967
+ return;
20968
+ event.preventDefault();
20969
+ const max = this.resolvedProps.max || 5;
20970
+ const current = this.resolvedProps.value >= 1 ? Math.ceil(this.resolvedProps.value) : 1;
20971
+ const next = Math.min(max, Math.max(1, current + delta));
20972
+ if (next === this.resolvedProps.value)
20973
+ return;
20974
+ this.ratingChange.emit({ value: next, previousValue: this.resolvedProps.value });
20975
+ const target = event.target;
20976
+ const buttons = target.closest('.rating-container')?.querySelectorAll('.rating-star');
20977
+ buttons?.[next - 1]?.focus();
20978
+ }
20841
20979
  getStarIcon(position) {
20842
20980
  const value = this.hoverValue !== null ? this.hoverValue : this.resolvedProps.value;
20843
20981
  const baseIcon = this.resolvedProps.icon || 'star';
@@ -20892,51 +21030,77 @@ class RatingComponent {
20892
21030
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RatingComponent, isStandalone: true, selector: "val-rating", inputs: { preset: "preset", props: "props" }, outputs: { ratingChange: "ratingChange" }, usesOnChanges: true, ngImport: i0, template: `
20893
21031
  <div
20894
21032
  class="rating-container"
21033
+ role="radiogroup"
21034
+ [attr.aria-label]="groupLabel()"
20895
21035
  [class.readonly]="resolvedProps.readonly"
20896
21036
  [class.disabled]="resolvedProps.disabled"
20897
21037
  [class]="'size-' + (resolvedProps.size || 'medium')"
20898
21038
  >
20899
21039
  @for (i of getStars(); track i) {
20900
- <ion-icon
20901
- [name]="getStarIcon(i)"
20902
- [color]="getStarColor(i)"
21040
+ <button
21041
+ type="button"
21042
+ class="rating-star"
21043
+ role="radio"
20903
21044
  [class.clickable]="!resolvedProps.readonly && !resolvedProps.disabled"
21045
+ [attr.aria-checked]="i <= resolvedProps.value"
21046
+ [attr.aria-label]="starLabel(i)"
21047
+ [attr.tabindex]="getStarTabindex(i)"
21048
+ [disabled]="resolvedProps.disabled"
20904
21049
  (click)="onStarClick(i)"
21050
+ (keydown.arrowright)="onArrow($event, 1)"
21051
+ (keydown.arrowup)="onArrow($event, 1)"
21052
+ (keydown.arrowleft)="onArrow($event, -1)"
21053
+ (keydown.arrowdown)="onArrow($event, -1)"
20905
21054
  (mouseenter)="onStarHover(i)"
20906
21055
  (mouseleave)="onStarLeave()"
20907
- ></ion-icon>
21056
+ >
21057
+ <ion-icon [name]="getStarIcon(i)" [color]="getStarColor(i)" aria-hidden="true"></ion-icon>
21058
+ </button>
20908
21059
  }
20909
21060
  @if (resolvedProps.showValue) {
20910
21061
  <span class="rating-value">{{ displayValue }}</span>
20911
21062
  }
20912
21063
  </div>
20913
- `, isInline: true, styles: [":host{display:inline-block}.rating-container{display:inline-flex;align-items:center;gap:4px}.rating-container.readonly{pointer-events:none}.rating-container.disabled{opacity:.5;pointer-events:none}.rating-container.size-small ion-icon{font-size:1rem}.rating-container.size-medium ion-icon{font-size:1.5rem}.rating-container.size-large ion-icon{font-size:2rem}ion-icon{transition:transform .15s ease,color .15s ease}ion-icon.clickable{cursor:pointer}ion-icon.clickable:hover{transform:scale(1.2)}.rating-value{margin-left:8px;font-weight:600;color:var(--ion-color-dark)}.size-small .rating-value{font-size:.75rem}.size-medium .rating-value{font-size:.875rem}.size-large .rating-value{font-size:1.125rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
21064
+ `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}:host{display:inline-block}.rating-container{display:inline-flex;align-items:center;gap:4px}.rating-container.readonly{pointer-events:none}.rating-container.disabled{opacity:.5;pointer-events:none}.rating-container.size-small ion-icon{font-size:1rem}.rating-container.size-medium ion-icon{font-size:1.5rem}.rating-container.size-large ion-icon{font-size:2rem}.rating-star{display:inline-flex;align-items:center;justify-content:center;padding:0;margin:0;border:none;background:none;color:inherit;line-height:0;cursor:default}.rating-star:focus{outline:none}.rating-star:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}.rating-star.clickable{cursor:pointer}.rating-star.clickable:hover ion-icon{transform:scale(1.2)}.rating-star:disabled{cursor:default}ion-icon{transition:transform .15s ease,color .15s ease}.rating-value{margin-left:8px;font-weight:600;color:var(--ion-color-dark)}.size-small .rating-value{font-size:.75rem}.size-medium .rating-value{font-size:.875rem}.size-large .rating-value{font-size:1.125rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
20914
21065
  }
20915
21066
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RatingComponent, decorators: [{
20916
21067
  type: Component,
20917
21068
  args: [{ selector: 'val-rating', standalone: true, imports: [CommonModule, IonIcon], template: `
20918
21069
  <div
20919
21070
  class="rating-container"
21071
+ role="radiogroup"
21072
+ [attr.aria-label]="groupLabel()"
20920
21073
  [class.readonly]="resolvedProps.readonly"
20921
21074
  [class.disabled]="resolvedProps.disabled"
20922
21075
  [class]="'size-' + (resolvedProps.size || 'medium')"
20923
21076
  >
20924
21077
  @for (i of getStars(); track i) {
20925
- <ion-icon
20926
- [name]="getStarIcon(i)"
20927
- [color]="getStarColor(i)"
21078
+ <button
21079
+ type="button"
21080
+ class="rating-star"
21081
+ role="radio"
20928
21082
  [class.clickable]="!resolvedProps.readonly && !resolvedProps.disabled"
21083
+ [attr.aria-checked]="i <= resolvedProps.value"
21084
+ [attr.aria-label]="starLabel(i)"
21085
+ [attr.tabindex]="getStarTabindex(i)"
21086
+ [disabled]="resolvedProps.disabled"
20929
21087
  (click)="onStarClick(i)"
21088
+ (keydown.arrowright)="onArrow($event, 1)"
21089
+ (keydown.arrowup)="onArrow($event, 1)"
21090
+ (keydown.arrowleft)="onArrow($event, -1)"
21091
+ (keydown.arrowdown)="onArrow($event, -1)"
20930
21092
  (mouseenter)="onStarHover(i)"
20931
21093
  (mouseleave)="onStarLeave()"
20932
- ></ion-icon>
21094
+ >
21095
+ <ion-icon [name]="getStarIcon(i)" [color]="getStarColor(i)" aria-hidden="true"></ion-icon>
21096
+ </button>
20933
21097
  }
20934
21098
  @if (resolvedProps.showValue) {
20935
21099
  <span class="rating-value">{{ displayValue }}</span>
20936
21100
  }
20937
21101
  </div>
20938
- `, styles: [":host{display:inline-block}.rating-container{display:inline-flex;align-items:center;gap:4px}.rating-container.readonly{pointer-events:none}.rating-container.disabled{opacity:.5;pointer-events:none}.rating-container.size-small ion-icon{font-size:1rem}.rating-container.size-medium ion-icon{font-size:1.5rem}.rating-container.size-large ion-icon{font-size:2rem}ion-icon{transition:transform .15s ease,color .15s ease}ion-icon.clickable{cursor:pointer}ion-icon.clickable:hover{transform:scale(1.2)}.rating-value{margin-left:8px;font-weight:600;color:var(--ion-color-dark)}.size-small .rating-value{font-size:.75rem}.size-medium .rating-value{font-size:.875rem}.size-large .rating-value{font-size:1.125rem}\n"] }]
20939
- }], propDecorators: { preset: [{
21102
+ `, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}:host{display:inline-block}.rating-container{display:inline-flex;align-items:center;gap:4px}.rating-container.readonly{pointer-events:none}.rating-container.disabled{opacity:.5;pointer-events:none}.rating-container.size-small ion-icon{font-size:1rem}.rating-container.size-medium ion-icon{font-size:1.5rem}.rating-container.size-large ion-icon{font-size:2rem}.rating-star{display:inline-flex;align-items:center;justify-content:center;padding:0;margin:0;border:none;background:none;color:inherit;line-height:0;cursor:default}.rating-star:focus{outline:none}.rating-star:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}.rating-star.clickable{cursor:pointer}.rating-star.clickable:hover ion-icon{transform:scale(1.2)}.rating-star:disabled{cursor:default}ion-icon{transition:transform .15s ease,color .15s ease}.rating-value{margin-left:8px;font-weight:600;color:var(--ion-color-dark)}.size-small .rating-value{font-size:.75rem}.size-medium .rating-value{font-size:.875rem}.size-large .rating-value{font-size:1.125rem}\n"] }]
21103
+ }], ctorParameters: () => [], propDecorators: { preset: [{
20940
21104
  type: Input
20941
21105
  }], props: [{
20942
21106
  type: Input
@@ -21302,6 +21466,14 @@ addIcons({
21302
21466
  flag,
21303
21467
  share,
21304
21468
  });
21469
+ /**
21470
+ * Defaults i18n (es/en) — auto-registrados si el consumer no proveyó el
21471
+ * namespace `Comment`. Cubre el aria-label del autor (avatar + nombre).
21472
+ */
21473
+ const COMMENT_I18N = {
21474
+ es: { viewProfileOf: 'Ver perfil de {name}' },
21475
+ en: { viewProfileOf: 'View profile of {name}' },
21476
+ };
21305
21477
  /**
21306
21478
  * val-comment
21307
21479
  *
@@ -21352,10 +21524,18 @@ class CommentComponent {
21352
21524
  this.loadMoreClick = new EventEmitter();
21353
21525
  this.collapseToggle = new EventEmitter();
21354
21526
  this.displayContent = '';
21527
+ if (!this.i18n.hasNamespace('Comment')) {
21528
+ this.i18n.registerContent('Comment', COMMENT_I18N);
21529
+ }
21355
21530
  }
21356
21531
  ngOnInit() {
21357
21532
  this.displayContent = this.props.content || this.props.contentFallback || '';
21358
21533
  }
21534
+ /** Aria-label accesible del autor (avatar + nombre clicables). */
21535
+ authorLabel() {
21536
+ this.i18n.lang();
21537
+ return this.i18n.t('viewProfileOf', 'Comment', { name: this.props.author.name });
21538
+ }
21359
21539
  getInitials(name) {
21360
21540
  return name
21361
21541
  .split(' ')
@@ -21524,7 +21704,7 @@ class CommentComponent {
21524
21704
  }
21525
21705
 
21526
21706
  <div class="comment-main">
21527
- <div class="comment-avatar" (click)="onAuthorClick()">
21707
+ <button type="button" class="comment-avatar" [attr.aria-label]="authorLabel()" (click)="onAuthorClick()">
21528
21708
  @if (props.author.avatar) {
21529
21709
  <val-avatar [props]="props.author.avatar"></val-avatar>
21530
21710
  } @else {
@@ -21532,11 +21712,11 @@ class CommentComponent {
21532
21712
  {{ getInitials(props.author.name) }}
21533
21713
  </div>
21534
21714
  }
21535
- </div>
21715
+ </button>
21536
21716
 
21537
21717
  <div class="comment-body">
21538
21718
  <div class="comment-header">
21539
- <div class="author-info" (click)="onAuthorClick()">
21719
+ <button type="button" class="author-info" [attr.aria-label]="authorLabel()" (click)="onAuthorClick()">
21540
21720
  <span class="author-name">{{ props.author.name }}</span>
21541
21721
  @if (props.author.verified) {
21542
21722
  <ion-icon name="checkmark-circle" class="verified-badge"></ion-icon>
@@ -21544,7 +21724,7 @@ class CommentComponent {
21544
21724
  @if (props.author.username) {
21545
21725
  <span class="author-username">&#64;{{ props.author.username }}</span>
21546
21726
  }
21547
- </div>
21727
+ </button>
21548
21728
 
21549
21729
  <div class="comment-meta">
21550
21730
  <span class="timestamp">{{ formatTimestamp(props.timestamp) }}</span>
@@ -21685,7 +21865,7 @@ class CommentComponent {
21685
21865
  </div>
21686
21866
  }
21687
21867
  </div>
21688
- `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}:host{display:block}.comment{--indent-size: 24px;--max-indent: 72px;padding:12px 0}.comment.highlighted{background-color:rgba(var(--ion-color-primary-rgb),.08);border-radius:8px;padding:12px;margin:-4px}.comment.pinned{border-left:3px solid var(--ion-color-primary);padding-left:12px}.comment.collapsed{opacity:.7}.pinned-indicator{display:flex;align-items:center;gap:4px;font-size:.75rem;color:var(--ion-color-primary);margin-bottom:8px;padding-left:44px}.pinned-indicator ion-icon{font-size:.875rem}.comment-main{display:flex;gap:12px}.comment-avatar{flex-shrink:0;cursor:pointer}.comment-avatar val-avatar{--size: 36px}.comment-avatar .avatar-placeholder{width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,var(--ion-color-primary),var(--ion-color-secondary));display:flex;align-items:center;justify-content:center;color:#fff;font-size:.875rem;font-weight:600}.comment-body{flex:1;min-width:0}.comment-header{display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin-bottom:4px}.author-info{display:flex;align-items:center;gap:4px;cursor:pointer}.author-info:hover .author-name{text-decoration:underline}.author-name{font-weight:600;font-size:.875rem;color:var(--ion-text-color)}.verified-badge{color:var(--ion-color-primary);font-size:1rem}.author-username{font-size:.8125rem;color:var(--ion-color-medium)}.comment-meta{display:flex;align-items:center;gap:6px;margin-left:auto}.timestamp{font-size:.75rem;color:var(--ion-color-medium)}.edited-label{font-size:.6875rem;color:var(--ion-color-medium);font-style:italic}.more-button{--padding-start: 4px;--padding-end: 4px;margin:0;height:28px}.more-button ion-icon{font-size:1.125rem;color:var(--ion-color-medium)}.menu-divider{height:1px;background-color:var(--ion-color-light);margin:4px 0}.comment-content{font-size:.875rem;line-height:1.5;color:var(--ion-text-color);word-wrap:break-word;overflow-wrap:break-word}.comment-content :global(.comment-link){color:var(--ion-color-primary);text-decoration:none}.comment-content :global(.comment-link):hover{text-decoration:underline}.comment-content :global(.comment-mention){color:var(--ion-color-primary);font-weight:500;cursor:pointer}.comment-content :global(.comment-mention):hover{text-decoration:underline}.comment-content :global(.comment-hashtag){color:var(--ion-color-primary);cursor:pointer}.comment-content :global(.comment-hashtag):hover{text-decoration:underline}.comment-reactions{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.reaction-button{display:flex;align-items:center;gap:4px;background:none;border:none;padding:4px 8px;border-radius:16px;cursor:pointer;font-size:.8125rem;color:var(--reaction-color, var(--ion-color-medium));transition:all .2s ease;background-color:transparent}.reaction-button:hover{background-color:rgba(var(--ion-color-medium-rgb),.1)}.reaction-button.active{background-color:rgba(var(--ion-color-primary-rgb),.1)}.reaction-button.active ion-icon{transform:scale(1.1)}.reaction-button ion-icon{font-size:1.125rem;transition:transform .2s ease}.reaction-button .reaction-count{font-weight:500}.comment-actions{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px;margin-left:-8px}.comment-actions ion-button{--padding-start: 8px;--padding-end: 8px;font-size:.8125rem;height:32px;text-transform:none;font-weight:500}.expand-button,.collapse-button,.load-more-button,.view-replies-button{display:flex;align-items:center;gap:6px;background:none;border:none;padding:8px 12px;cursor:pointer;font-size:.8125rem;color:var(--ion-color-primary);border-radius:8px;transition:background-color .2s}.expand-button:hover,.collapse-button:hover,.load-more-button:hover,.view-replies-button:hover{background-color:rgba(var(--ion-color-primary-rgb),.1)}.expand-button ion-icon,.collapse-button ion-icon,.load-more-button ion-icon,.view-replies-button ion-icon{font-size:1rem}.expand-button{margin-top:4px;color:var(--ion-color-medium)}.comment-children{margin-top:12px;padding-left:min(var(--indent-size),var(--max-indent));border-left:2px solid var(--ion-color-light-shade)}.comment-children val-comment{display:block}.comment-children val-comment:first-of-type .comment{padding-top:0}.load-more-button,.view-replies-button{margin-top:8px;margin-left:0}ion-popover{--width: 200px}ion-popover ion-list{padding:4px 0}ion-popover ion-item{--min-height: 40px;--padding-start: 12px;font-size:.875rem}ion-popover ion-item ion-icon{font-size:1.125rem;margin-right:8px}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 2px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 2px);height:max(28px,36px - 2px);font-size:max(.6875rem,.8125rem)}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 4px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 4px);height:max(28px,36px - 4px);font-size:max(.6875rem,.75rem)}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 6px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 6px);height:max(28px,36px - 6px);font-size:max(.6875rem,.6875rem)}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 8px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 8px);height:max(28px,36px - 8px);font-size:max(.6875rem,.625rem)}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 10px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 10px);height:max(28px,36px - 10px);font-size:max(.6875rem,.5625rem)}:host-context(.dark) .comment.highlighted,:host-context(.ion-palette-dark) .comment.highlighted,:host-context(html.ion-palette-dark) .comment.highlighted,:host-context(body.dark) .comment.highlighted,:host-context([data-theme=dark]) .comment.highlighted{background-color:rgba(var(--ion-color-primary-rgb),.12)}:host-context(.dark) .avatar-placeholder,:host-context(.ion-palette-dark) .avatar-placeholder,:host-context(html.ion-palette-dark) .avatar-placeholder,:host-context(body.dark) .avatar-placeholder,:host-context([data-theme=dark]) .avatar-placeholder{background:linear-gradient(135deg,var(--ion-color-primary-shade),var(--ion-color-secondary-shade))}\n"], dependencies: [{ kind: "component", type: CommentComponent, selector: "val-comment", inputs: ["props"], outputs: ["authorClick", "reactionClick", "actionClick", "menuItemClick", "loadMoreClick", "collapseToggle"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonPopover, selector: "ion-popover" }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: AvatarComponent, selector: "val-avatar", inputs: ["preset", "props"], outputs: ["onClick"] }] }); }
21868
+ `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}:host{display:block}.comment{--indent-size: 24px;--max-indent: 72px;padding:12px 0}.comment.highlighted{background-color:rgba(var(--ion-color-primary-rgb),.08);border-radius:8px;padding:12px;margin:-4px}.comment.pinned{border-left:3px solid var(--ion-color-primary);padding-left:12px}.comment.collapsed{opacity:.7}.pinned-indicator{display:flex;align-items:center;gap:4px;font-size:.75rem;color:var(--ion-color-primary);margin-bottom:8px;padding-left:44px}.pinned-indicator ion-icon{font-size:.875rem}.comment-main{display:flex;gap:12px}.comment-avatar{flex-shrink:0;cursor:pointer;padding:0;border:none;background:none;line-height:0;border-radius:50%}.comment-avatar:focus{outline:none}.comment-avatar:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}.comment-avatar val-avatar{--size: 36px}.comment-avatar .avatar-placeholder{width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,var(--ion-color-primary),var(--ion-color-secondary));display:flex;align-items:center;justify-content:center;color:#fff;font-size:.875rem;font-weight:600}.comment-body{flex:1;min-width:0}.comment-header{display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin-bottom:4px}.author-info{display:flex;align-items:center;gap:4px;cursor:pointer;padding:0;border:none;background:none;font:inherit;color:inherit;text-align:inherit}.author-info:focus{outline:none}.author-info:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}.author-info:hover .author-name{text-decoration:underline}.author-name{font-weight:600;font-size:.875rem;color:var(--ion-text-color)}.verified-badge{color:var(--ion-color-primary);font-size:1rem}.author-username{font-size:.8125rem;color:var(--ion-color-medium)}.comment-meta{display:flex;align-items:center;gap:6px;margin-left:auto}.timestamp{font-size:.75rem;color:var(--ion-color-medium)}.edited-label{font-size:.6875rem;color:var(--ion-color-medium);font-style:italic}.more-button{--padding-start: 4px;--padding-end: 4px;margin:0;height:28px}.more-button ion-icon{font-size:1.125rem;color:var(--ion-color-medium)}.menu-divider{height:1px;background-color:var(--ion-color-light);margin:4px 0}.comment-content{font-size:.875rem;line-height:1.5;color:var(--ion-text-color);word-wrap:break-word;overflow-wrap:break-word}.comment-content :global(.comment-link){color:var(--ion-color-primary);text-decoration:none}.comment-content :global(.comment-link):hover{text-decoration:underline}.comment-content :global(.comment-mention){color:var(--ion-color-primary);font-weight:500;cursor:pointer}.comment-content :global(.comment-mention):hover{text-decoration:underline}.comment-content :global(.comment-hashtag){color:var(--ion-color-primary);cursor:pointer}.comment-content :global(.comment-hashtag):hover{text-decoration:underline}.comment-reactions{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.reaction-button{display:flex;align-items:center;gap:4px;background:none;border:none;padding:4px 8px;border-radius:16px;cursor:pointer;font-size:.8125rem;color:var(--reaction-color, var(--ion-color-medium));transition:all .2s ease;background-color:transparent}.reaction-button:hover{background-color:rgba(var(--ion-color-medium-rgb),.1)}.reaction-button.active{background-color:rgba(var(--ion-color-primary-rgb),.1)}.reaction-button.active ion-icon{transform:scale(1.1)}.reaction-button ion-icon{font-size:1.125rem;transition:transform .2s ease}.reaction-button .reaction-count{font-weight:500}.comment-actions{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px;margin-left:-8px}.comment-actions ion-button{--padding-start: 8px;--padding-end: 8px;font-size:.8125rem;height:32px;text-transform:none;font-weight:500}.expand-button,.collapse-button,.load-more-button,.view-replies-button{display:flex;align-items:center;gap:6px;background:none;border:none;padding:8px 12px;cursor:pointer;font-size:.8125rem;color:var(--ion-color-primary);border-radius:8px;transition:background-color .2s}.expand-button:hover,.collapse-button:hover,.load-more-button:hover,.view-replies-button:hover{background-color:rgba(var(--ion-color-primary-rgb),.1)}.expand-button ion-icon,.collapse-button ion-icon,.load-more-button ion-icon,.view-replies-button ion-icon{font-size:1rem}.expand-button{margin-top:4px;color:var(--ion-color-medium)}.comment-children{margin-top:12px;padding-left:min(var(--indent-size),var(--max-indent));border-left:2px solid var(--ion-color-light-shade)}.comment-children val-comment{display:block}.comment-children val-comment:first-of-type .comment{padding-top:0}.load-more-button,.view-replies-button{margin-top:8px;margin-left:0}ion-popover{--width: 200px}ion-popover ion-list{padding:4px 0}ion-popover ion-item{--min-height: 40px;--padding-start: 12px;font-size:.875rem}ion-popover ion-item ion-icon{font-size:1.125rem;margin-right:8px}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 2px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 2px);height:max(28px,36px - 2px);font-size:max(.6875rem,.8125rem)}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 4px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 4px);height:max(28px,36px - 4px);font-size:max(.6875rem,.75rem)}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 6px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 6px);height:max(28px,36px - 6px);font-size:max(.6875rem,.6875rem)}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 8px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 8px);height:max(28px,36px - 8px);font-size:max(.6875rem,.625rem)}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 10px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 10px);height:max(28px,36px - 10px);font-size:max(.6875rem,.5625rem)}:host-context(.dark) .comment.highlighted,:host-context(.ion-palette-dark) .comment.highlighted,:host-context(html.ion-palette-dark) .comment.highlighted,:host-context(body.dark) .comment.highlighted,:host-context([data-theme=dark]) .comment.highlighted{background-color:rgba(var(--ion-color-primary-rgb),.12)}:host-context(.dark) .avatar-placeholder,:host-context(.ion-palette-dark) .avatar-placeholder,:host-context(html.ion-palette-dark) .avatar-placeholder,:host-context(body.dark) .avatar-placeholder,:host-context([data-theme=dark]) .avatar-placeholder{background:linear-gradient(135deg,var(--ion-color-primary-shade),var(--ion-color-secondary-shade))}\n"], dependencies: [{ kind: "component", type: CommentComponent, selector: "val-comment", inputs: ["props"], outputs: ["authorClick", "reactionClick", "actionClick", "menuItemClick", "loadMoreClick", "collapseToggle"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonPopover, selector: "ion-popover" }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: AvatarComponent, selector: "val-avatar", inputs: ["preset", "props"], outputs: ["onClick"] }] }); }
21689
21869
  }
21690
21870
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CommentComponent, decorators: [{
21691
21871
  type: Component,
@@ -21714,7 +21894,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
21714
21894
  }
21715
21895
 
21716
21896
  <div class="comment-main">
21717
- <div class="comment-avatar" (click)="onAuthorClick()">
21897
+ <button type="button" class="comment-avatar" [attr.aria-label]="authorLabel()" (click)="onAuthorClick()">
21718
21898
  @if (props.author.avatar) {
21719
21899
  <val-avatar [props]="props.author.avatar"></val-avatar>
21720
21900
  } @else {
@@ -21722,11 +21902,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
21722
21902
  {{ getInitials(props.author.name) }}
21723
21903
  </div>
21724
21904
  }
21725
- </div>
21905
+ </button>
21726
21906
 
21727
21907
  <div class="comment-body">
21728
21908
  <div class="comment-header">
21729
- <div class="author-info" (click)="onAuthorClick()">
21909
+ <button type="button" class="author-info" [attr.aria-label]="authorLabel()" (click)="onAuthorClick()">
21730
21910
  <span class="author-name">{{ props.author.name }}</span>
21731
21911
  @if (props.author.verified) {
21732
21912
  <ion-icon name="checkmark-circle" class="verified-badge"></ion-icon>
@@ -21734,7 +21914,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
21734
21914
  @if (props.author.username) {
21735
21915
  <span class="author-username">&#64;{{ props.author.username }}</span>
21736
21916
  }
21737
- </div>
21917
+ </button>
21738
21918
 
21739
21919
  <div class="comment-meta">
21740
21920
  <span class="timestamp">{{ formatTimestamp(props.timestamp) }}</span>
@@ -21875,8 +22055,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
21875
22055
  </div>
21876
22056
  }
21877
22057
  </div>
21878
- `, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}:host{display:block}.comment{--indent-size: 24px;--max-indent: 72px;padding:12px 0}.comment.highlighted{background-color:rgba(var(--ion-color-primary-rgb),.08);border-radius:8px;padding:12px;margin:-4px}.comment.pinned{border-left:3px solid var(--ion-color-primary);padding-left:12px}.comment.collapsed{opacity:.7}.pinned-indicator{display:flex;align-items:center;gap:4px;font-size:.75rem;color:var(--ion-color-primary);margin-bottom:8px;padding-left:44px}.pinned-indicator ion-icon{font-size:.875rem}.comment-main{display:flex;gap:12px}.comment-avatar{flex-shrink:0;cursor:pointer}.comment-avatar val-avatar{--size: 36px}.comment-avatar .avatar-placeholder{width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,var(--ion-color-primary),var(--ion-color-secondary));display:flex;align-items:center;justify-content:center;color:#fff;font-size:.875rem;font-weight:600}.comment-body{flex:1;min-width:0}.comment-header{display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin-bottom:4px}.author-info{display:flex;align-items:center;gap:4px;cursor:pointer}.author-info:hover .author-name{text-decoration:underline}.author-name{font-weight:600;font-size:.875rem;color:var(--ion-text-color)}.verified-badge{color:var(--ion-color-primary);font-size:1rem}.author-username{font-size:.8125rem;color:var(--ion-color-medium)}.comment-meta{display:flex;align-items:center;gap:6px;margin-left:auto}.timestamp{font-size:.75rem;color:var(--ion-color-medium)}.edited-label{font-size:.6875rem;color:var(--ion-color-medium);font-style:italic}.more-button{--padding-start: 4px;--padding-end: 4px;margin:0;height:28px}.more-button ion-icon{font-size:1.125rem;color:var(--ion-color-medium)}.menu-divider{height:1px;background-color:var(--ion-color-light);margin:4px 0}.comment-content{font-size:.875rem;line-height:1.5;color:var(--ion-text-color);word-wrap:break-word;overflow-wrap:break-word}.comment-content :global(.comment-link){color:var(--ion-color-primary);text-decoration:none}.comment-content :global(.comment-link):hover{text-decoration:underline}.comment-content :global(.comment-mention){color:var(--ion-color-primary);font-weight:500;cursor:pointer}.comment-content :global(.comment-mention):hover{text-decoration:underline}.comment-content :global(.comment-hashtag){color:var(--ion-color-primary);cursor:pointer}.comment-content :global(.comment-hashtag):hover{text-decoration:underline}.comment-reactions{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.reaction-button{display:flex;align-items:center;gap:4px;background:none;border:none;padding:4px 8px;border-radius:16px;cursor:pointer;font-size:.8125rem;color:var(--reaction-color, var(--ion-color-medium));transition:all .2s ease;background-color:transparent}.reaction-button:hover{background-color:rgba(var(--ion-color-medium-rgb),.1)}.reaction-button.active{background-color:rgba(var(--ion-color-primary-rgb),.1)}.reaction-button.active ion-icon{transform:scale(1.1)}.reaction-button ion-icon{font-size:1.125rem;transition:transform .2s ease}.reaction-button .reaction-count{font-weight:500}.comment-actions{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px;margin-left:-8px}.comment-actions ion-button{--padding-start: 8px;--padding-end: 8px;font-size:.8125rem;height:32px;text-transform:none;font-weight:500}.expand-button,.collapse-button,.load-more-button,.view-replies-button{display:flex;align-items:center;gap:6px;background:none;border:none;padding:8px 12px;cursor:pointer;font-size:.8125rem;color:var(--ion-color-primary);border-radius:8px;transition:background-color .2s}.expand-button:hover,.collapse-button:hover,.load-more-button:hover,.view-replies-button:hover{background-color:rgba(var(--ion-color-primary-rgb),.1)}.expand-button ion-icon,.collapse-button ion-icon,.load-more-button ion-icon,.view-replies-button ion-icon{font-size:1rem}.expand-button{margin-top:4px;color:var(--ion-color-medium)}.comment-children{margin-top:12px;padding-left:min(var(--indent-size),var(--max-indent));border-left:2px solid var(--ion-color-light-shade)}.comment-children val-comment{display:block}.comment-children val-comment:first-of-type .comment{padding-top:0}.load-more-button,.view-replies-button{margin-top:8px;margin-left:0}ion-popover{--width: 200px}ion-popover ion-list{padding:4px 0}ion-popover ion-item{--min-height: 40px;--padding-start: 12px;font-size:.875rem}ion-popover ion-item ion-icon{font-size:1.125rem;margin-right:8px}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 2px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 2px);height:max(28px,36px - 2px);font-size:max(.6875rem,.8125rem)}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 4px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 4px);height:max(28px,36px - 4px);font-size:max(.6875rem,.75rem)}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 6px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 6px);height:max(28px,36px - 6px);font-size:max(.6875rem,.6875rem)}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 8px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 8px);height:max(28px,36px - 8px);font-size:max(.6875rem,.625rem)}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 10px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 10px);height:max(28px,36px - 10px);font-size:max(.6875rem,.5625rem)}:host-context(.dark) .comment.highlighted,:host-context(.ion-palette-dark) .comment.highlighted,:host-context(html.ion-palette-dark) .comment.highlighted,:host-context(body.dark) .comment.highlighted,:host-context([data-theme=dark]) .comment.highlighted{background-color:rgba(var(--ion-color-primary-rgb),.12)}:host-context(.dark) .avatar-placeholder,:host-context(.ion-palette-dark) .avatar-placeholder,:host-context(html.ion-palette-dark) .avatar-placeholder,:host-context(body.dark) .avatar-placeholder,:host-context([data-theme=dark]) .avatar-placeholder{background:linear-gradient(135deg,var(--ion-color-primary-shade),var(--ion-color-secondary-shade))}\n"] }]
21879
- }], propDecorators: { props: [{
22058
+ `, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}:host{display:block}.comment{--indent-size: 24px;--max-indent: 72px;padding:12px 0}.comment.highlighted{background-color:rgba(var(--ion-color-primary-rgb),.08);border-radius:8px;padding:12px;margin:-4px}.comment.pinned{border-left:3px solid var(--ion-color-primary);padding-left:12px}.comment.collapsed{opacity:.7}.pinned-indicator{display:flex;align-items:center;gap:4px;font-size:.75rem;color:var(--ion-color-primary);margin-bottom:8px;padding-left:44px}.pinned-indicator ion-icon{font-size:.875rem}.comment-main{display:flex;gap:12px}.comment-avatar{flex-shrink:0;cursor:pointer;padding:0;border:none;background:none;line-height:0;border-radius:50%}.comment-avatar:focus{outline:none}.comment-avatar:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}.comment-avatar val-avatar{--size: 36px}.comment-avatar .avatar-placeholder{width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,var(--ion-color-primary),var(--ion-color-secondary));display:flex;align-items:center;justify-content:center;color:#fff;font-size:.875rem;font-weight:600}.comment-body{flex:1;min-width:0}.comment-header{display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin-bottom:4px}.author-info{display:flex;align-items:center;gap:4px;cursor:pointer;padding:0;border:none;background:none;font:inherit;color:inherit;text-align:inherit}.author-info:focus{outline:none}.author-info:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px;border-radius:inherit}.author-info:hover .author-name{text-decoration:underline}.author-name{font-weight:600;font-size:.875rem;color:var(--ion-text-color)}.verified-badge{color:var(--ion-color-primary);font-size:1rem}.author-username{font-size:.8125rem;color:var(--ion-color-medium)}.comment-meta{display:flex;align-items:center;gap:6px;margin-left:auto}.timestamp{font-size:.75rem;color:var(--ion-color-medium)}.edited-label{font-size:.6875rem;color:var(--ion-color-medium);font-style:italic}.more-button{--padding-start: 4px;--padding-end: 4px;margin:0;height:28px}.more-button ion-icon{font-size:1.125rem;color:var(--ion-color-medium)}.menu-divider{height:1px;background-color:var(--ion-color-light);margin:4px 0}.comment-content{font-size:.875rem;line-height:1.5;color:var(--ion-text-color);word-wrap:break-word;overflow-wrap:break-word}.comment-content :global(.comment-link){color:var(--ion-color-primary);text-decoration:none}.comment-content :global(.comment-link):hover{text-decoration:underline}.comment-content :global(.comment-mention){color:var(--ion-color-primary);font-weight:500;cursor:pointer}.comment-content :global(.comment-mention):hover{text-decoration:underline}.comment-content :global(.comment-hashtag){color:var(--ion-color-primary);cursor:pointer}.comment-content :global(.comment-hashtag):hover{text-decoration:underline}.comment-reactions{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.reaction-button{display:flex;align-items:center;gap:4px;background:none;border:none;padding:4px 8px;border-radius:16px;cursor:pointer;font-size:.8125rem;color:var(--reaction-color, var(--ion-color-medium));transition:all .2s ease;background-color:transparent}.reaction-button:hover{background-color:rgba(var(--ion-color-medium-rgb),.1)}.reaction-button.active{background-color:rgba(var(--ion-color-primary-rgb),.1)}.reaction-button.active ion-icon{transform:scale(1.1)}.reaction-button ion-icon{font-size:1.125rem;transition:transform .2s ease}.reaction-button .reaction-count{font-weight:500}.comment-actions{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px;margin-left:-8px}.comment-actions ion-button{--padding-start: 8px;--padding-end: 8px;font-size:.8125rem;height:32px;text-transform:none;font-weight:500}.expand-button,.collapse-button,.load-more-button,.view-replies-button{display:flex;align-items:center;gap:6px;background:none;border:none;padding:8px 12px;cursor:pointer;font-size:.8125rem;color:var(--ion-color-primary);border-radius:8px;transition:background-color .2s}.expand-button:hover,.collapse-button:hover,.load-more-button:hover,.view-replies-button:hover{background-color:rgba(var(--ion-color-primary-rgb),.1)}.expand-button ion-icon,.collapse-button ion-icon,.load-more-button ion-icon,.view-replies-button ion-icon{font-size:1rem}.expand-button{margin-top:4px;color:var(--ion-color-medium)}.comment-children{margin-top:12px;padding-left:min(var(--indent-size),var(--max-indent));border-left:2px solid var(--ion-color-light-shade)}.comment-children val-comment{display:block}.comment-children val-comment:first-of-type .comment{padding-top:0}.load-more-button,.view-replies-button{margin-top:8px;margin-left:0}ion-popover{--width: 200px}ion-popover ion-list{padding:4px 0}ion-popover ion-item{--min-height: 40px;--padding-start: 12px;font-size:.875rem}ion-popover ion-item ion-icon{font-size:1.125rem;margin-right:8px}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 2px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 2px);height:max(28px,36px - 2px);font-size:max(.6875rem,.8125rem)}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 4px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 4px);height:max(28px,36px - 4px);font-size:max(.6875rem,.75rem)}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 6px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 6px);height:max(28px,36px - 6px);font-size:max(.6875rem,.6875rem)}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 8px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 8px);height:max(28px,36px - 8px);font-size:max(.6875rem,.625rem)}:host-context(val-comment) .comment-avatar val-avatar{--size: max(28px, 36px - 10px)}:host-context(val-comment) .comment-avatar .avatar-placeholder{width:max(28px,36px - 10px);height:max(28px,36px - 10px);font-size:max(.6875rem,.5625rem)}:host-context(.dark) .comment.highlighted,:host-context(.ion-palette-dark) .comment.highlighted,:host-context(html.ion-palette-dark) .comment.highlighted,:host-context(body.dark) .comment.highlighted,:host-context([data-theme=dark]) .comment.highlighted{background-color:rgba(var(--ion-color-primary-rgb),.12)}:host-context(.dark) .avatar-placeholder,:host-context(.ion-palette-dark) .avatar-placeholder,:host-context(html.ion-palette-dark) .avatar-placeholder,:host-context(body.dark) .avatar-placeholder,:host-context([data-theme=dark]) .avatar-placeholder{background:linear-gradient(135deg,var(--ion-color-primary-shade),var(--ion-color-secondary-shade))}\n"] }]
22059
+ }], ctorParameters: () => [], propDecorators: { props: [{
21880
22060
  type: Input
21881
22061
  }], authorClick: [{
21882
22062
  type: Output
@@ -25359,42 +25539,86 @@ class FeaturesListComponent {
25359
25539
  [class.features-list--center]="config().alignment === 'center'"
25360
25540
  >
25361
25541
  @for (feature of visibleFeatures(); track feature.titleKey) {
25362
- <div class="feature" [class.feature--clickable]="feature.token != null" (click)="onItem(feature)">
25363
- <div
25364
- class="feature__icon"
25365
- [style.color]="iconColorStyle()"
25366
- [style.width.px]="config().iconSize"
25367
- [style.height.px]="config().iconSize"
25542
+ @if (feature.token != null) {
25543
+ <button
25544
+ type="button"
25545
+ class="feature feature--clickable"
25546
+ [attr.aria-label]="getTitle(feature)"
25547
+ (click)="onItem(feature)"
25368
25548
  >
25369
- @if (feature.image) {
25370
- <img
25371
- class="feature__image"
25372
- [class.feature__image--circle]="config().imageShape === 'circle'"
25373
- [src]="feature.image"
25374
- [alt]="getTitle(feature)"
25375
- />
25376
- } @else if (feature.icon === 'custom' && feature.svgPath) {
25377
- <svg
25378
- [attr.width]="config().iconSize"
25379
- [attr.height]="config().iconSize"
25380
- viewBox="0 0 24 24"
25381
- fill="none"
25382
- stroke="currentColor"
25383
- stroke-width="1.5"
25384
- stroke-linecap="round"
25385
- stroke-linejoin="round"
25386
- >
25387
- <path [attr.d]="feature.svgPath" />
25388
- </svg>
25389
- } @else if (feature.icon) {
25390
- <ion-icon [name]="feature.icon" [style.font-size.px]="config().iconSize"></ion-icon>
25391
- }
25392
- </div>
25393
- <div class="feature__content">
25394
- <strong class="feature__title">{{ getTitle(feature) }}</strong>
25395
- <p class="feature__description">{{ getDescription(feature) }}</p>
25549
+ <div
25550
+ class="feature__icon"
25551
+ [style.color]="iconColorStyle()"
25552
+ [style.width.px]="config().iconSize"
25553
+ [style.height.px]="config().iconSize"
25554
+ >
25555
+ @if (feature.image) {
25556
+ <img
25557
+ class="feature__image"
25558
+ [class.feature__image--circle]="config().imageShape === 'circle'"
25559
+ [src]="feature.image"
25560
+ [alt]="getTitle(feature)"
25561
+ />
25562
+ } @else if (feature.icon === 'custom' && feature.svgPath) {
25563
+ <svg
25564
+ [attr.width]="config().iconSize"
25565
+ [attr.height]="config().iconSize"
25566
+ viewBox="0 0 24 24"
25567
+ fill="none"
25568
+ stroke="currentColor"
25569
+ stroke-width="1.5"
25570
+ stroke-linecap="round"
25571
+ stroke-linejoin="round"
25572
+ >
25573
+ <path [attr.d]="feature.svgPath" />
25574
+ </svg>
25575
+ } @else if (feature.icon) {
25576
+ <ion-icon [name]="feature.icon" [style.font-size.px]="config().iconSize"></ion-icon>
25577
+ }
25578
+ </div>
25579
+ <div class="feature__content">
25580
+ <strong class="feature__title">{{ getTitle(feature) }}</strong>
25581
+ <p class="feature__description">{{ getDescription(feature) }}</p>
25582
+ </div>
25583
+ </button>
25584
+ } @else {
25585
+ <div class="feature">
25586
+ <div
25587
+ class="feature__icon"
25588
+ [style.color]="iconColorStyle()"
25589
+ [style.width.px]="config().iconSize"
25590
+ [style.height.px]="config().iconSize"
25591
+ >
25592
+ @if (feature.image) {
25593
+ <img
25594
+ class="feature__image"
25595
+ [class.feature__image--circle]="config().imageShape === 'circle'"
25596
+ [src]="feature.image"
25597
+ [alt]="getTitle(feature)"
25598
+ />
25599
+ } @else if (feature.icon === 'custom' && feature.svgPath) {
25600
+ <svg
25601
+ [attr.width]="config().iconSize"
25602
+ [attr.height]="config().iconSize"
25603
+ viewBox="0 0 24 24"
25604
+ fill="none"
25605
+ stroke="currentColor"
25606
+ stroke-width="1.5"
25607
+ stroke-linecap="round"
25608
+ stroke-linejoin="round"
25609
+ >
25610
+ <path [attr.d]="feature.svgPath" />
25611
+ </svg>
25612
+ } @else if (feature.icon) {
25613
+ <ion-icon [name]="feature.icon" [style.font-size.px]="config().iconSize"></ion-icon>
25614
+ }
25615
+ </div>
25616
+ <div class="feature__content">
25617
+ <strong class="feature__title">{{ getTitle(feature) }}</strong>
25618
+ <p class="feature__description">{{ getDescription(feature) }}</p>
25619
+ </div>
25396
25620
  </div>
25397
- </div>
25621
+ }
25398
25622
  }
25399
25623
 
25400
25624
  @if (canCollapse()) {
@@ -25409,7 +25633,7 @@ class FeaturesListComponent {
25409
25633
  </a>
25410
25634
  }
25411
25635
  </div>
25412
- `, isInline: true, styles: [":host{display:block}.features-list{display:flex}.features-list--vertical{flex-direction:column}.features-list--horizontal{flex-direction:row;flex-wrap:wrap}.features-list--horizontal .feature{flex:1;min-width:200px}.features-list--gap-small{gap:1rem}.features-list--gap-medium{gap:1.5rem}.features-list--gap-large{gap:2rem}.features-list--center{align-items:center;text-align:center}.features-list--center .feature{flex-direction:column;align-items:center}.features-list--center .feature__content{text-align:center}.feature{display:flex;align-items:flex-start;gap:1rem}.feature--clickable{cursor:pointer;border-radius:10px;transition:background-color .15s ease}.feature--clickable:hover{background:var(--ion-color-light, rgba(0, 0, 0, .03))}.feature__icon{flex-shrink:0;display:flex;align-items:center;justify-content:center}.feature__image{width:100%;height:100%;object-fit:contain;border-radius:8px}.feature__image--circle{object-fit:cover;border-radius:50%}.feature__content{flex:1}.feature__title{display:block;font-size:1.1rem;font-weight:600;color:var(--ion-text-color);margin-bottom:.25rem}.feature__description{margin:0;font-size:.95rem;color:var(--ion-color-medium);line-height:1.5}.features-list__more{align-self:flex-start;margin-top:.25rem;padding:0;background:none;border:none;font:inherit;font-weight:600;color:var(--ion-color-primary);cursor:pointer}.features-list--center .features-list__more,.features-list--center .features-list__footer{align-self:center}.features-list__footer{align-self:flex-start;margin-top:.25rem;font-weight:600;color:var(--ion-color-primary);text-decoration:none;cursor:pointer}.features-list__footer:hover{text-decoration:underline}:host-context(.dark) .feature__title,:host-context(.ion-palette-dark) .feature__title,:host-context(html.ion-palette-dark) .feature__title,:host-context(body.dark) .feature__title,:host-context([data-theme=\"dark\"]) .feature__title{color:var(--ion-text-color, #fff)}:host-context(.dark) .feature__description,:host-context(.ion-palette-dark) .feature__description,:host-context(html.ion-palette-dark) .feature__description,:host-context(body.dark) .feature__description,:host-context([data-theme=\"dark\"]) .feature__description{color:var(--ion-color-medium, #a0a0a0)}:host-context(.dark) .feature--clickable:hover,:host-context(.ion-palette-dark) .feature--clickable:hover,:host-context(html.ion-palette-dark) .feature--clickable:hover,:host-context(body.dark) .feature--clickable:hover,:host-context([data-theme=\"dark\"]) .feature--clickable:hover{background:#ffffff0a}\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"] }] }); }
25636
+ `, isInline: true, styles: [":host{display:block}.features-list{display:flex}.features-list--vertical{flex-direction:column}.features-list--horizontal{flex-direction:row;flex-wrap:wrap}.features-list--horizontal .feature{flex:1;min-width:200px}.features-list--gap-small{gap:1rem}.features-list--gap-medium{gap:1.5rem}.features-list--gap-large{gap:2rem}.features-list--center{align-items:center;text-align:center}.features-list--center .feature{flex-direction:column;align-items:center}.features-list--center .feature__content{text-align:center}.feature{display:flex;align-items:flex-start;gap:1rem}.feature--clickable{cursor:pointer;border-radius:10px;transition:background-color .15s ease;width:100%;text-align:left;border:none;background:none;font:inherit;color:inherit;padding:.25rem}.feature--clickable:hover{background:var(--ion-color-light, rgba(0, 0, 0, .03))}.feature--clickable:focus{outline:none}.feature--clickable:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px}.feature__icon{flex-shrink:0;display:flex;align-items:center;justify-content:center}.feature__image{width:100%;height:100%;object-fit:contain;border-radius:8px}.feature__image--circle{object-fit:cover;border-radius:50%}.feature__content{flex:1}.feature__title{display:block;font-size:1.1rem;font-weight:600;color:var(--ion-text-color);margin-bottom:.25rem}.feature__description{margin:0;font-size:.95rem;color:var(--ion-color-medium);line-height:1.5}.features-list__more{align-self:flex-start;margin-top:.25rem;padding:0;background:none;border:none;font:inherit;font-weight:600;color:var(--ion-color-primary);cursor:pointer}.features-list--center .features-list__more,.features-list--center .features-list__footer{align-self:center}.features-list__footer{align-self:flex-start;margin-top:.25rem;font-weight:600;color:var(--ion-color-primary);text-decoration:none;cursor:pointer}.features-list__footer:hover{text-decoration:underline}:host-context(.dark) .feature__title,:host-context(.ion-palette-dark) .feature__title,:host-context(html.ion-palette-dark) .feature__title,:host-context(body.dark) .feature__title,:host-context([data-theme=\"dark\"]) .feature__title{color:var(--ion-text-color, #fff)}:host-context(.dark) .feature__description,:host-context(.ion-palette-dark) .feature__description,:host-context(html.ion-palette-dark) .feature__description,:host-context(body.dark) .feature__description,:host-context([data-theme=\"dark\"]) .feature__description{color:var(--ion-color-medium, #a0a0a0)}:host-context(.dark) .feature--clickable:hover,:host-context(.ion-palette-dark) .feature--clickable:hover,:host-context(html.ion-palette-dark) .feature--clickable:hover,:host-context(body.dark) .feature--clickable:hover,:host-context([data-theme=\"dark\"]) .feature--clickable:hover{background:#ffffff0a}\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"] }] }); }
25413
25637
  }
25414
25638
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FeaturesListComponent, decorators: [{
25415
25639
  type: Component,
@@ -25424,42 +25648,86 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
25424
25648
  [class.features-list--center]="config().alignment === 'center'"
25425
25649
  >
25426
25650
  @for (feature of visibleFeatures(); track feature.titleKey) {
25427
- <div class="feature" [class.feature--clickable]="feature.token != null" (click)="onItem(feature)">
25428
- <div
25429
- class="feature__icon"
25430
- [style.color]="iconColorStyle()"
25431
- [style.width.px]="config().iconSize"
25432
- [style.height.px]="config().iconSize"
25651
+ @if (feature.token != null) {
25652
+ <button
25653
+ type="button"
25654
+ class="feature feature--clickable"
25655
+ [attr.aria-label]="getTitle(feature)"
25656
+ (click)="onItem(feature)"
25433
25657
  >
25434
- @if (feature.image) {
25435
- <img
25436
- class="feature__image"
25437
- [class.feature__image--circle]="config().imageShape === 'circle'"
25438
- [src]="feature.image"
25439
- [alt]="getTitle(feature)"
25440
- />
25441
- } @else if (feature.icon === 'custom' && feature.svgPath) {
25442
- <svg
25443
- [attr.width]="config().iconSize"
25444
- [attr.height]="config().iconSize"
25445
- viewBox="0 0 24 24"
25446
- fill="none"
25447
- stroke="currentColor"
25448
- stroke-width="1.5"
25449
- stroke-linecap="round"
25450
- stroke-linejoin="round"
25451
- >
25452
- <path [attr.d]="feature.svgPath" />
25453
- </svg>
25454
- } @else if (feature.icon) {
25455
- <ion-icon [name]="feature.icon" [style.font-size.px]="config().iconSize"></ion-icon>
25456
- }
25457
- </div>
25458
- <div class="feature__content">
25459
- <strong class="feature__title">{{ getTitle(feature) }}</strong>
25460
- <p class="feature__description">{{ getDescription(feature) }}</p>
25658
+ <div
25659
+ class="feature__icon"
25660
+ [style.color]="iconColorStyle()"
25661
+ [style.width.px]="config().iconSize"
25662
+ [style.height.px]="config().iconSize"
25663
+ >
25664
+ @if (feature.image) {
25665
+ <img
25666
+ class="feature__image"
25667
+ [class.feature__image--circle]="config().imageShape === 'circle'"
25668
+ [src]="feature.image"
25669
+ [alt]="getTitle(feature)"
25670
+ />
25671
+ } @else if (feature.icon === 'custom' && feature.svgPath) {
25672
+ <svg
25673
+ [attr.width]="config().iconSize"
25674
+ [attr.height]="config().iconSize"
25675
+ viewBox="0 0 24 24"
25676
+ fill="none"
25677
+ stroke="currentColor"
25678
+ stroke-width="1.5"
25679
+ stroke-linecap="round"
25680
+ stroke-linejoin="round"
25681
+ >
25682
+ <path [attr.d]="feature.svgPath" />
25683
+ </svg>
25684
+ } @else if (feature.icon) {
25685
+ <ion-icon [name]="feature.icon" [style.font-size.px]="config().iconSize"></ion-icon>
25686
+ }
25687
+ </div>
25688
+ <div class="feature__content">
25689
+ <strong class="feature__title">{{ getTitle(feature) }}</strong>
25690
+ <p class="feature__description">{{ getDescription(feature) }}</p>
25691
+ </div>
25692
+ </button>
25693
+ } @else {
25694
+ <div class="feature">
25695
+ <div
25696
+ class="feature__icon"
25697
+ [style.color]="iconColorStyle()"
25698
+ [style.width.px]="config().iconSize"
25699
+ [style.height.px]="config().iconSize"
25700
+ >
25701
+ @if (feature.image) {
25702
+ <img
25703
+ class="feature__image"
25704
+ [class.feature__image--circle]="config().imageShape === 'circle'"
25705
+ [src]="feature.image"
25706
+ [alt]="getTitle(feature)"
25707
+ />
25708
+ } @else if (feature.icon === 'custom' && feature.svgPath) {
25709
+ <svg
25710
+ [attr.width]="config().iconSize"
25711
+ [attr.height]="config().iconSize"
25712
+ viewBox="0 0 24 24"
25713
+ fill="none"
25714
+ stroke="currentColor"
25715
+ stroke-width="1.5"
25716
+ stroke-linecap="round"
25717
+ stroke-linejoin="round"
25718
+ >
25719
+ <path [attr.d]="feature.svgPath" />
25720
+ </svg>
25721
+ } @else if (feature.icon) {
25722
+ <ion-icon [name]="feature.icon" [style.font-size.px]="config().iconSize"></ion-icon>
25723
+ }
25724
+ </div>
25725
+ <div class="feature__content">
25726
+ <strong class="feature__title">{{ getTitle(feature) }}</strong>
25727
+ <p class="feature__description">{{ getDescription(feature) }}</p>
25728
+ </div>
25461
25729
  </div>
25462
- </div>
25730
+ }
25463
25731
  }
25464
25732
 
25465
25733
  @if (canCollapse()) {
@@ -25474,7 +25742,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
25474
25742
  </a>
25475
25743
  }
25476
25744
  </div>
25477
- `, styles: [":host{display:block}.features-list{display:flex}.features-list--vertical{flex-direction:column}.features-list--horizontal{flex-direction:row;flex-wrap:wrap}.features-list--horizontal .feature{flex:1;min-width:200px}.features-list--gap-small{gap:1rem}.features-list--gap-medium{gap:1.5rem}.features-list--gap-large{gap:2rem}.features-list--center{align-items:center;text-align:center}.features-list--center .feature{flex-direction:column;align-items:center}.features-list--center .feature__content{text-align:center}.feature{display:flex;align-items:flex-start;gap:1rem}.feature--clickable{cursor:pointer;border-radius:10px;transition:background-color .15s ease}.feature--clickable:hover{background:var(--ion-color-light, rgba(0, 0, 0, .03))}.feature__icon{flex-shrink:0;display:flex;align-items:center;justify-content:center}.feature__image{width:100%;height:100%;object-fit:contain;border-radius:8px}.feature__image--circle{object-fit:cover;border-radius:50%}.feature__content{flex:1}.feature__title{display:block;font-size:1.1rem;font-weight:600;color:var(--ion-text-color);margin-bottom:.25rem}.feature__description{margin:0;font-size:.95rem;color:var(--ion-color-medium);line-height:1.5}.features-list__more{align-self:flex-start;margin-top:.25rem;padding:0;background:none;border:none;font:inherit;font-weight:600;color:var(--ion-color-primary);cursor:pointer}.features-list--center .features-list__more,.features-list--center .features-list__footer{align-self:center}.features-list__footer{align-self:flex-start;margin-top:.25rem;font-weight:600;color:var(--ion-color-primary);text-decoration:none;cursor:pointer}.features-list__footer:hover{text-decoration:underline}:host-context(.dark) .feature__title,:host-context(.ion-palette-dark) .feature__title,:host-context(html.ion-palette-dark) .feature__title,:host-context(body.dark) .feature__title,:host-context([data-theme=\"dark\"]) .feature__title{color:var(--ion-text-color, #fff)}:host-context(.dark) .feature__description,:host-context(.ion-palette-dark) .feature__description,:host-context(html.ion-palette-dark) .feature__description,:host-context(body.dark) .feature__description,:host-context([data-theme=\"dark\"]) .feature__description{color:var(--ion-color-medium, #a0a0a0)}:host-context(.dark) .feature--clickable:hover,:host-context(.ion-palette-dark) .feature--clickable:hover,:host-context(html.ion-palette-dark) .feature--clickable:hover,:host-context(body.dark) .feature--clickable:hover,:host-context([data-theme=\"dark\"]) .feature--clickable:hover{background:#ffffff0a}\n"] }]
25745
+ `, styles: [":host{display:block}.features-list{display:flex}.features-list--vertical{flex-direction:column}.features-list--horizontal{flex-direction:row;flex-wrap:wrap}.features-list--horizontal .feature{flex:1;min-width:200px}.features-list--gap-small{gap:1rem}.features-list--gap-medium{gap:1.5rem}.features-list--gap-large{gap:2rem}.features-list--center{align-items:center;text-align:center}.features-list--center .feature{flex-direction:column;align-items:center}.features-list--center .feature__content{text-align:center}.feature{display:flex;align-items:flex-start;gap:1rem}.feature--clickable{cursor:pointer;border-radius:10px;transition:background-color .15s ease;width:100%;text-align:left;border:none;background:none;font:inherit;color:inherit;padding:.25rem}.feature--clickable:hover{background:var(--ion-color-light, rgba(0, 0, 0, .03))}.feature--clickable:focus{outline:none}.feature--clickable:focus-visible{outline:.125rem solid var(--ion-color-primary, #7026df);outline-offset:2px}.feature__icon{flex-shrink:0;display:flex;align-items:center;justify-content:center}.feature__image{width:100%;height:100%;object-fit:contain;border-radius:8px}.feature__image--circle{object-fit:cover;border-radius:50%}.feature__content{flex:1}.feature__title{display:block;font-size:1.1rem;font-weight:600;color:var(--ion-text-color);margin-bottom:.25rem}.feature__description{margin:0;font-size:.95rem;color:var(--ion-color-medium);line-height:1.5}.features-list__more{align-self:flex-start;margin-top:.25rem;padding:0;background:none;border:none;font:inherit;font-weight:600;color:var(--ion-color-primary);cursor:pointer}.features-list--center .features-list__more,.features-list--center .features-list__footer{align-self:center}.features-list__footer{align-self:flex-start;margin-top:.25rem;font-weight:600;color:var(--ion-color-primary);text-decoration:none;cursor:pointer}.features-list__footer:hover{text-decoration:underline}:host-context(.dark) .feature__title,:host-context(.ion-palette-dark) .feature__title,:host-context(html.ion-palette-dark) .feature__title,:host-context(body.dark) .feature__title,:host-context([data-theme=\"dark\"]) .feature__title{color:var(--ion-text-color, #fff)}:host-context(.dark) .feature__description,:host-context(.ion-palette-dark) .feature__description,:host-context(html.ion-palette-dark) .feature__description,:host-context(body.dark) .feature__description,:host-context([data-theme=\"dark\"]) .feature__description{color:var(--ion-color-medium, #a0a0a0)}:host-context(.dark) .feature--clickable:hover,:host-context(.ion-palette-dark) .feature--clickable:hover,:host-context(html.ion-palette-dark) .feature--clickable:hover,:host-context(body.dark) .feature--clickable:hover,:host-context([data-theme=\"dark\"]) .feature--clickable:hover{background:#ffffff0a}\n"] }]
25478
25746
  }], ctorParameters: () => [] });
25479
25747
 
25480
25748
  /**
@@ -27122,6 +27390,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
27122
27390
  `, styles: ["@charset \"UTF-8\";:host{display:contents}.val-update-banner{position:fixed;top:0;left:0;right:0;z-index:1100;display:flex;justify-content:center;padding:calc(12px + env(safe-area-inset-top,0px)) 16px 12px;pointer-events:none}.val-update-banner__backdrop{position:fixed;inset:0;z-index:-1;background:#0000008c;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);pointer-events:auto}.val-update-banner__panel{pointer-events:auto;display:flex;flex-direction:row;align-items:center;gap:12px;width:100%;max-width:640px;padding:12px 16px;background:var(--ion-background-color, #fff);border:1px solid var(--val-border-color, rgba(0, 0, 0, .08));border-radius:var(--val-border-radius, 12px);box-shadow:0 4px 24px #0000001f;animation:val-update-banner-in .25s ease-out}.val-update-banner--required{align-items:center;height:100%}.val-update-banner--required .val-update-banner__panel{flex-direction:column;text-align:center;max-width:420px}.val-update-banner__icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:12px;background:color-mix(in srgb,var(--ion-color-primary) 14%,transparent);font-size:22px}.val-update-banner__icon val-icon{display:flex;line-height:0}.val-update-banner__icon ::ng-deep ion-icon{display:block}.val-update-banner--required .val-update-banner__icon{background:color-mix(in srgb,var(--ion-color-warning) 16%,transparent)}.val-update-banner__body{flex:1 1 auto;display:flex;flex-direction:column;gap:2px;min-width:0}.val-update-banner__actions{flex:0 0 auto;display:flex;flex-direction:row;align-items:center;gap:4px}.val-update-banner--required .val-update-banner__actions{margin-top:8px}@keyframes val-update-banner-in{0%{opacity:0;transform:translateY(-12px)}to{opacity:1;transform:translateY(0)}}@media (max-width: 540px){.val-update-banner__panel{flex-direction:column;text-align:center}.val-update-banner__actions{width:100%;justify-content:center}}\n"] }]
27123
27391
  }] });
27124
27392
 
27393
+ /**
27394
+ * Ionic color helpers — single source of truth.
27395
+ *
27396
+ * Several presentational cards used to inline a literal `IONIC_COLORS` array
27397
+ * plus a `resolveColor()` copy. This util consolidates that logic so the named
27398
+ * Ionic palette and the CSS-var resolution live in one place.
27399
+ */
27400
+ /** The named Ionic color palette tokens. */
27401
+ const IONIC_COLORS$5 = [
27402
+ 'primary',
27403
+ 'secondary',
27404
+ 'tertiary',
27405
+ 'success',
27406
+ 'warning',
27407
+ 'danger',
27408
+ 'light',
27409
+ 'medium',
27410
+ 'dark',
27411
+ ];
27412
+ /** True when `value` is one of the named Ionic palette tokens. */
27413
+ function isIonicColor(value) {
27414
+ return !!value && IONIC_COLORS$5.includes(value);
27415
+ }
27416
+ /**
27417
+ * Resolve a color value to a usable CSS color.
27418
+ *
27419
+ * - A named Ionic token (e.g. `primary`) becomes `var(--ion-color-primary)`.
27420
+ * - Any other value (hex, rgb, CSS var, etc.) is returned unchanged.
27421
+ * - `undefined`/empty returns `undefined`.
27422
+ */
27423
+ function resolveIonicColor(value) {
27424
+ if (!value)
27425
+ return undefined;
27426
+ return isIonicColor(value) ? `var(--ion-color-${value})` : value;
27427
+ }
27428
+
27125
27429
  /**
27126
27430
  * Default values for ActionCardMetadata
27127
27431
  */
@@ -27134,7 +27438,6 @@ const ACTION_CARD_DEFAULTS = {
27134
27438
  };
27135
27439
 
27136
27440
  addIcons({ chevronForwardOutline });
27137
- const IONIC_COLORS$8 = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];
27138
27441
  /**
27139
27442
  * val-action-card
27140
27443
  *
@@ -27210,14 +27513,9 @@ class ActionCardComponent {
27210
27513
  }
27211
27514
  return cfg.description || '';
27212
27515
  }
27213
- /** Resolve color to CSS value */
27516
+ /** Resolve color to CSS value (named Ionic token → CSS var, else passthrough) */
27214
27517
  resolveColor(color) {
27215
- if (!color)
27216
- return null;
27217
- if (IONIC_COLORS$8.includes(color)) {
27218
- return `var(--ion-color-${color})`;
27219
- }
27220
- return color;
27518
+ return resolveIonicColor(color) ?? null;
27221
27519
  }
27222
27520
  getBackgroundColor() {
27223
27521
  return this.resolveColor(this.config().backgroundColor);
@@ -27407,7 +27705,7 @@ const MEDIA_OBJECT_DEFAULTS = {
27407
27705
  circle: false,
27408
27706
  };
27409
27707
 
27410
- const IONIC_COLORS$7 = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];
27708
+ const IONIC_COLORS$4 = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];
27411
27709
  /**
27412
27710
  * val-media-object
27413
27711
  *
@@ -27447,7 +27745,7 @@ class MediaObjectComponent {
27447
27745
  const color = this.config().color;
27448
27746
  if (!color)
27449
27747
  return 'var(--ion-color-primary)';
27450
- return IONIC_COLORS$7.includes(color) ? `var(--ion-color-${color})` : color;
27748
+ return IONIC_COLORS$4.includes(color) ? `var(--ion-color-${color})` : color;
27451
27749
  }
27452
27750
  handleLinkClick(event) {
27453
27751
  const link = this.config().link;
@@ -27551,7 +27849,7 @@ const STATS_BAR_DEFAULTS = {
27551
27849
  stackOnMobile: true,
27552
27850
  };
27553
27851
 
27554
- const IONIC_COLORS$6 = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];
27852
+ const IONIC_COLORS$3 = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];
27555
27853
  /**
27556
27854
  * val-stats-bar
27557
27855
  *
@@ -27588,7 +27886,7 @@ class StatsBarComponent {
27588
27886
  const color = stat.color;
27589
27887
  if (!color)
27590
27888
  return null;
27591
- return IONIC_COLORS$6.includes(color) ? `var(--ion-color-${color})` : color;
27889
+ return IONIC_COLORS$3.includes(color) ? `var(--ion-color-${color})` : color;
27592
27890
  }
27593
27891
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StatsBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27594
27892
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: StatsBarComponent, isStandalone: true, selector: "val-stats-bar", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
@@ -27656,7 +27954,7 @@ const ARTICLE_CARD_DEFAULTS = {
27656
27954
  excerptLines: 3,
27657
27955
  };
27658
27956
 
27659
- const IONIC_COLORS$5 = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];
27957
+ const IONIC_COLORS$2 = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];
27660
27958
  /**
27661
27959
  * val-article-card
27662
27960
  *
@@ -27699,7 +27997,7 @@ class ArticleCardComponent {
27699
27997
  const color = this.config().topicColor;
27700
27998
  if (!color)
27701
27999
  return 'var(--ion-color-primary)';
27702
- return IONIC_COLORS$5.includes(color) ? `var(--ion-color-${color})` : color;
28000
+ return IONIC_COLORS$2.includes(color) ? `var(--ion-color-${color})` : color;
27703
28001
  }
27704
28002
  handleClick(event) {
27705
28003
  const cfg = this.config();
@@ -27814,7 +28112,6 @@ const CTA_CARD_DEFAULTS = {
27814
28112
  shadowed: false,
27815
28113
  };
27816
28114
 
27817
- const IONIC_COLORS$4 = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];
27818
28115
  /**
27819
28116
  * val-cta-card
27820
28117
  *
@@ -27855,16 +28152,11 @@ class CtaCardComponent {
27855
28152
  ...this.props(),
27856
28153
  }));
27857
28154
  }
27858
- resolveColor(color) {
27859
- if (!color)
27860
- return null;
27861
- return IONIC_COLORS$4.includes(color) ? `var(--ion-color-${color})` : color;
27862
- }
27863
28155
  getBackground() {
27864
- return this.resolveColor(this.config().backgroundColor) || 'var(--ion-color-light, #f4f5f8)';
28156
+ return resolveIonicColor(this.config().backgroundColor) || 'var(--ion-color-light, #f4f5f8)';
27865
28157
  }
27866
28158
  getColor() {
27867
- return this.resolveColor(this.config().color);
28159
+ return resolveIonicColor(this.config().color) ?? null;
27868
28160
  }
27869
28161
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CtaCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27870
28162
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CtaCardComponent, isStandalone: true, selector: "val-cta-card", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onAction: "onAction" }, ngImport: i0, template: `
@@ -30907,6 +31199,13 @@ class FormComponent {
30907
31199
  this.usernamePropMemo = new WeakMap();
30908
31200
  this.textareaPropMemo = new WeakMap();
30909
31201
  this.selectPropMemo = new WeakMap();
31202
+ // Memo de props con un inputType HTML inyectado (EMAIL/NUMBER/HOUR colapsados
31203
+ // en val-text-input). Clave por field para conservar identidad de referencia.
31204
+ this.textInputPropMemo = new WeakMap();
31205
+ // Ids estables por field para el wiring de accesibilidad label↔input↔error.
31206
+ // Estables entre CD cycles (memoizados por referencia de field) → aria-* no parpadea.
31207
+ this.fieldIdMemo = new WeakMap();
31208
+ this.fieldUid = 0;
30910
31209
  this.previousUploadingCount = 0;
30911
31210
  // Campos ATTACHMENT con uploads en curso — bloquea submit + DESHABILITA el
30912
31211
  // botón (no loading: el spinner se reserva para el submit real del form).
@@ -31066,6 +31365,28 @@ class FormComponent {
31066
31365
  getControl(field) {
31067
31366
  return this.Form.get(field);
31068
31367
  }
31368
+ /**
31369
+ * Ids estables (label + error) para un field. Memoizados por referencia para
31370
+ * que el wiring `aria-labelledby` / `aria-describedby` no cambie entre ciclos
31371
+ * de change detection.
31372
+ */
31373
+ fieldIds(field) {
31374
+ let ids = this.fieldIdMemo.get(field);
31375
+ if (!ids) {
31376
+ const base = `val-form-field-${this.fieldUid++}`;
31377
+ ids = { labelId: `${base}-label`, errorId: `${base}-error` };
31378
+ this.fieldIdMemo.set(field, ids);
31379
+ }
31380
+ return ids;
31381
+ }
31382
+ /** Id del label visible del campo (consumido por el template + el input). */
31383
+ labelId(field) {
31384
+ return this.fieldIds(field).labelId;
31385
+ }
31386
+ /** Id del contenedor de error (`val-hint`) del campo. */
31387
+ errorId(field) {
31388
+ return this.fieldIds(field).errorId;
31389
+ }
31069
31390
  getFieldProp(field) {
31070
31391
  const cached = this.fieldPropMemo.get(field);
31071
31392
  if (cached)
@@ -31073,19 +31394,34 @@ class FormComponent {
31073
31394
  if (!field.token) {
31074
31395
  field.token = `input-${field.type}-${field.name}`;
31075
31396
  }
31397
+ const ids = this.fieldIds(field);
31076
31398
  let result;
31077
31399
  if (field.type === this.types.NUMBER_FROM_TO) {
31078
31400
  const fromControl = this.getControl(`${field.name}_from`);
31079
31401
  const toControl = this.getControl(`${field.name}_to`);
31080
- result = { ...field, fromControl, toControl, control: undefined };
31402
+ result = { ...field, fromControl, toControl, control: undefined, labelId: ids.labelId, errorId: ids.errorId };
31081
31403
  }
31082
31404
  else {
31083
31405
  const control = this.getControl(field.name);
31084
- result = { ...field, control };
31406
+ result = { ...field, control, labelId: ids.labelId, errorId: ids.errorId };
31085
31407
  }
31086
31408
  this.fieldPropMemo.set(field, result);
31087
31409
  return result;
31088
31410
  }
31411
+ /**
31412
+ * Adapter para los tipos colapsados en `val-text-input` (EMAIL/NUMBER/HOUR).
31413
+ * Reusa `getFieldProp` (con su control + wiring de ids) e inyecta el `inputType`
31414
+ * HTML nativo. Memoizado por referencia de field para no romper la identidad.
31415
+ */
31416
+ getTextInputProp(field, inputType) {
31417
+ const cached = this.textInputPropMemo.get(field);
31418
+ if (cached)
31419
+ return cached;
31420
+ const base = this.getFieldProp(field);
31421
+ const result = { ...base, inputType };
31422
+ this.textInputPropMemo.set(field, result);
31423
+ return result;
31424
+ }
31089
31425
  /**
31090
31426
  * Adapter para SELECT — igual que `getFieldProp` pero limpia `label`.
31091
31427
  * val-form ya renderiza el título del campo con `<val-title>` arriba del input;
@@ -31207,7 +31543,9 @@ class FormComponent {
31207
31543
  @for (f of s.fields; track f.name) {
31208
31544
  <div class="input" [attr.data-testid]="f.token">
31209
31545
  @if (f.type !== types.PHONE && f.type !== types.HANDLE && f.type !== types.ATTACHMENT) {
31210
- <val-title [props]="{ content: f.label, size: 'small', color: 'dark', bold: false }"></val-title>
31546
+ <div [attr.id]="labelId(f)">
31547
+ <val-title [props]="{ content: f.label, size: 'small', color: 'dark', bold: false }"></val-title>
31548
+ </div>
31211
31549
  }
31212
31550
  @if (f.description) {
31213
31551
  <span class="field-description">{{ f.description }}</span>
@@ -31229,16 +31567,16 @@ class FormComponent {
31229
31567
  <val-date-input [props]="getFieldProp(f)"></val-date-input>
31230
31568
  }
31231
31569
  @case (types.EMAIL) {
31232
- <val-email-input [props]="getFieldProp(f)"></val-email-input>
31570
+ <val-text-input [props]="getTextInputProp(f, 'email')"></val-text-input>
31233
31571
  }
31234
31572
  @case (types.FILE) {
31235
31573
  <val-file-input [props]="getFieldProp(f)"></val-file-input>
31236
31574
  }
31237
31575
  @case (types.HOUR) {
31238
- <val-hour-input [props]="getFieldProp(f)"></val-hour-input>
31576
+ <val-text-input [props]="getTextInputProp(f, 'time')"></val-text-input>
31239
31577
  }
31240
31578
  @case (types.NUMBER) {
31241
- <val-number-input [props]="getFieldProp(f)"></val-number-input>
31579
+ <val-text-input [props]="getTextInputProp(f, 'number')"></val-text-input>
31242
31580
  }
31243
31581
  @case (types.NUMBER_FROM_TO) {
31244
31582
  <val-number-from-to [props]="getFieldProp(f)"></val-number-from-to>
@@ -31285,7 +31623,7 @@ class FormComponent {
31285
31623
  ></val-attachment-uploader>
31286
31624
  }
31287
31625
  }
31288
- <val-hint [props]="getFieldProp(f)"></val-hint>
31626
+ <val-hint [props]="getFieldProp(f)" [id]="errorId(f)"></val-hint>
31289
31627
  </div>
31290
31628
  }
31291
31629
  <val-divider [props]="{ fill: 'solid', size: 'medium', color: 'medium' }"></val-divider>
@@ -31302,7 +31640,7 @@ class FormComponent {
31302
31640
  }
31303
31641
  </form>
31304
31642
  </div>
31305
- `, 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}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["preset", "props"] }, { kind: "component", type: TextareaInputComponent, selector: "val-textarea-input", inputs: ["preset", "props"] }, { kind: "component", type: CheckInputComponent, selector: "val-check-input", inputs: ["preset", "props"] }, { kind: "component", type: ButtonGroupComponent, selector: "val-button-group", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: DividerComponent, selector: "val-divider", inputs: ["props"] }, { kind: "component", type: HintComponent, selector: "val-hint", inputs: ["props"] }, { kind: "component", type: CommentInputComponent, selector: "val-comment-input", inputs: ["props"] }, { kind: "component", type: DateInputComponent, selector: "val-date-input", inputs: ["preset", "props"] }, { kind: "component", type: FileInputComponent, selector: "val-file-input", inputs: ["props"] }, { kind: "component", type: HourInputComponent, selector: "val-hour-input", inputs: ["props"] }, { kind: "component", type: EmailInputComponent, selector: "val-email-input", inputs: ["preset", "props"] }, { kind: "component", type: NumberInputComponent, selector: "val-number-input", inputs: ["props"] }, { kind: "component", type: NumberFromToComponent, selector: "val-number-from-to", inputs: ["props"] }, { kind: "component", type: RadioInputComponent, selector: "val-radio-input", inputs: ["props"] }, { kind: "component", type: PasswordInputComponent, selector: "val-password-input", inputs: ["preset", "props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }, { kind: "component", type: SelectSearchComponent, selector: "val-select-search", inputs: ["label", "labelProperty", "valueProperty", "multiple", "placeholder", "props"] }, { kind: "component", type: MultiSelectSearchComponent, selector: "val-multi-select-search", inputs: ["label", "labelProperty", "valueProperty", "placeholder", "props"] }, { kind: "component", type: SearchSelectorComponent, selector: "val-select-input", inputs: ["preset", "props"] }, { kind: "component", type: PhoneInputComponent, selector: "val-phone-input", inputs: ["preset", "props"], outputs: ["phoneChange"] }, { kind: "component", type: ToggleInputComponent, selector: "val-toggle-input", inputs: ["preset", "props"] }, { kind: "component", type: CheckboxRadioInputComponent, selector: "val-checkbox-radio-input", inputs: ["props"] }, { kind: "component", type: UsernameInputComponent, selector: "val-username-input", inputs: ["props"] }, { kind: "component", type: AttachmentUploaderComponent, selector: "val-attachment-uploader", inputs: ["props"], outputs: ["attachmentsChange"] }] }); }
31643
+ `, 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}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["preset", "props"] }, { kind: "component", type: TextareaInputComponent, selector: "val-textarea-input", inputs: ["preset", "props"] }, { kind: "component", type: CheckInputComponent, selector: "val-check-input", inputs: ["preset", "props"] }, { kind: "component", type: ButtonGroupComponent, selector: "val-button-group", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: DividerComponent, selector: "val-divider", inputs: ["props"] }, { kind: "component", type: HintComponent, selector: "val-hint", inputs: ["props", "id", "isError"] }, { kind: "component", type: CommentInputComponent, selector: "val-comment-input", inputs: ["props"] }, { kind: "component", type: DateInputComponent, selector: "val-date-input", inputs: ["preset", "props"] }, { kind: "component", type: FileInputComponent, selector: "val-file-input", inputs: ["props"] }, { kind: "component", type: NumberFromToComponent, selector: "val-number-from-to", inputs: ["props"] }, { kind: "component", type: RadioInputComponent, selector: "val-radio-input", inputs: ["props"] }, { kind: "component", type: PasswordInputComponent, selector: "val-password-input", inputs: ["preset", "props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }, { kind: "component", type: SelectSearchComponent, selector: "val-select-search", inputs: ["label", "labelProperty", "valueProperty", "multiple", "placeholder", "props"] }, { kind: "component", type: MultiSelectSearchComponent, selector: "val-multi-select-search", inputs: ["label", "labelProperty", "valueProperty", "placeholder", "props"] }, { kind: "component", type: SearchSelectorComponent, selector: "val-select-input", inputs: ["preset", "props"] }, { kind: "component", type: PhoneInputComponent, selector: "val-phone-input", inputs: ["preset", "props"], outputs: ["phoneChange"] }, { kind: "component", type: ToggleInputComponent, selector: "val-toggle-input", inputs: ["preset", "props"] }, { kind: "component", type: CheckboxRadioInputComponent, selector: "val-checkbox-radio-input", inputs: ["props"] }, { kind: "component", type: UsernameInputComponent, selector: "val-username-input", inputs: ["props"] }, { kind: "component", type: AttachmentUploaderComponent, selector: "val-attachment-uploader", inputs: ["props"], outputs: ["attachmentsChange"] }] }); }
31306
31644
  }
31307
31645
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormComponent, decorators: [{
31308
31646
  type: Component,
@@ -31320,9 +31658,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
31320
31658
  CommentInputComponent,
31321
31659
  DateInputComponent,
31322
31660
  FileInputComponent,
31323
- HourInputComponent,
31324
- EmailInputComponent,
31325
- NumberInputComponent,
31326
31661
  NumberFromToComponent,
31327
31662
  RadioInputComponent,
31328
31663
  PasswordInputComponent,
@@ -31353,7 +31688,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
31353
31688
  @for (f of s.fields; track f.name) {
31354
31689
  <div class="input" [attr.data-testid]="f.token">
31355
31690
  @if (f.type !== types.PHONE && f.type !== types.HANDLE && f.type !== types.ATTACHMENT) {
31356
- <val-title [props]="{ content: f.label, size: 'small', color: 'dark', bold: false }"></val-title>
31691
+ <div [attr.id]="labelId(f)">
31692
+ <val-title [props]="{ content: f.label, size: 'small', color: 'dark', bold: false }"></val-title>
31693
+ </div>
31357
31694
  }
31358
31695
  @if (f.description) {
31359
31696
  <span class="field-description">{{ f.description }}</span>
@@ -31375,16 +31712,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
31375
31712
  <val-date-input [props]="getFieldProp(f)"></val-date-input>
31376
31713
  }
31377
31714
  @case (types.EMAIL) {
31378
- <val-email-input [props]="getFieldProp(f)"></val-email-input>
31715
+ <val-text-input [props]="getTextInputProp(f, 'email')"></val-text-input>
31379
31716
  }
31380
31717
  @case (types.FILE) {
31381
31718
  <val-file-input [props]="getFieldProp(f)"></val-file-input>
31382
31719
  }
31383
31720
  @case (types.HOUR) {
31384
- <val-hour-input [props]="getFieldProp(f)"></val-hour-input>
31721
+ <val-text-input [props]="getTextInputProp(f, 'time')"></val-text-input>
31385
31722
  }
31386
31723
  @case (types.NUMBER) {
31387
- <val-number-input [props]="getFieldProp(f)"></val-number-input>
31724
+ <val-text-input [props]="getTextInputProp(f, 'number')"></val-text-input>
31388
31725
  }
31389
31726
  @case (types.NUMBER_FROM_TO) {
31390
31727
  <val-number-from-to [props]="getFieldProp(f)"></val-number-from-to>
@@ -31431,7 +31768,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
31431
31768
  ></val-attachment-uploader>
31432
31769
  }
31433
31770
  }
31434
- <val-hint [props]="getFieldProp(f)"></val-hint>
31771
+ <val-hint [props]="getFieldProp(f)" [id]="errorId(f)"></val-hint>
31435
31772
  </div>
31436
31773
  }
31437
31774
  <val-divider [props]="{ fill: 'solid', size: 'medium', color: 'medium' }"></val-divider>
@@ -32559,7 +32896,7 @@ class ChangePasswordModalComponent {
32559
32896
  },
32560
32897
  ],
32561
32898
  actions: {
32562
- ...SolidDefaultBlock('', 'submit'),
32899
+ ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block' }),
32563
32900
  token: 'set-submit',
32564
32901
  textKey: 'setPasswordSubmit',
32565
32902
  },
@@ -32593,7 +32930,7 @@ class ChangePasswordModalComponent {
32593
32930
  },
32594
32931
  ],
32595
32932
  actions: {
32596
- ...SolidDefaultBlock('', 'submit'),
32933
+ ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block' }),
32597
32934
  token: 'change-submit',
32598
32935
  textKey: 'changePasswordSubmit',
32599
32936
  },
@@ -32818,7 +33155,7 @@ class ChangeEmailModalComponent {
32818
33155
  },
32819
33156
  ],
32820
33157
  actions: {
32821
- ...SolidDefaultBlock('', 'submit'),
33158
+ ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block' }),
32822
33159
  token: 'change-email-initiate',
32823
33160
  textKey: 'changeEmailInitiate',
32824
33161
  },
@@ -32851,7 +33188,7 @@ class ChangeEmailModalComponent {
32851
33188
  },
32852
33189
  ],
32853
33190
  actions: {
32854
- ...SolidDefaultBlock('', 'submit'),
33191
+ ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block' }),
32855
33192
  token: 'change-email-confirm-1',
32856
33193
  textKey: 'changeEmailConfirm1',
32857
33194
  },
@@ -32887,7 +33224,7 @@ class ChangeEmailModalComponent {
32887
33224
  },
32888
33225
  ],
32889
33226
  actions: {
32890
- ...SolidDefaultBlock('', 'submit'),
33227
+ ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block' }),
32891
33228
  token: 'change-email-confirm-2',
32892
33229
  textKey: 'changeEmailConfirm2',
32893
33230
  },
@@ -33261,7 +33598,7 @@ const FUN_MODAL_DEFAULTS = {
33261
33598
  imageRadius: 16,
33262
33599
  };
33263
33600
 
33264
- const IONIC_COLORS$3 = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];
33601
+ const IONIC_COLORS$1 = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];
33265
33602
  /**
33266
33603
  * `val-fun-modal` — modal moderno tipo promo/onboarding: imagen o ilustración
33267
33604
  * arriba, título, cuerpo y botones de acción, con redondeo personalizable.
@@ -33311,7 +33648,7 @@ class FunModalComponent {
33311
33648
  const color = this.config().backgroundColor;
33312
33649
  if (!color)
33313
33650
  return null;
33314
- return IONIC_COLORS$3.includes(color) ? `var(--ion-color-${color})` : color;
33651
+ return IONIC_COLORS$1.includes(color) ? `var(--ion-color-${color})` : color;
33315
33652
  }
33316
33653
  close() {
33317
33654
  this._isOpen = false;
@@ -34538,7 +34875,7 @@ class MfaModalComponent {
34538
34875
  },
34539
34876
  ],
34540
34877
  actions: {
34541
- ...SolidDefaultBlock('', 'submit'),
34878
+ ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block' }),
34542
34879
  token: 'mfa-disable-submit',
34543
34880
  textKey: 'mfaDisableButton',
34544
34881
  },
@@ -34982,7 +35319,7 @@ class ItemListComponent {
34982
35319
  * Devuelve el color de borde de la lista.
34983
35320
  */
34984
35321
  color() {
34985
- return resolveColor$1(this.props.color || this.defaultColor);
35322
+ return resolveColor(this.props.color || this.defaultColor);
34986
35323
  }
34987
35324
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemListComponent, deps: [{ token: IconService }], target: i0.ɵɵFactoryTarget.Component }); }
34988
35325
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ItemListComponent, isStandalone: true, selector: "val-item-list", inputs: { props: "props" }, outputs: { onClick: "onClick", onActionClick: "onActionClick" }, ngImport: i0, template: `
@@ -39387,7 +39724,7 @@ class LoginComponent {
39387
39724
  },
39388
39725
  ],
39389
39726
  actions: {
39390
- ...SolidDefaultBlock('', 'submit'),
39727
+ ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block' }),
39391
39728
  token: 'login-submit',
39392
39729
  textKey: 'loginSubmit',
39393
39730
  },
@@ -39453,7 +39790,7 @@ class LoginComponent {
39453
39790
  },
39454
39791
  ],
39455
39792
  actions: {
39456
- ...SolidDefaultBlock('', 'submit'),
39793
+ ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block' }),
39457
39794
  token: 'register-submit',
39458
39795
  textKey: 'registerSubmit',
39459
39796
  },
@@ -39494,7 +39831,7 @@ class LoginComponent {
39494
39831
  },
39495
39832
  ],
39496
39833
  actions: {
39497
- ...SolidDefaultBlock('', 'submit'),
39834
+ ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block' }),
39498
39835
  token: 'verify-submit',
39499
39836
  textKey: 'verifySubmit',
39500
39837
  },
@@ -39537,7 +39874,7 @@ class LoginComponent {
39537
39874
  },
39538
39875
  ],
39539
39876
  actions: {
39540
- ...SolidDefaultBlock('', 'submit'),
39877
+ ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block' }),
39541
39878
  token: 'mfa-verify-submit',
39542
39879
  textKey: 'verifySubmit',
39543
39880
  },
@@ -39574,7 +39911,7 @@ class LoginComponent {
39574
39911
  },
39575
39912
  ],
39576
39913
  actions: {
39577
- ...SolidDefaultBlock('', 'submit'),
39914
+ ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block' }),
39578
39915
  token: 'forgot-submit',
39579
39916
  textKey: 'forgotSubmit',
39580
39917
  },
@@ -39630,7 +39967,7 @@ class LoginComponent {
39630
39967
  },
39631
39968
  ],
39632
39969
  actions: {
39633
- ...SolidDefaultBlock('', 'submit'),
39970
+ ...button({ text: '', type: 'submit', fill: 'solid', expand: 'block' }),
39634
39971
  token: 'reset-submit',
39635
39972
  textKey: 'resetSubmit',
39636
39973
  },
@@ -55063,7 +55400,7 @@ const FIELD_LIST_I18N = {
55063
55400
  };
55064
55401
 
55065
55402
  addIcons({ addOutline, trashOutline });
55066
- const I18N_NS = 'FieldList';
55403
+ const I18N_NS$1 = 'FieldList';
55067
55404
  /**
55068
55405
  * `val-field-list` — editor de listas de campos repetibles (premios, rondas,
55069
55406
  * integrantes, etc.). Cada ítem es una **card** con sus campos apilados y un botón
@@ -55117,8 +55454,8 @@ class FieldListComponent {
55117
55454
  const max = this.props.max;
55118
55455
  return max == null || this.rowsSig().length < max;
55119
55456
  });
55120
- if (!this.i18n.hasNamespace(I18N_NS)) {
55121
- this.i18n.registerContent(I18N_NS, FIELD_LIST_I18N);
55457
+ if (!this.i18n.hasNamespace(I18N_NS$1)) {
55458
+ this.i18n.registerContent(I18N_NS$1, FIELD_LIST_I18N);
55122
55459
  }
55123
55460
  }
55124
55461
  ngOnChanges(changes) {
@@ -55134,7 +55471,7 @@ class FieldListComponent {
55134
55471
  }
55135
55472
  }
55136
55473
  t(key) {
55137
- return this.i18n.t(key, I18N_NS);
55474
+ return this.i18n.t(key, I18N_NS$1);
55138
55475
  }
55139
55476
  /** Reemplaza `{n}` por el número de fila (1-based) en el rótulo de la card. */
55140
55477
  rowLabel(template, index) {
@@ -55299,6 +55636,243 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
55299
55636
  * cada cambio (`itemsChange`). Patrón object-first (`@Input() props`).
55300
55637
  */
55301
55638
 
55639
+ /** Defaults i18n (es/en) de `val-date-picker`. Namespace `DatePicker`. */
55640
+ const DATE_PICKER_I18N = {
55641
+ es: { select: 'Seleccionar fecha', today: 'Hoy', clear: 'Limpiar' },
55642
+ en: { select: 'Select date', today: 'Today', clear: 'Clear' },
55643
+ };
55644
+
55645
+ addIcons({ calendarOutline });
55646
+ const I18N_NS = 'DatePicker';
55647
+ /**
55648
+ * `val-date-picker` — selector de fecha con calendario propio basado en
55649
+ * `vanilla-calendar-pro` (NO ion-datetime → sin el bug del grid de días vacío).
55650
+ *
55651
+ * Trigger (botón con la fecha formateada o placeholder) que despliega un calendario
55652
+ * inline debajo; al elegir un día se aplica y se cierra. Valor manejado como string
55653
+ * `YYYY-MM-DD` (fecha local, sin zona horaria). Integra con `FormControl` (`control`)
55654
+ * o vía `value` + `(valueChange)`. Auto-registra i18n (`DatePicker`).
55655
+ *
55656
+ * `ViewEncapsulation.None`: el calendario se crea por JS (fuera del scope emulado),
55657
+ * así que los estilos de la lib + overrides de marca deben ser globales.
55658
+ *
55659
+ * @example
55660
+ * <val-date-picker [props]="{ control: fechaControl, label: 'Fecha', locale: 'es-CL' }"
55661
+ * (valueChange)="onDate($event)" />
55662
+ */
55663
+ class DatePickerComponent {
55664
+ constructor() {
55665
+ this.i18n = inject(I18nService);
55666
+ this.props = {};
55667
+ /** Emite el valor (`YYYY-MM-DD` | null) en cada cambio. */
55668
+ this.valueChange = new EventEmitter();
55669
+ this.open = false;
55670
+ if (!this.i18n.hasNamespace(I18N_NS)) {
55671
+ this.i18n.registerContent(I18N_NS, DATE_PICKER_I18N);
55672
+ }
55673
+ }
55674
+ /** id estable del trigger. */
55675
+ get triggerId() {
55676
+ if (!this.props.token) {
55677
+ this.props.token = `vdp-${Math.random().toString(36).slice(2, 10)}`;
55678
+ }
55679
+ return this.props.token;
55680
+ }
55681
+ get locale() {
55682
+ return this.props.locale || 'es-ES';
55683
+ }
55684
+ /** Valor actual (`YYYY-MM-DD` | null) — del control o del prop value. */
55685
+ get current() {
55686
+ if (this.props.control)
55687
+ return this.props.control.value ?? null;
55688
+ return this.props.value ?? null;
55689
+ }
55690
+ get placeholderText() {
55691
+ this.i18n.lang();
55692
+ return this.props.placeholder || this.t('select');
55693
+ }
55694
+ /** Valor formateado a fecha larga local (sin day-shift). '' si vacío. */
55695
+ get displayValue() {
55696
+ this.i18n.lang();
55697
+ const v = this.current;
55698
+ const d = this.parseLocal(v);
55699
+ if (!d)
55700
+ return '';
55701
+ try {
55702
+ return new Intl.DateTimeFormat(this.locale, { dateStyle: 'long' }).format(d);
55703
+ }
55704
+ catch {
55705
+ return v ?? '';
55706
+ }
55707
+ }
55708
+ ngOnChanges(_changes) {
55709
+ // Si el calendario está abierto y cambió el valor desde afuera, re-sincroniza.
55710
+ if (this.open && this.calendar) {
55711
+ this.calendar.set({ selectedDates: this.current ? [this.current] : [] });
55712
+ }
55713
+ }
55714
+ ngOnDestroy() {
55715
+ this.destroyCalendar();
55716
+ }
55717
+ t(key) {
55718
+ return this.i18n.t(key, I18N_NS);
55719
+ }
55720
+ toggle() {
55721
+ this.open = !this.open;
55722
+ if (this.open) {
55723
+ // El contenedor recién renderiza tras este tick → construir en microtask.
55724
+ setTimeout(() => this.buildCalendar(), 0);
55725
+ }
55726
+ else {
55727
+ this.destroyCalendar();
55728
+ }
55729
+ }
55730
+ buildCalendar() {
55731
+ const el = this.calRef?.nativeElement;
55732
+ if (!el)
55733
+ return;
55734
+ this.destroyCalendar();
55735
+ const value = this.current;
55736
+ this.calendar = new Calendar(el, {
55737
+ type: 'default',
55738
+ locale: this.locale,
55739
+ selectedTheme: 'light',
55740
+ firstWeekday: this.props.firstWeekday ?? 1,
55741
+ selectionDatesMode: 'single',
55742
+ selectedDates: value ? [value] : [],
55743
+ displayDateMin: (this.props.min ?? undefined),
55744
+ displayDateMax: (this.props.max ?? undefined),
55745
+ onClickDate: self => {
55746
+ const picked = self.context.selectedDates[0] ?? null;
55747
+ if (picked)
55748
+ this.apply(picked);
55749
+ },
55750
+ });
55751
+ this.calendar.init();
55752
+ }
55753
+ destroyCalendar() {
55754
+ if (this.calendar) {
55755
+ this.calendar.destroy();
55756
+ this.calendar = undefined;
55757
+ }
55758
+ }
55759
+ apply(date) {
55760
+ this.setValue(date);
55761
+ this.open = false;
55762
+ this.destroyCalendar();
55763
+ }
55764
+ clear() {
55765
+ this.setValue(null);
55766
+ this.open = false;
55767
+ this.destroyCalendar();
55768
+ }
55769
+ setValue(date) {
55770
+ if (this.props.control) {
55771
+ this.props.control.setValue(date);
55772
+ this.props.control.markAsDirty();
55773
+ this.props.control.markAsTouched();
55774
+ }
55775
+ else {
55776
+ this.props.value = date;
55777
+ }
55778
+ this.valueChange.emit(date);
55779
+ }
55780
+ /** Parsea `YYYY-MM-DD` a Date LOCAL (evita el shift de zona de new Date(str)). */
55781
+ parseLocal(v) {
55782
+ if (!v)
55783
+ return null;
55784
+ const m = /^(\d{4})-(\d{2})-(\d{2})/.exec(v);
55785
+ if (!m) {
55786
+ const d = new Date(v);
55787
+ return isNaN(d.getTime()) ? null : d;
55788
+ }
55789
+ return new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]));
55790
+ }
55791
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
55792
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DatePickerComponent, isStandalone: true, selector: "val-date-picker", inputs: { props: "props" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "calRef", first: true, predicate: ["cal"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
55793
+ <div class="vdp">
55794
+ @if (props.label) {
55795
+ <label class="vdp__label" [attr.for]="triggerId">{{ props.label }}</label>
55796
+ }
55797
+ @if (props.hint) {
55798
+ <p class="vdp__hint">{{ props.hint }}</p>
55799
+ }
55800
+
55801
+ <ion-button
55802
+ [id]="triggerId"
55803
+ class="vdp__trigger"
55804
+ fill="outline"
55805
+ color="medium"
55806
+ expand="block"
55807
+ [class.is-placeholder]="!displayValue"
55808
+ (click)="toggle()"
55809
+ >
55810
+ <ion-icon name="calendar-outline" slot="start" />
55811
+ {{ displayValue || placeholderText }}
55812
+ </ion-button>
55813
+
55814
+ @if (open) {
55815
+ <div class="vdp__panel">
55816
+ <div #cal class="vdp__cal"></div>
55817
+ @if (props.clearable) {
55818
+ <div class="vdp__actions">
55819
+ <ion-button fill="clear" size="small" color="medium" (click)="clear()">
55820
+ {{ t('clear') }}
55821
+ </ion-button>
55822
+ </div>
55823
+ }
55824
+ </div>
55825
+ }
55826
+ </div>
55827
+ `, isInline: true, styles: ["@charset \"UTF-8\";[data-vc=calendar]{border-radius:.75rem;box-sizing:border-box;display:flex;flex-direction:column;min-width:272px;opacity:1;padding:1rem;position:relative;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}[data-vc=calendar] [tabindex=\"0\"]:focus-visible,[data-vc=calendar] button:focus-visible,[data-vc=calendar]:focus-visible{border-radius:.5rem;outline-offset:-1px;outline-style:solid;outline-width:1px}[data-vc=calendar][data-vc-type=multiple] [data-vc=dates]{flex-grow:0}[data-vc=calendar][data-vc-calendar-hidden]{opacity:0;pointer-events:none}[data-vc=calendar][data-vc-calendar-hidden] *{pointer-events:none!important}[data-vc=calendar][data-vc-input]{position:absolute}[data-vc=calendar][data-vc-input][data-vc-position=bottom]{margin-top:.25rem}[data-vc=calendar][data-vc-input][data-vc-position=top]{margin-top:-.25rem}[data-vc=controls]{align-items:center;box-sizing:content-box;display:flex;justify-content:space-between;left:0;padding-left:1rem;padding-right:1rem;padding-top:1.25rem;pointer-events:none;position:absolute;right:0;top:0;z-index:20}[data-vc-arrow]{background-color:transparent;border-width:0;cursor:pointer;display:block;height:1.5rem;pointer-events:auto;position:relative;width:1.5rem}[data-vc-arrow]:before{background-position:50%;background-repeat:no-repeat;height:100%;left:0;position:absolute;top:0;width:100%;--tw-content:\"\";content:var(--tw-content)}[data-vc-arrow=prev]:before{transform:rotate(90deg)}[data-vc-arrow=next]:before{transform:rotate(-90deg)}[data-vc=grid]{display:flex;flex-grow:1;flex-wrap:wrap;gap:1.75rem}[data-vc=grid][data-vc-grid=hidden] [data-vc=column]{opacity:.3;pointer-events:none}[data-vc=grid][data-vc-grid=hidden] [data-vc=column][data-vc-column=month],[data-vc=grid][data-vc-grid=hidden] [data-vc=column][data-vc-column=year]{opacity:1;pointer-events:auto}[data-vc=column]{display:flex;flex-direction:column;flex-grow:1;min-width:240px}[data-vc=header]{align-items:center;display:flex;margin-bottom:.75rem;position:relative}[data-vc-header=content]{align-items:center;display:grid;flex-grow:1;grid-auto-columns:max-content;grid-auto-flow:column;justify-content:center;padding-left:1rem;padding-right:1rem;white-space:pre-wrap}[data-vc=month],[data-vc=year]{background-color:transparent;border-radius:.25rem;border-width:0;cursor:pointer;font-size:1rem;font-weight:700;line-height:1.5rem;padding:.25rem}[data-vc=month]:disabled,[data-vc=year]:disabled{pointer-events:none}[data-vc=content],[data-vc=wrapper]{display:flex;flex-grow:1}[data-vc=content]{flex-direction:column}[data-vc=months]{grid-template-columns:repeat(4,minmax(0,1fr))}[data-vc=months],[data-vc=years]{align-items:center;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;flex-grow:1;row-gap:1rem}[data-vc=years]{grid-template-columns:repeat(5,minmax(0,1fr))}[data-vc-months-month],[data-vc-years-year]{align-items:center;border-radius:.5rem;border-width:0;cursor:pointer;display:flex;font-size:.75rem;font-weight:600;height:2.5rem;justify-content:center;line-height:1rem;padding:.25rem;text-align:center;word-break:break-all}[data-vc-months-month]:disabled,[data-vc-years-year]:disabled{pointer-events:none}[data-vc-week=numbers]{display:flex;flex-direction:column}[data-vc-week-numbers=title]{align-items:center;display:flex;font-size:.75rem;font-weight:700;justify-content:center;line-height:1rem;margin-bottom:.5rem}[data-vc-week-numbers=content]{align-items:center;display:grid;grid-auto-flow:row;justify-items:center;row-gap:.25rem}[data-vc-week-number]{align-items:center;background-color:transparent;border-style:none;cursor:pointer;display:flex;font-size:.75rem;font-weight:600;justify-content:center;line-height:1rem;margin:0;min-height:1.875rem;min-width:1.875rem;padding:0;width:100%}[data-vc=week]{display:grid;grid-template-columns:repeat(7,1fr);justify-items:center;margin-bottom:.5rem}[data-vc-week-day]{align-items:center;background-color:transparent;border-style:none;display:flex;font-size:.75rem;font-weight:700;justify-content:center;line-height:1rem;margin:0;min-width:1.875rem;padding:0;width:100%}button[data-vc-week-day]{cursor:pointer}[data-vc=dates]{align-items:center;display:grid;flex-grow:1;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-rows:auto;justify-items:center;pointer-events:none}[data-vc=dates][data-vc-dates-disabled] [data-vc-date-btn]{cursor:default}[data-vc-dates=row]{align-items:center;display:grid;grid-template-columns:repeat(7,1fr);justify-items:center;width:100%}[data-vc-date]{align-items:center;display:flex;justify-content:center;padding-bottom:.125rem;padding-top:.125rem;pointer-events:auto;position:relative;width:100%}[data-vc-date]:not(:has([data-vc-date-btn])),[data-vc-date][data-vc-date-disabled],[data-vc-date][data-vc-date-disabled] [data-vc-date-btn]{pointer-events:none}[data-vc-date][data-vc-date-hover] [data-vc-date-btn]{border-radius:0}[data-vc-date][data-vc-date-hover=first] [data-vc-date-btn]{border-bottom-left-radius:.5rem;border-bottom-right-radius:0;border-top-left-radius:.5rem;border-top-right-radius:0}[data-vc-date][data-vc-date-hover=last] [data-vc-date-btn]{border-bottom-left-radius:0;border-bottom-right-radius:.5rem;border-top-left-radius:0;border-top-right-radius:.5rem}[data-vc-date][data-vc-date-hover=first-and-last] [data-vc-date-btn]{border-radius:.5rem}[data-vc-date][data-vc-date-hover=first][data-vc-date-selected] [data-vc-date-btn]{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}[data-vc-date][data-vc-date-hover=last][data-vc-date-selected] [data-vc-date-btn]{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}[data-vc-date][data-vc-date-selected=first] [data-vc-date-btn]{border-bottom-left-radius:.5rem;border-bottom-right-radius:0;border-top-left-radius:.5rem;border-top-right-radius:0}[data-vc-date][data-vc-date-selected=last] [data-vc-date-btn]{border-bottom-left-radius:0;border-bottom-right-radius:.5rem;border-top-left-radius:0;border-top-right-radius:.5rem}[data-vc-date][data-vc-date-selected=first-and-last] [data-vc-date-btn]{border-radius:.5rem}[data-vc-date][data-vc-date-selected=middle] [data-vc-date-btn]{border-radius:0}[data-vc-date][data-vc-date-disabled]+[data-vc-date-hover] [data-vc-date-btn],[data-vc-date][data-vc-date-disabled]+[data-vc-date-selected] [data-vc-date-btn]{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}[data-vc-date][data-vc-date-hover]:has(+[data-vc-date-disabled]) [data-vc-date-btn],[data-vc-date][data-vc-date-selected]:has(+[data-vc-date-disabled]) [data-vc-date-btn]{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}[data-vc-date-btn]:focus-visible+[data-vc-date-popup],[data-vc-date-btn]:hover+[data-vc-date-popup],[data-vc-date-popup]:focus-visible,[data-vc-date-popup]:hover{opacity:1;pointer-events:auto}[data-vc-date-btn]{align-items:center;border-radius:.5rem;border-width:0;cursor:pointer;display:flex;font-size:.75rem;font-weight:400;height:100%;justify-content:center;line-height:1rem;min-height:1.875rem;min-width:1.875rem;padding:0;transition-duration:75ms;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);width:100%}[data-vc-date][data-vc-date-today] [data-vc-date-btn]{font-weight:700}[data-vc-date-popup]{max-width:9rem;min-width:5rem;pointer-events:none;position:absolute;z-index:20;--tw-translate-x:-50%;border-radius:.5rem;font-size:.75rem;font-weight:400;line-height:1rem;opacity:0;padding:.25rem .5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:75ms;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}[data-vc-date-popup]:hover{opacity:1;pointer-events:auto}[data-vc-date-range-tooltip]{max-width:9rem;pointer-events:none;position:absolute;z-index:30;--tw-translate-x:-50%;--tw-translate-y:-100%;border-radius:.375rem;font-size:.75rem;font-weight:400;line-height:1rem;padding:.25rem .5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-vc-date-range-tooltip=hidden]{opacity:0}[data-vc-date-range-tooltip=visible]{opacity:1}[data-vc=time]{border-style:solid;border-width:1px 0 0;display:grid;gap:.75rem;grid-template-columns:auto 1fr;margin-top:.75rem;padding-top:.75rem}[data-vc-time=content]{align-items:center;display:grid;grid-auto-flow:column}[data-vc-time-input=hour]{margin-right:.35rem;position:relative;width:1.75rem}[data-vc-time-input=hour]:after{display:block;margin-top:calc(-50% + 1px);position:absolute;right:-5px;top:50%;--tw-content:\":\";content:var(--tw-content)}[data-vc-time-input=minute]{width:1.75rem}[data-vc-time-input=hour] input,[data-vc-time-input=minute] input{border-radius:.25rem;border-width:0;box-sizing:border-box;display:block;font-size:1.125rem;font-weight:600;line-height:1.125rem;margin:0;padding:.125rem;position:relative;text-align:center;width:100%}[data-vc-time-input=hour] input:focus-visible,[data-vc-time-input=minute] input:focus-visible{outline-style:solid;outline-width:1px}[data-vc-time-input=hour] input:disabled,[data-vc-time-input=minute] input:disabled{cursor:default}[data-vc-time-input=hour] input:hover:disabled,[data-vc-time-input=minute] input:hover:disabled,[data-vc-time=keeping]{background-color:transparent}[data-vc-time=keeping]{border-radius:.25rem;border-width:0;cursor:pointer;font-size:.69rem;margin-left:1px;margin-top:.25rem;padding:0;width:22px}[data-vc-time=keeping]:focus-visible{outline-style:solid;outline-width:1px}[data-vc-time=keeping]:disabled{cursor:default}[data-vc-time=keeping]:hover:disabled{background-color:transparent}[data-vc-time=ranges]{display:grid;grid-auto-flow:row}[data-vc-time-range]{font-size:0;position:relative;z-index:10}[data-vc-time-range]:before{content:var(--tw-content);left:0}[data-vc-time-range]:after{content:var(--tw-content);right:0}[data-vc-time-range]:after,[data-vc-time-range]:before{content:\"\";height:.5rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);width:1px;z-index:10}[data-vc-time-range] input{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;height:1.25rem;margin:0;outline-width:0;position:relative;width:100%}[data-vc-time-range] input::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;border-radius:.25rem;border-style:solid;border-width:1px;box-sizing:border-box;cursor:pointer;height:1rem;margin-top:-.5rem;position:relative;width:.75rem;z-index:20;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-time-range] input::-moz-range-thumb{border-radius:.25rem;border-style:solid;border-width:1px;box-sizing:border-box;cursor:pointer;height:1rem;position:relative;width:.75rem;z-index:20;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-time-range] input::-webkit-slider-runnable-track{box-sizing:border-box;cursor:pointer;height:1px;margin-top:1px;width:100%;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-time-range] input::-moz-range-track{box-sizing:border-box;cursor:pointer;height:1px;margin-top:1px;width:100%;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-theme=light].vc{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#0f172a}[data-vc-theme=light].vc[data-vc-input]{--tw-shadow:0 9px 20px rgba(0,0,0,.1);--tw-shadow-colored:0 9px 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-theme=light].vc [tabindex=\"0\"]:focus-visible,[data-vc-theme=light].vc button:focus-visible,[data-vc-theme=light].vc:focus-visible{outline-color:#fdba74}[data-vc-theme=light] .vc-arrow{background-color:transparent}[data-vc-theme=light] .vc-arrow:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iIzBmMTcyYSIgZD0iTTEyIDE2Yy0uMyAwLS41LS4xLS43LS4zbC02LTZjLS40LS40LS40LTEgMC0xLjRzMS0uNCAxLjQgMGw1LjMgNS4zIDUuMy01LjNjLjQtLjQgMS0uNCAxLjQgMHMuNCAxIDAgMS40bC02IDZjLS4yLjItLjQuMy0uNy4zIi8+PC9zdmc+);content:var(--tw-content)}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-arrow:hover:before{content:var(--tw-content);opacity:.6}}[data-vc-theme=light] .vc-header__content,[data-vc-theme=light] .vc-month,[data-vc-theme=light] .vc-year{color:#0f172a}[data-vc-theme=light] .vc-month:disabled,[data-vc-theme=light] .vc-year:disabled{color:#cbd5e1}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-month:hover,[data-vc-theme=light] .vc-year:hover{color:#64748b}}[data-vc-theme=light] .vc-months__month,[data-vc-theme=light] .vc-years__year{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#64748b}[data-vc-theme=light] .vc-months__month:disabled,[data-vc-theme=light] .vc-years__year:disabled{color:#cbd5e1}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-months__month:hover,[data-vc-theme=light] .vc-years__year:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-months__month:hover:disabled,[data-vc-theme=light] .vc-years__year:hover:disabled{color:#cbd5e1}}[data-vc-theme=light] .vc-months__month[data-vc-months-month-selected],[data-vc-theme=light] .vc-years__year[data-vc-years-year-selected]{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-months__month[data-vc-months-month-selected]:hover,[data-vc-theme=light] .vc-years__year[data-vc-years-year-selected]:hover{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=light] .vc-week-number,[data-vc-theme=light] .vc-week-numbers__title{color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-week-number:hover{color:#475569}}[data-vc-theme=light] .vc-week__day{color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] button.vc-week__day:hover{color:#475569}}[data-vc-theme=light] .vc-week__day[data-vc-week-day-off]{color:#f43f5e}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] button.vc-week__day[data-vc-week-day-off]:hover{color:#e11d48}}[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-selected] .vc-date__btn{background-color:rgb(244 63 94/var(--tw-bg-opacity));--tw-bg-opacity:.7;color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-selected] .vc-date__btn:hover{background-color:rgb(244 63 94/var(--tw-bg-opacity));--tw-bg-opacity:.7;color:#fff}}[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:#64748b}}[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-selected] .vc-date__btn{background-color:rgb(6 182 212/var(--tw-bg-opacity));--tw-bg-opacity:.7;color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-selected] .vc-date__btn:hover{background-color:rgb(6 182 212/var(--tw-bg-opacity));--tw-bg-opacity:.7;color:#fff}}[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:#64748b}}[data-vc-theme=light] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#0f172a}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-today] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));color:#06b6d4}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-today] .vc-date__btn:hover{color:#06b6d4}}[data-vc-theme=light] .vc-date[data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-today][data-vc-date-month=prev] .vc-date__btn{color:#64748b}[data-vc-theme=light] .vc-date[data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-month=prev] .vc-date__btn{color:#94a3b8}[data-vc-theme=light] .vc-date[data-vc-date-disabled] .vc-date__btn{color:#cbd5e1}[data-vc-theme=light] .vc-date[data-vc-date-hover] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-date[data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-hover=last] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-hover=last] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-holiday] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend] .vc-date__btn{color:#f43f5e}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover=last] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover=last] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover=last] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover=last] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-disabled] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-disabled] .vc-date__btn{color:#cbd5e1}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-today] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-today] .vc-date__btn{color:#f43f5e}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-disabled] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-disabled] .vc-date__btn{color:#cbd5e1}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#94a3b8}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-month=prev] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-month=prev] .vc-date__btn{color:#94a3b8}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-disabled][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-disabled][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-disabled][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-disabled][data-vc-date-month=prev] .vc-date__btn{color:#cbd5e1}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:#64748b}}[data-vc-theme=light] .vc-date[data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=light] .vc-date[data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:#64748b}}[data-vc-theme=light] .vc-date__popup{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#0f172a;--tw-shadow:0 3px 15px rgba(85,85,85,.2);--tw-shadow-colored:0 3px 15px var(--tw-shadow-color)}[data-vc-theme=light] .vc-date-range-tooltip,[data-vc-theme=light] .vc-date__popup{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-theme=light] .vc-date-range-tooltip{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:#64748b;--tw-shadow:0px 1px 4px rgba(85,85,85,.2);--tw-shadow-colored:0px 1px 4px var(--tw-shadow-color)}[data-vc-theme=light] .vc-time{border-color:#cbd5e1}[data-vc-theme=light] .vc-time__hour:after,[data-vc-theme=light] .vc-time__minute:after{color:#0f172a;content:var(--tw-content)}[data-vc-theme=light] .vc-time__hour input,[data-vc-theme=light] .vc-time__minute input{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#0f172a}[data-vc-theme=light] .vc-time__hour input:focus-visible,[data-vc-theme=light] .vc-time__minute input:focus-visible{outline-color:#fdba74}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-time__hour input:hover,[data-vc-theme=light] .vc-time__minute input:hover{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-time__hour input[data-vc-input-focus],[data-vc-theme=light] .vc-time__minute input[data-vc-input-focus]{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__keeping{color:#64748b}[data-vc-theme=light] .vc-time__keeping:focus-visible{outline-color:#fdba74}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-time__keeping:hover{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-time__range input{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range:after,[data-vc-theme=light] .vc-time__range:before{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range:hover input::-webkit-slider-thumb{border-color:#94a3b8}[data-vc-theme=light] .vc-time__range:hover input::-moz-range-thumb{border-color:#94a3b8}[data-vc-theme=light] .vc-time__range input:focus-visible::-webkit-slider-thumb{border-color:#fdba74}[data-vc-theme=light] .vc-time__range input:focus-visible::-moz-range-thumb{border-color:#fdba74}[data-vc-theme=light] .vc-time__range input::-webkit-slider-thumb{border-color:#cbd5e1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range input::-moz-range-thumb{border-color:#cbd5e1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range input::-webkit-slider-runnable-track{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range input::-moz-range-track{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}[data-vc-theme=dark].vc{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity));color:#fff}[data-vc-theme=dark].vc[data-vc-input]{--tw-shadow:0 9px 20px rgba(0,0,0,.1);--tw-shadow-colored:0 9px 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-theme=dark].vc [tabindex=\"0\"]:focus-visible,[data-vc-theme=dark].vc button:focus-visible,[data-vc-theme=dark].vc:focus-visible{outline-color:#fdba74}[data-vc-theme=dark] .vc-arrow{background-color:transparent}[data-vc-theme=dark] .vc-arrow:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDE2Yy0uMyAwLS41LS4xLS43LS4zbC02LTZjLS40LS40LS40LTEgMC0xLjRzMS0uNCAxLjQgMGw1LjMgNS4zIDUuMy01LjNjLjQtLjQgMS0uNCAxLjQgMHMuNCAxIDAgMS40bC02IDZjLS4yLjItLjQuMy0uNy4zIi8+PC9zdmc+);content:var(--tw-content)}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-arrow:hover:before{content:var(--tw-content);opacity:.6}}[data-vc-theme=dark] .vc-header__content,[data-vc-theme=dark] .vc-month,[data-vc-theme=dark] .vc-year{color:#fff}[data-vc-theme=dark] .vc-month:disabled,[data-vc-theme=dark] .vc-year:disabled{color:#334155;opacity:.8}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-month:hover,[data-vc-theme=dark] .vc-year:hover{color:#64748b}}[data-vc-theme=dark] .vc-months__month,[data-vc-theme=dark] .vc-years__year{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity));color:#fff}[data-vc-theme=dark] .vc-months__month:disabled,[data-vc-theme=dark] .vc-years__year:disabled{color:#334155;opacity:.8}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-months__month:hover,[data-vc-theme=dark] .vc-years__year:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-months__month:hover:disabled,[data-vc-theme=dark] .vc-years__year:hover:disabled{color:#334155}}[data-vc-theme=dark] .vc-months__month[data-vc-months-month-selected],[data-vc-theme=dark] .vc-years__year[data-vc-years-year-selected]{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-months__month[data-vc-months-month-selected]:hover,[data-vc-theme=dark] .vc-years__year[data-vc-years-year-selected]:hover{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=dark] .vc-week-number,[data-vc-theme=dark] .vc-week-numbers__title{color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-week-number:hover{color:#cbd5e1}}[data-vc-theme=dark] .vc-week__day{color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] button.vc-week__day:hover{color:#cbd5e1}}[data-vc-theme=dark] .vc-week__day[data-vc-week-day-off]{color:#f43f5e}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] button.vc-week__day[data-vc-week-day-off]:hover{color:#e11d48}}[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-selected] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-selected] .vc-date__btn{background-color:rgb(244 63 94/var(--tw-bg-opacity));--tw-bg-opacity:.8;color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-selected] .vc-date__btn:hover{background-color:rgb(244 63 94/var(--tw-bg-opacity));--tw-bg-opacity:.8;color:#fff}}[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));color:#cbd5e1}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));color:#cbd5e1}}[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-selected] .vc-date__btn{background-color:rgb(6 182 212/var(--tw-bg-opacity));--tw-bg-opacity:.8;color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-selected] .vc-date__btn:hover{background-color:rgb(6 182 212/var(--tw-bg-opacity));--tw-bg-opacity:.8;color:#fff}}[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));color:#cbd5e1}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));color:#cbd5e1}}[data-vc-theme=dark] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity));color:#94a3b8}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));color:#e2e8f0}}[data-vc-theme=dark] .vc-date[data-vc-date-today] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));color:#06b6d4}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-today] .vc-date__btn:hover{color:#06b6d4}}[data-vc-theme=dark] .vc-date[data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-today][data-vc-date-month=prev] .vc-date__btn{color:#475569}[data-vc-theme=dark] .vc-date[data-vc-date-disabled] .vc-date__btn{color:#334155;opacity:.8}[data-vc-theme=dark] .vc-date[data-vc-date-hover] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-date[data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-hover=last] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-hover=last] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}}[data-vc-theme=dark] .vc-date[data-vc-date-holiday] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend] .vc-date__btn{color:#f43f5e}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-holiday] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-weekend] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-hover] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-hover] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));color:#f43f5e}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-hover=last] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-hover=last] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-hover=last] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-hover=last] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-disabled] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-disabled] .vc-date__btn{color:#334155;opacity:.8}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-today] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-today] .vc-date__btn{color:#f43f5e}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-disabled] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-disabled] .vc-date__btn{color:#334155}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity));color:#475569}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-month=prev] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));color:#cbd5e1}}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-hover][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-hover][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-hover][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-hover][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-month=prev] .vc-date__btn{color:#94a3b8}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-disabled][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-disabled][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-disabled][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-disabled][data-vc-date-month=prev] .vc-date__btn{color:#334155;opacity:.8}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-selected] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity));color:#cbd5e1}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity));color:#cbd5e1}}[data-vc-theme=dark] .vc-date[data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=dark] .vc-date[data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity));color:#cbd5e1}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity));color:#cbd5e1}}[data-vc-theme=dark] .vc-date__popup{color:#fff}[data-vc-theme=dark] .vc-date-range-tooltip,[data-vc-theme=dark] .vc-date__popup{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));--tw-shadow:inset 0 0 0 1px hsla(0,0%,100%,.05);--tw-shadow-colored:inset 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-theme=dark] .vc-date-range-tooltip{color:#94a3b8}[data-vc-theme=dark] .vc-time{border-color:#1e293b}[data-vc-theme=dark] .vc-time__hour:after,[data-vc-theme=dark] .vc-time__minute:after{color:#fff;content:var(--tw-content)}[data-vc-theme=dark] .vc-time__hour input,[data-vc-theme=dark] .vc-time__minute input{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity));color:#fff}[data-vc-theme=dark] .vc-time__hour input:focus-visible,[data-vc-theme=dark] .vc-time__minute input:focus-visible{outline-color:#fdba74}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-time__hour input:hover,[data-vc-theme=dark] .vc-time__minute input:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}}[data-vc-theme=dark] .vc-time__hour input[data-vc-input-focus],[data-vc-theme=dark] .vc-time__minute input[data-vc-input-focus]{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-time__keeping{color:#64748b}[data-vc-theme=dark] .vc-time__keeping:focus-visible{outline-color:#fdba74}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-time__keeping:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity));color:#94a3b8}}[data-vc-theme=dark] .vc-time__range input{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-time__range:after,[data-vc-theme=dark] .vc-time__range:before{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-time__range:hover input::-webkit-slider-thumb{border-color:#94a3b8}[data-vc-theme=dark] .vc-time__range:hover input::-moz-range-thumb{border-color:#94a3b8}[data-vc-theme=dark] .vc-time__range input:focus-visible::-webkit-slider-thumb{border-color:#fdba74}[data-vc-theme=dark] .vc-time__range input:focus-visible::-moz-range-thumb{border-color:#fdba74}[data-vc-theme=dark] .vc-time__range input::-webkit-slider-thumb{border-color:#475569;--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-time__range input::-moz-range-thumb{border-color:#475569;--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-time__range input::-webkit-slider-runnable-track{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-time__range input::-moz-range-track{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}.vdp{display:block;width:100%}.vdp__label{display:block;font-size:.8125rem;font-weight:600;color:var(--ion-color-medium, #6b6675);margin-bottom:4px}.vdp__hint{margin:0 0 8px;font-size:.75rem;color:var(--ion-color-medium, #6b6675)}.vdp__trigger{--border-radius: 12px;--border-color: var(--ion-color-medium, #92949c);text-transform:none;font-weight:600}.vdp__trigger.is-placeholder{--color: var(--ion-color-medium, #92949c)}.vdp__panel{margin-top:10px;border:1px solid var(--ion-color-step-150, #e0e0e0);border-radius:16px;background:#fff;box-shadow:0 12px 32px #0000001f;padding:8px}.vdp__cal{display:flex;justify-content:center}.vdp__actions{display:flex;justify-content:flex-end;border-top:1px solid var(--ion-color-step-100, #eee);margin-top:4px;padding-top:4px}.vdp [data-vc-date-selected] .vc-date__btn,.vdp .vc-date__btn[data-vc-date-selected]{background-color:var(--bingo-magenta, #ff00b2)!important;color:#fff!important}.vdp [data-vc-date-today] .vc-date__btn{box-shadow:inset 0 0 0 1px var(--bingo-magenta, #ff00b2)}.vdp .vc-arrow{color:var(--bingo-magenta, #ff00b2)}.vdp .vc-month,.vdp .vc-year{color:var(--ion-color-dark, #2f2a36);font-weight:700}.vdp .vc{width:100%;max-width:360px}\n/*! Bundled license information:\n\nvanilla-calendar-pro/styles/index.css:\n (*! name: vanilla-calendar-pro v3.1.0 | url: https://github.com/uvarov-frontend/vanilla-calendar-pro *)\n*/\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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }], encapsulation: i0.ViewEncapsulation.None }); }
55828
+ }
55829
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatePickerComponent, decorators: [{
55830
+ type: Component,
55831
+ args: [{ selector: 'val-date-picker', standalone: true, encapsulation: ViewEncapsulation.None, imports: [CommonModule, IonButton, IonIcon], template: `
55832
+ <div class="vdp">
55833
+ @if (props.label) {
55834
+ <label class="vdp__label" [attr.for]="triggerId">{{ props.label }}</label>
55835
+ }
55836
+ @if (props.hint) {
55837
+ <p class="vdp__hint">{{ props.hint }}</p>
55838
+ }
55839
+
55840
+ <ion-button
55841
+ [id]="triggerId"
55842
+ class="vdp__trigger"
55843
+ fill="outline"
55844
+ color="medium"
55845
+ expand="block"
55846
+ [class.is-placeholder]="!displayValue"
55847
+ (click)="toggle()"
55848
+ >
55849
+ <ion-icon name="calendar-outline" slot="start" />
55850
+ {{ displayValue || placeholderText }}
55851
+ </ion-button>
55852
+
55853
+ @if (open) {
55854
+ <div class="vdp__panel">
55855
+ <div #cal class="vdp__cal"></div>
55856
+ @if (props.clearable) {
55857
+ <div class="vdp__actions">
55858
+ <ion-button fill="clear" size="small" color="medium" (click)="clear()">
55859
+ {{ t('clear') }}
55860
+ </ion-button>
55861
+ </div>
55862
+ }
55863
+ </div>
55864
+ }
55865
+ </div>
55866
+ `, styles: ["@charset \"UTF-8\";[data-vc=calendar]{border-radius:.75rem;box-sizing:border-box;display:flex;flex-direction:column;min-width:272px;opacity:1;padding:1rem;position:relative;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}[data-vc=calendar] [tabindex=\"0\"]:focus-visible,[data-vc=calendar] button:focus-visible,[data-vc=calendar]:focus-visible{border-radius:.5rem;outline-offset:-1px;outline-style:solid;outline-width:1px}[data-vc=calendar][data-vc-type=multiple] [data-vc=dates]{flex-grow:0}[data-vc=calendar][data-vc-calendar-hidden]{opacity:0;pointer-events:none}[data-vc=calendar][data-vc-calendar-hidden] *{pointer-events:none!important}[data-vc=calendar][data-vc-input]{position:absolute}[data-vc=calendar][data-vc-input][data-vc-position=bottom]{margin-top:.25rem}[data-vc=calendar][data-vc-input][data-vc-position=top]{margin-top:-.25rem}[data-vc=controls]{align-items:center;box-sizing:content-box;display:flex;justify-content:space-between;left:0;padding-left:1rem;padding-right:1rem;padding-top:1.25rem;pointer-events:none;position:absolute;right:0;top:0;z-index:20}[data-vc-arrow]{background-color:transparent;border-width:0;cursor:pointer;display:block;height:1.5rem;pointer-events:auto;position:relative;width:1.5rem}[data-vc-arrow]:before{background-position:50%;background-repeat:no-repeat;height:100%;left:0;position:absolute;top:0;width:100%;--tw-content:\"\";content:var(--tw-content)}[data-vc-arrow=prev]:before{transform:rotate(90deg)}[data-vc-arrow=next]:before{transform:rotate(-90deg)}[data-vc=grid]{display:flex;flex-grow:1;flex-wrap:wrap;gap:1.75rem}[data-vc=grid][data-vc-grid=hidden] [data-vc=column]{opacity:.3;pointer-events:none}[data-vc=grid][data-vc-grid=hidden] [data-vc=column][data-vc-column=month],[data-vc=grid][data-vc-grid=hidden] [data-vc=column][data-vc-column=year]{opacity:1;pointer-events:auto}[data-vc=column]{display:flex;flex-direction:column;flex-grow:1;min-width:240px}[data-vc=header]{align-items:center;display:flex;margin-bottom:.75rem;position:relative}[data-vc-header=content]{align-items:center;display:grid;flex-grow:1;grid-auto-columns:max-content;grid-auto-flow:column;justify-content:center;padding-left:1rem;padding-right:1rem;white-space:pre-wrap}[data-vc=month],[data-vc=year]{background-color:transparent;border-radius:.25rem;border-width:0;cursor:pointer;font-size:1rem;font-weight:700;line-height:1.5rem;padding:.25rem}[data-vc=month]:disabled,[data-vc=year]:disabled{pointer-events:none}[data-vc=content],[data-vc=wrapper]{display:flex;flex-grow:1}[data-vc=content]{flex-direction:column}[data-vc=months]{grid-template-columns:repeat(4,minmax(0,1fr))}[data-vc=months],[data-vc=years]{align-items:center;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;flex-grow:1;row-gap:1rem}[data-vc=years]{grid-template-columns:repeat(5,minmax(0,1fr))}[data-vc-months-month],[data-vc-years-year]{align-items:center;border-radius:.5rem;border-width:0;cursor:pointer;display:flex;font-size:.75rem;font-weight:600;height:2.5rem;justify-content:center;line-height:1rem;padding:.25rem;text-align:center;word-break:break-all}[data-vc-months-month]:disabled,[data-vc-years-year]:disabled{pointer-events:none}[data-vc-week=numbers]{display:flex;flex-direction:column}[data-vc-week-numbers=title]{align-items:center;display:flex;font-size:.75rem;font-weight:700;justify-content:center;line-height:1rem;margin-bottom:.5rem}[data-vc-week-numbers=content]{align-items:center;display:grid;grid-auto-flow:row;justify-items:center;row-gap:.25rem}[data-vc-week-number]{align-items:center;background-color:transparent;border-style:none;cursor:pointer;display:flex;font-size:.75rem;font-weight:600;justify-content:center;line-height:1rem;margin:0;min-height:1.875rem;min-width:1.875rem;padding:0;width:100%}[data-vc=week]{display:grid;grid-template-columns:repeat(7,1fr);justify-items:center;margin-bottom:.5rem}[data-vc-week-day]{align-items:center;background-color:transparent;border-style:none;display:flex;font-size:.75rem;font-weight:700;justify-content:center;line-height:1rem;margin:0;min-width:1.875rem;padding:0;width:100%}button[data-vc-week-day]{cursor:pointer}[data-vc=dates]{align-items:center;display:grid;flex-grow:1;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-rows:auto;justify-items:center;pointer-events:none}[data-vc=dates][data-vc-dates-disabled] [data-vc-date-btn]{cursor:default}[data-vc-dates=row]{align-items:center;display:grid;grid-template-columns:repeat(7,1fr);justify-items:center;width:100%}[data-vc-date]{align-items:center;display:flex;justify-content:center;padding-bottom:.125rem;padding-top:.125rem;pointer-events:auto;position:relative;width:100%}[data-vc-date]:not(:has([data-vc-date-btn])),[data-vc-date][data-vc-date-disabled],[data-vc-date][data-vc-date-disabled] [data-vc-date-btn]{pointer-events:none}[data-vc-date][data-vc-date-hover] [data-vc-date-btn]{border-radius:0}[data-vc-date][data-vc-date-hover=first] [data-vc-date-btn]{border-bottom-left-radius:.5rem;border-bottom-right-radius:0;border-top-left-radius:.5rem;border-top-right-radius:0}[data-vc-date][data-vc-date-hover=last] [data-vc-date-btn]{border-bottom-left-radius:0;border-bottom-right-radius:.5rem;border-top-left-radius:0;border-top-right-radius:.5rem}[data-vc-date][data-vc-date-hover=first-and-last] [data-vc-date-btn]{border-radius:.5rem}[data-vc-date][data-vc-date-hover=first][data-vc-date-selected] [data-vc-date-btn]{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}[data-vc-date][data-vc-date-hover=last][data-vc-date-selected] [data-vc-date-btn]{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}[data-vc-date][data-vc-date-selected=first] [data-vc-date-btn]{border-bottom-left-radius:.5rem;border-bottom-right-radius:0;border-top-left-radius:.5rem;border-top-right-radius:0}[data-vc-date][data-vc-date-selected=last] [data-vc-date-btn]{border-bottom-left-radius:0;border-bottom-right-radius:.5rem;border-top-left-radius:0;border-top-right-radius:.5rem}[data-vc-date][data-vc-date-selected=first-and-last] [data-vc-date-btn]{border-radius:.5rem}[data-vc-date][data-vc-date-selected=middle] [data-vc-date-btn]{border-radius:0}[data-vc-date][data-vc-date-disabled]+[data-vc-date-hover] [data-vc-date-btn],[data-vc-date][data-vc-date-disabled]+[data-vc-date-selected] [data-vc-date-btn]{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}[data-vc-date][data-vc-date-hover]:has(+[data-vc-date-disabled]) [data-vc-date-btn],[data-vc-date][data-vc-date-selected]:has(+[data-vc-date-disabled]) [data-vc-date-btn]{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}[data-vc-date-btn]:focus-visible+[data-vc-date-popup],[data-vc-date-btn]:hover+[data-vc-date-popup],[data-vc-date-popup]:focus-visible,[data-vc-date-popup]:hover{opacity:1;pointer-events:auto}[data-vc-date-btn]{align-items:center;border-radius:.5rem;border-width:0;cursor:pointer;display:flex;font-size:.75rem;font-weight:400;height:100%;justify-content:center;line-height:1rem;min-height:1.875rem;min-width:1.875rem;padding:0;transition-duration:75ms;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);width:100%}[data-vc-date][data-vc-date-today] [data-vc-date-btn]{font-weight:700}[data-vc-date-popup]{max-width:9rem;min-width:5rem;pointer-events:none;position:absolute;z-index:20;--tw-translate-x:-50%;border-radius:.5rem;font-size:.75rem;font-weight:400;line-height:1rem;opacity:0;padding:.25rem .5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:75ms;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}[data-vc-date-popup]:hover{opacity:1;pointer-events:auto}[data-vc-date-range-tooltip]{max-width:9rem;pointer-events:none;position:absolute;z-index:30;--tw-translate-x:-50%;--tw-translate-y:-100%;border-radius:.375rem;font-size:.75rem;font-weight:400;line-height:1rem;padding:.25rem .5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-vc-date-range-tooltip=hidden]{opacity:0}[data-vc-date-range-tooltip=visible]{opacity:1}[data-vc=time]{border-style:solid;border-width:1px 0 0;display:grid;gap:.75rem;grid-template-columns:auto 1fr;margin-top:.75rem;padding-top:.75rem}[data-vc-time=content]{align-items:center;display:grid;grid-auto-flow:column}[data-vc-time-input=hour]{margin-right:.35rem;position:relative;width:1.75rem}[data-vc-time-input=hour]:after{display:block;margin-top:calc(-50% + 1px);position:absolute;right:-5px;top:50%;--tw-content:\":\";content:var(--tw-content)}[data-vc-time-input=minute]{width:1.75rem}[data-vc-time-input=hour] input,[data-vc-time-input=minute] input{border-radius:.25rem;border-width:0;box-sizing:border-box;display:block;font-size:1.125rem;font-weight:600;line-height:1.125rem;margin:0;padding:.125rem;position:relative;text-align:center;width:100%}[data-vc-time-input=hour] input:focus-visible,[data-vc-time-input=minute] input:focus-visible{outline-style:solid;outline-width:1px}[data-vc-time-input=hour] input:disabled,[data-vc-time-input=minute] input:disabled{cursor:default}[data-vc-time-input=hour] input:hover:disabled,[data-vc-time-input=minute] input:hover:disabled,[data-vc-time=keeping]{background-color:transparent}[data-vc-time=keeping]{border-radius:.25rem;border-width:0;cursor:pointer;font-size:.69rem;margin-left:1px;margin-top:.25rem;padding:0;width:22px}[data-vc-time=keeping]:focus-visible{outline-style:solid;outline-width:1px}[data-vc-time=keeping]:disabled{cursor:default}[data-vc-time=keeping]:hover:disabled{background-color:transparent}[data-vc-time=ranges]{display:grid;grid-auto-flow:row}[data-vc-time-range]{font-size:0;position:relative;z-index:10}[data-vc-time-range]:before{content:var(--tw-content);left:0}[data-vc-time-range]:after{content:var(--tw-content);right:0}[data-vc-time-range]:after,[data-vc-time-range]:before{content:\"\";height:.5rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);width:1px;z-index:10}[data-vc-time-range] input{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;height:1.25rem;margin:0;outline-width:0;position:relative;width:100%}[data-vc-time-range] input::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;border-radius:.25rem;border-style:solid;border-width:1px;box-sizing:border-box;cursor:pointer;height:1rem;margin-top:-.5rem;position:relative;width:.75rem;z-index:20;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-time-range] input::-moz-range-thumb{border-radius:.25rem;border-style:solid;border-width:1px;box-sizing:border-box;cursor:pointer;height:1rem;position:relative;width:.75rem;z-index:20;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-time-range] input::-webkit-slider-runnable-track{box-sizing:border-box;cursor:pointer;height:1px;margin-top:1px;width:100%;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-time-range] input::-moz-range-track{box-sizing:border-box;cursor:pointer;height:1px;margin-top:1px;width:100%;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-theme=light].vc{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#0f172a}[data-vc-theme=light].vc[data-vc-input]{--tw-shadow:0 9px 20px rgba(0,0,0,.1);--tw-shadow-colored:0 9px 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-theme=light].vc [tabindex=\"0\"]:focus-visible,[data-vc-theme=light].vc button:focus-visible,[data-vc-theme=light].vc:focus-visible{outline-color:#fdba74}[data-vc-theme=light] .vc-arrow{background-color:transparent}[data-vc-theme=light] .vc-arrow:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iIzBmMTcyYSIgZD0iTTEyIDE2Yy0uMyAwLS41LS4xLS43LS4zbC02LTZjLS40LS40LS40LTEgMC0xLjRzMS0uNCAxLjQgMGw1LjMgNS4zIDUuMy01LjNjLjQtLjQgMS0uNCAxLjQgMHMuNCAxIDAgMS40bC02IDZjLS4yLjItLjQuMy0uNy4zIi8+PC9zdmc+);content:var(--tw-content)}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-arrow:hover:before{content:var(--tw-content);opacity:.6}}[data-vc-theme=light] .vc-header__content,[data-vc-theme=light] .vc-month,[data-vc-theme=light] .vc-year{color:#0f172a}[data-vc-theme=light] .vc-month:disabled,[data-vc-theme=light] .vc-year:disabled{color:#cbd5e1}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-month:hover,[data-vc-theme=light] .vc-year:hover{color:#64748b}}[data-vc-theme=light] .vc-months__month,[data-vc-theme=light] .vc-years__year{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#64748b}[data-vc-theme=light] .vc-months__month:disabled,[data-vc-theme=light] .vc-years__year:disabled{color:#cbd5e1}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-months__month:hover,[data-vc-theme=light] .vc-years__year:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-months__month:hover:disabled,[data-vc-theme=light] .vc-years__year:hover:disabled{color:#cbd5e1}}[data-vc-theme=light] .vc-months__month[data-vc-months-month-selected],[data-vc-theme=light] .vc-years__year[data-vc-years-year-selected]{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-months__month[data-vc-months-month-selected]:hover,[data-vc-theme=light] .vc-years__year[data-vc-years-year-selected]:hover{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=light] .vc-week-number,[data-vc-theme=light] .vc-week-numbers__title{color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-week-number:hover{color:#475569}}[data-vc-theme=light] .vc-week__day{color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] button.vc-week__day:hover{color:#475569}}[data-vc-theme=light] .vc-week__day[data-vc-week-day-off]{color:#f43f5e}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] button.vc-week__day[data-vc-week-day-off]:hover{color:#e11d48}}[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-selected] .vc-date__btn{background-color:rgb(244 63 94/var(--tw-bg-opacity));--tw-bg-opacity:.7;color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-selected] .vc-date__btn:hover{background-color:rgb(244 63 94/var(--tw-bg-opacity));--tw-bg-opacity:.7;color:#fff}}[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:#64748b}}[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-selected] .vc-date__btn{background-color:rgb(6 182 212/var(--tw-bg-opacity));--tw-bg-opacity:.7;color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-selected] .vc-date__btn:hover{background-color:rgb(6 182 212/var(--tw-bg-opacity));--tw-bg-opacity:.7;color:#fff}}[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:#64748b}}[data-vc-theme=light] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#0f172a}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-today] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));color:#06b6d4}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-today] .vc-date__btn:hover{color:#06b6d4}}[data-vc-theme=light] .vc-date[data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-today][data-vc-date-month=prev] .vc-date__btn{color:#64748b}[data-vc-theme=light] .vc-date[data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-month=prev] .vc-date__btn{color:#94a3b8}[data-vc-theme=light] .vc-date[data-vc-date-disabled] .vc-date__btn{color:#cbd5e1}[data-vc-theme=light] .vc-date[data-vc-date-hover] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-date[data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-hover=last] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-hover=last] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-holiday] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend] .vc-date__btn{color:#f43f5e}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover=last] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover=last] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover=last] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover=last] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-disabled] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-disabled] .vc-date__btn{color:#cbd5e1}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-today] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-today] .vc-date__btn{color:#f43f5e}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-disabled] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-disabled] .vc-date__btn{color:#cbd5e1}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#94a3b8}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-month=prev] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-month=prev] .vc-date__btn{color:#94a3b8}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-disabled][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-disabled][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-disabled][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-disabled][data-vc-date-month=prev] .vc-date__btn{color:#cbd5e1}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:#64748b}}[data-vc-theme=light] .vc-date[data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=light] .vc-date[data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:#64748b}}[data-vc-theme=light] .vc-date__popup{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#0f172a;--tw-shadow:0 3px 15px rgba(85,85,85,.2);--tw-shadow-colored:0 3px 15px var(--tw-shadow-color)}[data-vc-theme=light] .vc-date-range-tooltip,[data-vc-theme=light] .vc-date__popup{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-theme=light] .vc-date-range-tooltip{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:#64748b;--tw-shadow:0px 1px 4px rgba(85,85,85,.2);--tw-shadow-colored:0px 1px 4px var(--tw-shadow-color)}[data-vc-theme=light] .vc-time{border-color:#cbd5e1}[data-vc-theme=light] .vc-time__hour:after,[data-vc-theme=light] .vc-time__minute:after{color:#0f172a;content:var(--tw-content)}[data-vc-theme=light] .vc-time__hour input,[data-vc-theme=light] .vc-time__minute input{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#0f172a}[data-vc-theme=light] .vc-time__hour input:focus-visible,[data-vc-theme=light] .vc-time__minute input:focus-visible{outline-color:#fdba74}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-time__hour input:hover,[data-vc-theme=light] .vc-time__minute input:hover{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-time__hour input[data-vc-input-focus],[data-vc-theme=light] .vc-time__minute input[data-vc-input-focus]{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__keeping{color:#64748b}[data-vc-theme=light] .vc-time__keeping:focus-visible{outline-color:#fdba74}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-time__keeping:hover{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-time__range input{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range:after,[data-vc-theme=light] .vc-time__range:before{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range:hover input::-webkit-slider-thumb{border-color:#94a3b8}[data-vc-theme=light] .vc-time__range:hover input::-moz-range-thumb{border-color:#94a3b8}[data-vc-theme=light] .vc-time__range input:focus-visible::-webkit-slider-thumb{border-color:#fdba74}[data-vc-theme=light] .vc-time__range input:focus-visible::-moz-range-thumb{border-color:#fdba74}[data-vc-theme=light] .vc-time__range input::-webkit-slider-thumb{border-color:#cbd5e1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range input::-moz-range-thumb{border-color:#cbd5e1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range input::-webkit-slider-runnable-track{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range input::-moz-range-track{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}[data-vc-theme=dark].vc{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity));color:#fff}[data-vc-theme=dark].vc[data-vc-input]{--tw-shadow:0 9px 20px rgba(0,0,0,.1);--tw-shadow-colored:0 9px 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-theme=dark].vc [tabindex=\"0\"]:focus-visible,[data-vc-theme=dark].vc button:focus-visible,[data-vc-theme=dark].vc:focus-visible{outline-color:#fdba74}[data-vc-theme=dark] .vc-arrow{background-color:transparent}[data-vc-theme=dark] .vc-arrow:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDE2Yy0uMyAwLS41LS4xLS43LS4zbC02LTZjLS40LS40LS40LTEgMC0xLjRzMS0uNCAxLjQgMGw1LjMgNS4zIDUuMy01LjNjLjQtLjQgMS0uNCAxLjQgMHMuNCAxIDAgMS40bC02IDZjLS4yLjItLjQuMy0uNy4zIi8+PC9zdmc+);content:var(--tw-content)}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-arrow:hover:before{content:var(--tw-content);opacity:.6}}[data-vc-theme=dark] .vc-header__content,[data-vc-theme=dark] .vc-month,[data-vc-theme=dark] .vc-year{color:#fff}[data-vc-theme=dark] .vc-month:disabled,[data-vc-theme=dark] .vc-year:disabled{color:#334155;opacity:.8}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-month:hover,[data-vc-theme=dark] .vc-year:hover{color:#64748b}}[data-vc-theme=dark] .vc-months__month,[data-vc-theme=dark] .vc-years__year{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity));color:#fff}[data-vc-theme=dark] .vc-months__month:disabled,[data-vc-theme=dark] .vc-years__year:disabled{color:#334155;opacity:.8}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-months__month:hover,[data-vc-theme=dark] .vc-years__year:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-months__month:hover:disabled,[data-vc-theme=dark] .vc-years__year:hover:disabled{color:#334155}}[data-vc-theme=dark] .vc-months__month[data-vc-months-month-selected],[data-vc-theme=dark] .vc-years__year[data-vc-years-year-selected]{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-months__month[data-vc-months-month-selected]:hover,[data-vc-theme=dark] .vc-years__year[data-vc-years-year-selected]:hover{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=dark] .vc-week-number,[data-vc-theme=dark] .vc-week-numbers__title{color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-week-number:hover{color:#cbd5e1}}[data-vc-theme=dark] .vc-week__day{color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] button.vc-week__day:hover{color:#cbd5e1}}[data-vc-theme=dark] .vc-week__day[data-vc-week-day-off]{color:#f43f5e}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] button.vc-week__day[data-vc-week-day-off]:hover{color:#e11d48}}[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-selected] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-selected] .vc-date__btn{background-color:rgb(244 63 94/var(--tw-bg-opacity));--tw-bg-opacity:.8;color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-selected] .vc-date__btn:hover{background-color:rgb(244 63 94/var(--tw-bg-opacity));--tw-bg-opacity:.8;color:#fff}}[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));color:#cbd5e1}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));color:#cbd5e1}}[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-selected] .vc-date__btn{background-color:rgb(6 182 212/var(--tw-bg-opacity));--tw-bg-opacity:.8;color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-selected] .vc-date__btn:hover{background-color:rgb(6 182 212/var(--tw-bg-opacity));--tw-bg-opacity:.8;color:#fff}}[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));color:#cbd5e1}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-selected=middle][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));color:#cbd5e1}}[data-vc-theme=dark] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity));color:#94a3b8}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));color:#e2e8f0}}[data-vc-theme=dark] .vc-date[data-vc-date-today] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));color:#06b6d4}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-today] .vc-date__btn:hover{color:#06b6d4}}[data-vc-theme=dark] .vc-date[data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-today][data-vc-date-month=prev] .vc-date__btn{color:#475569}[data-vc-theme=dark] .vc-date[data-vc-date-disabled] .vc-date__btn{color:#334155;opacity:.8}[data-vc-theme=dark] .vc-date[data-vc-date-hover] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-date[data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-hover=last] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-hover=last] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}}[data-vc-theme=dark] .vc-date[data-vc-date-holiday] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend] .vc-date__btn{color:#f43f5e}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-holiday] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-weekend] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-hover] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-hover] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));color:#f43f5e}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-hover=last] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-hover=last] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-hover=last] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-hover=last] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-disabled] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-disabled] .vc-date__btn{color:#334155;opacity:.8}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-today] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-today] .vc-date__btn{color:#f43f5e}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-disabled] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-disabled] .vc-date__btn{color:#334155}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity));color:#475569}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-month=prev] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));color:#cbd5e1}}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-hover][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-hover][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-hover][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-hover][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-month=prev] .vc-date__btn{color:#94a3b8}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-disabled][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-disabled][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-disabled][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-disabled][data-vc-date-month=prev] .vc-date__btn{color:#334155;opacity:.8}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-selected] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity));color:#cbd5e1}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity));color:#cbd5e1}}[data-vc-theme=dark] .vc-date[data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=dark] .vc-date[data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=dark] .vc-date[data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity));color:#cbd5e1}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-date[data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=dark] .vc-date[data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity));color:#cbd5e1}}[data-vc-theme=dark] .vc-date__popup{color:#fff}[data-vc-theme=dark] .vc-date-range-tooltip,[data-vc-theme=dark] .vc-date__popup{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity));--tw-shadow:inset 0 0 0 1px hsla(0,0%,100%,.05);--tw-shadow-colored:inset 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-theme=dark] .vc-date-range-tooltip{color:#94a3b8}[data-vc-theme=dark] .vc-time{border-color:#1e293b}[data-vc-theme=dark] .vc-time__hour:after,[data-vc-theme=dark] .vc-time__minute:after{color:#fff;content:var(--tw-content)}[data-vc-theme=dark] .vc-time__hour input,[data-vc-theme=dark] .vc-time__minute input{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity));color:#fff}[data-vc-theme=dark] .vc-time__hour input:focus-visible,[data-vc-theme=dark] .vc-time__minute input:focus-visible{outline-color:#fdba74}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-time__hour input:hover,[data-vc-theme=dark] .vc-time__minute input:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}}[data-vc-theme=dark] .vc-time__hour input[data-vc-input-focus],[data-vc-theme=dark] .vc-time__minute input[data-vc-input-focus]{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-time__keeping{color:#64748b}[data-vc-theme=dark] .vc-time__keeping:focus-visible{outline-color:#fdba74}@media (hover:hover) and (pointer:fine){[data-vc-theme=dark] .vc-time__keeping:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity));color:#94a3b8}}[data-vc-theme=dark] .vc-time__range input{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-time__range:after,[data-vc-theme=dark] .vc-time__range:before{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-time__range:hover input::-webkit-slider-thumb{border-color:#94a3b8}[data-vc-theme=dark] .vc-time__range:hover input::-moz-range-thumb{border-color:#94a3b8}[data-vc-theme=dark] .vc-time__range input:focus-visible::-webkit-slider-thumb{border-color:#fdba74}[data-vc-theme=dark] .vc-time__range input:focus-visible::-moz-range-thumb{border-color:#fdba74}[data-vc-theme=dark] .vc-time__range input::-webkit-slider-thumb{border-color:#475569;--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-time__range input::-moz-range-thumb{border-color:#475569;--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-time__range input::-webkit-slider-runnable-track{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}[data-vc-theme=dark] .vc-time__range input::-moz-range-track{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}.vdp{display:block;width:100%}.vdp__label{display:block;font-size:.8125rem;font-weight:600;color:var(--ion-color-medium, #6b6675);margin-bottom:4px}.vdp__hint{margin:0 0 8px;font-size:.75rem;color:var(--ion-color-medium, #6b6675)}.vdp__trigger{--border-radius: 12px;--border-color: var(--ion-color-medium, #92949c);text-transform:none;font-weight:600}.vdp__trigger.is-placeholder{--color: var(--ion-color-medium, #92949c)}.vdp__panel{margin-top:10px;border:1px solid var(--ion-color-step-150, #e0e0e0);border-radius:16px;background:#fff;box-shadow:0 12px 32px #0000001f;padding:8px}.vdp__cal{display:flex;justify-content:center}.vdp__actions{display:flex;justify-content:flex-end;border-top:1px solid var(--ion-color-step-100, #eee);margin-top:4px;padding-top:4px}.vdp [data-vc-date-selected] .vc-date__btn,.vdp .vc-date__btn[data-vc-date-selected]{background-color:var(--bingo-magenta, #ff00b2)!important;color:#fff!important}.vdp [data-vc-date-today] .vc-date__btn{box-shadow:inset 0 0 0 1px var(--bingo-magenta, #ff00b2)}.vdp .vc-arrow{color:var(--bingo-magenta, #ff00b2)}.vdp .vc-month,.vdp .vc-year{color:var(--ion-color-dark, #2f2a36);font-weight:700}.vdp .vc{width:100%;max-width:360px}\n/*! Bundled license information:\n\nvanilla-calendar-pro/styles/index.css:\n (*! name: vanilla-calendar-pro v3.1.0 | url: https://github.com/uvarov-frontend/vanilla-calendar-pro *)\n*/\n"] }]
55867
+ }], ctorParameters: () => [], propDecorators: { props: [{
55868
+ type: Input
55869
+ }], valueChange: [{
55870
+ type: Output
55871
+ }], calRef: [{
55872
+ type: ViewChild,
55873
+ args: ['cal']
55874
+ }] } });
55875
+
55302
55876
  const DEFAULT_NAMESPACE = 'Settings.ApiKeysModal';
55303
55877
  /**
55304
55878
  * `val-api-keys-modal` — gestión de Client API Keys org-scopeadas (ADR-023 fase 6).
@@ -56590,7 +57164,7 @@ class PageContentComponent {
56590
57164
  if (!bg) {
56591
57165
  return 'var(--ion-background-color)';
56592
57166
  }
56593
- return resolveColor$1(bg);
57167
+ return resolveColor(bg);
56594
57168
  }
56595
57169
  /**
56596
57170
  * Handles header action clicks.
@@ -56894,7 +57468,7 @@ class PageWrapperComponent {
56894
57468
  if (!bg) {
56895
57469
  return 'var(--ion-background-color)';
56896
57470
  }
56897
- return resolveColor$1(bg);
57471
+ return resolveColor(bg);
56898
57472
  });
56899
57473
  }
56900
57474
  /**
@@ -64835,7 +65409,12 @@ class RequestFormBuilderService {
64835
65409
  return {
64836
65410
  name: formName,
64837
65411
  sections: [section],
64838
- actions: SolidDefaultBlock(this.i18n.t(submitLabelKey, i18nNamespace), 'submit'),
65412
+ actions: button({
65413
+ text: this.i18n.t(submitLabelKey, i18nNamespace),
65414
+ type: 'submit',
65415
+ fill: 'solid',
65416
+ expand: 'block',
65417
+ }),
64839
65418
  state,
64840
65419
  };
64841
65420
  }
@@ -65108,138 +65687,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
65108
65687
  type: Output
65109
65688
  }] } });
65110
65689
 
65111
- /**
65112
- * Default values for InfoCardMetadata.
65113
- */
65114
- const INFO_CARD_DEFAULTS = {
65115
- iconColor: 'primary',
65116
- bordered: true,
65117
- shadowed: false,
65118
- padding: '1.5rem',
65119
- borderRadius: '16px',
65120
- };
65121
-
65122
- const IONIC_COLORS$2 = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];
65123
- /**
65124
- * val-info-card
65125
- *
65126
- * Card with icon + overtitle + title + subtitle on the left side, and a list
65127
- * of key-value pairs (label: value) on the right side. Inspired by npm's
65128
- * "Provenance" / metadata panel style.
65129
- *
65130
- * Two-column layout on desktop, stacked single-column on mobile.
65131
- *
65132
- * Presentational — pass already-resolved strings.
65133
- *
65134
- * @example
65135
- * ```html
65136
- * <val-info-card
65137
- * [props]="{
65138
- * icon: 'cube-outline',
65139
- * title: 'valtech-components',
65140
- * subtitle: 'v2.0.962',
65141
- * keyValues: [
65142
- * { label: 'License', value: 'MIT' },
65143
- * { label: 'Downloads', value: '1.2M' }
65144
- * ]
65145
- * }"
65146
- * />
65147
- * ```
65148
- */
65149
- class InfoCardComponent {
65150
- constructor() {
65151
- /** Component configuration */
65152
- this.props = input({});
65153
- /** Merged configuration with defaults */
65154
- this.config = computed(() => ({
65155
- ...INFO_CARD_DEFAULTS,
65156
- ...this.props(),
65157
- }));
65158
- }
65159
- getIconColor() {
65160
- const color = this.config().iconColor;
65161
- if (!color)
65162
- return `var(--ion-color-primary)`;
65163
- return IONIC_COLORS$2.includes(color) ? `var(--ion-color-${color})` : color;
65164
- }
65165
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InfoCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
65166
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: InfoCardComponent, isStandalone: true, selector: "val-info-card", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
65167
- <div
65168
- class="info-card"
65169
- [class.info-card--bordered]="config().bordered"
65170
- [class.info-card--shadowed]="config().shadowed"
65171
- [style.padding]="config().padding"
65172
- [style.border-radius]="config().borderRadius"
65173
- >
65174
- <div class="info-card__left">
65175
- @if (config().icon) {
65176
- <ion-icon class="info-card__icon" [name]="config().icon" [style.color]="getIconColor()"></ion-icon>
65177
- }
65178
-
65179
- @if (config().overtitle) {
65180
- <span class="info-card__overtitle">{{ config().overtitle }}</span>
65181
- }
65182
-
65183
- <h3 class="info-card__title">{{ config().title }}</h3>
65184
-
65185
- @if (config().subtitle) {
65186
- <p class="info-card__subtitle">{{ config().subtitle }}</p>
65187
- }
65188
- </div>
65189
-
65190
- @if (config().keyValues?.length) {
65191
- <div class="info-card__right">
65192
- @for (kv of config().keyValues; track $index) {
65193
- <div class="info-card__kv">
65194
- <span class="info-card__kv-label">{{ kv.label }}</span>
65195
- <span class="info-card__kv-value">{{ kv.value }}</span>
65196
- </div>
65197
- }
65198
- </div>
65199
- }
65200
- </div>
65201
- `, isInline: true, styles: [":host{display:block}.info-card{display:flex;flex-direction:row;gap:2rem;background:var(--ion-card-background, var(--ion-background-color))}.info-card--bordered{border:1px solid var(--ion-color-light-shade, rgba(0, 0, 0, .1))}.info-card--shadowed{box-shadow:0 2px 8px #00000014}.info-card__left{display:flex;flex-direction:column;gap:.35rem;flex:1 1 0;min-width:0}.info-card__icon{font-size:2rem;margin-bottom:.25rem}.info-card__overtitle{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--ion-color-medium)}.info-card__title{margin:0;font-size:1.25rem;font-weight:700;color:var(--ion-text-color);line-height:1.3}.info-card__subtitle{margin:0;font-size:.875rem;color:var(--ion-color-medium-shade)}.info-card__right{display:flex;flex-direction:column;gap:.6rem;flex:0 0 auto;min-width:160px;max-width:260px}.info-card__kv{display:flex;flex-direction:column;gap:.1rem}.info-card__kv-label{font-size:.75rem;color:var(--ion-color-medium)}.info-card__kv-value{font-size:.9rem;font-weight:600;color:var(--ion-text-color);word-break:break-word}@media (max-width: 600px){.info-card{flex-direction:column;gap:1.25rem}.info-card__right{max-width:100%;flex-direction:row;flex-wrap:wrap;gap:.75rem 1.5rem}.info-card__kv{flex:0 0 auto}}:host-context(body.dark) .info-card--bordered,:host-context(html.ion-palette-dark) .info-card--bordered,:host-context([data-theme=dark]) .info-card--bordered{border-color:#ffffff1f}:host-context(body.dark) .info-card--shadowed,:host-context(html.ion-palette-dark) .info-card--shadowed,:host-context([data-theme=dark]) .info-card--shadowed{box-shadow:0 2px 8px #0000004d}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
65202
- }
65203
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InfoCardComponent, decorators: [{
65204
- type: Component,
65205
- args: [{ selector: 'val-info-card', standalone: true, imports: [CommonModule, IonIcon], template: `
65206
- <div
65207
- class="info-card"
65208
- [class.info-card--bordered]="config().bordered"
65209
- [class.info-card--shadowed]="config().shadowed"
65210
- [style.padding]="config().padding"
65211
- [style.border-radius]="config().borderRadius"
65212
- >
65213
- <div class="info-card__left">
65214
- @if (config().icon) {
65215
- <ion-icon class="info-card__icon" [name]="config().icon" [style.color]="getIconColor()"></ion-icon>
65216
- }
65217
-
65218
- @if (config().overtitle) {
65219
- <span class="info-card__overtitle">{{ config().overtitle }}</span>
65220
- }
65221
-
65222
- <h3 class="info-card__title">{{ config().title }}</h3>
65223
-
65224
- @if (config().subtitle) {
65225
- <p class="info-card__subtitle">{{ config().subtitle }}</p>
65226
- }
65227
- </div>
65228
-
65229
- @if (config().keyValues?.length) {
65230
- <div class="info-card__right">
65231
- @for (kv of config().keyValues; track $index) {
65232
- <div class="info-card__kv">
65233
- <span class="info-card__kv-label">{{ kv.label }}</span>
65234
- <span class="info-card__kv-value">{{ kv.value }}</span>
65235
- </div>
65236
- }
65237
- </div>
65238
- }
65239
- </div>
65240
- `, styles: [":host{display:block}.info-card{display:flex;flex-direction:row;gap:2rem;background:var(--ion-card-background, var(--ion-background-color))}.info-card--bordered{border:1px solid var(--ion-color-light-shade, rgba(0, 0, 0, .1))}.info-card--shadowed{box-shadow:0 2px 8px #00000014}.info-card__left{display:flex;flex-direction:column;gap:.35rem;flex:1 1 0;min-width:0}.info-card__icon{font-size:2rem;margin-bottom:.25rem}.info-card__overtitle{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--ion-color-medium)}.info-card__title{margin:0;font-size:1.25rem;font-weight:700;color:var(--ion-text-color);line-height:1.3}.info-card__subtitle{margin:0;font-size:.875rem;color:var(--ion-color-medium-shade)}.info-card__right{display:flex;flex-direction:column;gap:.6rem;flex:0 0 auto;min-width:160px;max-width:260px}.info-card__kv{display:flex;flex-direction:column;gap:.1rem}.info-card__kv-label{font-size:.75rem;color:var(--ion-color-medium)}.info-card__kv-value{font-size:.9rem;font-weight:600;color:var(--ion-text-color);word-break:break-word}@media (max-width: 600px){.info-card{flex-direction:column;gap:1.25rem}.info-card__right{max-width:100%;flex-direction:row;flex-wrap:wrap;gap:.75rem 1.5rem}.info-card__kv{flex:0 0 auto}}:host-context(body.dark) .info-card--bordered,:host-context(html.ion-palette-dark) .info-card--bordered,:host-context([data-theme=dark]) .info-card--bordered{border-color:#ffffff1f}:host-context(body.dark) .info-card--shadowed,:host-context(html.ion-palette-dark) .info-card--shadowed,:host-context([data-theme=dark]) .info-card--shadowed{box-shadow:0 2px 8px #0000004d}\n"] }]
65241
- }] });
65242
-
65243
65690
  /**
65244
65691
  * Default values for MetricCardMetadata.
65245
65692
  */
@@ -65389,99 +65836,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
65389
65836
  type: Output
65390
65837
  }] } });
65391
65838
 
65392
- /**
65393
- * Default values for ContentCardMetadata.
65394
- */
65395
- const CONTENT_CARD_DEFAULTS = {
65396
- padding: '1.5rem',
65397
- borderRadius: '20px',
65398
- bordered: false,
65399
- shadowed: true,
65400
- align: 'start',
65401
- };
65402
-
65403
- const IONIC_COLORS$1 = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];
65404
- function resolveColor(value) {
65405
- if (!value)
65406
- return undefined;
65407
- return IONIC_COLORS$1.includes(value) ? `var(--ion-color-${value})` : value;
65408
- }
65409
- /**
65410
- * val-content-card
65411
- *
65412
- * Generic container card with configurable padding, border radius, background
65413
- * color and shadow. Accepts arbitrary content via ng-content. Use it to wrap
65414
- * val-article, stats, or any other content that needs a card shell.
65415
- *
65416
- * @example
65417
- * ```html
65418
- * <val-content-card [props]="{ title: 'Summary', shadowed: true }">
65419
- * <p>Any inner content here.</p>
65420
- * </val-content-card>
65421
- * ```
65422
- */
65423
- class ContentCardComponent {
65424
- constructor() {
65425
- /** Component configuration */
65426
- this.props = input({});
65427
- /** Merged configuration with defaults */
65428
- this.config = computed(() => ({
65429
- ...CONTENT_CARD_DEFAULTS,
65430
- ...this.props(),
65431
- }));
65432
- this.resolvedBg = computed(() => resolveColor(this.config().backgroundColor));
65433
- this.resolvedColor = computed(() => resolveColor(this.config().color));
65434
- }
65435
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContentCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
65436
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ContentCardComponent, isStandalone: true, selector: "val-content-card", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
65437
- <div
65438
- class="content-card"
65439
- [class.content-card--bordered]="config().bordered"
65440
- [class.content-card--shadowed]="config().shadowed"
65441
- [class.content-card--center]="config().align === 'center'"
65442
- [style.padding]="config().padding"
65443
- [style.border-radius]="config().borderRadius"
65444
- [style.background-color]="resolvedBg()"
65445
- [style.color]="resolvedColor()"
65446
- >
65447
- @if (config().title) {
65448
- <h3 class="content-card__title">{{ config().title }}</h3>
65449
- }
65450
-
65451
- @if (config().description) {
65452
- <p class="content-card__description">{{ config().description }}</p>
65453
- }
65454
-
65455
- <ng-content></ng-content>
65456
- </div>
65457
- `, isInline: true, styles: [":host{display:block}.content-card{background:var(--ion-card-background, var(--ion-background-color))}.content-card--bordered{border:1px solid var(--ion-color-light-shade, rgba(0, 0, 0, .1))}.content-card--shadowed{box-shadow:0 4px 16px #00000014}.content-card--center{text-align:center}.content-card__title{margin:0 0 .5rem;font-size:1.1rem;font-weight:700;color:inherit;line-height:1.3}.content-card__description{margin:0 0 1rem;font-size:.875rem;color:var(--ion-color-medium-shade);line-height:1.5}:host-context(body.dark) .content-card--bordered,:host-context(html.ion-palette-dark) .content-card--bordered,:host-context([data-theme=dark]) .content-card--bordered{border-color:#ffffff1f}:host-context(body.dark) .content-card--shadowed,:host-context(html.ion-palette-dark) .content-card--shadowed,:host-context([data-theme=dark]) .content-card--shadowed{box-shadow:0 4px 16px #0000004d}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
65458
- }
65459
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContentCardComponent, decorators: [{
65460
- type: Component,
65461
- args: [{ selector: 'val-content-card', standalone: true, imports: [CommonModule], template: `
65462
- <div
65463
- class="content-card"
65464
- [class.content-card--bordered]="config().bordered"
65465
- [class.content-card--shadowed]="config().shadowed"
65466
- [class.content-card--center]="config().align === 'center'"
65467
- [style.padding]="config().padding"
65468
- [style.border-radius]="config().borderRadius"
65469
- [style.background-color]="resolvedBg()"
65470
- [style.color]="resolvedColor()"
65471
- >
65472
- @if (config().title) {
65473
- <h3 class="content-card__title">{{ config().title }}</h3>
65474
- }
65475
-
65476
- @if (config().description) {
65477
- <p class="content-card__description">{{ config().description }}</p>
65478
- }
65479
-
65480
- <ng-content></ng-content>
65481
- </div>
65482
- `, styles: [":host{display:block}.content-card{background:var(--ion-card-background, var(--ion-background-color))}.content-card--bordered{border:1px solid var(--ion-color-light-shade, rgba(0, 0, 0, .1))}.content-card--shadowed{box-shadow:0 4px 16px #00000014}.content-card--center{text-align:center}.content-card__title{margin:0 0 .5rem;font-size:1.1rem;font-weight:700;color:inherit;line-height:1.3}.content-card__description{margin:0 0 1rem;font-size:.875rem;color:var(--ion-color-medium-shade);line-height:1.5}:host-context(body.dark) .content-card--bordered,:host-context(html.ion-palette-dark) .content-card--bordered,:host-context([data-theme=dark]) .content-card--bordered{border-color:#ffffff1f}:host-context(body.dark) .content-card--shadowed,:host-context(html.ion-palette-dark) .content-card--shadowed,:host-context([data-theme=dark]) .content-card--shadowed{box-shadow:0 4px 16px #0000004d}\n"] }]
65483
- }] });
65484
-
65485
65839
  /**
65486
65840
  * Default values for AuthCtaMetadata.
65487
65841
  */
@@ -66200,5 +66554,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
66200
66554
  * Generated bundle index. Do not edit.
66201
66555
  */
66202
66556
 
66203
- 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, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CONTENT_CARD_DEFAULTS, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentCardComponent, 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_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_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EditOrgModalComponent, EmailInputComponent, 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, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INFO_CARD_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoCardComponent, 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, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, 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, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, 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, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SessionListModalComponent, SessionService, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, 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, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createPermissionLabeler, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, 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$1 as resolveColor, resolveInputDefaultValue, resolveWebBaseUrl, roleGuard, storagePaths, superAdminGuard, toArticle };
66557
+ 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 };
66204
66558
  //# sourceMappingURL=valtech-components.mjs.map