design-angular-kit 1.2.2 → 1.3.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 (39) hide show
  1. package/assets/i18n/en.json +89 -0
  2. package/assets/i18n/it.json +89 -0
  3. package/esm2022/lib/abstracts/abstract-form.component.mjs +19 -6
  4. package/esm2022/lib/components/core/carousel/carousel/carousel.component.mjs +8 -6
  5. package/esm2022/lib/components/core/video-player/video-player-i18n.model.mjs +2 -0
  6. package/esm2022/lib/components/core/video-player/video-player-i18n.service.mjs +130 -0
  7. package/esm2022/lib/components/core/video-player/video-player.component.mjs +303 -0
  8. package/esm2022/lib/components/core/video-player/video-player.config.mjs +43 -0
  9. package/esm2022/lib/components/core/video-player/video-player.cookie.mjs +25 -0
  10. package/esm2022/lib/components/core/video-player/video-player.model.mjs +3 -0
  11. package/esm2022/lib/components/core/video-player/video-player.module.mjs +16 -0
  12. package/esm2022/lib/components/form/autocomplete/autocomplete.component.mjs +144 -78
  13. package/esm2022/lib/components/form/form.module.mjs +6 -2
  14. package/esm2022/lib/components/form/input/input.component.mjs +3 -3
  15. package/esm2022/lib/components/form/search/search.component.mjs +112 -0
  16. package/esm2022/lib/components/navigation/navscroll/navscroll-list-item.component.mjs +2 -3
  17. package/esm2022/lib/design-angular-kit.module.mjs +8 -4
  18. package/esm2022/lib/interfaces/form.mjs +1 -1
  19. package/esm2022/lib/validators/it-validators.mjs +6 -1
  20. package/esm2022/public_api.mjs +7 -3
  21. package/fesm2022/design-angular-kit.mjs +782 -90
  22. package/fesm2022/design-angular-kit.mjs.map +1 -1
  23. package/lib/abstracts/abstract-form.component.d.ts +6 -4
  24. package/lib/components/core/carousel/carousel/carousel.component.d.ts +1 -1
  25. package/lib/components/core/video-player/video-player-i18n.model.d.ts +179 -0
  26. package/lib/components/core/video-player/video-player-i18n.service.d.ts +17 -0
  27. package/lib/components/core/video-player/video-player.component.d.ts +48 -0
  28. package/lib/components/core/video-player/video-player.config.d.ts +68 -0
  29. package/lib/components/core/video-player/video-player.cookie.d.ts +6 -0
  30. package/lib/components/core/video-player/video-player.model.d.ts +44 -0
  31. package/lib/components/core/video-player/video-player.module.d.ts +7 -0
  32. package/lib/components/form/autocomplete/autocomplete.component.d.ts +55 -39
  33. package/lib/components/form/form.module.d.ts +13 -12
  34. package/lib/components/form/search/search.component.d.ts +59 -0
  35. package/lib/design-angular-kit.module.d.ts +18 -17
  36. package/lib/interfaces/form.d.ts +3 -3
  37. package/lib/validators/it-validators.d.ts +1 -0
  38. package/package.json +20 -7
  39. package/public_api.d.ts +6 -2
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, Renderer2, ElementRef, ChangeDetectorRef, EventEmitter, Component, Input, Output, booleanAttribute, ChangeDetectionStrategy, ViewChild, InjectionToken, TemplateRef, HostBinding, ContentChildren, NgModule, Directive, Optional, Host, Inject, HostListener, Injectable, Self, ViewChildren, ViewEncapsulation, Pipe, HostAttributeToken, DestroyRef, APP_INITIALIZER, importProvidersFrom, makeEnvironmentProviders } from '@angular/core';
3
- import { Collapse, Alert, Dropdown, CarouselBI, Modal, Notification, Popover, Tab, Tooltip, InputPassword, ProgressDonut, BackToTop, NavBarCollapsible, HeaderSticky, loadFonts } from 'bootstrap-italia';
3
+ import { Collapse, Alert, Dropdown, Carousel, Modal, Notification, Popover, Tab, Tooltip, InputPassword, ProgressDonut, SelectAutocomplete, BackToTop, NavBarCollapsible, HeaderSticky, loadFonts } from 'bootstrap-italia';
4
4
  import * as i1 from '@ngx-translate/core';
5
5
  import { TranslateModule, TranslatePipe, TranslateLoader, TranslateService } from '@ngx-translate/core';
6
6
  import * as i1$3 from '@angular/common';
@@ -10,12 +10,14 @@ import { RouterLink, RouterLinkActive, Router, NavigationEnd, Scroll, RouterLink
10
10
  import { startWith, Subject, filter, debounceTime, distinctUntilChanged, tap, switchMap, of, merge, map, Observable, take, forkJoin, BehaviorSubject, shareReplay, combineLatest, skip, AsyncSubject, withLatestFrom, delay, timer, takeWhile } from 'rxjs';
11
11
  import { trigger, transition, style, animate } from '@angular/animations';
12
12
  import * as i1$1 from '@angular/forms';
13
- import { FormControl, Validators, ReactiveFormsModule, NgModel, FormControlName } from '@angular/forms';
13
+ import { FormControl, FormGroup, Validators, ReactiveFormsModule, NgModel, FormControlName } from '@angular/forms';
14
14
  import * as i1$2 from '@angular/platform-browser';
15
15
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
16
16
  import { provideHttpClient, HttpClient } from '@angular/common/http';
17
17
  import { provideAnimationsAsync } from '@angular/platform-browser/animations/async';
18
18
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
19
+ import videojs from 'video.js';
20
+ import { initYoutubePlugin } from 'bootstrap-italia/dist/plugins/util/youtube-video.js';
19
21
  import { map as map$1 } from 'rxjs/operators';
20
22
 
21
23
  class ItAbstractComponent {
@@ -1117,7 +1119,6 @@ class ItCarouselComponent {
1117
1119
  this.trackClass = '';
1118
1120
  }
1119
1121
  ngAfterViewInit() {
1120
- this.carousel = CarouselBI.getOrCreateInstance(this.carouselDiv.nativeElement);
1121
1122
  this.items?.changes
1122
1123
  .pipe(
1123
1124
  // When carousel items changes (dynamic add/remove)
@@ -1129,22 +1130,25 @@ class ItCarouselComponent {
1129
1130
  }));
1130
1131
  this._changeDetectorRef.detectChanges(); // Force update html render
1131
1132
  });
1133
+ setTimeout(() => {
1134
+ this.carousel = Carousel.getOrCreateInstance(this.carouselDiv.nativeElement);
1135
+ }, 100);
1132
1136
  }
1133
1137
  ngOnDestroy() {
1134
1138
  this.itemSubscriptions?.forEach(item => item.unsubscribe());
1135
1139
  }
1136
1140
  /**
1137
- * Removes CarouselBI features
1141
+ * Removes Carousel features
1138
1142
  */
1139
1143
  dispose() {
1140
1144
  this.carousel?.dispose();
1141
1145
  }
1142
1146
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItCarouselComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
1143
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItCarouselComponent, isStandalone: true, selector: "it-carousel", inputs: { title: "title", type: "type", trackClass: "trackClass", fullCarousel: ["fullCarousel", "fullCarousel", inputToBoolean], bigImg: ["bigImg", "bigImg", inputToBoolean], standardImage: ["standardImage", "standardImage", inputToBoolean], lined: ["lined", "lined", inputToBoolean] }, queries: [{ propertyName: "items", predicate: ItCarouselItemComponent }], viewQueries: [{ propertyName: "carouselDiv", first: true, predicate: ["carousel"], descendants: true }], exportAs: ["itCarousel"], ngImport: i0, template: "<div\n #carousel\n class=\"it-carousel-wrapper splide {{ typeClass }}\"\n [class.it-full-carousel]=\"fullCarousel\"\n [class.it-big-img]=\"bigImg\"\n [class.it-standard-image]=\"standardImage\"\n data-bs-carousel-splide>\n @if (title) {\n <div class=\"it-header-block\">\n <div class=\"it-header-block-title\">\n <h2>{{ title }}</h2>\n </div>\n </div>\n }\n\n <div class=\"splide__track {{ trackClass }}\">\n @if (items) {\n <ul class=\"splide__list\">\n @for (item of items; track item) {\n <li class=\"splide__slide\" [class.lined_slide]=\"lined\">\n <div class=\"it-single-slide-wrapper\">\n <ng-container *ngTemplateOutlet=\"item.htmlContent\"></ng-container>\n </div>\n </li>\n }\n </ul>\n }\n </div>\n</div>\n", styles: [".splide__container{box-sizing:border-box;position:relative}.splide__list{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:-ms-flexbox;display:flex;height:100%;margin:0!important;padding:0!important;transform-style:preserve-3d}.splide.is-initialized:not(.is-active) .splide__list{display:block}.splide__pagination{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;justify-content:center;margin:0;pointer-events:none}.splide__pagination li{display:inline-block;line-height:1;list-style-type:none;margin:0;pointer-events:auto}.splide__progress__bar{width:0}.splide{outline:none;position:relative;visibility:hidden}.splide.is-initialized,.splide.is-rendered{visibility:visible}.splide__slide{-webkit-backface-visibility:hidden;backface-visibility:hidden;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0;list-style-type:none!important;margin:0;outline:none;position:relative}.splide__slide img{vertical-align:bottom}.splide__slider{position:relative}.splide__spinner{animation:splide-loading 1s linear infinite;border:2px solid #999;border-left-color:transparent;border-radius:50%;contain:strict;display:inline-block;height:20px;inset:0;margin:auto;position:absolute;width:20px}.splide__track{overflow:hidden;position:relative;z-index:0}@keyframes splide-loading{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.splide--draggable>.splide__slider>.splide__track,.splide--draggable>.splide__track{-webkit-user-select:none;-ms-user-select:none;user-select:none}.splide--fade>.splide__slider>.splide__track>.splide__list,.splide--fade>.splide__track>.splide__list{display:block}.splide--fade>.splide__slider>.splide__track>.splide__list>.splide__slide,.splide--fade>.splide__track>.splide__list>.splide__slide{left:0;opacity:0;position:absolute;top:0;z-index:0}.splide--fade>.splide__slider>.splide__track>.splide__list>.splide__slide.is-active,.splide--fade>.splide__track>.splide__list>.splide__slide.is-active{opacity:1;position:relative;z-index:1}.splide--rtl{direction:rtl}.splide--ttb.is-active>.splide__slider>.splide__track>.splide__list,.splide--ttb.is-active>.splide__track>.splide__list{display:block}.splide__arrow{-ms-flex-align:center;align-items:center;background:#ccc;border:0;border-radius:50%;cursor:pointer;display:-ms-flexbox;display:flex;height:2em;-ms-flex-pack:center;justify-content:center;opacity:.7;padding:0;position:absolute;top:50%;transform:translateY(-50%);width:2em;z-index:1}.splide__arrow svg{fill:#000;height:1.2em;width:1.2em}.splide__arrow:hover{opacity:.9}.splide__arrow:focus{outline:none}.splide__arrow--prev{left:1em}.splide__arrow--prev svg{transform:scaleX(-1)}.splide__arrow--next{right:1em}.splide__pagination{bottom:.5em;left:0;padding:0 1em;position:absolute;right:0;z-index:1}.splide__pagination__page{background:#ccc;border:0;border-radius:50%;display:inline-block;height:8px;margin:3px;opacity:.7;padding:0;transition:transform .2s linear;width:8px}.splide__pagination__page.is-active{background:#fff;transform:scale(1.4)}.splide__pagination__page:hover{cursor:pointer;opacity:.9}.splide__pagination__page:focus{outline:none}.splide__progress__bar{background:#ccc;height:3px}.splide--nav>.splide__slider>.splide__track>.splide__list>.splide__slide,.splide--nav>.splide__track>.splide__list>.splide__slide{border:3px solid transparent;cursor:pointer}.splide--nav>.splide__slider>.splide__track>.splide__list>.splide__slide.is-active,.splide--nav>.splide__track>.splide__list>.splide__slide.is-active{border:3px solid #000}.splide--nav>.splide__slider>.splide__track>.splide__list>.splide__slide:focus,.splide--nav>.splide__track>.splide__list>.splide__slide:focus{outline:none}.splide--rtl>.splide__arrows .splide__arrow--prev,.splide--rtl>.splide__slider>.splide__track>.splide__arrows .splide__arrow--prev,.splide--rtl>.splide__track>.splide__arrows .splide__arrow--prev{left:auto;right:1em}.splide--rtl>.splide__arrows .splide__arrow--prev svg,.splide--rtl>.splide__slider>.splide__track>.splide__arrows .splide__arrow--prev svg,.splide--rtl>.splide__track>.splide__arrows .splide__arrow--prev svg{transform:scaleX(1)}.splide--rtl>.splide__arrows .splide__arrow--next,.splide--rtl>.splide__slider>.splide__track>.splide__arrows .splide__arrow--next,.splide--rtl>.splide__track>.splide__arrows .splide__arrow--next{left:1em;right:auto}.splide--rtl>.splide__arrows .splide__arrow--next svg,.splide--rtl>.splide__slider>.splide__track>.splide__arrows .splide__arrow--next svg,.splide--rtl>.splide__track>.splide__arrows .splide__arrow--next svg{transform:scaleX(-1)}.splide--ttb>.splide__arrows .splide__arrow,.splide--ttb>.splide__slider>.splide__track>.splide__arrows .splide__arrow,.splide--ttb>.splide__track>.splide__arrows .splide__arrow{left:50%;transform:translate(-50%)}.splide--ttb>.splide__arrows .splide__arrow--prev,.splide--ttb>.splide__slider>.splide__track>.splide__arrows .splide__arrow--prev,.splide--ttb>.splide__track>.splide__arrows .splide__arrow--prev{top:1em}.splide--ttb>.splide__arrows .splide__arrow--prev svg,.splide--ttb>.splide__slider>.splide__track>.splide__arrows .splide__arrow--prev svg,.splide--ttb>.splide__track>.splide__arrows .splide__arrow--prev svg{transform:rotate(-90deg)}.splide--ttb>.splide__arrows .splide__arrow--next,.splide--ttb>.splide__slider>.splide__track>.splide__arrows .splide__arrow--next,.splide--ttb>.splide__track>.splide__arrows .splide__arrow--next{bottom:1em;top:auto}.splide--ttb>.splide__arrows .splide__arrow--next svg,.splide--ttb>.splide__slider>.splide__track>.splide__arrows .splide__arrow--next svg,.splide--ttb>.splide__track>.splide__arrows .splide__arrow--next svg{transform:rotate(90deg)}.splide--ttb>.splide__pagination,.splide--ttb>.splide__slider>.splide__pagination{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;inset:0 .5em 0 auto;padding:1em 0}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1147
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItCarouselComponent, isStandalone: true, selector: "it-carousel", inputs: { title: "title", type: "type", trackClass: "trackClass", fullCarousel: ["fullCarousel", "fullCarousel", inputToBoolean], bigImg: ["bigImg", "bigImg", inputToBoolean], standardImage: ["standardImage", "standardImage", inputToBoolean], lined: ["lined", "lined", inputToBoolean] }, queries: [{ propertyName: "items", predicate: ItCarouselItemComponent }], viewQueries: [{ propertyName: "carouselDiv", first: true, predicate: ["carousel"], descendants: true }], exportAs: ["itCarousel"], ngImport: i0, template: "<div\n #carousel\n class=\"it-carousel-wrapper splide {{ typeClass }}\"\n [class.it-full-carousel]=\"fullCarousel\"\n [class.it-big-img]=\"bigImg\"\n [class.it-standard-image]=\"standardImage\">\n @if (title) {\n <div class=\"it-header-block\">\n <div class=\"it-header-block-title\">\n <h2>{{ title }}</h2>\n </div>\n </div>\n }\n\n <div class=\"splide__track {{ trackClass }}\">\n @if (items) {\n <ul class=\"splide__list\">\n @for (item of items; track item) {\n <li class=\"splide__slide\" [class.lined_slide]=\"lined\">\n <div class=\"it-single-slide-wrapper\">\n <ng-container *ngTemplateOutlet=\"item.htmlContent\"></ng-container>\n </div>\n </li>\n }\n </ul>\n }\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1144
1148
  }
1145
1149
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItCarouselComponent, decorators: [{
1146
1150
  type: Component,
1147
- args: [{ standalone: true, selector: 'it-carousel', exportAs: 'itCarousel', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet], template: "<div\n #carousel\n class=\"it-carousel-wrapper splide {{ typeClass }}\"\n [class.it-full-carousel]=\"fullCarousel\"\n [class.it-big-img]=\"bigImg\"\n [class.it-standard-image]=\"standardImage\"\n data-bs-carousel-splide>\n @if (title) {\n <div class=\"it-header-block\">\n <div class=\"it-header-block-title\">\n <h2>{{ title }}</h2>\n </div>\n </div>\n }\n\n <div class=\"splide__track {{ trackClass }}\">\n @if (items) {\n <ul class=\"splide__list\">\n @for (item of items; track item) {\n <li class=\"splide__slide\" [class.lined_slide]=\"lined\">\n <div class=\"it-single-slide-wrapper\">\n <ng-container *ngTemplateOutlet=\"item.htmlContent\"></ng-container>\n </div>\n </li>\n }\n </ul>\n }\n </div>\n</div>\n", styles: [".splide__container{box-sizing:border-box;position:relative}.splide__list{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:-ms-flexbox;display:flex;height:100%;margin:0!important;padding:0!important;transform-style:preserve-3d}.splide.is-initialized:not(.is-active) .splide__list{display:block}.splide__pagination{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;justify-content:center;margin:0;pointer-events:none}.splide__pagination li{display:inline-block;line-height:1;list-style-type:none;margin:0;pointer-events:auto}.splide__progress__bar{width:0}.splide{outline:none;position:relative;visibility:hidden}.splide.is-initialized,.splide.is-rendered{visibility:visible}.splide__slide{-webkit-backface-visibility:hidden;backface-visibility:hidden;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0;list-style-type:none!important;margin:0;outline:none;position:relative}.splide__slide img{vertical-align:bottom}.splide__slider{position:relative}.splide__spinner{animation:splide-loading 1s linear infinite;border:2px solid #999;border-left-color:transparent;border-radius:50%;contain:strict;display:inline-block;height:20px;inset:0;margin:auto;position:absolute;width:20px}.splide__track{overflow:hidden;position:relative;z-index:0}@keyframes splide-loading{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.splide--draggable>.splide__slider>.splide__track,.splide--draggable>.splide__track{-webkit-user-select:none;-ms-user-select:none;user-select:none}.splide--fade>.splide__slider>.splide__track>.splide__list,.splide--fade>.splide__track>.splide__list{display:block}.splide--fade>.splide__slider>.splide__track>.splide__list>.splide__slide,.splide--fade>.splide__track>.splide__list>.splide__slide{left:0;opacity:0;position:absolute;top:0;z-index:0}.splide--fade>.splide__slider>.splide__track>.splide__list>.splide__slide.is-active,.splide--fade>.splide__track>.splide__list>.splide__slide.is-active{opacity:1;position:relative;z-index:1}.splide--rtl{direction:rtl}.splide--ttb.is-active>.splide__slider>.splide__track>.splide__list,.splide--ttb.is-active>.splide__track>.splide__list{display:block}.splide__arrow{-ms-flex-align:center;align-items:center;background:#ccc;border:0;border-radius:50%;cursor:pointer;display:-ms-flexbox;display:flex;height:2em;-ms-flex-pack:center;justify-content:center;opacity:.7;padding:0;position:absolute;top:50%;transform:translateY(-50%);width:2em;z-index:1}.splide__arrow svg{fill:#000;height:1.2em;width:1.2em}.splide__arrow:hover{opacity:.9}.splide__arrow:focus{outline:none}.splide__arrow--prev{left:1em}.splide__arrow--prev svg{transform:scaleX(-1)}.splide__arrow--next{right:1em}.splide__pagination{bottom:.5em;left:0;padding:0 1em;position:absolute;right:0;z-index:1}.splide__pagination__page{background:#ccc;border:0;border-radius:50%;display:inline-block;height:8px;margin:3px;opacity:.7;padding:0;transition:transform .2s linear;width:8px}.splide__pagination__page.is-active{background:#fff;transform:scale(1.4)}.splide__pagination__page:hover{cursor:pointer;opacity:.9}.splide__pagination__page:focus{outline:none}.splide__progress__bar{background:#ccc;height:3px}.splide--nav>.splide__slider>.splide__track>.splide__list>.splide__slide,.splide--nav>.splide__track>.splide__list>.splide__slide{border:3px solid transparent;cursor:pointer}.splide--nav>.splide__slider>.splide__track>.splide__list>.splide__slide.is-active,.splide--nav>.splide__track>.splide__list>.splide__slide.is-active{border:3px solid #000}.splide--nav>.splide__slider>.splide__track>.splide__list>.splide__slide:focus,.splide--nav>.splide__track>.splide__list>.splide__slide:focus{outline:none}.splide--rtl>.splide__arrows .splide__arrow--prev,.splide--rtl>.splide__slider>.splide__track>.splide__arrows .splide__arrow--prev,.splide--rtl>.splide__track>.splide__arrows .splide__arrow--prev{left:auto;right:1em}.splide--rtl>.splide__arrows .splide__arrow--prev svg,.splide--rtl>.splide__slider>.splide__track>.splide__arrows .splide__arrow--prev svg,.splide--rtl>.splide__track>.splide__arrows .splide__arrow--prev svg{transform:scaleX(1)}.splide--rtl>.splide__arrows .splide__arrow--next,.splide--rtl>.splide__slider>.splide__track>.splide__arrows .splide__arrow--next,.splide--rtl>.splide__track>.splide__arrows .splide__arrow--next{left:1em;right:auto}.splide--rtl>.splide__arrows .splide__arrow--next svg,.splide--rtl>.splide__slider>.splide__track>.splide__arrows .splide__arrow--next svg,.splide--rtl>.splide__track>.splide__arrows .splide__arrow--next svg{transform:scaleX(-1)}.splide--ttb>.splide__arrows .splide__arrow,.splide--ttb>.splide__slider>.splide__track>.splide__arrows .splide__arrow,.splide--ttb>.splide__track>.splide__arrows .splide__arrow{left:50%;transform:translate(-50%)}.splide--ttb>.splide__arrows .splide__arrow--prev,.splide--ttb>.splide__slider>.splide__track>.splide__arrows .splide__arrow--prev,.splide--ttb>.splide__track>.splide__arrows .splide__arrow--prev{top:1em}.splide--ttb>.splide__arrows .splide__arrow--prev svg,.splide--ttb>.splide__slider>.splide__track>.splide__arrows .splide__arrow--prev svg,.splide--ttb>.splide__track>.splide__arrows .splide__arrow--prev svg{transform:rotate(-90deg)}.splide--ttb>.splide__arrows .splide__arrow--next,.splide--ttb>.splide__slider>.splide__track>.splide__arrows .splide__arrow--next,.splide--ttb>.splide__track>.splide__arrows .splide__arrow--next{bottom:1em;top:auto}.splide--ttb>.splide__arrows .splide__arrow--next svg,.splide--ttb>.splide__slider>.splide__track>.splide__arrows .splide__arrow--next svg,.splide--ttb>.splide__track>.splide__arrows .splide__arrow--next svg{transform:rotate(90deg)}.splide--ttb>.splide__pagination,.splide--ttb>.splide__slider>.splide__pagination{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;inset:0 .5em 0 auto;padding:1em 0}\n"] }]
1151
+ args: [{ standalone: true, selector: 'it-carousel', exportAs: 'itCarousel', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet], template: "<div\n #carousel\n class=\"it-carousel-wrapper splide {{ typeClass }}\"\n [class.it-full-carousel]=\"fullCarousel\"\n [class.it-big-img]=\"bigImg\"\n [class.it-standard-image]=\"standardImage\">\n @if (title) {\n <div class=\"it-header-block\">\n <div class=\"it-header-block-title\">\n <h2>{{ title }}</h2>\n </div>\n </div>\n }\n\n <div class=\"splide__track {{ trackClass }}\">\n @if (items) {\n <ul class=\"splide__list\">\n @for (item of items; track item) {\n <li class=\"splide__slide\" [class.lined_slide]=\"lined\">\n <div class=\"it-single-slide-wrapper\">\n <ng-container *ngTemplateOutlet=\"item.htmlContent\"></ng-container>\n </div>\n </li>\n }\n </ul>\n }\n </div>\n</div>\n" }]
1148
1152
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { title: [{
1149
1153
  type: Input
1150
1154
  }], type: [{
@@ -1978,19 +1982,20 @@ class ItAbstractFormComponent extends ItAbstractComponent {
1978
1982
  set disabled(isDisabled) {
1979
1983
  this.setDisabledState(isDisabled);
1980
1984
  }
1981
- constructor(_translateService, _ngControl) {
1985
+ constructor(_translateService, _ngControl, fgd) {
1982
1986
  super();
1983
1987
  this._translateService = _translateService;
1984
1988
  this._ngControl = _ngControl;
1989
+ this.fgd = fgd;
1985
1990
  /**
1986
1991
  * Validation color display mode (validation triggered if field is touched or not pristine)
1987
1992
  * - <b>true</b>: Always show the validation color
1988
1993
  * - <b>false</b>: Never show validation color
1989
1994
  * - <b>only-valid</b>: Show only valid validation color
1990
1995
  * - <b>only-invalid</b>: Show only invalid validation color
1991
- * @default <b>true</b>: Always show the validation color
1996
+ * @default <b>false</b>: Do not show the validation color by default
1992
1997
  */
1993
- this.validationMode = true;
1998
+ this.validationMode = false;
1994
1999
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
1995
2000
  this.onChange = (_) => { };
1996
2001
  this.onTouched = () => { };
@@ -2033,6 +2038,7 @@ class ItAbstractFormComponent extends ItAbstractComponent {
2033
2038
  ngOnInit() {
2034
2039
  if (this._ngControl?.control) {
2035
2040
  this.control.setValidators(this._ngControl.control.validator);
2041
+ this.setValidationModeWhenInAForm();
2036
2042
  }
2037
2043
  }
2038
2044
  registerOnChange(fn) {
@@ -2131,7 +2137,16 @@ class ItAbstractFormComponent extends ItAbstractComponent {
2131
2137
  }
2132
2138
  return this.control.getError(errorCode, path);
2133
2139
  }
2134
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItAbstractFormComponent, deps: [{ token: i1.TranslateService }, { token: i1$1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
2140
+ // This function assurest that validation mode remains complaiant with the Design kit
2141
+ // When the validation mode is `false` and input elements are wrapped in a `FormGroup`
2142
+ // validation mode is automatically set to `true`.
2143
+ setValidationModeWhenInAForm() {
2144
+ const isInAForm = this.fgd?.control instanceof FormGroup;
2145
+ if (isInAForm && this.validationMode == false) {
2146
+ this.validationMode = true;
2147
+ }
2148
+ }
2149
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItAbstractFormComponent, deps: [{ token: i1.TranslateService }, { token: i1$1.NgControl, optional: true, self: true }, { token: i1$1.ControlContainer, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
2135
2150
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.0.6", type: ItAbstractFormComponent, selector: "ng-component", inputs: { label: "label", validationMode: "validationMode", disabled: ["disabled", "disabled", inputToBoolean] }, usesInheritance: true, ngImport: i0, template: '', isInline: true }); }
2136
2151
  }
2137
2152
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItAbstractFormComponent, decorators: [{
@@ -2141,6 +2156,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
2141
2156
  type: Self
2142
2157
  }, {
2143
2158
  type: Optional
2159
+ }] }, { type: i1$1.ControlContainer, decorators: [{
2160
+ type: Optional
2144
2161
  }] }], propDecorators: { label: [{
2145
2162
  type: Input
2146
2163
  }], validationMode: [{
@@ -2285,6 +2302,11 @@ class ItValidators {
2285
2302
  static get tel() {
2286
2303
  return ItValidators.customPattern(PHONE_NUMBER_REGEX, { invalidTel: true });
2287
2304
  }
2305
+ static includes(possibleValues) {
2306
+ return formControl => {
2307
+ return possibleValues?.includes(formControl.value) ? null : { invalidSelection: true };
2308
+ };
2309
+ }
2288
2310
  /**
2289
2311
  * URL validator
2290
2312
  */
@@ -2481,11 +2503,11 @@ class ItInputComponent extends ItAbstractFormComponent {
2481
2503
  this.control.setValue(value);
2482
2504
  }
2483
2505
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2484
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItInputComponent, isStandalone: true, selector: "it-input", inputs: { type: "type", placeholder: "placeholder", description: "description", readonly: "readonly", maxDate: "maxDate", minDate: "minDate", max: "max", min: "min", step: "step", currency: ["currency", "currency", inputToBoolean], percentage: ["percentage", "percentage", inputToBoolean], symbol: "symbol", adaptive: ["adaptive", "adaptive", inputToBoolean], autocomplete: "autocomplete" }, usesInheritance: true, ngImport: i0, template: "<div class=\"form-group\">\n <div\n class=\"input-group\"\n [class.disabled]=\"!control.enabled\"\n [class.input-number]=\"type === 'number'\"\n [class.input-number-currency]=\"currency\"\n [class.input-number-percentage]=\"percentage\"\n [class.input-number-adaptive]=\"adaptive\">\n <span class=\"input-group-text\" #prependText>\n <ng-content select=\"[prependText]\"></ng-content>\n </span>\n @if (label) {\n <label\n [for]=\"id\"\n [class.active]=\"isActiveLabel\"\n [class.input-symbol-label]=\"percentage || currency\"\n [class.input-number-label]=\"type === 'number'\"\n [class.empty-prepend-label]=\"!(percentage || currency) && !prependText.clientWidth\">\n {{ label }}\n </label>\n }\n\n @if (type === 'number') {\n @if (currency || percentage) {\n <span class=\"input-group-text fw-semibold\">{{ symbol }}</span>\n }\n <input\n type=\"number\"\n [id]=\"id\"\n [step]=\"step ?? null\"\n [min]=\"min ?? ''\"\n [max]=\"max ?? ''\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.just-validate-success-field]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [autocomplete]=\"autocomplete\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n <span class=\"input-group-text align-buttons flex-column\">\n <button type=\"button\" class=\"input-number-add\" [disabled]=\"!control.enabled\" (click)=\"incrementNumber()\">\n <span class=\"visually-hidden\">{{ 'it.form.increase-value' | translate }}</span>\n </button>\n <button type=\"button\" class=\"input-number-sub\" [disabled]=\"!control.enabled\" (click)=\"incrementNumber(true)\">\n <span class=\"visually-hidden\">{{ 'it.form.decrease-value' | translate }}</span>\n </button>\n </span>\n } @else {\n <input\n [id]=\"id\"\n [type]=\"type\"\n [max]=\"type === 'date' ? maxDate : undefined\"\n [min]=\"type === 'date' ? minDate : undefined\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.just-validate-success-field]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [autocomplete]=\"autocomplete\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n }\n\n <div class=\"input-group-append\">\n <ng-content select=\"[append]\"></ng-content>\n\n <div class=\"input-group-text\">\n <ng-content select=\"[appendText]\"></ng-content>\n </div>\n </div>\n </div>\n\n @if (description) {\n <small [id]=\"id + '-description'\" class=\"form-text\">{{ description }}</small>\n }\n\n @if (isInvalid) {\n <div class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n @if (!customError.hasChildNodes()) {\n {{ invalidMessage | async }}\n }\n </div>\n }\n</div>\n", styles: [".form-group label{z-index:1000}.form-group input:focus:not(.focus--mouse){box-shadow:inherit!important;border-color:inherit!important}.form-group .input-number .align-buttons{height:100%}.form-group .input-group-text:empty{display:none}.form-group label.empty-prepend-label{left:auto!important;max-width:100%!important}.form-group label:not(.active):has(+input:-webkit-autofill){transform:translateY(-75%)}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1$1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2506
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItInputComponent, isStandalone: true, selector: "it-input", inputs: { type: "type", placeholder: "placeholder", description: "description", readonly: "readonly", maxDate: "maxDate", minDate: "minDate", max: "max", min: "min", step: "step", currency: ["currency", "currency", inputToBoolean], percentage: ["percentage", "percentage", inputToBoolean], symbol: "symbol", adaptive: ["adaptive", "adaptive", inputToBoolean], autocomplete: "autocomplete" }, usesInheritance: true, ngImport: i0, template: "<div class=\"form-group\">\n <div\n class=\"input-group\"\n [class.disabled]=\"!control.enabled\"\n [class.input-number]=\"type === 'number'\"\n [class.input-number-currency]=\"currency\"\n [class.input-number-percentage]=\"percentage\"\n [class.input-number-adaptive]=\"adaptive\">\n <span class=\"input-group-text\" #prependText>\n <ng-content select=\"[prependText]\"></ng-content>\n </span>\n @if (label) {\n <label\n [for]=\"id\"\n [class.active]=\"isActiveLabel\"\n [class.input-symbol-label]=\"percentage || currency\"\n [class.input-number-label]=\"type === 'number'\"\n [class.empty-prepend-label]=\"!(percentage || currency) && !prependText.clientWidth\">\n {{ label }}\n </label>\n }\n\n @if (type === 'number') {\n @if (currency || percentage) {\n <span class=\"input-group-text fw-semibold\">{{ symbol }}</span>\n }\n <input\n type=\"number\"\n [id]=\"id\"\n [step]=\"step ?? null\"\n [min]=\"min ?? ''\"\n [max]=\"max ?? ''\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.just-validate-success-field]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [autocomplete]=\"autocomplete\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n <span class=\"input-group-text align-buttons flex-column\">\n <button type=\"button\" class=\"input-number-add\" [disabled]=\"!control.enabled\" (click)=\"incrementNumber()\">\n <span class=\"visually-hidden\">{{ 'it.form.increase-value' | translate }}</span>\n </button>\n <button type=\"button\" class=\"input-number-sub\" [disabled]=\"!control.enabled\" (click)=\"incrementNumber(true)\">\n <span class=\"visually-hidden\">{{ 'it.form.decrease-value' | translate }}</span>\n </button>\n </span>\n } @else {\n <input\n [id]=\"id\"\n [type]=\"type\"\n [max]=\"type === 'date' ? maxDate : undefined\"\n [min]=\"type === 'date' ? minDate : undefined\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.just-validate-success-field]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [autocomplete]=\"autocomplete\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n }\n\n <div class=\"input-group-append\">\n <ng-content select=\"[append]\"></ng-content>\n\n <div class=\"input-group-text\">\n <ng-content select=\"[appendText]\"></ng-content>\n </div>\n </div>\n </div>\n\n @if (description) {\n <small [id]=\"id + '-description'\" class=\"form-text\">{{ description }}</small>\n }\n\n @if (isInvalid) {\n <div class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n @if (!customError.hasChildNodes()) {\n {{ invalidMessage | async }}\n }\n </div>\n }\n</div>\n", styles: [".form-group label{z-index:1000}.form-group .input-number .align-buttons{height:100%}.form-group .input-group-text:empty{display:none}.form-group label.empty-prepend-label{left:auto!important;max-width:100%!important}.form-group label:not(.active):has(+input:-webkit-autofill){transform:translateY(-75%)}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1$1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2485
2507
  }
2486
2508
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItInputComponent, decorators: [{
2487
2509
  type: Component,
2488
- args: [{ standalone: true, selector: 'it-input', changeDetection: ChangeDetectionStrategy.OnPush, imports: [ReactiveFormsModule, TranslateModule, AsyncPipe], template: "<div class=\"form-group\">\n <div\n class=\"input-group\"\n [class.disabled]=\"!control.enabled\"\n [class.input-number]=\"type === 'number'\"\n [class.input-number-currency]=\"currency\"\n [class.input-number-percentage]=\"percentage\"\n [class.input-number-adaptive]=\"adaptive\">\n <span class=\"input-group-text\" #prependText>\n <ng-content select=\"[prependText]\"></ng-content>\n </span>\n @if (label) {\n <label\n [for]=\"id\"\n [class.active]=\"isActiveLabel\"\n [class.input-symbol-label]=\"percentage || currency\"\n [class.input-number-label]=\"type === 'number'\"\n [class.empty-prepend-label]=\"!(percentage || currency) && !prependText.clientWidth\">\n {{ label }}\n </label>\n }\n\n @if (type === 'number') {\n @if (currency || percentage) {\n <span class=\"input-group-text fw-semibold\">{{ symbol }}</span>\n }\n <input\n type=\"number\"\n [id]=\"id\"\n [step]=\"step ?? null\"\n [min]=\"min ?? ''\"\n [max]=\"max ?? ''\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.just-validate-success-field]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [autocomplete]=\"autocomplete\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n <span class=\"input-group-text align-buttons flex-column\">\n <button type=\"button\" class=\"input-number-add\" [disabled]=\"!control.enabled\" (click)=\"incrementNumber()\">\n <span class=\"visually-hidden\">{{ 'it.form.increase-value' | translate }}</span>\n </button>\n <button type=\"button\" class=\"input-number-sub\" [disabled]=\"!control.enabled\" (click)=\"incrementNumber(true)\">\n <span class=\"visually-hidden\">{{ 'it.form.decrease-value' | translate }}</span>\n </button>\n </span>\n } @else {\n <input\n [id]=\"id\"\n [type]=\"type\"\n [max]=\"type === 'date' ? maxDate : undefined\"\n [min]=\"type === 'date' ? minDate : undefined\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.just-validate-success-field]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [autocomplete]=\"autocomplete\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n }\n\n <div class=\"input-group-append\">\n <ng-content select=\"[append]\"></ng-content>\n\n <div class=\"input-group-text\">\n <ng-content select=\"[appendText]\"></ng-content>\n </div>\n </div>\n </div>\n\n @if (description) {\n <small [id]=\"id + '-description'\" class=\"form-text\">{{ description }}</small>\n }\n\n @if (isInvalid) {\n <div class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n @if (!customError.hasChildNodes()) {\n {{ invalidMessage | async }}\n }\n </div>\n }\n</div>\n", styles: [".form-group label{z-index:1000}.form-group input:focus:not(.focus--mouse){box-shadow:inherit!important;border-color:inherit!important}.form-group .input-number .align-buttons{height:100%}.form-group .input-group-text:empty{display:none}.form-group label.empty-prepend-label{left:auto!important;max-width:100%!important}.form-group label:not(.active):has(+input:-webkit-autofill){transform:translateY(-75%)}\n"] }]
2510
+ args: [{ standalone: true, selector: 'it-input', changeDetection: ChangeDetectionStrategy.OnPush, imports: [ReactiveFormsModule, TranslateModule, AsyncPipe], template: "<div class=\"form-group\">\n <div\n class=\"input-group\"\n [class.disabled]=\"!control.enabled\"\n [class.input-number]=\"type === 'number'\"\n [class.input-number-currency]=\"currency\"\n [class.input-number-percentage]=\"percentage\"\n [class.input-number-adaptive]=\"adaptive\">\n <span class=\"input-group-text\" #prependText>\n <ng-content select=\"[prependText]\"></ng-content>\n </span>\n @if (label) {\n <label\n [for]=\"id\"\n [class.active]=\"isActiveLabel\"\n [class.input-symbol-label]=\"percentage || currency\"\n [class.input-number-label]=\"type === 'number'\"\n [class.empty-prepend-label]=\"!(percentage || currency) && !prependText.clientWidth\">\n {{ label }}\n </label>\n }\n\n @if (type === 'number') {\n @if (currency || percentage) {\n <span class=\"input-group-text fw-semibold\">{{ symbol }}</span>\n }\n <input\n type=\"number\"\n [id]=\"id\"\n [step]=\"step ?? null\"\n [min]=\"min ?? ''\"\n [max]=\"max ?? ''\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.just-validate-success-field]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [autocomplete]=\"autocomplete\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n <span class=\"input-group-text align-buttons flex-column\">\n <button type=\"button\" class=\"input-number-add\" [disabled]=\"!control.enabled\" (click)=\"incrementNumber()\">\n <span class=\"visually-hidden\">{{ 'it.form.increase-value' | translate }}</span>\n </button>\n <button type=\"button\" class=\"input-number-sub\" [disabled]=\"!control.enabled\" (click)=\"incrementNumber(true)\">\n <span class=\"visually-hidden\">{{ 'it.form.decrease-value' | translate }}</span>\n </button>\n </span>\n } @else {\n <input\n [id]=\"id\"\n [type]=\"type\"\n [max]=\"type === 'date' ? maxDate : undefined\"\n [min]=\"type === 'date' ? minDate : undefined\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.just-validate-success-field]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [autocomplete]=\"autocomplete\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n }\n\n <div class=\"input-group-append\">\n <ng-content select=\"[append]\"></ng-content>\n\n <div class=\"input-group-text\">\n <ng-content select=\"[appendText]\"></ng-content>\n </div>\n </div>\n </div>\n\n @if (description) {\n <small [id]=\"id + '-description'\" class=\"form-text\">{{ description }}</small>\n }\n\n @if (isInvalid) {\n <div class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n @if (!customError.hasChildNodes()) {\n {{ invalidMessage | async }}\n }\n </div>\n }\n</div>\n", styles: [".form-group label{z-index:1000}.form-group .input-number .align-buttons{height:100%}.form-group .input-group-text:empty{display:none}.form-group label.empty-prepend-label{left:auto!important;max-width:100%!important}.form-group label:not(.active):has(+input:-webkit-autofill){transform:translateY(-75%)}\n"] }]
2489
2511
  }], propDecorators: { type: [{
2490
2512
  type: Input
2491
2513
  }], placeholder: [{
@@ -4467,7 +4489,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
4467
4489
  }]
4468
4490
  }], ctorParameters: () => [{ type: i1$2.DomSanitizer }] });
4469
4491
 
4470
- class ItAutocompleteComponent extends ItAbstractFormComponent {
4492
+ class ItSearchComponent extends ItAbstractFormComponent {
4471
4493
  constructor() {
4472
4494
  super(...arguments);
4473
4495
  /**
@@ -4489,52 +4511,52 @@ class ItAutocompleteComponent extends ItAbstractFormComponent {
4489
4511
  */
4490
4512
  this.forceShowLabel = true;
4491
4513
  /**
4492
- * Fired when the Autocomplete Item has been selected
4514
+ * Fired when the Search Item has been selected
4493
4515
  */
4494
- this.autocompleteSelectedEvent = new EventEmitter();
4516
+ this.searchSelectedEvent = new EventEmitter();
4495
4517
  this.showAutocompletion = false;
4496
4518
  /** Observable da cui vengono emessi i risultati dell'auto completamento */
4497
- this.autocompleteResults$ = new Observable();
4519
+ this.searchResults$ = new Observable();
4498
4520
  }
4499
4521
  ngOnInit() {
4500
4522
  super.ngOnInit();
4501
- this.autocompleteResults$ = this.getAutocompleteResults$();
4523
+ this.searchResults$ = this.getSearchResults$();
4502
4524
  }
4503
4525
  /**
4504
- * Create the autocomplete list
4526
+ * Create the search list
4505
4527
  */
4506
- getAutocompleteResults$() {
4528
+ getSearchResults$() {
4507
4529
  return this.control.valueChanges.pipe(debounceTime(this.debounceTime), // Delay filter data after time span has passed without another source emission, useful when the user is typing multiple letters
4508
4530
  distinctUntilChanged(), // Only if searchValue is distinct in comparison to the last value
4509
4531
  switchMap(searchedValue => {
4510
- if (!this.autocompleteData) {
4532
+ if (!this.searchData) {
4511
4533
  return of({
4512
4534
  searchedValue,
4513
4535
  relatedEntries: [],
4514
4536
  });
4515
4537
  }
4516
- const autoCompleteData$ = Array.isArray(this.autocompleteData) ? of(this.autocompleteData) : this.autocompleteData(searchedValue);
4517
- return autoCompleteData$.pipe(map(autocompleteData => {
4538
+ const autoCompleteData$ = Array.isArray(this.searchData) ? of(this.searchData) : this.searchData(searchedValue);
4539
+ return autoCompleteData$.pipe(map(searchData => {
4518
4540
  if (!searchedValue || typeof searchedValue === 'number') {
4519
4541
  return { searchedValue, relatedEntries: [] };
4520
4542
  }
4521
4543
  const lowercaseValue = searchedValue.toLowerCase();
4522
- const relatedEntries = autocompleteData.filter(item => item.value?.toLowerCase().includes(lowercaseValue));
4544
+ const relatedEntries = searchData.filter(item => item.value?.toLowerCase().includes(lowercaseValue));
4523
4545
  return { searchedValue, relatedEntries };
4524
4546
  }));
4525
4547
  }));
4526
4548
  }
4527
4549
  onEntryClick(entry, event) {
4528
- // Se non è stato definito un link associato all'elemento dell'autocomplete, probabilmente il desiderata
4550
+ // Se non è stato definito un link associato all'elemento dell'search, probabilmente il desiderata
4529
4551
  // non è effettuare la navigazione al default '#', pertanto in tal caso meglio annullare la navigazione.
4530
4552
  if (!entry.link) {
4531
4553
  event.preventDefault();
4532
4554
  }
4533
- this.autocompleteSelectedEvent.next(entry);
4555
+ this.searchSelectedEvent.next(entry);
4534
4556
  this.control.setValue(entry.value);
4535
4557
  this.showAutocompletion = false;
4536
4558
  }
4537
- autocompleteItemTrackByValueFn(index, item) {
4559
+ searchItemTrackByValueFn(index, item) {
4538
4560
  return item.value;
4539
4561
  }
4540
4562
  onKeyDown() {
@@ -4544,13 +4566,13 @@ class ItAutocompleteComponent extends ItAbstractFormComponent {
4544
4566
  const value = this.control.value;
4545
4567
  return this.forceShowLabel && (!!value || !!this.placeholder);
4546
4568
  }
4547
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItAutocompleteComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
4548
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItAutocompleteComponent, isStandalone: true, selector: "it-autocomplete", inputs: { autocompleteData: "autocompleteData", big: ["big", "big", inputToBoolean], debounceTime: "debounceTime", placeholder: "placeholder", labelWaria: "labelWaria", forceShowLabel: ["forceShowLabel", "forceShowLabel", inputToBoolean] }, outputs: { autocompleteSelectedEvent: "autocompleteSelectedEvent" }, usesInheritance: true, ngImport: i0, template: "<div class=\"form-group\" [class.autocomplete-wrapper-big]=\"big\">\n @if (label) {\n <label [for]=\"id\" [class.visually-hidden]=\"!isActiveLabel\" [class.active]=\"isActiveLabel\">\n {{ label }}\n </label>\n }\n\n <input\n [id]=\"id\"\n type=\"search\"\n class=\"autocomplete form-control\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n (blur)=\"markAsTouched()\"\n (keydown)=\"onKeyDown()\" />\n\n <span class=\"autocomplete-icon\" aria-hidden=\"true\">\n <it-icon [labelWaria]=\"labelWaria\" name=\"search\" size=\"sm\"></it-icon>\n </span>\n\n @if (autocompleteResults$ | async; as autocomplete) {\n <ul class=\"autocomplete-list\" [class.autocomplete-list-show]=\"autocomplete.relatedEntries?.length && showAutocompletion\">\n @for (entry of autocomplete.relatedEntries; track autocompleteItemTrackByValueFn($index, entry)) {\n <li>\n <a [href]=\"entry.link\" (click)=\"onEntryClick(entry, $event)\">\n @if (entry.avatarSrcPath) {\n <div class=\"avatar size-sm\">\n <img [src]=\"entry.avatarSrcPath\" [alt]=\"entry.avatarAltText\" />\n </div>\n }\n @if (entry.icon) {\n <it-icon [name]=\"entry.icon\" size=\"sm\"></it-icon>\n }\n <span class=\"autocomplete-list-text\">\n <span [innerHTML]=\"entry.value | itMarkMatchingText: autocomplete.searchedValue\"></span>\n @if (entry.label) {\n <em>{{ entry.label }}</em>\n }\n </span>\n </a>\n </li>\n }\n </ul>\n }\n\n @if (isInvalid) {\n <div class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n @if (!customError.hasChildNodes()) {\n {{ invalidMessage | async }}\n }\n </div>\n }\n</div>\n", dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ItIconComponent, selector: "it-icon", inputs: ["name", "size", "color", "padded", "svgClass", "title", "labelWaria"] }, { kind: "pipe", type: ItMarkMatchingTextPipe, name: "itMarkMatchingText" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4569
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSearchComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
4570
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItSearchComponent, isStandalone: true, selector: "it-search", inputs: { searchData: "searchData", big: ["big", "big", inputToBoolean], debounceTime: "debounceTime", placeholder: "placeholder", labelWaria: "labelWaria", forceShowLabel: ["forceShowLabel", "forceShowLabel", inputToBoolean] }, outputs: { searchSelectedEvent: "searchSelectedEvent" }, usesInheritance: true, ngImport: i0, template: "<div class=\"form-group\" [class.autocomplete-wrapper-big]=\"big\">\n @if (label) {\n <label [for]=\"id\" [class.visually-hidden]=\"!isActiveLabel\" [class.active]=\"isActiveLabel\">\n {{ label }}\n </label>\n }\n\n <input\n [id]=\"id\"\n type=\"search\"\n class=\"autocomplete form-control\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n (blur)=\"markAsTouched()\"\n (keydown)=\"onKeyDown()\" />\n\n <span class=\"autocomplete-icon\" aria-hidden=\"true\">\n <it-icon [labelWaria]=\"labelWaria\" name=\"search\" size=\"sm\"></it-icon>\n </span>\n\n @if (searchResults$ | async; as autocomplete) {\n <ul class=\"autocomplete-list\" [class.autocomplete-list-show]=\"autocomplete.relatedEntries?.length && showAutocompletion\">\n @for (entry of autocomplete.relatedEntries; track searchItemTrackByValueFn($index, entry)) {\n <li>\n <a [href]=\"entry.link\" (click)=\"onEntryClick(entry, $event)\">\n @if (entry.avatarSrcPath) {\n <div class=\"avatar size-sm\">\n <img [src]=\"entry.avatarSrcPath\" [alt]=\"entry.avatarAltText\" />\n </div>\n }\n @if (entry.icon) {\n <it-icon [name]=\"entry.icon\" size=\"sm\"></it-icon>\n }\n <span class=\"autocomplete-list-text\">\n <span [innerHTML]=\"entry.value | itMarkMatchingText: autocomplete.searchedValue\"></span>\n @if (entry.label) {\n <em>{{ entry.label }}</em>\n }\n </span>\n </a>\n </li>\n }\n </ul>\n }\n\n @if (isInvalid) {\n <div class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n @if (!customError.hasChildNodes()) {\n {{ invalidMessage | async }}\n }\n </div>\n }\n</div>\n", dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ItIconComponent, selector: "it-icon", inputs: ["name", "size", "color", "padded", "svgClass", "title", "labelWaria"] }, { kind: "pipe", type: ItMarkMatchingTextPipe, name: "itMarkMatchingText" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4549
4571
  }
4550
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItAutocompleteComponent, decorators: [{
4572
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSearchComponent, decorators: [{
4551
4573
  type: Component,
4552
- args: [{ standalone: true, selector: 'it-autocomplete', imports: [AsyncPipe, ItIconComponent, ItMarkMatchingTextPipe, NgTemplateOutlet, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"form-group\" [class.autocomplete-wrapper-big]=\"big\">\n @if (label) {\n <label [for]=\"id\" [class.visually-hidden]=\"!isActiveLabel\" [class.active]=\"isActiveLabel\">\n {{ label }}\n </label>\n }\n\n <input\n [id]=\"id\"\n type=\"search\"\n class=\"autocomplete form-control\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n (blur)=\"markAsTouched()\"\n (keydown)=\"onKeyDown()\" />\n\n <span class=\"autocomplete-icon\" aria-hidden=\"true\">\n <it-icon [labelWaria]=\"labelWaria\" name=\"search\" size=\"sm\"></it-icon>\n </span>\n\n @if (autocompleteResults$ | async; as autocomplete) {\n <ul class=\"autocomplete-list\" [class.autocomplete-list-show]=\"autocomplete.relatedEntries?.length && showAutocompletion\">\n @for (entry of autocomplete.relatedEntries; track autocompleteItemTrackByValueFn($index, entry)) {\n <li>\n <a [href]=\"entry.link\" (click)=\"onEntryClick(entry, $event)\">\n @if (entry.avatarSrcPath) {\n <div class=\"avatar size-sm\">\n <img [src]=\"entry.avatarSrcPath\" [alt]=\"entry.avatarAltText\" />\n </div>\n }\n @if (entry.icon) {\n <it-icon [name]=\"entry.icon\" size=\"sm\"></it-icon>\n }\n <span class=\"autocomplete-list-text\">\n <span [innerHTML]=\"entry.value | itMarkMatchingText: autocomplete.searchedValue\"></span>\n @if (entry.label) {\n <em>{{ entry.label }}</em>\n }\n </span>\n </a>\n </li>\n }\n </ul>\n }\n\n @if (isInvalid) {\n <div class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n @if (!customError.hasChildNodes()) {\n {{ invalidMessage | async }}\n }\n </div>\n }\n</div>\n" }]
4553
- }], propDecorators: { autocompleteData: [{
4574
+ args: [{ standalone: true, selector: 'it-search', imports: [AsyncPipe, ItIconComponent, ItMarkMatchingTextPipe, NgTemplateOutlet, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"form-group\" [class.autocomplete-wrapper-big]=\"big\">\n @if (label) {\n <label [for]=\"id\" [class.visually-hidden]=\"!isActiveLabel\" [class.active]=\"isActiveLabel\">\n {{ label }}\n </label>\n }\n\n <input\n [id]=\"id\"\n type=\"search\"\n class=\"autocomplete form-control\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n (blur)=\"markAsTouched()\"\n (keydown)=\"onKeyDown()\" />\n\n <span class=\"autocomplete-icon\" aria-hidden=\"true\">\n <it-icon [labelWaria]=\"labelWaria\" name=\"search\" size=\"sm\"></it-icon>\n </span>\n\n @if (searchResults$ | async; as autocomplete) {\n <ul class=\"autocomplete-list\" [class.autocomplete-list-show]=\"autocomplete.relatedEntries?.length && showAutocompletion\">\n @for (entry of autocomplete.relatedEntries; track searchItemTrackByValueFn($index, entry)) {\n <li>\n <a [href]=\"entry.link\" (click)=\"onEntryClick(entry, $event)\">\n @if (entry.avatarSrcPath) {\n <div class=\"avatar size-sm\">\n <img [src]=\"entry.avatarSrcPath\" [alt]=\"entry.avatarAltText\" />\n </div>\n }\n @if (entry.icon) {\n <it-icon [name]=\"entry.icon\" size=\"sm\"></it-icon>\n }\n <span class=\"autocomplete-list-text\">\n <span [innerHTML]=\"entry.value | itMarkMatchingText: autocomplete.searchedValue\"></span>\n @if (entry.label) {\n <em>{{ entry.label }}</em>\n }\n </span>\n </a>\n </li>\n }\n </ul>\n }\n\n @if (isInvalid) {\n <div class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n @if (!customError.hasChildNodes()) {\n {{ invalidMessage | async }}\n }\n </div>\n }\n</div>\n" }]
4575
+ }], propDecorators: { searchData: [{
4554
4576
  type: Input,
4555
4577
  args: [{ required: true }]
4556
4578
  }], big: [{
@@ -4565,7 +4587,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
4565
4587
  }], forceShowLabel: [{
4566
4588
  type: Input,
4567
4589
  args: [{ transform: inputToBoolean }]
4568
- }], autocompleteSelectedEvent: [{
4590
+ }], searchSelectedEvent: [{
4569
4591
  type: Output
4570
4592
  }] } });
4571
4593
 
@@ -5024,8 +5046,181 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
5024
5046
  type: Output
5025
5047
  }] } });
5026
5048
 
5049
+ class ItAutocompleteComponent extends ItAbstractFormComponent {
5050
+ constructor() {
5051
+ super(...arguments);
5052
+ /**
5053
+ * Autocomplete elements.
5054
+ * @default []
5055
+ */
5056
+ this.source = [];
5057
+ /**
5058
+ * Autocomplete if required.
5059
+ * @default false
5060
+ */
5061
+ this.required = false;
5062
+ /**
5063
+ * Prevents suggestions from appearing if fewer than N characters are typed
5064
+ * @default 0
5065
+ */
5066
+ this.minLength = 0;
5067
+ /**
5068
+ * Default value
5069
+ */
5070
+ this.defaultValue = '';
5071
+ /**
5072
+ * Function to set assistive hint label. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization
5073
+ */
5074
+ this.assistiveHintLabel = () => 'Quando i risultati del completamento automatico sono disponibili, usa le frecce su e giù per rivedere e Invio per selezionare. Utenti di dispositivi touch, esplora tramite tocco o con gesti di scorrimento';
5075
+ /**
5076
+ * Function to set label in case of no result. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization
5077
+ */
5078
+ this.noResultsLabel = () => 'Nessun risultato trovato';
5079
+ /**
5080
+ * Function to set label that alerts you that query's too short. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization
5081
+ */
5082
+ this.statusQueryTooShortLabel = minQueryLength => `Digita ${minQueryLength} o più caratteri per mostrare le opzioni di ricerca`;
5083
+ /**
5084
+ * Function to set no results label. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization
5085
+ */
5086
+ this.statusNoResultsLabel = () => 'Nessun risultato di ricerca';
5087
+ /**
5088
+ * Function to set selected option label. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization
5089
+ */
5090
+ this.statusSelectedOptionLabel = (selectedOption, length, index) => `${selectedOption} ${index + 1} di ${length} è sottolineato`;
5091
+ /**
5092
+ * Function to set status results label. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization
5093
+ */
5094
+ this.statusResultsLabel = (length, contentSelectedOption) => {
5095
+ const words = {
5096
+ result: length === 1 ? 'risultato' : 'risultati',
5097
+ is: length === 1 ? 'è' : 'sono',
5098
+ available: length === 1 ? 'disponibile' : 'disponibili',
5099
+ };
5100
+ return `${length} ${words.result} ${words.is} ${words.available}. ${contentSelectedOption}`;
5101
+ };
5102
+ /**
5103
+ * Fired when value changes
5104
+ */
5105
+ this.selected = new EventEmitter();
5106
+ this.value = '';
5107
+ this._interval = 0;
5108
+ this._inputEl = null;
5109
+ }
5110
+ ngOnInit() {
5111
+ super.ngOnInit();
5112
+ if (!this.control.value && !!this.value) {
5113
+ this.writeValue(this.value);
5114
+ this.onChange(this.value);
5115
+ }
5116
+ }
5117
+ clear() {
5118
+ this._inputEl.value = '';
5119
+ }
5120
+ _findInput() {
5121
+ this._interval = setInterval(() => {
5122
+ this._inputEl = document.getElementById(this.id);
5123
+ if (this._inputEl) {
5124
+ clearInterval(this._interval);
5125
+ this._initInputEl();
5126
+ }
5127
+ }, 500);
5128
+ }
5129
+ _setAndCheck(value) {
5130
+ this.value = value == '' ? undefined : value;
5131
+ if (this.control.touched) {
5132
+ this.writeValue(this.value);
5133
+ this.onChange(this.value);
5134
+ }
5135
+ if (this.isValid == false && this.isInvalid == false) {
5136
+ this._inputEl?.classList.remove('just-validate-success-field');
5137
+ this._inputEl?.classList.remove('is-invalid');
5138
+ }
5139
+ else if (this.isValid == true) {
5140
+ this._inputEl?.classList.add('just-validate-success-field');
5141
+ this._inputEl?.classList.remove('is-invalid');
5142
+ }
5143
+ else if (this.isInvalid == true) {
5144
+ this._inputEl?.classList.add('is-invalid');
5145
+ this._inputEl?.classList.remove('just-validate-success-field');
5146
+ }
5147
+ }
5148
+ _initInputEl() {
5149
+ if (this._inputEl) {
5150
+ this._inputEl.onfocus = (ev) => this._setAndCheck(ev.target.value);
5151
+ this._inputEl.onblur = (ev) => this._setAndCheck(ev.target.value);
5152
+ this._inputEl.oninput = (ev) => {
5153
+ this.markAsTouched();
5154
+ this._setAndCheck(ev.target.value);
5155
+ };
5156
+ }
5157
+ }
5158
+ ngAfterViewInit() {
5159
+ if (this.selectAutocompleteEl) {
5160
+ super.ngAfterViewInit();
5161
+ const element = this.selectAutocompleteEl.nativeElement;
5162
+ this.selectAutocomplete = new SelectAutocomplete(element, {
5163
+ id: this.id,
5164
+ name: this.name || this.id,
5165
+ source: this.source,
5166
+ required: this.required,
5167
+ minLength: this.minLength,
5168
+ defaultValue: this.defaultValue,
5169
+ tAssistiveHint: this.assistiveHintLabel,
5170
+ tNoResults: this.noResultsLabel,
5171
+ tStatusQueryTooShort: this.statusQueryTooShortLabel,
5172
+ tStatusNoResults: this.statusNoResultsLabel,
5173
+ tStatusSelectedOption: this.statusSelectedOptionLabel,
5174
+ tStatusResults: this.statusResultsLabel,
5175
+ onConfirm: (selectedElement) => {
5176
+ this.markAsTouched();
5177
+ this._setAndCheck(selectedElement);
5178
+ this.selected.emit(selectedElement);
5179
+ },
5180
+ });
5181
+ this._findInput();
5182
+ }
5183
+ }
5184
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItAutocompleteComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
5185
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItAutocompleteComponent, isStandalone: true, selector: "it-autocomplete", inputs: { source: "source", required: "required", name: "name", description: "description", minLength: "minLength", defaultValue: "defaultValue", assistiveHintLabel: "assistiveHintLabel", noResultsLabel: "noResultsLabel", statusQueryTooShortLabel: "statusQueryTooShortLabel", statusNoResultsLabel: "statusNoResultsLabel", statusSelectedOptionLabel: "statusSelectedOptionLabel", statusResultsLabel: "statusResultsLabel" }, outputs: { selected: "selected" }, viewQueries: [{ propertyName: "selectAutocompleteEl", first: true, predicate: ["selectAutocomplete"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"form-group\">\n @if (label) {\n <label [for]=\"id\" [class.active]=\"!!control.value\">{{ label }}</label>\n }\n <div #selectAutocomplete name=\"region\" [id]=\"id + 'Wrapper'\" class=\"autocomplete-wrapper\"></div>\n\n @if (description) {\n <small [id]=\"id + '-description'\" class=\"form-text\">{{ description }}</small>\n }\n @if (isInvalid) {\n <div class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError><ng-content select=\"[error]\"></ng-content></div>\n @if (!customError.hasChildNodes()) {\n {{ invalidMessage | async }}\n }\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5186
+ }
5187
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItAutocompleteComponent, decorators: [{
5188
+ type: Component,
5189
+ args: [{ standalone: true, selector: 'it-autocomplete', changeDetection: ChangeDetectionStrategy.OnPush, imports: [ReactiveFormsModule, AsyncPipe], template: "<div class=\"form-group\">\n @if (label) {\n <label [for]=\"id\" [class.active]=\"!!control.value\">{{ label }}</label>\n }\n <div #selectAutocomplete name=\"region\" [id]=\"id + 'Wrapper'\" class=\"autocomplete-wrapper\"></div>\n\n @if (description) {\n <small [id]=\"id + '-description'\" class=\"form-text\">{{ description }}</small>\n }\n @if (isInvalid) {\n <div class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError><ng-content select=\"[error]\"></ng-content></div>\n @if (!customError.hasChildNodes()) {\n {{ invalidMessage | async }}\n }\n </div>\n }\n</div>\n" }]
5190
+ }], propDecorators: { source: [{
5191
+ type: Input
5192
+ }], required: [{
5193
+ type: Input
5194
+ }], name: [{
5195
+ type: Input
5196
+ }], description: [{
5197
+ type: Input
5198
+ }], minLength: [{
5199
+ type: Input
5200
+ }], defaultValue: [{
5201
+ type: Input
5202
+ }], assistiveHintLabel: [{
5203
+ type: Input
5204
+ }], noResultsLabel: [{
5205
+ type: Input
5206
+ }], statusQueryTooShortLabel: [{
5207
+ type: Input
5208
+ }], statusNoResultsLabel: [{
5209
+ type: Input
5210
+ }], statusSelectedOptionLabel: [{
5211
+ type: Input
5212
+ }], statusResultsLabel: [{
5213
+ type: Input
5214
+ }], selected: [{
5215
+ type: Output
5216
+ }], selectAutocompleteEl: [{
5217
+ type: ViewChild,
5218
+ args: ['selectAutocomplete']
5219
+ }] } });
5220
+
5027
5221
  const formComponents = [
5028
5222
  ItAutocompleteComponent,
5223
+ ItSearchComponent,
5029
5224
  ItCheckboxComponent,
5030
5225
  ItInputComponent,
5031
5226
  ItPasswordInputComponent,
@@ -5041,6 +5236,7 @@ const formComponents = [
5041
5236
  class ItFormModule {
5042
5237
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItFormModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
5043
5238
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.6", ngImport: i0, type: ItFormModule, imports: [ItAutocompleteComponent,
5239
+ ItSearchComponent,
5044
5240
  ItCheckboxComponent,
5045
5241
  ItInputComponent,
5046
5242
  ItPasswordInputComponent,
@@ -5052,6 +5248,7 @@ class ItFormModule {
5052
5248
  ItTransferComponent,
5053
5249
  ItUploadDragDropComponent,
5054
5250
  ItUploadFileListComponent], exports: [ItAutocompleteComponent,
5251
+ ItSearchComponent,
5055
5252
  ItCheckboxComponent,
5056
5253
  ItInputComponent,
5057
5254
  ItPasswordInputComponent,
@@ -5597,7 +5794,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
5597
5794
  args: [{
5598
5795
  selector: 'it-navscroll-list-item',
5599
5796
  standalone: true,
5600
- imports: [RouterLink, RouterLinkActive, RouterLinkWithHref, ItNavscrollListItemsComponent, AsyncPipe],
5797
+ imports: [RouterLink, RouterLinkActive, RouterLinkWithHref, AsyncPipe],
5601
5798
  changeDetection: ChangeDetectionStrategy.OnPush,
5602
5799
  template: `
5603
5800
  <a
@@ -5817,6 +6014,60 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
5817
6014
  args: ['class']
5818
6015
  }] } });
5819
6016
 
6017
+ class ItSkiplinkComponent {
6018
+ constructor() {
6019
+ /**
6020
+ * Aria label for `nav` mode
6021
+ * @default 'Scorciatoie di navigazione'
6022
+ */
6023
+ this.ariaLabel = 'Scorciatoie di navigazione';
6024
+ }
6025
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6026
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItSkiplinkComponent, isStandalone: true, selector: "it-skiplink", inputs: { ariaLabel: "ariaLabel", nav: ["nav", "nav", inputToBoolean] }, exportAs: ["itSkipLink"], ngImport: i0, template: "@if (nav) {\n <nav class=\"skiplinks\">\n <ul>\n <ng-container *ngTemplateOutlet=\"linkContent\"></ng-container>\n </ul>\n </nav>\n} @else {\n <div class=\"skiplinks\">\n <ng-container *ngTemplateOutlet=\"linkContent\"></ng-container>\n </div>\n}\n\n<ng-template #linkContent>\n <ng-content></ng-content>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6027
+ }
6028
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkComponent, decorators: [{
6029
+ type: Component,
6030
+ args: [{ standalone: true, selector: 'it-skiplink', exportAs: 'itSkipLink', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet, TranslateModule, ItLinkComponent], template: "@if (nav) {\n <nav class=\"skiplinks\">\n <ul>\n <ng-container *ngTemplateOutlet=\"linkContent\"></ng-container>\n </ul>\n </nav>\n} @else {\n <div class=\"skiplinks\">\n <ng-container *ngTemplateOutlet=\"linkContent\"></ng-container>\n </div>\n}\n\n<ng-template #linkContent>\n <ng-content></ng-content>\n</ng-template>\n" }]
6031
+ }], propDecorators: { ariaLabel: [{
6032
+ type: Input
6033
+ }], nav: [{
6034
+ type: Input,
6035
+ args: [{ transform: inputToBoolean }]
6036
+ }] } });
6037
+
6038
+ class ItSkiplinkItemComponent {
6039
+ constructor(parent) {
6040
+ this.inNav = parent.nav ? true : false;
6041
+ }
6042
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkItemComponent, deps: [{ token: ItSkiplinkComponent, host: true }], target: i0.ɵɵFactoryTarget.Component }); }
6043
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItSkiplinkItemComponent, isStandalone: true, selector: "it-skiplink-item", inputs: { href: "href", externalLink: ["externalLink", "externalLink", inputToBoolean] }, exportAs: ["itSkipLinkItem"], ngImport: i0, template: "@if (inNav) {\n <li class=\"visually-hidden-focusable\">\n <it-link [href]=\"href\" [externalLink]=\"externalLink\">\n <ng-container *ngTemplateOutlet=\"linkContent\"></ng-container>\n </it-link>\n </li>\n} @else {\n <it-link class=\"visually-hidden-focusable\" [href]=\"href\" [externalLink]=\"externalLink\">\n <ng-container *ngTemplateOutlet=\"linkContent\"></ng-container>\n </it-link>\n}\n\n<ng-template #linkContent>\n <ng-content></ng-content>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: ItLinkComponent, selector: "it-link", inputs: ["href", "externalLink", "disabled", "class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6044
+ }
6045
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkItemComponent, decorators: [{
6046
+ type: Component,
6047
+ args: [{ standalone: true, selector: 'it-skiplink-item', exportAs: 'itSkipLinkItem', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet, TranslateModule, ItLinkComponent], template: "@if (inNav) {\n <li class=\"visually-hidden-focusable\">\n <it-link [href]=\"href\" [externalLink]=\"externalLink\">\n <ng-container *ngTemplateOutlet=\"linkContent\"></ng-container>\n </it-link>\n </li>\n} @else {\n <it-link class=\"visually-hidden-focusable\" [href]=\"href\" [externalLink]=\"externalLink\">\n <ng-container *ngTemplateOutlet=\"linkContent\"></ng-container>\n </it-link>\n}\n\n<ng-template #linkContent>\n <ng-content></ng-content>\n</ng-template>\n" }]
6048
+ }], ctorParameters: () => [{ type: ItSkiplinkComponent, decorators: [{
6049
+ type: Host
6050
+ }] }], propDecorators: { href: [{
6051
+ type: Input
6052
+ }], externalLink: [{
6053
+ type: Input,
6054
+ args: [{ transform: inputToBoolean }]
6055
+ }] } });
6056
+
6057
+ const skiplinkComponents = [ItSkiplinkComponent, ItSkiplinkItemComponent];
6058
+ class ItSkiplinkModule {
6059
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
6060
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkModule, imports: [ItSkiplinkComponent, ItSkiplinkItemComponent], exports: [ItSkiplinkComponent, ItSkiplinkItemComponent] }); }
6061
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkModule, imports: [skiplinkComponents] }); }
6062
+ }
6063
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkModule, decorators: [{
6064
+ type: NgModule,
6065
+ args: [{
6066
+ imports: skiplinkComponents,
6067
+ exports: skiplinkComponents,
6068
+ }]
6069
+ }] });
6070
+
5820
6071
  class ItErrorPageComponent {
5821
6072
  constructor(route) {
5822
6073
  this.route = route;
@@ -6088,60 +6339,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
6088
6339
  }]
6089
6340
  }] });
6090
6341
 
6091
- class ItSkiplinkComponent {
6092
- constructor() {
6093
- /**
6094
- * Aria label for `nav` mode
6095
- * @default 'Scorciatoie di navigazione'
6096
- */
6097
- this.ariaLabel = 'Scorciatoie di navigazione';
6098
- }
6099
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6100
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItSkiplinkComponent, isStandalone: true, selector: "it-skiplink", inputs: { ariaLabel: "ariaLabel", nav: ["nav", "nav", inputToBoolean] }, exportAs: ["itSkipLink"], ngImport: i0, template: "@if (nav) {\n <nav class=\"skiplinks\">\n <ul>\n <ng-container *ngTemplateOutlet=\"linkContent\"></ng-container>\n </ul>\n </nav>\n} @else {\n <div class=\"skiplinks\">\n <ng-container *ngTemplateOutlet=\"linkContent\"></ng-container>\n </div>\n}\n\n<ng-template #linkContent>\n <ng-content></ng-content>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6101
- }
6102
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkComponent, decorators: [{
6103
- type: Component,
6104
- args: [{ standalone: true, selector: 'it-skiplink', exportAs: 'itSkipLink', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet, TranslateModule, ItLinkComponent], template: "@if (nav) {\n <nav class=\"skiplinks\">\n <ul>\n <ng-container *ngTemplateOutlet=\"linkContent\"></ng-container>\n </ul>\n </nav>\n} @else {\n <div class=\"skiplinks\">\n <ng-container *ngTemplateOutlet=\"linkContent\"></ng-container>\n </div>\n}\n\n<ng-template #linkContent>\n <ng-content></ng-content>\n</ng-template>\n" }]
6105
- }], propDecorators: { ariaLabel: [{
6106
- type: Input
6107
- }], nav: [{
6108
- type: Input,
6109
- args: [{ transform: inputToBoolean }]
6110
- }] } });
6111
-
6112
- class ItSkiplinkItemComponent {
6113
- constructor(parent) {
6114
- this.inNav = parent.nav ? true : false;
6115
- }
6116
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkItemComponent, deps: [{ token: ItSkiplinkComponent, host: true }], target: i0.ɵɵFactoryTarget.Component }); }
6117
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItSkiplinkItemComponent, isStandalone: true, selector: "it-skiplink-item", inputs: { href: "href", externalLink: ["externalLink", "externalLink", inputToBoolean] }, exportAs: ["itSkipLinkItem"], ngImport: i0, template: "@if (inNav) {\n <li class=\"visually-hidden-focusable\">\n <it-link [href]=\"href\" [externalLink]=\"externalLink\">\n <ng-container *ngTemplateOutlet=\"linkContent\"></ng-container>\n </it-link>\n </li>\n} @else {\n <it-link class=\"visually-hidden-focusable\" [href]=\"href\" [externalLink]=\"externalLink\">\n <ng-container *ngTemplateOutlet=\"linkContent\"></ng-container>\n </it-link>\n}\n\n<ng-template #linkContent>\n <ng-content></ng-content>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: ItLinkComponent, selector: "it-link", inputs: ["href", "externalLink", "disabled", "class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6118
- }
6119
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkItemComponent, decorators: [{
6120
- type: Component,
6121
- args: [{ standalone: true, selector: 'it-skiplink-item', exportAs: 'itSkipLinkItem', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet, TranslateModule, ItLinkComponent], template: "@if (inNav) {\n <li class=\"visually-hidden-focusable\">\n <it-link [href]=\"href\" [externalLink]=\"externalLink\">\n <ng-container *ngTemplateOutlet=\"linkContent\"></ng-container>\n </it-link>\n </li>\n} @else {\n <it-link class=\"visually-hidden-focusable\" [href]=\"href\" [externalLink]=\"externalLink\">\n <ng-container *ngTemplateOutlet=\"linkContent\"></ng-container>\n </it-link>\n}\n\n<ng-template #linkContent>\n <ng-content></ng-content>\n</ng-template>\n" }]
6122
- }], ctorParameters: () => [{ type: ItSkiplinkComponent, decorators: [{
6123
- type: Host
6124
- }] }], propDecorators: { href: [{
6125
- type: Input
6126
- }], externalLink: [{
6127
- type: Input,
6128
- args: [{ transform: inputToBoolean }]
6129
- }] } });
6130
-
6131
- const skiplinkComponents = [ItSkiplinkComponent, ItSkiplinkItemComponent];
6132
- class ItSkiplinkModule {
6133
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
6134
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkModule, imports: [ItSkiplinkComponent, ItSkiplinkItemComponent], exports: [ItSkiplinkComponent, ItSkiplinkItemComponent] }); }
6135
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkModule, imports: [skiplinkComponents] }); }
6136
- }
6137
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkModule, decorators: [{
6138
- type: NgModule,
6139
- args: [{
6140
- imports: skiplinkComponents,
6141
- exports: skiplinkComponents,
6142
- }]
6143
- }] });
6144
-
6145
6342
  /**
6146
6343
  * Configures DesignAngularKit library
6147
6344
  * @param config the DesignAngularKit config
@@ -6230,6 +6427,7 @@ const core = [
6230
6427
  ItTableModule,
6231
6428
  ItTooltipDirective,
6232
6429
  ItTimelineModule,
6430
+ ItVideoPlayerComponent,
6233
6431
  ];
6234
6432
  /**
6235
6433
  * Navigation Components
@@ -6299,7 +6497,8 @@ class DesignAngularKitModule {
6299
6497
  ItTabModule,
6300
6498
  ItTableModule,
6301
6499
  ItTooltipDirective,
6302
- ItTimelineModule, // Core components
6500
+ ItTimelineModule,
6501
+ ItVideoPlayerComponent, // Core components
6303
6502
  ItFormModule, ItBackButtonComponent,
6304
6503
  ItBackToTopComponent,
6305
6504
  ItBreadcrumbsModule,
@@ -6334,7 +6533,8 @@ class DesignAngularKitModule {
6334
6533
  ItTabModule,
6335
6534
  ItTableModule,
6336
6535
  ItTooltipDirective,
6337
- ItTimelineModule, // Core components
6536
+ ItTimelineModule,
6537
+ ItVideoPlayerComponent, // Core components
6338
6538
  ItFormModule, ItBackButtonComponent,
6339
6539
  ItBackToTopComponent,
6340
6540
  ItBreadcrumbsModule,
@@ -6386,6 +6586,498 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
6386
6586
  }]
6387
6587
  }] });
6388
6588
 
6589
+ class VideoPlayerI18nService {
6590
+ #translate = inject(TranslateService);
6591
+ init(player, destroyRef) {
6592
+ this.#translate.onLangChange
6593
+ .pipe(takeUntilDestroyed(destroyRef), tap({
6594
+ next: e => {
6595
+ const language = e.lang;
6596
+ videojs.addLanguage(language, this.getTranslations());
6597
+ player.language(language);
6598
+ },
6599
+ }))
6600
+ .subscribe(x => {
6601
+ console.log('onLangChange', x);
6602
+ });
6603
+ }
6604
+ getLanguage() {
6605
+ const language = this.#translate.currentLang ?? 'it';
6606
+ return {
6607
+ languages: { [language]: mapToVideoJsTranslation(this.#translate.instant('it.video-player')) },
6608
+ language,
6609
+ };
6610
+ }
6611
+ getTranslations() {
6612
+ return mapToVideoJsTranslation(this.#translate.instant('it.video-player'));
6613
+ }
6614
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: VideoPlayerI18nService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6615
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: VideoPlayerI18nService, providedIn: 'root' }); }
6616
+ }
6617
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: VideoPlayerI18nService, decorators: [{
6618
+ type: Injectable,
6619
+ args: [{ providedIn: 'root' }]
6620
+ }] });
6621
+ function mapToVideoJsTranslation(translations) {
6622
+ return {
6623
+ 'Audio Player': translations['audio-player'],
6624
+ 'Video Player': translations['video-player'],
6625
+ Play: translations.play,
6626
+ Pause: translations.pause,
6627
+ Replay: translations.replay,
6628
+ 'Current Time': translations['current-time'],
6629
+ Duration: translations.duration,
6630
+ 'Remaining Time': translations['remaining-time'],
6631
+ 'Stream Type': translations['stream-type'],
6632
+ LIVE: translations.live,
6633
+ Loaded: translations.loaded,
6634
+ Progress: translations.progress,
6635
+ 'Progress Bar': translations['progress-bar'],
6636
+ 'progress bar timing: currentTime={1} duration={2}': translations['progress-bar-timing:-currenttime={1}-duration={2}'],
6637
+ Fullscreen: translations.fullscreen,
6638
+ 'Exit Fullscreen': translations['exit-fullscreen'],
6639
+ Mute: translations.mute,
6640
+ Unmute: translations.unmute,
6641
+ 'Playback Rate': translations['playback-rate'],
6642
+ Subtitles: translations.subtitles,
6643
+ 'subtitles off': translations['subtitles-off'],
6644
+ Captions: translations.captions,
6645
+ 'captions off': translations['captions-off'],
6646
+ Chapters: translations.chapters,
6647
+ Descriptions: translations.descriptions,
6648
+ 'descriptions off': translations['descriptions-off'],
6649
+ 'Audio Track': translations['audio-track'],
6650
+ 'Volume Level': translations['volume-level'],
6651
+ 'You aborted the media playback': translations['you-aborted-the-media-playback'],
6652
+ 'A network error caused the media download to fail part-way.': translations['a-network-error-caused-the-media-download-to-fail-part-way.'],
6653
+ 'The media could not be loaded, either because the server or network failed or because the format is not supported.': translations['the-media-could-not-be-loaded,-either-because-the-server-or-network-failed-or-because-the-format-is-not-supported.'],
6654
+ 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.': translations['the-media-playback-was-aborted-due-to-a-corruption-problem-or-because-the-media-used-features-your-browser-did-not-support.'],
6655
+ 'No compatible source was found for this media.': translations['no-compatible-source-was-found-for-this-media.'],
6656
+ 'The media is encrypted and we do not have the keys to decrypt it.': translations['the-media-is-encrypted-and-we-do-not-have-the-keys-to-decrypt-it.'],
6657
+ 'Play Video': translations['play-video'],
6658
+ Close: translations.close,
6659
+ 'Close Modal Dialog': translations['close-modal-dialog'],
6660
+ 'Modal Window': translations['modal-window'],
6661
+ 'This is a modal window': translations['this-is-a-modal-window'],
6662
+ 'This modal can be closed by pressing the Escape key or activating the close button.': translations['this-modal-can-be-closed-by-pressing-the-escape-key-or-activating-the-close-button.'],
6663
+ ', opens captions settings dialog': translations[',-opens-captions-settings-dialog'],
6664
+ ', opens subtitles settings dialog': translations[',-opens-subtitles-settings-dialog'],
6665
+ ', opens descriptions settings dialog': translations[',-opens-descriptions-settings-dialog'],
6666
+ ', selected': translations[',-selected'],
6667
+ 'captions settings': translations['captions-settings'],
6668
+ 'subtitles settings': translations['subtitles-settings'],
6669
+ 'descriptions settings': translations['descriptions-settings'],
6670
+ Text: translations.text,
6671
+ White: translations.white,
6672
+ Black: translations.black,
6673
+ Red: translations.red,
6674
+ Green: translations.green,
6675
+ Blue: translations.blue,
6676
+ Yellow: translations.yellow,
6677
+ Magenta: translations.magenta,
6678
+ Cyan: translations.cyan,
6679
+ Background: translations.background,
6680
+ Window: translations.window,
6681
+ Transparent: translations.transparent,
6682
+ 'Semi-Transparent': translations['semi-transparent'],
6683
+ Opaque: translations.opaque,
6684
+ 'Font Size': translations['font-size'],
6685
+ 'Text Edge Style': translations['text-edge-style'],
6686
+ None: translations.none,
6687
+ Uniform: translations.uniform,
6688
+ 'Drop shadow': translations['drop-shadow'],
6689
+ 'Font Family': translations['font-family'],
6690
+ 'Proportional Sans-Serif': translations['proportional-sans-serif'],
6691
+ 'Monospace Sans-Serif': translations['monospace-sans-serif'],
6692
+ 'Proportional Serif': translations['proportional-serif'],
6693
+ 'Monospace Serif': translations['monospace-serif'],
6694
+ 'Small Caps': translations['small-caps'],
6695
+ Reset: translations.reset,
6696
+ 'restore all settings to the default values': translations['restore-all-settings-to-the-default-values'],
6697
+ Done: translations.done,
6698
+ 'Caption Settings Dialog': translations['caption-settings-dialog'],
6699
+ 'Beginning of dialog window. Escape will cancel and close the window.': translations['beginning-of-dialog-window.-escape-will-cancel-and-close-the-window.'],
6700
+ 'End of dialog window.': translations['end-of-dialog-window.'],
6701
+ '{1} is loading.': translations['{1}-is-loading.'],
6702
+ 'Exit Picture-in-Picture': translations['exit-picture-in-picture'],
6703
+ 'Picture-in-Picture': translations['picture-in-picture'],
6704
+ Color: translations.color,
6705
+ Opacity: translations.opacity,
6706
+ 'Text Background': translations['text-background'],
6707
+ 'Caption Area Background': translations['caption-area-background'],
6708
+ 'Skip forward {1} seconds': translations['skip-forward-{1}-seconds'],
6709
+ 'Skip backward {1} seconds': translations['skip-backward-{1}-seconds'],
6710
+ };
6711
+ }
6712
+
6713
+ const preferencesMap = { ck3: {} };
6714
+ const STORAGE_KEY = 'bs-ck3';
6715
+ /*
6716
+ Possible choices:
6717
+ false => Accept once
6718
+ true => Accept always
6719
+ */
6720
+ const rememberChoice = (service, remember) => {
6721
+ preferencesMap.ck3[service] = remember;
6722
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(preferencesMap.ck3));
6723
+ };
6724
+ const isChoiceRemembered = (service) => {
6725
+ preferencesMap.ck3 = JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}');
6726
+ return Boolean(preferencesMap.ck3[service]) || false;
6727
+ };
6728
+ const clearAllRememberedChoices = () => {
6729
+ localStorage.removeItem(STORAGE_KEY);
6730
+ };
6731
+ const cookies = {
6732
+ rememberChoice,
6733
+ isChoiceRemembered,
6734
+ clearAllRememberedChoices,
6735
+ };
6736
+
6737
+ const hasYoutubeVideo = (options) => options.source?.type === 'video/youtube';
6738
+ class VideoPlayerConfigService {
6739
+ #languageService = inject(VideoPlayerI18nService);
6740
+ async configureTech({ tech }) {
6741
+ if (tech === 'youtube') {
6742
+ initYoutubePlugin(videojs);
6743
+ }
6744
+ }
6745
+ mergeConfig(o) {
6746
+ const options = o;
6747
+ const captions = options.captions ? options.captions.map(c => ({ ...c, kind: 'captions' })) : [];
6748
+ const chapters = options.chapters ? options.chapters.map(c => ({ ...c, kind: 'chapters' })) : [];
6749
+ const isYoutubeVideo = hasYoutubeVideo(options);
6750
+ const DEFAULT_CONFIG = this.#languageService.getLanguage();
6751
+ const tech = isYoutubeVideo ? 'youtube' : 'html5';
6752
+ const techOrder = [tech];
6753
+ //https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video#preload
6754
+ const preload = options.preload ?? 'metadata';
6755
+ const config = { ...DEFAULT_CONFIG, ...options, preload, techOrder, tracks: [...captions, ...chapters], tech: 'html5' };
6756
+ return isYoutubeVideo
6757
+ ? {
6758
+ ...config,
6759
+ sources: [o.source],
6760
+ tech: 'youtube',
6761
+ youtube: { ytControls: 2, rel: 0, fs: 0, modestbranding: 1 },
6762
+ }
6763
+ : config;
6764
+ }
6765
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: VideoPlayerConfigService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6766
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: VideoPlayerConfigService, providedIn: 'root' }); }
6767
+ }
6768
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: VideoPlayerConfigService, decorators: [{
6769
+ type: Injectable,
6770
+ args: [{ providedIn: 'root' }]
6771
+ }] });
6772
+
6773
+ var ViewType;
6774
+ (function (ViewType) {
6775
+ ViewType["Default"] = "DEFAULT";
6776
+ ViewType["Overlay"] = "OVERLAY";
6777
+ })(ViewType || (ViewType = {}));
6778
+ /**
6779
+ * Video Player
6780
+ * @description Component that allows playing a video.
6781
+ */
6782
+ class ItVideoPlayerComponent extends ItAbstractComponent {
6783
+ #destroyRef;
6784
+ get viewType() {
6785
+ return this.viewType$.value;
6786
+ }
6787
+ constructor(config) {
6788
+ super();
6789
+ this.config = config;
6790
+ this.viewTypes = ViewType;
6791
+ this.viewType$ = new BehaviorSubject(undefined);
6792
+ this.cookieAccepted$ = new BehaviorSubject(false);
6793
+ this.i18nService = inject(VideoPlayerI18nService);
6794
+ this.#destroyRef = inject(DestroyRef);
6795
+ }
6796
+ async ngOnInit() {
6797
+ const config = this.config.mergeConfig(this.options);
6798
+ this.setViewType(config);
6799
+ await this.config.configureTech(config);
6800
+ if (!this.videoPlayerRef) {
6801
+ this.cookieAccepted$
6802
+ .pipe(takeUntilDestroyed(this.#destroyRef), delay(0), tap({
6803
+ next: value => {
6804
+ if (value && !this.player) {
6805
+ this.initVideoPlayer();
6806
+ }
6807
+ },
6808
+ }))
6809
+ .subscribe();
6810
+ return;
6811
+ }
6812
+ this.initVideoPlayer();
6813
+ }
6814
+ ngAfterViewInit() {
6815
+ if (this.viewType === ViewType.Overlay && cookies.isChoiceRemembered('youtube.com')) {
6816
+ this.hideOverlay();
6817
+ }
6818
+ }
6819
+ ngOnDestroy() {
6820
+ if (this.player) {
6821
+ this.player.dispose();
6822
+ }
6823
+ }
6824
+ acceptCookieHandler() {
6825
+ this.rememberHandler();
6826
+ this.hideOverlay();
6827
+ this.cookieAccepted$.next(true);
6828
+ }
6829
+ initVideoPlayer() {
6830
+ const config = this.config.mergeConfig(this.options);
6831
+ this.setVideoAttributes(config);
6832
+ this.setVideoPlayer();
6833
+ }
6834
+ setVideoPlayer() {
6835
+ const config = this.config.mergeConfig(this.options);
6836
+ const onPlayerReadyCb = () => {
6837
+ if (!this.player) {
6838
+ return;
6839
+ }
6840
+ this.i18nService.init(this.player, this.#destroyRef);
6841
+ };
6842
+ if (!this.videoPlayerRef) {
6843
+ throw Error('videoPlayerRef is undefined');
6844
+ }
6845
+ this.player = videojs(this.videoPlayerRef.nativeElement, config, onPlayerReadyCb.bind(this));
6846
+ }
6847
+ setViewType(config) {
6848
+ this.viewType$.next(config.tech === 'youtube' ? ViewType.Overlay : ViewType.Default);
6849
+ this.cookieAccepted$.next(this.viewType === ViewType.Overlay && cookies.isChoiceRemembered('youtube.com'));
6850
+ }
6851
+ hideOverlay() {
6852
+ if (!this.acceptOverlayableRef) {
6853
+ return;
6854
+ }
6855
+ const classes = ['show'];
6856
+ this.acceptOverlayableRef.nativeElement.classList.remove(...classes);
6857
+ if (!this.acceptOveralyRef) {
6858
+ return;
6859
+ }
6860
+ this.acceptOveralyRef.nativeElement.classList.remove(...classes);
6861
+ this.acceptOveralyRef.nativeElement.setAttribute('aria-hidden', 'true');
6862
+ }
6863
+ rememberHandler() {
6864
+ if (!this.chrRememberRef) {
6865
+ return;
6866
+ }
6867
+ const remember = this.chrRememberRef.nativeElement.checked;
6868
+ cookies.rememberChoice('youtube.com', remember);
6869
+ }
6870
+ setVideoAttributes(options) {
6871
+ if (!this.videoPlayerRef) {
6872
+ return;
6873
+ }
6874
+ const v = this.videoPlayerRef.nativeElement;
6875
+ const { autoplay, controls, loop, muted, poster, fluid } = options;
6876
+ if (autoplay) {
6877
+ v.setAttribute('autoplay', autoplay.toString());
6878
+ }
6879
+ if (controls) {
6880
+ v.setAttribute('controls', '');
6881
+ }
6882
+ if (loop) {
6883
+ v.setAttribute('loop', '');
6884
+ }
6885
+ if (muted) {
6886
+ v.setAttribute('muted', '');
6887
+ }
6888
+ if (poster) {
6889
+ v.setAttribute('poster', poster);
6890
+ }
6891
+ if (fluid) {
6892
+ v.setAttribute('fluid', '');
6893
+ }
6894
+ v.setAttribute('preload', 'none');
6895
+ v.setAttribute('playsinline', '');
6896
+ }
6897
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItVideoPlayerComponent, deps: [{ token: VideoPlayerConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
6898
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItVideoPlayerComponent, isStandalone: true, selector: "it-video-player", inputs: { options: "options" }, viewQueries: [{ propertyName: "videoPlayerRef", first: true, predicate: ["videoPlayer"], descendants: true }, { propertyName: "acceptOveralyRef", first: true, predicate: ["acceptOveraly"], descendants: true }, { propertyName: "acceptOverlayableRef", first: true, predicate: ["acceptOverlayable"], descendants: true }, { propertyName: "chrRememberRef", first: true, predicate: ["chkRemember"], descendants: true }], usesInheritance: true, ngImport: i0, template: `@switch (viewType$ | async) {
6899
+ @case (viewTypes.Default) {
6900
+ <div class="row">
6901
+ <ng-container *ngTemplateOutlet="videoTemplate"></ng-container>
6902
+ <ng-container *ngTemplateOutlet="transcriptionTemplate"></ng-container>
6903
+ </div>
6904
+ }
6905
+ @case (viewTypes.Overlay) {
6906
+ <div #acceptOverlayable class="acceptoverlayable show">
6907
+ <div #acceptOveraly class="acceptoverlay acceptoverlay-primary fade show">
6908
+ <div class="acceptoverlay-inner">
6909
+ <div class="acceptoverlay-icon">
6910
+ <svg class="icon icon-xl"><use href="/bootstrap-italia/dist/svg/sprites.svg#it-video"></use></svg>
6911
+ </div>
6912
+ <p>
6913
+ Accetta i cookie di YouTube per vedere il video. Puoi gestire le preferenze nella
6914
+ <a href="#" class="text-white">cookie policy</a>.
6915
+ </p>
6916
+ <div class="acceptoverlay-buttons bg-dark">
6917
+ <button type="button" class="btn btn-primary" (click)="acceptCookieHandler()">Accetta</button>
6918
+ <div class="form-check">
6919
+ <input id="chk-remember{{ id }}" type="checkbox" #chkRemember />
6920
+ <label for="chk-remember{{ id }}">Ricorda per tutti i video</label>
6921
+ </div>
6922
+ </div>
6923
+ </div>
6924
+ </div>
6925
+ @if (cookieAccepted$ | async) {
6926
+ <div>
6927
+ <ng-container *ngTemplateOutlet="videoTemplate"></ng-container>
6928
+ <ng-container *ngTemplateOutlet="transcriptionTemplate"></ng-container>
6929
+ </div>
6930
+ }
6931
+ </div>
6932
+ }
6933
+ @default {
6934
+ <h1>No video provider</h1>
6935
+ }
6936
+ }
6937
+ <ng-template #videoTemplate>
6938
+ <div>
6939
+ <video #videoPlayer class="video-js vjs-theme-bootstrap-italia vjs-fluid vjs-big-play-centered"></video>
6940
+ </div>
6941
+ </ng-template>
6942
+
6943
+ <ng-template #transcriptionTemplate>
6944
+ <div class="vjs-transcription accordion">
6945
+ <div class="accordion-item">
6946
+ <h2 class="accordion-header " id="transcription-{{ id }}-head">
6947
+ <button
6948
+ class="accordion-button collapsed"
6949
+ type="button"
6950
+ data-bs-toggle="collapse"
6951
+ [attr.data-bs-target]="'#transcription-' + id"
6952
+ [attr.aria-controls]="'transcription-' + id"
6953
+ aria-expanded="true">
6954
+ <ng-content select="[transcriptionTitle]">Trascrizione</ng-content>
6955
+ </button>
6956
+ </h2>
6957
+ <div
6958
+ id="transcription-{{ id }}"
6959
+ class="accordion-collapse collapse"
6960
+ role="region"
6961
+ [attr.aria-labelledby]="'transcription-' + id + '-head'">
6962
+ <div class="accordion-body">
6963
+ <ng-content select="[transcriptionText]">-</ng-content>
6964
+ </div>
6965
+ </div>
6966
+ </div>
6967
+ </div>
6968
+ </ng-template> `, isInline: true, dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
6969
+ }
6970
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItVideoPlayerComponent, decorators: [{
6971
+ type: Component,
6972
+ args: [{
6973
+ standalone: true,
6974
+ selector: 'it-video-player',
6975
+ template: `@switch (viewType$ | async) {
6976
+ @case (viewTypes.Default) {
6977
+ <div class="row">
6978
+ <ng-container *ngTemplateOutlet="videoTemplate"></ng-container>
6979
+ <ng-container *ngTemplateOutlet="transcriptionTemplate"></ng-container>
6980
+ </div>
6981
+ }
6982
+ @case (viewTypes.Overlay) {
6983
+ <div #acceptOverlayable class="acceptoverlayable show">
6984
+ <div #acceptOveraly class="acceptoverlay acceptoverlay-primary fade show">
6985
+ <div class="acceptoverlay-inner">
6986
+ <div class="acceptoverlay-icon">
6987
+ <svg class="icon icon-xl"><use href="/bootstrap-italia/dist/svg/sprites.svg#it-video"></use></svg>
6988
+ </div>
6989
+ <p>
6990
+ Accetta i cookie di YouTube per vedere il video. Puoi gestire le preferenze nella
6991
+ <a href="#" class="text-white">cookie policy</a>.
6992
+ </p>
6993
+ <div class="acceptoverlay-buttons bg-dark">
6994
+ <button type="button" class="btn btn-primary" (click)="acceptCookieHandler()">Accetta</button>
6995
+ <div class="form-check">
6996
+ <input id="chk-remember{{ id }}" type="checkbox" #chkRemember />
6997
+ <label for="chk-remember{{ id }}">Ricorda per tutti i video</label>
6998
+ </div>
6999
+ </div>
7000
+ </div>
7001
+ </div>
7002
+ @if (cookieAccepted$ | async) {
7003
+ <div>
7004
+ <ng-container *ngTemplateOutlet="videoTemplate"></ng-container>
7005
+ <ng-container *ngTemplateOutlet="transcriptionTemplate"></ng-container>
7006
+ </div>
7007
+ }
7008
+ </div>
7009
+ }
7010
+ @default {
7011
+ <h1>No video provider</h1>
7012
+ }
7013
+ }
7014
+ <ng-template #videoTemplate>
7015
+ <div>
7016
+ <video #videoPlayer class="video-js vjs-theme-bootstrap-italia vjs-fluid vjs-big-play-centered"></video>
7017
+ </div>
7018
+ </ng-template>
7019
+
7020
+ <ng-template #transcriptionTemplate>
7021
+ <div class="vjs-transcription accordion">
7022
+ <div class="accordion-item">
7023
+ <h2 class="accordion-header " id="transcription-{{ id }}-head">
7024
+ <button
7025
+ class="accordion-button collapsed"
7026
+ type="button"
7027
+ data-bs-toggle="collapse"
7028
+ [attr.data-bs-target]="'#transcription-' + id"
7029
+ [attr.aria-controls]="'transcription-' + id"
7030
+ aria-expanded="true">
7031
+ <ng-content select="[transcriptionTitle]">Trascrizione</ng-content>
7032
+ </button>
7033
+ </h2>
7034
+ <div
7035
+ id="transcription-{{ id }}"
7036
+ class="accordion-collapse collapse"
7037
+ role="region"
7038
+ [attr.aria-labelledby]="'transcription-' + id + '-head'">
7039
+ <div class="accordion-body">
7040
+ <ng-content select="[transcriptionText]">-</ng-content>
7041
+ </div>
7042
+ </div>
7043
+ </div>
7044
+ </div>
7045
+ </ng-template> `,
7046
+ imports: [AsyncPipe, NgTemplateOutlet],
7047
+ encapsulation: ViewEncapsulation.None,
7048
+ changeDetection: ChangeDetectionStrategy.OnPush,
7049
+ }]
7050
+ }], ctorParameters: () => [{ type: VideoPlayerConfigService }], propDecorators: { options: [{
7051
+ type: Input
7052
+ }], videoPlayerRef: [{
7053
+ type: ViewChild,
7054
+ args: ['videoPlayer', { static: false }]
7055
+ }], acceptOveralyRef: [{
7056
+ type: ViewChild,
7057
+ args: ['acceptOveraly', { static: false }]
7058
+ }], acceptOverlayableRef: [{
7059
+ type: ViewChild,
7060
+ args: ['acceptOverlayable', { static: false }]
7061
+ }], chrRememberRef: [{
7062
+ type: ViewChild,
7063
+ args: ['chkRemember', { static: false }]
7064
+ }] } });
7065
+
7066
+ // See options: https://videojs.com/guides/options
7067
+
7068
+ class ItVideoPlayerModule {
7069
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItVideoPlayerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
7070
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.6", ngImport: i0, type: ItVideoPlayerModule, imports: [ItVideoPlayerComponent], exports: [ItVideoPlayerComponent] }); }
7071
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItVideoPlayerModule }); }
7072
+ }
7073
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItVideoPlayerModule, decorators: [{
7074
+ type: NgModule,
7075
+ args: [{
7076
+ imports: [ItVideoPlayerComponent],
7077
+ exports: [ItVideoPlayerComponent],
7078
+ }]
7079
+ }] });
7080
+
6389
7081
  //Qs
6390
7082
  //Aria hidden?
6391
7083
  //state management with service?
@@ -6727,5 +7419,5 @@ class ItDateUtils {
6727
7419
  * Generated bundle index. Do not edit.
6728
7420
  */
6729
7421
 
6730
- export { CAP_REGEX, DesignAngularKitModule, EMAIL_REGEX, IBAN_REGEX, ITALIAN_TAX_CODE_REGEX, IT_ASSET_BASE_PATH, IT_SORT_DEFAULT_OPTIONS, IconNameArray, ItAccordionComponent, ItAlertComponent, ItAutocompleteComponent, ItAvatarDirective, ItAvatarDropdownComponent, ItAvatarDropdownItemComponent, ItAvatarGroupComponent, ItAvatarGroupItemComponent, ItAvatarModule, ItBackButtonComponent, ItBackToTopComponent, ItBadgeDirective, ItBreadcrumbComponent, ItBreadcrumbItemComponent, ItBreadcrumbsModule, ItButtonDirective, ItCalloutComponent, ItCardComponent, ItCarouselComponent, ItCarouselItemComponent, ItCarouselModule, ItCheckboxComponent, ItChipComponent, ItCollapseComponent, ItDateAgoPipe, ItDateUtils, ItDimmerButtonsComponent, ItDimmerComponent, ItDimmerIconComponent, ItDimmerModule, ItDropdownComponent, ItDropdownItemComponent, ItDropdownModule, ItDurationPipe, ItErrorPageComponent, ItFileUtils, ItFormModule, ItForwardDirective, ItHeaderComponent, ItIconComponent, ItInputComponent, ItLanguageSwitcherComponent, ItLinkComponent, ItListComponent, ItListItemComponent, ItListModule, ItMarkMatchingTextPipe, ItMegamenuComponent, ItModalComponent, ItNavBarComponent, ItNavBarItemComponent, ItNavBarModule, ItNavscrollComponent, ItNotificationService, ItNotificationsComponent, ItPaginationComponent, ItPasswordInputComponent, ItPopoverDirective, ItProgressBarComponent, ItProgressButtonComponent, ItRadioButtonComponent, ItRangeComponent, ItRatingComponent, ItSelectComponent, ItSidebarComponent, ItSkiplinkComponent, ItSkiplinkItemComponent, ItSkiplinkModule, ItSortDirective, ItSortHeaderComponent, ItSpinnerComponent, ItSteppersContainerComponent, ItSteppersItemComponent, ItSteppersModule, ItTabContainerComponent, ItTabItemComponent, ItTabModule, ItTableComponent, ItTableModule, ItTextareaComponent, ItTimelineComponent, ItTimelineItemComponent, ItTimelineModule, ItTooltipDirective, ItTransferComponent, ItUploadDragDropComponent, ItUploadFileListComponent, ItValidators, NotificationPosition, NotificationType, PHONE_NUMBER_REGEX, PLATE_REGEX, URL_REGEX, VAT_NUMBER_REGEX, provideDesignAngularKit };
7422
+ export { CAP_REGEX, DesignAngularKitModule, EMAIL_REGEX, IBAN_REGEX, ITALIAN_TAX_CODE_REGEX, IT_ASSET_BASE_PATH, IT_SORT_DEFAULT_OPTIONS, IconNameArray, ItAccordionComponent, ItAlertComponent, ItAutocompleteComponent, ItAvatarDirective, ItAvatarDropdownComponent, ItAvatarDropdownItemComponent, ItAvatarGroupComponent, ItAvatarGroupItemComponent, ItAvatarModule, ItBackButtonComponent, ItBackToTopComponent, ItBadgeDirective, ItBreadcrumbComponent, ItBreadcrumbItemComponent, ItBreadcrumbsModule, ItButtonDirective, ItCalloutComponent, ItCardComponent, ItCarouselComponent, ItCarouselItemComponent, ItCarouselModule, ItCheckboxComponent, ItChipComponent, ItCollapseComponent, ItDateAgoPipe, ItDateUtils, ItDimmerButtonsComponent, ItDimmerComponent, ItDimmerIconComponent, ItDimmerModule, ItDropdownComponent, ItDropdownItemComponent, ItDropdownModule, ItDurationPipe, ItErrorPageComponent, ItFileUtils, ItFormModule, ItForwardDirective, ItHeaderComponent, ItIconComponent, ItInputComponent, ItLanguageSwitcherComponent, ItLinkComponent, ItListComponent, ItListItemComponent, ItListModule, ItMarkMatchingTextPipe, ItMegamenuComponent, ItModalComponent, ItNavBarComponent, ItNavBarItemComponent, ItNavBarModule, ItNavscrollComponent, ItNotificationService, ItNotificationsComponent, ItPaginationComponent, ItPasswordInputComponent, ItPopoverDirective, ItProgressBarComponent, ItProgressButtonComponent, ItRadioButtonComponent, ItRangeComponent, ItRatingComponent, ItSearchComponent, ItSelectComponent, ItSidebarComponent, ItSkiplinkComponent, ItSkiplinkItemComponent, ItSkiplinkModule, ItSortDirective, ItSortHeaderComponent, ItSpinnerComponent, ItSteppersContainerComponent, ItSteppersItemComponent, ItSteppersModule, ItTabContainerComponent, ItTabItemComponent, ItTabModule, ItTableComponent, ItTableModule, ItTextareaComponent, ItTimelineComponent, ItTimelineItemComponent, ItTimelineModule, ItTooltipDirective, ItTransferComponent, ItUploadDragDropComponent, ItUploadFileListComponent, ItValidators, ItVideoPlayerComponent, ItVideoPlayerModule, NotificationPosition, NotificationType, PHONE_NUMBER_REGEX, PLATE_REGEX, URL_REGEX, VAT_NUMBER_REGEX, provideDesignAngularKit };
6731
7423
  //# sourceMappingURL=design-angular-kit.mjs.map