+
+
+
`,
changeDetection: ChangeDetectionStrategy.OnPush
diff --git a/packages/components/core/locales/en-US.ts b/packages/components/core/locales/en-US.ts
index bba08b080c..bad707dba2 100644
--- a/packages/components/core/locales/en-US.ts
+++ b/packages/components/core/locales/en-US.ts
@@ -218,6 +218,7 @@ export const enUSLocaleData = {
showPopUpNotifications: 'Show pop-up notifications',
noNotifications: 'No notifications',
failedToLoadNotifications: 'Failed to load notifications',
- repeat: 'Repeat'
+ repeat: 'Repeat',
+ loadingMore: 'Loading more notifications'
}
};
diff --git a/packages/components/core/locales/es-LA.ts b/packages/components/core/locales/es-LA.ts
index f548ac07f5..94471ba698 100644
--- a/packages/components/core/locales/es-LA.ts
+++ b/packages/components/core/locales/es-LA.ts
@@ -217,6 +217,7 @@ export const esLALocaleData = {
showPopUpNotifications: 'Mostrar notificaciones emergentes',
noNotifications: 'Sin notificaciones',
failedToLoadNotifications: 'Error al cargar las notificaciones',
- repeat: 'Repetir'
+ repeat: 'Repetir',
+ loadingMore: 'Cargando más notificaciones'
}
};
diff --git a/packages/components/core/locales/pt-BR.ts b/packages/components/core/locales/pt-BR.ts
index 5fe5b0bff9..45368cfcd1 100644
--- a/packages/components/core/locales/pt-BR.ts
+++ b/packages/components/core/locales/pt-BR.ts
@@ -217,6 +217,7 @@ export const ptBRLocaleData = {
showPopUpNotifications: 'Mostrar notificações pop-up',
noNotifications: 'Sem notificações',
failedToLoadNotifications: 'Falha ao carregar notificações',
- repeat: 'Repetir'
+ repeat: 'Repetir',
+ loadingMore: 'Carregando mais notificações'
}
};
diff --git a/packages/components/core/locales/ru-RU.ts b/packages/components/core/locales/ru-RU.ts
index 7201eeac87..d9755d3054 100644
--- a/packages/components/core/locales/ru-RU.ts
+++ b/packages/components/core/locales/ru-RU.ts
@@ -232,6 +232,7 @@ export const ruRULocaleData = {
showPopUpNotifications: 'Показывать всплывающие уведомления',
noNotifications: 'Нет уведомлений',
failedToLoadNotifications: 'Не удалось загрузить уведомления',
- repeat: 'Повторить'
+ repeat: 'Повторить',
+ loadingMore: 'Загрузка уведомлений'
}
};
diff --git a/packages/components/core/locales/tk-TM.ts b/packages/components/core/locales/tk-TM.ts
index 9081c119cf..e335bfe187 100644
--- a/packages/components/core/locales/tk-TM.ts
+++ b/packages/components/core/locales/tk-TM.ts
@@ -218,6 +218,7 @@ export const tkTMLocaleData = {
showPopUpNotifications: 'Açylýan bildirişleri görkeziň',
noNotifications: 'Duýduryş ýok',
failedToLoadNotifications: 'Duýduryşlary ýükläp bilmedi',
- repeat: 'Gaýtalama'
+ repeat: 'Gaýtalama',
+ loadingMore: 'Duýduryşlar ýüklenýär'
}
};
diff --git a/packages/components/navbar/navbar-item.scss b/packages/components/navbar/navbar-item.scss
index 51af952c7d..6af283bdd8 100644
--- a/packages/components/navbar/navbar-item.scss
+++ b/packages/components/navbar/navbar-item.scss
@@ -20,6 +20,15 @@
min-height: var(--kbq-size-l);
}
+ // Filled fade-contrast only: its background is a semi-transparent tint, so the
+ // navbar icon shows through. Composite the tint over an opaque bg-tertiary substrate.
+ // The outline variant is intentionally left untouched — it stays a clean transparent outline.
+ & .kbq-badge-filled.kbq-badge_fade-contrast {
+ background:
+ linear-gradient(var(--kbq-background-contrast-fade), var(--kbq-background-contrast-fade)),
+ var(--kbq-background-bg-tertiary);
+ }
+
& .kbq-button-icon {
position: absolute;
padding-left: var(--kbq-size-xs);
diff --git a/packages/components/notification-center/__screenshots__/01-dark.png b/packages/components/notification-center/__screenshots__/01-dark.png
index 304da686f8..95aae02f91 100644
Binary files a/packages/components/notification-center/__screenshots__/01-dark.png and b/packages/components/notification-center/__screenshots__/01-dark.png differ
diff --git a/packages/components/notification-center/__screenshots__/01-light.png b/packages/components/notification-center/__screenshots__/01-light.png
index 93c8d3eb30..fee9c10824 100644
Binary files a/packages/components/notification-center/__screenshots__/01-light.png and b/packages/components/notification-center/__screenshots__/01-light.png differ
diff --git a/packages/components/notification-center/_notification-center-theme.scss b/packages/components/notification-center/_notification-center-theme.scss
index 7f8b8b2186..cddfad9f73 100644
--- a/packages/components/notification-center/_notification-center-theme.scss
+++ b/packages/components/notification-center/_notification-center-theme.scss
@@ -11,7 +11,8 @@
}
}
- .kbq-notification-center-error-container {
+ .kbq-notification-center-error-container,
+ .kbq-notification-center-load-more-error {
color: var(--kbq-foreground-error);
}
}
diff --git a/packages/components/notification-center/notification-center.en.md b/packages/components/notification-center/notification-center.en.md
index c0436c459b..60a7205d50 100644
--- a/packages/components/notification-center/notification-center.en.md
+++ b/packages/components/notification-center/notification-center.en.md
@@ -29,10 +29,20 @@ In the empty state, a "No notifications" message is displayed and the "Delete al
### Error
-The panel supports scrolling with a sticky header and lazy loading of records. In the empty state, a "No notifications" message is displayed and the "Delete all" button is hidden.
+If notifications fail to load, a "Failed to load notifications" message and a "Repeat" button are shown instead of the list. Enable this state with `setErrorMode`, and subscribe to `KbqNotificationCenterService.onReload` to retry loading when the button is pressed.
+### Infinite scroll
+
+The list can load notifications page by page as the user scrolls to the bottom. Subscribe to `KbqNotificationCenterService.onNextPage` to fetch the next page, append the result to `items`, and control the flow with `setLoadingMore`, `setHasMore` and `setLoadMoreErrorMode`. The threshold at which loading starts is configured with the `scrolledToBottomOffset` input.
+
+
+
+### Deletion
+
+Notifications can be removed one by one, by date group, or all at once. Subscribe to `KbqNotificationCenterService.onDelete` to react to a removal — for example, to delete the items on the server. The event fires for all three cases and carries `type` (`'item'`, `'group'` or `'all'`) and `items` — the notifications that were removed.
+
### Dropdown window
The notification center can be opened in a popover. For example, when placed in a horizontal menu.
diff --git a/packages/components/notification-center/notification-center.html b/packages/components/notification-center/notification-center.html
index 3b607f62ec..ac88fca79e 100644
--- a/packages/components/notification-center/notification-center.html
+++ b/packages/components/notification-center/notification-center.html
@@ -6,9 +6,11 @@
#dropdownTrigger="kbqDropdownTrigger"
kbq-button
class="kbq-notification-center-title__button"
+ data-testid="kbq-notification-center-silent-mode-toggle"
[kbqDropdownTriggerFor]="notificationSwitcherDropdown"
[kbqTooltip]="service.silentMode.value ? localeData.doNotDisturb : localeData.showPopUpNotifications"
[kbqTooltipArrow]="false"
+ [kbqPlacement]="'right'"
[kbqTooltipOffset]="4"
[kbqTooltipDisabled]="dropdownTrigger.opened"
[kbqStyle]="'transparent'"
@@ -22,6 +24,7 @@