@funidata/ngx-fudis
Version:
Funidata Design System.
1 lines • 948 kB
Source Map (JSON)
{"version":3,"file":"funidata-ngx-fudis.mjs","sources":["../../../projects/ngx-fudis/src/lib/components/icon/icon.component.ts","../../../projects/ngx-fudis/src/lib/components/icon/icon.component.html","../../../projects/ngx-fudis/src/lib/services/id/id.service.ts","../../../projects/ngx-fudis/src/lib/services/translation/translationKeys.ts","../../../projects/ngx-fudis/src/lib/services/translation/translation.service.ts","../../../projects/ngx-fudis/src/lib/components/breadcrumbs/breadcrumbs.component.ts","../../../projects/ngx-fudis/src/lib/components/breadcrumbs/breadcrumbs.component.html","../../../projects/ngx-fudis/src/lib/components/breadcrumbs/breadcrumbs-item/breadcrumbs-item.component.ts","../../../projects/ngx-fudis/src/lib/components/breadcrumbs/breadcrumbs-item/breadcrumbs-item.component.html","../../../projects/ngx-fudis/src/lib/components/typography/body-text/body-text.component.ts","../../../projects/ngx-fudis/src/lib/components/typography/body-text/body-text.component.html","../../../projects/ngx-fudis/src/lib/services/alert/alert.service.ts","../../../projects/ngx-fudis/src/lib/services/focus/focus.service.ts","../../../projects/ngx-fudis/src/lib/services/dialog/dialog.service.ts","../../../projects/ngx-fudis/src/lib/components/alert/alert/alert.component.ts","../../../projects/ngx-fudis/src/lib/components/alert/alert/alert.component.html","../../../projects/ngx-fudis/src/lib/components/alert/alert-group/alert-group.component.ts","../../../projects/ngx-fudis/src/lib/components/alert/alert-group/alert-group.component.html","../../../projects/ngx-fudis/src/lib/components/badge/badge.component.ts","../../../projects/ngx-fudis/src/lib/components/badge/badge.component.html","../../../projects/ngx-fudis/src/lib/directives/popover/popover-api.directive.ts","../../../projects/ngx-fudis/src/lib/directives/button-base/button-base.directive.ts","../../../projects/ngx-fudis/src/lib/components/popover/popover.component.ts","../../../projects/ngx-fudis/src/lib/components/popover/popover.component.html","../../../projects/ngx-fudis/src/lib/directives/popover/popover.directive.ts","../../../projects/ngx-fudis/src/lib/components/button/button.component.ts","../../../projects/ngx-fudis/src/lib/components/button/button.component.html","../../../projects/ngx-fudis/src/lib/utilities/form/validator-utilities.ts","../../../projects/ngx-fudis/src/lib/components/form/checkbox/checkbox.component.ts","../../../projects/ngx-fudis/src/lib/components/form/checkbox/checkbox.component.html","../../../projects/ngx-fudis/src/lib/directives/form/form-common-api/form-common-api.directive.ts","../../../projects/ngx-fudis/src/lib/directives/form/group-component-base/group-component-base.directive.ts","../../../projects/ngx-fudis/src/lib/services/form/error-summary/internal-error-summary.service.ts","../../../projects/ngx-fudis/src/lib/components/form/error-message/validator-error-message/validator-error-message.component.ts","../../../projects/ngx-fudis/src/lib/components/form/error-message/validator-error-message/validator-error-message.component.html","../../../projects/ngx-fudis/src/lib/components/form/guidance/guidance.component.ts","../../../projects/ngx-fudis/src/lib/components/form/guidance/guidance.component.html","../../../projects/ngx-fudis/src/lib/directives/grid/gridUtils.ts","../../../projects/ngx-fudis/src/lib/directives/grid/grid-api/grid-api.directive.ts","../../../projects/ngx-fudis/src/lib/types/grid.ts","../../../projects/ngx-fudis/src/lib/types/breakpoints.ts","../../../projects/ngx-fudis/src/lib/types/spacing.ts","../../../projects/ngx-fudis/src/lib/utilities/breakpoint/breakpoint-utils.ts","../../../projects/ngx-fudis/src/lib/services/grid/grid.service.ts","../../../projects/ngx-fudis/src/lib/services/breakpoint/breakpoint.service.ts","../../../projects/ngx-fudis/src/lib/directives/grid/grid/grid.directive.ts","../../../projects/ngx-fudis/src/lib/services/dropdown/dropdown-event.service.ts","../../../projects/ngx-fudis/src/lib/components/icon-button/icon-button.component.ts","../../../projects/ngx-fudis/src/lib/components/icon-button/icon-button.component.html","../../../projects/ngx-fudis/src/lib/components/form/fieldset/fieldset.component.ts","../../../projects/ngx-fudis/src/lib/components/form/fieldset/fieldset.component.html","../../../projects/ngx-fudis/src/lib/components/form/fieldset/fieldset-content.directive.ts","../../../projects/ngx-fudis/src/lib/components/form/checkbox-group/checkbox-group.component.ts","../../../projects/ngx-fudis/src/lib/components/form/checkbox-group/checkbox-group.component.html","../../../projects/ngx-fudis/src/lib/components/form/checkbox-group/checkbox-group-option/checkbox-group-option.component.ts","../../../projects/ngx-fudis/src/lib/components/form/checkbox-group/checkbox-group-option/checkbox-group-option.component.html","../../../projects/ngx-fudis/src/lib/types/forms.ts","../../../projects/ngx-fudis/src/lib/components/form/date/date-common/utilities.ts","../../../projects/ngx-fudis/src/lib/components/form/date/date-common/date-adapter.ts","../../../projects/ngx-fudis/src/lib/directives/form/control-component-base/control-component-base.directive.ts","../../../projects/ngx-fudis/src/lib/components/form/label/label.component.ts","../../../projects/ngx-fudis/src/lib/components/form/label/label.component.html","../../../projects/ngx-fudis/src/lib/components/form/date/date-range/date-range.component.ts","../../../projects/ngx-fudis/src/lib/components/form/date/date-range/date-range.component.html","../../../projects/ngx-fudis/src/lib/components/form/date/datepicker/datepicker.component.ts","../../../projects/ngx-fudis/src/lib/components/form/date/datepicker/datepicker.component.html","../../../projects/ngx-fudis/src/lib/components/description-list/description-list.component.ts","../../../projects/ngx-fudis/src/lib/components/description-list/description-list.component.html","../../../projects/ngx-fudis/src/lib/components/description-list/description-list-item/description-list-item.component.ts","../../../projects/ngx-fudis/src/lib/components/description-list/description-list-item/description-list-item.component.html","../../../projects/ngx-fudis/src/lib/components/description-list/description-list-item/description-list-item-details/description-list-item-details.component.ts","../../../projects/ngx-fudis/src/lib/components/description-list/description-list-item/description-list-item-details/description-list-item-details.component.html","../../../projects/ngx-fudis/src/lib/components/language-badge-group/language-badge/language-badge.component.ts","../../../projects/ngx-fudis/src/lib/components/language-badge-group/language-badge/language-badge.component.html","../../../projects/ngx-fudis/src/lib/components/language-badge-group/language-badge-group.component.ts","../../../projects/ngx-fudis/src/lib/components/language-badge-group/language-badge-group.component.html","../../../projects/ngx-fudis/src/lib/components/description-list/description-list-item/description-list-item-term/description-list-item-term.component.ts","../../../projects/ngx-fudis/src/lib/components/description-list/description-list-item/description-list-item-term/description-list-item-term.component.html","../../../projects/ngx-fudis/src/lib/utilities/resizeThrottle.ts","../../../projects/ngx-fudis/src/lib/utilities/dialog/dialog-utils.ts","../../../projects/ngx-fudis/src/lib/components/dialog/dialog-directives.ts","../../../projects/ngx-fudis/src/lib/components/dialog/dialog.component.ts","../../../projects/ngx-fudis/src/lib/components/dialog/dialog.component.html","../../../projects/ngx-fudis/src/lib/directives/form/dropdown-base/dropdown-base.directive.ts","../../../projects/ngx-fudis/src/lib/components/dropdown-menu/dropdown-menu.component.ts","../../../projects/ngx-fudis/src/lib/components/dropdown-menu/dropdown-menu.component.html","../../../projects/ngx-fudis/src/lib/directives/form/dropdown-item-base/dropdown-item-base.directive.ts","../../../projects/ngx-fudis/src/lib/components/dropdown-menu/dropdown-menu-group/dropdown-menu-group.component.ts","../../../projects/ngx-fudis/src/lib/components/dropdown-menu/dropdown-menu-group/dropdown-menu-group.component.html","../../../projects/ngx-fudis/src/lib/components/dropdown-menu/dropdown-menu-item/dropdown-menu-item.component.ts","../../../projects/ngx-fudis/src/lib/components/dropdown-menu/dropdown-menu-item/dropdown-menu-item.component.html","../../../projects/ngx-fudis/src/lib/components/notification/notification.component.ts","../../../projects/ngx-fudis/src/lib/components/notification/notification.component.html","../../../projects/ngx-fudis/src/lib/directives/link/link.directive.ts","../../../projects/ngx-fudis/src/lib/components/form/error-summary/error-summary.component.ts","../../../projects/ngx-fudis/src/lib/components/form/error-summary/error-summary.component.html","../../../projects/ngx-fudis/src/lib/components/expandable/expandable-content.directive.ts","../../../projects/ngx-fudis/src/lib/components/expandable/expandable.component.ts","../../../projects/ngx-fudis/src/lib/components/expandable/expandable.component.html","../../../projects/ngx-fudis/src/lib/components/footer/footer.component.ts","../../../projects/ngx-fudis/src/lib/components/footer/footer.component.html","../../../projects/ngx-fudis/src/lib/utilities/typography/typography-utils.ts","../../../projects/ngx-fudis/src/lib/components/typography/heading/heading.component.ts","../../../projects/ngx-fudis/src/lib/components/typography/heading/heading.component.html","../../../projects/ngx-fudis/src/lib/components/form/form/form.component.ts","../../../projects/ngx-fudis/src/lib/components/form/form/form.component.html","../../../projects/ngx-fudis/src/lib/components/grid/grid/grid.component.ts","../../../projects/ngx-fudis/src/lib/components/grid/grid/grid.component.html","../../../projects/ngx-fudis/src/lib/directives/grid/grid-item/grid-item.directive.ts","../../../projects/ngx-fudis/src/lib/components/grid/grid-item/grid-item.component.ts","../../../projects/ngx-fudis/src/lib/components/grid/grid-item/grid-item.component.html","../../../projects/ngx-fudis/src/lib/components/horizontal-rule/horizontal-rule.component.ts","../../../projects/ngx-fudis/src/lib/components/horizontal-rule/horizontal-rule.component.html","../../../projects/ngx-fudis/src/lib/components/loading-spinner/loading-spinner.component.ts","../../../projects/ngx-fudis/src/lib/components/loading-spinner/loading-spinner.component.html","../../../projects/ngx-fudis/src/lib/utilities/areObjectsDeepEquals.ts","../../../projects/ngx-fudis/src/lib/components/form/select/common/utilities/selectUtilities.ts","../../../projects/ngx-fudis/src/lib/components/form/select/common/select-options-directive/select-options.directive.ts","../../../projects/ngx-fudis/src/lib/components/form/select/common/select-base/select-base.directive.ts","../../../projects/ngx-fudis/src/lib/components/form/select/common/select-control-value-accessor/select-control-value-accessor.directive.ts","../../../projects/ngx-fudis/src/lib/components/form/select/common/autocomplete/autocomplete.directive.ts","../../../projects/ngx-fudis/src/lib/components/form/select/common/select-icons/select-icons.component.ts","../../../projects/ngx-fudis/src/lib/components/form/select/common/select-icons/select-icons.component.html","../../../projects/ngx-fudis/src/lib/components/form/select/common/select-dropdown/select-dropdown.component.ts","../../../projects/ngx-fudis/src/lib/components/form/select/common/select-dropdown/select-dropdown.component.html","../../../projects/ngx-fudis/src/lib/components/form/select/select/select.component.ts","../../../projects/ngx-fudis/src/lib/components/form/select/select/select.component.html","../../../projects/ngx-fudis/src/lib/components/form/select/multiselect/multiselect-chip-list/multiselect-chip-list.component.ts","../../../projects/ngx-fudis/src/lib/components/form/select/multiselect/multiselect-chip-list/multiselect-chip-list.component.html","../../../projects/ngx-fudis/src/lib/components/form/select/multiselect/multiselect.component.ts","../../../projects/ngx-fudis/src/lib/components/form/select/multiselect/multiselect.component.html","../../../projects/ngx-fudis/src/lib/components/form/select/common/select-group/select-group.component.ts","../../../projects/ngx-fudis/src/lib/components/form/select/common/select-group/select-group.component.html","../../../projects/ngx-fudis/src/lib/components/form/select/common/select-option-base/select-option-base.directive.ts","../../../projects/ngx-fudis/src/lib/components/form/select/select/select-option/select-option.component.ts","../../../projects/ngx-fudis/src/lib/components/form/select/select/select-option/select-option.component.html","../../../projects/ngx-fudis/src/lib/components/form/localized-text-group/localized-text-group.component.ts","../../../projects/ngx-fudis/src/lib/components/form/localized-text-group/localized-text-group.component.html","../../../projects/ngx-fudis/src/lib/components/form/select/multiselect/multiselect-option/multiselect-option.component.ts","../../../projects/ngx-fudis/src/lib/components/form/select/multiselect/multiselect-option/multiselect-option.component.html","../../../projects/ngx-fudis/src/lib/components/pagination/pagination.component.ts","../../../projects/ngx-fudis/src/lib/components/pagination/pagination.component.html","../../../projects/ngx-fudis/src/lib/components/form/radio-button-group/radio-button-group.component.ts","../../../projects/ngx-fudis/src/lib/components/form/radio-button-group/radio-button-group.component.html","../../../projects/ngx-fudis/src/lib/components/form/radio-button-group/radio-button/radio-button.component.ts","../../../projects/ngx-fudis/src/lib/components/form/radio-button-group/radio-button/radio-button.component.html","../../../projects/ngx-fudis/src/lib/components/section/section.component.ts","../../../projects/ngx-fudis/src/lib/components/section/section.component.html","../../../projects/ngx-fudis/src/lib/components/tab-navigation/tab-navigation-bar.component.ts","../../../projects/ngx-fudis/src/lib/components/tab-navigation/tab-navigation-bar.component.html","../../../projects/ngx-fudis/src/lib/components/tab-navigation/tab-navigation-panel.component.ts","../../../projects/ngx-fudis/src/lib/components/tab-navigation/tab-navigation-tab.component.ts","../../../projects/ngx-fudis/src/lib/directives/form/text-field-component-base/text-field-component-base.directive.ts","../../../projects/ngx-fudis/src/lib/components/form/text-area/text-area.component.ts","../../../projects/ngx-fudis/src/lib/components/form/text-area/text-area.component.html","../../../projects/ngx-fudis/src/lib/components/form/text-input/text-input.component.ts","../../../projects/ngx-fudis/src/lib/components/form/text-input/text-input.component.html","../../../projects/ngx-fudis/src/lib/directives/form/datepicker/datepicker.directive.ts","../../../projects/ngx-fudis/src/lib/components/form/error-message/error-message/error-message.directive.ts","../../../projects/ngx-fudis/src/lib/directives/form/form-actions/form-actions.directive.ts","../../../projects/ngx-fudis/src/lib/components/form/form/form-content.directive.ts","../../../projects/ngx-fudis/src/lib/components/section/section-content.directive.ts","../../../projects/ngx-fudis/src/lib/services/form/error-summary/error-summary.service.ts","../../../projects/ngx-fudis/src/lib/ngx-fudis.module.ts","../../../projects/ngx-fudis/src/lib/types/icons.ts","../../../projects/ngx-fudis/src/lib/types/id.ts","../../../projects/ngx-fudis/src/lib/types/miscellaneous.ts","../../../projects/ngx-fudis/src/lib/types/typography.ts","../../../projects/ngx-fudis/src/lib/utilities/form/groupValidators.ts","../../../projects/ngx-fudis/src/lib/utilities/form/validators.ts","../../../projects/ngx-fudis/src/public-api.ts","../../../projects/ngx-fudis/src/funidata-ngx-fudis.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n OnChanges,\n ElementRef,\n} from '@angular/core';\n\nimport { FudisIcon, FudisIconColor, FudisIconRotate } from '../../types/icons';\nimport { FudisComponentChanges } from '../../types/miscellaneous';\nimport { BehaviorSubject } from 'rxjs';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Displays a decorative or semantic icon.\n *\n * Use this component to enhance recognition, meaning, or visual hierarchy.\n */\n@Component({\n selector: 'fudis-icon',\n templateUrl: './icon.component.html',\n styleUrls: ['./icon.component.scss'],\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class IconComponent implements OnChanges {\n constructor(public elementRef: ElementRef) {\n (elementRef.nativeElement as SVGElement).style.cssText = `\n display: inline-flex;\n vertical-align: middle;\n `;\n }\n\n /**\n * Binding host CSS class to component wrapper\n */\n @HostBinding('class') protected _classes = 'fudis-icon-host';\n\n /**\n * Displayed SVG icon\n */\n @Input({ required: true }) icon: FudisIcon;\n\n /**\n * Icon color: 'yellow' | 'red' | 'gray-dark' | 'gray-light' | 'primary' | 'primary-dark' |\n * 'green' | 'white'\n */\n @Input() color: FudisIconColor = 'gray-dark';\n\n /**\n * Icon rotation: 'flip-180' | 'cw-90' | 'ccw-90' | 'none'\n */\n @Input() rotate: FudisIconRotate = 'none';\n\n /**\n * CSS class list\n */\n protected _classList = new BehaviorSubject<string[]>([]);\n\n /**\n * Determines icon size by its name. If icon name has suffix \"-small\", iconSize is set to sm,\n * otherwise lg.\n */\n private _iconSize: string;\n\n ngOnChanges(changes: FudisComponentChanges<IconComponent>): void {\n if (\n changes.icon?.currentValue !== changes.icon?.previousValue ||\n changes.color?.currentValue !== changes.color?.previousValue ||\n changes.rotate?.currentValue !== changes.rotate?.previousValue\n ) {\n this._classList.next(this._getClasses());\n }\n }\n\n /**\n * Get CSS classes with correct color, rotate and size suffixes\n */\n private _getClasses(): string[] {\n this._iconSize = this.icon.includes('-small') ? 'sm' : 'lg';\n\n const cssClasses = [\n 'fudis-icon',\n `fudis-icon__color__${this.color}`,\n `fudis-icon__rotate__${this.rotate}`,\n `fudis-icon__${this._iconSize}`,\n `fudis-icon__${this.icon}`,\n ];\n\n return cssClasses;\n }\n}\n","<ng-container>\n @if (icon === \"achievement\") {\n <svg\n id=\"achievement\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n d=\"M24.373 12.384c-.277.894-.664 1.75-1.152 2.55a7.743 7.743 0 0 1-1.067-2.251 29.695 29.695 0 0 1 1.152-3.616 21.15 21.15 0 0 1 1.067 3.317ZM22.209 15.67a8.063 8.063 0 0 1-1.067 2.186 6.729 6.729 0 0 1-1.067-2.133 8.66 8.66 0 0 1 1.067-2.422c.49.722.85 1.523 1.067 2.368Z\"\n />\n <path\n d=\"M24.064 17.888a10.932 10.932 0 0 1-2.9-.47 9.271 9.271 0 0 1 2.132-1.813c.984.023 1.96.177 2.902.459a9.526 9.526 0 0 1-2.134 1.824ZM22.73 20.267a9.804 9.804 0 0 1-2.634 1.066 9.826 9.826 0 0 1-2.496-1.365 9.802 9.802 0 0 1 2.634-1.067c.892.336 1.732.796 2.496 1.366ZM18.826 15.403c.347.778.549 1.613.598 2.464-.181.576-2.027 2.133-2.027 2.133a7.06 7.06 0 0 1-.597-2.475c.192-.608 2.026-2.122 2.026-2.122Z\"\n />\n <path\n d=\"m18.112 19.339 3.307-1.664-2.496 2.282-4.587 2.592.416-1.216 3.36-1.994ZM7.66 12.576c.255.84.613 1.647 1.066 2.4.47-.648.83-1.369 1.067-2.133a29.196 29.196 0 0 0-1.067-3.467 21.546 21.546 0 0 0-1.067 3.2ZM9.792 15.67a8.064 8.064 0 0 0 1.067 2.186 6.73 6.73 0 0 0 1.066-2.133A8.663 8.663 0 0 0 10.86 13.3a7.56 7.56 0 0 0-1.067 2.368Z\"\n />\n <path\n d=\"M7.936 17.888c.984-.025 1.96-.183 2.901-.47a9.27 9.27 0 0 0-2.133-1.813c-.983.023-1.959.177-2.901.459a9.525 9.525 0 0 0 2.133 1.824ZM11.904 21.333a9.825 9.825 0 0 0 2.496-1.365 9.802 9.802 0 0 0-2.635-1.067c-.891.336-1.732.796-2.495 1.366.821.481 1.709.84 2.634 1.066ZM13.174 15.403a7.062 7.062 0 0 0-.598 2.464c.181.576 2.027 2.133 2.027 2.133.347-.782.55-1.62.597-2.475-.192-.608-2.026-2.122-2.026-2.122Z\"\n />\n <path d=\"m13.888 19.339-3.307-1.664 2.496 2.282 4.587 2.592-.406-1.216-3.37-1.994Z\" />\n </svg>\n }\n\n @if (icon === \"achievement-small\") {\n <svg\n id=\"achievement-small\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n >\n <path\n d=\"M14.569 5.603a8.87 8.87 0 0 1-.904 2 6.079 6.079 0 0 1-.837-1.766c.24-.964.543-1.912.904-2.837.35.843.63 1.713.837 2.603ZM12.87 8.18c-.19.61-.473 1.19-.837 1.715a5.282 5.282 0 0 1-.837-1.673c.18-.673.463-1.313.837-1.9.384.566.667 1.195.837 1.858Z\"\n />\n <path\n d=\"M14.327 9.92a8.577 8.577 0 0 1-2.276-.368 7.271 7.271 0 0 1 1.673-1.422 8.636 8.636 0 0 1 2.277.36 7.473 7.473 0 0 1-1.674 1.43ZM13.28 11.787a7.689 7.689 0 0 1-2.067.836 7.708 7.708 0 0 1-1.958-1.07 7.688 7.688 0 0 1 2.067-.838c.7.264 1.359.624 1.958 1.072ZM10.217 7.97c.271.612.43 1.266.468 1.934-.142.452-1.59 1.673-1.59 1.673a5.54 5.54 0 0 1-.468-1.941c.15-.477 1.59-1.665 1.59-1.665Z\"\n />\n <path\n d=\"m9.657 11.059 2.594-1.306-1.958 1.79-3.599 2.034.327-.954 2.636-1.564ZM1.456 5.753c.2.66.481 1.292.837 1.883a5.749 5.749 0 0 0 .837-1.674 22.903 22.903 0 0 0-.837-2.72 16.904 16.904 0 0 0-.837 2.511ZM3.13 8.18c.19.61.473 1.19.837 1.715a5.28 5.28 0 0 0 .837-1.673 6.795 6.795 0 0 0-.837-1.9A5.933 5.933 0 0 0 3.13 8.18Z\"\n />\n <path\n d=\"M1.674 9.92a8.577 8.577 0 0 0 2.276-.368A7.272 7.272 0 0 0 2.276 8.13 8.636 8.636 0 0 0 0 8.49a7.473 7.473 0 0 0 1.674 1.43ZM4.787 12.623a7.708 7.708 0 0 0 1.958-1.07 7.688 7.688 0 0 0-2.067-.838 7.97 7.97 0 0 0-1.958 1.072c.644.377 1.34.66 2.067.836ZM5.782 7.97a5.54 5.54 0 0 0-.469 1.934c.143.452 1.59 1.673 1.59 1.673a5.54 5.54 0 0 0 .47-1.941c-.152-.477-1.59-1.665-1.59-1.665Z\"\n />\n <path d=\"M6.343 11.059 3.75 9.753l1.958 1.79 3.599 2.034-.318-.954-2.645-1.564Z\" />\n </svg>\n }\n\n @if (icon === \"alert\") {\n <svg\n id=\"alert\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M15.634 8.5a1 1 0 0 1 1.73 0l7.5 13a1 1 0 0 1-.86 1.5h-15a1 1 0 0 1-.87-1.5l7.5-13Zm8.37 13.5-7.5-13-7.5 13h15Z\"\n clip-rule=\"evenodd\"\n />\n <circle cx=\"16.504\" cy=\"19.75\" r=\".75\" />\n <path d=\"M16.504 17.75a.75.75 0 0 1-.75-.75v-3a.75.75 0 0 1 1.5 0v3a.76.76 0 0 1-.75.75Z\" />\n </svg>\n }\n\n @if (icon === \"alert-fill\") {\n <svg\n id=\"alert-fill\"\n fill=\"none\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path fill=\"#fff\" fill-rule=\"evenodd\" d=\"m16.5 9.5 8 14h-16l8-14Z\" clip-rule=\"evenodd\" />\n <path\n fill=\"#B83C2E\"\n fill-rule=\"evenodd\"\n d=\"M15.634 9.5a1 1 0 0 1 1.73 0l7.5 13a1 1 0 0 1-.86 1.5h-15a1 1 0 0 1-.87-1.5l7.5-13Zm8.37 13.5-7.5-13-7.5 13h15Z\"\n clip-rule=\"evenodd\"\n />\n <circle fill=\"#B83C2E\" cx=\"16.504\" cy=\"20.75\" r=\".75\" />\n <path\n fill=\"#B83C2E\"\n d=\"M16.504 18.75a.75.75 0 0 1-.75-.75v-3a.75.75 0 0 1 1.5 0v3a.76.76 0 0 1-.75.75Z\"\n />\n </svg>\n }\n\n @if (icon === \"alert-small\") {\n <svg\n id=\"alert-small\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M7.186 1.47a.941.941 0 0 1 1.628 0l7.06 12.237a.942.942 0 0 1-.81 1.412H.945a.941.941 0 0 1-.819-1.412l7.06-12.236Zm7.879 12.708L8.005 1.941.945 14.178h14.12Z\"\n clip-rule=\"evenodd\"\n />\n <circle cx=\"8.005\" cy=\"12.06\" r=\".706\" />\n <path\n d=\"M8.005 10.178a.706.706 0 0 1-.706-.706V6.648a.706.706 0 1 1 1.412 0v2.824a.715.715 0 0 1-.706.706Z\"\n />\n </svg>\n }\n\n @if (icon === \"archive\") {\n <svg\n id=\"archive\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n d=\"M25.429 11.83a.533.533 0 0 0-.533.533v10.304a1.6 1.6 0 0 1-1.6 1.6H9.78a1.6 1.6 0 0 1-1.6-1.6V12.363a.533.533 0 1 0-1.067 0v10.304a2.667 2.667 0 0 0 2.667 2.666h13.515a2.677 2.677 0 0 0 2.666-2.666V12.363a.533.533 0 0 0-.533-.534Z\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M8 6.4h17.066a2.667 2.667 0 0 1 2.667 2.667v1.962h-22.4V9.067A2.667 2.667 0 0 1 8 6.4ZM6.4 9.963h20.266v-.896a1.6 1.6 0 0 0-1.6-1.6H8a1.61 1.61 0 0 0-1.6 1.6v.896ZM20.267 17.248c0 .784-.636 1.419-1.42 1.419H14.23a1.419 1.419 0 0 1-1.43-1.419v-.352c0-.79.64-1.43 1.43-1.43h4.619a1.43 1.43 0 0 1 1.419 1.43v.352Zm-6.4-.352v.352a.363.363 0 0 0 .362.352h4.619a.352.352 0 0 0 .352-.352v-.352a.363.363 0 0 0-.352-.363h-4.62a.363.363 0 0 0-.362.363Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"arrow-big\") {\n <svg\n id=\"arrow-big\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M15.925 24.534a1.6 1.6 0 0 1-1.6-1.6v-9.93l-3.06 3.064a1.596 1.596 0 0 1-2.259.005 1.598 1.598 0 0 1-.011-2.258l5.792-5.87c.315-.322.75-.495 1.174-.478.39-.016.858.161 1.166.47l5.861 5.87a1.6 1.6 0 1 1-2.264 2.26l-3.2-3.202v10.07a1.6 1.6 0 0 1-1.6 1.6L36.267 16\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"arrow-dashed\") {\n <svg\n id=\"arrow-dashed\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path d=\"M23.466 17.067H16v-2.134h7.466v2.134Zm-10.666 0H5.333v-2.134H12.8v2.134Z\" />\n <path d=\"m26.506 16-6.016 4.267v-8.534L26.506 16Z\" />\n </svg>\n }\n\n @if (icon === \"arrow-solid\") {\n <svg\n id=\"arrow-solid\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n d=\"M25.868 15.182a1 1 0 0 1 0 1.636l-7.865 5.539a1 1 0 0 1-1.576-.818V10.461a1 1 0 0 1 1.576-.818l7.865 5.54Z\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M5.5 16a1 1 0 0 1 1-1H20a1 1 0 1 1 0 2H6.5a1 1 0 0 1-1-1Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"back\") {\n <svg\n id=\"back\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"m18.684 14.403-.018-.003h-7.37l3.486-3.411c.2-.197.2-.513 0-.709a.518.518 0 0 0-.723 0l-4.25 4.16a.686.686 0 0 0 0 .986l4.25 4.16c.2.196.524.196.723 0 .2-.194.2-.512 0-.708l-3.486-3.411h7.37v.004c1.49-.037 2.667 1.19 2.667 2.662s-1.178 2.699-2.667 2.663v.004h-1.6a.533.533 0 0 0 0 1.067h1.6a3.737 3.737 0 0 0 3.733-3.734c0-2.057-1.654-3.756-3.715-3.73\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"brochure\") {\n <svg\n id=\"brochure\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M11 8.5a.5.5 0 0 0-.5.5v13.5a.5.5 0 0 0 .5.5h7v-2a1.5 1.5 0 0 1 1.5-1.5h2V9a.5.5 0 0 0-.5-.5H11Zm9.793 12H19.5a.5.5 0 0 0-.5.5v1.293l1.793-1.793ZM9.5 9A1.5 1.5 0 0 1 11 7.5h10A1.5 1.5 0 0 1 22.5 9v11.207L18.707 24H11a1.5 1.5 0 0 1-1.5-1.5V9Z\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M12 12a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5Zm0 2.5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5Zm0 2.5a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 0 1h-4a.5.5 0 0 1-.5-.5Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"bullets\") {\n <svg\n id=\"bullets\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <circle cx=\"7\" cy=\"11\" r=\"1\" />\n <rect width=\"16\" height=\"2\" x=\"10\" y=\"10\" rx=\"1\" />\n <circle cx=\"7\" cy=\"16\" r=\"1\" />\n <rect width=\"16\" height=\"2\" x=\"10\" y=\"15\" rx=\"1\" />\n <circle cx=\"7\" cy=\"21\" r=\"1\" />\n <rect width=\"16\" height=\"2\" x=\"10\" y=\"20\" rx=\"1\" />\n </svg>\n }\n\n @if (icon === \"calendar\") {\n <svg\n id=\"calendar\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M22.394 24.533c.552 0 1.073-.813 1.073-1.365v-12.8c0-.553-.52-.768-1.073-.768H19.2V8.533h-1.066V9.6h-4.267V8.533H12.8V9.6H9.594c-.518 0-1.06.244-1.06.768v12.8c0 .553.507 1.365 1.06 1.365h12.8ZM9.6 10.667h3.2v1.066h1.067v-1.066h4.267v1.066H19.2v-1.066h3.2V12.8H9.6v-2.133Zm0 3.2h12.8v8.868c0 .276-.163.732-.44.732h-12c-.275 0-.36-.456-.36-.732v-8.868Zm4.267 5.333h-2.133v2.133h2.133V19.2Zm0-3.2h-2.133v2.133h2.133V16Zm3.2 3.2h-2.134v2.133h2.133V19.2Zm0-3.2h-2.134v2.133h2.133V16Zm3.2 3.2h-2.133v2.133h2.133V19.2Zm0-3.2h-2.133v2.133h2.133V16Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"change-log\") {\n <svg\n id=\"change-log\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M16.5 15.717V11.2h-1v5.083l2.91 1.746.514-.858-2.424-1.454Z\"\n clip-rule=\"evenodd\"\n />\n <path\n d=\"M9.066 16a6.934 6.934 0 1 1 3.736 6.152l.494-.95A5.862 5.862 0 1 0 10.138 16H9.066Z\"\n />\n <path d=\"M7.467 16h4.266L9.6 18.667 7.467 16Z\" />\n </svg>\n }\n\n @if (icon === \"check\") {\n <svg\n id=\"check\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M22.726 9.437a1.5 1.5 0 0 1 .371 2.088l-7.448 10.667a1.5 1.5 0 0 1-2.347.143l-4.285-4.779a1.5 1.5 0 0 1 2.234-2.003l3.022 3.37 6.364-9.115a1.5 1.5 0 0 1 2.089-.371Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"check-indeterminate-small\") {\n <svg\n id=\"check-indeterminate-small\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n >\n <rect width=\"12\" height=\"3\" x=\"2\" y=\"7\" rx=\"1.5\" />\n </svg>\n }\n\n @if (icon === \"check-small\") {\n <svg\n id=\"check-small\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M13.572 3.18a1 1 0 0 1 .248 1.392l-5.713 8.182a1 1 0 0 1-1.564.095L3.256 9.184a1 1 0 1 1 1.489-1.335l2.444 2.726 4.991-7.147a1 1 0 0 1 1.393-.248Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"checkmark-circle\") {\n <svg\n id=\"checkmark-circle\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M16 25a9 9 0 1 0 0-18 9 9 0 0 0 0 18Zm0 1c5.523 0 10-4.477 10-10S21.523 6 16 6 6 10.477 6 16s4.477 10 10 10Z\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M21.573 11.18a1 1 0 0 1 .247 1.393l-5.713 8.181a1 1 0 0 1-1.564.095l-3.287-3.665a1 1 0 0 1 1.489-1.335l2.444 2.726 4.991-7.147a1 1 0 0 1 1.393-.248Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"chevron\") {\n <svg\n id=\"chevron\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M13.414 10.133a.61.61 0 0 0-.434 1.044L17.818 16l-4.838 4.822a.61.61 0 0 0 .434 1.045c.157 0 .315-.061.434-.18l5.102-5.085a.848.848 0 0 0 0-1.204l-5.102-5.085a.618.618 0 0 0-.434-.18\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"chevron-ring\") {\n <svg\n id=\"chevron-ring\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <g fill-rule=\"evenodd\" clip-path=\"url(#a)\" clip-rule=\"evenodd\">\n <path\n d=\"M16 28c6.627 0 12-5.373 12-12S22.627 4 16 4 4 9.373 4 16s5.373 12 12 12Zm0 1c7.18 0 13-5.82 13-13S23.18 3 16 3 3 8.82 3 16s5.82 13 13 13Z\"\n />\n <path\n d=\"M13.414 10.133a.61.61 0 0 0-.434 1.044L17.818 16l-4.838 4.822a.61.61 0 0 0 .434 1.045c.157 0 .315-.061.434-.18l5.102-5.085a.848.848 0 0 0 0-1.204l-5.102-5.085a.618.618 0 0 0-.434-.18Z\"\n />\n </g>\n <defs>\n <clipPath id=\"a\"><path d=\"M0 0h32v32H0z\" /></clipPath>\n </defs>\n </svg>\n }\n\n @if (icon === \"chevron-ring-fill\") {\n <svg\n id=\"chevron-ring-fill\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n fill=\"none\"\n >\n <path fill=\"#fff\" d=\"M29 16c0 7.18-5.82 13-13 13S3 23.18 3 16 8.82 3 16 3s13 5.82 13 13Z\" />\n <path\n fill=\"#484848\"\n fill-rule=\"evenodd\"\n d=\"M16 28c6.627 0 12-5.373 12-12S22.627 4 16 4 4 9.373 4 16s5.373 12 12 12Zm0 1c7.18 0 13-5.82 13-13S23.18 3 16 3 3 8.82 3 16s5.82 13 13 13Z\"\n clip-rule=\"evenodd\"\n />\n <path\n fill=\"#484848\"\n fill-rule=\"evenodd\"\n d=\"M13.414 10.133a.61.61 0 0 0-.434 1.044L17.818 16l-4.838 4.822a.61.61 0 0 0 .434 1.045c.157 0 .315-.061.434-.18l5.102-5.085a.848.848 0 0 0 0-1.204l-5.102-5.085a.618.618 0 0 0-.434-.18\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"clock\") {\n <svg\n id=\"clock\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M9.066 16a6.933 6.933 0 1 1 13.867 0 6.933 6.933 0 0 1-13.867 0Zm12.8 0A5.867 5.867 0 0 0 16 10.133 5.877 5.877 0 0 0 10.133 16a5.867 5.867 0 0 0 11.733 0Z\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M16.5 15.71V11.2h-1v5.09l2.908 1.659.496-.869-2.404-1.37Z\"\n clip-rule=\"evenodd\"\n />\n <path\n d=\"M11.2 15.467h1.067v1.067H11.2zM19.733 15.467H20.8v1.067h-1.067zM15.467 19.733h1.067V20.8h-1.067z\"\n />\n </svg>\n }\n\n @if (icon === \"close\") {\n <svg\n id=\"close\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n d=\"M20.255 20.932a.672.672 0 0 1-.47-.202l-8.533-8.534a.672.672 0 1 1 .95-.938l8.533 8.533a.672.672 0 0 1 0 .939.715.715 0 0 1-.48.202Z\"\n />\n <path\n d=\"M11.721 20.932a.714.714 0 0 0 .48-.202l8.533-8.534a.672.672 0 0 0-.949-.938l-8.533 8.533a.672.672 0 0 0 .469 1.141Z\"\n />\n </svg>\n }\n\n @if (icon === \"close-big\") {\n <svg\n id=\"close-big\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M25.566 6.403a.75.75 0 0 1 0 1.06L7.464 25.567a.75.75 0 0 1-1.06-1.061L24.504 6.403a.75.75 0 0 1 1.06 0Z\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M6.403 6.403a.75.75 0 0 1 1.06 0l18.103 18.102a.75.75 0 0 1-1.06 1.06L6.402 7.465a.75.75 0 0 1 0-1.061Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"code\") {\n <svg\n id=\"code\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n d=\"m7.563 16.277 3.755 2.464c.15.107.256.203.32.299a.609.609 0 0 1 .096.341.66.66 0 0 1-.086.352.304.304 0 0 1-.256.128.524.524 0 0 1-.16-.032c-.053-.032-.138-.074-.245-.149l-4.064-2.71c-.01 0-.032-.01-.053-.031-.31-.203-.47-.427-.47-.662 0-.234.15-.458.46-.661.031-.021.052-.032.063-.043l4.064-2.666c.096-.054.17-.107.235-.128.064-.022.117-.043.17-.043.107 0 .192.043.246.128a.53.53 0 0 1 .096.33.645.645 0 0 1-.096.353.971.971 0 0 1-.32.298l-3.755 2.432ZM14.508 20.235c-.107.245-.214.416-.31.501a.484.484 0 0 1-.341.128.484.484 0 0 1-.352-.15.468.468 0 0 1-.15-.362c0-.043.011-.085.022-.139.01-.053.032-.106.053-.16l4.555-7.669c.117-.256.224-.427.32-.512a.488.488 0 0 1 .33-.139c.15 0 .267.054.374.15.107.096.15.213.15.352 0 .042-.011.085-.022.128a.537.537 0 0 1-.053.138l-4.576 7.734ZM24.875 16.277l-3.744-2.432a1.164 1.164 0 0 1-.33-.298.609.609 0 0 1-.097-.342c0-.138.032-.256.085-.33a.286.286 0 0 1 .246-.128c.053 0 .106.01.17.042.064.022.14.075.235.139l4.064 2.667c.01.01.032.021.064.042.31.192.459.416.459.662 0 .234-.15.458-.448.661a.608.608 0 0 1-.075.043l-4.064 2.709-.021.01c-.182.107-.31.171-.384.171a.286.286 0 0 1-.246-.128c-.064-.085-.085-.202-.085-.352 0-.128.032-.234.096-.341.064-.096.17-.203.33-.299l3.745-2.496Z\"\n />\n </svg>\n }\n\n @if (icon === \"decrease-indent\") {\n <svg\n id=\"decrease-indent\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M9.066 16.533h9.6v-1.067h-9.6v1.067ZM9.066 14.4h9.6v-1.067h-9.6V14.4ZM9.066 12.267h13.867V11.2H9.066v1.067ZM9.066 18.667h9.6V17.6h-9.6v1.067ZM9.066 20.8h13.867v-1.067H9.066V20.8ZM19.733 16l3.2 2.133v-4.266L19.733 16Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"delete\") {\n <svg\n id=\"delete\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M9.067 25.067v-16h13.867v16H9.067ZM10.134 24h11.733V10.133H10.134V24Z\"\n clip-rule=\"evenodd\"\n />\n <path\n d=\"M15.467 12.267h1.067V20.8h-1.067zM12.267 14.4h1.067v6.4h-1.067zM18.667 14.4h1.067v6.4h-1.067zM6.934 9.067h18.133v1.067H6.934zM13.334 6.933v2.134h1.067V8h3.2v1.067h1.066V6.933h-5.333Z\"\n />\n </svg>\n }\n\n @if (icon === \"dot\") {\n <svg\n id=\"dot\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <circle cx=\"16\" cy=\"16\" r=\"4.267\" />\n </svg>\n }\n\n @if (icon === \"edit\") {\n <svg\n id=\"edit\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n d=\"m7.797 24.235 4.64-1.248-3.381-3.382-1.26 4.63ZM9.637 19.04l8.794-8.795 3.387 3.386-8.795 8.795-3.386-3.387ZM22.517 12.907l1.494-1.483a.768.768 0 0 0 0-1.067L21.706 8a.757.757 0 0 0-1.066 0l-1.494 1.483 3.371 3.424Z\"\n />\n </svg>\n }\n\n @if (icon === \"editor\") {\n <svg\n id=\"editor\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"m11.246 16.85 4.258-9.58a.532.532 0 0 1 .713-.29c.133.058.23.165.279.29l4.258 9.58a.533.533 0 0 1-.975.433L18.498 14.4h-4.996l-1.281 2.883a.533.533 0 1 1-.975-.433Zm2.73-3.517h4.048L16 8.78l-2.023 4.553ZM13.679 24a1.004 1.004 0 1 1-2.008 0 1.004 1.004 0 0 1 2.008 0Zm5.521-1.004a1.004 1.004 0 1 0 0 2.008 1.004 1.004 0 0 0 0-2.008ZM14.934 24a1.004 1.004 0 1 1 2.008 0 1.004 1.004 0 0 1-2.008 0Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"exclamation-mark-circle\") {\n <svg\n id=\"exclamation-mark-circle\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M16 25a9 9 0 1 0 0-18 9 9 0 0 0 0 18Zm0 1c5.523 0 10-4.477 10-10S21.523 6 16 6 6 10.477 6 16s4.477 10 10 10Z\"\n clip-rule=\"evenodd\"\n />\n <path\n d=\"M16 18.5c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1Zm0-1.5c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1s1 .45 1 1v4c0 .55-.45 1-1 1Z\"\n />\n </svg>\n }\n\n @if (icon === \"exclamation-mark-circle-fill\") {\n <svg\n id=\"exclamation-mark-circle-fill\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n fill=\"none\"\n >\n <circle cx=\"16\" cy=\"15\" r=\"10\" fill=\"#B83C2E\" />\n <path\n fill=\"#fff\"\n d=\"M16 18.5c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1Zm0-1.5c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1s1 .45 1 1v4c0 .55-.45 1-1 1Z\"\n />\n </svg>\n }\n\n @if (icon === \"exclamation-mark-circle-small\") {\n <svg\n id=\"exclamation-mark-circle-small\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n >\n <path\n d=\"M8 10.5c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1M8 9c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1s1 .45 1 1v4c0 .55-.45 1-1 1\"\n />\n <path d=\"M15 8A7 7 0 1 0 1 8a7 7 0 0 0 14 0m1 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0\" />\n </svg>\n }\n\n @if (icon === \"eye\") {\n <svg\n id=\"eye\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M15.75 10.23c1.451-.01 2.894.21 4.274.654l.14.045.094.114a5.737 5.737 0 1 1-8.87 0l.387.317-.151-.476a13.863 13.863 0 0 1 4.127-.653Zm-3.68 1.562a4.737 4.737 0 1 0 7.505-.001 12.596 12.596 0 0 0-3.817-.56h-.001c-1.25.007-2.492.196-3.686.56Z\"\n clip-rule=\"evenodd\"\n />\n <path d=\"M15.807 12.01a2.667 2.667 0 1 0 2.667 2.667 2.656 2.656 0 0 0-2.667-2.666Z\" />\n <path\n fill-rule=\"evenodd\"\n d=\"M6.307 15.915Zm.143-.235a7.3 7.3 0 0 1 .34-.478 9.683 9.683 0 0 1 1.62-1.638c1.49-1.19 3.854-2.397 7.344-2.397s5.854 1.206 7.344 2.397a9.686 9.686 0 0 1 1.62 1.638c.148.192.26.356.34.478a7.37 7.37 0 0 1-.341.478 9.715 9.715 0 0 1-1.623 1.638c-1.491 1.191-3.856 2.397-7.34 2.397-3.485 0-5.849-1.206-7.34-2.397a9.717 9.717 0 0 1-1.623-1.638 7.327 7.327 0 0 1-.34-.478Zm19.192 0c.442-.234.442-.234.441-.235v-.002l-.003-.005-.008-.014a3.061 3.061 0 0 0-.136-.227 8.103 8.103 0 0 0-.426-.605 10.678 10.678 0 0 0-1.788-1.81c-1.646-1.315-4.226-2.615-7.968-2.615s-6.322 1.3-7.968 2.616a10.678 10.678 0 0 0-1.788 1.809 8.111 8.111 0 0 0-.533.781 3.033 3.033 0 0 0-.029.05l-.008.015-.002.005-.001.002.44.235-.44-.234-.125.235.124.234.442-.235-.442.235.001.001.001.002.003.004.008.015a3.798 3.798 0 0 0 .135.226c.095.15.236.358.428.606.383.496.969 1.153 1.79 1.808 1.647 1.316 4.227 2.616 7.964 2.616s6.316-1.3 7.964-2.616a10.719 10.719 0 0 0 1.79-1.808 8.113 8.113 0 0 0 .535-.782l.028-.05.008-.015.003-.004v-.002s.001-.001-.44-.236Zm0 0 .441.235.125-.234-.125-.236-.441.235Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"eye-blind\") {\n <svg\n id=\"eye-blind\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n d=\"M15.8 11.2c-2.1 0-3.8.4-5.1 1-.9 1.8-.7 4 .4 5.7l.7-.7c-1-1.6-1-3.8.3-5.4 1.2-.4 2.4-.6 3.7-.6 0 .1.1.1.1.1.6 0 1.2 0 1.8.1l.1-.1c-.7-.1-1.4-.1-2-.1ZM20.5 12l-.5.5c1 1.9.6 4.2-1 5.7-.9.9-2.1 1.3-3.2 1.3-.8 0-1.5-.2-2.2-.5l-.7.7c.3.2.6.3.9.4.6.1 1.2.1 1.9.1.8 0 1.5-.1 2.2-.2.7-.3 1.3-.6 1.8-1.2 1.8-1.7 2.3-4.4 1.3-6.6-.1 0-.3-.1-.5-.2Z\"\n />\n <path\n d=\"M15.8 12c-1.5 0-2.7 1.2-2.7 2.7 0 .4.1.7.2 1l3.5-3.5c-.3-.1-.6-.2-1-.2ZM18.4 14.1l-3.2 3.2c.2 0 .4.1.6.1 1.5 0 2.7-1.2 2.7-2.7 0-.2 0-.4-.1-.6Z\"\n />\n <path\n d=\"M15.8 10.2c-3.7 0-6.3 1.3-8 2.6-.8.6-1.4 1.3-1.8 1.8-.2.2-.3.5-.4.6l-.1.2v.1l.4.2-.4.2v.1l.1.2c.1.1.2.4.4.6.4.5 1 1.2 1.8 1.8.5.4 1 .7 1.6 1.1l.7-.7c-.7-.3-1.2-.7-1.7-1.1-.7-.6-1.3-1.2-1.6-1.6-.1-.2-.3-.4-.3-.5.1-.1.2-.3.3-.5.3-.4.9-1 1.6-1.6.6-.5 1.3-1 2.2-1.4 1.3-.6 3-1 5.1-1 .7 0 1.3 0 1.9.1l.9-.9c-.8-.2-1.7-.3-2.7-.3ZM26.1 15.4l-.4.2.4.2.1-.2-.1-.2Zm-4.9-4.1-.7.7c.2.1.4.2.6.2.8.4 1.5.8 2.1 1.3.7.6 1.3 1.2 1.6 1.6.1.2.3.4.3.5-.1.1-.2.3-.3.5-.3.4-.9 1-1.6 1.6-1.2.9-2.8 1.9-5.2 2.2-.7.1-1.4.2-2.2.2-.7 0-1.3 0-1.9-.1-.4-.1-.8-.1-1.2-.2l-.8.8c1.1.3 2.4.5 3.9.5 3.7 0 6.3-1.3 8-2.6.8-.7 1.4-1.3 1.8-1.8.2-.2.3-.5.4-.6v-.2l-.4-.2.4-.2v-.1l-.1-.2c-.1-.1-.2-.4-.4-.6-.4-.5-1-1.2-1.8-1.8-.6-.6-1.5-1.1-2.5-1.5Z\"\n />\n <path d=\"m5.9 15.7-.4-.2-.1.2.1.2.4-.2Z\" />\n </svg>\n }\n\n @if (icon === \"fail\") {\n <svg\n id=\"fail\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M12.11 9.934a1.545 1.545 0 1 0-2.184 2.168l10.06 10.053c.284.289.67.454 1.075.461h.033c.4-.01.783-.171 1.07-.451l.007-.007.007-.007c.586-.6.586-1.557 0-2.157L12.11 9.934Z\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M20.093 9.724a1.553 1.553 0 0 1 2.194 2.17l-.028.035L12.02 22.162c-.289.282-.673.444-1.077.454h-.033a1.553 1.553 0 0 1-1.084-2.637l.006-.006L20.061 9.75l.032-.026Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"hourglass\") {\n <svg\n id=\"hourglass\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"m16.896 16 3.904-2.848V9.6h1.067V8.533H10.134V9.6H11.2v3.552L15.095 16 11.2 18.848V22.4h-1.067v1.067h11.733V22.4H20.8v-3.552L16.896 16Zm-4.628-3.392L16 15.338l3.733-2.73V9.6h-7.466v3.008Zm7.466 9.792v-3.008l-3.733-2.73-3.733 2.73V22.4h7.466Zm-6.4-10.336v-.33h5.333v.33L16 14.016l-2.666-1.952Zm5.333 8.203h-5.333v1.066h5.333v-1.066Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"increase-indent\") {\n <svg\n id=\"increase-indent\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M13.333 16.533h9.6v-1.067h-9.6v1.067ZM13.333 18.667h9.6V17.6h-9.6v1.067ZM9.066 20.8h13.867v-1.067H9.066V20.8ZM13.333 14.4h9.6v-1.067h-9.6V14.4ZM9.066 12.267h13.867V11.2H9.066v1.067ZM9.066 18.133l3.2-2.133-3.2-2.133v4.266Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"info\") {\n <svg\n id=\"info\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <circle cx=\"16\" cy=\"11.5\" r=\"1.5\" />\n <path d=\"M17 20.5v-6h-3v1h1v5h-1v1h4v-1h-1Z\" />\n </svg>\n }\n\n @if (icon === \"info-circle\") {\n <svg\n id=\"info-circle\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M16 25a9 9 0 1 0 0-18 9 9 0 0 0 0 18Zm0 1c5.523 0 10-4.477 10-10S21.523 6 16 6 6 10.477 6 16s4.477 10 10 10Z\"\n clip-rule=\"evenodd\"\n />\n <circle cx=\"16\" cy=\"11.5\" r=\"1.5\" />\n <path d=\"M17 20.5v-6h-3v1h1v5h-1v1h4v-1h-1Z\" />\n </svg>\n }\n\n @if (icon === \"info-circle-fill\") {\n <svg\n id=\"info-circle-fill\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n fill=\"none\"\n >\n <path\n fill=\"#fff\"\n d=\"M26 16c0 5.523-4.477 10-10 10S6 21.523 6 16 10.477 6 16 6s10 4.477 10 10Z\"\n />\n <path\n fill=\"#1076DB\"\n fill-rule=\"evenodd\"\n d=\"M16 25a9 9 0 1 0 0-18 9 9 0 0 0 0 18Zm0 1c5.523 0 10-4.477 10-10S21.523 6 16 6 6 10.477 6 16s4.477 10 10 10Z\"\n clip-rule=\"evenodd\"\n />\n <circle cx=\"16\" cy=\"11.5\" r=\"1.5\" fill=\"#1076DB\" />\n <path fill=\"#1076DB\" d=\"M17 20.5v-6h-3v1h1v5h-1v1h4v-1h-1Z\" />\n </svg>\n }\n\n @if (icon === \"info-circle-small\") {\n <svg\n id=\"info-circle-small\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n >\n <path d=\"M15 8A7 7 0 1 0 1 8a7 7 0 0 0 14 0m1 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0\" />\n <path d=\"M8 6a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3M9 12V7H6v1h1v4H6v1h4v-1z\" />\n </svg>\n }\n\n @if (icon === \"junction\") {\n <svg\n id=\"junction\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n d=\"M19.2 8.565h-8.533L6.4 11.232l4.267 2.667H19.2V8.565ZM22.294 14.965h-8.533V20.3h8.533l4.267-2.667-4.267-2.667ZM16.427 21.365a.528.528 0 0 0-.533.534v3.2c0 .298.234.533.533.533a.528.528 0 0 0 .533-.533v-3.2a.528.528 0 0 0-.533-.534ZM16.427 7.477a.528.528 0 0 0 .533-.533V5.867a.528.528 0 0 0-.533-.534.528.528 0 0 0-.533.534v1.077c0 .299.234.533.533.533Z\"\n />\n </svg>\n }\n\n @if (icon === \"link\") {\n <svg\n id=\"link\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M20.707 11.121a1 1 0 0 0-1.414 0l-.354.354a1 1 0 0 1-1.414-1.414l.354-.354a3 3 0 0 1 4.242 0l.707.707a3 3 0 0 1 0 4.243l-4.242 4.242a2.5 2.5 0 0 1-3.536 0 1 1 0 1 1 1.415-1.414.5.5 0 0 0 .707 0l4.242-4.242a1 1 0 0 0 0-1.415l-.707-.707Z\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M11.868 21.374a1 1 0 0 0 1.414 0l.354-.353a1 1 0 0 1 1.414 1.414l-.354.354a3 3 0 0 1-4.242 0l-.707-.708a3 3 0 0 1 0-4.242l3.889-3.89a3 3 0 0 1 4.242 0l.354.354a1 1 0 1 1-1.414 1.414l-.354-.353a1 1 0 0 0-1.414 0l-3.889 3.89a1 1 0 0 0 0 1.413l.707.707Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"list-add\") {\n <svg\n id=\"list-add\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M12.5 6.5a.5.5 0 0 1 .5.5v2h2.5V7a.5.5 0 0 1 1 0v2H19V7a.5.5 0 0 1 1 0v2h1a1 1 0 0 1 1 1v1a4.978 4.978 0 0 0-3 1h-6.5a.5.5 0 0 0 0 1H18a4.977 4.977 0 0 0-.9 2h-4.6a.5.5 0 0 0 0 1H17a5 5 0 0 0 5 5v1a1 1 0 0 1-1 1H11a1 1 0 0 1-1-1V10a1 1 0 0 1 1-1h1V7a.5.5 0 0 1 .5-.5Zm0 11.5a.5.5 0 0 0 0 1h4a.5.5 0 0 0 0-1h-4Z\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M22 12.5a.5.5 0 0 1 .5.5v2.5H25a.5.5 0 0 1 0 1h-2.5V19a.5.5 0 0 1-1 0v-2.5H19a.5.5 0 0 1 0-1h2.5V13a.5.5 0 0 1 .5-.5Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"list-minus\") {\n <svg\n id=\"list-minus\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M12.5 6.5a.5.5 0 0 1 .5.5v2h2.5V7a.5.5 0 0 1 1 0v2H19V7a.5.5 0 0 1 1 0v2h1a1 1 0 0 1 1 1v1a4.978 4.978 0 0 0-3 1h-6.5a.5.5 0 0 0 0 1H18a4.977 4.977 0 0 0-.9 2h-4.6a.5.5 0 0 0 0 1H17a5 5 0 0 0 5 5v1a1 1 0 0 1-1 1H11a1 1 0 0 1-1-1V10a1 1 0 0 1 1-1h1V7a.5.5 0 0 1 .5-.5Zm0 11.5a.5.5 0 0 0 0 1h4a.5.5 0 0 0 0-1h-4Z\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M18.5 16a.5.5 0 0 1 .5-.5h6a.5.5 0 0 1 0 1h-6a.5.5 0 0 1-.5-.5Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"lock\") {\n <svg\n id=\"lock\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M20.8 13.43h-1.066v-.534a3.733 3.733 0 1 0-7.467 0v.533h-1.066c-.59 0-1.067.478-1.067 1.067v6.933a1.6 1.6 0 0 0 1.6 1.6h8.533a1.6 1.6 0 0 0 1.6-1.6v-6.933c0-.59-.477-1.067-1.067-1.067Zm-7.466-.534a2.667 2.667 0 1 1 5.333 0v.533h-5.333v-.533Zm6.933 9.067a.533.533 0 0 0 .533-.534v-6.933h-9.6v6.933a.544.544 0 0 0 .534.534h8.533Z\"\n clip-rule=\"evenodd\"\n />\n <path\n d=\"M17.6 17.163a1.6 1.6 0 1 0-2.4 1.376v1.557a.8.8 0 1 0 1.6 0v-1.557a1.59 1.59 0 0 0 .8-1.376Z\"\n />\n </svg>\n }\n\n @if (icon === \"lock-open\") {\n <svg\n id=\"lock-open\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M12.267 12.279v-.06 3.344H20.8c.59 0 1.067.477 1.067 1.066v6.934a1.6 1.6 0 0 1-1.6 1.6h-8.533a1.6 1.6 0 0 1-1.6-1.6v-6.934c0-.589.477-1.066 1.066-1.066h1.067v-3.284Zm8 11.817a.533.533 0 0 0 .533-.533v-6.934h-9.6v6.934a.544.544 0 0 0 .534.533h8.533Z\"\n clip-rule=\"evenodd\"\n />\n <path\n d=\"M17.6 19.296a1.6 1.6 0 1 0-2.4 1.376v1.557a.8.8 0 1 0 1.6 0v-1.557a1.59 1.59 0 0 0 .8-1.376Z\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M12.268 16.106V11.66C12.268 9.708 13.976 8 16 8c2.025 0 3.733 1.708 3.733 3.66v.073h-1.067v-.073c0-1.363-1.23-2.593-2.666-2.593s-2.667 1.23-2.667 2.593v4.446h-1.066Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"magic-wand\") {\n <svg\n id=\"magic-wand\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"m14.264 16.686-7.643 7.717a.722.722 0 0 0 0 1.04c.147.148.294.148.588.148s.44 0 .588-.149l7.643-7.717a.722.722 0 0 0 0-1.039c-.294-.296-.882-.296-1.176 0\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M19.703 13.125c.147 0 .441 0 .588-.149l2.94-2.968a.722.722 0 0 0 0-1.039.706.706 0 0 0-1.03 0l-2.939 2.968c-.294.149-.294.594-.147.89.147.15.441.298.588.298M20.29 16.686a.706.706 0 0 0-1.028 0 .722.722 0 0 0 0 1.04l2.94 2.967c.146.149.293.149.587.149s.441 0 .588-.149a.722.722 0 0 0 0-1.039l-3.087-2.968ZM12.5 8.82a.706.706 0 0 0-1.028 0 .722.722 0 0 0 0 1.04l2.94 2.968c.146.148.293.148.587.148s.441 0 .588-.148a.722.722 0 0 0 0-1.039L12.5 8.821ZM17.351 17.577c-.44 0-.735.296-.735.742v4.007c0 .445.294.742.735.742s.735-.297.735-.742v-4.007c0-.445-.44-.742-.735-.742\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M17.351 6.446c-.44 0-.735.297-.735.742v4.007c0 .445.294.742.735.742s.735-.296.735-.742V7.188c0-.445-.44-.742-.735-.742\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M9.854 15.5h3.969c.44 0 .735-.298.735-.743s-.441-.742-.735-.742H9.854c-.44 0-.735.297-.735.742s.294.742.735.742\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M24.847 14.015h-3.969c-.44 0-.734.297-.734.742s.294.742.735.742h3.968c.441 0 .735-.297.735-.742s-.441-.742-.735-.742\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"mail\") {\n <svg\n id=\"mail\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path d=\"M24 10H8l8 7 8-7Z\" />\n <path d=\"m16 18.5-8-7V21a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-9.5l-8 7Z\" />\n </svg>\n }\n\n @if (icon === \"menu\") {\n <svg\n id=\"menu\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n d=\"M28.8 9.067H3.2V5.333h25.6v3.734Zm0 4.8H3.2V17.6h25.6v-3.733Zm0 8.533H3.2v3.733h25.6V22.4Z\"\n />\n </svg>\n }\n\n @if (icon === \"message\") {\n <svg\n id=\"message\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path d=\"M11 25.5V22h3.5L11 25.5Z\" />\n <path\n fill-rule=\"evenodd\"\n d=\"M7 11a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2v-9Zm3 5.75a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1-.75-.75Zm.75-4.75a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5h-10.5Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"minus\") {\n <svg\n id=\"minus\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path d=\"M10 15h12v1H10z\" />\n </svg>\n }\n\n @if (icon === \"minus-ring-fill\") {\n <svg\n id=\"minus-ring-fill\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n fill=\"none\"\n >\n <path fill=\"#fff\" d=\"M29 16c0 7.18-5.82 13-13 13S3 23.18 3 16 8.82 3 16 3s13 5.82 13 13Z\" />\n <path\n fill=\"#1076DB\"\n fill-rule=\"evenodd\"\n d=\"M16 28c6.627 0 12-5.373 12-12S22.627 4 16 4 4 9.373 4 16s5.373 12 12 12Zm0 1c7.18 0 13-5.82 13-13S23.18 3 16 3 3 8.82 3 16s5.82 13 13 13Z\"\n clip-rule=\"evenodd\"\n />\n <path fill=\"#1076DB\" d=\"M10 15h12v1H10z\" />\n </svg>\n }\n\n @if (icon === \"new-tab\") {\n <svg\n id=\"new-tab\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M17.571 8H23.464c.296 0 .536.24.536.536V14.429h-1.071v-4.6l-7.657 7.657-.38.379-.757-.758.38-.379 7.656-7.657h-4.6V8ZM9 10.143h7.5v1.071h-6.429V21.93h10.715V15.5h1.071V23H9V10.143Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"notebook\") {\n <svg\n id=\"notebook\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M13 7a.5.5 0 0 0-1 0v2h-1a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V10a1 1 0 0 0-1-1h-1V7a.5.5 0 0 0-1 0v2h-2.5V7a.5.5 0 0 0-1 0v2H13V7Zm-1 11.5a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 0 1h-4a.5.5 0 0 1-.5-.5Zm.5-3.5a.5.5 0 0 0 0 1h7a.5.5 0 0 0 0-1h-7Zm-.5-2.5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"notification\") {\n <svg\n id=\"notification\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M16 24a8 8 0 1 0 0-16 8 8 0 0 0 0 16Zm0 1a9 9 0 1 0 0-18 9 9 0 0 0 0 18Z\"\n clip-rule=\"evenodd\"\n />\n <g clip-path=\"url(#a)\">\n <circle cx=\"16\" cy=\"11.5\" r=\"1.5\" />\n <path d=\"M17 20.5v-6h-3v1h1v5h-1v1h4v-1h-1Z\" />\n </g>\n <defs>\n <clipPath id=\"a\"><path d=\"M8 8h16v16H8z\" /></clipPath>\n </defs>\n </svg>\n }\n\n @if (icon === \"numbering\") {\n <svg\n id=\"numbering\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n d=\"M8.897 8v4.732H7.812V9.078l-1.015.623-.483-.735L7.91 8h.987ZM7.705 13.902c.34 0 .632.06.875.182.247.121.434.285.56.49.13.205.196.432.196.679 0 .252-.051.492-.154.721-.103.229-.285.492-.546.791-.261.294-.642.667-1.14 1.12h1.938l-.112.847h-3.08v-.784c.574-.565.992-.99 1.253-1.274.261-.29.443-.53.546-.721.107-.191.161-.387.161-.588 0-.191-.056-.34-.168-.448a.582.582 0 0 0-.441-.168.845.845 0 0 0-.448.119 1.61 1.61 0 0 0-.413.371l-.65-.518a2.15 2.15 0 0 1 .699-.602c.275-.145.583-.217.924-.217ZM7.701 19.902c.331 0 .614.054.847.161.238.107.418.252.539.434.126.182.189.385.189.609 0 .285-.082.523-.245.714-.159.191-.385.329-.679.413.317.033.576.147.777.343.2.191.301.464.301.819 0 .266-.07.511-.21.735-.14.22-.348.394-.623.525-.27.13-.595.196-.973.196-.69 0-1.232-.238-1.624-.714l.595-.581c.159.159.313.275.462.35.154.07.322.105.504.105.22 0 .397-.06.532-.182.135-.121.203-.29.203-.504 0-.243-.065-.415-.196-.518-.126-.107-.317-.161-.574-.161h-.392l.119-.763h.273c.21 0 .376-.054.497-.161.121-.107.182-.259.182-.455a.49.49 0 0 0-.168-.399c-.112-.098-.266-.147-.462-.147-.331 0-.64.138-.924.413l-.546-.595a2.24 2.24 0 0 1 1.596-.637Z\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M12.347 10.232a.5.5 0 0 1 .5-.5h12.5a.5.5 0 0 1 0 1h-12.5a.5.5 0 0 1-.5-.5ZM12.347 16.732a.5.5 0 0 1 .5-.5h12.5a.5.5 0 0 1 0 1h-12.5a.5.5 0 0 1-.5-.5ZM12.347 22.732a.5.5 0 0 1 .5-.5h12.5a.5.5 0 0 1 0 1h-12.5a.5.5 0 0 1-.5-.5Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"pdf\") {\n <svg\n id=\"pdf\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M7.69 12.363c1.857 0 2.987.757 2.987 2.346 0 1.696-1.226 2.454-2.89 2.454h-.864v2.57H5.515v-7.37H7.69Zm-.01 3.744c.939 0 1.525-.32 1.525-1.398 0-.928-.565-1.312-1.525-1.312h-.757v2.71h.757Zm5.952-3.744c1.941 0 3.776.597 3.776 3.648 0 2.986-1.824 3.722-3.584 3.722h-2.006v-7.37h1.814Zm-.405 1.056v5.258h.693c1.099 0 2.005-.49 2.005-2.666 0-2.219-.96-2.592-2.048-2.592h-.65Zm9.525-.011h-2.613v2.208h2.272v1.045h-2.272v3.072H18.73v-7.37h4.17l-.149 1.045Z\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M7.5 6A1.5 1.5 0 0 1 9 4.5h15A1.5 1.5 0 0 1 25.5 6v16.207L20.707 27H9a1.5 1.5 0 0 1-1.5-1.5V21h1v4.5a.5.5 0 0 0 .5.5h11v-3a1.5 1.5 0 0 1 1.5-1.5h3V6a.5.5 0 0 0-.5-.5H9a.5.5 0 0 0-.5.5v5h-1V6Zm16.293 16.5H21.5a.5.5 0 0 0-.5.5v2.293l2.793-2.793Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"paperclip\") {\n <svg\n id=\"paperclip\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n d=\"M11 8.594a3.594 3.594 0 1 1 7.188 0V21.53a2.156 2.156 0 0 1-4.313 0V11.47a.719.719 0 1 1 1.438 0V21.53a.719.719 0 1 0 1.437 0V8.594a2.157 2.157 0 0 0-4.312 0V21.53a3.593 3.593 0 1 0 7.187 0V11.47a.719.719 0 1 1 1.438 0V21.53a5.032 5.032 0 0 1-10.063 0z\"\n />\n </svg>\n }\n\n @if (icon === \"people\") {\n <svg\n id=\"people\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"34\"\n height=\"33\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M25 17.197a6 6 0 1 0-6.367-10.164A6 6 0 0 1 21 18.197V19h2a4 4 0 0 1 4 4v1h4v-2a4 4 0 0 0-4-4h-2v-.803ZM14.353 19H15v-.465c-.231.134-.448.29-.646.465Z\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M22 14c0 2.22-1.207 4.16-3 5.197V20h2a4 4 0 0 1 4 4v2H7v-2a4 4 0 0 1 4-4h2v-.803A6 6 0 1 1 22 14Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"person\") {\n <svg\n id=\"person\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M22 13c0 2.22-1.207 4.16-3 5.197V19h2a4 4 0 0 1 4 4v2H7v-2a4 4 0 0 1 4-4h2v-.803A6 6 0 1 1 22 13Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"person-small\") {\n <svg\n id=\"person-small\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M13 6a4.993 4.993 0 0 1-2 4v1h1a4 4 0 0 1 4 4v1H0v-1a4 4 0 0 1 4-4h1v-1a5 5 0 1 1 8-4Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"picker\") {\n <svg\n id=\"picker\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M16.794 14.851a3.396 3.396 0 0 1 3.392-3.392 3.395 3.395 0 0 1 3.393 3.392 3.396 3.396 0 0 1-3.393 3.392 3.396 3.396 0 0 1-3.392-3.392m10.408 6.512-3.01-3.122a5.22 5.22 0 0 0 1.247-3.39A5.258 5.258 0 0 0 20.186 9.6a5.257 5.257 0 0 0-5.252 5.251 5.258 5.258 0 0 0 5.252 5.25c.932 0 1.807-.246 2.565-.673l3.093 3.208c.361.372.96.383 1.334.023a.915.915 0 0 0 .024-1.296\"\n clip-rule=\"evenodd\"\n />\n <path\n d=\"M3.2 17.067h8.533V16H3.2v1.067ZM3.2 12.8h9.6v-1.067H3.2V12.8ZM3.2 8.533h10.667V7.467H3.2v1.066ZM3.2 21.333h9.6v-1.066H3.2v1.066ZM3.2 25.6h8.533v-1.067H3.2V25.6Z\"\n />\n </svg>\n }\n\n @if (icon === \"pin-small\") {\n <svg\n id=\"pin-small\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n >\n <path\n d=\"M8.34 4C6.5 4 5 5.52 5 7.39c0 .6.16 1.23.43 1.67l.02.04c.07.12.38.52.8 1 .86.99 2.11 2.33 2.11 2.33s1.24-1.36 2.09-2.34c.4-.47.7-.86.77-.97l.04-.07c.28-.44.43-1.07.43-1.67 0-1.86-1.5-3.38-3.35-3.38Zm0 5.24c-1.04 0-1.89-.85-1.89-1.89s.85-1.9 1.89-1.9 1.9.85 1.9 1.89-.85 1.9-1.9 1.9Z\"\n />\n </svg>\n }\n\n @if (icon === \"place\") {\n <svg\n id=\"place\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M21.867 8.533c0 .295-.219.534-.489.534H10.623c-.27 0-.49-.24-.49-.534 0-.294.22-.533.49-.533h10.755c.27 0 .49.239.49.533M15.623 11.89l-5.333 5.333a.534.534 0 0 0 .754.754l4.423-4.422v9.912a.533.533 0 1 0 1.067 0v-9.912l4.422 4.422a.534.534 0 0 0 .755-.754l-5.334-5.333a.534.534 0 0 0-.754 0\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"place-ring-fill\") {\n <svg\n id=\"place-ring-fill\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n fill=\"none\"\n >\n <path fill=\"#fff\" d=\"M29 16c0 7.18-5.82 13-13 13S3 23.18 3 16 8.82 3 16 3s13 5.82 13 13Z\" />\n <path\n fill=\"#1076DB\"\n fill-rule=\"evenodd\"\n d=\"M16 28c6.627 0 12-5.373 12-12S22.627 4 16 4 4 9.373 4 16s5.373 12 12 12Zm0 1c7.18 0 13-5.82 13-13S23.18 3 16 3 3 8.82 3 16s5.82 13 13 13Z\"\n clip-rule=\"evenodd\"\n />\n <path\n fill=\"#1076DB\"\n fill-rule=\"evenodd\"\n d=\"M23.467 21.733c-.294 0-.533-.219-.533-.489V10.49c0-.27.238-.489.533-.489.294 0 .533.219.533.489v10.755c0 .27-.239.49-.533.49ZM20.11 15.49l-5.333-5.334a.534.534 0 0 0-.754.754l4.422 4.424H8.532a.533.533 0 1 0 0 1.066h9.913l-4.422 4.423a.534.534 0 0 0 .754.754l5.333-5.334a.534.534 0 0 0 0-.754Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"plus\") {\n <svg\n id=\"plus\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path d=\"M16 9h1v13h-1z\" />\n <path d=\"M10 15h13v1H10z\" />\n </svg>\n }\n\n @if (icon === \"print\") {\n <svg\n id=\"print\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <mask\n id=\"a\"\n width=\"20\"\n height=\"20\"\n x=\"6\"\n y=\"6\"\n maskUnits=\"userSpaceOnUse\"\n style=\"mask-type: luminance\"\n >\n <path fill-rule=\"evenodd\" d=\"M6.4 6.933h19.2v18.134H6.4V6.933Z\" clip-rule=\"evenodd\" />\n </mask>\n <path\n fill-rule=\"evenodd\"\n d=\"m21.654 24-11.414.107v-6.4c0-.214.107-.32.214-.32H21.44c.107 0 .214.106.214.32V24ZM10.24 8h11.414v1.813H10.24V8Zm12.587 16.107V22.08c.107 0 .213.107.32.107h1.173c.747 0 1.28-.64 1.28-1.387v-8.32c0-1.387-1.066-2.56-2.346-2.56h-.427V7.893c0-.533-.533-.96-1.067-.96H10.24c-.64 0-1.066.427-1.066.96V9.92h-.427c-1.28 0-2.347 1.173-2.347 2.56v8.213c0 .747.64 1.387 1.28 1.387h1.387v2.027c0 .533.533.96 1.067.96h11.413c.747 0 1.28-.427 1.28-.96Z\"\n clip-rule=\"evenodd\"\n />\n <path d=\"M11.84 20.053h8.32v-1.066h-8.32v1.066ZM11.84 22.827h8.32V21.76h-8.32v1.067Z\" />\n </svg>\n }\n\n @if (icon === \"question-mark\") {\n <svg\n id=\"question-mark\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n d=\"M15.992 7c.96 0 1.784.176 2.472.528.704.336 1.232.792 1.584 1.368.352.576.528 1.192.528 1.848 0 .624-.112 1.16-.336 1.608a3.336 3.336 0 0 1-.768 1.056c-.304.272-.712.592-1.224.96-.672.464-1.176.896-1.512 1.296-.336.384-.504.904-.504 1.56v1.08h-2.184v-1.2c0-.688.112-1.272.336-1.752.24-.48.52-.864.84-1.152.32-.288.744-.616 1.272-.984.608-.4 1.056-.76 1.344-1.08.288-.32.432-.736.432-1.248 0-.656-.216-1.16-.648-1.512-.432-.368-1.024-.552-1.776-.552-1.28 0-2.392.576-3.336 1.728L11 9.376C12.344 7.792 14.008 7 15.992 7ZM15.2 20.776c.48 0 .88.16 1.2.48.32.32.48.712.48 1.176 0 .464-.16.864-.48 1.2-.32.32-.72.48-1.2.48a1.6 1.6 0 0 1-1.176-.48 1.68 1.68 0 0 1-.48-1.2c0-.464.16-.856.48-1.176a1.6 1.6 0 0 1 1.176-.48Z\"\n />\n </svg>\n }\n\n @if (icon === \"question-mark-small\") {\n <svg\n id=\"question-mark-small\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n >\n <path\n d=\"M8.094 3c.616 0 1.139.103 1.568.308.439.205.77.48.994.826.224.345.336.723.336 1.134 0 .373-.065.695-.196.966-.13.261-.29.476-.476.644-.187.168-.43.355-.728.56-.383.252-.667.485-.854.7-.187.215-.28.5-.28.854v.476H6.792v-.546c0-.42.065-.775.196-1.064.14-.299.303-.532.49-.7.187-.177.43-.369.728-.574.317-.215.546-.401.686-.56a.862.862 0 0 0 .224-.616c0-.308-.107-.546-.322-.714-.205-.177-.49-.266-.854-.266-.663 0-1.255.308-1.778.924L5 4.442C5.812 3.481 6.843 3 8.094 3Zm-.448 7.826c.317 0 .588.112.812.336.224.215.336.48.336.798 0 .308-.112.574-.336.798a1.106 1.106 0 0 1-.812.336 1.09 1.09 0 0 1-.798-.336 1.114 1.114 0 0 1-.322-.798c0-.317.107-.583.322-.798a1.06 1.06 0 0 1 .798-.336Z\"\n />\n </svg>\n }\n\n @if (icon === \"required\") {\n <svg\n id=\"required\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M15.745 9a.75.75 0 0 1 .75.75v4.676l3.87-2.32a.75.75 0 0 1 .77 1.287l-3.931 2.357 3.932 2.357a.75.75 0 1 1-.771 1.286l-3.87-2.319v4.676a.75.75 0 0 1-1.5 0v-4.675l-3.859 2.318a.75.75 0 0 1-.772-1.286l3.925-2.357-3.925-2.357a.75.75 0 0 1 .772-1.286l3.86 2.318V9.75a.75.75 0 0 1 .75-.75Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"ring-close\") {\n <svg\n id=\"ring-close\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M16 28c6.627 0 12-5.373 12-12S22.627 4 16 4 4 9.373 4 16s5.373 12 12 12Zm0 1c7.18 0 13-5.82 13-13S23.18 3 16 3 3 8.82 3 16s5.82 13 13 13Z\"\n clip-rule=\"evenodd\"\n />\n <path\n d=\"M20.255 20.932a.672.672 0 0 1-.47-.202l-8.533-8.534a.672.672 0 1 1 .95-.938l8.533 8.533a.672.672 0 0 1 0 .939.715.715 0 0 1-.48.202Z\"\n />\n <path\n d=\"M11.721 20.932a.714.714 0 0 0 .48-.202l8.533-8.534a.672.672 0 0 0-.949-.938l-8.533 8.533a.672.672 0 0 0 .469 1.141Z\"\n />\n </svg>\n }\n\n @if (icon === \"ring-close-fill\") {\n <svg\n id=\"ring-close-fill\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n fill=\"none\"\n >\n <path\n fill=\"#fff\"\n d=\"M29 16C29 23.1797 23.1797 29 16 29C8.8203 29 3 23.1797 3 16C3 8.8203 8.8203 3 16 3C23.1797 3 29 8.8203 29 16Z\"\n />\n <path\n fill=\"#1076DB\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M16 28C22.6274 28 28 22.6274 28 16C28 9.37258 22.6274 4 16 4C9.37258 4 4 9.37258 4 16C4 22.6274 9.37258 28 16 28ZM16 29C23.1797 29 29 23.1797 29 16C29 8.8203 23.1797 3 16 3C8.8203 3 3 8.8203 3 16C3 23.1797 8.8203 29 16 29Z\"\n />\n <path\n fill=\"#1076DB\"\n d=\"M20.2545 20.9324C20.0775 20.9294 19.9088 20.8565 19.7852 20.7298L11.2518 12.1964C11.05 12.0347 10.9589 11.7714 11.0176 11.5195C11.0763 11.2676 11.2744 11.0717 11.5269 11.0159C11.7795 10.96 12.0417 11.0541 12.2012 11.2578L20.7345 19.7911C20.9892 20.0522 20.9892 20.4687 20.7345 20.7298C20.6057 20.8553 20.4343 20.9277 20.2545 20.9324Z\"\n />\n <path\n fill=\"#1076DB\"\n d=\"M11.721 20.9324C11.9008 20.9277 12.0723 20.8553 12.201 20.7298L20.7344 12.1964C20.9447 11.9278 20.9203 11.5442 20.6777 11.3044C20.4351 11.0645 20.0513 11.0445 19.785 11.2578L11.2517 19.7911C11.0643 19.9831 11.009 20.268 11.1111 20.5161C11.2131 20.7642 11.4528 20.9279 11.721 20.9324V20.9324Z\"\n />\n </svg>\n }\n\n @if (icon === \"ring-plus-fill\") {\n <svg\n id=\"ring-plus-fill\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n fill=\"none\"\n >\n <path fill=\"#fff\" d=\"M29 16c0 7.18-5.82 13-13 13S3 23.18 3 16 8.82 3 16 3s13 5.82 13 13Z\" />\n <path\n fill=\"#1076DB\"\n fill-rule=\"evenodd\"\n d=\"M16 28c6.627 0 12-5.373 12-12S22.627 4 16 4 4 9.373 4 16s5.373 12 12 12Zm0 1c7.18 0 13-5.82 13-13S23.18 3 16 3 3 8.82 3 16s5.82 13 13 13Z\"\n clip-rule=\"evenodd\"\n />\n <path fill=\"#1076DB\" d=\"M16 9h1v13h-1z\" />\n <path fill=\"#1076DB\" d=\"M10 15h13v1H10z\" />\n </svg>\n }\n\n @if (icon === \"ring-plus\") {\n <svg\n id=\"ring-plus\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M16 28c6.627 0 12-5.373 12-12S22.627 4 16 4 4 9.373 4 16s5.373 12 12 12Zm0 1c7.18 0 13-5.82 13-13S23.18 3 16 3 3 8.82 3 16s5.82 13 13 13Z\"\n clip-rule=\"evenodd\"\n />\n <path d=\"M16 9h1v13h-1z\" />\n <path d=\"M10 15h13v1H10z\" />\n </svg>\n }\n\n @if (icon === \"rosette\") {\n <svg\n id=\"rosette\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M16.439 20.144a5.925 5.925 0 0 1-5.92-5.919 5.925 5.925 0 0 1 5.92-5.919 5.926 5.926 0 0 1 5.92 5.92 5.926 5.926 0 0 1-5.92 5.918Zm9.385-5.862a.754.754 0 0 0 .532-.305.655.655 0 0 0 .112-.53l-.61-2.758a.656.656 0 0 0-.327-.432.746.746 0 0 0-.61-.05l-2.295.786c-.158-.3-.339-.586-.537-.86l1.73-1.705a.755.755 0 0 0 .227-.572.655.655 0 0 0-.242-.483L21.61 5.596a.65.65 0 0 0-.524-.136.753.753 0 0 0-.51.34L19.27 7.845a6.993 6.993 0 0 0-1.017-.357l.273-2.41a.756.756 0 0 0-.182-.586.654.654 0 0 0-.493-.224h-2.824a.654.654 0 0 0-.492.224.752.752 0 0 0-.183.585l.273 2.411c-.349.094-.687.21-1.01.354l-1.304-2.04a.751.751 0 0 0-.512-.34.65.65 0 0 0-.523.135L9.082 7.373a.655.655 0 0 0-.242.483c-.011.211.071.42.226.572l1.727 1.7c-.199.274-.381.561-.541.863l-2.287-.785a.748.748 0 0 0-.611.051.657.657 0 0 0-.327.432l-.61 2.759a.65.65 0 0 0 .112.529c.123.17.318.281.533.305l2.407.255c.013.28.04.554.085.824l-2.304.748a.747.747 0 0 0-.457.41.65.65 0 0 0 0 .54l1.169 2.571c.077.17.227.299.41.356a.754.754 0 0 0 .606-.078l2.074-1.24c.234.283.493.54.767.784l-3.375 5.905 3.83-.958.996 2.987 3.047-5.338 3.046 5.338.998-2.987 3.83.958-3.293-5.76c.338-.28.65-.592.93-.931l2.078 1.241a.752.752 0 0 0 .607.08.666.666 0 0 0 .41-.357l1.17-2.572a.65.65 0 0 0 0-.538.75.75 0 0 0-.459-.411l-2.309-.75a7.17 7.17 0 0 0 .084-.821l2.415-.256Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"rule\") {\n <svg\n id=\"rule\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M15.467 8.533v7.574a2.666 2.666 0 0 0 0 5.226v2.134h1.067V21.28a2.666 2.666 0 0 0 0-5.227v-7.52h-1.067Zm-4.265 14.934v-6.454a2.666 2.666 0 0 0 0-5.226V9.6h-1.067v2.24a2.666 2.666 0 0 0 0 5.227v6.4h1.067ZM9.069 14.4a1.6 1.6 0 1 1 3.2 0 1.6 1.6 0 0 1-3.2 0Zm12.263-1.6a1.6 1.6 0 1 0 0 3.2 1.6 1.6 0 0 0 0-3.2Zm-.534 10.667h1.067v-6.454a2.666 2.666 0 0 0 0-5.226V9.6h-1.067v2.24a2.666 2.666 0 0 0 0 5.227v6.4ZM16 20.267a1.6 1.6 0 1 0 0-3.2 1.6 1.6 0 0 0 0 3.2Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"search\") {\n <svg\n id=\"search\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"m19.114 18.485 3.083 3.2a.917.917 0 0 1 0 1.227.981.981 0 0 1-1.366 0l-3.2-3.2a5.472 5.472 0 0 1-2.634.683 5.397 5.397 0 1 1 5.397-5.333 5.227 5.227 0 0 1-1.28 3.423Zm-5.473-6.65a3.488 3.488 0 0 0-2.11 3.27 3.467 3.467 0 0 0 3.476 3.423 3.488 3.488 0 1 0-1.366-6.693Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"seats\") {\n <svg\n id=\"seats\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M9.602 8.001c-.882 0-1.6.717-1.6 1.599s.718 1.6 1.599 1.6c.882 0 1.601-.717 1.601-1.599s-.718-1.6-1.6-1.6m0 4.267A2.67 2.67 0 0 1 6.935 9.6a2.67 2.67 0 0 1 2.666-2.667 2.67 2.67 0 0 1 2.667 2.668A2.67 2.67 0 0 1 9.6 12.268M16.002 8.002c-.882 0-1.6.717-1.6 1.6a1.6 1.6 0 0 0 1.6 1.599c.427 0 .83-.166 1.132-.468a1.602 1.602 0 0 0-1.132-2.73m0 4.266a2.67 2.67 0 0 1-2.666-2.667 2.67 2.67 0 0 1 2.667-2.668 2.671 2.671 0 0 1 2.666 2.668 2.65 2.65 0 0 1-.78 1.886 2.65 2.65 0 0 1-1.886.78M9.601 14.401a1.601 1.601 0 0 0-.001 3.2c.882 0 1.601-.718 1.601-1.6 0-.882-.718-1.6-1.6-1.6m0 4.267A2.671 2.671 0 0 1 6.934 16 2.67 2.67 0 0 1 9.6 13.333a2.67 2.67 0 0 1 2.667 2.668A2.67 2.67 0 0 1 9.6 18.668M18.135 16.002A2.134 2.134 0 1 1 13.866 16a2.134 2.134 0 0 1 4.269.002\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M16.001 14.402a1.601 1.601 0 0 0 0 3.2c.881 0 1.6-.718 1.6-1.6 0-.882-.717-1.6-1.6-1.6m0 4.267A2.671 2.671 0 0 1 13.335 16a2.67 2.67 0 0 1 2.667-2.667 2.67 2.67 0 0 1 2.666 2.668 2.67 2.67 0 0 1-2.667 2.667\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M22.402 8.003c-.882 0-1.6.717-1.6 1.6a1.6 1.6 0 0 0 1.599 1.599c.427 0 .83-.166 1.133-.468a1.602 1.602 0 0 0-1.132-2.73m0 4.266h-.001a2.67 2.67 0 0 1-2.666-2.667 2.67 2.67 0 0 1 2.667-2.668 2.671 2.671 0 0 1 2.667 2.668c0 .713-.278 1.383-.781 1.887a2.657 2.657 0 0 1-1.886.78\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M24.534 16.003a2.134 2.134 0 1 1-4.268-.002 2.134 2.134 0 0 1 4.268.002\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M22.4 14.403a1.601 1.601 0 0 0 0 3.2c.882 0 1.6-.718 1.6-1.6 0-.882-.717-1.6-1.6-1.6m0 4.267a2.671 2.671 0 0 1-2.666-2.668 2.669 2.669 0 0 1 2.667-2.667 2.671 2.671 0 0 1 2.667 2.668A2.67 2.67 0 0 1 22.4 18.67M11.733 22.401a2.133 2.133 0 1 1-4.267 0 2.133 2.133 0 0 1 4.268 0\"\n clip-rule=\"evenodd\"\n />\n <mask\n id=\"b\"\n width=\"7\"\n height=\"7\"\n x=\"6\"\n y=\"19\"\n maskUnits=\"userSpaceOnUse\"\n style=\"mask-type: luminance\"\n >\n <path fill-rule=\"evenodd\" d=\"M6.934 19.734h5.333v5.334H6.934v-5.334Z\" clip-rule=\"evenodd\" />\n </mask>\n <g mask=\"url(#b)\">\n <path\n fill-rule=\"evenodd\"\n d=\"M9.599 20.8A1.595 1.595 0 0 0 8 22.4c0 .882.717 1.6 1.599 1.6s1.6-.717 1.601-1.6c0-.881-.718-1.6-1.6-1.6h-.001Zm0 4.268a2.668 2.668 0 0 1-1.885-4.554 2.65 2.65 0 0 1 1.884-.78H9.6a2.669 2.669 0 0 1 2.667 2.667 2.671 2.671 0 0 1-2.668 2.667Z\"\n clip-rule=\"evenodd\"\n />\n </g>\n <path\n fill-rule=\"evenodd\"\n d=\"M18.134 22.402a2.133 2.133 0 1 1-4.267 0 2.133 2.133 0 0 1 4.267 0\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M16 20.802a1.595 1.595 0 0 0-1.6 1.599c0 .882.717 1.6 1.6 1.601.881 0 1.6-.718 1.6-1.6 0-.882-.718-1.6-1.6-1.6Zm0 4.267a2.668 2.668 0 0 1-1.885-4.554 2.65 2.65 0 0 1 1.883-.78h.003a2.669 2.669 0 0 1 2.666 2.667A2.671 2.671 0 0 1 16 25.069ZM24.533 22.403a2.133 2.133 0 1 1-4.267 0 2.133 2.133 0 0 1 4.267 0\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M22.399 20.803a1.595 1.595 0 0 0-1.6 1.599c0 .882.718 1.6 1.6 1.601.882 0 1.6-.718 1.6-1.6 0-.882-.717-1.6-1.6-1.6Zm0 4.267a2.668 2.668 0 0 1-1.885-4.554 2.65 2.65 0 0 1 1.884-.78h.002a2.669 2.669 0 0 1 2.667 2.667 2.671 2.671 0 0 1-2.668 2.667Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"settings\") {\n <svg\n id=\"settings\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M23.819 16.768v-1.344a1.067 1.067 0 0 0-.864-1.067l-1.259-.181a6.1 6.1 0 0 0-.352-.864l.758-1.013c.32-.425.28-1.021-.096-1.398l-.95-.949a1.067 1.067 0 0 0-1.397-.107l-1.067.768a5.509 5.509 0 0 0-.853-.352l-.181-1.258a1.067 1.067 0 0 0-1.067-.918h-1.344a1.067 1.067 0 0 0-1.067.918L13.9 10.26c-.294.094-.58.211-.853.352l-1.067-.768a1.067 1.067 0 0 0-1.397.107l-.95.95a1.067 1.067 0 0 0-.096 1.397l.758 1.013c-.14.279-.257.567-.352.864l-1.259.181c-.53.075-.923.532-.917 1.067v1.344c-.006.535.387.992.917 1.067l1.259.181c.095.293.213.578.352.853l-.758 1.067a1.067 1.067 0 0 0 .096 1.387l.95.96c.376.376.973.417 1.397.096l1.067-.768c.271.149.557.27.853.362l.181 1.259c.075.53.532.923 1.067.917h1.29c.536.006.992-.387 1.067-.917l.182-1.259c.296-.092.581-.213.853-.362l1.067.768c.424.32 1.02.28 1.397-.096l.95-.96c.37-.375.41-.965.095-1.387l-.757-1.067c.14-.275.257-.56.352-.853l1.259-.181c.53-.075.922-.532.917-1.067Zm-7.2 4.181-.267 1.867h-.981l-.267-1.867-.757-.245a5.093 5.093 0 0 1-.672-.288l-.715-.352-1.504 1.13-.693-.693 1.13-1.514-.362-.704a5.236 5.236 0 0 1-.277-.672l-.246-.758-1.866-.266v-.982l1.866-.266.246-.758c.074-.23.167-.456.277-.672l.363-.714-1.131-1.504.693-.694 1.504 1.131.715-.363c.215-.113.44-.206.672-.277l.757-.245.267-1.867h.981l.267 1.867.757.245c.233.07.458.162.672.277l.715.363 1.504-1.13.693.693-1.13 1.504.362.714c.11.216.204.441.278.672l.245.758 1.867.266v.982l-1.867.266-.245.758a5.25 5.25 0 0 1-.278.672l-.362.704 1.13 1.514-.693.694-1.504-1.131-.715.352c-.216.114-.44.21-.672.288l-.757.245Z\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M13.152 16.096a2.667 2.667 0 1 1 5.334 0 2.667 2.667 0 0 1-5.334 0Zm4 0a1.333 1.333 0 1 0-2.667 0 1.333 1.333 0 0 0 2.667 0Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"shopping-cart\") {\n <svg\n id=\"shopping-cart\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n d=\"M22.524 9.674a1 1 0 0 1 .868 1.117L22.216 20.2H9.784l-1.027-8.194a.387.387 0 0 0-.384-.34h-3.04a1 1 0 1 1 0-2h3.04a2.387 2.387 0 0 1 2.368 2.093l.808 6.441h8.901l.957-7.657a1 1 0 0 1 1.117-.869ZM11.733 25.6a2.133 2.133 0 1 0 0-4.267 2.133 2.133 0 0 0 0 4.267ZM20.267 25.6a2.133 2.133 0 1 0 0-4.267 2.133 2.133 0 0 0 0 4.267Z\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M22.4 12.233H9.6v-1h12.8v1ZM21.334 15.967H10.667v-1h10.667v1Z\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M13.366 18.667v-6.934h1v6.934h-1ZM17.634 18.667v-6.934h1v6.934h-1Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"sorter\") {\n <svg\n id=\"sorter\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M16.146 10.646a.5.5 0 0 1 .708 0l4.5 4.5a.5.5 0 0 1-.708.708L17 12.207V20.5a.5.5 0 0 1-1 0v-8.293l-3.646 3.647a.5.5 0 0 1-.708-.708l4.5-4.5Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"star\") {\n <svg\n id=\"star\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"m16.811 8.83 2.121 4.298 4.745.69a.533.533 0 0 1 .294.91l-3.432 3.345.81 4.724a.533.533 0 0 1-.773.562l-4.242-2.23-4.244 2.23a.532.532 0 0 1-.772-.562l.809-4.724-3.43-3.346a.533.533 0 0 1 .294-.91l4.743-.689 2.122-4.297a.532.532 0 0 1 .955 0\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"switch\") {\n <svg\n id=\"switch\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n d=\"M17.597 14.933a.528.528 0 0 0-.533.534v2.666h-6.71l2.294-2.293a.528.528 0 0 0 0-.757.528.528 0 0 0-.758 0l-3.2 3.2a.481.481 0 0 0-.117.181.533.533 0 0 0 0 .405.38.38 0 0 0 .118.171l3.2 3.2a.5.5 0 0 0 .373.16.5.5 0 0 0 .373-.16.528.528 0 0 0 0-.757L10.354 19.2h7.243a.528.528 0 0 0 .534-.533v-3.2a.528.528 0 0 0-.534-.534Z\"\n />\n <path\n d=\"M24.488 12.47a.534.534 0 0 0 0-.406.488.488 0 0 0-.117-.17l-3.2-3.2a.528.528 0 0 0-.758 0 .528.528 0 0 0 0 .757l2.294 2.282h-7.243a.528.528 0 0 0-.533.534v3.2c0 .298.234.533.533.533a.528.528 0 0 0 .533-.533V12.8h6.71l-2.294 2.293a.528.528 0 0 0 0 .758c.107.096.246.149.384.149a.5.5 0 0 0 .374-.16l3.2-3.2a.38.38 0 0 0 .117-.17Z\"\n />\n </svg>\n }\n\n @if (icon === \"three-dots\") {\n <svg\n id=\"three-dots\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M8.96 16a3.2 3.2 0 1 1-6.4 0 3.2 3.2 0 0 1 6.4 0ZM16 12.8a3.2 3.2 0 1 0 0 6.4 3.2 3.2 0 0 0 0-6.4Zm7.04 3.2a3.2 3.2 0 1 1 6.4 0 3.2 3.2 0 0 1-6.4 0Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n\n @if (icon === \"three-dots-small\") {\n <svg\n id=\"three-dots-small\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n >\n <path\n d=\"M5 8.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0ZM13.5 7a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3ZM8.5 7a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Z\"\n />\n </svg>\n }\n\n @if (icon === \"waiting-approval\") {\n <svg\n id=\"waiting-approval\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <g fill-rule=\"evenodd\" clip-path=\"url(#a)\" clip-rule=\"evenodd\">\n <path\n d=\"m10.896 16 3.904-2.848V9.6h1.067V8.533H4.134V9.6H5.2v3.552L9.094 16 5.2 18.848V22.4H4.134v1.067h11.733V22.4H14.8v-3.552L10.896 16Zm-4.628-3.392L10 15.338l3.733-2.73V9.6H6.268v3.008Zm7.466 9.792v-3.008l-3.733-2.73-3.733 2.73V22.4h7.466Zm-6.4-10.336v-.33h5.333v.33l-2.666 1.952-2.667-1.952Zm5.333 8.203H7.334v1.066h5.333v-1.066ZM26.573 11.18a1 1 0 0 1 .247 1.393l-5.713 8.181a1 1 0 0 1-1.564.095l-3.287-3.665a1 1 0 0 1 1.488-1.335l2.445 2.726 4.991-7.147a1 1 0 0 1 1.393-.248Z\"\n />\n </g>\n <defs>\n <clipPath id=\"a\"><path d=\"M0 0h32v32H0z\" /></clipPath>\n </defs>\n </svg>\n }\n\n @if (icon === \"waiting-decline\") {\n <svg\n id=\"waiting-decline\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <g fill-rule=\"evenodd\" clip-path=\"url(#a)\" clip-rule=\"evenodd\">\n <path\n d=\"m10.896 16 3.904-2.848V9.6h1.067V8.533H4.134V9.6H5.2v3.552L9.094 16 5.2 18.848V22.4H4.134v1.067h11.733V22.4H14.8v-3.552L10.896 16Zm-4.628-3.392L10 15.338l3.733-2.73V9.6H6.268v3.008Zm7.466 9.792v-3.008l-3.733-2.73-3.733 2.73V22.4h7.466Zm-6.4-10.336v-.33h5.333v.33l-2.666 1.952-2.667-1.952Zm5.333 8.203H7.334v1.066h5.333v-1.066ZM17.293 11.293a1 1 0 0 1 1.414 0l3.793 3.793 3.793-3.793a1 1 0 0 1 1.414 1.414L23.914 16.5l3.793 3.793a1 1 0 0 1-1.414 1.414L22.5 17.914l-3.793 3.793a1 1 0 0 1-1.414-1.414l3.793-3.793-3.793-3.793a1 1 0 0 1 0-1.414Z\"\n />\n </g>\n <defs>\n <clipPath id=\"a\"><path d=\"M0 0h32v32H0z\" /></clipPath>\n </defs>\n </svg>\n }\n\n @if (icon === \"zoom-in\") {\n <svg\n id=\"zoom-in\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <g clip-path=\"url(#a)\">\n <path\n fill-rule=\"evenodd\"\n d=\"M15.5 23a8.5 8.5 0 1 0 0-17 8.5 8.5 0 0 0 0 17Zm0 2C21.299 25 26 20.299 26 14.5S21.299 4 15.5 4 5 8.701 5 14.5 9.701 25 15.5 25Z\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M21.293 21.293a1 1 0 0 1 1.414 0l5 5a1 1 0 0 1-1.414 1.414l-5-5a1 1 0 0 1 0-1.414Z\"\n clip-rule=\"evenodd\"\n />\n <path d=\"M15 8h1v13h-1z\" />\n <path d=\"M9 14h13v1H9z\" />\n </g>\n <defs>\n <clipPath id=\"a\"><path d=\"M0 0h32v32H0z\" /></clipPath>\n </defs>\n </svg>\n }\n\n @if (icon === \"zoom-out\") {\n <svg\n id=\"zoom-out\"\n [class]=\"_classList | async\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n >\n <g clip-path=\"url(#a)\">\n <path\n fill-rule=\"evenodd\"\n d=\"M15.5 23a8.5 8.5 0 1 0 0-17 8.5 8.5 0 0 0 0 17Zm0 2C21.299 25 26 20.299 26 14.5S21.299 4 15.5 4 5 8.701 5 14.5 9.701 25 15.5 25Z\"\n clip-rule=\"evenodd\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M21.293 21.293a1 1 0 0 1 1.414 0l5 5a1 1 0 0 1-1.414 1.414l-5-5a1 1 0 0 1 0-1.414Z\"\n clip-rule=\"evenodd\"\n />\n <path d=\"M9 14h12v1H9z\" />\n </g>\n <defs>\n <clipPath id=\"a\"><path d=\"M0 0h32v32H0z\" /></clipPath>\n </defs>\n </svg>\n }\n</ng-container>\n","import { Injectable } from '@angular/core';\nimport {\n FudisIdComponent,\n FudisIdData,\n FudisIdDlFamily,\n FudisIdGrandParent,\n FudisIdParent,\n FudisIdSelectFamily,\n FudisIdDropdownMenuFamily,\n} from '../../types/id';\n\n@Injectable({ providedIn: 'root' })\nexport class FudisIdService {\n private _idData: FudisIdData = {\n components: {\n alert: [],\n autocomplete: [],\n 'body-text': [],\n checkbox: [],\n button: [],\n 'autocomplete-multi-select': [],\n datepicker: [],\n dialog: [],\n dropdown: [],\n 'error-message': [],\n expandable: [],\n fieldset: [],\n form: [],\n guidance: [],\n heading: [],\n 'localized-text-group': [],\n link: [],\n pagination: [],\n popover: [],\n section: [],\n 'text-area': [],\n 'text-input': [],\n 'validator-error-message': [],\n },\n parents: {\n breadcrumbs: {},\n 'checkbox-group': {},\n 'language-badge-group': {},\n 'radio-button-group': {},\n },\n grandParents: {\n 'description-list': {},\n 'dropdown-menu': {},\n select: {},\n multiselect: {},\n },\n };\n\n /**\n * Get collected ID data\n */\n public getIdData(): FudisIdData {\n return this._idData;\n }\n\n /* ------------------\n * Basic Id for single leveled components. E. g. Button\n * ------------------\n * /\n\n /**\n * Get an id and add it to collection for a single component. E.g. 'fudis-button-1'\n */\n public getNewId(componentType: FudisIdComponent): string {\n const orderNumber = this._idData.components[componentType].length + 1;\n\n const newId = `fudis-${componentType}-${orderNumber}`;\n\n this.addNewId(componentType, newId);\n\n return newId;\n }\n\n /**\n * Add an id to collection of single components\n */\n public addNewId(componentType: FudisIdComponent, newId: string): void {\n this._idData.components[componentType].push(newId);\n }\n\n /* ------------------\n * Ids' for two leveled components. E. g. Breadcrumbs and Breadcrumbs Item\n * ------------------\n */\n\n /**\n * Get an id and add it to collection for a parent component. E.g. 'fudis-breadcrumbs-1'\n */\n public getNewParentId(componentType: FudisIdParent): string {\n const orderNumber = Object.keys(this._idData.parents[componentType]).length + 1;\n\n const newId = `fudis-${componentType}-${orderNumber}`;\n\n this.addNewParentId(componentType, newId);\n\n return newId;\n }\n\n /**\n * Add id to collection of parents\n */\n public addNewParentId(componentType: FudisIdParent, newId: string): void {\n this._idData.parents[componentType][newId] = [];\n }\n\n /**\n * Get an id and add it to collection for a child component. E.g. 'fudis-breadcrumbs-1-item-1'\n */\n public getNewChildId(parentType: FudisIdParent, parentId: string): string {\n let newId = '';\n\n const orderNumber = Object.keys(this._idData.parents[parentType]?.[parentId]).length + 1;\n\n if (orderNumber) {\n newId = `${parentId}-item-${orderNumber}`;\n\n this._idData.parents[parentType][parentId].push(newId);\n }\n\n return newId;\n }\n\n public getAllChildrenIds(parentType: FudisIdParent, parentId: string): string[] {\n return this._idData.parents[parentType]?.[parentId];\n }\n\n /**\n * Add id to collection of parents children\n */\n\n public addNewChildId(parentType: FudisIdParent, parentId: string, customId: string): void {\n this._idData.parents[parentType]?.[parentId].push(customId);\n }\n\n /* ------------------\n * Ids' for three leveled components. E. g. Select, SelectGroup and Select Option and DL, DL Item, DL Term & Details\n * ------------------\n */\n\n /**\n * Get an id and add it to collection for a grand parent type components\n */\n public getNewGrandParentId(componentType: FudisIdGrandParent): string {\n let newId = '';\n\n const orderNumber = Object.keys(this._idData.grandParents[componentType]).length + 1;\n\n newId = `fudis-${componentType}-${orderNumber}`;\n\n this.addNewGrandParentId(componentType, newId);\n\n return newId;\n }\n\n /**\n * Add grand parent id to data collection\n */\n public addNewGrandParentId(componentType: FudisIdGrandParent, newId: string): void {\n if (componentType === 'description-list') {\n const newGrandParent: FudisIdDlFamily = {\n id: newId,\n items: {},\n };\n this._idData.grandParents[componentType][newId] = newGrandParent;\n } else if (componentType === 'dropdown-menu') {\n const newGrandParent: FudisIdDropdownMenuFamily = {\n id: newId,\n groups: {},\n nonGroupedOptions: [],\n };\n this._idData.grandParents[componentType][newId] = newGrandParent;\n } else {\n const newGrandParent: FudisIdSelectFamily = {\n id: newId,\n groups: {},\n nonGroupedOptions: [],\n };\n this._idData.grandParents[componentType][newId] = newGrandParent;\n }\n }\n\n /**\n * Get an id and add it to collection for first child of grandparent. E.g. Select Group or\n * Description List Item\n */\n public getNewGroupId(\n componentType: 'select' | 'multiselect' | 'description-list' | 'dropdown-menu',\n parentId: string,\n ): string {\n let newId = '';\n\n if (this._idData.grandParents[componentType]?.[parentId]) {\n if (componentType === 'description-list') {\n const orderNumber =\n Object.keys(this._idData.grandParents[componentType][parentId].items).length + 1;\n\n newId = `${parentId}-item-${orderNumber}`;\n this._idData.grandParents[componentType][parentId].items[newId] = {\n term: [],\n details: [],\n };\n } else {\n const orderNumber =\n Object.keys(this._idData.grandParents[componentType][parentId].groups).length + 1;\n\n newId = `${parentId}-group-${orderNumber}`;\n this._idData.grandParents[componentType][parentId].groups[newId] = [];\n }\n }\n\n return newId;\n }\n\n /**\n * Add group id of grand parent to data collection\n */\n public addNewGroupId(\n componentType: 'select' | 'multiselect' | 'description-list' | 'dropdown-menu',\n parentId: string,\n newId: string,\n ): void {\n if (this._idData.grandParents[componentType]?.[parentId]) {\n if (componentType === 'description-list') {\n this._idData.grandParents[componentType][parentId].items[newId] = {\n term: [],\n details: [],\n };\n } else {\n this._idData.grandParents[componentType][parentId].groups[newId] = [];\n }\n }\n }\n\n public getNewDropdownMenuId(parentId: string, groupParentId?: string): string {\n let newId = '';\n\n if (groupParentId) {\n const orderNumber =\n this._idData.grandParents['dropdown-menu'][parentId].groups[groupParentId].length + 1;\n\n newId = `${groupParentId}-option-${orderNumber}`;\n\n this._idData.grandParents['dropdown-menu'][parentId].groups[groupParentId].push(newId);\n } else {\n const orderNumber =\n this._idData.grandParents['dropdown-menu'][parentId].nonGroupedOptions.length + 1;\n newId = `${parentId}-option-${orderNumber}`;\n\n this._idData.grandParents['dropdown-menu'][parentId].nonGroupedOptions.push(newId);\n }\n return newId;\n }\n\n /**\n * Get an id and add it to collection for Select Options -->\n * fudis-select-4-group-2-option-g3n3ratedh4sh\n */\n public getNewSelectOptionId(\n label: string,\n selectType: 'select' | 'multiselect',\n selectParentId: string,\n groupParentId?: string,\n ): string {\n const newId = FudisIdService.createSelectOptionId(selectParentId, label);\n\n if (groupParentId) {\n this._idData.grandParents[selectType][selectParentId].groups[groupParentId].push(newId);\n } else {\n this._idData.grandParents[selectType][selectParentId].nonGroupedOptions.push(newId);\n }\n return newId;\n }\n\n public static createSelectOptionId(id: string, label: string) {\n return `${id}-option-${FudisIdService.hashLabel(label)}`;\n }\n\n /**\n * Djb2 hash for hashing the label for the option id. It doesn't have to be this, it can be\n * anything as long as it's fast and short\n */\n private static hashLabel(label: string): string {\n let hash = 0;\n for (let i = 0; i < label.length; i++) {\n hash = (hash * 31 + label.charCodeAt(i)) >>> 0;\n }\n return hash.toString(36);\n }\n\n /**\n * Get an id and add it to collection for Descrition List Term & Details -->\n * fudis-description-list-1-item-1-term & fudis-description-list-1-item-1-details-1\n */\n public getNewDlGrandChilId(\n childType: 'term' | 'details',\n parentDlId: string,\n parentItemId: string,\n ): string {\n let newId = '';\n\n if (this._idData.grandParents['description-list']?.[parentDlId]?.items[parentItemId]) {\n const orderNumber =\n this._idData.grandParents['description-list'][parentDlId].items[parentItemId][childType]\n .length + 1;\n\n newId = `${parentItemId}-${childType}-${orderNumber}`;\n\n this._idData.grandParents['description-list'][parentDlId].items[parentItemId][childType].push(\n newId,\n );\n }\n\n return newId;\n }\n\n public getDlGrandChildrensIds(\n childType: 'term' | 'details',\n parentDlId: string,\n parentItemId: string,\n ): string[] {\n const allGrandChildrensIds =\n this._idData.grandParents['description-list']?.[parentDlId]?.items[parentItemId][childType];\n\n return allGrandChildrensIds;\n }\n}\n","/**\n * This file contains translations for static translation keys used by Fudis components. These are\n * not supposed to be modified by the using application.\n */\n\nexport interface FudisTranslationConfig {\n BREADCRUMBS: {\n // Prefix visible to screen reader\n PREFIX: string;\n };\n // Shown with form inputs\n REQUIRED: string;\n // Necessary keys for ngMaterial Datepicker\n DATEPICKER: {\n CALENDAR: string;\n CLOSE: string;\n OPEN: string;\n PLACEHOLDER: string;\n PREV_MONTH: string;\n NEXT_MONTH: string;\n PREV_YEAR: string;\n NEXT_YEAR: string;\n PREV_MULTIYEAR: string;\n NEXT_MULTIYEAR: string;\n SWITCH_MONTH_VIEW: string;\n SWITCH_MULTIYEAR_VIEW: string;\n // Error message keys for universal Datepicker and Date Range validation\n VALIDATION: {\n START_DATE_INVALID: string;\n END_DATE_INVALID: string;\n DATE_PARSE: string;\n };\n };\n DIALOG: {\n // Label for close button\n CLOSE: string;\n };\n DESCRIPTION_LIST_ITEM_DETAILS: {\n EMPTY_STATE: string;\n };\n DROPDOWNMENU: {\n ITEM: {\n DISABLED: string;\n };\n };\n ERROR_SUMMARY: {\n TITLE: string;\n };\n INPUT_WITH_LANGUAGE_OPTIONS: {\n // Label for language selection dropdown\n LANGUAGE: string;\n // Text shown in dropdown options if input for a language is missing\n MISSING: string;\n // Assistive text of max character count for screen readers\n MAX_LENGTH: string;\n };\n LINK: {\n // External link icon aria-label\n EXTERNAL_LINK: string;\n };\n PAGINATION: {\n BUTTON: {\n NEXT: {\n LABEL: string;\n ARIA_LABEL: string;\n };\n PREVIOUS: {\n LABEL: string;\n ARIA_LABEL: string;\n };\n };\n // Prefix visible to screen reader\n PREFIX: string;\n // Aria-live announcement\n OPENED_PAGE: string;\n CURRENT_PAGE: string;\n LAST_PAGE: string;\n };\n SELECT: {\n DISABLED: string;\n MULTISELECT: {\n REMOVE_ITEM: string;\n REMOVE_ITEMS: string;\n };\n AUTOCOMPLETE: {\n // Clear filter button label for screen readers\n CLEAR: string;\n NO_RESULTS: string;\n SHOWING: string;\n RESULTS: string;\n };\n };\n IMAGE: {\n // Alternative text for screen readers.\n FUNIDATA_LOGO: string;\n };\n ATTENTION: string;\n LOADING_SPINNER: {\n VISIBLE_LABEL: string;\n PAGE_LOADING: string;\n PAGE_LOAD_FINISHED: string;\n };\n LANGUAGE_BADGE: {\n ARIA_LABEL: FudisTranslationLanguageBadgeAriaLabel;\n };\n TEXTAREA: {\n // Assistive text of max character count for screen readers\n MAX_LENGTH: string;\n };\n TEXTINPUT: {\n // Assistive text of max character count for screen readers\n MAX_LENGTH: string;\n };\n ALERT: {\n HEADING_LABEL: string;\n };\n}\n\nexport interface FudisTranslationLanguageBadgeAriaLabel {\n FI: string;\n SV: string;\n EN: string;\n TRANSLATIONS: string;\n SELECTED: string;\n MISSING_TRANSLATION: string;\n}\n\n/**\n * English translations\n */\nexport const en: FudisTranslationConfig = {\n BREADCRUMBS: { PREFIX: 'Breadcrumbs' },\n REQUIRED: 'Required',\n DATEPICKER: {\n CALENDAR: 'Calendar',\n CLOSE: 'Close calendar',\n OPEN: 'Open calendar',\n PLACEHOLDER: 'dd.mm.yyyy',\n PREV_MONTH: 'Previous month',\n NEXT_MONTH: 'Next month',\n PREV_YEAR: 'Previous year',\n NEXT_YEAR: 'Next year',\n PREV_MULTIYEAR: 'Previous 24 years',\n NEXT_MULTIYEAR: 'Next 24 years',\n SWITCH_MONTH_VIEW: 'Switch to month view',\n SWITCH_MULTIYEAR_VIEW: 'Switch to year view',\n VALIDATION: {\n START_DATE_INVALID: 'Start date cannot be after end date',\n END_DATE_INVALID: 'End date cannot be before start date',\n DATE_PARSE: 'Invalid date format',\n },\n },\n DIALOG: { CLOSE: 'Close' },\n DESCRIPTION_LIST_ITEM_DETAILS: {\n EMPTY_STATE: 'Information is not available',\n },\n DROPDOWNMENU: {\n ITEM: {\n DISABLED: 'Disabled',\n },\n },\n ERROR_SUMMARY: {\n TITLE: 'The information is incomplete or incorrect. Please correct the following items:',\n },\n INPUT_WITH_LANGUAGE_OPTIONS: {\n LANGUAGE: 'Language',\n MISSING: 'Missing',\n MAX_LENGTH: 'characters used',\n },\n LINK: {\n EXTERNAL_LINK: '(opens in a new tab)',\n },\n PAGINATION: {\n BUTTON: {\n NEXT: {\n LABEL: 'Next',\n ARIA_LABEL: 'Next, page',\n },\n PREVIOUS: {\n LABEL: 'Previous',\n ARIA_LABEL: 'Previous, page',\n },\n },\n PREFIX: 'Pagination',\n OPENED_PAGE: 'Opened page',\n CURRENT_PAGE: 'current page',\n LAST_PAGE: 'last page',\n },\n SELECT: {\n DISABLED: 'Disabled',\n MULTISELECT: {\n REMOVE_ITEM: 'Remove selection',\n REMOVE_ITEMS: 'Remove selections',\n },\n AUTOCOMPLETE: {\n CLEAR: 'Clear selection',\n NO_RESULTS: 'No results found',\n SHOWING: 'Showing',\n RESULTS: 'results',\n },\n },\n IMAGE: {\n FUNIDATA_LOGO: 'Funidata homepage',\n },\n ATTENTION: 'Attention',\n LOADING_SPINNER: {\n VISIBLE_LABEL: 'Loading',\n PAGE_LOADING: 'Page is loading',\n PAGE_LOAD_FINISHED: 'Page load finished',\n },\n LANGUAGE_BADGE: {\n ARIA_LABEL: {\n FI: 'Change translation to Finnish',\n SV: 'Change translation to Swedish',\n EN: 'Change translation to English',\n TRANSLATIONS: 'Translations',\n SELECTED: '(Selected)',\n MISSING_TRANSLATION: '(Missing translation)',\n },\n },\n TEXTAREA: {\n MAX_LENGTH: 'characters used',\n },\n TEXTINPUT: {\n MAX_LENGTH: 'characters used',\n },\n ALERT: {\n HEADING_LABEL: 'Notifications - Number of notifications',\n },\n};\n\n/**\n * Finnish translations\n */\nexport const fi: FudisTranslationConfig = {\n BREADCRUMBS: { PREFIX: 'Murupolku' },\n REQUIRED: 'Pakollinen',\n DATEPICKER: {\n CALENDAR: 'Kalenteri',\n CLOSE: 'Sulje kalenteri',\n OPEN: 'Avaa kalenteri',\n PLACEHOLDER: 'pp.kk.vvvv',\n PREV_MONTH: 'Edellinen kuukausi',\n NEXT_MONTH: 'Seuraava kuukausi',\n PREV_YEAR: 'Edellinen vuosi',\n NEXT_YEAR: 'Seuraava vuosi',\n PREV_MULTIYEAR: 'Edelliset 24 vuotta',\n NEXT_MULTIYEAR: 'Seuraavat 24 vuotta',\n SWITCH_MONTH_VIEW: 'Vaihda kuukausinäkymään',\n SWITCH_MULTIYEAR_VIEW: 'Vaihda vuosinäkymään',\n VALIDATION: {\n START_DATE_INVALID: 'Alkamispäivän on oltava ennen päättymispäivää',\n END_DATE_INVALID: 'Päättymispäivän on oltava alkamispäivän jälkeen',\n DATE_PARSE: 'Virheellinen päivämääräformaatti.',\n },\n },\n DIALOG: { CLOSE: 'Sulje' },\n DESCRIPTION_LIST_ITEM_DETAILS: {\n EMPTY_STATE: 'Tietoa ei ole saatavilla',\n },\n DROPDOWNMENU: {\n ITEM: {\n DISABLED: 'Ei valittavissa',\n },\n },\n ERROR_SUMMARY: {\n TITLE: 'Tiedoissa on puutteita tai virheitä. Korjaa seuraavat kohdat:',\n },\n INPUT_WITH_LANGUAGE_OPTIONS: {\n LANGUAGE: 'Kieli',\n MISSING: 'Puuttuu',\n MAX_LENGTH: 'merkkiä käytetty',\n },\n LINK: {\n EXTERNAL_LINK: '(aukeaa uuteen välilehteen)',\n },\n PAGINATION: {\n BUTTON: {\n NEXT: {\n LABEL: 'Seuraava',\n ARIA_LABEL: 'Seuraava, sivu',\n },\n PREVIOUS: {\n LABEL: 'Edellinen',\n ARIA_LABEL: 'Edellinen, sivu',\n },\n },\n PREFIX: 'Sivutus',\n OPENED_PAGE: 'Avattu sivu',\n CURRENT_PAGE: 'nykyinen sivu',\n LAST_PAGE: 'viimeinen sivu',\n },\n SELECT: {\n DISABLED: 'Ei valittavissa',\n MULTISELECT: {\n REMOVE_ITEM: 'Poista valinta',\n REMOVE_ITEMS: 'Poista valintoja',\n },\n AUTOCOMPLETE: {\n CLEAR: 'Tyhjennä valinta',\n NO_RESULTS: 'Haku ei palauttanut yhtään tulosta',\n SHOWING: 'Näytetään',\n RESULTS: 'tulosta',\n },\n },\n IMAGE: {\n FUNIDATA_LOGO: 'Funidatan kotisivut',\n },\n ATTENTION: 'Huomio',\n LOADING_SPINNER: {\n VISIBLE_LABEL: 'Ladataan',\n PAGE_LOADING: 'Sivua ladataan',\n PAGE_LOAD_FINISHED: 'Sivu on ladattu',\n },\n LANGUAGE_BADGE: {\n ARIA_LABEL: {\n FI: 'Vaihda käännöskieleksi Suomi',\n SV: 'Vaihda käännöskieleksi Ruotsi',\n EN: 'Vaihda käännöskieleksi Englanti',\n TRANSLATIONS: 'Käännöskielet',\n SELECTED: '(Valittuna)',\n MISSING_TRANSLATION: '(Käännös puuttuu)',\n },\n },\n TEXTAREA: {\n MAX_LENGTH: 'merkkiä käytetty',\n },\n TEXTINPUT: {\n MAX_LENGTH: 'merkkiä käytetty',\n },\n ALERT: {\n HEADING_LABEL: 'Ilmoitukset - Ilmoituksia yhteensä',\n },\n};\n\n/**\n * Swedish translations\n */\nexport const sv: FudisTranslationConfig = {\n BREADCRUMBS: { PREFIX: 'Länkstig' },\n REQUIRED: 'Obligatorisk',\n DATEPICKER: {\n CALENDAR: 'Kalender',\n CLOSE: 'Stäng kalender',\n OPEN: 'Öppna kalender',\n PLACEHOLDER: 'dd.mm.åååå',\n PREV_MONTH: 'Förra månaden',\n NEXT_MONTH: 'Nästa månad',\n PREV_YEAR: 'Förra året',\n NEXT_YEAR: 'Nästa år',\n PREV_MULTIYEAR: 'Tidigare 24 år',\n NEXT_MULTIYEAR: 'Nästa 24 år',\n SWITCH_MONTH_VIEW: 'Byta till månadsvy',\n SWITCH_MULTIYEAR_VIEW: 'Byta till årsvy',\n VALIDATION: {\n START_DATE_INVALID: 'Startdatumet måste vara före slutdatumet',\n END_DATE_INVALID: 'Slutdatumet måste vara efter startdatumet',\n DATE_PARSE: 'Datumet format är felaktigt',\n },\n },\n DIALOG: { CLOSE: 'Stäng' },\n DESCRIPTION_LIST_ITEM_DETAILS: {\n EMPTY_STATE: 'Ingen information tillgänglig',\n },\n DROPDOWNMENU: {\n ITEM: {\n DISABLED: 'Inaktiverad',\n },\n },\n ERROR_SUMMARY: {\n TITLE: 'Det finns brister eller fel i uppgifterna. Korrigera följande punkter:',\n },\n INPUT_WITH_LANGUAGE_OPTIONS: {\n LANGUAGE: 'Språk',\n MISSING: 'Saknas',\n MAX_LENGTH: 'tecken använt',\n },\n PAGINATION: {\n BUTTON: {\n NEXT: {\n LABEL: 'Nästa',\n ARIA_LABEL: 'Nästa, sida',\n },\n PREVIOUS: {\n LABEL: 'Föregående',\n ARIA_LABEL: 'Föregående, sida',\n },\n },\n PREFIX: 'Paginering',\n OPENED_PAGE: 'Öppnad sida',\n CURRENT_PAGE: 'nuvarande sida',\n LAST_PAGE: 'sista sida',\n },\n SELECT: {\n DISABLED: 'Inaktiverad',\n MULTISELECT: {\n REMOVE_ITEM: 'Ta bort val',\n REMOVE_ITEMS: 'Ta bort valen',\n },\n AUTOCOMPLETE: {\n CLEAR: 'Radera val',\n NO_RESULTS: 'Inga sökresultat',\n SHOWING: 'Visas',\n RESULTS: 'resultat',\n },\n },\n IMAGE: {\n FUNIDATA_LOGO: 'Funidatas hemsida',\n },\n LINK: {\n EXTERNAL_LINK: '(öppnas i en ny flik)',\n },\n ATTENTION: 'Observera',\n LOADING_SPINNER: {\n VISIBLE_LABEL: 'Laddar',\n PAGE_LOADING: 'Sidan laddas',\n PAGE_LOAD_FINISHED: 'Sidan har laddats klart',\n },\n LANGUAGE_BADGE: {\n ARIA_LABEL: {\n FI: 'Ändra översättning till Finska',\n SV: 'Ändra översättning till Svenska',\n EN: 'Ändra översättning till Engelska',\n TRANSLATIONS: 'Översättningar',\n SELECTED: 'Vald',\n MISSING_TRANSLATION: '(Saknad översättning)',\n },\n },\n TEXTAREA: {\n MAX_LENGTH: 'tecken använt',\n },\n TEXTINPUT: {\n MAX_LENGTH: 'tecken använt',\n },\n ALERT: {\n HEADING_LABEL: 'Meddelanden - Totalt meddelanden',\n },\n};\n","import { Injectable, Signal, signal } from '@angular/core';\nimport { FudisLanguageAbbr } from '../../types/miscellaneous';\nimport { fi, sv, en, FudisTranslationConfig } from './translationKeys';\n\n@Injectable({ providedIn: 'root' })\nexport class FudisTranslationService {\n constructor() {}\n\n /**\n * Signal for Application's translation texts, default language for translations is English\n */\n private _appTranslationsSignal = signal<FudisTranslationConfig>(en);\n\n /**\n * Application language, default language is English\n */\n private _appLanguage = signal<FudisLanguageAbbr>('en');\n\n /**\n * Currently available languages in Fudis are Finnish, Swedish and English\n */\n private _selectableLanguages = signal<FudisLanguageAbbr[]>(['fi', 'sv', 'en']);\n\n /**\n * Set language of repeated texts Fudis uses for its components. E. g. 'required' text of form\n * components or help texts for screen readers for various buttons. Also as Error Summary\n * Component reloads its errors if error's language has changed, here is defined component to NOT\n * focus to the updated list on only language change.\n */\n public setLanguage(language: FudisLanguageAbbr): void {\n this._appLanguage.set(language);\n if (language === 'en') {\n this._appTranslationsSignal.set({ ...en });\n } else if (language === 'fi') {\n this._appTranslationsSignal.set({ ...fi });\n } else {\n this._appTranslationsSignal.set({ ...sv });\n }\n }\n\n /**\n * Get current language of Fudis configs\n */\n public getLanguage(): FudisLanguageAbbr {\n return this._appLanguage();\n }\n\n /**\n * Get current language as Signal\n */\n public getLanguageSignal(): Signal<FudisLanguageAbbr> {\n return this._appLanguage.asReadonly();\n }\n\n /**\n * Get application's translation config values Signal\n */\n public getTranslations(): Signal<FudisTranslationConfig> {\n return this._appTranslationsSignal.asReadonly();\n }\n\n /**\n * Set which languages are visible in Language Badges\n */\n public setSelectableLanguages(languages: FudisLanguageAbbr[]): void {\n this._selectableLanguages.set([...languages]);\n }\n\n /**\n * Get visible languages of Language Badges\n */\n public getSelectableLanguages(): Signal<FudisLanguageAbbr[]> {\n return this._selectableLanguages.asReadonly();\n }\n}\n","import { Component, Input, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\nimport { FudisTranslationService } from '../../services/translation/translation.service';\nimport { FudisIdService } from '../../services/id/id.service';\nimport { BehaviorSubject } from 'rxjs';\nimport { AsyncPipe } from '@angular/common';\n\n/**\n * Displays the hierarchial navigation path to the current page.\n *\n * Use this component to help users understand their location and navigate back through parent\n * levels.\n */\n@Component({\n selector: 'fudis-breadcrumbs',\n templateUrl: './breadcrumbs.component.html',\n styleUrls: ['./breadcrumbs.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AsyncPipe],\n})\nexport class BreadcrumbsComponent {\n constructor(\n private _translationService: FudisTranslationService,\n private _idService: FudisIdService,\n ) {\n this._id = this._idService.getNewParentId('breadcrumbs');\n this._breadcrumbsPrefix.next(this._translationService.getTranslations()().BREADCRUMBS.PREFIX);\n }\n\n /**\n * Label to attach to aria-label\n */\n @Input({ required: true }) label: string;\n\n /**\n * Prefix for aria-label from Fudis translation keys\n */\n protected _breadcrumbsPrefix = new BehaviorSubject<string>(\n this._translationService.getTranslations()().BREADCRUMBS.PREFIX,\n );\n\n /**\n * HTML id\n */\n protected _id: string;\n\n /**\n * Getter for id\n */\n get id(): string {\n return this._id;\n }\n}\n","<nav [attr.aria-label]=\"(_breadcrumbsPrefix | async) + ': ' + label\" [attr.id]=\"_id\">\n <ul class=\"fudis-breadcrumbs\">\n <ng-content select=\"fudis-breadcrumbs-item\" />\n </ul>\n</nav>\n","import {\n ChangeDetectionStrategy,\n Component,\n Host,\n HostBinding,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { BreadcrumbsComponent } from '../breadcrumbs.component';\nimport { IconComponent } from '../../icon/icon.component';\n\n/**\n * Represents a single link within BreadcrumbsComponent. Must be a direct child of\n * `fudis-breadcrumbs`.\n *\n * Use this component with descriptive link text to ensure understandability.\n */\n@Component({\n selector: 'fudis-breadcrumbs-item',\n templateUrl: './breadcrumbs-item.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [IconComponent],\n})\nexport class BreadcrumbsItemComponent {\n constructor(\n private _idService: FudisIdService,\n @Host() protected _breadCrumbs: BreadcrumbsComponent,\n ) {\n this._id = this._idService.getNewChildId('breadcrumbs', this._breadCrumbs.id);\n }\n\n /**\n * Binding host CSS class to component wrapper\n */\n @HostBinding('class') protected _classes = 'fudis-breadcrumbs-item-host';\n\n /**\n * Id from Id Service\n */\n protected _id: string;\n}\n","<li class=\"fudis-breadcrumbs-item\" [attr.id]=\"_id\">\n <ng-content select=\"a\" />\n <span class=\"fudis-breadcrumbs-item__icon\">\n <fudis-icon [icon]=\"'chevron'\" />\n </span>\n <ng-content select=\"fudis-body-text\" />\n</li>\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n Input,\n HostBinding,\n ChangeDetectionStrategy,\n OnChanges,\n Optional,\n Host,\n} from '@angular/core';\nimport { FudisBodyText, FudisTextAlign } from '../../../types/typography';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { FudisComponentChanges, FudisLanguageAbbr } from '../../../types/miscellaneous';\nimport { BehaviorSubject } from 'rxjs';\nimport { BreadcrumbsItemComponent } from '../../breadcrumbs/breadcrumbs-item/breadcrumbs-item.component';\n\n/**\n * Displays standard body text content.\n *\n * Use this component to render paragraphs or informational text with consistent typography and\n * spacing. Use clear, simple, and inclusive language.\n */\n@Component({\n selector: 'fudis-body-text',\n imports: [CommonModule],\n templateUrl: './body-text.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BodyTextComponent implements OnChanges {\n constructor(\n @Host() @Optional() protected _breadcrumbsItem: BreadcrumbsItemComponent,\n private _idService: FudisIdService,\n ) {\n this._id = _idService.getNewId('body-text');\n }\n\n /**\n * Class for the parent wrapper element\n */\n @HostBinding('class') protected _classes = 'fudis-body-text-host';\n\n /**\n * Variant for the paragraph: 'lg-regular' | 'md-regular' | 'sm-regular' | 'lg-light' | 'md-light'\n */\n @Input() variant: FudisBodyText = 'md-regular';\n\n /**\n * Text alignment: 'center' | 'left' | 'right'\n */\n @Input() align: FudisTextAlign = 'left';\n\n /**\n * Optional language attribute, possible values 'fi', 'sv' and 'en'.\n */\n @Input() lang: FudisLanguageAbbr;\n\n /**\n * Id generated from Id Service\n */\n protected _id: string;\n\n /**\n * To add default CSS class if app hasn't provided any variant\n */\n protected _defaultClass = new BehaviorSubject<boolean>(true);\n\n ngOnChanges(changes: FudisComponentChanges<BodyTextComponent>): void {\n if (changes.variant?.currentValue !== changes.variant?.previousValue) {\n if (!changes.variant?.currentValue) {\n this._defaultClass.next(true);\n } else {\n this._defaultClass.next(false);\n }\n }\n }\n}\n","<p\n [id]=\"_id\"\n [class.fudis-body-text__default]=\"_defaultClass | async\"\n [attr.aria-current]=\"_breadcrumbsItem ? 'page' : null\"\n [attr.lang]=\"lang\"\n class=\"fudis-body-text fudis-body-text__{{ variant }} fudis-body-text__{{ align }}\"\n ><ng-content\n/></p>\n","import { Injectable } from '@angular/core';\nimport { FudisIdService } from '../id/id.service';\nimport { FudisAlert, FudisAlertElement } from '../../types/miscellaneous';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable()\nexport class FudisAlertService {\n constructor(private _idService: FudisIdService) {}\n\n /**\n * Current alerts\n */\n private _alerts = new BehaviorSubject<FudisAlertElement[]>([]);\n\n /**\n * To add new alert, which will be rendered by Alert Group component. Note that 'id' doesn't\n * necessarily need to be unique. All errors with the same 'id' can be dismissed with\n * dismissAlert() using that particular 'id'.\n */\n public addAlert(newAlert: FudisAlert): void {\n const htmlId = this._idService.getNewId('alert');\n const currentAlerts = this._alerts.getValue();\n\n this._alerts.next([\n ...currentAlerts,\n { ...newAlert, htmlId, buttonId: `${htmlId}-button`, initialFocus: true },\n ]);\n }\n\n /**\n * To dismiss alert by 'id' provided in 'addAlert()'. It will dismiss all alerts matching the\n * 'id'.\n */\n public dismissAlert(id: string): void {\n const filteredAlerts = this._alerts.getValue().filter((alert) => alert.id !== id);\n this._alerts.next(filteredAlerts);\n }\n\n /**\n * Dismisses only one alert from alert's close button click in the UI\n */\n public dismissAlertFromButton(id: string): void {\n const filteredAlerts = this._alerts.getValue().filter((alert) => alert.buttonId !== id);\n this._alerts.next(filteredAlerts);\n }\n\n /**\n * Dismiss all alerts\n */\n public dismissAll(): void {\n this._alerts.next([]);\n }\n\n /**\n * Get alerts as an Observable\n */\n get alerts(): BehaviorSubject<FudisAlertElement[]> {\n return this._alerts;\n }\n\n /**\n * Set 'initialFocus' attribute of alert to false, so that if same alert with link is rendered\n * again, the initial focus will not jump there anymore.\n */\n public updateAlertLinkFocusState(htmlId: string): void {\n let alertIndex: number;\n const tempAlerts = this._alerts.getValue();\n\n tempAlerts.forEach((value, index) => {\n if (value.htmlId === htmlId) {\n alertIndex = index;\n }\n\n if (alertIndex !== -1) {\n tempAlerts[index].initialFocus = false;\n\n this._alerts.next(tempAlerts);\n }\n });\n }\n}\n","import { Inject, Injectable, DOCUMENT } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class FudisFocusService {\n constructor(@Inject(DOCUMENT) private _document: Document) {}\n\n /**\n * List of ignored id's\n */\n private _ignoreInitialFocusList: string[] = [];\n\n /**\n * HTML element to focus\n */\n private _focusTarget: HTMLElement;\n\n /**\n * Get target HTML element to focus\n */\n public getFocusTarget(): HTMLElement {\n return this._focusTarget;\n }\n\n /**\n * Set focus target if it's not alert close button\n */\n public setFocusTarget(target: HTMLElement): void {\n if (!target.classList.contains('fudis-alert__close')) {\n this._focusTarget = target;\n }\n }\n\n /**\n * Focus target element by id. If focusable element is not available when function is called, it\n * will repeatively call itself until try counter is full.\n *\n * @param id Target to focus\n * @param tryCounter How many times function should try to focus to given id\n */\n public focusToElementById(id: string, numberOfTries: number = 100): void {\n setTimeout(() => {\n const element = this._document.getElementById(id);\n\n if (element) {\n element.focus();\n } else if (numberOfTries > 0) {\n this.focusToElementById(id, numberOfTries - 1);\n }\n }, 50);\n }\n\n /**\n * Add component with given id to ignore list, so that initialFocus is ignored with that. Used\n * e.g. in a form where same component is added multiple times when user clicks 'New item' or\n * similar and focus is wanted to move there except with 'item-id-x'.\n */\n public addToIgnoreList(id: string): void {\n if (!this._ignoreInitialFocusList.includes(id)) {\n this._ignoreInitialFocusList.push(id);\n }\n }\n\n /**\n * Remove id from ignore initialFocus list\n */\n public removeFromIgnoreList(id: string): void {\n if (this._ignoreInitialFocusList.includes(id)) {\n this._ignoreInitialFocusList = this._ignoreInitialFocusList.filter((item) => {\n return item !== id;\n });\n }\n }\n\n /**\n * Get list of ignored id's\n */\n public getIgnoreList(): string[] {\n return this._ignoreInitialFocusList;\n }\n\n /**\n * Check if current id is in the ignored list\n */\n public isIgnored(id: string): boolean {\n if (this._ignoreInitialFocusList.includes(id)) {\n return true;\n }\n return false;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ComponentType } from '@angular/cdk/portal';\nimport { Injectable, TemplateRef } from '@angular/core';\nimport { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable()\nexport class FudisDialogService {\n constructor(public ngMaterialDialog: MatDialog) {}\n\n private _dialogOpen = new BehaviorSubject<boolean>(false);\n\n private _justClosedDropdownWithEscape = new BehaviorSubject<boolean>(false);\n\n /**\n * Open new dialog.\n *\n * @param component Component or template to show in the dialog.\n * @param config Optional configuration object. Use the `data` field to inject data into\n * `component`.\n * @returns Reference to the dialog that was opened.\n */\n public open<T, R = any, D = any>(\n component: ComponentType<T> | TemplateRef<T>,\n config?: MatDialogConfig<D>,\n ): MatDialogRef<T, R> {\n return this.ngMaterialDialog.open(component, FudisDialogService._createConfig<D>(config));\n }\n\n /**\n * Close opened Dialog\n *\n * @param dialogResult Data sent to Component which opened this dialog.\n */\n public close<R = any>(dialogResult?: R): void {\n const currentDialogs = this.ngMaterialDialog.openDialogs;\n\n if (currentDialogs.length > 0) {\n currentDialogs?.[currentDialogs.length - 1].close(dialogResult);\n }\n }\n\n /**\n * Close all instances of Dialogs\n */\n public closeAll(): void {\n this.ngMaterialDialog.closeAll();\n }\n\n /**\n * Get dialog open status\n */\n public getDialogOpenStatus(): BehaviorSubject<boolean> {\n return this._dialogOpen;\n }\n\n /**\n * Set dialog open\n */\n public setDialogOpenStatus(value: boolean): void {\n this._dialogOpen.next(value);\n }\n\n /**\n * Set flag to indicate that a dropdown was just closed with Escape key, so that dialog does not\n * also close with the same key press.\n */\n public dropdownClosedWithEscape(): void {\n this._justClosedDropdownWithEscape.next(true); // set the flag\n\n // Reset the flag after a short delay (backup)\n setTimeout(() => {\n this._justClosedDropdownWithEscape.next(false);\n }, 1000);\n }\n\n /**\n * Check if a dropdown was just closed with Escape key. Resets the flag after checking.\n */\n public hasJustClosedDropdownWithEscape(): boolean {\n const hasJustClosed = this._justClosedDropdownWithEscape.value;\n if (hasJustClosed) {\n this._justClosedDropdownWithEscape.next(false); // Reset the flag\n }\n return hasJustClosed;\n }\n\n /**\n * @returns Currently open Dialogs\n */\n public dialogsOpen(): MatDialogRef<any, any>[] {\n return this.ngMaterialDialog.openDialogs;\n }\n\n /**\n * Merge consumer's config with ours.\n */\n private static _createConfig<D = any>(userConfig: MatDialogConfig<D> = {}): MatDialogConfig<D> {\n const overridableOptions = {\n hasBackdrop: true,\n disableClose: true,\n autoFocus: false,\n ariaModal: true,\n };\n const forcedOptions = {\n enterAnimationDuration: 0,\n exitAnimationDuration: 0,\n panelClass: 'fudis-dialog-panel',\n backdropClass: 'fudis-dialog-backdrop',\n };\n return { ...overridableOptions, ...userConfig, ...forcedOptions };\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Inject,\n Input,\n Output,\n DOCUMENT,\n} from '@angular/core';\n\nimport { Observable } from 'rxjs';\nimport { FudisNotification } from '../../../types/miscellaneous';\nimport { FudisFocusService } from '../../../services/focus/focus.service';\nimport { FudisTranslationService } from '../../../services/translation/translation.service';\nimport { FudisAlertService } from '../../../services/alert/alert.service';\nimport { FudisDialogService } from '../../../services/dialog/dialog.service';\nimport { BodyTextComponent } from '../../typography/body-text/body-text.component';\nimport { IconComponent } from '../../icon/icon.component';\nimport { AsyncPipe } from '@angular/common';\n\n/**\n * Displays a dismissible alert message.\n *\n * Use this component to show contextual feedback messages such as success, warning, or error state.\n */\n@Component({\n selector: 'fudis-alert',\n templateUrl: './alert.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [BodyTextComponent, IconComponent, AsyncPipe],\n})\nexport class AlertComponent {\n constructor(\n @Inject(DOCUMENT) private _document: Document,\n protected _translateService: FudisTranslationService,\n private _alertService: FudisAlertService,\n private _focusService: FudisFocusService,\n private _dialogService: FudisDialogService,\n ) {}\n\n /**\n * Visible alert message\n */\n @Input({ required: true }) message: Observable<string>;\n\n /**\n * Id to be set on the whole alert element\n */\n @Input({ required: true }) htmlId: string;\n\n /**\n * Id to be set on the close button\n */\n @Input({ required: true }) buttonId: string;\n\n /**\n * Variant of Alert: 'warning' | 'danger' | 'success' | 'info'. Same names and colors as in\n * Notification Component.\n */\n @Input() variant: FudisNotification = 'info';\n\n /**\n * Output for close button click\n */\n @Output() handleClose = new EventEmitter<Event>();\n\n /**\n * Handler for close button. Dismisses alert from service and sets focus to last alert in the list\n * or to previously focused element stored with _handleFocus().\n */\n protected _handleCloseClick(event: Event): void {\n this._alertService.dismissAlertFromButton(this.buttonId);\n\n const alerts = this._alertService.alerts.getValue();\n\n if (alerts.length !== 0) {\n const targetId = alerts[alerts.length - 1].buttonId;\n this._document.getElementById(targetId)?.focus();\n } else {\n const target: HTMLElement = this._focusService.getFocusTarget();\n target?.focus();\n }\n\n this.handleClose.emit(event);\n }\n\n /**\n * Focus handler for close Button inside alert. Saves the element focus originated from, to\n * restore focus there when there are no alerts left.\n */\n protected _handleFocus(focusEvent: FocusEvent): void {\n const relatedTarget = focusEvent?.relatedTarget as HTMLElement;\n\n const isDialogOpen = this._dialogService.getDialogOpenStatus().value;\n\n /**\n * First if: when keyboard tabbing through ngMaterial dialog, focus goes through its hidden\n * focus-trap helper element which focuses on either first alert on the list or dialog close. So\n * we store the dialog close as focus target. Else if: Store source of focus event unless it\n * originated inside Alert\n */\n\n if (\n isDialogOpen &&\n relatedTarget &&\n relatedTarget.classList?.contains('cdk-focus-trap-anchor')\n ) {\n const dialogCloseButton = this._document.querySelector(\n '.cdk-focus-trap-anchor + mat-dialog-container .fudis-dialog__close .fudis-button',\n ) as HTMLElement;\n if (dialogCloseButton) {\n this._focusService.setFocusTarget(dialogCloseButton);\n }\n } else if (relatedTarget && !relatedTarget.closest('.fudis-alert')) {\n this._focusService.setFocusTarget(relatedTarget);\n }\n }\n}\n","<div class=\"fudis-alert fudis-alert__{{ variant }}\" [id]=\"htmlId\">\n <fudis-body-text\n [attr.role]=\"variant === 'danger' || variant === 'warning' ? 'alert' : 'status'\"\n [classList]=\"'fudis-alert__text'\"\n [align]=\"'center'\"\n [variant]=\"'lg-regular'\"\n >\n {{ message | async }}\n </fudis-body-text>\n\n <button\n [attr.aria-label]=\"\n (message | async) + ', ' + _translateService.getTranslations()().DIALOG.CLOSE\n \"\n [id]=\"buttonId\"\n (click)=\"_handleCloseClick($event)\"\n (focus)=\"_handleFocus($event)\"\n class=\"fudis-alert__close fudis-alert__close__{{ variant }}\"\n >\n <fudis-icon [icon]=\"'close'\" [color]=\"variant !== 'warning' ? 'white' : 'gray-dark'\" />\n </button>\n</div>\n","import { Component, Input, effect, OnChanges, ChangeDetectionStrategy } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport {\n FudisAlertElement,\n FudisAlertPosition,\n FudisComponentChanges,\n} from '../../../types/miscellaneous';\nimport { FudisTranslationService } from '../../../services/translation/translation.service';\nimport { FudisAlertService } from '../../../services/alert/alert.service';\nimport { FudisDialogService } from '../../../services/dialog/dialog.service';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AlertComponent } from '../alert/alert.component';\nimport { AsyncPipe } from '@angular/common';\n\n/**\n * Groups and manages multiple alert messages.\n *\n * Use this component to display stacked alerts in a single, consistent location.\n */\n@Component({\n selector: 'fudis-alert-group',\n templateUrl: './alert-group.component.html',\n styleUrls: ['./alert-group.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AlertComponent, AsyncPipe],\n})\nexport class AlertGroupComponent implements OnChanges {\n constructor(\n protected _alertService: FudisAlertService,\n private _translationService: FudisTranslationService,\n private _dialogService: FudisDialogService,\n ) {\n this._dialogService\n .getDialogOpenStatus()\n .pipe(takeUntilDestroyed())\n .subscribe((value) => {\n this._setVisibility(value);\n });\n\n effect(() => {\n this._alertGroupLabel.next(this._translationService.getTranslations()().ALERT.HEADING_LABEL);\n });\n }\n\n /**\n * CSS position of alerts: 'static' | 'absolute' | 'fixed'\n */\n @Input() position: FudisAlertPosition = 'fixed';\n\n /**\n * Boolean to determine if Alert Group is used inside Fudis Dialog Component\n */\n @Input() insideDialog: boolean;\n\n /**\n * List of Alerts fetched from Alert Service\n */\n protected _alertList = new BehaviorSubject<FudisAlertElement[]>([]);\n\n /**\n * Label for section element containing alerts\n */\n protected _alertGroupLabel = new BehaviorSubject<string>('');\n\n /**\n * Boolean to determine if Alert group is visible\n */\n protected _visible = new BehaviorSubject<boolean>(false);\n\n ngOnChanges(changes: FudisComponentChanges<AlertGroupComponent>): void {\n if (changes.insideDialog?.currentValue !== changes.insideDialog?.previousValue) {\n this._setVisibility(this._dialogService.getDialogOpenStatus().value);\n }\n }\n\n /**\n * Get Alert Group's visible status\n */\n public getVisibleStatus(): boolean {\n return this._visible.value;\n }\n\n /**\n * Set visibility when Fudis Dialog is opened and closed\n */\n private _setVisibility(dialogStatus: boolean): void {\n if ((dialogStatus && this.insideDialog) || (!dialogStatus && !this.insideDialog)) {\n this._visible.next(true);\n } else {\n this._visible.next(false);\n }\n }\n}\n","@if ((_visible | async) && (_alertService.alerts | async); as alerts) {\n <section\n class=\"fudis-alert-group fudis-alert-group__{{ position }}\"\n [attr.aria-label]=\"alerts.length > 0 ? (_alertGroupLabel | async) + ': ' + alerts.length : null\"\n >\n @for (alert of alerts; track alert.id) {\n <fudis-alert\n [variant]=\"alert.type\"\n [message]=\"alert.message\"\n [id]=\"alert.id\"\n [htmlId]=\"alert.htmlId\"\n [buttonId]=\"alert.buttonId\"\n />\n }\n </section>\n}\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { FudisBadgeVariant } from '../../types/miscellaneous';\n\n/**\n * Displays a small status or category label.\n *\n * Use this component to convey concise information, like state or classification that supplements\n * surrounding content.\n */\n@Component({\n selector: 'fudis-badge',\n templateUrl: './badge.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BadgeComponent {\n /**\n * Badge variant: 'accent' | 'danger' | 'primary' | 'secondary' | 'success'\n */\n @Input() variant: FudisBadgeVariant = 'primary';\n\n /**\n * Text content for the badge\n */\n @Input() content: string;\n}\n","<span class=\"fudis-badge fudis-badge__{{ variant }}\">{{ content }}<ng-content></ng-content> </span>\n","import { Directive, Input } from '@angular/core';\nimport { FudisPopoverPosition } from '../../types/miscellaneous';\n\n@Directive({\n selector: '[fudisPopoverApi]',\n standalone: false,\n})\nexport class PopoverApiDirective {\n /**\n * Text placed inside popover\n */\n @Input() popoverText: string;\n\n /**\n * Position of the popover on the parent element: 'left' | 'right' | 'above' | 'below'\n */\n @Input() popoverPosition: FudisPopoverPosition = 'below';\n\n /**\n * Label for the element that triggers the popover\n */\n @Input() popoverTriggerLabel: string;\n}\n","import {\n Directive,\n EventEmitter,\n Input,\n OnInit,\n Output,\n OnDestroy,\n ViewChild,\n ElementRef,\n} from '@angular/core';\nimport { FudisIcon, FudisIconColor, FudisIconRotate } from '../../types/icons';\nimport { FudisButtonSize, FudisButtonVariant } from '../../types/miscellaneous';\nimport { BehaviorSubject } from 'rxjs';\nimport { PopoverApiDirective } from '../popover/popover-api.directive';\nimport { FudisIdService } from '../../services/id/id.service';\n\n@Directive({\n selector: '[fudisButtonBase]',\n standalone: false,\n})\nexport class ButtonBaseDirective extends PopoverApiDirective implements OnInit, OnDestroy {\n constructor(protected _idService: FudisIdService) {\n super();\n }\n /**\n * Reference to native button element\n */\n @ViewChild('buttonElement') public buttonEl: ElementRef<HTMLButtonElement>;\n\n /**\n * Id for HTML button element. By default generated.\n */\n @Input() id: string;\n\n /**\n * Icon for button\n */\n @Input() icon: FudisIcon | undefined = undefined;\n\n /**\n * Icon rotation option: 'flip-180' | 'cw-90' | 'ccw-90' | 'none'\n */\n @Input() iconRotate: FudisIconRotate = 'none';\n\n /**\n * Button variant: 'primary' | 'secondary' | 'tertiary'\n */\n @Input() variant: FudisButtonVariant = 'primary';\n\n /**\n * Disables the button, keeping it focusable for screen readers\n */\n @Input() disabled = false;\n\n /**\n * Button size: 'extra-small' | 'small' | 'medium'\n */\n @Input() size: FudisButtonSize = 'medium';\n\n /**\n * Click handler\n */\n @Output() handleClick = new EventEmitter<Event>();\n\n /**\n * Focus handler\n */\n @Output() handleFocus = new EventEmitter<FocusEvent>();\n\n /**\n * Blur handler\n */\n @Output() handleBlur = new EventEmitter<FocusEvent>();\n\n /**\n * OnDestroy handler emit\n */\n @Output() handleDestroy = new EventEmitter<void>();\n\n /**\n * Default Button size for classes\n */\n protected _size: string = 'medium';\n\n /**\n * Automatically sets icon color based on button variant\n */\n protected _iconColor = new BehaviorSubject<FudisIconColor>('white');\n\n /**\n * Is button focused or not\n */\n protected _focused: boolean = false;\n\n /**\n * Button CSS class list\n */\n protected _classList = new BehaviorSubject<string[]>([]);\n\n ngOnInit() {\n if (this.id) {\n this._idService.addNewId('button', this.id);\n } else {\n this.id = this._idService.getNewId('button');\n }\n\n if (this._classList.value.length === 0) {\n this._classList.next(this._getClasses());\n }\n }\n\n ngOnDestroy(): void {\n this.handleDestroy.emit();\n }\n\n /**\n * Handle button focus\n */\n protected _handleButtonFocus(event: FocusEvent): void {\n this._focused = true;\n\n this.handleFocus.emit(event);\n }\n\n /**\n * Determine icon color based on button variant. Return CSS classes with size and variant\n */\n protected _getClasses(): string[] {\n if (this.disabled) {\n this._iconColor.next('gray-dark');\n } else if (this.variant === 'primary') {\n this._iconColor.next('white');\n } else if (this.variant === 'secondary' || this.variant === 'tertiary') {\n this._iconColor.next('primary');\n }\n\n return ['fudis-button', `fudis-button__size__${this._size}`, `fudis-button__${this.variant}`];\n }\n}\n","import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';\n\n/**\n * Displays additional content in an overlay container.\n */\n@Component({\n selector: 'fudis-popover',\n templateUrl: './popover.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PopoverComponent {\n @Input() id: string;\n @Input() popoverText: string;\n}\n","<div [id]=\"id\" aria-live=\"polite\" class=\"fudis-popover\">{{ popoverText }}</div>\n","import {\n AfterViewInit,\n ComponentRef,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n OnInit,\n} from '@angular/core';\nimport { PopoverApiDirective } from './popover-api.directive';\nimport { ConnectedPosition, Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { PopoverComponent } from '../../components/popover/popover.component';\nimport { FudisPopoverPosition } from '../../types/miscellaneous';\nimport { FudisIdService } from '../../services/id/id.service';\nimport { fromEvent, Subscription } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\ntype PopoverPosition = {\n [key in FudisPopoverPosition]: ConnectedPosition;\n};\n\n/**\n * Displays additional content in an overlay container.\n *\n * Use this directive to provide contextual information or tips without navigating away from the\n * current view. Keep popover content concise.\n */\n@Directive({\n selector: '[fudisPopover]',\n})\nexport class PopoverDirective extends PopoverApiDirective implements OnInit, AfterViewInit {\n constructor(\n private _fudisIdService: FudisIdService,\n private _boundElement: ElementRef<HTMLAnchorElement>,\n private _overlay: Overlay,\n ) {\n super();\n }\n\n private _destroyRef = inject(DestroyRef);\n\n private readonly _offset: number = 8;\n private clickSubscription: Subscription;\n private keydownSubscription: Subscription;\n private scrollSubscription: Subscription;\n private _overlayRef: OverlayRef | null = null;\n private _popoverElementId: string;\n private _isPopoverOpen: boolean = false;\n private _positions: PopoverPosition = {\n above: {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n offsetY: -this._offset,\n },\n left: {\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n offsetX: -this._offset,\n },\n right: {\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n offsetX: this._offset,\n },\n below: {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: this._offset,\n },\n };\n\n ngOnInit() {\n this._popoverElementId = this._fudisIdService.getNewId('popover');\n this._boundElement?.nativeElement?.setAttribute('aria-controls', this._popoverElementId);\n }\n\n ngAfterViewInit(): void {\n this._boundElement?.nativeElement?.addEventListener('click', this._clickHandler.bind(this));\n this._boundElement?.nativeElement?.addEventListener('keydown', this._onEscPress.bind(this));\n\n this._setAriaForBoundedElement('false');\n }\n\n private _clickHandler() {\n if (!this._isPopoverOpen) {\n this._openPopover();\n } else {\n this._closePopover();\n }\n }\n\n private _onEscPress(event: KeyboardEvent): void {\n if (event.key === 'Escape') this._closePopover();\n }\n\n private _openPopover() {\n const positionStrategy = this._overlay\n .position()\n .flexibleConnectedTo(this._boundElement)\n .withPositions(this._getPositionStrategy())\n .withPush(false)\n .withScrollableContainers([]);\n\n this._overlayRef = this._overlay.create({\n positionStrategy,\n scrollStrategy: this._overlay.scrollStrategies.close(),\n });\n\n this.clickSubscription = fromEvent(document, 'click')\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((event: Event) => this._focusOutHandler(event));\n\n this.keydownSubscription = fromEvent(document, 'keyup')\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((event: Event) => this._focusOutHandler(event));\n\n this.scrollSubscription = fromEvent(document, 'scroll', { capture: true })\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => this._scrollHandler());\n\n const popoverPortal = new ComponentPortal(PopoverComponent);\n\n const componentRef: ComponentRef<PopoverComponent> = this._overlayRef.attach(popoverPortal);\n componentRef.instance.popoverText = this.popoverText;\n componentRef.instance.id = this._popoverElementId;\n\n this._isPopoverOpen = true;\n this._setAriaForBoundedElement('true');\n }\n\n private _focusOutHandler(event: Event): void {\n if (\n this._overlayRef &&\n !this._boundElement?.nativeElement?.contains(event?.target as Node) &&\n !document.getElementById(this._popoverElementId)?.contains(event?.target as Node)\n ) {\n this._closePopover();\n }\n }\n\n private _scrollHandler(): void {\n this._closePopover();\n }\n\n private _closePopover() {\n if (this._overlayRef) {\n this._overlayRef.dispose();\n this._overlayRef = null;\n }\n this.keydownSubscription?.unsubscribe();\n this.clickSubscription?.unsubscribe();\n this.scrollSubscription?.unsubscribe();\n this._isPopoverOpen = false;\n this._setAriaForBoundedElement('false');\n }\n\n private _getPositionStrategy(): ConnectedPosition[] {\n const positions: ConnectedPosition[] = [];\n positions.push(this._positions[this.popoverPosition]);\n\n for (const positionsKey in this._positions) {\n if (positionsKey !== this.popoverPosition)\n positions.push(this._positions[positionsKey as FudisPopoverPosition]);\n }\n\n return positions;\n }\n\n private _setAriaForBoundedElement(expanded: 'true' | 'false') {\n this._boundElement?.nativeElement?.setAttribute('aria-expanded', expanded);\n if (expanded === 'true') {\n this._boundElement.nativeElement.setAttribute('aria-describedby', this._popoverElementId);\n } else {\n this._boundElement.nativeElement.removeAttribute('aria-describedby');\n }\n }\n}\n","import {\n Component,\n Input,\n HostBinding,\n ViewEncapsulation,\n OnChanges,\n OnInit,\n ChangeDetectionStrategy,\n OnDestroy,\n} from '@angular/core';\nimport { FudisButtonSize, FudisButtonType, FudisComponentChanges } from '../../types/miscellaneous';\nimport { ButtonBaseDirective } from '../../directives/button-base/button-base.directive';\nimport { FudisIdService } from '../../services/id/id.service';\nimport { CommonModule } from '@angular/common';\nimport { IconComponent } from '../icon/icon.component';\nimport { PopoverDirective } from '../../directives/popover/popover.directive';\n\n/**\n * Triggers an action or event.\n *\n * Use this component for primary user actions such as submitting forms, confirming choices, or\n * navigating workflows.\n */\n@Component({\n selector: 'fudis-button',\n templateUrl: './button.component.html',\n imports: [CommonModule, PopoverDirective, IconComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ButtonComponent extends ButtonBaseDirective implements OnChanges, OnInit, OnDestroy {\n constructor(_idService: FudisIdService) {\n super(_idService);\n }\n /**\n * Binding host CSS class to component wrapper\n */\n @HostBinding('class') protected _classes = 'fudis-button-host';\n\n /**\n * Text content of the button\n */\n @Input({ required: true }) label: string;\n\n /**\n * Button size: 'small' | 'medium' ('extra-small' not available for Button, only IconButton)\n */\n @Input() override size: Exclude<FudisButtonSize, 'extra-small'> = 'medium';\n\n /**\n * Button type: 'submit' | 'button'\n */\n @Input() type: FudisButtonType = 'button';\n\n ngOnChanges(changes: FudisComponentChanges<ButtonComponent>): void {\n const variant = changes.variant?.currentValue !== changes.variant?.previousValue;\n const disabled = changes.disabled?.currentValue !== changes.disabled?.previousValue;\n const size = changes.size?.currentValue !== changes.size?.previousValue;\n\n if (variant || disabled) {\n this._classList.next(this._getClasses());\n }\n\n if (size) {\n this._size = this.size;\n this._classList.next(this._getClasses());\n }\n }\n\n /**\n * Button click event\n */\n public buttonClick(event: Event): void {\n this.handleClick.emit(event);\n }\n\n /**\n * Handler blurring out\n */\n protected _handleButtonBlur(event: FocusEvent): void {\n this._focused = false;\n\n this.handleBlur.emit(event);\n }\n}\n","@if (popoverText) {\n <button\n fudisPopover\n #buttonElement\n [class]=\"_classList | async\"\n [type]=\"type\"\n (click)=\"!disabled && buttonClick($event)\"\n (blur)=\"!disabled && _handleButtonBlur($event)\"\n (focus)=\"!disabled && _handleButtonFocus($event)\"\n (keydown)=\"(!disabled)\"\n [attr.tabIndex]=\"disabled ? -1 : null\"\n [attr.aria-disabled]=\"disabled || null\"\n [attr.id]=\"id\"\n [popoverPosition]=\"popoverPosition\"\n [popoverText]=\"popoverText\"\n >\n @if (icon) {\n <div class=\"fudis-button__icon\">\n @if (_iconColor | async; as iconColor) {\n <fudis-icon\n class=\"fudis-button__icon__component\"\n [color]=\"iconColor\"\n [icon]=\"icon\"\n [rotate]=\"iconRotate\"\n ></fudis-icon>\n }\n </div>\n }\n {{ label }}\n </button>\n}\n\n@if (!popoverText) {\n <button\n #buttonElement\n [class]=\"_classList | async\"\n [type]=\"type\"\n (click)=\"!disabled && buttonClick($event)\"\n (blur)=\"!disabled && _handleButtonBlur($event)\"\n (focus)=\"!disabled && _handleButtonFocus($event)\"\n (keydown)=\"(!disabled)\"\n [attr.tabIndex]=\"disabled ? -1 : null\"\n [attr.aria-disabled]=\"disabled || null\"\n [attr.id]=\"id\"\n >\n @if (icon) {\n <div class=\"fudis-button__icon\">\n @if (_iconColor | async; as iconColor) {\n <fudis-icon\n class=\"fudis-button__icon__component\"\n [color]=\"iconColor\"\n [icon]=\"icon\"\n [rotate]=\"iconRotate\"\n ></fudis-icon>\n }\n </div>\n }\n {{ label }}</button\n >\n}\n","import { AbstractControl, FormControl, FormGroup, Validators } from '@angular/forms';\n\n/**\n * All of these functions are used to check if component's control has different validators. The\n * return value of these functions is usually assigned for internal variable to sort out wanted\n * logic.\n */\nexport const FudisValidatorUtilities = {\n required,\n oneRequiredOrMin,\n maxLength,\n minLength,\n max,\n min,\n minDate,\n maxDate,\n};\n\n/**\n * @param control\n * @returns If provided FormControl has 'required' validator\n */\nfunction required(control: AbstractControl): boolean {\n const nativeRequired = control.hasValidator(Validators.required);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const fudisRequired = !!control.validator?.('' as any as AbstractControl);\n\n if (nativeRequired || fudisRequired) {\n return true;\n }\n return false;\n}\n\n/**\n * @param group FormGroup\n * @returns If provided FormGroup has oneRequired or min validator\n */\nfunction oneRequiredOrMin(group: FormGroup): boolean {\n const validatorFn = group.validator;\n\n if (validatorFn === null) {\n return false;\n }\n\n const errors = validatorFn(\n new FormGroup({\n controlAsNull: new FormControl<boolean | null | undefined>(null),\n controlAsFalse: new FormControl<boolean | null | undefined>(false),\n controlAsEmptyString: new FormControl<string | null | undefined>(''),\n }),\n );\n\n const hasProperErrors: boolean = !!(errors?.['oneRequired'] || errors?.['min'].value > 0);\n\n return hasProperErrors;\n}\n/**\n * @param control\n * @returns If provided FormControl has max length value binded to its validators\n */\nfunction maxLength(control: AbstractControl): number | null {\n const validatorFn = control.validator;\n\n if (validatorFn === null) {\n return null;\n }\n\n const errors = validatorFn(new FormControl({ length: Infinity }));\n\n return errors?.['maxlength']?.requiredLength;\n}\n\n/**\n * @param control\n * @returns If provided FormControl has min length value binded to its validators\n */\nfunction minLength(control: AbstractControl): number | null {\n const validatorFn = control.validator;\n\n if (validatorFn === null) {\n return null;\n }\n\n const errors = validatorFn(new FormControl({ length: -Infinity }));\n\n return errors?.['minlength']?.requiredLength;\n}\n\n/**\n * @param control\n * @returns If provided FormControl has max value binded to its validators\n */\nfunction max(control: AbstractControl): number | null {\n const validatorFn = control.validator;\n\n if (validatorFn === null) {\n return null;\n }\n\n const errors = validatorFn(new FormControl(Infinity)) ?? {};\n return errors?.['max']?.max;\n}\n\n/**\n * @param control\n * @returns If provided FormControl has min value binded to its validators\n */\nfunction min(control: AbstractControl): number | null {\n const validatorFn = control.validator;\n\n if (validatorFn === null) {\n return null;\n }\n\n const errors = validatorFn(new FormControl(-Infinity)) ?? {};\n return errors?.['min']?.min;\n}\n\n/**\n * @param control\n * @returns If provided FormControl has datepickerMin value binded to its validators\n */\nfunction minDate(control: AbstractControl): Date | undefined {\n const validatorFn = control.validator;\n\n if (validatorFn === null) {\n return undefined;\n }\n\n const errors = validatorFn(new FormControl(new Date(1337, 0, 1)));\n const value = errors?.['datepickerMin']?.value;\n\n if (value) {\n const timezone = value.getTimezoneOffset() * 60000;\n\n const returnValue = new Date(value.getTime() - timezone);\n return returnValue;\n }\n return undefined;\n}\n\n/**\n * @param control\n * @returns If provided FormControl has datepickerMax value binded to its validators\n */\nfunction maxDate(control: AbstractControl): Date | undefined {\n const validatorFn = control.validator;\n\n if (validatorFn === null) {\n return undefined;\n }\n\n const errors = validatorFn(new FormControl(new Date(4242, 0, 1)));\n const value = errors?.['datepickerMax']?.value;\n\n if (value) {\n const timezone = value.getTimezoneOffset() * 60000;\n\n const returnValue = new Date(value.getTime() - timezone);\n return returnValue;\n }\n return undefined;\n}\n","import {\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n OnChanges,\n DestroyRef,\n inject,\n ChangeDetectionStrategy,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { FudisTranslationService } from '../../../services/translation/translation.service';\nimport {\n FudisCheckboxChangeEvent,\n FudisCheckboxOption,\n FudisComponentChanges,\n} from '../../../types/types';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FudisValidatorUtilities } from '../../../utilities/form/validator-utilities';\nimport { BehaviorSubject, Subject, Subscription } from 'rxjs';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { IconComponent } from '../../icon/icon.component';\nimport { AsyncPipe } from '@angular/common';\n\n/**\n * Represents a single boolean form control.\n *\n * Use this component when user need to toggle an option on or off.\n */\n@Component({\n selector: 'fudis-checkbox',\n templateUrl: './checkbox.component.html',\n imports: [FormsModule, ReactiveFormsModule, IconComponent, AsyncPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CheckboxComponent implements OnInit, OnChanges {\n constructor(\n private _idService: FudisIdService,\n protected _translationService: FudisTranslationService,\n ) {\n this._updateValueAndValidityTrigger.pipe(takeUntilDestroyed()).subscribe(() => {\n if (this.control) {\n this._required.next(FudisValidatorUtilities.required(this.control));\n }\n });\n }\n\n /**\n * FormControl for the input\n */\n @Input({ required: true }) control: FormControl;\n\n /**\n * Checkbox id. By default generated\n */\n @Input() id: string;\n\n /**\n * Label for the Checkbox\n */\n @Input() label: string;\n\n /**\n * AriaLabelledBy attribute to be used when visible label is not provided\n */\n @Input() ariaLabelledBy: string;\n\n /**\n * AriaDescribedBy attribute for linking custom error messages to Checkbox input\n */\n @Input() ariaDescribedBy: string;\n\n /**\n * Emits Checkbox change\n */\n @Output() handleChange = new EventEmitter<FudisCheckboxChangeEvent>();\n\n /**\n * Trigger update when control validator is changed\n */\n protected _updateValueAndValidityTrigger = new Subject<void>();\n\n /**\n * Set requiredText based on this boolean value\n */\n protected _required = new BehaviorSubject<boolean>(false);\n\n protected _destroyRef = inject(DestroyRef);\n\n /**\n * Subscription for handling the valueChanges observable\n */\n private _subscription: Subscription;\n\n /**\n * If Checkbox has focus\n */\n protected _focused = false;\n\n /**\n * Signals reflecting the current state of the form control, updated on every control event.\n */\n protected _touched: WritableSignal<boolean> = signal(false);\n protected _invalid: WritableSignal<boolean> = signal(false);\n protected _disabled: WritableSignal<boolean> = signal(false);\n protected _value: WritableSignal<boolean | null> = signal(null);\n\n /**\n * Copy FormControl states into local signals so the template tracks them reactively without\n * requiring markForCheck().\n */\n private _syncControlState(): void {\n this._touched.set(this.control.touched);\n this._invalid.set(this.control.invalid);\n this._disabled.set(this.control.disabled);\n this._value.set(this.control.value);\n }\n\n /**\n * When Checkbox is focused\n */\n protected _onFocus(): void {\n this._focused = true;\n }\n\n /**\n * When Checkbox is blurred\n */\n protected _onBlur(): void {\n this._focused = false;\n }\n\n /**\n * Manual toggle for checkbox checked state\n */\n protected _onChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const newValue = input.checked ? true : null;\n\n this.control.setValue(newValue);\n this.control.markAsTouched();\n this.control.updateValueAndValidity();\n\n const optionToEmit: FudisCheckboxOption<object> = {\n id: this.id,\n label: this.label,\n value: newValue,\n };\n\n // Emit after control updates\n this.handleChange.emit({ checkbox: optionToEmit, control: this.control });\n }\n\n ngOnInit() {\n if (this.id) {\n this._idService.addNewId('checkbox', this.id);\n } else {\n this.id = this._idService.getNewId('checkbox');\n }\n\n this._updateValueAndValidityTrigger.next();\n }\n\n /**\n * Sync local signals with FormControl states and add value and validity check when control value\n * changes.\n */\n ngOnChanges(changes: FudisComponentChanges<CheckboxComponent>): void {\n if (changes.control?.currentValue !== changes.control?.previousValue) {\n this._syncControlState();\n this._subscription?.unsubscribe();\n this._subscription = this.control.events\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => {\n this._syncControlState();\n this._updateValueAndValidityTrigger.next();\n });\n }\n }\n}\n","<div class=\"fudis-checkbox\">\n <label\n [attr.for]=\"id\"\n class=\"fudis-checkbox__label\"\n [class.fudis-checkbox__label--disabled]=\"_disabled()\"\n >\n <input\n type=\"checkbox\"\n class=\"fudis-checkbox__input\"\n [id]=\"id\"\n [formControl]=\"control\"\n [checked]=\"_value()\"\n [attr.aria-disabled]=\"_disabled()\"\n [attr.aria-required]=\"_required | async\"\n [attr.aria-describedby]=\"ariaDescribedBy\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.tabindex]=\"_disabled() ? -1 : null\"\n [attr.aria-invalid]=\"(_touched() && _invalid()) || null\"\n (focus)=\"_onFocus()\"\n (blur)=\"_onBlur()\"\n (change)=\"_onChange($event)\"\n />\n <div class=\"fudis-checkbox__content\" [class.fudis-checkbox__content__disabled]=\"_disabled()\">\n <div class=\"fudis-checkbox__content-wrapper\">\n <span\n class=\"fudis-checkbox__content__box\"\n [class.fudis-checkbox__content__box--focused]=\"_focused\"\n [class.fudis-checkbox__content__box--invalid]=\"(_touched() && _invalid()) || null\"\n [class.fudis-checkbox__content__box--disabled]=\"_disabled()\"\n >\n @if (_value()) {\n <fudis-icon [icon]=\"'check'\" class=\"fudis-checkbox__content__box__icon\" />\n }\n </span>\n </div>\n </div>\n @if (label) {\n <span class=\"fudis-checkbox__label__text\">{{ label }}</span>\n }\n </label>\n <ng-content></ng-content>\n @if (this._required | async) {\n <span class=\"fudis-checkbox__required\"\n >({{ _translationService.getTranslations()().REQUIRED }})</span\n >\n }\n</div>\n","import {\n AfterViewInit,\n DestroyRef,\n Directive,\n ElementRef,\n EventEmitter,\n inject,\n Input,\n Output,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { PopoverApiDirective } from '../../popover/popover-api.directive';\nimport { FudisIdComponent, FudisIdParent } from '../../../types/id';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { FudisFocusService } from '../../../services/focus/focus.service';\n\n@Directive({ selector: '[fudisFormCommonApi]' })\nexport class FormCommonApiDirective extends PopoverApiDirective implements AfterViewInit {\n constructor(\n protected _idService: FudisIdService,\n protected _focusService: FudisFocusService,\n ) {\n super();\n }\n\n /**\n * Template reference for input. Used in e. g. initialFocus\n */\n @ViewChild('inputRef') protected _inputRef: ElementRef<HTMLInputElement>;\n\n /**\n * Label for the form component.\n */\n @Input({ required: true }) label: string;\n\n /**\n * Provide additional information for screen reader users by extending text content of the label.\n * Used in e. g. Localized Text Group for providing info about currently selected language.\n */\n @Input() ariaLabel: string;\n\n /**\n * Input id. If not provided when component is initialized, generated by Id Service\n */\n @Input() id: string;\n\n /**\n * If component is a child of Form component, Form's Error Summary is visible, this component's\n * control has errors and when this component is loaded for the first time, it will by default\n * call Error Summary to reload itself again and mark control as touched. This is because if\n * component is lazy loaded to the DOM after the initial reload errors call was made, errors of\n * this component might not appear on the list. To disable this feature, set this to false.\n */\n @Input() errorSummaryReloadOnInit: boolean = true;\n\n /**\n * Help text, aligned underneath the input.\n */\n @Input() helpText: string | undefined;\n\n /**\n * Set browser focus to the input on the first load.\n */\n @Input() initialFocus: boolean = false;\n\n /**\n * Preferred way to disable input is to set formControl as disabled. This Input property should be\n * used in edge cases only.\n */\n @Input() disabled: boolean = false;\n\n /**\n * Disable guidance for this component instance. No help text or errors will be visible.\n */\n @Input() disableGuidance: boolean;\n\n /**\n * To listen for component's blur event.\n */\n @Output() handleBlur: EventEmitter<FocusEvent> = new EventEmitter<FocusEvent>();\n\n /**\n * To listen for component's focus event.\n */\n @Output() handleFocus: EventEmitter<FocusEvent> = new EventEmitter<FocusEvent>();\n\n /**\n * To listen for input's key up event.\n */\n @Output() handleKeyUp: EventEmitter<KeyboardEvent> = new EventEmitter<KeyboardEvent>();\n\n /**\n * Output emitted when component has finished AfterViewInit lifecycle hook\n */\n @Output() handleViewInit: EventEmitter<void> = new EventEmitter<void>();\n\n /**\n * Set requiredText based on this boolean value\n */\n protected _required = new BehaviorSubject<boolean>(false);\n\n protected _destroyRef = inject(DestroyRef);\n\n /**\n * Trigger update when control validator is changed\n */\n protected _updateValueAndValidityTrigger = new Subject<void>();\n\n /**\n * Used prevent checks in HTML DOM before content has been loaded\n */\n protected _afterViewInitDone = signal<boolean>(false);\n\n /**\n * Generate id for parent component\n */\n protected _setParentComponentId(parentType: FudisIdParent): void {\n if (this.id) {\n this._idService.addNewParentId(parentType, this.id);\n } else {\n this.id = this._idService.getNewParentId(parentType);\n }\n }\n\n /**\n * Add given id to Id Service or generate unique id\n */\n protected _setComponentId(componentType: FudisIdComponent): void {\n if (this.id) {\n this._idService.addNewId(componentType, this.id);\n } else {\n this.id = this._idService.getNewId(componentType);\n }\n }\n\n protected _afterViewInitCommon(): void {\n if (this.initialFocus && !this._focusService.isIgnored(this.id)) {\n this.focusToInput();\n }\n this._afterViewInitDone.set(true);\n this.handleViewInit.emit();\n }\n\n ngAfterViewInit(): void {\n this._afterViewInitCommon();\n }\n\n /**\n * Set focus to the input element\n */\n public focusToInput(): void {\n this._inputRef?.nativeElement?.focus();\n }\n\n /**\n * Executed when component's input is focused or when child input, e.g. Checkbox is focused\n */\n public onFocus(event: FocusEvent): void {\n this.handleFocus.emit(event);\n }\n}\n","import { Directive, Input } from '@angular/core';\nimport { FormCommonApiDirective } from '../form-common-api/form-common-api.directive';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { FormGroup } from '@angular/forms';\nimport { FudisFocusService } from '../../../services/focus/focus.service';\n\n@Directive({ selector: '[fudisGroupComponentBase]' })\nexport class GroupComponentBaseDirective extends FormCommonApiDirective {\n constructor(_idService: FudisIdService, _focusService: FudisFocusService) {\n super(_idService, _focusService);\n }\n\n /**\n * Angular FormGroup for the component\n */\n @Input() formGroup: FormGroup;\n}\n","import { Injectable, OnDestroy, signal, WritableSignal } from '@angular/core';\nimport {\n FudisErrorSummaryNewError,\n FudisErrorSummaryRemoveError,\n FudisFormErrorSummaryUpdateStrategy,\n FudisErrorSummaryAllErrors,\n FudisErrorSummaryAllErrorsSignal,\n} from '../../../types/errorSummary';\nimport { BehaviorSubject } from 'rxjs';\nimport { FudisTranslationService } from '../../translation/translation.service';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\n\ntype FudisFormErrorSummarySection = {\n id: string;\n formId: string;\n title: string;\n};\n\ntype FudisFormErrorSummaryFormChild = {\n [childId: string]: string;\n};\n\ntype FudisFormErrorSummaryStructure = {\n [formId: string]: {\n sections: FudisFormErrorSummaryFormChild;\n fieldsets: FudisFormErrorSummaryFormChild;\n };\n};\n/**\n * Internal Error Summary tools not exposed to public\n */\n@Injectable()\nexport class FudisInternalErrorSummaryService implements OnDestroy {\n constructor(private _translationService: FudisTranslationService) {\n toObservable(_translationService.getLanguageSignal())\n .pipe(takeUntilDestroyed())\n .subscribe(() => {\n this.focusToFormOnReload = null;\n });\n }\n\n // --------------------\n //\n // CLASS VARIABLES\n //\n // --------------------\n\n /**\n * Collection of all registered errors categorised by parent Form id. Used as \"temporary\" storage\n * and value will be passed to Observable when reloadFormErrors is called.\n */\n private _errorsStore: FudisErrorSummaryAllErrors = {};\n\n /**\n * Collection of all registered errors categorised by parent Form id. This Observable is updated\n * with new value only when reloadFormErrors is called.\n */\n private _errorsObservable = new BehaviorSubject<FudisErrorSummaryAllErrors>({});\n\n private _errorsSignal: FudisErrorSummaryAllErrorsSignal = {};\n\n /**\n * Current Form ids with their Error Summary Visibility status\n */\n private _errorSummaryVisibilityStatus: { [formId: string]: WritableSignal<boolean> } = {};\n\n /**\n * Collection of child Sections, Expandables and Fieldsets of each Form Component\n */\n private _formStructure: FudisFormErrorSummaryStructure = {};\n\n /**\n * Info to Error Summary Component if it should move user focus to updated list or not\n */\n private _focusToFormOnReload: string | null = null;\n\n /**\n * Update strategy of Error Summary\n */\n private _updateStrategy: FudisFormErrorSummaryUpdateStrategy = 'reloadOnly';\n\n /**\n * Used prevent unnecessary frequent Signal updates\n */\n private _reloadGuard: string[] = [];\n\n /**\n * Signal for counting submit attempts\n */\n private _submitAttempt = signal(0);\n\n // --------------------\n //\n // GETTERS & SETTERS FOR CLASS VARIABLES\n //\n // --------------------\n\n /**\n * Used in Components to listen to Reload updates\n */\n get errorsObservable(): BehaviorSubject<FudisErrorSummaryAllErrors> {\n return this._errorsObservable;\n }\n\n /**\n * For unit testing purposes\n */\n get errors(): FudisErrorSummaryAllErrors {\n return this._errorsStore;\n }\n\n /**\n * For unit testing purposes\n */\n get errorsSignal(): FudisErrorSummaryAllErrorsSignal {\n return this._errorsSignal;\n }\n\n /**\n * Used for firing focus to error summary when submitting\n */\n get submitAttempt() {\n return this._submitAttempt;\n }\n\n /**\n * Observable to store each Form's Error Summary's visibility status. Form component will listen\n * to these changes if visiblity changes elsewhere than the Input() prop\n */\n get errorSummaryVisibilityStatus(): { [formId: string]: WritableSignal<boolean> } {\n return this._errorSummaryVisibilityStatus;\n }\n\n get updateStrategy(): FudisFormErrorSummaryUpdateStrategy {\n return this._updateStrategy;\n }\n\n set updateStrategy(value: FudisFormErrorSummaryUpdateStrategy) {\n this._updateStrategy = value;\n }\n\n get focusToFormOnReload(): string | null {\n return this._focusToFormOnReload;\n }\n\n get formStructure(): FudisFormErrorSummaryStructure {\n return this._formStructure;\n }\n\n set focusToFormOnReload(value: string | null) {\n this._focusToFormOnReload = value;\n }\n\n /**\n * Hide or show Error Summary of specific Form Component\n *\n * @param formId Form to target\n * @param visible Hide or show Error Summary\n */\n public setErrorSummaryVisibility(formId: string, visible: boolean) {\n if (!this._errorSummaryVisibilityStatus[formId]) {\n this._errorSummaryVisibilityStatus[formId] = signal(visible);\n } else if (this._errorSummaryVisibilityStatus[formId]() !== visible) {\n this._errorSummaryVisibilityStatus[formId].set(visible);\n }\n }\n\n // --------------------\n //\n // ADD AND REMOVE ERRORS\n //\n // --------------------\n\n /**\n * Adds a new error to the list of current errors If new error item has a matching id on the list,\n * new error is tied to that error list object\n *\n * @param newError Form error summary item\n */\n public addError(newError: FudisErrorSummaryNewError): void {\n if (!this._errorsStore[newError.formId]) {\n this.registerNewForm(newError.formId);\n }\n const currentErrors = { ...this._errorsStore?.[newError.formId] };\n\n if (!currentErrors?.[newError.focusId]) {\n currentErrors[newError.focusId] = {};\n }\n\n const currentMessage = currentErrors[newError.focusId][newError.id];\n\n const messageChanged = currentMessage && currentMessage !== newError.message;\n\n const contentChanged = currentErrors?.[newError.focusId] && messageChanged;\n\n currentErrors[newError.focusId][newError.id] = newError.message;\n\n this._errorsStore[newError.formId] = currentErrors;\n\n const reloadErrors =\n (contentChanged || this._updateStrategy === 'all') &&\n !!this._errorSummaryVisibilityStatus?.[newError.formId]();\n\n if (reloadErrors) {\n this._focusToFormOnReload = null;\n\n this.reloadFormErrors(newError.formId, false);\n }\n }\n\n /**\n * Removes error object from the current errors list if it contains matching error id\n *\n * @param error Error object\n */\n public removeError(errorToRemove: FudisErrorSummaryRemoveError): void {\n const currentErrorsOfForm = { ...this._errorsStore[errorToRemove.formId] };\n\n if (currentErrorsOfForm[errorToRemove.focusId]?.[errorToRemove.id]) {\n delete currentErrorsOfForm[errorToRemove.focusId][errorToRemove.id];\n\n const otherErrors = Object.keys(currentErrorsOfForm[errorToRemove.focusId]).length;\n\n if (otherErrors === 0) {\n delete currentErrorsOfForm[errorToRemove.focusId];\n }\n\n this._errorsStore[errorToRemove.formId] = currentErrorsOfForm;\n\n const reloadErrors =\n (this._updateStrategy === 'onRemove' || this._updateStrategy === 'all') &&\n !!this._errorSummaryVisibilityStatus?.[errorToRemove.formId]();\n\n if (reloadErrors) {\n this._focusToFormOnReload = null;\n this.reloadFormErrors(errorToRemove.formId);\n }\n }\n }\n\n // --------------------\n //\n // RELOADING LIST OF ERRORS TO HTML DOM\n //\n // Functions to actually update Components which listen to Error changes. These will update the\n // Observables components are listening to.\n //\n // --------------------\n\n /**\n * Updates the visible and dynamic lists of all form and errors with the current error list\n */\n public reloadAllErrors(): void {\n Object.keys(this._errorsStore).forEach((key) => {\n if (this._errorSummaryVisibilityStatus[key]()) {\n this.reloadFormErrors(key, false);\n }\n });\n }\n\n /**\n * @param formId\n * @param focus\n */\n public reloadFormErrors(formId: string, focus?: boolean): void {\n if (focus) {\n this._focusToFormOnReload = formId;\n this._submitAttempt.update((submitCount) => submitCount + 1);\n } else {\n this._focusToFormOnReload = null;\n }\n\n const reloadConditions =\n !this._reloadGuard.includes(formId) &&\n this._errorsStore[formId] &&\n this._errorsSignal[formId];\n\n if (reloadConditions) {\n this._reloadGuard.push(formId);\n setTimeout(() => {\n this._errorsSignal[formId]?.set(this._errorsStore[formId]);\n this._errorsObservable.next({ ...this._errorsStore });\n\n this._reloadGuard.splice(this._reloadGuard.indexOf(formId), 1);\n }, 50);\n }\n }\n\n // --------------------\n //\n // DOM RELATED FUNCTIONS\n //\n // Usually called by Components when they are initialized and they register themselves to Error\n // Summary Service\n //\n // --------------------\n\n /**\n * @param element HTMLElement to check, if it has Form Component as ancestor\n * @returns If ancestor found, returns id of that Form and visibility status of Form's Error\n * Summary\n */\n public getFormAncestorId(element: HTMLElement): Promise<null | string> {\n let foundId: string | null = null;\n let tryCounter: number = 0;\n\n return new Promise((resolve) => {\n const interval = setInterval(() => {\n Object.keys(this._errorSummaryVisibilityStatus).find((id) => {\n if (element.closest(`#${id}`)) {\n foundId = id;\n }\n });\n\n if (foundId) {\n clearInterval(interval);\n resolve(foundId);\n } else if (tryCounter < 50) {\n tryCounter = tryCounter + 1;\n } else {\n clearInterval(interval);\n resolve(null);\n }\n }, 10);\n });\n }\n\n /**\n * When new Form Component is initialized, it will register itself for child components and error\n * messages related to it\n *\n * @param formId\n */\n public registerNewForm(formId: string, errorSummaryVisible: boolean = false): void {\n if (!this._formStructure[formId]) {\n this._formStructure[formId] = {\n sections: {},\n fieldsets: {},\n };\n }\n\n if (!this._errorSummaryVisibilityStatus[formId]) {\n this._errorSummaryVisibilityStatus[formId] = signal(errorSummaryVisible);\n }\n\n if (!this._errorsSignal[formId]) {\n this._errorsSignal[formId] = signal({});\n }\n\n if (!this._errorsStore[formId]) {\n this._errorsStore[formId] = {};\n }\n }\n\n /**\n * When Form Component is destroyed, it will remove itself from the service\n *\n * @param formId\n */\n public removeForm(formId: string): void {\n if (this._errorsStore[formId]) {\n delete this._errorsStore[formId];\n }\n\n if (this._errorsSignal[formId]) {\n delete this._errorsSignal[formId];\n }\n\n if (this._formStructure[formId]) {\n delete this._formStructure[formId];\n }\n\n if (this._errorSummaryVisibilityStatus[formId]) {\n delete this._errorSummaryVisibilityStatus[formId];\n }\n }\n\n /**\n * Adds new fieldset to the list of current fieldsets If a fieldset with a matching id exists,\n * replace the old fieldset with the new one\n *\n * @param fieldset Form error summary fieldset\n */\n public addFieldset(fieldset: FudisFormErrorSummarySection): void {\n if (this._formStructure?.[fieldset.formId]) {\n this._formStructure[fieldset.formId].fieldsets[fieldset.id] = fieldset.title;\n }\n }\n\n /**\n * Removes the fieldset from the current fieldsets\n *\n * @param fieldset Form error summary fieldset\n */\n public removeFieldset(formId: string, fieldsetId: string): void {\n delete this._formStructure?.[formId]?.fieldsets[fieldsetId];\n }\n\n /**\n * Adds new section to the list of current sections If a section with a matching id exists,\n * replace the old section with the new one\n *\n * @param section Form error summary section\n */\n public addSection(section: FudisFormErrorSummarySection): void {\n if (this._formStructure?.[section.formId]) {\n this._formStructure[section.formId].sections[section.id] = section.title;\n }\n }\n\n /**\n * Removes the section from the current sections\n *\n * @param section Form error summary section\n */\n public removeSection(formId: string, sectionId: string): void {\n delete this._formStructure?.[formId]?.sections[sectionId];\n }\n\n // --------------------\n //\n // MISC\n //\n // --------------------\n\n ngOnDestroy(): void {\n this._errorsObservable.complete();\n }\n\n /**\n * Returns an error id including a control name if one is given\n *\n * @param id Id of the form error summary item\n * @param controlName Control name of the form error summary item\n */\n public defineErrorId(id: string, controlName: string | undefined): string {\n return controlName ? `${id}_${controlName}` : id;\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n} from '@angular/core';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { FudisInternalErrorSummaryService } from '../../../../services/form/error-summary/internal-error-summary.service';\nimport { FudisIdService } from '../../../../services/id/id.service';\nimport {\n FudisErrorSummaryNewError,\n FudisErrorSummaryRemoveError,\n} from '../../../../types/errorSummary';\nimport { FudisComponentChanges } from '../../../../types/miscellaneous';\nimport { AsyncPipe } from '@angular/common';\n\n@Component({\n selector: 'fudis-validator-error-message',\n templateUrl: './validator-error-message.component.html',\n styleUrls: ['./validator-error-message.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AsyncPipe],\n})\nexport class ValidatorErrorMessageComponent implements OnChanges, OnDestroy, AfterViewInit {\n constructor(\n private _errorSummaryService: FudisInternalErrorSummaryService,\n private _idService: FudisIdService,\n ) {\n this._id = _idService.getNewId('validator-error-message');\n }\n\n /**\n * Id of input this message is related to. Sent to Error Summary service.\n */\n @Input({ required: true }) focusId: string;\n\n /**\n * Label text of input this message is related to. Sent to Error Summary service.\n */\n @Input({ required: true }) label: string;\n\n /**\n * Error type from different keys in e. g. control.errors such as 'required' and 'minlength'\n */\n @Input({ required: true }) type: string;\n\n /**\n * Error message to display\n */\n @Input({ required: true }) message: Observable<string> | string;\n\n /**\n * Is error visible or not\n */\n @Input() visible: boolean = false;\n\n /**\n * Name of control this error is related to.\n */\n @Input() controlName: string | undefined = undefined;\n\n /**\n * Visual variant of error message\n */\n @Input() variant: 'body-text' | 'form-error' = 'form-error';\n\n /**\n * Id of parent Form component\n */\n @Input() formId: string | null;\n\n /**\n * Output for handling a state when error is sent to Error Summary\n */\n @Output() handleCreateError = new EventEmitter<FudisErrorSummaryNewError>();\n\n /**\n * Output for handling a state when error is removed from Error Summary\n */\n @Output() handleRemoveError = new EventEmitter<FudisErrorSummaryRemoveError>();\n\n /**\n * Error message to include in error summary item\n */\n protected _currentMessage = new BehaviorSubject<string>('');\n\n /**\n * Id generated with FudisIdService\n */\n protected _id: string;\n\n /**\n * Has error been created and sent forward\n */\n private _errorSent: boolean = false;\n\n /**\n * Disposable object for preserving message as Observable string\n */\n private _messageSubscribtion: Subscription;\n\n private _subscribeToMessage(message: Observable<string>): void {\n this._messageSubscribtion = message.subscribe((value: string) => {\n if (this._currentMessage.value !== value) {\n this._currentMessage.next(value);\n this._createError();\n }\n });\n }\n\n ngAfterViewInit(): void {\n setTimeout(() => {\n if (typeof this.message !== 'string' && !this.message) {\n this.throwError();\n }\n }, 1000);\n }\n\n ngOnChanges(changes: FudisComponentChanges<ValidatorErrorMessageComponent>): void {\n if (\n changes.message?.currentValue !== changes.message?.previousValue ||\n changes.label?.currentValue !== changes.label?.previousValue ||\n changes.formId?.currentValue !== changes.formId?.previousValue\n ) {\n const newMessage = changes.message?.currentValue;\n const newLabel = changes.label?.currentValue;\n const newFormId = changes.formId?.currentValue;\n\n if (newMessage) {\n if (typeof newMessage === 'string') {\n this._currentMessage.next(newMessage);\n this._createError();\n } else {\n this._subscribeToMessage(newMessage);\n }\n }\n\n if (newLabel) {\n this._createError();\n }\n\n if (newFormId) {\n this._createError();\n }\n }\n }\n\n ngOnDestroy(): void {\n this._removeError();\n\n if (this._messageSubscribtion) {\n this._messageSubscribtion.unsubscribe();\n }\n }\n\n throwError(): void {\n if (this.controlName) {\n console.warn(\n `Fudis component with id of '${this.focusId}' and control name of '${this.controlName}' is missing error message for error type of: '${this.type}'`,\n );\n } else {\n console.warn(\n `Fudis component with id of '${this.focusId}' is missing error message for error type of: '${this.type}'`,\n );\n }\n }\n\n /**\n * Create new error to be sent to Error Summary\n */\n private _createError(): void {\n if (this.formId && this.focusId && this._currentMessage.value) {\n const newError: FudisErrorSummaryNewError = {\n focusId: this.focusId,\n formId: this.formId,\n message: `${this.label}: ${this._currentMessage.value}`,\n id: this.controlName ? `${this.type}_${this.controlName}` : this.type,\n };\n\n this._errorSummaryService.addError(newError);\n this._errorSent = true;\n\n // Emit in a microtask only after the current change detection cycle.\n // This ensures that the OnPush components using Guidance detects the updated state.\n // Emitting synchronously from ngOnChanges would otherwise break change detection, and in some cases cause NG0100 errors.\n queueMicrotask(() => {\n this.handleCreateError.emit(newError);\n });\n }\n }\n\n /**\n * Remove existing error from Error Summary\n */\n private _removeError(): void {\n if (this._errorSent && this.formId) {\n const errorToRemove: FudisErrorSummaryRemoveError = {\n focusId: this.focusId,\n formId: this.formId,\n id: this.controlName ? `${this.type}_${this.controlName}` : this.type,\n };\n\n this._errorSummaryService.removeError(errorToRemove);\n this.handleRemoveError.emit(errorToRemove);\n }\n }\n}\n","@if (visible && (_currentMessage | async); as message) {\n <p [id]=\"_id\" class=\"fudis-error-message fudis-error-message__{{ variant }}\">{{ message }}</p>\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n ElementRef,\n Input,\n OnChanges,\n OnInit,\n effect,\n inject,\n AfterContentInit,\n signal,\n AfterViewInit,\n Injector,\n WritableSignal,\n} from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { FudisTranslationService } from '../../../services/translation/translation.service';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { FudisInternalErrorSummaryService } from '../../../services/form/error-summary/internal-error-summary.service';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { FudisComponentChanges } from '../../../types/miscellaneous';\nimport { FudisErrorSummaryNewError } from '../../../types/errorSummary';\nimport { IconComponent } from '../../icon/icon.component';\nimport { ValidatorErrorMessageComponent } from '../error-message/validator-error-message/validator-error-message.component';\nimport { KeyValuePipe } from '@angular/common';\n\n@Component({\n selector: 'fudis-guidance',\n templateUrl: './guidance.component.html',\n styleUrls: ['./guidance.component.scss'],\n imports: [IconComponent, ValidatorErrorMessageComponent, KeyValuePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class GuidanceComponent implements OnChanges, OnInit, AfterContentInit, AfterViewInit {\n constructor(\n private _translationService: FudisTranslationService,\n private _idService: FudisIdService,\n private _errorSummaryService: FudisInternalErrorSummaryService,\n private _elementRef: ElementRef,\n ) {\n this._id = _idService.getNewId('guidance');\n\n effect(() => {\n this._maxLengthText.set(_translationService.getTranslations()().TEXTINPUT.MAX_LENGTH);\n });\n }\n\n /**\n * Id of input, fieldset or similar which Guidance is related to. Used in aria attributes and in\n * emit information for Error Summary Service.\n */\n @Input({ required: true }) for: string;\n\n /**\n * Label text of input, fieldset or similar Guidance is related to. Used in emit information for\n * Error Summary service.\n */\n @Input({ required: true }) inputLabel: string;\n\n /**\n * FormControl of related input.\n */\n @Input() control: FormControl;\n\n /**\n * FormGroup of related FormGroup. E.g. LocalizedTextGroup with FormGroup\n */\n @Input() formGroup: FormGroup;\n\n /**\n * Text displayed as guidance help text.\n */\n @Input() helpText: string | undefined;\n\n /**\n * When set displays also a character count indicator.\n */\n @Input() maxLength: number | null = null;\n\n /**\n * Used to match FormControl value for the Localized Text Group component so that the component\n * can display the length of the entered input for the connected language option.\n */\n @Input() selectedOption: string;\n\n /**\n * Used with together with Checkbox Group component, to display errors only when focus has moved\n * outside of whole Checkbox Group.\n */\n @Input() groupBlurredOut: boolean = true;\n\n /**\n * Hide visible helptext from screen readers when group components E.g. Radio Button Group and\n * Checkbox Group components are used.\n */\n @Input() groupHelpTextHidden: boolean = false;\n\n /**\n * Assistive text of max character count for screen readers. E. g. \"5/20 characters used\" where\n * \"characters used\" is \"maxLengthText\".\n */\n protected _maxLengthText: WritableSignal<string> = signal<string>('');\n\n /**\n * Number of characters left when screen reader is alerted about input max length\n */\n protected _maxLengthAlertThreshold: number;\n\n /**\n * The width of the character-limit-indicator, determined by how many digits are in the maxLength\n * input value\n */\n protected _maxLengthWidth: 'sm' | 'md' | 'lg';\n\n /**\n * Id from IdService\n */\n protected _id: string;\n\n /**\n * Collection of validation errors\n */\n protected _lazyLoadedErrors: string[] = [];\n\n protected _parentFormId: WritableSignal<string | null> = signal<string | null>(null);\n\n /**\n * Used prevent checks in HTML DOM before content has been loaded\n */\n protected _afterViewInitDone: WritableSignal<boolean> = signal<boolean>(false);\n\n /**\n * To prevent Error Summary reloading after lazy load check\n */\n private _reloadGuard = false;\n\n private _cdr = inject(ChangeDetectorRef);\n private _destroyRef = inject(DestroyRef);\n private _injector = inject(Injector);\n\n ngOnInit(): void {\n this._setCharacterLimitIndicatorValues();\n }\n\n ngOnChanges(changes: FudisComponentChanges<GuidanceComponent>): void {\n if (changes.maxLength?.currentValue !== changes.maxLength?.previousValue) {\n this._setCharacterLimitIndicatorValues();\n }\n\n if (changes.control) {\n this.control?.events\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => this._cdr.markForCheck());\n }\n\n if (changes.formGroup) {\n this.formGroup?.events\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => this._cdr.markForCheck());\n }\n }\n\n ngAfterContentInit(): void {\n this._errorSummaryService\n .getFormAncestorId(this._elementRef.nativeElement as HTMLElement)\n .then((formParentId) => {\n if (formParentId) {\n this._parentFormId.set(formParentId);\n this._subscribeToErrors(formParentId);\n } else {\n this._parentFormId.set(null);\n }\n });\n }\n\n ngAfterViewInit(): void {\n this._afterViewInitDone.set(true);\n\n setTimeout(() => {\n this._reloadGuard = true;\n }, 100);\n }\n\n private _subscribeToErrors(formId: string): void {\n /**\n * If there's a function call of errorSummaryService.reloadFormErrors('id-of-this-form'), and\n * this Guidance's parent Form id is that 'id-for-this-form', this effect() check will trigger\n * and set this Guidance's control / group as touched, so possible errors are set as visible.\n */\n\n toObservable(this._errorSummaryService.errorsSignal[formId], {\n injector: this._injector,\n }).subscribe((errors) => {\n let errorsFound = !!errors?.[this.for];\n // With FormGroups errors are defined differently, so this checks if FormGroups control has errors\n if (this.formGroup && !errorsFound) {\n errorsFound = Object.keys(this.formGroup.controls).some((controlName) => {\n const errorId = this._errorSummaryService.defineErrorId(this.for, controlName);\n\n return !!errors?.[errorId];\n });\n }\n\n if (errorsFound) {\n if (this.control?.invalid) {\n this.control.markAsTouched();\n } else if (this.formGroup?.invalid) {\n this.formGroup.markAllAsTouched();\n }\n }\n });\n }\n\n private _setCharacterLimitIndicatorValues(): void {\n if (this.maxLength) {\n this._maxLengthWidth = this.maxLength >= 100 ? 'lg' : this.maxLength >= 10 ? 'md' : 'sm';\n this._maxLengthAlertThreshold = this.maxLength - 5;\n }\n }\n\n /**\n * This function is triggered, if this component is loaded to the DOM after Error Summary has been\n * loaded and there are new validation errors which didn't exist at the time original reload\n * errors call was made. It should only trigger reload one time, when all errors of this Guidance\n * are registered.\n */\n protected _reloadErrorSummaryOnLazyLoad(error: FudisErrorSummaryNewError): void {\n if (\n this._parentFormId() &&\n this._errorSummaryService.errorSummaryVisibilityStatus[this._parentFormId()!]() &&\n !this._lazyLoadedErrors.includes(error.id)\n ) {\n this._lazyLoadedErrors.push(error.id);\n this._errorSummaryService.focusToFormOnReload = null;\n\n let numberOfErrors = 0;\n\n if (this.control?.errors) {\n numberOfErrors = numberOfErrors + Object.keys(this.control.errors).length;\n }\n\n if (this.formGroup) {\n if (this.formGroup.errors) {\n numberOfErrors = numberOfErrors + Object.keys(this.formGroup.errors).length;\n }\n\n Object.keys(this.formGroup.controls).forEach((control) => {\n const controlErrors = this.formGroup.controls[control]?.errors;\n\n if (controlErrors) {\n numberOfErrors = numberOfErrors + Object.keys(controlErrors).length;\n }\n });\n }\n\n if (numberOfErrors === this._lazyLoadedErrors.length && !this._reloadGuard) {\n /**\n * NOTE: This function currently runs before _subscribeToErrors which is not how it ideally\n * should be working (or was initially intended). The triggering happens because\n * handleCreateError Output is emitted from child component during the current change\n * detection. It is now deferred by using queueMicrotask, which runs after the current\n * change detection cycle, to ensure that OnPush components can detect changes.\n */\n this._errorSummaryService.reloadFormErrors(this._parentFormId()!, false);\n }\n }\n }\n}\n","@let parentFormId = _parentFormId();\n\n<div class=\"fudis-guidance\" [id]=\"_id\">\n <div [id]=\"for + '_guidance'\">\n <div\n [id]=\"_id + '-errors'\"\n [class.fudis-guidance__errors]=\"\n _afterViewInitDone() &&\n ((control && control.touched) || (formGroup && formGroup.touched && groupBlurredOut))\n \"\n >\n @if (\n (control?.invalid && control?.touched) ||\n (formGroup?.invalid && formGroup?.touched && groupBlurredOut)\n ) {\n <fudis-icon [icon]=\"'alert-fill'\" />\n }\n <div class=\"fudis-guidance__errors__list\">\n <!--\n Check errors for each control FormGroup e. g. english, finnish, swedish\n -->\n @if (formGroup?.controls && !control && !formGroup?.errors) {\n @for (singleControl of formGroup?.controls | keyvalue; track singleControl.key) {\n @if (singleControl.value.errors) {\n @for (error of singleControl.value.errors | keyvalue; track error.key) {\n @if (error.value.message) {\n <fudis-validator-error-message\n (handleCreateError)=\"_reloadErrorSummaryOnLazyLoad($event)\"\n [formId]=\"parentFormId\"\n [focusId]=\"for\"\n [visible]=\"\n !!((singleControl.value.touched || formGroup.touched) && groupBlurredOut)\n \"\n [type]=\"error.key\"\n [controlName]=\"singleControl.key\"\n [label]=\"inputLabel\"\n [message]=\"error.value.message\"\n />\n }\n }\n }\n }\n }\n\n <!--\n Check parent level errors of FormGroup e. g. oneRequired\n -->\n @if (formGroup?.errors && formGroup?.invalid) {\n @for (error of formGroup?.errors | keyvalue; track error.key) {\n @if (error.value?.message) {\n <fudis-validator-error-message\n (handleCreateError)=\"_reloadErrorSummaryOnLazyLoad($event)\"\n [formId]=\"parentFormId\"\n [visible]=\"!!(formGroup.touched && groupBlurredOut)\"\n [focusId]=\"for\"\n [type]=\"error.key\"\n [label]=\"inputLabel\"\n [message]=\"error.value?.message\"\n />\n }\n }\n }\n\n <!--\n Check errors for single FormControl e. g. single text-input with maxlength error\n -->\n @if (control?.errors && !formGroup) {\n @for (error of control.errors | keyvalue; track error.key) {\n @if (error.value?.message) {\n <fudis-validator-error-message\n (handleCreateError)=\"_reloadErrorSummaryOnLazyLoad($event)\"\n [formId]=\"parentFormId\"\n [visible]=\"control.touched\"\n [focusId]=\"for\"\n [type]=\"error.key\"\n [label]=\"inputLabel\"\n [message]=\"error.value?.message\"\n />\n }\n }\n }\n <ng-content />\n </div>\n </div>\n\n @if (helpText || (control && maxLength)) {\n <p [attr.aria-hidden]=\"groupHelpTextHidden\" class=\"fudis-guidance__help-text\">\n @if (helpText) {\n {{ helpText }}\n }\n </p>\n }\n </div>\n @if (maxLength && control) {\n <small\n class=\"fudis-guidance__character-limit-indicator fudis-guidance__character-limit-indicator__{{\n _maxLengthWidth\n }}\"\n [class.fudis-guidance__character-limit-indicator__float-right]=\"!helpText\"\n >\n {{ control.value?.length || 0 }}/{{ maxLength }}\n <span class=\"fudis-visually-hidden\">{{ _maxLengthText() }}</span>\n </small>\n }\n @if (formGroup?.controls && !control && maxLength) {\n @for (singleControl of formGroup?.controls | keyvalue; track singleControl.key) {\n @if (singleControl.key === selectedOption) {\n <small\n class=\"fudis-guidance__character-limit-indicator fudis-guidance__character-limit-indicator__{{\n _maxLengthWidth\n }}\"\n [class.fudis-guidance__character-limit-indicator__float-right]=\"!helpText\"\n >\n {{ singleControl.value.value?.length || 0 }}/{{ maxLength }}\n <span class=\"fudis-visually-hidden\">{{ _maxLengthText() }}</span>\n </small>\n }\n @if (\n singleControl.value.value?.length === _maxLengthAlertThreshold ||\n singleControl.value.value?.length === maxLength\n ) {\n <p\n class=\"fudis-guidance__character-limit-indicator__alert fudis-visually-hidden\"\n role=\"alert\"\n >\n {{ singleControl.value.value?.length || 0 }}/{{ maxLength }} {{ _maxLengthText() }}</p\n >\n }\n }\n }\n</div>\n@if (\n control &&\n maxLength &&\n (control.value?.length === _maxLengthAlertThreshold || control.value?.length === maxLength)\n) {\n <p class=\"fudis-guidance__character-limit-indicator__alert fudis-visually-hidden\" role=\"alert\"\n >{{ control.value?.length || 0 }}/{{ maxLength }} {{ _maxLengthText() }}</p\n >\n}\n","import { FudisGridProperties, FudisGridPropertyCollection } from '../../types/grid';\n\n/**\n * Utility function used with GridDirective. Takes in object of Input() attributes and creates CSS\n * classlist out of those to be passed to Grid element.\n */\nexport const getGridClasses = (values: FudisGridProperties): string => {\n const classList = [\n 'fudis-grid',\n `fudis-grid__${values.width}`,\n `fudis-grid__align__${values.align}`,\n values.rowGap === 'responsive' ? '' : `fudis-grid__row-gap__${values.rowGap}`,\n values.columnGap === 'responsive' ? '' : `fudis-grid__column-gap__${values.columnGap}`,\n ];\n\n if (values.classes) {\n classList.push(values.classes);\n }\n\n return classList\n .filter((item) => {\n return !!item;\n })\n .join(' ');\n};\n\nexport const replaceFormInputWidthsToRem = (value: string): string => {\n const convertMap: { [key: string]: string } = {\n inputXs: 'calc(4rem / var(--fudis-rem-multiplier))',\n inputSm: 'calc(10rem / var(--fudis-rem-multiplier))',\n inputMd: 'calc(14rem / var(--fudis-rem-multiplier))',\n inputLg: 'calc(23rem / var(--fudis-rem-multiplier))',\n };\n\n const valueArray = value.split(' ');\n\n valueArray.forEach((value, index) => {\n valueArray[index] = convertMap?.[value] ? convertMap[value] : value;\n });\n\n return valueArray.join(' ');\n};\n\n/**\n * Utility function to convert parameters to either Grid CSS value 'grid-column-template' or CSS\n * grid item value 'grid-column'\n */\nexport const getGridCssValue = (value: number | string, isGridItem?: boolean): string => {\n if (typeof value === 'number') {\n if (!isGridItem) {\n return `repeat(${value}, 1fr)`;\n }\n return `span ${value}`;\n }\n if (value === 'stretch' && isGridItem) {\n return '1/-1';\n }\n\n if (value !== 'start' && value !== 'stretch' && value !== 'end' && value !== 'center') {\n return replaceFormInputWidthsToRem(value);\n }\n\n return value;\n};\n\n/**\n * Determine Grid Input Properties based on if Service defaults should be ignored or if application\n * has provided values\n */\nexport const getValuesForCSSClasses = (\n properties: FudisGridPropertyCollection,\n serviceDefaults: boolean,\n): FudisGridProperties => {\n const { defaultValues, serviceValues, appValues } = properties;\n\n if (!serviceDefaults) {\n /**\n * Set values from Inputs, if not provided, use default values. Ignore default values from\n * FudisGridService\n */\n return {\n width: appValues.width ?? defaultValues.width,\n align: appValues.align ?? defaultValues.align,\n alignItemsX: appValues.alignItemsX ?? defaultValues.alignItemsX,\n alignItemsY: appValues.alignItemsY ?? defaultValues.alignItemsY,\n rowGap: appValues.rowGap ?? defaultValues.rowGap,\n columnGap: appValues.columnGap ?? defaultValues.columnGap,\n classes: appValues.classes ?? defaultValues.classes,\n };\n } else {\n /**\n * Set values from Inputs, if not provided, check if FudisGridService has defaults, if not, use\n * defaults.\n */\n return {\n width: appValues.width ?? serviceValues.width ?? defaultValues.width,\n align: appValues.align ?? serviceValues.align ?? defaultValues.align,\n alignItemsX: appValues.alignItemsX ?? serviceValues.alignItemsX ?? defaultValues.alignItemsX,\n alignItemsY: appValues.alignItemsY ?? serviceValues.alignItemsY ?? defaultValues.alignItemsY,\n rowGap: appValues.rowGap ?? serviceValues.rowGap ?? defaultValues.rowGap,\n columnGap: appValues.columnGap ?? serviceValues.columnGap ?? defaultValues.columnGap,\n classes: appValues.classes ?? serviceValues.classes ?? defaultValues.classes,\n };\n }\n};\n","import { Directive, Input } from '@angular/core';\nimport {\n FudisGridWidth,\n FudisGridGap,\n FudisGridAlign,\n FudisGridAlignItems,\n FudisGridColumns,\n} from '../../../types/grid';\n\n@Directive({ selector: '[fudisGridApi]' })\nexport class GridApiDirective {\n /**\n * Alignment of Grid component inside its parent: 'start' | 'end' | 'center'\n */\n @Input() align: FudisGridAlign = 'start';\n\n /**\n * Horizontal alignment of Grid Items in a row: 'start' | 'center' | 'end' | 'stretch' |\n * 'baseline'\n */\n @Input() alignItemsX: FudisGridAlignItems = 'stretch';\n\n /**\n * Vertical alignment of Grid Items in a row: 'start' | 'center' | 'end' | 'stretch' | 'baseline'\n */\n @Input() alignItemsY: FudisGridAlignItems = 'stretch';\n\n /**\n * Custom CSS classes for Grid element.\n */\n @Input() classes: string;\n\n /**\n * Gutter gap between columns: 'none' | 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl' |\n * 'responsive'\n */\n @Input() columnGap: FudisGridGap = 'responsive';\n\n /**\n * Setting of columns for the Grid. Input will be converted to native CSS grid\n * grid-template-columns values.\n */\n @Input() columns: FudisGridColumns = '1fr';\n\n /**\n * To make Grid ignore default values defined by application and FudisGridService\n */\n @Input() serviceDefaults: boolean = true;\n\n /**\n * Grid row gap: 'none' | 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl' | 'responsive'\n */\n @Input() rowGap: FudisGridGap = 'none';\n\n /**\n * Maximum width of Grid: 'xxl' | 'xl' | 'lg' | 'md' | 'sm' | 'xs' | 'initial' | 'full-width'.\n * When viewport gets narrower, grid automatically adjusts to lower sizes, except in full-width\n * mode.\n */\n @Input() width: FudisGridWidth = 'xxl';\n}\n","import { FudisBreakpointKey } from './breakpoint-keys';\nimport { FudisBreakpointValueResponsive } from './breakpoints';\nimport { FudisSpacing } from './spacing';\n\n// --------------------\n//\n// Grid related types\n//\n// --------------------\n\n/**\n * Default 'columns' value for Grid component\n */\nexport const gridColumnDefault = '1fr';\n\nexport const gridInputPropertyDefaults: FudisDefaultGridProperties = {\n align: 'start',\n alignItemsX: 'stretch',\n alignItemsY: 'stretch',\n classes: undefined,\n columnGap: 'responsive',\n rowGap: 'responsive',\n width: 'xxl',\n};\n\n/**\n * Grid Columns property accepted input values\n */\nexport type FudisGridColumns = string | number | FudisGridColumnsResponsive;\n\n/**\n * Grid widths\n */\nexport const fudisGridWidthArray = [\n 'xxl',\n 'xl',\n 'lg',\n 'md',\n 'sm',\n 'xs',\n 'initial',\n 'full-width',\n] as const;\nexport type FudisGridWidth = (typeof fudisGridWidthArray)[number];\n\n/**\n * Alignment of whole Grid inside its container. For items inside the Grid use FudisGridAlignItems.\n */\nexport const fudisGridAlignArray = ['start', 'end', 'center'] as const;\nexport type FudisGridAlign = (typeof fudisGridAlignArray)[number];\n\n/**\n * Alignment of Grid Items inside a Grid\n */\nexport const fudisGridAlignItemsArray = ['start', 'center', 'end', 'stretch', 'baseline'] as const;\nexport type FudisGridAlignItems = (typeof fudisGridAlignItemsArray)[number];\n\n/**\n * Spacing between columns and rows inside Grid\n */\nexport type FudisGridGap = FudisSpacing | 'responsive';\n\n/**\n * Input object from application to provide responsive settings for different breakpoints for Grid\n */\nexport type FudisGridColumnsResponsive = {\n [key in FudisBreakpointKey]?: string | number;\n};\n\n/**\n * Base attributes for managing Grid\n */\ninterface FudisGridBase {\n align?: FudisGridAlign;\n alignItemsY?: FudisGridAlignItems;\n alignItemsX?: FudisGridAlignItems;\n classes?: string;\n columnGap?: FudisGridGap;\n rowGap?: FudisGridGap;\n width?: FudisGridWidth;\n}\n\n/**\n * Attributes for managing Grid properties\n */\nexport interface FudisGridProperties extends FudisGridBase {\n columns?: FudisBreakpointValueResponsive | string | number;\n}\n\n/**\n * Attributes for managing Grid defaults\n */\nexport interface FudisDefaultGridProperties extends FudisGridBase {\n columns?: FudisBreakpointValueResponsive;\n}\n\nexport interface FudisGridPropertyCollection {\n appValues: FudisGridProperties;\n defaultValues: FudisDefaultGridProperties;\n serviceValues: FudisDefaultGridProperties;\n}\n\n// --------------------\n//\n// Grid Item related types\n//\n// --------------------\n\n/**\n * Default value for 'columns' input of Grid Item\n */\nexport const gridItemDefault = 'auto';\n\n/**\n * Alignment of Grid Item inside Grid\n */\nexport type FudisGridItemAlignment = 'start' | 'end' | 'center' | 'stretch';\n\n/**\n * Alignment of Grid Item inside Grid for varying breakpoints\n */\nexport type FudisGridItemAlignResponsive = {\n [K in FudisBreakpointKey]?: FudisGridItemAlignment;\n};\n\n/**\n * Input value for width of Grid Item\n */\nexport type FudisGridItemWidth = number | string | 'stretch' | 'auto';\n\n/**\n * Input object from application to provide responsive settings for different breakpoints for Grid\n * Item\n */\nexport type FudisGridItemColumnsResponsive = {\n [K in FudisBreakpointKey]?: FudisGridItemWidth;\n};\n\n/**\n * Grid input widths\n */\nexport type FudisGridFormInputWidth = 'inputXs' | 'inputSm' | 'inputMd' | 'inputLg';\n","import { FudisBreakpointKey } from './breakpoint-keys';\nimport { FudisSpacing } from './spacing';\n\ntype FudisBreakpointsMinWidths = {\n [key in FudisBreakpointKey]: FudisBreakpointBoundary;\n};\n\n/**\n * Utility object used with breakpointsMinWidthToObserve and BreakpointObserver\n */\nexport const fudisBreakpointsMinWidth: FudisBreakpointsMinWidths = {\n xxl: '(min-width: 100em)',\n xl: '(min-width: 75em)',\n lg: '(min-width: 62em)',\n md: '(min-width: 48em)',\n sm: '(min-width: 36em)',\n xs: '(min-width: 0)',\n default: '(min-width: 0)',\n};\n\n/*\n * Array of breakpoint rules to observe, which is given to ngMaterial BreakpointObserver\n */\nexport const breakpointsMinWidthToObserve: FudisBreakpointBoundary[] = [\n fudisBreakpointsMinWidth.xxl,\n fudisBreakpointsMinWidth.xl,\n fudisBreakpointsMinWidth.lg,\n fudisBreakpointsMinWidth.md,\n fudisBreakpointsMinWidth.sm,\n fudisBreakpointsMinWidth.xs,\n fudisBreakpointsMinWidth.default,\n];\n\n/**\n * All the allowed style attributes that can be given to Grid or Spacing\n */\nexport type FudisBreakpointStyleProperty =\n | 'margin-top'\n | 'margin-bottom'\n | 'margin-right'\n | 'margin-left'\n | 'grid-column'\n | 'grid-template-columns'\n | 'justify-self'\n | 'align-self';\n\n/**\n * Object used to apply styles for certain breakpoints\n */\nexport interface FudisBreakpointStyleResponsive {\n name: FudisBreakpointKey; // breakpoint e.g md, xl etc.\n value: string; // value to be applied to spacing attribute\n breakpoint: string; // breakpoint boundaries for this rule\n}\n\n/**\n * Responsive settings for different breakpoints\n */\nexport type FudisBreakpointValueResponsive = {\n [key in FudisBreakpointKey]?: FudisSpacing | string | number;\n};\n\nexport type FudisBreakpointBoundary =\n | '(min-width: 100em)'\n | '(min-width: 75em)'\n | '(min-width: 62em)'\n | '(min-width: 48em)'\n | '(min-width: 36em)'\n | '(min-width: 0)';\n","import { FudisBreakpointKey } from './breakpoint-keys';\n\nexport const fudisSpacingArray = ['none', 'xxs', 'xs', 'sm', 'md', 'lg', 'xl', 'xxl'] as const;\n\nexport type FudisSpacing = (typeof fudisSpacingArray)[number];\n\n/**\n * Responsive settings for different breakpoints for spacing\n */\nexport type FudisSpacingResponsive = {\n [key in FudisBreakpointKey]?: FudisSpacing;\n};\n\n/**\n * Default spacing value if none is given\n */\nexport const defaultSpacingValue = '0';\n\n// TODO: Would be better to not allow string type since we only want to allow spacing directive to take in predefined spacing token values. This affects in breakpoint-utils.ts when pushing new spacing value to FudisBreakpointStyleResponsive array\n/**\n * Fudis spacing tokens\n */\ntype FudisSpacingValues = {\n [key in FudisSpacing | 'default' | string]: string;\n};\n\n/**\n * Fudis spacing tokens converted to rem values\n */\nexport const fudisSpacingValues: FudisSpacingValues = {\n xxs: 'calc(0.25rem / var(--fudis-rem-multiplier))',\n xs: 'calc(0.5rem / var(--fudis-rem-multiplier))',\n sm: 'calc(1rem / var(--fudis-rem-multiplier))',\n md: 'calc(1.5rem / var(--fudis-rem-multiplier))',\n lg: 'calc(2rem / var(--fudis-rem-multiplier))',\n xl: 'calc(2.5rem / var(--fudis-rem-multiplier))',\n xxl: 'calc(4rem / var(--fudis-rem-multiplier))',\n none: '0',\n default: defaultSpacingValue,\n};\n","import { getGridCssValue } from '../../directives/grid/gridUtils';\nimport { FudisBreakpointKey } from '../../types/breakpoint-keys';\nimport {\n FudisBreakpointStyleResponsive,\n FudisBreakpointValueResponsive,\n fudisBreakpointsMinWidth,\n} from '../../types/breakpoints';\nimport { FudisGridColumnsResponsive } from '../../types/grid';\nimport { FudisSpacing, FudisSpacingResponsive, fudisSpacingValues } from '../../types/spacing';\n\n/**\n * Returns an array of FudisBreakpointStyleResponsive objects that applies FudisSpacingValues for a\n * given breakpoints. Determines if breakpoint data consists FudisSpacing values, fractions or\n * numbers. If fractions or numbers are used, calls grid utility function that returns native grid\n * CSS layout properties as a value.\n */\nexport const getBreakpointRules = (\n values: FudisSpacingResponsive | FudisGridColumnsResponsive,\n defaultValue: string,\n isGridItem?: boolean,\n): FudisBreakpointStyleResponsive[] => {\n const valueArray: FudisBreakpointStyleResponsive[] = [];\n\n /**\n * If application values do not contain default value, assign defaultValue from Grid components\n * gridColumnDefault type.\n */\n if (!values.default) {\n valueArray.push({\n name: 'default',\n value: defaultValue,\n breakpoint: fudisBreakpointsMinWidth.default,\n });\n }\n\n Object.keys(values).forEach((key) => {\n const value = values[key as keyof FudisBreakpointValueResponsive]!;\n\n const spacings: FudisSpacing[] = ['xxs', 'xs', 'sm', 'md', 'lg', 'xl', 'xxl'];\n\n // TODO: This if-else logic could probably be improved/refactored?\n // Check if value includes FudisSpacing tokens...\n if (spacings.includes(value as FudisSpacing)) {\n valueArray.push({\n name: key as keyof FudisBreakpointValueResponsive,\n value: fudisSpacingValues[value],\n breakpoint: fudisBreakpointsMinWidth[key as keyof FudisBreakpointValueResponsive],\n });\n }\n\n // ...else call grid utility function.\n // Grid columns can be set by fractions or by plain numbers so the array push should not get mixed up with spacings.\n // Returns e. g. following object:\n // [\n // {\n // \"name\": \"default\",\n // \"value\": \"1fr\",\n // \"breakpoint\": \"(min-width: 0)\"\n // },\n // {\n // \"name\": \"md\",\n // \"value\": \"1fr 2fr\",\n // \"breakpoint\": \"(min-width: 48em)\"\n // },\n // {\n // \"name\": \"xxl\",\n // \"value\": \"repeat(6, 1fr)\",\n // \"breakpoint\": \"(min-width: 100em)\"\n // }\n // ]\n else {\n const valueToForward = getGridCssValue(value, isGridItem);\n\n valueArray.push({\n name: key as keyof FudisBreakpointValueResponsive,\n value: valueToForward,\n breakpoint: fudisBreakpointsMinWidth[key as keyof FudisGridColumnsResponsive],\n });\n }\n });\n\n return valueArray;\n};\n\n/**\n * Builds, sorts and validates breakpoint data\n */\nexport const getBreakpointDataArray = (\n value: FudisSpacingResponsive | FudisGridColumnsResponsive,\n defaultValue: string,\n isGridItem?: boolean,\n): FudisBreakpointStyleResponsive[] => {\n const valueArray: FudisBreakpointStyleResponsive[] = getBreakpointRules(\n value,\n defaultValue,\n isGridItem,\n );\n\n const sortOrder: FudisBreakpointKey[] = ['default', 'xs', 'sm', 'md', 'lg', 'xl', 'xxl'];\n\n const sortedValueArray = valueArray.sort((a, b) => {\n return sortOrder.indexOf(a.name) - sortOrder.indexOf(b.name);\n });\n\n return sortedValueArray;\n};\n","import { Injectable, Signal, signal } from '@angular/core';\nimport { FudisDefaultGridProperties } from '../../types/grid';\n\n@Injectable({ providedIn: 'root' })\nexport class FudisGridService {\n /**\n * Grid values that can be set from application. By default an empty object.\n */\n private _defaultGridValues = signal<FudisDefaultGridProperties>({});\n\n /**\n * To set default values for all Grids application uses from application.\n */\n public setDefaultValues(newDefaultValues: FudisDefaultGridProperties): void | never {\n let checkedNewValues: FudisDefaultGridProperties = {};\n\n Object.keys(newDefaultValues).forEach((key) => {\n const keyName = key as keyof FudisDefaultGridProperties;\n const newValue = newDefaultValues[keyName];\n\n if (newValue) {\n checkedNewValues = { ...checkedNewValues, [keyName]: newValue };\n } else {\n throw new Error(\n `FudisGridService.setDefaultValues() received on object with key of: '${keyName}' and value of: '${newValue}'. This value was not applied to default values.`,\n );\n }\n });\n\n this._defaultGridValues.set({ ...this._defaultGridValues(), ...checkedNewValues });\n }\n\n /**\n * Get application's default values for Grid\n */\n public getDefaultValues(): Signal<FudisDefaultGridProperties> {\n return this._defaultGridValues.asReadonly();\n }\n}\n","import { BreakpointObserver, BreakpointState } from '@angular/cdk/layout';\nimport { Injectable, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n FudisBreakpointStyleProperty,\n FudisBreakpointStyleResponsive,\n breakpointsMinWidthToObserve,\n} from '../../types/breakpoints';\n\n@Injectable()\nexport class FudisBreakpointService {\n /**\n * Observe breakpoints and when hitting one, save results to Signal.\n */\n constructor(fudisBreakpointObserver: BreakpointObserver) {\n fudisBreakpointObserver\n .observe(breakpointsMinWidthToObserve)\n .pipe(takeUntilDestroyed())\n .subscribe((state: BreakpointState) => {\n this._currentScreenSize.set(state);\n });\n }\n\n /**\n * Current screen size/breakpoint with true/false state\n */\n private _currentScreenSize = signal<BreakpointState | null>(null);\n\n /**\n * Readonly value for current screen size and state\n */\n private _screenSize = this._currentScreenSize.asReadonly();\n\n /**\n * Get current state of Breakpoints\n */\n public getBreakpointState(): BreakpointState | null {\n return this._screenSize();\n }\n\n /**\n * Function to apply CSS properties\n */\n public setStyleAttributes(\n element: HTMLElement,\n property: FudisBreakpointStyleProperty,\n value: string | FudisBreakpointStyleResponsive[],\n ): void {\n const elementToModify = element;\n\n const previousStyles = elementToModify.getAttribute('style');\n\n if (typeof value === 'string') {\n elementToModify.style.cssText = `\n\t\t\t\t\t${previousStyles};\n\t\t\t\t\t${property}: ${value === 'none' ? '0' : value};\n\t\t\t\t\t`;\n } else {\n value?.forEach((item) => {\n if (this._screenSize()?.breakpoints[item.breakpoint]) {\n elementToModify.style.cssText = `\n\t\t\t\t\t${previousStyles};\n\t\t\t\t\t${property}: ${item.value === 'none' ? '0' : item.value};\n\t\t\t\t\t`;\n }\n });\n }\n }\n}\n","import { Directive, ElementRef, OnChanges, OnInit, effect } from '@angular/core';\nimport {\n getGridClasses,\n getGridCssValue,\n getValuesForCSSClasses,\n replaceFormInputWidthsToRem,\n} from '../gridUtils';\nimport { GridApiDirective } from '../grid-api/grid-api.directive';\nimport {\n gridColumnDefault,\n FudisGridProperties,\n FudisGridPropertyCollection,\n gridInputPropertyDefaults,\n} from '../../../types/grid';\nimport { FudisGridService } from '../../../services/grid/grid.service';\nimport { FudisBreakpointService } from '../../../services/breakpoint/breakpoint.service';\nimport {\n FudisBreakpointStyleResponsive,\n FudisBreakpointValueResponsive,\n} from '../../../types/breakpoints';\nimport { getBreakpointDataArray } from '../../../utilities/breakpoint/breakpoint-utils';\nimport { FudisComponentChanges } from '../../../types/miscellaneous';\n\n/**\n * Applies grid layout behavior to a container element.\n *\n * Use this directive to define responsive columns.\n */\n@Directive({ selector: '[fudisGrid]' })\nexport class GridDirective extends GridApiDirective implements OnInit, OnChanges {\n constructor(\n private _gridElement: ElementRef,\n private _gridService: FudisGridService,\n private _breakpointService: FudisBreakpointService,\n ) {\n super();\n\n this._element = this._gridElement.nativeElement;\n\n /**\n * Set default values to property collection object\n */\n this._setDefaultValuesToPropertyObject();\n\n /**\n * When screen is resized, check and apply new rules for Grid columns\n */\n effect(() => {\n _breakpointService.getBreakpointState();\n if (\n typeof this._calculatedColumns !== 'string' &&\n typeof this._calculatedColumns !== 'number'\n ) {\n this._setColumnsForBreakpoints(this._calculatedColumns);\n }\n });\n\n /**\n * Update columns and CSS classes, if GridService values update\n */\n effect(() => {\n /**\n * Get GridServices values\n */\n this._gridInputProperties.serviceValues = this._gridService.getDefaultValues()();\n\n /**\n * Re-run Columns and CSS class calculations if GridService's values udpate\n */\n if (this._firstLoadFinished) {\n this._calculateAndSetGridColumnsCss();\n this._setAllProperties();\n }\n });\n }\n\n /**\n * Used to apply grid-template-columns CSS values for the Grid\n */\n protected _calculatedColumns: string | number | FudisBreakpointStyleResponsive[] =\n gridColumnDefault;\n\n /**\n * Internal reference for the this Grid element\n */\n private _element: HTMLElement;\n\n /**\n * Collection of properties collected from Input props and GridService defaults to be applied as\n * CSS values for the Grid\n */\n private _valuesForCssClasses: FudisGridProperties;\n\n /**\n * Object to store various values from defaults, GridService and Inputs from application\n */\n private _gridInputProperties: FudisGridPropertyCollection = {\n appValues: {},\n defaultValues: {},\n serviceValues: {},\n };\n\n private _firstLoadFinished: boolean = false;\n\n ngOnInit(): void {\n this._firstLoadFinished = true;\n this._calculateAndSetGridColumnsCss();\n this._setAllProperties();\n }\n\n ngOnChanges(changes: FudisComponentChanges<GridDirective>): void {\n /**\n * From changed values, update property object\n */\n this._setAppInputValuesToPropertyObject(changes);\n\n if (this._firstLoadFinished) {\n if (changes.columns?.currentValue) {\n this._calculateAndSetGridColumnsCss();\n }\n this._setAllProperties();\n }\n }\n\n /**\n * Add or update values from application. This does not apply any values for CSS.\n */\n private _setAppInputValuesToPropertyObject(changes: FudisComponentChanges<GridDirective>): void {\n const keysToDismiss = ['serviceDefaults', 'ngOnInit', 'ngOnChanges'];\n\n Object.keys(changes).forEach((key) => {\n if (!keysToDismiss.includes(key)) {\n const keyToUse = key as keyof FudisGridProperties;\n const newValue = changes[keyToUse]!.currentValue;\n\n this._gridInputProperties.appValues = {\n ...this._gridInputProperties.appValues,\n [keyToUse]: newValue,\n };\n }\n });\n }\n\n /**\n * Set default values. These are used as back up, if application does not provide any input\n * properties.\n */\n private _setDefaultValuesToPropertyObject(): void {\n this._gridInputProperties.defaultValues = gridInputPropertyDefaults;\n }\n\n /* ---------------------------------------------\n *\n * Class functions for defining Grid's 'grid-template-columns' CSS value\n *\n * ---------------------------------------------\n */\n\n /**\n * Set and config Grid's attributes from provided input properties\n */\n private _calculateAndSetGridColumnsCss(): void {\n this._calculatedColumns = this._calculateColumnsCssValue();\n this._setColumnsForBreakpoints(this._calculatedColumns);\n }\n\n /**\n * Function which converts application's input or service values to CSS values which will applied\n * to Grid element.\n */\n private _calculateColumnsCssValue(): string | FudisBreakpointStyleResponsive[] {\n const columnsToApply = this._gridInputProperties.appValues?.columns;\n const columnsFromService =\n this.serviceDefaults && this._gridInputProperties.serviceValues?.columns\n ? this._gridInputProperties.serviceValues?.columns\n : undefined;\n\n if (typeof columnsToApply === 'string') {\n return replaceFormInputWidthsToRem(columnsToApply);\n }\n // If value is number, convert it to grid-template-column value. E. g. number 6 converts to 'repeat(6,1fr)'\n if (typeof columnsToApply === 'number') {\n return getGridCssValue(columnsToApply);\n }\n\n let combinedValues: FudisBreakpointValueResponsive | undefined;\n\n if (columnsFromService && columnsToApply) {\n combinedValues = { ...columnsFromService, ...columnsToApply };\n return getBreakpointDataArray(combinedValues, gridColumnDefault);\n }\n\n if (columnsToApply) {\n return getBreakpointDataArray(columnsToApply, gridColumnDefault);\n }\n\n if (columnsFromService) {\n return getBreakpointDataArray(columnsFromService, gridColumnDefault);\n }\n\n return gridColumnDefault;\n }\n\n /**\n * Set CSS grid-template-column attributes for this Grid element\n */\n private _setColumnsForBreakpoints(\n columnsCssValue: string | FudisBreakpointStyleResponsive[],\n ): void {\n this._breakpointService.setStyleAttributes(\n this._element,\n 'grid-template-columns',\n columnsCssValue,\n );\n }\n\n /* ---------------------------------------------\n *\n * Class functions for defining Grid's other than 'grid-template-columns' CSS values\n *\n * ---------------------------------------------\n */\n\n private _setAllProperties(): void {\n this._valuesForCssClasses = getValuesForCSSClasses(\n this._gridInputProperties,\n this.serviceDefaults,\n );\n\n this._element.style.justifyItems = this._valuesForCssClasses.alignItemsX!;\n\n this._element.style.alignItems = this._valuesForCssClasses.alignItemsY!;\n\n this._element.classList.value = getGridClasses(this._valuesForCssClasses);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n/**\n * Dropdown event service shared between Icon Button and DropdownMenu components.\n *\n * Dropdown menu element's width calculation must be triggered from host Icon Button click, and it\n * should ensure that the dropdown is always fully visible.\n */\n\n@Injectable({ providedIn: 'root' })\nexport class DropdownEventService {\n private _triggerCalculationSubject = new Subject<void>();\n\n triggerCalculation = this._triggerCalculationSubject.asObservable();\n\n triggerWidthCalculation() {\n this._triggerCalculationSubject.next();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n OnChanges,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ButtonBaseDirective } from '../../directives/button-base/button-base.directive';\nimport { FudisIcon } from '../../types/icons';\nimport { FudisComponentChanges } from '../../types/miscellaneous';\nimport { BehaviorSubject } from 'rxjs';\nimport { DropdownEventService } from '../../services/dropdown/dropdown-event.service';\nimport { FudisIdService } from '../../services/id/id.service';\nimport { IconComponent } from '../icon/icon.component';\nimport { CommonModule } from '@angular/common';\nimport { PopoverDirective } from '../../directives/popover/popover.directive';\n\n/**\n * Button represented primarily by an icon.\n *\n * Use this component for compact actions where icon and its aria-label clearly communicate the\n * intent.\n */\n@Component({\n selector: 'fudis-icon-button',\n templateUrl: './icon-button.component.html',\n styleUrls: ['./icon-button.component.scss'],\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, IconComponent, PopoverDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class IconButtonComponent extends ButtonBaseDirective implements OnChanges {\n constructor(\n _idService: FudisIdService,\n private _dropdownEventService: DropdownEventService,\n ) {\n super(_idService);\n }\n /**\n * Binding host CSS class to component wrapper\n */\n @HostBinding('class') protected _classes = 'fudis-icon-button-host';\n\n /**\n * Required aria-label for describing context\n */\n @Input({ required: true }) ariaLabel: string;\n\n /**\n * Icon for button\n */\n @Input({ required: true }) override icon: FudisIcon | undefined = undefined;\n\n /**\n * Assign button as menu button with dropdown\n */\n @Input() asMenuButton: boolean = false;\n\n /**\n * Id of child Dropdown Menu. Passed from child to parent Icon Button.\n */\n public dropdownMenuId: string;\n\n /**\n * Left icon margin for small and medium sizes\n */\n protected _iconMargin = new BehaviorSubject<string>('fudis-button__icon');\n\n /**\n * Toggle dropdown menu button\n */\n public dropdownOpen = new BehaviorSubject<boolean>(false);\n\n override ngOnInit(): void {\n const margin = ['medium', 'small'].includes(this.size) ? ' fudis-ml-xs' : '';\n this._iconMargin.next(`fudis-button__icon${margin}`);\n super.ngOnInit();\n }\n\n ngOnChanges(changes: FudisComponentChanges<IconButtonComponent>): void {\n const variant = changes.variant?.currentValue !== changes.variant?.previousValue;\n const disabled = changes.disabled?.currentValue !== changes.disabled?.previousValue;\n const size = changes.size?.currentValue !== changes.size?.previousValue;\n\n if (variant || disabled) {\n this._classList.next(this._getClasses());\n }\n\n if (size) {\n this._size = this.size;\n const margin = ['medium', 'small'].includes(this.size) ? ' fudis-ml-xs' : '';\n this._iconMargin.next(`fudis-button__icon${margin}`);\n this._classList.next(this._getClasses());\n }\n }\n\n /**\n * Icon Button click event\n */\n public buttonClick(event: Event): void {\n if (this.asMenuButton) {\n this.toggleMenu();\n }\n\n this.handleClick.emit(event);\n }\n\n /**\n * Toggling when Icon Button is used as menu button\n */\n public toggleMenu(): void {\n const newState = !this.dropdownOpen.value;\n this.dropdownOpen.next(newState);\n\n this._dropdownEventService.triggerWidthCalculation();\n }\n\n /**\n * Close dropdown when Icon Button is used as menu button\n */\n public closeMenu(focusToButton: boolean = true): void {\n this.dropdownOpen.next(false);\n\n if (!this._focused && focusToButton) {\n this.buttonEl.nativeElement.focus();\n }\n\n this._dropdownEventService.triggerWidthCalculation();\n }\n\n /**\n * Handler for blurring out and closing menu button's dropdown\n */\n protected _handleButtonBlur(event: FocusEvent): void {\n this._focused = false;\n\n const targetIsDropdownMenuOption = (event.relatedTarget as HTMLElement)?.classList?.contains(\n 'fudis-dropdown-menu-item',\n );\n\n if (this.asMenuButton && !targetIsDropdownMenuOption) {\n this.dropdownOpen.next(false);\n }\n\n this.handleBlur.emit(event);\n }\n}\n","@if (popoverText) {\n <button\n fudisPopover\n #buttonElement\n [class]=\"_classList | async\"\n type=\"button\"\n (click)=\"!disabled && buttonClick($event)\"\n (blur)=\"!disabled && _handleButtonBlur($event)\"\n (focus)=\"!disabled && _handleButtonFocus($event)\"\n (keydown)=\"(!disabled)\"\n [attr.tabIndex]=\"disabled ? -1 : null\"\n [attr.aria-disabled]=\"disabled || null\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.id]=\"id\"\n [popoverPosition]=\"popoverPosition\"\n [popoverText]=\"popoverText\"\n >\n @if (icon) {\n <div [class]=\"_iconMargin | async\">\n @if (_iconColor | async; as iconColor) {\n <fudis-icon\n class=\"fudis-button__icon__component\"\n [color]=\"iconColor\"\n [icon]=\"icon\"\n [rotate]=\"iconRotate\"\n ></fudis-icon>\n }\n </div>\n }\n </button>\n}\n\n@if (!popoverText) {\n <button\n #buttonElement\n [class]=\"_classList | async\"\n type=\"button\"\n (click)=\"!disabled && buttonClick($event)\"\n (blur)=\"!disabled && _handleButtonBlur($event)\"\n (focus)=\"!disabled && _handleButtonFocus($event)\"\n (keydown)=\"(!disabled)\"\n [attr.tabIndex]=\"disabled ? -1 : null\"\n [attr.aria-disabled]=\"disabled || null\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.id]=\"id\"\n [attr.aria-expanded]=\"!asMenuButton ? null : (dropdownOpen | async)\"\n [attr.aria-controls]=\"\n asMenuButton && dropdownMenuId && (dropdownOpen | async) ? dropdownMenuId : null\n \"\n [attr.aria-haspopup]=\"!asMenuButton ? null : 'menu'\"\n >\n @if (icon) {\n <div [class]=\"_iconMargin | async\">\n @if (_iconColor | async; as iconColor) {\n <fudis-icon\n class=\"fudis-button__icon__component\"\n [color]=\"iconColor\"\n [icon]=\"icon\"\n [rotate]=\"iconRotate\"\n ></fudis-icon>\n }\n </div>\n }\n </button>\n}\n\n@if (asMenuButton && (dropdownOpen | async)) {\n <ng-content></ng-content>\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n ViewChild,\n ViewEncapsulation,\n AfterContentInit,\n ChangeDetectionStrategy,\n} from '@angular/core';\n\nimport { FudisGridWidth, FudisGridAlign } from '../../../types/grid';\nimport { FudisComponentChanges } from '../../../types/miscellaneous';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { FudisInternalErrorSummaryService } from '../../../services/form/error-summary/internal-error-summary.service';\nimport { FudisInputSize } from '../../../types/forms';\nimport { FudisTranslationService } from '../../../services/translation/translation.service';\nimport { FudisFocusService } from '../../../services/focus/focus.service';\nimport { PopoverApiDirective } from '../../../directives/popover/popover-api.directive';\nimport { GridDirective } from '../../../directives/grid/grid/grid.directive';\nimport { IconButtonComponent } from '../../icon-button/icon-button.component';\nimport { BodyTextComponent } from '../../typography/body-text/body-text.component';\n\n/**\n * Groups related form controls under a common context.\n *\n * Use this component to improve form structure, clarity, and accessibility.\n */\n@Component({\n selector: 'fudis-fieldset',\n templateUrl: './fieldset.component.html',\n styleUrls: ['./fieldset.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [GridDirective, IconButtonComponent, BodyTextComponent],\n})\nexport class FieldSetComponent\n extends PopoverApiDirective\n implements AfterViewInit, OnInit, OnDestroy, OnChanges, AfterContentInit\n{\n constructor(\n protected _translationService: FudisTranslationService,\n private _element: ElementRef,\n private _errorSummaryService: FudisInternalErrorSummaryService,\n private _focusService: FudisFocusService,\n private _idService: FudisIdService,\n ) {\n super();\n }\n\n /**\n * Legend elementRef to trigger initialFocus\n */\n @ViewChild('fieldsetLegend') private _fieldsetLegend: ElementRef<HTMLDivElement>;\n\n /**\n * Label for the Fieldset component.\n */\n @Input({ required: true }) label: string;\n\n /**\n * Maximum width of Grid. When viewport gets narrower, grid automatically adjusts to lower sizes.\n *\n * - Xxl = Default value. Viewports of 1600px and larger\n * - Xl = Viewports smaller than 1600px\n * - Lg = Viewports smaller than 1200px\n * - Md = Viewports smaller than 992px\n * - Sm = Viewports smaller than 768px\n * - Xs = Viewports smaller than 576px\n * - Full-width = Grid takes full width of its parent container, no maximum width\n */\n @Input() width: FudisGridWidth = 'xxl';\n\n /**\n * Overrides 'width' input. Used to set Checkbox Group and Radio Button Group as wide as other\n * basic form components.\n */\n @Input() inputSize: FudisInputSize;\n\n /**\n * Alignment of Grid component inside its parent\n */\n @Input() align: FudisGridAlign = 'start';\n\n /**\n * Set focus to Fieldset when it appears first time\n */\n @Input() initialFocus: boolean = false;\n\n /**\n * Send information about current Fieldset to Error Summary Service. Error Summary Breadcrumb is\n * the label of the current Fieldset and is visible in the clickable link in Error Summary.\n */\n @Input() errorSummaryBreadcrumb: boolean = true;\n\n /**\n * Display \"Required\" text next to Fieldset main label.\n */\n @Input() required: boolean | null;\n\n /**\n * Visual size of label legend. Default 'md' and 'sm' is similar to standard input label, used in\n * e. g. RadioButtonGroup.\n */\n @Input() labelSize: 'md' | 'sm' = 'md';\n\n /**\n * Fieldset id. If not provided when component is initialized, generated by Id Service\n */\n @Input() id: string;\n\n /**\n * Help text, aligned underneath the input.\n */\n @Input() helpText: string | undefined;\n\n /**\n * CSS classes for the native fieldset HTMLelement\n */\n protected _classes: string[];\n\n /**\n * Used to set visible focus on if focus event comes from Error Summary link.\n */\n protected _legendFocusVisible: boolean = false;\n\n /**\n * Has Fieldset been added to Error Summary\n */\n private _fieldsetSent: boolean = false;\n\n /**\n * Private reference to Guidance\n */\n private _fieldsetGuidance: HTMLElement | null;\n\n private _parentFormId: string | null;\n\n ngOnInit(): void {\n this._setFieldsetId();\n this._addToErrorSummary(this.label);\n this._setClasses();\n }\n\n ngAfterContentInit(): void {\n this._errorSummaryService\n .getFormAncestorId(this._element.nativeElement)\n .then((parentFormId) => {\n if (parentFormId) {\n this._parentFormId = parentFormId;\n this._addToErrorSummary(this.label);\n }\n });\n this._fieldsetGuidance = this._element.nativeElement.querySelector(\n 'fudis-guidance',\n ) as HTMLElement | null;\n }\n\n ngAfterViewInit(): void {\n if (this.initialFocus && !this._focusService.isIgnored(this.id)) {\n this._fieldsetLegend?.nativeElement?.focus();\n }\n\n const className = this._element.nativeElement.className;\n const selectionGroups = ['fudis-radio-button-group', 'fudis-checkbox-group'];\n\n if (selectionGroups.includes(className)) this._hasSelectionGroupParent();\n }\n\n ngOnChanges(changes: FudisComponentChanges<FieldSetComponent>): void {\n if (\n changes.label?.currentValue &&\n changes.label?.currentValue !== changes.label?.previousValue\n ) {\n this._addToErrorSummary(changes.label?.currentValue);\n }\n\n if (changes.inputSize?.currentValue !== changes.inputSize?.previousValue) {\n this._setClasses();\n }\n }\n\n ngOnDestroy(): void {\n this._removeFromErrorSummary();\n }\n\n protected _handleLegendBlur(): void {\n this._legendFocusVisible = false;\n }\n\n protected _handleFocus(event: FocusEvent): void {\n if (event.relatedTarget) {\n const elementHasLinkClass = (event.relatedTarget as HTMLElement).classList.contains(\n 'fudis-link',\n );\n\n if (elementHasLinkClass) {\n this._legendFocusVisible = true;\n this._fieldsetLegend.nativeElement.focus();\n }\n }\n }\n\n /**\n * Determines if Fieldset has CheckboxGroup or RadioButtonGroup as a parent. If so, adds Guidance\n * helptext as part of the Fieldset legend element and makes it accessible for screen readers.\n */\n private _hasSelectionGroupParent(): void {\n const guidanceHelpText = this._fieldsetGuidance\n ?.querySelector('.fudis-guidance__help-text')\n ?.textContent?.trim();\n\n if (!guidanceHelpText) return;\n\n const groupHelpText = this._element.nativeElement.querySelector(\n '.fudis-fieldset__legend__main__group-helptext',\n ) as HTMLElement | null;\n\n if (!groupHelpText) return;\n\n groupHelpText.removeAttribute('aria-hidden');\n\n const helptext = document.createElement('span');\n helptext.textContent = guidanceHelpText;\n\n groupHelpText.appendChild(helptext);\n }\n\n /**\n * Add Fieldset label to Error Summary\n */\n private _addToErrorSummary(label: string): void {\n if (this.errorSummaryBreadcrumb && this._parentFormId) {\n const fieldsetInfo = {\n id: this.id,\n formId: this._parentFormId,\n title: label,\n };\n\n this._errorSummaryService.addFieldset(fieldsetInfo);\n\n this._fieldsetSent = true;\n }\n }\n\n /**\n * Remove Fieldset label from Error Summary\n */\n private _removeFromErrorSummary(): void {\n if (this._fieldsetSent && this._parentFormId) {\n this._errorSummaryService.removeFieldset(this._parentFormId, this.id);\n }\n }\n\n /**\n * Set CSS classes for native fieldset HTMLelement\n */\n private _setClasses(): void {\n if (this.inputSize) {\n this._classes = ['fudis-fieldset', `fudis-input-size__${this.inputSize}`];\n } else {\n this._classes = ['fudis-fieldset'];\n }\n }\n\n /**\n * Add or generate id with IdService\n */\n private _setFieldsetId(): void {\n if (this.id) {\n this._idService.addNewId('fieldset', this.id);\n } else {\n this.id = this._idService.getNewId('fieldset');\n }\n }\n}\n","<!-- prettier-ignore -->\n<div\n fudisGrid\n [align]=\"align\"\n [width]=\"inputSize ? 'initial' : width\"\n [serviceDefaults]=\"false\"\n [rowGap]=\"'none'\"\n>\n <fieldset [attr.id]=\"id\" [tabIndex]=\"-1\" [class]=\"_classes\">\n <legend class=\"fudis-fieldset__legend\">\n <div\n #fieldsetLegend\n class=\"fudis-fieldset__legend__main fudis-fieldset__legend__{{ labelSize }}\"\n [class.fudis-fieldset__legend--focused]=\"_legendFocusVisible\"\n [attr.id]=\"id + '-legend'\"\n [tabIndex]=\"-1\"\n (focus)=\"_handleFocus($event)\"\n (blur)=\"_handleLegendBlur()\"\n >\n <div class=\"fudis-fieldset__legend__main__text-content\">\n <span class=\"fudis-fieldset__legend__main__text\"\n >{{ label }}@if (required) {\n <span class=\"fudis-fieldset__legend__main__space\"></span>\n }@if (required) {\n <span class=\"fudis-fieldset__legend__main__required\"\n >({{ _translationService.getTranslations()().REQUIRED }})</span\n >\n }\n </span>\n <div\n aria-hidden=\"true\"\n class=\"fudis-fieldset__legend__main__group-helptext fudis-visually-hidden\"\n ></div>\n </div>\n @if (popoverText && popoverTriggerLabel) {\n <fudis-icon-button\n class=\"fudis-fieldset__legend__main__popover-button\"\n [size]=\"'extra-small'\"\n [variant]=\"'tertiary'\"\n [icon]=\"'info-circle'\"\n [popoverText]=\"popoverText\"\n [popoverPosition]=\"popoverPosition\"\n [ariaLabel]=\"popoverTriggerLabel\"\n />\n }\n </div>\n </legend>\n @if (helpText) {\n <fudis-body-text class=\"fudis-fieldset__help-text\" [variant]=\"'sm-regular'\">{{\n helpText\n }}</fudis-body-text>\n }\n <ng-content select=\"fudis-fieldset-actions\"></ng-content>\n <ng-content select=\"fudis-fieldset-content\"></ng-content>\n </fieldset>\n</div>\n","import { Directive, HostBinding, Input, OnChanges } from '@angular/core';\nimport { FudisComponentChanges, fudisFieldsetActionsAlign } from '../../../types/miscellaneous';\n\n/**\n * Identifies the actions associated with a fieldset.\n *\n * Use this directive to add buttons that affect the fieldset as a whole.\n */\n@Directive({ selector: 'fudis-fieldset-actions' })\nexport class FieldsetActionsDirective implements OnChanges {\n @HostBinding('class') public hostClass =\n 'fudis-fieldset-actions fudis-fieldset-actions__align--start';\n\n /**\n * Alignment of Fieldset Actions container\n */\n @Input() align: fudisFieldsetActionsAlign = 'start';\n\n ngOnChanges(changes: FudisComponentChanges<FieldsetActionsDirective>): void {\n if (changes.align?.currentValue !== changes.align?.previousValue) {\n this.hostClass = `fudis-fieldset-actions fudis-fieldset-actions__align--${changes.align?.currentValue}`;\n }\n }\n}\n\n/**\n * Identifies the main content area of a fieldset.\n *\n * Use this directive to group related form controls within a fieldset.\n */\n@Directive({ selector: 'fudis-fieldset-content' })\nexport class FieldsetContentDirective {\n @HostBinding('class') readonly _hostClass = 'fudis-fieldset-content';\n}\n","import {\n AfterViewInit,\n Component,\n EventEmitter,\n Inject,\n Input,\n OnInit,\n Output,\n ViewChild,\n DOCUMENT,\n ChangeDetectionStrategy,\n Signal,\n computed,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport {\n FudisCheckboxGroupChangeEvent,\n FudisCheckboxGroupFormGroup,\n FudisInputSize,\n} from '../../../types/forms';\nimport { FudisValidatorUtilities } from '../../../utilities/form/validator-utilities';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { GroupComponentBaseDirective } from '../../../directives/form/group-component-base/group-component-base.directive';\nimport { FudisFocusService } from '../../../services/focus/focus.service';\n\nimport { GuidanceComponent } from '../guidance/guidance.component';\nimport { FieldSetComponent } from '../fieldset/fieldset.component';\nimport { FieldsetContentDirective } from '../fieldset/fieldset-content.directive';\nimport { AsyncPipe } from '@angular/common';\n\n/**\n * Groups multiple related checkbox options.\n *\n * Use this component when user can select value(s) from a set. Each `fudis-checkbox-group-option`\n * child must have a `[controlName]` matching a key in the FormGroup. Use `FudisGroupValidators` for\n * group-level validation (e.g., `oneRequired`, `min`, `max`).\n *\n * @example\n * ```html\n * <fudis-checkbox-group [label]=\"'Colors'\" [formGroup]=\"colorsGroup\">\n * <fudis-checkbox-group-option [controlName]=\"'red'\" [label]=\"'Red'\"></fudis-checkbox-group-option>\n * <fudis-checkbox-group-option [controlName]=\"'blue'\" [label]=\"'Blue'\"></fudis-checkbox-group-option>\n * </fudis-checkbox-group>\n * ```;\n */\n@Component({\n selector: 'fudis-checkbox-group',\n templateUrl: './checkbox-group.component.html',\n styleUrls: ['./checkbox-group.component.scss'],\n imports: [\n FieldSetComponent,\n FieldsetContentDirective,\n GuidanceComponent,\n FormsModule,\n ReactiveFormsModule,\n AsyncPipe,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CheckboxGroupComponent<T extends FudisCheckboxGroupFormGroup<T>>\n extends GroupComponentBaseDirective\n implements OnInit, AfterViewInit\n{\n constructor(\n @Inject(DOCUMENT) private _document: Document,\n _idService: FudisIdService,\n _focusService: FudisFocusService,\n ) {\n super(_idService, _focusService);\n\n this._updateValueAndValidityTrigger.pipe(takeUntilDestroyed()).subscribe(() => {\n if (this.formGroup) {\n this._required.next(FudisValidatorUtilities.oneRequiredOrMin(this.formGroup));\n }\n });\n }\n\n @ViewChild('checkboxGroupGuidance') private _guidance: GuidanceComponent;\n\n /**\n * FormGroup for Checkbox Group. Provide also `controlName` for each Checkbox child.\n */\n @Input({ required: true }) override formGroup: FormGroup<T>;\n\n /**\n * Width of Checkbox Group: 'sm' | 'md' | 'lg' | 'full-width'\n */\n @Input() size: FudisInputSize = 'lg';\n\n /**\n * Emit changed control's name and whole FormGroup when one Checkbox is clicked.\n */\n @Output() handleChange = new EventEmitter<FudisCheckboxGroupChangeEvent>();\n\n /**\n * To determine if focus has been moved out from the whole checkbox group, so possible errors will\n * not show before that.\n */\n private _groupBlurredOut: WritableSignal<boolean> = signal(false);\n public readonly groupBlurredOut: Signal<boolean> = this._groupBlurredOut.asReadonly();\n\n /**\n * Private signals for managing the touched, invalid, and disabled state of the form group.\n */\n private _touchedState: WritableSignal<boolean> = signal(false);\n private _invalidState: WritableSignal<boolean> = signal(false);\n private _disabledState: WritableSignal<boolean> = signal(false);\n\n /**\n * Publicly exposed readonly signals reflecting the current state of the form group. Used by child\n * checkbox options to track group state reactively without requiring markForCheck().\n */\n public readonly touchedState: Signal<boolean> = this._touchedState.asReadonly();\n public readonly invalidState: Signal<boolean> = this._invalidState.asReadonly();\n public readonly disabledState: Signal<boolean> = this._disabledState.asReadonly();\n\n /**\n * Computed signal that combines touched, invalid, and blurred-out state to determine if group\n * errors should be shown.\n */\n public readonly groupErrors = computed(\n () => this._touchedState() && this._invalidState() && this._groupBlurredOut(),\n );\n\n /**\n * Copy FormGroup states into local signals so child checkbox options can track group state\n * reactively without requiring markForCheck().\n */\n private _syncFormGroupState(): void {\n this._touchedState.set(this.formGroup.touched);\n this._invalidState.set(this.formGroup.invalid);\n this._disabledState.set(this.formGroup.disabled);\n }\n\n private _applyGroupMarkAsTouched(): void {\n if (this.formGroup.touched) {\n this._groupBlurredOut.set(true);\n } else {\n /**\n * Extend original markAllAsTouched function to change _groupBlurredOut value to 'true', so\n * error messages are loaded when e.g. on Submit touched value is changed programatically.\n */\n const originalMarkAllAsTouched = this.formGroup.markAllAsTouched;\n this.formGroup.markAllAsTouched = () => {\n originalMarkAllAsTouched.apply(this.formGroup);\n this._syncFormGroupState();\n this._groupBlurredOut.set(true);\n };\n }\n }\n\n ngOnInit(): void {\n this._setParentComponentId('checkbox-group');\n this._syncFormGroupState();\n this._required.next(FudisValidatorUtilities.oneRequiredOrMin(this.formGroup));\n\n this.formGroup.events.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {\n this._syncFormGroupState();\n this._updateValueAndValidityTrigger.next();\n });\n this._applyGroupMarkAsTouched();\n }\n\n override ngAfterViewInit(): void {\n super.ngAfterViewInit();\n\n /**\n * For Screen reader users bind guidance text to first checkbox child input\n */\n const checkboxIds = this._idService.getAllChildrenIds('checkbox-group', this.id);\n const firstCheckbox = this._getFirstEnabledCheckbox(checkboxIds);\n const guidanceId = this._guidance?.['_id'];\n\n if (firstCheckbox && guidanceId) {\n firstCheckbox.setAttribute('aria-describedby', guidanceId);\n }\n }\n\n /**\n * Return first checkbox child input when it is not disabled\n */\n private _getFirstEnabledCheckbox(ids: string[]): HTMLInputElement | null {\n for (const id of ids) {\n const checkbox = this._document.getElementById(id);\n if (checkbox instanceof HTMLInputElement && !checkbox.disabled) {\n return checkbox;\n }\n }\n\n return null;\n }\n\n /**\n * Used to display possible error messages only when focus has moved out from all the group's\n * checkboxes.\n */\n public setGroupBlurredOut(value: boolean): void {\n this._groupBlurredOut.set(value);\n }\n\n /**\n * When child Checkbox component is clicked, it calls this parent's function, which will then\n * trigger Output emit.\n *\n * @param changedControlName Name of the clicked control\n */\n public triggerEmit(changedControlName: string): void {\n this.handleChange.emit({\n changedControlName: changedControlName,\n formGroup: this.formGroup,\n });\n }\n}\n","<fudis-fieldset\n class=\"fudis-checkbox-group\"\n [id]=\"id\"\n [labelSize]=\"'sm'\"\n [label]=\"label\"\n [required]=\"_required | async\"\n [errorSummaryBreadcrumb]=\"false\"\n [initialFocus]=\"initialFocus\"\n [inputSize]=\"size\"\n [popoverText]=\"popoverText\"\n [popoverPosition]=\"popoverPosition\"\n [popoverTriggerLabel]=\"popoverTriggerLabel\"\n>\n <fudis-fieldset-content>\n <ng-content select=\"fudis-checkbox-group-option\" />\n @if (formGroup && !disableGuidance) {\n <fudis-guidance\n #checkboxGroupGuidance\n [inputLabel]=\"label\"\n [helpText]=\"helpText\"\n [for]=\"id + '-legend'\"\n [groupBlurredOut]=\"groupBlurredOut()\"\n [formGroup]=\"formGroup\"\n [groupHelpTextHidden]=\"true\"\n >\n <ng-content select=\"fudis-error-message\" />\n </fudis-guidance>\n }\n </fudis-fieldset-content>\n</fudis-fieldset>\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n Output,\n EventEmitter,\n Host,\n OnInit,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FudisIdService } from '../../../../services/id/id.service';\nimport { CheckboxGroupComponent } from '../checkbox-group.component';\nimport {\n FudisCheckboxChangeEvent,\n FudisCheckboxGroupFormGroup,\n FudisCheckboxGroupOption,\n} from '../../../../types/forms';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { IconComponent } from '../../../icon/icon.component';\n\n/**\n * Single checkbox option for CheckboxGroupComponent.\n */\n@Component({\n selector: 'fudis-checkbox-group-option',\n templateUrl: './checkbox-group-option.component.html',\n encapsulation: ViewEncapsulation.None,\n imports: [FormsModule, ReactiveFormsModule, IconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CheckboxGroupOptionComponent implements OnInit {\n constructor(\n private _idService: FudisIdService,\n @Host() protected _checkboxGroup: CheckboxGroupComponent<object>,\n ) {}\n\n /**\n * Control name for this checkbox from FormGroup. Used to link each Checkbox with their Checkbox\n * Group parent's FormGroup.\n */\n @Input({ required: true }) controlName: string;\n\n /**\n * Visible label of checkbox\n */\n @Input({ required: true }) label: string;\n\n /**\n * Id for single checkbox. By default generated.\n */\n @Input() id: string;\n\n /**\n * Emits changed Checkbox and its control.\n */\n @Output() handleChange = new EventEmitter<FudisCheckboxChangeEvent>();\n\n /**\n * FormControl for each Checkbox provided by parent FormGroup\n */\n protected _control: FormControl<boolean | null>;\n\n /**\n * If checkbox has focus\n */\n protected _focused = false;\n\n ngOnInit(): void {\n if (this.id) {\n this._idService.addNewChildId('checkbox-group', this._checkboxGroup.id, this.id);\n } else {\n this.id = this._idService.getNewChildId('checkbox-group', this._checkboxGroup.id);\n }\n\n const parentControl =\n this._checkboxGroup?.formGroup?.controls?.[\n this.controlName as keyof FudisCheckboxGroupFormGroup<object>\n ];\n\n if (this.controlName && parentControl) {\n /**\n * Set Checkbox's control to match one in parent FormGroup.\n */\n this._control = parentControl;\n }\n }\n\n /**\n * For toggling checkbox\n */\n protected _onChange(): void {\n const optionToEmit: FudisCheckboxGroupOption<object> = {\n id: this.id,\n groupName: this._checkboxGroup.id,\n controlName: this.controlName,\n label: this.label,\n value:\n this._checkboxGroup.formGroup.controls[\n this.controlName as keyof typeof this._checkboxGroup.formGroup.controls\n ]?.['value'],\n };\n\n /**\n * This Checkbox's emit\n */\n this.handleChange.emit({ checkbox: optionToEmit, control: this._control });\n\n /**\n * Call parent's function, which triggers Checkbox Group's emit\n */\n this._checkboxGroup.triggerEmit(this.controlName);\n }\n\n /**\n * When focusing out from checkbox, determine if next focus target is outside of the same checkbox\n * group. If yes, then tell parent Checkbox Group, that focus has moved outside. --> If there are\n * validation errors, those should become visible.\n */\n protected _onBlur(event: FocusEvent): void {\n this._focused = false;\n\n if ((event.relatedTarget as HTMLElement)?.getAttribute('name') !== this._checkboxGroup.id) {\n setTimeout(() => {\n if (document.activeElement?.getAttribute('name') !== this._checkboxGroup.id) {\n this._checkboxGroup.handleBlur.emit(event);\n this._checkboxGroup.setGroupBlurredOut(true);\n }\n }, 150);\n }\n }\n\n /**\n * When Checkbox is focused\n */\n protected _onFocus(event: FocusEvent): void {\n this._focused = true;\n\n this._checkboxGroup.onFocus(event);\n }\n\n /**\n * If control is disabled, prevent toggling it.\n */\n protected _checkboxClick(event: Event) {\n if (this._control.disabled) {\n event.preventDefault();\n }\n }\n}\n","@let groupErrors = _checkboxGroup.groupErrors();\n\n@if (_control) {\n <label\n class=\"fudis-checkbox fudis-checkbox__label\"\n [attr.for]=\"id\"\n [id]=\"id + '-label'\"\n [class.fudis-checkbox--disabled]=\"_control.disabled || _checkboxGroup.disabled\"\n >\n <input\n (click)=\"_checkboxClick($event)\"\n type=\"checkbox\"\n class=\"fudis-checkbox__input\"\n [id]=\"id\"\n [formControl]=\"_control\"\n [value]=\"_control.value\"\n [name]=\"_checkboxGroup.id\"\n [attr.tabindex]=\"_control.disabled || _checkboxGroup.disabled ? -1 : null\"\n [attr.aria-disabled]=\"_control.disabled || _checkboxGroup.disabled || null\"\n [attr.aria-invalid]=\"groupErrors || null\"\n (change)=\"_onChange()\"\n (blur)=\"_onBlur($event)\"\n (focus)=\"_onFocus($event)\"\n (keyup)=\"_checkboxGroup.handleKeyUp.emit($event)\"\n />\n <div\n class=\"fudis-checkbox__content\"\n [class.fudis-checkbox__content--disabled]=\"_control.disabled || _checkboxGroup.disabled\"\n >\n <div class=\"fudis-checkbox__content-wrapper\">\n <span\n class=\"fudis-checkbox__content__box\"\n [class.fudis-checkbox__content__box--focused]=\"_focused\"\n [class.fudis-checkbox__content__box--invalid]=\"groupErrors\"\n [class.fudis-checkbox__content__box--disabled]=\"\n _control.disabled || _checkboxGroup.disabled\n \"\n >\n @if (_control.value) {\n <fudis-icon [icon]=\"'check'\" class=\"fudis-checkbox__content__box__icon\" />\n }\n </span>\n </div>\n <span class=\"fudis-checkbox__content__label\">\n {{ label }}\n </span>\n </div>\n </label>\n}\n","import { FormControl, FormGroup } from '@angular/forms';\nimport { MatDateFormats, MAT_NATIVE_DATE_FORMATS } from '@angular/material/core';\n\nexport const fudisInputSizeArray = ['sm', 'md', 'lg', 'full-width'] as const;\n\nexport type FudisInputSize = (typeof fudisInputSizeArray)[number];\n\nexport type FudisInputType = 'email' | 'number' | 'password' | 'tel' | 'text' | 'url';\n\nexport type FudisCheckboxOption<T extends object> = T & {\n /**\n * Unique id for single checkbox\n */\n id?: string;\n /**\n * Visible label that is shown in the UI\n */\n label?: string;\n /**\n * Is option selected\n */\n value?: boolean | null | undefined;\n /**\n * To store additional data\n */\n [key: string]: unknown;\n};\n\nexport type FudisCheckboxGroupOption<T extends object> = T & {\n /**\n * Unique id for single checkbox group option\n */\n id?: string;\n /**\n * Name for the group of checkboxes\n */\n groupName?: string;\n /**\n * If using FormGroup, name of the option\n */\n controlName?: string;\n /**\n * Visible label that is shown in the UI\n */\n label: string;\n /**\n * Is option selected\n */\n value?: boolean | null | undefined;\n /**\n * To store additional data\n */\n [key: string]: unknown;\n};\n\nexport type FudisRadioButtonOption<T extends object> = T & {\n /**\n * Generated id for single radio option\n */\n id?: string;\n /**\n * Underlying value of the option\n */\n value: string | boolean | null | unknown;\n /**\n * Value that is shown in the UI\n */\n label: string;\n /**\n * To store additional data\n */\n [key: string]: unknown;\n};\n\nexport type FudisSelectVariant = 'dropdown' | 'autocompleteDropdown' | 'autocompleteType';\n\nexport type FudisSelectOption<T = string> = {\n /**\n * Underlying value of the option\n */\n value: T;\n /**\n * Value that is shown in the UI\n */\n label: string;\n /**\n * Secondary, optional label for the option\n */\n subLabel?: string;\n /**\n * Is option disabled in the dropdown\n */\n disabled?: boolean;\n};\n\nexport type FudisLocalizedTextGroupFormGroupOptions =\n | { controlName: 'fi'; label: 'FI' }\n | { controlName: 'sv'; label: 'SV' }\n | { controlName: 'en'; label: 'EN' }\n | { controlName: string; label: string };\n\nexport interface FudisLocalizedTextGroupDefaultFormGroup {\n fi: FormControl<string | null>;\n en: FormControl<string | null>;\n sv: FormControl<string | null>;\n}\n\nexport type FudisLocalizedTextGroupFormGroup<T> = {\n [K in keyof T]: FormControl<string | null>;\n};\n\nexport type FudisCheckboxGroupFormGroup<T> = {\n [K in keyof T]: FormControl<boolean | null>;\n};\n\nexport type FudisCheckboxChangeEvent = {\n checkbox: FudisCheckboxGroupOption<object> | FudisCheckboxOption<object>;\n control: FormControl<boolean | null>;\n};\n\nexport type FudisCheckboxGroupChangeEvent = {\n changedControlName: string;\n formGroup: FormGroup;\n};\n\nexport type FudisRadioButtonChangeEvent = {\n option: FudisRadioButtonOption<object>;\n control: FormControl<unknown>;\n};\n\nexport const FudisDateInputFormat = {\n dateInput: 'DD.MM.YYYY',\n monthYearLabel: 'MMM YYYY',\n};\n\nexport const FUDIS_DATE_FORMATS: MatDateFormats = {\n ...MAT_NATIVE_DATE_FORMATS,\n parse: {\n dateInput: 'DD.MM.YYYY',\n },\n display: {\n ...MAT_NATIVE_DATE_FORMATS.display,\n dateInput: FudisDateInputFormat as Intl.DateTimeFormatOptions,\n },\n};\n","import { MatDatepickerIntl } from '@angular/material/datepicker';\nimport { FudisTranslationConfig } from '../../../../services/translation/translationKeys';\n\n/**\n * Update locale for Fudis translations in Datepicker\n *\n * @param value Language Signal string value\n * @returns Locale code\n */\nexport const updateLocale = (value: string): string => {\n switch (value) {\n case 'en':\n return 'en-GB';\n case 'fi':\n return 'fi-FI';\n case 'sv':\n return 'sv-SE';\n default:\n return 'en-GB';\n }\n};\n\n/**\n * Assign Fudis translation keys for Datepicker\n */\nexport const updateMatDatePickerTranslations = (\n translations: FudisTranslationConfig,\n datepickerIntl: MatDatepickerIntl,\n): MatDatepickerIntl => {\n const matDatePickerIntlToReturn = datepickerIntl;\n\n matDatePickerIntlToReturn.calendarLabel = translations.DATEPICKER.CALENDAR;\n matDatePickerIntlToReturn.closeCalendarLabel = translations.DATEPICKER.CLOSE;\n matDatePickerIntlToReturn.openCalendarLabel = translations.DATEPICKER.OPEN;\n matDatePickerIntlToReturn.prevMonthLabel = translations.DATEPICKER.PREV_MONTH;\n matDatePickerIntlToReturn.nextMonthLabel = translations.DATEPICKER.NEXT_MONTH;\n matDatePickerIntlToReturn.prevYearLabel = translations.DATEPICKER.PREV_YEAR;\n matDatePickerIntlToReturn.nextYearLabel = translations.DATEPICKER.NEXT_YEAR;\n matDatePickerIntlToReturn.prevMultiYearLabel = translations.DATEPICKER.PREV_MULTIYEAR;\n matDatePickerIntlToReturn.nextMultiYearLabel = translations.DATEPICKER.NEXT_MULTIYEAR;\n matDatePickerIntlToReturn.switchToMonthViewLabel = translations.DATEPICKER.SWITCH_MONTH_VIEW;\n matDatePickerIntlToReturn.switchToMultiYearViewLabel =\n translations.DATEPICKER.SWITCH_MULTIYEAR_VIEW;\n\n return matDatePickerIntlToReturn;\n};\n\n/**\n * Parse date input to number array\n *\n * @returns New Date(year, monthIndex, day) or null\n */\nexport const parseDate = (value: string | null | undefined): Date | null => {\n // Split input value by non number values, e.g. 25/5/1977 or 25.5.1977 --> [25,5,1977]\n const numberArray: number[] | null = value\n ? value\n .split(/[^\\d+]+/)\n .filter(Number)\n .map(Number)\n : null;\n\n // If day, month and year are provided. Year must have 4 digits.\n if (numberArray?.length === 3 && numberArray[2].toString().length === 4) {\n const newDate = new Date(numberArray[2], numberArray[1] - 1, numberArray[0]);\n\n const dayUnchanged = newDate.getDate() === numberArray[0];\n const monthUnchanged = newDate.getMonth() + 1 === numberArray[1];\n const yearUnChanged = newDate.getFullYear() === numberArray[2];\n\n if (dayUnchanged && monthUnchanged && yearUnChanged) {\n return newDate;\n } else {\n return null;\n }\n }\n // If no year is provided, assume it is current year\n if (numberArray?.length === 2) {\n const currentYear: number = new Date().getFullYear();\n\n const newDate = new Date(currentYear, numberArray[1] - 1, numberArray[0]);\n\n const dayUnchanged = newDate.getDate() === numberArray[0];\n const monthUnchanged = newDate.getMonth() + 1 === numberArray[1];\n\n if (dayUnchanged && monthUnchanged) {\n return newDate;\n } else {\n return null;\n }\n }\n\n // If input value is not parseable to Date object, return null\n return null;\n};\n","import { Injectable } from '@angular/core';\nimport { NativeDateAdapter } from '@angular/material/core';\nimport { FudisDateInputFormat } from '../../../../types/forms';\nimport { parseDate } from './utilities';\n\n@Injectable()\nexport class FudisDateAdapter extends NativeDateAdapter {\n /**\n * Original file:\n * https://github.com/angular/components/blob/main/src/material/core/datetime/native-date-adapter.ts\n */\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n override parse(value: any): Date | null {\n return parseDate(value);\n }\n\n override format(date: Date, displayFormat: object): string {\n if (!this.isValid(date)) {\n throw Error('FudisDateAdapter: Cannot format invalid date.');\n }\n\n const dtf = new Intl.DateTimeFormat(this._selectLanguage(displayFormat), {\n ...displayFormat,\n timeZone: 'utc',\n });\n\n return this._formatInputToDate(dtf, date);\n }\n\n /**\n * Change the calendar starting day of the week from default 0 (Sunday) to 1 (Monday)\n */\n override getFirstDayOfWeek(): number {\n return 1;\n }\n\n /**\n * Determines from displayFormat value if the Date value is coming from the input field or from\n * the datepicker calendar. This ensures, that visible input value is always in Finnish DD.MM.YYYY\n * format, but calendar uses HTML lang in other context.\n */\n protected _selectLanguage(displayFormat: object): string {\n if (Object.prototype.valueOf.call(displayFormat) === FudisDateInputFormat) {\n return 'fi-FI';\n }\n return this.locale;\n }\n\n /**\n * @param dtf Intl.DateTimeFormat object, containing the desired string format. It must have\n * timeZone set to 'utc' to work fine\n * @param date Date from which we want to get the string representation according to dtf\n * @returns A Date object with its UTC representation based on the passed date info\n */\n private _formatInputToDate(dtf: Intl.DateTimeFormat, date: Date) {\n // Passing the year to the constructor causes year numbers <100 to be converted to 19xx.\n // To work around this we use `setUTCFullYear` and `setUTCHours` instead.\n const d = new Date();\n d.setUTCFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n d.setUTCHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n\n return dtf.format(d);\n }\n}\n","import { Directive, Input } from '@angular/core';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { FormCommonApiDirective } from '../form-common-api/form-common-api.directive';\nimport { FormControl } from '@angular/forms';\nimport { FudisFocusService } from '../../../services/focus/focus.service';\n\n@Directive({ selector: '[fudisControlComponentBase]' })\nexport class ControlComponentBaseDirective extends FormCommonApiDirective {\n constructor(_idService: FudisIdService, _focusService: FudisFocusService) {\n super(_idService, _focusService);\n }\n\n /**\n * FormControl for the input\n */\n @Input({ required: true }) control: FormControl;\n}\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { PopoverApiDirective } from '../../../directives/popover/popover-api.directive';\nimport { FudisTranslationService } from '../../../services/translation/translation.service';\nimport { IconButtonComponent } from '../../icon-button/icon-button.component';\n\n@Component({\n selector: 'fudis-label',\n templateUrl: './label.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [IconButtonComponent],\n})\nexport class LabelComponent extends PopoverApiDirective {\n constructor(protected _translationService: FudisTranslationService) {\n super();\n }\n\n /**\n * Id for label, e. g. used in Dropdown to link ngMaterial mat-select with 'aria-labelledby' to\n * fudis-label\n */\n @Input({ required: true }) id: string;\n\n /**\n * Text visible as label\n */\n @Input({ required: true }) text: string;\n\n /**\n * HTML 'for' attribute. E.g. if text-input's id is 'text-input-1', give this id as 'for'\n * attribute to the label\n */\n @Input() for: string;\n\n /**\n * Show text indicating if form element associated with the label is required or not\n */\n @Input() required: boolean | null;\n}\n","<!-- prettier-ignore -->\n<label #labelElementRef class=\"fudis-label\" [attr.for]=\"for\" [id]=\"id\">\n <div class=\"fudis-label__content\"\n ><span class=\"fudis-label__content__text\"\n >{{ text }}@if (required) {\n <span class=\"fudis-label__content__space\"></span>\n }@if (required) {\n <span class=\"fudis-label__content__required\"\n >({{ _translationService.getTranslations()().REQUIRED }})</span\n >\n }\n </span>\n </div>\n @if (popoverText && popoverTriggerLabel) {\n <fudis-icon-button\n class=\"fudis-label__content__button\"\n [size]=\"'extra-small'\"\n [variant]=\"'tertiary'\"\n [icon]=\"'info-circle'\"\n [ariaLabel]=\"popoverTriggerLabel\"\n [popoverText]=\"popoverText\"\n [popoverPosition]=\"popoverPosition\"\n />\n }\n</label>\n","import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core';\nimport { FudisIdService } from '../../../../services/id/id.service';\nimport { BehaviorSubject } from 'rxjs';\nimport { FudisComponentChanges } from '../../../../types/miscellaneous';\n\n/**\n * Allows selection of a start and end date.\n *\n * Use this component when user needs to define a time interval. Wrap two `fudis-datepicker`\n * components — mark them with `fudisDateStart` and `fudisDateEnd` directives.\n *\n * @example\n * ```html\n * <fudis-date-range>\n * <fudis-datepicker fudisDateStart [label]=\"'Start'\" [control]=\"startDate\"></fudis-datepicker>\n * <fudis-datepicker fudisDateEnd [label]=\"'End'\" [control]=\"endDate\"></fudis-datepicker>\n * </fudis-date-range>\n * ```;\n */\n@Component({\n selector: 'fudis-date-range',\n templateUrl: './date-range.component.html',\n styleUrls: ['./date-range.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DateRangeComponent implements OnChanges {\n constructor(private _idService: FudisIdService) {}\n\n /**\n * Internal date comparison parse. By setting to false date comparison parsing is not executed and\n * comparison errors are not shown.\n */\n @Input() dateComparisonParse: boolean = true;\n\n /**\n * Show date comparison errors\n */\n public showDateComparisonErrors: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\n\n /**\n * Date value for start date\n */\n private _startDateValue: Date | null;\n\n /**\n * Date value for end date\n */\n private _endDateValue: Date | null;\n\n ngOnChanges(changes: FudisComponentChanges<DateRangeComponent>): void {\n const dateComparisonParse = changes.dateComparisonParse?.currentValue;\n const dateComparisonParseChanged =\n changes.dateComparisonParse?.currentValue !== changes.dateComparisonParse?.previousValue;\n\n if (dateComparisonParseChanged) {\n if (dateComparisonParse) {\n this.checkDateCrossings();\n } else if (dateComparisonParse === false) {\n this.showDateComparisonErrors.next(false);\n }\n }\n }\n\n /**\n * Check if start date is set to after end date\n */\n public checkDateCrossings(value?: Date | null, type?: 'start' | 'end'): void {\n if (value && type === 'start') {\n this._startDateValue = value;\n } else if (value && type === 'end') {\n this._endDateValue = value;\n }\n\n /* Show date comparison errors only if there are both date values and comparison is allowed.\n * Compare only dates, do not take hours into account.\n */\n if (\n this._startDateValue &&\n this._endDateValue &&\n this._startDateValue.setHours(0, 0, 0, 0) > this._endDateValue.setHours(0, 0, 0, 0) &&\n this.dateComparisonParse\n ) {\n this.showDateComparisonErrors.next(true);\n } else if (this.showDateComparisonErrors.value !== false) {\n this.showDateComparisonErrors.next(false);\n }\n }\n}\n","<div class=\"fudis-date-range\">\n <ng-content select=\"[fudisDateStart]\"></ng-content>\n <ng-content select=\"[fudisDateEnd]\"></ng-content>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n Host,\n HostListener,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n ViewChild,\n ViewEncapsulation,\n effect,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { FormControl, AbstractControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core';\nimport {\n MatDatepicker,\n MatDatepickerIntl,\n MatDatepickerInput,\n MatDatepickerToggle,\n MatDatepickerToggleIcon,\n} from '@angular/material/datepicker';\nimport { FUDIS_DATE_FORMATS, FudisInputSize } from '../../../../types/forms';\nimport { FudisIdService } from '../../../../services/id/id.service';\nimport { FudisTranslationService } from '../../../../services/translation/translation.service';\nimport { parseDate, updateLocale, updateMatDatePickerTranslations } from '../date-common/utilities';\nimport { FudisFocusService } from '../../../../services/focus/focus.service';\nimport { FudisValidatorUtilities } from '../../../../utilities/form/validator-utilities';\nimport { FudisValidatorFn } from '../../../../types/validators';\nimport { FudisComponentChanges } from '../../../../types/miscellaneous';\nimport { FudisDateAdapter } from '../date-common/date-adapter';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DateRangeComponent } from '../date-range/date-range.component';\nimport { ControlComponentBaseDirective } from '../../../../directives/form/control-component-base/control-component-base.directive';\nimport { FudisDialogService } from '../../../../services/dialog/dialog.service';\nimport { LabelComponent } from '../../label/label.component';\nimport { MatSuffix } from '@angular/material/form-field';\nimport { IconComponent } from '../../../icon/icon.component';\nimport { GuidanceComponent } from '../../guidance/guidance.component';\nimport { AsyncPipe } from '@angular/common';\n\n/**\n * Allows selection of a single date.\n *\n * Use this component for date input with calendar assistance and validation.\n */\n@Component({\n selector: 'fudis-datepicker',\n templateUrl: './datepicker.component.html',\n styleUrls: ['./datepicker.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: DateAdapter,\n useClass: FudisDateAdapter,\n deps: [MAT_DATE_LOCALE],\n },\n { provide: MAT_DATE_FORMATS, useValue: FUDIS_DATE_FORMATS },\n ],\n imports: [\n LabelComponent,\n MatDatepickerInput,\n FormsModule,\n ReactiveFormsModule,\n MatDatepickerToggle,\n MatSuffix,\n MatDatepickerToggleIcon,\n IconComponent,\n MatDatepicker,\n GuidanceComponent,\n AsyncPipe,\n ],\n})\nexport class DatepickerComponent\n extends ControlComponentBaseDirective\n implements OnInit, OnChanges, AfterViewInit, OnDestroy\n{\n constructor(\n @Host() @Optional() protected _parentDateRange: DateRangeComponent | null,\n private _adapter: DateAdapter<Date>,\n private _datePickerConfigService: FudisTranslationService,\n private _datepickerIntl: MatDatepickerIntl,\n private _translationService: FudisTranslationService,\n private _dialogService: FudisDialogService,\n _idService: FudisIdService,\n _focusService: FudisFocusService,\n ) {\n super(_idService, _focusService);\n\n /**\n * Set and delete errors from Date Range start and end date inputs\n */\n if (_parentDateRange) {\n _parentDateRange?.showDateComparisonErrors.pipe(takeUntilDestroyed()).subscribe((value) => {\n const currentErrors = this.control?.errors;\n\n if (value) {\n if (this.dateRangeType === 'start') {\n this.control?.setErrors({\n ...currentErrors,\n datepickerStartDateInvalid: { message: this._startDateInvalidTranslation },\n });\n } else if (this.dateRangeType === 'end') {\n this.control?.setErrors({\n ...currentErrors,\n datepickerEndDateInvalid: { message: this._endDateInvalidTranslation },\n });\n }\n this.control?.markAllAsTouched();\n } else {\n if (currentErrors) {\n delete currentErrors['datepickerStartDateInvalid'];\n delete currentErrors['datepickerEndDateInvalid'];\n\n this.control?.setErrors({ ...currentErrors });\n this.control?.updateValueAndValidity();\n }\n }\n });\n }\n\n this._updateValueAndValidityTrigger.pipe(takeUntilDestroyed()).subscribe(() => {\n if (this.control) {\n this._required.next(FudisValidatorUtilities.required(this.control));\n this._minDate = FudisValidatorUtilities.minDate(this.control);\n this._maxDate = FudisValidatorUtilities.maxDate(this.control);\n }\n });\n\n effect(() => {\n _adapter.setLocale(updateLocale(_translationService.getLanguageSignal()()));\n\n const translations = _translationService.getTranslations()();\n\n this._dateParseError.next(translations.DATEPICKER.VALIDATION.DATE_PARSE);\n\n _datepickerIntl = updateMatDatePickerTranslations(translations, _datepickerIntl);\n\n this._startDateInvalidTranslation =\n this._translationService.getTranslations()().DATEPICKER.VALIDATION.START_DATE_INVALID;\n this._endDateInvalidTranslation =\n this._translationService.getTranslations()().DATEPICKER.VALIDATION.END_DATE_INVALID;\n\n this._placeholderString.next(translations.DATEPICKER.PLACEHOLDER);\n });\n }\n\n /**\n * Template reference for MatDatepicker component\n */\n @ViewChild('picker') protected _picker: MatDatepicker<Date>;\n\n /**\n * FormControl for the input\n */\n @Input({ required: true }) override control: FormControl<Date | null>;\n\n /**\n * Datepicker size\n */\n @Input() size: FudisInputSize = 'md';\n\n /**\n * Show internal date parsing validator message. By setting to false date parsing is not executed.\n */\n @Input() dateParse: boolean = true;\n\n /**\n * Function that determines which dates are selectable in the calendar. Used the same way as\n * Angular Material's `matDatepickerFilter`. Return `true` to allow the date, or `false` to\n * disable it.\n */\n @Input() dateFilter: (d: Date | null | undefined) => boolean;\n\n /**\n * Type of the Datepicker in Date Range\n */\n public dateRangeType: 'start' | 'end' | null = null;\n\n /**\n * Allowed range for minimun date\n */\n protected _minDate: Date | null | undefined;\n\n /**\n * Allowed range for maximum date\n */\n protected _maxDate: Date | null | undefined;\n\n /**\n * Fudis translation for invalid start date in Date Range\n */\n protected _startDateInvalidTranslation: string;\n\n /**\n * Fudis translation for invalid end date in Date Range\n */\n protected _endDateInvalidTranslation: string;\n\n /**\n * Fudis translation for date parse error message\n */\n protected _dateParseError = new BehaviorSubject<string>('');\n\n /**\n * Fudis translation for Datepicker placeholder text\n */\n protected _placeholderString = new BehaviorSubject<string>('');\n\n /**\n * Signals reflecting the current state of the form control, updated on every control event.\n */\n protected _touched: WritableSignal<boolean> = signal(false);\n protected _invalid: WritableSignal<boolean> = signal(false);\n protected _disabled: WritableSignal<boolean> = signal(false);\n\n private _syncControlState(): void {\n this._touched.set(this.control.touched);\n this._invalid.set(this.control.invalid);\n this._disabled.set(this.control.disabled);\n }\n\n /**\n * Instance of Datepicker Parse validator\n */\n private _parseValidatorInstance: FudisValidatorFn | null;\n\n /**\n * Subscription for handling the valueChanges observable\n */\n private _subscription: Subscription;\n private _dateCrossingSubscription: Subscription;\n\n /**\n * Validator reads HTML input field and checks if it can be converted to valid Date object\n */\n private _datepickerParseValidatorFn(): FudisValidatorFn {\n return (control: AbstractControl) => {\n if (!control) {\n return null;\n }\n\n const inputElValue = this._inputRef?.nativeElement?.value;\n const isValidDate = inputElValue ? parseDate(inputElValue) : false;\n\n if (!!inputElValue && !isValidDate) {\n return { datepickerDateParse: { message: this._dateParseError } };\n }\n return null;\n };\n }\n\n private _addParseValidator(): void {\n this._parseValidatorInstance = this._datepickerParseValidatorFn();\n this.control.addValidators(this._parseValidatorInstance);\n }\n\n private _removeParseValidator(): void {\n if (this._parseValidatorInstance) {\n this.control.removeValidators(this._parseValidatorInstance);\n this._parseValidatorInstance = null;\n }\n }\n\n private _isCalendarOpen(): boolean {\n return this._picker?.opened || false;\n }\n\n /**\n * Handle calendar close\n */\n protected _handleCalendarClose(): void {\n this.control.updateValueAndValidity();\n }\n\n ngOnInit(): void {\n this._setComponentId('datepicker');\n\n if (!this._parseValidatorInstance && this.dateParse) {\n this._addParseValidator();\n }\n }\n\n override ngAfterViewInit(): void {\n super.ngAfterViewInit();\n\n const inputElValue = this._inputRef?.nativeElement?.value;\n const isValidDate = inputElValue ? parseDate(inputElValue) : false;\n\n if (isValidDate !== false) {\n this._parentDateRange?.checkDateCrossings(isValidDate, this.dateRangeType!);\n }\n }\n\n ngOnChanges(changes: FudisComponentChanges<DatepickerComponent>): void {\n // If prop dateParse value changes, add or remove validator accordingly\n if (changes.dateParse?.currentValue !== changes.dateParse?.previousValue) {\n if (changes.dateParse?.currentValue && !this._parseValidatorInstance) {\n this._addParseValidator();\n } else if (!changes.dateParse?.currentValue && this._parseValidatorInstance) {\n this._removeParseValidator();\n }\n }\n\n // Do checks for the control to define attributes used in e.g. HTML\n if (changes.control?.currentValue !== changes.control?.previousValue) {\n this._subscription?.unsubscribe();\n this._syncControlState();\n this._updateValueAndValidityTrigger.next();\n\n // Subscribe to control events to update the state signals and trigger value and validity updates\n this._subscription = this.control.events\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => {\n this._syncControlState();\n this._updateValueAndValidityTrigger.next();\n });\n\n // Subscribe to control value changes and call parent's date crossing check with current value and Date Range input type\n if (this._parentDateRange && this.dateRangeType) {\n this._dateCrossingSubscription?.unsubscribe();\n this._dateCrossingSubscription = this.control.valueChanges\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((value) => {\n this._parentDateRange?.checkDateCrossings(value, this.dateRangeType!);\n });\n }\n\n // If control changes and these checks are on, add parseValidator\n if (!this._parseValidatorInstance && this.dateParse) {\n this._addParseValidator();\n }\n }\n }\n\n ngOnDestroy(): void {\n this._removeParseValidator();\n }\n\n /**\n * When pressing keyboard Esc, close datepicker and set flag to indicate it was just closed with\n * Escape key\n *\n * @param event\n */\n @HostListener('window:keydown', ['$event'])\n protected _handleEscapePress(event: KeyboardEvent) {\n if (event.key === 'Escape' && this._isCalendarOpen()) {\n event.preventDefault();\n event.stopPropagation();\n this._dialogService.dropdownClosedWithEscape();\n this._picker.close();\n }\n }\n}\n","<div class=\"fudis-datepicker fudis-input-size__{{ size }}\">\n <fudis-label\n [id]=\"id + '-label'\"\n [for]=\"id\"\n [text]=\"label\"\n [required]=\"_required | async\"\n [popoverText]=\"popoverText\"\n [popoverPosition]=\"popoverPosition\"\n [popoverTriggerLabel]=\"popoverTriggerLabel\"\n ></fudis-label>\n <div class=\"fudis-datepicker__input-wrapper\">\n <input\n #inputRef\n class=\"fudis-form-input fudis-datepicker__input\"\n [id]=\"id\"\n [matDatepicker]=\"picker\"\n [matDatepickerFilter]=\"dateFilter\"\n [formControl]=\"control\"\n (focus)=\"onFocus($event)\"\n (blur)=\"handleBlur.emit($event)\"\n (keyup)=\"handleKeyUp.emit($event)\"\n [min]=\"_minDate\"\n [max]=\"_maxDate\"\n [placeholder]=\"_placeholderString | async\"\n [attr.tabindex]=\"disabled ? -1 : null\"\n [attr.aria-disabled]=\"_disabled() || disabled || null\"\n [attr.aria-invalid]=\"(_invalid() && _touched()) || null\"\n [attr.required]=\"(_required | async) || null\"\n [attr.aria-describedby]=\"id + '_guidance'\"\n />\n <mat-datepicker-toggle\n matSuffix\n class=\"fudis-datepicker__toggle\"\n [id]=\"id + '-calendar-icon-toggle'\"\n [for]=\"picker\"\n [disabled]=\"_disabled() || disabled\"\n [disableRipple]=\"true\"\n >\n <mat-icon matDatepickerToggleIcon>\n <fudis-icon\n [icon]=\"'calendar'\"\n [color]=\"_disabled() || disabled ? 'gray-dark' : 'primary'\"\n ></fudis-icon>\n </mat-icon>\n </mat-datepicker-toggle>\n <mat-datepicker\n #picker\n panelClass=\"fudis-datepicker__datepicker\"\n (closed)=\"_handleCalendarClose()\"\n ></mat-datepicker>\n </div>\n @if (!disableGuidance) {\n <fudis-guidance [inputLabel]=\"label\" [helpText]=\"helpText\" [for]=\"id\" [control]=\"control\">\n <ng-content select=\"fudis-error-message\" />\n </fudis-guidance>\n }\n</div>\n","import {\n Component,\n Input,\n OnInit,\n OnChanges,\n ChangeDetectionStrategy,\n signal,\n Signal,\n} from '@angular/core';\nimport { GridApiDirective } from '../../directives/grid/grid-api/grid-api.directive';\nimport { FudisComponentChanges, FudisDescriptionListVariant } from '../../types/miscellaneous';\nimport { FudisIdService } from '../../services/id/id.service';\nimport { FudisGridGap } from '../../types/grid';\nimport { BehaviorSubject } from 'rxjs';\nimport { NgTemplateOutlet, AsyncPipe } from '@angular/common';\nimport { GridDirective } from '../../directives/grid/grid/grid.directive';\n\n/**\n * Displays a collection of term-details pairs of related information.\n *\n * Use this component to present structured information with proper semantic relationships.\n */\n@Component({\n selector: 'fudis-dl',\n templateUrl: './description-list.component.html',\n styleUrls: ['./description-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, GridDirective, AsyncPipe],\n})\nexport class DescriptionListComponent extends GridApiDirective implements OnInit, OnChanges {\n constructor(private _idService: FudisIdService) {\n super();\n this.id = this._idService.getNewGrandParentId('description-list');\n }\n\n /**\n * Disable Grid behavior for Description List\n */\n @Input() disableGrid: boolean = false;\n\n /**\n * Variant for Description List structure and layout: 'regular' | 'compact'\n */\n @Input() variant: FudisDescriptionListVariant = 'regular';\n\n /**\n * Grid row gap. Using Fudis spacing token values of xxs to xxl and none.\n */\n @Input() override rowGap: FudisGridGap = 'sm';\n\n /**\n * HTML element to render. If your Description List has only one item, use 'p', otherwise 'dl'.\n */\n @Input() tag: 'dl' | 'p' = 'dl';\n\n /**\n * Id generated with Id Service\n */\n public id: string;\n\n /**\n * CSS class list\n */\n protected _classList = new BehaviorSubject<string>('');\n\n /**\n * Signal for variant\n */\n private _dlVariant = signal<FudisDescriptionListVariant>('regular');\n\n /**\n * Signal for listening disableGrid Input, used in DL Item.\n */\n private _disabledGrid = signal<boolean>(false);\n\n ngOnInit(): void {\n this._setClasses();\n }\n\n ngOnChanges(changes: FudisComponentChanges<DescriptionListComponent>): void {\n if (\n changes.variant?.currentValue &&\n changes.variant?.currentValue !== changes.variant?.previousValue\n ) {\n this._dlVariant.set(changes.variant.currentValue);\n }\n\n if (changes.disableGrid?.currentValue !== changes.disableGrid?.previousValue) {\n this._setClasses();\n const disableGrid = !!changes.disableGrid?.currentValue;\n this._disabledGrid.set(disableGrid);\n }\n }\n\n /**\n * Read only signal for variant\n */\n public getVariant(): Signal<FudisDescriptionListVariant> {\n return this._dlVariant.asReadonly();\n }\n\n /**\n * Read only signal for disabledGrid value\n */\n public getDisabledGridStatus(): Signal<boolean> {\n return this._disabledGrid.asReadonly();\n }\n\n /**\n * Define correct CSS classes\n */\n private _setClasses(): void {\n const cssClasses = [];\n\n cssClasses.push('fudis-dl');\n\n if (this.disableGrid) {\n cssClasses.push('fudis-dl__disabled-grid');\n }\n\n const combined = this.classes ? cssClasses.concat(this.classes) : cssClasses;\n\n this._classList.next(combined.join(' '));\n }\n}\n","@if (tag === \"p\") {\n <ng-container *ngTemplateOutlet=\"singleItem\" />\n}\n\n@if (tag === \"dl\" && !disableGrid) {\n <ng-container *ngTemplateOutlet=\"multipleItems\" />\n}\n\n@if (tag === \"dl\" && disableGrid) {\n <ng-container *ngTemplateOutlet=\"disabledGrid\" />\n}\n\n<ng-template #disabledGrid>\n <dl [id]=\"id\" [class]=\"_classList | async\" role=\"list\">\n <ng-container *ngTemplateOutlet=\"dlContent\"></ng-container>\n </dl>\n</ng-template>\n\n<ng-template #singleItem>\n <div [id]=\"id\" [class]=\"_classList | async\">\n <ng-container *ngTemplateOutlet=\"dlContent\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #multipleItems>\n @if (_classList | async; as classes) {\n <dl\n fudisGrid\n [id]=\"id\"\n [width]=\"width\"\n [align]=\"align\"\n [alignItemsX]=\"alignItemsX\"\n [alignItemsY]=\"alignItemsY\"\n [classes]=\"classes\"\n [serviceDefaults]=\"false\"\n [columnGap]=\"columnGap\"\n [rowGap]=\"variant === 'compact' ? 'none' : rowGap\"\n [columns]=\"columns ? columns : 2\"\n role=\"list\"\n >\n <ng-container *ngTemplateOutlet=\"dlContent\"></ng-container>\n </dl>\n }\n</ng-template>\n\n<ng-template #dlContent>\n <ng-content></ng-content>\n</ng-template>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Host,\n Signal,\n effect,\n signal,\n} from '@angular/core';\nimport {\n FudisDescriptionListVariant,\n FudisLanguageAbbr,\n FudisDescriptionListItemDetailLanguageContent,\n} from '../../../types/miscellaneous';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { DescriptionListComponent } from '../description-list.component';\nimport { BehaviorSubject } from 'rxjs';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { NgTemplateOutlet, AsyncPipe } from '@angular/common';\n\n/**\n * Represents a single term-detail pair.\n *\n * Use this component to group related description list terms and details together.\n */\n@Component({\n selector: 'fudis-dl-item',\n styleUrls: ['./description-list-item.component.scss'],\n templateUrl: './description-list-item.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, AsyncPipe],\n})\nexport class DescriptionListItemComponent {\n constructor(\n private _element: ElementRef,\n private _idService: FudisIdService,\n @Host() protected _parentDl: DescriptionListComponent,\n ) {\n this.id = _idService.getNewGroupId('description-list', this._parentDl.id);\n\n toObservable(_parentDl.getVariant())\n .pipe(takeUntilDestroyed())\n .subscribe((newVariant) => {\n if (newVariant === 'regular') {\n this._variant.next('regular');\n this._updateChildren();\n } else {\n this._variant.next('compact');\n this._updateChildren();\n }\n });\n\n /**\n * Listens to parent's changes and updates CSS classes.\n */\n\n effect(() => {\n const disabled = _parentDl.getDisabledGridStatus()();\n\n this._setClasses(disabled, this._variant.value);\n });\n }\n\n /**\n * Main CSS class\n */\n protected _mainCssClass: BehaviorSubject<string> = new BehaviorSubject<string>('fudis-dl-item');\n\n /**\n * Storing list of available languages in Details elements\n */\n private _detailsLanguageOptions = signal<FudisDescriptionListItemDetailLanguageContent | null>(\n null,\n );\n\n /**\n * Selected language to pass to child components\n */\n private _selectedLanguage = signal<FudisLanguageAbbr | null>(null);\n\n /**\n * Current parent variant\n */\n private _variant = new BehaviorSubject<FudisDescriptionListVariant>('regular');\n\n /**\n * List of Description List Item Detail children ids\n */\n private _detailChildrenIds: string[];\n\n /**\n * Last Description List Item Detail id passed to children\n */\n private _lastChildId = signal<string | null>(null);\n\n /**\n * Returns a last child id of selected language.\n */\n private _findLastLanguageChildId(lang: FudisLanguageAbbr): string | null {\n const data = this._detailsLanguageOptions();\n\n if (data && data[lang]) {\n const keys = Object.keys(data[lang]);\n return keys.length > 0 ? keys[keys.length - 1] : null;\n }\n\n return null;\n }\n\n /**\n * Returns a compact list last child id for Description List Item Detail component.\n */\n private _updateChildren(): void {\n if (this._variant.value !== 'compact') {\n this._lastChildId.set(null);\n return;\n }\n\n const selectedLang = this._selectedLanguage();\n\n if (selectedLang) {\n const lang = selectedLang as FudisLanguageAbbr;\n\n const lastChildId = this._findLastLanguageChildId(lang);\n this._lastChildId.set(lastChildId);\n } else {\n this._detailChildrenIds = this._idService.getDlGrandChildrensIds(\n 'details',\n this._parentDl.id,\n this.id,\n );\n\n const lastChildId = this._detailChildrenIds?.length\n ? this._detailChildrenIds[this._detailChildrenIds.length - 1]\n : null;\n this._lastChildId.set(lastChildId);\n }\n }\n\n /**\n * DL Item has combined styles for both regular and compact versions but some styles only apply to\n * regular version if parent's disableGrid is true.\n */\n private _setClasses(disabledGrid: boolean, parentVariant: FudisDescriptionListVariant): void {\n if (disabledGrid && parentVariant !== 'compact') {\n this._mainCssClass.next('fudis-dl-item__disabled-grid');\n } else {\n this._mainCssClass.next('fudis-dl-item');\n }\n }\n\n /**\n * Id generated with Id Service\n */\n public id: string;\n\n /**\n * Called from child Details, if it has a language property\n */\n public addDetailsLanguage(lang: FudisLanguageAbbr, text: string | null, id: string): void {\n const currentContent: FudisDescriptionListItemDetailLanguageContent =\n this._detailsLanguageOptions() || {};\n\n if (!currentContent[lang]) {\n currentContent[lang] = {};\n }\n\n currentContent[lang]![id] = text;\n\n this._detailsLanguageOptions.set({ ...currentContent });\n }\n\n /**\n * Called from child Details, if its language property is removed (or updated)\n */\n public removeDetailsLanguage(lang: FudisLanguageAbbr, id: string): void {\n const currentContent: FudisDescriptionListItemDetailLanguageContent =\n this._detailsLanguageOptions() || {};\n\n if (currentContent[lang as FudisLanguageAbbr]?.[id]) {\n delete currentContent[lang]![id];\n }\n\n if (currentContent[lang] && Object.keys(currentContent[lang]!).length === 0) {\n delete currentContent[lang];\n }\n\n if (Object.keys(currentContent).length !== 0) {\n this._detailsLanguageOptions.set({ ...currentContent });\n } else {\n this._detailsLanguageOptions.set(null);\n }\n }\n\n public getDetailsLanguageOptions(): Signal<FudisDescriptionListItemDetailLanguageContent | null> {\n return this._detailsLanguageOptions.asReadonly();\n }\n\n public setSelectedLanguage(lang: FudisLanguageAbbr | null): void {\n this._selectedLanguage.set(lang);\n\n this._updateChildren();\n }\n\n public getSelectedLanguage(): Signal<FudisLanguageAbbr | null> {\n return this._selectedLanguage.asReadonly();\n }\n\n public getLastChildId(): Signal<string | null> {\n return this._lastChildId.asReadonly();\n }\n}\n","@if (_parentDl.tag === \"p\") {\n <ng-container *ngTemplateOutlet=\"singleItem\" />\n}\n\n@if (_parentDl.tag === \"dl\") {\n <ng-container *ngTemplateOutlet=\"multipleItems\" />\n}\n\n<ng-template #multipleItems>\n <div [id]=\"id\" [class]=\"_mainCssClass | async\" role=\"listitem\">\n <ng-container *ngTemplateOutlet=\"dlItemContent\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #singleItem>\n <p [id]=\"id\" [class]=\"_mainCssClass | async\">\n <ng-container *ngTemplateOutlet=\"dlItemContent\"></ng-container>\n </p>\n</ng-template>\n\n<ng-template #dlItemContent>\n <ng-content></ng-content>\n</ng-template>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Host,\n HostBinding,\n Input,\n OnChanges,\n OnDestroy,\n} from '@angular/core';\nimport { FudisComponentChanges, FudisLanguageAbbr } from '../../../../types/miscellaneous';\nimport { DescriptionListItemComponent } from '../description-list-item.component';\nimport { DescriptionListComponent } from '../../description-list.component';\nimport { FudisIdService } from '../../../../services/id/id.service';\nimport { BehaviorSubject } from 'rxjs';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { FudisTranslationService } from '../../../../services/translation/translation.service';\nimport { NgTemplateOutlet, AsyncPipe } from '@angular/common';\n\n/**\n * Displays the details (value) of a term (key) in a DescriptionListItemComponent.\n */\n@Component({\n selector: 'fudis-dd',\n templateUrl: './description-list-item-details.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, AsyncPipe],\n})\nexport class DescriptionListItemDetailsComponent implements OnChanges, OnDestroy {\n constructor(\n private _elementRef: ElementRef,\n private _idService: FudisIdService,\n protected _translationService: FudisTranslationService,\n @Host() protected _parentDlItem: DescriptionListItemComponent,\n @Host() protected _parentDl: DescriptionListComponent,\n ) {\n this._id = this._idService.getNewDlGrandChilId(\n 'details',\n this._parentDl.id,\n this._parentDlItem.id,\n );\n\n toObservable(_parentDl.getVariant())\n .pipe(takeUntilDestroyed())\n .subscribe((newVariant) => {\n if (newVariant === 'regular') {\n this._mainCssClass.next('fudis-dl-item-details__regular');\n } else {\n this._mainCssClass.next('fudis-dl-item-details__compact');\n }\n });\n\n toObservable(_parentDlItem.getLastChildId())\n .pipe(takeUntilDestroyed())\n .subscribe((lastCompactId) => {\n if (this._mainCssClass.value !== 'fudis-dl-item-details__compact') {\n this._lastChild.next(false);\n } else {\n this._lastChild.next(lastCompactId !== this._id);\n }\n });\n\n toObservable(_parentDlItem.getSelectedLanguage())\n .pipe(takeUntilDestroyed())\n .subscribe((newLang) => {\n this._langSelected.next(!!(this.lang && newLang === this.lang));\n });\n }\n\n /**\n * Binding host CSS class to component wrapper\n */\n @HostBinding('class') public hostClass = 'fudis-dl-item-details-host';\n\n /**\n * Details element language, possible values 'fi', 'sv' and 'en'.\n */\n @Input() lang: FudisLanguageAbbr;\n\n /**\n * Visible text content for Details\n */\n @Input() contentText: string;\n\n /**\n * Sub heading in between Term and Details elements\n */\n @Input() subHeading: string | undefined;\n\n /**\n * Aria-label for classified/hidden Details content\n */\n @Input() ariaLabel: string | null | undefined;\n\n /**\n * Show empty state content\n */\n @Input() emptyState: boolean = false;\n\n /**\n * Text displayed in Details element where emptyState boolean is true. If not provided, Fudis will\n * display its default empty state text\n */\n @Input() emptyStateContentText: string;\n\n /**\n * Id generated with Id Service\n */\n protected _id: string;\n\n /**\n * Selected language to show respective Details content\n */\n protected _langSelected = new BehaviorSubject<boolean>(false);\n\n /**\n * If current Detail element is a last child of it's parent\n */\n protected _lastChild = new BehaviorSubject<boolean>(false);\n\n /**\n * Main CSS class\n */\n protected _mainCssClass: BehaviorSubject<string> = new BehaviorSubject<string>(\n 'fudis-dl-item-details__regular',\n );\n\n /**\n * If component has language and has sent info to parent\n */\n private _detailsSent: boolean;\n\n /**\n * Parse Details text content and set parent Description List Item languages\n */\n private _sendDetailsLanguageToParent(): void {\n const parsedContentText =\n this.contentText && this.contentText.replace(/\\s/g, '') !== '' ? this.contentText : null;\n\n if (parsedContentText && !this._detailsSent) {\n this._parentDlItem.addDetailsLanguage(this.lang, parsedContentText, this._id);\n\n this._detailsSent = true;\n\n this.hostClass = `fudis-dl-item-details-host fudis-dl-item-details-host--${this.lang}`;\n }\n }\n\n private _removeDetailsFromParent(): void {\n if (this._detailsSent) {\n this._parentDlItem.removeDetailsLanguage(this.lang, this._id);\n this._detailsSent = false;\n this.hostClass = `fudis-dl-item-details-host`;\n }\n }\n\n ngOnChanges(changes: FudisComponentChanges<DescriptionListItemDetailsComponent>): void {\n // If language changes, update it to parent. If language changes to undefined, remove it from parent.\n if (!changes.lang?.firstChange && !!changes.lang?.currentValue) {\n this._removeDetailsFromParent();\n this._sendDetailsLanguageToParent();\n } else if (!changes.lang?.currentValue) {\n this._removeDetailsFromParent();\n }\n\n // If text content changes, update it to parent\n if (changes.contentText?.currentValue !== changes.contentText?.previousValue && this.lang) {\n this._sendDetailsLanguageToParent();\n }\n }\n\n ngOnDestroy(): void {\n this._removeDetailsFromParent();\n }\n}\n","@if (!lang || (_langSelected | async)) {\n @if (_parentDl.tag === \"p\") {\n <span [id]=\"_id\" [attr.lang]=\"lang\" [class]=\"_mainCssClass | async\">\n <ng-container *ngTemplateOutlet=\"ddContent\"></ng-container>\n </span>\n }\n @if (_parentDl.tag === \"dl\") {\n <dd [id]=\"_id\" [attr.lang]=\"lang\" [class]=\"_mainCssClass | async\">\n @if (!emptyState) {\n <ng-container *ngTemplateOutlet=\"ddContent\"></ng-container>\n } @else {\n <span class=\"fudis-text-emptystate\">{{\n emptyStateContentText ||\n _translationService.getTranslations()().DESCRIPTION_LIST_ITEM_DETAILS.EMPTY_STATE\n }}</span>\n }\n </dd>\n }\n}\n\n<ng-template #ddContent>\n @if (subHeading) {\n <span [class]=\"(_mainCssClass | async) + '__sub-heading'\">{{ subHeading }}</span>\n }\n <span [class]=\"(_mainCssClass | async) + '__content'\" [attr.aria-label]=\"ariaLabel\">\n @if (subHeading) {\n <span [class]=\"(_mainCssClass | async) + '__parenthesis'\"> (</span>\n }\n <span [attr.aria-hidden]=\"ariaLabel ? true : null\">{{ contentText }}</span>\n @if (subHeading) {\n <span [class]=\"(_mainCssClass | async) + '__parenthesis'\">)</span>\n }\n <ng-content\n /></span>\n @if (contentText && (_lastChild | async)) {\n <span [class]=\"(_mainCssClass | async) + '__comma'\" aria-hidden=\"true\">,</span>\n }\n</ng-template>\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n effect,\n} from '@angular/core';\nimport { FudisComponentChanges, FudisLanguageAbbr } from '../../../types/miscellaneous';\nimport { FudisTranslationService } from '../../../services/translation/translation.service';\nimport { FudisTranslationLanguageBadgeAriaLabel } from '../../../services/translation/translationKeys';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { BehaviorSubject } from 'rxjs';\nimport { AsyncPipe } from '@angular/common';\n\n@Component({\n selector: 'fudis-language-badge',\n styleUrls: ['./language-badge.component.scss'],\n templateUrl: './language-badge.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AsyncPipe],\n})\nexport class LanguageBadgeComponent implements OnChanges, OnInit {\n constructor(\n private _translationService: FudisTranslationService,\n private _idService: FudisIdService,\n ) {\n effect(() => {\n const translations = this._translationService.getTranslations()();\n\n this._selectedTranslation = translations.LANGUAGE_BADGE.ARIA_LABEL.SELECTED;\n this._missingTranslation = translations.LANGUAGE_BADGE.ARIA_LABEL.MISSING_TRANSLATION;\n this._labelTranslations = translations.LANGUAGE_BADGE.ARIA_LABEL;\n\n this._setLabel();\n });\n }\n\n /*\n * Language abbreviation for Language Badge\n */\n @Input({ required: true }) language: FudisLanguageAbbr;\n\n /*\n * Parent group's id\n */\n @Input({ required: true }) parentId: string;\n\n /*\n * Selected state of a Language Badge\n */\n @Input() selected: boolean;\n\n /*\n * Language Badge variant\n */\n @Input() variant: 'standard' | 'missing' = 'standard';\n\n /*\n * Assistive aria-label\n */\n @Input() ariaLabel: string;\n\n /**\n * Click handler outputting clicked language abbreviation\n */\n @Output() handleClick = new EventEmitter<FudisLanguageAbbr>();\n\n /**\n * Label string of the badge\n */\n protected _badgeLabel = new BehaviorSubject<string>('');\n\n /**\n * Internal variable for selected translation aria-label\n */\n protected _selectedTranslation: string;\n\n /**\n * Internal variable for missing translation aria-label\n */\n protected _missingTranslation: string;\n\n protected _labelTranslations: FudisTranslationLanguageBadgeAriaLabel;\n\n /**\n * Generated HTML id\n */\n protected _id: string;\n\n ngOnInit(): void {\n this._id = this._idService.getNewChildId('language-badge-group', this.parentId);\n }\n\n ngOnChanges(changes: FudisComponentChanges<LanguageBadgeComponent>): void {\n if (\n changes.selected?.currentValue !== changes.selected?.previousValue ||\n changes.variant?.currentValue !== changes.variant?.previousValue ||\n changes.language?.currentValue !== changes.language?.previousValue\n ) {\n if (this._labelTranslations && this._selectedTranslation && this._missingTranslation) {\n this._setLabel();\n }\n }\n }\n\n /**\n * Emit badge's language on click\n */\n protected _handleLanguageSelect(): void {\n this.handleClick.emit(this.language);\n }\n\n /**\n * Define correct label for Badge\n */\n private _setLabel(): void {\n let newLabel;\n\n const keyValue: string = this.language.toUpperCase();\n\n const label = this._labelTranslations[keyValue as keyof FudisTranslationLanguageBadgeAriaLabel];\n\n if (this.selected && this.variant !== 'missing') {\n newLabel = `${label} ${this._selectedTranslation}`;\n } else if (this.selected && this.variant === 'missing') {\n newLabel = `${label} ${this._missingTranslation} ${this._selectedTranslation}`;\n } else if (!this.selected && this.variant === 'missing') {\n newLabel = `${label} ${this._missingTranslation}`;\n } else {\n newLabel = label;\n }\n\n this._badgeLabel.next(newLabel);\n }\n}\n","@if (_badgeLabel | async; as badgeLabel) {\n <button\n type=\"button\"\n class=\"fudis-language-badge\"\n [attr.aria-label]=\"badgeLabel\"\n [attr.id]=\"_id\"\n (click)=\"_handleLanguageSelect()\"\n >\n <span\n [class.fudis-language-badge--selected]=\"selected\"\n class=\"fudis-language-badge__content fudis-language-badge__{{ variant }}\"\n >{{ language }}</span\n >\n </button>\n}\n","import {\n Component,\n EventEmitter,\n Output,\n Input,\n effect,\n ChangeDetectionStrategy,\n OnChanges,\n} from '@angular/core';\nimport { FudisComponentChanges, FudisLanguageAbbr } from '../../types/miscellaneous';\nimport { FudisTranslationService } from '../../services/translation/translation.service';\nimport { PopoverApiDirective } from '../../directives/popover/popover-api.directive';\nimport { FudisIdService } from '../../services/id/id.service';\nimport { BehaviorSubject } from 'rxjs';\nimport { LanguageBadgeComponent } from './language-badge/language-badge.component';\nimport { AsyncPipe } from '@angular/common';\n\ntype LanguageLabel = { key: FudisLanguageAbbr; variant: 'standard' | 'missing' };\ntype LanguageLabelArray = LanguageLabel[];\n\n/**\n * Displays a group of language indicators.\n *\n * Use this component to present available or active languages for content.\n */\n@Component({\n selector: 'fudis-language-badge-group',\n templateUrl: './language-badge-group.component.html',\n styleUrls: ['./language-badge-group.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LanguageBadgeComponent, AsyncPipe],\n})\nexport class LanguageBadgeGroupComponent extends PopoverApiDirective implements OnChanges {\n constructor(\n protected _translationService: FudisTranslationService,\n private _idService: FudisIdService,\n ) {\n super();\n this._id = _idService.getNewParentId('language-badge-group');\n\n effect(() => {\n this._groupAriaLabel.next(\n _translationService.getTranslations()().LANGUAGE_BADGE.ARIA_LABEL.TRANSLATIONS,\n );\n });\n\n effect(() => {\n this._selectableAppLanguages = _translationService.getSelectableLanguages()();\n this._currentAppLang = _translationService.getLanguageSignal()();\n\n if (this.translatedLanguages) {\n this._setLanguageOptions(this.translatedLanguages);\n this._determineSelectedBadge(this.translatedLanguages);\n }\n });\n }\n\n /**\n * Required list of translated languages for Language Badge Group\n */\n @Input({ required: true }) translatedLanguages: FudisLanguageAbbr[];\n /**\n * Output Language abbreviation of clicked Badge\n */\n @Output() handleClick = new EventEmitter<FudisLanguageAbbr | null>();\n\n /**\n * App language from service\n */\n private _currentAppLang: FudisLanguageAbbr;\n\n /**\n * App configured selectable languages from service\n */\n private _selectableAppLanguages: FudisLanguageAbbr[];\n\n /**\n * Generated HTML id for the group\n */\n protected _id: string;\n\n /**\n * Translation for aria-label\n */\n protected _groupAriaLabel = new BehaviorSubject<string>('');\n\n /**\n * Internal variable for matching languages and label texts\n */\n protected _languageLabels: BehaviorSubject<LanguageLabelArray> =\n new BehaviorSubject<LanguageLabelArray>([]);\n\n protected _selectedLanguage: FudisLanguageAbbr | null = null;\n\n /**\n * Set selected language and emits clicked language\n */\n protected _updateLanguage(value: FudisLanguageAbbr | null) {\n this._selectedLanguage = value;\n this.handleClick.emit(value);\n }\n\n /**\n * Creates an array to loop in template of wanted Language Badges\n */\n private _setLanguageOptions(availableContent: FudisLanguageAbbr[]): void {\n const tempLangLabels: LanguageLabelArray = [];\n\n this._selectableAppLanguages?.forEach((language) => {\n const variant = availableContent.includes(language) ? 'standard' : 'missing';\n\n const newItem: LanguageLabel = { key: language, variant };\n tempLangLabels.push(newItem);\n });\n\n this._languageLabels.next(tempLangLabels);\n }\n\n private _determineSelectedBadge(translatedLanguages: FudisLanguageAbbr[]): void {\n let determinedLanguage: FudisLanguageAbbr | null;\n\n if (\n translatedLanguages?.includes(this._currentAppLang) &&\n this._selectableAppLanguages.includes(this._currentAppLang)\n ) {\n determinedLanguage = this._currentAppLang;\n } else {\n const firstAvailable = this._selectableAppLanguages.find((lang) =>\n translatedLanguages.includes(lang),\n );\n\n if (firstAvailable) {\n determinedLanguage = firstAvailable as FudisLanguageAbbr;\n } else {\n determinedLanguage = null;\n }\n }\n this._updateLanguage(determinedLanguage);\n }\n\n ngOnChanges(changes: FudisComponentChanges<LanguageBadgeGroupComponent>) {\n const currentTranslated = changes.translatedLanguages?.currentValue;\n\n if (currentTranslated && changes.translatedLanguages?.previousValue !== currentTranslated) {\n this._setLanguageOptions(currentTranslated);\n }\n\n if (\n changes.translatedLanguages?.isFirstChange() &&\n currentTranslated &&\n this._selectableAppLanguages &&\n this._currentAppLang\n ) {\n this._determineSelectedBadge(currentTranslated);\n }\n }\n}\n","<section\n [attr.id]=\"_id\"\n [attr.aria-label]=\"_groupAriaLabel | async\"\n class=\"fudis-language-badge-group\"\n>\n @for (_language of _languageLabels | async; track _language.key; let index = $index) {\n <fudis-language-badge\n [parentId]=\"_id\"\n (handleClick)=\"_updateLanguage($event)\"\n [selected]=\"_selectedLanguage === _language.key\"\n [language]=\"_language.key\"\n [variant]=\"_language.variant\"\n />\n }\n</section>\n","import { ChangeDetectionStrategy, Component, Host, Input, signal, effect } from '@angular/core';\nimport { FudisLanguageAbbr } from '../../../../types/miscellaneous';\nimport { FudisTranslationService } from '../../../../services/translation/translation.service';\nimport { DescriptionListItemComponent } from '../description-list-item.component';\nimport { DescriptionListComponent } from '../../description-list.component';\nimport { FudisIdService } from '../../../../services/id/id.service';\nimport { BehaviorSubject } from 'rxjs';\nimport { PopoverApiDirective } from '../../../../directives/popover/popover-api.directive';\nimport { NgTemplateOutlet, AsyncPipe } from '@angular/common';\nimport { IconButtonComponent } from '../../../icon-button/icon-button.component';\nimport { LanguageBadgeGroupComponent } from '../../../language-badge-group/language-badge-group.component';\n\n/**\n * Displays the term (key) in a DescriptionListItemComponent.\n */\n@Component({\n selector: 'fudis-dt',\n templateUrl: './description-list-item-term.component.html',\n styleUrls: ['./description-list-item-term.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, IconButtonComponent, LanguageBadgeGroupComponent, AsyncPipe],\n})\nexport class DescriptionListItemTermComponent extends PopoverApiDirective {\n constructor(\n private _translationService: FudisTranslationService,\n private _idService: FudisIdService,\n @Host() protected _parentDlItem: DescriptionListItemComponent,\n @Host() protected _parentDl: DescriptionListComponent,\n ) {\n super();\n\n this._id = this._idService.getNewDlGrandChilId(\n 'term',\n this._parentDl.id,\n this._parentDlItem.id,\n );\n\n effect(() => {\n if (_parentDl.getVariant()() === 'regular') {\n this._mainCssClass.next('fudis-dl-item-term__regular');\n } else {\n this._mainCssClass.next('fudis-dl-item-term__compact');\n }\n });\n\n effect(() => {\n const parentLanguageOptions = _parentDlItem.getDetailsLanguageOptions()();\n\n if (parentLanguageOptions) {\n const translated: FudisLanguageAbbr[] = [];\n\n for (const [key, value] of Object.entries(parentLanguageOptions)) {\n if (Object.keys(value).some((itemId) => value[itemId] !== null)) {\n translated.push(<FudisLanguageAbbr>key);\n }\n }\n this._parentLanguageTranslations.set(translated);\n }\n });\n }\n\n /**\n * Renders Fudis Language Badge Group Component for displaying Description List Item Detail values\n * in given languages\n */\n @Input() languages: boolean = true;\n\n /**\n * Visible text content for term\n */\n @Input() contentText: string;\n\n /**\n * Available translated languages of sibling dt elements fetched from the parent dl-item element\n */\n protected _parentLanguageTranslations = signal<FudisLanguageAbbr[]>([]);\n\n /**\n * Main CSS class\n */\n protected _mainCssClass: BehaviorSubject<string> = new BehaviorSubject<string>(\n 'fudis-dl-item-term__regular',\n );\n\n /**\n * Id generated with Id Service\n */\n protected _id: string;\n\n /**\n * When Language Badge is clicked, update clicked language to parent item\n *\n * @param lang FudisLanguageAbbr\n */\n protected _setSelectedLanguage(lang: FudisLanguageAbbr | null): void {\n if (this.languages) {\n this._parentDlItem.setSelectedLanguage(lang);\n }\n }\n}\n","@if (_parentDl.tag === \"dl\") {\n <ng-container *ngTemplateOutlet=\"multipleItems\" />\n}\n\n@if (_parentDl.tag === \"p\") {\n <ng-container *ngTemplateOutlet=\"singleItem\" />\n}\n\n<ng-template #multipleItems>\n <dt [id]=\"_id\" [class]=\"_mainCssClass | async\">\n <ng-container *ngTemplateOutlet=\"commonContent\"></ng-container>\n </dt>\n</ng-template>\n\n<ng-template #singleItem>\n <span [id]=\"_id\" [class]=\"_mainCssClass | async\">\n <ng-container *ngTemplateOutlet=\"commonContent\"></ng-container>\n </span>\n</ng-template>\n\n<ng-template #commonContent>\n <span [class]=\"(_mainCssClass | async) + '__text-content'\">{{ contentText }}</span>\n @if (_mainCssClass.value === \"fudis-dl-item-term__compact\") {\n <span class=\"fudis-dl-item-term__compact__colon\">:</span>\n }\n @if (popoverTriggerLabel && popoverText) {\n <span [class]=\"(_mainCssClass | async) + '__popover'\">\n <fudis-icon-button\n [size]=\"'extra-small'\"\n [variant]=\"'tertiary'\"\n [icon]=\"'info-circle'\"\n [ariaLabel]=\"popoverTriggerLabel\"\n [popoverText]=\"popoverText\"\n [popoverPosition]=\"popoverPosition\"\n />\n </span>\n }\n\n @if (languages && _parentLanguageTranslations().length > 0) {\n <fudis-language-badge-group\n [translatedLanguages]=\"_parentLanguageTranslations()\"\n (handleClick)=\"_setSelectedLanguage($event)\"\n />\n }\n</ng-template>\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const throttle = (f: any, delay: number) => {\n let timer: NodeJS.Timeout;\n return (...args: unknown[]) => {\n clearTimeout(timer);\n timer = setTimeout(() => f.apply(this, args), delay);\n };\n};\n","/**\n * Here we check if the button element is disabled. If it is, close action is not triggered. In case\n * of a _elementRef, it takes the exact element that is attached to, so if it is a fudis-button, we\n * have to check the underlying button element with firstElementChild, that has the aria-disabled\n * attribute. If it is just a button, checking the passed element is enough.\n */\nexport function isButtonDisabled(element: HTMLElement) {\n return (\n (element?.ariaDisabled && element?.ariaDisabled === 'true') ||\n (element?.firstElementChild?.ariaDisabled &&\n element?.firstElementChild?.ariaDisabled === 'true')\n );\n}\n","import {\n Directive,\n ElementRef,\n HostBinding,\n Input,\n OnChanges,\n OnInit,\n Renderer2,\n} from '@angular/core';\nimport {\n MatDialog,\n MatDialogActions,\n MatDialogClose,\n MatDialogContent,\n MatDialogRef,\n MatDialogTitle,\n} from '@angular/material/dialog';\nimport { FudisComponentChanges } from '../../types/miscellaneous';\nimport { isButtonDisabled } from '../../utilities/dialog/dialog-utils';\n\n/**\n * Identifies the title of a dialog.\n *\n * Use this directive to provide automatically focused heading when opening a dialog.\n */\n@Directive({\n selector: '[fudisDialogTitle]',\n providers: [\n {\n provide: MatDialogRef,\n useValue: {},\n },\n ],\n})\nexport class DialogTitleDirective extends MatDialogTitle implements OnInit {\n constructor(\n // For MatDialogTitle\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _dialogRef: MatDialogRef<any>,\n _elementRef: ElementRef<HTMLElement>,\n _dialog: MatDialog,\n\n // For Fudis DialogTitleDirective\n private _headingElementRef: ElementRef,\n private _renderer: Renderer2,\n ) {\n super(_dialogRef, _elementRef, _dialog);\n }\n\n override ngOnInit() {\n this._renderer.setAttribute(this._headingElementRef.nativeElement, 'tabindex', '-1');\n this._headingElementRef.nativeElement.focus();\n }\n}\n\n/**\n * Identifies the main content area of a dialog.\n */\n@Directive({ selector: 'fudis-dialog-content' })\nexport class DialogContentDirective extends MatDialogContent implements OnChanges {\n constructor(\n private _elRef: ElementRef,\n private _renderer: Renderer2,\n ) {\n super();\n }\n\n /**\n * Binding fudis-dialog-content CSS class to directive\n */\n @HostBinding('class') public hostClass = 'fudis-dialog-content';\n\n /**\n * Dialog contentFocus sets a visual focus to dialog content. Preferred to be used with read-only\n * content.\n */\n @Input() contentFocus: boolean = false;\n\n ngOnChanges(changes: FudisComponentChanges<DialogContentDirective>): void {\n const contentFocus = changes.contentFocus?.currentValue;\n\n if (contentFocus !== changes.contentFocus?.previousValue) {\n if (contentFocus) {\n this._renderer.setAttribute(this._elRef.nativeElement, 'tabindex', '0');\n this._renderer.setAttribute(this._elRef.nativeElement, 'role', 'document');\n } else {\n this._renderer.removeAttribute(this._elRef.nativeElement, 'tabindex');\n this._renderer.removeAttribute(this._elRef.nativeElement, 'role');\n }\n }\n }\n}\n\n/**\n * Identifies the actions region of a dialog.\n *\n * Use this directive to set action buttons in a fixed position at the bottom of a dialog.\n */\n@Directive({ selector: 'fudis-dialog-actions' })\nexport class DialogActionsDirective extends MatDialogActions {\n override align: 'start' | 'center' | 'end' = 'end';\n}\n\n/**\n * Marks and element that closes a dialog.\n *\n * Use this directive to provide a button which solely dismisses a dialog.\n */\n@Directive({ selector: '[fudisDialogClose]' })\nexport class DialogCloseDirective extends MatDialogClose {\n private _hostButtonElement: HTMLElement;\n constructor(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _dialogRef: MatDialogRef<any>,\n _elementRef: ElementRef<HTMLElement>,\n _dialog: MatDialog,\n ) {\n super(_dialogRef, _elementRef, _dialog);\n this._hostButtonElement = _elementRef?.nativeElement;\n }\n\n override _onButtonClick() {\n if (!isButtonDisabled(this._hostButtonElement)) this.dialogRef.close();\n }\n}\n","import {\n Component,\n HostListener,\n Input,\n OnDestroy,\n OnInit,\n ChangeDetectionStrategy,\n signal,\n OnChanges,\n AfterViewInit,\n WritableSignal,\n ElementRef,\n} from '@angular/core';\nimport { FudisDialogService } from '../../services/dialog/dialog.service';\nimport { FudisIdService } from '../../services/id/id.service';\nimport { FudisTranslationService } from '../../services/translation/translation.service';\nimport { FudisComponentChanges, FudisDialogSize } from '../../types/miscellaneous';\nimport { throttle } from '../../utilities/resizeThrottle';\nimport { debounceTime, fromEvent } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { IconButtonComponent } from '../icon-button/icon-button.component';\nimport { DialogCloseDirective } from './dialog-directives';\nimport { AlertGroupComponent } from '../alert/alert-group/alert-group.component';\n\n/**\n * Displays content in a modal overlay.\n *\n * Must be opened via `FudisDialogService.open(Component)` or `FudisDialogService.open(TemplateRef)`\n * — not used as inline HTML. Use content directive `fudisDialogTitle` as inline attribute for the\n * dialog heading. Use `<fudis-dialog-content>` and `<fudis-dialog-actions>` directives as HTML\n * elements inside the dialog template. Add `fudisDialogClose` directive on a button to close it.\n *\n * Use this component for focused interactions that require user attention or confirmation before\n * continuing.\n */\n@Component({\n selector: 'fudis-dialog',\n templateUrl: './dialog.component.html',\n styleUrls: ['./dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [IconButtonComponent, DialogCloseDirective, AlertGroupComponent],\n})\nexport class DialogComponent implements OnDestroy, OnInit, OnChanges, AfterViewInit {\n constructor(\n protected _translateService: FudisTranslationService,\n private _dialogService: FudisDialogService,\n private _idService: FudisIdService,\n private _elementRef: ElementRef,\n ) {\n this._id = _idService.getNewId('dialog');\n\n _dialogService.setDialogOpenStatus(true);\n\n this._resizeObserver = new ResizeObserver(\n throttle(() => {\n if (this._dialogScrollable() !== null) {\n this._isDialogScrollable();\n }\n }, 10),\n );\n\n fromEvent(window, 'resize')\n .pipe(takeUntilDestroyed(), debounceTime(10))\n .subscribe(() => {\n if (this._dialogScrollable() !== null) {\n this._isDialogScrollable();\n }\n });\n }\n\n /**\n * Dialog size: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n */\n @Input() size: FudisDialogSize = 'md';\n\n /**\n * Dialog's close button has to have absolute positioning when used inside fudis-form\n */\n public closeButtonPositionAbsolute = signal<boolean>(false);\n\n /**\n * Id generated from FudisIdService\n */\n protected _id: string;\n\n /**\n * To track \"order number\" of this dialog, if multiple dialogs are open\n */\n private _orderNumber: number;\n\n /**\n * Does Dialog have scrollable content\n */\n protected _dialogScrollable: WritableSignal<boolean | null> = signal(null);\n\n /**\n * To observe size changes of this Label and trigger height calculation as needed\n */\n private _resizeObserver: ResizeObserver;\n\n ngOnChanges(changes: FudisComponentChanges<DialogComponent>): void {\n if (changes.size?.currentValue !== changes.size?.previousValue) {\n this._isDialogScrollable();\n }\n }\n\n ngOnInit(): void {\n this._orderNumber = this._dialogService.dialogsOpen().length;\n }\n\n ngAfterViewInit(): void {\n this._isDialogScrollable();\n }\n\n ngOnDestroy(): void {\n if (this._orderNumber === 1 || this._orderNumber === 0) {\n this._dialogService.setDialogOpenStatus(false);\n }\n\n this._resizeObserver.disconnect();\n }\n\n /**\n * From: https://phuoc.ng/collection/html-dom/check-if-an-element-is-scrollable/\n */\n private _isDialogScrollable(): void {\n const dialogContentElement = (this._elementRef?.nativeElement as HTMLDivElement)?.querySelector(\n '.fudis-dialog-content',\n );\n\n const dialogContentVisible = dialogContentElement?.clientHeight;\n const dialogContentScrollable = dialogContentElement?.scrollHeight;\n\n const formContent = (this._elementRef?.nativeElement as HTMLDivElement)?.querySelector(\n '.fudis-form-content',\n )?.clientHeight;\n\n const formScrollableContent = (\n this._elementRef?.nativeElement as HTMLDivElement\n )?.querySelector('.fudis-form__content-wrapper')?.clientHeight;\n\n // Compare the height to see if the element has scrollable content\n const hasScrollableContent =\n (formScrollableContent && formContent && formContent > formScrollableContent) ||\n (dialogContentScrollable &&\n dialogContentVisible &&\n dialogContentScrollable > dialogContentVisible);\n // It's not enough because the element's `overflow-y` style can be set as\n // * `hidden`\n // * `hidden !important`\n // In those cases, the scrollbar isn't shown\n const overflowYStyle = window.getComputedStyle(this._elementRef.nativeElement).overflowY;\n const isOverflowHidden = overflowYStyle.indexOf('hidden') !== -1;\n\n if (hasScrollableContent && !isOverflowHidden) {\n this._dialogScrollable.set(true);\n } else {\n this._dialogScrollable.set(false);\n }\n }\n\n @HostListener('window:keyup', ['$event'])\n protected _handleEscapePress(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n if (this._dialogService.hasJustClosedDropdownWithEscape()) {\n return; // Do not close the dialog with the same Escape key press\n }\n if (this._dialogService.dialogsOpen().length === this._orderNumber) {\n this._dialogService.close();\n }\n }\n }\n}\n","<div\n class=\"fudis-dialog fudis-dialog__size__{{ size }}\"\n [class.fudis-dialog--scrollable]=\"_dialogScrollable()\"\n [attr.id]=\"_id\"\n>\n <fudis-icon-button\n fudisDialogClose\n class=\"fudis-dialog__close\"\n [class.fudis-dialog__close__absolute]=\"closeButtonPositionAbsolute()\"\n [attr.id]=\"_id + '-close'\"\n [ariaLabel]=\"_translateService.getTranslations()().DIALOG.CLOSE\"\n [size]=\"'extra-small'\"\n [icon]=\"'ring-close-fill'\"\n [variant]=\"'tertiary'\"\n >\n </fudis-icon-button>\n <ng-content></ng-content>\n</div>\n<fudis-alert-group [insideDialog]=\"true\" />\n","import { Directive, ElementRef, EventEmitter, HostBinding, Output, ViewChild } from '@angular/core';\n\n@Directive({ selector: '[fudisDropdownBase]' })\nexport class DropdownBaseDirective {\n /**\n * Template reference for the dropdown div element\n */\n @ViewChild('dropdownElement') public dropdownElement: ElementRef<HTMLElement>;\n\n /**\n * Binding host CSS class to component wrapper\n */\n @HostBinding('class') public hostClass = 'fudis-dropdown-menu-host';\n\n /**\n * Output emitter for focus event\n */\n @Output() handleFocus = new EventEmitter<FocusEvent>();\n\n /**\n * Output emitter for blur event\n */\n @Output() handleBlur = new EventEmitter<FocusEvent>();\n\n /**\n * Id for Dropdown Menu. Generated with FudisIdService\n */\n public id: string;\n\n /**\n * When dropdown is focused, happens e. g. with Firefox\n */\n protected _dropdownFocus(event: FocusEvent): void {\n this.handleFocus.emit(event);\n }\n\n /**\n * When dropdown is blurred, happens e. g. with Firefox\n */\n protected _dropdownBlur(event: FocusEvent): void {\n this.handleBlur.emit(event);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Host,\n HostListener,\n Inject,\n Input,\n OnDestroy,\n ViewChild,\n ViewEncapsulation,\n DOCUMENT,\n signal,\n WritableSignal,\n} from '@angular/core';\n\nimport { FudisIdService } from '../../services/id/id.service';\nimport { DropdownBaseDirective } from '../../directives/form/dropdown-base/dropdown-base.directive';\n\nimport { FudisInputSize } from '../../types/forms';\nimport { FudisDropdownMenuAlign } from '../../types/miscellaneous';\nimport { DropdownEventService } from '../../services/dropdown/dropdown-event.service';\nimport { Subscription } from 'rxjs';\nimport { IconButtonComponent } from '../icon-button/icon-button.component';\nimport { FudisDialogService } from '../../services/dialog/dialog.service';\n\n/**\n * Displays a list of actions in a collapsible menu. Must be a direct child of `fudis-icon-button`\n * with `[asMenuButton]=\"true\"`.\n *\n * Use this component to group secondary or contextual actions.\n *\n * @example\n * ```html\n * <fudis-icon-button [ariaLabel]=\"'Actions'\" [size]=\"'small'\" [variant]=\"'secondary'\" [icon]=\"'three-dots'\" [asMenuButton]=\"true\">\n * <fudis-dropdown-menu>\n * <fudis-dropdown-menu-item [label]=\"'Edit'\" (handleClick)=\"edit($event)\"></fudis-dropdown-menu-item>\n * </fudis-dropdown-menu>\n * </fudis-icon-button>\n * ```;\n */\n@Component({\n selector: 'fudis-dropdown-menu',\n templateUrl: './dropdown-menu.component.html',\n styleUrls: ['./dropdown-menu.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DropdownMenuComponent extends DropdownBaseDirective implements OnDestroy {\n constructor(\n private _idService: FudisIdService,\n private _dropdownEventService: DropdownEventService,\n private _dialogService: FudisDialogService,\n @Inject(DOCUMENT) private _document: Document,\n @Host() private _parentButton: IconButtonComponent,\n ) {\n super();\n\n /**\n * Generate id in constructor for it to be accessible to child elements, and set it to parent\n * button's dropdownMenuId property for aria-controls\n */\n this.id = this._idService.getNewGrandParentId('dropdown-menu');\n if (this._parentButton) this._parentButton.dropdownMenuId = this.id;\n\n /**\n * Fire maxWidth calculation through Observable call from parent Button\n */\n this._subscription = this._dropdownEventService.triggerCalculation.subscribe(() => {\n this._getMaxWidth();\n });\n }\n\n /**\n * Template reference for the Dropdown Menu wrapper element\n */\n @ViewChild('dropdownMenuElement') private _dropdownMenuElement: ElementRef<HTMLElement>;\n\n /**\n * Align Dropdown Menu opening position: 'left' | 'center' | 'right'\n */\n @Input() align: FudisDropdownMenuAlign = 'center';\n\n /**\n * Dropdown Menu size: 'sm' | 'md' | 'lg'\n */\n @Input() size: FudisInputSize = 'lg';\n\n /**\n * Determine dropdown max-width\n */\n protected _maxWidth: WritableSignal<string> = signal('initial');\n\n /**\n * Currently focused option\n */\n private _focusedOption: string | null = null;\n\n /**\n * Subscription for dropdown width calculation event\n */\n private _subscription: Subscription;\n\n /**\n * Add or remove currently focused option. Called from DropdownMenuItem.\n */\n public setFocusedOption(id: string, type: 'add' | 'remove', event?: FocusEvent): void {\n if (type === 'add') {\n this._focusedOption = id;\n } else if (event) {\n this._focusedOption = null;\n this._componentFocused(event).then((value) => {\n if (!value) {\n this._parentButton.closeMenu(false);\n }\n });\n }\n }\n\n /**\n * Check if focus is inside the Dropdown Menu component\n *\n * @param event Focus event\n * @returns Boolean\n */\n private _componentFocused(event: FocusEvent): Promise<boolean> {\n return new Promise((resolve) => {\n let counter = 0;\n\n const nextTarget = event?.relatedTarget as HTMLElement;\n\n const focusCheckInterval = setInterval(() => {\n const focused =\n !!this._dropdownMenuElement.nativeElement.contains(this._document.activeElement) ||\n !!this._dropdownMenuElement.nativeElement.contains(nextTarget);\n\n // If focus has moved to another element inside Dropdown Menu\n if (focused) {\n clearInterval(focusCheckInterval);\n resolve(true);\n // If focus target is null\n } else if (!nextTarget) {\n clearInterval(focusCheckInterval);\n resolve(false);\n\n // Increase counter, and try again. This is needed usually with click events as between previous element blur and next element focus click event is \"somewhere else\"\n } else if (counter <= 100) {\n counter = counter + 50;\n } else {\n // Else resolve boolean check after two tries, if any relevant element is focused\n clearInterval(focusCheckInterval);\n\n resolve(!!this._focusedOption);\n }\n }, 50);\n });\n }\n\n public closeDropdownMenu(): void {\n this._parentButton.closeMenu();\n }\n\n /**\n * Host Listener for dropdown's width, it needs to be wider than its Button parent\n */\n @HostListener('window:click')\n protected _getMaxWidth(): void {\n const fontSize = Number(\n window.getComputedStyle(this._document.body).getPropertyValue('font-size').replace('px', ''),\n );\n\n const elementInViewWidth =\n this._dropdownMenuElement?.nativeElement?.getBoundingClientRect()?.width;\n\n // Left boundary edge of the element in the viewport\n const elementInViewX = this._dropdownMenuElement?.nativeElement?.getBoundingClientRect()?.x;\n\n if (elementInViewX && elementInViewWidth && elementInViewWidth !== 0 && this.align === 'left') {\n const viewWidthAndViewXInRem = `${(elementInViewWidth + elementInViewX) / fontSize}rem`;\n this._maxWidth.set('calc(' + viewWidthAndViewXInRem + '/ var(--fudis-rem-multiplier))');\n } else if (window?.visualViewport?.width && elementInViewX) {\n // elementInViewX + 1 is a hack for Firefox. In desktop mode (but in small screen) the dropdown menu's right border did not show.\n // TODO: This could be improved if better solution comes to mind.\n const viewportWidthAndViewXInRem = `${(window.visualViewport.width - (elementInViewX + 1)) / fontSize}rem`;\n this._maxWidth.set('calc(' + viewportWidthAndViewXInRem + '/ var(--fudis-rem-multiplier))');\n } else {\n this._maxWidth.set('initial');\n }\n }\n\n /**\n * Host Listener for keydown events, especially Arrow Down and Escape from Dropdown Menu\n */\n @HostListener('window:keydown', ['$event'])\n protected _handleDropdownMenuKeyDown(event: KeyboardEvent) {\n if (this._parentButton.dropdownOpen.value) {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n\n const firstChildElement = this._dropdownMenuElement.nativeElement.children[0];\n\n // If focus is on the menu button, only then listen keydown and focus on the first child\n if (\n firstChildElement.closest('fudis-icon-button')?.querySelector('.fudis-button') ===\n document.activeElement\n ) {\n const firstChildButtonElement = firstChildElement.querySelector('button');\n firstChildButtonElement?.focus();\n }\n }\n\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this._dialogService.dropdownClosedWithEscape();\n this._parentButton.closeMenu();\n }\n }\n }\n\n ngOnDestroy() {\n this._subscription.unsubscribe();\n }\n}\n","<div\n #dropdownMenuElement\n class=\"fudis-dropdown-menu fudis-dropdown-menu__{{ align }} fudis-dropdown-menu__{{ size }}\"\n [attr.id]=\"id\"\n [attr.role]=\"'menu'\"\n [attr.aria-expanded]=\"true\"\n [style.max-width]=\"_maxWidth()\"\n>\n <ng-content select=\"fudis-dropdown-menu-item\"></ng-content>\n <ng-content select=\"fudis-dropdown-menu-group\"></ng-content>\n</div>\n","import {\n Directive,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n Output,\n DOCUMENT,\n} from '@angular/core';\n\n@Directive({ selector: '[fudisDropdownItemBase]' })\nexport class DropdownItemBaseDirective {\n constructor(@Inject(DOCUMENT) protected _document: Document) {}\n\n /**\n * Option for closing or leaving dropdown open after clicking an item. Closes by default.\n */\n @Input() close: boolean = true;\n\n /**\n * Checked state for multiselect checkbox\n */\n @Input() checked: boolean = false;\n\n /**\n * Ouput for click event\n */\n @Output() handleClick = new EventEmitter<Event>();\n\n /**\n * Output for checked state in multiselect\n */\n @Output() handleChecked = new EventEmitter<boolean>();\n\n /**\n * Output for blur event in select option\n */\n @Output() handleBlur = new EventEmitter<FocusEvent>();\n\n /**\n * Id generated with FudisIdService\n */\n protected _id: string;\n\n /**\n * Trigger focus based on keyboard interaction. Used to focus on next / previous dropdown item\n * element\n */\n\n protected _baseHandleKeyDown(\n event: KeyboardEvent,\n element: ElementRef,\n cssClassSelector: string,\n ) {\n if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {\n const focusElement = this._document.querySelector(':focus');\n\n const siblingElements = element.nativeElement\n .closest('.fudis-select-dropdown, .fudis-dropdown-menu')\n .querySelectorAll(cssClassSelector);\n\n const siblingElementsCount = siblingElements.length - 1;\n event.preventDefault();\n\n const focusIndex = Array.prototype.indexOf.call(siblingElements, focusElement);\n\n let elementToFocus = element.nativeElement;\n if (event.key === 'ArrowUp') {\n elementToFocus = siblingElements[focusIndex > 0 ? focusIndex - 1 : siblingElementsCount];\n }\n if (event.key === 'ArrowDown') {\n elementToFocus = siblingElements[focusIndex < siblingElementsCount ? focusIndex + 1 : 0];\n }\n elementToFocus.focus();\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, Host, Input } from '@angular/core';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { DropdownMenuComponent } from '../dropdown-menu.component';\n\n/**\n * Groups related dropdown items.\n *\n * Use this component to organize related menu options to improve readability.\n */\n@Component({\n selector: 'fudis-dropdown-menu-group',\n templateUrl: './dropdown-menu-group.component.html',\n styleUrls: ['./dropdown-menu-group.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DropdownMenuGroupComponent {\n constructor(\n private _idService: FudisIdService,\n @Host() private _parentDropdownMenu: DropdownMenuComponent,\n ) {\n if (_parentDropdownMenu) {\n this.id = this._idService.getNewGroupId('dropdown-menu', this._parentDropdownMenu.id);\n }\n }\n\n /**\n * Visible label for this group of items\n */\n @Input({ required: true }) label: string;\n\n /**\n * Id for this Dropdown Menu Group. Generated with FudisIdService and used for accessibility\n * attributes.\n */\n public id: string;\n}\n","<div class=\"fudis-dropdown-menu-group\" [attr.aria-labelledby]=\"id\" role=\"group\">\n <span class=\"fudis-dropdown-menu-group__label\" [attr.aria-hidden]=\"true\" [attr.id]=\"id\">{{\n label\n }}</span>\n <ng-content></ng-content>\n</div>\n","import {\n Component,\n ElementRef,\n Host,\n ViewChild,\n Optional,\n Inject,\n ChangeDetectionStrategy,\n effect,\n Input,\n DOCUMENT,\n} from '@angular/core';\n\nimport { DropdownMenuComponent } from '../dropdown-menu.component';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { FudisTranslationService } from '../../../services/translation/translation.service';\nimport { BehaviorSubject } from 'rxjs';\nimport { DropdownItemBaseDirective } from '../../../directives/form/dropdown-item-base/dropdown-item-base.directive';\nimport { DropdownMenuGroupComponent } from '../dropdown-menu-group/dropdown-menu-group.component';\nimport { AsyncPipe } from '@angular/common';\n\n/**\n * Single menu item for DropdownMenuComponent.\n */\n@Component({\n selector: 'fudis-dropdown-menu-item',\n templateUrl: './dropdown-menu-item.component.html',\n styleUrls: ['./dropdown-menu-item.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AsyncPipe],\n})\nexport class DropdownMenuItemComponent extends DropdownItemBaseDirective {\n constructor(\n private _idService: FudisIdService,\n private _translationService: FudisTranslationService,\n @Inject(DOCUMENT) _document: Document,\n @Host() protected _parentDropdownMenu: DropdownMenuComponent,\n @Host() @Optional() protected _parentGroup: DropdownMenuGroupComponent,\n ) {\n super(_document);\n\n this._id = this._idService.getNewDropdownMenuId(\n this._parentDropdownMenu.id,\n this._parentGroup?.id,\n );\n\n effect(() => {\n const translations = _translationService.getTranslations()();\n\n this._translationItemDisabledText.next(translations.DROPDOWNMENU.ITEM.DISABLED);\n });\n }\n\n /**\n * Template reference for dropdown item button element\n */\n @ViewChild('dropdownItem') dropdownItem: ElementRef<HTMLButtonElement>;\n\n /**\n * Visible label for Menu Item\n */\n @Input({ required: true }) label: string;\n\n /**\n * If Menu Item is disabled\n */\n @Input() disabled: boolean = false;\n\n /**\n * Internal translated text for disabled dropdown menu item\n */\n protected _translationItemDisabledText = new BehaviorSubject<string>('');\n\n /**\n * Handle key down event\n */\n protected _handleKeyDown(event: KeyboardEvent) {\n if (event.key === 'Enter' || event.key === ' ') {\n if (this.disabled) {\n event.preventDefault();\n return;\n } else {\n event.preventDefault();\n this._clickOption(event);\n }\n } else if (event.key !== ' ') {\n this._baseHandleKeyDown(event, this.dropdownItem, '.fudis-dropdown-menu-item__focusable');\n }\n }\n\n /**\n * Handle blur event\n */\n protected _handleMenuItemBlur(event: FocusEvent): void {\n this._parentDropdownMenu.setFocusedOption(this._id, 'remove', event);\n }\n\n /**\n * Handle focus\n */\n protected _handleMenuItemFocus(): void {\n this._parentDropdownMenu.setFocusedOption(this._id, 'add');\n }\n\n /**\n * Click handler for Dropdown Menu Item click\n */\n protected _clickOption(event: Event): void {\n if (!this.disabled) {\n this.handleClick.emit(event);\n\n this._parentDropdownMenu.closeDropdownMenu();\n }\n }\n}\n","<button\n #dropdownItem\n class=\"fudis-dropdown-menu-item\"\n [class.fudis-dropdown-menu-item--disabled]=\"disabled || null\"\n [class.fudis-dropdown-menu-item__focusable]=\"!disabled\"\n [attr.id]=\"_id\"\n [attr.role]=\"'menuitem'\"\n [attr.aria-disabled]=\"disabled || null\"\n (keydown)=\"_handleKeyDown($event)\"\n (blur)=\"_handleMenuItemBlur($event)\"\n (focus)=\"_handleMenuItemFocus()\"\n (click)=\"_clickOption($event)\"\n tabindex=\"-1\"\n>\n {{ label }}\n @if (disabled || null) {\n <span class=\"fudis-dropdown-menu-item__label fudis-dropdown-menu-item__label__disabled-text\">\n ({{ _translationItemDisabledText | async }})</span\n >\n }\n</button>\n","import { ChangeDetectionStrategy, Component, ElementRef, Input, ViewChild } from '@angular/core';\nimport { FudisNotification } from '../../types/miscellaneous';\nimport { FudisTranslationService } from '../../services/translation/translation.service';\nimport { BodyTextComponent } from '../typography/body-text/body-text.component';\nimport { IconComponent } from '../icon/icon.component';\n\n/**\n * Displays an information message.\n *\n * Use this component to inform users about events, updates, or system feedback.\n */\n@Component({\n selector: 'fudis-notification',\n templateUrl: './notification.component.html',\n styleUrls: ['./notification.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [BodyTextComponent, IconComponent],\n})\nexport class NotificationComponent {\n constructor(protected _translateService: FudisTranslationService) {}\n\n @ViewChild('articleElement') articleElement: ElementRef;\n\n /**\n * Notification variant: 'warning' | 'danger' | 'success' | 'info'\n */\n @Input() variant: FudisNotification = 'warning';\n\n /**\n * Additional description of the notification for screen readers. Internally used in ErrorSummary\n * for accessibility reasons.\n */\n @Input() ariaDescribedby: string;\n\n public focus(): void {\n if (this.articleElement?.nativeElement) {\n this.articleElement.nativeElement.focus();\n }\n }\n}\n","<article\n #articleElement\n tabindex=\"-1\"\n [attr.aria-describedby]=\"ariaDescribedby\"\n class=\"fudis-notification fudis-notification__{{ variant }}\"\n>\n <fudis-body-text class=\"fudis-visually-hidden\">{{\n _translateService.getTranslations()().ATTENTION\n }}</fudis-body-text>\n @if (variant === \"warning\") {\n <fudis-icon [icon]=\"'exclamation-mark-circle'\" />\n }\n @if (variant === \"danger\") {\n <fudis-icon [icon]=\"'alert'\" />\n }\n @if (variant === \"success\") {\n <fudis-icon [icon]=\"'checkmark-circle'\" />\n }\n @if (variant === \"info\") {\n <fudis-icon [icon]=\"'info-circle'\" />\n }\n <div class=\"fudis-notification__content\">\n <ng-content />\n </div>\n</article>\n","import {\n OnInit,\n AfterViewInit,\n Directive,\n ElementRef,\n OnChanges,\n effect,\n Input,\n inject,\n ViewContainerRef,\n Inject,\n ComponentRef,\n DOCUMENT,\n} from '@angular/core';\nimport { FudisComponentChanges } from '../../types/miscellaneous';\nimport { FudisFocusService } from '../../services/focus/focus.service';\nimport { FudisIdService } from '../../services/id/id.service';\nimport { BehaviorSubject } from 'rxjs';\nimport { FudisTranslationService } from '../../services/translation/translation.service';\nimport { IconComponent } from '../../components/icon/icon.component';\n\n/**\n * Adds link behavior to an element.\n *\n * Use this directive with anchor element and consider whether link is internal/external.\n */\n@Directive({ selector: '[fudisLink]' })\nexport class LinkDirective implements OnInit, OnChanges, AfterViewInit {\n constructor(\n @Inject(DOCUMENT) private _document: Document,\n private _bindedElement: ElementRef<HTMLAnchorElement>,\n private _focusService: FudisFocusService,\n private _idService: FudisIdService,\n private _translationService: FudisTranslationService,\n ) {\n effect(() => {\n this._externalLinkAriaLabel.next(\n this._translationService.getTranslations()().LINK.EXTERNAL_LINK,\n );\n });\n }\n\n /**\n * Link default size is 'md' (14px) which is the default size of <fudis-body-text> component. If\n * link is used inside of Body Text it will always inherit its parent's font-size.\n */\n @Input() size: 'inherit' | 'md' | 'lg' = 'md';\n\n /**\n * Set browser focus to link on the first load.\n */\n @Input() initialFocus: boolean = false;\n\n /**\n * Id for the anchor element. By default generated with FudisIdService\n */\n @Input() id: string;\n\n /**\n * If link opens in a new tab\n */\n @Input() external: boolean = false;\n\n /**\n * Title for the link\n */\n @Input({ required: true }) title: string;\n\n /**\n * Helper class for link size\n */\n private _sizeCssClass: string = `fudis-link__size__md`;\n\n /**\n * Container ref to attach Icon Component\n */\n private _viewContainerRef = inject(ViewContainerRef);\n\n /**\n * Icon Component reference which will be attached to the View Container\n */\n private _iconComponentRef: ComponentRef<IconComponent>;\n\n /**\n * Helper array for parsing long link texts with new-tab icon\n */\n private _parsedTitle: string[] = [];\n\n /**\n * Aria-label for the external link\n */\n private _externalLinkAriaLabel = new BehaviorSubject<string>(\n this._translationService.getTranslations()().LINK.EXTERNAL_LINK,\n );\n\n ngAfterViewInit(): void {\n if (this.initialFocus && !this._focusService.isIgnored(this.id)) {\n (this._bindedElement.nativeElement as HTMLAnchorElement).focus();\n }\n }\n\n ngOnInit(): void {\n if (this.id) {\n this._idService.addNewId('link', this.id);\n } else {\n this.id = this._idService.getNewId('link');\n }\n\n this._setSizeClass();\n this._bindedElement.nativeElement.classList.add('fudis-link');\n this._bindedElement.nativeElement.setAttribute('id', this.id);\n }\n\n ngOnChanges(changes: FudisComponentChanges<LinkDirective>): void {\n if (changes.size?.previousValue !== changes.size?.currentValue) {\n this._setSizeClass();\n }\n\n const titleChanged = changes.title?.currentValue !== changes.title?.previousValue;\n\n const externalChanged = changes.external?.currentValue !== changes.external?.previousValue;\n\n if (titleChanged || (externalChanged && changes.title?.currentValue)) {\n this._setHtmlAttributes();\n\n if (titleChanged) {\n this._parseTitle();\n\n if (!changes.title?.isFirstChange() && this.external) {\n this._updateTitleHtml();\n }\n }\n\n this._setExternalHtml();\n }\n }\n\n private _updateTitleHtml(): void {\n // Remove texts from parent\n this._bindedElement.nativeElement.childNodes.forEach(\n (node) => node.nodeType === Node.TEXT_NODE && node.remove(),\n );\n\n const iconWrapper = this._bindedElement.nativeElement.querySelector(\n '.fudis-link__external__icon-wrapper',\n ) as HTMLSpanElement;\n\n if (iconWrapper) {\n // Remove texts from icon wrapper\n iconWrapper.childNodes.forEach((node) => node.nodeType === Node.TEXT_NODE && node.remove());\n\n if (this._parsedTitle.length === 1) {\n const text = this._document.createTextNode(this._parsedTitle[0]);\n iconWrapper.prepend(text);\n } else {\n const textStart = this._document.createTextNode(`${this._parsedTitle[0]} `);\n const textEnd = this._document.createTextNode(this._parsedTitle[1]);\n this._bindedElement.nativeElement.prepend(textStart);\n iconWrapper.prepend(textEnd);\n }\n }\n }\n\n /**\n * Set size CSS class\n */\n private _setSizeClass(): void {\n const currentSize = this._sizeCssClass;\n this._bindedElement.nativeElement.classList.remove(currentSize);\n\n this._sizeCssClass = `fudis-link__size__${this.size}`;\n\n this._bindedElement.nativeElement.classList.add(this._sizeCssClass);\n }\n\n /**\n * Add to remove relevant HTML attributes from binded element.\n */\n private _setHtmlAttributes(): void {\n if (this.external) {\n this._bindedElement.nativeElement.setAttribute('target', '_blank');\n this._bindedElement.nativeElement.setAttribute('rel', 'noopener noreferrer');\n this._bindedElement.nativeElement.setAttribute(\n 'aria-label',\n `${this.title}, ${this._externalLinkAriaLabel.value}`,\n );\n } else {\n this._bindedElement.nativeElement.removeAttribute('target');\n this._bindedElement.nativeElement.removeAttribute('rel');\n this._bindedElement.nativeElement.setAttribute('aria-label', this.title);\n\n const titleNode = this._document.createTextNode(this.title);\n\n this._bindedElement.nativeElement.replaceChildren(titleNode);\n }\n }\n\n private _setExternalHtml(): void {\n if (this.external) {\n // Create HTML semantics\n const html = String.raw;\n\n if (this._parsedTitle.length === 1) {\n this._bindedElement.nativeElement.innerHTML = html`<span\n class=\"fudis-link__external__icon-wrapper\"\n >${this._parsedTitle[0]}<span class=\"fudis-link__external__icon\"></span>\n </span>`;\n } else {\n this._bindedElement.nativeElement.innerHTML = html`${this._parsedTitle[0]}\n <span class=\"fudis-link__external__icon-wrapper\"\n >${this._parsedTitle[1]}<span class=\"fudis-link__external__icon\"></span>\n </span>`;\n }\n\n // Create Icon Component and define properties\n this._iconComponentRef = this._viewContainerRef.createComponent(IconComponent);\n this._iconComponentRef.setInput('icon', 'new-tab');\n this._iconComponentRef.setInput('color', 'primary-dark');\n\n // Append Icon Component to right place in the HTML when DOM is updated\n const component = this._iconComponentRef.instance.elementRef.nativeElement;\n\n const observer = new MutationObserver(() => {\n const iconLocation = this._bindedElement.nativeElement.querySelector(\n '.fudis-link__external__icon',\n );\n\n if (iconLocation) {\n iconLocation.append(component);\n observer.disconnect();\n }\n });\n\n observer.observe(this._document, {\n attributes: false,\n childList: true,\n characterData: false,\n subtree: true,\n });\n } else {\n // If not External, detach Icon Component instance\n this._viewContainerRef.detach();\n }\n }\n\n /**\n * Used with external links to split the last word of the title to be paired with the Icon, so\n * that on line break, the icon sticks with the last word of the title.\n */\n private _parseTitle(): void {\n const toArray = this.title.split(' ').filter((n) => n);\n\n if (toArray.length > 1) {\n const lastWord: string = toArray[toArray.length - 1];\n\n const titleStart: string = toArray.slice(0, -1).join(' ');\n\n this._parsedTitle = [titleStart, lastWord];\n } else {\n this._parsedTitle = [toArray[0]];\n }\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n Input,\n ViewChild,\n signal,\n OnInit,\n inject,\n Injector,\n Output,\n EventEmitter,\n} from '@angular/core';\n\nimport { FudisInternalErrorSummaryService } from '../../../services/form/error-summary/internal-error-summary.service';\nimport { FudisErrorSummaryFormErrors } from '../../../types/errorSummary';\nimport { FudisTranslationService } from '../../../services/translation/translation.service';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { NotificationComponent } from '../../notification/notification.component';\nimport { LinkDirective } from '../../../directives/link/link.directive';\n\ntype ErrorSummaryDOMListItem = {\n id: string;\n message: string;\n element: HTMLElement | null;\n};\n\n/**\n * Displays a summary of validation errors.\n *\n * Use this component to present form errors in a single, accessible location.\n */\n@Component({\n selector: 'fudis-error-summary',\n templateUrl: './error-summary.component.html',\n styleUrls: ['./error-summary.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NotificationComponent, LinkDirective],\n})\nexport class ErrorSummaryComponent implements AfterViewInit, OnInit {\n constructor(\n private _errorSummaryService: FudisInternalErrorSummaryService,\n protected _translationService: FudisTranslationService,\n ) {\n toObservable(this._errorSummaryService.submitAttempt, { injector: this._injector }).subscribe(\n () => {\n this._focusToErrorSummary();\n },\n );\n }\n\n @ViewChild('focusTarget') private _focusTarget: NotificationComponent;\n\n /**\n * Form parent element of this ErrorSummaryComponent\n */\n @Input({ required: true }) parentComponent: HTMLFormElement;\n\n /**\n * Title text displayed in Error Summary before listing individual errors. If not provided, Fudis\n * will display its default helper title text\n */\n @Input() title: string;\n\n /**\n * Id of parent Form component\n */\n @Input({ required: true }) formId: string;\n\n @Output() handleUpdatedErrorList = new EventEmitter<{ id: string; message: string }[] | null>();\n\n /**\n * Visible errors\n */\n protected _visibleErrorList = signal<ErrorSummaryDOMListItem[]>([]);\n\n /**\n * Focus counter to hit the correct focus field\n */\n private _numberOfFocusTries: number = 0;\n\n /**\n * To enable clicking Error Summary links and then moving focus to corresponding form field. This\n * was needed, as not all Fudis applications use Angular Router, so alternative approach was\n * needed.\n *\n * @param event Original click event\n * @param clickedId Id of clicked link in Error Summary\n */\n protected handleErrorClick(event: Event, clickedId: string): void {\n event.preventDefault();\n\n const elementToFocus = this.parentComponent.querySelector(`#${clickedId}`) as\n | HTMLInputElement\n | HTMLDivElement;\n\n if (elementToFocus) {\n elementToFocus.focus();\n }\n }\n\n /**\n * Sort errors the same order they appear in the DOM\n */\n private _sortErrorOrder(a: ErrorSummaryDOMListItem, b: ErrorSummaryDOMListItem): 0 | -1 | 1 {\n if (a.id === b.id) {\n return 0;\n }\n\n if (a.element && b.element) {\n const position = a.element.compareDocumentPosition(b.element);\n\n if (\n position & Node.DOCUMENT_POSITION_FOLLOWING ||\n position & Node.DOCUMENT_POSITION_CONTAINED_BY\n ) {\n return -1;\n } else if (\n position & Node.DOCUMENT_POSITION_PRECEDING ||\n position & Node.DOCUMENT_POSITION_CONTAINS\n ) {\n return 1;\n }\n }\n return 0;\n }\n\n /**\n * Update Error Summary content with possible parent Fieldsets, Sections and Expandables\n * (Sections)\n */\n private _updateSummaryContent(content: FudisErrorSummaryFormErrors): void {\n const newErrorList: ErrorSummaryDOMListItem[] = [];\n\n const fieldsets: { [id: string]: string } =\n this._errorSummaryService.formStructure[this.formId].fieldsets;\n\n const sections: { [id: string]: string } =\n this._errorSummaryService.formStructure[this.formId].sections;\n\n Object.keys(content).forEach((errorId) => {\n Object.values(content[errorId]).forEach((error: string) => {\n const parentFieldset = Object.keys(fieldsets).find((fieldset) => {\n if (this.parentComponent?.querySelector(`#${fieldset} #${errorId}`)) {\n return fieldset;\n }\n return null;\n });\n\n const parentSection = Object.keys(sections).find((section) => {\n if (this.parentComponent?.querySelector(`#${section} #${errorId}`)) {\n return section;\n }\n return null;\n });\n\n const parentSectionString = parentSection ? `${sections[parentSection]} / ` : '';\n\n const parentFieldsetString = parentFieldset ? `${fieldsets[parentFieldset]} / ` : '';\n\n const cleanedError = error.replace(/[:!?]$/, '');\n\n const newItem: ErrorSummaryDOMListItem = {\n id: errorId,\n message: `${parentSectionString}${parentFieldsetString}${cleanedError}`,\n element: this.parentComponent.querySelector(`#${errorId}`),\n };\n\n newErrorList.push(newItem);\n });\n });\n\n const sortedList = newErrorList.sort(this._sortErrorOrder);\n\n this._visibleErrorList.set(sortedList);\n\n if (sortedList.length > 0) {\n const newOutputList: { id: string; message: string }[] = [];\n\n sortedList.forEach((item) => {\n newOutputList.push({ id: item.id, message: item.message });\n });\n\n this.handleUpdatedErrorList.emit(newOutputList);\n } else {\n this.handleUpdatedErrorList.emit(null);\n }\n\n if (this._errorSummaryService.focusToFormOnReload === this.formId) {\n this._focusToErrorSummary();\n }\n }\n\n /**\n * Move focus to Error Summary if errors are visible\n */\n private _focusToErrorSummary(): void {\n if (this._focusTarget?.articleElement && this._visibleErrorList().length > 0) {\n this._numberOfFocusTries = 0;\n this._focusTarget.focus();\n } else if (this._numberOfFocusTries < 20) {\n setTimeout(() => {\n this._numberOfFocusTries += 1;\n this._focusToErrorSummary();\n }, 100);\n }\n }\n\n private _injector = inject(Injector);\n\n ngOnInit(): void {\n /**\n * Fetch and update current visible errors when reloadFormErrors() is called\n */\n toObservable(this._errorSummaryService.errorsSignal[this.formId], {\n injector: this._injector,\n }).subscribe((value) => {\n this._updateSummaryContent(value);\n });\n }\n\n ngAfterViewInit(): void {\n this._focusToErrorSummary();\n }\n}\n","@if (_visibleErrorList(); as errors) {\n @if (errors.length > 0) {\n <fudis-notification\n class=\"fudis-error-summary\"\n [variant]=\"'danger'\"\n [ariaDescribedby]=\"'fudis-error-summary-title-id'\"\n #focusTarget\n >\n <h2 id=\"fudis-error-summary-title-id\" class=\"fudis-error-summary__title\">{{\n title || _translationService.getTranslations()().ERROR_SUMMARY.TITLE\n }}</h2>\n <ul class=\"fudis-error-summary__error-list\">\n @for (error of errors; track error.message) {\n <li class=\"fudis-error-summary__error-list__item\">\n <a\n fudisLink\n href=\"\"\n [size]=\"'md'\"\n (click)=\"handleErrorClick($event, error.id)\"\n [title]=\"error.message\"\n ></a>\n </li>\n }\n </ul>\n </fudis-notification>\n }\n}\n","import { Directive, HostBinding, TemplateRef } from '@angular/core';\n\n/**\n * Identifies the actions area of an expandable.\n *\n * Use this directive to position action buttons to a fixed place.\n */\n@Directive({ selector: 'fudis-expandable-actions' })\nexport class ExpandableActionsDirective {\n @HostBinding('class') readonly _hostClass = 'fudis-expandable-actions';\n}\n\n/**\n * Identifies the main content area of an expandable.\n *\n * Use this directive for lazy loaded content.\n */\n@Directive({ selector: '[fudisExpandableContent]' })\nexport class ExpandableContentDirective {\n constructor(public templateRef: TemplateRef<unknown>) {}\n}\n","import {\n Component,\n ContentChild,\n Input,\n Output,\n EventEmitter,\n ViewEncapsulation,\n OnDestroy,\n OnChanges,\n ElementRef,\n DestroyRef,\n inject,\n Injector,\n AfterContentInit,\n ChangeDetectionStrategy,\n WritableSignal,\n signal,\n} from '@angular/core';\nimport {\n FudisBadgeVariant,\n FudisComponentChanges,\n FudisExpandableType,\n} from '../../types/miscellaneous';\nimport { FudisIdService } from '../../services/id/id.service';\nimport { FudisInternalErrorSummaryService } from '../../services/form/error-summary/internal-error-summary.service';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { ExpandableContentDirective } from './expandable-content.directive';\nimport { IconComponent } from '../icon/icon.component';\nimport { BadgeComponent } from '../badge/badge.component';\nimport { NgTemplateOutlet } from '@angular/common';\n\n/**\n * Toggles the visibility of additional content.\n *\n * Use this component to progressively disclose information without overwhelming the user.\n */\n@Component({\n selector: 'fudis-expandable',\n templateUrl: './expandable.component.html',\n styleUrls: ['./expandable.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [IconComponent, BadgeComponent, NgTemplateOutlet],\n})\nexport class ExpandableComponent implements OnDestroy, OnChanges, AfterContentInit {\n constructor(\n private _element: ElementRef,\n private _idService: FudisIdService,\n private _errorSummaryService: FudisInternalErrorSummaryService,\n ) {\n this._id = this._idService.getNewId('expandable');\n }\n\n /**\n * Content directive for Fudis Expandable Content\n */\n @ContentChild(ExpandableContentDirective) protected _content: ExpandableContentDirective;\n\n /**\n * Title of the expandable\n */\n @Input({ required: true }) title: string;\n\n /**\n * Expandable title's semantic aria-level for screen readers\n */\n @Input({ required: true }) level: number;\n\n /**\n * Visual variant of the expandable: 'regular' | 'lite'\n */\n @Input() variant: FudisExpandableType = 'regular';\n\n /**\n * Expandable content padding depth\n */\n @Input() padding: 'default' | 'small' = 'default';\n\n /**\n * Optional sub title, placed underneath the main title\n */\n @Input() subTitle: string;\n\n /**\n * Add badge next to the expandable title\n */\n @Input() badge: FudisBadgeVariant | null;\n\n /**\n * Badge text\n */\n @Input() badgeText: string | null;\n\n /**\n * Display Expandable title in the breadcrumb of Error Summary\n */\n @Input() errorSummaryBreadcrumb: boolean = false;\n\n // TODO: write test\n /**\n * If Expandable is used inside Form component, by default it will open itself when\n * reloadFormErrors is called in Error Summary Service. To disable this behavior, set this to\n * false.\n */\n @Input() openOnErrorSummaryReload: boolean = true;\n\n /**\n * Expandable is initially closed by default but can be controlled by [closed] input property\n */\n @Input() set closed(value: boolean) {\n this._setClosedStatus(value);\n }\n\n /**\n * Optional output function when the closed status changes\n */\n @Output() closedChange = new EventEmitter<boolean>();\n\n /**\n * Internal boolean of whether the expandable is currently closed\n */\n protected _closed: WritableSignal<boolean> = signal(true);\n\n /**\n * Internal id to generate unique id\n */\n protected _id: string;\n\n /**\n * Lazy loading check for expanding content\n */\n protected _openedOnce: WritableSignal<boolean> = signal(false);\n\n /**\n * Is info sent to Error Summary Service\n */\n private _errorSummaryInfoSent: boolean = false;\n\n private _parentFormId: string | null;\n\n private _destroyRef = inject(DestroyRef);\n\n private _getParentForm(): void {\n this._errorSummaryService\n .getFormAncestorId(this._element.nativeElement)\n .then((parentFormId) => {\n if (!parentFormId) return;\n\n this._parentFormId = parentFormId;\n\n if (this.errorSummaryBreadcrumb) {\n this._addToErrorSummary(this.title);\n }\n\n toObservable(this._errorSummaryService.errorSummaryVisibilityStatus[this._parentFormId], {\n injector: this._injector,\n })\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((value) => {\n if (this.closed && this.openOnErrorSummaryReload && value) {\n this._setClosedStatus(false);\n }\n });\n });\n }\n\n /**\n * Getter for closed boolean\n */\n get closed(): boolean {\n return this._closed();\n }\n\n private _injector = inject(Injector);\n\n ngAfterContentInit(): void {\n this._getParentForm();\n }\n\n ngOnChanges(changes: FudisComponentChanges<ExpandableComponent>): void {\n if (changes.title || changes.errorSummaryBreadcrumb?.currentValue === true) {\n this._addToErrorSummary(this.title);\n }\n\n if (changes?.errorSummaryBreadcrumb?.currentValue === false) {\n this._removeFromErrorSummary();\n }\n }\n\n ngOnDestroy(): void {\n this._removeFromErrorSummary();\n }\n\n /**\n * Send error object to Error Summary Service\n */\n private _addToErrorSummary(title: string): void {\n if (this.errorSummaryBreadcrumb && this._parentFormId) {\n const errorSummaryInfo = {\n id: this._id,\n formId: this._parentFormId,\n title: title,\n };\n this._errorSummaryService.addSection(errorSummaryInfo);\n this._errorSummaryInfoSent = true;\n }\n }\n\n /**\n * Remove error object from Error Summary Service\n */\n private _removeFromErrorSummary(): void {\n if (this._errorSummaryInfoSent && this._parentFormId) {\n this._errorSummaryService.removeSection(this._parentFormId, this._id);\n }\n }\n\n /**\n * Setter for closed boolean\n */\n protected _setClosedStatus(value: boolean): void {\n this._closed.set(value ?? this._closed());\n this._openedOnce.set(this._openedOnce() || !this._closed());\n this.closedChange.emit(this._closed());\n }\n}\n","<div\n [id]=\"_id\"\n class=\"fudis-expandable fudis-expandable__{{ variant }}\"\n [class.fudis-expandable--closed]=\"_closed()\"\n>\n <div class=\"fudis-expandable__header fudis-expandable__header__{{ variant }}\">\n <div role=\"heading\" [attr.aria-level]=\"level\" class=\"fudis-expandable__header__heading\">\n <button\n type=\"button\"\n [id]=\"_id + '-header-button'\"\n class=\"fudis-expandable__header__heading__button fudis-expandable__header__heading__button__{{\n variant\n }}\"\n [attr.aria-expanded]=\"!_closed()\"\n [attr.aria-controls]=\"!_closed() ? _id + '__content' : null\"\n (click)=\"_setClosedStatus(!_closed())\"\n >\n <fudis-icon\n class=\"fudis-expandable__header__heading__button__icon fudis-expandable__header__heading__button__icon__{{\n variant\n }}\"\n [icon]=\"variant === 'lite' ? 'chevron' : 'chevron-ring-fill'\"\n [color]=\"variant === 'lite' ? 'primary' : 'gray-dark'\"\n [rotate]=\"_closed() ? 'none' : 'cw-90'\"\n ></fudis-icon\n ><span class=\"fudis-expandable__header__heading__button__title\"\n ><span class=\"fudis-expandable__header__heading__button__title__text\">{{ title }}</span>\n @if (badge && badgeText) {\n <fudis-badge\n class=\"fudis-expandable__header__heading__button__title__badge\"\n [variant]=\"badge\"\n [content]=\"badgeText\"\n />\n }\n @if (variant !== \"lite\" && subTitle) {\n <span class=\"fudis-expandable__header__heading__button__title__sub-heading\">{{\n subTitle\n }}</span>\n }\n </span>\n </button>\n </div>\n <ng-content select=\"fudis-expandable-actions\" />\n </div>\n @if (_openedOnce()) {\n <div\n class=\"fudis-expandable__content fudis-expandable__content__padding-{{ padding }}\"\n [id]=\"_id + '__content'\"\n [attr.aria-hidden]=\"_closed()\"\n [hidden]=\"_closed()\"\n >\n @if (_content) {\n <ng-container *ngTemplateOutlet=\"_content!.templateRef\"></ng-container>\n }\n </div>\n }\n</div>\n","import {\n Component,\n ViewEncapsulation,\n ChangeDetectionStrategy,\n Signal,\n effect,\n} from '@angular/core';\nimport { FudisTranslationService } from '../../services/translation/translation.service';\nimport { BehaviorSubject } from 'rxjs';\nimport { FudisTranslationConfig } from '../../services/translation/translationKeys';\nimport { AsyncPipe } from '@angular/common';\n\n/**\n * Displays footer content for a page.\n *\n * Use this component with supplementary information such as links, legal content, or metadata.\n */\n@Component({\n selector: 'fudis-footer',\n templateUrl: './footer.component.html',\n styleUrls: ['./footer.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AsyncPipe],\n})\nexport class FooterComponent {\n constructor(private _translationService: FudisTranslationService) {\n effect(() => {\n const translations = this._translationService.getTranslations()();\n\n this._funidataLogoAltText.next(translations.IMAGE.FUNIDATA_LOGO);\n this._externalLinkHelpText.next(translations.LINK.EXTERNAL_LINK);\n });\n }\n\n /**\n * Fudis translations\n */\n protected _translations: Signal<FudisTranslationConfig>;\n\n /**\n * Alternative text for the Funidata logo\n */\n protected _funidataLogoAltText = new BehaviorSubject<string>(\n this._translationService.getTranslations()().IMAGE.FUNIDATA_LOGO,\n );\n\n /**\n * External link text for Funidata logo\n */\n protected _externalLinkHelpText = new BehaviorSubject<string>(\n this._translationService.getTranslations()().LINK.EXTERNAL_LINK,\n );\n}\n","<footer class=\"fudis-footer\">\n <div class=\"fudis-footer__item\">\n <a\n href=\"https://www.funidata.fi/\"\n class=\"fudis-footer__item__logo\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [attr.aria-label]=\"(_funidataLogoAltText | async) + ' ' + (_externalLinkHelpText | async)\"\n ><svg\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n width=\"127\"\n height=\"24\"\n viewBox=\"0 0 127 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <title>Funidata logo</title>\n <path\n d=\"M10.5893 4.93128H3.64757V9.71953H10.3425V12.5456H3.64757V22.0295H0.642578V2.1114H10.5893V4.93128ZM16.4203 2.1114V14.1067C16.4203 15.8159 16.698 17.0685 17.2595 17.8583C18.0925 18.9998 19.2649 19.5737 20.7828 19.5737C22.3008 19.5737 23.4855 18.9998 24.3185 17.8583C24.88 17.0932 25.1577 15.8406 25.1577 14.1067V2.1114H28.1627V14.9335C28.1627 17.0315 27.5086 18.7592 26.2005 20.1229C24.7319 21.6346 22.924 22.3936 20.7828 22.3936C18.6417 22.3936 16.8399 21.6346 15.3775 20.1229C14.0694 18.7654 13.4154 17.0376 13.4154 14.9335V2.1114H16.4203V2.1114ZM32.6239 22.0357V0.753906L47.149 15.9517V2.1114H50.154V23.2451L35.635 8.08437V22.0295H32.63L32.6239 22.0357ZM57.6943 2.1114V22.0295H54.6893V2.1114H57.6943ZM74.5519 4.67829C73.5399 3.74656 72.4046 3.0925 71.1582 2.70376C69.9981 2.30885 68.4123 2.1114 66.4069 2.1114H62.2234V15.8714H65.2284V4.93128H66.5859C69.1466 4.93128 71.0903 5.53598 72.4046 6.75156C73.867 8.10905 74.5951 9.87996 74.5951 12.0643C74.5951 14.2486 73.8546 15.9887 72.3737 17.34C71.6518 17.9941 70.8435 18.4692 69.9487 18.7715C69.054 19.0554 67.931 19.1973 66.5797 19.1973H62.2172V22.0233H66.3452C68.3691 22.0233 69.9241 21.8382 71.0286 21.468C72.2071 21.0978 73.3363 20.4376 74.41 19.4935C76.5511 17.5992 77.6248 15.1248 77.6248 12.0643C77.6248 9.00376 76.5943 6.54793 74.5395 4.67212L74.5519 4.67829ZM91.7982 17.1919H83.2707L81.0493 22.0295H77.8099L87.6702 0.858803L97.1788 22.0295H93.89L91.7982 17.1919V17.1919ZM90.5703 14.3659L87.6147 7.59073L84.5171 14.3659H90.5703ZM103.726 4.93128V22.0295H100.721V4.93128H96.1422V2.1114H108.298V4.93128H103.732H103.726ZM121.256 17.1857H112.728L110.507 22.0233H107.267L117.134 0.858803L126.643 22.0295H123.354L121.262 17.1919L121.256 17.1857ZM120.028 14.3597L117.072 7.58456L113.975 14.3597H120.028Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </a>\n </div>\n <div class=\"fudis-footer__item\">\n <ng-content></ng-content>\n </div>\n</footer>\n","import { FudisHeadingLevel, FudisHeadingVariant } from '../../types/typography';\n\n/**\n * Get corresponding default variant for heading level\n */\nexport const getHeadingVariant = (level: FudisHeadingLevel): FudisHeadingVariant => {\n switch (level) {\n case 1:\n return 'xxl';\n case 2:\n return 'xl';\n case 3:\n return 'lg';\n case 4:\n return 'md';\n case 5:\n return 'sm';\n case 6:\n return 'xs';\n default:\n return 'lg';\n }\n};\n","import {\n Component,\n Input,\n ChangeDetectionStrategy,\n OnInit,\n OnChanges,\n ElementRef,\n ViewChild,\n} from '@angular/core';\nimport { FudisHeadingLevel, FudisHeadingVariant } from '../../../types/typography';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { FudisComponentChanges } from '../../../types/miscellaneous';\nimport { FudisTextAlign } from '../../../types/typography';\nimport { BehaviorSubject } from 'rxjs';\nimport { getHeadingVariant } from '../../../utilities/typography/typography-utils';\nimport { NgTemplateOutlet, AsyncPipe } from '@angular/common';\n\n/**\n * Displays a heading at a specified semantic level (h1-h6).\n *\n * Use this component to structure content hierarchially and provide semantic information for all\n * users.\n */\n@Component({\n selector: 'fudis-heading',\n templateUrl: './heading.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, AsyncPipe],\n})\nexport class HeadingComponent implements OnInit, OnChanges {\n constructor(\n private _idService: FudisIdService,\n private _wrapperElement: ElementRef,\n ) {\n /**\n * Set Heading wrapper to be \"full width\" if used inside Grid\n */\n (_wrapperElement.nativeElement as HTMLHeadingElement).style.gridColumn = '1/-1';\n }\n\n /**\n * Rendered HTML Heading element, e.g.`<h1>` or `<h3>` tag.\n */\n @ViewChild('headingRef') public headingRef: ElementRef<HTMLHeadingElement>;\n\n /**\n * Semantic level of heading\n */\n @Input({ required: true }) level: FudisHeadingLevel;\n\n /**\n * Heading variant: 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'. If not set, derived\n * automatically from level.\n */\n @Input() variant: FudisHeadingVariant;\n\n /**\n * Heading id. If not provided, generated by FudisIdService.\n */\n @Input() id: string;\n\n /**\n * Align heading: 'center' | 'left' | 'right'\n */\n @Input() align: FudisTextAlign = 'left';\n\n /**\n * Heading CSS class list\n */\n protected _classList = new BehaviorSubject<string[]>([]);\n\n /**\n * Internal id to generate unique id\n */\n protected _id: string;\n\n /**\n * Set CSS classes for heading\n */\n private _setClasses(): void {\n const calcVariant = this.variant || getHeadingVariant(this.level);\n\n const newClasses = [\n `fudis-heading`,\n `fudis-heading__variant__${calcVariant}`,\n `fudis-heading__align__${this.align}`,\n ];\n\n this._classList.next(newClasses);\n }\n\n ngOnInit(): void {\n this._id = this.id ?? this._idService.getNewId('heading');\n\n this._setClasses();\n }\n\n ngOnChanges(changes: FudisComponentChanges<HeadingComponent>): void {\n if (\n changes.align?.currentValue !== changes.align?.previousValue ||\n changes.variant?.currentValue !== changes.variant?.previousValue ||\n changes.level?.currentValue !== changes.level?.previousValue\n ) {\n this._setClasses();\n }\n }\n}\n","<ng-container\n *ngTemplateOutlet=\"\n level === 1\n ? h1\n : level === 2\n ? h2\n : level === 3\n ? h3\n : level === 4\n ? h4\n : level === 5\n ? h5\n : h6\n \"\n></ng-container>\n\n<!-- From level @Input choose which h-tag to render -->\n<ng-template #h1>\n <h1 #headingRef [id]=\"_id\" tabindex=\"-1\" [class]=\"_classList | async\">\n <ng-container *ngTemplateOutlet=\"headingContent\"></ng-container>\n </h1>\n</ng-template>\n\n<ng-template #h2>\n <h2 #headingRef [id]=\"_id\" tabindex=\"-1\" [class]=\"_classList | async\">\n <ng-container *ngTemplateOutlet=\"headingContent\"></ng-container>\n </h2>\n</ng-template>\n\n<ng-template #h3>\n <h3 #headingRef [id]=\"_id\" tabindex=\"-1\" [class]=\"_classList | async\">\n <ng-container *ngTemplateOutlet=\"headingContent\"></ng-container>\n </h3>\n</ng-template>\n\n<ng-template #h4>\n <h4 #headingRef [id]=\"_id\" tabindex=\"-1\" [class]=\"_classList | async\">\n <ng-container *ngTemplateOutlet=\"headingContent\"></ng-container>\n </h4>\n</ng-template>\n\n<ng-template #h5>\n <h5 #headingRef [id]=\"_id\" tabindex=\"-1\" [class]=\"_classList | async\">\n <ng-container *ngTemplateOutlet=\"headingContent\"></ng-container>\n </h5>\n</ng-template>\n\n<ng-template #h6>\n <h6 #headingRef [id]=\"_id\" tabindex=\"-1\" [class]=\"_classList | async\">\n <ng-container *ngTemplateOutlet=\"headingContent\"></ng-container>\n </h6>\n</ng-template>\n\n<!-- Render content inside fudis-heading tags -->\n<ng-template #headingContent>\n <ng-content></ng-content>\n</ng-template>\n","import {\n Component,\n ElementRef,\n Host,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n ViewEncapsulation,\n OnChanges,\n inject,\n Injector,\n signal,\n EventEmitter,\n Output,\n ChangeDetectionStrategy,\n WritableSignal,\n} from '@angular/core';\nimport { FudisHeadingVariant, FudisHeadingLevel } from '../../../types/typography';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { GridApiDirective } from '../../../directives/grid/grid-api/grid-api.directive';\nimport { FudisBadgeVariant, FudisComponentChanges } from '../../../types/miscellaneous';\nimport { DialogComponent } from '../../dialog/dialog.component';\nimport { FudisInternalErrorSummaryService } from '../../../services/form/error-summary/internal-error-summary.service';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { getHeadingVariant } from '../../../utilities/typography/typography-utils';\nimport { FormsModule } from '@angular/forms';\nimport { GridDirective } from '../../../directives/grid/grid/grid.directive';\nimport { HeadingComponent } from '../../typography/heading/heading.component';\nimport { DialogTitleDirective } from '../../dialog/dialog-directives';\nimport { BadgeComponent } from '../../badge/badge.component';\nimport { BodyTextComponent } from '../../typography/body-text/body-text.component';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ErrorSummaryComponent } from '../error-summary/error-summary.component';\n\n/**\n * Provides layout and structure for form content. Extends Grid — all Grid inputs are available.\n *\n * Use this component to consistently arrange form fields, actions, and validation elements. Place\n * fields inside `<fudis-form-content>` and buttons inside `<fudis-form-actions>`. Use\n * `fudisFormSubmit` directive on the submit button to trigger error summary. Use `FudisValidators`\n * (not Angular's Validators) for error messages to work with Error Summary.\n */\n@Component({\n selector: 'fudis-form',\n templateUrl: './form.component.html',\n styleUrls: ['./form.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n FormsModule,\n GridDirective,\n HeadingComponent,\n DialogTitleDirective,\n BadgeComponent,\n BodyTextComponent,\n NgTemplateOutlet,\n ErrorSummaryComponent,\n ],\n})\nexport class FormComponent extends GridApiDirective implements OnInit, OnDestroy, OnChanges {\n constructor(\n private _idService: FudisIdService,\n protected _elementRef: ElementRef,\n private _errorSummaryService: FudisInternalErrorSummaryService,\n @Host() @Optional() protected _dialogParent: DialogComponent,\n ) {\n super();\n }\n\n /**\n * Form title\n */\n @Input({ required: true }) title: string;\n\n /**\n * Heading level for the form title: 1 | 2 | 3 | 4 | 5 | 6\n */\n @Input({ required: true }) level: FudisHeadingLevel;\n\n /**\n * Form id. If not given, id will be generated with IdService. Set only in component\n * initialisation.\n */\n @Input() id: string;\n\n /**\n * Heading variant for the form title: 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'. If not\n * set, derived automatically from level.\n */\n @Input() titleVariant: FudisHeadingVariant;\n\n /**\n * Help text positioned under form title\n */\n @Input() helpText: string;\n\n /**\n * Additional badge to the form title: 'accent' | 'danger' | 'primary' | 'secondary' | 'success'\n */\n @Input() badge: FudisBadgeVariant | null;\n\n /**\n * Badge text\n */\n @Input() badgeText: string | null;\n\n /**\n * Set Error Summary visibility manually. Usually set true on form submit with Button binded with\n * 'fudisFormSubmit' directive.\n */\n @Input() errorSummaryVisible: boolean = false;\n\n /**\n * Title text displayed in Error Summary before listing individual errors. If not provided, Fudis\n * will display its default helper title text\n */\n @Input() errorSummaryTitle: string;\n\n /**\n * Each time Error Summary List is updated, this emitter will output the list\n */\n @Output() handleUpdatedErrorList = new EventEmitter<{ id: string; message: string }[] | null>();\n\n /**\n * The _errorSummaryVisible signal tracks the current visibility of the error summary for template\n * binding\n */\n protected _errorSummaryVisible: WritableSignal<boolean> = signal<boolean>(false);\n\n private _injector = inject(Injector);\n\n ngOnInit(): void {\n this._setFormId();\n\n if (!this.titleVariant) {\n this.titleVariant = getHeadingVariant(this.level);\n }\n\n this._errorSummaryService.registerNewForm(this.id, this.errorSummaryVisible);\n this._errorSummaryVisible.set(this.errorSummaryVisible);\n\n if (this._dialogParent) {\n this._dialogParent.closeButtonPositionAbsolute.set(true);\n }\n\n toObservable(this._errorSummaryService.errorSummaryVisibilityStatus[this.id], {\n injector: this._injector,\n }).subscribe((value) => {\n this._errorSummaryVisible.set(value);\n });\n }\n\n ngOnDestroy(): void {\n this._errorSummaryService.removeForm(this.id);\n }\n\n ngOnChanges(changes: FudisComponentChanges<FormComponent>): void {\n if (\n changes.errorSummaryVisible?.currentValue !== changes.errorSummaryVisible?.previousValue &&\n this.id\n ) {\n this._errorSummaryService.setErrorSummaryVisibility(this.id, this.errorSummaryVisible);\n this._errorSummaryVisible.set(this.errorSummaryVisible);\n }\n }\n\n /**\n * Add or generate id with IdService\n */\n private _setFormId(): void {\n if (this.id) {\n this._idService.addNewId('form', this.id);\n } else {\n this.id = this._idService.getNewId('form');\n }\n }\n}\n","<!-- prettier-ignore -->\n<form\n fudisGrid\n [id]=\"id\"\n [attr.aria-describedby]=\"id + '-header'\"\n [width]=\"width\"\n [align]=\"align\"\n [serviceDefaults]=\"false\"\n [alignItemsX]=\"alignItemsX\"\n [alignItemsY]=\"alignItemsY\"\n [classes]=\"_dialogParent ? 'fudis-form fudis-form__dialog' : 'fudis-form fudis-form__default'\"\n [columnGap]=\"columnGap\"\n [rowGap]=\"'none'\"\n>\n <div [id]=\"id + '-header'\" class=\"fudis-form__header\">\n <div class=\"fudis-form__header__main\">\n <div class=\"fudis-form__header__title\">\n @if (_dialogParent) {\n <fudis-heading\n class=\"fudis-form__header__title__dialog fudis-mb-xs\"\n fudisDialogTitle\n [variant]=\"titleVariant\"\n [level]=\"level\"\n >{{ title }}@if (badge && badgeText) {\n <fudis-badge\n class=\"fudis-form__header__title__badge\"\n [variant]=\"badge\"\n [content]=\"badgeText\"\n />\n }\n </fudis-heading>\n }\n @if (!_dialogParent) {\n <fudis-heading class=\"fudis-mb-xs\" [variant]=\"titleVariant\" [level]=\"level\"\n >{{ title }}@if (badge && badgeText) {\n <fudis-badge\n class=\"fudis-form__header__title__badge\"\n [variant]=\"badge\"\n [content]=\"badgeText\"\n />\n }\n </fudis-heading>\n }\n @if (helpText) {\n <fudis-body-text class=\"fudis-mb-xs\">{{ helpText }}</fudis-body-text>\n }\n </div>\n <ng-content select=\"fudis-form-header\" />\n @if (!_dialogParent) {\n <ng-container *ngTemplateOutlet=\"errorSummary\" />\n }\n </div>\n </div>\n @if (!_dialogParent) {\n <ng-container *ngTemplateOutlet=\"actions\" />\n }\n <div class=\"fudis-form__content-wrapper\">\n @if (_dialogParent) {\n <ng-container *ngTemplateOutlet=\"errorSummary\" />\n }\n <ng-content select=\"fudis-form-content\"></ng-content>\n </div>\n @if (_dialogParent) {\n <ng-container *ngTemplateOutlet=\"actions\" />\n }\n</form>\n\n<ng-template #errorSummary>\n @if (_elementRef.nativeElement && _errorSummaryVisible()) {\n <fudis-error-summary\n [formId]=\"id\"\n (handleUpdatedErrorList)=\"handleUpdatedErrorList.emit($event)\"\n [parentComponent]=\"_elementRef.nativeElement\"\n [title]=\"errorSummaryTitle\"\n />\n }\n</ng-template>\n\n<ng-template #actions>\n <ng-content select=\"fudis-form-actions\" />\n</ng-template>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\nimport { GridDirective } from '../../../directives/grid/grid/grid.directive';\n\n/**\n * Provides a responsive grid layout.\n *\n * Use this component to structure page or section layouts visually using columns.\n */\n@Component({\n selector: 'fudis-grid',\n templateUrl: './grid.component.html',\n styleUrls: ['./grid.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n\n/**\n * Just a wrapper component to be able to use Grid in templates using '<fudis-grid></fudis-grid>'\n * tags. Main functionality is in GridDirective\n */\nexport class GridComponent extends GridDirective {}\n","<ng-content></ng-content>\n","import { Directive, ElementRef, OnChanges, OnInit, Input, effect } from '@angular/core';\nimport {\n FudisGridItemAlignment,\n FudisGridItemAlignResponsive,\n FudisGridItemWidth,\n gridItemDefault,\n FudisGridItemColumnsResponsive,\n} from '../../../types/grid';\nimport { getGridCssValue } from '../gridUtils';\nimport { FudisBreakpointService } from '../../../services/breakpoint/breakpoint.service';\nimport { FudisBreakpointStyleResponsive } from '../../../types/breakpoints';\nimport { getBreakpointDataArray } from '../../../utilities/breakpoint/breakpoint-utils';\n\n/**\n * Applies grid item behavior within a grid container.\n *\n * Use this directive to control placement and span of child elements inside a grid container.\n */\n@Directive({ selector: '[fudisGridItem]' })\nexport class GridItemDirective implements OnInit, OnChanges {\n constructor(\n private _gridItemElement: ElementRef,\n private _breakpointService: FudisBreakpointService,\n ) {\n this._element = _gridItemElement.nativeElement;\n\n /**\n * When screen is resized check and apply new rules for Grid Item\n */\n effect(() => {\n this._breakpointService.getBreakpointState();\n\n if (typeof this._calculatedColumns !== 'string') {\n this._setColumns();\n }\n if (typeof this._calculatedAlignX !== 'string') {\n this._setAlignX();\n }\n if (typeof this._calculatedAlignY !== 'string') {\n this._setAlignY();\n }\n });\n }\n\n /**\n * Apply CSS grid-column values for the Grid Item\n */\n private _calculatedColumns: string | FudisBreakpointStyleResponsive[] = gridItemDefault;\n\n /**\n * Apply horizontal CSS values for the Grid Item\n */\n private _calculatedAlignX: FudisGridItemAlignment | FudisBreakpointStyleResponsive[] = 'stretch';\n\n /**\n * Apply vertical CSS values for the Grid Item\n */\n private _calculatedAlignY: FudisGridItemAlignment | FudisBreakpointStyleResponsive[] = 'stretch';\n\n /**\n * Internal reference for the Grid Item element\n */\n private _element: HTMLElement;\n\n /**\n * Set columns for single Grid Item\n */\n @Input() set columns(value: FudisGridItemWidth | FudisGridItemColumnsResponsive) {\n // Convert given string value to proper CSS grid-column value\n if (typeof value === 'string') {\n this._calculatedColumns = getGridCssValue(value, true);\n }\n // Convert given number value to proper CSS grid-column value. E.g. number 6 converts to 'span 6'.\n else if (typeof value === 'number') {\n this._calculatedColumns = getGridCssValue(value, true);\n }\n // Get breakpoint settings with provided values\n else {\n this._calculatedColumns = getBreakpointDataArray(value, gridItemDefault, true);\n }\n }\n\n /**\n * Align Grid Item horizontally\n */\n @Input() set alignSelfX(value: FudisGridItemAlignment | FudisGridItemAlignResponsive) {\n if (typeof value === 'string') {\n this._calculatedAlignX = value;\n } else {\n this._calculatedAlignX = getBreakpointDataArray(value, 'stretch');\n }\n }\n\n /**\n * Align Grid Item vertically\n */\n @Input() set alignSelfY(value: FudisGridItemAlignment | FudisGridItemAlignResponsive) {\n if (typeof value === 'string') {\n this._calculatedAlignY = value;\n } else {\n this._calculatedAlignY = getBreakpointDataArray(value, 'stretch');\n }\n }\n\n ngOnInit(): void {\n this._element.classList.add('fudis-grid-item');\n this._applyGridItemCss();\n }\n\n ngOnChanges(): void {\n this._applyGridItemCss();\n }\n\n /**\n * Set CSS grid-column attributes for this Grid Item element\n */\n private _setColumns(): void {\n this._breakpointService.setStyleAttributes(\n this._element,\n 'grid-column',\n this._calculatedColumns,\n );\n }\n\n /**\n * Set CSS justify-self attributes for this Grid Item element\n */\n private _setAlignX(): void {\n this._breakpointService.setStyleAttributes(\n this._element,\n 'justify-self',\n this._calculatedAlignX,\n );\n }\n\n /**\n * Set CSS align-self attributes for this Grid Item element\n */\n private _setAlignY(): void {\n this._breakpointService.setStyleAttributes(this._element, 'align-self', this._calculatedAlignY);\n }\n\n /**\n * Apply CSS settings from Inputs\n */\n private _applyGridItemCss(): void {\n this._setColumns();\n this._setAlignX();\n this._setAlignY();\n }\n}\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\nimport { GridItemDirective } from '../../../directives/grid/grid-item/grid-item.directive';\n\n/**\n * Represents a single item within a grid layout.\n *\n * Use this component to define column span and placement inside a grid container.\n */\n@Component({\n selector: 'fudis-grid-item',\n templateUrl: './grid-item.component.html',\n styleUrls: ['./grid-item.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class GridItemComponent extends GridItemDirective {}\n","<ng-content></ng-content>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/**\n * Visually separates content sections.\n *\n * Use this component to visually indicate thematic breaks.\n */\n@Component({\n selector: 'fudis-hr',\n templateUrl: './horizontal-rule.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HorizontalRuleComponent {}\n","<hr class=\"fudis-hr\" aria-hidden=\"true\" />\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { FudisTranslationService } from '../../services/translation/translation.service';\nimport { BodyTextComponent } from '../typography/body-text/body-text.component';\n\n/**\n * Indicates a loading or processing state.\n *\n * Use this component to inform users of ongoing activity or process.\n */\n@Component({\n selector: 'fudis-loading-spinner',\n imports: [BodyTextComponent],\n templateUrl: './loading-spinner.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LoadingSpinnerComponent {\n constructor(protected _translationService: FudisTranslationService) {}\n\n /**\n * Visible label text displayed under the spinner icon. If not provided, default text 'Loading' is\n * used.\n */\n @Input() label: string;\n\n /**\n * Size variant. Variant 'sm' for smaller page sections and 'lg' for full page.\n */\n @Input() variant: 'sm' | 'lg' = 'sm';\n\n /**\n * Status message for screen reader users. Displayed only for 'lg' variant. Fudis provides default\n * 'Page is loading' and 'Page load finished' texts.\n */\n @Input() statusMessage: string | null;\n\n /**\n * For variant 'lg' and better screen reader experience, instead of using `@if` for displaying\n * component, set this property true when loading is in progress and false, when loading is not in\n * progress. This will trigger screen reader `statusMessage` properties accordingly.\n */\n @Input() visible: boolean = true;\n}\n","@let translations = _translationService.getTranslations()();\n\n<div class=\"fudis-loading-spinner\">\n @if (variant === \"lg\") {\n <p class=\"fudis-loading-spinner__status fudis-visually-hidden\" role=\"status\">{{\n statusMessage ||\n (visible\n ? translations.LOADING_SPINNER.PAGE_LOADING\n : translations.LOADING_SPINNER.PAGE_LOAD_FINISHED)\n }}</p>\n }\n @if (visible) {\n <div class=\"fudis-loading-spinner__ui-content\">\n <svg\n class=\"fudis-loading-spinner__svg fudis-loading-spinner__variant__{{ variant }}\"\n aria-hidden=\"true\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M15.2256 0.441641C12.7017 -0.262704 10.0165 -0.121557 7.58041 0.843527C5.14424 1.80861 3.09092 3.54458 1.73407 5.78628C0.377218 8.02798 -0.208579 10.6522 0.066151 13.2581C0.34088 15.864 1.46103 18.3084 3.25553 20.2179C5.05002 22.1274 7.4202 23.397 10.004 23.8328C12.5879 24.2687 15.2434 23.8468 17.565 22.6316L16.1133 19.8581C14.3974 20.7563 12.4346 21.0681 10.5247 20.746C8.61493 20.4239 6.86307 19.4855 5.5367 18.0741C4.21034 16.6628 3.3824 14.856 3.17934 12.9299C2.97627 11.0038 3.40925 9.06416 4.41214 7.40725C5.41504 5.75033 6.93271 4.46723 8.73335 3.75391C10.534 3.04059 12.5186 2.93626 14.3841 3.45686C16.2497 3.97747 17.8935 5.09438 19.0645 6.63702C20.2356 8.17965 20.8696 10.0632 20.8696 12H24C24 9.37963 23.1424 6.83129 21.5579 4.7442C19.9735 2.65711 17.7496 1.14599 15.2256 0.441641Z\"\n />\n </svg>\n <fudis-body-text\n [align]=\"'center'\"\n [variant]=\"variant === 'sm' ? 'md-regular' : 'lg-regular'\"\n >{{ label || translations.LOADING_SPINNER.VISIBLE_LABEL }}</fudis-body-text\n >\n </div>\n }\n</div>\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype GenericObject = { [key: string]: any };\n\n/**\n * Utility function to test, if two objects have the exactly same properties\n *\n * @param x First object\n * @param y Second object\n * @returns Boolean\n */\n\nexport const areObjectsDeepEquals = (x: GenericObject | null, y: GenericObject | null): boolean => {\n const ok = Object.keys;\n const tx = typeof x;\n const ty = typeof y;\n return x && y && tx === 'object' && tx === ty\n ? ok(x).length === ok(y).length && ok(x).every((key) => areObjectsDeepEquals(x[key], y[key]))\n : x === y;\n};\n","import { FudisSelectOption } from '../../../../../types/forms';\n\n/**\n * Function to loop array of options and join their labels to a single string\n *\n * @param values Array of selected Options\n * @returns\n */\nexport const joinInputValues = <T>(values: FudisSelectOption<T>[]): string => {\n const label: string[] = [];\n values.forEach((item: FudisSelectOption<T>) => {\n const labelToPush = item.label.includes(',') ? `'${item.label}'` : item.label;\n\n label.push(labelToPush);\n });\n\n const joinedValues = label.join(', ');\n\n return joinedValues;\n};\n\n/**\n * Add or remove a value from current list and returned updated one\n *\n * @param currentList\n * @param valueToUpdate\n * @param visible\n * @returns Updated List\n */\nexport const setVisibleOptionsList = (\n currentList: string[],\n valueToUpdate: string,\n visible: boolean,\n): string[] => {\n const listToReturn = [...currentList];\n\n const valueExists = listToReturn.includes(valueToUpdate);\n\n if (visible && !valueExists) {\n listToReturn.push(valueToUpdate);\n } else if (valueExists && !visible) {\n const index = listToReturn.indexOf(valueToUpdate);\n\n listToReturn.splice(index, 1);\n }\n return listToReturn;\n};\n","import { Directive, TemplateRef } from '@angular/core';\n\n// TODO: Write tests\n/**\n * Marks the container for select options.\n *\n * Use this directive to tag the template which wraps (multi)select options and enables lazy loading\n * of the options.\n */\n@Directive({ selector: '[fudisSelectOptions]' })\nexport class SelectOptionsDirective {\n constructor(public templateRef: TemplateRef<unknown>) {}\n}\n","import {\n ContentChild,\n Directive,\n ElementRef,\n EventEmitter,\n HostListener,\n Inject,\n Input,\n OnChanges,\n Output,\n Signal,\n ViewChild,\n WritableSignal,\n signal,\n OnDestroy,\n DOCUMENT,\n} from '@angular/core';\nimport { AbstractControl } from '@angular/forms';\nimport { FudisIdService } from '../../../../../services/id/id.service';\nimport { FudisFocusService } from '../../../../../services/focus/focus.service';\nimport { FudisInputSize, FudisSelectVariant } from '../../../../../types/forms';\nimport { setVisibleOptionsList } from '../utilities/selectUtilities';\nimport { SelectDropdownComponent } from '../select-dropdown/select-dropdown.component';\nimport { FudisComponentChanges } from '../../../../../types/miscellaneous';\nimport { FudisValidatorUtilities } from '../../../../../utilities/form/validator-utilities';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ControlComponentBaseDirective } from '../../../../../directives/form/control-component-base/control-component-base.directive';\nimport { SelectOptionsDirective } from '../select-options-directive/select-options.directive';\nimport { fromEvent, Subscription } from 'rxjs';\nimport { BaseSelectableComponent } from '../interfaces/base-selectable.interface';\nimport { FudisDialogService } from '../../../../../services/dialog/dialog.service';\n\n@Directive({ selector: '[fudisSelectBase]' })\nexport class SelectBaseDirective\n extends ControlComponentBaseDirective\n implements OnChanges, OnDestroy\n{\n constructor(\n @Inject(DOCUMENT) protected _document: Document,\n protected _dialogService: FudisDialogService,\n _focusService: FudisFocusService,\n _idService: FudisIdService,\n ) {\n super(_idService, _focusService);\n\n this._updateValueAndValidityTrigger.pipe(takeUntilDestroyed()).subscribe(() => {\n if (this.control) {\n this._required.next(FudisValidatorUtilities.required(this.control));\n }\n });\n /**\n * This is for detecting the input field size changes so the dropdown width and height can be\n * adjusted.\n */\n this._resizeObserver = new ResizeObserver((): void => {\n this._calculateDropdownPosition();\n });\n /**\n * Observable for viewport height and orientation change, will cause dropdown to close.\n */\n fromEvent(window, 'resize')\n .pipe(takeUntilDestroyed())\n .subscribe(() => {\n if (window.innerHeight !== this._viewportLastHeight && this._dropdownOpen()) {\n this._viewportLastHeight = window.innerHeight;\n this.closeDropdown(false, true);\n }\n });\n }\n\n /**\n * Reference to child DropdownComponent listing all options\n */\n @ViewChild('dropdownRef') protected _dropdownRef: SelectDropdownComponent;\n\n /**\n * Reference to autocomplete element, used to focus to it\n */\n @ViewChild('selectIconsRef') protected _selectIconsRef: ElementRef<HTMLDivElement>;\n\n /**\n * To lazy load options on first open\n */\n @ContentChild(SelectOptionsDirective) protected _selectOptionsDirective: SelectOptionsDirective;\n\n /**\n * Reference to child DropdownComponent listing all options\n */\n @ViewChild('selectRef') private _selectRef: ElementRef<HTMLDivElement>;\n\n /**\n * Set dropdown size (should follow the given input element size)\n */\n @Input() size: FudisInputSize | 'xs' = 'lg';\n\n /**\n * Placeholder text for the dropdown input when no selection has been made\n */\n @Input() placeholder: string;\n\n /**\n * Select variant: 'dropdown' | 'autocompleteDropdown' | 'autocompleteType'.\n *\n * - 'dropdown': default, normal select dropdown\n * - 'autocompleteDropdown': dropdown with autocomplete input field\n * - 'autocompleteType': autocomplete but user must type 3 letters before any results are displayed\n */\n @Input() variant: FudisSelectVariant = 'dropdown';\n\n /**\n * Enable / disable button, which clears user selection when there is a selected value\n */\n @Input() selectionClearButton: boolean = true;\n\n /**\n * By default Autocomplete filters options loaded to the DOM based on user input. When this is set\n * to 'false', filtering is disabled and all options available in DOM are displayed regardless of\n * user's input. Disabling can be useful, if application wants to implement their own filtering\n * logic. E. g. get user's input, run a backend search and create list of options for the Select.\n */\n @Input() autocompleteFilter: boolean = true;\n\n /**\n * For Autocomplete variants optional helper text displayed as first item in opened dropdown list.\n * By default uses internal Fudis translation, which can be disabled by setting this property to\n * boolean 'false'\n */\n @Input() autocompleteHelpText: string | false;\n\n /**\n * By default, Autocomplete variant will display \"No results found\" text when there are 0 options\n * matching. When combined with 'autocompleteFilter' false, application can set their own\n * 'Fetching options...' etc. text while their own filtering is in progress.\n */\n @Input() autocompleteNoResultsText: string | null = null;\n\n /**\n * Value output event on selection change\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n @Output() selectionUpdate: EventEmitter<any | null> = new EventEmitter<any | null>();\n\n /**\n * Output for number of visible options after filtering results\n */\n @Output() visibleOptionsUpdate: EventEmitter<number> = new EventEmitter<number>();\n\n /**\n * Output for filter text after filtering results\n */\n @Output() filterTextUpdate: EventEmitter<string | null> = new EventEmitter<string | null>();\n\n /**\n * CSS selector for querying focus states\n */\n public focusSelector: string = '.fudis-select-option__focusable';\n\n /**\n * For setting dropdown open / closed\n */\n protected _dropdownOpen = signal<boolean>(false);\n\n /**\n * Signal to Select & MultiselectOption for listening autocomplete filter text changes\n */\n protected _autocompleteFilterText: WritableSignal<string> = signal<string>('');\n\n /**\n * Visible results length to be passed on SelectDropdown. This value determines the results shown\n * in autocomplete variants helptext.\n */\n protected _resultsLength = signal<number>(0);\n\n /**\n * Lazy loading check for expanding content, unless component control gets values from\n * application, then set to true automatically, so that comparing available options match given\n * control value.\n */\n protected _optionsLoadedOnce: WritableSignal<boolean> = signal<boolean>(false);\n\n /**\n * Used when filtering autocomplete results to check if 'No results found' text is visible\n */\n protected _visibleOptions: string[] = [];\n\n /**\n * Status of input focus\n */\n protected _inputFocused: boolean = false;\n\n /**\n * Used to handle exceptions when mouse click event fires before / after focus event or user has\n * clicked autocomplete clear button\n */\n protected _preventDropdownReopen: boolean | undefined = false;\n\n /**\n * Internal signals for template binding and managing the state of the form control.\n */\n protected _touched: WritableSignal<boolean> = signal(false);\n protected _invalid: WritableSignal<boolean> = signal(false);\n protected _disabled: WritableSignal<boolean> = signal(false);\n protected _enabled: WritableSignal<boolean> = signal(true);\n protected _selectedLabel: WritableSignal<string | null> = signal(null);\n\n /**\n * Reactive reference to the current control instance.\n *\n * Used by child option components to rebind their subscription if the parent `control` input is\n * replaced with a new FormControl instance.\n */\n protected _controlRef: WritableSignal<AbstractControl | null> = signal(null);\n\n /**\n * Focus try counter\n */\n private _focusTryCounter: number = 0;\n\n /**\n * Array to store visible options while options are loading.\n */\n private _visibleOptionsTemp: string[] = [];\n\n /**\n * Store latest option loaded\n */\n private _latestVisibleOption: string;\n\n /**\n * Currently focused option\n */\n private _focusedOption: string | null = null;\n\n /**\n * If clear button is focused\n */\n private _clearButtonFocused: boolean = false;\n\n /**\n * If click event happens either in input field or in the options\n */\n private _mouseDownInsideComponent: boolean;\n\n /**\n * If click event's target is Select's input field\n */\n private _mouseUpOnInput: boolean = false;\n\n /**\n * Used to not update visible options to HTML template before some delay has passed in case new\n * options are still loading\n */\n private _optionLoadInterval: null | NodeJS.Timeout = null;\n\n /**\n * If click event originated from Icon used inside input field\n */\n private _clickFromIcon: boolean = false;\n\n /**\n * Keyboard button pressed down\n */\n private _keyDown: string | null = null;\n\n /**\n * Subscription for handling the valueChanges observable\n */\n private _subscription: Subscription;\n\n /**\n * Used to pass info, that Clear Button was clicked\n */\n protected _clearButtonClickTrigger = signal<boolean>(false);\n\n /**\n * Resize observer to observe input field size changes\n */\n private _resizeObserver: ResizeObserver;\n\n /**\n * Scroll listener for adjusting dropdown position on scroll events\n */\n private _scrollListener?: () => void;\n\n /**\n * Last recorded height of the viewport. Change will trigger dropdown to close.\n */\n private _viewportLastHeight: number;\n\n private _calculateDropdownPosition() {\n if (this._dropdownOpen()) {\n const inputElement = this._inputRef?.nativeElement;\n const inputRect = inputElement?.getBoundingClientRect();\n\n const dropDownElement = this._selectRef?.nativeElement?.querySelector(\n '.fudis-select-dropdown',\n ) as HTMLElement;\n\n if (dropDownElement && inputRect) {\n dropDownElement.style.top = `${inputRect.bottom}px`;\n dropDownElement.style.left = `${inputRect.left}px`;\n dropDownElement.style.maxWidth = `${inputRect.width}px`;\n\n /**\n * If window has less available space than the default height of the dropdown menu, snap the\n * dropdown menu to the bottom of the window.\n */\n const cssDefaultMaxHeight = 256;\n const availableSpace = window.innerHeight - inputRect.bottom - 6;\n const finalMaxHeight = Math.min(cssDefaultMaxHeight, availableSpace);\n\n dropDownElement.style.maxHeight = `${finalMaxHeight}px`;\n }\n }\n }\n\n private _setupScrollListener() {\n this._scrollListener = () => {\n this._calculateDropdownPosition();\n };\n document.addEventListener('scroll', this._scrollListener, true);\n }\n\n private _removeScrollListener() {\n if (this._scrollListener) document.removeEventListener('scroll', this._scrollListener, true);\n }\n\n private _unsubscribeDropdownSubscribtions() {\n this._resizeObserver.disconnect();\n this._removeScrollListener();\n }\n\n ngOnChanges(changes: FudisComponentChanges<BaseSelectableComponent>): void {\n if (changes.control?.currentValue !== changes.control?.previousValue) {\n this._controlRef.set(this.control);\n\n this._syncControlState();\n this._updateValueAndValidityTrigger.next();\n this._updateComponentStateFromControlValue();\n\n if (this.control.value) {\n this._optionsLoadedOnce.set(true);\n }\n\n this._subscription?.unsubscribe();\n this._subscription = this.control.events\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => {\n this._syncControlState();\n this._updateValueAndValidityTrigger.next();\n\n if (this.control.value) {\n this._optionsLoadedOnce.set(true);\n }\n\n this._updateComponentStateFromControlValue();\n });\n }\n\n if (\n changes.variant?.currentValue !== changes.variant?.previousValue &&\n changes.variant?.currentValue === 'dropdown' &&\n !changes.variant.firstChange\n ) {\n this.setAutocompleteFilterText('');\n }\n\n if (\n changes.autocompleteFilter?.currentValue !== changes.autocompleteFilter?.previousValue &&\n !changes.autocompleteFilter?.currentValue\n ) {\n this._autocompleteFilterText.set(this._autocompleteFilterText());\n }\n }\n\n ngOnDestroy() {\n this._unsubscribeDropdownSubscribtions();\n }\n\n /**\n * @returns Signal value of autocomplete filter text\n */\n public getAutocompleteFilterText(): Signal<string> {\n return this._autocompleteFilterText.asReadonly();\n }\n\n /**\n * Exposes the current control reference as a readonly signal.\n *\n * Option components use this to follow parent control instance changes and resubscribe to the\n * latest control events.\n */\n public getControlRef(): Signal<AbstractControl | null> {\n return this._controlRef.asReadonly();\n }\n\n /**\n * Open dropdown\n */\n public openDropdown(): void {\n if (!this.control.disabled && !this.disabled) {\n this._syncControlState();\n this._optionsLoadedOnce.set(true);\n this._dropdownOpen.set(true); // TODO FIXME: When using autocompleteType variant, this should be called only if filter text is applied\n\n this._unsubscribeDropdownSubscribtions();\n this._resizeObserver.observe(document?.body);\n this._setupScrollListener();\n }\n }\n\n /**\n * Close dropdown\n *\n * @param focusToInput: When dropdown closes, focus or not to the input\n * @param preventDropdownReopen: For cases, when closing command comes from outside eg. clicking\n * an option in the dropdownlist. There's no need to reopen the dropdown when focusing back to\n * the input, which usually triggers opening the dropdown.\n */\n public closeDropdown(focusToInput: boolean = true, preventDropdownReopen: boolean = false): void {\n this._dropdownOpen.set(false);\n this._unsubscribeDropdownSubscribtions();\n\n this._preventDropdownReopen = preventDropdownReopen;\n if (focusToInput) {\n this._focusToSelectInput();\n }\n }\n\n /**\n * Each option sends information to parent if they are visible or not\n *\n * @param value Option value\n * @param visible Is this option visible or not\n */\n public setOptionVisibility(value: string, visible: boolean) {\n this._latestVisibleOption = value;\n\n this._visibleOptionsTemp = setVisibleOptionsList(this._visibleOptionsTemp, value, visible);\n\n if (!this._optionLoadInterval) {\n this._optionsLoadDelay().then((resolve) => {\n if (resolve) {\n this._visibleOptions = this._visibleOptionsTemp;\n this._resultsLength.set(this._visibleOptions.length);\n this.visibleOptionsUpdate.emit(this._visibleOptions.length);\n }\n });\n }\n }\n\n /**\n * Add or remove currently focused option. Called from SelectOptionBase.\n */\n public setFocusedOption(id: string, type: 'add' | 'remove'): void {\n if (type === 'add') {\n this._focusedOption = id;\n } else {\n this._focusedOption = null;\n }\n }\n\n /**\n * Promise which determines, if some of the components used in this Select has focus or not.\n *\n * @param event FocusEvent\n * @returns\n */\n public componentFocused(event: FocusEvent): Promise<boolean> {\n return new Promise((resolve) => {\n let counter = 0;\n\n const nextTarget = event?.relatedTarget as HTMLElement;\n\n const focusCheckInterval = setInterval(() => {\n const focused =\n !!this._selectRef.nativeElement.contains(this._document.activeElement) ||\n !!this._selectRef.nativeElement.contains(nextTarget);\n\n // If focus has moved another element inside Select\n if (focused || this._mouseDownInsideComponent) {\n clearInterval(focusCheckInterval);\n this._mouseDownInsideComponent = false;\n resolve(true);\n\n // If focus target is null\n } else if (!nextTarget) {\n clearInterval(focusCheckInterval);\n resolve(false);\n\n // Increase counter, and try again. This is needed usually with click events as between previous element blur and next element focus click event is \"somewhere else\"\n } else if (counter <= 100) {\n counter = counter + 50;\n } else {\n // Else resolve boolean check after two tries, if any relevant element is focused\n clearInterval(focusCheckInterval);\n resolve(!!this._focusedOption || this._inputFocused || this._clearButtonFocused);\n }\n }, 50);\n });\n }\n\n /**\n * When Clear button is clicked\n */\n protected _clearButtonClick(): void {\n if (!this.control.disabled && !this.disabled) {\n this.control.markAsTouched();\n this._clearButtonClickTrigger.set(true);\n this._setControlNull();\n this._focusToSelectInput();\n }\n }\n\n /**\n * Set control value to null Control value should reset even when user input does not match any\n * option value (i.e. control value is null), so that dropdown shows options correctly\n */\n protected _setControlNull(): void {\n if (this.control.value) {\n this.selectionUpdate.emit(null);\n this.control.patchValue(null);\n this.setAutocompleteFilterText('');\n } else {\n this.control.patchValue(null);\n this.setAutocompleteFilterText('');\n }\n }\n\n /**\n * To handle input focus\n */\n protected _selectInputFocus(event: FocusEvent): void {\n this._inputFocused = true;\n\n if (this._preventDropdownReopen) {\n this._preventDropdownReopen = false;\n this.onFocus(event);\n return;\n }\n\n const openDropdown =\n this.variant === 'dropdown' ||\n this.variant === 'autocompleteDropdown' ||\n (this.variant === 'autocompleteType' && this._autocompleteFilterText() !== '');\n\n if (!this._dropdownOpen() && openDropdown && !this._mouseDownInsideComponent) {\n this.openDropdown();\n } else if (this._clickFromIcon) {\n if (this._dropdownOpen()) {\n this.closeDropdown();\n } else {\n this.openDropdown();\n }\n }\n\n this.onFocus(event);\n }\n\n /**\n * To handle input field blur events\n *\n * @param event FocusEvent\n */\n protected _inputBlur(event: FocusEvent): void {\n this._inputFocused = false;\n\n this.componentFocused(event).then((value) => {\n if (!value) {\n this.closeDropdown(false);\n this.control.markAsTouched();\n }\n });\n }\n\n /**\n * To handle click events for input\n */\n protected _clickInput(): void {\n this._preventDropdownReopen = true;\n if (this._inputFocused || this._mouseUpOnInput) {\n if (this.variant === 'dropdown') {\n this._toggleDropdown();\n } else {\n this.openDropdown();\n }\n }\n this._focusToSelectInput();\n }\n /**\n * Register pressed key inside input field. Used to check that both key down and key up originated\n * from same source.\n */\n protected _inputKeyDown(event: KeyboardEvent): void {\n this._keyDown = event.key;\n\n // Prevent scrolling\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n }\n\n // Prevent keydown event if Enter is pressed inside multiselect input\n if (event.key === 'Enter') {\n event.preventDefault();\n }\n }\n\n /**\n * Handle keypress for dropdown select\n *\n * @param event KeyboardEvent\n * @param focusSelector CSS selector to focus to on ArrowDown event\n */\n protected _inputKeyUp(event: KeyboardEvent): void {\n const { key } = event;\n\n if (key === this._keyDown) {\n switch (key) {\n case ' ':\n if (this.variant === 'dropdown') {\n event.preventDefault();\n this._toggleDropdown();\n }\n break;\n case 'Enter':\n event.preventDefault();\n if (this._visibleOptions.length === 1) {\n this._focusToFirstOption(true);\n } else {\n this._toggleDropdown();\n }\n break;\n case 'ArrowDown':\n event.preventDefault();\n if (!this._dropdownOpen()) {\n this._toggleDropdown();\n }\n if (this._inputFocused) {\n this._focusToFirstOption();\n }\n break;\n case 'Tab':\n break;\n default:\n event.preventDefault();\n }\n }\n\n this._keyDown = null;\n }\n\n /**\n * Generate html id for parent FudisSelect\n */\n protected _setParentId(type: 'multiselect' | 'select'): void {\n if (this.id && type === 'select') {\n this._idService.addNewGrandParentId('select', this.id);\n } else if (type === 'select') {\n this.id = this._idService.getNewGrandParentId('select');\n } else if (this.id && type === 'multiselect') {\n this._idService.addNewGrandParentId('multiselect', this.id);\n } else {\n this.id = this._idService.getNewGrandParentId('multiselect');\n }\n }\n\n /**\n * Toggle dropdown\n */\n protected _toggleDropdown(): void {\n if (this._dropdownOpen()) {\n this.closeDropdown();\n } else {\n this.openDropdown();\n }\n }\n\n /**\n * Resolve a promise after delay if there hasn't been new options\n *\n * @returns Boolean\n */\n private _optionsLoadDelay(): Promise<boolean> {\n let tempLatestOptions: string;\n\n return new Promise((resolve) => {\n this._optionLoadInterval = setInterval(() => {\n if (tempLatestOptions === this._latestVisibleOption) {\n if (this._optionLoadInterval) {\n clearInterval(this._optionLoadInterval);\n this._optionLoadInterval = null;\n }\n resolve(true);\n } else {\n tempLatestOptions = this._latestVisibleOption;\n }\n }, 50);\n });\n }\n\n /**\n * Copy FormControl states into local signals\n */\n private _syncControlState(): void {\n if (!this.control) return;\n\n this._touched.set(this.control.touched);\n this._invalid.set(this.control.invalid);\n this._disabled.set(this.control.disabled);\n this._enabled.set(this.control.enabled);\n this._selectedLabel.set(this.control.value?.label ?? null);\n }\n\n /**\n * Set Clear button's focus state to false\n */\n protected _setClearButtonFocusFalse(): void {\n this._clearButtonFocused = false;\n }\n\n /**\n * Set focus state of Clear Button and determine if Dropdown should be closed when this function\n * is called\n *\n * @param event FocusEvent\n * @param state\n */\n protected _setClearButtonFocusState(event: FocusEvent, state: boolean): void {\n this._clearButtonFocused = state;\n\n if (!state) {\n this.componentFocused(event).then((value) => {\n if (!value) {\n this.closeDropdown(false);\n }\n });\n }\n }\n\n /**\n * Update input filter text\n *\n * @param text String to set as filter text\n * @param nullCheck True by default, check if control should be set as null\n */\n public setAutocompleteFilterText(text: string, nullCheck = true): void {\n if (this._autocompleteFilterText() !== text) {\n this._autocompleteFilterText.set(text);\n this.filterTextUpdate.emit(text);\n }\n if (nullCheck) {\n this._checkIfAutocompleteValueNull(text);\n }\n }\n\n /**\n * Checks if currently typed filter text is not same as control label value\n *\n * @param text Filter text value emitted from autocomplete\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected _checkIfAutocompleteValueNull(text: string): void {}\n\n /**\n * To focus on first option when dropdown opens\n *\n * @param cssfocusSelector CSS class to focus to\n */\n protected _focusToFirstOption(clickFirstOption?: boolean): void {\n const firstOption: HTMLInputElement | null =\n this._dropdownRef?.dropdownElement.nativeElement.querySelector(this.focusSelector);\n\n if (firstOption) {\n firstOption.focus();\n\n if (clickFirstOption) {\n firstOption.click();\n }\n\n if (this._document.activeElement !== firstOption) {\n setTimeout(() => {\n firstOption.focus();\n if (clickFirstOption) {\n firstOption.click();\n }\n }, 0);\n }\n } else if (this._focusTryCounter < 20) {\n setTimeout(() => {\n this._focusTryCounter += 1;\n this._focusToFirstOption();\n }, 100);\n }\n }\n\n /**\n * When blurring away from Dropdown, check if this Select has focus\n */\n protected _dropdownBlur(event: FocusEvent): void {\n this.componentFocused(event).then((value) => {\n if (!value) {\n this.closeDropdown(false);\n }\n });\n }\n\n /**\n * Browser focus logic differs. E. g. Firefox tries to focus to Dropdown menu wrapper. This\n * function determines that if it should focus to first option or back to input field.\n */\n protected _dropdownFocus(event: FocusEvent): void {\n const focusFromInputOrClearButton =\n event.relatedTarget === this._inputRef?.nativeElement ||\n this._selectIconsRef.nativeElement.contains(event.relatedTarget as HTMLElement);\n\n if (focusFromInputOrClearButton) {\n this._focusToFirstOption();\n } else {\n this._focusToSelectInput();\n }\n }\n\n /**\n * Focus to input field\n */\n protected _focusToSelectInput() {\n this._inputRef?.nativeElement.focus();\n }\n\n /**\n * Function declaration overridden and implemented by Select and Multiselect\n */\n protected _updateComponentStateFromControlValue(): void {}\n\n /**\n * When pressing keyboard Esc, focus to Select input, set flag that dropdown was closed with\n * Escape key and close dropdown\n *\n * @param event\n */\n @HostListener('window:keydown', ['$event'])\n protected _handleEscapePress(event: KeyboardEvent) {\n if (event.key === 'Escape' && this._dropdownOpen()) {\n event.preventDefault();\n this._dialogService.dropdownClosedWithEscape();\n this.closeDropdown(true, true);\n }\n }\n\n /**\n * When user clicks, set status whether click is inside or outside the Select element\n *\n * @param targetElement\n */\n @HostListener('document:mouseup', ['$event'])\n protected _handleWindowClick(event: MouseEvent) {\n this._mouseDownInsideComponent = false;\n\n const targetElement = event.target;\n\n // Type guard\n if (targetElement instanceof Element) {\n if (this._dropdownOpen() && !this._selectRef.nativeElement.contains(targetElement)) {\n this.closeDropdown(false);\n }\n }\n }\n\n @HostListener('mousedown')\n protected _handleMouseDown() {\n this._mouseDownInsideComponent = true;\n }\n\n @HostListener('mouseup', ['$event'])\n protected _handleMouseUp(event: MouseEvent) {\n const targetElement = event.target;\n // Type guard\n if (!(targetElement instanceof Element)) return;\n\n this._clickFromIcon =\n this._selectRef.nativeElement.contains(targetElement) &&\n !!targetElement.closest('.fudis-select-icons__container');\n\n this._mouseUpOnInput =\n targetElement &&\n (!!this._inputRef?.nativeElement.contains(targetElement) || this._clickFromIcon);\n\n if (this._clickFromIcon) {\n if (!this.control.disabled) {\n this._focusToSelectInput();\n }\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n Directive,\n ElementRef,\n Input,\n Renderer2,\n EventEmitter,\n Output,\n Inject,\n AfterViewInit,\n OnChanges,\n DOCUMENT,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\nimport { FudisSelectOption } from '../../../../../types/forms';\nimport { joinInputValues } from '../utilities/selectUtilities';\n\nimport { FudisComponentChanges } from '../../../../../../lib/types/miscellaneous';\nimport { FudisIdService } from '../../../../../services/id/id.service';\n\n@Directive({\n selector: '[fudisSelectBaseControlValueAccessor]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: SelectBaseControlValueAccessorDirective,\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: SelectBaseControlValueAccessorDirective,\n multi: true,\n },\n ],\n standalone: false,\n})\nclass SelectBaseControlValueAccessorDirective implements ControlValueAccessor, Validator {\n constructor() {}\n\n onChanged: () => any = () => {};\n onTouched: () => any = () => {};\n onValidate: () => any = () => {};\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n writeValue(value: unknown): void {}\n\n registerOnChange(fn: () => any) {\n this.onChanged = fn;\n }\n registerOnTouched(fn: () => any) {\n this.onTouched = fn;\n }\n\n validate(control: AbstractControl): ValidationErrors | null {\n if (control.invalid) {\n return control.errors;\n } else {\n return null;\n }\n }\n}\n\n@Directive({\n selector: '[fudisSelectControlValueAccessor]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: SelectControlValueAccessorDirective,\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: SelectControlValueAccessorDirective,\n multi: true,\n },\n ],\n})\nexport class SelectControlValueAccessorDirective<T = string>\n extends SelectBaseControlValueAccessorDirective\n implements OnChanges\n{\n constructor(\n private _elementRef: ElementRef<HTMLInputElement>,\n private _renderer: Renderer2,\n ) {\n super();\n }\n\n @Input() filterText: string | null;\n\n ngOnChanges(changes: FudisComponentChanges<SelectControlValueAccessorDirective<T>>): void {\n if (changes.filterText?.currentValue !== changes.filterText?.previousValue) {\n this.writeValue();\n }\n }\n\n override writeValue(value?: FudisSelectOption<T> | null): void {\n const valueToSet = value?.label || null;\n\n if (valueToSet) {\n this._renderer.setAttribute(this._elementRef.nativeElement, 'value', valueToSet);\n if (this._elementRef.nativeElement.value !== valueToSet) {\n this._elementRef.nativeElement.value = valueToSet;\n }\n } else if (this.filterText) {\n this._renderer.setAttribute(this._elementRef.nativeElement, 'value', this.filterText);\n if (this._elementRef.nativeElement.value !== this.filterText) {\n this._elementRef.nativeElement.value = this.filterText;\n }\n } else {\n this._renderer.removeAttribute(this._elementRef.nativeElement, 'value');\n }\n }\n}\n\n@Directive({\n selector: '[fudisMultiselectControlValueAccessor]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: MultiselectControlValueAccessorDirective,\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: MultiselectControlValueAccessorDirective,\n multi: true,\n },\n ],\n})\nexport class MultiselectControlValueAccessorDirective<T = string>\n extends SelectBaseControlValueAccessorDirective\n implements AfterViewInit\n{\n constructor(\n @Inject(DOCUMENT) private _document: Document,\n private _elementRef: ElementRef<HTMLInputElement>,\n private _renderer: Renderer2,\n ) {\n super();\n }\n\n @Input() id: string;\n @Input() enableAutocomplete: boolean = false;\n\n @Output() handleSortedSelectedOptions = new EventEmitter<FudisSelectOption<T>[] | null>();\n\n ngAfterViewInit(): void {\n this.writeValue(this._selectedOptions);\n }\n\n /**\n * When selecting / deselecting options, variable for storing them in the order of their id's\n * (usually the DOM order)\n */\n protected _selectedOptions: FudisSelectOption<T>[] | null = null;\n\n override writeValue(value: FudisSelectOption<T>[] | null): void {\n this._selectedOptions = value;\n\n this._setVisibleLabel(value);\n }\n\n private _setVisibleLabel(value: FudisSelectOption<T>[] | null): void {\n const dropdown = this._document.getElementById(`${this.id}-dropdown`);\n\n if (value) {\n const sortedSelectedOptions = dropdown\n ? [...value].sort(this._sortSelectedOptionsDOMOrder(dropdown, this.id))\n : [...value];\n\n this.handleSortedSelectedOptions.emit(sortedSelectedOptions);\n\n if (!this.enableAutocomplete) {\n const labelToSet = joinInputValues(sortedSelectedOptions);\n\n this._renderer.setAttribute(this._elementRef.nativeElement, 'value', labelToSet);\n }\n } else {\n this._renderer.removeAttribute(this._elementRef.nativeElement, 'value');\n this.handleSortedSelectedOptions.emit(null);\n }\n }\n\n /**\n * Sort selected options the same order they appear in the DOM\n */\n private _sortSelectedOptionsDOMOrder(dropdown: HTMLElement | null, id: string) {\n return function (a: FudisSelectOption<T>, b: FudisSelectOption<T>): 0 | -1 | 1 {\n const aElementId = FudisIdService.createSelectOptionId(id, a.label);\n const bElementId = FudisIdService.createSelectOptionId(id, b.label);\n\n if (aElementId === bElementId) {\n return 0;\n }\n\n if (dropdown) {\n const firstEl = dropdown.querySelector(`#${aElementId}`);\n const secondEl = dropdown.querySelector(`#${bElementId}`);\n\n if (firstEl && secondEl) {\n const position = firstEl.compareDocumentPosition(secondEl);\n\n if (\n position & Node.DOCUMENT_POSITION_FOLLOWING ||\n position & Node.DOCUMENT_POSITION_CONTAINED_BY\n ) {\n return -1;\n } else if (\n position & Node.DOCUMENT_POSITION_PRECEDING ||\n position & Node.DOCUMENT_POSITION_CONTAINS\n ) {\n return 1;\n }\n }\n }\n\n return 0;\n };\n }\n}\n","import {\n Directive,\n EventEmitter,\n HostListener,\n Input,\n Output,\n OnChanges,\n ElementRef,\n} from '@angular/core';\nimport { FudisComponentChanges } from '../../../../../types/miscellaneous';\n\n@Directive({ selector: '[fudisSelectAutocompleteBase]' })\nexport class SelectAutocompleteBaseDirective {\n constructor(protected _elementRef: ElementRef<HTMLInputElement>) {}\n\n /**\n * To enable autocomplete\n */\n @Input() enableAutocomplete: boolean = false;\n\n /**\n * Determine how many characters must be typed for autocomplete to open available options\n */\n @Input({ required: true }) typeThreshold: 0 | 3;\n\n /**\n * Id of binded Select element\n */\n @Input() id: string;\n\n /**\n * To clear input field when Clear Button is clicked\n */\n @Input() clearButtonClick: boolean | null;\n\n /**\n * Output event for updating parent's filter text signal\n */\n @Output() handleFilterTextUpdate = new EventEmitter<string>();\n\n /**\n * Output event for opening parent dropdown\n */\n @Output() handleDropdownOpen = new EventEmitter<void>();\n\n /**\n * Output event for closing parent dropdown\n */\n @Output() handleDropdownClose = new EventEmitter<void>();\n\n /**\n * Output event for closing parent dropdown\n */\n @Output() handleClearButtonReset = new EventEmitter<void>();\n\n /**\n * Output event for input focus\n */\n @Output() handleFocus = new EventEmitter<{ event: FocusEvent; focusFromClearButton: boolean }>();\n\n /**\n * Output event for input blur\n */\n @Output() handleBlur = new EventEmitter<FocusEvent>();\n\n /**\n * Keyboard button pressed\n */\n private _keyDown: string | null;\n\n /**\n * If Focus came from related clear button\n */\n private _focusFromClearButton: boolean = false;\n\n /**\n * Currently typed input text\n */\n private _inputText: string = '';\n\n /**\n * If input is focused or not\n */\n protected _focused: boolean = false;\n\n @HostListener('focus', ['$event'])\n protected _handleFocus(event: FocusEvent) {\n this._focused = true;\n\n if ((event.relatedTarget as HTMLElement)?.getAttribute('id') === `${this.id}-clear-button`) {\n this._focusFromClearButton = true;\n }\n this.handleFocus.emit({ event: event, focusFromClearButton: this._focusFromClearButton });\n }\n\n @HostListener('blur', ['$event'])\n protected _handleBlur(event: FocusEvent) {\n this._focused = false;\n this.handleBlur.emit(event);\n }\n\n @HostListener('keydown', ['$event'])\n protected _handleKeyDown(event: KeyboardEvent) {\n if (event.target) {\n this._keyDown = event.key;\n }\n }\n\n @HostListener('keyup', ['$event'])\n protected _handleKeyUp(event: KeyboardEvent) {\n if (this.enableAutocomplete) {\n if (this._keyDown) {\n const newValue = (event.target as HTMLInputElement).value;\n\n if (newValue !== this._inputText) {\n this._inputText = newValue;\n\n if (newValue.length >= this.typeThreshold) {\n this.handleFilterTextUpdate.emit(newValue);\n this.handleDropdownOpen.emit();\n } else {\n this.handleDropdownClose.emit();\n this.handleFilterTextUpdate.emit('');\n }\n }\n } else if (\n this._focused &&\n this._focusFromClearButton &&\n (event.key === 'Enter' || event.key === ' ')\n ) {\n this._elementRef.nativeElement.value = '';\n this.handleFilterTextUpdate.emit('');\n if (this.typeThreshold === 0) {\n this.handleDropdownOpen.emit();\n } else {\n this.handleDropdownClose.emit();\n }\n }\n this._focusFromClearButton = false;\n this._keyDown = null;\n }\n }\n}\n\n@Directive({ selector: '[fudisSelectAutocomplete]' })\nexport class SelectAutocompleteDirective\n extends SelectAutocompleteBaseDirective\n implements OnChanges\n{\n constructor(_elementRef: ElementRef<HTMLInputElement>) {\n super(_elementRef);\n }\n\n /**\n * Currently selected visible label\n */\n @Input() selectedLabel: string | null;\n\n ngOnChanges(changes: FudisComponentChanges<SelectAutocompleteDirective>): void {\n if (this.enableAutocomplete) {\n const selectedLabel = changes.selectedLabel?.currentValue;\n const clearButtonClick = changes.clearButtonClick?.currentValue;\n\n if (clearButtonClick && clearButtonClick !== changes.clearButtonClick?.previousValue) {\n // Clear Button click\n this._elementRef.nativeElement.value = '';\n this.handleClearButtonReset.emit();\n } else if (\n // Selected label is proper value\n selectedLabel &&\n changes.selectedLabel?.currentValue !== changes.selectedLabel?.previousValue\n ) {\n this._elementRef.nativeElement.value = selectedLabel;\n } else if (changes.selectedLabel && !selectedLabel && !this._focused) {\n // Selected label is null, but focus is not on input\n this._elementRef.nativeElement.value = '';\n }\n }\n }\n}\n\n@Directive({ selector: '[fudisMultiselectAutocomplete]' })\nexport class MultiselectAutocompleteDirective\n extends SelectAutocompleteBaseDirective\n implements OnChanges\n{\n constructor(_elementRef: ElementRef<HTMLInputElement>) {\n super(_elementRef);\n }\n ngOnChanges(changes: FudisComponentChanges<SelectAutocompleteDirective>): void {\n if (this.enableAutocomplete) {\n if (\n changes.clearButtonClick?.currentValue &&\n changes.clearButtonClick?.currentValue !== changes.clearButtonClick?.previousValue\n ) {\n // Clear Button click\n this._elementRef.nativeElement.value = '';\n this.handleClearButtonReset.emit();\n }\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n effect,\n OnChanges,\n inject,\n DestroyRef,\n} from '@angular/core';\nimport { FudisTranslationService } from '../../../../../services/translation/translation.service';\nimport { FudisSelectVariant } from '../../../../../types/forms';\nimport { FormControl } from '@angular/forms';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { FudisComponentChanges } from '../../../../../types/miscellaneous';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { IconComponent } from '../../../../icon/icon.component';\nimport { IconButtonComponent } from '../../../../icon-button/icon-button.component';\nimport { AsyncPipe } from '@angular/common';\n\n@Component({\n selector: 'fudis-select-icons',\n templateUrl: './select-icons.component.html',\n styleUrls: ['./select-icons.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [IconComponent, IconButtonComponent, AsyncPipe],\n})\nexport class SelectIconsComponent implements OnChanges {\n constructor(protected _translationService: FudisTranslationService) {\n effect(() => {\n this._translationClearFilterText.next(\n _translationService.getTranslations()().SELECT.AUTOCOMPLETE.CLEAR,\n );\n });\n }\n\n /**\n * If Select's dropdown is open\n */\n @Input() dropdownOpen: boolean | null;\n\n /**\n * Parent Select's variant\n */\n @Input() parentVariant: FudisSelectVariant;\n\n /**\n * Show / hide clear button\n */\n @Input() clearButton: boolean;\n\n /**\n * If clear button is disabled\n */\n @Input() disabled: boolean;\n\n /**\n * Autocomplete's filter text\n */\n @Input() filterText: boolean;\n\n /**\n * Parent Select's form control\n */\n @Input() parentControl: FormControl;\n\n /**\n * Id of parent Select\n */\n @Input() parentId: string;\n\n /**\n * Output event for Clear Button click\n */\n @Output() handleClearButtonClick: EventEmitter<Event> = new EventEmitter<Event>();\n\n /**\n * Output event for Clear Button focus\n */\n @Output() handleClearButtonFocus: EventEmitter<FocusEvent> = new EventEmitter<FocusEvent>();\n\n /**\n * Output event for Clear Button blur\n */\n @Output() handleClearButtonBlur: EventEmitter<FocusEvent> = new EventEmitter<FocusEvent>();\n\n /**\n * Output event for Clear Button destroy\n */\n @Output() handleClearButtonDestroy: EventEmitter<void> = new EventEmitter<void>();\n\n /**\n * Observable for status if parent control has value\n */\n protected _controlValue = new BehaviorSubject<boolean>(false);\n\n /**\n * Translated aria-label for autocomplete close icon button which clears the input\n */\n protected _translationClearFilterText = new BehaviorSubject<string>('');\n\n /**\n * Subscription for handling the valueChanges observable\n */\n private _subscription: Subscription;\n\n private _destroyRef = inject(DestroyRef);\n\n /**\n * Click handler for Clear Button\n */\n protected _clearButtonClick(event: Event): void {\n this.handleClearButtonClick.emit(event);\n }\n\n /**\n * Focus handler for Clear Button\n */\n protected _handleClearButtonFocus(event: FocusEvent): void {\n this.handleClearButtonFocus.emit(event);\n }\n\n /**\n * Blur handler for Clear Button\n */\n protected _handleClearButtonBlur(event: FocusEvent): void {\n this.handleClearButtonBlur.emit(event);\n }\n\n ngOnChanges(changes: FudisComponentChanges<SelectIconsComponent>): void {\n if (changes.parentControl?.currentValue !== changes.parentControl?.previousValue) {\n this._controlValue.next(!!changes.parentControl?.currentValue?.value);\n\n this._subscription?.unsubscribe();\n this._subscription = this.parentControl.valueChanges\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((value) => {\n this._controlValue.next(!!value);\n });\n }\n }\n}\n","<div class=\"fudis-select-icons__container\">\n @if (\n parentVariant !== \"autocompleteType\" &&\n (!clearButton || ((_controlValue | async) === false && !filterText))\n ) {\n <fudis-icon\n class=\"fudis-select-icons__icon\"\n [class.fudis-select-icons__icon--disabled]=\"disabled\"\n [icon]=\"'chevron'\"\n [rotate]=\"dropdownOpen ? 'ccw-90' : 'cw-90'\"\n />\n }\n @if (\n (parentVariant === \"autocompleteType\" && !filterText && (_controlValue | async) === false) ||\n (parentVariant === \"autocompleteType\" && !clearButton)\n ) {\n <fudis-icon\n class=\"fudis-select-icons__icon\"\n [class.fudis-select-icons__icon--disabled]=\"disabled\"\n [icon]=\"'search'\"\n />\n }\n</div>\n\n@if (clearButton) {\n @if (_translationClearFilterText | async; as clearText) {\n <fudis-icon-button\n [class.fudis-select-icons__icon--disabled]=\"disabled\"\n [class.fudis-select-icons__icon--hidden]=\"\n !(\n (parentVariant === 'dropdown' && (_controlValue | async)) ||\n (parentVariant === 'autocompleteDropdown' && (filterText || (_controlValue | async))) ||\n (parentVariant === 'autocompleteType' && (filterText || (_controlValue | async)))\n )\n \"\n (handleClick)=\"_clearButtonClick($event)\"\n (handleDestroy)=\"handleClearButtonDestroy.emit()\"\n (handleFocus)=\"_handleClearButtonFocus($event)\"\n (handleBlur)=\"_handleClearButtonBlur($event)\"\n [id]=\"parentId + '-clear-button'\"\n [size]=\"'extra-small'\"\n [variant]=\"'tertiary'\"\n [icon]=\"'close'\"\n [ariaLabel]=\"clearText\"\n [disabled]=\"disabled\"\n />\n }\n}\n","import {\n Component,\n Input,\n effect,\n OnChanges,\n signal,\n WritableSignal,\n computed,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { DropdownBaseDirective } from '../../../../../directives/form/dropdown-base/dropdown-base.directive';\nimport { FudisTranslationService } from '../../../../../services/translation/translation.service';\nimport { FudisInputSize, FudisSelectVariant } from '../../../../../types/forms';\nimport { FudisComponentChanges } from '../../../../../types/miscellaneous';\nimport { BehaviorSubject } from 'rxjs';\nimport { BodyTextComponent } from '../../../../typography/body-text/body-text.component';\nimport { NgTemplateOutlet, AsyncPipe } from '@angular/common';\n\n@Component({\n selector: 'fudis-select-dropdown',\n templateUrl: './select-dropdown.component.html',\n styleUrls: ['./select-dropdown.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [BodyTextComponent, NgTemplateOutlet, AsyncPipe],\n})\nexport class SelectDropdownComponent extends DropdownBaseDirective implements OnChanges {\n constructor(private _translationService: FudisTranslationService) {\n super();\n effect(() => {\n const translations = _translationService.getTranslations()().SELECT.AUTOCOMPLETE;\n\n this._translationNoResultsFound.next(translations.NO_RESULTS);\n this._translationResults.next(translations.RESULTS);\n this._translationShowing.next(translations.SHOWING);\n });\n }\n\n /**\n * Variant of parent Select / Multiselect\n */\n @Input({ required: true }) selectVariant: FudisSelectVariant;\n\n /**\n * Number of results\n */\n @Input() results: number;\n\n /**\n * With Autocomplete variants optional helper text displayed as first item in Dropdown\n */\n @Input() autocompleteHelpText: string | false;\n\n /**\n * By default, Autocomplete variant will display \"No results found\" text when there are 0 options\n * matching. When combined with 'autocompleteFilter' false, application can set their own\n * 'Fetching options...' etc. text while their own filtering is in progress.\n */\n @Input() autocompleteNoResultsText: string | null = null;\n\n /**\n * Current filter text from Autocomplete parents\n */\n @Input() filterText: string;\n\n /**\n * Assign Select dropdown to contain single-select or multiselect options (with checkboxes)\n */\n @Input() multiselect: boolean = false;\n\n /**\n * Id of parent component\n */\n @Input() parentId: string;\n\n /**\n * Set dropdown size\n */\n @Input() size: FudisInputSize | 'xs' = 'lg';\n\n /**\n * Set dropdown open status\n */\n @Input() open: boolean | null = false;\n\n /**\n * Internal translated label for situations where no results with current filters were found\n */\n protected _translationNoResultsFound = new BehaviorSubject<string>('');\n\n /**\n * Internal translated label for visible results\n */\n protected _translationResults = new BehaviorSubject<string>('');\n\n /**\n * Internal translated label for visible results\n */\n protected _translationShowing = new BehaviorSubject<string>('');\n\n /**\n * Internal signal mirroring results Input\n */\n private _resultsSignal: WritableSignal<number> = signal(0);\n\n /**\n * Internal signal mirroring filterText Input\n */\n private _filterTextSignal: WritableSignal<string> = signal('');\n\n /**\n * Computed signal for building and updating screen reader message\n */\n protected _liveMessage = computed(() => {\n const filterText = this._filterTextSignal();\n const results = this._resultsSignal();\n\n // Only announce while dropdown is open\n if (!this.open) {\n return '';\n }\n\n // Reset announcement when input is cleared\n if (!filterText) {\n return '';\n }\n\n const helpText =\n typeof this.autocompleteHelpText === 'string' ? this.autocompleteHelpText : null;\n\n let message: string;\n\n if (helpText) {\n message = helpText;\n } else {\n // Handle the message based on results\n const showingText = this._translationShowing.value;\n const resultsText = this._translationResults.value;\n const noResultsText = this._translationNoResultsFound.value;\n\n if (results > 0) {\n message = `${showingText} ${results} ${resultsText}`;\n } else {\n message = `${noResultsText}`;\n }\n }\n\n return message;\n });\n\n ngOnChanges(changes: FudisComponentChanges<SelectDropdownComponent>): void {\n const newResults = changes.results?.currentValue;\n const newFilterText = changes.filterText?.currentValue;\n\n if (\n (changes.filterText &&\n newFilterText !== undefined &&\n newFilterText !== changes.filterText?.previousValue) ||\n (changes.results && newResults !== undefined && newResults !== changes.results?.previousValue)\n ) {\n this._filterTextSignal.set(this.filterText ?? '');\n this._resultsSignal.set(this.results ?? 0);\n }\n }\n}\n","<span class=\"fudis-visually-hidden\" role=\"status\">{{ _liveMessage() }}</span>\n<div\n #dropdownElement\n [class.fudis-select-dropdown--hidden]=\"selectVariant === 'autocompleteType' && !filterText\"\n class=\"fudis-select-dropdown fudis-input-size__{{ size }}\"\n [class.fudis-select-dropdown--open]=\"open\"\n [class.fudis-select-dropdown__multiselect]=\"multiselect\"\n [attr.id]=\"parentId + '-dropdown'\"\n [attr.aria-labelledby]=\"parentId + '-label'\"\n [attr.aria-multiselectable]=\"multiselect || null\"\n (focus)=\"_dropdownFocus($event)\"\n (blur)=\"_dropdownBlur($event)\"\n role=\"listbox\"\n>\n @if (selectVariant !== \"dropdown\" && open && filterText) {\n @if (autocompleteHelpText !== false) {\n <fudis-body-text\n [class.fudis-select-dropdown__help-text--hidden]=\"!results\"\n class=\"fudis-select-dropdown__help-text fudis-select-dropdown__help-text__first\"\n [variant]=\"'md-light'\"\n ><ng-container *ngTemplateOutlet=\"helpText\"\n /></fudis-body-text>\n }\n <fudis-body-text\n class=\"fudis-select-dropdown__help-text fudis-select-dropdown__help-text__last\"\n [class.fudis-select-dropdown__help-text--hidden]=\"results\"\n [variant]=\"'md-light'\"\n ><ng-container *ngTemplateOutlet=\"noResults\" />\n </fudis-body-text>\n }\n <ng-content></ng-content>\n</div>\n\n<ng-template #helpText>\n @if (autocompleteHelpText) {\n {{ autocompleteHelpText }}\n }\n @if (!autocompleteHelpText) {\n {{ _translationShowing | async }} {{ results }} {{ _translationResults | async }}\n }\n</ng-template>\n\n<ng-template #noResults>\n @if (autocompleteNoResultsText) {\n {{ autocompleteNoResultsText }}\n }\n @if (!autocompleteNoResultsText) {\n {{ _translationNoResultsFound | async }}\n }\n</ng-template>\n","import {\n AfterViewInit,\n Component,\n EventEmitter,\n Inject,\n Input,\n OnInit,\n Output,\n ViewChild,\n ViewEncapsulation,\n DOCUMENT,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { areObjectsDeepEquals } from '../../../../utilities/areObjectsDeepEquals';\nimport { FudisFocusService } from '../../../../services/focus/focus.service';\nimport { FudisIdService } from '../../../../services/id/id.service';\nimport { SelectBaseDirective } from '../common/select-base/select-base.directive';\nimport { FudisSelectOption } from '../../../../types/forms';\nimport { SelectControlValueAccessorDirective } from '../common/select-control-value-accessor/select-control-value-accessor.directive';\nimport { BaseSelectableComponent } from '../common/interfaces/base-selectable.interface';\nimport { FudisDialogService } from '../../../../services/dialog/dialog.service';\nimport { LabelComponent } from '../../label/label.component';\nimport { SelectAutocompleteDirective } from '../common/autocomplete/autocomplete.directive';\nimport { SelectIconsComponent } from '../common/select-icons/select-icons.component';\nimport { SelectDropdownComponent } from '../common/select-dropdown/select-dropdown.component';\nimport { NgTemplateOutlet, AsyncPipe } from '@angular/common';\nimport { GuidanceComponent } from '../../guidance/guidance.component';\n\n/**\n * Allows selection of a single option from a dropdown list.\n *\n * Use this component when there are multiple predefined options and user can choose only one value.\n * The FormControl value is a `FudisSelectOption` object (not a primitive). Options are projected\n * via `<ng-template fudisSelectOptions>` containing `<fudis-select-option>` elements.\n *\n * Option data should be treated as immutable. If application needs to update option labels\n * dynamically, for example after a language change, provide a new options array with new\n * `FudisSelectOption` object references instead of mutating existing option objects in place.\n * Replacing option objects allows the component to update the selected label and option views\n * correctly.\n *\n * @example\n * ```html\n * <fudis-select [label]=\"'Country'\" [control]=\"countryControl\">\n * <ng-template fudisSelectOptions>\n * <fudis-select-option [data]=\"{ value: 'fi', label: 'Finland' }\"></fudis-select-option>\n * <fudis-select-option [data]=\"{ value: 'se', label: 'Sweden' }\"></fudis-select-option>\n * </ng-template>\n * </fudis-select>\n * ```;\n */\n@Component({\n selector: 'fudis-select',\n templateUrl: './select.component.html',\n styleUrls: ['./select.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n LabelComponent,\n FormsModule,\n SelectControlValueAccessorDirective,\n SelectAutocompleteDirective,\n ReactiveFormsModule,\n SelectIconsComponent,\n SelectDropdownComponent,\n NgTemplateOutlet,\n GuidanceComponent,\n AsyncPipe,\n ],\n})\nexport class SelectComponent<T = string>\n extends SelectBaseDirective\n implements OnInit, AfterViewInit, BaseSelectableComponent\n{\n constructor(\n @Inject(DOCUMENT) _document: Document,\n _dialogService: FudisDialogService,\n _idService: FudisIdService,\n _focusService: FudisFocusService,\n ) {\n super(_document, _dialogService, _focusService, _idService);\n }\n\n @ViewChild(SelectControlValueAccessorDirective)\n public selectCVA: SelectControlValueAccessorDirective<T>;\n\n /**\n * FormControl for single select\n */\n @Input({ required: true }) override control: FormControl<FudisSelectOption<T> | null>;\n\n /**\n * Value output event on selection change\n */\n @Output() override selectionUpdate: EventEmitter<FudisSelectOption<T> | null> =\n new EventEmitter<FudisSelectOption<T> | null>();\n\n ngOnInit(): void {\n this._setParentId('select');\n }\n\n /**\n * Handler for triggered option selection change\n *\n * @param value Option to be selected\n * @param disableSignalEmit Disable signal update to reduce unneeded state updates\n */\n public handleSelectionChange(value: FudisSelectOption<T> | null): void {\n // Check if option clicked is not the same as already selected one. If they are different, then trigger state changes in component and control values\n const equalValues = areObjectsDeepEquals(value, this.control.value!);\n\n if (!equalValues) {\n this.selectionUpdate.emit(value);\n this.control.patchValue(value);\n }\n }\n\n /**\n * Checks if currently typed filter text is not same as control label value\n *\n * @param text Filter text value emitted from autocomplete\n */\n protected override _checkIfAutocompleteValueNull(text: string): void {\n if (this.control.value && text.toLowerCase() !== this.control.value?.label?.toLowerCase()) {\n this.selectionUpdate.emit(null);\n this.control.patchValue(null);\n }\n }\n\n /**\n * If control value is updated from the Application, update component's state accordingly\n */\n protected override _updateComponentStateFromControlValue(): void {\n const currentLabel = this.control.value?.label;\n if (this.variant !== 'dropdown') {\n if (currentLabel) {\n this.setAutocompleteFilterText(currentLabel);\n } else if (!this._inputFocused) {\n this.setAutocompleteFilterText('');\n }\n }\n }\n}\n","@let dropdownOpen = _dropdownOpen();\n@let autocompleteFilterText = _autocompleteFilterText();\n\n<div class=\"fudis-select fudis-input-size__{{ size }}\" [id]=\"id + '-main-wrapper'\">\n <fudis-label\n [text]=\"label\"\n [id]=\"id + '-label'\"\n [for]=\"id\"\n [required]=\"_required | async\"\n [popoverText]=\"popoverText\"\n [popoverPosition]=\"popoverPosition\"\n [popoverTriggerLabel]=\"popoverTriggerLabel\"\n >\n </fudis-label>\n <div #selectRef>\n <div class=\"fudis-select__input-wrapper fudis-input-size__{{ size }}\">\n <input\n #inputRef\n fudisSelectControlValueAccessor\n fudisSelectAutocomplete\n [id]=\"id\"\n [attr.id]=\"id\"\n [formControl]=\"control\"\n [class.fudis-select__input__dropdown]=\"variant === 'dropdown'\"\n [class.fudis-select-autocomplete]=\"variant !== 'dropdown'\"\n class=\"fudis-form-input fudis-select__input\"\n [class.fudis-form-input--touched]=\"_afterViewInitDone() && _touched()\"\n (click)=\"!_disabled() && !disabled && _clickInput()\"\n (focus)=\"_selectInputFocus($event)\"\n (blur)=\"_inputBlur($event)\"\n (keydown)=\"_inputKeyDown($event)\"\n (keyup)=\"_inputKeyUp($event)\"\n [enableAutocomplete]=\"variant !== 'dropdown'\"\n [selectedLabel]=\"_selectedLabel()\"\n [typeThreshold]=\"variant === 'autocompleteType' ? 3 : 0\"\n [filterText]=\"autocompleteFilterText\"\n [clearButtonClick]=\"_clearButtonClickTrigger()\"\n (handleDropdownOpen)=\"openDropdown()\"\n (handleDropdownClose)=\"closeDropdown()\"\n (handleClearButtonReset)=\"_clearButtonClickTrigger.set(false)\"\n (handleFilterTextUpdate)=\"setAutocompleteFilterText($event)\"\n type=\"text\"\n autocomplete=\"off\"\n aria-haspopup=\"listbox\"\n role=\"combobox\"\n [attr.readonly]=\"variant === 'dropdown' ? true : null\"\n [attr.aria-autocomplete]=\"variant === 'dropdown' ? null : 'list'\"\n [attr.placeholder]=\"placeholder\"\n [attr.aria-controls]=\"_optionsLoadedOnce() ? id + '-dropdown' : null\"\n [attr.tabindex]=\"!_disabled() && !disabled ? null : -1\"\n [attr.aria-expanded]=\"dropdownOpen\"\n [attr.aria-disabled]=\"_disabled() || disabled || null\"\n [attr.required]=\"(_required | async) || null\"\n [attr.aria-labelledby]=\"id + '-label'\"\n [attr.aria-describedby]=\"id + '_guidance'\"\n [attr.aria-invalid]=\"(_invalid() && _touched()) || null\"\n />\n <div #selectIconsRef class=\"fudis-select__input-wrapper__icons\">\n <fudis-select-icons\n [filterText]=\"!!autocompleteFilterText\"\n [parentControl]=\"control\"\n [parentVariant]=\"variant\"\n [dropdownOpen]=\"dropdownOpen\"\n [parentId]=\"id\"\n (handleClearButtonClick)=\"_clearButtonClick()\"\n (handleClearButtonFocus)=\"_setClearButtonFocusState($event, true)\"\n (handleClearButtonBlur)=\"_setClearButtonFocusState($event, false)\"\n (handleClearButtonDestroy)=\"_setClearButtonFocusFalse()\"\n [clearButton]=\"selectionClearButton\"\n [disabled]=\"_disabled() || disabled\"\n />\n </div>\n </div>\n @if (_optionsLoadedOnce() && !_disabled() && !disabled) {\n <fudis-select-dropdown\n #dropdownRef\n [open]=\"dropdownOpen\"\n [selectVariant]=\"variant\"\n [results]=\"_resultsLength()\"\n [autocompleteHelpText]=\"autocompleteHelpText\"\n [autocompleteNoResultsText]=\"autocompleteNoResultsText\"\n [filterText]=\"autocompleteFilterText\"\n [size]=\"size\"\n [parentId]=\"id\"\n (handleBlur)=\"_dropdownBlur($event)\"\n (handleFocus)=\"_dropdownFocus($event)\"\n >\n @if (_selectOptionsDirective) {\n <ng-container *ngTemplateOutlet=\"_selectOptionsDirective!.templateRef\" />\n }\n </fudis-select-dropdown>\n }\n </div>\n @if (!disableGuidance) {\n <fudis-guidance [inputLabel]=\"label\" [helpText]=\"helpText\" [for]=\"id\" [control]=\"control\">\n <ng-content select=\"fudis-error-message\" />\n </fudis-guidance>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { FudisSelectOption } from '../../../../../types/forms';\nimport { FudisTranslationService } from '../../../../../services/translation/translation.service';\nimport { IconComponent } from '../../../../icon/icon.component';\n\n@Component({\n selector: 'fudis-multiselect-chip-list',\n templateUrl: './multiselect-chip-list.component.html',\n styleUrls: ['./multiselect-chip-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [IconComponent],\n})\nexport class MultiselectChipListComponent<T = string> {\n constructor(protected _translationService: FudisTranslationService) {}\n /**\n * Reference for the chip list ul element\n */\n @ViewChild('chipListRef') protected _chipListRef: ElementRef<HTMLUListElement>;\n\n /**\n * Array of selected chip items\n */\n @Input() selectedItems: FudisSelectOption<T>[];\n\n /**\n * Parent component id for binding aria attributes\n */\n @Input() parentId: string;\n\n /**\n * Output for removed chip index in selectedItems\n */\n @Output() handleClick = new EventEmitter<FudisSelectOption<T>>();\n\n /**\n * Focuses to the sibling and emits clicked index\n *\n * @param index Clicked index\n */\n protected _clickChip(clickedOption: FudisSelectOption<T>, index: number) {\n this.handleClick.emit(clickedOption);\n setTimeout(() => {\n const buttons = this._chipListRef.nativeElement.querySelectorAll('button');\n if (index === 0 && buttons[0]) {\n buttons[0].focus();\n } else if (buttons[index - 1]) {\n buttons[index - 1].focus();\n }\n }, 50);\n }\n}\n","<ul #chipListRef class=\"fudis-multiselect-chip-list\" [attr.id]=\"parentId + '-selected-items'\">\n @for (item of selectedItems; track item.value; let index = $index) {\n <li class=\"fudis-multiselect-chip-list__item\">\n <button class=\"fudis-multiselect-chip-list__item__button\" (click)=\"_clickChip(item, index)\">\n <fudis-icon [icon]=\"'close'\" [color]=\"'white'\"></fudis-icon>\n <span class=\"fudis-multiselect-chip-list__item__button__label\">{{ item.label }}</span>\n <span class=\"fudis-visually-hidden\">\n {{ _translationService.getTranslations()().SELECT.MULTISELECT.REMOVE_ITEM }}\n </span>\n </button>\n </li>\n }\n</ul>\n","import {\n Component,\n EventEmitter,\n Inject,\n Input,\n OnInit,\n Output,\n ViewChild,\n WritableSignal,\n signal,\n DOCUMENT,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { FudisTranslationService } from '../../../../services/translation/translation.service';\nimport { FudisFocusService } from '../../../../services/focus/focus.service';\nimport { FudisIdService } from '../../../../services/id/id.service';\nimport { SelectBaseDirective } from '../common/select-base/select-base.directive';\nimport { FudisSelectOption } from '../../../../types/forms';\n\nimport { MultiselectControlValueAccessorDirective } from '../common/select-control-value-accessor/select-control-value-accessor.directive';\nimport { BaseSelectableComponent } from '../common/interfaces/base-selectable.interface';\nimport { FudisDialogService } from '../../../../services/dialog/dialog.service';\nimport { LabelComponent } from '../../label/label.component';\nimport { MultiselectAutocompleteDirective } from '../common/autocomplete/autocomplete.directive';\nimport { SelectIconsComponent } from '../common/select-icons/select-icons.component';\nimport { SelectDropdownComponent } from '../common/select-dropdown/select-dropdown.component';\nimport { NgTemplateOutlet, AsyncPipe } from '@angular/common';\nimport { GuidanceComponent } from '../../guidance/guidance.component';\nimport { MultiselectChipListComponent } from './multiselect-chip-list/multiselect-chip-list.component';\n\n/**\n * Allows selection of multiple options from a dropdown list.\n *\n * Use this component when there are multiple predefined options and user can choose more than one\n * value. The FormControl value is a `FudisSelectOption[]` array (not primitives). Options are\n * projected via `<ng-template fudisSelectOptions>` containing `<fudis-multiselect-option>`\n * elements.\n *\n * Option data should be treated as immutable. If application needs to update option labels\n * dynamically, for example after a language change, provide a new options array with new\n * `FudisSelectOption` object references instead of mutating existing option objects in place.\n * Replacing option objects allows the component to update selected values and option labels\n * correctly.\n *\n * @example\n * ```html\n * <fudis-multiselect [label]=\"'Countries'\" [control]=\"countriesControl\">\n * <ng-template fudisSelectOptions>\n * <fudis-multiselect-option [data]=\"{ value: 'fi', label: 'Finland' }\"></fudis-multiselect-option>\n * <fudis-multiselect-option [data]=\"{ value: 'se', label: 'Sweden' }\"></fudis-multiselect-option>\n * </ng-template>\n * </fudis-multiselect>\n * ```;\n */\n@Component({\n selector: 'fudis-multiselect',\n templateUrl: './multiselect.component.html',\n styleUrls: ['../select/select.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n LabelComponent,\n FormsModule,\n MultiselectControlValueAccessorDirective,\n MultiselectAutocompleteDirective,\n ReactiveFormsModule,\n SelectIconsComponent,\n SelectDropdownComponent,\n NgTemplateOutlet,\n GuidanceComponent,\n MultiselectChipListComponent,\n AsyncPipe,\n ],\n})\nexport class MultiselectComponent<T = string>\n extends SelectBaseDirective\n implements OnInit, BaseSelectableComponent\n{\n constructor(\n @Inject(DOCUMENT) _document: Document,\n protected _translationService: FudisTranslationService,\n _dialogService: FudisDialogService,\n _idService: FudisIdService,\n _focusService: FudisFocusService,\n ) {\n super(_document, _dialogService, _focusService, _idService);\n }\n\n @ViewChild(MultiselectControlValueAccessorDirective)\n _multiselectCVA: MultiselectControlValueAccessorDirective<T>;\n\n /**\n * Array type control for selected FudisSelectOptions\n */\n @Input({ required: true }) override control: FormControl<FudisSelectOption<T>[] | null>;\n\n /**\n * Hide or show selection chips rendered below input\n */\n @Input() showSelectionChips = true;\n\n /**\n * Value output event on selection change\n */\n @Output() override selectionUpdate: EventEmitter<FudisSelectOption<T>[] | null> =\n new EventEmitter<FudisSelectOption<T>[] | null>();\n\n /**\n * When app language and option labels are changed, selected Multiselect Options push themselves\n * here, which will be then used to update visible UI labels managed by MultiselectCVA\n */\n public selectedOptionsFromLangChange: FudisSelectOption<T>[] = [];\n\n /**\n * When selecting / deselecting options, variable for storing them in the order of their id's\n * (usually the DOM order)\n */\n protected _sortedSelectedOptions: WritableSignal<FudisSelectOption<T>[] | null> = signal(null);\n\n /**\n * Set component's id and subscribe to value changes for form control coming from application\n */\n ngOnInit(): void {\n this._setParentId('multiselect');\n }\n\n /**\n * Handler for adding / removing selections\n *\n * @param option FudisSelectOption to handle\n * @param type Add or remove multiselect option\n */\n public handleMultiSelectionChange(option: FudisSelectOption<T>, type: 'add' | 'remove'): void {\n let updatedValue = this.control.value;\n\n if (type === 'remove' && updatedValue) {\n updatedValue = updatedValue.filter((item: FudisSelectOption<T>) => {\n return item.value !== option.value;\n });\n } else if (!updatedValue) {\n updatedValue = [option];\n } else if (type === 'add') {\n updatedValue.push(option);\n }\n\n if (updatedValue?.length === 0) {\n this.selectionUpdate.emit(null);\n this.control.patchValue(null);\n } else {\n this.selectionUpdate.emit(updatedValue);\n this.control.patchValue(updatedValue);\n }\n }\n\n // Reason for the cast and any type: (known Angular limitation) attribute directives cannot propagate generics from their parent.\n // Angular will always instantiate the MultiselectControlValueAccessorDirective with its default generic (string).\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected _updateSortedSelectedOptions(newValue: FudisSelectOption<any>[] | null) {\n this._sortedSelectedOptions.set(newValue as FudisSelectOption<T>[] | null);\n }\n\n /**\n * Handle chip remove. If there are no selections done, focus back to input on last item removal.\n *\n * @param option Removed option\n */\n protected _handleRemoveChip(option: FudisSelectOption<T>): void {\n this.handleMultiSelectionChange(option, 'remove');\n\n if (!this.control.value) {\n this._focusToSelectInput();\n this.setAutocompleteFilterText('');\n }\n }\n}\n","@let dropdownOpen = _dropdownOpen();\n@let sortedSelectedOptions = _sortedSelectedOptions();\n@let autocompleteFilterText = _autocompleteFilterText();\n\n<div\n role=\"application\"\n class=\"fudis-select fudis-input-size__{{ size }}\"\n [id]=\"id + '-main-wrapper'\"\n>\n <fudis-label\n [text]=\"label\"\n [id]=\"id + '-label'\"\n [for]=\"id\"\n [required]=\"_required | async\"\n [popoverText]=\"popoverText\"\n [popoverPosition]=\"popoverPosition\"\n [popoverTriggerLabel]=\"popoverTriggerLabel\"\n >\n </fudis-label>\n <div #selectRef>\n <div class=\"fudis-select__input-wrapper\">\n <input\n #inputRef\n fudisMultiselectControlValueAccessor\n fudisMultiselectAutocomplete\n [id]=\"id\"\n [formControl]=\"control\"\n class=\"fudis-form-input fudis-select__input\"\n [class.fudis-select__input__dropdown]=\"variant === 'dropdown'\"\n [class.fudis-select-autocomplete]=\"variant !== 'dropdown'\"\n [class.fudis-form-input--touched]=\"_afterViewInitDone() && _touched()\"\n (click)=\"!_disabled() && !disabled && _clickInput()\"\n (focus)=\"_selectInputFocus($event)\"\n (blur)=\"_inputBlur($event)\"\n (keydown)=\"_inputKeyDown($event)\"\n (keyup)=\"_inputKeyUp($event)\"\n [enableAutocomplete]=\"variant !== 'dropdown'\"\n [typeThreshold]=\"variant === 'autocompleteType' ? 3 : 0\"\n [clearButtonClick]=\"_clearButtonClickTrigger()\"\n (handleSortedSelectedOptions)=\"_updateSortedSelectedOptions($event)\"\n (handleClearButtonReset)=\"_clearButtonClickTrigger.set(false)\"\n (handleDropdownOpen)=\"openDropdown()\"\n (handleDropdownClose)=\"closeDropdown()\"\n (handleFilterTextUpdate)=\"setAutocompleteFilterText($event)\"\n type=\"text\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.id]=\"id\"\n [attr.readonly]=\"variant === 'dropdown' ? true : null\"\n [attr.aria-autocomplete]=\"variant === 'dropdown' ? null : 'list'\"\n [attr.placeholder]=\"placeholder\"\n [attr.aria-controls]=\"_optionsLoadedOnce() ? id + '-dropdown' : null\"\n [attr.tabindex]=\"!_disabled() && !disabled ? null : -1\"\n [attr.aria-expanded]=\"dropdownOpen\"\n [attr.aria-disabled]=\"_disabled() || disabled\"\n [attr.required]=\"(_required | async) || null\"\n [attr.aria-labelledby]=\"id + '-label'\"\n [attr.aria-describedby]=\"id + '_guidance'\"\n [attr.aria-invalid]=\"(_invalid() && _touched()) || null\"\n />\n <div class=\"fudis-select__input-wrapper__icons\">\n @if (size !== \"xs\") {\n <fudis-select-icons\n [filterText]=\"!!autocompleteFilterText\"\n [parentControl]=\"control\"\n [parentVariant]=\"variant\"\n [parentId]=\"id\"\n [dropdownOpen]=\"dropdownOpen\"\n (handleClearButtonClick)=\"_clearButtonClick()\"\n (handleClearButtonFocus)=\"_setClearButtonFocusState($event, true)\"\n (handleClearButtonBlur)=\"_setClearButtonFocusState($event, false)\"\n [clearButton]=\"selectionClearButton\"\n [disabled]=\"_disabled() || disabled\"\n />\n }\n </div>\n </div>\n @if (_optionsLoadedOnce() && !_disabled() && !disabled) {\n <fudis-select-dropdown\n #dropdownRef\n [open]=\"dropdownOpen\"\n [selectVariant]=\"variant\"\n [results]=\"_resultsLength()\"\n [autocompleteNoResultsText]=\"autocompleteNoResultsText\"\n [autocompleteHelpText]=\"autocompleteHelpText\"\n [filterText]=\"autocompleteFilterText\"\n [multiselect]=\"true\"\n [parentId]=\"id\"\n [size]=\"size\"\n >\n @if (_selectOptionsDirective) {\n <ng-container *ngTemplateOutlet=\"_selectOptionsDirective!.templateRef\" />\n }\n </fudis-select-dropdown>\n }\n </div>\n @if (!disableGuidance) {\n <fudis-guidance [inputLabel]=\"label\" [helpText]=\"helpText\" [for]=\"id\" [control]=\"control\">\n <ng-content select=\"fudis-error-message\"\n /></fudis-guidance>\n }\n\n @if (showSelectionChips && sortedSelectedOptions && _enabled() && !disabled) {\n <span [attr.id]=\"id + '-remove-items'\" class=\"fudis-visually-hidden\">{{\n _translationService.getTranslations()().SELECT.MULTISELECT.REMOVE_ITEMS\n }}</span>\n <fudis-multiselect-chip-list\n [selectedItems]=\"sortedSelectedOptions\"\n [parentId]=\"id\"\n (handleClick)=\"_handleRemoveChip($event)\"\n />\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n Host,\n Input,\n Optional,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { FudisIdService } from '../../../../../services/id/id.service';\nimport { SelectComponent } from '../../select/select.component';\nimport { setVisibleOptionsList } from '../utilities/selectUtilities';\nimport { MultiselectComponent } from '../../multiselect/multiselect.component';\n\n/**\n * Groups select options under a common category.\n *\n * Use this component to organize related options to improve readability.\n */\n@Component({\n selector: 'fudis-select-group, fudis-multiselect-group',\n templateUrl: './select-group.component.html',\n styleUrls: ['./select-group.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SelectGroupComponent {\n constructor(\n private _idService: FudisIdService,\n @Host() @Optional() private _parentSelect: SelectComponent,\n @Host() @Optional() private _parentMultiselect: MultiselectComponent,\n ) {\n if (_parentSelect) {\n this.id = this._idService.getNewGroupId('select', this._parentSelect.id);\n } else if (_parentMultiselect) {\n this.id = this._idService.getNewGroupId('multiselect', this._parentMultiselect.id);\n }\n }\n\n /**\n * Visible title label for this group of options\n */\n @Input({ required: true }) label: string;\n\n /**\n * Id for this Select Group. Generated with FudisIdService and used for accessibility attributes.\n */\n public id: string;\n\n /**\n * Checks if the select group has content and if the group label should be visible or not.\n */\n protected _visibleOptions: WritableSignal<string[]> = signal<string[]>([]);\n\n /**\n * Called from SelectOption and MultiselectOption to set if the option is visible or not\n *\n * @param value Value of option\n * @param visible State of option's visibility\n */\n public setOptionVisibility(value: string, visible: boolean) {\n this._visibleOptions.set(setVisibleOptionsList(this._visibleOptions(), value, visible));\n }\n}\n","<div\n class=\"fudis-select-group\"\n [class.fudis-select-group--hidden]=\"_visibleOptions().length === 0\"\n [attr.aria-labelledby]=\"id\"\n role=\"group\"\n>\n <span class=\"fudis-select-group__label\" [attr.aria-hidden]=\"true\" [attr.id]=\"id\">{{\n label\n }}</span>\n <ng-content></ng-content>\n</div>\n","import {\n Directive,\n ElementRef,\n Host,\n Inject,\n Input,\n Optional,\n ViewChild,\n DOCUMENT,\n WritableSignal,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { EMPTY, startWith, switchMap } from 'rxjs';\nimport { DropdownItemBaseDirective } from '../../../../../directives/form/dropdown-item-base/dropdown-item-base.directive';\nimport { SelectComponent } from '../../select/select.component';\nimport { SelectGroupComponent } from '../select-group/select-group.component';\nimport { FudisSelectOption } from '../../../../../types/forms';\nimport { MultiselectComponent } from '../../multiselect/multiselect.component';\nimport { FudisTranslationService } from '../../../../../services/translation/translation.service';\nimport { FudisIdService } from '../../../../../services/id/id.service';\n\n@Directive({ selector: '[fudisSelectOptionBase]' })\nexport class SelectOptionBaseDirective<T = string> extends DropdownItemBaseDirective {\n constructor(\n @Inject(DOCUMENT) _document: Document,\n @Host() @Optional() protected _parentGroup: SelectGroupComponent,\n protected _translationService: FudisTranslationService,\n protected _idService: FudisIdService,\n ) {\n super(_document);\n }\n\n /**\n * Reference of input or option element\n */\n @ViewChild('optionInputRef') protected _optionInputRef: ElementRef<\n HTMLOptionElement | HTMLInputElement\n >;\n\n /**\n * Select option data\n */\n @Input({ required: true }) data: FudisSelectOption<T>;\n\n /**\n * State of option visibility\n */\n protected _optionVisible: WritableSignal<boolean> = signal<boolean>(true);\n\n /**\n * Focus state\n */\n protected _focused: boolean = false;\n\n /**\n * Common parent and its properties for both Select and Multiselect\n */\n protected _parent: SelectComponent<T> | MultiselectComponent<T>;\n\n /**\n * Selected state of an option\n */\n protected _selected: WritableSignal<boolean> = signal<boolean>(false);\n\n /**\n * Get visibility status of this option\n */\n public get visible(): boolean {\n return this._optionVisible();\n }\n\n /**\n * User focus handler\n */\n protected _focus(): void {\n this._focused = true;\n this._parent.setFocusedOption(this._id, 'add');\n }\n\n /**\n * For autocompletes, compare if current filter text is contained in this option's label. If not,\n * hide the option from the dropdown list.\n *\n * @param filterText Autocomplete filter text from parent\n */\n protected _isOptionVisible(filterText: string): void {\n if (this.data) {\n const labelMatch =\n filterText && this.data.label.toLowerCase().includes(filterText.toLowerCase())\n ? true\n : !filterText;\n\n const subLabelMatch =\n filterText && this.data.subLabel?.toLowerCase().includes(filterText.toLowerCase())\n ? true\n : !filterText;\n\n this._optionVisible.set(labelMatch || subLabelMatch);\n\n this._updateVisibilityToParents(this._optionVisible());\n }\n }\n\n /**\n * Update option visibility to parent component\n */\n protected _updateVisibilityToParents(visible: boolean): void {\n this._parent.setOptionVisibility(this._id, visible);\n\n if (this._parentGroup) {\n this._parentGroup.setOptionVisibility(this._id, visible);\n }\n }\n\n /**\n * Handler for keydown keyboard events\n *\n * @param event Keyboard event\n */\n protected _keyDown(event: KeyboardEvent) {\n event.preventDefault();\n if ((event.key === 'Enter' || event.key === ' ') && !this.data.disabled) {\n this._clickOption(event);\n } else if (event.key === 'Tab') {\n this._parent.focusToInput();\n this._parent.closeDropdown();\n } else if (event.key !== ' ') {\n this._baseHandleKeyDown(event, this._optionInputRef, this._parent.focusSelector);\n }\n }\n\n /**\n * Handler for blurring out from focused option\n *\n * @param event FocusEvent to emit\n */\n protected _blur(event: FocusEvent): void {\n this._focused = false;\n this._parent.setFocusedOption(this._id, 'remove');\n this.handleBlur.emit(event);\n\n this._parent.componentFocused(event).then((value) => {\n if (!value) {\n this._parent.closeDropdown(false);\n }\n });\n }\n\n /**\n * Select and Multiselect shared logic for subscribing to parent FormControl's events and syncing\n * selected state of options.\n */\n protected _initSelectedStateSync(): void {\n toObservable(this._parent.getControlRef())\n .pipe(\n // Necessary for supporting dynamic FormControl assignment to the parent select component.\n // If the control changes, we want to unsubscribe from the previous one and subscribe to the new one.\n switchMap((control) => {\n if (!control) return EMPTY;\n return control.events.pipe(startWith(null));\n }),\n takeUntilDestroyed(),\n )\n .subscribe(() => {\n this._syncSelectedState();\n });\n }\n\n protected _syncSelectedState(): void {\n if (!this.data) {\n this._selected.set(false);\n return;\n }\n\n this._selected.set(this._isSelected());\n }\n\n /**\n * Every subclass (i.e. SelectOption and MultiselectOption) needs to implement its own logic to\n * determine if it is selected or not, based on the parent select's control value\n */\n protected _isSelected(): boolean {\n throw new Error('_isSelected must be implemented in a child class');\n }\n\n /**\n * Boilerplate function to be overriden by SelectOption's and MultiselectOption's own\n * implementations\n */\n // eslint-disable-next-line\n protected _checkVisibilityFromFilterText(filterText: string): void {}\n\n /**\n * Boilerplate function to be overriden by SelectOption's and MultiselectOption's own\n * implementations\n */\n // eslint-disable-next-line\n protected _clickOption(event: Event): void {}\n}\n","import {\n Component,\n Host,\n Inject,\n OnChanges,\n OnDestroy,\n Optional,\n DOCUMENT,\n ChangeDetectionStrategy,\n} from '@angular/core';\n\nimport { FudisIdService } from '../../../../../services/id/id.service';\nimport { SelectComponent } from '../select.component';\nimport { SelectGroupComponent } from '../../common/select-group/select-group.component';\nimport { SelectOptionBaseDirective } from '../../common/select-option-base/select-option-base.directive';\nimport { FudisTranslationService } from '../../../../../services/translation/translation.service';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { FudisComponentChanges } from '../../../../../types/miscellaneous';\nimport { FudisSelectOption } from '../../../../../types/forms';\nimport { IconComponent } from '../../../../icon/icon.component';\n\n/**\n * Represents a selectable option within SelectComponent.\n */\n@Component({\n selector: 'fudis-select-option',\n templateUrl: './select-option.component.html',\n styleUrls: ['./select-option.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [IconComponent],\n})\nexport class SelectOptionComponent<T = string>\n extends SelectOptionBaseDirective<T>\n implements OnChanges, OnDestroy\n{\n constructor(\n @Inject(DOCUMENT) _document: Document,\n @Host() protected _parentSelect: SelectComponent<T>,\n @Host() @Optional() _parentGroup: SelectGroupComponent,\n _translationService: FudisTranslationService,\n _idService: FudisIdService,\n ) {\n super(_document, _parentGroup, _translationService, _idService);\n\n this._parent = _parentSelect;\n\n this._initSelectedStateSync();\n\n toObservable(this._parent.getAutocompleteFilterText())\n .pipe(takeUntilDestroyed())\n .subscribe((filterText) => {\n this._checkVisibilityFromFilterText(filterText);\n });\n }\n\n /**\n * Common parent and its properties\n */\n protected override _parent: SelectComponent<T>;\n\n ngOnChanges(changes: FudisComponentChanges<SelectOptionBaseDirective<T>>): void {\n if (changes.data?.currentValue !== changes.data?.previousValue) {\n this._syncSelectedState();\n\n const newOptionId = this._idService.getNewSelectOptionId(\n this.data.label,\n 'select',\n this._parent.id,\n this._parentGroup?.id,\n );\n\n if (this._id && this._id !== newOptionId) this.clearParentOptionVisibility();\n\n this._id = newOptionId;\n\n this._checkVisibilityFromFilterText(this._parent.getAutocompleteFilterText()());\n\n if (changes.data?.currentValue && changes.data.currentValue !== changes.data.previousValue) {\n this._checkIfLabelRequiresUpdate(changes.data.currentValue);\n }\n }\n }\n\n ngOnDestroy(): void {\n this.clearParentOptionVisibility();\n }\n\n private clearParentOptionVisibility() {\n this._parentSelect.setOptionVisibility(this._id, false);\n this._parentGroup?.setOptionVisibility(this._id, false);\n }\n\n /**\n * Click handler for Select Option click\n *\n * @param event Event emitted\n */\n protected override _clickOption(event: Event): void {\n if (!this.data.disabled) {\n this._parentSelect.handleSelectionChange(this.data);\n this.handleClick.emit(event);\n }\n this._parent.closeDropdown(true, true);\n }\n\n protected override _checkVisibilityFromFilterText(filterText: string): void {\n if (this._parent.variant !== 'dropdown' && this._parent.autocompleteFilter) {\n this._isOptionVisible(filterText);\n this._isOptionTyped(filterText);\n } else {\n this._isOptionVisible('');\n }\n }\n\n /**\n * Checks if this option is currently selected in the parent select.\n */\n protected override _isSelected(): boolean {\n return this._parent.control.value?.value === this.data.value;\n }\n\n /**\n * When option is changed, it will not change Form Control's value, which is intended, but visible\n * label should be updated\n */\n protected _checkIfLabelRequiresUpdate(newData: FudisSelectOption<T>): void {\n const controlValue = this._parent?.control.value;\n if (controlValue?.value === newData.value) {\n this._parent.selectCVA?.writeValue(newData);\n this._parent.setAutocompleteFilterText(newData.label, false);\n }\n }\n\n /**\n * Used with autocomplete to check if filter text matches this option. If yes, then trigger\n * selection change in the parent\n *\n * @param filterText Autocomplete filter text from parent\n */\n private _isOptionTyped(filterText: string | undefined): void {\n if (!this.data?.disabled && this.data?.label?.toLowerCase() === filterText?.toLowerCase()) {\n if (this._parent.control.value?.value !== this.data.value) {\n this._parentSelect.handleSelectionChange(this.data);\n }\n }\n }\n}\n","<!--\nSingleselect option\n-->\n<div\n #optionInputRef\n class=\"fudis-select-option\"\n [class.fudis-select-option__focusable]=\"_optionVisible()\"\n [class.fudis-select-option__xs]=\"_parent.size === 'xs'\"\n [class.fudis-select-option--disabled]=\"data.disabled\"\n [class.fudis-select-option--selected]=\"_selected()\"\n [attr.aria-selected]=\"_selected()\"\n role=\"option\"\n tabindex=\"-1\"\n [attr.id]=\"_id\"\n [attr.aria-disabled]=\"data.disabled || null\"\n (focus)=\"_focus()\"\n (keydown)=\"_keyDown($event)\"\n (blur)=\"_blur($event)\"\n (click)=\"!data.disabled && _clickOption($event)\"\n>\n <div class=\"fudis-select-option__label\">\n <span class=\"fudis-select-option__label__main\">{{ data.label }}</span>\n @if (data.subLabel) {\n <span class=\"fudis-select-option__label__sub\">{{ data.subLabel }}</span>\n }\n </div>\n @if (!data.disabled && _selected()) {\n <fudis-icon [icon]=\"_parent.size === 'xs' ? 'check-small' : 'check'\" [color]=\"'gray-dark'\" />\n }\n @if (data.disabled) {\n <span class=\"fudis-select-option__label fudis-select-option__disabled-text\">\n ({{ _translationService.getTranslations()().SELECT.DISABLED }})</span\n >\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnChanges,\n OnInit,\n effect,\n AfterViewInit,\n} from '@angular/core';\nimport { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport {\n FudisLocalizedTextGroupFormGroup,\n FudisSelectOption,\n FudisLocalizedTextGroupFormGroupOptions,\n FudisInputSize,\n} from '../../../types/forms';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { FudisTranslationService } from '../../../services/translation/translation.service';\nimport { FudisValidatorUtilities } from '../../../utilities/form/validator-utilities';\n\nimport { FudisComponentChanges } from '../../../types/miscellaneous';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { GroupComponentBaseDirective } from '../../../directives/form/group-component-base/group-component-base.directive';\nimport { FudisFocusService } from '../../../services/focus/focus.service';\nimport { LabelComponent } from '../label/label.component';\nimport { GuidanceComponent } from '../guidance/guidance.component';\nimport { SelectComponent } from '../select/select/select.component';\nimport { SelectOptionsDirective } from '../select/common/select-options-directive/select-options.directive';\nimport { SelectOptionComponent } from '../select/select/select-option/select-option.component';\nimport { AsyncPipe, KeyValuePipe } from '@angular/common';\n\n/**\n * Manages localized text inputs across multiple languages.\n *\n * Use this component to edit equivalent content for different language options.\n */\n@Component({\n selector: 'fudis-localized-text-group',\n templateUrl: './localized-text-group.component.html',\n styleUrls: ['./localized-text-group.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n LabelComponent,\n FormsModule,\n ReactiveFormsModule,\n GuidanceComponent,\n SelectComponent,\n SelectOptionsDirective,\n SelectOptionComponent,\n AsyncPipe,\n KeyValuePipe,\n ],\n})\nexport class LocalizedTextGroupComponent<T extends FudisLocalizedTextGroupFormGroup<T>>\n extends GroupComponentBaseDirective\n implements OnInit, OnChanges, AfterViewInit\n{\n constructor(\n private _translationService: FudisTranslationService,\n _idService: FudisIdService,\n _focusService: FudisFocusService,\n ) {\n super(_idService, _focusService);\n effect(() => {\n const translations = _translationService.getTranslations()();\n\n this._languageLabel.next(translations.INPUT_WITH_LANGUAGE_OPTIONS.LANGUAGE);\n this._missingLanguage = translations.INPUT_WITH_LANGUAGE_OPTIONS.MISSING;\n if (this.options) {\n this._updateSelectOptions();\n }\n });\n\n this._updateValueAndValidityTrigger.pipe(takeUntilDestroyed()).subscribe(() => {\n if (this.formGroup && this._selectControl.value) {\n this._checkHtmlAttributes(this._selectControl.value.value);\n this._updateSelectOptions();\n }\n });\n }\n\n /**\n * FormGroup including controls.\n */\n @Input({ required: true }) override formGroup: FormGroup<T>;\n\n /**\n * Option list for language Selection. To pair controls with corresponding Select option,\n * FormControl's name must match with the controlName defined here. E.g. by default \"{controlName:\n * 'en', label: 'EN'}\" pairs with Form Group's \"en: new FormControl('')\"\n */\n @Input() options: FudisLocalizedTextGroupFormGroupOptions[] = [\n { controlName: 'fi', label: 'FI' },\n { controlName: 'sv', label: 'SV' },\n { controlName: 'en', label: 'EN' },\n ];\n\n /**\n * Total width of the component, including both TextInput and Select.\n */\n @Input() size: FudisInputSize = 'lg';\n\n /**\n * If user clears the input field, set FormControl value to null instead of empty string.\n */\n @Input() nullControlOnEmptyString: boolean = true;\n /**\n * Subscription(s) for listening to each controls' value changes\n */\n private _controlsSubscription: Subscription;\n\n /**\n * Form element to display. Defaults to text-input\n */\n @Input() variant: 'text-input' | 'text-area' = 'text-input';\n\n /**\n * Min length for HTML attribute and for character indicator in guidance\n */\n protected _minLength = new BehaviorSubject<number | null>(null);\n\n /**\n * Max length for HTML attribute and for character indicator in guidance\n */\n protected _maxLength = new BehaviorSubject<number | null>(null);\n\n /**\n * Control for language option Select\n */\n protected _selectControl: FormControl<FudisSelectOption<string> | null> = new FormControl(null);\n\n /**\n * Updated options list after changes. Option values (i.e. controlName) are always strings in this\n * component so we can type them as such.\n */\n protected _selectOptions: FudisSelectOption<string>[] = [];\n\n /**\n * Fudis translation\n */\n protected _missingLanguage: string;\n\n /**\n * Subscription for handling the valueChanges observable\n */\n private _subscription: Subscription;\n\n /**\n * Fudis translation\n */\n protected _languageLabel = new BehaviorSubject<string>(\n this._translationService.getTranslations()().INPUT_WITH_LANGUAGE_OPTIONS.LANGUAGE,\n );\n\n /**\n * When Form Control value changes, update Select Options accordingly with or without Missing text\n */\n protected _updateSelectOptions(): void {\n const newOptions: FudisSelectOption<string>[] = [];\n\n this.options.forEach((option) => {\n let newOption: FudisSelectOption<string> | null = null;\n\n if (\n this.formGroup.controls[option.controlName as keyof T].invalid ||\n !this.formGroup.controls[option.controlName as keyof T].value\n ) {\n newOption = {\n value: option.controlName,\n label: `${option.label} (${this._missingLanguage})`,\n };\n } else {\n newOption = { value: option.controlName, label: option.label };\n }\n newOptions.push(newOption);\n if (option.controlName === this._selectControl?.value?.value) {\n this._selectControl.patchValue(newOption);\n }\n });\n\n this._selectOptions = newOptions;\n }\n\n /**\n * Set subscriptions for each control to set value to null if empty string is entered.\n */\n\n protected _setControlsValueSubscription(): void {\n if (this.nullControlOnEmptyString) {\n this._controlsSubscription?.unsubscribe();\n this._controlsSubscription = new Subscription();\n\n Object.keys(this.formGroup.controls).forEach((key) => {\n const control = this.formGroup.controls[key as keyof T] as FormControl<string | null>;\n this._controlsSubscription.add(\n control.valueChanges.pipe(takeUntilDestroyed(this._destroyRef)).subscribe((value) => {\n if (typeof value === 'string' && value.trim() === '') {\n control.setValue(null);\n }\n }),\n );\n });\n }\n }\n\n /**\n * On init and when Select option changes, check if now visible input should be marked as\n * required.\n */\n\n private _isInputRequired(control: FormControl<string | null>): boolean {\n const groupRequiredError = this.formGroup?.errors?.['oneRequired'];\n\n const controlRequiredValidator = FudisValidatorUtilities.required(control);\n\n const groupRequiredValidator = FudisValidatorUtilities.oneRequiredOrMin(this.formGroup);\n\n const nonEmptyControls = Object.keys(this.formGroup.controls).filter((control) => {\n return this.formGroup.controls[control as keyof T].value;\n });\n\n if (\n controlRequiredValidator ||\n groupRequiredError ||\n (nonEmptyControls.length === 1 && control.value && groupRequiredValidator)\n ) {\n return true;\n }\n return false;\n }\n\n protected _checkHtmlAttributes(controlName: string | undefined): void {\n if (controlName) {\n const control = this.formGroup.controls[controlName as keyof T] as FormControl<string | null>;\n\n this._minLength.next(FudisValidatorUtilities.minLength(control));\n this._maxLength.next(FudisValidatorUtilities.maxLength(control));\n this._required.next(this._isInputRequired(control));\n }\n }\n\n ngOnInit(): void {\n this._setComponentId('localized-text-group');\n }\n\n ngOnChanges(changes: FudisComponentChanges<LocalizedTextGroupComponent<T>>): void {\n if (changes.formGroup?.currentValue !== changes.formGroup?.previousValue) {\n this._subscription?.unsubscribe();\n this._subscription = this.formGroup.valueChanges\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => this._updateValueAndValidityTrigger.next());\n this._updateSelectOptions();\n this._setControlsValueSubscription();\n this._selectControl.patchValue(this._selectOptions[0]);\n this._checkHtmlAttributes(this._selectOptions[0].value);\n }\n }\n}\n","@if (_selectControl.value) {\n <p [attr.id]=\"id + '-group-label'\" class=\"fudis-visually-hidden\">{{ label }}</p>\n}\n@if (_selectControl.value) {\n <div\n role=\"group\"\n [attr.aria-labelledby]=\"id + '-group-label'\"\n class=\"fudis-localized-text-group fudis-input-size__{{ size }}\"\n >\n <div class=\"fudis-localized-text-group__inputs\">\n <fudis-label\n [for]=\"id\"\n [text]=\"label\"\n [id]=\"id + '-label'\"\n [required]=\"_required | async\"\n [popoverText]=\"popoverText\"\n [popoverPosition]=\"popoverPosition\"\n [popoverTriggerLabel]=\"popoverTriggerLabel\"\n />\n @for (control of formGroup.controls | keyvalue; track control.key; let index = $index) {\n @if (variant === \"text-input\" && control.key === _selectControl.value.value) {\n <input\n #inputRef\n class=\"fudis-form-input fudis-localized-text-group__inputs__text\"\n [class.fudis-form-input--touched]=\"\n $any(formGroup).controls[control.key].touched || formGroup.touched\n \"\n [attr.aria-invalid]=\"(formGroup.invalid && formGroup.touched) || null\"\n [attr.aria-label]=\"\n ariaLabel\n ? label + ', ' + _selectControl.value.label + ariaLabel\n : label + ', ' + _selectControl.value.label\n \"\n [attr.minlength]=\"_minLength | async\"\n [attr.maxlength]=\"_maxLength | async\"\n [formControl]=\"$any(formGroup).controls[control.key]\"\n (keyup)=\"_updateSelectOptions(); handleKeyUp.emit($event)\"\n (blur)=\"handleBlur.emit($event)\"\n (focus)=\"onFocus($event)\"\n [id]=\"id\"\n [attr.tabindex]=\"disabled ? -1 : null\"\n [attr.aria-describedby]=\"id + '_guidance'\"\n [attr.required]=\"(_required | async) || null\"\n [attr.aria-disabled]=\"\n formGroup.disabled ||\n $any(formGroup).controls[control.key].disabled ||\n disabled ||\n null\n \"\n [readonly]=\"\n formGroup.disabled ||\n $any(formGroup).controls[control.key].disabled ||\n disabled ||\n null\n \"\n />\n }\n @if (variant === \"text-area\" && control.key === _selectControl.value.value) {\n <textarea\n #inputRef\n class=\"fudis-form-input fudis-localized-text-group__inputs__area\"\n [class.fudis-form-input--touched]=\"\n $any(formGroup).controls[control.key].touched || formGroup.touched\n \"\n [attr.aria-invalid]=\"(formGroup.invalid && formGroup.touched) || null\"\n [attr.aria-label]=\"\n ariaLabel\n ? label + ', ' + _selectControl.value.label + ariaLabel\n : label + ', ' + _selectControl.value.label\n \"\n [attr.minlength]=\"_minLength | async\"\n [attr.maxlength]=\"_maxLength | async\"\n [formControl]=\"$any(formGroup).controls[control.key]\"\n (keyup)=\"_updateSelectOptions(); handleKeyUp.emit($event)\"\n (blur)=\"handleBlur.emit($event)\"\n (focus)=\"onFocus($event)\"\n [id]=\"id\"\n [attr.tabindex]=\"disabled ? -1 : null\"\n [attr.aria-describedby]=\"id + '_guidance'\"\n [attr.required]=\"(_required | async) || null\"\n [attr.aria-disabled]=\"\n $any(formGroup).controls[control.key].disabled || disabled || null\n \"\n [readonly]=\"$any(formGroup).controls[control.key].disabled || disabled || null\"\n >\n </textarea>\n }\n }\n @if (!disableGuidance) {\n <fudis-guidance\n [inputLabel]=\"label\"\n [maxLength]=\"_maxLength | async\"\n [helpText]=\"helpText\"\n [formGroup]=\"formGroup\"\n [for]=\"id\"\n [selectedOption]=\"_selectControl.value.value\"\n >\n <ng-content select=\"fudis-error-message\"\n /></fudis-guidance>\n }\n </div>\n @if (_languageLabel | async; as label) {\n <fudis-select\n class=\"fudis-localized-text-group__select\"\n [disabled]=\"this.formGroup.disabled || disabled\"\n [label]=\"label\"\n [selectionClearButton]=\"false\"\n (selectionUpdate)=\"_checkHtmlAttributes($event?.value)\"\n [control]=\"_selectControl\"\n [size]=\"'xs'\"\n [id]=\"id + '_language-select'\"\n >\n <ng-template fudisSelectOptions>\n @for (option of _selectOptions; track option.value) {\n <fudis-select-option\n [data]=\"{ value: option.value, label: option.label, disabled: option.disabled }\"\n />\n }\n </ng-template>\n </fudis-select>\n }\n </div>\n}\n","import {\n Component,\n Host,\n Inject,\n Optional,\n OnDestroy,\n OnChanges,\n DOCUMENT,\n ChangeDetectionStrategy,\n} from '@angular/core';\n\nimport { FudisSelectOption } from '../../../../../types/forms';\nimport { FudisIdService } from '../../../../../services/id/id.service';\nimport { SelectGroupComponent } from '../../common/select-group/select-group.component';\nimport { MultiselectComponent } from '../multiselect.component';\nimport { SelectOptionBaseDirective } from '../../common/select-option-base/select-option-base.directive';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { FudisTranslationService } from '../../../../../services/translation/translation.service';\nimport { FudisComponentChanges } from '../../../../../types/miscellaneous';\nimport { IconComponent } from '../../../../icon/icon.component';\n\n/**\n * Represents a selectable option within MultiselectComponent.\n */\n@Component({\n selector: 'fudis-multiselect-option',\n templateUrl: './multiselect-option.component.html',\n styleUrls: ['./multiselect-option.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [IconComponent],\n})\nexport class MultiselectOptionComponent<T = string>\n extends SelectOptionBaseDirective<T>\n implements OnDestroy, OnChanges\n{\n private static instanceCounter = 0;\n protected readonly componentInstanceId: string;\n\n constructor(\n @Inject(DOCUMENT) _document: Document,\n @Host() protected _parentMultiselect: MultiselectComponent<T>,\n @Host() @Optional() _parentGroup: SelectGroupComponent,\n _idService: FudisIdService,\n _translationService: FudisTranslationService,\n ) {\n super(_document, _parentGroup, _translationService, _idService);\n\n MultiselectOptionComponent.instanceCounter++;\n this.componentInstanceId = MultiselectOptionComponent.instanceCounter.toString();\n\n this._parent = this._parentMultiselect;\n\n this._initSelectedStateSync();\n\n toObservable(this._parent.getAutocompleteFilterText())\n .pipe(takeUntilDestroyed())\n .subscribe((filterText) => {\n this._checkVisibilityFromFilterText(filterText);\n });\n }\n\n /**\n * Common parent and its properties\n */\n protected override _parent: MultiselectComponent<T>;\n\n ngOnChanges(changes: FudisComponentChanges<MultiselectOptionComponent<T>>) {\n if (changes.data?.currentValue !== changes.data?.previousValue) {\n this._syncSelectedState();\n\n const newOptionId = this._idService.getNewSelectOptionId(\n this.data.label,\n 'multiselect',\n this._parent.id,\n this._parentGroup?.id,\n );\n\n if (this._id && this._id !== newOptionId) this.clearParentOptionVisibility();\n\n this._id = newOptionId;\n\n this._checkVisibilityFromFilterText(this._parent.getAutocompleteFilterText()());\n\n if (changes.data?.currentValue && changes.data.currentValue !== changes.data.previousValue) {\n this._checkIfLabelRequiresUpdate(changes.data?.currentValue);\n }\n }\n }\n\n ngOnDestroy(): void {\n this.clearParentOptionVisibility();\n }\n\n private clearParentOptionVisibility() {\n this._parentMultiselect.setOptionVisibility(this._id, false);\n this._parentGroup?.setOptionVisibility(this._id, false);\n }\n\n /**\n * Click handler for clicking the option\n *\n * @param event Event\n */\n protected override _clickOption(event: Event): void {\n if (!this.data.disabled) {\n if (!this._selected()) {\n this._parentMultiselect.handleMultiSelectionChange(this.data, 'add');\n } else {\n this._parentMultiselect.handleMultiSelectionChange(this.data, 'remove');\n }\n\n this.handleClick.emit(event);\n this.handleChecked.emit();\n }\n }\n\n protected override _checkVisibilityFromFilterText(filterText: string): void {\n if (this._parent.variant !== 'dropdown' && this._parent.autocompleteFilter) {\n this._isOptionVisible(filterText);\n } else {\n this._isOptionVisible('');\n }\n }\n\n /**\n * Checks if this option is currently selected in the parent multiselect and if the option's value\n * exists in the parent FormControl's value array.\n */\n protected override _isSelected(): boolean {\n return !!this._parent.control.value?.find((option) => option.value === this.data.value);\n }\n\n /**\n * When option is changed, it will not change Form Control's value, which is intended, but visible\n * label should be updated\n */\n protected _checkIfLabelRequiresUpdate(newData: FudisSelectOption<T>): void {\n const controlValue = this._parent?.control.value;\n const foundMatch = controlValue?.find((selectedOption) => {\n return selectedOption.value === newData.value;\n });\n\n if (foundMatch) {\n this._parent.selectedOptionsFromLangChange.push(newData);\n\n if (\n this._parent.selectedOptionsFromLangChange.length === this._parent.control.value?.length\n ) {\n this._parent._multiselectCVA?.writeValue(this._parent.selectedOptionsFromLangChange);\n this._parent.selectedOptionsFromLangChange = [];\n }\n }\n }\n}\n","<div\n class=\"fudis-multiselect-option\"\n [attr.id]=\"_id\"\n tabindex=\"-1\"\n [class.fudis-multiselect-option--visible]=\"_optionVisible()\"\n [class.fudis-multiselect-option--checked]=\"_selected()\"\n [class.fudis-multiselect-option--focused]=\"_focused\"\n [class.fudis-multiselect-option--disabled]=\"data.disabled\"\n>\n <label\n [attr.for]=\"_id + '-checkbox-input-' + componentInstanceId\"\n class=\"fudis-multiselect-option__label\"\n [class.fudis-multiselect-option__label--focus]=\"_focused\"\n [class.fudis-multiselect-option__label--checked]=\"_selected()\"\n >\n <div\n class=\"fudis-multiselect-option__label__checkbox\"\n [class.fudis-multiselect-option__label__checkbox--disabled]=\"data.disabled\"\n >\n <input\n #optionInputRef\n [class.fudis-select-option__focusable]=\"_optionVisible()\"\n type=\"checkbox\"\n class=\"fudis-multiselect-option__label__checkbox__input\"\n role=\"option\"\n [attr.id]=\"_id + '-checkbox-input-' + componentInstanceId\"\n [attr.aria-disabled]=\"data.disabled || null\"\n (click)=\"!data.disabled && _clickOption($event)\"\n [attr.aria-selected]=\"_selected()\"\n (focus)=\"_focus()\"\n (keydown)=\"_keyDown($event)\"\n (blur)=\"_blur($event)\"\n />\n @if (_selected()) {\n <fudis-icon class=\"fudis-multiselect-option__label__checkbox__icon\" [icon]=\"'check'\" />\n }\n </div>\n <div class=\"fudis-multiselect-option__label__text\">\n <span class=\"fudis-multiselect-option__label__text__main\">{{ data.label }}</span>\n @if (data.subLabel) {\n <span class=\"fudis-multiselect-option__label__text__sub\">{{ data.subLabel }}</span>\n }\n\n @if (data.disabled) {\n <span class=\"fudis-multiselect-option__label__text__disabled\">\n ({{ _translationService.getTranslations()().SELECT.DISABLED }})</span\n >\n }\n </div>\n </label>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n ViewEncapsulation,\n Output,\n EventEmitter,\n OnInit,\n signal,\n OnDestroy,\n computed,\n ElementRef,\n ViewChild,\n AfterViewChecked,\n effect,\n WritableSignal,\n} from '@angular/core';\nimport { FudisTranslationService } from '../../services/translation/translation.service';\nimport { BehaviorSubject } from 'rxjs';\nimport { FudisIdService } from '../../services/id/id.service';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Enum representing pagination ellipsis markers\\\n * Used to indicate hidden page ranges.\n */\nenum Ellipsis {\n start = 'start-ellipsis',\n end = 'end-ellipsis',\n}\n\n/**\n * Controls navigation through paged data sets.\n *\n * Use this component to split large collections into manageable pages.\n */\n@Component({\n selector: 'fudis-pagination',\n imports: [CommonModule],\n templateUrl: './pagination.component.html',\n styleUrl: './pagination.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PaginationComponent implements AfterViewChecked, OnInit, OnDestroy {\n constructor(\n private _translationService: FudisTranslationService,\n private _idService: FudisIdService,\n private _elementRef: ElementRef<HTMLElement>,\n ) {\n this._paginationPrefix.next(this._translationService.getTranslations()().PAGINATION.PREFIX);\n this._paginationCurrent.next(\n this._translationService.getTranslations()().PAGINATION.CURRENT_PAGE,\n );\n this._paginationLast.next(this._translationService.getTranslations()().PAGINATION.LAST_PAGE);\n this._paginationPreviousButton.next(\n this._translationService.getTranslations()().PAGINATION.BUTTON.PREVIOUS.LABEL,\n );\n this._paginationNextButton.next(\n this._translationService.getTranslations()().PAGINATION.BUTTON.NEXT.LABEL,\n );\n this._paginationPreviousButtonAria.next(\n this._translationService.getTranslations()().PAGINATION.BUTTON.PREVIOUS.ARIA_LABEL,\n );\n this._paginationNextButtonAria.next(\n this._translationService.getTranslations()().PAGINATION.BUTTON.NEXT.ARIA_LABEL,\n );\n\n /**\n * Effect that tracks page index changes. Marks `hasUserChangedPage` as true when the current\n * page differs from the previous one (ignoring the initial load).\n */\n effect(() => {\n const current = this._pageIndex();\n\n if (\n this.prevPageIndex !== undefined &&\n this.prevPageIndex !== current &&\n !this.hasUserChangedPage\n ) {\n this.hasUserChangedPage = true;\n }\n\n this.prevPageIndex = current;\n });\n }\n\n /**\n * Template reference for the active item element\n */\n @ViewChild('activeItem') activeItemRef?: ElementRef<HTMLElement>;\n\n /**\n * Id for Pagination. By default generated.\n */\n @Input() id: string;\n\n /**\n * Aria-Label has always prefix `Pagination:`. Give aria-label that best describes the pagination\n * in use\n */\n @Input({ required: true }) paginationAriaLabel: string;\n\n /**\n * Set total amount of pages\n */\n @Input({ required: true }) set pageCount(value: number) {\n this._pageCount.set(value);\n }\n\n /**\n * Set current page index\n */\n @Input() set pageIndex(value: number) {\n /**\n * Prevent values that are outside of pageCount scope\n */\n const safeValue =\n this._pageCount() && value >= 0 && value < this._pageCount()\n ? value\n : Math.min(Math.max(value, 0), this._pageCount() - 1);\n\n this._pageIndex.set(safeValue);\n }\n\n /**\n * A function that increments **0-based page index** and returns the URL for that page. Example:\n * `href=#2`\n */\n protected pageHref: (index: number) => string = (i) => `#${i + 1}`;\n\n /**\n * Internal input for setting the number of pages shown in each side of the current page\n */\n @Input() set siblingCount(value: number) {\n this._siblingCount.set(value);\n }\n\n /**\n * On default behavior, focus will stay on pagination component. When set to false, application\n * takes responsibility on focus handling on pageChange.\n */\n @Input() autoFocusOnPageChange: boolean = true;\n\n /**\n * PageChange Emitter\n */\n @Output() pageChange = new EventEmitter<number>();\n\n /**\n * Page index has been changed\n */\n protected hasUserChangedPage = false;\n\n /**\n * Protected signal for the total amount of pages\n */\n protected _pageCount = signal(0);\n\n /**\n * Protected signal for the current page index\n */\n protected _pageIndex = signal(0);\n\n /**\n * Prefix for aria-label from Fudis translation keys\n */\n protected _paginationPrefix = new BehaviorSubject<string>('');\n\n /**\n * Current page aria-label from Fudis translation keys\n */\n protected _paginationCurrent = new BehaviorSubject<string>('');\n\n /**\n * Last page aria-label from Fudis translation keys\n */\n protected _paginationLast = new BehaviorSubject<string>('');\n\n /**\n * Previous button label from Fudis translation keys\n */\n protected _paginationPreviousButton = new BehaviorSubject<string>('');\n\n /**\n * Next button label from Fudis translation keys\n */\n protected _paginationNextButton = new BehaviorSubject<string>('');\n\n /**\n * Previous button aria-label from Fudis translation keys\n */\n protected _paginationPreviousButtonAria = new BehaviorSubject<string>('');\n\n /**\n * Next button aria-label from Fudis translation keys\n */\n protected _paginationNextButtonAria = new BehaviorSubject<string>('');\n\n /**\n * Main CSS classes for buttons\n */\n protected _mainCssPrevClass: BehaviorSubject<string[]> = new BehaviorSubject<string[]>([\n 'fudis-pagination-button fudis-pagination-button__previous',\n ]);\n protected _mainCssNextClass: BehaviorSubject<string[]> = new BehaviorSubject<string[]>([\n 'fudis-pagination-button fudis-pagination-button__next',\n ]);\n\n /**\n * Computed list of pagination items (page numbers + ellipses)\\\n * Recalculated whenever page count, current page, or sibling count changes.\n */\n protected itemList = computed(() =>\n this.createPaginationItemList(this._pageCount(), this._pageIndex(), this._siblingCount()),\n );\n\n /**\n * Returns an array of numbers from given starting to ending number\n */\n protected range = (start: number, end: number): number[] => {\n const length = end - start + 1;\n return Array.from({ length }, (_, i) => start + i);\n };\n\n /**\n * HTML id\n */\n protected _id: string;\n\n /**\n * Private signal for counting Pagination item visible siblings\n */\n private _siblingCount = signal(2);\n\n /**\n * After DOM is updated, restore focus to the new active element\n */\n private userSelectedIndex = -1;\n\n /**\n * Stores the previous page index for change detection\n */\n private prevPageIndex: number | undefined;\n\n /**\n * To observe container size changes and adjust Pagination sibling count based on viewport changes\n */\n private observer?: ResizeObserver;\n\n /**\n * Signal to track if a pagination button was clicked, and which one, to manage focus in\n * ngAfterViewChecked\n */\n private _buttonClickState: WritableSignal<{ clicked: boolean; type: 'prev' | 'next' | null }> =\n signal({ clicked: false, type: null });\n\n /**\n * Get translation for aria-live page openend announcement\n */\n get liveAnnouncement(): string {\n if (this._pageCount() === 0) return '';\n return (\n this._translationService.getTranslations()().PAGINATION.OPENED_PAGE +\n ` ${this._pageIndex() + 1}`\n );\n }\n\n /**\n * Set button collapsed styles if Pagination container is smaller than < 465px\n */\n private _setClasses(collapsed: boolean): void {\n if (collapsed) {\n this._mainCssPrevClass.next([\n 'fudis-pagination-button fudis-pagination-button__previous--collapsed',\n ]);\n this._mainCssNextClass.next([\n 'fudis-pagination-button fudis-pagination-button__next--collapsed',\n ]);\n } else {\n this._mainCssPrevClass.next(['fudis-pagination-button fudis-pagination-button__previous']);\n this._mainCssNextClass.next(['fudis-pagination-button fudis-pagination-button__next']);\n }\n }\n\n /**\n * Create function that determines when to show ellipsis on start or end of the pagination list\n */\n private createPaginationItemList(\n pageCount: number,\n pageIndex: number,\n siblingCount: number,\n ): (Ellipsis | number)[] {\n const startPages = this.range(1, Math.min(1, pageCount));\n const endPages = this.range(Math.max(pageCount, 2), pageCount);\n\n /**\n * Calculate the first sibling page number to display around the current page\n */\n const siblingsStart = Math.max(\n Math.min(pageIndex + 1 - siblingCount, pageCount - 1 - siblingCount * 2 - 1),\n 3,\n );\n /**\n * Calculate the last sibling page number to display around the current page\n */\n const siblingsEnd = Math.min(\n Math.max(pageIndex + 1 + siblingCount, 1 + siblingCount * 2 + 2),\n endPages.length > 0 ? endPages[0] - 2 : pageCount - 1,\n );\n\n return [\n ...startPages,\n ...(siblingsStart > 3 ? [Ellipsis.start] : pageCount - 1 > 2 ? [2] : []),\n ...this.range(siblingsStart, siblingsEnd),\n ...(siblingsEnd < pageCount - 2 ? [Ellipsis.end] : pageCount - 1 > 1 ? [pageCount - 1] : []),\n ...endPages,\n ];\n }\n\n ngOnInit() {\n if (this.id) {\n this._idService.addNewId('pagination', this.id);\n } else {\n this.id = this._idService.getNewId('pagination');\n }\n\n this.observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const width = entry.contentRect.width;\n\n // update sibling count based on width\n if (width < 465) {\n this._siblingCount.set(1);\n this._setClasses(true);\n } else {\n this._siblingCount.set(2);\n this._setClasses(false);\n }\n }\n });\n\n this.observer.observe(this._elementRef.nativeElement);\n }\n\n /**\n * After view updates, restore focus to the active page item if user selected one\n */\n ngAfterViewChecked(): void {\n if (this.userSelectedIndex >= 0 && this.activeItemRef) {\n this.activeItemRef.nativeElement.focus();\n\n this.userSelectedIndex = -1;\n }\n // Keep focus on clicked button\n if (this._buttonClickState().clicked && this.autoFocusOnPageChange) {\n const buttonType = this._buttonClickState().type;\n this._buttonClickState.set({ clicked: false, type: null });\n if (buttonType) {\n document.getElementById(`${this.id}-button-${buttonType}`)?.focus();\n }\n }\n }\n\n ngOnDestroy(): void {\n this.observer?.disconnect();\n }\n\n /**\n * Emit pageChange event on pagination item click\n */\n goToPage(\n index: number,\n event?: Event,\n wasButtonClick?: boolean,\n buttonType?: 'prev' | 'next',\n ): void {\n event?.preventDefault();\n if (index < 0 || index >= this._pageCount()) return;\n\n const lastPage = this._pageCount() - 1;\n\n /**\n * When autoFocusOnPageChange is true (default), move focus to the new active page item on page\n * change. If autoFocusOnPageChange is false, let the application handle focus.\n */\n if (this.autoFocusOnPageChange) {\n if (wasButtonClick) {\n // Set signal to track that a button was clicked and which one, so that focus can be moved to the correct button in ngAfterViewChecked\n this._buttonClickState.set({ clicked: true, type: buttonType || null });\n if (index === 0) {\n // Move focus to first page item\n this.userSelectedIndex = 0;\n } else if (index === lastPage) {\n // Move focus to last page item\n this.userSelectedIndex = lastPage;\n } else {\n // Do not move focus on button click to middle pages\n this.userSelectedIndex = -1;\n }\n } else {\n this._buttonClickState.set({ clicked: false, type: null });\n // Set focus on clicking page numbers\n this.userSelectedIndex = index;\n }\n }\n this.pageChange.emit(index);\n this._pageIndex.set(index);\n }\n}\n","<nav\n [id]=\"id\"\n class=\"fudis-pagination\"\n [attr.aria-label]=\"(_paginationPrefix | async) + ': ' + paginationAriaLabel\"\n>\n <span aria-atomic=\"true\" aria-live=\"polite\" class=\"fudis-visually-hidden\">\n {{ hasUserChangedPage ? liveAnnouncement : \"\" }}\n </span>\n @if (_pageIndex() > 0) {\n <button\n [id]=\"id + '-button-prev'\"\n [attr.aria-label]=\"((_paginationPreviousButtonAria | async) || '') + ' ' + _pageIndex()\"\n class=\"fudis-button fudis-button__tertiary fudis-button__size__medium {{\n _mainCssPrevClass | async\n }}\"\n (click)=\"goToPage(_pageIndex() - 1, $event, true, 'prev')\"\n >\n <span\n class=\"fudis-icon fudis-icon__lg fudis-icon__color__primary fudis-icon__chevron fudis-icon__rotate__flip-180\"\n ></span>\n <span class=\"{{ _mainCssPrevClass | async }}__text-content\">{{\n _paginationPreviousButton | async\n }}</span></button\n >\n }\n <ul class=\"fudis-pagination-list\">\n <ng-container>\n @for (item of itemList(); track item) {\n @if (item === \"start-ellipsis\" || item === \"end-ellipsis\") {\n <span aria-hidden=\"true\" class=\"fudis-pagination-list-item-ellipsis\">...</span>\n }\n @if (item !== \"start-ellipsis\" && item !== \"end-ellipsis\") {\n <li>\n @if (_pageIndex() + 1 === item) {\n <span\n #activeItem\n class=\"fudis-pagination-list-item fudis-pagination-list-item--active\"\n aria-current=\"page\"\n [attr.aria-label]=\"item + ', ' + (_paginationCurrent | async)\"\n tabindex=\"-1\"\n >\n {{ item }}\n </span>\n } @else {\n <a\n class=\"fudis-pagination-list-item fudis-pagination-list-item-link\"\n [href]=\"pageHref(item - 1)\"\n [attr.aria-label]=\"\n item === _pageCount() ? item + ', ' + (_paginationLast | async) : item\n \"\n (click)=\"goToPage(item - 1, $event)\"\n >\n {{ item }}\n </a>\n }\n </li>\n }\n }\n </ng-container>\n </ul>\n @if (_pageIndex() < _pageCount() - 1) {\n <button\n [id]=\"id + '-button-next'\"\n (click)=\"goToPage(_pageIndex() + 1, $event, true, 'next')\"\n [attr.aria-label]=\"((_paginationNextButtonAria | async) || '') + ' ' + (_pageIndex() + 2)\"\n class=\"fudis-button fudis-button__tertiary fudis-button__size__medium {{\n _mainCssNextClass | async\n }}\"\n >\n <span class=\"{{ _mainCssNextClass | async }}__text-content\">{{\n _paginationNextButton | async\n }}</span>\n <span class=\"fudis-icon fudis-icon__lg fudis-icon__color__primary fudis-icon__chevron\"></span>\n </button>\n }\n</nav>\n","import {\n Component,\n EventEmitter,\n Inject,\n Input,\n OnChanges,\n OnInit,\n Output,\n ViewChild,\n AfterViewInit,\n DOCUMENT,\n ChangeDetectionStrategy,\n signal,\n WritableSignal,\n Signal,\n} from '@angular/core';\nimport { FudisInputSize, FudisRadioButtonChangeEvent } from '../../../types/forms';\nimport { FudisValidatorUtilities } from '../../../utilities/form/validator-utilities';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FudisComponentChanges } from '../../../types/miscellaneous';\nimport { ControlComponentBaseDirective } from '../../../directives/form/control-component-base/control-component-base.directive';\nimport { FudisFocusService } from '../../../services/focus/focus.service';\nimport { Subscription } from 'rxjs';\nimport { GuidanceComponent } from '../guidance/guidance.component';\nimport { FieldSetComponent } from '../fieldset/fieldset.component';\nimport { FieldsetContentDirective } from '../fieldset/fieldset-content.directive';\nimport { AsyncPipe } from '@angular/common';\n\n/**\n * Groups mutually exclusive options.\n *\n * Use this component when user must select exactly one option from a set. Each `fudis-radio-button`\n * child must have an `[option]` input of type `FudisRadioButtonOption`.\n *\n * @example\n * ```html\n * <fudis-radio-button-group [label]=\"'Color'\" [control]=\"colorControl\">\n * <fudis-radio-button [label]=\"'Red'\" [value]=\"'red'\"></fudis-radio-button>\n * <fudis-radio-button [label]=\"'Blue'\" [value]=\"'blue'\"></fudis-radio-button>\n * </fudis-radio-button-group>\n * ```;\n */\n@Component({\n selector: 'fudis-radio-button-group',\n templateUrl: './radio-button-group.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FieldSetComponent, FieldsetContentDirective, GuidanceComponent, AsyncPipe],\n})\nexport class RadioButtonGroupComponent\n extends ControlComponentBaseDirective\n implements OnInit, OnChanges, AfterViewInit\n{\n constructor(\n @Inject(DOCUMENT) private _document: Document,\n _focusService: FudisFocusService,\n _idService: FudisIdService,\n ) {\n super(_idService, _focusService);\n\n this._updateValueAndValidityTrigger.pipe(takeUntilDestroyed()).subscribe(() => {\n if (this.control) {\n this._required.next(FudisValidatorUtilities.required(this.control));\n }\n });\n }\n\n @ViewChild('radioButtonGroupGuidance') private _guidance: GuidanceComponent;\n\n /**\n * Width of Radio Button Group: 'sm' | 'md' | 'lg' | 'full-width'\n */\n @Input() size: FudisInputSize = 'lg';\n\n /**\n * Emit form control and changed option when one option is clicked\n */\n @Output() handleChange = new EventEmitter<FudisRadioButtonChangeEvent>();\n\n /**\n * Subscription for handling the valueChanges observable\n */\n private _subscription: Subscription;\n\n /**\n * Private signals for managing the state and selected value of the radio button group\n */\n private _selectedValue: WritableSignal<string | boolean | object | null | unknown> = signal(null);\n private _touched: WritableSignal<boolean> = signal(false);\n private _invalid: WritableSignal<boolean> = signal(false);\n private _disabled: WritableSignal<boolean> = signal(false);\n\n /**\n * Publicly exposed readonly signals for template binding and external use (in single radio\n * button). Not meant to be set from outside the component, but reflect the current state of the\n * form control and selected value.\n */\n public readonly selectedValue: Signal<string | boolean | object | null | unknown> =\n this._selectedValue.asReadonly();\n public readonly touchedState: Signal<boolean> = this._touched.asReadonly();\n public readonly invalidState: Signal<boolean> = this._invalid.asReadonly();\n public readonly disabledState: Signal<boolean> = this._disabled.asReadonly();\n\n ngOnInit() {\n this._setParentComponentId('radio-button-group');\n this._updateValueAndValidityTrigger.next();\n }\n\n /**\n * Sync local signals with FormControl states and add value and validity check when control value\n * changes.\n */\n ngOnChanges(changes: FudisComponentChanges<RadioButtonGroupComponent>): void {\n if (changes.control?.currentValue !== changes.control?.previousValue) {\n this._syncControlState();\n this._subscription?.unsubscribe();\n this._subscription = this.control.events\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => {\n this._syncControlState();\n this._updateValueAndValidityTrigger.next();\n });\n }\n }\n\n override ngAfterViewInit(): void {\n super.ngAfterViewInit();\n\n /**\n * For Screen reader users bind guidance text to first radio child input\n */\n const firstRadio = this._getFirstEnabledRadio();\n const guidanceId = this._guidance?.['_id'];\n\n if (firstRadio && guidanceId) {\n firstRadio.setAttribute('aria-describedby', guidanceId);\n }\n }\n\n /**\n * Return first radio child input when it is not disabled\n */\n private _getFirstEnabledRadio(): HTMLInputElement | null {\n const radioIds = this._idService.getAllChildrenIds('radio-button-group', this.id);\n if (!radioIds?.length) return null;\n\n const radio = this._document.getElementById(radioIds[0]);\n if (!(radio instanceof HTMLInputElement) || radio.disabled) {\n return null;\n }\n\n return radio;\n }\n\n /**\n * Copy FormControl states into local signals\n */\n private _syncControlState(): void {\n if (!this.control) return;\n\n this._selectedValue.set(this.control.value);\n this._touched.set(this.control.touched);\n this._invalid.set(this.control.invalid);\n this._disabled.set(this.control.disabled);\n }\n\n public triggerEmit(id: string, label: string): void {\n const data: FudisRadioButtonChangeEvent = {\n option: {\n id: id,\n label: label,\n value: this._selectedValue(),\n },\n control: this.control,\n };\n this.handleChange.emit(data);\n }\n}\n","<fudis-fieldset\n class=\"fudis-radio-button-group\"\n [id]=\"id\"\n [labelSize]=\"'sm'\"\n [label]=\"label\"\n [required]=\"_required | async\"\n [errorSummaryBreadcrumb]=\"false\"\n [inputSize]=\"size\"\n [popoverText]=\"popoverText\"\n [popoverPosition]=\"popoverPosition\"\n [popoverTriggerLabel]=\"popoverTriggerLabel\"\n [initialFocus]=\"initialFocus\"\n>\n <fudis-fieldset-content>\n <ng-content select=\"fudis-radio-button\" />\n @if (control && !disableGuidance) {\n <fudis-guidance\n #radioButtonGroupGuidance\n [inputLabel]=\"label\"\n [helpText]=\"helpText\"\n [for]=\"id + '-legend'\"\n [control]=\"control\"\n [groupHelpTextHidden]=\"true\"\n >\n <ng-content select=\"fudis-error-message\" />\n </fudis-guidance>\n }\n </fudis-fieldset-content>\n</fudis-fieldset>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ViewEncapsulation,\n OnInit,\n Host,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { FudisIdService } from '../../../../services/id/id.service';\nimport { FudisRadioButtonChangeEvent, FudisRadioButtonOption } from '../../../../types/forms';\nimport { RadioButtonGroupComponent } from '../radio-button-group.component';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\n/**\n * Single radio button option for RadioButtonGroupComponent.\n */\n@Component({\n selector: 'fudis-radio-button',\n templateUrl: './radio-button.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormsModule, ReactiveFormsModule],\n})\nexport class RadioButtonComponent implements OnInit {\n constructor(\n private _idService: FudisIdService,\n @Host() protected _parentGroup: RadioButtonGroupComponent,\n ) {}\n\n /**\n * Selectable value of a single Radio Button, e.g. \"fair-trade-banana\"\n */\n @Input({ required: true }) value: string | boolean | object | null | unknown;\n\n /**\n * Visible label for a single Radio Button, e. g. \"Fair trade banana\"\n */\n @Input({ required: true }) label: string;\n\n /**\n * Emits changed Radio button option and form control.\n */\n @Output() handleChange = new EventEmitter<FudisRadioButtonChangeEvent>();\n\n /**\n * Id for single Radio Button\n */\n protected _id: string;\n\n /**\n * Selected Radio Button change\n */\n protected _onChange(): void {\n const optionToEmit: FudisRadioButtonOption<object> = {\n id: this._id,\n label: this.label,\n value: this._parentGroup?.selectedValue(),\n };\n\n /**\n * This Radio button's emit\n */\n this.handleChange.emit({ option: optionToEmit, control: this._parentGroup.control });\n\n /**\n * Call parent's function, which triggers Radio Button Group's emit\n */\n this._parentGroup.triggerEmit(this._id, this.label);\n }\n\n ngOnInit(): void {\n if (this._id) {\n this._idService.addNewChildId('radio-button-group', this._parentGroup.id, this._id);\n } else {\n this._id = this._idService.getNewChildId('radio-button-group', this._parentGroup.id);\n }\n }\n}\n","@if (_parentGroup?.control) {\n <label\n class=\"fudis-radio-button\"\n [attr.for]=\"_id\"\n [class.fudis-radio-button--disabled]=\"_parentGroup.disabled\"\n >\n <input\n type=\"radio\"\n class=\"fudis-radio-button__input\"\n [class.fudis-radio-button__input--disabled]=\"\n _parentGroup.disabledState() || _parentGroup.disabled || null\n \"\n [id]=\"_id\"\n [formControl]=\"_parentGroup.control\"\n [value]=\"value\"\n [name]=\"_parentGroup.id\"\n [attr.name]=\"_parentGroup.id\"\n [attr.tabindex]=\"_parentGroup.disabledState() || _parentGroup.disabled ? -1 : null\"\n [attr.aria-disabled]=\"_parentGroup.disabledState() || _parentGroup.disabled || null\"\n [attr.aria-invalid]=\"(_parentGroup.touchedState() && _parentGroup.invalidState()) || null\"\n (focus)=\"_parentGroup.onFocus($event)\"\n (keyup)=\"_parentGroup.handleKeyUp.emit($event)\"\n (blur)=\"_parentGroup.handleBlur.emit($event)\"\n (change)=\"_onChange()\"\n />\n <div\n class=\"fudis-radio-button__content\"\n [class.fudis-radio-button__content--disabled]=\"\n _parentGroup.disabledState() || _parentGroup.disabled\n \"\n >\n <div class=\"fudis-radio-button__content-wrapper\">\n <div\n class=\"fudis-radio-button__content__control\"\n [class.fudis-radio-button__content__control--invalid]=\"\n _parentGroup.touchedState() && _parentGroup.invalidState()\n \"\n [class.fudis-radio-button__content__control--disabled]=\"\n _parentGroup.disabledState() || _parentGroup.disabled\n \"\n >\n @if (_parentGroup.selectedValue() === value) {\n <span class=\"fudis-radio-button__content__control__indicator\"></span>\n }\n </div>\n </div>\n <span class=\"fudis-radio-button__label\">{{ label }}</span>\n </div>\n </label>\n}\n","import {\n Component,\n ElementRef,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n ViewEncapsulation,\n AfterContentInit,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { FudisIdService } from '../../services/id/id.service';\nimport { FudisHeadingVariant, FudisHeadingLevel } from '../../types/typography';\nimport { FudisGridWidth, FudisGridAlign } from '../../types/grid';\nimport { PopoverApiDirective } from '../../directives/popover/popover-api.directive';\nimport { FudisComponentChanges, FudisBadgeVariant } from '../../types/miscellaneous';\nimport { FudisInternalErrorSummaryService } from '../../services/form/error-summary/internal-error-summary.service';\nimport { BehaviorSubject } from 'rxjs';\nimport { getHeadingVariant } from '../../utilities/typography/typography-utils';\nimport { GridDirective } from '../../directives/grid/grid/grid.directive';\nimport { HeadingComponent } from '../typography/heading/heading.component';\nimport { BadgeComponent } from '../badge/badge.component';\nimport { IconButtonComponent } from '../icon-button/icon-button.component';\nimport { AsyncPipe } from '@angular/common';\n\n/**\n * Defines a logical content section.\n *\n * Use this component to group related content and improve page structure.\n */\n@Component({\n selector: 'fudis-section',\n templateUrl: './section.component.html',\n styleUrls: ['./section.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [GridDirective, HeadingComponent, BadgeComponent, IconButtonComponent, AsyncPipe],\n})\nexport class SectionComponent\n extends PopoverApiDirective\n implements OnInit, OnChanges, OnDestroy, AfterContentInit\n{\n constructor(\n private _element: ElementRef,\n private _idService: FudisIdService,\n private _errorSummaryService: FudisInternalErrorSummaryService,\n ) {\n super();\n }\n\n /**\n * Section title\n */\n @Input({ required: true }) title: string;\n\n /**\n * Heading level for the section title\n */\n @Input({ required: true }) level: FudisHeadingLevel;\n\n /**\n * Heading variant for the section title\n */\n @Input() titleVariant: FudisHeadingVariant;\n\n /**\n * Section id\n */\n @Input() id: string;\n\n /**\n * Add badge to the section title\n */\n @Input() badge: FudisBadgeVariant | null;\n\n /**\n * Badge text\n */\n @Input() badgeText: string | null;\n\n /**\n * Maximum width of Grid. When viewport gets narrower, grid automatically adjusts to lower sizes.\n *\n * - Xxl = Default value. Viewports of 1600px and larger\n * - Xl = Viewports smaller than 1600px\n * - Lg = Viewports smaller than 1200px\n * - Md = Viewports smaller than 992px\n * - Sm = Viewports smaller than 768px\n * - Xs = Viewports smaller than 576px\n * - Full-width = Grid takes full width of its parent container, no maximum width\n */\n @Input() width: FudisGridWidth = 'initial';\n\n /**\n * Alignment of Grid component inside its parent\n */\n @Input() align: FudisGridAlign = 'start';\n\n /**\n * Custom CSS classes\n */\n @Input() classes: string;\n\n /**\n * Is section title shown in error summary breadcrumb\n */\n @Input() errorSummaryBreadcrumb: boolean = false;\n\n /**\n * Internal, separate unique heading id\n */\n protected _headingId: string;\n\n /**\n * Section CSS class list\n */\n protected _classList = new BehaviorSubject<string>('');\n\n /**\n * Is info sent to error summary service\n */\n private _errorSummaryInfoSent: boolean = false;\n\n private _parentFormId: string | null;\n\n ngOnInit(): void {\n this._setSectionId();\n\n if (!this.titleVariant) {\n this.titleVariant = getHeadingVariant(this.level);\n }\n\n this._headingId = `${this.id}-heading`;\n this._classList.next(this._getClasses());\n this._addToErrorSummary();\n }\n\n ngAfterContentInit(): void {\n this._errorSummaryService\n .getFormAncestorId(this._element.nativeElement)\n .then((parentFormId) => {\n if (parentFormId) {\n this._parentFormId = parentFormId;\n this._addToErrorSummary();\n }\n });\n }\n\n ngOnChanges(changes: FudisComponentChanges<SectionComponent>): void {\n if (changes.classes?.currentValue !== changes.classes?.previousValue) {\n this._classList.next(this._getClasses());\n }\n\n if (changes.title?.currentValue !== changes.title?.previousValue && this.id) {\n this._addToErrorSummary();\n }\n }\n\n ngOnDestroy(): void {\n this._removeFromErrorSummary();\n }\n\n /**\n * Send error object to Error Summary Service\n */\n private _addToErrorSummary(): void {\n if (this.errorSummaryBreadcrumb && this._parentFormId) {\n const errorSummaryInfo = {\n id: this.id,\n formId: this._parentFormId,\n title: this.title,\n };\n this._errorSummaryService.addSection(errorSummaryInfo);\n this._errorSummaryInfoSent = true;\n }\n }\n\n /**\n * Remove error object from Error Summary Service\n */\n private _removeFromErrorSummary(): void {\n if (this._errorSummaryInfoSent && this._parentFormId) {\n this._errorSummaryService.removeSection(this._parentFormId, this.id);\n }\n }\n\n /**\n * Set main CSS class with possible custom classes\n */\n private _getClasses(): string {\n if (this.classes) {\n return `fudis-section ${this.classes}`;\n } else {\n return 'fudis-section';\n }\n }\n\n /**\n * Generate id with Id Service\n */\n private _setSectionId(): void {\n if (this.id) {\n this._idService.addNewId('section', this.id);\n } else {\n this.id = this._idService.getNewId('section');\n }\n }\n}\n","<!-- prettier-ignore -->\n@if (_classList | async; as classes) {\n <section\n fudisGrid\n [id]=\"id\"\n [tabIndex]=\"-1\"\n [attr.aria-labelledby]=\"_headingId\"\n [align]=\"align\"\n [width]=\"width\"\n [classes]=\"classes\"\n [rowGap]=\"'none'\"\n [serviceDefaults]=\"false\"\n >\n <div class=\"fudis-section__header\" [id]=\"_headingId\">\n <div class=\"fudis-section__header__container\">\n <div class=\"fudis-section__header__heading\">\n <fudis-heading class=\"fudis-mb-none\" [level]=\"level\" [variant]=\"titleVariant\"\n >{{ title }}@if (badge && badgeText) {\n <fudis-badge\n class=\"fudis-section__header__heading__badge\"\n [variant]=\"badge\"\n [content]=\"badgeText\"\n />\n }\n </fudis-heading>\n @if (popoverTriggerLabel && popoverText) {\n <fudis-icon-button\n class=\"fudis-section__header__heading__popover\"\n [size]=\"'extra-small'\"\n [variant]=\"'tertiary'\"\n [icon]=\"'info-circle'\"\n [ariaLabel]=\"popoverTriggerLabel\"\n [popoverPosition]=\"popoverPosition\"\n [popoverText]=\"popoverText\"\n />\n }\n </div>\n <ng-content select=\"fudis-section-actions\"></ng-content>\n </div>\n </div>\n <ng-content select=\"fudis-section-content\"></ng-content>\n </section>\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n OnDestroy,\n signal,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { auditTime, fromEvent, Subscription } from 'rxjs';\nimport { TabNavigationPanelComponent } from './tab-navigation-panel.component';\nimport { IconComponent } from '../icon/icon.component';\n\n/**\n * Organizes content into selectable tabs.\n *\n * Use this component to switch between related views within the same context.\n */\n@Component({\n selector: 'fudis-tab-navigation-bar',\n imports: [IconComponent],\n encapsulation: ViewEncapsulation.None,\n templateUrl: './tab-navigation-bar.component.html',\n styleUrl: './tab-navigation-bar.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[id]': 'id',\n role: 'tablist',\n },\n})\nexport class TabNavigationBarComponent implements AfterViewInit, OnDestroy {\n /**\n * Unique identifier for the component\n */\n @Input() id: string;\n\n /**\n * Reference to the TabNavigationPanelComponent\n */\n @Input()\n get panel(): TabNavigationPanelComponent {\n return this._tabPanel;\n }\n\n set panel(value: TabNavigationPanelComponent) {\n this._tabPanel = value;\n this._updatePanel();\n }\n\n /**\n * If panel is not defined you can define the element id where the tab content is projected\n */\n @Input() ariaControls?: string;\n\n /**\n * Variant option\n */\n @Input() variant?: 'primary' | 'secondary' = 'primary';\n\n @ViewChild('tabNavigation') tabNavigation: ElementRef;\n @ViewChild('scrollContainer') scrollContainer: ElementRef;\n\n protected _leftContentHidden = signal<boolean>(false);\n protected _rightContentHidden = signal<boolean>(false);\n\n private _ariaControls = signal<string | undefined>(undefined);\n\n private _tabPanel: TabNavigationPanelComponent;\n private _currentActiveTabId: string;\n\n private _scrollSubscription: Subscription;\n private _resizeObserver: ResizeObserver;\n private readonly _scrollAmount: number = 150;\n\n ngAfterViewInit() {\n this._resizeObserver = new ResizeObserver((): void => {\n this.assertScroll();\n });\n\n if (this.tabNavigation) this._resizeObserver.observe(this.tabNavigation.nativeElement);\n\n if (this.scrollContainer) {\n this._scrollSubscription = fromEvent(this.scrollContainer.nativeElement, 'scroll')\n .pipe(auditTime(300))\n .subscribe(() => this.assertScroll());\n }\n if (this.ariaControls && !this._ariaControls()) this._ariaControls.set(this.ariaControls);\n }\n\n getAriaControls = () => this._ariaControls;\n\n isScrollable = () => {\n return this._leftContentHidden() || this._rightContentHidden();\n };\n\n assertScroll() {\n const scrollContainer = this.scrollContainer?.nativeElement;\n\n if (scrollContainer) {\n const isLeftHidden = scrollContainer.scrollLeft > 0;\n const isRightHidden =\n Math.round(scrollContainer.scrollLeft + scrollContainer.clientWidth) <\n scrollContainer.scrollWidth;\n\n this._rightContentHidden.set(isRightHidden);\n this._leftContentHidden.set(isLeftHidden);\n }\n }\n\n scrollLeft(scrollToStart?: boolean): void {\n const scrollContainer = this.scrollContainer?.nativeElement;\n\n if (scrollContainer) {\n if (scrollToStart) {\n this._scrollTo(scrollContainer, 0, 'instant');\n } else {\n const targetScrollLeft = Math.max(0, scrollContainer.scrollLeft - this._scrollAmount);\n this._scrollTo(scrollContainer, targetScrollLeft);\n }\n }\n }\n\n scrollRight(scrollToEnd?: boolean): void {\n const scrollContainer = this.scrollContainer.nativeElement;\n\n if (scrollContainer) {\n const maxScrollLeft = scrollContainer.scrollWidth - scrollContainer.clientWidth;\n\n if (scrollToEnd) {\n this._scrollTo(scrollContainer, maxScrollLeft, 'instant');\n } else {\n const targetScrollLeft = Math.min(\n maxScrollLeft,\n scrollContainer.scrollLeft + this._scrollAmount,\n );\n this._scrollTo(scrollContainer, targetScrollLeft);\n }\n }\n }\n\n private _scrollTo = (\n element: HTMLElement,\n scrollAmount: number,\n behavior: 'smooth' | 'instant' = 'smooth',\n ): void => {\n element.scrollTo({\n left: scrollAmount,\n behavior: behavior,\n });\n };\n\n private _updatePanel = () => {\n if (this._tabPanel) {\n if (this._currentActiveTabId) this._tabPanel.setActiveTabId(this._currentActiveTabId);\n if (!this._ariaControls()) this._ariaControls.set(this._tabPanel.id);\n }\n };\n\n updateActiveLink(id: string) {\n this._currentActiveTabId = id;\n this._updatePanel();\n }\n\n ngOnDestroy() {\n this._resizeObserver?.disconnect();\n this._scrollSubscription?.unsubscribe();\n }\n}\n","<div #tabNavigation class=\"fudis-tab-navigation-bar\">\n @if (_leftContentHidden()) {\n <div\n class=\"fudis-tab-navigation-bar__button-container fudis-tab-navigation-bar__button-container--left\"\n >\n <button\n [id]=\"id + '-scroll-button-left'\"\n (click)=\"scrollLeft()\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n [class]=\"'fudis-tab-navigation-bar__button-container__button fudis-tab-navigation-bar__button-container__button--left'\"\n >\n <fudis-icon\n class=\"fudis-tab-navigation-bar__button-container__button__icon\"\n rotate=\"flip-180\"\n icon=\"chevron-ring-fill\"\n ></fudis-icon>\n </button>\n </div>\n }\n <div [class]=\"'fudis-tab-navigation-bar__wrapper fudis-tab-navigation-bar__wrapper--' + variant\">\n <div\n #scrollContainer\n [class]=\"\n 'fudis-tab-navigation-bar__wrapper__tab-container fudis-tab-navigation-bar__wrapper__tab-container--' +\n variant\n \"\n >\n <ng-content></ng-content>\n </div>\n </div>\n @if (_rightContentHidden()) {\n <div\n class=\"fudis-tab-navigation-bar__button-container fudis-tab-navigation-bar__button-container--right\"\n >\n <button\n [id]=\"id + '-scroll-button-right'\"\n (click)=\"scrollRight()\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n [class]=\"'fudis-tab-navigation-bar__button-container__button fudis-tab-navigation-bar__button-container__button--right'\"\n >\n <fudis-icon\n class=\"fudis-tab-navigation-bar__button-container__button__icon\"\n icon=\"chevron-ring-fill\"\n ></fudis-icon>\n </button>\n </div>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';\n\n/**\n * Navigation tab panel associated with the TabNavigationBarComponent.\n */\n@Component({\n selector: 'fudis-tab-navigation-panel',\n encapsulation: ViewEncapsulation.None,\n template: '<ng-content></ng-content>',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.aria-labelledby]': '_activeTabId',\n '[id]': 'id',\n role: 'tabpanel',\n },\n})\nexport class TabNavigationPanelComponent {\n /**\n * Unique identifier for the component\n */\n @Input() id: string;\n\n protected _activeTabId: string | undefined;\n\n setActiveTabId = (id: string) => (this._activeTabId = id);\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n effect,\n inject,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport { TabNavigationBarComponent } from './tab-navigation-bar.component';\n\n/**\n * Button or a link inside a `fudis-tab-navigation-bar`.\n */\n@Component({\n selector: '[fudis-tab-navigation-tab]',\n encapsulation: ViewEncapsulation.None,\n template: '<ng-content></ng-content>',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[id]': 'id',\n role: 'tab',\n '(keydown)': '_onKeyDown($event)',\n '[attr.tabIndex]': '_isActive ? 0 : -1',\n '[attr.aria-selected]': '_isActive',\n '[attr.aria-controls]': '_ariaControls',\n '[class]': \"'fudis-tab-navigation-tab fudis-tab-navigation-tab--' + _tabNavigation.variant\",\n '[class.fudis-tab-navigation-tab--primary--active]':\n \"_tabNavigation.variant === 'primary' && _isActive\",\n '[class.fudis-tab-navigation-tab--secondary--active]':\n \"_tabNavigation.variant === 'secondary' && _isActive\",\n },\n})\nexport class TabNavigationTabComponent implements AfterViewInit {\n protected _tabNavigation = inject(TabNavigationBarComponent);\n protected _isActive: boolean = false;\n protected _ariaControls: string | undefined;\n\n /**\n * Unique identifier for the component\n */\n @Input() id: string;\n\n /**\n * Currently active tab\n */\n @Input()\n get active(): boolean {\n return this._isActive;\n }\n\n set active(value: boolean) {\n if (value !== this._isActive) {\n this._isActive = value;\n if (this._isActive) this._tabNavigation?.updateActiveLink(this.id);\n }\n }\n\n constructor() {\n effect(() => {\n this._ariaControls = this._tabNavigation.getAriaControls()();\n });\n }\n\n ngAfterViewInit() {\n if (this._isActive) this._tabNavigation?.updateActiveLink(this.id);\n }\n\n protected _onKeyDown = (event: KeyboardEvent) => {\n if (event.key === ' ' && event?.target instanceof HTMLAnchorElement) {\n event.preventDefault();\n const anchorElement = event.target;\n anchorElement.click();\n }\n\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') this._onArrowNavigation(event);\n };\n\n private _onArrowNavigation = (event: KeyboardEvent) => {\n event.preventDefault();\n\n const tabElements = this._getTabs() as HTMLElement[];\n const currentElement: HTMLElement =\n this._tabNavigation?.scrollContainer?.nativeElement?.querySelector(':focus');\n\n if (currentElement && tabElements.length > 0) {\n const currentIndex = tabElements.indexOf(currentElement);\n let nextIndex: number = currentIndex;\n let focusElement = currentElement;\n\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n nextIndex = currentIndex > 0 ? currentIndex - 1 : tabElements.length - 1;\n focusElement = tabElements[nextIndex];\n } else if (event.key === 'ArrowRight') {\n event.preventDefault();\n nextIndex = currentIndex < tabElements.length - 1 ? currentIndex + 1 : 0;\n focusElement = tabElements[nextIndex];\n }\n\n focusElement?.focus();\n\n if (this._tabNavigation.isScrollable()) {\n if (nextIndex === 0) {\n this._tabNavigation?.scrollLeft(true);\n } else if (nextIndex === tabElements.length - 1) {\n this._tabNavigation?.scrollRight(true);\n } else {\n focusElement.scrollIntoView({\n behavior: 'smooth',\n inline: 'center',\n block: 'nearest',\n });\n }\n }\n }\n };\n\n private _getTabs = () => {\n const tabNodes = this._tabNavigation.scrollContainer?.nativeElement?.querySelectorAll(\n '[fudis-tab-navigation-tab]',\n );\n return [...tabNodes];\n };\n}\n","import { Directive, Input } from '@angular/core';\nimport { ControlComponentBaseDirective } from '../control-component-base/control-component-base.directive';\nimport { FudisFocusService } from '../../../services/focus/focus.service';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { FudisInputSize } from '../../../types/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Directive({ selector: '[fudisTextFieldComponentBase]' })\nexport class TextFieldComponentBaseDirective extends ControlComponentBaseDirective {\n constructor(_idService: FudisIdService, _focusService: FudisFocusService) {\n super(_idService, _focusService);\n }\n\n /**\n * Width of the input field: 'sm' | 'md' | 'lg'\n */\n @Input() size: FudisInputSize = 'lg';\n\n /**\n * If user clears the input field, set FormControl value to null instead of empty string.\n */\n @Input() nullControlOnEmptyString: boolean = true;\n\n /**\n * Max length for HTML attribute and for character indicator in guidance.\n */\n protected _maxLength = new BehaviorSubject<number | null>(null);\n\n /**\n * Min length for HTML attribute.\n */\n protected _minLength = new BehaviorSubject<number | null>(null);\n\n /**\n * Subscription to listen to control's value changes\n */\n protected _baseSubscription: Subscription;\n\n /**\n * Depending on input prop 'nullControlOnEmptyString' either subscribe or unsubscribe to control's\n * value changes\n */\n protected _setControlValueSubscription(): void {\n if (this.nullControlOnEmptyString) {\n this._baseSubscription?.unsubscribe();\n this._baseSubscription = this.control.valueChanges\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((value) => {\n if (typeof value === 'string' && value.trim() === '') {\n this.control.setValue(null);\n }\n });\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit } from '@angular/core';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { FudisFocusService } from '../../../services/focus/focus.service';\nimport { FudisValidatorUtilities } from '../../../utilities/form/validator-utilities';\nimport { FudisComponentChanges } from '../../../types/miscellaneous';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TextFieldComponentBaseDirective } from '../../../directives/form/text-field-component-base/text-field-component-base.directive';\nimport { Subscription } from 'rxjs';\nimport { LabelComponent } from '../label/label.component';\nimport { GuidanceComponent } from '../guidance/guidance.component';\nimport { AsyncPipe } from '@angular/common';\n\n/**\n * Allows entry of multi-line text.\n *\n * Use this component for longer or free-form user input.\n */\n@Component({\n selector: 'fudis-text-area',\n templateUrl: './text-area.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LabelComponent, FormsModule, ReactiveFormsModule, GuidanceComponent, AsyncPipe],\n})\nexport class TextAreaComponent\n extends TextFieldComponentBaseDirective\n implements OnInit, OnChanges\n{\n constructor(_focusService: FudisFocusService, _idService: FudisIdService) {\n super(_idService, _focusService);\n this._updateValueAndValidityTrigger.pipe(takeUntilDestroyed()).subscribe(() => {\n if (this.control) {\n this._required.next(FudisValidatorUtilities.required(this.control));\n this._maxLength.next(FudisValidatorUtilities.maxLength(this.control));\n this._minLength.next(FudisValidatorUtilities.minLength(this.control));\n }\n });\n }\n\n /**\n * FormControl binded to the HTML textarea element\n */\n @Input({ required: true }) override control: FormControl<string | null | number>;\n\n /**\n * Subscription for handling the valueChanges observable\n */\n private _subscription: Subscription;\n\n ngOnInit(): void {\n this._setComponentId('text-area');\n this._updateValueAndValidityTrigger.next();\n this._setControlValueSubscription();\n }\n\n ngOnChanges(changes: FudisComponentChanges<TextAreaComponent>): void {\n if (changes.control?.currentValue !== changes.control?.previousValue) {\n if (!changes.control?.firstChange) {\n this._setControlValueSubscription();\n }\n\n this._subscription?.unsubscribe();\n this._subscription = this.control.valueChanges\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => this._updateValueAndValidityTrigger.next());\n }\n\n if (\n !changes.nullControlOnEmptyString?.firstChange &&\n changes.nullControlOnEmptyString?.currentValue !==\n changes.nullControlOnEmptyString?.previousValue\n ) {\n this._setControlValueSubscription();\n }\n }\n}\n","<div class=\"fudis-text-area fudis-input-size__{{ size }}\">\n <fudis-label\n [for]=\"id\"\n [id]=\"id + '-label'\"\n [text]=\"label\"\n [required]=\"_required | async\"\n [popoverText]=\"popoverText\"\n [popoverPosition]=\"popoverPosition\"\n [popoverTriggerLabel]=\"popoverTriggerLabel\"\n >\n </fudis-label>\n <textarea\n #inputRef\n class=\"fudis-form-input fudis-text-area__input\"\n [formControl]=\"control\"\n (blur)=\"handleBlur.emit($event)\"\n (keyup)=\"handleKeyUp.emit($event)\"\n (focus)=\"onFocus($event)\"\n [id]=\"id\"\n [attr.tabindex]=\"disabled ? -1 : null\"\n [attr.aria-describedby]=\"id + '_guidance'\"\n [attr.aria-invalid]=\"(control.invalid && control.touched) || null\"\n [attr.minLength]=\"_minLength | async\"\n [attr.maxLength]=\"_maxLength | async\"\n [attr.required]=\"(_required | async) || null\"\n [attr.aria-disabled]=\"control.disabled || disabled || null\"\n [readonly]=\"control.disabled || disabled || null\"\n >\n </textarea>\n @if (!disableGuidance) {\n <fudis-guidance\n [inputLabel]=\"label\"\n [maxLength]=\"_maxLength | async\"\n [helpText]=\"helpText\"\n [for]=\"id\"\n [control]=\"control\"\n >\n <ng-content select=\"fudis-error-message\" />\n </fudis-guidance>\n }\n</div>\n","import { Component, Input, OnInit, OnChanges, ChangeDetectionStrategy } from '@angular/core';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { FudisInputType } from '../../../types/forms';\nimport { FudisIdService } from '../../../services/id/id.service';\nimport { FudisFocusService } from '../../../services/focus/focus.service';\nimport { FudisValidatorUtilities } from '../../../utilities/form/validator-utilities';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FudisComponentChanges } from '../../../types/miscellaneous';\nimport { TextFieldComponentBaseDirective } from '../../../directives/form/text-field-component-base/text-field-component-base.directive';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { LabelComponent } from '../label/label.component';\nimport { GuidanceComponent } from '../guidance/guidance.component';\nimport { AsyncPipe } from '@angular/common';\n\n/**\n * Allows entry of single-line text.\n *\n * Use this component for short textual input such as names or identifiers.\n */\n@Component({\n selector: 'fudis-text-input',\n templateUrl: './text-input.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LabelComponent, FormsModule, ReactiveFormsModule, GuidanceComponent, AsyncPipe],\n})\nexport class TextInputComponent\n extends TextFieldComponentBaseDirective\n implements OnInit, OnChanges\n{\n constructor(_focusService: FudisFocusService, _idService: FudisIdService) {\n super(_idService, _focusService);\n this._updateValueAndValidityTrigger.pipe(takeUntilDestroyed()).subscribe(() => {\n if (this.control) {\n this._required.next(FudisValidatorUtilities.required(this.control));\n\n if (this.type === 'number') {\n this._maxLength.next(null);\n this._minLength.next(null);\n this._minNumber.next(FudisValidatorUtilities.min(this.control));\n this._maxNumber.next(FudisValidatorUtilities.max(this.control));\n } else {\n this._maxLength.next(FudisValidatorUtilities.maxLength(this.control));\n this._minLength.next(FudisValidatorUtilities.minLength(this.control));\n this._minNumber.next(null);\n this._maxNumber.next(null);\n }\n }\n });\n }\n\n /**\n * FormControl binded to the HTML input element\n */\n @Input({ required: true }) override control: FormControl<string | null | number>;\n\n /**\n * HTML type attribute: 'email' | 'number' | 'password' | 'tel' | 'text' | 'url'\n */\n @Input() type: FudisInputType = 'text';\n\n /**\n * Browser's automated assistance in filling out form field values, describing what input is\n * expected from the user.\n */\n @Input() autocomplete: string | string[] = 'off';\n\n /**\n * HTML name attribute (Note: in order to autocomplete to work properly, TextInput should have\n * specified name attribute as well)\n */\n @Input() name: string | null = null;\n\n /**\n * Step for number input: controls the minimum increment for number values. Use 'any' to allow any\n * decimal value.\n */\n @Input() step: number | 'any' | null = null;\n\n /**\n * Max number for number input HTML attribute\n */\n protected _maxNumber = new BehaviorSubject<number | null>(null);\n\n /**\n * Min number for number input HTML attribute\n */\n protected _minNumber = new BehaviorSubject<number | null>(null);\n\n /**\n * Subscription for handling the valueChanges observable\n */\n private _subscription: Subscription;\n\n ngOnInit(): void {\n this._setComponentId('text-input');\n this._updateValueAndValidityTrigger.next();\n this._setControlValueSubscription();\n }\n\n ngOnChanges(changes: FudisComponentChanges<TextInputComponent>): void {\n if (changes.control?.currentValue !== changes.control?.previousValue) {\n if (!changes.control?.firstChange) {\n this._setControlValueSubscription();\n }\n\n this._subscription?.unsubscribe();\n this._subscription = this.control.valueChanges\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => this._updateValueAndValidityTrigger.next());\n }\n\n if (changes.type?.currentValue !== changes.type?.previousValue) {\n this._updateValueAndValidityTrigger.next();\n }\n\n if (\n !changes.nullControlOnEmptyString?.firstChange &&\n changes.nullControlOnEmptyString?.currentValue !==\n changes.nullControlOnEmptyString?.previousValue\n ) {\n this._setControlValueSubscription();\n }\n }\n}\n","<div class=\"fudis-text-input fudis-input-size__{{ size }}\">\n <fudis-label\n [for]=\"id\"\n [id]=\"id + '-label'\"\n [text]=\"label\"\n [required]=\"_required | async\"\n [popoverPosition]=\"popoverPosition\"\n [popoverText]=\"popoverText\"\n [popoverTriggerLabel]=\"popoverTriggerLabel\"\n />\n <input\n #inputRef\n class=\"fudis-form-input fudis-text-input__input\"\n [id]=\"id\"\n [formControl]=\"control\"\n (blur)=\"handleBlur.emit($event)\"\n (keyup)=\"handleKeyUp.emit($event)\"\n (focus)=\"onFocus($event)\"\n [attr.step]=\"type === 'number' ? step : null\"\n [attr.autocomplete]=\"autocomplete\"\n [attr.minlength]=\"_minLength | async\"\n [attr.maxlength]=\"_maxLength | async\"\n [attr.min]=\"_minNumber | async\"\n [attr.max]=\"_maxNumber | async\"\n [attr.name]=\"name\"\n [attr.required]=\"(_required | async) || null\"\n [attr.tabindex]=\"disabled ? -1 : null\"\n [attr.type]=\"type\"\n [attr.aria-describedby]=\"id + '_guidance'\"\n [attr.aria-disabled]=\"control.disabled || disabled || null\"\n [attr.aria-invalid]=\"(control.invalid && control.touched) || null\"\n [attr.aria-label]=\"ariaLabel\"\n [readonly]=\"control.disabled || disabled || null\"\n />\n @if (!disableGuidance) {\n <fudis-guidance\n [control]=\"control\"\n [for]=\"id\"\n [helpText]=\"helpText\"\n [inputLabel]=\"label\"\n [maxLength]=\"_maxLength | async\"\n >\n <ng-content select=\"fudis-error-message\" />\n </fudis-guidance>\n }\n</div>\n","import { Directive, Host } from '@angular/core';\nimport { DatepickerComponent } from '../../../components/form/date/datepicker/datepicker.component';\n\n/**\n * Marks an input as the start date of a date range.\n *\n * Use this directive to associate the control with a date range and enable correct validation\n * behavior.\n */\n@Directive({ selector: '[fudisDateStart]' })\nexport class DateStartDirective {\n constructor(@Host() private _datepicker: DatepickerComponent) {\n _datepicker.dateRangeType = 'start';\n }\n}\n\n/**\n * Marks an input as the end date of a date range.\n *\n * Use this directive to associate the control with a date range and enable correct validation\n * behavior.\n */\n@Directive({ selector: '[fudisDateEnd]' })\nexport class DateEndDirective {\n constructor(@Host() private _datepicker: DatepickerComponent) {\n _datepicker.dateRangeType = 'end';\n }\n}\n","import {\n DestroyRef,\n Directive,\n EventEmitter,\n Host,\n inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n} from '@angular/core';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { AbstractControl } from '@angular/forms';\nimport {\n FudisValidationErrors,\n FudisValidatorFn,\n FudisValidatorMessage,\n} from '../../../../types/validators';\nimport { FudisIdService } from '../../../../services/id/id.service';\nimport { FudisTranslationService } from '../../../../services/translation/translation.service';\nimport { FudisInternalErrorSummaryService } from '../../../../services/form/error-summary/internal-error-summary.service';\nimport { TextInputComponent } from '../../text-input/text-input.component';\nimport { TextAreaComponent } from '../../text-area/text-area.component';\nimport { DatepickerComponent } from '../../date/datepicker/datepicker.component';\nimport { LocalizedTextGroupComponent } from '../../localized-text-group/localized-text-group.component';\nimport { CheckboxGroupComponent } from '../../checkbox-group/checkbox-group.component';\nimport { RadioButtonGroupComponent } from '../../radio-button-group/radio-button-group.component';\nimport { SelectComponent } from '../../select/select/select.component';\nimport { MultiselectComponent } from '../../select/multiselect/multiselect.component';\nimport { FudisComponentChanges } from '../../../../types/miscellaneous';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n FudisCheckboxGroupFormGroup,\n FudisLocalizedTextGroupFormGroup,\n} from '../../../../types/forms';\n\n/**\n * Displays a custom error message for a form field.\n *\n * Use this directive to link custom validation error to an input where existing validators are not\n * possible to use.\n */\n@Directive({ selector: 'fudis-error-message' })\nexport class ErrorMessageDirective implements OnInit, OnChanges, OnDestroy {\n constructor(\n private _errorSummaryService: FudisInternalErrorSummaryService,\n private _translationService: FudisTranslationService,\n private _idService: FudisIdService,\n @Host() @Optional() private _textInput: TextInputComponent,\n @Host() @Optional() private _textArea: TextAreaComponent,\n @Host() @Optional() private _datePicker: DatepickerComponent,\n @Host()\n @Optional()\n private _LocalizedTextGroup: LocalizedTextGroupComponent<\n FudisLocalizedTextGroupFormGroup<object>\n >,\n @Host()\n @Optional()\n private _checkboxGroup: CheckboxGroupComponent<FudisCheckboxGroupFormGroup<object>>,\n @Host() @Optional() private _select: SelectComponent,\n @Host() @Optional() private _multiSelect: MultiselectComponent,\n @Host() @Optional() private _radioButtonGroup: RadioButtonGroupComponent,\n ) {\n if (_textInput) {\n this._parent = _textInput;\n } else if (_textArea) {\n this._parent = _textArea;\n } else if (_datePicker) {\n this._parent = _datePicker;\n } else if (_radioButtonGroup) {\n this._parent = _radioButtonGroup;\n } else if (_LocalizedTextGroup) {\n this._parentGroup = _LocalizedTextGroup;\n } else if (_checkboxGroup) {\n this._parentGroup = _checkboxGroup;\n } else if (_select) {\n this._parent = _select;\n } else if (_multiSelect) {\n this._parent = _multiSelect;\n }\n\n this._id = _idService.getNewId('error-message');\n }\n\n /**\n * Error message to display\n */\n @Input({ required: true }) message: Observable<string> | string;\n\n /**\n * Output for handling a state when error is sent to Error Summary\n */\n @Output() handleAddError = new EventEmitter<FudisValidationErrors>();\n\n /**\n * Output for handling a state when error is removed from Error Summary\n */\n @Output() handleRemoveError = new EventEmitter<FudisValidationErrors>();\n\n /**\n * Id generated with FudisIdService\n */\n private _id: string;\n\n /**\n * Boolean determining if Error Message is added\n */\n private _errorAdded: boolean = false;\n\n /**\n * Convert provided string message to an observable so it updates accordingly in the validator\n */\n private _messageStringAsObservable: Subject<string>;\n\n /**\n * Possible parent components to used with Error Message\n */\n private _parent:\n | TextInputComponent\n | TextAreaComponent\n | DatepickerComponent\n | RadioButtonGroupComponent\n | SelectComponent\n | MultiselectComponent;\n\n /**\n * Possible parent group components to used with Error Message\n */\n private _parentGroup:\n | LocalizedTextGroupComponent<FudisLocalizedTextGroupFormGroup<object>>\n | CheckboxGroupComponent<FudisCheckboxGroupFormGroup<object>>;\n\n /**\n * Custom instance of FudisValidator\n */\n private _customValidatorInstance: FudisValidatorFn;\n\n private _destroyRef = inject(DestroyRef);\n\n ngOnInit(): void {\n if ((this._parent || this._parentGroup) && this.message) {\n this._addControlValidator();\n }\n }\n\n ngOnChanges(changes: FudisComponentChanges<ErrorMessageDirective>): void {\n const newMessage = changes.message?.currentValue;\n\n if (newMessage !== changes.message?.previousValue) {\n /**\n * Update validator message if message is a string and not observable\n */\n if (typeof newMessage === 'string') {\n if (!this._messageStringAsObservable) {\n this._messageStringAsObservable = new BehaviorSubject<string>(newMessage);\n this._customValidatorInstance = this._customControlValidatorFn(\n this._messageStringAsObservable,\n );\n } else {\n this._messageStringAsObservable.next(newMessage);\n }\n this._parent?.control?.updateValueAndValidity();\n this._parentGroup?.formGroup?.updateValueAndValidity();\n } else if (newMessage) {\n this._customValidatorInstance = this._customControlValidatorFn(newMessage);\n\n newMessage.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {\n this._parent?.control?.updateValueAndValidity();\n this._parentGroup?.formGroup?.updateValueAndValidity();\n });\n }\n }\n }\n\n ngOnDestroy(): void {\n this._removeValidator();\n }\n\n /**\n * Create custom validator with error message\n */\n private _customControlValidatorFn(message: FudisValidatorMessage): FudisValidatorFn {\n return (control: AbstractControl) => {\n if (!control) {\n return null;\n }\n return { [this._id]: { message } };\n };\n }\n\n /**\n * Add created validator to the parent component control\n */\n private _addControlValidator(): void {\n if (this._parent) {\n this._errorAdded = true;\n this._parent.control.addValidators(this._customValidatorInstance);\n this._parent.control.updateValueAndValidity();\n this.handleAddError.emit({ [this._id]: { message: this.message } });\n } else if (this._parentGroup) {\n this._errorAdded = true;\n this._parentGroup.formGroup.addValidators(this._customValidatorInstance);\n this._parentGroup.formGroup.updateValueAndValidity();\n this.handleAddError.emit({ [this._id]: { message: this.message } });\n }\n }\n\n /**\n * Remove created validator from parent component control\n */\n private _removeValidator(): void {\n if (this._parent && this._customValidatorInstance && this._errorAdded) {\n this._errorAdded = false;\n this._parent.control.removeValidators(this._customValidatorInstance);\n this._parent.control.updateValueAndValidity();\n this.handleRemoveError.emit({ [this._id]: { message: this.message } });\n } else if (this._parentGroup && this._customValidatorInstance && this._errorAdded) {\n this._errorAdded = false;\n this._parentGroup.formGroup.removeValidators(this._customValidatorInstance);\n this._parentGroup.formGroup.updateValueAndValidity();\n this.handleRemoveError.emit({ [this._id]: { message: this.message } });\n }\n }\n}\n","import { Directive, Host, HostListener, Inject, Input, OnInit, DOCUMENT } from '@angular/core';\nimport { ButtonComponent } from '../../../components/button/button.component';\nimport { FudisInternalErrorSummaryService } from '../../../services/form/error-summary/internal-error-summary.service';\n\nimport { isButtonDisabled } from '../../../utilities/dialog/dialog-utils';\n\n// TODO: Write tests\n/**\n * Marks an element as the primary form submission trigger. Must be applied on a `fudis-button` that\n * is inside a `fudis-form`. On click, triggers error summary visibility. Pass\n * `[formValid]=\"myForm.valid\"` to control behavior.\n *\n * @example\n * ```html\n * <fudis-button fudisFormSubmit [label]=\"'Submit'\" [formValid]=\"myForm.valid\"></fudis-button>\n * ```;\n */\n@Directive({ selector: '[fudisFormSubmit]' })\nexport class FormSubmitDirective implements OnInit {\n constructor(\n @Inject(DOCUMENT) private _document: Document,\n @Host() private _button: ButtonComponent,\n private _errorSummaryService: FudisInternalErrorSummaryService,\n ) {}\n\n /**\n * If false, Button will set parent Form's 'errorSummaryVisible' to true and call\n * reloadFormErrors() from Error Summary Service If true, Button will set parent Form's\n * 'errorSummaryVisible' to false\n */\n @Input() formValid: boolean = false;\n\n ngOnInit(): void {\n this._button.type = 'submit';\n }\n\n /**\n * Set parent Form's Error Summary Visible true and reload errors\n */\n @HostListener('click', ['$event']) protected _onClick(event: MouseEvent) {\n const targetElement = event.target;\n\n // Type guard\n if (!(targetElement instanceof HTMLElement)) return;\n\n /**\n * Make sure that click event is from this submit Button and not any parent Form element\n */\n const buttonElement = this._button.buttonEl.nativeElement;\n const submitButton =\n this._document.activeElement === buttonElement || targetElement === buttonElement;\n\n if (submitButton && !isButtonDisabled(buttonElement)) {\n this._errorSummaryService\n .getFormAncestorId(this._button.buttonEl.nativeElement)\n .then((parentFormId) => {\n if (parentFormId && !this.formValid) {\n this._errorSummaryService.setErrorSummaryVisibility(parentFormId, true);\n this._errorSummaryService.reloadFormErrors(parentFormId, true);\n } else if (parentFormId) {\n this._errorSummaryService.setErrorSummaryVisibility(parentFormId, false);\n }\n });\n }\n }\n}\n","import { Directive, HostBinding } from '@angular/core';\n\n/**\n * Identifies the actions area of a form.\n *\n * Use this directive to group submit or secondary form actions consistently.\n */\n@Directive({ selector: 'fudis-form-actions' })\nexport class FormActionsDirective {\n @HostBinding('class') readonly _hostClass = 'fudis-form-actions';\n}\n\n/**\n * Identifies the header area of a form.\n *\n * Use this directive for additional information like intsructions for the form that should be\n * grouped with the actual form heading.\n */\n@Directive({ selector: 'fudis-form-header' })\nexport class FormHeaderDirective {\n @HostBinding('class') readonly _hostClass = 'fudis-form-header';\n}\n\n/**\n * Identifies the main content area of a form.\n *\n * Use this directive for form fields.\n */\n@Directive({ selector: 'fudis-form-content' })\nexport class FormContentDirective {\n @HostBinding('class') readonly _hostClass = 'fudis-form-content';\n}\n","import { Directive, HostBinding } from '@angular/core';\n\n/**\n * Identifies the actions area of a section.\n *\n * Use this directive to add buttons that affect the section as a whole.\n */\n@Directive({ selector: 'fudis-section-actions' })\nexport class SectionActionsDirective {\n @HostBinding('class') readonly _hostClass = 'fudis-section-actions';\n}\n\n/**\n * Identifies the main content area of a section.\n *\n * Use this directive to structure section content.\n */\n@Directive({ selector: 'fudis-section-content' })\nexport class SectionContentDirective {\n @HostBinding('class') readonly _hostClass = 'fudis-section-content';\n}\n","import { DestroyRef, inject, Injectable } from '@angular/core';\nimport { FudisInternalErrorSummaryService } from './internal-error-summary.service';\n\nimport {\n FudisErrorSummaryAllErrors,\n FudisErrorSummaryNewError,\n FudisErrorSummaryRemoveError,\n FudisFormErrorSummaryUpdateStrategy,\n} from '../../../types/errorSummary';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n/**\n * Error Summary Service public methods and tools\n */\n@Injectable()\nexport class FudisErrorSummaryService {\n constructor(private _errorSummaryService: FudisInternalErrorSummaryService) {}\n\n private _destroyRef = inject(DestroyRef);\n\n /**\n * To store Subscriptions for each sent Observable, so it can be unsubscribed on removeError()\n */\n private _subscriptions: { [subscriptionId: string]: Subscription } = {};\n\n /**\n * To define ID for each subscription\n *\n * @param error With required properties\n * @returns Generated id\n */\n private _getSubscriptionId(error: FudisErrorSummaryRemoveError): string {\n return `${error.formId}_${error.focusId}_${error.id}`;\n }\n\n /**\n * Get current updateStrategy of Error Summary. By default 'reloadOnly'.\n */\n public get updateStrategy(): FudisFormErrorSummaryUpdateStrategy {\n return this._errorSummaryService.updateStrategy;\n }\n\n /**\n * Set updateStrategy of Error Summary\n */\n public setUpdateStrategy(value: FudisFormErrorSummaryUpdateStrategy) {\n this._errorSummaryService.updateStrategy = value;\n }\n\n /**\n * Reloads all Forms with Error Summary\n */\n public reloadAllErrors(): void {\n this._errorSummaryService.focusToFormOnReload = null;\n this._errorSummaryService.reloadAllErrors();\n }\n\n /**\n * Reload a specific Form Id\n *\n * @param id Form Id\n * @param focus Focus to Error Summary\n */\n public reloadFormErrors(id: string, focus: boolean = true) {\n this._errorSummaryService.reloadFormErrors(id, focus);\n }\n\n // TODO: This should be removed and replaced with getter for collection of Signals per individual Forms\n /**\n * Returns an observable of all errors sent to Error Summary. Note, that Observable is updated\n * only when reloadFormErrors is called.\n */\n public getErrorsObservable(): BehaviorSubject<FudisErrorSummaryAllErrors> {\n return this._errorSummaryService.errorsObservable;\n }\n\n /**\n * To add message to specific Form's Error Summary.\n *\n * @param id Identifier of the message, eg. 'app-custom-error-abc123'\n * @param formId Id of Form component\n * @param focusId HTML element's id, where user focus should be moved when user clicks the\n * message.\n * @param message Visible message to the user\n */\n public addError(\n id: string,\n formId: string,\n focusId: string,\n message: string | Observable<string>,\n ): void {\n if (typeof message === 'string') {\n const newError: FudisErrorSummaryNewError = { focusId, formId, message, id };\n\n this._errorSummaryService.addError(newError);\n } else {\n const subscriptionId = this._getSubscriptionId({ id, formId, focusId });\n\n this._subscriptions[subscriptionId] = message\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((newMessage) => {\n const newError: FudisErrorSummaryNewError = { focusId, formId, message: newMessage, id };\n\n this._errorSummaryService.addError(newError);\n });\n }\n }\n\n /**\n * To remove messages from Form's Error Summary\n *\n * @param id Identifier of provided message in 'addError()'\n * @param formId Id of Form component\n * @param focusId HTML element's id, where user focus should be moved when user clicks the\n * message.\n */\n public removeError(id: string, formId: string, focusId: string): void {\n const removeError: FudisErrorSummaryRemoveError = { focusId, formId, id };\n\n const subscriptionId = this._getSubscriptionId(removeError);\n\n if (this._subscriptions[subscriptionId]) {\n this._subscriptions[subscriptionId].unsubscribe();\n\n delete this._subscriptions[subscriptionId];\n }\n\n this._errorSummaryService.removeError(removeError);\n }\n}\n","/**\n * Angular & ngMaterial\n */\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { LayoutModule } from '@angular/cdk/layout';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { ModuleWithProviders, NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\n\n/**\n * Fudis Components\n */\nimport { AlertComponent } from './components/alert/alert/alert.component';\nimport { AlertGroupComponent } from './components/alert/alert-group/alert-group.component';\nimport { BadgeComponent } from './components/badge/badge.component';\nimport { BreadcrumbsComponent } from './components/breadcrumbs/breadcrumbs.component';\nimport { BreadcrumbsItemComponent } from './components/breadcrumbs/breadcrumbs-item/breadcrumbs-item.component';\nimport { BodyTextComponent } from './components/typography/body-text/body-text.component';\nimport { ButtonComponent } from './components/button/button.component';\nimport { CheckboxComponent } from './components/form/checkbox/checkbox.component';\nimport { CheckboxGroupComponent } from './components/form/checkbox-group/checkbox-group.component';\nimport { CheckboxGroupOptionComponent } from './components/form/checkbox-group/checkbox-group-option/checkbox-group-option.component';\nimport { DatepickerComponent } from './components/form/date/datepicker/datepicker.component';\nimport { DateRangeComponent } from './components/form/date/date-range/date-range.component';\nimport { DescriptionListComponent } from './components/description-list/description-list.component';\nimport { DescriptionListItemComponent } from './components/description-list/description-list-item/description-list-item.component';\nimport { DescriptionListItemDetailsComponent } from './components/description-list/description-list-item/description-list-item-details/description-list-item-details.component';\nimport { DescriptionListItemTermComponent } from './components/description-list/description-list-item/description-list-item-term/description-list-item-term.component';\nimport { DialogComponent } from './components/dialog/dialog.component';\nimport { DropdownMenuComponent } from './components/dropdown-menu/dropdown-menu.component';\nimport { DropdownMenuItemComponent } from './components/dropdown-menu/dropdown-menu-item/dropdown-menu-item.component';\nimport { DropdownMenuGroupComponent } from './components/dropdown-menu/dropdown-menu-group/dropdown-menu-group.component';\nimport { ErrorSummaryComponent } from './components/form/error-summary/error-summary.component';\nimport { ExpandableComponent } from './components/expandable/expandable.component';\nimport { FieldSetComponent } from './components/form/fieldset/fieldset.component';\nimport { FooterComponent } from './components/footer/footer.component';\nimport { FormComponent } from './components/form/form/form.component';\nimport { GridComponent } from './components/grid/grid/grid.component';\nimport { GridItemComponent } from './components/grid/grid-item/grid-item.component';\nimport { GuidanceComponent } from './components/form/guidance/guidance.component';\nimport { HeadingComponent } from './components/typography/heading/heading.component';\nimport { HorizontalRuleComponent } from './components/horizontal-rule/horizontal-rule.component';\nimport { IconComponent } from './components/icon/icon.component';\nimport { IconButtonComponent } from './components/icon-button/icon-button.component';\nimport { LoadingSpinnerComponent } from './components/loading-spinner/loading-spinner.component';\nimport { LocalizedTextGroupComponent } from './components/form/localized-text-group/localized-text-group.component';\nimport { LabelComponent } from './components/form/label/label.component';\nimport { LanguageBadgeComponent } from './components/language-badge-group/language-badge/language-badge.component';\nimport { LanguageBadgeGroupComponent } from './components/language-badge-group/language-badge-group.component';\nimport { MultiselectChipListComponent } from './components/form/select/multiselect/multiselect-chip-list/multiselect-chip-list.component';\nimport { MultiselectComponent } from './components/form/select/multiselect/multiselect.component';\nimport { MultiselectOptionComponent } from './components/form/select/multiselect/multiselect-option/multiselect-option.component';\nimport { NotificationComponent } from './components/notification/notification.component';\nimport { PaginationComponent } from './components/pagination/pagination.component';\nimport { RadioButtonComponent } from './components/form/radio-button-group/radio-button/radio-button.component';\nimport { RadioButtonGroupComponent } from './components/form/radio-button-group/radio-button-group.component';\nimport { SectionComponent } from './components/section/section.component';\nimport { SelectComponent } from './components/form/select/select/select.component';\nimport { SelectOptionComponent } from './components/form/select/select/select-option/select-option.component';\nimport { SelectDropdownComponent } from './components/form/select/common/select-dropdown/select-dropdown.component';\nimport { SelectGroupComponent } from './components/form/select/common/select-group/select-group.component';\nimport { SelectIconsComponent } from './components/form/select/common/select-icons/select-icons.component';\nimport { TabNavigationBarComponent } from './components/tab-navigation/tab-navigation-bar.component';\nimport { TabNavigationPanelComponent } from './components/tab-navigation/tab-navigation-panel.component';\nimport { TabNavigationTabComponent } from './components/tab-navigation/tab-navigation-tab.component';\nimport { TextAreaComponent } from './components/form/text-area/text-area.component';\nimport { TextInputComponent } from './components/form/text-input/text-input.component';\nimport { ValidatorErrorMessageComponent } from './components/form/error-message/validator-error-message/validator-error-message.component';\n\n/**\n * Fudis Directives\n */\nimport { ControlComponentBaseDirective } from './directives/form/control-component-base/control-component-base.directive';\nimport {\n DateEndDirective,\n DateStartDirective,\n} from './directives/form/datepicker/datepicker.directive';\nimport {\n DialogCloseDirective,\n DialogContentDirective,\n DialogTitleDirective,\n DialogActionsDirective,\n} from './components/dialog/dialog-directives';\nimport { DropdownBaseDirective } from './directives/form/dropdown-base/dropdown-base.directive';\nimport { DropdownItemBaseDirective } from './directives/form/dropdown-item-base/dropdown-item-base.directive';\nimport {\n ExpandableActionsDirective,\n ExpandableContentDirective,\n} from './components/expandable/expandable-content.directive';\nimport { ErrorMessageDirective } from './components/form/error-message/error-message/error-message.directive';\nimport {\n FieldsetActionsDirective,\n FieldsetContentDirective,\n} from './components/form/fieldset/fieldset-content.directive';\nimport { FormCommonApiDirective } from './directives/form/form-common-api/form-common-api.directive';\nimport { FormSubmitDirective } from './directives/form/form-actions/form-actions.directive';\nimport {\n FormActionsDirective,\n FormContentDirective,\n FormHeaderDirective,\n} from './components/form/form/form-content.directive';\nimport { GridApiDirective } from './directives/grid/grid-api/grid-api.directive';\nimport { GridDirective } from './directives/grid/grid/grid.directive';\nimport { GridItemDirective } from './directives/grid/grid-item/grid-item.directive';\nimport { GroupComponentBaseDirective } from './directives/form/group-component-base/group-component-base.directive';\nimport { LinkDirective } from './directives/link/link.directive';\nimport {\n SectionActionsDirective,\n SectionContentDirective,\n} from './components/section/section-content.directive';\nimport { SelectBaseDirective } from './components/form/select/common/select-base/select-base.directive';\nimport {\n SelectAutocompleteDirective,\n SelectAutocompleteBaseDirective,\n MultiselectAutocompleteDirective,\n} from './components/form/select/common/autocomplete/autocomplete.directive';\nimport {\n SelectControlValueAccessorDirective,\n MultiselectControlValueAccessorDirective,\n} from './components/form/select/common/select-control-value-accessor/select-control-value-accessor.directive';\nimport { SelectOptionBaseDirective } from './components/form/select/common/select-option-base/select-option-base.directive';\nimport { SelectOptionsDirective } from './components/form/select/common/select-options-directive/select-options.directive';\nimport { TextFieldComponentBaseDirective } from './directives/form/text-field-component-base/text-field-component-base.directive';\n\n/**\n * Fudis Services\n */\nimport { FudisAlertService } from './services/alert/alert.service';\nimport { FudisBreakpointService } from './services/breakpoint/breakpoint.service';\nimport { FudisDialogService } from './services/dialog/dialog.service';\nimport { FudisFocusService } from './services/focus/focus.service';\nimport { FudisErrorSummaryService } from './services/form/error-summary/error-summary.service';\nimport { FudisGridService } from './services/grid/grid.service';\nimport { FudisIdService } from './services/id/id.service';\nimport { FudisInternalErrorSummaryService } from './services/form/error-summary/internal-error-summary.service';\nimport { FudisTranslationService } from './services/translation/translation.service';\nimport { PopoverDirective } from './directives/popover/popover.directive';\n\n@NgModule({\n /*\n * Include imports outside of Fudis components in 'imports' array below, e.g. Angular Material components and other Angular tools.\n * Also import Fudis standalone components here.\n */\n imports: [\n AlertComponent,\n AlertGroupComponent,\n BadgeComponent,\n BodyTextComponent,\n BreadcrumbsComponent,\n BreadcrumbsItemComponent,\n ButtonComponent,\n CheckboxComponent,\n CheckboxGroupComponent,\n CheckboxGroupOptionComponent,\n CommonModule,\n ControlComponentBaseDirective,\n DatepickerComponent,\n DateRangeComponent,\n DateEndDirective,\n DateStartDirective,\n DescriptionListComponent,\n DescriptionListItemComponent,\n DescriptionListItemDetailsComponent,\n DescriptionListItemTermComponent,\n DialogActionsDirective,\n DialogCloseDirective,\n DialogComponent,\n DialogContentDirective,\n DialogTitleDirective,\n DropdownBaseDirective,\n DropdownItemBaseDirective,\n DropdownMenuComponent,\n DropdownMenuGroupComponent,\n DropdownMenuItemComponent,\n ErrorMessageDirective,\n ErrorSummaryComponent,\n ExpandableActionsDirective,\n ExpandableComponent,\n ExpandableContentDirective,\n FieldSetComponent,\n FieldsetActionsDirective,\n FieldsetContentDirective,\n FooterComponent,\n FormActionsDirective,\n FormCommonApiDirective,\n FormComponent,\n FormContentDirective,\n FormHeaderDirective,\n FormSubmitDirective,\n FormsModule,\n GridApiDirective,\n GridComponent,\n GridDirective,\n GridItemComponent,\n GridItemDirective,\n GroupComponentBaseDirective,\n GuidanceComponent,\n HeadingComponent,\n HorizontalRuleComponent,\n IconButtonComponent,\n IconComponent,\n LabelComponent,\n LanguageBadgeComponent,\n LanguageBadgeGroupComponent,\n LayoutModule,\n LinkDirective,\n LoadingSpinnerComponent,\n LocalizedTextGroupComponent,\n MatButtonModule,\n MatDatepickerModule,\n MatDialogModule,\n MatFormFieldModule,\n MatInputModule,\n MatNativeDateModule,\n MultiselectAutocompleteDirective,\n MultiselectChipListComponent,\n MultiselectComponent,\n MultiselectControlValueAccessorDirective,\n MultiselectOptionComponent,\n NotificationComponent,\n PaginationComponent,\n PopoverDirective,\n RadioButtonComponent,\n RadioButtonGroupComponent,\n ReactiveFormsModule,\n RouterModule,\n ScrollingModule,\n SectionActionsDirective,\n SectionComponent,\n SectionContentDirective,\n SelectAutocompleteBaseDirective,\n SelectAutocompleteDirective,\n SelectBaseDirective,\n SelectComponent,\n SelectControlValueAccessorDirective,\n SelectDropdownComponent,\n SelectGroupComponent,\n SelectIconsComponent,\n SelectOptionBaseDirective,\n SelectOptionComponent,\n SelectOptionsDirective,\n TabNavigationBarComponent,\n TabNavigationPanelComponent,\n TabNavigationTabComponent,\n TextAreaComponent,\n TextFieldComponentBaseDirective,\n TextInputComponent,\n ValidatorErrorMessageComponent,\n ],\n /*\n * Add Fudis components, including all standalone components, in 'exports' array below.\n * Export them in public-api.ts as well, when you want to expose them outside of the library.\n */\n exports: [\n AlertComponent,\n AlertGroupComponent,\n BadgeComponent,\n BodyTextComponent,\n BreadcrumbsComponent,\n BreadcrumbsItemComponent,\n ButtonComponent,\n CheckboxComponent,\n CheckboxGroupComponent,\n CheckboxGroupOptionComponent,\n DatepickerComponent,\n DateRangeComponent,\n DateStartDirective,\n DateEndDirective,\n DescriptionListComponent,\n DescriptionListItemComponent,\n DescriptionListItemTermComponent,\n DescriptionListItemDetailsComponent,\n DialogComponent,\n DialogTitleDirective,\n DialogContentDirective,\n DialogCloseDirective,\n DialogActionsDirective,\n DropdownMenuGroupComponent,\n DropdownMenuComponent,\n DropdownMenuItemComponent,\n ErrorMessageDirective,\n ExpandableComponent,\n ExpandableActionsDirective,\n ExpandableContentDirective,\n FooterComponent,\n FieldsetActionsDirective,\n FieldsetContentDirective,\n FieldSetComponent,\n FormComponent,\n FormActionsDirective,\n FormContentDirective,\n FormHeaderDirective,\n FormSubmitDirective,\n GridComponent,\n GridDirective,\n GridItemComponent,\n GridItemDirective,\n HeadingComponent,\n HorizontalRuleComponent,\n IconComponent,\n IconButtonComponent,\n LocalizedTextGroupComponent,\n LanguageBadgeGroupComponent,\n LinkDirective,\n LoadingSpinnerComponent,\n MultiselectComponent,\n MultiselectOptionComponent,\n NotificationComponent,\n PaginationComponent,\n PopoverDirective,\n RadioButtonComponent,\n RadioButtonGroupComponent,\n SectionComponent,\n SectionActionsDirective,\n SectionContentDirective,\n SelectComponent,\n SelectOptionComponent,\n SelectOptionsDirective,\n SelectGroupComponent,\n TabNavigationBarComponent,\n TabNavigationPanelComponent,\n TabNavigationTabComponent,\n TextAreaComponent,\n TextInputComponent,\n ],\n providers: [\n FudisInternalErrorSummaryService,\n FudisDialogService,\n FudisBreakpointService,\n FudisErrorSummaryService,\n FudisAlertService,\n ],\n})\nexport class NgxFudisModule {\n static forRoot(): ModuleWithProviders<NgxFudisModule> {\n return {\n ngModule: NgxFudisModule,\n providers: [FudisFocusService, FudisGridService, FudisIdService, FudisTranslationService],\n };\n }\n}\n","export const fudisIconArray = [\n 'achievement',\n 'achievement-small',\n 'alert',\n 'alert-fill',\n 'alert-small',\n 'archive',\n 'arrow-big',\n 'arrow-dashed',\n 'arrow-solid',\n 'back',\n 'brochure',\n 'bullets',\n 'calendar',\n 'change-log',\n 'check',\n 'check-indeterminate-small',\n 'check-small',\n 'checkmark-circle',\n 'chevron',\n 'chevron-ring',\n 'chevron-ring-fill',\n 'clock',\n 'close',\n 'close-big',\n 'code',\n 'decrease-indent',\n 'delete',\n 'dot',\n 'edit',\n 'editor',\n 'exclamation-mark-circle',\n 'exclamation-mark-circle-fill',\n 'exclamation-mark-circle-small',\n 'eye',\n 'eye-blind',\n 'fail',\n 'hourglass',\n 'increase-indent',\n 'info',\n 'info-circle',\n 'info-circle-fill',\n 'info-circle-small',\n 'junction',\n 'link',\n 'list-add',\n 'list-minus',\n 'lock',\n 'lock-open',\n 'magic-wand',\n 'mail',\n 'menu',\n 'message',\n 'minus',\n 'minus-ring-fill',\n 'new-tab',\n 'notebook',\n 'notification',\n 'numbering',\n 'paperclip',\n 'pdf',\n 'people',\n 'person',\n 'person-small',\n 'picker',\n 'pin-small',\n 'place',\n 'place-ring-fill',\n 'plus',\n 'print',\n 'question-mark',\n 'question-mark-small',\n 'required',\n 'ring-close',\n 'ring-close-fill',\n 'ring-plus',\n 'ring-plus-fill',\n 'rosette',\n 'rule',\n 'search',\n 'seats',\n 'settings',\n 'shopping-cart',\n 'sorter',\n 'star',\n 'switch',\n 'three-dots',\n 'three-dots-small',\n 'waiting-approval',\n 'waiting-decline',\n 'zoom-in',\n 'zoom-out',\n] as const;\n\nexport type FudisIcon = (typeof fudisIconArray)[number];\n\nexport const fudisIconColorArray = [\n 'yellow',\n 'red',\n 'gray-dark',\n 'gray-light',\n 'primary',\n 'primary-dark',\n 'green',\n 'white',\n] as const;\n\nexport type FudisIconColor = (typeof fudisIconColorArray)[number];\n\nexport const fudisIconRotateArray = ['flip-180', 'cw-90', 'ccw-90', 'none'] as const;\n\nexport type FudisIconRotate = (typeof fudisIconRotateArray)[number];\n","/**\n * File containing types used in FudisIdService\n */\n\nexport const fudisIdComponents = [\n 'alert',\n 'autocomplete',\n 'body-text',\n 'button',\n 'checkbox',\n 'autocomplete-multi-select',\n 'datepicker',\n 'dialog',\n 'dropdown',\n 'error-message',\n 'expandable',\n 'fieldset',\n 'form',\n 'guidance',\n 'heading',\n 'localized-text-group',\n 'link',\n 'section',\n 'text-area',\n 'text-input',\n 'validator-error-message',\n 'pagination',\n 'popover',\n] as const;\n\nexport const fudisIdParents = [\n 'breadcrumbs',\n 'checkbox-group',\n 'language-badge-group',\n 'radio-button-group',\n] as const;\n\nexport const fudisIdGrandParents = [\n 'description-list',\n 'select',\n 'multiselect',\n 'dropdown-menu',\n] as const;\n\nexport type FudisIdComponent = (typeof fudisIdComponents)[number];\n\nexport type FudisIdParent = (typeof fudisIdParents)[number];\n\nexport type FudisIdGrandParent = (typeof fudisIdGrandParents)[number];\n\n/**\n * Select and Multiselect component ids and its grouped and non-grouped options\n */\nexport type FudisIdSelectFamily = {\n id: string;\n nonGroupedOptions: string[];\n groups: {\n [groupId: string]: string[];\n };\n};\n\n/**\n * Description List Item component id and its child term and details ids\n */\nexport type FudisIdDlItem = {\n term: string[];\n details: string[];\n};\n\n/**\n * Description List component id and its child items\n */\nexport type FudisIdDlFamily = {\n id: string;\n items: {\n [itemId: string]: FudisIdDlItem;\n };\n};\n\n/**\n * Dropdown Menu component id and its grouped and non-grouped items\n */\nexport type FudisIdDropdownMenuFamily = {\n id: string;\n nonGroupedOptions: string[];\n groups: {\n [groupId: string]: string[];\n };\n};\n\n/**\n * Collection of all ids\n */\nexport type FudisIdData = {\n components: {\n [key in FudisIdComponent]: string[];\n };\n parents: {\n [key in FudisIdParent]: {\n [parentId: string]: string[];\n };\n };\n grandParents: {\n 'description-list': {\n [parentId: string]: FudisIdDlFamily;\n };\n 'dropdown-menu': {\n [parentId: string]: FudisIdDropdownMenuFamily;\n };\n select: {\n [parentId: string]: FudisIdSelectFamily;\n };\n multiselect: {\n [parentId: string]: FudisIdSelectFamily;\n };\n };\n};\n","import { SimpleChange } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n/**\n * Alert\n */\nexport const fudisAlertPositionArray = ['static', 'absolute', 'fixed'] as const;\nexport type FudisAlertPosition = (typeof fudisAlertPositionArray)[number];\n\nexport interface FudisAlert {\n message: Observable<string>;\n type: FudisNotification;\n id: string;\n}\n\nexport interface FudisAlertElement extends FudisAlert {\n htmlId: string;\n buttonId: string;\n initialFocus: boolean;\n}\n\n/**\n * Badge\n */\nexport const fudisBadgeVariantArray = [\n 'accent',\n 'danger',\n 'primary',\n 'secondary',\n 'success',\n] as const;\nexport type FudisBadgeVariant = (typeof fudisBadgeVariantArray)[number];\n\n/**\n * Button\n */\nexport const fudisButtonVariantArray = ['primary', 'secondary', 'tertiary'] as const;\nexport type FudisButtonVariant = (typeof fudisButtonVariantArray)[number];\n\nexport const fudisButtonSizeArray = ['extra-small', 'small', 'medium'] as const;\nexport type FudisButtonSize = (typeof fudisButtonSizeArray)[number];\n\nexport const fudisButtonTypeArray = ['submit', 'button'] as const;\nexport type FudisButtonType = (typeof fudisButtonTypeArray)[number];\n\n/**\n * Description List\n */\nexport type FudisDescriptionListVariant = 'regular' | 'compact';\n\nexport type FudisDescriptionListItemDetailLanguageContent = {\n [lang in FudisLanguageAbbr]?: { [id: string]: string | null | undefined };\n};\n\n/**\n * Dialog\n */\nexport const fudisDialogSizeArray = ['xs', 'sm', 'md', 'lg', 'xl'] as const;\nexport type FudisDialogSize = (typeof fudisDialogSizeArray)[number];\n\n/**\n * Dropdown Menu\n */\nexport const fudisDropdownMenuAlignArray = ['left', 'center', 'right'] as const;\nexport type FudisDropdownMenuAlign = (typeof fudisDropdownMenuAlignArray)[number];\n\n/**\n * Expandable\n */\nexport type FudisExpandableType = 'regular' | 'lite';\n\n/**\n * FieldsetActions\n */\nexport const fudisFieldsetActionsAlignArray = ['start', 'below', 'end'] as const;\nexport type fudisFieldsetActionsAlign = (typeof fudisFieldsetActionsAlignArray)[number];\n\n/**\n * Language Badge\n */\nexport type FudisLanguageAbbr = 'fi' | 'sv' | 'en';\n\n/**\n * Notification\n */\nexport const fudisNotificationVariantArray = ['warning', 'danger', 'success', 'info'] as const;\nexport type FudisNotification = (typeof fudisNotificationVariantArray)[number];\n\nexport type FudisPopoverPosition = 'left' | 'right' | 'above' | 'below';\n\n/**\n * Types for extending ngOnChanges SimpleChanges type\n *\n * - T = any FudisComponent which have @Input() properties\n * - P = property of component. E. g. for Grid columns and rowGap or for Heading level and size.\n * - So T[P] translates to e.g. HeadingComponent['level'] --> HeadingComponent.level --> values from\n * 1-6\n */\ninterface FudisComponentChange<T, P extends keyof T> extends SimpleChange {\n previousValue: T[P] | undefined;\n currentValue: T[P] | undefined;\n firstChange: boolean;\n}\n\nexport type FudisComponentChanges<T> = {\n [P in keyof T]?: FudisComponentChange<T, P>;\n};\n","export const fudisHeadingLevelArray = [1, 2, 3, 4, 5, 6] as const;\n\nexport type FudisHeadingLevel = (typeof fudisHeadingLevelArray)[number];\n\nexport const fudisHeadingVariantArray = ['xxs', 'xs', 'sm', 'md', 'lg', 'xl', 'xxl'] as const;\n\nexport type FudisHeadingVariant = (typeof fudisHeadingVariantArray)[number];\n\nexport const fudisBodyTextArray = [\n 'lg-regular',\n 'md-regular',\n 'sm-regular',\n 'lg-light',\n 'md-light',\n] as const;\n\nexport type FudisBodyText = (typeof fudisBodyTextArray)[number];\n\nexport const fudisTextAlignArray = ['left', 'right', 'center'] as const;\n\nexport type FudisTextAlign = (typeof fudisTextAlignArray)[number];\n","import { AbstractControl, FormGroup } from '@angular/forms';\nimport {\n FudisGroupValidatorsMinMaxSettings,\n FudisValidationErrors,\n FudisValidatorFn,\n FudisValidatorMessage,\n} from '../../types/validators';\n\n/**\n * Form Group Validators\n */\nexport const FudisGroupValidators = {\n oneRequired,\n min,\n max,\n};\n\n/**\n * At least one option must be selected from a group\n */\nfunction oneRequired(message: FudisValidatorMessage): FudisValidatorFn {\n return (controlGroup: AbstractControl): FudisValidationErrors | null => {\n const { controls } = controlGroup as FormGroup;\n\n if (controls) {\n const theOne = Object.keys(controls).find(\n (key) =>\n controls[key].value !== null &&\n controls[key].value !== '' &&\n controls[key].value !== false &&\n controls[key].value !== undefined,\n );\n\n if (!theOne) {\n return {\n oneRequired: { message },\n };\n }\n }\n return null;\n };\n}\n\n/**\n * Minimum selected options of a group\n */\nfunction min(settings: FudisGroupValidatorsMinMaxSettings): FudisValidatorFn {\n return (controlGroup: AbstractControl): FudisValidationErrors | null => {\n const { controls } = controlGroup as FormGroup;\n let amountOfSelected = 0;\n\n if (controls) {\n Object.keys(controls).forEach((key) => {\n if (controls[key].value) {\n amountOfSelected += 1;\n }\n });\n\n if (amountOfSelected < settings.value) {\n return {\n min: { message: settings.message, value: settings.value },\n };\n }\n }\n return null;\n };\n}\n\n/**\n * Maximum selected options of a group\n */\nfunction max(settings: FudisGroupValidatorsMinMaxSettings): FudisValidatorFn {\n return (controlGroup: AbstractControl): FudisValidationErrors | null => {\n const { controls } = controlGroup as FormGroup;\n let amountOfSelected = 0;\n\n if (controls) {\n Object.keys(controls).forEach((key) => {\n if (controls[key].value) {\n amountOfSelected += 1;\n }\n });\n\n if (amountOfSelected > settings.value) {\n return {\n max: { message: settings.message, value: settings.value },\n };\n }\n }\n return null;\n };\n}\n","import { AbstractControl, Validators } from '@angular/forms';\nimport {\n FudisValidatorFn,\n FudisValidatorMessage,\n FudisValidatorsDatepickerSettings,\n} from '../../types/validators';\n\n/**\n * Form Control Validators\n */\nexport const FudisValidators = {\n required,\n email,\n maxLength,\n minLength,\n max,\n min,\n pattern,\n datepickerMin,\n datepickerMax,\n};\n\n/**\n * Fudis version of Validators.required\n */\nfunction required(message: FudisValidatorMessage): FudisValidatorFn {\n return (control: AbstractControl) => {\n if (!Validators.required(control)) {\n return null;\n }\n return { required: { message } };\n };\n}\n\n/**\n * Fudis version of Validators.email\n */\nfunction email(message: FudisValidatorMessage): FudisValidatorFn {\n return (control: AbstractControl) => {\n if (!Validators.email(control)) {\n return null;\n }\n return { email: { message } };\n };\n}\n\n/**\n * Fudis version of Validators.maxLength\n */\nfunction maxLength(length: number, message: FudisValidatorMessage): FudisValidatorFn {\n return (control: AbstractControl) => {\n if (!Validators.maxLength(length)(control) || length < 1) {\n return null;\n }\n return { maxlength: { message, requiredLength: length } };\n };\n}\n\n/**\n * Fudis version of Validators.minLength\n *\n * @param length\n * @param message\n * @param valueRequired By default this validator does not require, that control value cannot be\n * empty. If set true, validator returns error, if control value is falsy.\n */\nfunction minLength(\n length: number,\n message: FudisValidatorMessage,\n valueRequired: boolean = false,\n): FudisValidatorFn {\n return (control: AbstractControl) => {\n const requiredError = valueRequired && Validators.required(control);\n if ((!Validators.minLength(length)(control) || length < 1) && !requiredError) {\n return null;\n }\n return {\n minlength: {\n message,\n requiredLength: length,\n },\n };\n };\n}\n\n/**\n * Fudis version of Validators.min\n */\nfunction min(minValue: number, message: FudisValidatorMessage): FudisValidatorFn {\n return (control: AbstractControl) => {\n if (!Validators.min(minValue)(control)) {\n return null;\n }\n return {\n min: {\n message,\n min: minValue,\n },\n };\n };\n}\n\n/**\n * Fudis version of Validators.max\n */\nfunction max(maxValue: number, message: FudisValidatorMessage): FudisValidatorFn {\n return (control: AbstractControl) => {\n if (!Validators.max(maxValue)(control)) {\n return null;\n }\n return {\n max: {\n message,\n max: maxValue,\n },\n };\n };\n}\n\n/**\n * Fudis version of Validators.pattern\n */\nfunction pattern(regex: string | RegExp, message: FudisValidatorMessage): FudisValidatorFn {\n return (control: AbstractControl) => {\n if (!Validators.pattern(regex)(control)) {\n return null;\n }\n\n return {\n pattern: {\n message,\n },\n };\n };\n}\n\n/**\n * Min date validator for Datepicker\n */\nfunction datepickerMin(settings: FudisValidatorsDatepickerSettings) {\n return (control: AbstractControl) => {\n const simplifiedMinDate = settings.value.setHours(0, 0, 0, 0);\n const simplifiedControlDate = control.value?.setHours(0, 0, 0, 0);\n\n if (simplifiedMinDate > simplifiedControlDate) {\n return {\n datepickerMin: {\n message: settings.message,\n value: settings.value,\n },\n };\n }\n\n return null;\n };\n}\n\n/**\n * Max date validator for Datepicker\n */\nfunction datepickerMax(settings: FudisValidatorsDatepickerSettings) {\n return (control: AbstractControl) => {\n const simplifiedMaxDate = settings.value.setHours(0, 0, 0, 0);\n const simplifiedControlDate = control.value?.setHours(0, 0, 0, 0);\n\n if (simplifiedMaxDate < simplifiedControlDate) {\n return {\n datepickerMax: {\n message: settings.message,\n value: settings.value,\n },\n };\n }\n\n return null;\n };\n}\n","/*\n * Public API Surface of ngx-fudis\n * Include component/directive/service/validator to the list below, when you want to expose it outside.\n * If you create new type files, export them from the types/types.ts file. The types file is already exported from here.\n */\n\nexport * from './lib/ngx-fudis.module';\n\n/**\n * COMPONENTS\n */\nexport { AlertComponent } from './lib/components/alert/alert/alert.component';\nexport { AlertGroupComponent } from './lib/components/alert/alert-group/alert-group.component';\nexport { BadgeComponent } from './lib/components/badge/badge.component';\nexport { BodyTextComponent } from './lib/components/typography/body-text/body-text.component';\nexport { BreadcrumbsComponent } from './lib/components/breadcrumbs/breadcrumbs.component';\nexport { BreadcrumbsItemComponent } from './lib/components/breadcrumbs/breadcrumbs-item/breadcrumbs-item.component';\nexport { ButtonComponent } from './lib/components/button/button.component';\nexport { CheckboxComponent } from './lib/components/form/checkbox/checkbox.component';\nexport { CheckboxGroupComponent } from './lib/components/form/checkbox-group/checkbox-group.component';\nexport { CheckboxGroupOptionComponent } from './lib/components/form/checkbox-group/checkbox-group-option/checkbox-group-option.component';\nexport { DatepickerComponent } from './lib/components/form/date/datepicker/datepicker.component';\nexport { DateRangeComponent } from './lib/components/form/date/date-range/date-range.component';\nexport { DescriptionListComponent } from './lib/components/description-list/description-list.component';\nexport { DescriptionListItemComponent } from './lib/components/description-list/description-list-item/description-list-item.component';\nexport { DescriptionListItemDetailsComponent } from './lib/components/description-list/description-list-item/description-list-item-details/description-list-item-details.component';\nexport { DescriptionListItemTermComponent } from './lib/components/description-list/description-list-item/description-list-item-term/description-list-item-term.component';\nexport { DialogComponent } from './lib/components/dialog/dialog.component';\nexport { DropdownMenuGroupComponent } from './lib/components/dropdown-menu/dropdown-menu-group/dropdown-menu-group.component';\nexport { DropdownMenuComponent } from './lib/components/dropdown-menu/dropdown-menu.component';\nexport { DropdownMenuItemComponent } from './lib/components/dropdown-menu/dropdown-menu-item/dropdown-menu-item.component';\nexport { ExpandableComponent } from './lib/components/expandable/expandable.component';\nexport { FieldSetComponent } from './lib/components/form/fieldset/fieldset.component';\nexport { FooterComponent } from './lib/components/footer/footer.component';\nexport { FormComponent } from './lib/components/form/form/form.component';\nexport { GridComponent } from './lib/components/grid/grid/grid.component';\nexport { GridItemComponent } from './lib/components/grid/grid-item/grid-item.component';\nexport { HorizontalRuleComponent } from './lib/components/horizontal-rule/horizontal-rule.component';\nexport { HeadingComponent } from './lib/components/typography/heading/heading.component';\nexport { IconButtonComponent } from './lib/components/icon-button/icon-button.component';\nexport { IconComponent } from './lib/components/icon/icon.component';\nexport { LanguageBadgeGroupComponent } from './lib/components/language-badge-group/language-badge-group.component';\nexport { LoadingSpinnerComponent } from './lib/components/loading-spinner/loading-spinner.component';\nexport { LocalizedTextGroupComponent } from './lib/components/form/localized-text-group/localized-text-group.component';\nexport { MultiselectComponent } from './lib/components/form/select/multiselect/multiselect.component';\nexport { MultiselectOptionComponent } from './lib/components/form/select/multiselect/multiselect-option/multiselect-option.component';\nexport { NotificationComponent } from './lib/components/notification/notification.component';\nexport { PaginationComponent } from './lib/components/pagination/pagination.component';\nexport { RadioButtonComponent } from './lib/components/form/radio-button-group/radio-button/radio-button.component';\nexport { RadioButtonGroupComponent } from './lib/components/form/radio-button-group/radio-button-group.component';\nexport { SectionComponent } from './lib/components/section/section.component';\nexport { SelectComponent } from './lib/components/form/select/select/select.component';\nexport { SelectGroupComponent } from './lib/components/form/select/common/select-group/select-group.component';\nexport { SelectOptionComponent } from './lib/components/form/select/select/select-option/select-option.component';\nexport { TabNavigationBarComponent } from './lib/components/tab-navigation/tab-navigation-bar.component';\nexport { TabNavigationPanelComponent } from './lib/components/tab-navigation/tab-navigation-panel.component';\nexport { TabNavigationTabComponent } from './lib/components/tab-navigation/tab-navigation-tab.component';\nexport { TextAreaComponent } from './lib/components/form/text-area/text-area.component';\nexport { TextInputComponent } from './lib/components/form/text-input/text-input.component';\n\n/**\n * DIRECTIVES\n */\nexport {\n DateStartDirective,\n DateEndDirective,\n} from './lib/directives/form/datepicker/datepicker.directive';\nexport {\n DialogActionsDirective,\n DialogCloseDirective,\n DialogContentDirective,\n DialogTitleDirective,\n} from './lib/components/dialog/dialog-directives';\nexport { ErrorMessageDirective } from './lib/components/form/error-message/error-message/error-message.directive';\nexport {\n ExpandableActionsDirective,\n ExpandableContentDirective,\n} from './lib/components/expandable/expandable-content.directive';\nexport {\n FieldsetContentDirective,\n FieldsetActionsDirective,\n} from './lib/components/form/fieldset/fieldset-content.directive';\nexport {\n FormActionsDirective,\n FormContentDirective,\n FormHeaderDirective,\n} from './lib/components/form/form/form-content.directive';\nexport { FormSubmitDirective } from './lib/directives/form/form-actions/form-actions.directive';\nexport { GridDirective } from './lib/directives/grid/grid/grid.directive';\nexport { GridItemDirective } from './lib/directives/grid/grid-item/grid-item.directive';\nexport { LinkDirective } from './lib/directives/link/link.directive';\nexport { SectionActionsDirective } from './lib/components/section/section-content.directive';\nexport { SectionContentDirective } from './lib/components/section/section-content.directive';\nexport { SelectOptionsDirective } from './lib/components/form/select/common/select-options-directive/select-options.directive';\nexport { PopoverDirective } from './lib/directives/popover/popover.directive';\n\n/**\n * SERVICES\n */\nexport { FudisAlertService } from './lib/services/alert/alert.service';\nexport { FudisBreakpointService } from './lib/services/breakpoint/breakpoint.service';\nexport { FudisDialogService } from './lib/services/dialog/dialog.service';\nexport { FudisErrorSummaryService } from './lib/services/form/error-summary/error-summary.service';\nexport { FudisGridService } from './lib/services/grid/grid.service';\nexport { FudisTranslationService } from './lib/services/translation/translation.service';\n\n/**\n * TYPES\n */\nexport * from './lib/types/types';\n\n/**\n * VALIDATORS\n */\nexport { FudisGroupValidators } from './lib/utilities/form/groupValidators';\nexport { FudisValidators } from './lib/utilities/form/validators';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.FudisTranslationService","i2.FudisIdService","i1.FudisIdService","i2.BreadcrumbsComponent","i1.BreadcrumbsItemComponent","i2.FudisAlertService","i3.FudisFocusService","i4.FudisDialogService","i1.FudisAlertService","i2.FudisTranslationService","i3.FudisDialogService","i2","required","maxLength","minLength","max","min","i3","i2.FudisFocusService","i1.FudisInternalErrorSummaryService","i3.FudisInternalErrorSummaryService","i1.FudisGridService","i2.FudisBreakpointService","i2.DropdownEventService","i2.FudisInternalErrorSummaryService","i4.FudisIdService","i2.CheckboxGroupComponent","i1.DateRangeComponent","i3.FudisTranslationService","i5.FudisDialogService","i6.FudisIdService","i7.FudisFocusService","i8","i2.DescriptionListComponent","i3.DescriptionListItemComponent","i4.DescriptionListComponent","this","i2.FudisDialogService","i3.FudisIdService","i4.IconButtonComponent","i2.DropdownMenuComponent","i3.DropdownMenuComponent","i4.DropdownMenuGroupComponent","i1.FudisFocusService","i3.DialogComponent","i4","i1.FudisBreakpointService","i1.FudisDialogService","i4.FudisFocusService","i5","i2.SelectComponent","i3.MultiselectComponent","i1.SelectGroupComponent","i1.SelectComponent","i2.SelectGroupComponent","i1.MultiselectComponent","i4.FudisTranslationService","i2.RadioButtonGroupComponent","i1.DatepickerComponent","i4.TextInputComponent","i5.TextAreaComponent","i6.DatepickerComponent","i7.LocalizedTextGroupComponent","i8.CheckboxGroupComponent","i9.SelectComponent","i10.MultiselectComponent","i11.RadioButtonGroupComponent","i1.ButtonComponent"],"mappings":"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"}