@koobiq/components 20.0.0 → 20.1.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 (192) hide show
  1. package/accordion/accordion-trigger.component.scss +0 -18
  2. package/accordion/accordion.component.scss +9 -2
  3. package/actions-panel/index.d.ts +1 -0
  4. package/alert/_alert-theme.scss +0 -4
  5. package/alert/alert-tokens.scss +4 -4
  6. package/app-switcher/app-switcher-dropdown-app.scss +2 -0
  7. package/breadcrumbs/breadcrumbs.scss +4 -0
  8. package/breadcrumbs/index.d.ts +2 -1
  9. package/button/button-group.scss +42 -2
  10. package/button-toggle/button-toggle.scss +23 -0
  11. package/button-toggle/index.d.ts +3 -1
  12. package/checkbox/checkbox.scss +5 -4
  13. package/clamped-text/index.d.ts +1 -0
  14. package/core/index.d.ts +402 -13
  15. package/core/styles/common/_animation.scss +4 -0
  16. package/core/styles/theming/_components-theming.scss +1 -1
  17. package/core/styles/theming/_scrollbar-theme.scss +4 -0
  18. package/datepicker/_datepicker-theme.scss +1 -1
  19. package/datepicker/datepicker-toggle.scss +3 -3
  20. package/dl/index.d.ts +1 -0
  21. package/dropdown/dropdown.scss +2 -2
  22. package/fesm2022/koobiq-components-accordion.mjs +4 -4
  23. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  24. package/fesm2022/koobiq-components-actions-panel.mjs +14 -5
  25. package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
  26. package/fesm2022/koobiq-components-alert.mjs +2 -2
  27. package/fesm2022/koobiq-components-alert.mjs.map +1 -1
  28. package/fesm2022/koobiq-components-app-switcher.mjs +6 -6
  29. package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
  30. package/fesm2022/koobiq-components-breadcrumbs.mjs +6 -4
  31. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  32. package/fesm2022/koobiq-components-button-toggle.mjs +9 -6
  33. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  34. package/fesm2022/koobiq-components-button.mjs +4 -4
  35. package/fesm2022/koobiq-components-button.mjs.map +1 -1
  36. package/fesm2022/koobiq-components-checkbox.mjs +2 -2
  37. package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
  38. package/fesm2022/koobiq-components-clamped-text.mjs +4 -0
  39. package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
  40. package/fesm2022/koobiq-components-code-block.mjs +4 -0
  41. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  42. package/fesm2022/koobiq-components-core.mjs +449 -112
  43. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  44. package/fesm2022/koobiq-components-datepicker.mjs +5 -5
  45. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  46. package/fesm2022/koobiq-components-dl.mjs +3 -2
  47. package/fesm2022/koobiq-components-dl.mjs.map +1 -1
  48. package/fesm2022/koobiq-components-dropdown.mjs +8 -13
  49. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  50. package/fesm2022/koobiq-components-file-upload.mjs +33 -22
  51. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  52. package/fesm2022/koobiq-components-filter-bar.mjs +974 -758
  53. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  54. package/fesm2022/koobiq-components-flag.mjs +66 -0
  55. package/fesm2022/koobiq-components-flag.mjs.map +1 -0
  56. package/fesm2022/koobiq-components-form-field.mjs +2 -2
  57. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  58. package/fesm2022/koobiq-components-icon.mjs +2 -2
  59. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  60. package/fesm2022/koobiq-components-inline-edit.mjs +27 -6
  61. package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
  62. package/fesm2022/koobiq-components-list.mjs +39 -20
  63. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  64. package/fesm2022/koobiq-components-loader-overlay.mjs +2 -2
  65. package/fesm2022/koobiq-components-loader-overlay.mjs.map +1 -1
  66. package/fesm2022/koobiq-components-modal.mjs +9 -5
  67. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  68. package/fesm2022/koobiq-components-navbar.mjs +10 -9
  69. package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
  70. package/fesm2022/koobiq-components-notification-center.mjs +178 -19
  71. package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
  72. package/fesm2022/koobiq-components-overflow-items.mjs +12 -4
  73. package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
  74. package/fesm2022/koobiq-components-popover.mjs +4 -4
  75. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  76. package/fesm2022/koobiq-components-progress-bar.mjs +2 -2
  77. package/fesm2022/koobiq-components-progress-bar.mjs.map +1 -1
  78. package/fesm2022/koobiq-components-progress-spinner.mjs +2 -2
  79. package/fesm2022/koobiq-components-progress-spinner.mjs.map +1 -1
  80. package/fesm2022/koobiq-components-radio.mjs +3 -7
  81. package/fesm2022/koobiq-components-radio.mjs.map +1 -1
  82. package/fesm2022/koobiq-components-select.mjs +38 -16
  83. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  84. package/fesm2022/koobiq-components-sidebar.mjs +4 -0
  85. package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
  86. package/fesm2022/koobiq-components-sidepanel.mjs +3 -3
  87. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  88. package/fesm2022/koobiq-components-skeleton.mjs +2 -2
  89. package/fesm2022/koobiq-components-skeleton.mjs.map +1 -1
  90. package/fesm2022/koobiq-components-split-button.mjs +2 -2
  91. package/fesm2022/koobiq-components-split-button.mjs.map +1 -1
  92. package/fesm2022/koobiq-components-splitter.mjs +6 -2
  93. package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
  94. package/fesm2022/koobiq-components-table.mjs +8 -6
  95. package/fesm2022/koobiq-components-table.mjs.map +1 -1
  96. package/fesm2022/koobiq-components-tabs.mjs +19 -7
  97. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  98. package/fesm2022/koobiq-components-tags.mjs +7 -0
  99. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  100. package/fesm2022/koobiq-components-textarea.mjs +7 -14
  101. package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
  102. package/fesm2022/koobiq-components-time-range.mjs +4 -4
  103. package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
  104. package/fesm2022/koobiq-components-timezone.mjs +6 -0
  105. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  106. package/fesm2022/koobiq-components-title.mjs +132 -14
  107. package/fesm2022/koobiq-components-title.mjs.map +1 -1
  108. package/fesm2022/koobiq-components-toast.mjs +1 -1
  109. package/fesm2022/koobiq-components-toast.mjs.map +1 -1
  110. package/fesm2022/koobiq-components-toggle.mjs +2 -2
  111. package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
  112. package/fesm2022/koobiq-components-tooltip.mjs +50 -2
  113. package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
  114. package/fesm2022/koobiq-components-tree-select.mjs +44 -11
  115. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  116. package/fesm2022/koobiq-components-tree.mjs +67 -41
  117. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  118. package/fesm2022/koobiq-components-username.mjs +16 -3
  119. package/fesm2022/koobiq-components-username.mjs.map +1 -1
  120. package/file-upload/file-upload-tokens.scss +1 -0
  121. package/file-upload/index.d.ts +10 -7
  122. package/filter-bar/_filter-bar-theme.scss +86 -0
  123. package/filter-bar/filter-bar-tokens.scss +6 -0
  124. package/filter-bar/filter-bar.scss +10 -4
  125. package/filter-bar/filter-refresher.scss +1 -1
  126. package/filter-bar/filters.scss +23 -19
  127. package/filter-bar/index.d.ts +707 -338
  128. package/filter-bar/pipes/base-pipe.scss +14 -35
  129. package/filter-bar/pipes/pipe-date.scss +20 -14
  130. package/filter-bar/pipes/pipe-multi-tree-select.scss +5 -3
  131. package/filter-bar/pipes/pipe-multiselect.scss +5 -3
  132. package/filter-bar/pipes/pipe-readonly.scss +4 -13
  133. package/filter-bar/pipes/pipe-select.scss +3 -1
  134. package/filter-bar/pipes/pipe-tree-select.scss +3 -1
  135. package/flag/flag.scss +53 -0
  136. package/flag/index.d.ts +44 -0
  137. package/icon/icon-item-tokens.scss +1 -1
  138. package/inline-edit/index.d.ts +5 -0
  139. package/inline-edit/inline-edit.scss +7 -7
  140. package/link/link-tokens.scss +2 -2
  141. package/list/index.d.ts +11 -2
  142. package/loader-overlay/loader-overlay-tokens.scss +1 -1
  143. package/modal/_modal-animation.scss +6 -6
  144. package/modal/_modal-theme.scss +5 -0
  145. package/modal/index.d.ts +3 -1
  146. package/modal/modal.scss +15 -0
  147. package/navbar/index.d.ts +1 -0
  148. package/navbar/navbar-item.scss +9 -0
  149. package/notification-center/_notification-center-theme.scss +2 -1
  150. package/notification-center/index.d.ts +88 -3
  151. package/notification-center/notification-center.scss +42 -4
  152. package/notification-center/notification-item.scss +3 -2
  153. package/overflow-items/index.d.ts +1 -0
  154. package/package.json +7 -3
  155. package/prebuilt-themes/dark-theme.css +1 -1
  156. package/prebuilt-themes/light-theme.css +1 -1
  157. package/prebuilt-themes/theme.css +1 -1
  158. package/progress-bar/progress-bar.scss +4 -0
  159. package/progress-spinner/progress-spinner.scss +5 -1
  160. package/radio/index.d.ts +1 -5
  161. package/radio/radio.scss +18 -4
  162. package/schematics/collection.json +5 -0
  163. package/schematics/migrations/filter-bar-signals/README.md +66 -0
  164. package/schematics/migrations/filter-bar-signals/data.js +72 -0
  165. package/schematics/migrations/filter-bar-signals/index.js +316 -0
  166. package/schematics/migrations/filter-bar-signals/schema.json +20 -0
  167. package/schematics/migrations.json +5 -0
  168. package/schematics/ng-add/index.js +1 -1
  169. package/select/index.d.ts +10 -2
  170. package/sidebar/index.d.ts +1 -0
  171. package/skeleton/skeleton.scss +4 -0
  172. package/split-button/_split-button-theme.scss +2 -2
  173. package/splitter/_splitter-theme.scss +2 -2
  174. package/splitter/index.d.ts +1 -0
  175. package/table/_table-theme.scss +4 -0
  176. package/table/index.d.ts +3 -2
  177. package/tabs/index.d.ts +2 -0
  178. package/tabs/tab-header.scss +1 -0
  179. package/tabs/tabs-tokens.scss +1 -1
  180. package/textarea/index.d.ts +0 -1
  181. package/time-range/time-range.scss +0 -8
  182. package/timepicker/timepicker.scss +2 -2
  183. package/timezone/index.d.ts +1 -0
  184. package/title/index.d.ts +92 -2
  185. package/tooltip/index.d.ts +51 -3
  186. package/tree/_tree-theme.scss +2 -7
  187. package/tree/index.d.ts +19 -4
  188. package/tree/toggle.scss +5 -0
  189. package/tree/tree-option.scss +0 -4
  190. package/tree-select/_tree-select-theme.scss +1 -1
  191. package/tree-select/index.d.ts +9 -2
  192. package/username/index.d.ts +20 -2
@@ -20,6 +20,15 @@
20
20
  min-height: var(--kbq-size-l);
21
21
  }
22
22
 
23
+ // Filled fade-contrast only: its background is a semi-transparent tint, so the
24
+ // navbar icon shows through. Composite the tint over an opaque bg-tertiary substrate.
25
+ // The outline variant is intentionally left untouched — it stays a clean transparent outline.
26
+ & .kbq-badge-filled.kbq-badge_fade-contrast {
27
+ background:
28
+ linear-gradient(var(--kbq-background-contrast-fade), var(--kbq-background-contrast-fade)),
29
+ var(--kbq-background-bg-tertiary);
30
+ }
31
+
23
32
  & .kbq-button-icon {
24
33
  position: absolute;
25
34
  padding-left: var(--kbq-size-xs);
@@ -11,7 +11,8 @@
11
11
  }
12
12
  }
13
13
 
14
- .kbq-notification-center-error-container {
14
+ .kbq-notification-center-error-container,
15
+ .kbq-notification-center-load-more-error {
15
16
  color: var(--kbq-foreground-error);
16
17
  }
17
18
  }
@@ -12,6 +12,8 @@ import { AnimationTriggerMetadata } from '@angular/animations';
12
12
 
13
13
  interface KbqNotificationItem extends Omit<KbqToastData, 'closeButton'> {
14
14
  id?: string;
15
+ /** Numeric id of the shown toast, set by `push()` and consumed by `hideToast()`. */
16
+ toastId?: number;
15
17
  title?: string | TemplateRef<unknown>;
16
18
  style?: string | KbqToastStyle;
17
19
  icon?: boolean | TemplateRef<unknown>;
@@ -27,6 +29,13 @@ type KbqNotificationsGroup = {
27
29
  title: string;
28
30
  items: KbqNotificationItem[];
29
31
  };
32
+ /** Payload emitted by `KbqNotificationCenterService.onDelete`. */
33
+ type KbqNotificationDeleteEvent = {
34
+ /** What was removed: a single item, a whole date group, or all notifications. */
35
+ type: 'item' | 'group' | 'all';
36
+ /** The notification items that were removed. */
37
+ items: KbqNotificationItem[];
38
+ };
30
39
  declare class KbqNotificationCenterService {
31
40
  /** @docs-private */
32
41
  private readonly adapter;
@@ -40,12 +49,36 @@ declare class KbqNotificationCenterService {
40
49
  readonly loadingMode: BehaviorSubject<boolean>;
41
50
  /** @docs-private */
42
51
  readonly errorMode: BehaviorSubject<boolean>;
52
+ /**
53
+ * Whether the bottom "load more" spinner is shown while the next page is being loaded.
54
+ * Note: this is the infinite-scroll indicator and is distinct from `loadingMode`,
55
+ * which renders the full-screen loader instead of the list.
56
+ */
57
+ readonly loadingMore: BehaviorSubject<boolean>;
58
+ /**
59
+ * Whether the bottom "load more" error row (with a retry button) is shown.
60
+ * Distinct from `errorMode`, which replaces the whole list with the full-screen error state.
61
+ */
62
+ readonly loadMoreErrorMode: BehaviorSubject<boolean>;
63
+ /**
64
+ * Whether there are more notifications to load. While `true`, scrolling to the bottom
65
+ * emits `onNextPage`; set it to `false` to stop further infinite-scroll requests.
66
+ */
67
+ readonly hasMore: BehaviorSubject<boolean>;
43
68
  /** @docs-private */
44
69
  readonly onRead: BehaviorSubject<KbqNotificationItem | null>;
45
70
  /** Triggers an event when the user presses the reload button. */
46
71
  readonly onReload: EventEmitter<void>;
72
+ /** Triggers an event when the list is scrolled to the bottom and the next page should be loaded. */
73
+ readonly onNextPage: EventEmitter<void>;
74
+ /** Triggers an event when an item, a group, or all notifications are removed. */
75
+ readonly onDelete: EventEmitter<KbqNotificationDeleteEvent>;
47
76
  private originalItems;
48
- /** @docs-private */
77
+ /**
78
+ * Grouped notifications, always ordered from newest to oldest: day groups are sorted by date
79
+ * descending, and notifications within each day are sorted by date descending.
80
+ * @docs-private
81
+ */
49
82
  readonly groupedItems: Observable<KbqNotificationsGroup[]>;
50
83
  /** Emits an event whenever the changes. */
51
84
  readonly changes: Observable<boolean | KbqNotificationItem | KbqNotificationItem[] | null>;
@@ -63,8 +96,16 @@ declare class KbqNotificationCenterService {
63
96
  setLoadingMode(value: boolean): void;
64
97
  /** Set error mode */
65
98
  setErrorMode(value: boolean): void;
99
+ /** Set the bottom "load more" spinner visibility. */
100
+ setLoadingMore(value: boolean): void;
101
+ /** Set the bottom "load more" error state visibility. */
102
+ setLoadMoreErrorMode(value: boolean): void;
103
+ /** Set whether there are more notifications to load via infinite scroll. */
104
+ setHasMore(value: boolean): void;
66
105
  /** Push new notification item in center */
67
106
  push(item: KbqNotificationItem): void;
107
+ /** Hides the toast that corresponds to the given notification item. */
108
+ hideToast(item: KbqNotificationItem): void;
68
109
  /** Remove notification item */
69
110
  remove(removedItem: KbqNotificationItem): void;
70
111
  /** Remove group of notification items */
@@ -72,6 +113,8 @@ declare class KbqNotificationCenterService {
72
113
  /** Remove all notification items */
73
114
  removeAll(): void;
74
115
  private makeGroup;
116
+ /** Compares two notifications by date so the newest comes first. */
117
+ private compareByDateDesc;
75
118
  private setIds;
76
119
  private setReadState;
77
120
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqNotificationCenterService, never>;
@@ -87,6 +130,7 @@ declare const KBQ_NOTIFICATION_CENTER_DEFAULT_CONFIGURATION: {
87
130
  noNotifications: string;
88
131
  failedToLoadNotifications: string;
89
132
  repeat: string;
133
+ loadingMore: string;
90
134
  };
91
135
  /** Injection Token for providing configuration of notification-center */
92
136
  declare const KBQ_NOTIFICATION_CENTER_CONFIGURATION: InjectionToken<unknown>;
@@ -114,6 +158,11 @@ declare class KbqNotificationCenterComponent extends KbqPopUp implements AfterVi
114
158
  configuration: any;
115
159
  /** @docs-private */
116
160
  protected popoverMode: boolean;
161
+ /** Distance in pixels from the bottom of the list at which the next page is requested.
162
+ * @docs-private */
163
+ protected scrolledToBottomOffset: number;
164
+ /** Emits on every scroll of the list container; drives the scroll-to-bottom check. */
165
+ private readonly scroll$;
117
166
  /** localized data
118
167
  * @docs-private */
119
168
  get localeData(): any;
@@ -124,11 +173,44 @@ declare class KbqNotificationCenterComponent extends KbqPopUp implements AfterVi
124
173
  /** @docs-private */
125
174
  isTrapFocus: boolean;
126
175
  readonly switcher: i0.Signal<KbqButton>;
176
+ /** Scrollable list container; used to measure scroll position for infinite scroll. */
177
+ private readonly scrollContainer;
127
178
  get popoverHeight(): string;
128
179
  set popoverHeight(value: string);
129
180
  private _popoverHeight;
130
181
  constructor();
131
182
  ngAfterViewInit(): void;
183
+ /** Handles the list container scroll: feeds the scroll-to-bottom check that drives infinite scroll.
184
+ * Overflow shadows are handled declaratively by the `kbqOverflowShadow*` directives.
185
+ * @docs-private */
186
+ protected onContainerScroll(): void;
187
+ /** Retries loading the next page from the bottom error row.
188
+ * @docs-private */
189
+ protected retryLoadMore(): void;
190
+ /**
191
+ * Requests the next page (via `service.onNextPage`) once the list is scrolled to within
192
+ * `scrolledToBottomOffset` pixels of the bottom. Two triggers feed it: the user scrolling, and a
193
+ * page finishing loading. The latter keeps paging when a freshly loaded page is too short to
194
+ * overflow the viewport — otherwise no further scroll event would fire and pagination would
195
+ * stall. Suppressed while a load is in flight, errored, or when there is nothing more to load.
196
+ */
197
+ private subscribeToScrolledToBottom;
198
+ /** Whether the list is scrolled to within `scrolledToBottomOffset` pixels of the bottom. */
199
+ private isScrolledToBottom;
200
+ /** Emits `onNextPage` unless a load is already in flight, errored, or there is nothing more to load. */
201
+ private requestNextPage;
202
+ /**
203
+ * Reveals the bottom "load more" spinner / error row when it first appears. Both rows are appended
204
+ * below the last item and can land outside the viewport (the next page is requested while the user
205
+ * is up to `scrolledToBottomOffset` px above the true bottom). Only a genuine false->true transition
206
+ * reveals the row: the BehaviorSubject's replayed current value is ignored (`pairwise` needs two
207
+ * emissions), so the panel always opens scrolled to the top — reopening it while a load-more error
208
+ * is still set never jumps to the bottom.
209
+ */
210
+ private subscribeToRevealLoadMoreRow;
211
+ /** Scrolls the list container to its bottom so a freshly-appended bottom row becomes visible. */
212
+ private scrollToBottom;
213
+ private focusScrollContainer;
132
214
  /** @docs-private */
133
215
  updateClassMap(placement: string, customClass: string, size: KbqPopUpSizeValues): void;
134
216
  /** @docs-private */
@@ -169,6 +251,8 @@ declare class KbqNotificationCenterTrigger extends KbqPopUpTrigger<KbqNotificati
169
251
  panelClass: string;
170
252
  /** Offset of popUp */
171
253
  offset: number | null;
254
+ /** Distance in pixels from the bottom of the list at which the next page is requested via `onNextPage`. */
255
+ scrolledToBottomOffset: number;
172
256
  /** Use popover or not */
173
257
  get popoverMode(): boolean;
174
258
  set popoverMode(value: boolean);
@@ -216,8 +300,9 @@ declare class KbqNotificationCenterTrigger extends KbqPopUpTrigger<KbqNotificati
216
300
  /** @docs-private */
217
301
  closingActions(): rxjs.Observable<void | _angular_cdk_scrolling_module_d.CdkScrollable | MouseEvent>;
218
302
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqNotificationCenterTrigger, never>;
219
- static ɵdir: i0.ɵɵDirectiveDeclaration<KbqNotificationCenterTrigger, "[kbqNotificationCenterTrigger]", ["kbqNotificationCenterTrigger"], { "placement": { "alias": "kbqNotificationCenterPlacement"; "required": false; }; "backdropClass": { "alias": "backdropClass"; "required": false; }; "panelClass": { "alias": "kbqNotificationCenterPanelClass"; "required": false; }; "offset": { "alias": "offset"; "required": false; }; "popoverMode": { "alias": "popoverMode"; "required": false; }; "popoverHeight": { "alias": "popoverHeight"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "stickToWindow": { "alias": "stickToWindow"; "required": false; }; "container": { "alias": "container"; "required": false; }; }, { "placementChange": "kbqPlacementChange"; "visibleChange": "kbqVisibleChange"; }, never, never, true, never>;
303
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KbqNotificationCenterTrigger, "[kbqNotificationCenterTrigger]", ["kbqNotificationCenterTrigger"], { "placement": { "alias": "kbqNotificationCenterPlacement"; "required": false; }; "backdropClass": { "alias": "backdropClass"; "required": false; }; "panelClass": { "alias": "kbqNotificationCenterPanelClass"; "required": false; }; "offset": { "alias": "offset"; "required": false; }; "scrolledToBottomOffset": { "alias": "scrolledToBottomOffset"; "required": false; }; "popoverMode": { "alias": "popoverMode"; "required": false; }; "popoverHeight": { "alias": "popoverHeight"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "stickToWindow": { "alias": "stickToWindow"; "required": false; }; "container": { "alias": "container"; "required": false; }; }, { "placementChange": "kbqPlacementChange"; "visibleChange": "kbqVisibleChange"; }, never, never, true, never>;
220
304
  static ngAcceptInputType_offset: unknown;
305
+ static ngAcceptInputType_scrolledToBottomOffset: unknown;
221
306
  static ngAcceptInputType_popoverMode: unknown;
222
307
  static ngAcceptInputType_disabled: unknown;
223
308
  }
@@ -234,4 +319,4 @@ declare class KbqNotificationCenterModule {
234
319
  }
235
320
 
236
321
  export { KBQ_NOTIFICATION_CENTER_CONFIGURATION, KBQ_NOTIFICATION_CENTER_DEFAULT_CONFIGURATION, KBQ_NOTIFICATION_CENTER_SCROLL_STRATEGY, KBQ_NOTIFICATION_CENTER_SCROLL_STRATEGY_FACTORY_PROVIDER, KbqNotificationCenterAnimations, KbqNotificationCenterComponent, KbqNotificationCenterModule, KbqNotificationCenterService, KbqNotificationCenterTrigger, kbqNotificationCenterScrollStrategyFactory, maxUnreadItemsLength };
237
- export type { KbqNotificationItem };
322
+ export type { KbqNotificationDeleteEvent, KbqNotificationItem };
@@ -36,7 +36,7 @@
36
36
 
37
37
  justify-content: space-between;
38
38
 
39
- padding: var(--kbq-size-xl) var(--kbq-size-xl) var(--kbq-size-xxs) var(--kbq-size-xxl);
39
+ padding: var(--kbq-size-m) var(--kbq-size-xl) var(--kbq-size-xxs) var(--kbq-size-xxl);
40
40
  }
41
41
 
42
42
  .kbq-notification-center-title {
@@ -67,7 +67,7 @@
67
67
  display: flex;
68
68
  flex-direction: row;
69
69
 
70
- padding: var(--kbq-size-s) var(--kbq-size-xxl);
70
+ padding: var(--kbq-size-s) var(--kbq-size-xl);
71
71
 
72
72
  & .kbq-notification-center-sub-header__button {
73
73
  position: absolute;
@@ -78,7 +78,8 @@
78
78
  display: none;
79
79
  }
80
80
 
81
- &:hover .kbq-notification-center-sub-header__button {
81
+ &:hover .kbq-notification-center-sub-header__button,
82
+ &:focus-within .kbq-notification-center-sub-header__button {
82
83
  display: flex;
83
84
  }
84
85
  }
@@ -88,13 +89,50 @@
88
89
 
89
90
  border-radius: inherit;
90
91
 
91
- padding-bottom: var(--kbq-size-m);
92
+ padding-bottom: var(--kbq-size-xl);
93
+
94
+ // Smoothly reveal the just-appended "load more" spinner / error row. The row is scrolled into
95
+ // view via KbqScrollbar.scrollTo(), which calls a behavior-less scroll on the overlayscrollbars
96
+ // viewport — so `scroll-behavior` on the viewport controls the animation. Disabled for users who
97
+ // prefer reduced motion.
98
+ & [data-overlayscrollbars-viewport] {
99
+ scroll-behavior: smooth;
100
+
101
+ @media (prefers-reduced-motion: reduce) {
102
+ scroll-behavior: auto;
103
+ }
104
+ }
92
105
 
93
106
  & .kbq-loader-overlay_parent {
94
107
  border-radius: inherit;
95
108
  }
96
109
  }
97
110
 
111
+ .kbq-notification-center-load-more {
112
+ display: flex;
113
+
114
+ align-items: center;
115
+ justify-content: center;
116
+
117
+ padding: 26px 0;
118
+ }
119
+
120
+ .kbq-notification-center-load-more-error {
121
+ display: flex;
122
+ flex-direction: column;
123
+
124
+ align-items: center;
125
+ justify-content: center;
126
+
127
+ padding: var(--kbq-size-xxs) var(--kbq-size-xxl);
128
+
129
+ text-align: center;
130
+
131
+ & .kbq-button {
132
+ margin-top: var(--kbq-size-s);
133
+ }
134
+ }
135
+
98
136
  .kbq-notification-center-empty-container,
99
137
  .kbq-notification-center-error-container {
100
138
  display: flex;
@@ -13,7 +13,8 @@
13
13
  margin-left: var(--kbq-size-m);
14
14
  margin-right: var(--kbq-size-m);
15
15
 
16
- &:hover {
16
+ &:hover,
17
+ &:focus-within {
17
18
  & .kbq-notification-item-time {
18
19
  visibility: hidden;
19
20
  }
@@ -46,7 +47,7 @@
46
47
  flex: 1;
47
48
 
48
49
  padding-top: var(--kbq-size-m);
49
- padding-right: var(--kbq-size-l);
50
+ padding-right: var(--kbq-size-s);
50
51
  padding-bottom: var(--kbq-size-m);
51
52
 
52
53
  overflow: hidden;
@@ -75,6 +75,7 @@ declare class KbqOverflowItems {
75
75
  private readonly renderer;
76
76
  private readonly document;
77
77
  private readonly window;
78
+ private readonly platform;
78
79
  /**
79
80
  * `KbqOverflowItem` directive references.
80
81
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koobiq/components",
3
- "version": "20.0.0",
3
+ "version": "20.1.0",
4
4
  "description": "koobiq",
5
5
  "repository": {
6
6
  "type": "git",
@@ -25,8 +25,8 @@
25
25
  "@angular/cdk": ">=20.0.0",
26
26
  "@angular/core": ">=20.0.0",
27
27
  "@angular/forms": ">=20.0.0",
28
- "@koobiq/angular-moment-adapter": "20.0.0",
29
- "@koobiq/angular-luxon-adapter": "20.0.0",
28
+ "@koobiq/angular-moment-adapter": "20.1.0",
29
+ "@koobiq/angular-luxon-adapter": "20.1.0",
30
30
  "@koobiq/date-formatter": "^3.2.3",
31
31
  "@koobiq/icons": "^11.1.3",
32
32
  "@koobiq/design-tokens": "^3.14.0"
@@ -153,6 +153,10 @@
153
153
  "types": "./filter-bar/index.d.ts",
154
154
  "default": "./fesm2022/koobiq-components-filter-bar.mjs"
155
155
  },
156
+ "./flag": {
157
+ "types": "./flag/index.d.ts",
158
+ "default": "./fesm2022/koobiq-components-flag.mjs"
159
+ },
156
160
  "./form-field": {
157
161
  "types": "./form-field/index.d.ts",
158
162
  "default": "./fesm2022/koobiq-components-form-field.mjs"