Skip to main content
The notifications bell (tool) + the notifications panel (inbox with For-you / All / Documents / People tabs + a settings view). Fully wireframed, with rich config props: all four layers apply.

Components

PrimitiveWireframe
Bell / triggerVeltNotificationsToolVeltNotificationsToolWireframe
Inbox panelVeltNotificationsPanelVeltNotificationsPanelWireframe
History panel (inline)VeltNotificationsHistoryPanelNone

Config props

Cheapest customization: do this first. On VeltNotificationsTool / VeltNotificationsPanel:
PropValuesNotes
panelOpenMode'popover' · 'sidebar'popover vs docked panel
settingsLayout'accordion' · 'dropdown'settings UI
tabConfig{ forYou?, documents?, all?, people?: { name?, enable? } }enable/rename/reorder tabs
settingsbooleanshow/hide settings view
enableSettingsAtOrganizationLevelbooleanorg-scoped settings
enableCrossOrganizationboolean | string | CrossOrganizationConfigcross-org feeds (only forYou feed supported; current org excluded)
considerAllNotificationsbooleanTool-only: count all, not just unread
selfNotifications / readNotificationsOnForYouTabbooleaninclude self / auto-read on For-you
pageSize (default 5) / maxDays (Tool-only)number (>0)page size / history window
darkMode / shadowDom / variantNonetheme / shadow-DOM / variant; Tool also has panelShadowDom / panelVariant
Boolean attributes only emit when explicitly true/false; shadowDom/panelShadowDom default to true. pageSize/maxDays are ignored unless > 0.

CSS: stateful classes

(Override with !important, R9b.) Tool: velt-notifications-tool, active / velt-notification-tool-open (panel open). Tabs: velt-notifications-panel--tab, velt-notifications-panel--tab-selected (active tab). Panel mode: velt-notifications-panel--sidebar-panel, bottom-sheet. Unread: velt-notifications-panel--list-item-unread, velt-notifications-panel--unread-is-default. Settings accordion: velt-notification-panel--settings-accordion-container-expanded / …-open; mute toggle: velt-notification-panel--settings-mute-all-toggle-container-muted.

Wireframes: slot trees + tokens

VeltNotificationsToolWireframe: .Icon · .Label · .UnreadIcon · .UnreadCount. (Root prop variant.) VeltNotificationsPanelWireframe (abridged: full depth below):
VeltNotificationsPanelWireframe
├── .Header → .TabAll / .TabForYou / .TabDocuments / .TabPeople
├── .Title  .TitleText  .ReadAllButton  .ViewAllButton  .CloseButton  .Skeleton  .SettingsButton
├── .Content
│   ├── .All     → .List → .Item → .Label / .Content
│   ├── .ForYou
│   ├── .Documents → .List → .Item → .Content / .Name / .Count / .Unread
│   ├── .People    → .List → .Item → .Avatar / .Name / .Count / .Content
│   ├── .List      → .Item → .Avatar / .Body / .FileName / .Headline / .Time / .Unread
│   ├── .LoadMore   .AllReadContainer
└── .Settings
    ├── .Header → .Title   .BackButton  .Description  .Footer  .Title
    ├── .MuteAllTitle  .MuteAllDescription  .MuteAllToggle
    └── .List → .Accordion
        ├── .Trigger → .SelectedValue / .Label / .Icon
        └── .Content → .Item → .Icon / .Label
Key tokens: {selectedTab} ('forYou'|'people'|'documents'|'all'), {TABS}, {tabConfig}, {settingsOpen}, {settingsMutedAll}, {notificationsPanelVisible}, {unreadNotificationsForYou} (tool: array → .length for the badge), {notificationsByDate} / {notificationsByUserMap} / {notificationsByDocumentId}. Inside the content list: {notification} (.title, .from.name, .from.photoUrl, .read, .createdAt, .documentName), {isLoadMoreVisible}, {isAllRead}.
Gotchas: {notification.*} only resolves inside the content-list iteration. .Title is a leaf: to change the heading text use the top-level .TitleText slot (there’s no .Title.Text).

Headless hooks

  • useNotificationsData(query?)Notification[] | null (query.type: 'all'|'forYou'|'documents').
  • useUnreadNotificationsCount(){ forYou: number|null, all: number|null } (badges).
  • useNotificationSettings(){ settings, setSettings, setSettingsInitialConfig }.
  • useNotificationEventCallback(action) (e.g. settings updated); useNotificationUtils() for the imperative element (open/close panel, mark-all-read, mute, tab config, cross-org, …).

Limitations

All list rendering flows through the content-list iteration (variables scoped there). Tool-only props (considerAllNotifications, panelShadowDom, panelVariant, maxDays) aren’t on the panel. Cross-org feeds:'all' is ignored (only forYou).