UNPKG

@funnelback/ng-sds

Version:

`@funnelback/ng-sds` is Bootstrap 5 based library that aims to implement the [Squiz Design System specification](https://designsystem.squiz.net/) in Angular.

1 lines 274 kB
{"version":3,"file":"funnelback-ng-sds.mjs","sources":["../../../projects/sds/src/lib/icon/icon.component.ts","../../../projects/sds/src/lib/icon/icon-wrapper.component.ts","../../../projects/sds/src/lib/icon/icon-wrapper.component.html","../../../projects/sds/src/lib/icon/icon.module.ts","../../../projects/sds/src/lib/alert/alert.component.ts","../../../projects/sds/src/lib/alert/alert.component.html","../../../projects/sds/src/lib/alert/alert.module.ts","../../../projects/sds/src/lib/badge/badge.component.ts","../../../projects/sds/src/lib/badge/badge.component.html","../../../projects/sds/src/lib/badge/badge-combination/badge-combination.component.ts","../../../projects/sds/src/lib/badge/badge-combination/badge-combination.component.html","../../../projects/sds/src/lib/badge/badge.module.ts","../../../projects/sds/src/lib/utils/element-util.ts","../../../projects/sds/src/lib/button/button.directive.ts","../../../projects/sds/src/lib/button/button.module.ts","../../../projects/sds/src/lib/utils/navigation.component.ts","../../../projects/sds/src/lib/card/card.component.ts","../../../projects/sds/src/lib/card/card.component.html","../../../projects/sds/src/lib/card/card.module.ts","../../../projects/sds/src/lib/utils/form-control.directive.ts","../../../projects/sds/src/lib/checkbox/checkbox-control/checkbox-control.directive.ts","../../../projects/sds/src/lib/checkbox/checkbox.component.ts","../../../projects/sds/src/lib/checkbox/checkbox.component.html","../../../projects/sds/src/lib/checkbox/checkbox.module.ts","../../../projects/sds/src/lib/counter/counter.directive.ts","../../../projects/sds/src/lib/counter/counter.module.ts","../../../projects/sds/src/lib/dropdown/dropdown.module.ts","../../../projects/sds/src/lib/form/form-error/form-error.component.ts","../../../projects/sds/src/lib/form/form-error/form-error.component.html","../../../projects/sds/src/lib/form/form-helper/form-helper.component.ts","../../../projects/sds/src/lib/form/form-helper/form-helper.component.html","../../../projects/sds/src/lib/form/form.module.ts","../../../projects/sds/src/lib/file-uploader/file-uploader-control.directive.ts","../../../projects/sds/src/lib/file-uploader/file-uploader.component.ts","../../../projects/sds/src/lib/file-uploader/file-uploader.component.html","../../../projects/sds/src/lib/file-uploader/file-uploader.module.ts","../../../projects/sds/src/lib/layout/layout.service.ts","../../../projects/sds/src/lib/layout/layout-type.service.ts","../../../projects/sds/src/lib/layout/layout.model.ts","../../../projects/sds/src/lib/layout/breakpoint-type.service.ts","../../../projects/sds/src/lib/layout/view-type.service.ts","../../../projects/sds/src/lib/layout/layout.module.ts","../../../projects/sds/src/lib/link/sds-link.directive.ts","../../../projects/sds/src/lib/link/paragraph-link.directive.ts","../../../projects/sds/src/lib/link/standalone-link.directive.ts","../../../projects/sds/src/lib/link/link.module.ts","../../../projects/sds/src/lib/modal/modal-template.component.ts","../../../projects/sds/src/lib/modal/modal-template.component.html","../../../projects/sds/src/lib/modal/modal.constant.ts","../../../projects/sds/src/lib/modal/modal.service.ts","../../../projects/sds/src/lib/modal/modal.component.ts","../../../projects/sds/src/lib/modal/modal.module.ts","../../../projects/sds/src/lib/radio/radio-control/radio-control.directive.ts","../../../projects/sds/src/lib/radio/radio-group/radio-group.component.ts","../../../projects/sds/src/lib/radio/radio-group/radio-group.component.html","../../../projects/sds/src/lib/radio/radio.component.ts","../../../projects/sds/src/lib/radio/radio.component.html","../../../projects/sds/src/lib/radio/radio.module.ts","../../../projects/sds/src/lib/screen-messages/screen-messages.model.ts","../../../projects/sds/src/lib/screen-messages/screen-message/screen-message.component.ts","../../../projects/sds/src/lib/screen-messages/screen-message/screen-message.component.html","../../../projects/sds/src/lib/screen-messages/screen-messages.service.ts","../../../projects/sds/src/lib/screen-messages/screen-messages-container/screen-messages-container.component.ts","../../../projects/sds/src/lib/screen-messages/screen-messages-container/screen-messages-container.component.html","../../../projects/sds/src/lib/screen-messages/screen-messages.module.ts","../../../projects/sds/src/lib/selectfield/selectfield-control/selectfield-control.directive.ts","../../../projects/sds/src/lib/selectfield/selectfield.component.ts","../../../projects/sds/src/lib/selectfield/selectfield.component.html","../../../projects/sds/src/lib/selectfield/selectfield.module.ts","../../../projects/sds/src/lib/sidenav/sidenav-list/sidenav-list.component.ts","../../../projects/sds/src/lib/sidenav/sidenav-list/sidenav-list.component.html","../../../projects/sds/src/lib/sidenav/sidenav-list-header/sidenav-list-header.component.ts","../../../projects/sds/src/lib/sidenav/sidenav-list-nested.directive.ts","../../../projects/sds/src/lib/sidenav/sidenav-list-item/sidenav-list-item.component.ts","../../../projects/sds/src/lib/sidenav/sidenav-list-item/sidenav-list-item.component.html","../../../projects/sds/src/lib/sidenav/sidenav-trigger.service.ts","../../../projects/sds/src/lib/sidenav/sidenav-trigger/sidenav-trigger.component.ts","../../../projects/sds/src/lib/sidenav/sidenav-trigger/sidenav-trigger.component.html","../../../projects/sds/src/lib/sidenav/sidenav.component.ts","../../../projects/sds/src/lib/sidenav/sidenav.component.html","../../../projects/sds/src/lib/sidenav/sidenav.module.ts","../../../projects/sds/src/lib/textfield/textfield-control/textfield-control.directive.ts","../../../projects/sds/src/lib/textfield/textfield.component.ts","../../../projects/sds/src/lib/textfield/textfield.component.html","../../../projects/sds/src/lib/textfield/textfield.module.ts","../../../projects/sds/src/lib/sign-in/sign-in-content.component.ts","../../../projects/sds/src/lib/sign-in/forgotten-password/forgotten-password.model.ts","../../../projects/sds/src/lib/sign-in/forgotten-password/forgotten-password.component.ts","../../../projects/sds/src/lib/sign-in/forgotten-password/forgotten-password.component.html","../../../projects/sds/src/lib/sign-in/sign-in/sign-in.model.ts","../../../projects/sds/src/lib/sign-in/sign-in/sign-in.component.ts","../../../projects/sds/src/lib/sign-in/sign-in/sign-in.component.html","../../../projects/sds/src/lib/sign-in/sign-in-layout/sign-in-layout.component.ts","../../../projects/sds/src/lib/sign-in/sign-in-layout/sign-in-layout.component.html","../../../projects/sds/src/lib/sign-in/sign-in.module.ts","../../../projects/sds/src/lib/spinner/spinner.component.ts","../../../projects/sds/src/lib/spinner/spinner.component.html","../../../projects/sds/src/lib/spinner/spinner.module.ts","../../../projects/sds/src/lib/stepper/step.component.ts","../../../projects/sds/src/lib/stepper/step.component.html","../../../projects/sds/src/lib/stepper/navigation-event.model.ts","../../../projects/sds/src/lib/stepper/stepper.component.ts","../../../projects/sds/src/lib/stepper/stepper.component.html","../../../projects/sds/src/lib/stepper/stepper.module.ts","../../../projects/sds/src/lib/table/table-row/table-row.directive.ts","../../../projects/sds/src/lib/table/table.model.ts","../../../projects/sds/src/lib/table/table-column/table-column.component.ts","../../../projects/sds/src/lib/table/table-column/table-column.component.html","../../../projects/sds/src/lib/table/icon-column/icon-column.component.ts","../../../projects/sds/src/lib/table/icon-column/icon-column.component.html","../../../projects/sds/src/lib/table/table-footer/table-footer.component.ts","../../../projects/sds/src/lib/table/table-pagination/table-pagination.component.ts","../../../projects/sds/src/lib/table/table-pagination/table-pagination.component.html","../../../projects/sds/src/lib/table/table.service.ts","../../../projects/sds/src/lib/table/table.component.ts","../../../projects/sds/src/lib/table/table.component.html","../../../projects/sds/src/lib/table/table.module.ts","../../../projects/sds/src/lib/tabs/tab-content.directive.ts","../../../projects/sds/src/lib/tabs/tab.directive.ts","../../../projects/sds/src/lib/tabs/tabset.component.ts","../../../projects/sds/src/lib/tabs/tabset.component.html","../../../projects/sds/src/lib/tabs/tabs.module.ts","../../../projects/sds/src/lib/toggle/toggle-control/toggle-control.directive.ts","../../../projects/sds/src/lib/toggle/toggle.component.ts","../../../projects/sds/src/lib/toggle/toggle.component.html","../../../projects/sds/src/lib/toggle/toggle.module.ts","../../../projects/sds/src/lib/toolbar/toolbar-form/toolbar-form.component.ts","../../../projects/sds/src/lib/toolbar/toolbar-form/toolbar-form.component.html","../../../projects/sds/src/lib/toolbar/toolbar-item/toolbar-item.component.ts","../../../projects/sds/src/lib/toolbar/toolbar-item/toolbar-item.component.html","../../../projects/sds/src/lib/toolbar/toolbar-header/toolbar-header.component.ts","../../../projects/sds/src/lib/toolbar/toolbar-header/toolbar-header.component.html","../../../projects/sds/src/lib/toolbar/toolbar-instance/toolbar-instance.component.ts","../../../projects/sds/src/lib/toolbar/toolbar-nav/toolbar-nav.component.ts","../../../projects/sds/src/lib/toolbar/toolbar-nav/toolbar-nav.component.html","../../../projects/sds/src/lib/toolbar/toolbar-nav-item/toolbar-nav-item.component.ts","../../../projects/sds/src/lib/toolbar/toolbar-nav-item/toolbar-nav-item.component.html","../../../projects/sds/src/lib/toolbar/toolbar-product/toolbar-product.component.ts","../../../projects/sds/src/lib/toolbar/toolbar.component.ts","../../../projects/sds/src/lib/toolbar/toolbar.component.html","../../../projects/sds/src/lib/toolbar/toolbar.module.ts","../../../projects/sds/src/lib/sds.module.ts","../../../projects/sds/src/public-api.ts","../../../projects/sds/src/funnelback-ng-sds.ts"],"sourcesContent":["import { Component, Input, ViewEncapsulation } from '@angular/core';\n\nexport type SdsIconSize = 'md' | 'sm' | 'xs';\n\n@Component({\n selector: 'sds-icon',\n styleUrls: ['./icon.component.scss'],\n template: '<span class=\"material-icons-round sds-icon-{{size}}\"><ng-content></ng-content></span>',\n encapsulation: ViewEncapsulation.None,\n standalone: false,\n})\nexport class SdsIconComponent {\n @Input() size?: SdsIconSize = 'md';\n}\n","import { Component, Input, ElementRef, AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';\nimport { SdsIconSize } from './icon.component';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[sdsIconWrapper]',\n // Note: me-3 is overruled in _links.scss and _buttons.scss, but used in places like dropdown.\n templateUrl: './icon-wrapper.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class SdsIconWrapperComponent implements AfterViewInit {\n @Input() public position: 'left' | 'right' = 'left';\n @Input() public positionSize: number = 3;\n @Input() public iconSize?: SdsIconSize;\n\n public icon!: string;\n public iconOnly: boolean = false;\n\n constructor(private elementRef: ElementRef<HTMLElement>, private cdr: ChangeDetectorRef) {}\n\n @Input() public set sdsIconWrapper(icon: string) {\n this.icon = icon;\n }\n\n public ngAfterViewInit(): void {\n this.elementRef.nativeElement.classList.add('d-inline-flex', 'flex-row', 'align-items-center');\n this.setIconClasses();\n }\n\n private isIconOnly(): boolean {\n let hasText: boolean = false;\n this.elementRef.nativeElement.childNodes.forEach(el => {\n if (el.nodeName === '#text') { hasText = true; }\n });\n return !hasText;\n }\n\n private setIconClasses(): void {\n this.iconOnly = this.isIconOnly();\n if (this.elementRef.nativeElement.tagName.toUpperCase() === 'BUTTON'\n || this.elementRef.nativeElement.tagName.toUpperCase() === 'A') {\n this.elementRef.nativeElement.classList.add(`${this.iconOnly ? 'btn-icon' : 'btn-icon-label'}`);\n this.cdr.detectChanges();\n }\n }\n}\n","<ng-container *ngIf=\"position === 'left'\" [ngTemplateOutlet]=\"iconDisplay\"></ng-container>\n<ng-content></ng-content>\n<ng-container *ngIf=\"position === 'right'\" [ngTemplateOutlet]=\"iconDisplay\"></ng-container>\n\n<ng-template #iconDisplay>\n <sds-icon *ngIf=\"icon\" [size]=\"iconSize\" [ngClass]=\"iconOnly ? '' : (position === 'right' ? 'ms-' + positionSize :'me-' + positionSize )\">{{icon}}</sds-icon>\n</ng-template>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { SdsIconWrapperComponent } from './icon-wrapper.component';\nimport { SdsIconComponent } from './icon.component';\n\n@NgModule({\n imports: [CommonModule],\n declarations: [SdsIconComponent, SdsIconWrapperComponent],\n exports: [SdsIconComponent, SdsIconWrapperComponent],\n})\nexport class SdsIconModule { }\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'sds-alert',\n templateUrl: './alert.component.html',\n standalone: false,\n})\nexport class SdsAlertComponent {\n @Input() title?: string;\n @Input() public set color(color: string) {\n this._color = color;\n\n switch(this._color) {\n case 'danger': this.icon = 'warning'; break;\n case 'warning': this.icon = 'report'; break;\n case 'info': this.icon = 'info'; break;\n case 'success': this.icon = 'check_circle'; break;\n case 'help': this.icon = 'help'; break;\n case 'assist': this.icon = 'assistant'; break;\n }\n }\n public get color(): string { return this._color; }\n\n public icon!: string;\n private _color: string = 'info';\n}\n","<div class=\"alert alert-{{color}} d-flex align-items-top\" [attr.role]=\"color === 'danger' || color === 'warning' ? 'alert' : 'status'\">\n <sds-icon *ngIf=\"icon\" class=\"alert-icon\">{{icon}}</sds-icon>\n <div>\n <h3 *ngIf=\"title\" class=\"alert-heading mb-1\">{{title}}</h3>\n <ng-content></ng-content>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { SdsIconModule } from '../icon/icon.module';\nimport { SdsAlertComponent } from './alert.component';\n\n@NgModule({ declarations: [SdsAlertComponent], exports: [SdsAlertComponent], imports: [CommonModule, SdsIconModule] })\nexport class SdsAlertModule { }\n","import { ChangeDetectionStrategy, Component, HostBinding, Input, ViewEncapsulation } from '@angular/core';\n\n@Component({\n selector: 'sds-badge',\n templateUrl: './badge.component.html',\n styleUrls: ['./badge.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class SdsBadgeComponent {\n @Input() label!: string;\n @Input() color: string = 'secondary';\n @Input() @HostBinding('attr.strong') public set strong(val: boolean | string) {\n this._strong = val === true || val === 'true' ? true : false;\n }\n public get strong() { return this._strong; }\n\n private _strong!: boolean;\n}\n","<div class=\"badge badge-{{color}}\" [class.badge-outline]=\"!strong\">{{label}}</div>\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\n\n@Component({\n selector: 'sds-badge-combination',\n templateUrl: './badge-combination.component.html',\n styleUrls: ['./badge-combination.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class SdsBadgeCombinationComponent {\n @Input() labels!: string[];\n @Input() color: string = 'secondary';\n @Input() strong: 'left' | 'right' = 'left';\n}\n","<sds-badge [color]=\"color\" [label]=\"labels && labels[0]\" [strong]=\"strong === 'left'\"></sds-badge>\n<sds-badge [color]=\"color\" [label]=\"labels && labels[1]\" [strong]=\"strong === 'right'\"></sds-badge>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { SdsBadgeCombinationComponent } from './badge-combination/badge-combination.component';\nimport { SdsBadgeComponent } from './badge.component';\n\nconst COMPONENTS: any[] = [\n SdsBadgeComponent,\n SdsBadgeCombinationComponent,\n];\n\n@NgModule({\n imports: [CommonModule],\n declarations: COMPONENTS,\n exports: COMPONENTS,\n})\nexport class SdsBadgeModule { }\n","import { ElementRef } from '@angular/core';\n\nexport function getElementAttr(el: ElementRef, attr?: string): any {\n return attr ? el.nativeElement?.getAttribute(attr) : el.nativeElement.attributes;\n}\n\nexport function hasElementAttr(el: ElementRef, attr: string): boolean {\n return getElementAttr(el, attr) !== null;\n}\n\n/**\n * Force a data-bound value (typically a string) to a boolean\n *\n * @param value value set via element property/attribute\n */\nexport function forceBooleanType(value: any): boolean {\n return value !== null && `${value}` !== 'false';\n}\n","import { Directive, ElementRef, Input, AfterViewInit, Renderer2 } from '@angular/core';\nimport { hasElementAttr } from '../utils/element-util';\n\n@Directive({\n selector: `button[sdsButtonStrong],\n button[sdsButtonSoft],\n button[sdsButtonTransparent],\n button[sdsButtonDefault],\n button[sdsButtonBrand],\n a[sdsButtonStrong],\n a[sdsButtonSoft],\n a[sdsButtonTransparent],\n a[sdsButtonDefault],\n a[sdsButtonBrand]`,\n standalone: false,\n})\nexport class SdsButtonDirective implements AfterViewInit {\n @Input() public btnColor?: string;\n @Input() public btnImg?: string;\n @Input() public btnSize?: 'md' | 'sm' | 'xs';\n\n private PREFIX: string = 'sdsButton';\n\n constructor(private host: ElementRef<HTMLElement>, private _renderer: Renderer2) { }\n\n public ngAfterViewInit(): void {\n const tokens: string[] = ['btn'];\n if (this.isTransparent()) {\n tokens.push(`btn-link${this.btnColor === 'primary' ? `-${this.btnColor}` : ''}`);\n } else if (!this.btnColor || this.isDefault()) {\n tokens.push('btn-outline-secondary');\n if (this.isBrand()) {\n tokens.push('btn-brand');\n this.renderImg();\n }\n } else if (this.isSoft()) {\n tokens.push(`btn-outline-${this.btnColor}`);\n } else {\n tokens.push(`btn-${this.btnColor}`);\n }\n\n if (this.btnSize) {\n tokens.push(`btn-${this.btnSize}`);\n }\n\n this.host.nativeElement.classList.add(...tokens);\n }\n\n private isBrand(): boolean {\n return hasElementAttr(this.host, `${this.PREFIX}Brand`);\n }\n\n private isDefault(): boolean {\n return hasElementAttr(this.host, `${this.PREFIX}Default`);\n }\n\n private isSoft(): boolean {\n return hasElementAttr(this.host, `${this.PREFIX}Soft`);\n }\n\n private isTransparent(): boolean {\n return hasElementAttr(this.host, `${this.PREFIX}Transparent`);\n }\n\n private renderImg(): void {\n if (!this.btnImg) { return; }\n\n const img: HTMLElement = this._renderer.createElement('img');\n this._renderer.setAttribute(img, 'src', this.btnImg);\n this._renderer.setAttribute(img, 'class', 'btn-img me-2');\n this._renderer.setAttribute(img, 'alt', '');\n this._renderer.setAttribute(img, 'role', 'presentation');\n this._renderer.insertBefore(this.host.nativeElement, img, this.host.nativeElement.childNodes.item(0));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { SdsButtonDirective } from './button.directive';\n\n@NgModule({\n imports: [CommonModule],\n declarations: [SdsButtonDirective],\n exports: [SdsButtonDirective],\n})\nexport class SdsButtonModule { }\n","import { Directive, Input } from '@angular/core';\nimport { QueryParamsHandling } from '@angular/router';\n\n@Directive()\nexport abstract class NavigationComponent {\n // Navigation related settings\n @Input() href?: string;\n @Input() rel?: string;\n @Input() target?: string;\n\n // Routing related settings\n @Input() fragment?: string;\n @Input() preserveFragment: boolean = false;\n @Input() queryParams?: {[k: string]: any};\n @Input() queryParamsHandling?: QueryParamsHandling;\n @Input() replaceUrl: boolean = false;\n @Input() routeLink?: string | any[];\n @Input() skipLocationChange: boolean = false;\n @Input() state?: {[k: string]: any};\n @Input() routerLinkActiveOptions: {exact: boolean} = { exact: false };\n}\n","import { Component, Input, ContentChild, TemplateRef } from '@angular/core';\nimport { NavigationComponent } from '../utils/navigation.component';\n\n@Component({\n selector: 'sds-card',\n templateUrl: './card.component.html',\n standalone: false,\n})\nexport class SdsCardComponent extends NavigationComponent {\n @ContentChild('sdsCardFooter', { static: true }) public footer!: TemplateRef<any>;\n @Input() color: string = 'muted';\n @Input() isActive: boolean = false;\n @Input() footerAlign: string = 'left'; // left | right | center\n @Input() title!: string;\n @Input() icon?: string;\n @Input() subtitle?: string;\n}\n","<div *ngIf=\"!href && !routeLink\" class=\"card\" [class.border-primary]=\"isActive\">\n <ng-container *ngTemplateOutlet=\"cardContent\"></ng-container>\n</div>\n\n<a *ngIf=\"!href && routeLink\" class=\"card card-link\" [class.border-primary]=\"isActive\" [routerLink]=\"routeLink\" [fragment]=\"fragment\" [preserveFragment]=\"preserveFragment\" [queryParams]=\"queryParams\" [queryParamsHandling]=\"queryParamsHandling\" [replaceUrl]=\"replaceUrl\" [skipLocationChange]=\"skipLocationChange\" [state]=\"state\">\n <ng-container *ngTemplateOutlet=\"cardContent\"></ng-container>\n</a>\n\n<a *ngIf=\"href\" class=\"card card-link\" [class.border-primary]=\"isActive\" [attr.href]=\"href\" [attr.rel]=\"rel\" [attr.target]=\"target\">\n <ng-container *ngTemplateOutlet=\"cardContent\"></ng-container>\n</a>\n\n<ng-template #cardContent>\n <div *ngIf=\"icon\" class=\"card-header\">\n <sds-icon class=\"text-{{color}}\">{{icon}}</sds-icon>\n </div>\n <div class=\"card-body\">\n <h2 class=\"card-title\">{{title}}</h2>\n <div *ngIf=\"subtitle\" class=\"card-subtitle\">{{subtitle}}</div>\n <div #cardText class=\"card-text\" [class.empty]=\"!cardText?.innerText?.trim()\"><ng-content></ng-content></div>\n </div>\n <div *ngIf=\"footer\" class=\"card-footer text-{{footerAlign}}\">\n <ng-container *ngTemplateOutlet=\"footer\"></ng-container>\n </div>\n</ng-template>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { SdsIconModule } from '../icon/icon.module';\nimport { SdsCardComponent } from './card.component';\n\n@NgModule({\n imports: [CommonModule, RouterModule, SdsIconModule],\n declarations: [SdsCardComponent],\n exports: [SdsCardComponent],\n})\nexport class SdsCardModule { }\n","import { Attribute, Directive, Host, HostBinding, HostListener, Input, OnInit, Optional } from '@angular/core';\nimport { AbstractControl, NgControl, Validators } from '@angular/forms';\n\n@Directive()\nexport abstract class SdsFormControlDirective implements OnInit {\n public control!: AbstractControl; // Reference to control set via `[formControl]`\n public disabled: boolean = false; // True if input is disabled via `[disabled]`\n public focus: boolean = false; // True if input is focused\n public required!: boolean; // True if validator.required or attribute is set\n\n @Input() @HostBinding('attr.id') public id?: string;\n\n // eslint-disable-next-line @angular-eslint/no-attribute-decorator\n constructor(@Host() @Optional() private ngControl: NgControl, @Attribute('disabled') isDisabled: unknown, @Attribute('required') isRequired: unknown) {\n this.setDisabled(isDisabled);\n this.setRequired(isRequired);\n }\n\n @HostListener('focus')\n public onFocus(): void {\n this.focus = true;\n }\n\n @HostListener('blur')\n public onBlur(): void {\n this.focus = false;\n }\n\n public ngOnInit(): void {\n if (this.ngControl?.control) {\n this.control = this.ngControl.control;\n this.setRequired(this.control.hasValidator(Validators.required));\n }\n }\n\n protected getState(state: boolean, currentState: unknown): boolean {\n if (typeof (currentState) === 'boolean') {\n return state || currentState;\n } else {\n return currentState !== null;\n }\n }\n\n /**\n * Check if input was disabled by setting `disabled` directive\n */\n private setDisabled(isDisabled: unknown): void {\n this.disabled = this.getState(this.disabled, isDisabled);\n }\n\n /**\n * Check if input is required by setting `required` directive or validator\n */\n private setRequired(isRequired: unknown): void {\n this.required = this.getState(this.required, isRequired);\n }\n}\n","import { Attribute, Directive, ElementRef, Host, HostBinding, HostListener, Input, Optional } from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { forceBooleanType } from '../../utils/element-util';\nimport { SdsFormControlDirective } from '../../utils/form-control.directive';\n\n@Directive({\n selector: '[sdsCheckboxControl]',\n standalone: false,\n})\nexport class SdsCheckboxControlDirective extends SdsFormControlDirective {\n @HostBinding('class.form-check-input') classFormControl: boolean = true;\n @HostBinding('attr.aria-checked') ariaChecked: true | false | 'mixed' = false;\n @HostBinding('type') type: string = 'checkbox';\n\n @Input() public set checked(val: boolean) {\n this.setChecked(forceBooleanType(val));\n }\n\n @Input() public set indeterminate(val: boolean) {\n if (this.elementRef) {\n const indeterminate: boolean = forceBooleanType(val);\n this.elementRef.nativeElement.indeterminate = indeterminate;\n this.setAriaChecked(indeterminate);\n }\n }\n\n private _checked: boolean = false;\n\n // eslint-disable-next-line @angular-eslint/no-attribute-decorator\n constructor(private elementRef: ElementRef<HTMLInputElement>, @Host() @Optional() ngControl: NgControl, @Attribute('disabled') isDisabled: unknown, @Attribute('required') isRequired: unknown) {\n super(ngControl, isDisabled, isRequired);\n }\n\n @HostListener('change', ['$event.currentTarget.checked'])\n public onChange(isChecked: boolean): void {\n this.setChecked(isChecked);\n }\n\n private setAriaChecked(isIndeterminate?: boolean): void {\n this.ariaChecked = isIndeterminate ? 'mixed' : this._checked;\n }\n\n private setChecked(isChecked: boolean): void {\n this._checked = isChecked;\n this.setAriaChecked();\n }\n}\n","import { ChangeDetectionStrategy, Component, ContentChild, Input, ViewEncapsulation } from '@angular/core';\nimport { SdsCheckboxControlDirective } from './checkbox-control/checkbox-control.directive';\n\n@Component({\n selector: 'sds-checkbox',\n templateUrl: './checkbox.component.html',\n styleUrls: ['./checkbox.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class SdsCheckboxComponent {\n @ContentChild(SdsCheckboxControlDirective, { static: true }) checkbox!: SdsCheckboxControlDirective;\n @Input() label!: string;\n @Input() variant?: 'inline' | 'stack';\n}\n","<div class=\"form-check\" [class.form-check-inline]=\"variant === 'inline'\">\n <ng-content></ng-content>\n <label class=\"form-check-label\" [attr.for]=\"checkbox?.id || undefined\">{{label}}</label>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { SdsCheckboxControlDirective } from './checkbox-control/checkbox-control.directive';\nimport { SdsCheckboxComponent } from './checkbox.component';\n\nconst COMPONENTS: any[] = [\n SdsCheckboxComponent,\n SdsCheckboxControlDirective,\n];\n\n@NgModule({ declarations: [...COMPONENTS], exports: [...COMPONENTS], imports: [CommonModule] })\nexport class SdsCheckboxModule { }\n","import { Directive, ElementRef, Renderer2, OnChanges, OnDestroy, Input, HostBinding } from '@angular/core';\n\n@Directive({\n selector: '[sdsCounter]',\n standalone: false,\n})\nexport class SdsCounterDirective implements OnChanges, OnDestroy {\n private counter!: HTMLElement;\n @Input() public counterColor: string = 'secondary';\n @Input() public counterOverlap: boolean|string = true;\n @Input() public counterPosition: 'after'|'before' = 'after';\n @Input('sdsCounter') public content?: string;\n @HostBinding('class.position-relative') counterContainerClass: boolean = true;\n\n constructor(\n private elementRef: ElementRef<HTMLElement>,\n private renderer: Renderer2,\n ) {}\n\n public ngOnChanges(): void {\n this.updateCounter();\n }\n\n public ngOnDestroy(): void {\n if (this.counter) {\n if (this.renderer.destroyNode) {\n this.renderer.destroyNode(this.counter);\n }\n }\n }\n\n private createCounter(): void {\n this.counter = this.renderer.createElement('span');\n this.counter.setAttribute('class', this.content\n ? 'position-absolute top-0 translate-middle badge rounded-pill'\n : 'position-absolute top-0 translate-middle p-2 border border-light rounded-circle');\n this.setContent();\n\n if (this.counterColor) {\n this.counter.classList.add(`bg-${this.counterColor}`);\n }\n\n if (this.counterPosition === 'before') {\n this.counter.classList.add('start-0');\n } else {\n this.counter.classList.add('start-100');\n if (this.counterOverlap === 'false' || this.counterOverlap === false) {\n this.counter.classList.add('ms-2');\n }\n }\n\n this.elementRef.nativeElement.appendChild(this.counter);\n }\n\n private updateCounter(): void {\n if (!this.counter) {\n this.createCounter();\n } else {\n this.setContent();\n }\n }\n\n private setContent(): void {\n if (this.content) {\n this.counter.textContent = this.content;\n this.counter.setAttribute('title', this.content);\n }\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { SdsCounterDirective } from './counter.directive';\n\n@NgModule({ declarations: [SdsCounterDirective], exports: [SdsCounterDirective] })\nexport class SdsCounterModule { }\n","import { NgModule } from '@angular/core';\nimport { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';\n\n@NgModule({ exports: [NgbDropdownModule] })\nexport class SdsDropdownModule {}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n@Component({\n selector: 'sds-form-error',\n templateUrl: './form-error.component.html',\n styleUrls: ['./form-error.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class SdsFormErrorComponent {}\n","<div class=\"invalid-feedback\"><ng-content></ng-content></div>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\n@Component({\n selector: 'sds-form-helper',\n templateUrl: './form-helper.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class SdsFormHelperComponent {}\n","<small class=\"form-text\"><ng-content></ng-content></small>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { SdsFormErrorComponent } from './form-error/form-error.component';\nimport { SdsFormHelperComponent } from './form-helper/form-helper.component';\n\nconst COMPONENTS: any[] = [\n SdsFormErrorComponent,\n SdsFormHelperComponent,\n];\n\n@NgModule({ declarations: COMPONENTS, exports: COMPONENTS, imports: [CommonModule] })\nexport class SdsFormModule { }\n","import { Attribute, Directive, Host, HostBinding, HostListener, Input, OnInit, Optional } from '@angular/core';\nimport { AbstractControl, NgControl, Validators } from '@angular/forms';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nexport type SdsFileSizeType = { [fileName: string]: string };\n\n@Directive({\n selector: 'input[sdsFileUploaderControl]',\n standalone: false,\n})\nexport class SdsFileUploaderControlDirective implements OnInit {\n @HostBinding('class.form-file-input') classFormControl: boolean = true;\n @HostBinding('type') type: string = 'file';\n @Input() @HostBinding('attr.id') public id?: string;\n\n public control!: AbstractControl; // Reference to control set via `[formControl]`\n public required!: boolean; // True if validator.required or attribute is set\n private _files: BehaviorSubject<SdsFileSizeType | undefined> = new BehaviorSubject<SdsFileSizeType | undefined>(undefined);\n\n public get files$(): Observable<SdsFileSizeType | undefined> {\n return this._files.asObservable();\n }\n\n // eslint-disable-next-line @angular-eslint/no-attribute-decorator\n constructor(@Host() @Optional() private ngControl: NgControl, @Attribute('required') isRequired: any) {\n this.setRequired(isRequired);\n }\n\n public ngOnInit(): void {\n if (this.ngControl?.control) {\n this.control = this.ngControl.control;\n this.setRequired(this.control.hasValidator(Validators.required));\n\n if (this.control.value) {\n this.onChange([{ name: this.control.value } as File]);\n }\n }\n }\n\n @HostListener('change', ['$event.target.files'])\n public onChange(data: File[]): void {\n if (data?.length) {\n const files: SdsFileSizeType = {};\n for (const file of data) {\n files[file.name] = typeof file.size !== 'undefined' ? this.formatFileSize(file.size, 3) : '';\n }\n this._files.next(files);\n } else {\n this._files.next(undefined);\n }\n }\n\n public reset(): void {\n if (this.control) { this.control.reset(); }\n this._files.next(undefined);\n }\n\n private formatFileSize(bytes: number, decimalPoint: number): string {\n if (bytes === 0) { return '0 Bytes'; }\n const k = 1000;\n const dm = decimalPoint || 2;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm)).toString()} ${sizes[i]}`;\n }\n\n /**\n * Check if input is required by setting `required` directive or validator\n */\n private setRequired(isRequired: null | boolean | unknown): void {\n if (typeof (isRequired) === 'boolean') {\n this.required = this.required || isRequired;\n } else {\n this.required = isRequired !== null;\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';\nimport { SdsFileUploaderControlDirective } from './file-uploader-control.directive';\n\n@Component({\n selector: 'sds-file-uploader',\n templateUrl: './file-uploader.component.html',\n styleUrls: ['./file-uploader.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class SdsFileUploaderComponent {\n @ContentChild(SdsFileUploaderControlDirective, { static: true }) input!: SdsFileUploaderControlDirective;\n @Input() errorMessage?: string;\n @Input() helper?: string;\n @Input() label?: string;\n @Input() hiddenLabel: boolean = false;\n @Input() placeholder: string = 'Choose file';\n @Input() remove: string = 'Remove file';\n\n @Output() onRemove: EventEmitter<unknown> = new EventEmitter();\n\n public removeFile(): void {\n const currentValue: unknown = this.input?.control ? this.input.control.value : undefined;\n if (this.input) { this.input.reset(); }\n this.onRemove.emit(currentValue);\n }\n}\n","<label *ngIf=\"label\" [attr.for]=\"input?.id\" class=\"form-label\" [class.visually-hidden]=\"hiddenLabel\">{{label}}<ng-container *ngIf=\"input?.required\">*</ng-container></label>\n<div class=\"form-file\">\n <ng-content></ng-content>\n <div class=\"form-file-label\" [class.text-gray-700]=\"input?.control?.value\">\n <ng-container *ngIf=\"input.files$ | async as files; else displayPlaceholder\">\n <ng-container *ngFor=\"let file of files | keyvalue\">\n {{file.key}} <span *ngIf=\"file.value\" class=\"file-size text-md-regular text-gray-500\">({{file.value}})</span>\n </ng-container>\n </ng-container>\n </div>\n <div *ngIf=\"input?.control?.value && !input?.required\" class=\"text-sm-semibold text-gray-600\"><a (click)=\"removeFile()\" sdsStandaloneLink>{{remove}}</a></div>\n <sds-form-error *ngIf=\"errorMessage\">{{errorMessage}}</sds-form-error>\n</div>\n\n<sds-form-helper *ngIf=\"helper\">{{helper}}</sds-form-helper>\n\n<ng-template #displayPlaceholder>{{placeholder}}</ng-template>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { SdsFormModule } from '../form/form.module';\nimport { SdsFileUploaderControlDirective } from './file-uploader-control.directive';\nimport { SdsFileUploaderComponent } from './file-uploader.component';\n\nconst COMPONENTS: any[] = [\n SdsFileUploaderControlDirective,\n SdsFileUploaderComponent,\n];\n\n@NgModule({\n declarations: COMPONENTS, exports: COMPONENTS, imports: [CommonModule, SdsFormModule, ReactiveFormsModule],\n})\nexport class SdsFileUploaderModule{}\n","import { isPlatformBrowser } from '@angular/common';\nimport { Injectable, Inject, PLATFORM_ID, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, fromEvent, Subject } from 'rxjs';\nimport { debounceTime, distinctUntilKeyChanged, map, startWith, takeUntil } from 'rxjs/operators';\nimport { WindowSize } from './layout.model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdsLayoutService implements OnDestroy {\n private _windowSize: BehaviorSubject<WindowSize> = new BehaviorSubject<WindowSize>({ width: 0, height: 0 });\n private _destroySubject: Subject<void> = new Subject();\n\n constructor(@Inject(PLATFORM_ID) _platformId: any) {\n if (isPlatformBrowser(_platformId)) {\n fromEvent(window, 'resize').pipe(\n debounceTime(100),\n map(event => {\n const target: Window = (event.currentTarget ?? event.target) as Window;\n return {\n width: target.innerWidth,\n height: target.innerHeight,\n };\n }),\n startWith({ width: window.innerWidth, height: window.innerHeight }),\n distinctUntilKeyChanged('width'),\n takeUntil(this._destroySubject),\n ).subscribe(size => this._windowSize.next(size));\n }\n }\n\n public ngOnDestroy(): void {\n this._destroySubject.next();\n this._destroySubject.complete();\n }\n\n public get(): BehaviorSubject<WindowSize> {\n return this._windowSize;\n }\n\n}\n","import { OnDestroy, Injectable } from '@angular/core';\nimport { BehaviorSubject, Subject, Observable } from 'rxjs';\nimport { distinctUntilChanged, filter, map, takeUntil } from 'rxjs/operators';\nimport { SdsLayoutService } from './layout.service';\n\n@Injectable()\nexport abstract class SdsLayoutTypeService<T> implements OnDestroy {\n private _type: BehaviorSubject<T> = new BehaviorSubject<T>(undefined!); /* eslint-disable-line @typescript-eslint/no-non-null-assertion */\n private _destroySubject: Subject<void> = new Subject();\n\n constructor(private layoutService: SdsLayoutService) {\n this.layoutService.get().pipe(\n filter(windowSize => !!windowSize),\n map(windowSize => this.getType(windowSize.width)),\n distinctUntilChanged(),\n takeUntil(this._destroySubject),\n ).subscribe(size => this._type.next(size));\n }\n\n public ngOnDestroy(): void {\n this._destroySubject.next();\n this._destroySubject.complete();\n }\n\n public get(): BehaviorSubject<T> {\n return this._type;\n }\n\n public match(...types: T[]): Observable<boolean> {\n return this._type.pipe(\n map(currentType => types.indexOf(currentType) > -1),\n distinctUntilChanged(),\n );\n }\n\n protected abstract getType(width: number): T;\n}\n","export interface WindowSize { width: number; height: number }\n\nexport enum BreakpointType {xs = 'xs', sm = 'sm', md = 'md', lg = 'lg', xl = 'xl'}\nexport const BREAKPOINTS: {[T in BreakpointType]: {min: number; max: number}} = {\n xs: { min: 0, max: 576 },\n sm: { min: 576, max: 768 },\n md: { min: 768, max: 1024 },\n lg: { min: 1024, max: 1366 },\n xl: { min: 1366, max: undefined! }, /* eslint-disable-line @typescript-eslint/no-non-null-assertion */\n};\n\nexport enum ViewType {mobile = 'mobile', tablet = 'tablet', desktop = 'desktop', largeDesktop = 'largeDesktop'}\nexport const VIEW_BREAKPOINTS: {[T in ViewType]: {min: number; max: number}} = {\n mobile: { min: 0, max: 768 },\n tablet: { min: 768, max: 1024 },\n desktop: { min: 1024, max: 1367 },\n largeDesktop: { min: 1367, max: undefined! }, /* eslint-disable-line @typescript-eslint/no-non-null-assertion */\n};\n","import { Injectable } from '@angular/core';\nimport { SdsLayoutTypeService } from './layout-type.service';\nimport { BreakpointType, BREAKPOINTS } from './layout.model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdsBreakpointTypeService extends SdsLayoutTypeService<BreakpointType> {\n protected getType(width: number): BreakpointType {\n let type!: BreakpointType;\n if (width >= BREAKPOINTS.xl.min) {\n type = BreakpointType.xl;\n } else if (width >= BREAKPOINTS?.lg?.min && width < BREAKPOINTS.lg?.max) {\n type = BreakpointType.lg;\n } else if (width >= BREAKPOINTS.md.min && width < BREAKPOINTS.md.max) {\n type = BreakpointType.md;\n } else if (width >= BREAKPOINTS.sm.min && width < BREAKPOINTS.sm.max) {\n type = BreakpointType.sm;\n } else if (width < BREAKPOINTS.xs.max) {\n type = BreakpointType.xs;\n }\n return type;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { SdsLayoutTypeService } from './layout-type.service';\nimport { ViewType, VIEW_BREAKPOINTS } from './layout.model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdsViewTypeService extends SdsLayoutTypeService<ViewType> {\n\n protected getType(width: number): ViewType {\n let type!: ViewType;\n if (width >= VIEW_BREAKPOINTS.largeDesktop.min) {\n type = ViewType.largeDesktop;\n } else if (width >= VIEW_BREAKPOINTS.desktop.min && width < VIEW_BREAKPOINTS.desktop.max) {\n type = ViewType.desktop;\n } else if (width >= VIEW_BREAKPOINTS.tablet.min && width < VIEW_BREAKPOINTS.tablet.max) {\n type = ViewType.tablet;\n } else if (width < VIEW_BREAKPOINTS.mobile.max) {\n type = ViewType.mobile;\n }\n return type;\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { SdsBreakpointTypeService } from './breakpoint-type.service';\nimport { SdsLayoutService } from './layout.service';\nimport { SdsViewTypeService } from './view-type.service';\n\n@NgModule({})\nexport class SdsLayoutModule {\n public static forRoot(): ModuleWithProviders<SdsLayoutModule> {\n return {\n ngModule: SdsLayoutModule,\n providers: [\n SdsLayoutService,\n SdsViewTypeService,\n SdsBreakpointTypeService,\n ],\n };\n }\n}\n","import { ElementRef, Renderer2, OnInit, ChangeDetectorRef, Directive } from '@angular/core';\n\n@Directive()\nexport abstract class SdsLinkDirective implements OnInit {\n protected content?: string;\n\n constructor(\n protected hostElement: ElementRef<HTMLElement>,\n protected renderer: Renderer2,\n protected cdr: ChangeDetectorRef,\n ) { }\n\n public ngOnInit(): void {\n this.renderer.addClass(this.hostElement.nativeElement, 'sds-link');\n if (this.content === 'alternate') {\n this.renderer.addClass(this.hostElement.nativeElement, 'link-alternate');\n }\n\n this.resizeIcons();\n }\n\n private resizeIcons(): void {\n const options: any = { threshold: 1.0 };\n const callback: IntersectionObserverCallback = entries => {\n entries.forEach(entry => {\n if (entry.intersectionRatio === 1) {\n this.setFontSize(); // now visible\n }\n });\n };\n // See https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API\n const observer: any = new IntersectionObserver(callback, options);\n this.hostElement.nativeElement.querySelectorAll(':scope > sds-icon').forEach(iconElement => {\n observer.observe(iconElement);\n });\n }\n\n private setFontSize(): void {\n const lh: number = this.getLineHeightWithoutIcon();\n this.hostElement.nativeElement.querySelectorAll(':scope > sds-icon').forEach(iconElements => {\n iconElements.setAttribute('style', `font-size: ${Math.floor(lh)}px; line-height: ${lh}px`);\n });\n }\n\n // Adapted from https://stackoverflow.com/a/6966613/5464931\n private getLineHeightWithoutIcon(): number {\n const textNode: ChildNode = this.hostElement.nativeElement.lastChild as ChildNode;\n let height: number = 0;\n if (document.createRange) {\n const range: Range = document.createRange();\n range.selectNodeContents(textNode);\n if (range.getBoundingClientRect) {\n const rect: any = range.getBoundingClientRect();\n if (rect) {\n height = rect.bottom - rect.top;\n }\n }\n }\n return height;\n }\n}\n","import { Directive, OnInit, Input } from '@angular/core';\nimport { SdsLinkDirective } from './sds-link.directive';\n\n@Directive({\n selector: '[sdsParagraphLink]',\n standalone: false,\n})\nexport class SdsParagraphLinkDirective extends SdsLinkDirective implements OnInit {\n @Input('sdsParagraphLink') public content?: string;\n\n public ngOnInit(): void {\n super.ngOnInit();\n this.renderer.addClass(this.hostElement.nativeElement, 'paragraph-link');\n }\n}\n","import { Directive, OnInit, Input } from '@angular/core';\nimport { SdsLinkDirective } from './sds-link.directive';\n\n@Directive({\n selector: '[sdsStandaloneLink]',\n standalone: false,\n})\nexport class SdsStandaloneLinkDirective extends SdsLinkDirective implements OnInit {\n @Input('sdsStandaloneLink') public content?: string;\n\n public ngOnInit(): void {\n super.ngOnInit();\n this.renderer.addClass(this.hostElement.nativeElement, 'standalone-link');\n }\n}\n","import { NgModule } from '@angular/core';\nimport { SdsParagraphLinkDirective } from './paragraph-link.directive';\nimport { SdsStandaloneLinkDirective } from './standalone-link.directive';\n\n@NgModule({\n declarations: [\n SdsParagraphLinkDirective,\n SdsStandaloneLinkDirective,\n ],\n exports: [\n SdsParagraphLinkDirective,\n SdsStandaloneLinkDirective,\n ],\n})\nexport class SdsLinkModule { }\n","import { Component, Input, ContentChild, ViewEncapsulation } from '@angular/core';\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\n\n@Component({\n selector: 'sds-modal-template',\n templateUrl: './modal-template.component.html',\n styleUrls: ['./modal-template.component.scss'],\n encapsulation: ViewEncapsulation.None,\n standalone: false,\n})\nexport class SdsModalTemplateComponent {\n @ContentChild('sdsModalBody', { static: true }) public body: any;\n @ContentChild('sdsModalFooter', { static: true }) public footer: any;\n\n @Input() public header?: string;\n @Input() public icon?: string;\n\n constructor(public modal: NgbActiveModal) {}\n}\n","<div class=\"modal-header\">\n <sds-icon *ngIf=\"icon\" class=\"me-3\">{{icon}}</sds-icon>\n <h2 class=\"modal-title\" *ngIf=\"header\">{{header}}</h2>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss(-1)\"></button>\n</div>\n<div class=\"modal-body\" *ngIf=\"body\">\n <ng-container *ngTemplateOutlet=\"body; context: {$implicit: modal}\"></ng-container>\n</div>\n<div class=\"modal-footer\" *ngIf=\"footer\">\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: modal}\"></ng-container>\n</div>\n","import { NgbModalOptions } from '@ng-bootstrap/ng-bootstrap';\n\nexport const DEFAULT_MODAL_OPTIONS: NgbModalOptions = {\n centered: true,\n scrollable: true,\n};\n","import { Injectable } from '@angular/core';\nimport { NgbModal, NgbModalOptions, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';\nimport { DEFAULT_MODAL_OPTIONS } from './modal.constant';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdsModalService extends NgbModal {\n\n public open(content: any, options?: NgbModalOptions | undefined): NgbModalRef {\n return super.open(content, { ...DEFAULT_MODAL_OPTIONS, ...options });\n }\n\n public openWithHeader(content: any, header: any, options?: NgbModalOptions): NgbModalRef {\n return this.openWithHeaderAndBody(content, header, undefined, options);\n }\n\n public openWithBody(content: any, body: any, options?: NgbModalOptions): NgbModalRef {\n return this.openWithHeaderAndBody(content, undefined, body, options);\n }\n\n public openWithHeaderAndBody(content: any, header: any, body: any, options?: NgbModalOptions): NgbModalRef {\n return this.openWithHeaderBodyAndFooter(content, header, body, undefined, options);\n }\n\n public openWithHeaderBodyAndFooter(content: any, header?: any, body?: any, footer?: any, options?: NgbModalOptions): NgbModalRef {\n const modalRef: NgbModalRef = this.open(content, options);\n modalRef.componentInstance.header = header;\n modalRef.componentInstance.body = body;\n modalRef.componentInstance.footer = footer;\n return modalRef;\n }\n}\n","import { Component, Input, ContentChild, OnInit } from '@angular/core';\nimport { NgbModalOptions, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';\nimport { SdsModalTemplateComponent } from './