design-angular-kit 1.2.2 → 1.3.1

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 +301 -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 +785 -95
  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 +46 -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,18 +1,20 @@
1
1
  import * as i0 from '@angular/core';
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';
4
- import * as i1 from '@ngx-translate/core';
5
- import { TranslateModule, TranslatePipe, TranslateLoader, TranslateService } from '@ngx-translate/core';
2
+ import { inject, Renderer2, ElementRef, ChangeDetectorRef, EventEmitter, Component, Input, Output, Injectable, signal, DestroyRef, NgZone, Injector, afterNextRender, ViewEncapsulation, ChangeDetectionStrategy, ViewChild, booleanAttribute, InjectionToken, TemplateRef, HostBinding, ContentChildren, NgModule, Directive, Optional, Host, Inject, HostListener, Self, ViewChildren, Pipe, HostAttributeToken, APP_INITIALIZER, importProvidersFrom, makeEnvironmentProviders } from '@angular/core';
6
3
  import * as i1$3 from '@angular/common';
7
4
  import { NgTemplateOutlet, NgClass, DOCUMENT, AsyncPipe, LowerCasePipe, DatePipe, NgOptimizedImage, TitleCasePipe, JsonPipe, ViewportScroller } from '@angular/common';
5
+ import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
6
+ import { tap, delay, startWith, Subject, filter, debounceTime, distinctUntilChanged, switchMap, of, merge, map, Observable, take, forkJoin, BehaviorSubject, shareReplay, combineLatest, skip, AsyncSubject, withLatestFrom, timer, takeWhile } from 'rxjs';
7
+ import videojs from 'video.js';
8
+ import * as i1 from '@ngx-translate/core';
9
+ import { TranslateService, TranslateModule, TranslatePipe, TranslateLoader } from '@ngx-translate/core';
10
+ import { initYoutubePlugin } from 'bootstrap-italia/dist/plugins/util/youtube-video.js';
11
+ import { Collapse, Alert, Dropdown, Carousel, Modal, Notification, Popover, Tab, Tooltip, InputPassword, ProgressDonut, SelectAutocomplete, BackToTop, NavBarCollapsible, HeaderSticky, loadFonts } from 'bootstrap-italia';
8
12
  import * as i1$4 from '@angular/router';
9
13
  import { RouterLink, RouterLinkActive, Router, NavigationEnd, Scroll, RouterLinkWithHref } from '@angular/router';
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
14
  import { trigger, transition, style, animate } from '@angular/animations';
12
15
  import * as i1$1 from '@angular/forms';
13
- import { FormControl, Validators, ReactiveFormsModule, NgModel, FormControlName } from '@angular/forms';
16
+ import { FormControl, FormGroup, Validators, ReactiveFormsModule, NgModel, FormControlName } from '@angular/forms';
14
17
  import * as i1$2 from '@angular/platform-browser';
15
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
16
18
  import { provideHttpClient, HttpClient } from '@angular/common/http';
17
19
  import { provideAnimationsAsync } from '@angular/platform-browser/animations/async';
18
20
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
@@ -62,6 +64,481 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
62
64
  type: Output
63
65
  }] } });
64
66
 
67
+ class VideoPlayerI18nService {
68
+ #translate = inject(TranslateService);
69
+ init(player, destroyRef) {
70
+ this.#translate.onLangChange
71
+ .pipe(takeUntilDestroyed(destroyRef), tap({
72
+ next: e => {
73
+ const language = e.lang;
74
+ videojs.addLanguage(language, this.getTranslations());
75
+ player.language(language);
76
+ },
77
+ }))
78
+ .subscribe(x => {
79
+ console.log('onLangChange', x);
80
+ });
81
+ }
82
+ getLanguage() {
83
+ const language = this.#translate.currentLang ?? 'it';
84
+ return {
85
+ languages: { [language]: mapToVideoJsTranslation(this.#translate.instant('it.video-player')) },
86
+ language,
87
+ };
88
+ }
89
+ getTranslations() {
90
+ return mapToVideoJsTranslation(this.#translate.instant('it.video-player'));
91
+ }
92
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: VideoPlayerI18nService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
93
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: VideoPlayerI18nService, providedIn: 'root' }); }
94
+ }
95
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: VideoPlayerI18nService, decorators: [{
96
+ type: Injectable,
97
+ args: [{ providedIn: 'root' }]
98
+ }] });
99
+ function mapToVideoJsTranslation(translations) {
100
+ return {
101
+ 'Audio Player': translations['audio-player'],
102
+ 'Video Player': translations['video-player'],
103
+ Play: translations.play,
104
+ Pause: translations.pause,
105
+ Replay: translations.replay,
106
+ 'Current Time': translations['current-time'],
107
+ Duration: translations.duration,
108
+ 'Remaining Time': translations['remaining-time'],
109
+ 'Stream Type': translations['stream-type'],
110
+ LIVE: translations.live,
111
+ Loaded: translations.loaded,
112
+ Progress: translations.progress,
113
+ 'Progress Bar': translations['progress-bar'],
114
+ 'progress bar timing: currentTime={1} duration={2}': translations['progress-bar-timing:-currenttime={1}-duration={2}'],
115
+ Fullscreen: translations.fullscreen,
116
+ 'Exit Fullscreen': translations['exit-fullscreen'],
117
+ Mute: translations.mute,
118
+ Unmute: translations.unmute,
119
+ 'Playback Rate': translations['playback-rate'],
120
+ Subtitles: translations.subtitles,
121
+ 'subtitles off': translations['subtitles-off'],
122
+ Captions: translations.captions,
123
+ 'captions off': translations['captions-off'],
124
+ Chapters: translations.chapters,
125
+ Descriptions: translations.descriptions,
126
+ 'descriptions off': translations['descriptions-off'],
127
+ 'Audio Track': translations['audio-track'],
128
+ 'Volume Level': translations['volume-level'],
129
+ 'You aborted the media playback': translations['you-aborted-the-media-playback'],
130
+ 'A network error caused the media download to fail part-way.': translations['a-network-error-caused-the-media-download-to-fail-part-way.'],
131
+ '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.'],
132
+ '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.'],
133
+ 'No compatible source was found for this media.': translations['no-compatible-source-was-found-for-this-media.'],
134
+ '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.'],
135
+ 'Play Video': translations['play-video'],
136
+ Close: translations.close,
137
+ 'Close Modal Dialog': translations['close-modal-dialog'],
138
+ 'Modal Window': translations['modal-window'],
139
+ 'This is a modal window': translations['this-is-a-modal-window'],
140
+ '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.'],
141
+ ', opens captions settings dialog': translations[',-opens-captions-settings-dialog'],
142
+ ', opens subtitles settings dialog': translations[',-opens-subtitles-settings-dialog'],
143
+ ', opens descriptions settings dialog': translations[',-opens-descriptions-settings-dialog'],
144
+ ', selected': translations[',-selected'],
145
+ 'captions settings': translations['captions-settings'],
146
+ 'subtitles settings': translations['subtitles-settings'],
147
+ 'descriptions settings': translations['descriptions-settings'],
148
+ Text: translations.text,
149
+ White: translations.white,
150
+ Black: translations.black,
151
+ Red: translations.red,
152
+ Green: translations.green,
153
+ Blue: translations.blue,
154
+ Yellow: translations.yellow,
155
+ Magenta: translations.magenta,
156
+ Cyan: translations.cyan,
157
+ Background: translations.background,
158
+ Window: translations.window,
159
+ Transparent: translations.transparent,
160
+ 'Semi-Transparent': translations['semi-transparent'],
161
+ Opaque: translations.opaque,
162
+ 'Font Size': translations['font-size'],
163
+ 'Text Edge Style': translations['text-edge-style'],
164
+ None: translations.none,
165
+ Uniform: translations.uniform,
166
+ 'Drop shadow': translations['drop-shadow'],
167
+ 'Font Family': translations['font-family'],
168
+ 'Proportional Sans-Serif': translations['proportional-sans-serif'],
169
+ 'Monospace Sans-Serif': translations['monospace-sans-serif'],
170
+ 'Proportional Serif': translations['proportional-serif'],
171
+ 'Monospace Serif': translations['monospace-serif'],
172
+ 'Small Caps': translations['small-caps'],
173
+ Reset: translations.reset,
174
+ 'restore all settings to the default values': translations['restore-all-settings-to-the-default-values'],
175
+ Done: translations.done,
176
+ 'Caption Settings Dialog': translations['caption-settings-dialog'],
177
+ 'Beginning of dialog window. Escape will cancel and close the window.': translations['beginning-of-dialog-window.-escape-will-cancel-and-close-the-window.'],
178
+ 'End of dialog window.': translations['end-of-dialog-window.'],
179
+ '{1} is loading.': translations['{1}-is-loading.'],
180
+ 'Exit Picture-in-Picture': translations['exit-picture-in-picture'],
181
+ 'Picture-in-Picture': translations['picture-in-picture'],
182
+ Color: translations.color,
183
+ Opacity: translations.opacity,
184
+ 'Text Background': translations['text-background'],
185
+ 'Caption Area Background': translations['caption-area-background'],
186
+ 'Skip forward {1} seconds': translations['skip-forward-{1}-seconds'],
187
+ 'Skip backward {1} seconds': translations['skip-backward-{1}-seconds'],
188
+ };
189
+ }
190
+
191
+ const preferencesMap = { ck3: {} };
192
+ const STORAGE_KEY = 'bs-ck3';
193
+ /*
194
+ Possible choices:
195
+ false => Accept once
196
+ true => Accept always
197
+ */
198
+ const rememberChoice = (service, remember) => {
199
+ preferencesMap.ck3[service] = remember;
200
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(preferencesMap.ck3));
201
+ };
202
+ const isChoiceRemembered = (service) => {
203
+ preferencesMap.ck3 = JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}');
204
+ return Boolean(preferencesMap.ck3[service]) || false;
205
+ };
206
+ const clearAllRememberedChoices = () => {
207
+ localStorage.removeItem(STORAGE_KEY);
208
+ };
209
+ const cookies = {
210
+ rememberChoice,
211
+ isChoiceRemembered,
212
+ clearAllRememberedChoices,
213
+ };
214
+
215
+ const hasYoutubeVideo = (options) => options.source?.type === 'video/youtube';
216
+ class VideoPlayerConfigService {
217
+ #languageService = inject(VideoPlayerI18nService);
218
+ async configureTech({ tech }) {
219
+ if (tech === 'youtube') {
220
+ initYoutubePlugin(videojs);
221
+ }
222
+ }
223
+ mergeConfig(o) {
224
+ const options = o;
225
+ const captions = options.captions ? options.captions.map(c => ({ ...c, kind: 'captions' })) : [];
226
+ const chapters = options.chapters ? options.chapters.map(c => ({ ...c, kind: 'chapters' })) : [];
227
+ const isYoutubeVideo = hasYoutubeVideo(options);
228
+ const DEFAULT_CONFIG = this.#languageService.getLanguage();
229
+ const tech = isYoutubeVideo ? 'youtube' : 'html5';
230
+ const techOrder = [tech];
231
+ //https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video#preload
232
+ const preload = options.preload ?? 'metadata';
233
+ const config = { ...DEFAULT_CONFIG, ...options, preload, techOrder, tracks: [...captions, ...chapters], tech: 'html5' };
234
+ return isYoutubeVideo
235
+ ? {
236
+ ...config,
237
+ sources: [o.source],
238
+ tech: 'youtube',
239
+ youtube: { ytControls: 2, rel: 0, fs: 0, modestbranding: 1 },
240
+ }
241
+ : config;
242
+ }
243
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: VideoPlayerConfigService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
244
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: VideoPlayerConfigService, providedIn: 'root' }); }
245
+ }
246
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: VideoPlayerConfigService, decorators: [{
247
+ type: Injectable,
248
+ args: [{ providedIn: 'root' }]
249
+ }] });
250
+
251
+ var ViewType;
252
+ (function (ViewType) {
253
+ ViewType["Default"] = "DEFAULT";
254
+ ViewType["Overlay"] = "OVERLAY";
255
+ })(ViewType || (ViewType = {}));
256
+ /**
257
+ * Video Player
258
+ * @description Component that allows playing a video.
259
+ */
260
+ class ItVideoPlayerComponent extends ItAbstractComponent {
261
+ #destroyRef;
262
+ constructor(config) {
263
+ super();
264
+ this.config = config;
265
+ this.player = null;
266
+ this.viewTypes = ViewType;
267
+ this.viewType = signal(undefined);
268
+ this.cookieAccepted = signal(false);
269
+ this.i18nService = inject(VideoPlayerI18nService);
270
+ this.#destroyRef = inject(DestroyRef);
271
+ this.ngZone = inject(NgZone);
272
+ this.injector = inject(Injector);
273
+ afterNextRender(() => {
274
+ if (this.viewType() === ViewType.Overlay && cookies.isChoiceRemembered('youtube.com')) {
275
+ this.hideOverlay();
276
+ }
277
+ });
278
+ this.#destroyRef.onDestroy(() => this.player?.dispose());
279
+ }
280
+ async ngOnInit() {
281
+ const config = this.config.mergeConfig(this.options);
282
+ this.setViewType(config);
283
+ // Avoid running change detections while the script is being loaded.
284
+ await this.ngZone.runOutsideAngular(() => this.config.configureTech(config));
285
+ if (!this.videoPlayerRef) {
286
+ // Note: No need to pipe with `takeUntilDestroyed`; `toObservable` is
287
+ // completed by Angular when the `DestroyRef` from the injector is destroyed.
288
+ toObservable(this.cookieAccepted, { injector: this.injector })
289
+ .pipe(delay(0))
290
+ .subscribe(value => {
291
+ if (value && !this.player) {
292
+ this.initVideoPlayer();
293
+ }
294
+ });
295
+ return;
296
+ }
297
+ this.initVideoPlayer();
298
+ }
299
+ acceptCookieHandler() {
300
+ this.rememberHandler();
301
+ this.hideOverlay();
302
+ this.cookieAccepted.set(true);
303
+ }
304
+ initVideoPlayer() {
305
+ const config = this.config.mergeConfig(this.options);
306
+ this.setVideoAttributes(config);
307
+ this.setVideoPlayer();
308
+ }
309
+ setVideoPlayer() {
310
+ const config = this.config.mergeConfig(this.options);
311
+ const onPlayerReadyCb = () => {
312
+ if (!this.player) {
313
+ return;
314
+ }
315
+ this.i18nService.init(this.player, this.#destroyRef);
316
+ };
317
+ const element = this.videoPlayerRef?.nativeElement;
318
+ if (!element) {
319
+ throw Error('videoPlayerRef is undefined');
320
+ }
321
+ this.player = this.ngZone.runOutsideAngular(() => videojs(element, config, onPlayerReadyCb));
322
+ }
323
+ setViewType(config) {
324
+ this.viewType.set(config.tech === 'youtube' ? ViewType.Overlay : ViewType.Default);
325
+ this.cookieAccepted.set(this.viewType() === ViewType.Overlay && cookies.isChoiceRemembered('youtube.com'));
326
+ }
327
+ hideOverlay() {
328
+ if (!this.acceptOverlayableRef) {
329
+ return;
330
+ }
331
+ const classes = ['show'];
332
+ this.acceptOverlayableRef.nativeElement.classList.remove(...classes);
333
+ if (!this.acceptOveralyRef) {
334
+ return;
335
+ }
336
+ this.acceptOveralyRef.nativeElement.classList.remove(...classes);
337
+ this.acceptOveralyRef.nativeElement.setAttribute('aria-hidden', 'true');
338
+ }
339
+ rememberHandler() {
340
+ if (!this.chrRememberRef) {
341
+ return;
342
+ }
343
+ const remember = this.chrRememberRef.nativeElement.checked;
344
+ cookies.rememberChoice('youtube.com', remember);
345
+ }
346
+ setVideoAttributes(options) {
347
+ if (!this.videoPlayerRef) {
348
+ return;
349
+ }
350
+ const v = this.videoPlayerRef.nativeElement;
351
+ const { autoplay, controls, loop, muted, poster, fluid } = options;
352
+ if (autoplay) {
353
+ v.setAttribute('autoplay', autoplay.toString());
354
+ }
355
+ if (controls) {
356
+ v.setAttribute('controls', '');
357
+ }
358
+ if (loop) {
359
+ v.setAttribute('loop', '');
360
+ }
361
+ if (muted) {
362
+ v.setAttribute('muted', '');
363
+ }
364
+ if (poster) {
365
+ v.setAttribute('poster', poster);
366
+ }
367
+ if (fluid) {
368
+ v.setAttribute('fluid', '');
369
+ }
370
+ v.setAttribute('preload', 'none');
371
+ v.setAttribute('playsinline', '');
372
+ }
373
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItVideoPlayerComponent, deps: [{ token: VideoPlayerConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
374
+ 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()) {
375
+ @case (viewTypes.Default) {
376
+ <div class="row">
377
+ <ng-container *ngTemplateOutlet="videoTemplate"></ng-container>
378
+ <ng-container *ngTemplateOutlet="transcriptionTemplate"></ng-container>
379
+ </div>
380
+ }
381
+ @case (viewTypes.Overlay) {
382
+ <div #acceptOverlayable class="acceptoverlayable show">
383
+ <div #acceptOveraly class="acceptoverlay acceptoverlay-primary fade show">
384
+ <div class="acceptoverlay-inner">
385
+ <div class="acceptoverlay-icon">
386
+ <svg class="icon icon-xl"><use href="/bootstrap-italia/dist/svg/sprites.svg#it-video"></use></svg>
387
+ </div>
388
+ <p>
389
+ Accetta i cookie di YouTube per vedere il video. Puoi gestire le preferenze nella
390
+ <a href="#" class="text-white">cookie policy</a>.
391
+ </p>
392
+ <div class="acceptoverlay-buttons bg-dark">
393
+ <button type="button" class="btn btn-primary" (click)="acceptCookieHandler()">Accetta</button>
394
+ <div class="form-check">
395
+ <input id="chk-remember{{ id }}" type="checkbox" #chkRemember />
396
+ <label for="chk-remember{{ id }}">Ricorda per tutti i video</label>
397
+ </div>
398
+ </div>
399
+ </div>
400
+ </div>
401
+ @if (cookieAccepted()) {
402
+ <div>
403
+ <ng-container *ngTemplateOutlet="videoTemplate"></ng-container>
404
+ <ng-container *ngTemplateOutlet="transcriptionTemplate"></ng-container>
405
+ </div>
406
+ }
407
+ </div>
408
+ }
409
+ @default {
410
+ <h1>No video provider</h1>
411
+ }
412
+ }
413
+ <ng-template #videoTemplate>
414
+ <div>
415
+ <video #videoPlayer class="video-js vjs-theme-bootstrap-italia vjs-fluid vjs-big-play-centered"></video>
416
+ </div>
417
+ </ng-template>
418
+
419
+ <ng-template #transcriptionTemplate>
420
+ <div class="vjs-transcription accordion">
421
+ <div class="accordion-item">
422
+ <h2 class="accordion-header " id="transcription-{{ id }}-head">
423
+ <button
424
+ class="accordion-button collapsed"
425
+ type="button"
426
+ data-bs-toggle="collapse"
427
+ [attr.data-bs-target]="'#transcription-' + id"
428
+ [attr.aria-controls]="'transcription-' + id"
429
+ aria-expanded="true">
430
+ <ng-content select="[transcriptionTitle]">Trascrizione</ng-content>
431
+ </button>
432
+ </h2>
433
+ <div
434
+ id="transcription-{{ id }}"
435
+ class="accordion-collapse collapse"
436
+ role="region"
437
+ [attr.aria-labelledby]="'transcription-' + id + '-head'">
438
+ <div class="accordion-body">
439
+ <ng-content select="[transcriptionText]">-</ng-content>
440
+ </div>
441
+ </div>
442
+ </div>
443
+ </div>
444
+ </ng-template> `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
445
+ }
446
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItVideoPlayerComponent, decorators: [{
447
+ type: Component,
448
+ args: [{
449
+ standalone: true,
450
+ selector: 'it-video-player',
451
+ template: `@switch (viewType()) {
452
+ @case (viewTypes.Default) {
453
+ <div class="row">
454
+ <ng-container *ngTemplateOutlet="videoTemplate"></ng-container>
455
+ <ng-container *ngTemplateOutlet="transcriptionTemplate"></ng-container>
456
+ </div>
457
+ }
458
+ @case (viewTypes.Overlay) {
459
+ <div #acceptOverlayable class="acceptoverlayable show">
460
+ <div #acceptOveraly class="acceptoverlay acceptoverlay-primary fade show">
461
+ <div class="acceptoverlay-inner">
462
+ <div class="acceptoverlay-icon">
463
+ <svg class="icon icon-xl"><use href="/bootstrap-italia/dist/svg/sprites.svg#it-video"></use></svg>
464
+ </div>
465
+ <p>
466
+ Accetta i cookie di YouTube per vedere il video. Puoi gestire le preferenze nella
467
+ <a href="#" class="text-white">cookie policy</a>.
468
+ </p>
469
+ <div class="acceptoverlay-buttons bg-dark">
470
+ <button type="button" class="btn btn-primary" (click)="acceptCookieHandler()">Accetta</button>
471
+ <div class="form-check">
472
+ <input id="chk-remember{{ id }}" type="checkbox" #chkRemember />
473
+ <label for="chk-remember{{ id }}">Ricorda per tutti i video</label>
474
+ </div>
475
+ </div>
476
+ </div>
477
+ </div>
478
+ @if (cookieAccepted()) {
479
+ <div>
480
+ <ng-container *ngTemplateOutlet="videoTemplate"></ng-container>
481
+ <ng-container *ngTemplateOutlet="transcriptionTemplate"></ng-container>
482
+ </div>
483
+ }
484
+ </div>
485
+ }
486
+ @default {
487
+ <h1>No video provider</h1>
488
+ }
489
+ }
490
+ <ng-template #videoTemplate>
491
+ <div>
492
+ <video #videoPlayer class="video-js vjs-theme-bootstrap-italia vjs-fluid vjs-big-play-centered"></video>
493
+ </div>
494
+ </ng-template>
495
+
496
+ <ng-template #transcriptionTemplate>
497
+ <div class="vjs-transcription accordion">
498
+ <div class="accordion-item">
499
+ <h2 class="accordion-header " id="transcription-{{ id }}-head">
500
+ <button
501
+ class="accordion-button collapsed"
502
+ type="button"
503
+ data-bs-toggle="collapse"
504
+ [attr.data-bs-target]="'#transcription-' + id"
505
+ [attr.aria-controls]="'transcription-' + id"
506
+ aria-expanded="true">
507
+ <ng-content select="[transcriptionTitle]">Trascrizione</ng-content>
508
+ </button>
509
+ </h2>
510
+ <div
511
+ id="transcription-{{ id }}"
512
+ class="accordion-collapse collapse"
513
+ role="region"
514
+ [attr.aria-labelledby]="'transcription-' + id + '-head'">
515
+ <div class="accordion-body">
516
+ <ng-content select="[transcriptionText]">-</ng-content>
517
+ </div>
518
+ </div>
519
+ </div>
520
+ </div>
521
+ </ng-template> `,
522
+ imports: [NgTemplateOutlet],
523
+ encapsulation: ViewEncapsulation.None,
524
+ changeDetection: ChangeDetectionStrategy.OnPush,
525
+ }]
526
+ }], ctorParameters: () => [{ type: VideoPlayerConfigService }], propDecorators: { options: [{
527
+ type: Input
528
+ }], videoPlayerRef: [{
529
+ type: ViewChild,
530
+ args: ['videoPlayer', { static: false }]
531
+ }], acceptOveralyRef: [{
532
+ type: ViewChild,
533
+ args: ['acceptOveraly', { static: false }]
534
+ }], acceptOverlayableRef: [{
535
+ type: ViewChild,
536
+ args: ['acceptOverlayable', { static: false }]
537
+ }], chrRememberRef: [{
538
+ type: ViewChild,
539
+ args: ['chkRemember', { static: false }]
540
+ }] } });
541
+
65
542
  /**
66
543
  * Transforms a value (typically a string) to a boolean.
67
544
  * Intended to be used as a transform function of an input.
@@ -1117,7 +1594,6 @@ class ItCarouselComponent {
1117
1594
  this.trackClass = '';
1118
1595
  }
1119
1596
  ngAfterViewInit() {
1120
- this.carousel = CarouselBI.getOrCreateInstance(this.carouselDiv.nativeElement);
1121
1597
  this.items?.changes
1122
1598
  .pipe(
1123
1599
  // When carousel items changes (dynamic add/remove)
@@ -1129,22 +1605,25 @@ class ItCarouselComponent {
1129
1605
  }));
1130
1606
  this._changeDetectorRef.detectChanges(); // Force update html render
1131
1607
  });
1608
+ setTimeout(() => {
1609
+ this.carousel = Carousel.getOrCreateInstance(this.carouselDiv.nativeElement);
1610
+ }, 100);
1132
1611
  }
1133
1612
  ngOnDestroy() {
1134
1613
  this.itemSubscriptions?.forEach(item => item.unsubscribe());
1135
1614
  }
1136
1615
  /**
1137
- * Removes CarouselBI features
1616
+ * Removes Carousel features
1138
1617
  */
1139
1618
  dispose() {
1140
1619
  this.carousel?.dispose();
1141
1620
  }
1142
1621
  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 }); }
1622
+ 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
1623
  }
1145
1624
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItCarouselComponent, decorators: [{
1146
1625
  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"] }]
1626
+ 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
1627
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { title: [{
1149
1628
  type: Input
1150
1629
  }], type: [{
@@ -1978,19 +2457,20 @@ class ItAbstractFormComponent extends ItAbstractComponent {
1978
2457
  set disabled(isDisabled) {
1979
2458
  this.setDisabledState(isDisabled);
1980
2459
  }
1981
- constructor(_translateService, _ngControl) {
2460
+ constructor(_translateService, _ngControl, fgd) {
1982
2461
  super();
1983
2462
  this._translateService = _translateService;
1984
2463
  this._ngControl = _ngControl;
2464
+ this.fgd = fgd;
1985
2465
  /**
1986
2466
  * Validation color display mode (validation triggered if field is touched or not pristine)
1987
2467
  * - <b>true</b>: Always show the validation color
1988
2468
  * - <b>false</b>: Never show validation color
1989
2469
  * - <b>only-valid</b>: Show only valid validation color
1990
2470
  * - <b>only-invalid</b>: Show only invalid validation color
1991
- * @default <b>true</b>: Always show the validation color
2471
+ * @default <b>false</b>: Do not show the validation color by default
1992
2472
  */
1993
- this.validationMode = true;
2473
+ this.validationMode = false;
1994
2474
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
1995
2475
  this.onChange = (_) => { };
1996
2476
  this.onTouched = () => { };
@@ -2033,6 +2513,7 @@ class ItAbstractFormComponent extends ItAbstractComponent {
2033
2513
  ngOnInit() {
2034
2514
  if (this._ngControl?.control) {
2035
2515
  this.control.setValidators(this._ngControl.control.validator);
2516
+ this.setValidationModeWhenInAForm();
2036
2517
  }
2037
2518
  }
2038
2519
  registerOnChange(fn) {
@@ -2131,7 +2612,16 @@ class ItAbstractFormComponent extends ItAbstractComponent {
2131
2612
  }
2132
2613
  return this.control.getError(errorCode, path);
2133
2614
  }
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 }); }
2615
+ // This function assurest that validation mode remains complaiant with the Design kit
2616
+ // When the validation mode is `false` and input elements are wrapped in a `FormGroup`
2617
+ // validation mode is automatically set to `true`.
2618
+ setValidationModeWhenInAForm() {
2619
+ const isInAForm = this.fgd?.control instanceof FormGroup;
2620
+ if (isInAForm && this.validationMode == false) {
2621
+ this.validationMode = true;
2622
+ }
2623
+ }
2624
+ 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
2625
  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
2626
  }
2137
2627
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItAbstractFormComponent, decorators: [{
@@ -2141,6 +2631,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
2141
2631
  type: Self
2142
2632
  }, {
2143
2633
  type: Optional
2634
+ }] }, { type: i1$1.ControlContainer, decorators: [{
2635
+ type: Optional
2144
2636
  }] }], propDecorators: { label: [{
2145
2637
  type: Input
2146
2638
  }], validationMode: [{
@@ -2285,6 +2777,11 @@ class ItValidators {
2285
2777
  static get tel() {
2286
2778
  return ItValidators.customPattern(PHONE_NUMBER_REGEX, { invalidTel: true });
2287
2779
  }
2780
+ static includes(possibleValues) {
2781
+ return formControl => {
2782
+ return possibleValues?.includes(formControl.value) ? null : { invalidSelection: true };
2783
+ };
2784
+ }
2288
2785
  /**
2289
2786
  * URL validator
2290
2787
  */
@@ -2481,11 +2978,11 @@ class ItInputComponent extends ItAbstractFormComponent {
2481
2978
  this.control.setValue(value);
2482
2979
  }
2483
2980
  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 }); }
2981
+ 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
2982
  }
2486
2983
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItInputComponent, decorators: [{
2487
2984
  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"] }]
2985
+ 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
2986
  }], propDecorators: { type: [{
2490
2987
  type: Input
2491
2988
  }], placeholder: [{
@@ -4467,7 +4964,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
4467
4964
  }]
4468
4965
  }], ctorParameters: () => [{ type: i1$2.DomSanitizer }] });
4469
4966
 
4470
- class ItAutocompleteComponent extends ItAbstractFormComponent {
4967
+ class ItSearchComponent extends ItAbstractFormComponent {
4471
4968
  constructor() {
4472
4969
  super(...arguments);
4473
4970
  /**
@@ -4489,52 +4986,52 @@ class ItAutocompleteComponent extends ItAbstractFormComponent {
4489
4986
  */
4490
4987
  this.forceShowLabel = true;
4491
4988
  /**
4492
- * Fired when the Autocomplete Item has been selected
4989
+ * Fired when the Search Item has been selected
4493
4990
  */
4494
- this.autocompleteSelectedEvent = new EventEmitter();
4991
+ this.searchSelectedEvent = new EventEmitter();
4495
4992
  this.showAutocompletion = false;
4496
4993
  /** Observable da cui vengono emessi i risultati dell'auto completamento */
4497
- this.autocompleteResults$ = new Observable();
4994
+ this.searchResults$ = new Observable();
4498
4995
  }
4499
4996
  ngOnInit() {
4500
4997
  super.ngOnInit();
4501
- this.autocompleteResults$ = this.getAutocompleteResults$();
4998
+ this.searchResults$ = this.getSearchResults$();
4502
4999
  }
4503
5000
  /**
4504
- * Create the autocomplete list
5001
+ * Create the search list
4505
5002
  */
4506
- getAutocompleteResults$() {
5003
+ getSearchResults$() {
4507
5004
  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
5005
  distinctUntilChanged(), // Only if searchValue is distinct in comparison to the last value
4509
5006
  switchMap(searchedValue => {
4510
- if (!this.autocompleteData) {
5007
+ if (!this.searchData) {
4511
5008
  return of({
4512
5009
  searchedValue,
4513
5010
  relatedEntries: [],
4514
5011
  });
4515
5012
  }
4516
- const autoCompleteData$ = Array.isArray(this.autocompleteData) ? of(this.autocompleteData) : this.autocompleteData(searchedValue);
4517
- return autoCompleteData$.pipe(map(autocompleteData => {
5013
+ const autoCompleteData$ = Array.isArray(this.searchData) ? of(this.searchData) : this.searchData(searchedValue);
5014
+ return autoCompleteData$.pipe(map(searchData => {
4518
5015
  if (!searchedValue || typeof searchedValue === 'number') {
4519
5016
  return { searchedValue, relatedEntries: [] };
4520
5017
  }
4521
5018
  const lowercaseValue = searchedValue.toLowerCase();
4522
- const relatedEntries = autocompleteData.filter(item => item.value?.toLowerCase().includes(lowercaseValue));
5019
+ const relatedEntries = searchData.filter(item => item.value?.toLowerCase().includes(lowercaseValue));
4523
5020
  return { searchedValue, relatedEntries };
4524
5021
  }));
4525
5022
  }));
4526
5023
  }
4527
5024
  onEntryClick(entry, event) {
4528
- // Se non è stato definito un link associato all'elemento dell'autocomplete, probabilmente il desiderata
5025
+ // Se non è stato definito un link associato all'elemento dell'search, probabilmente il desiderata
4529
5026
  // non è effettuare la navigazione al default '#', pertanto in tal caso meglio annullare la navigazione.
4530
5027
  if (!entry.link) {
4531
5028
  event.preventDefault();
4532
5029
  }
4533
- this.autocompleteSelectedEvent.next(entry);
5030
+ this.searchSelectedEvent.next(entry);
4534
5031
  this.control.setValue(entry.value);
4535
5032
  this.showAutocompletion = false;
4536
5033
  }
4537
- autocompleteItemTrackByValueFn(index, item) {
5034
+ searchItemTrackByValueFn(index, item) {
4538
5035
  return item.value;
4539
5036
  }
4540
5037
  onKeyDown() {
@@ -4544,13 +5041,13 @@ class ItAutocompleteComponent extends ItAbstractFormComponent {
4544
5041
  const value = this.control.value;
4545
5042
  return this.forceShowLabel && (!!value || !!this.placeholder);
4546
5043
  }
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 }); }
5044
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSearchComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
5045
+ 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
5046
  }
4550
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItAutocompleteComponent, decorators: [{
5047
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSearchComponent, decorators: [{
4551
5048
  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: [{
5049
+ 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" }]
5050
+ }], propDecorators: { searchData: [{
4554
5051
  type: Input,
4555
5052
  args: [{ required: true }]
4556
5053
  }], big: [{
@@ -4565,7 +5062,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
4565
5062
  }], forceShowLabel: [{
4566
5063
  type: Input,
4567
5064
  args: [{ transform: inputToBoolean }]
4568
- }], autocompleteSelectedEvent: [{
5065
+ }], searchSelectedEvent: [{
4569
5066
  type: Output
4570
5067
  }] } });
4571
5068
 
@@ -5024,8 +5521,181 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
5024
5521
  type: Output
5025
5522
  }] } });
5026
5523
 
5524
+ class ItAutocompleteComponent extends ItAbstractFormComponent {
5525
+ constructor() {
5526
+ super(...arguments);
5527
+ /**
5528
+ * Autocomplete elements.
5529
+ * @default []
5530
+ */
5531
+ this.source = [];
5532
+ /**
5533
+ * Autocomplete if required.
5534
+ * @default false
5535
+ */
5536
+ this.required = false;
5537
+ /**
5538
+ * Prevents suggestions from appearing if fewer than N characters are typed
5539
+ * @default 0
5540
+ */
5541
+ this.minLength = 0;
5542
+ /**
5543
+ * Default value
5544
+ */
5545
+ this.defaultValue = '';
5546
+ /**
5547
+ * Function to set assistive hint label. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization
5548
+ */
5549
+ 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';
5550
+ /**
5551
+ * Function to set label in case of no result. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization
5552
+ */
5553
+ this.noResultsLabel = () => 'Nessun risultato trovato';
5554
+ /**
5555
+ * 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
5556
+ */
5557
+ this.statusQueryTooShortLabel = minQueryLength => `Digita ${minQueryLength} o più caratteri per mostrare le opzioni di ricerca`;
5558
+ /**
5559
+ * Function to set no results label. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization
5560
+ */
5561
+ this.statusNoResultsLabel = () => 'Nessun risultato di ricerca';
5562
+ /**
5563
+ * Function to set selected option label. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization
5564
+ */
5565
+ this.statusSelectedOptionLabel = (selectedOption, length, index) => `${selectedOption} ${index + 1} di ${length} è sottolineato`;
5566
+ /**
5567
+ * Function to set status results label. For more information https://github.com/alphagov/accessible-autocomplete?tab=readme-ov-file#internationalization
5568
+ */
5569
+ this.statusResultsLabel = (length, contentSelectedOption) => {
5570
+ const words = {
5571
+ result: length === 1 ? 'risultato' : 'risultati',
5572
+ is: length === 1 ? 'è' : 'sono',
5573
+ available: length === 1 ? 'disponibile' : 'disponibili',
5574
+ };
5575
+ return `${length} ${words.result} ${words.is} ${words.available}. ${contentSelectedOption}`;
5576
+ };
5577
+ /**
5578
+ * Fired when value changes
5579
+ */
5580
+ this.selected = new EventEmitter();
5581
+ this.value = '';
5582
+ this._interval = 0;
5583
+ this._inputEl = null;
5584
+ }
5585
+ ngOnInit() {
5586
+ super.ngOnInit();
5587
+ if (!this.control.value && !!this.value) {
5588
+ this.writeValue(this.value);
5589
+ this.onChange(this.value);
5590
+ }
5591
+ }
5592
+ clear() {
5593
+ this._inputEl.value = '';
5594
+ }
5595
+ _findInput() {
5596
+ this._interval = setInterval(() => {
5597
+ this._inputEl = document.getElementById(this.id);
5598
+ if (this._inputEl) {
5599
+ clearInterval(this._interval);
5600
+ this._initInputEl();
5601
+ }
5602
+ }, 500);
5603
+ }
5604
+ _setAndCheck(value) {
5605
+ this.value = value == '' ? undefined : value;
5606
+ if (this.control.touched) {
5607
+ this.writeValue(this.value);
5608
+ this.onChange(this.value);
5609
+ }
5610
+ if (this.isValid == false && this.isInvalid == false) {
5611
+ this._inputEl?.classList.remove('just-validate-success-field');
5612
+ this._inputEl?.classList.remove('is-invalid');
5613
+ }
5614
+ else if (this.isValid == true) {
5615
+ this._inputEl?.classList.add('just-validate-success-field');
5616
+ this._inputEl?.classList.remove('is-invalid');
5617
+ }
5618
+ else if (this.isInvalid == true) {
5619
+ this._inputEl?.classList.add('is-invalid');
5620
+ this._inputEl?.classList.remove('just-validate-success-field');
5621
+ }
5622
+ }
5623
+ _initInputEl() {
5624
+ if (this._inputEl) {
5625
+ this._inputEl.onfocus = (ev) => this._setAndCheck(ev.target.value);
5626
+ this._inputEl.onblur = (ev) => this._setAndCheck(ev.target.value);
5627
+ this._inputEl.oninput = (ev) => {
5628
+ this.markAsTouched();
5629
+ this._setAndCheck(ev.target.value);
5630
+ };
5631
+ }
5632
+ }
5633
+ ngAfterViewInit() {
5634
+ if (this.selectAutocompleteEl) {
5635
+ super.ngAfterViewInit();
5636
+ const element = this.selectAutocompleteEl.nativeElement;
5637
+ this.selectAutocomplete = new SelectAutocomplete(element, {
5638
+ id: this.id,
5639
+ name: this.name || this.id,
5640
+ source: this.source,
5641
+ required: this.required,
5642
+ minLength: this.minLength,
5643
+ defaultValue: this.defaultValue,
5644
+ tAssistiveHint: this.assistiveHintLabel,
5645
+ tNoResults: this.noResultsLabel,
5646
+ tStatusQueryTooShort: this.statusQueryTooShortLabel,
5647
+ tStatusNoResults: this.statusNoResultsLabel,
5648
+ tStatusSelectedOption: this.statusSelectedOptionLabel,
5649
+ tStatusResults: this.statusResultsLabel,
5650
+ onConfirm: (selectedElement) => {
5651
+ this.markAsTouched();
5652
+ this._setAndCheck(selectedElement);
5653
+ this.selected.emit(selectedElement);
5654
+ },
5655
+ });
5656
+ this._findInput();
5657
+ }
5658
+ }
5659
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItAutocompleteComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
5660
+ 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 }); }
5661
+ }
5662
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItAutocompleteComponent, decorators: [{
5663
+ type: Component,
5664
+ 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" }]
5665
+ }], propDecorators: { source: [{
5666
+ type: Input
5667
+ }], required: [{
5668
+ type: Input
5669
+ }], name: [{
5670
+ type: Input
5671
+ }], description: [{
5672
+ type: Input
5673
+ }], minLength: [{
5674
+ type: Input
5675
+ }], defaultValue: [{
5676
+ type: Input
5677
+ }], assistiveHintLabel: [{
5678
+ type: Input
5679
+ }], noResultsLabel: [{
5680
+ type: Input
5681
+ }], statusQueryTooShortLabel: [{
5682
+ type: Input
5683
+ }], statusNoResultsLabel: [{
5684
+ type: Input
5685
+ }], statusSelectedOptionLabel: [{
5686
+ type: Input
5687
+ }], statusResultsLabel: [{
5688
+ type: Input
5689
+ }], selected: [{
5690
+ type: Output
5691
+ }], selectAutocompleteEl: [{
5692
+ type: ViewChild,
5693
+ args: ['selectAutocomplete']
5694
+ }] } });
5695
+
5027
5696
  const formComponents = [
5028
5697
  ItAutocompleteComponent,
5698
+ ItSearchComponent,
5029
5699
  ItCheckboxComponent,
5030
5700
  ItInputComponent,
5031
5701
  ItPasswordInputComponent,
@@ -5041,6 +5711,7 @@ const formComponents = [
5041
5711
  class ItFormModule {
5042
5712
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItFormModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
5043
5713
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.6", ngImport: i0, type: ItFormModule, imports: [ItAutocompleteComponent,
5714
+ ItSearchComponent,
5044
5715
  ItCheckboxComponent,
5045
5716
  ItInputComponent,
5046
5717
  ItPasswordInputComponent,
@@ -5052,6 +5723,7 @@ class ItFormModule {
5052
5723
  ItTransferComponent,
5053
5724
  ItUploadDragDropComponent,
5054
5725
  ItUploadFileListComponent], exports: [ItAutocompleteComponent,
5726
+ ItSearchComponent,
5055
5727
  ItCheckboxComponent,
5056
5728
  ItInputComponent,
5057
5729
  ItPasswordInputComponent,
@@ -5597,7 +6269,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
5597
6269
  args: [{
5598
6270
  selector: 'it-navscroll-list-item',
5599
6271
  standalone: true,
5600
- imports: [RouterLink, RouterLinkActive, RouterLinkWithHref, ItNavscrollListItemsComponent, AsyncPipe],
6272
+ imports: [RouterLink, RouterLinkActive, RouterLinkWithHref, AsyncPipe],
5601
6273
  changeDetection: ChangeDetectionStrategy.OnPush,
5602
6274
  template: `
5603
6275
  <a
@@ -5817,6 +6489,60 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
5817
6489
  args: ['class']
5818
6490
  }] } });
5819
6491
 
6492
+ class ItSkiplinkComponent {
6493
+ constructor() {
6494
+ /**
6495
+ * Aria label for `nav` mode
6496
+ * @default 'Scorciatoie di navigazione'
6497
+ */
6498
+ this.ariaLabel = 'Scorciatoie di navigazione';
6499
+ }
6500
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6501
+ 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 }); }
6502
+ }
6503
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkComponent, decorators: [{
6504
+ type: Component,
6505
+ 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" }]
6506
+ }], propDecorators: { ariaLabel: [{
6507
+ type: Input
6508
+ }], nav: [{
6509
+ type: Input,
6510
+ args: [{ transform: inputToBoolean }]
6511
+ }] } });
6512
+
6513
+ class ItSkiplinkItemComponent {
6514
+ constructor(parent) {
6515
+ this.inNav = parent.nav ? true : false;
6516
+ }
6517
+ 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 }); }
6518
+ 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 }); }
6519
+ }
6520
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkItemComponent, decorators: [{
6521
+ type: Component,
6522
+ 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" }]
6523
+ }], ctorParameters: () => [{ type: ItSkiplinkComponent, decorators: [{
6524
+ type: Host
6525
+ }] }], propDecorators: { href: [{
6526
+ type: Input
6527
+ }], externalLink: [{
6528
+ type: Input,
6529
+ args: [{ transform: inputToBoolean }]
6530
+ }] } });
6531
+
6532
+ const skiplinkComponents = [ItSkiplinkComponent, ItSkiplinkItemComponent];
6533
+ class ItSkiplinkModule {
6534
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
6535
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkModule, imports: [ItSkiplinkComponent, ItSkiplinkItemComponent], exports: [ItSkiplinkComponent, ItSkiplinkItemComponent] }); }
6536
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkModule, imports: [skiplinkComponents] }); }
6537
+ }
6538
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItSkiplinkModule, decorators: [{
6539
+ type: NgModule,
6540
+ args: [{
6541
+ imports: skiplinkComponents,
6542
+ exports: skiplinkComponents,
6543
+ }]
6544
+ }] });
6545
+
5820
6546
  class ItErrorPageComponent {
5821
6547
  constructor(route) {
5822
6548
  this.route = route;
@@ -6088,60 +6814,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
6088
6814
  }]
6089
6815
  }] });
6090
6816
 
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
6817
  /**
6146
6818
  * Configures DesignAngularKit library
6147
6819
  * @param config the DesignAngularKit config
@@ -6230,6 +6902,7 @@ const core = [
6230
6902
  ItTableModule,
6231
6903
  ItTooltipDirective,
6232
6904
  ItTimelineModule,
6905
+ ItVideoPlayerComponent,
6233
6906
  ];
6234
6907
  /**
6235
6908
  * Navigation Components
@@ -6299,7 +6972,8 @@ class DesignAngularKitModule {
6299
6972
  ItTabModule,
6300
6973
  ItTableModule,
6301
6974
  ItTooltipDirective,
6302
- ItTimelineModule, // Core components
6975
+ ItTimelineModule,
6976
+ ItVideoPlayerComponent, // Core components
6303
6977
  ItFormModule, ItBackButtonComponent,
6304
6978
  ItBackToTopComponent,
6305
6979
  ItBreadcrumbsModule,
@@ -6334,7 +7008,8 @@ class DesignAngularKitModule {
6334
7008
  ItTabModule,
6335
7009
  ItTableModule,
6336
7010
  ItTooltipDirective,
6337
- ItTimelineModule, // Core components
7011
+ ItTimelineModule,
7012
+ ItVideoPlayerComponent, // Core components
6338
7013
  ItFormModule, ItBackButtonComponent,
6339
7014
  ItBackToTopComponent,
6340
7015
  ItBreadcrumbsModule,
@@ -6386,6 +7061,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
6386
7061
  }]
6387
7062
  }] });
6388
7063
 
7064
+ // See options: https://videojs.com/guides/options
7065
+
7066
+ class ItVideoPlayerModule {
7067
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItVideoPlayerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
7068
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.6", ngImport: i0, type: ItVideoPlayerModule, imports: [ItVideoPlayerComponent], exports: [ItVideoPlayerComponent] }); }
7069
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItVideoPlayerModule }); }
7070
+ }
7071
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItVideoPlayerModule, decorators: [{
7072
+ type: NgModule,
7073
+ args: [{
7074
+ imports: [ItVideoPlayerComponent],
7075
+ exports: [ItVideoPlayerComponent],
7076
+ }]
7077
+ }] });
7078
+
6389
7079
  //Qs
6390
7080
  //Aria hidden?
6391
7081
  //state management with service?
@@ -6727,5 +7417,5 @@ class ItDateUtils {
6727
7417
  * Generated bundle index. Do not edit.
6728
7418
  */
6729
7419
 
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 };
7420
+ 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
7421
  //# sourceMappingURL=design-angular-kit.mjs.map