@koobiq/components 20.1.0 → 20.2.0

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 (120) hide show
  1. package/accordion/_accordion-theme.scss +1 -1
  2. package/accordion/accordion-tokens.scss +1 -0
  3. package/accordion/{accordion-trigger.component.scss → accordion-trigger.scss} +4 -0
  4. package/accordion/{accordion.component.scss → accordion.scss} +3 -3
  5. package/accordion/index.d.ts +215 -119
  6. package/alert/_alert-theme.scss +14 -0
  7. package/alert/alert.component.scss +24 -13
  8. package/alert/index.d.ts +63 -29
  9. package/autocomplete/autocomplete.scss +2 -1
  10. package/autocomplete/index.d.ts +35 -29
  11. package/badge/index.d.ts +2 -3
  12. package/clamped-text/index.d.ts +3 -2
  13. package/core/index.d.ts +116 -11
  14. package/core/styles/_core.scss +2 -0
  15. package/core/styles/common/_animation.scss +31 -24
  16. package/core/styles/common/_connected-overlay.scss +36 -0
  17. package/core/styles/common/_select.scss +7 -2
  18. package/dropdown/dropdown-item.scss +16 -0
  19. package/dropdown/dropdown-tokens.scss +2 -1
  20. package/dropdown/dropdown.scss +9 -0
  21. package/dropdown/index.d.ts +73 -6
  22. package/fesm2022/koobiq-components-accordion.mjs +406 -303
  23. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  24. package/fesm2022/koobiq-components-actions-panel.mjs +1 -1
  25. package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
  26. package/fesm2022/koobiq-components-alert.mjs +88 -48
  27. package/fesm2022/koobiq-components-alert.mjs.map +1 -1
  28. package/fesm2022/koobiq-components-app-switcher.mjs +1 -1
  29. package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
  30. package/fesm2022/koobiq-components-autocomplete.mjs +37 -23
  31. package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
  32. package/fesm2022/koobiq-components-badge.mjs +5 -4
  33. package/fesm2022/koobiq-components-badge.mjs.map +1 -1
  34. package/fesm2022/koobiq-components-breadcrumbs.mjs +1 -1
  35. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  36. package/fesm2022/koobiq-components-clamped-text.mjs +5 -0
  37. package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
  38. package/fesm2022/koobiq-components-code-block.mjs +1 -1
  39. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  40. package/fesm2022/koobiq-components-core.mjs +98 -4
  41. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  42. package/fesm2022/koobiq-components-datepicker.mjs +10 -7
  43. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  44. package/fesm2022/koobiq-components-dropdown.mjs +99 -20
  45. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  46. package/fesm2022/koobiq-components-file-upload.mjs +2 -2
  47. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  48. package/fesm2022/koobiq-components-filter-bar.mjs +203 -32
  49. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  50. package/fesm2022/koobiq-components-form-field.mjs +4 -4
  51. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  52. package/fesm2022/koobiq-components-icon.mjs +14 -5
  53. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  54. package/fesm2022/koobiq-components-inline-edit.mjs +4 -2
  55. package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
  56. package/fesm2022/koobiq-components-navbar.mjs +117 -22
  57. package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
  58. package/fesm2022/koobiq-components-notification-center.mjs +19 -4
  59. package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
  60. package/fesm2022/koobiq-components-popover.mjs +5 -0
  61. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  62. package/fesm2022/koobiq-components-search-expandable.mjs +43 -8
  63. package/fesm2022/koobiq-components-search-expandable.mjs.map +1 -1
  64. package/fesm2022/koobiq-components-select.mjs +36 -45
  65. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  66. package/fesm2022/koobiq-components-split-button.mjs +3 -10
  67. package/fesm2022/koobiq-components-split-button.mjs.map +1 -1
  68. package/fesm2022/koobiq-components-tabs.mjs +29 -17
  69. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  70. package/fesm2022/koobiq-components-tags.mjs +1 -1
  71. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  72. package/fesm2022/koobiq-components-timepicker.mjs +3 -4
  73. package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
  74. package/fesm2022/koobiq-components-timezone.mjs +3 -5
  75. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  76. package/fesm2022/koobiq-components-toast.mjs +1 -1
  77. package/fesm2022/koobiq-components-toast.mjs.map +1 -1
  78. package/fesm2022/koobiq-components-tooltip.mjs +118 -6
  79. package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
  80. package/fesm2022/koobiq-components-tree-select.mjs +39 -31
  81. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  82. package/filter-bar/_filter-bar-theme.scss +0 -4
  83. package/filter-bar/filter-bar-tokens.scss +3 -0
  84. package/filter-bar/filters.scss +3 -2
  85. package/filter-bar/index.d.ts +62 -3
  86. package/filter-bar/pipes/base-pipe.scss +0 -11
  87. package/filter-bar/pipes/pipe-input.scss +10 -0
  88. package/icon/icon-button.scss +3 -1
  89. package/icon/index.d.ts +15 -2
  90. package/navbar/_navbar-item_vertical.scss +7 -5
  91. package/navbar/index.d.ts +38 -4
  92. package/navbar/navbar-brand.scss +17 -7
  93. package/notification-center/index.d.ts +2 -1
  94. package/package.json +3 -3
  95. package/prebuilt-themes/dark-theme.css +1 -1
  96. package/prebuilt-themes/light-theme.css +1 -1
  97. package/prebuilt-themes/theme.css +1 -1
  98. package/schematics/collection.json +10 -0
  99. package/schematics/migrations/alert-signals/README.md +64 -0
  100. package/schematics/migrations/alert-signals/data.js +70 -0
  101. package/schematics/migrations/alert-signals/index.js +350 -0
  102. package/schematics/migrations/alert-signals/schema.json +20 -0
  103. package/schematics/migrations/autocomplete-panel-width-auto/README.md +68 -0
  104. package/schematics/migrations/autocomplete-panel-width-auto/index.js +70 -0
  105. package/schematics/migrations/autocomplete-panel-width-auto/schema.json +15 -0
  106. package/schematics/migrations/filter-bar-signals/README.md +1 -1
  107. package/schematics/migrations.json +11 -1
  108. package/schematics/ng-add/index.js +1 -1
  109. package/schematics/utils/angular-parsing.js +11 -2
  110. package/search-expandable/index.d.ts +3 -0
  111. package/select/index.d.ts +51 -24
  112. package/tabs/_tabs-common.scss +60 -31
  113. package/tabs/_tabs-theme.scss +12 -0
  114. package/tabs/index.d.ts +2 -2
  115. package/tabs/tab-header.scss +14 -0
  116. package/tabs/tab-nav-bar.scss +4 -0
  117. package/tabs/tabs-tokens.scss +1 -0
  118. package/timezone/index.d.ts +1 -3
  119. package/tooltip/index.d.ts +73 -4
  120. package/tree-select/index.d.ts +46 -22
@@ -271,7 +271,7 @@ class KbqNotificationItemComponent {
271
271
  return value instanceof TemplateRef;
272
272
  }
273
273
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqNotificationItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
274
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: KbqNotificationItemComponent, isStandalone: true, selector: "kbq-notification-item", inputs: { data: "data" }, host: { attributes: { "data-testid": "kbq-notification-item" }, properties: { "class": "style" }, classAttribute: "kbq-notification-item" }, hostDirectives: [{ directive: i1$1.KbqReadStateDirective }], ngImport: i0, template: "@if (data.icon) {\n <div class=\"kbq-notification-item__icon-container layout-row layout-align-start-start\">\n @if (data.icon === true) {\n @switch (data.style) {\n @case ('contrast') {\n <i\n kbq-icon=\"kbq-circle-info_16\"\n class=\"kbq-notification-item__icon\"\n [color]=\"$any(data.style)\"\n [class]=\"data.iconClass\"\n ></i>\n }\n @case ('success') {\n <i\n kbq-icon=\"kbq-circle-check_16\"\n class=\"kbq-notification-item__icon\"\n [color]=\"$any(data.style)\"\n [class]=\"data.iconClass\"\n ></i>\n }\n @case ('warning') {\n <i\n kbq-icon=\"kbq-triangle-exclamation_16\"\n class=\"kbq-notification-item__icon\"\n [color]=\"$any(data.style)\"\n [class]=\"data.iconClass\"\n ></i>\n }\n @case ('error') {\n <i\n kbq-icon=\"kbq-triangle-exclamation_16\"\n class=\"kbq-notification-item__icon\"\n [color]=\"$any(data.style)\"\n [class]=\"data.iconClass\"\n ></i>\n }\n }\n } @else if (isTemplateRef(data.icon)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.icon)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n }\n </div>\n}\n\n<div class=\"kbq-notification-item__container\">\n @if (data.title) {\n <div\n kbq-title\n class=\"kbq-notification-item__title\"\n [class.kbq-notification-item__title_with-content]=\"data.caption || data.content\"\n >\n @if (isTemplateRef(data.title)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.title)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n } @else {\n <p>{{ data.title }}</p>\n }\n\n <div class=\"kbq-notification-item-time\" [class.kbq-notification-item-time_read]=\"data.read\">\n <div class=\"kbq-notification-item-time__value\">{{ time }}</div>\n <i class=\"kbq-notification-item-time__state\" kbq-icon=\"kbq-circle-xs_16\" [color]=\"'theme'\"></i>\n </div>\n </div>\n }\n\n @if (data.caption) {\n <div\n kbq-title\n [class.kbq-notification-item__text]=\"data.title\"\n [class.kbq-notification-item__title]=\"!data.title\"\n >\n @if (isTemplateRef(data.caption)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.caption)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n } @else {\n {{ data.caption }}\n }\n </div>\n }\n\n @if (data.content) {\n <div class=\"kbq-notification-item__content\">\n @if (isTemplateRef(data.content)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.content)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n } @else {\n {{ data.content }}\n }\n </div>\n }\n\n @if (data.actions) {\n <div class=\"kbq-notification-item__actions\">\n @if (isTemplateRef(data.actions)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.actions)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n } @else {\n {{ data.actions }}\n }\n </div>\n }\n</div>\n\n<button\n kbq-button\n class=\"kbq-notification-item__remove-button\"\n data-testid=\"kbq-notification-item-remove-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n [kbqTooltipArrow]=\"false\"\n [kbqTooltip]=\"center.localeData.remove\"\n [kbqPlacement]=\"popUpPlacements.Right\"\n (click)=\"service.remove(data)\"\n>\n <i kbq-icon=\"kbq-trash_16\"></i>\n</button>\n", styles: [".kbq-notification-item{display:flex;box-sizing:border-box;position:relative;border-radius:var(--kbq-size-s);height:auto;margin-left:var(--kbq-size-m);margin-right:var(--kbq-size-m)}.kbq-notification-item:hover .kbq-notification-item-time,.kbq-notification-item:focus-within .kbq-notification-item-time{visibility:hidden}.kbq-notification-item:hover .kbq-notification-item__remove-button,.kbq-notification-item:focus-within .kbq-notification-item__remove-button{display:block}.kbq-notification-item__icon-container{flex-shrink:0;width:var(--kbq-size-l);max-width:var(--kbq-size-l);height:var(--kbq-size-l);max-height:var(--kbq-size-l);margin-right:var(--kbq-size-s);padding-left:var(--kbq-size-m);padding-top:14px}.kbq-notification-item__container{display:flex;flex-direction:column;flex:1;padding-top:var(--kbq-size-m);padding-right:var(--kbq-size-s);padding-bottom:var(--kbq-size-m);overflow:hidden}.kbq-notification-item__title{display:flex;flex-direction:row;justify-content:space-between;overflow:hidden;text-overflow:ellipsis}.kbq-notification-item__title>p{margin:0;overflow:hidden;text-overflow:ellipsis}.kbq-notification-item__title.kbq-notification-item__title_with-content{margin-bottom:var(--kbq-size-xxs)}.kbq-notification-item-time{display:flex;flex-direction:row;height:var(--kbq-size-xl);align-items:center;padding-left:22px}.kbq-notification-item-time .kbq-notification-item-time__value{margin-right:var(--kbq-size-3xs)}.kbq-notification-item-time.kbq-notification-item-time_read .kbq-notification-item-time__state{display:none}.kbq-notification-item__text{display:flex;flex:1;align-items:center}.kbq-notification-item__content{display:flex;flex-direction:column;white-space:pre-wrap}.kbq-notification-item__actions{display:flex;padding-top:var(--kbq-size-s);gap:var(--kbq-size-m)}.kbq-notification-item__remove-button{position:absolute;top:var(--kbq-size-xs);right:var(--kbq-size-s);display:none}.kbq-notification-item{background:var(--kbq-background-card)}.kbq-notification-item .kbq-notification-item__title{color:var(--kbq-foreground-contrast)}.kbq-notification-item .kbq-notification-item__text,.kbq-notification-item .kbq-notification-item-time.kbq-notification-item-time_read .kbq-notification-item-time__value{color:var(--kbq-foreground-contrast-secondary)}.kbq-notification-item:hover{background:var(--kbq-states-background-transparent-hover)}.kbq-notification-item{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}.kbq-notification-item .kbq-notification-item-time{font-size:var(--kbq-typography-text-compact-font-size);font-style:var(--kbq-typography-text-compact-font-style);font-weight:var(--kbq-typography-text-compact-font-weight);line-height:var(--kbq-typography-text-compact-line-height);font-family:var(--kbq-typography-text-compact-font-family);text-transform:var(--kbq-typography-text-compact-text-transform);font-feature-settings:var(--kbq-typography-text-compact-font-feature-settings);letter-spacing:var(--kbq-typography-text-compact-letter-spacing)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i1.KbqIcon, selector: "[kbq-icon]", inputs: ["small", "autoColor", "kbq-icon"] }, { kind: "ngmodule", type: KbqTitleModule }, { kind: "directive", type: i3.KbqTitleDirective, selector: "[kbq-title]", inputs: ["kbq-title"], exportAs: ["kbqTitle"] }, { kind: "ngmodule", type: KbqButtonModule }, { kind: "component", type: i3$1.KbqButton, selector: "[kbq-button]", inputs: ["kbqStyle", "disabled", "tabIndex"] }, { kind: "directive", type: i3$1.KbqButtonCssStyler, selector: "[kbq-button]" }, { kind: "directive", type: KbqTooltipTrigger, selector: "[kbqTooltip]", inputs: ["forDisabledComponent", "ignoreTooltipPointerEvents", "hideWithTimeout", "kbqVisible", "kbqPlacement", "kbqRelativeToPointer", "kbqPlacementPriority", "kbqTooltip", "kbqTooltipDisabled", "kbqEnterDelay", "kbqLeaveDelay", "kbqTrigger", "kbqTooltipClass", "kbqTooltipContext", "kbqTooltipColor", "kbqTooltipArrow", "kbqTooltipOffset", "kbqTooltipModifier", "kbqTooltipHeader"], outputs: ["kbqPlacementChange", "kbqVisibleChange"], exportAs: ["kbqTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
274
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: KbqNotificationItemComponent, isStandalone: true, selector: "kbq-notification-item", inputs: { data: "data" }, host: { attributes: { "data-testid": "kbq-notification-item" }, properties: { "class": "style" }, classAttribute: "kbq-notification-item" }, hostDirectives: [{ directive: i1$1.KbqReadStateDirective }], ngImport: i0, template: "@if (data.icon) {\n <div class=\"kbq-notification-item__icon-container layout-row layout-align-start-start\">\n @if (data.icon === true) {\n @switch (data.style) {\n @case ('contrast') {\n <i\n kbq-icon=\"kbq-circle-info_16\"\n class=\"kbq-notification-item__icon\"\n [color]=\"$any(data.style)\"\n [class]=\"data.iconClass\"\n ></i>\n }\n @case ('success') {\n <i\n kbq-icon=\"kbq-circle-check_16\"\n class=\"kbq-notification-item__icon\"\n [color]=\"$any(data.style)\"\n [class]=\"data.iconClass\"\n ></i>\n }\n @case ('warning') {\n <i\n kbq-icon=\"kbq-triangle-exclamation_16\"\n class=\"kbq-notification-item__icon\"\n [color]=\"$any(data.style)\"\n [class]=\"data.iconClass\"\n ></i>\n }\n @case ('error') {\n <i\n kbq-icon=\"kbq-triangle-exclamation_16\"\n class=\"kbq-notification-item__icon\"\n [color]=\"$any(data.style)\"\n [class]=\"data.iconClass\"\n ></i>\n }\n }\n } @else if (isTemplateRef(data.icon)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.icon)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n }\n </div>\n}\n\n<div class=\"kbq-notification-item__container\">\n @if (data.title) {\n <div\n kbq-title\n class=\"kbq-notification-item__title\"\n [class.kbq-notification-item__title_with-content]=\"data.caption || data.content\"\n >\n @if (isTemplateRef(data.title)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.title)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n } @else {\n <p>{{ data.title }}</p>\n }\n\n <div class=\"kbq-notification-item-time\" [class.kbq-notification-item-time_read]=\"data.read\">\n <div class=\"kbq-notification-item-time__value\">{{ time }}</div>\n <i class=\"kbq-notification-item-time__state\" kbq-icon=\"kbq-circle-xs_16\" [color]=\"'theme'\"></i>\n </div>\n </div>\n }\n\n @if (data.caption) {\n <div\n kbq-title\n [class.kbq-notification-item__text]=\"data.title\"\n [class.kbq-notification-item__title]=\"!data.title\"\n >\n @if (isTemplateRef(data.caption)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.caption)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n } @else {\n {{ data.caption }}\n }\n </div>\n }\n\n @if (data.content) {\n <div class=\"kbq-notification-item__content\">\n @if (isTemplateRef(data.content)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.content)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n } @else {\n {{ data.content }}\n }\n </div>\n }\n\n @if (data.actions) {\n <div class=\"kbq-notification-item__actions\">\n @if (isTemplateRef(data.actions)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.actions)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n } @else {\n {{ data.actions }}\n }\n </div>\n }\n</div>\n\n<button\n kbq-button\n class=\"kbq-notification-item__remove-button\"\n data-testid=\"kbq-notification-item-remove-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n [kbqTooltipArrow]=\"false\"\n [kbqTooltip]=\"center.localeData.remove\"\n [kbqPlacement]=\"popUpPlacements.Right\"\n (click)=\"service.remove(data)\"\n>\n <i kbq-icon=\"kbq-trash_16\"></i>\n</button>\n", styles: [".kbq-notification-item{display:flex;box-sizing:border-box;position:relative;border-radius:var(--kbq-size-s);height:auto;margin-left:var(--kbq-size-m);margin-right:var(--kbq-size-m)}.kbq-notification-item:hover .kbq-notification-item-time,.kbq-notification-item:focus-within .kbq-notification-item-time{visibility:hidden}.kbq-notification-item:hover .kbq-notification-item__remove-button,.kbq-notification-item:focus-within .kbq-notification-item__remove-button{display:block}.kbq-notification-item__icon-container{flex-shrink:0;width:var(--kbq-size-l);max-width:var(--kbq-size-l);height:var(--kbq-size-l);max-height:var(--kbq-size-l);margin-right:var(--kbq-size-s);padding-left:var(--kbq-size-m);padding-top:14px}.kbq-notification-item__container{display:flex;flex-direction:column;flex:1;padding-top:var(--kbq-size-m);padding-right:var(--kbq-size-s);padding-bottom:var(--kbq-size-m);overflow:hidden}.kbq-notification-item__title{display:flex;flex-direction:row;justify-content:space-between;overflow:hidden;text-overflow:ellipsis}.kbq-notification-item__title>p{margin:0;overflow:hidden;text-overflow:ellipsis}.kbq-notification-item__title.kbq-notification-item__title_with-content{margin-bottom:var(--kbq-size-xxs)}.kbq-notification-item-time{display:flex;flex-direction:row;height:var(--kbq-size-xl);align-items:center;padding-left:22px}.kbq-notification-item-time .kbq-notification-item-time__value{margin-right:var(--kbq-size-3xs)}.kbq-notification-item-time.kbq-notification-item-time_read .kbq-notification-item-time__state{display:none}.kbq-notification-item__text{display:flex;flex:1;align-items:center}.kbq-notification-item__content{display:flex;flex-direction:column;white-space:pre-wrap}.kbq-notification-item__actions{display:flex;padding-top:var(--kbq-size-s);gap:var(--kbq-size-m)}.kbq-notification-item__remove-button{position:absolute;top:var(--kbq-size-xs);right:var(--kbq-size-s);display:none}.kbq-notification-item{background:var(--kbq-background-card)}.kbq-notification-item .kbq-notification-item__title{color:var(--kbq-foreground-contrast)}.kbq-notification-item .kbq-notification-item__text,.kbq-notification-item .kbq-notification-item-time.kbq-notification-item-time_read .kbq-notification-item-time__value{color:var(--kbq-foreground-contrast-secondary)}.kbq-notification-item:hover{background:var(--kbq-states-background-transparent-hover)}.kbq-notification-item{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}.kbq-notification-item .kbq-notification-item-time{font-size:var(--kbq-typography-text-compact-font-size);font-style:var(--kbq-typography-text-compact-font-style);font-weight:var(--kbq-typography-text-compact-font-weight);line-height:var(--kbq-typography-text-compact-line-height);font-family:var(--kbq-typography-text-compact-font-family);text-transform:var(--kbq-typography-text-compact-text-transform);font-feature-settings:var(--kbq-typography-text-compact-font-feature-settings);letter-spacing:var(--kbq-typography-text-compact-letter-spacing)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i1.KbqIcon, selector: "[kbq-icon]", inputs: ["small", "autoColor", "kbq-icon"] }, { kind: "ngmodule", type: KbqTitleModule }, { kind: "directive", type: i3.KbqTitleDirective, selector: "[kbq-title]", inputs: ["kbq-title"], exportAs: ["kbqTitle"] }, { kind: "ngmodule", type: KbqButtonModule }, { kind: "component", type: i3$1.KbqButton, selector: "[kbq-button]", inputs: ["kbqStyle", "disabled", "tabIndex"] }, { kind: "directive", type: i3$1.KbqButtonCssStyler, selector: "[kbq-button]" }, { kind: "directive", type: KbqTooltipTrigger, selector: "[kbqTooltip]", inputs: ["forDisabledComponent", "ignoreTooltipPointerEvents", "kbqTooltipSingleInstance", "hideWithTimeout", "kbqVisible", "kbqPlacement", "kbqRelativeToPointer", "kbqPlacementPriority", "kbqTooltip", "kbqTooltipDisabled", "kbqEnterDelay", "kbqLeaveDelay", "kbqTrigger", "kbqTooltipClass", "kbqTooltipContext", "kbqTooltipColor", "kbqTooltipArrow", "kbqTooltipOffset", "kbqTooltipModifier", "kbqTooltipHeader"], outputs: ["kbqPlacementChange", "kbqVisibleChange"], exportAs: ["kbqTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
275
275
  }
276
276
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqNotificationItemComponent, decorators: [{
277
277
  type: Component,
@@ -293,6 +293,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
293
293
  const defaultOffsetX = 8;
294
294
  /** Rate-limit window (ms) for the scroll-to-bottom check that drives infinite scroll. */
295
295
  const SCROLLED_TO_BOTTOM_AUDIT_TIME = 100;
296
+ /**
297
+ * Tolerance (px) applied when checking whether the list has reached its bottom.
298
+ *
299
+ * `scrollHeight` and `clientHeight` are CSSOM `long`s (rounded to the nearest integer) while
300
+ * `scrollTop` is an `unrestricted double`. At fractional browser zoom or a fractional
301
+ * `devicePixelRatio` the layout lands on fractional CSS pixels and the two roundings go
302
+ * independently, so at the true bottom `scrollHeight - scrollTop - clientHeight` lands anywhere in
303
+ * (-1, 1) rather than on 0 — an exact `<= 0` check then succeeds only about half the time. Below
304
+ * 100% zoom one device pixel is wider than one CSS pixel, which scales the residual by ~1/zoom and
305
+ * pushes it past 1. 2px covers zoom down to 50% and is imperceptible as a trigger threshold.
306
+ *
307
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight
308
+ */
309
+ const SCROLLED_TO_BOTTOM_TOLERANCE = 2;
296
310
  /**default configuration of notification-center */
297
311
  const KBQ_NOTIFICATION_CENTER_DEFAULT_CONFIGURATION = ruRULocaleData.notificationCenter;
298
312
  /** Injection Token for providing configuration of notification-center */
@@ -402,10 +416,11 @@ class KbqNotificationCenterComponent extends KbqPopUp {
402
416
  .pipe(takeUntilDestroyed(this.destroyRef))
403
417
  .subscribe(() => this.requestNextPage());
404
418
  }
405
- /** Whether the list is scrolled to within `scrolledToBottomOffset` pixels of the bottom. */
419
+ /** Whether the list is scrolled to within `scrolledToBottomOffset` pixels of the bottom.
420
+ * Sub-pixel measurement error is absorbed by `SCROLLED_TO_BOTTOM_TOLERANCE`. */
406
421
  isScrolledToBottom() {
407
422
  const { scrollTop, clientHeight, scrollHeight } = this.scrollContainer().contentElement().nativeElement;
408
- return scrollHeight - scrollTop - clientHeight <= this.scrolledToBottomOffset;
423
+ return scrollHeight - scrollTop - clientHeight <= this.scrolledToBottomOffset + SCROLLED_TO_BOTTOM_TOLERANCE;
409
424
  }
410
425
  /** Emits `onNextPage` unless a load is already in flight, errored, or there is nothing more to load. */
411
426
  requestNextPage() {
@@ -454,7 +469,7 @@ class KbqNotificationCenterComponent extends KbqPopUp {
454
469
  this.configuration = KBQ_NOTIFICATION_CENTER_DEFAULT_CONFIGURATION;
455
470
  }
456
471
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqNotificationCenterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
457
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: KbqNotificationCenterComponent, isStandalone: true, selector: "kbq-notification-center", host: { listeners: { "keydown.escape": "escapeHandler()" }, properties: { "class.kbq-notification-center_popover": "popoverMode" }, classAttribute: "kbq-notification-center" }, viewQueries: [{ propertyName: "switcher", first: true, predicate: ["notificationSwitcher"], descendants: true, isSignal: true }, { propertyName: "scrollContainer", first: true, predicate: KbqScrollbar, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"kbq-notification-center-header\">\n <div class=\"kbq-notification-center-title\">\n <div class=\"kbq-notification-center-title__text\">{{ localeData.notifications }}</div>\n <button\n #notificationSwitcher\n #dropdownTrigger=\"kbqDropdownTrigger\"\n kbq-button\n class=\"kbq-notification-center-title__button\"\n data-testid=\"kbq-notification-center-silent-mode-toggle\"\n [kbqDropdownTriggerFor]=\"notificationSwitcherDropdown\"\n [kbqTooltip]=\"service.silentMode.value ? localeData.doNotDisturb : localeData.showPopUpNotifications\"\n [kbqTooltipArrow]=\"false\"\n [kbqPlacement]=\"'right'\"\n [kbqTooltipOffset]=\"4\"\n [kbqTooltipDisabled]=\"dropdownTrigger.opened\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n >\n <i kbq-icon=\"{{ service.silentMode.value ? 'kbq-bell-slash_16' : 'kbq-bell_16' }}\"></i>\n </button>\n </div>\n <div class=\"kbq-notification-center-toolbar\">\n @if (!service.isEmpty) {\n <button\n kbq-button\n class=\"kbq-notification-center-toolbar__button\"\n data-testid=\"kbq-notification-center-remove-all-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n (click)=\"service.removeAll()\"\n >\n <i kbq-icon=\"kbq-trash_16\"></i>\n </button>\n\n <kbq-divider [vertical]=\"true\" />\n }\n\n <button\n kbq-button\n class=\"kbq-notification-center-toolbar__button\"\n data-testid=\"kbq-notification-center-close-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n (click)=\"hide(0)\"\n >\n <i kbq-icon=\"kbq-xmark_16\"></i>\n </button>\n </div>\n</div>\n\n<div\n #notificationCenterContainer=\"kbqOverflowShadowContainer\"\n kbq-scrollbar\n kbqOverflowShadowContainer\n class=\"kbq-notification-center-container\"\n data-testid=\"kbq-notification-center-container\"\n [kbqOverflowShadowBottom]=\"notificationCenterContainer\"\n [shadow]=\"'var(--kbq-shadow-overflow-normal-bottom)'\"\n (onScroll)=\"onContainerScroll()\"\n>\n @if (!service.errorMode.value) {\n @if (!service.loadingMode.value) {\n @for (group of service.groupedItems | async; track group) {\n <div\n class=\"kbq-notification-center-sub-header\"\n data-testid=\"kbq-notification-center-group\"\n [kbqOverflowShadowTop]=\"$first ? notificationCenterContainer : undefined\"\n >\n <div class=\"kbq-notification-center-sub-header__date\">{{ group.title }}</div>\n\n <button\n kbq-button\n class=\"kbq-notification-center-sub-header__button\"\n data-testid=\"kbq-notification-center-remove-group-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n [kbqTooltip]=\"localeData.remove\"\n [kbqPlacement]=\"'right'\"\n [kbqTooltipArrow]=\"false\"\n (click)=\"service.removeGroup(group)\"\n >\n <i kbq-icon=\"kbq-trash_16\"></i>\n </button>\n </div>\n\n @for (item of group.items; track item) {\n <kbq-notification-item [data]=\"item\" />\n }\n } @empty {\n @if (!service.loadingMore.value) {\n <div class=\"kbq-notification-center-empty-container\" data-testid=\"kbq-notification-center-empty\">\n <i kbq-icon-item=\"kbq-bell_16\" [big]=\"true\" [color]=\"'contrast-fade'\"></i>\n {{ localeData.noNotifications }}\n </div>\n }\n }\n\n @if (service.loadingMore.value) {\n <div\n class=\"kbq-notification-center-load-more\"\n data-testid=\"kbq-notification-center-load-more\"\n role=\"status\"\n [attr.aria-label]=\"localeData.loadingMore\"\n >\n <kbq-progress-spinner [mode]=\"'indeterminate'\" [size]=\"'compact'\" />\n </div>\n }\n\n @if (service.loadMoreErrorMode.value) {\n <div\n class=\"kbq-notification-center-load-more-error\"\n data-testid=\"kbq-notification-center-load-more-error\"\n role=\"alert\"\n >\n {{ localeData.failedToLoadNotifications }}\n <button\n kbq-button\n data-testid=\"kbq-notification-center-load-more-retry-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'theme'\"\n (click)=\"retryLoadMore()\"\n >\n {{ localeData.repeat }}\n </button>\n </div>\n }\n } @else {\n <kbq-loader-overlay data-testid=\"kbq-notification-center-loader\" [transparent]=\"true\" />\n }\n } @else {\n <div class=\"kbq-notification-center-error-container\" data-testid=\"kbq-notification-center-error\">\n <i kbq-icon-item=\"kbq-bell_16\" [big]=\"true\" [color]=\"'error'\" [fade]=\"true\"></i>\n {{ localeData.failedToLoadNotifications }}\n <button\n kbq-button\n data-testid=\"kbq-notification-center-reload-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'theme'\"\n (click)=\"service.onReload.emit()\"\n >\n {{ localeData.repeat }}\n </button>\n </div>\n }\n</div>\n\n<kbq-dropdown #notificationSwitcherDropdown=\"kbqDropdown\">\n <button\n kbq-dropdown-item\n data-testid=\"kbq-notification-center-show-notifications-button\"\n (click)=\"service.setSilentMode(false)\"\n >\n <i kbq-icon=\"{{ !service.silentMode.value ? 'kbq-circle-xs_16' : '' }}\" [style.min-width.px]=\"16\"></i>\n {{ localeData.showPopUpNotifications }}\n </button>\n <button\n kbq-dropdown-item\n data-testid=\"kbq-notification-center-do-not-disturb-button\"\n (click)=\"service.setSilentMode(true)\"\n >\n <i kbq-icon=\"{{ service.silentMode.value ? 'kbq-circle-xs_16' : '' }}\" [style.min-width.px]=\"16\"></i>\n {{ localeData.doNotDisturb }}\n </button>\n</kbq-dropdown>\n", styles: [".kbq-notification-center{position:relative;display:flex;flex-direction:column;width:400px;height:100vh;box-sizing:border-box;z-index:1}.kbq-notification-center:not(.kbq-notification-center_popover){border-right:1px solid;border-left:1px solid}.kbq-notification-center.kbq-notification-center_popover{margin-top:var(--kbq-size-xxs);margin-bottom:var(--kbq-size-xxs);border-radius:var(--kbq-size-xs);height:calc(100vh - 48px);box-shadow:var(--kbq-shadow-popup)}.kbq-notification-center-header{display:flex;flex-direction:row;justify-content:space-between;padding:var(--kbq-size-m) var(--kbq-size-xl) var(--kbq-size-xxs) var(--kbq-size-xxl)}.kbq-notification-center-title{display:flex;flex-direction:row;align-items:center;gap:var(--kbq-size-xxs)}.kbq-notification-center-toolbar{display:flex;flex-direction:row;align-items:center}.kbq-notification-center-toolbar .kbq-divider.kbq-divider_vertical{height:var(--kbq-size-m)}.kbq-notification-center-sub-header{position:sticky;top:0;z-index:100;display:flex;flex-direction:row;padding:var(--kbq-size-s) var(--kbq-size-xl)}.kbq-notification-center-sub-header .kbq-notification-center-sub-header__button{position:absolute;top:0;right:var(--kbq-size-xl);display:none}.kbq-notification-center-sub-header:hover .kbq-notification-center-sub-header__button,.kbq-notification-center-sub-header:focus-within .kbq-notification-center-sub-header__button{display:flex}.kbq-notification-center-container{height:100%;border-radius:inherit;padding-bottom:var(--kbq-size-xl)}.kbq-notification-center-container [data-overlayscrollbars-viewport]{scroll-behavior:smooth}@media(prefers-reduced-motion:reduce){.kbq-notification-center-container [data-overlayscrollbars-viewport]{scroll-behavior:auto}}.kbq-notification-center-container .kbq-loader-overlay_parent{border-radius:inherit}.kbq-notification-center-load-more{display:flex;align-items:center;justify-content:center;padding:26px 0}.kbq-notification-center-load-more-error{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--kbq-size-xxs) var(--kbq-size-xxl);text-align:center}.kbq-notification-center-load-more-error .kbq-button{margin-top:var(--kbq-size-s)}.kbq-notification-center-empty-container,.kbq-notification-center-error-container{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.kbq-notification-center-empty-container .kbq-icon,.kbq-notification-center-error-container .kbq-icon{margin-bottom:var(--kbq-size-xl)}.kbq-notification-center-empty-container .kbq-button,.kbq-notification-center-error-container .kbq-button{margin-top:var(--kbq-size-s)}.kbq-notification-center,.kbq-notification-center-sub-header{background:var(--kbq-background-card)}.kbq-notification-center:not(.kbq-notification-center_popover),.kbq-notification-center-sub-header:not(.kbq-notification-center_popover){border-right-color:var(--kbq-line-contrast-less);border-left-color:var(--kbq-line-contrast-less)}.kbq-notification-center-error-container,.kbq-notification-center-load-more-error{color:var(--kbq-foreground-error)}.kbq-notification-center{font-size:var(--kbq-typography-text-normal-medium-font-size);font-style:var(--kbq-typography-text-normal-medium-font-style);font-weight:var(--kbq-typography-text-normal-medium-font-weight);line-height:var(--kbq-typography-text-normal-medium-line-height);font-family:var(--kbq-typography-text-normal-medium-font-family);text-transform:var(--kbq-typography-text-normal-medium-text-transform);font-feature-settings:var(--kbq-typography-text-normal-medium-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-medium-letter-spacing)}.kbq-notification-center-title__text{font-size:var(--kbq-typography-text-big-strong-font-size);font-style:var(--kbq-typography-text-big-strong-font-style);font-weight:var(--kbq-typography-text-big-strong-font-weight);line-height:var(--kbq-typography-text-big-strong-line-height);font-family:var(--kbq-typography-text-big-strong-font-family);text-transform:var(--kbq-typography-text-big-strong-text-transform);font-feature-settings:var(--kbq-typography-text-big-strong-font-feature-settings);letter-spacing:var(--kbq-typography-text-big-strong-letter-spacing)}\n"], dependencies: [{ kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i1.KbqIcon, selector: "[kbq-icon]", inputs: ["small", "autoColor", "kbq-icon"] }, { kind: "component", type: i1.KbqIconItem, selector: "[kbq-icon-item]", inputs: ["kbq-icon-item", "fade", "big"] }, { kind: "ngmodule", type: KbqBadgeModule }, { kind: "ngmodule", type: KbqScrollbarModule }, { kind: "component", type: i2.KbqScrollbar, selector: "kbq-scrollbar, [kbq-scrollbar]", inputs: ["initializationTarget", "options", "events", "defer"], outputs: ["onInitialize", "onUpdate", "onDestroy", "onScroll"], exportAs: ["kbqScrollbar"] }, { kind: "ngmodule", type: KbqButtonModule }, { kind: "component", type: i3$1.KbqButton, selector: "[kbq-button]", inputs: ["kbqStyle", "disabled", "tabIndex"] }, { kind: "directive", type: i3$1.KbqButtonCssStyler, selector: "[kbq-button]" }, { kind: "directive", type: i3$1.KbqButtonDropdownTrigger, selector: "[kbq-button][kbqDropdownTriggerFor]" }, { kind: "ngmodule", type: KbqDividerModule }, { kind: "component", type: i4.KbqDivider, selector: "kbq-divider", inputs: ["vertical", "paddings"] }, { kind: "ngmodule", type: KbqDropdownModule }, { kind: "component", type: i5.KbqDropdown, selector: "kbq-dropdown", inputs: ["navigationWithWrap", "xPosition", "yPosition", "overlapTriggerY", "overlapTriggerX", "hasBackdrop", "class", "backdropClass"], outputs: ["closed"], exportAs: ["kbqDropdown"] }, { kind: "component", type: i5.KbqDropdownItem, selector: "kbq-dropdown-item, [kbq-dropdown-item]", inputs: ["disabled"], exportAs: ["kbqDropdownItem"] }, { kind: "directive", type: i5.KbqDropdownTrigger, selector: "[kbqDropdownTriggerFor]", inputs: ["offsetX", "offsetY", "kbqDropdownTriggerData", "openByArrowDown", "demoteOverlay", "kbqDropdownTriggerRestoreFocus", "kbqDropdownTriggerFor"], outputs: ["dropdownOpened", "dropdownClosed"], exportAs: ["kbqDropdownTrigger"] }, { kind: "ngmodule", type: KbqToolTipModule }, { kind: "directive", type: i6.KbqTooltipTrigger, selector: "[kbqTooltip]", inputs: ["forDisabledComponent", "ignoreTooltipPointerEvents", "hideWithTimeout", "kbqVisible", "kbqPlacement", "kbqRelativeToPointer", "kbqPlacementPriority", "kbqTooltip", "kbqTooltipDisabled", "kbqEnterDelay", "kbqLeaveDelay", "kbqTrigger", "kbqTooltipClass", "kbqTooltipContext", "kbqTooltipColor", "kbqTooltipArrow", "kbqTooltipOffset", "kbqTooltipModifier", "kbqTooltipHeader"], outputs: ["kbqPlacementChange", "kbqVisibleChange"], exportAs: ["kbqTooltip"] }, { kind: "component", type: KbqNotificationItemComponent, selector: "kbq-notification-item", inputs: ["data"] }, { kind: "ngmodule", type: KbqLoaderOverlayModule }, { kind: "component", type: i7.KbqLoaderOverlay, selector: "kbq-loader-overlay", inputs: ["text", "caption", "size", "transparent", "card"] }, { kind: "ngmodule", type: KbqProgressSpinnerModule }, { kind: "component", type: i8.KbqProgressSpinner, selector: "kbq-progress-spinner", inputs: ["id", "value", "mode", "size"] }, { kind: "directive", type: KbqOverflowShadowContainer, selector: "[kbqOverflowShadowContainer]", inputs: ["debounce"], exportAs: ["kbqOverflowShadowContainer"] }, { kind: "directive", type: KbqOverflowShadowTop, selector: "[kbqOverflowShadowTop]", inputs: ["kbqOverflowShadowTop", "shadow"], exportAs: ["kbqOverflowShadowTop"] }, { kind: "directive", type: KbqOverflowShadowBottom, selector: "[kbqOverflowShadowBottom]", inputs: ["kbqOverflowShadowBottom", "shadow"], exportAs: ["kbqOverflowShadowBottom"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], animations: [KbqNotificationCenterAnimations.state], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
472
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: KbqNotificationCenterComponent, isStandalone: true, selector: "kbq-notification-center", host: { listeners: { "keydown.escape": "escapeHandler()" }, properties: { "class.kbq-notification-center_popover": "popoverMode" }, classAttribute: "kbq-notification-center" }, viewQueries: [{ propertyName: "switcher", first: true, predicate: ["notificationSwitcher"], descendants: true, isSignal: true }, { propertyName: "scrollContainer", first: true, predicate: KbqScrollbar, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"kbq-notification-center-header\">\n <div class=\"kbq-notification-center-title\">\n <div class=\"kbq-notification-center-title__text\">{{ localeData.notifications }}</div>\n <button\n #notificationSwitcher\n #dropdownTrigger=\"kbqDropdownTrigger\"\n kbq-button\n class=\"kbq-notification-center-title__button\"\n data-testid=\"kbq-notification-center-silent-mode-toggle\"\n [kbqDropdownTriggerFor]=\"notificationSwitcherDropdown\"\n [kbqTooltip]=\"service.silentMode.value ? localeData.doNotDisturb : localeData.showPopUpNotifications\"\n [kbqTooltipArrow]=\"false\"\n [kbqPlacement]=\"'right'\"\n [kbqTooltipOffset]=\"4\"\n [kbqTooltipDisabled]=\"dropdownTrigger.opened\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n >\n <i kbq-icon=\"{{ service.silentMode.value ? 'kbq-bell-slash_16' : 'kbq-bell_16' }}\"></i>\n </button>\n </div>\n <div class=\"kbq-notification-center-toolbar\">\n @if (!service.isEmpty) {\n <button\n kbq-button\n class=\"kbq-notification-center-toolbar__button\"\n data-testid=\"kbq-notification-center-remove-all-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n (click)=\"service.removeAll()\"\n >\n <i kbq-icon=\"kbq-trash_16\"></i>\n </button>\n\n <kbq-divider [vertical]=\"true\" />\n }\n\n <button\n kbq-button\n class=\"kbq-notification-center-toolbar__button\"\n data-testid=\"kbq-notification-center-close-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n (click)=\"hide(0)\"\n >\n <i kbq-icon=\"kbq-xmark_16\"></i>\n </button>\n </div>\n</div>\n\n<div\n #notificationCenterContainer=\"kbqOverflowShadowContainer\"\n kbq-scrollbar\n kbqOverflowShadowContainer\n class=\"kbq-notification-center-container\"\n data-testid=\"kbq-notification-center-container\"\n [kbqOverflowShadowBottom]=\"notificationCenterContainer\"\n [shadow]=\"'var(--kbq-shadow-overflow-normal-bottom)'\"\n (onScroll)=\"onContainerScroll()\"\n>\n @if (!service.errorMode.value) {\n @if (!service.loadingMode.value) {\n @for (group of service.groupedItems | async; track group) {\n <div\n class=\"kbq-notification-center-sub-header\"\n data-testid=\"kbq-notification-center-group\"\n [kbqOverflowShadowTop]=\"$first ? notificationCenterContainer : undefined\"\n >\n <div class=\"kbq-notification-center-sub-header__date\">{{ group.title }}</div>\n\n <button\n kbq-button\n class=\"kbq-notification-center-sub-header__button\"\n data-testid=\"kbq-notification-center-remove-group-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n [kbqTooltip]=\"localeData.remove\"\n [kbqPlacement]=\"'right'\"\n [kbqTooltipArrow]=\"false\"\n (click)=\"service.removeGroup(group)\"\n >\n <i kbq-icon=\"kbq-trash_16\"></i>\n </button>\n </div>\n\n @for (item of group.items; track item) {\n <kbq-notification-item [data]=\"item\" />\n }\n } @empty {\n @if (!service.loadingMore.value) {\n <div class=\"kbq-notification-center-empty-container\" data-testid=\"kbq-notification-center-empty\">\n <i kbq-icon-item=\"kbq-bell_16\" [big]=\"true\" [color]=\"'contrast-fade'\"></i>\n {{ localeData.noNotifications }}\n </div>\n }\n }\n\n @if (service.loadingMore.value) {\n <div\n class=\"kbq-notification-center-load-more\"\n data-testid=\"kbq-notification-center-load-more\"\n role=\"status\"\n [attr.aria-label]=\"localeData.loadingMore\"\n >\n <kbq-progress-spinner [mode]=\"'indeterminate'\" [size]=\"'compact'\" />\n </div>\n }\n\n @if (service.loadMoreErrorMode.value) {\n <div\n class=\"kbq-notification-center-load-more-error\"\n data-testid=\"kbq-notification-center-load-more-error\"\n role=\"alert\"\n >\n {{ localeData.failedToLoadNotifications }}\n <button\n kbq-button\n data-testid=\"kbq-notification-center-load-more-retry-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'theme'\"\n (click)=\"retryLoadMore()\"\n >\n {{ localeData.repeat }}\n </button>\n </div>\n }\n } @else {\n <kbq-loader-overlay data-testid=\"kbq-notification-center-loader\" [transparent]=\"true\" />\n }\n } @else {\n <div class=\"kbq-notification-center-error-container\" data-testid=\"kbq-notification-center-error\">\n <i kbq-icon-item=\"kbq-bell_16\" [big]=\"true\" [color]=\"'error'\" [fade]=\"true\"></i>\n {{ localeData.failedToLoadNotifications }}\n <button\n kbq-button\n data-testid=\"kbq-notification-center-reload-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'theme'\"\n (click)=\"service.onReload.emit()\"\n >\n {{ localeData.repeat }}\n </button>\n </div>\n }\n</div>\n\n<kbq-dropdown #notificationSwitcherDropdown=\"kbqDropdown\">\n <button\n kbq-dropdown-item\n data-testid=\"kbq-notification-center-show-notifications-button\"\n (click)=\"service.setSilentMode(false)\"\n >\n <i kbq-icon=\"{{ !service.silentMode.value ? 'kbq-circle-xs_16' : '' }}\" [style.min-width.px]=\"16\"></i>\n {{ localeData.showPopUpNotifications }}\n </button>\n <button\n kbq-dropdown-item\n data-testid=\"kbq-notification-center-do-not-disturb-button\"\n (click)=\"service.setSilentMode(true)\"\n >\n <i kbq-icon=\"{{ service.silentMode.value ? 'kbq-circle-xs_16' : '' }}\" [style.min-width.px]=\"16\"></i>\n {{ localeData.doNotDisturb }}\n </button>\n</kbq-dropdown>\n", styles: [".kbq-notification-center{position:relative;display:flex;flex-direction:column;width:400px;height:100vh;box-sizing:border-box;z-index:1}.kbq-notification-center:not(.kbq-notification-center_popover){border-right:1px solid;border-left:1px solid}.kbq-notification-center.kbq-notification-center_popover{margin-top:var(--kbq-size-xxs);margin-bottom:var(--kbq-size-xxs);border-radius:var(--kbq-size-xs);height:calc(100vh - 48px);box-shadow:var(--kbq-shadow-popup)}.kbq-notification-center-header{display:flex;flex-direction:row;justify-content:space-between;padding:var(--kbq-size-m) var(--kbq-size-xl) var(--kbq-size-xxs) var(--kbq-size-xxl)}.kbq-notification-center-title{display:flex;flex-direction:row;align-items:center;gap:var(--kbq-size-xxs)}.kbq-notification-center-toolbar{display:flex;flex-direction:row;align-items:center}.kbq-notification-center-toolbar .kbq-divider.kbq-divider_vertical{height:var(--kbq-size-m)}.kbq-notification-center-sub-header{position:sticky;top:0;z-index:100;display:flex;flex-direction:row;padding:var(--kbq-size-s) var(--kbq-size-xl)}.kbq-notification-center-sub-header .kbq-notification-center-sub-header__button{position:absolute;top:0;right:var(--kbq-size-xl);display:none}.kbq-notification-center-sub-header:hover .kbq-notification-center-sub-header__button,.kbq-notification-center-sub-header:focus-within .kbq-notification-center-sub-header__button{display:flex}.kbq-notification-center-container{height:100%;border-radius:inherit;padding-bottom:var(--kbq-size-xl)}.kbq-notification-center-container [data-overlayscrollbars-viewport]{scroll-behavior:smooth}@media(prefers-reduced-motion:reduce){.kbq-notification-center-container [data-overlayscrollbars-viewport]{scroll-behavior:auto}}.kbq-notification-center-container .kbq-loader-overlay_parent{border-radius:inherit}.kbq-notification-center-load-more{display:flex;align-items:center;justify-content:center;padding:26px 0}.kbq-notification-center-load-more-error{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--kbq-size-xxs) var(--kbq-size-xxl);text-align:center}.kbq-notification-center-load-more-error .kbq-button{margin-top:var(--kbq-size-s)}.kbq-notification-center-empty-container,.kbq-notification-center-error-container{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.kbq-notification-center-empty-container .kbq-icon,.kbq-notification-center-error-container .kbq-icon{margin-bottom:var(--kbq-size-xl)}.kbq-notification-center-empty-container .kbq-button,.kbq-notification-center-error-container .kbq-button{margin-top:var(--kbq-size-s)}.kbq-notification-center,.kbq-notification-center-sub-header{background:var(--kbq-background-card)}.kbq-notification-center:not(.kbq-notification-center_popover),.kbq-notification-center-sub-header:not(.kbq-notification-center_popover){border-right-color:var(--kbq-line-contrast-less);border-left-color:var(--kbq-line-contrast-less)}.kbq-notification-center-error-container,.kbq-notification-center-load-more-error{color:var(--kbq-foreground-error)}.kbq-notification-center{font-size:var(--kbq-typography-text-normal-medium-font-size);font-style:var(--kbq-typography-text-normal-medium-font-style);font-weight:var(--kbq-typography-text-normal-medium-font-weight);line-height:var(--kbq-typography-text-normal-medium-line-height);font-family:var(--kbq-typography-text-normal-medium-font-family);text-transform:var(--kbq-typography-text-normal-medium-text-transform);font-feature-settings:var(--kbq-typography-text-normal-medium-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-medium-letter-spacing)}.kbq-notification-center-title__text{font-size:var(--kbq-typography-text-big-strong-font-size);font-style:var(--kbq-typography-text-big-strong-font-style);font-weight:var(--kbq-typography-text-big-strong-font-weight);line-height:var(--kbq-typography-text-big-strong-line-height);font-family:var(--kbq-typography-text-big-strong-font-family);text-transform:var(--kbq-typography-text-big-strong-text-transform);font-feature-settings:var(--kbq-typography-text-big-strong-font-feature-settings);letter-spacing:var(--kbq-typography-text-big-strong-letter-spacing)}\n"], dependencies: [{ kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i1.KbqIcon, selector: "[kbq-icon]", inputs: ["small", "autoColor", "kbq-icon"] }, { kind: "component", type: i1.KbqIconItem, selector: "[kbq-icon-item]", inputs: ["kbq-icon-item", "fade", "big"] }, { kind: "ngmodule", type: KbqBadgeModule }, { kind: "ngmodule", type: KbqScrollbarModule }, { kind: "component", type: i2.KbqScrollbar, selector: "kbq-scrollbar, [kbq-scrollbar]", inputs: ["initializationTarget", "options", "events", "defer"], outputs: ["onInitialize", "onUpdate", "onDestroy", "onScroll"], exportAs: ["kbqScrollbar"] }, { kind: "ngmodule", type: KbqButtonModule }, { kind: "component", type: i3$1.KbqButton, selector: "[kbq-button]", inputs: ["kbqStyle", "disabled", "tabIndex"] }, { kind: "directive", type: i3$1.KbqButtonCssStyler, selector: "[kbq-button]" }, { kind: "directive", type: i3$1.KbqButtonDropdownTrigger, selector: "[kbq-button][kbqDropdownTriggerFor]" }, { kind: "ngmodule", type: KbqDividerModule }, { kind: "component", type: i4.KbqDivider, selector: "kbq-divider", inputs: ["vertical", "paddings"] }, { kind: "ngmodule", type: KbqDropdownModule }, { kind: "component", type: i5.KbqDropdown, selector: "kbq-dropdown", inputs: ["navigationWithWrap", "xPosition", "yPosition", "overlapTriggerY", "overlapTriggerX", "hasBackdrop", "class", "backdropClass", "panelWidth", "panelMinWidth", "panelMaxWidth"], outputs: ["closed"], exportAs: ["kbqDropdown"] }, { kind: "component", type: i5.KbqDropdownItem, selector: "kbq-dropdown-item, [kbq-dropdown-item]", inputs: ["disabled", "progress"], exportAs: ["kbqDropdownItem"] }, { kind: "directive", type: i5.KbqDropdownTrigger, selector: "[kbqDropdownTriggerFor]", inputs: ["offsetX", "offsetY", "kbqDropdownTriggerData", "openByArrowDown", "demoteOverlay", "kbqDropdownTriggerRestoreFocus", "kbqDropdownTriggerFor"], outputs: ["dropdownOpened", "dropdownClosed"], exportAs: ["kbqDropdownTrigger"] }, { kind: "ngmodule", type: KbqToolTipModule }, { kind: "directive", type: i6.KbqTooltipTrigger, selector: "[kbqTooltip]", inputs: ["forDisabledComponent", "ignoreTooltipPointerEvents", "kbqTooltipSingleInstance", "hideWithTimeout", "kbqVisible", "kbqPlacement", "kbqRelativeToPointer", "kbqPlacementPriority", "kbqTooltip", "kbqTooltipDisabled", "kbqEnterDelay", "kbqLeaveDelay", "kbqTrigger", "kbqTooltipClass", "kbqTooltipContext", "kbqTooltipColor", "kbqTooltipArrow", "kbqTooltipOffset", "kbqTooltipModifier", "kbqTooltipHeader"], outputs: ["kbqPlacementChange", "kbqVisibleChange"], exportAs: ["kbqTooltip"] }, { kind: "component", type: KbqNotificationItemComponent, selector: "kbq-notification-item", inputs: ["data"] }, { kind: "ngmodule", type: KbqLoaderOverlayModule }, { kind: "component", type: i7.KbqLoaderOverlay, selector: "kbq-loader-overlay", inputs: ["text", "caption", "size", "transparent", "card"] }, { kind: "ngmodule", type: KbqProgressSpinnerModule }, { kind: "component", type: i8.KbqProgressSpinner, selector: "kbq-progress-spinner", inputs: ["id", "value", "mode", "size"] }, { kind: "directive", type: KbqOverflowShadowContainer, selector: "[kbqOverflowShadowContainer]", inputs: ["debounce"], exportAs: ["kbqOverflowShadowContainer"] }, { kind: "directive", type: KbqOverflowShadowTop, selector: "[kbqOverflowShadowTop]", inputs: ["kbqOverflowShadowTop", "shadow"], exportAs: ["kbqOverflowShadowTop"] }, { kind: "directive", type: KbqOverflowShadowBottom, selector: "[kbqOverflowShadowBottom]", inputs: ["kbqOverflowShadowBottom", "shadow"], exportAs: ["kbqOverflowShadowBottom"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], animations: [KbqNotificationCenterAnimations.state], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
458
473
  }
459
474
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqNotificationCenterComponent, decorators: [{
460
475
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"koobiq-components-notification-center.mjs","sources":["../../../packages/components/notification-center/notification-center-animations.ts","../../../packages/components/notification-center/notification-center.service.ts","../../../packages/components/notification-center/notification-item.ts","../../../packages/components/notification-center/notification-item.html","../../../packages/components/notification-center/notification-center.ts","../../../packages/components/notification-center/notification-center.html","../../../packages/components/notification-center/notification-center.module.ts","../../../packages/components/notification-center/koobiq-components-notification-center.ts"],"sourcesContent":["import { animate, AnimationTriggerMetadata, state, style, transition, trigger } from '@angular/animations';\nimport { KbqAnimationDurations } from '@koobiq/components/core';\n\n/** @docs-private */\nexport const KbqNotificationCenterAnimations: {\n readonly state: AnimationTriggerMetadata;\n} = {\n /** Animation that transitions a tooltip in and out. */\n state: trigger('state', [\n state(\n 'initial',\n style({\n opacity: 0,\n transform: 'scale(1, 0.8)'\n })\n ),\n transition(\n '* => visible',\n animate(\n '120ms cubic-bezier(0, 0, 0.2, 1)',\n style({\n opacity: 1,\n transform: 'scale(1, 1)'\n })\n )\n ),\n transition('* => hidden', animate(`${KbqAnimationDurations.Rapid} linear`, style({ opacity: 0 })))\n ])\n};\n","import { EventEmitter, inject, Injectable, TemplateRef } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DateAdapter, DateFormatter } from '@koobiq/components/core';\nimport { KbqToastData, KbqToastService, KbqToastStyle } from '@koobiq/components/toast';\nimport { BehaviorSubject, combineLatestWith, merge, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nexport interface KbqNotificationItem extends Omit<KbqToastData, 'closeButton'> {\n id?: string;\n\n /** Numeric id of the shown toast, set by `push()` and consumed by `hideToast()`. */\n toastId?: number;\n\n title?: string | TemplateRef<unknown>;\n style?: string | KbqToastStyle;\n\n icon?: boolean | TemplateRef<unknown>;\n iconClass?: string;\n caption?: string | TemplateRef<unknown>;\n\n content?: string | TemplateRef<unknown>;\n actions?: TemplateRef<unknown>;\n\n date: string;\n read?: boolean;\n}\n\nexport const maxUnreadItemsLength = 99;\n\ntype KbqNotificationsGroup = { title: string; items: KbqNotificationItem[] };\n\ntype KbqNotificationsGroups = Record<string, KbqNotificationsGroup>;\n\n/** Payload emitted by `KbqNotificationCenterService.onDelete`. */\nexport type KbqNotificationDeleteEvent = {\n /** What was removed: a single item, a whole date group, or all notifications. */\n type: 'item' | 'group' | 'all';\n /** The notification items that were removed. */\n items: KbqNotificationItem[];\n};\n\n@Injectable({ providedIn: 'root' })\nexport class KbqNotificationCenterService {\n /** @docs-private */\n private readonly adapter = inject(DateAdapter);\n /** @docs-private */\n private readonly formatter = inject(DateFormatter);\n /** @docs-private */\n private readonly toastService = inject(KbqToastService);\n\n /** @docs-private */\n readonly silentMode = new BehaviorSubject(false);\n /** @docs-private */\n readonly loadingMode = new BehaviorSubject(false);\n /** @docs-private */\n readonly errorMode = new BehaviorSubject(false);\n /**\n * Whether the bottom \"load more\" spinner is shown while the next page is being loaded.\n * Note: this is the infinite-scroll indicator and is distinct from `loadingMode`,\n * which renders the full-screen loader instead of the list.\n */\n readonly loadingMore = new BehaviorSubject(false);\n /**\n * Whether the bottom \"load more\" error row (with a retry button) is shown.\n * Distinct from `errorMode`, which replaces the whole list with the full-screen error state.\n */\n readonly loadMoreErrorMode = new BehaviorSubject(false);\n /**\n * Whether there are more notifications to load. While `true`, scrolling to the bottom\n * emits `onNextPage`; set it to `false` to stop further infinite-scroll requests.\n */\n readonly hasMore = new BehaviorSubject(true);\n /** @docs-private */\n readonly onRead = new BehaviorSubject<KbqNotificationItem | null>(null);\n\n /** Triggers an event when the user presses the reload button. */\n readonly onReload = new EventEmitter<void>();\n\n /** Triggers an event when the list is scrolled to the bottom and the next page should be loaded. */\n readonly onNextPage = new EventEmitter<void>();\n\n /** Triggers an event when an item, a group, or all notifications are removed. */\n readonly onDelete = new EventEmitter<KbqNotificationDeleteEvent>();\n\n private originalItems = new BehaviorSubject([] as KbqNotificationItem[]);\n\n /**\n * Grouped notifications, always ordered from newest to oldest: day groups are sorted by date\n * descending, and notifications within each day are sorted by date descending.\n * @docs-private\n */\n readonly groupedItems = this.originalItems.pipe(\n map((items) => {\n const result: KbqNotificationsGroups = {};\n\n items.forEach((item) => this.makeGroup(item, result));\n\n const groups = Object.values(result);\n\n // Newest notifications first within each day.\n groups.forEach((group) => group.items.sort(this.compareByDateDesc));\n\n // Newest day first.\n return groups.sort((a, b) => this.compareByDateDesc(a.items[0], b.items[0]));\n })\n );\n\n /** Emits an event whenever the changes. */\n readonly changes = merge(\n this.silentMode,\n this.loadingMode,\n this.errorMode,\n this.loadingMore,\n this.loadMoreErrorMode,\n this.hasMore,\n this.originalItems,\n this.onRead\n );\n\n /** Notification items */\n get items() {\n return this.originalItems.value;\n }\n\n set items(values: KbqNotificationItem[]) {\n this.originalItems.next(this.setReadState(this.setIds(values)));\n }\n\n /** Number of unread notifications */\n get unreadItemsCounter(): Observable<string> {\n return this.originalItems.pipe(map((items) => items.filter((item) => item.read === false).length)).pipe(\n combineLatestWith(this.onRead),\n map(([value]) => {\n if (value < maxUnreadItemsLength) {\n return value ? value.toString() : '';\n } else {\n return `${maxUnreadItemsLength}+`;\n }\n })\n );\n }\n\n /** true if there are no notifications. */\n get isEmpty() {\n return this.originalItems.value.length === 0;\n }\n\n constructor() {\n this.toastService?.read.pipe(takeUntilDestroyed()).subscribe((toastData) => {\n const item = this.items.find((item) => item.id === toastData?.id);\n\n if (item && !item.read) {\n item.read = true;\n\n this.onRead.next(toastData as KbqNotificationItem);\n }\n });\n }\n\n /** Set silent mode */\n setSilentMode(value: boolean) {\n this.silentMode.next(value);\n }\n\n /** Set loading mode */\n setLoadingMode(value: boolean) {\n this.loadingMode.next(value);\n }\n\n /** Set error mode */\n setErrorMode(value: boolean) {\n this.errorMode.next(value);\n }\n\n /** Set the bottom \"load more\" spinner visibility. */\n setLoadingMore(value: boolean) {\n this.loadingMore.next(value);\n }\n\n /** Set the bottom \"load more\" error state visibility. */\n setLoadMoreErrorMode(value: boolean) {\n this.loadMoreErrorMode.next(value);\n }\n\n /** Set whether there are more notifications to load via infinite scroll. */\n setHasMore(value: boolean) {\n this.hasMore.next(value);\n }\n\n /** Push new notification item in center */\n push(item: KbqNotificationItem) {\n this.setReadState(this.setIds([item]));\n\n if (!this.silentMode.value) {\n item.toastId = this.toastService.show(item).id;\n }\n\n return this.originalItems.next([...this.originalItems.value, item]);\n }\n\n /** Hides the toast that corresponds to the given notification item. */\n hideToast(item: KbqNotificationItem): void {\n if (item.toastId === undefined) {\n return;\n }\n\n this.toastService.hide(item.toastId);\n item.toastId = undefined;\n }\n\n /** Remove notification item */\n remove(removedItem: KbqNotificationItem) {\n this.hideToast(removedItem);\n\n this.originalItems.next(this.originalItems.value.filter((item) => removedItem !== item));\n\n this.onDelete.emit({ type: 'item', items: [removedItem] });\n }\n\n /** Remove group of notification items */\n removeGroup(group: KbqNotificationsGroup) {\n group.items.forEach((item) => this.hideToast(item));\n\n this.originalItems.next(this.originalItems.value.filter((item) => !group.items.includes(item)));\n\n this.onDelete.emit({ type: 'group', items: [...group.items] });\n }\n\n /** Remove all notification items */\n removeAll() {\n const items = this.originalItems.value;\n\n items.forEach((item) => this.hideToast(item));\n\n this.originalItems.next([]);\n\n this.onDelete.emit({ type: 'all', items });\n }\n\n private makeGroup = (item: KbqNotificationItem, groups: KbqNotificationsGroups) => {\n const parsedDate = this.adapter.parse(item.date, '');\n const groupId = this.adapter.format(parsedDate, 'yyyyMMdd');\n const groupTitle = this.formatter.absoluteLongDate(parsedDate);\n\n if (groups[groupId]) {\n groups[groupId].items.push(item);\n } else {\n groups[groupId] = {\n title: groupTitle,\n items: [item]\n };\n }\n };\n\n /** Compares two notifications by date so the newest comes first. */\n private compareByDateDesc = (a: KbqNotificationItem, b: KbqNotificationItem): number => {\n const parsedA = this.adapter.parse(a.date, '');\n const parsedB = this.adapter.parse(b.date, '');\n\n if (!parsedA || !parsedB) {\n return 0;\n }\n\n return this.adapter.compareDateTime(parsedB, parsedA);\n };\n\n private setIds(items: KbqNotificationItem[]) {\n items.forEach((item) => (item.id = item.id ?? new Date().getTime().toString()));\n\n return items;\n }\n\n private setReadState(items: KbqNotificationItem[]) {\n items.forEach((item) => (item.read = item.read ?? false));\n\n return items;\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, Input, TemplateRef, ViewEncapsulation } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { KbqButtonModule } from '@koobiq/components/button';\nimport { DateAdapter, KbqReadStateDirective, PopUpPlacements, ThemePalette } from '@koobiq/components/core';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqTitleModule } from '@koobiq/components/title';\nimport { KbqTooltipTrigger } from '@koobiq/components/tooltip';\nimport { filter } from 'rxjs/operators';\nimport { KbqNotificationCenterComponent } from './notification-center';\nimport { KbqNotificationCenterService, KbqNotificationItem } from './notification-center.service';\n\nlet id = 0;\n\n/** @docs-private */\n@Component({\n selector: 'kbq-notification-item',\n imports: [\n NgTemplateOutlet,\n KbqIconModule,\n KbqTitleModule,\n KbqButtonModule,\n KbqTooltipTrigger\n ],\n templateUrl: './notification-item.html',\n styleUrls: ['./notification-item.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-notification-item',\n '[class]': 'style',\n 'data-testid': 'kbq-notification-item'\n },\n hostDirectives: [KbqReadStateDirective]\n})\nexport class KbqNotificationItemComponent {\n private readonly adapter = inject(DateAdapter);\n protected readonly service = inject(KbqNotificationCenterService);\n protected readonly readStateDirective = inject<KbqReadStateDirective>(KbqReadStateDirective, { host: true });\n protected readonly center = inject(KbqNotificationCenterComponent, { host: true });\n\n protected popUpPlacements = PopUpPlacements;\n\n themePalette = ThemePalette;\n id = id++;\n\n time: string;\n\n $implicit;\n\n get style() {\n return {\n [`kbq-notification-item_${this.data.style}`]: !!this.data.style\n };\n }\n\n // TODO: Skipped for migration because:\n // Accessor inputs cannot be migrated as they are too complex.\n @Input()\n get data(): KbqNotificationItem {\n return this._data;\n }\n\n set data(value: KbqNotificationItem) {\n this._data = value;\n\n this.time = this.adapter.format(this.adapter.parse(value.date, ''), 'HH:mm');\n }\n\n private _data: KbqNotificationItem;\n\n constructor() {\n this.$implicit = this;\n\n this.readStateDirective.read\n .pipe(\n filter((value: boolean) => value),\n takeUntilDestroyed()\n )\n .subscribe(() => {\n if (this.data.read) {\n return;\n }\n\n this.data.read = true;\n\n this.service.onRead.next(this.data);\n });\n }\n\n isTemplateRef(value): boolean {\n return value instanceof TemplateRef;\n }\n}\n","@if (data.icon) {\n <div class=\"kbq-notification-item__icon-container layout-row layout-align-start-start\">\n @if (data.icon === true) {\n @switch (data.style) {\n @case ('contrast') {\n <i\n kbq-icon=\"kbq-circle-info_16\"\n class=\"kbq-notification-item__icon\"\n [color]=\"$any(data.style)\"\n [class]=\"data.iconClass\"\n ></i>\n }\n @case ('success') {\n <i\n kbq-icon=\"kbq-circle-check_16\"\n class=\"kbq-notification-item__icon\"\n [color]=\"$any(data.style)\"\n [class]=\"data.iconClass\"\n ></i>\n }\n @case ('warning') {\n <i\n kbq-icon=\"kbq-triangle-exclamation_16\"\n class=\"kbq-notification-item__icon\"\n [color]=\"$any(data.style)\"\n [class]=\"data.iconClass\"\n ></i>\n }\n @case ('error') {\n <i\n kbq-icon=\"kbq-triangle-exclamation_16\"\n class=\"kbq-notification-item__icon\"\n [color]=\"$any(data.style)\"\n [class]=\"data.iconClass\"\n ></i>\n }\n }\n } @else if (isTemplateRef(data.icon)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.icon)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n }\n </div>\n}\n\n<div class=\"kbq-notification-item__container\">\n @if (data.title) {\n <div\n kbq-title\n class=\"kbq-notification-item__title\"\n [class.kbq-notification-item__title_with-content]=\"data.caption || data.content\"\n >\n @if (isTemplateRef(data.title)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.title)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n } @else {\n <p>{{ data.title }}</p>\n }\n\n <div class=\"kbq-notification-item-time\" [class.kbq-notification-item-time_read]=\"data.read\">\n <div class=\"kbq-notification-item-time__value\">{{ time }}</div>\n <i class=\"kbq-notification-item-time__state\" kbq-icon=\"kbq-circle-xs_16\" [color]=\"'theme'\"></i>\n </div>\n </div>\n }\n\n @if (data.caption) {\n <div\n kbq-title\n [class.kbq-notification-item__text]=\"data.title\"\n [class.kbq-notification-item__title]=\"!data.title\"\n >\n @if (isTemplateRef(data.caption)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.caption)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n } @else {\n {{ data.caption }}\n }\n </div>\n }\n\n @if (data.content) {\n <div class=\"kbq-notification-item__content\">\n @if (isTemplateRef(data.content)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.content)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n } @else {\n {{ data.content }}\n }\n </div>\n }\n\n @if (data.actions) {\n <div class=\"kbq-notification-item__actions\">\n @if (isTemplateRef(data.actions)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.actions)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n } @else {\n {{ data.actions }}\n }\n </div>\n }\n</div>\n\n<button\n kbq-button\n class=\"kbq-notification-item__remove-button\"\n data-testid=\"kbq-notification-item-remove-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n [kbqTooltipArrow]=\"false\"\n [kbqTooltip]=\"center.localeData.remove\"\n [kbqPlacement]=\"popUpPlacements.Right\"\n (click)=\"service.remove(data)\"\n>\n <i kbq-icon=\"kbq-trash_16\"></i>\n</button>\n","import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { FlexibleConnectedPositionStrategy, Overlay, OverlayConfig, ScrollStrategy } from '@angular/cdk/overlay';\nimport { AsyncPipe } from '@angular/common';\nimport {\n AfterContentInit,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Directive,\n EventEmitter,\n InjectionToken,\n Input,\n Output,\n TemplateRef,\n Type,\n ViewEncapsulation,\n booleanAttribute,\n inject,\n numberAttribute,\n viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { KbqBadgeModule } from '@koobiq/components/badge';\nimport { KbqButton, KbqButtonModule } from '@koobiq/components/button';\nimport {\n DateAdapter,\n KBQ_LOCALE_SERVICE,\n KbqOverflowShadowBottom,\n KbqOverflowShadowContainer,\n KbqOverflowShadowTop,\n KbqPopUp,\n KbqPopUpPlacementValues,\n KbqPopUpSizeValues,\n KbqPopUpTrigger,\n KbqStickToWindowPlacementValues,\n POSITION_TO_CSS_MAP,\n PopUpPlacements,\n PopUpSizes,\n PopUpTriggers,\n applyPopupMargins,\n ruRULocaleData\n} from '@koobiq/components/core';\nimport { KbqDividerModule } from '@koobiq/components/divider';\nimport { KbqDropdownModule } from '@koobiq/components/dropdown';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqLoaderOverlayModule } from '@koobiq/components/loader-overlay';\nimport { KbqProgressSpinnerModule } from '@koobiq/components/progress-spinner';\nimport { KbqScrollbar, KbqScrollbarModule } from '@koobiq/components/scrollbar';\nimport { KbqToolTipModule } from '@koobiq/components/tooltip';\nimport { BehaviorSubject, Subject, Subscription, merge } from 'rxjs';\nimport { auditTime, distinctUntilChanged, filter, map, pairwise } from 'rxjs/operators';\nimport { KbqNotificationCenterAnimations } from './notification-center-animations';\nimport { KbqNotificationCenterService } from './notification-center.service';\nimport { KbqNotificationItemComponent } from './notification-item';\n\nconst defaultOffsetX = 8;\n\n/** Rate-limit window (ms) for the scroll-to-bottom check that drives infinite scroll. */\nconst SCROLLED_TO_BOTTOM_AUDIT_TIME = 100;\n\n/**default configuration of notification-center */\nexport const KBQ_NOTIFICATION_CENTER_DEFAULT_CONFIGURATION = ruRULocaleData.notificationCenter;\n\n/** Injection Token for providing configuration of notification-center */\nexport const KBQ_NOTIFICATION_CENTER_CONFIGURATION = new InjectionToken('KbqNotificationCenterConfiguration');\n\n/** @docs-private */\nexport const KBQ_NOTIFICATION_CENTER_SCROLL_STRATEGY = new InjectionToken<() => ScrollStrategy>(\n 'kbq-notification-center-scroll-strategy'\n);\n\n/** @docs-private */\nexport function kbqNotificationCenterScrollStrategyFactory(overlay: Overlay): () => ScrollStrategy {\n return () => overlay.scrollStrategies.reposition({ scrollThrottle: 20 });\n}\n\n/** @docs-private */\nexport const KBQ_NOTIFICATION_CENTER_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: KBQ_NOTIFICATION_CENTER_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: kbqNotificationCenterScrollStrategyFactory\n};\n\n/** @docs-private */\n@Component({\n selector: 'kbq-notification-center',\n imports: [\n KbqIconModule,\n KbqBadgeModule,\n KbqScrollbarModule,\n KbqButtonModule,\n KbqDividerModule,\n KbqDropdownModule,\n KbqToolTipModule,\n AsyncPipe,\n KbqNotificationItemComponent,\n KbqLoaderOverlayModule,\n KbqProgressSpinnerModule,\n KbqOverflowShadowContainer,\n KbqOverflowShadowTop,\n KbqOverflowShadowBottom\n ],\n templateUrl: './notification-center.html',\n styleUrls: ['./notification-center.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-notification-center',\n '[class.kbq-notification-center_popover]': 'popoverMode',\n '(keydown.escape)': 'escapeHandler()'\n },\n animations: [KbqNotificationCenterAnimations.state],\n preserveWhitespaces: false\n})\nexport class KbqNotificationCenterComponent extends KbqPopUp implements AfterViewInit {\n /** @docs-private */\n protected readonly changeDetectorRef = inject(ChangeDetectorRef);\n /** @docs-private */\n protected readonly localeService = inject(KBQ_LOCALE_SERVICE, { optional: true });\n /** @docs-private */\n protected readonly dateAdapter = inject(DateAdapter);\n /** @docs-private */\n protected readonly service = inject(KbqNotificationCenterService);\n\n readonly externalConfiguration = inject(KBQ_NOTIFICATION_CENTER_CONFIGURATION, { optional: true });\n\n configuration;\n\n /** @docs-private */\n protected popoverMode: boolean;\n\n /** Distance in pixels from the bottom of the list at which the next page is requested.\n * @docs-private */\n protected scrolledToBottomOffset: number = 0;\n\n /** Emits on every scroll of the list container; drives the scroll-to-bottom check. */\n private readonly scroll$ = new Subject<void>();\n\n /** localized data\n * @docs-private */\n get localeData() {\n return this.configuration;\n }\n\n /** @docs-private */\n prefix = 'kbq-notification-center';\n /** @docs-private */\n trigger: KbqNotificationCenterTrigger;\n /** @docs-private */\n isTrapFocus: boolean = false;\n\n readonly switcher = viewChild.required<KbqButton>('notificationSwitcher');\n\n /** Scrollable list container; used to measure scroll position for infinite scroll. */\n private readonly scrollContainer = viewChild.required(KbqScrollbar);\n\n get popoverHeight(): string {\n return this._popoverHeight;\n }\n\n set popoverHeight(value: string) {\n this._popoverHeight = value;\n\n this.elementRef.nativeElement.style.height = value;\n }\n\n private _popoverHeight: string;\n\n constructor() {\n super();\n\n this.localeService?.changes.pipe(takeUntilDestroyed()).subscribe(this.updateLocaleParams);\n\n if (!this.localeService) {\n this.initDefaultParams();\n }\n }\n\n ngAfterViewInit() {\n this.visibleChange.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((state) => {\n if (this.offset !== null && state) {\n applyPopupMargins(\n this.renderer,\n this.elementRef.nativeElement,\n this.prefix,\n `${this.offset!.toString()}px`\n );\n }\n\n this.setStickPosition();\n });\n\n this.service.changes\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.changeDetectorRef.markForCheck());\n\n this.switcher().focus();\n\n this.subscribeToScrolledToBottom();\n this.subscribeToRevealLoadMoreRow();\n }\n\n /** Handles the list container scroll: feeds the scroll-to-bottom check that drives infinite scroll.\n * Overflow shadows are handled declaratively by the `kbqOverflowShadow*` directives.\n * @docs-private */\n protected onContainerScroll(): void {\n this.scroll$.next();\n }\n\n /** Retries loading the next page from the bottom error row.\n * @docs-private */\n protected retryLoadMore(): void {\n // The retry button is about to unmount; keep keyboard focus inside the panel instead of\n // letting it fall back to <body>.\n this.focusScrollContainer();\n\n // Clear the bottom error state here so the spinner and the error row can never be shown at\n // the same time, regardless of what the consumer's `onNextPage` handler does.\n this.service.setLoadMoreErrorMode(false);\n\n this.service.onNextPage.emit();\n }\n\n /**\n * Requests the next page (via `service.onNextPage`) once the list is scrolled to within\n * `scrolledToBottomOffset` pixels of the bottom. Two triggers feed it: the user scrolling, and a\n * page finishing loading. The latter keeps paging when a freshly loaded page is too short to\n * overflow the viewport — otherwise no further scroll event would fire and pagination would\n * stall. Suppressed while a load is in flight, errored, or when there is nothing more to load.\n */\n private subscribeToScrolledToBottom(): void {\n const scrolledToBottom$ = this.scroll$.pipe(\n auditTime(SCROLLED_TO_BOTTOM_AUDIT_TIME),\n map(() => this.isScrolledToBottom()),\n distinctUntilChanged(),\n filter(Boolean)\n );\n\n // Re-measure once a load completes (and the appended items have rendered): if the list still\n // sits at the bottom, continue paging instead of waiting for a scroll event that never comes.\n const loadCompleted$ = this.service.loadingMore.pipe(\n distinctUntilChanged(),\n pairwise(),\n filter(([wasLoading, isLoading]) => wasLoading && !isLoading),\n auditTime(SCROLLED_TO_BOTTOM_AUDIT_TIME),\n filter(() => this.isScrolledToBottom())\n );\n\n merge(scrolledToBottom$, loadCompleted$)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.requestNextPage());\n }\n\n /** Whether the list is scrolled to within `scrolledToBottomOffset` pixels of the bottom. */\n private isScrolledToBottom(): boolean {\n const { scrollTop, clientHeight, scrollHeight } = this.scrollContainer().contentElement().nativeElement;\n\n return scrollHeight - scrollTop - clientHeight <= this.scrolledToBottomOffset;\n }\n\n /** Emits `onNextPage` unless a load is already in flight, errored, or there is nothing more to load. */\n private requestNextPage(): void {\n if (this.service.hasMore.value && !this.service.loadingMore.value && !this.service.loadMoreErrorMode.value) {\n this.service.onNextPage.emit();\n }\n }\n\n /**\n * Reveals the bottom \"load more\" spinner / error row when it first appears. Both rows are appended\n * below the last item and can land outside the viewport (the next page is requested while the user\n * is up to `scrolledToBottomOffset` px above the true bottom). Only a genuine false->true transition\n * reveals the row: the BehaviorSubject's replayed current value is ignored (`pairwise` needs two\n * emissions), so the panel always opens scrolled to the top — reopening it while a load-more error\n * is still set never jumps to the bottom.\n */\n private subscribeToRevealLoadMoreRow(): void {\n const reveal = (source: BehaviorSubject<boolean>) =>\n source.pipe(\n distinctUntilChanged(),\n pairwise(),\n filter(([wasShown, isShown]) => !wasShown && isShown),\n auditTime(SCROLLED_TO_BOTTOM_AUDIT_TIME)\n );\n\n merge(reveal(this.service.loadingMore), reveal(this.service.loadMoreErrorMode))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.scrollToBottom());\n }\n\n /** Scrolls the list container to its bottom so a freshly-appended bottom row becomes visible. */\n private scrollToBottom(): void {\n const { scrollHeight } = this.scrollContainer().contentElement().nativeElement;\n\n this.scrollContainer().scrollTo({ top: scrollHeight });\n }\n\n private focusScrollContainer(): void {\n const element = this.scrollContainer().contentElement().nativeElement;\n\n // tabindex -1 keeps the container out of the Tab order while allowing programmatic focus.\n element.setAttribute('tabindex', '-1');\n element.focus({ preventScroll: true });\n }\n\n /** @docs-private */\n updateClassMap(placement: string, customClass: string, size: KbqPopUpSizeValues) {\n super.updateClassMap(placement, customClass, { [`${this.prefix}_${size}`]: !!size });\n }\n\n /** @docs-private */\n updateTrapFocus(isTrapFocus: boolean): void {\n this.isTrapFocus = isTrapFocus;\n }\n\n /** @docs-private */\n escapeHandler() {\n this.hide(0);\n }\n\n private updateLocaleParams = () => {\n this.configuration = this.externalConfiguration || this.localeService?.getParams('notificationCenter');\n\n this.changeDetectorRef.markForCheck();\n };\n\n private initDefaultParams() {\n this.configuration = KBQ_NOTIFICATION_CENTER_DEFAULT_CONFIGURATION;\n }\n}\n\n@Directive({\n selector: '[kbqNotificationCenterTrigger]',\n host: {\n '[class.kbq-notification-center_open]': 'isOpen',\n '[class.kbq-active]': 'hasClickTrigger && isOpen'\n },\n exportAs: 'kbqNotificationCenterTrigger'\n})\nexport class KbqNotificationCenterTrigger\n extends KbqPopUpTrigger<KbqNotificationCenterComponent>\n implements AfterContentInit\n{\n /** @docs-private */\n protected scrollStrategy: () => ScrollStrategy = inject(KBQ_NOTIFICATION_CENTER_SCROLL_STRATEGY);\n /** @docs-private */\n protected readonly service = inject(KbqNotificationCenterService);\n\n // not used\n /** @docs-private */\n arrow: boolean = false;\n /** @docs-private */\n customClass: string;\n /** @docs-private */\n private hasBackdrop: boolean = false;\n /** @docs-private */\n private size: KbqPopUpSizeValues = PopUpSizes.Medium;\n /** @docs-private */\n content: string | TemplateRef<any>;\n /** @docs-private */\n header: string | TemplateRef<any>;\n /** @docs-private */\n footer: string | TemplateRef<any>;\n\n /** Number of unread notifications */\n get unreadItemsCounter() {\n return this.service.unreadItemsCounter;\n }\n\n /** Placement of popUp */\n // TODO: Skipped for migration because:\n // Your application code writes to the input. This prevents migration.\n @Input('kbqNotificationCenterPlacement') placement: KbqPopUpPlacementValues = PopUpPlacements.Right;\n\n /** Class that will be used in the background */\n // TODO: Skipped for migration because:\n // Class of this input is referenced in the signature of another class.\n @Input() backdropClass: string = 'cdk-overlay-transparent-backdrop';\n\n /** Class that will be used in the panel */\n // TODO: Skipped for migration because:\n // Class of this input is referenced in the signature of another class.\n @Input('kbqNotificationCenterPanelClass') panelClass: string;\n\n /** Offset of popUp */\n // TODO: Skipped for migration because:\n // Class of this input is referenced in the signature of another class.\n @Input({ transform: numberAttribute }) offset: number | null = defaultOffsetX;\n\n /** Distance in pixels from the bottom of the list at which the next page is requested via `onNextPage`. */\n @Input({ transform: numberAttribute }) scrolledToBottomOffset: number = 0;\n\n /** Use popover or not */\n // TODO: Skipped for migration because:\n // Accessor inputs cannot be migrated as they are too complex.\n @Input({ transform: booleanAttribute })\n get popoverMode(): boolean {\n return this._popoverMode;\n }\n\n set popoverMode(value: boolean) {\n this._popoverMode = value;\n\n this.placement = PopUpPlacements.Bottom;\n this.updatePlacementPriority(['bottomCenter', 'bottomLeft', 'bottomRight']);\n }\n\n private _popoverMode: boolean = false;\n\n /** Set height of popover. Default is calc(100vh - 48px). 48px - height of navbar */\n // TODO: Skipped for migration because:\n // Accessor inputs cannot be migrated as they are too complex.\n @Input()\n get popoverHeight(): string {\n return this._popoverHeight;\n }\n\n set popoverHeight(value: string) {\n this._popoverHeight = value;\n\n if (this.instance?.popoverHeight) {\n this.instance.popoverHeight = value;\n }\n }\n\n private _popoverHeight: string;\n\n /** Whether the trigger is disabled. */\n // TODO: Skipped for migration because:\n // Accessor inputs cannot be migrated as they are too complex.\n @Input({ transform: booleanAttribute })\n get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n\n if (this._disabled) {\n this.hide();\n }\n }\n\n /**\n * Additionally positions the element relative to the window side (Top, Right, Bottom and Left).\n * If container is specified, the positioning will be relative to it.\n * */\n // TODO: Skipped for migration because:\n // This input overrides a field from a superclass, while the superclass field\n // is not migrated.\n @Input() stickToWindow: KbqStickToWindowPlacementValues;\n\n /** Container for additional positioning, used with stickToWindow */\n // TODO: Skipped for migration because:\n // This input overrides a field from a superclass, while the superclass field\n // is not migrated.\n @Input() container: HTMLElement;\n\n /** @docs-private */\n get hasClickTrigger(): boolean {\n return this.trigger.includes(PopUpTriggers.Click);\n }\n\n /** Emits a change event whenever the placement state changes. */\n @Output('kbqPlacementChange') readonly placementChange = new EventEmitter();\n\n /** Emits a change event whenever the visible state changes. */\n @Output('kbqVisibleChange') readonly visibleChange = new EventEmitter<boolean>();\n\n /** @docs-private */\n trigger: string = `${PopUpTriggers.Click}, ${PopUpTriggers.Keydown}`;\n\n /** @docs-private */\n protected originSelector = '.kbq-notification-center';\n\n /** @docs-private */\n protected get overlayConfig(): OverlayConfig {\n const defaultPanelClass = 'kbq-notification-center__panel';\n\n return {\n panelClass: this.panelClass ? [defaultPanelClass, this.panelClass] : defaultPanelClass,\n hasBackdrop: this.hasBackdrop,\n backdropClass: this.backdropClass\n };\n }\n\n /** @docs-private */\n protected preventClosingByInnerScrollSubscription: Subscription;\n\n constructor() {\n super();\n\n this.updatePlacementPriority(['right', 'rightBottom', 'rightTop']);\n }\n\n ngAfterContentInit(): void {\n this.visibleChange.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((visible: boolean) => {\n if (visible) {\n // eslint-disable-next-line rxjs-x/no-nested-subscribe\n this.preventClosingByInnerScrollSubscription = this.closingActions().subscribe((event) => {\n if (event && event['scrollDispatcher']) {\n this.instance.setStickPosition();\n\n event['kbqPopoverPreventHide'] = true;\n event['type'] = 'click';\n }\n });\n } else {\n this.preventClosingByInnerScrollSubscription?.unsubscribe();\n this.focus();\n }\n });\n }\n\n /** @docs-private */\n updateData() {\n if (!this.instance) return;\n\n this.instance.header = this.header;\n this.instance.content = this.content;\n this.instance.arrow = this.arrow;\n this.instance.offset = this.offset;\n this.instance.footer = this.footer;\n this.instance.popoverMode = this.popoverMode;\n this.instance.popoverHeight = this.popoverHeight;\n this.instance.scrolledToBottomOffset = this.scrolledToBottomOffset;\n\n this.instance.updateTrapFocus(this.trigger !== PopUpTriggers.Focus);\n\n if (this.isOpen) {\n this.updatePosition(true);\n }\n }\n\n /** Updates the current position.\n *\n * @docs-private */\n updatePosition(reapplyPosition: boolean = false) {\n this.overlayRef = this.createOverlay();\n\n const position = (this.overlayRef.getConfig().positionStrategy as FlexibleConnectedPositionStrategy)\n .withPositions(this.getAdjustedPositions())\n .withPush(true);\n\n if (reapplyPosition) {\n setTimeout(() => position.reapplyLastPosition());\n }\n }\n\n /** @docs-private */\n getOverlayHandleComponentType(): Type<KbqNotificationCenterComponent> {\n return KbqNotificationCenterComponent;\n }\n\n /** @docs-private */\n updateClassMap(newPlacement: string = this.placement) {\n if (!this.instance) return;\n\n this.instance.updateClassMap(POSITION_TO_CSS_MAP[newPlacement], this.customClass, this.size);\n this.instance.markForCheck();\n }\n\n /** @docs-private */\n closingActions() {\n return merge(\n this.overlayRef!.outsidePointerEvents(),\n this.overlayRef!.backdropClick(),\n this.scrollDispatcher.scrolled()\n );\n }\n}\n","<div class=\"kbq-notification-center-header\">\n <div class=\"kbq-notification-center-title\">\n <div class=\"kbq-notification-center-title__text\">{{ localeData.notifications }}</div>\n <button\n #notificationSwitcher\n #dropdownTrigger=\"kbqDropdownTrigger\"\n kbq-button\n class=\"kbq-notification-center-title__button\"\n data-testid=\"kbq-notification-center-silent-mode-toggle\"\n [kbqDropdownTriggerFor]=\"notificationSwitcherDropdown\"\n [kbqTooltip]=\"service.silentMode.value ? localeData.doNotDisturb : localeData.showPopUpNotifications\"\n [kbqTooltipArrow]=\"false\"\n [kbqPlacement]=\"'right'\"\n [kbqTooltipOffset]=\"4\"\n [kbqTooltipDisabled]=\"dropdownTrigger.opened\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n >\n <i kbq-icon=\"{{ service.silentMode.value ? 'kbq-bell-slash_16' : 'kbq-bell_16' }}\"></i>\n </button>\n </div>\n <div class=\"kbq-notification-center-toolbar\">\n @if (!service.isEmpty) {\n <button\n kbq-button\n class=\"kbq-notification-center-toolbar__button\"\n data-testid=\"kbq-notification-center-remove-all-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n (click)=\"service.removeAll()\"\n >\n <i kbq-icon=\"kbq-trash_16\"></i>\n </button>\n\n <kbq-divider [vertical]=\"true\" />\n }\n\n <button\n kbq-button\n class=\"kbq-notification-center-toolbar__button\"\n data-testid=\"kbq-notification-center-close-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n (click)=\"hide(0)\"\n >\n <i kbq-icon=\"kbq-xmark_16\"></i>\n </button>\n </div>\n</div>\n\n<div\n #notificationCenterContainer=\"kbqOverflowShadowContainer\"\n kbq-scrollbar\n kbqOverflowShadowContainer\n class=\"kbq-notification-center-container\"\n data-testid=\"kbq-notification-center-container\"\n [kbqOverflowShadowBottom]=\"notificationCenterContainer\"\n [shadow]=\"'var(--kbq-shadow-overflow-normal-bottom)'\"\n (onScroll)=\"onContainerScroll()\"\n>\n @if (!service.errorMode.value) {\n @if (!service.loadingMode.value) {\n @for (group of service.groupedItems | async; track group) {\n <div\n class=\"kbq-notification-center-sub-header\"\n data-testid=\"kbq-notification-center-group\"\n [kbqOverflowShadowTop]=\"$first ? notificationCenterContainer : undefined\"\n >\n <div class=\"kbq-notification-center-sub-header__date\">{{ group.title }}</div>\n\n <button\n kbq-button\n class=\"kbq-notification-center-sub-header__button\"\n data-testid=\"kbq-notification-center-remove-group-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n [kbqTooltip]=\"localeData.remove\"\n [kbqPlacement]=\"'right'\"\n [kbqTooltipArrow]=\"false\"\n (click)=\"service.removeGroup(group)\"\n >\n <i kbq-icon=\"kbq-trash_16\"></i>\n </button>\n </div>\n\n @for (item of group.items; track item) {\n <kbq-notification-item [data]=\"item\" />\n }\n } @empty {\n @if (!service.loadingMore.value) {\n <div class=\"kbq-notification-center-empty-container\" data-testid=\"kbq-notification-center-empty\">\n <i kbq-icon-item=\"kbq-bell_16\" [big]=\"true\" [color]=\"'contrast-fade'\"></i>\n {{ localeData.noNotifications }}\n </div>\n }\n }\n\n @if (service.loadingMore.value) {\n <div\n class=\"kbq-notification-center-load-more\"\n data-testid=\"kbq-notification-center-load-more\"\n role=\"status\"\n [attr.aria-label]=\"localeData.loadingMore\"\n >\n <kbq-progress-spinner [mode]=\"'indeterminate'\" [size]=\"'compact'\" />\n </div>\n }\n\n @if (service.loadMoreErrorMode.value) {\n <div\n class=\"kbq-notification-center-load-more-error\"\n data-testid=\"kbq-notification-center-load-more-error\"\n role=\"alert\"\n >\n {{ localeData.failedToLoadNotifications }}\n <button\n kbq-button\n data-testid=\"kbq-notification-center-load-more-retry-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'theme'\"\n (click)=\"retryLoadMore()\"\n >\n {{ localeData.repeat }}\n </button>\n </div>\n }\n } @else {\n <kbq-loader-overlay data-testid=\"kbq-notification-center-loader\" [transparent]=\"true\" />\n }\n } @else {\n <div class=\"kbq-notification-center-error-container\" data-testid=\"kbq-notification-center-error\">\n <i kbq-icon-item=\"kbq-bell_16\" [big]=\"true\" [color]=\"'error'\" [fade]=\"true\"></i>\n {{ localeData.failedToLoadNotifications }}\n <button\n kbq-button\n data-testid=\"kbq-notification-center-reload-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'theme'\"\n (click)=\"service.onReload.emit()\"\n >\n {{ localeData.repeat }}\n </button>\n </div>\n }\n</div>\n\n<kbq-dropdown #notificationSwitcherDropdown=\"kbqDropdown\">\n <button\n kbq-dropdown-item\n data-testid=\"kbq-notification-center-show-notifications-button\"\n (click)=\"service.setSilentMode(false)\"\n >\n <i kbq-icon=\"{{ !service.silentMode.value ? 'kbq-circle-xs_16' : '' }}\" [style.min-width.px]=\"16\"></i>\n {{ localeData.showPopUpNotifications }}\n </button>\n <button\n kbq-dropdown-item\n data-testid=\"kbq-notification-center-do-not-disturb-button\"\n (click)=\"service.setSilentMode(true)\"\n >\n <i kbq-icon=\"{{ service.silentMode.value ? 'kbq-circle-xs_16' : '' }}\" [style.min-width.px]=\"16\"></i>\n {{ localeData.doNotDisturb }}\n </button>\n</kbq-dropdown>\n","import { ConfigurableFocusTrapFactory, FOCUS_TRAP_INERT_STRATEGY, FocusTrapFactory } from '@angular/cdk/a11y';\nimport { NgModule } from '@angular/core';\nimport { EmptyFocusTrapStrategy } from '@koobiq/components/core';\nimport {\n KBQ_NOTIFICATION_CENTER_SCROLL_STRATEGY_FACTORY_PROVIDER,\n KbqNotificationCenterComponent,\n KbqNotificationCenterTrigger\n} from './notification-center';\nimport { KbqNotificationCenterService } from './notification-center.service';\n\n@NgModule({\n imports: [\n KbqNotificationCenterComponent,\n KbqNotificationCenterTrigger\n ],\n providers: [\n KBQ_NOTIFICATION_CENTER_SCROLL_STRATEGY_FACTORY_PROVIDER,\n { provide: FocusTrapFactory, useClass: ConfigurableFocusTrapFactory },\n { provide: FOCUS_TRAP_INERT_STRATEGY, useClass: EmptyFocusTrapStrategy },\n KbqNotificationCenterService\n ],\n exports: [\n KbqNotificationCenterComponent,\n KbqNotificationCenterTrigger\n ]\n})\nexport class KbqNotificationCenterModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i4","i3"],"mappings":"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"}
1
+ {"version":3,"file":"koobiq-components-notification-center.mjs","sources":["../../../packages/components/notification-center/notification-center-animations.ts","../../../packages/components/notification-center/notification-center.service.ts","../../../packages/components/notification-center/notification-item.ts","../../../packages/components/notification-center/notification-item.html","../../../packages/components/notification-center/notification-center.ts","../../../packages/components/notification-center/notification-center.html","../../../packages/components/notification-center/notification-center.module.ts","../../../packages/components/notification-center/koobiq-components-notification-center.ts"],"sourcesContent":["import { animate, AnimationTriggerMetadata, state, style, transition, trigger } from '@angular/animations';\nimport { KbqAnimationDurations } from '@koobiq/components/core';\n\n/** @docs-private */\nexport const KbqNotificationCenterAnimations: {\n readonly state: AnimationTriggerMetadata;\n} = {\n /** Animation that transitions a tooltip in and out. */\n state: trigger('state', [\n state(\n 'initial',\n style({\n opacity: 0,\n transform: 'scale(1, 0.8)'\n })\n ),\n transition(\n '* => visible',\n animate(\n '120ms cubic-bezier(0, 0, 0.2, 1)',\n style({\n opacity: 1,\n transform: 'scale(1, 1)'\n })\n )\n ),\n transition('* => hidden', animate(`${KbqAnimationDurations.Rapid} linear`, style({ opacity: 0 })))\n ])\n};\n","import { EventEmitter, inject, Injectable, TemplateRef } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DateAdapter, DateFormatter } from '@koobiq/components/core';\nimport { KbqToastData, KbqToastService, KbqToastStyle } from '@koobiq/components/toast';\nimport { BehaviorSubject, combineLatestWith, merge, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nexport interface KbqNotificationItem extends Omit<KbqToastData, 'closeButton'> {\n id?: string;\n\n /** Numeric id of the shown toast, set by `push()` and consumed by `hideToast()`. */\n toastId?: number;\n\n title?: string | TemplateRef<unknown>;\n style?: string | KbqToastStyle;\n\n icon?: boolean | TemplateRef<unknown>;\n iconClass?: string;\n caption?: string | TemplateRef<unknown>;\n\n content?: string | TemplateRef<unknown>;\n actions?: TemplateRef<unknown>;\n\n date: string;\n read?: boolean;\n}\n\nexport const maxUnreadItemsLength = 99;\n\ntype KbqNotificationsGroup = { title: string; items: KbqNotificationItem[] };\n\ntype KbqNotificationsGroups = Record<string, KbqNotificationsGroup>;\n\n/** Payload emitted by `KbqNotificationCenterService.onDelete`. */\nexport type KbqNotificationDeleteEvent = {\n /** What was removed: a single item, a whole date group, or all notifications. */\n type: 'item' | 'group' | 'all';\n /** The notification items that were removed. */\n items: KbqNotificationItem[];\n};\n\n@Injectable({ providedIn: 'root' })\nexport class KbqNotificationCenterService {\n /** @docs-private */\n private readonly adapter = inject(DateAdapter);\n /** @docs-private */\n private readonly formatter = inject(DateFormatter);\n /** @docs-private */\n private readonly toastService = inject(KbqToastService);\n\n /** @docs-private */\n readonly silentMode = new BehaviorSubject(false);\n /** @docs-private */\n readonly loadingMode = new BehaviorSubject(false);\n /** @docs-private */\n readonly errorMode = new BehaviorSubject(false);\n /**\n * Whether the bottom \"load more\" spinner is shown while the next page is being loaded.\n * Note: this is the infinite-scroll indicator and is distinct from `loadingMode`,\n * which renders the full-screen loader instead of the list.\n */\n readonly loadingMore = new BehaviorSubject(false);\n /**\n * Whether the bottom \"load more\" error row (with a retry button) is shown.\n * Distinct from `errorMode`, which replaces the whole list with the full-screen error state.\n */\n readonly loadMoreErrorMode = new BehaviorSubject(false);\n /**\n * Whether there are more notifications to load. While `true`, scrolling to the bottom\n * emits `onNextPage`; set it to `false` to stop further infinite-scroll requests.\n */\n readonly hasMore = new BehaviorSubject(true);\n /** @docs-private */\n readonly onRead = new BehaviorSubject<KbqNotificationItem | null>(null);\n\n /** Triggers an event when the user presses the reload button. */\n readonly onReload = new EventEmitter<void>();\n\n /** Triggers an event when the list is scrolled to the bottom and the next page should be loaded. */\n readonly onNextPage = new EventEmitter<void>();\n\n /** Triggers an event when an item, a group, or all notifications are removed. */\n readonly onDelete = new EventEmitter<KbqNotificationDeleteEvent>();\n\n private originalItems = new BehaviorSubject([] as KbqNotificationItem[]);\n\n /**\n * Grouped notifications, always ordered from newest to oldest: day groups are sorted by date\n * descending, and notifications within each day are sorted by date descending.\n * @docs-private\n */\n readonly groupedItems = this.originalItems.pipe(\n map((items) => {\n const result: KbqNotificationsGroups = {};\n\n items.forEach((item) => this.makeGroup(item, result));\n\n const groups = Object.values(result);\n\n // Newest notifications first within each day.\n groups.forEach((group) => group.items.sort(this.compareByDateDesc));\n\n // Newest day first.\n return groups.sort((a, b) => this.compareByDateDesc(a.items[0], b.items[0]));\n })\n );\n\n /** Emits an event whenever the changes. */\n readonly changes = merge(\n this.silentMode,\n this.loadingMode,\n this.errorMode,\n this.loadingMore,\n this.loadMoreErrorMode,\n this.hasMore,\n this.originalItems,\n this.onRead\n );\n\n /** Notification items */\n get items() {\n return this.originalItems.value;\n }\n\n set items(values: KbqNotificationItem[]) {\n this.originalItems.next(this.setReadState(this.setIds(values)));\n }\n\n /** Number of unread notifications */\n get unreadItemsCounter(): Observable<string> {\n return this.originalItems.pipe(map((items) => items.filter((item) => item.read === false).length)).pipe(\n combineLatestWith(this.onRead),\n map(([value]) => {\n if (value < maxUnreadItemsLength) {\n return value ? value.toString() : '';\n } else {\n return `${maxUnreadItemsLength}+`;\n }\n })\n );\n }\n\n /** true if there are no notifications. */\n get isEmpty() {\n return this.originalItems.value.length === 0;\n }\n\n constructor() {\n this.toastService?.read.pipe(takeUntilDestroyed()).subscribe((toastData) => {\n const item = this.items.find((item) => item.id === toastData?.id);\n\n if (item && !item.read) {\n item.read = true;\n\n this.onRead.next(toastData as KbqNotificationItem);\n }\n });\n }\n\n /** Set silent mode */\n setSilentMode(value: boolean) {\n this.silentMode.next(value);\n }\n\n /** Set loading mode */\n setLoadingMode(value: boolean) {\n this.loadingMode.next(value);\n }\n\n /** Set error mode */\n setErrorMode(value: boolean) {\n this.errorMode.next(value);\n }\n\n /** Set the bottom \"load more\" spinner visibility. */\n setLoadingMore(value: boolean) {\n this.loadingMore.next(value);\n }\n\n /** Set the bottom \"load more\" error state visibility. */\n setLoadMoreErrorMode(value: boolean) {\n this.loadMoreErrorMode.next(value);\n }\n\n /** Set whether there are more notifications to load via infinite scroll. */\n setHasMore(value: boolean) {\n this.hasMore.next(value);\n }\n\n /** Push new notification item in center */\n push(item: KbqNotificationItem) {\n this.setReadState(this.setIds([item]));\n\n if (!this.silentMode.value) {\n item.toastId = this.toastService.show(item).id;\n }\n\n return this.originalItems.next([...this.originalItems.value, item]);\n }\n\n /** Hides the toast that corresponds to the given notification item. */\n hideToast(item: KbqNotificationItem): void {\n if (item.toastId === undefined) {\n return;\n }\n\n this.toastService.hide(item.toastId);\n item.toastId = undefined;\n }\n\n /** Remove notification item */\n remove(removedItem: KbqNotificationItem) {\n this.hideToast(removedItem);\n\n this.originalItems.next(this.originalItems.value.filter((item) => removedItem !== item));\n\n this.onDelete.emit({ type: 'item', items: [removedItem] });\n }\n\n /** Remove group of notification items */\n removeGroup(group: KbqNotificationsGroup) {\n group.items.forEach((item) => this.hideToast(item));\n\n this.originalItems.next(this.originalItems.value.filter((item) => !group.items.includes(item)));\n\n this.onDelete.emit({ type: 'group', items: [...group.items] });\n }\n\n /** Remove all notification items */\n removeAll() {\n const items = this.originalItems.value;\n\n items.forEach((item) => this.hideToast(item));\n\n this.originalItems.next([]);\n\n this.onDelete.emit({ type: 'all', items });\n }\n\n private makeGroup = (item: KbqNotificationItem, groups: KbqNotificationsGroups) => {\n const parsedDate = this.adapter.parse(item.date, '');\n const groupId = this.adapter.format(parsedDate, 'yyyyMMdd');\n const groupTitle = this.formatter.absoluteLongDate(parsedDate);\n\n if (groups[groupId]) {\n groups[groupId].items.push(item);\n } else {\n groups[groupId] = {\n title: groupTitle,\n items: [item]\n };\n }\n };\n\n /** Compares two notifications by date so the newest comes first. */\n private compareByDateDesc = (a: KbqNotificationItem, b: KbqNotificationItem): number => {\n const parsedA = this.adapter.parse(a.date, '');\n const parsedB = this.adapter.parse(b.date, '');\n\n if (!parsedA || !parsedB) {\n return 0;\n }\n\n return this.adapter.compareDateTime(parsedB, parsedA);\n };\n\n private setIds(items: KbqNotificationItem[]) {\n items.forEach((item) => (item.id = item.id ?? new Date().getTime().toString()));\n\n return items;\n }\n\n private setReadState(items: KbqNotificationItem[]) {\n items.forEach((item) => (item.read = item.read ?? false));\n\n return items;\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, Input, TemplateRef, ViewEncapsulation } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { KbqButtonModule } from '@koobiq/components/button';\nimport { DateAdapter, KbqReadStateDirective, PopUpPlacements, ThemePalette } from '@koobiq/components/core';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqTitleModule } from '@koobiq/components/title';\nimport { KbqTooltipTrigger } from '@koobiq/components/tooltip';\nimport { filter } from 'rxjs/operators';\nimport { KbqNotificationCenterComponent } from './notification-center';\nimport { KbqNotificationCenterService, KbqNotificationItem } from './notification-center.service';\n\nlet id = 0;\n\n/** @docs-private */\n@Component({\n selector: 'kbq-notification-item',\n imports: [\n NgTemplateOutlet,\n KbqIconModule,\n KbqTitleModule,\n KbqButtonModule,\n KbqTooltipTrigger\n ],\n templateUrl: './notification-item.html',\n styleUrls: ['./notification-item.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-notification-item',\n '[class]': 'style',\n 'data-testid': 'kbq-notification-item'\n },\n hostDirectives: [KbqReadStateDirective]\n})\nexport class KbqNotificationItemComponent {\n private readonly adapter = inject(DateAdapter);\n protected readonly service = inject(KbqNotificationCenterService);\n protected readonly readStateDirective = inject<KbqReadStateDirective>(KbqReadStateDirective, { host: true });\n protected readonly center = inject(KbqNotificationCenterComponent, { host: true });\n\n protected popUpPlacements = PopUpPlacements;\n\n themePalette = ThemePalette;\n id = id++;\n\n time: string;\n\n $implicit;\n\n get style() {\n return {\n [`kbq-notification-item_${this.data.style}`]: !!this.data.style\n };\n }\n\n // TODO: Skipped for migration because:\n // Accessor inputs cannot be migrated as they are too complex.\n @Input()\n get data(): KbqNotificationItem {\n return this._data;\n }\n\n set data(value: KbqNotificationItem) {\n this._data = value;\n\n this.time = this.adapter.format(this.adapter.parse(value.date, ''), 'HH:mm');\n }\n\n private _data: KbqNotificationItem;\n\n constructor() {\n this.$implicit = this;\n\n this.readStateDirective.read\n .pipe(\n filter((value: boolean) => value),\n takeUntilDestroyed()\n )\n .subscribe(() => {\n if (this.data.read) {\n return;\n }\n\n this.data.read = true;\n\n this.service.onRead.next(this.data);\n });\n }\n\n isTemplateRef(value): boolean {\n return value instanceof TemplateRef;\n }\n}\n","@if (data.icon) {\n <div class=\"kbq-notification-item__icon-container layout-row layout-align-start-start\">\n @if (data.icon === true) {\n @switch (data.style) {\n @case ('contrast') {\n <i\n kbq-icon=\"kbq-circle-info_16\"\n class=\"kbq-notification-item__icon\"\n [color]=\"$any(data.style)\"\n [class]=\"data.iconClass\"\n ></i>\n }\n @case ('success') {\n <i\n kbq-icon=\"kbq-circle-check_16\"\n class=\"kbq-notification-item__icon\"\n [color]=\"$any(data.style)\"\n [class]=\"data.iconClass\"\n ></i>\n }\n @case ('warning') {\n <i\n kbq-icon=\"kbq-triangle-exclamation_16\"\n class=\"kbq-notification-item__icon\"\n [color]=\"$any(data.style)\"\n [class]=\"data.iconClass\"\n ></i>\n }\n @case ('error') {\n <i\n kbq-icon=\"kbq-triangle-exclamation_16\"\n class=\"kbq-notification-item__icon\"\n [color]=\"$any(data.style)\"\n [class]=\"data.iconClass\"\n ></i>\n }\n }\n } @else if (isTemplateRef(data.icon)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.icon)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n }\n </div>\n}\n\n<div class=\"kbq-notification-item__container\">\n @if (data.title) {\n <div\n kbq-title\n class=\"kbq-notification-item__title\"\n [class.kbq-notification-item__title_with-content]=\"data.caption || data.content\"\n >\n @if (isTemplateRef(data.title)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.title)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n } @else {\n <p>{{ data.title }}</p>\n }\n\n <div class=\"kbq-notification-item-time\" [class.kbq-notification-item-time_read]=\"data.read\">\n <div class=\"kbq-notification-item-time__value\">{{ time }}</div>\n <i class=\"kbq-notification-item-time__state\" kbq-icon=\"kbq-circle-xs_16\" [color]=\"'theme'\"></i>\n </div>\n </div>\n }\n\n @if (data.caption) {\n <div\n kbq-title\n [class.kbq-notification-item__text]=\"data.title\"\n [class.kbq-notification-item__title]=\"!data.title\"\n >\n @if (isTemplateRef(data.caption)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.caption)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n } @else {\n {{ data.caption }}\n }\n </div>\n }\n\n @if (data.content) {\n <div class=\"kbq-notification-item__content\">\n @if (isTemplateRef(data.content)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.content)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n } @else {\n {{ data.content }}\n }\n </div>\n }\n\n @if (data.actions) {\n <div class=\"kbq-notification-item__actions\">\n @if (isTemplateRef(data.actions)) {\n <ng-container [ngTemplateOutlet]=\"$any(data.actions)\" [ngTemplateOutletContext]=\"{ $implicit }\" />\n } @else {\n {{ data.actions }}\n }\n </div>\n }\n</div>\n\n<button\n kbq-button\n class=\"kbq-notification-item__remove-button\"\n data-testid=\"kbq-notification-item-remove-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n [kbqTooltipArrow]=\"false\"\n [kbqTooltip]=\"center.localeData.remove\"\n [kbqPlacement]=\"popUpPlacements.Right\"\n (click)=\"service.remove(data)\"\n>\n <i kbq-icon=\"kbq-trash_16\"></i>\n</button>\n","import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { FlexibleConnectedPositionStrategy, Overlay, OverlayConfig, ScrollStrategy } from '@angular/cdk/overlay';\nimport { AsyncPipe } from '@angular/common';\nimport {\n AfterContentInit,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Directive,\n EventEmitter,\n InjectionToken,\n Input,\n Output,\n TemplateRef,\n Type,\n ViewEncapsulation,\n booleanAttribute,\n inject,\n numberAttribute,\n viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { KbqBadgeModule } from '@koobiq/components/badge';\nimport { KbqButton, KbqButtonModule } from '@koobiq/components/button';\nimport {\n DateAdapter,\n KBQ_LOCALE_SERVICE,\n KbqOverflowShadowBottom,\n KbqOverflowShadowContainer,\n KbqOverflowShadowTop,\n KbqPopUp,\n KbqPopUpPlacementValues,\n KbqPopUpSizeValues,\n KbqPopUpTrigger,\n KbqStickToWindowPlacementValues,\n POSITION_TO_CSS_MAP,\n PopUpPlacements,\n PopUpSizes,\n PopUpTriggers,\n applyPopupMargins,\n ruRULocaleData\n} from '@koobiq/components/core';\nimport { KbqDividerModule } from '@koobiq/components/divider';\nimport { KbqDropdownModule } from '@koobiq/components/dropdown';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqLoaderOverlayModule } from '@koobiq/components/loader-overlay';\nimport { KbqProgressSpinnerModule } from '@koobiq/components/progress-spinner';\nimport { KbqScrollbar, KbqScrollbarModule } from '@koobiq/components/scrollbar';\nimport { KbqToolTipModule } from '@koobiq/components/tooltip';\nimport { BehaviorSubject, Subject, Subscription, merge } from 'rxjs';\nimport { auditTime, distinctUntilChanged, filter, map, pairwise } from 'rxjs/operators';\nimport { KbqNotificationCenterAnimations } from './notification-center-animations';\nimport { KbqNotificationCenterService } from './notification-center.service';\nimport { KbqNotificationItemComponent } from './notification-item';\n\nconst defaultOffsetX = 8;\n\n/** Rate-limit window (ms) for the scroll-to-bottom check that drives infinite scroll. */\nconst SCROLLED_TO_BOTTOM_AUDIT_TIME = 100;\n\n/**\n * Tolerance (px) applied when checking whether the list has reached its bottom.\n *\n * `scrollHeight` and `clientHeight` are CSSOM `long`s (rounded to the nearest integer) while\n * `scrollTop` is an `unrestricted double`. At fractional browser zoom or a fractional\n * `devicePixelRatio` the layout lands on fractional CSS pixels and the two roundings go\n * independently, so at the true bottom `scrollHeight - scrollTop - clientHeight` lands anywhere in\n * (-1, 1) rather than on 0 — an exact `<= 0` check then succeeds only about half the time. Below\n * 100% zoom one device pixel is wider than one CSS pixel, which scales the residual by ~1/zoom and\n * pushes it past 1. 2px covers zoom down to 50% and is imperceptible as a trigger threshold.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight\n */\nconst SCROLLED_TO_BOTTOM_TOLERANCE = 2;\n\n/**default configuration of notification-center */\nexport const KBQ_NOTIFICATION_CENTER_DEFAULT_CONFIGURATION = ruRULocaleData.notificationCenter;\n\n/** Injection Token for providing configuration of notification-center */\nexport const KBQ_NOTIFICATION_CENTER_CONFIGURATION = new InjectionToken('KbqNotificationCenterConfiguration');\n\n/** @docs-private */\nexport const KBQ_NOTIFICATION_CENTER_SCROLL_STRATEGY = new InjectionToken<() => ScrollStrategy>(\n 'kbq-notification-center-scroll-strategy'\n);\n\n/** @docs-private */\nexport function kbqNotificationCenterScrollStrategyFactory(overlay: Overlay): () => ScrollStrategy {\n return () => overlay.scrollStrategies.reposition({ scrollThrottle: 20 });\n}\n\n/** @docs-private */\nexport const KBQ_NOTIFICATION_CENTER_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: KBQ_NOTIFICATION_CENTER_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: kbqNotificationCenterScrollStrategyFactory\n};\n\n/** @docs-private */\n@Component({\n selector: 'kbq-notification-center',\n imports: [\n KbqIconModule,\n KbqBadgeModule,\n KbqScrollbarModule,\n KbqButtonModule,\n KbqDividerModule,\n KbqDropdownModule,\n KbqToolTipModule,\n AsyncPipe,\n KbqNotificationItemComponent,\n KbqLoaderOverlayModule,\n KbqProgressSpinnerModule,\n KbqOverflowShadowContainer,\n KbqOverflowShadowTop,\n KbqOverflowShadowBottom\n ],\n templateUrl: './notification-center.html',\n styleUrls: ['./notification-center.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-notification-center',\n '[class.kbq-notification-center_popover]': 'popoverMode',\n '(keydown.escape)': 'escapeHandler()'\n },\n animations: [KbqNotificationCenterAnimations.state],\n preserveWhitespaces: false\n})\nexport class KbqNotificationCenterComponent extends KbqPopUp implements AfterViewInit {\n /** @docs-private */\n protected readonly changeDetectorRef = inject(ChangeDetectorRef);\n /** @docs-private */\n protected readonly localeService = inject(KBQ_LOCALE_SERVICE, { optional: true });\n /** @docs-private */\n protected readonly dateAdapter = inject(DateAdapter);\n /** @docs-private */\n protected readonly service = inject(KbqNotificationCenterService);\n\n readonly externalConfiguration = inject(KBQ_NOTIFICATION_CENTER_CONFIGURATION, { optional: true });\n\n configuration;\n\n /** @docs-private */\n protected popoverMode: boolean;\n\n /** Distance in pixels from the bottom of the list at which the next page is requested.\n * @docs-private */\n protected scrolledToBottomOffset: number = 0;\n\n /** Emits on every scroll of the list container; drives the scroll-to-bottom check. */\n private readonly scroll$ = new Subject<void>();\n\n /** localized data\n * @docs-private */\n get localeData() {\n return this.configuration;\n }\n\n /** @docs-private */\n prefix = 'kbq-notification-center';\n /** @docs-private */\n trigger: KbqNotificationCenterTrigger;\n /** @docs-private */\n isTrapFocus: boolean = false;\n\n readonly switcher = viewChild.required<KbqButton>('notificationSwitcher');\n\n /** Scrollable list container; used to measure scroll position for infinite scroll. */\n private readonly scrollContainer = viewChild.required(KbqScrollbar);\n\n get popoverHeight(): string {\n return this._popoverHeight;\n }\n\n set popoverHeight(value: string) {\n this._popoverHeight = value;\n\n this.elementRef.nativeElement.style.height = value;\n }\n\n private _popoverHeight: string;\n\n constructor() {\n super();\n\n this.localeService?.changes.pipe(takeUntilDestroyed()).subscribe(this.updateLocaleParams);\n\n if (!this.localeService) {\n this.initDefaultParams();\n }\n }\n\n ngAfterViewInit() {\n this.visibleChange.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((state) => {\n if (this.offset !== null && state) {\n applyPopupMargins(\n this.renderer,\n this.elementRef.nativeElement,\n this.prefix,\n `${this.offset!.toString()}px`\n );\n }\n\n this.setStickPosition();\n });\n\n this.service.changes\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.changeDetectorRef.markForCheck());\n\n this.switcher().focus();\n\n this.subscribeToScrolledToBottom();\n this.subscribeToRevealLoadMoreRow();\n }\n\n /** Handles the list container scroll: feeds the scroll-to-bottom check that drives infinite scroll.\n * Overflow shadows are handled declaratively by the `kbqOverflowShadow*` directives.\n * @docs-private */\n protected onContainerScroll(): void {\n this.scroll$.next();\n }\n\n /** Retries loading the next page from the bottom error row.\n * @docs-private */\n protected retryLoadMore(): void {\n // The retry button is about to unmount; keep keyboard focus inside the panel instead of\n // letting it fall back to <body>.\n this.focusScrollContainer();\n\n // Clear the bottom error state here so the spinner and the error row can never be shown at\n // the same time, regardless of what the consumer's `onNextPage` handler does.\n this.service.setLoadMoreErrorMode(false);\n\n this.service.onNextPage.emit();\n }\n\n /**\n * Requests the next page (via `service.onNextPage`) once the list is scrolled to within\n * `scrolledToBottomOffset` pixels of the bottom. Two triggers feed it: the user scrolling, and a\n * page finishing loading. The latter keeps paging when a freshly loaded page is too short to\n * overflow the viewport — otherwise no further scroll event would fire and pagination would\n * stall. Suppressed while a load is in flight, errored, or when there is nothing more to load.\n */\n private subscribeToScrolledToBottom(): void {\n const scrolledToBottom$ = this.scroll$.pipe(\n auditTime(SCROLLED_TO_BOTTOM_AUDIT_TIME),\n map(() => this.isScrolledToBottom()),\n distinctUntilChanged(),\n filter(Boolean)\n );\n\n // Re-measure once a load completes (and the appended items have rendered): if the list still\n // sits at the bottom, continue paging instead of waiting for a scroll event that never comes.\n const loadCompleted$ = this.service.loadingMore.pipe(\n distinctUntilChanged(),\n pairwise(),\n filter(([wasLoading, isLoading]) => wasLoading && !isLoading),\n auditTime(SCROLLED_TO_BOTTOM_AUDIT_TIME),\n filter(() => this.isScrolledToBottom())\n );\n\n merge(scrolledToBottom$, loadCompleted$)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.requestNextPage());\n }\n\n /** Whether the list is scrolled to within `scrolledToBottomOffset` pixels of the bottom.\n * Sub-pixel measurement error is absorbed by `SCROLLED_TO_BOTTOM_TOLERANCE`. */\n private isScrolledToBottom(): boolean {\n const { scrollTop, clientHeight, scrollHeight } = this.scrollContainer().contentElement().nativeElement;\n\n return scrollHeight - scrollTop - clientHeight <= this.scrolledToBottomOffset + SCROLLED_TO_BOTTOM_TOLERANCE;\n }\n\n /** Emits `onNextPage` unless a load is already in flight, errored, or there is nothing more to load. */\n private requestNextPage(): void {\n if (this.service.hasMore.value && !this.service.loadingMore.value && !this.service.loadMoreErrorMode.value) {\n this.service.onNextPage.emit();\n }\n }\n\n /**\n * Reveals the bottom \"load more\" spinner / error row when it first appears. Both rows are appended\n * below the last item and can land outside the viewport (the next page is requested while the user\n * is up to `scrolledToBottomOffset` px above the true bottom). Only a genuine false->true transition\n * reveals the row: the BehaviorSubject's replayed current value is ignored (`pairwise` needs two\n * emissions), so the panel always opens scrolled to the top — reopening it while a load-more error\n * is still set never jumps to the bottom.\n */\n private subscribeToRevealLoadMoreRow(): void {\n const reveal = (source: BehaviorSubject<boolean>) =>\n source.pipe(\n distinctUntilChanged(),\n pairwise(),\n filter(([wasShown, isShown]) => !wasShown && isShown),\n auditTime(SCROLLED_TO_BOTTOM_AUDIT_TIME)\n );\n\n merge(reveal(this.service.loadingMore), reveal(this.service.loadMoreErrorMode))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.scrollToBottom());\n }\n\n /** Scrolls the list container to its bottom so a freshly-appended bottom row becomes visible. */\n private scrollToBottom(): void {\n const { scrollHeight } = this.scrollContainer().contentElement().nativeElement;\n\n this.scrollContainer().scrollTo({ top: scrollHeight });\n }\n\n private focusScrollContainer(): void {\n const element = this.scrollContainer().contentElement().nativeElement;\n\n // tabindex -1 keeps the container out of the Tab order while allowing programmatic focus.\n element.setAttribute('tabindex', '-1');\n element.focus({ preventScroll: true });\n }\n\n /** @docs-private */\n updateClassMap(placement: string, customClass: string, size: KbqPopUpSizeValues) {\n super.updateClassMap(placement, customClass, { [`${this.prefix}_${size}`]: !!size });\n }\n\n /** @docs-private */\n updateTrapFocus(isTrapFocus: boolean): void {\n this.isTrapFocus = isTrapFocus;\n }\n\n /** @docs-private */\n escapeHandler() {\n this.hide(0);\n }\n\n private updateLocaleParams = () => {\n this.configuration = this.externalConfiguration || this.localeService?.getParams('notificationCenter');\n\n this.changeDetectorRef.markForCheck();\n };\n\n private initDefaultParams() {\n this.configuration = KBQ_NOTIFICATION_CENTER_DEFAULT_CONFIGURATION;\n }\n}\n\n@Directive({\n selector: '[kbqNotificationCenterTrigger]',\n host: {\n '[class.kbq-notification-center_open]': 'isOpen',\n '[class.kbq-active]': 'hasClickTrigger && isOpen'\n },\n exportAs: 'kbqNotificationCenterTrigger'\n})\nexport class KbqNotificationCenterTrigger\n extends KbqPopUpTrigger<KbqNotificationCenterComponent>\n implements AfterContentInit\n{\n /** @docs-private */\n protected scrollStrategy: () => ScrollStrategy = inject(KBQ_NOTIFICATION_CENTER_SCROLL_STRATEGY);\n /** @docs-private */\n protected readonly service = inject(KbqNotificationCenterService);\n\n // not used\n /** @docs-private */\n arrow: boolean = false;\n /** @docs-private */\n customClass: string;\n /** @docs-private */\n private hasBackdrop: boolean = false;\n /** @docs-private */\n private size: KbqPopUpSizeValues = PopUpSizes.Medium;\n /** @docs-private */\n content: string | TemplateRef<any>;\n /** @docs-private */\n header: string | TemplateRef<any>;\n /** @docs-private */\n footer: string | TemplateRef<any>;\n\n /** Number of unread notifications */\n get unreadItemsCounter() {\n return this.service.unreadItemsCounter;\n }\n\n /** Placement of popUp */\n // TODO: Skipped for migration because:\n // Your application code writes to the input. This prevents migration.\n @Input('kbqNotificationCenterPlacement') placement: KbqPopUpPlacementValues = PopUpPlacements.Right;\n\n /** Class that will be used in the background */\n // TODO: Skipped for migration because:\n // Class of this input is referenced in the signature of another class.\n @Input() backdropClass: string = 'cdk-overlay-transparent-backdrop';\n\n /** Class that will be used in the panel */\n // TODO: Skipped for migration because:\n // Class of this input is referenced in the signature of another class.\n @Input('kbqNotificationCenterPanelClass') panelClass: string;\n\n /** Offset of popUp */\n // TODO: Skipped for migration because:\n // Class of this input is referenced in the signature of another class.\n @Input({ transform: numberAttribute }) offset: number | null = defaultOffsetX;\n\n /** Distance in pixels from the bottom of the list at which the next page is requested via `onNextPage`. */\n @Input({ transform: numberAttribute }) scrolledToBottomOffset: number = 0;\n\n /** Use popover or not */\n // TODO: Skipped for migration because:\n // Accessor inputs cannot be migrated as they are too complex.\n @Input({ transform: booleanAttribute })\n get popoverMode(): boolean {\n return this._popoverMode;\n }\n\n set popoverMode(value: boolean) {\n this._popoverMode = value;\n\n this.placement = PopUpPlacements.Bottom;\n this.updatePlacementPriority(['bottomCenter', 'bottomLeft', 'bottomRight']);\n }\n\n private _popoverMode: boolean = false;\n\n /** Set height of popover. Default is calc(100vh - 48px). 48px - height of navbar */\n // TODO: Skipped for migration because:\n // Accessor inputs cannot be migrated as they are too complex.\n @Input()\n get popoverHeight(): string {\n return this._popoverHeight;\n }\n\n set popoverHeight(value: string) {\n this._popoverHeight = value;\n\n if (this.instance?.popoverHeight) {\n this.instance.popoverHeight = value;\n }\n }\n\n private _popoverHeight: string;\n\n /** Whether the trigger is disabled. */\n // TODO: Skipped for migration because:\n // Accessor inputs cannot be migrated as they are too complex.\n @Input({ transform: booleanAttribute })\n get disabled(): boolean {\n return this._disabled;\n }\n\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n\n if (this._disabled) {\n this.hide();\n }\n }\n\n /**\n * Additionally positions the element relative to the window side (Top, Right, Bottom and Left).\n * If container is specified, the positioning will be relative to it.\n * */\n // TODO: Skipped for migration because:\n // This input overrides a field from a superclass, while the superclass field\n // is not migrated.\n @Input() stickToWindow: KbqStickToWindowPlacementValues;\n\n /** Container for additional positioning, used with stickToWindow */\n // TODO: Skipped for migration because:\n // This input overrides a field from a superclass, while the superclass field\n // is not migrated.\n @Input() container: HTMLElement;\n\n /** @docs-private */\n get hasClickTrigger(): boolean {\n return this.trigger.includes(PopUpTriggers.Click);\n }\n\n /** Emits a change event whenever the placement state changes. */\n @Output('kbqPlacementChange') readonly placementChange = new EventEmitter();\n\n /** Emits a change event whenever the visible state changes. */\n @Output('kbqVisibleChange') readonly visibleChange = new EventEmitter<boolean>();\n\n /** @docs-private */\n trigger: string = `${PopUpTriggers.Click}, ${PopUpTriggers.Keydown}`;\n\n /** @docs-private */\n protected originSelector = '.kbq-notification-center';\n\n /** @docs-private */\n protected get overlayConfig(): OverlayConfig {\n const defaultPanelClass = 'kbq-notification-center__panel';\n\n return {\n panelClass: this.panelClass ? [defaultPanelClass, this.panelClass] : defaultPanelClass,\n hasBackdrop: this.hasBackdrop,\n backdropClass: this.backdropClass\n };\n }\n\n /** @docs-private */\n protected preventClosingByInnerScrollSubscription: Subscription;\n\n constructor() {\n super();\n\n this.updatePlacementPriority(['right', 'rightBottom', 'rightTop']);\n }\n\n ngAfterContentInit(): void {\n this.visibleChange.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((visible: boolean) => {\n if (visible) {\n // eslint-disable-next-line rxjs-x/no-nested-subscribe\n this.preventClosingByInnerScrollSubscription = this.closingActions().subscribe((event) => {\n if (event && event['scrollDispatcher']) {\n this.instance.setStickPosition();\n\n event['kbqPopoverPreventHide'] = true;\n event['type'] = 'click';\n }\n });\n } else {\n this.preventClosingByInnerScrollSubscription?.unsubscribe();\n this.focus();\n }\n });\n }\n\n /** @docs-private */\n updateData() {\n if (!this.instance) return;\n\n this.instance.header = this.header;\n this.instance.content = this.content;\n this.instance.arrow = this.arrow;\n this.instance.offset = this.offset;\n this.instance.footer = this.footer;\n this.instance.popoverMode = this.popoverMode;\n this.instance.popoverHeight = this.popoverHeight;\n this.instance.scrolledToBottomOffset = this.scrolledToBottomOffset;\n\n this.instance.updateTrapFocus(this.trigger !== PopUpTriggers.Focus);\n\n if (this.isOpen) {\n this.updatePosition(true);\n }\n }\n\n /** Updates the current position.\n *\n * @docs-private */\n updatePosition(reapplyPosition: boolean = false) {\n this.overlayRef = this.createOverlay();\n\n const position = (this.overlayRef.getConfig().positionStrategy as FlexibleConnectedPositionStrategy)\n .withPositions(this.getAdjustedPositions())\n .withPush(true);\n\n if (reapplyPosition) {\n setTimeout(() => position.reapplyLastPosition());\n }\n }\n\n /** @docs-private */\n getOverlayHandleComponentType(): Type<KbqNotificationCenterComponent> {\n return KbqNotificationCenterComponent;\n }\n\n /** @docs-private */\n updateClassMap(newPlacement: string = this.placement) {\n if (!this.instance) return;\n\n this.instance.updateClassMap(POSITION_TO_CSS_MAP[newPlacement], this.customClass, this.size);\n this.instance.markForCheck();\n }\n\n /** @docs-private */\n closingActions() {\n return merge(\n this.overlayRef!.outsidePointerEvents(),\n this.overlayRef!.backdropClick(),\n this.scrollDispatcher.scrolled()\n );\n }\n}\n","<div class=\"kbq-notification-center-header\">\n <div class=\"kbq-notification-center-title\">\n <div class=\"kbq-notification-center-title__text\">{{ localeData.notifications }}</div>\n <button\n #notificationSwitcher\n #dropdownTrigger=\"kbqDropdownTrigger\"\n kbq-button\n class=\"kbq-notification-center-title__button\"\n data-testid=\"kbq-notification-center-silent-mode-toggle\"\n [kbqDropdownTriggerFor]=\"notificationSwitcherDropdown\"\n [kbqTooltip]=\"service.silentMode.value ? localeData.doNotDisturb : localeData.showPopUpNotifications\"\n [kbqTooltipArrow]=\"false\"\n [kbqPlacement]=\"'right'\"\n [kbqTooltipOffset]=\"4\"\n [kbqTooltipDisabled]=\"dropdownTrigger.opened\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n >\n <i kbq-icon=\"{{ service.silentMode.value ? 'kbq-bell-slash_16' : 'kbq-bell_16' }}\"></i>\n </button>\n </div>\n <div class=\"kbq-notification-center-toolbar\">\n @if (!service.isEmpty) {\n <button\n kbq-button\n class=\"kbq-notification-center-toolbar__button\"\n data-testid=\"kbq-notification-center-remove-all-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n (click)=\"service.removeAll()\"\n >\n <i kbq-icon=\"kbq-trash_16\"></i>\n </button>\n\n <kbq-divider [vertical]=\"true\" />\n }\n\n <button\n kbq-button\n class=\"kbq-notification-center-toolbar__button\"\n data-testid=\"kbq-notification-center-close-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n (click)=\"hide(0)\"\n >\n <i kbq-icon=\"kbq-xmark_16\"></i>\n </button>\n </div>\n</div>\n\n<div\n #notificationCenterContainer=\"kbqOverflowShadowContainer\"\n kbq-scrollbar\n kbqOverflowShadowContainer\n class=\"kbq-notification-center-container\"\n data-testid=\"kbq-notification-center-container\"\n [kbqOverflowShadowBottom]=\"notificationCenterContainer\"\n [shadow]=\"'var(--kbq-shadow-overflow-normal-bottom)'\"\n (onScroll)=\"onContainerScroll()\"\n>\n @if (!service.errorMode.value) {\n @if (!service.loadingMode.value) {\n @for (group of service.groupedItems | async; track group) {\n <div\n class=\"kbq-notification-center-sub-header\"\n data-testid=\"kbq-notification-center-group\"\n [kbqOverflowShadowTop]=\"$first ? notificationCenterContainer : undefined\"\n >\n <div class=\"kbq-notification-center-sub-header__date\">{{ group.title }}</div>\n\n <button\n kbq-button\n class=\"kbq-notification-center-sub-header__button\"\n data-testid=\"kbq-notification-center-remove-group-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'contrast'\"\n [kbqTooltip]=\"localeData.remove\"\n [kbqPlacement]=\"'right'\"\n [kbqTooltipArrow]=\"false\"\n (click)=\"service.removeGroup(group)\"\n >\n <i kbq-icon=\"kbq-trash_16\"></i>\n </button>\n </div>\n\n @for (item of group.items; track item) {\n <kbq-notification-item [data]=\"item\" />\n }\n } @empty {\n @if (!service.loadingMore.value) {\n <div class=\"kbq-notification-center-empty-container\" data-testid=\"kbq-notification-center-empty\">\n <i kbq-icon-item=\"kbq-bell_16\" [big]=\"true\" [color]=\"'contrast-fade'\"></i>\n {{ localeData.noNotifications }}\n </div>\n }\n }\n\n @if (service.loadingMore.value) {\n <div\n class=\"kbq-notification-center-load-more\"\n data-testid=\"kbq-notification-center-load-more\"\n role=\"status\"\n [attr.aria-label]=\"localeData.loadingMore\"\n >\n <kbq-progress-spinner [mode]=\"'indeterminate'\" [size]=\"'compact'\" />\n </div>\n }\n\n @if (service.loadMoreErrorMode.value) {\n <div\n class=\"kbq-notification-center-load-more-error\"\n data-testid=\"kbq-notification-center-load-more-error\"\n role=\"alert\"\n >\n {{ localeData.failedToLoadNotifications }}\n <button\n kbq-button\n data-testid=\"kbq-notification-center-load-more-retry-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'theme'\"\n (click)=\"retryLoadMore()\"\n >\n {{ localeData.repeat }}\n </button>\n </div>\n }\n } @else {\n <kbq-loader-overlay data-testid=\"kbq-notification-center-loader\" [transparent]=\"true\" />\n }\n } @else {\n <div class=\"kbq-notification-center-error-container\" data-testid=\"kbq-notification-center-error\">\n <i kbq-icon-item=\"kbq-bell_16\" [big]=\"true\" [color]=\"'error'\" [fade]=\"true\"></i>\n {{ localeData.failedToLoadNotifications }}\n <button\n kbq-button\n data-testid=\"kbq-notification-center-reload-button\"\n [kbqStyle]=\"'transparent'\"\n [color]=\"'theme'\"\n (click)=\"service.onReload.emit()\"\n >\n {{ localeData.repeat }}\n </button>\n </div>\n }\n</div>\n\n<kbq-dropdown #notificationSwitcherDropdown=\"kbqDropdown\">\n <button\n kbq-dropdown-item\n data-testid=\"kbq-notification-center-show-notifications-button\"\n (click)=\"service.setSilentMode(false)\"\n >\n <i kbq-icon=\"{{ !service.silentMode.value ? 'kbq-circle-xs_16' : '' }}\" [style.min-width.px]=\"16\"></i>\n {{ localeData.showPopUpNotifications }}\n </button>\n <button\n kbq-dropdown-item\n data-testid=\"kbq-notification-center-do-not-disturb-button\"\n (click)=\"service.setSilentMode(true)\"\n >\n <i kbq-icon=\"{{ service.silentMode.value ? 'kbq-circle-xs_16' : '' }}\" [style.min-width.px]=\"16\"></i>\n {{ localeData.doNotDisturb }}\n </button>\n</kbq-dropdown>\n","import { ConfigurableFocusTrapFactory, FOCUS_TRAP_INERT_STRATEGY, FocusTrapFactory } from '@angular/cdk/a11y';\nimport { NgModule } from '@angular/core';\nimport { EmptyFocusTrapStrategy } from '@koobiq/components/core';\nimport {\n KBQ_NOTIFICATION_CENTER_SCROLL_STRATEGY_FACTORY_PROVIDER,\n KbqNotificationCenterComponent,\n KbqNotificationCenterTrigger\n} from './notification-center';\nimport { KbqNotificationCenterService } from './notification-center.service';\n\n@NgModule({\n imports: [\n KbqNotificationCenterComponent,\n KbqNotificationCenterTrigger\n ],\n providers: [\n KBQ_NOTIFICATION_CENTER_SCROLL_STRATEGY_FACTORY_PROVIDER,\n { provide: FocusTrapFactory, useClass: ConfigurableFocusTrapFactory },\n { provide: FOCUS_TRAP_INERT_STRATEGY, useClass: EmptyFocusTrapStrategy },\n KbqNotificationCenterService\n ],\n exports: [\n KbqNotificationCenterComponent,\n KbqNotificationCenterTrigger\n ]\n})\nexport class KbqNotificationCenterModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i4","i3"],"mappings":"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"}
@@ -296,6 +296,11 @@ class KbqPopoverTrigger extends KbqPopUpTrigger {
296
296
  get instanceDestroyRef() {
297
297
  return this.instance.destroyRef;
298
298
  }
299
+ // NB: the trigger↔popover gap is a CSS `margin` on `.kbq-popover` (see `applyPopupMargins`), which sits inside
300
+ // this `pointer-events: auto` pane, so the gap band is already covered and not click/hover-through. This is why
301
+ // the connected-overlay `offsetY`→in-pane-padding fix (KBQ_CONNECTED_OVERLAY_* / --kbq-connected-overlay-gap,
302
+ // used by select/tree-select/autocomplete/datepicker) intentionally does NOT apply here — do not "port" it.
303
+ // Guarded by the "trigger↔panel gap is not click-through" e2e tests in e2e.playwright-spec.ts.
299
304
  get overlayConfig() {
300
305
  return {
301
306
  panelClass: 'kbq-popover__panel',