Skip to main content

Components

The @novu/react package provides React components for building notification UIs.

Inbox

The main component for displaying notifications.

Props

PropertyTypeDescription
appearanceReactInboxAppearance
subscriberHashstring
contextHashstring
backendUrlstring
socketUrlstring
socketOptionsNovuSocketOptions
localizationInboxLocalization
tabsTab[]
preferencesFilterPreferencesFilter
preferenceGroupsPreferenceGroups
preferencesSortPreferencesSort
defaultScheduleDefaultSchedule
routerPushRouterPush
contextPartial<Record<string, ContextValue>>
subscriberIdstring
subscriberstring | Subscriber
applicationIdentifierstring

Usage

import { Inbox } from "@novu/react";

function NovuInbox() {
  return (
    <Inbox
      applicationIdentifier="APPLICATION_IDENTIFIER"
      subscriber={{
        subscriberId: "SUBSCRIBER_ID",
      }}
      apiUrl="https://api.novu.co"
      socketUrl="https://socket.novu.co"
      placement="right"
      placementOffset={10}
      onNotificationClick={(notification) => {
        // Handle notification click
        console.log(notification);
      }}
    />
  );
}

Appearance Configuration

PropertyTypeDescription
variablesVariables
animationsboolean
iconsAllIconOverrides
baseThemeAllTheme | AllTheme[]

Variables

PropertyTypeDescription
colorBackgroundstring
colorForegroundstring
colorPrimarystring
colorPrimaryForegroundstring
colorSecondarystring
colorSecondaryForegroundstring
colorCounterstring
colorCounterForegroundstring
colorNeutralstring
colorShadowstring
colorRingstring
fontSizestring
borderRadiusstring
colorStripesstring
colorSeverityHighstring
colorSeverityMediumstring
colorSeverityLowstring

Elements

PropertyTypeDescription
rootElementStyles
buttonElementStyles
inputElementStyles
iconElementStyles
badgeElementStyles
popoverContentElementStyles
popoverTriggerElementStyles
popoverCloseElementStyles
collapsibleElementStyles
tooltipContentElementStyles
tooltipTriggerElementStyles
lockIconElementStyles
preferences__buttonElementStyles
inboxHeaderElementStyles
loadingElementStyles
dropdownContentElementStyles
dropdownTriggerElementStyles
dropdownItemElementStyles
dropdownItemLabelElementStyles
dropdownItemLabelContainerElementStyles
dropdownItemLeft__iconElementStyles
dropdownItemRight__iconElementStyles
dropdownItem__iconElementStyles
datePickerElementStyles
datePickerGridElementStyles
datePickerGridRowElementStyles
datePickerGridCellElementStyles
datePickerGridCellTriggerElementStyles
datePickerTriggerElementStyles
datePickerGridHeaderElementStyles
datePickerControlElementStyles
datePickerControlPrevTriggerElementStyles
datePickerControlNextTriggerElementStyles
datePickerControlPrevTrigger__iconElementStyles
datePickerControlNextTrigger__iconElementStyles
datePickerCalendarElementStyles
datePickerHeaderMonthElementStyles
datePickerCalendarDay__buttonElementStyles
timePickerElementStyles
timePicker__hourSelectElementStyles
timePicker__minuteSelectElementStyles
timePicker__periodSelectElementStyles
timePicker__separatorElementStyles
timePickerHour__inputElementStyles
timePickerMinute__inputElementStyles
snoozeDatePickerElementStyles
snoozeDatePicker__actionsElementStyles
snoozeDatePickerCancel__buttonElementStyles
snoozeDatePickerApply__buttonElementStyles
snoozeDatePicker__timePickerContainerElementStyles
snoozeDatePicker__timePickerLabelElementStyles
back__buttonElementStyles
skeletonTextElementStyles
skeletonAvatarElementStyles
skeletonSwitchElementStyles
skeletonSwitchThumbElementStyles
tabsRootElementStyles
tabsListElementStyles
tabsContentElementStyles
tabsTriggerElementStyles
dotsElementStyles
inboxContentElementStyles
inbox__popoverTriggerElementStyles
inbox__popoverContentElementStyles
notificationListEmptyNoticeContainerElementStyles
notificationListEmptyNoticeOverlayElementStyles
notificationListEmptyNoticeIconElementStyles
notificationListEmptyNoticeElementStyles
notificationList__skeletonElementStyles
notificationList__skeletonContentElementStyles
notificationList__skeletonItemElementStyles
notificationList__skeletonAvatarElementStyles
notificationList__skeletonTextElementStyles
notificationListNewNotificationsNotice__buttonElementStyles
notificationSubject__strongElementStyles
notificationSubject__emElementStyles
notificationBody__strongElementStyles
notificationBody__emElementStyles
notificationBodyContainerElementStyles
notificationDateActionsContainerElementStyles
notificationRead__buttonElementStyles
notificationUnread__buttonElementStyles
notificationArchive__buttonElementStyles
notificationUnarchive__buttonElementStyles
notificationSnooze__buttonElementStyles
notificationUnsnooze__buttonElementStyles
notificationRead__iconElementStyles
notificationUnread__iconElementStyles
notificationArchive__iconElementStyles
notificationUnarchive__iconElementStyles
notificationSnooze__iconElementStyles
notificationUnsnooze__iconElementStyles
notificationsTabs__tabsRootElementStyles
notificationsTabs__tabsListElementStyles
notificationsTabs__tabsContentElementStyles
notificationsTabs__tabsTriggerElementStyles
notificationsTabsTriggerLabelElementStyles
notificationsTabsTriggerCountElementStyles
inboxStatus__titleElementStyles
inboxStatus__dropdownTriggerElementStyles
inboxStatus__dropdownContentElementStyles
inboxStatus__dropdownItemElementStyles
inboxStatus__dropdownItemLabelElementStyles
inboxStatus__dropdownItemLabelContainerElementStyles
inboxStatus__dropdownItemLeft__iconElementStyles
inboxStatus__dropdownItemRight__iconElementStyles
inboxStatus__dropdownItem__iconElementStyles
inboxStatus__dropdownItemCheck__iconElementStyles
moreActionsContainerElementStyles
moreActions__dropdownTriggerElementStyles
moreActions__dropdownContentElementStyles
moreActions__dropdownItemElementStyles
moreActions__dropdownItemLabelElementStyles
moreActions__dropdownItemLeft__iconElementStyles
moreActions__dotsElementStyles
moreTabs__buttonElementStyles
moreTabs__iconElementStyles
moreTabs__dropdownTriggerElementStyles
moreTabs__dropdownContentElementStyles
moreTabs__dropdownItemElementStyles
moreTabs__dropdownItemLabelElementStyles
moreTabs__dropdownItemRight__iconElementStyles
workflowContainerDisabledNoticeElementStyles
workflowLabelDisabled__iconElementStyles
workflowDescriptionElementStyles
channelsContainerCollapsibleElementStyles
channelSwitchElementStyles
channelSwitchThumbElementStyles
preferencesHeaderElementStyles
preferencesHeader__back__buttonElementStyles
preferencesHeader__back__button__iconElementStyles
preferencesHeader__titleElementStyles
preferencesHeader__iconElementStyles
preferencesListEmptyNoticeContainerElementStyles
preferencesListEmptyNoticeElementStyles
preferencesList__skeletonElementStyles
preferencesList__skeletonContentElementStyles
preferencesList__skeletonItemElementStyles
preferencesList__skeletonIconElementStyles
preferencesList__skeletonSwitchElementStyles
preferencesList__skeletonSwitchThumbElementStyles
preferencesList__skeletonTextElementStyles
dayScheduleCopy__dropdownTriggerElementStyles
dayScheduleCopy__dropdownContentElementStyles
timeSelect__dropdownTriggerElementStyles
timeSelect__timeElementStyles
timeSelect__dropdownContentElementStyles
timeSelect__dropdownItemElementStyles
timeSelect__dropdownItemLabelElementStyles
timeSelect__dropdownItemLabelContainerElementStyles
timeSelect__dropdownItemCheck__iconElementStyles
notificationSnooze__dropdownContentElementStyles
notificationSnooze__dropdownItemElementStyles
notificationSnooze__dropdownItem__iconElementStyles
notificationSnoozeCustomTime_popoverContentElementStyles
strongElementStyles
emElementStyles
connectChatContainerElementStyles
connectChatButtonElementStyles
connectChatButtonContainerElementStyles
connectChatButtonLabelElementStyles
connectChatMisconfiguredTooltipElementStyles
channelConnectButtonMisconfiguredTooltipElementStyles
bellIconElementStyles | ((context: { unreadCount: { total: number; severity: Record<string, number>; }; }) => string)
bellContainerElementStyles | ((context: { unreadCount: { total: number; severity: Record<string, number>; }; }) => string)
severityHigh__bellContainerElementStyles | ((context: { unreadCount: { total: number; severity: Record<string, number>; }; }) => string)
severityMedium__bellContainerElementStyles | ((context: { unreadCount: { total: number; severity: Record<string, number>; }; }) => string)
severityLow__bellContainerElementStyles | ((context: { unreadCount: { total: number; severity: Record<string, number>; }; }) => string)
bellSeverityGlowElementStyles | ((context: { unreadCount: { total: number; severity: Record<string, number>; }; }) => string)
severityGlowHigh__bellSeverityGlowElementStyles | ((context: { unreadCount: { total: number; severity: Record<string, number>; }; }) => string)
severityGlowMedium__bellSeverityGlowElementStyles | ((context: { unreadCount: { total: number; severity: Record<string, number>; }; }) => string)
severityGlowLow__bellSeverityGlowElementStyles | ((context: { unreadCount: { total: number; severity: Record<string, number>; }; }) => string)
bellDotElementStyles | ((context: { unreadCount: { total: number; severity: Record<string, number>; }; }) => string)
preferencesContainerElementStyles | ((context: { preferences?: Preference[]; groups: Array<{ name: string; preferences: Preference[]; }>; }) => string)
notificationListContainerElementStyles | ((context: { notifications: NotificationType[]; }) => string)
notificationListElementStyles | ((context: { notifications: NotificationType[]; }) => string)
notificationElementStyles | ((context: { notification: NotificationType; }) => string)
severityHigh__notificationElementStyles | ((context: { notification: NotificationType; }) => string)
severityMedium__notificationElementStyles | ((context: { notification: NotificationType; }) => string)
severityLow__notificationElementStyles | ((context: { notification: NotificationType; }) => string)
notificationBarElementStyles | ((context: { notification: NotificationType; }) => string)
severityHigh__notificationBarElementStyles | ((context: { notification: NotificationType; }) => string)
severityMedium__notificationBarElementStyles | ((context: { notification: NotificationType; }) => string)
severityLow__notificationBarElementStyles | ((context: { notification: NotificationType; }) => string)
notificationContentElementStyles | ((context: { notification: NotificationType; }) => string)
notificationTextContainerElementStyles | ((context: { notification: NotificationType; }) => string)
notificationDotElementStyles | ((context: { notification: NotificationType; }) => string)
notificationSubjectElementStyles | ((context: { notification: NotificationType; }) => string)
notificationBodyElementStyles | ((context: { notification: NotificationType; }) => string)
notificationImageElementStyles | ((context: { notification: NotificationType; }) => string)
notificationImageLoadingFallbackElementStyles | ((context: { notification: NotificationType; }) => string)
notificationDateElementStyles | ((context: { notification: NotificationType; }) => string)
notificationDefaultActionsElementStyles | ((context: { notification: NotificationType; }) => string)
notificationCustomActionsElementStyles | ((context: { notification: NotificationType; }) => string)
notificationPrimaryAction__buttonElementStyles | ((context: { notification: NotificationType; }) => string)
notificationSecondaryAction__buttonElementStyles | ((context: { notification: NotificationType; }) => string)
workflowContainerElementStyles | ((context: { preference: Preference; }) => string)
workflowLabelElementStyles | ((context: { preference: Preference; }) => string)
workflowLabelHeaderElementStyles | ((context: { preference: Preference; }) => string)
workflowLabelHeaderContainerElementStyles | ((context: { preference: Preference; }) => string)
workflowLabelIconElementStyles | ((context: { preference: Preference; }) => string)
workflowLabelContainerElementStyles | ((context: { preference: Preference; }) => string)
workflowContainerRight__iconElementStyles | ((context: { preference: Preference; }) => string)
workflowArrow__iconElementStyles | ((context: { preference: Preference; }) => string)
preferencesGroupContainerElementStyles | ((context: { preferenceGroup: { name: string; preferences: Preference[]; }; }) => string)
preferencesGroupHeaderElementStyles | ((context: { preferenceGroup: { name: string; preferences: Preference[]; }; }) => string)
preferencesGroupLabelContainerElementStyles | ((context: { preferenceGroup: { name: string; preferences: Preference[]; }; }) => string)
preferencesGroupLabelIconElementStyles | ((context: { preferenceGroup: { name: string; preferences: Preference[]; }; }) => string)
preferencesGroupLabelElementStyles | ((context: { preferenceGroup: { name: string; preferences: Preference[]; }; }) => string)
preferencesGroupActionsContainerElementStyles | ((context: { preferenceGroup: { name: string; preferences: Preference[]; }; }) => string)
preferencesGroupActionsContainerRight__iconElementStyles | ((context: { preferenceGroup: { name: string; preferences: Preference[]; }; }) => string)
preferencesGroupBodyElementStyles | ((context: { preferenceGroup: { name: string; preferences: Preference[]; }; }) => string)
preferencesGroupChannelsElementStyles | ((context: { preferenceGroup: { name: string; preferences: Preference[]; }; }) => string)
preferencesGroupInfoElementStyles | ((context: { preferenceGroup: { name: string; preferences: Preference[]; }; }) => string)
preferencesGroupInfoIconElementStyles | ((context: { preferenceGroup: { name: string; preferences: Preference[]; }; }) => string)
preferencesGroupWorkflowsElementStyles | ((context: { preferenceGroup: { name: string; preferences: Preference[]; }; }) => string)
channelContainerElementStyles | ((context: { preference?: Preference; preferenceGroup?: { name: string; preferences: Preference[]; }; }) => string)
channelIconContainerElementStyles | ((context: { preference?: Preference; preferenceGroup?: { name: string; preferences: Preference[]; }; }) => string)
channel__iconElementStyles | ((context: { preference?: Preference; preferenceGroup?: { name: string; preferences: Preference[]; }; }) => string)
channelsContainerElementStyles | ((context: { preference: Preference; }) => string)
channelLabelElementStyles | ((context: { preference?: Preference; preferenceGroup?: { name: string; preferences: Preference[]; }; }) => string)
channelLabelContainerElementStyles | ((context: { preference?: Preference; preferenceGroup?: { name: string; preferences: Preference[]; }; }) => string)
channelNameElementStyles | ((context: { preference: Preference; }) => string)
channelSwitchContainerElementStyles | ((context: { preference?: Preference; preferenceGroup?: { name: string; preferences: Preference[]; }; }) => string)
scheduleContainerElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleHeaderElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleLabelContainerElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleLabelScheduleIconElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleLabelInfoIconElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleLabelElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleActionsContainerElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleActionsContainerRightElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleBodyElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleDescriptionElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleTableElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleTableHeaderElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleHeaderColumnElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleTableBodyElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleBodyRowElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleBodyColumnElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleInfoContainerElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleInfoIconElementStyles | ((context: { schedule?: Schedule; }) => string)
scheduleInfoElementStyles | ((context: { schedule?: Schedule; }) => string)
dayScheduleCopyTitleElementStyles | ((context: { schedule?: Schedule; }) => string)
dayScheduleCopyIconElementStyles | ((context: { schedule?: Schedule; }) => string)
dayScheduleCopySelectAllElementStyles | ((context: { schedule?: Schedule; }) => string)
dayScheduleCopyDayElementStyles | ((context: { schedule?: Schedule; }) => string)
dayScheduleCopyFooterContainerElementStyles | ((context: { schedule?: Schedule; }) => string)
notificationDeliveredAt__badgeElementStyles | ((context: { notification: NotificationType; }) => string)
notificationDeliveredAt__iconElementStyles | ((context: { notification: NotificationType; }) => string)
notificationSnoozedUntil__iconElementStyles | ((context: { notification: NotificationType; }) => string)
subscriptionContainerElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscriptionButton__buttonElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscriptionButtonContainerElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscriptionButtonIconElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscriptionButtonLabelElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscription__popoverTriggerContainerElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscription__popoverTriggerElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscriptionTriggerIconElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscription__popoverContentElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscriptionPreferencesContainerElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscriptionPreferencesHeaderContainerElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscriptionPreferencesHeaderElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscriptionPreferencesInfoIconElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscriptionPreferencesContentElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscriptionPreferencesGroupsContainerElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscriptionPreferencesFallbackElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscriptionPreferencesFallbackTextsElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscriptionPreferencesFallbackHeaderElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscriptionPreferencesFallbackDescriptionElementStyles | ((context: { subscription?: TopicSubscription; }) => string)
subscriptionPreferenceRowElementStyles | ((context: { preference: { label: string; preference: SubscriptionPreference; }; }) => string)
subscriptionPreferenceLabelElementStyles | ((context: { preference: { label: string; preference: SubscriptionPreference; }; }) => string)
subscriptionPreferenceGroupContainerElementStyles | ((context: { group: { label: string; group: Array<{ label: string; preference: SubscriptionPreference; }>; }; }) => string)
subscriptionPreferenceGroupHeaderElementStyles | ((context: { group: { label: string; group: Array<{ label: string; preference: SubscriptionPreference; }>; }; }) => string)
subscriptionPreferenceGroupLabelContainerElementStyles | ((context: { group: { label: string; group: Array<{ label: string; preference: SubscriptionPreference; }>; }; }) => string)
subscriptionPreferenceGroupLabelIconElementStyles | ((context: { group: { label: string; group: Array<{ label: string; preference: SubscriptionPreference; }>; }; }) => string)
subscriptionPreferenceGroupLabelElementStyles | ((context: { group: { label: string; group: Array<{ label: string; preference: SubscriptionPreference; }>; }; }) => string)
subscriptionPreferenceGroupActionsContainerElementStyles | ((context: { group: { label: string; group: Array<{ label: string; preference: SubscriptionPreference; }>; }; }) => string)
subscriptionPreferenceGroupActionsContainerRight__iconElementStyles | ((context: { group: { label: string; group: Array<{ label: string; preference: SubscriptionPreference; }>; }; }) => string)
subscriptionPreferenceGroupBodyElementStyles | ((context: { group: { label: string; group: Array<{ label: string; preference: SubscriptionPreference; }>; }; }) => string)
subscriptionPreferenceGroupWorkflowRowElementStyles | ((context: { preference: { label: string; preference: SubscriptionPreference; }; }) => string)
subscriptionPreferenceGroupWorkflowLabelElementStyles | ((context: { preference: { label: string; preference: SubscriptionPreference; }; }) => string)
linkSlackUserContainerElementStyles | ((context: { linked: boolean; }) => string)
linkSlackUserButtonElementStyles | ((context: { linked: boolean; }) => string)
linkSlackUserButtonContainerElementStyles | ((context: { linked: boolean; }) => string)
linkSlackUserButtonIconElementStyles | ((context: { linked: boolean; }) => string)
linkSlackUserButtonLabelElementStyles | ((context: { linked: boolean; }) => string)
channelConnectButtonContainerElementStyles | ((context: { connected: boolean; }) => string)
channelConnectButtonElementStyles | ((context: { connected: boolean; }) => string)
channelConnectButtonInnerElementStyles | ((context: { connected: boolean; }) => string)
channelConnectButtonIconElementStyles | ((context: { connected: boolean; }) => string)
channelConnectButtonLabelElementStyles | ((context: { connected: boolean; }) => string)

Bell

A customizable notification bell component.

Props

PropertyTypeDescription
renderBellBellRenderer

Usage

import { Bell } from "@novu/react";
import { BellIcon } from "lucide-react";

function NotificationBell() {
  return (
    <Bell
      renderBell={(unreadCount) => (
        <div className="relative">
          <BellIcon className="h-6 w-6" />
          {unreadCount > 0 && (
            <span className="absolute -top-1 -right-1 bg-red-500 text-white rounded-full w-5 h-5 text-xs flex items-center justify-center">
              {unreadCount}
            </span>
          )}
        </div>
      )}
    />
  );
}

Notifications

A component for rendering a list of notifications.

Props

PropertyTypeDescription
onNotificationClickNotificationClickHandler
onPrimaryActionClickNotificationActionClickHandler
onSecondaryActionClickNotificationActionClickHandler
renderNotificationNotificationsRenderer
renderAvatarAvatarRenderer
renderSubjectSubjectRenderer
renderBodyBodyRenderer
renderDefaultActionsDefaultActionsRenderer
renderCustomActionsCustomActionsRenderer

Usage

import { Notifications } from "@novu/react";

function NotificationList() {
  return (
    <Notifications
      onNotificationClick={(notification) => {
        // Handle notification click
        console.log(notification);
      }}
      renderNotification={({ body, createdAt }) => (
        <div className="flex gap-2 p-2">
          <div className="flex-1">
            <p>{body}</p>
            <time className="text-sm text-gray-500">
              {new Date(createdAt).toLocaleDateString()}
            </time>
          </div>
        </div>
      )}
    />
  );
}

InboxContent

A component for building custom notification inboxes.

Props

PropertyTypeDescription
onNotificationClickNotificationClickHandler
onPrimaryActionClickNotificationActionClickHandler
onSecondaryActionClickNotificationActionClickHandler
initialPageInboxPage
hideNavboolean
renderNotificationNotificationsRenderer
renderAvatarAvatarRenderer
renderSubjectSubjectRenderer
renderBodyBodyRenderer
renderDefaultActionsDefaultActionsRenderer
renderCustomActionsCustomActionsRenderer

Usage

import { InboxContent } from "@novu/react";

function CustomInbox() {
  return (
    <div className="custom-inbox-wrapper">
      <InboxContent
        onNotificationClick={(notification) => {
          // Handle notification click
          console.log(notification);
        }}
        onPrimaryActionClick={(notification) => {
          // Handle primary action click
          console.log(notification);
        }}
        hideNav={false}
        renderNotification={({ body, createdAt }) => (
          <div className="notification-item">
            <p>{body}</p>
            <time>{new Date(createdAt).toLocaleDateString()}</time>
          </div>
        )}
      />
    </div>
  );
}

Subscription

Props

PropertyTypeDescription
childrenany
renderPreferencesPreferencesRenderer
openboolean
placementPlacement
placementOffsetOffsetOptions
topicKeystring
identifierstring
preferencesUIPreference[]
localizationSubscriptionLocalization
appearanceReactSubscriptionAppearance
containerany

Appearance configuration

PropertyTypeDescription
variablesVariables
elementsPartial<{ root: ElementStyles; button: ElementStyles; input: ElementStyles; icon: ElementStyles; badge: ElementStyles; popoverContent: ElementStyles; popoverTrigger: ElementStyles; popoverClose: ElementStyles; collapsible: ElementStyles; tooltipContent: ElementStyles; tooltipTrigger: ElementStyles; } & {} & { subscriptionContainer: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscriptionButton__button: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscriptionButtonContainer: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscriptionButtonIcon: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscriptionButtonLabel: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscription__popoverTriggerContainer: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscription__popoverTrigger: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscriptionTriggerIcon: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscription__popoverContent: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscriptionPreferencesContainer: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscriptionPreferencesHeaderContainer: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscriptionPreferencesHeader: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscriptionPreferencesInfoIcon: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscriptionPreferencesContent: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscriptionPreferencesGroupsContainer: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscriptionPreferencesFallback: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscriptionPreferencesFallbackTexts: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscriptionPreferencesFallbackHeader: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscriptionPreferencesFallbackDescription: ElementStyles | ((context: { subscription?: TopicSubscription; }) => string); subscriptionPreferenceRow: ElementStyles | ((context: { preference: { label: string; preference: SubscriptionPreference; }; }) => string); subscriptionPreferenceLabel: ElementStyles | ((context: { preference: { label: string; preference: SubscriptionPreference; }; }) => string); subscriptionPreferenceGroupContainer: ElementStyles | ((context: { group: { label: string; group: Array<{ label: string; preference: SubscriptionPreference; }>; }; }) => string); subscriptionPreferenceGroupHeader: ElementStyles | ((context: { group: { label: string; group: Array<{ label: string; preference: SubscriptionPreference; }>; }; }) => string); subscriptionPreferenceGroupLabelContainer: ElementStyles | ((context: { group: { label: string; group: Array<{ label: string; preference: SubscriptionPreference; }>; }; }) => string); subscriptionPreferenceGroupLabelIcon: ElementStyles | ((context: { group: { label: string; group: Array<{ label: string; preference: SubscriptionPreference; }>; }; }) => string); subscriptionPreferenceGroupLabel: ElementStyles | ((context: { group: { label: string; group: Array<{ label: string; preference: SubscriptionPreference; }>; }; }) => string); subscriptionPreferenceGroupActionsContainer: ElementStyles | ((context: { group: { label: string; group: Array<{ label: string; preference: SubscriptionPreference; }>; }; }) => string); subscriptionPreferenceGroupActionsContainerRight__icon: ElementStyles | ((context: { group: { label: string; group: Array<{ label: string; preference: SubscriptionPreference; }>; }; }) => string); subscriptionPreferenceGroupBody: ElementStyles | ((context: { group: { label: string; group: Array<{ label: string; preference: SubscriptionPreference; }>; }; }) => string); subscriptionPreferenceGroupWorkflowRow: ElementStyles | ((context: { preference: { label: string; preference: SubscriptionPreference; }; }) => string); subscriptionPreferenceGroupWorkflowLabel: ElementStyles | ((context: { preference: { label: string; preference: SubscriptionPreference; }; }) => string); }>
animationsboolean
iconsSubscriptionIconOverrides
baseThemeSubscriptionTheme | SubscriptionTheme[]

Usage

import { NovuProvider, Subscription } from "@novu/react";

function SubscriptionManager() {
  return (
    <NovuProvider
      subscriber="SUBSCRIBER_ID"
      applicationIdentifier="APPLICATION_IDENTIFIER"
    >
      <Subscription
      topic="product-updates"
      identifier="user-preference-1"
      preferences={["workflow-one", "workflow-two"]}
      appearance={{
        baseTheme: isDark ? subscriptionDarkTheme : undefined,
      }}
    />
    </NovuProvider>
  );
}