@impartner/design-components 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +1 -1
  2. package/esm2020/lib/alert/alert.component.mjs +1 -1
  3. package/esm2020/lib/avatar/avatar.component.mjs +1 -1
  4. package/esm2020/lib/backdrop/backdrop.component.mjs +7 -1
  5. package/esm2020/lib/badge/badge.component.mjs +1 -1
  6. package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +11 -7
  7. package/esm2020/lib/breadcrumb/breadcrumb.module.mjs +5 -5
  8. package/esm2020/lib/button/button.component.mjs +1 -1
  9. package/esm2020/lib/button-group/button-group.component.mjs +1 -1
  10. package/esm2020/lib/card-heading/card-heading.component.mjs +1 -1
  11. package/esm2020/lib/data-card/data-card.component.mjs +127 -0
  12. package/esm2020/lib/data-card/data-card.module.mjs +19 -0
  13. package/esm2020/lib/data-card/index.mjs +3 -0
  14. package/esm2020/lib/dropdown/components/dropdown-item/dropdown-item.component.mjs +1 -1
  15. package/esm2020/lib/dropdown/dropdown.component.mjs +1 -1
  16. package/esm2020/lib/file-upload/directives/file-drop.directive.mjs +1 -1
  17. package/esm2020/lib/file-upload/file-upload.component.mjs +1 -1
  18. package/esm2020/lib/form-field/controls/checkbox/checkbox.component.mjs +1 -1
  19. package/esm2020/lib/form-field/controls/input/input.directive.mjs +1 -1
  20. package/esm2020/lib/form-field/controls/radio/radio-button/radio-button.component.mjs +1 -1
  21. package/esm2020/lib/form-field/controls/radio/radio-group/radio-group.directive.mjs +2 -1
  22. package/esm2020/lib/form-field/controls/select/option/select-option.component.mjs +1 -1
  23. package/esm2020/lib/form-field/controls/select/select-model.mjs +2 -1
  24. package/esm2020/lib/form-field/controls/select/select.component.mjs +1 -1
  25. package/esm2020/lib/form-field/controls/shared/toggle/toggle.component.mjs +1 -1
  26. package/esm2020/lib/form-field/directives/error.directive.mjs +1 -1
  27. package/esm2020/lib/form-field/directives/hint.directive.mjs +1 -1
  28. package/esm2020/lib/form-field/shared/disabled.mixin.mjs +1 -1
  29. package/esm2020/lib/form-field/shared/error-state.mixin.mjs +1 -1
  30. package/esm2020/lib/icon/icon.component.mjs +14 -10
  31. package/esm2020/lib/index.mjs +2 -1
  32. package/esm2020/lib/modal/modal.component.mjs +51 -13
  33. package/esm2020/lib/pagination/pagination.component.mjs +1 -1
  34. package/esm2020/lib/progress-bar/progress-bar.component.mjs +1 -1
  35. package/esm2020/lib/scrollable/scrollable.component.mjs +14 -21
  36. package/esm2020/lib/select-icon/select-icon.component.mjs +1 -1
  37. package/esm2020/lib/spinner/spinner.component.mjs +1 -1
  38. package/esm2020/lib/table/table.component.mjs +1 -1
  39. package/esm2020/lib/text-highlight/text-highlight.component.mjs +1 -1
  40. package/esm2020/services/interaction.service.mjs +13 -3
  41. package/esm2020/utilities/sanitize.mjs +3 -3
  42. package/fesm2015/impartner-design-components.mjs +253 -55
  43. package/fesm2015/impartner-design-components.mjs.map +1 -1
  44. package/fesm2020/impartner-design-components.mjs +250 -54
  45. package/fesm2020/impartner-design-components.mjs.map +1 -1
  46. package/lib/backdrop/backdrop.component.d.ts +5 -3
  47. package/lib/breadcrumb/breadcrumb.component.d.ts +7 -4
  48. package/lib/breadcrumb/breadcrumb.module.d.ts +3 -3
  49. package/lib/data-card/data-card.component.d.ts +72 -0
  50. package/lib/data-card/data-card.module.d.ts +9 -0
  51. package/lib/data-card/index.d.ts +2 -0
  52. package/lib/icon/icon.component.d.ts +6 -4
  53. package/lib/index.d.ts +1 -0
  54. package/lib/modal/modal.component.d.ts +32 -7
  55. package/lib/scrollable/scrollable.component.d.ts +3 -1
  56. package/package.json +2 -2
  57. package/services/interaction.service.d.ts +1 -0
@@ -4,7 +4,7 @@ import * as i1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import * as i2 from '@angular/forms';
6
6
  import { FormsModule, Validators, ReactiveFormsModule, FormControl } from '@angular/forms';
7
- import * as sanitizer from 'sanitize-html';
7
+ import sanitizeHtml from 'sanitize-html';
8
8
  import { nanoid } from 'nanoid';
9
9
  import { Subject, defer, startWith, switchMap, merge, take, takeUntil, BehaviorSubject, debounceTime, distinctUntilChanged, combineLatest, map } from 'rxjs';
10
10
  import * as i4 from '@ng-bootstrap/ng-bootstrap';
@@ -3082,7 +3082,7 @@ function _isNumberValue(value) {
3082
3082
  }
3083
3083
 
3084
3084
  function sanitize(value) {
3085
- return sanitizer(value, {
3085
+ return sanitizeHtml(value, {
3086
3086
  allowedTags: []
3087
3087
  });
3088
3088
  }
@@ -3203,6 +3203,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
3203
3203
  */
3204
3204
  class IconComponent {
3205
3205
  constructor() {
3206
+ this._loading = true;
3207
+ this._licensed = false;
3206
3208
  /**
3207
3209
  * The Font Awesome 5 icon style. Local development may fallback to a free available
3208
3210
  * theme when possible.
@@ -3214,16 +3216,8 @@ class IconComponent {
3214
3216
  */
3215
3217
  this.size = '1.8rem';
3216
3218
  }
3217
- get usingLicensed() {
3218
- if (!this.iconRef?.nativeElement) {
3219
- return false;
3220
- }
3221
- const iconFontFamily = getComputedStyle(this.iconRef?.nativeElement).getPropertyValue('font-family');
3222
- return (iconFontFamily.includes('Font Awesome') &&
3223
- !iconFontFamily.includes('Free'));
3224
- }
3225
3219
  get typeClass() {
3226
- if (this.usingLicensed) {
3220
+ if (this._licensed) {
3227
3221
  switch (this.theme) {
3228
3222
  case 'light':
3229
3223
  return 'fal';
@@ -3247,6 +3241,16 @@ class IconComponent {
3247
3241
  }
3248
3242
  return `${this.size}px`;
3249
3243
  }
3244
+ ngAfterContentChecked() {
3245
+ if (this._loading) {
3246
+ // During init and possibly a few checks, `iconFontFamily` will be an inherited font, later it will be Font Awesome.
3247
+ const iconFontFamily = getComputedStyle(this.iconRef.nativeElement).getPropertyValue('font-family');
3248
+ if (iconFontFamily.includes('Font Awesome')) {
3249
+ this._licensed = !iconFontFamily.includes('Free');
3250
+ this._loading = false;
3251
+ }
3252
+ }
3253
+ }
3250
3254
  }
3251
3255
  IconComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: IconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3252
3256
  IconComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: IconComponent, selector: "impdc-icon, [impdc-icon]", inputs: { name: "name", theme: "theme", size: "size" }, viewQueries: [{ propertyName: "iconRef", first: true, predicate: ["icon"], descendants: true, static: true }], ngImport: i0, template: "<i\n #icon\n class=\"{{ typeClass }} fa-{{ name }}\"\n [style.font-size]=\"computedSize\"></i>\n", encapsulation: i0.ViewEncapsulation.None });
@@ -3514,10 +3518,7 @@ class ModalComponent {
3514
3518
  constructor(_interactionService) {
3515
3519
  this._interactionService = _interactionService;
3516
3520
  this._interactableId = 0;
3517
- /**
3518
- * Determines if the Modal should be shown immediately.
3519
- */
3520
- this.show = false;
3521
+ this._show = false;
3521
3522
  /**
3522
3523
  * The theme of the Modal. Affects the layout of the Modal as well as some colors.
3523
3524
  */
@@ -3535,6 +3536,10 @@ class ModalComponent {
3535
3536
  * The subject text of the Modal.
3536
3537
  */
3537
3538
  this.titleText = '';
3539
+ /**
3540
+ * The fallback button text to accept the Modal. This is bypassed if you content-project the accept button.
3541
+ */
3542
+ this.acceptText = 'OK';
3538
3543
  /**
3539
3544
  * Determines if the Modal should fade in/out.
3540
3545
  */
@@ -3557,6 +3562,12 @@ class ModalComponent {
3557
3562
  this.accept = new EventEmitter();
3558
3563
  this._interactableId = this._interactionService.add(this);
3559
3564
  }
3565
+ /**
3566
+ * Determines if the Modal should be shown immediately.
3567
+ */
3568
+ set show(show) {
3569
+ this._show = show;
3570
+ }
3560
3571
  get interactableId() {
3561
3572
  return this._interactableId;
3562
3573
  }
@@ -3564,7 +3575,7 @@ class ModalComponent {
3564
3575
  return this.interactableId > 0;
3565
3576
  }
3566
3577
  get shown() {
3567
- return this.valid && this.show;
3578
+ return this.valid && this._show;
3568
3579
  }
3569
3580
  get showWorkingIcon() {
3570
3581
  return !!this.iconName && this.theme === ModalTheme.Working;
@@ -3591,26 +3602,46 @@ class ModalComponent {
3591
3602
  this._interactableId = 0;
3592
3603
  }
3593
3604
  handleDismiss(event) {
3594
- if (!this.dismissable) {
3605
+ if (!this.dismissable ||
3606
+ !!this.dismissEl?.nativeElement?.firstChild?.disabled) {
3595
3607
  return;
3596
3608
  }
3597
- this.show = false;
3609
+ this._show = false;
3598
3610
  this.dismiss.emit(event);
3599
3611
  }
3600
3612
  handleDeny(event) {
3601
- this.show = false;
3613
+ if (!!this.denyEl?.nativeElement?.firstChild?.disabled) {
3614
+ return;
3615
+ }
3616
+ this._show = false;
3602
3617
  this.deny.emit(event);
3603
3618
  }
3604
3619
  handleAccept(event) {
3605
- this.show = false;
3620
+ console.log('this.acceptEl', this.acceptEl);
3621
+ if (!!this.acceptEl?.nativeElement?.firstChild?.disabled) {
3622
+ return;
3623
+ }
3624
+ this._show = false;
3606
3625
  this.accept.emit(event);
3607
3626
  }
3627
+ /**
3628
+ * Opens/shows the modal programmatically.
3629
+ */
3630
+ open() {
3631
+ this._show = true;
3632
+ }
3633
+ /**
3634
+ * Closes/hides the modal programmatically.
3635
+ */
3636
+ close() {
3637
+ this._show = false;
3638
+ }
3608
3639
  }
3609
3640
  ModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ModalComponent, deps: [{ token: InteractionService }], target: i0.ɵɵFactoryTarget.Component });
3610
- ModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ModalComponent, selector: "impdc-modal", inputs: { show: "show", theme: "theme", size: "size", iconName: "iconName", iconTheme: "iconTheme", titleText: "titleText", dismissable: "dismissable", fade: "fade", backdrop: "backdrop" }, outputs: { dismiss: "dismiss", deny: "deny", accept: "accept" }, ngImport: i0, template: "<div\n *ngIf=\"valid\"\n class=\"impdc modal\"\n [class.fade]=\"fade\"\n [class.in]=\"fade && shown\"\n [class.show]=\"shown\"\n [class.dismissable]=\"dismissable\"\n tabindex=\"-1\"\n (click)=\"handleDismiss($event); $event.stopPropagation()\"\n (keydown.escape)=\"handleDismiss($event); $event.stopPropagation()\"\n (keydown.enter)=\"handleAccept($event); $event.stopPropagation()\">\n <div\n class=\"modal-dialog modal-dialog-centered modal-dialog-scrollable modal-theme-{{\n theme\n }}\"\n [class.modal-sm]=\"size === 'sm'\"\n [class.modal-lg]=\"size === 'lg'\"\n [class.modal-xl]=\"size === 'xl'\"\n [class.modal-fullscreen]=\"size === 'fs'\"\n [class.modal-fullscreen-lg-down]=\"size !== 'fs'\"\n (click)=\"$event.stopPropagation()\">\n <div class=\"modal-content\">\n <div *ngIf=\"showDestructiveIcon\" class=\"modal-icon\">\n <span impdc-icon [name]=\"iconName\" [theme]=\"iconTheme\"></span>\n </div>\n <div #header class=\"modal-header\" [class.hide]=\"hideHeader\">\n <h3 class=\"modal-title\">\n <span *ngIf=\"showWorkingIcon\" class=\"modal-icon\">\n <span impdc-icon [name]=\"iconName\" [theme]=\"iconTheme\"></span>\n </span>\n <span>{{ titleText }}</span>\n </h3>\n <button\n impdcButton\n *ngIf=\"dismissable\"\n theme=\"close\"\n (click)=\"handleDismiss($event); $event.stopPropagation()\"></button>\n </div>\n <div #bodyEl class=\"modal-body\">\n <ng-content></ng-content>\n </div>\n <div #footer class=\"modal-footer\">\n <span\n #dismissEl\n *ngIf=\"dismissable\"\n [class.hide]=\"!dismissEl.children.length\"\n (click)=\"handleDismiss($event); $event.stopPropagation()\">\n <ng-content select=\"[dismiss]\"></ng-content>\n </span>\n <span\n #denyEl\n [class.hide]=\"!denyEl.children.length\"\n (click)=\"handleDeny($event); $event.stopPropagation()\">\n <ng-content select=\"[deny]\"></ng-content>\n </span>\n <span\n #acceptEl\n [class.hide]=\"!acceptEl.children.length\"\n (click)=\"handleAccept($event); $event.stopPropagation()\">\n <ng-content select=\"[accept]\"></ng-content>\n </span>\n <span\n #acceptFallbackEl\n *ngIf=\"!acceptEl.children.length\"\n (click)=\"handleAccept($event); $event.stopPropagation()\">\n <button impdcButton text=\"OK\" [theme]=\"acceptFallbackTheme\"></button>\n </span>\n </div>\n </div>\n </div>\n</div>\n", styles: [".impdc.modal{-webkit-user-select:none;user-select:none}.impdc.modal .modal-icon{display:inline-flex;justify-content:center;align-items:center;height:40px;width:40px;color:var(--impd-color-gray-500);background:var(--impd-color-gray-100);border-radius:50%;flex-shrink:0}.impdc.modal .modal-icon .fa,.impdc.modal .modal-icon .fa-brands,.impdc.modal .modal-icon .fa-duotone,.impdc.modal .modal-icon .fa-light,.impdc.modal .modal-icon .fa-regular,.impdc.modal .modal-icon .fa-solid,.impdc.modal .modal-icon .fa-thin,.impdc.modal .modal-icon .fab,.impdc.modal .modal-icon .fad,.impdc.modal .modal-icon .fal,.impdc.modal .modal-icon .far,.impdc.modal .modal-icon .fas,.impdc.modal .modal-icon .fat{line-height:var(--impartner-hex-modal-title-line-height)}.impdc.modal.fade.in{background-color:transparent}.impdc.modal.show{display:block;opacity:1}.impdc.modal:not(.show),.impdc.modal.hide,.impdc.modal .hide{display:none}.impdc.modal.dismissable{cursor:pointer}.impdc.modal.dismissable .modal-dialog{cursor:default}.impdc.modal .modal-dialog{cursor:default;-webkit-user-select:auto;user-select:auto}.impdc.modal .modal-theme-simple .modal-header,.impdc.modal .modal-theme-destructive .modal-header{border:0;padding-bottom:0}.impdc.modal .modal-theme-simple .modal-body,.impdc.modal .modal-theme-destructive .modal-body{padding:calc(var(--impartner-hex-modal-padding) * .5) var(--impartner-hex-modal-padding) var(--impartner-hex-modal-padding)}.impdc.modal .modal-theme-simple .modal-footer,.impdc.modal .modal-theme-destructive .modal-footer{border:0;padding-top:0}.impdc.modal .modal-theme-working .modal-footer{padding:calc(var(--impartner-hex-modal-padding) * .5 - var(--impartner-hex-modal-footer-gap) * .5) calc(var(--impartner-hex-modal-padding) - var(--impartner-hex-modal-footer-gap) * .5)}.impdc.modal .modal-theme-destructive .modal-content{display:grid;grid-template-areas:\"modal-icon modal-header\" \"modal-icon modal-body\" \"modal-footer modal-footer\";grid-template-columns:auto 1fr;grid-template-rows:auto 1fr auto}.impdc.modal .modal-theme-destructive .modal-content>.modal-icon{grid-area:modal-icon;margin:var(--impartner-hex-modal-header-padding);margin-right:0;margin-bottom:0}.impdc.modal .modal-theme-destructive .modal-content>.modal-header{grid-area:modal-header;padding-left:16px;margin-top:8px}.impdc.modal .modal-theme-destructive .modal-content>.modal-body{grid-area:modal-body;padding-left:16px}.impdc.modal .modal-theme-destructive .modal-content>.modal-footer{grid-area:modal-footer}.impdc.modal .modal-theme-destructive .modal-icon{color:var(--impd-color-red-600);background:var(--impd-color-red-100)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ButtonComponent, selector: "button[impdcButton]", inputs: ["type", "theme", "text", "disabled", "titleText", "ariaLabel"] }, { kind: "component", type: IconComponent, selector: "impdc-icon, [impdc-icon]", inputs: ["name", "theme", "size"] }] });
3641
+ ModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ModalComponent, selector: "impdc-modal", inputs: { show: "show", theme: "theme", size: "size", iconName: "iconName", iconTheme: "iconTheme", titleText: "titleText", acceptText: "acceptText", dismissable: "dismissable", fade: "fade", backdrop: "backdrop" }, outputs: { dismiss: "dismiss", deny: "deny", accept: "accept" }, viewQueries: [{ propertyName: "dismissEl", first: true, predicate: ["dismissEl"], descendants: true }, { propertyName: "denyEl", first: true, predicate: ["denyEl"], descendants: true }, { propertyName: "acceptEl", first: true, predicate: ["acceptEl"], descendants: true }], ngImport: i0, template: "<div\n *ngIf=\"valid\"\n class=\"impdc modal\"\n [class.fade]=\"fade\"\n [class.in]=\"fade && shown\"\n [class.show]=\"shown\"\n [class.dismissable]=\"dismissable\"\n tabindex=\"-1\"\n (click)=\"handleDismiss($event); $event.stopPropagation()\"\n (keydown.escape)=\"handleDismiss($event); $event.stopPropagation()\"\n (keydown.enter)=\"handleAccept($event); $event.stopPropagation()\">\n <div\n class=\"modal-dialog modal-dialog-centered modal-dialog-scrollable modal-theme-{{\n theme\n }}\"\n [class.modal-sm]=\"size === 'sm'\"\n [class.modal-lg]=\"size === 'lg'\"\n [class.modal-xl]=\"size === 'xl'\"\n [class.modal-fullscreen]=\"size === 'fs'\"\n [class.modal-fullscreen-lg-down]=\"size !== 'fs'\"\n (click)=\"$event.stopPropagation()\">\n <div class=\"modal-content\">\n <div *ngIf=\"showDestructiveIcon\" class=\"modal-icon\">\n <span impdc-icon [name]=\"iconName\" [theme]=\"iconTheme\"></span>\n </div>\n <div #header class=\"modal-header\" [class.hide]=\"hideHeader\">\n <h3 class=\"modal-title\">\n <span *ngIf=\"showWorkingIcon\" class=\"modal-icon\">\n <span impdc-icon [name]=\"iconName\" [theme]=\"iconTheme\"></span>\n </span>\n <span>{{ titleText }}</span>\n </h3>\n <button\n impdcButton\n *ngIf=\"dismissable\"\n theme=\"close\"\n (click)=\"handleDismiss($event); $event.stopPropagation()\"></button>\n </div>\n <div #bodyEl class=\"modal-body\">\n <ng-content></ng-content>\n </div>\n <div #footer class=\"modal-footer\">\n <span\n #dismissEl\n *ngIf=\"dismissable\"\n [class.hide]=\"!dismissEl.children.length\"\n (click)=\"handleDismiss($event); $event.stopPropagation()\">\n <ng-content select=\"[dismiss]\"></ng-content>\n </span>\n <span\n #denyEl\n [class.hide]=\"!denyEl.children.length\"\n (click)=\"handleDeny($event); $event.stopPropagation()\">\n <ng-content select=\"[deny]\"></ng-content>\n </span>\n <span\n #acceptEl\n [class.hide]=\"!acceptEl.children.length\"\n (click)=\"handleAccept($event); $event.stopPropagation()\">\n <ng-content select=\"[accept]\"></ng-content>\n </span>\n <span\n #acceptFallbackEl\n *ngIf=\"!acceptEl.children.length\"\n (click)=\"handleAccept($event); $event.stopPropagation()\">\n <button\n impdcButton\n [text]=\"acceptText\"\n [theme]=\"acceptFallbackTheme\"></button>\n </span>\n </div>\n </div>\n </div>\n</div>\n", styles: [".impdc.modal{-webkit-user-select:none;user-select:none}.impdc.modal .modal-icon{display:inline-flex;justify-content:center;align-items:center;height:40px;width:40px;color:var(--impd-color-gray-500);background:var(--impd-color-gray-100);border-radius:50%;flex-shrink:0}.impdc.modal .modal-icon .fa,.impdc.modal .modal-icon .fa-brands,.impdc.modal .modal-icon .fa-duotone,.impdc.modal .modal-icon .fa-light,.impdc.modal .modal-icon .fa-regular,.impdc.modal .modal-icon .fa-solid,.impdc.modal .modal-icon .fa-thin,.impdc.modal .modal-icon .fab,.impdc.modal .modal-icon .fad,.impdc.modal .modal-icon .fal,.impdc.modal .modal-icon .far,.impdc.modal .modal-icon .fas,.impdc.modal .modal-icon .fat{line-height:var(--impartner-hex-modal-title-line-height)}.impdc.modal.fade.in{background-color:transparent}.impdc.modal.show{display:block;opacity:1}.impdc.modal:not(.show),.impdc.modal.hide,.impdc.modal .hide{display:none}.impdc.modal.dismissable{cursor:pointer}.impdc.modal.dismissable .modal-dialog{cursor:default}.impdc.modal .modal-dialog{cursor:default;-webkit-user-select:auto;user-select:auto}.impdc.modal .modal-theme-simple .modal-header,.impdc.modal .modal-theme-destructive .modal-header{border:0;padding-bottom:0}.impdc.modal .modal-theme-simple .modal-body,.impdc.modal .modal-theme-destructive .modal-body{padding:calc(var(--impartner-hex-modal-padding) * .5) var(--impartner-hex-modal-padding) var(--impartner-hex-modal-padding)}.impdc.modal .modal-theme-simple .modal-footer,.impdc.modal .modal-theme-destructive .modal-footer{border:0;padding-top:0}.impdc.modal .modal-theme-working .modal-footer{padding:calc(var(--impartner-hex-modal-padding) * .5 - var(--impartner-hex-modal-footer-gap) * .5) calc(var(--impartner-hex-modal-padding) - var(--impartner-hex-modal-footer-gap) * .5)}.impdc.modal .modal-theme-destructive .modal-content{display:grid;grid-template-areas:\"modal-icon modal-header\" \"modal-icon modal-body\" \"modal-footer modal-footer\";grid-template-columns:auto 1fr;grid-template-rows:auto 1fr auto}.impdc.modal .modal-theme-destructive .modal-content>.modal-icon{grid-area:modal-icon;margin:var(--impartner-hex-modal-header-padding);margin-right:0;margin-bottom:0}.impdc.modal .modal-theme-destructive .modal-content>.modal-header{grid-area:modal-header;padding-left:16px;margin-top:8px;justify-content:unset}.impdc.modal .modal-theme-destructive .modal-content>.modal-body{grid-area:modal-body;padding-left:16px}.impdc.modal .modal-theme-destructive .modal-content>.modal-footer{grid-area:modal-footer}.impdc.modal .modal-theme-destructive .modal-icon{color:var(--impd-color-red-600);background:var(--impd-color-red-100)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ButtonComponent, selector: "button[impdcButton]", inputs: ["type", "theme", "text", "disabled", "titleText", "ariaLabel"] }, { kind: "component", type: IconComponent, selector: "impdc-icon, [impdc-icon]", inputs: ["name", "theme", "size"] }] });
3611
3642
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ModalComponent, decorators: [{
3612
3643
  type: Component,
3613
- args: [{ selector: 'impdc-modal', template: "<div\n *ngIf=\"valid\"\n class=\"impdc modal\"\n [class.fade]=\"fade\"\n [class.in]=\"fade && shown\"\n [class.show]=\"shown\"\n [class.dismissable]=\"dismissable\"\n tabindex=\"-1\"\n (click)=\"handleDismiss($event); $event.stopPropagation()\"\n (keydown.escape)=\"handleDismiss($event); $event.stopPropagation()\"\n (keydown.enter)=\"handleAccept($event); $event.stopPropagation()\">\n <div\n class=\"modal-dialog modal-dialog-centered modal-dialog-scrollable modal-theme-{{\n theme\n }}\"\n [class.modal-sm]=\"size === 'sm'\"\n [class.modal-lg]=\"size === 'lg'\"\n [class.modal-xl]=\"size === 'xl'\"\n [class.modal-fullscreen]=\"size === 'fs'\"\n [class.modal-fullscreen-lg-down]=\"size !== 'fs'\"\n (click)=\"$event.stopPropagation()\">\n <div class=\"modal-content\">\n <div *ngIf=\"showDestructiveIcon\" class=\"modal-icon\">\n <span impdc-icon [name]=\"iconName\" [theme]=\"iconTheme\"></span>\n </div>\n <div #header class=\"modal-header\" [class.hide]=\"hideHeader\">\n <h3 class=\"modal-title\">\n <span *ngIf=\"showWorkingIcon\" class=\"modal-icon\">\n <span impdc-icon [name]=\"iconName\" [theme]=\"iconTheme\"></span>\n </span>\n <span>{{ titleText }}</span>\n </h3>\n <button\n impdcButton\n *ngIf=\"dismissable\"\n theme=\"close\"\n (click)=\"handleDismiss($event); $event.stopPropagation()\"></button>\n </div>\n <div #bodyEl class=\"modal-body\">\n <ng-content></ng-content>\n </div>\n <div #footer class=\"modal-footer\">\n <span\n #dismissEl\n *ngIf=\"dismissable\"\n [class.hide]=\"!dismissEl.children.length\"\n (click)=\"handleDismiss($event); $event.stopPropagation()\">\n <ng-content select=\"[dismiss]\"></ng-content>\n </span>\n <span\n #denyEl\n [class.hide]=\"!denyEl.children.length\"\n (click)=\"handleDeny($event); $event.stopPropagation()\">\n <ng-content select=\"[deny]\"></ng-content>\n </span>\n <span\n #acceptEl\n [class.hide]=\"!acceptEl.children.length\"\n (click)=\"handleAccept($event); $event.stopPropagation()\">\n <ng-content select=\"[accept]\"></ng-content>\n </span>\n <span\n #acceptFallbackEl\n *ngIf=\"!acceptEl.children.length\"\n (click)=\"handleAccept($event); $event.stopPropagation()\">\n <button impdcButton text=\"OK\" [theme]=\"acceptFallbackTheme\"></button>\n </span>\n </div>\n </div>\n </div>\n</div>\n", styles: [".impdc.modal{-webkit-user-select:none;user-select:none}.impdc.modal .modal-icon{display:inline-flex;justify-content:center;align-items:center;height:40px;width:40px;color:var(--impd-color-gray-500);background:var(--impd-color-gray-100);border-radius:50%;flex-shrink:0}.impdc.modal .modal-icon .fa,.impdc.modal .modal-icon .fa-brands,.impdc.modal .modal-icon .fa-duotone,.impdc.modal .modal-icon .fa-light,.impdc.modal .modal-icon .fa-regular,.impdc.modal .modal-icon .fa-solid,.impdc.modal .modal-icon .fa-thin,.impdc.modal .modal-icon .fab,.impdc.modal .modal-icon .fad,.impdc.modal .modal-icon .fal,.impdc.modal .modal-icon .far,.impdc.modal .modal-icon .fas,.impdc.modal .modal-icon .fat{line-height:var(--impartner-hex-modal-title-line-height)}.impdc.modal.fade.in{background-color:transparent}.impdc.modal.show{display:block;opacity:1}.impdc.modal:not(.show),.impdc.modal.hide,.impdc.modal .hide{display:none}.impdc.modal.dismissable{cursor:pointer}.impdc.modal.dismissable .modal-dialog{cursor:default}.impdc.modal .modal-dialog{cursor:default;-webkit-user-select:auto;user-select:auto}.impdc.modal .modal-theme-simple .modal-header,.impdc.modal .modal-theme-destructive .modal-header{border:0;padding-bottom:0}.impdc.modal .modal-theme-simple .modal-body,.impdc.modal .modal-theme-destructive .modal-body{padding:calc(var(--impartner-hex-modal-padding) * .5) var(--impartner-hex-modal-padding) var(--impartner-hex-modal-padding)}.impdc.modal .modal-theme-simple .modal-footer,.impdc.modal .modal-theme-destructive .modal-footer{border:0;padding-top:0}.impdc.modal .modal-theme-working .modal-footer{padding:calc(var(--impartner-hex-modal-padding) * .5 - var(--impartner-hex-modal-footer-gap) * .5) calc(var(--impartner-hex-modal-padding) - var(--impartner-hex-modal-footer-gap) * .5)}.impdc.modal .modal-theme-destructive .modal-content{display:grid;grid-template-areas:\"modal-icon modal-header\" \"modal-icon modal-body\" \"modal-footer modal-footer\";grid-template-columns:auto 1fr;grid-template-rows:auto 1fr auto}.impdc.modal .modal-theme-destructive .modal-content>.modal-icon{grid-area:modal-icon;margin:var(--impartner-hex-modal-header-padding);margin-right:0;margin-bottom:0}.impdc.modal .modal-theme-destructive .modal-content>.modal-header{grid-area:modal-header;padding-left:16px;margin-top:8px}.impdc.modal .modal-theme-destructive .modal-content>.modal-body{grid-area:modal-body;padding-left:16px}.impdc.modal .modal-theme-destructive .modal-content>.modal-footer{grid-area:modal-footer}.impdc.modal .modal-theme-destructive .modal-icon{color:var(--impd-color-red-600);background:var(--impd-color-red-100)}\n"] }]
3644
+ args: [{ selector: 'impdc-modal', template: "<div\n *ngIf=\"valid\"\n class=\"impdc modal\"\n [class.fade]=\"fade\"\n [class.in]=\"fade && shown\"\n [class.show]=\"shown\"\n [class.dismissable]=\"dismissable\"\n tabindex=\"-1\"\n (click)=\"handleDismiss($event); $event.stopPropagation()\"\n (keydown.escape)=\"handleDismiss($event); $event.stopPropagation()\"\n (keydown.enter)=\"handleAccept($event); $event.stopPropagation()\">\n <div\n class=\"modal-dialog modal-dialog-centered modal-dialog-scrollable modal-theme-{{\n theme\n }}\"\n [class.modal-sm]=\"size === 'sm'\"\n [class.modal-lg]=\"size === 'lg'\"\n [class.modal-xl]=\"size === 'xl'\"\n [class.modal-fullscreen]=\"size === 'fs'\"\n [class.modal-fullscreen-lg-down]=\"size !== 'fs'\"\n (click)=\"$event.stopPropagation()\">\n <div class=\"modal-content\">\n <div *ngIf=\"showDestructiveIcon\" class=\"modal-icon\">\n <span impdc-icon [name]=\"iconName\" [theme]=\"iconTheme\"></span>\n </div>\n <div #header class=\"modal-header\" [class.hide]=\"hideHeader\">\n <h3 class=\"modal-title\">\n <span *ngIf=\"showWorkingIcon\" class=\"modal-icon\">\n <span impdc-icon [name]=\"iconName\" [theme]=\"iconTheme\"></span>\n </span>\n <span>{{ titleText }}</span>\n </h3>\n <button\n impdcButton\n *ngIf=\"dismissable\"\n theme=\"close\"\n (click)=\"handleDismiss($event); $event.stopPropagation()\"></button>\n </div>\n <div #bodyEl class=\"modal-body\">\n <ng-content></ng-content>\n </div>\n <div #footer class=\"modal-footer\">\n <span\n #dismissEl\n *ngIf=\"dismissable\"\n [class.hide]=\"!dismissEl.children.length\"\n (click)=\"handleDismiss($event); $event.stopPropagation()\">\n <ng-content select=\"[dismiss]\"></ng-content>\n </span>\n <span\n #denyEl\n [class.hide]=\"!denyEl.children.length\"\n (click)=\"handleDeny($event); $event.stopPropagation()\">\n <ng-content select=\"[deny]\"></ng-content>\n </span>\n <span\n #acceptEl\n [class.hide]=\"!acceptEl.children.length\"\n (click)=\"handleAccept($event); $event.stopPropagation()\">\n <ng-content select=\"[accept]\"></ng-content>\n </span>\n <span\n #acceptFallbackEl\n *ngIf=\"!acceptEl.children.length\"\n (click)=\"handleAccept($event); $event.stopPropagation()\">\n <button\n impdcButton\n [text]=\"acceptText\"\n [theme]=\"acceptFallbackTheme\"></button>\n </span>\n </div>\n </div>\n </div>\n</div>\n", styles: [".impdc.modal{-webkit-user-select:none;user-select:none}.impdc.modal .modal-icon{display:inline-flex;justify-content:center;align-items:center;height:40px;width:40px;color:var(--impd-color-gray-500);background:var(--impd-color-gray-100);border-radius:50%;flex-shrink:0}.impdc.modal .modal-icon .fa,.impdc.modal .modal-icon .fa-brands,.impdc.modal .modal-icon .fa-duotone,.impdc.modal .modal-icon .fa-light,.impdc.modal .modal-icon .fa-regular,.impdc.modal .modal-icon .fa-solid,.impdc.modal .modal-icon .fa-thin,.impdc.modal .modal-icon .fab,.impdc.modal .modal-icon .fad,.impdc.modal .modal-icon .fal,.impdc.modal .modal-icon .far,.impdc.modal .modal-icon .fas,.impdc.modal .modal-icon .fat{line-height:var(--impartner-hex-modal-title-line-height)}.impdc.modal.fade.in{background-color:transparent}.impdc.modal.show{display:block;opacity:1}.impdc.modal:not(.show),.impdc.modal.hide,.impdc.modal .hide{display:none}.impdc.modal.dismissable{cursor:pointer}.impdc.modal.dismissable .modal-dialog{cursor:default}.impdc.modal .modal-dialog{cursor:default;-webkit-user-select:auto;user-select:auto}.impdc.modal .modal-theme-simple .modal-header,.impdc.modal .modal-theme-destructive .modal-header{border:0;padding-bottom:0}.impdc.modal .modal-theme-simple .modal-body,.impdc.modal .modal-theme-destructive .modal-body{padding:calc(var(--impartner-hex-modal-padding) * .5) var(--impartner-hex-modal-padding) var(--impartner-hex-modal-padding)}.impdc.modal .modal-theme-simple .modal-footer,.impdc.modal .modal-theme-destructive .modal-footer{border:0;padding-top:0}.impdc.modal .modal-theme-working .modal-footer{padding:calc(var(--impartner-hex-modal-padding) * .5 - var(--impartner-hex-modal-footer-gap) * .5) calc(var(--impartner-hex-modal-padding) - var(--impartner-hex-modal-footer-gap) * .5)}.impdc.modal .modal-theme-destructive .modal-content{display:grid;grid-template-areas:\"modal-icon modal-header\" \"modal-icon modal-body\" \"modal-footer modal-footer\";grid-template-columns:auto 1fr;grid-template-rows:auto 1fr auto}.impdc.modal .modal-theme-destructive .modal-content>.modal-icon{grid-area:modal-icon;margin:var(--impartner-hex-modal-header-padding);margin-right:0;margin-bottom:0}.impdc.modal .modal-theme-destructive .modal-content>.modal-header{grid-area:modal-header;padding-left:16px;margin-top:8px;justify-content:unset}.impdc.modal .modal-theme-destructive .modal-content>.modal-body{grid-area:modal-body;padding-left:16px}.impdc.modal .modal-theme-destructive .modal-content>.modal-footer{grid-area:modal-footer}.impdc.modal .modal-theme-destructive .modal-icon{color:var(--impd-color-red-600);background:var(--impd-color-red-100)}\n"] }]
3614
3645
  }], ctorParameters: function () { return [{ type: InteractionService }]; }, propDecorators: { show: [{
3615
3646
  type: Input
3616
3647
  }], theme: [{
@@ -3623,12 +3654,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
3623
3654
  type: Input
3624
3655
  }], titleText: [{
3625
3656
  type: Input
3657
+ }], acceptText: [{
3658
+ type: Input
3626
3659
  }], dismissable: [{
3627
3660
  type: Input
3628
3661
  }], fade: [{
3629
3662
  type: Input
3630
3663
  }], backdrop: [{
3631
3664
  type: Input
3665
+ }], dismissEl: [{
3666
+ type: ViewChild,
3667
+ args: ['dismissEl', { static: false }]
3668
+ }], denyEl: [{
3669
+ type: ViewChild,
3670
+ args: ['denyEl', { static: false }]
3671
+ }], acceptEl: [{
3672
+ type: ViewChild,
3673
+ args: ['acceptEl', { static: false }]
3632
3674
  }], dismiss: [{
3633
3675
  type: Output
3634
3676
  }], deny: [{
@@ -3656,9 +3698,15 @@ class BackdropComponent {
3656
3698
  ngOnInit() {
3657
3699
  this.interactionService.registerBackdrop(this);
3658
3700
  }
3701
+ ngOnDestroy() {
3702
+ this.interactionService.unregisterBackdrop(this);
3703
+ }
3659
3704
  invalidate() {
3660
3705
  this._valid = false;
3661
3706
  }
3707
+ validate() {
3708
+ this._valid = true;
3709
+ }
3662
3710
  }
3663
3711
  BackdropComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BackdropComponent, deps: [{ token: InteractionService }], target: i0.ɵɵFactoryTarget.Component });
3664
3712
  BackdropComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: BackdropComponent, selector: "impdc-backdrop", ngImport: i0, template: "<div *ngIf=\"valid\" class=\"impdc modal-backdrop fade\" [class.show]=\"show\"></div>\n", styles: [".impdc.modal-backdrop{position:fixed;left:0;top:0;width:100vw;height:100vh;-webkit-user-select:none;user-select:none}.impdc.modal-backdrop.fade{transition:opacity .3s linear}.impdc.modal-backdrop:not(.show){height:0;opacity:0;pointer-events:none}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
@@ -5508,6 +5556,7 @@ class RadioGroupDirective extends _RadioGroupDirectiveBase {
5508
5556
  /** @ignore */
5509
5557
  emitChangesEvent() {
5510
5558
  if (this._initialized) {
5559
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
5511
5560
  this.change.emit({ source: this._selected, value: this._value });
5512
5561
  }
5513
5562
  }
@@ -5850,6 +5899,7 @@ class SelectModel {
5850
5899
  }
5851
5900
  sort(predicateFunc) {
5852
5901
  if (this._multiple && this.selected) {
5902
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
5853
5903
  this._selected.sort(predicateFunc);
5854
5904
  }
5855
5905
  }
@@ -7198,25 +7248,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
7198
7248
  * To use, import `BreadcrumbModule` or another module that imports and exports that module from `@impartner/design-components`.
7199
7249
  */
7200
7250
  class BreadcrumbComponent {
7201
- constructor() {
7251
+ constructor(_changeDetectorRef) {
7252
+ this._changeDetectorRef = _changeDetectorRef;
7202
7253
  /**
7203
7254
  * Sets the `aria-label` attribute for the Breadcrumb's `nav` element for accessibility.
7204
7255
  */
7205
7256
  this.label = '';
7206
7257
  this.impdcBreadcrumb = true;
7207
7258
  }
7259
+ ngAfterViewInit() {
7260
+ this._changeDetectorRef.detectChanges();
7261
+ }
7208
7262
  }
7209
- BreadcrumbComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BreadcrumbComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7210
- BreadcrumbComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: BreadcrumbComponent, selector: "impdc-breadcrumb, div[impdc-breadcrumb]", inputs: { label: "label" }, host: { properties: { "class.impdc-breadcrumb": "this.impdcBreadcrumb" } }, queries: [{ propertyName: "_breadcrumbs", predicate: BreadcrumbItemComponent }], ngImport: i0, template: "<nav [attr.aria-label]=\"label || null\" class=\"impdc-breadcrumb\">\n <ol>\n <li *ngFor=\"let breadcrumb of _breadcrumbs; last as isLast\">\n <span class=\"impdc-crumb\" [attr.aria-current]=\"isLast ? 'page' : null\">\n <ng-template\n [ngTemplateOutlet]=\"breadcrumb.contentTemplate\"></ng-template>\n </span>\n </li>\n </ol>\n</nav>\n", styles: [".impdc-breadcrumb ol{margin:0;padding-left:0;list-style:none}.impdc-breadcrumb li{display:inline;color:var(--impd-color-gray-500, #6b7280);font-weight:500;font-size:var(--impd-font-size-sm, 14px)}.impdc-breadcrumb li:hover{cursor:default;color:var(--impd-color-gray-700, #374151)}.impdc-breadcrumb li .impdc-crumb{--impartner-hex-link-color: var(--impd-color-gray-500, #6b7280);--impartner-hex-link-hover-color: var(--impd-color-gray-700, #374151);padding-left:.8rem;padding-right:.8rem}.impdc-breadcrumb li:first-child .impdc-crumb{padding-left:0}.impdc-breadcrumb li:last-child .impdc-crumb{padding-right:0}.impdc-breadcrumb li+li:before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--impd-color-gray-400, #6b7280);content:\"\\f054\";display:inline-block;font-family:\"Font Awesome 6 Pro\",\"Font Awesome 6 Free\",\"Font Awesome 5 Pro\",\"Font Awesome 5 Free\";font-size:10px;font-style:normal;font-feature-settings:normal;font-variant:normal;font-weight:900;line-height:1;text-align:center;text-rendering:auto;width:2rem}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], encapsulation: i0.ViewEncapsulation.None });
7263
+ BreadcrumbComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BreadcrumbComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
7264
+ BreadcrumbComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: BreadcrumbComponent, selector: "impdc-breadcrumb, div[impdc-breadcrumb]", inputs: { label: "label" }, host: { properties: { "class.impdc-breadcrumb": "this.impdcBreadcrumb" } }, queries: [{ propertyName: "breadcrumbItems", predicate: BreadcrumbItemComponent }], ngImport: i0, template: "<nav class=\"impdc-breadcrumb\" [attr.aria-label]=\"label || 'breadcrumb'\">\n <ol>\n <li\n *ngFor=\"let breadcrumbItem of breadcrumbItems; last as isLast\"\n [attr.aria-current]=\"isLast ? 'page' : undefined\">\n <ng-container\n [ngTemplateOutlet]=\"breadcrumbItem.contentTemplate\"></ng-container>\n </li>\n </ol>\n</nav>\n", styles: [".impdc-breadcrumb{--impartner-hex-link-color: var(--impd-color-gray-500, #6b7280);--impartner-hex-link-hover-color: var(--impd-color-gray-700, #374151);font-size:var(--impd-font-size-sm, 1.4rem);line-height:2rem;color:var(--impd-color-gray-500, #6b7280);font-weight:500}.impdc-breadcrumb a:not([href]):not([class]){color:var(--impartner-hex-link-color)}.impdc-breadcrumb a:not([href]):not([class]):hover{color:var(--impartner-hex-link-hover-color)}.impdc-breadcrumb ol,.impdc-breadcrumb ol li.impdc-crumb{display:inline-flex;align-items:center;vertical-align:middle}.impdc-breadcrumb ol{margin:0;padding-left:0;list-style:none}.impdc-breadcrumb li+li:before{margin:0 .8rem;display:inline-flex;align-items:center;justify-content:center;text-align:center;width:2rem;font-family:\"Font Awesome 6 Pro\",\"Font Awesome 6 Free\",\"Font Awesome 5 Pro\",\"Font Awesome 5 Free\";font-size:var(--impd-font-size-sm, 1.4rem);line-height:2rem;color:var(--impd-color-gray-400, #6b7280);font-weight:900;content:\"\\f054\";text-rendering:auto;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], encapsulation: i0.ViewEncapsulation.None });
7211
7265
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BreadcrumbComponent, decorators: [{
7212
7266
  type: Component,
7213
- args: [{ selector: 'impdc-breadcrumb, div[impdc-breadcrumb]', encapsulation: ViewEncapsulation.None, template: "<nav [attr.aria-label]=\"label || null\" class=\"impdc-breadcrumb\">\n <ol>\n <li *ngFor=\"let breadcrumb of _breadcrumbs; last as isLast\">\n <span class=\"impdc-crumb\" [attr.aria-current]=\"isLast ? 'page' : null\">\n <ng-template\n [ngTemplateOutlet]=\"breadcrumb.contentTemplate\"></ng-template>\n </span>\n </li>\n </ol>\n</nav>\n", styles: [".impdc-breadcrumb ol{margin:0;padding-left:0;list-style:none}.impdc-breadcrumb li{display:inline;color:var(--impd-color-gray-500, #6b7280);font-weight:500;font-size:var(--impd-font-size-sm, 14px)}.impdc-breadcrumb li:hover{cursor:default;color:var(--impd-color-gray-700, #374151)}.impdc-breadcrumb li .impdc-crumb{--impartner-hex-link-color: var(--impd-color-gray-500, #6b7280);--impartner-hex-link-hover-color: var(--impd-color-gray-700, #374151);padding-left:.8rem;padding-right:.8rem}.impdc-breadcrumb li:first-child .impdc-crumb{padding-left:0}.impdc-breadcrumb li:last-child .impdc-crumb{padding-right:0}.impdc-breadcrumb li+li:before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--impd-color-gray-400, #6b7280);content:\"\\f054\";display:inline-block;font-family:\"Font Awesome 6 Pro\",\"Font Awesome 6 Free\",\"Font Awesome 5 Pro\",\"Font Awesome 5 Free\";font-size:10px;font-style:normal;font-feature-settings:normal;font-variant:normal;font-weight:900;line-height:1;text-align:center;text-rendering:auto;width:2rem}\n"] }]
7214
- }], propDecorators: { label: [{
7267
+ args: [{ selector: 'impdc-breadcrumb, div[impdc-breadcrumb]', encapsulation: ViewEncapsulation.None, template: "<nav class=\"impdc-breadcrumb\" [attr.aria-label]=\"label || 'breadcrumb'\">\n <ol>\n <li\n *ngFor=\"let breadcrumbItem of breadcrumbItems; last as isLast\"\n [attr.aria-current]=\"isLast ? 'page' : undefined\">\n <ng-container\n [ngTemplateOutlet]=\"breadcrumbItem.contentTemplate\"></ng-container>\n </li>\n </ol>\n</nav>\n", styles: [".impdc-breadcrumb{--impartner-hex-link-color: var(--impd-color-gray-500, #6b7280);--impartner-hex-link-hover-color: var(--impd-color-gray-700, #374151);font-size:var(--impd-font-size-sm, 1.4rem);line-height:2rem;color:var(--impd-color-gray-500, #6b7280);font-weight:500}.impdc-breadcrumb a:not([href]):not([class]){color:var(--impartner-hex-link-color)}.impdc-breadcrumb a:not([href]):not([class]):hover{color:var(--impartner-hex-link-hover-color)}.impdc-breadcrumb ol,.impdc-breadcrumb ol li.impdc-crumb{display:inline-flex;align-items:center;vertical-align:middle}.impdc-breadcrumb ol{margin:0;padding-left:0;list-style:none}.impdc-breadcrumb li+li:before{margin:0 .8rem;display:inline-flex;align-items:center;justify-content:center;text-align:center;width:2rem;font-family:\"Font Awesome 6 Pro\",\"Font Awesome 6 Free\",\"Font Awesome 5 Pro\",\"Font Awesome 5 Free\";font-size:var(--impd-font-size-sm, 1.4rem);line-height:2rem;color:var(--impd-color-gray-400, #6b7280);font-weight:900;content:\"\\f054\";text-rendering:auto;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}\n"] }]
7268
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { label: [{
7215
7269
  type: Input
7216
7270
  }], impdcBreadcrumb: [{
7217
7271
  type: HostBinding,
7218
7272
  args: ['class.impdc-breadcrumb']
7219
- }], _breadcrumbs: [{
7273
+ }], breadcrumbItems: [{
7220
7274
  type: ContentChildren,
7221
7275
  args: [BreadcrumbItemComponent]
7222
7276
  }] } });
@@ -7224,14 +7278,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
7224
7278
  class BreadcrumbModule {
7225
7279
  }
7226
7280
  BreadcrumbModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BreadcrumbModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
7227
- BreadcrumbModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.2.12", ngImport: i0, type: BreadcrumbModule, declarations: [BreadcrumbComponent, BreadcrumbItemComponent], imports: [CommonModule], exports: [BreadcrumbComponent, BreadcrumbItemComponent] });
7281
+ BreadcrumbModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.2.12", ngImport: i0, type: BreadcrumbModule, declarations: [BreadcrumbItemComponent, BreadcrumbComponent], imports: [CommonModule], exports: [BreadcrumbItemComponent, BreadcrumbComponent] });
7228
7282
  BreadcrumbModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BreadcrumbModule, imports: [CommonModule] });
7229
7283
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BreadcrumbModule, decorators: [{
7230
7284
  type: NgModule,
7231
7285
  args: [{
7232
- declarations: [BreadcrumbComponent, BreadcrumbItemComponent],
7286
+ declarations: [BreadcrumbItemComponent, BreadcrumbComponent],
7233
7287
  imports: [CommonModule],
7234
- exports: [BreadcrumbComponent, BreadcrumbItemComponent]
7288
+ exports: [BreadcrumbItemComponent, BreadcrumbComponent]
7235
7289
  }]
7236
7290
  }] });
7237
7291
 
@@ -7670,8 +7724,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
7670
7724
  * `ScrollableModule` also imports and exports [BrandingModule](./?path=/docs/design-components-directives-impdcbranded).
7671
7725
  */
7672
7726
  class ScrollableComponent {
7673
- constructor(_cd) {
7727
+ constructor(_cd, _hostElementRef) {
7674
7728
  this._cd = _cd;
7729
+ this._hostElementRef = _hostElementRef;
7730
+ this.GET_ANCESTOR_BG_SEARCH_DEPTH = 64;
7675
7731
  /**
7676
7732
  * The base amount to scroll.
7677
7733
  */
@@ -7715,12 +7771,11 @@ class ScrollableComponent {
7715
7771
  this._cd.detectChanges();
7716
7772
  }
7717
7773
  }
7718
- this._getBackgroundColorForButtons();
7719
7774
  }
7720
7775
  ngAfterViewInit() {
7721
7776
  this._width = this.contentRef?.nativeElement.width;
7722
- this._getBackgroundColorForButtons();
7723
7777
  this._cd.detectChanges();
7778
+ Promise.resolve().then(() => this._getBackgroundColorForButtons());
7724
7779
  }
7725
7780
  async scroll(direction) {
7726
7781
  if (!this._contentElement) {
@@ -7779,29 +7834,21 @@ class ScrollableComponent {
7779
7834
  return promise;
7780
7835
  }
7781
7836
  _getBackgroundColorForButtons() {
7782
- if (!this.contentRef) {
7783
- return;
7784
- }
7785
- const projectedElementCollection = this.contentRef.nativeElement.children;
7786
- if (!projectedElementCollection || !projectedElementCollection.length) {
7787
- return;
7788
- }
7789
- const firstElement = projectedElementCollection[0];
7790
- let backgroundColor = this._getBackGroundColor(firstElement);
7837
+ let backgroundColor = this._getBackGroundColor(this._hostElementRef.nativeElement);
7791
7838
  if (!backgroundColor) {
7792
7839
  backgroundColor = this._getAncestorBackgroundColor();
7793
7840
  }
7794
- this._scrollableBgColor = backgroundColor;
7841
+ if (this._scrollableBgColor !== backgroundColor) {
7842
+ this._scrollableBgColor = backgroundColor;
7843
+ this._cd.detectChanges();
7844
+ }
7795
7845
  }
7796
7846
  _getAncestorBackgroundColor() {
7797
- if (!this.contentRef) {
7798
- return null;
7799
- }
7800
7847
  let result = {
7801
- parent: this.contentRef.nativeElement.parentElement,
7848
+ parent: this._hostElementRef.nativeElement.parentElement,
7802
7849
  backgroundColor: null
7803
7850
  };
7804
- let count = 6;
7851
+ let count = this.GET_ANCESTOR_BG_SEARCH_DEPTH;
7805
7852
  function getParentBackgroundColor(currentContext, getBackgroundColor) {
7806
7853
  const result = { parent: null, backgroundColor: null };
7807
7854
  if (currentContext && currentContext.parent) {
@@ -7832,12 +7879,12 @@ class ScrollableComponent {
7832
7879
  return element.style.backgroundColor;
7833
7880
  }
7834
7881
  }
7835
- ScrollableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ScrollableComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
7882
+ ScrollableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ScrollableComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
7836
7883
  ScrollableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ScrollableComponent, selector: "impdc-scrollable, div[impdc-scrollable]", inputs: { scrollUnit: "scrollUnit", clickScrollMultiplier: "clickScrollMultiplier" }, host: { properties: { "style.--impdc-scrollable-bg": "this._scrollableBgColor" } }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true }, { propertyName: "contentRef", first: true, predicate: ["content"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"impdc-scrollable\"\n #container\n impdcSizeDetector\n (resized)=\"widthChanged($event)\">\n <a class=\"impdc-scrollable-left\" (click)=\"scroll(-1)\" *ngIf=\"canScrollLeft\">\n <i class=\"fas fa-chevron-left default\"></i>\n </a>\n <div #content class=\"content-container\">\n <ng-content></ng-content>\n </div>\n <a class=\"impdc-scrollable-right\" (click)=\"scroll(1)\" *ngIf=\"canScrollRight\">\n <i class=\"fas fa-chevron-right default\"></i>\n </a>\n</div>\n", styles: [".impdc-scrollable{position:relative;overflow-y:hidden}.impdc-scrollable .impdc-scrollable-base,.impdc-scrollable .impdc-scrollable-right,.impdc-scrollable .impdc-scrollable-left{position:absolute;top:0px;bottom:0px;display:flex;align-items:center;text-align:center;width:6.9rem;z-index:1;color:var(--impd-color-motion-blue-600, #01606d)}.impdc-scrollable .impdc-scrollable-left{justify-content:left;padding-left:1.5rem;background-image:linear-gradient(to right,var(--impdc-scrollable-bg, #fff) 50%,rgba(255,255,255,.0001) 86.46%)}.impdc-scrollable .impdc-scrollable-right{right:0;padding-right:1.5rem;justify-content:right;background-image:linear-gradient(to left,var(--impdc-scrollable-bg, #fff) 50%,rgba(255,255,255,.0001) 86.46%)}.impdc-scrollable .content-container{overflow-x:hidden;-webkit-overflow-scrolling:touch;white-space:nowrap}:host(.branded) .impdc-scrollable .impdc-scrollable-left,:host(.branded) .impdc-scrollable .impdc-scrollable-right{color:var(--px-primary-color, var(--impd-color-motion-blue-600, #01606d))}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: SizeDetectorDirective, selector: "[impdcSizeDetector]", outputs: ["resized"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7837
7884
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ScrollableComponent, decorators: [{
7838
7885
  type: Component,
7839
7886
  args: [{ selector: 'impdc-scrollable, div[impdc-scrollable]', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"impdc-scrollable\"\n #container\n impdcSizeDetector\n (resized)=\"widthChanged($event)\">\n <a class=\"impdc-scrollable-left\" (click)=\"scroll(-1)\" *ngIf=\"canScrollLeft\">\n <i class=\"fas fa-chevron-left default\"></i>\n </a>\n <div #content class=\"content-container\">\n <ng-content></ng-content>\n </div>\n <a class=\"impdc-scrollable-right\" (click)=\"scroll(1)\" *ngIf=\"canScrollRight\">\n <i class=\"fas fa-chevron-right default\"></i>\n </a>\n</div>\n", styles: [".impdc-scrollable{position:relative;overflow-y:hidden}.impdc-scrollable .impdc-scrollable-base,.impdc-scrollable .impdc-scrollable-right,.impdc-scrollable .impdc-scrollable-left{position:absolute;top:0px;bottom:0px;display:flex;align-items:center;text-align:center;width:6.9rem;z-index:1;color:var(--impd-color-motion-blue-600, #01606d)}.impdc-scrollable .impdc-scrollable-left{justify-content:left;padding-left:1.5rem;background-image:linear-gradient(to right,var(--impdc-scrollable-bg, #fff) 50%,rgba(255,255,255,.0001) 86.46%)}.impdc-scrollable .impdc-scrollable-right{right:0;padding-right:1.5rem;justify-content:right;background-image:linear-gradient(to left,var(--impdc-scrollable-bg, #fff) 50%,rgba(255,255,255,.0001) 86.46%)}.impdc-scrollable .content-container{overflow-x:hidden;-webkit-overflow-scrolling:touch;white-space:nowrap}:host(.branded) .impdc-scrollable .impdc-scrollable-left,:host(.branded) .impdc-scrollable .impdc-scrollable-right{color:var(--px-primary-color, var(--impd-color-motion-blue-600, #01606d))}\n"] }]
7840
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { scrollUnit: [{
7887
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { scrollUnit: [{
7841
7888
  type: Input
7842
7889
  }], clickScrollMultiplier: [{
7843
7890
  type: Input
@@ -8201,6 +8248,145 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
8201
8248
  }]
8202
8249
  }] });
8203
8250
 
8251
+ /**
8252
+ * The `CardHeadingComponent` (`<impdc-data-card` or `<any impdc-data-card`) is to display data snapshots with support for
8253
+ * previous values and differences.
8254
+ * To use, import `DataCardModule` or another module that imports and exports that module from `@impartner/design-components`.
8255
+ */
8256
+ class DataCardComponent {
8257
+ constructor() {
8258
+ /**
8259
+ * The subject text for the Data Card.
8260
+ */
8261
+ this.title = '';
8262
+ /**
8263
+ * The current data value. Any number/currency format is supported.
8264
+ */
8265
+ this.current = '0';
8266
+ /**
8267
+ * The previous data value. Any number/currency format is supported.
8268
+ */
8269
+ this.previous = '';
8270
+ /**
8271
+ * The difference between the current and previous values. A numerical or percentage value is preferred,
8272
+ * but any number/currency format is supported.
8273
+ */
8274
+ this.difference = '';
8275
+ /**
8276
+ * Text for the link at the bottom of the Data Card. If provided, enables the `linkClicked` event to be emitted.
8277
+ */
8278
+ this.linkText = '';
8279
+ /**
8280
+ * When stacking multiple Data Card elements together, it's common to combine their borders.
8281
+ */
8282
+ this.sharedBorders = true;
8283
+ /**
8284
+ * Makes the title stand out more than it does by default.
8285
+ */
8286
+ // @Input()
8287
+ this.titleAttention = false;
8288
+ /**
8289
+ * Determines if the difference value will be wrapped in a `rounded-pill`.
8290
+ */
8291
+ this.differencePill = false;
8292
+ /**
8293
+ * Changes the text color for the current value.
8294
+ */
8295
+ this.currentColor = '';
8296
+ /**
8297
+ * Changes the color of the icon.
8298
+ */
8299
+ this.iconColor = '';
8300
+ /**
8301
+ * Changes the color of the icon's background.
8302
+ */
8303
+ this.iconBgColor = '';
8304
+ /**
8305
+ * Emitted when the link text is clicked.
8306
+ */
8307
+ this.linkClicked = new EventEmitter();
8308
+ /**
8309
+ * Emitted when the corner content is clicked.
8310
+ */
8311
+ this.cornerClicked = new EventEmitter();
8312
+ }
8313
+ get classDataCard() {
8314
+ return 'card impdc-data-card';
8315
+ }
8316
+ get classDataCardSharedBorders() {
8317
+ return this.sharedBorders;
8318
+ }
8319
+ get differenceNumber() {
8320
+ return Number(this.difference.replace(/[^0-9\.-]+/g, ''));
8321
+ }
8322
+ get differenceNegative() {
8323
+ return this.differenceNumber < 0;
8324
+ }
8325
+ get differencePositive() {
8326
+ return this.differenceNumber > 0;
8327
+ }
8328
+ get differenceDisplay() {
8329
+ return this.difference.replace('-', '');
8330
+ }
8331
+ handleLinkClick(event) {
8332
+ this.linkClicked.emit(event);
8333
+ }
8334
+ handleCornerClick(event) {
8335
+ this.cornerClicked.emit(event);
8336
+ }
8337
+ }
8338
+ DataCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DataCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8339
+ DataCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: DataCardComponent, selector: "impdc-data-card, [impdc-data-card]", inputs: { title: "title", current: "current", previous: "previous", difference: "difference", linkText: "linkText", sharedBorders: "sharedBorders", differencePill: "differencePill", currentColor: "currentColor", iconColor: "iconColor", iconBgColor: "iconBgColor" }, outputs: { linkClicked: "linkClicked", cornerClicked: "cornerClicked" }, host: { properties: { "class": "this.classDataCard", "class.impdc-data-card-shared-borders": "this.classDataCardSharedBorders" } }, ngImport: i0, template: "<div class=\"card-body impdc-data-card-body\">\n <div\n #iconContentEl\n class=\"impdc-data-card-icon\"\n [style.color]=\"iconColor ? iconColor : undefined\"\n [style.background-color]=\"iconBgColor ? iconBgColor : undefined\"\n [class.hide]=\"!iconContentEl.children.length\">\n <ng-content select=\"[icon]\"></ng-content>\n </div>\n <div class=\"impdc-data-card-container\">\n <div class=\"impdc-data-card-title\" [class.title-attention]=\"titleAttention\">\n {{ title }}\n </div>\n <div class=\"impdc-data-card-data\">\n <ng-content></ng-content>\n <span\n *ngIf=\"current\"\n class=\"data-current\"\n [class.data-current-enlarged]=\"\n !iconContentEl.children.length && !previous && !difference\n \"\n [style.color]=\"currentColor ? currentColor : undefined\"\n [innerText]=\"current\"></span>\n <span class=\"data-other\">\n <span\n *ngIf=\"previous\"\n class=\"data-previous\"\n [innerText]=\"previous\"></span>\n <span\n *ngIf=\"difference\"\n class=\"data-difference\"\n [class.difference-negative]=\"differenceNegative\"\n [class.difference-positive]=\"differencePositive\"\n [class.badge]=\"differencePill\"\n [class.rounded-pill]=\"differencePill\">\n <span *ngIf=\"differenceNegative\" class=\"fas fa-arrow-down\"></span>\n <span *ngIf=\"differencePositive\" class=\"fas fa-arrow-up\"></span>\n <span class=\"difference-display\">{{ differenceDisplay }}</span>\n </span>\n </span>\n </div>\n </div>\n <div\n #cornerContentEl\n class=\"impdc-data-card-corner\"\n [class.hide]=\"!cornerContentEl.children.length\"\n (click)=\"handleCornerClick($event); $event.stopPropagation()\">\n <ng-content select=\"[corner]\"></ng-content>\n </div>\n</div>\n<div\n class=\"card-footer impdc-data-card-footer\"\n [class.hide]=\"!linkText && !footerContentEl.children.length\">\n <div #footerContentEl [class.hide]=\"!footerContentEl.children.length\">\n <ng-content select=\"[footer]\"></ng-content>\n </div>\n <a\n *ngIf=\"linkText\"\n class=\"footer-link\"\n (click)=\"handleLinkClick($event); $event.stopPropagation()\"\n >{{ linkText }}</a\n >\n</div>\n", styles: [".hide{display:none}.impdc-data-card{overflow-x:hidden;border:0;box-shadow:0 1px 3px #0000001a,0 1px 2px #0000000f;border-radius:8px}.impdc-data-card.impdc-data-card-shared-borders:first-child:not(:last-child){border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.impdc-data-card.impdc-data-card-shared-borders:last-child:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.impdc-data-card.impdc-data-card-shared-borders:not(:first-child):not(:last-child){border-right:0;border-radius:0}.impdc-data-card-body{position:relative;display:flex;align-items:center;gap:20px;padding:24px}.impdc-data-card-icon{display:flex;align-items:center;justify-content:center;padding:12px;background-color:#01606d;color:#fff;border-radius:6px}.impdc-data-card-icon .fa,.impdc-data-card-icon .fa-brands,.impdc-data-card-icon .fa-duotone,.impdc-data-card-icon .fa-light,.impdc-data-card-icon .fa-regular,.impdc-data-card-icon .fa-solid,.impdc-data-card-icon .fa-thin,.impdc-data-card-icon .fab,.impdc-data-card-icon .fad,.impdc-data-card-icon .fal,.impdc-data-card-icon .far,.impdc-data-card-icon .fas,.impdc-data-card-icon .fat,.impdc-data-card-icon svg{display:flex;align-items:center;justify-content:center;height:24px;width:24px;font-size:18px;line-height:24px}.impdc-data-card-icon.hide{display:none}.impdc-data-card-container{display:flex;flex-direction:column;min-width:50px}.impdc-data-card-title{color:#6b7280;font-size:14px;line-height:20px;font-weight:500;min-width:100px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.impdc-data-card-title.title-attention{color:#161e2e;font-size:16px;line-height:24px;font-weight:400}.impdc-data-card-data{display:flex;flex-wrap:wrap;align-items:end;min-width:0}.impdc-data-card-data .data-current{color:#161e2e;font-size:24px;line-height:32px;font-weight:600;min-width:75px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:8px}.impdc-data-card-data .data-current.data-current-enlarged{font-size:30px;line-height:36px}.impdc-data-card-data .data-other{display:inline-flex;justify-content:space-between;align-items:end;min-width:50px}.impdc-data-card-data .data-previous{min-width:0;color:#6b7280;font-size:14px;line-height:20px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:13px}.impdc-data-card-data .data-difference{display:inline-flex;align-items:center;gap:5px;color:#6b7280;font-size:14px;line-height:20px;font-weight:500}.impdc-data-card-data .data-difference.difference-negative{color:#e02424}.impdc-data-card-data .data-difference.difference-negative.badge{background-color:#fde8e8}.impdc-data-card-data .data-difference.difference-positive{color:#057a55}.impdc-data-card-data .data-difference.difference-positive.badge{background-color:#def7ec}.impdc-data-card-data .data-difference.rounded-pill{padding:4px 10px;border-radius:12px!important}.impdc-data-card-corner{position:absolute;top:0;right:0;margin:1rem;line-height:14px;color:#374151}.impdc-data-card-corner .fa,.impdc-data-card-corner .fa-brands,.impdc-data-card-corner .fa-duotone,.impdc-data-card-corner .fa-light,.impdc-data-card-corner .fa-regular,.impdc-data-card-corner .fa-solid,.impdc-data-card-corner .fa-thin,.impdc-data-card-corner .fab,.impdc-data-card-corner .fad,.impdc-data-card-corner .fal,.impdc-data-card-corner .far,.impdc-data-card-corner .fas,.impdc-data-card-corner .fat,.impdc-data-card-corner svg{height:14px;line-height:14px}.impdc-data-card-corner.hide{display:none}.impdc-data-card-footer{display:flex;align-items:center;padding:16px;background-color:#f9fafb}.impdc-data-card-footer.card-footer{border-top:0}.impdc-data-card-footer.hide{display:none}.impdc-data-card-footer .footer-link{color:#01606d;font-weight:500;font-size:14px;line-height:20px}.impdc-data-card-footer .footer-link:hover{color:#19a8c1}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None });
8340
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DataCardComponent, decorators: [{
8341
+ type: Component,
8342
+ args: [{ selector: 'impdc-data-card, [impdc-data-card]', encapsulation: ViewEncapsulation.None, template: "<div class=\"card-body impdc-data-card-body\">\n <div\n #iconContentEl\n class=\"impdc-data-card-icon\"\n [style.color]=\"iconColor ? iconColor : undefined\"\n [style.background-color]=\"iconBgColor ? iconBgColor : undefined\"\n [class.hide]=\"!iconContentEl.children.length\">\n <ng-content select=\"[icon]\"></ng-content>\n </div>\n <div class=\"impdc-data-card-container\">\n <div class=\"impdc-data-card-title\" [class.title-attention]=\"titleAttention\">\n {{ title }}\n </div>\n <div class=\"impdc-data-card-data\">\n <ng-content></ng-content>\n <span\n *ngIf=\"current\"\n class=\"data-current\"\n [class.data-current-enlarged]=\"\n !iconContentEl.children.length && !previous && !difference\n \"\n [style.color]=\"currentColor ? currentColor : undefined\"\n [innerText]=\"current\"></span>\n <span class=\"data-other\">\n <span\n *ngIf=\"previous\"\n class=\"data-previous\"\n [innerText]=\"previous\"></span>\n <span\n *ngIf=\"difference\"\n class=\"data-difference\"\n [class.difference-negative]=\"differenceNegative\"\n [class.difference-positive]=\"differencePositive\"\n [class.badge]=\"differencePill\"\n [class.rounded-pill]=\"differencePill\">\n <span *ngIf=\"differenceNegative\" class=\"fas fa-arrow-down\"></span>\n <span *ngIf=\"differencePositive\" class=\"fas fa-arrow-up\"></span>\n <span class=\"difference-display\">{{ differenceDisplay }}</span>\n </span>\n </span>\n </div>\n </div>\n <div\n #cornerContentEl\n class=\"impdc-data-card-corner\"\n [class.hide]=\"!cornerContentEl.children.length\"\n (click)=\"handleCornerClick($event); $event.stopPropagation()\">\n <ng-content select=\"[corner]\"></ng-content>\n </div>\n</div>\n<div\n class=\"card-footer impdc-data-card-footer\"\n [class.hide]=\"!linkText && !footerContentEl.children.length\">\n <div #footerContentEl [class.hide]=\"!footerContentEl.children.length\">\n <ng-content select=\"[footer]\"></ng-content>\n </div>\n <a\n *ngIf=\"linkText\"\n class=\"footer-link\"\n (click)=\"handleLinkClick($event); $event.stopPropagation()\"\n >{{ linkText }}</a\n >\n</div>\n", styles: [".hide{display:none}.impdc-data-card{overflow-x:hidden;border:0;box-shadow:0 1px 3px #0000001a,0 1px 2px #0000000f;border-radius:8px}.impdc-data-card.impdc-data-card-shared-borders:first-child:not(:last-child){border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.impdc-data-card.impdc-data-card-shared-borders:last-child:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.impdc-data-card.impdc-data-card-shared-borders:not(:first-child):not(:last-child){border-right:0;border-radius:0}.impdc-data-card-body{position:relative;display:flex;align-items:center;gap:20px;padding:24px}.impdc-data-card-icon{display:flex;align-items:center;justify-content:center;padding:12px;background-color:#01606d;color:#fff;border-radius:6px}.impdc-data-card-icon .fa,.impdc-data-card-icon .fa-brands,.impdc-data-card-icon .fa-duotone,.impdc-data-card-icon .fa-light,.impdc-data-card-icon .fa-regular,.impdc-data-card-icon .fa-solid,.impdc-data-card-icon .fa-thin,.impdc-data-card-icon .fab,.impdc-data-card-icon .fad,.impdc-data-card-icon .fal,.impdc-data-card-icon .far,.impdc-data-card-icon .fas,.impdc-data-card-icon .fat,.impdc-data-card-icon svg{display:flex;align-items:center;justify-content:center;height:24px;width:24px;font-size:18px;line-height:24px}.impdc-data-card-icon.hide{display:none}.impdc-data-card-container{display:flex;flex-direction:column;min-width:50px}.impdc-data-card-title{color:#6b7280;font-size:14px;line-height:20px;font-weight:500;min-width:100px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.impdc-data-card-title.title-attention{color:#161e2e;font-size:16px;line-height:24px;font-weight:400}.impdc-data-card-data{display:flex;flex-wrap:wrap;align-items:end;min-width:0}.impdc-data-card-data .data-current{color:#161e2e;font-size:24px;line-height:32px;font-weight:600;min-width:75px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:8px}.impdc-data-card-data .data-current.data-current-enlarged{font-size:30px;line-height:36px}.impdc-data-card-data .data-other{display:inline-flex;justify-content:space-between;align-items:end;min-width:50px}.impdc-data-card-data .data-previous{min-width:0;color:#6b7280;font-size:14px;line-height:20px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:13px}.impdc-data-card-data .data-difference{display:inline-flex;align-items:center;gap:5px;color:#6b7280;font-size:14px;line-height:20px;font-weight:500}.impdc-data-card-data .data-difference.difference-negative{color:#e02424}.impdc-data-card-data .data-difference.difference-negative.badge{background-color:#fde8e8}.impdc-data-card-data .data-difference.difference-positive{color:#057a55}.impdc-data-card-data .data-difference.difference-positive.badge{background-color:#def7ec}.impdc-data-card-data .data-difference.rounded-pill{padding:4px 10px;border-radius:12px!important}.impdc-data-card-corner{position:absolute;top:0;right:0;margin:1rem;line-height:14px;color:#374151}.impdc-data-card-corner .fa,.impdc-data-card-corner .fa-brands,.impdc-data-card-corner .fa-duotone,.impdc-data-card-corner .fa-light,.impdc-data-card-corner .fa-regular,.impdc-data-card-corner .fa-solid,.impdc-data-card-corner .fa-thin,.impdc-data-card-corner .fab,.impdc-data-card-corner .fad,.impdc-data-card-corner .fal,.impdc-data-card-corner .far,.impdc-data-card-corner .fas,.impdc-data-card-corner .fat,.impdc-data-card-corner svg{height:14px;line-height:14px}.impdc-data-card-corner.hide{display:none}.impdc-data-card-footer{display:flex;align-items:center;padding:16px;background-color:#f9fafb}.impdc-data-card-footer.card-footer{border-top:0}.impdc-data-card-footer.hide{display:none}.impdc-data-card-footer .footer-link{color:#01606d;font-weight:500;font-size:14px;line-height:20px}.impdc-data-card-footer .footer-link:hover{color:#19a8c1}\n"] }]
8343
+ }], propDecorators: { title: [{
8344
+ type: Input
8345
+ }], current: [{
8346
+ type: Input
8347
+ }], previous: [{
8348
+ type: Input
8349
+ }], difference: [{
8350
+ type: Input
8351
+ }], linkText: [{
8352
+ type: Input
8353
+ }], sharedBorders: [{
8354
+ type: Input
8355
+ }], differencePill: [{
8356
+ type: Input
8357
+ }], currentColor: [{
8358
+ type: Input
8359
+ }], iconColor: [{
8360
+ type: Input
8361
+ }], iconBgColor: [{
8362
+ type: Input
8363
+ }], linkClicked: [{
8364
+ type: Output
8365
+ }], cornerClicked: [{
8366
+ type: Output
8367
+ }], classDataCard: [{
8368
+ type: HostBinding,
8369
+ args: ['class']
8370
+ }], classDataCardSharedBorders: [{
8371
+ type: HostBinding,
8372
+ args: ['class.impdc-data-card-shared-borders']
8373
+ }] } });
8374
+
8375
+ class DataCardModule {
8376
+ constructor() { }
8377
+ }
8378
+ DataCardModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DataCardModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
8379
+ DataCardModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.2.12", ngImport: i0, type: DataCardModule, declarations: [DataCardComponent], imports: [CommonModule], exports: [DataCardComponent] });
8380
+ DataCardModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DataCardModule, imports: [CommonModule] });
8381
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DataCardModule, decorators: [{
8382
+ type: NgModule,
8383
+ args: [{
8384
+ imports: [CommonModule],
8385
+ declarations: [DataCardComponent],
8386
+ exports: [DataCardComponent]
8387
+ }]
8388
+ }], ctorParameters: function () { return []; } });
8389
+
8204
8390
  class InteractionService {
8205
8391
  constructor() {
8206
8392
  this._interactables = [];
@@ -8213,8 +8399,18 @@ class InteractionService {
8213
8399
  if (!this._backdrop) {
8214
8400
  this._backdrop = modalBackdrop;
8215
8401
  }
8216
- else {
8217
- modalBackdrop.invalidate();
8402
+ else if (this._backdrop !== modalBackdrop) {
8403
+ this._backdrop.invalidate();
8404
+ this._backdrop = modalBackdrop;
8405
+ if (!modalBackdrop.valid) {
8406
+ // we invalidated and set backdrop to the same backdrop
8407
+ modalBackdrop.validate();
8408
+ }
8409
+ }
8410
+ }
8411
+ unregisterBackdrop(modalBackdrop) {
8412
+ if (this._backdrop === modalBackdrop) {
8413
+ this._backdrop = undefined;
8218
8414
  }
8219
8415
  }
8220
8416
  add(interactable) {
@@ -8260,5 +8456,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
8260
8456
  * Generated bundle index. Do not edit.
8261
8457
  */
8262
8458
 
8263
- export { AlertComponent, AlertModule, AvatarComponent, AvatarGroupComponent, AvatarGroupModule, AvatarModule, BackdropComponent, BackdropModule, BadgeComponent, BadgeModule, BadgeSize, BadgeSizesArr, BrandedDirective, BrandingModule, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbModule, ButtonComponent, ButtonGroupComponent, ButtonGroupModule, ButtonModule, CardHeadingComponent, CardHeadingModule, CheckboxChangeEvent, CheckboxComponent, CheckboxModule, ComponentSize, ComponentTheme, ComponentThemesArr, CornerHintDirective, DesignComponentsModule, DropdownComponent, DropdownItemComponent, DropdownModule, ErrorDirective, ErrorStateMatcher, FileDropDirective, FileUploadComponent, FileUploadModule, FontAwesomeFreeRegularIcons, FontAwesomeFreeSolidIcons, FontAwesomeIconThemes, FontAwesomeIcons, FormFieldComponent, HintDirective, HumanReadableByteSizePipe, IMPDC_FORM_FIELD, IMPDC_FORM_ROOT, IMPDC_RADIO_BUTTON, IMPDC_RADIO_GROUP, IMPDC_SELECT_OPTION_PARENT_COMPONENT, IconComponent, IconModule, ImpdcFormFieldControl, ImpdcFormsModule, ImpdcSelectIconChange, InputDirective, InteractionService, LabelDirective, ModalComponent, ModalComponentSizesArr, ModalModule, ModalTheme, ModalThemesArr, PaginationComponent, PaginationModule, PrefixDirective, ProgressBarComponent, ProgressBarModule, RadioButtonComponent, RadioChangeEvent, RadioGroupDirective, RadioModule, RootFormGroupDirective, RootNgFormDirective, ScrollableComponent, ScrollableModule, SelectChangeEvent, SelectComponent, SelectIconComponent, SelectIconModule, SelectModel, SelectModule, SelectOptionComponent, SelectOptionSelectionChangeEvent, ShowOnDirtyErrorStateMatcher, SizeDetectionModule, SizeDetectorDirective, SpinnerComponent, SpinnerModule, SuffixDirective, TableComponent, TableModule, TextHighlightComponent, TextHighlightModule, UniqueSelectionDispatcher, getImpdcFormFieldMissingControlError, mixinDisabled, mixinErrorState, mixinTabIndex };
8459
+ export { AlertComponent, AlertModule, AvatarComponent, AvatarGroupComponent, AvatarGroupModule, AvatarModule, BackdropComponent, BackdropModule, BadgeComponent, BadgeModule, BadgeSize, BadgeSizesArr, BrandedDirective, BrandingModule, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbModule, ButtonComponent, ButtonGroupComponent, ButtonGroupModule, ButtonModule, CardHeadingComponent, CardHeadingModule, CheckboxChangeEvent, CheckboxComponent, CheckboxModule, ComponentSize, ComponentTheme, ComponentThemesArr, CornerHintDirective, DataCardComponent, DataCardModule, DesignComponentsModule, DropdownComponent, DropdownItemComponent, DropdownModule, ErrorDirective, ErrorStateMatcher, FileDropDirective, FileUploadComponent, FileUploadModule, FontAwesomeFreeRegularIcons, FontAwesomeFreeSolidIcons, FontAwesomeIconThemes, FontAwesomeIcons, FormFieldComponent, HintDirective, HumanReadableByteSizePipe, IMPDC_FORM_FIELD, IMPDC_FORM_ROOT, IMPDC_RADIO_BUTTON, IMPDC_RADIO_GROUP, IMPDC_SELECT_OPTION_PARENT_COMPONENT, IconComponent, IconModule, ImpdcFormFieldControl, ImpdcFormsModule, ImpdcSelectIconChange, InputDirective, InteractionService, LabelDirective, ModalComponent, ModalComponentSizesArr, ModalModule, ModalTheme, ModalThemesArr, PaginationComponent, PaginationModule, PrefixDirective, ProgressBarComponent, ProgressBarModule, RadioButtonComponent, RadioChangeEvent, RadioGroupDirective, RadioModule, RootFormGroupDirective, RootNgFormDirective, ScrollableComponent, ScrollableModule, SelectChangeEvent, SelectComponent, SelectIconComponent, SelectIconModule, SelectModel, SelectModule, SelectOptionComponent, SelectOptionSelectionChangeEvent, ShowOnDirtyErrorStateMatcher, SizeDetectionModule, SizeDetectorDirective, SpinnerComponent, SpinnerModule, SuffixDirective, TableComponent, TableModule, TextHighlightComponent, TextHighlightModule, UniqueSelectionDispatcher, getImpdcFormFieldMissingControlError, mixinDisabled, mixinErrorState, mixinTabIndex };
8264
8460
  //# sourceMappingURL=impartner-design-components.mjs.map