design-angular-kit-lombardia
Version:
Un toolkit Angular conforme alle linee guida di design per i servizi web della Regione Lombardia
1 lines • 617 kB
Source Map (JSON)
{"version":3,"file":"design-angular-kit-lombardia.mjs","sources":["../../../projects/design-angular-kit/src/lib/abstracts/abstract.component.ts","../../../projects/design-angular-kit/src/lib/components/core/video-player/video-player-i18n.service.ts","../../../projects/design-angular-kit/src/lib/components/core/video-player/video-player.config.ts","../../../projects/design-angular-kit/src/lib/components/core/video-player/video-player.cookie.ts","../../../projects/design-angular-kit/src/lib/components/core/video-player/video-player.component.ts","../../../projects/design-angular-kit/src/lib/utils/coercion.ts","../../../projects/design-angular-kit/src/lib/components/core/collapse/collapse.component.ts","../../../projects/design-angular-kit/src/lib/components/core/collapse/collapse.component.html","../../../projects/design-angular-kit/src/lib/components/core/accordion/accordion.component.ts","../../../projects/design-angular-kit/src/lib/components/core/accordion/accordion.component.html","../../../projects/design-angular-kit/src/lib/interfaces/design-angular-kit-config.ts","../../../projects/design-angular-kit/src/lib/components/utils/icon/icon.component.ts","../../../projects/design-angular-kit/src/lib/components/utils/icon/icon.component.html","../../../projects/design-angular-kit/src/lib/components/core/alert/alert.component.ts","../../../projects/design-angular-kit/src/lib/components/core/alert/alert.component.html","../../../projects/design-angular-kit/src/lib/components/core/link/link.component.ts","../../../projects/design-angular-kit/src/lib/components/core/link/link.component.html","../../../projects/design-angular-kit/src/lib/components/core/dropdown/dropdown-item/dropdown-item.component.ts","../../../projects/design-angular-kit/src/lib/components/core/dropdown/dropdown-item/dropdown-item.component.html","../../../projects/design-angular-kit/src/lib/components/core/dropdown/dropdown/dropdown.component.ts","../../../projects/design-angular-kit/src/lib/components/core/dropdown/dropdown/dropdown.component.html","../../../projects/design-angular-kit/src/lib/components/core/dropdown/dropdown.module.ts","../../../projects/design-angular-kit/src/lib/components/core/avatar/avatar-dropdown/avatar-dropdown.component.ts","../../../projects/design-angular-kit/src/lib/components/core/avatar/avatar-dropdown/avatar-dropdown.component.html","../../../projects/design-angular-kit/src/lib/components/core/avatar/avatar-extra-text.directive.ts","../../../projects/design-angular-kit/src/lib/components/core/avatar/avatar-group/avatar-group.component.ts","../../../projects/design-angular-kit/src/lib/components/core/avatar/avatar-presence.directive.ts","../../../projects/design-angular-kit/src/lib/components/core/avatar/avatar-status.directive.ts","../../../projects/design-angular-kit/src/lib/components/core/avatar/avatar-wrapper.directive.ts","../../../projects/design-angular-kit/src/lib/enums/colors.enums.ts","../../../projects/design-angular-kit/src/lib/enums/sizes.enum.ts","../../../projects/design-angular-kit/src/lib/components/core/avatar/avatar.directive.ts","../../../projects/design-angular-kit/src/lib/components/core/avatar/avatar.module.ts","../../../projects/design-angular-kit/src/lib/components/core/badge/badge.directive.ts","../../../projects/design-angular-kit/src/lib/components/core/progress-bar/progress-bar.component.ts","../../../projects/design-angular-kit/src/lib/components/core/progress-bar/progress-bar.component.html","../../../projects/design-angular-kit/src/lib/components/core/progress-button/progress-button.component.ts","../../../projects/design-angular-kit/src/lib/components/core/progress-button/progress-button.component.html","../../../projects/design-angular-kit/src/lib/components/core/button/button.directive.ts","../../../projects/design-angular-kit/src/lib/components/core/callout/callout.component.ts","../../../projects/design-angular-kit/src/lib/components/core/callout/callout.component.html","../../../projects/design-angular-kit/src/lib/components/core/card/card.component.ts","../../../projects/design-angular-kit/src/lib/components/core/card/card.component.html","../../../projects/design-angular-kit/src/lib/components/core/carousel/carousel-item/carousel-item.component.ts","../../../projects/design-angular-kit/src/lib/components/core/carousel/carousel-item/carousel-item.component.html","../../../projects/design-angular-kit/src/lib/components/core/carousel/carousel/carousel.component.ts","../../../projects/design-angular-kit/src/lib/components/core/carousel/carousel/carousel.component.html","../../../projects/design-angular-kit/src/lib/components/core/carousel/carousel.module.ts","../../../projects/design-angular-kit/src/lib/components/core/chip/chip.component.ts","../../../projects/design-angular-kit/src/lib/components/core/chip/chip.component.html","../../../projects/design-angular-kit/src/lib/components/core/dimmer/dimmer.component.ts","../../../projects/design-angular-kit/src/lib/components/core/dimmer/dimmer.component.html","../../../projects/design-angular-kit/src/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.ts","../../../projects/design-angular-kit/src/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.html","../../../projects/design-angular-kit/src/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.ts","../../../projects/design-angular-kit/src/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.html","../../../projects/design-angular-kit/src/lib/components/core/dimmer/dimmer.module.ts","../../../projects/design-angular-kit/src/lib/components/core/forward/forward.directive.ts","../../../projects/design-angular-kit/src/lib/components/core/list/list/list.component.ts","../../../projects/design-angular-kit/src/lib/components/core/list/list/list.component.html","../../../projects/design-angular-kit/src/lib/components/core/list/list-item/list-item.component.ts","../../../projects/design-angular-kit/src/lib/components/core/list/list-item/list-item.component.html","../../../projects/design-angular-kit/src/lib/components/core/list/list.module.ts","../../../projects/design-angular-kit/src/lib/components/core/modal/modal.component.ts","../../../projects/design-angular-kit/src/lib/components/core/modal/modal.component.html","../../../projects/design-angular-kit/src/lib/interfaces/core.ts","../../../projects/design-angular-kit/src/lib/services/notification/notification.service.ts","../../../projects/design-angular-kit/src/lib/components/core/notifications/notifications.component.ts","../../../projects/design-angular-kit/src/lib/components/core/notifications/notifications.component.html","../../../projects/design-angular-kit/src/lib/abstracts/abstract-form.component.ts","../../../projects/design-angular-kit/src/lib/utils/regex.ts","../../../projects/design-angular-kit/src/lib/validators/it-validators.ts","../../../projects/design-angular-kit/src/lib/components/form/input/input.component.ts","../../../projects/design-angular-kit/src/lib/components/form/input/input.component.html","../../../projects/design-angular-kit/src/lib/components/core/pagination/pagination.component.ts","../../../projects/design-angular-kit/src/lib/components/core/pagination/pagination.component.html","../../../projects/design-angular-kit/src/lib/components/core/popover/popover.directive.ts","../../../projects/design-angular-kit/src/lib/components/core/spinner/spinner.component.ts","../../../projects/design-angular-kit/src/lib/components/core/spinner/spinner.component.html","../../../projects/design-angular-kit/src/lib/components/core/steppers/steppers-item/steppers-item.component.ts","../../../projects/design-angular-kit/src/lib/components/core/steppers/steppers-item/steppers-item.component.html","../../../projects/design-angular-kit/src/lib/components/core/steppers/steppers-container/steppers-container.component.ts","../../../projects/design-angular-kit/src/lib/components/core/steppers/steppers-container/steppers-container.component.html","../../../projects/design-angular-kit/src/lib/components/core/steppers/steppers.module.ts","../../../projects/design-angular-kit/src/lib/components/core/tab/tab-item/tab-item.component.ts","../../../projects/design-angular-kit/src/lib/components/core/tab/tab-item/tab-item.component.html","../../../projects/design-angular-kit/src/lib/components/core/tab/tab-container/tab-container.component.ts","../../../projects/design-angular-kit/src/lib/components/core/tab/tab-container/tab-container.component.html","../../../projects/design-angular-kit/src/lib/components/core/tab/tab.module.ts","../../../projects/design-angular-kit/src/lib/components/core/table/table.component.ts","../../../projects/design-angular-kit/src/lib/components/core/table/table.component.html","../../../projects/design-angular-kit/src/lib/interfaces/sortable-table.ts","../../../projects/design-angular-kit/src/lib/components/core/table/sort/sort.directive.ts","../../../projects/design-angular-kit/src/lib/components/core/table/sort/sort-header/sort-header.component.ts","../../../projects/design-angular-kit/src/lib/components/core/table/sort/sort-header/sort-header.component.html","../../../projects/design-angular-kit/src/lib/components/core/table/table.module.ts","../../../projects/design-angular-kit/src/lib/components/core/timeline/timeline-item/timeline-item.component.ts","../../../projects/design-angular-kit/src/lib/components/core/timeline/timeline-item/timeline-item.component.html","../../../projects/design-angular-kit/src/lib/components/core/timeline/timeline.component.ts","../../../projects/design-angular-kit/src/lib/components/core/timeline/timeline.component.html","../../../projects/design-angular-kit/src/lib/components/core/timeline/timeline.module.ts","../../../projects/design-angular-kit/src/lib/components/core/tooltip/tooltip.directive.ts","../../../projects/design-angular-kit/src/lib/components/form/checkbox/checkbox.component.ts","../../../projects/design-angular-kit/src/lib/components/form/checkbox/checkbox.component.html","../../../projects/design-angular-kit/src/lib/components/form/password-input/password-input.component.ts","../../../projects/design-angular-kit/src/lib/components/form/password-input/password-input.component.html","../../../projects/design-angular-kit/src/lib/components/form/radio-button/radio-button.component.ts","../../../projects/design-angular-kit/src/lib/components/form/radio-button/radio-button.component.html","../../../projects/design-angular-kit/src/lib/components/form/range/range.component.ts","../../../projects/design-angular-kit/src/lib/components/form/range/range.component.html","../../../projects/design-angular-kit/src/lib/components/form/rating/rating.component.ts","../../../projects/design-angular-kit/src/lib/components/form/rating/rating.component.html","../../../projects/design-angular-kit/src/lib/components/form/select/select.component.ts","../../../projects/design-angular-kit/src/lib/components/form/select/select.component.html","../../../projects/design-angular-kit/src/lib/components/form/textarea/textarea.component.ts","../../../projects/design-angular-kit/src/lib/components/form/textarea/textarea.component.html","../../../projects/design-angular-kit/src/lib/utils/file-utils.ts","../../../projects/design-angular-kit/src/lib/components/form/upload-drag-drop/upload-drag-drop.component.ts","../../../projects/design-angular-kit/src/lib/components/form/upload-drag-drop/upload-drag-drop.component.html","../../../projects/design-angular-kit/src/lib/components/form/upload-file-list/upload-file-list.component.ts","../../../projects/design-angular-kit/src/lib/components/form/upload-file-list/upload-file-list.component.html","../../../projects/design-angular-kit/src/lib/pipes/mark-matching-text.pipe.ts","../../../projects/design-angular-kit/src/lib/components/form/search/search.component.ts","../../../projects/design-angular-kit/src/lib/components/form/search/search.component.html","../../../projects/design-angular-kit/src/lib/components/form/transfer/store/transfer.reducers.ts","../../../projects/design-angular-kit/src/lib/components/form/transfer/store/transfer.store.ts","../../../projects/design-angular-kit/src/lib/components/form/transfer/transfer-list/transfer-list.component.ts","../../../projects/design-angular-kit/src/lib/components/form/transfer/transfer-list/transfer-list.component.html","../../../projects/design-angular-kit/src/lib/components/form/transfer/transfer.component.ts","../../../projects/design-angular-kit/src/lib/components/form/transfer/transfer.component.html","../../../projects/design-angular-kit/src/lib/components/form/autocomplete/autocomplete.component.ts","../../../projects/design-angular-kit/src/lib/components/form/autocomplete/autocomplete.component.html","../../../projects/design-angular-kit/src/lib/components/form/form.module.ts","../../../projects/design-angular-kit/src/lib/components/navigation/back-button/back-button.component.ts","../../../projects/design-angular-kit/src/lib/components/navigation/back-button/back-button.component.html","../../../projects/design-angular-kit/src/lib/components/navigation/back-to-top/back-to-top.component.ts","../../../projects/design-angular-kit/src/lib/components/navigation/back-to-top/back-to-top.component.html","../../../projects/design-angular-kit/src/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.ts","../../../projects/design-angular-kit/src/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.html","../../../projects/design-angular-kit/src/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.ts","../../../projects/design-angular-kit/src/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.html","../../../projects/design-angular-kit/src/lib/components/navigation/breadcrumbs/breadcrumbs.module.ts","../../../projects/design-angular-kit/src/lib/components/navigation/navbar/navbar/navbar.component.ts","../../../projects/design-angular-kit/src/lib/components/navigation/navbar/navbar/navbar.component.html","../../../projects/design-angular-kit/src/lib/components/navigation/navbar/navbar-item/navbar-item.component.ts","../../../projects/design-angular-kit/src/lib/components/navigation/navbar/navbar-item/navbar-item.component.html","../../../projects/design-angular-kit/src/lib/components/navigation/navbar/navbar.module.ts","../../../projects/design-angular-kit/src/lib/components/navigation/header/header.component.ts","../../../projects/design-angular-kit/src/lib/components/navigation/header/header.component.html","../../../projects/design-angular-kit/src/lib/components/navigation/footer/footer.component.ts","../../../projects/design-angular-kit/src/lib/components/navigation/footer/footer.component.html","../../../projects/design-angular-kit/src/lib/components/navigation/megamenu/megamenu.component.ts","../../../projects/design-angular-kit/src/lib/components/navigation/megamenu/megamenu.component.html","../../../projects/design-angular-kit/src/lib/components/navigation/navscroll/navscroll.utils.ts","../../../projects/design-angular-kit/src/lib/components/navigation/navscroll/navscroll.store.ts","../../../projects/design-angular-kit/src/lib/components/navigation/navscroll/navscroll-list-item.component.ts","../../../projects/design-angular-kit/src/lib/components/navigation/navscroll/navscroll-list-items.component.ts","../../../projects/design-angular-kit/src/lib/components/navigation/navscroll/navscroll.component.ts","../../../projects/design-angular-kit/src/lib/components/navigation/navscroll/navscroll.component.html","../../../projects/design-angular-kit/src/lib/components/navigation/sidebar/sidebar.component.ts","../../../projects/design-angular-kit/src/lib/components/navigation/sidebar/sidebar.component.html","../../../projects/design-angular-kit/src/lib/components/navigation/skiplink/skiplink/skiplink.component.ts","../../../projects/design-angular-kit/src/lib/components/navigation/skiplink/skiplink/skiplink.component.html","../../../projects/design-angular-kit/src/lib/components/navigation/skiplink/skiplink-item/skiplink-item.component.ts","../../../projects/design-angular-kit/src/lib/components/navigation/skiplink/skiplink-item/skiplink-item.component.html","../../../projects/design-angular-kit/src/lib/components/navigation/skiplink/skiplink.module.ts","../../../projects/design-angular-kit/src/lib/components/utils/error-page/error-page.component.ts","../../../projects/design-angular-kit/src/lib/components/utils/error-page/error-page.component.html","../../../projects/design-angular-kit/src/lib/components/utils/language-switcher/language-switcher.component.ts","../../../projects/design-angular-kit/src/lib/components/utils/language-switcher/language-switcher.component.html","../../../projects/design-angular-kit/src/lib/pipes/date-ago.pipe.ts","../../../projects/design-angular-kit/src/lib/pipes/duration.pipe.ts","../../../projects/design-angular-kit/src/lib/components/it25/footer/footer.component.ts","../../../projects/design-angular-kit/src/lib/components/it25/footer/footer.component.html","../../../projects/design-angular-kit/src/lib/components/it25/navbar/navbar/navbar.component.ts","../../../projects/design-angular-kit/src/lib/components/it25/navbar/navbar/navbar.component.html","../../../projects/design-angular-kit/src/lib/components/it25/navbar/navbar-item/navbar-item.component.ts","../../../projects/design-angular-kit/src/lib/components/it25/navbar/navbar-item/navbar-item.component.html","../../../projects/design-angular-kit/src/lib/components/it25/navbar/navbar.module.ts","../../../projects/design-angular-kit/src/lib/components/it25/header/header.component.ts","../../../projects/design-angular-kit/src/lib/components/it25/header/header.component.html","../../../projects/design-angular-kit/src/lib/provide-design-angular-kit.ts","../../../projects/design-angular-kit/src/lib/design-angular-kit.module.ts","../../../projects/design-angular-kit/src/lib/components/core/video-player/video-player.model.ts","../../../projects/design-angular-kit/src/lib/components/core/video-player/video-player.module.ts","../../../projects/design-angular-kit/src/lib/components/form/transfer/transfer.model.ts","../../../projects/design-angular-kit/src/lib/interfaces/icon.ts","../../../projects/design-angular-kit/src/lib/utils/date-utils.ts","../../../projects/design-angular-kit/src/public_api.ts","../../../projects/design-angular-kit/src/design-angular-kit-lombardia.ts"],"sourcesContent":["import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n inject,\n Input,\n OnChanges,\n Output,\n Renderer2,\n SimpleChanges,\n} from '@angular/core';\n\n@Component({\n template: '',\n standalone: false,\n})\nexport abstract class ItAbstractComponent implements AfterViewInit, OnChanges {\n /**\n * The element ID\n */\n @Input() id: string = this.getDefaultId();\n\n /**\n * Fired when component input attributes was changed\n */\n @Output() public valueChanges: EventEmitter<void>;\n\n /**\n * Counter of active instances\n * @private\n */\n private static instances = 0;\n\n protected readonly _renderer: Renderer2; // Injected\n protected readonly _elementRef: ElementRef; // Injected\n protected readonly _changeDetectorRef: ChangeDetectorRef; // Injected\n\n constructor() {\n this._renderer = inject(Renderer2);\n this._elementRef = inject(ElementRef);\n this._changeDetectorRef = inject(ChangeDetectorRef);\n\n this.valueChanges = new EventEmitter<void>();\n }\n\n ngAfterViewInit(): void {\n this._renderer.removeAttribute(this._elementRef.nativeElement, 'id');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ngOnChanges(changes: SimpleChanges): void {\n this.valueChanges.next(); // The inputs were changed\n }\n\n /**\n * Generate unique id for components\n * @private\n */\n private getDefaultId(): string {\n const name = this.constructor.name.replace('Component', '');\n const kebabName = name.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());\n return `${kebabName}-${ItAbstractComponent.instances++}`;\n }\n}\n","import { DestroyRef, inject, Injectable } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TranslateService } from '@ngx-translate/core';\nimport { tap } from 'rxjs';\nimport videojs from 'video.js';\nimport Player from 'video.js/dist/types/player';\nimport { VideoJsTranslation, VideoPlayerTranslations } from './video-player-i18n.model';\n\n@Injectable({ providedIn: 'root' })\nexport class VideoPlayerI18nService {\n readonly #translate = inject(TranslateService);\n\n init(player: Player, destroyRef: DestroyRef) {\n this.#translate.onLangChange\n .pipe(\n takeUntilDestroyed(destroyRef),\n tap({\n next: e => {\n const language = e.lang;\n videojs.addLanguage(language, this.getTranslations());\n player.language(language);\n },\n })\n )\n .subscribe(x => {\n console.log('onLangChange', x);\n });\n }\n\n getLanguage() {\n const language = this.#translate.currentLang ?? 'it';\n\n return {\n languages: { [language]: mapToVideoJsTranslation(this.#translate.instant('it.video-player')) },\n language,\n };\n }\n\n private getTranslations() {\n return mapToVideoJsTranslation(this.#translate.instant('it.video-player'));\n }\n}\n\nfunction mapToVideoJsTranslation(translations: VideoPlayerTranslations): VideoJsTranslation {\n return {\n 'Audio Player': translations['audio-player'],\n 'Video Player': translations['video-player'],\n Play: translations.play,\n Pause: translations.pause,\n Replay: translations.replay,\n 'Current Time': translations['current-time'],\n Duration: translations.duration,\n 'Remaining Time': translations['remaining-time'],\n 'Stream Type': translations['stream-type'],\n LIVE: translations.live,\n Loaded: translations.loaded,\n Progress: translations.progress,\n 'Progress Bar': translations['progress-bar'],\n 'progress bar timing: currentTime={1} duration={2}': translations['progress-bar-timing:-currenttime={1}-duration={2}'],\n Fullscreen: translations.fullscreen,\n 'Exit Fullscreen': translations['exit-fullscreen'],\n Mute: translations.mute,\n Unmute: translations.unmute,\n 'Playback Rate': translations['playback-rate'],\n Subtitles: translations.subtitles,\n 'subtitles off': translations['subtitles-off'],\n Captions: translations.captions,\n 'captions off': translations['captions-off'],\n Chapters: translations.chapters,\n Descriptions: translations.descriptions,\n 'descriptions off': translations['descriptions-off'],\n 'Audio Track': translations['audio-track'],\n 'Volume Level': translations['volume-level'],\n 'You aborted the media playback': translations['you-aborted-the-media-playback'],\n 'A network error caused the media download to fail part-way.':\n translations['a-network-error-caused-the-media-download-to-fail-part-way.'],\n 'The media could not be loaded, either because the server or network failed or because the format is not supported.':\n translations['the-media-could-not-be-loaded,-either-because-the-server-or-network-failed-or-because-the-format-is-not-supported.'],\n 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.':\n translations[\n 'the-media-playback-was-aborted-due-to-a-corruption-problem-or-because-the-media-used-features-your-browser-did-not-support.'\n ],\n 'No compatible source was found for this media.': translations['no-compatible-source-was-found-for-this-media.'],\n 'The media is encrypted and we do not have the keys to decrypt it.':\n translations['the-media-is-encrypted-and-we-do-not-have-the-keys-to-decrypt-it.'],\n 'Play Video': translations['play-video'],\n Close: translations.close,\n 'Close Modal Dialog': translations['close-modal-dialog'],\n 'Modal Window': translations['modal-window'],\n 'This is a modal window': translations['this-is-a-modal-window'],\n 'This modal can be closed by pressing the Escape key or activating the close button.':\n translations['this-modal-can-be-closed-by-pressing-the-escape-key-or-activating-the-close-button.'],\n ', opens captions settings dialog': translations[',-opens-captions-settings-dialog'],\n ', opens subtitles settings dialog': translations[',-opens-subtitles-settings-dialog'],\n ', opens descriptions settings dialog': translations[',-opens-descriptions-settings-dialog'],\n ', selected': translations[',-selected'],\n 'captions settings': translations['captions-settings'],\n 'subtitles settings': translations['subtitles-settings'],\n 'descriptions settings': translations['descriptions-settings'],\n Text: translations.text,\n White: translations.white,\n Black: translations.black,\n Red: translations.red,\n Green: translations.green,\n Blue: translations.blue,\n Yellow: translations.yellow,\n Magenta: translations.magenta,\n Cyan: translations.cyan,\n Background: translations.background,\n Window: translations.window,\n Transparent: translations.transparent,\n 'Semi-Transparent': translations['semi-transparent'],\n Opaque: translations.opaque,\n 'Font Size': translations['font-size'],\n 'Text Edge Style': translations['text-edge-style'],\n None: translations.none,\n Uniform: translations.uniform,\n 'Drop shadow': translations['drop-shadow'],\n 'Font Family': translations['font-family'],\n 'Proportional Sans-Serif': translations['proportional-sans-serif'],\n 'Monospace Sans-Serif': translations['monospace-sans-serif'],\n 'Proportional Serif': translations['proportional-serif'],\n 'Monospace Serif': translations['monospace-serif'],\n 'Small Caps': translations['small-caps'],\n Reset: translations.reset,\n 'restore all settings to the default values': translations['restore-all-settings-to-the-default-values'],\n Done: translations.done,\n 'Caption Settings Dialog': translations['caption-settings-dialog'],\n 'Beginning of dialog window. Escape will cancel and close the window.':\n translations['beginning-of-dialog-window.-escape-will-cancel-and-close-the-window.'],\n 'End of dialog window.': translations['end-of-dialog-window.'],\n '{1} is loading.': translations['{1}-is-loading.'],\n 'Exit Picture-in-Picture': translations['exit-picture-in-picture'],\n 'Picture-in-Picture': translations['picture-in-picture'],\n Color: translations.color,\n Opacity: translations.opacity,\n 'Text Background': translations['text-background'],\n 'Caption Area Background': translations['caption-area-background'],\n 'Skip forward {1} seconds': translations['skip-forward-{1}-seconds'],\n 'Skip backward {1} seconds': translations['skip-backward-{1}-seconds'],\n };\n}\n","import { inject, Injectable } from '@angular/core';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { initYoutubePlugin } from 'bootstrap-lombardia/dist/plugins/util/youtube-video.js';\nimport videojs from 'video.js';\nimport { VideoPlayerI18nService } from './video-player-i18n.service';\nimport { ItEmbedVideoPlayerOptions, ItNativeVideoPlayerOptions, ItVideoPlayerOptions } from './video-player.model';\n\nconst hasYoutubeVideo = (options: ItVideoPlayerOptions) => (options as ItEmbedVideoPlayerOptions).source?.type === 'video/youtube';\n\nexport type Tech = 'html5' | 'youtube';\n\n@Injectable({ providedIn: 'root' })\nexport class VideoPlayerConfigService {\n readonly #languageService = inject(VideoPlayerI18nService);\n\n async configureTech({ tech }: { tech: Tech }) {\n if (tech === 'youtube') {\n initYoutubePlugin(videojs);\n }\n }\n\n mergeConfig(o: ItVideoPlayerOptions) {\n const options = o as ItNativeVideoPlayerOptions;\n const captions = options.captions ? options.captions.map(c => ({ ...c, kind: 'captions' })) : [];\n const chapters = options.chapters ? options.chapters.map(c => ({ ...c, kind: 'chapters' })) : [];\n const isYoutubeVideo = hasYoutubeVideo(options);\n const DEFAULT_CONFIG = this.#languageService.getLanguage();\n const tech = isYoutubeVideo ? 'youtube' : 'html5';\n const techOrder = [tech];\n //https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video#preload\n const preload = options.preload ?? 'metadata';\n const config = { ...DEFAULT_CONFIG, ...options, preload, techOrder, tracks: [...captions, ...chapters], tech: 'html5' };\n return isYoutubeVideo\n ? {\n ...config,\n sources: [(o as ItEmbedVideoPlayerOptions).source],\n tech: 'youtube',\n youtube: { ytControls: 2, rel: 0, fs: 0, modestbranding: 1 },\n }\n : config;\n }\n}\n","const preferencesMap: {\n ck3: {\n [key: string]: boolean;\n };\n} = { ck3: {} };\nconst STORAGE_KEY = 'bs-ck3';\n/*\n Possible choices:\n false => Accept once\n true => Accept always\n*/\nconst rememberChoice = (service: string, remember: boolean) => {\n preferencesMap.ck3[service] = remember;\n localStorage.setItem(STORAGE_KEY, JSON.stringify(preferencesMap.ck3));\n};\n\nconst isChoiceRemembered = (service: string) => {\n preferencesMap.ck3 = JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}');\n return Boolean(preferencesMap.ck3[service]) || false;\n};\n\nconst clearAllRememberedChoices = () => {\n localStorage.removeItem(STORAGE_KEY);\n};\n\nconst cookies = {\n rememberChoice,\n isChoiceRemembered,\n clearAllRememberedChoices,\n};\n\nexport { cookies };\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n inject,\n Injector,\n Input,\n NgZone,\n OnInit,\n signal,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { delay } from 'rxjs';\nimport videojs from 'video.js';\nimport type Player from 'video.js/dist/types/player';\n\nimport { ItAbstractComponent } from '../../../abstracts/abstract.component';\nimport { VideoPlayerI18nService } from './video-player-i18n.service';\nimport { Tech, VideoPlayerConfigService } from './video-player.config';\nimport { cookies } from './video-player.cookie';\nimport { ItVideoPlayerConfig, ItVideoPlayerOptions } from './video-player.model';\n\nenum ViewType {\n Default = 'DEFAULT',\n Overlay = 'OVERLAY',\n}\n\n/**\n * Video Player\n * @description Component that allows playing a video.\n */\n@Component({\n standalone: true,\n selector: 'it-video-player',\n template: `@switch (viewType()) {\n @case (viewTypes.Default) {\n <div class=\"row\">\n <ng-container *ngTemplateOutlet=\"videoTemplate\"></ng-container>\n <ng-container *ngTemplateOutlet=\"transcriptionTemplate\"></ng-container>\n </div>\n }\n @case (viewTypes.Overlay) {\n <div #acceptOverlayable class=\"acceptoverlayable show\">\n <div #acceptOveraly class=\"acceptoverlay acceptoverlay-primary fade show\">\n <div class=\"acceptoverlay-inner\">\n <div class=\"acceptoverlay-icon\">\n <svg class=\"icon icon-xl\"><use href=\"/bootstrap-lombardia/dist/svg/sprites.svg#it-video\"></use></svg>\n </div>\n <p>\n Accetta i cookie di YouTube per vedere il video. Puoi gestire le preferenze nella\n <a href=\"#\" class=\"text-white\">cookie policy</a>.\n </p>\n <div class=\"acceptoverlay-buttons bg-dark\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"acceptCookieHandler()\">Accetta</button>\n <div class=\"form-check\">\n <input id=\"chk-remember{{ id }}\" type=\"checkbox\" #chkRemember />\n <label for=\"chk-remember{{ id }}\">Ricorda per tutti i video</label>\n </div>\n </div>\n </div>\n </div>\n @if (cookieAccepted()) {\n <div>\n <ng-container *ngTemplateOutlet=\"videoTemplate\"></ng-container>\n <ng-container *ngTemplateOutlet=\"transcriptionTemplate\"></ng-container>\n </div>\n }\n </div>\n }\n @default {\n <h1>No video provider</h1>\n }\n }\n <ng-template #videoTemplate>\n <div>\n <video #videoPlayer class=\"video-js vjs-theme-bootstrap-lombardia vjs-fluid vjs-big-play-centered\"></video>\n </div>\n </ng-template>\n\n <ng-template #transcriptionTemplate>\n <div class=\"vjs-transcription accordion\">\n <div class=\"accordion-item\">\n <h2 class=\"accordion-header \" id=\"transcription-{{ id }}-head\">\n <button\n class=\"accordion-button collapsed\"\n type=\"button\"\n data-bs-toggle=\"collapse\"\n [attr.data-bs-target]=\"'#transcription-' + id\"\n [attr.aria-controls]=\"'transcription-' + id\"\n aria-expanded=\"true\">\n <ng-content select=\"[transcriptionTitle]\">Trascrizione</ng-content>\n </button>\n </h2>\n <div\n id=\"transcription-{{ id }}\"\n class=\"accordion-collapse collapse\"\n role=\"region\"\n [attr.aria-labelledby]=\"'transcription-' + id + '-head'\">\n <div class=\"accordion-body\">\n <ng-content select=\"[transcriptionText]\">-</ng-content>\n </div>\n </div>\n </div>\n </div>\n </ng-template> `,\n imports: [NgTemplateOutlet],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ItVideoPlayerComponent extends ItAbstractComponent implements OnInit {\n private config = inject(VideoPlayerConfigService);\n\n /**\n * Options for video player configuration\n */\n @Input() options!: ItVideoPlayerOptions;\n\n @ViewChild('videoPlayer', { static: false }) videoPlayerRef?: ElementRef<HTMLVideoElement>;\n\n @ViewChild('acceptOveraly', { static: false }) acceptOveralyRef?: ElementRef<HTMLDivElement>;\n\n @ViewChild('acceptOverlayable', { static: false }) acceptOverlayableRef?: ElementRef<HTMLDivElement>;\n\n @ViewChild('chkRemember', { static: false }) chrRememberRef?: ElementRef<HTMLInputElement>;\n\n player: Player | null = null;\n\n readonly viewTypes = ViewType;\n\n readonly viewType = signal<ViewType | undefined>(undefined);\n\n readonly cookieAccepted = signal(false);\n\n protected readonly i18nService = inject(VideoPlayerI18nService);\n\n readonly #destroyRef = inject(DestroyRef);\n\n private ngZone = inject(NgZone);\n private injector = inject(Injector);\n\n constructor() {\n super();\n\n afterNextRender(() => {\n if (this.viewType() === ViewType.Overlay && cookies.isChoiceRemembered('youtube.com')) {\n this.hideOverlay();\n }\n });\n\n this.#destroyRef.onDestroy(() => this.player?.dispose());\n }\n\n async ngOnInit() {\n const config = this.config.mergeConfig(this.options);\n this.setViewType(config);\n // Avoid running change detections while the script is being loaded.\n await this.ngZone.runOutsideAngular(() => this.config.configureTech(config as { tech: Tech }));\n\n if (!this.videoPlayerRef) {\n // Note: No need to pipe with `takeUntilDestroyed`; `toObservable` is\n // completed by Angular when the `DestroyRef` from the injector is destroyed.\n toObservable(this.cookieAccepted, { injector: this.injector })\n .pipe(delay(0))\n .subscribe(value => {\n if (value && !this.player) {\n this.initVideoPlayer();\n }\n });\n\n return;\n }\n\n this.initVideoPlayer();\n }\n\n acceptCookieHandler() {\n this.rememberHandler();\n this.hideOverlay();\n this.cookieAccepted.set(true);\n }\n\n private initVideoPlayer() {\n const config = this.config.mergeConfig(this.options);\n this.setVideoAttributes(config);\n this.setVideoPlayer();\n }\n\n private setVideoPlayer() {\n const config = this.config.mergeConfig(this.options);\n const onPlayerReadyCb = () => {\n if (!this.player) {\n return;\n }\n this.i18nService.init(this.player, this.#destroyRef);\n };\n\n const element = this.videoPlayerRef?.nativeElement;\n if (!element) {\n throw Error('videoPlayerRef is undefined');\n }\n\n this.player = this.ngZone.runOutsideAngular(() => videojs(element, config, onPlayerReadyCb));\n }\n\n private setViewType(config: ItVideoPlayerConfig) {\n this.viewType.set(config.tech === 'youtube' ? ViewType.Overlay : ViewType.Default);\n\n this.cookieAccepted.set(this.viewType() === ViewType.Overlay && cookies.isChoiceRemembered('youtube.com'));\n }\n\n private hideOverlay() {\n if (!this.acceptOverlayableRef) {\n return;\n }\n const classes = ['show'];\n this.acceptOverlayableRef.nativeElement.classList.remove(...classes);\n if (!this.acceptOveralyRef) {\n return;\n }\n this.acceptOveralyRef.nativeElement.classList.remove(...classes);\n this.acceptOveralyRef.nativeElement.setAttribute('aria-hidden', 'true');\n }\n\n private rememberHandler() {\n if (!this.chrRememberRef) {\n return;\n }\n const remember = this.chrRememberRef.nativeElement.checked;\n cookies.rememberChoice('youtube.com', remember);\n }\n\n private setVideoAttributes(options: ItVideoPlayerOptions) {\n if (!this.videoPlayerRef) {\n return;\n }\n const v = this.videoPlayerRef.nativeElement;\n\n const { autoplay, controls, loop, muted, poster, fluid } = options;\n\n if (autoplay) {\n v.setAttribute('autoplay', autoplay.toString());\n }\n\n if (controls) {\n v.setAttribute('controls', '');\n }\n\n if (loop) {\n v.setAttribute('loop', '');\n }\n\n if (muted) {\n v.setAttribute('muted', '');\n }\n\n if (poster) {\n v.setAttribute('poster', poster);\n }\n\n if (fluid) {\n v.setAttribute('fluid', '');\n }\n\n v.setAttribute('preload', 'none');\n v.setAttribute('playsinline', '');\n }\n}\n","import { booleanAttribute } from '@angular/core';\n\nexport type BooleanInput = 'false' | 'true' | boolean | undefined;\n\n/**\n * Transforms a value (typically a string) to a boolean.\n * Intended to be used as a transform function of an input.\n *\n * @usageNotes\n * ```typescript\n * @Input({ transform: booleanAttribute }) status?: boolean;\n * ```\n * @param {BooleanInput} value Value to be transformed.\n *\n * @publicApi\n */\nexport function inputToBoolean(value: BooleanInput): boolean {\n // Wrap `@angular/core` function to force value type, for ide hits\n return booleanAttribute(value);\n}\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport { ItAbstractComponent } from '../../../abstracts/abstract.component';\nimport { Collapse } from 'bootstrap-lombardia';\nimport { inputToBoolean } from '../../../utils/coercion';\n\n@Component({\n selector: 'it-collapse',\n templateUrl: './collapse.component.html',\n exportAs: 'itCollapse',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [],\n})\nexport class ItCollapseComponent extends ItAbstractComponent implements AfterViewInit {\n /**\n * Enable multiple collapse\n * @default false\n */\n @Input({ transform: inputToBoolean }) multi?: boolean;\n\n /**\n * Toggles the collapsible element on invocation\n * @default false\n */\n @Input({ transform: inputToBoolean }) opened?: boolean;\n\n /**\n * Custom class\n */\n @Input() class: string = '';\n\n /**\n * This event fires immediately when the show method is called.\n */\n @Output() showEvent: EventEmitter<Event> = new EventEmitter();\n\n /**\n * This event is triggered when the tooltip has been made visible to the user (it will wait for the CSS transitions to complete).\n */\n @Output() shownEvent: EventEmitter<Event> = new EventEmitter();\n\n /**\n * This event fires immediately when the hide method is called.\n */\n @Output() hideEvent: EventEmitter<Event> = new EventEmitter();\n\n /**\n * This event is raised when the tooltip has finished being hidden from the user (it will wait for the CSS transitions to complete).\n */\n @Output() hiddenEvent: EventEmitter<Event> = new EventEmitter();\n\n private collapse?: Collapse;\n\n private open: boolean = false;\n\n @ViewChild('collapse') protected collapseDiv?: ElementRef<HTMLDivElement>;\n\n override ngAfterViewInit(): void {\n super.ngAfterViewInit();\n this._renderer.removeAttribute(this._elementRef.nativeElement, 'class');\n\n if (this.collapseDiv) {\n const element = this.collapseDiv.nativeElement;\n this.collapse = Collapse.getOrCreateInstance(element, {\n toggle: this.opened,\n });\n\n element.addEventListener('show.bs.collapse', event => {\n this.open = true;\n this.showEvent.emit(event);\n });\n element.addEventListener('shown.bs.collapse', event => {\n this.open = true;\n this.shownEvent.emit(event);\n });\n element.addEventListener('hide.bs.collapse', event => {\n this.open = false;\n this.hideEvent.emit(event);\n });\n element.addEventListener('hidden.bs.collapse', event => {\n this.open = false;\n this.hiddenEvent.emit(event);\n });\n }\n }\n\n /**\n * Shows if collapse is open or not\n */\n public isOpen(): boolean {\n return this.open;\n }\n\n /**\n * Shows a resealable item\n * NOTE: Returns to the caller before the collapsable element has actually been shown (onShown event).\n */\n public show(): void {\n this.collapse?.show();\n }\n\n /**\n * Hides a resealable item\n * NOTE: Returns to the caller before the collapsable element has actually been hidden (onHidden Event)\n */\n public hide(): void {\n this.collapse?.hide();\n }\n\n /**\n * Toggle a collapsible item to show or hide it.\n * NOTE: Returns to the caller before the collapsable element has actually been shown or hidden (onShown and onHidden events)\n */\n public toggle(): void {\n this.collapse?.toggle();\n }\n\n /**\n * Eliminates the possibility of an item being resealable\n */\n public dispose(): void {\n this.collapse?.dispose();\n }\n}\n","<div [id]=\"id\" class=\"collapse {{ class }}\" [class.multi-collapse]=\"multi\" #collapse>\n <ng-content></ng-content>\n</div>\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, Input, ViewChild } from '@angular/core';\nimport { ItCollapseComponent } from '../collapse/collapse.component';\n\n/**\n * Accordion\n * @description Build vertically collapsible accordions based on Collapse.\n */\n@Component({\n selector: 'it-accordion',\n templateUrl: './accordion.component.html',\n exportAs: 'itAccordion',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [],\n})\nexport class ItAccordionComponent extends ItCollapseComponent implements AfterViewInit {\n /**\n * Accordion Title\n */\n @Input({ required: true }) title!: string;\n\n @ViewChild('collapse') protected override collapseDiv?: ElementRef<HTMLDivElement>;\n\n protected isCollapsed: boolean = true;\n\n override ngAfterViewInit(): void {\n super.ngAfterViewInit();\n this._renderer.removeAttribute(this._elementRef.nativeElement, 'title');\n\n this.isCollapsed = !this.opened;\n this.hideEvent.subscribe(() => {\n this.isCollapsed = true;\n this._changeDetectorRef.detectChanges();\n });\n this.showEvent.subscribe(() => {\n this.isCollapsed = false;\n this._changeDetectorRef.detectChanges();\n });\n }\n}\n","<div class=\"accordion\">\n <div class=\"accordion-item\">\n <h2 class=\"accordion-header\" id=\"collapse-{{ id }}-heading\">\n <button\n class=\"accordion-button\"\n type=\"button\"\n data-bs-toggle=\"collapse\"\n [class.collapsed]=\"isCollapsed\"\n [attr.data-bs-target]=\"'#collapse-' + id\"\n [attr.aria-controls]=\"'collapse-' + id\"\n [attr.aria-expanded]=\"opened ? 'true' : 'false'\">\n {{ title }}\n </button>\n </h2>\n\n <div\n #collapse\n id=\"collapse-{{ id }}\"\n role=\"region\"\n class=\"accordion-collapse collapse {{ class }}\"\n [attr.aria-labelledby]=\"'collapse-' + id + '-heading'\">\n <div class=\"accordion-body\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n</div>\n","import { InjectionToken, Provider } from '@angular/core';\n\n/**\n * The bootstrap-italia asset folder path\n * @default ./bootstrap-italia\n */\nexport const IT_ASSET_BASE_PATH = new InjectionToken<string>('it-asset-base-path');\n\nexport interface DesignAngularKitConfig {\n /**\n * The bootstrap-italia asset folder path\n * @default ./bootstrap-italia\n */\n assetBasePath?: string;\n\n /**\n * Load the <a href=\"https://italia.github.io/bootstrap-italia/docs/come-iniziare/introduzione/#fonts\">bootstrap-italia fonts</a>\n * @default true\n */\n loadFont?: boolean;\n\n /**\n * The TranslateModule loader\n * @param itPrefix the design-angular-kit i18n path\n * @param itSuffix the design-angular-kit i18n suffix\n * @default\n * {\n * provide: TranslateLoader,\n * useFactory: (http: HttpClient) => new TranslateHttpLoader(http, `${assetBasePath}/i18n/`, `.json?v${version}`),\n * deps: [HttpClient],\n * }\n */\n translateLoader?: (itPrefix: string, itSuffix: string) => Provider;\n}\n","import { ChangeDetectionStrategy, Component, inject, Input } from '@angular/core';\nimport { IconColor, IconName, IconSize } from '../../../interfaces/icon';\nimport { inputToBoolean } from '../../../utils/coercion';\nimport { IT_ASSET_BASE_PATH } from '../../../interfaces/design-angular-kit-config';\n\n@Component({\n selector: 'it-icon',\n templateUrl: './icon.component.html',\n styles: ':host {display: contents;}',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [],\n})\nexport class ItIconComponent {\n /**\n * The icon name\n */\n @Input({ required: true }) name!: IconName;\n\n /**\n * The icon size\n */\n @Input() size: IconSize | undefined;\n\n /**\n * The icon color\n */\n @Input() color: IconColor | undefined;\n\n /**\n * Create a padding proportional to the size of the surrounding icon.\n * @default false\n */\n @Input({ transform: inputToBoolean }) padded?: boolean;\n\n /**\n * Custom class of svg\n */\n @Input() svgClass: string | undefined;\n\n /**\n * Title of the icon\n */\n @Input() title: string | undefined;\n\n /**\n * Custom Waria label\n */\n @Input() labelWaria: string | undefined;\n\n /**\n * Return the icon href\n */\n protected get iconHref(): string {\n return `${this.assetBasePath}/dist/svg/sprites.svg#it-${this.name}`;\n }\n\n /**\n * Return the icon class\n */\n protected get iconClass(): string {\n let iconClass = 'icon';\n if (this.size) {\n iconClass += ` icon-${this.size}`;\n }\n if (this.color) {\n iconClass += ` icon-${this.color}`;\n }\n if (this.padded) {\n iconClass += ` icon-padded`;\n }\n if (this.svgClass) {\n iconClass += ` ${this.svgClass}`;\n }\n return iconClass;\n }\n\n /**\n * The bootstrap-italia asset folder path\n * @default ./bootstrap-italia\n */\n protected assetBasePath: string;\n\n get isAriaHidden(): boolean {\n return this.labelWaria == undefined && this.title == undefined;\n }\n\n get role(): string | null {\n return this.labelWaria == undefined && this.title == undefined ? null : 'img';\n }\n\n constructor() {\n this.assetBasePath = inject(IT_ASSET_BASE_PATH);\n }\n}\n","<svg [attr.role]=\"role\" [attr.aria-hidden]=\"isAriaHidden\" [attr.aria-label]=\"title || labelWaria\" [class]=\"iconClass\">\n @if (title || labelWaria) {\n <title>{{ title || labelWaria }}</title>\n }\n <use [attr.href]=\"iconHref\" [attr.xlink:href]=\"iconHref\"></use>\n</svg>\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport { AlertColor } from '../../../interfaces/core';\nimport { ItAbstractComponent } from '../../../abstracts/abstract.component';\nimport { Alert } from 'bootstrap-lombardia';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ItIconComponent } from '../../utils/icon/icon.component';\nimport { inputToBoolean } from '../../../utils/coercion';\n\n/**\n * Alert\n * @description You can provide feedback to the user via alert messages.\n */\n@Component({\n selector: 'it-alert',\n templateUrl: './alert.component.html',\n styleUrls: ['./alert.component.scss'],\n exportAs: 'itAlert',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule, ItIconComponent],\n})\nexport class ItAlertComponent extends ItAbstractComponent implements AfterViewInit {\n /**\n * The alert color\n * @default info\n */\n @Input() color: AlertColor = 'info';\n\n /**\n * Inserts the close button\n * @default false\n */\n @Input({ transform: inputToBoolean }) dismissible?: boolean;\n\n /**\n * This event fires immediately when the instance's close method is called.\n */\n @Output() public closeEvent: EventEmitter<Event> = new EventEmitter();\n\n /**\n * This event fires when the alert has