@novu/js 3.1.0 → 3.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.
package/README.md CHANGED
@@ -20,7 +20,7 @@ import { Novu } from '@novu/js';
20
20
 
21
21
  const novu = new Novu({
22
22
  applicationIdentifier: 'YOUR_NOVU_APPLICATION_IDENTIFIER',
23
- subscriberId: 'YOUR_INTERNAL_SUBSCRIBER_ID',
23
+ subscriber: 'YOUR_INTERNAL_SUBSCRIBER_ID',
24
24
  });
25
25
 
26
26
  const { data: notifications, error } = await novu.notifications.list();
@@ -60,7 +60,7 @@ var isSameFilter = (filter1, filter2) => {
60
60
  // src/api/http-client.ts
61
61
  var DEFAULT_API_VERSION = "v1";
62
62
  var DEFAULT_BACKEND_URL = "https://api.novu.co";
63
- var DEFAULT_USER_AGENT = `${"@novu/js"}@${"3.1.0"}`;
63
+ var DEFAULT_USER_AGENT = `${"@novu/js"}@${"3.2.0"}`;
64
64
  var HttpClient = class {
65
65
  constructor(options = {}) {
66
66
  const {
@@ -175,13 +175,13 @@ var InboxService = class {
175
175
  initializeSession(_0) {
176
176
  return chunk7B52C2XE_js.__async(this, arguments, function* ({
177
177
  applicationIdentifier,
178
- subscriberId,
179
- subscriberHash
178
+ subscriberHash,
179
+ subscriber
180
180
  }) {
181
181
  const response = yield chunk7B52C2XE_js.__privateGet(this, _httpClient).post(`${INBOX_ROUTE}/session`, {
182
182
  applicationIdentifier,
183
- subscriberId,
184
- subscriberHash
183
+ subscriberHash,
184
+ subscriber
185
185
  });
186
186
  chunk7B52C2XE_js.__privateGet(this, _httpClient).setAuthorizationToken(response.token);
187
187
  this.isSessionInitialized = true;
@@ -1496,17 +1496,17 @@ var Session = class {
1496
1496
  return chunk7B52C2XE_js.__privateGet(this, _options).applicationIdentifier;
1497
1497
  }
1498
1498
  get subscriberId() {
1499
- return chunk7B52C2XE_js.__privateGet(this, _options).subscriberId;
1499
+ return chunk7B52C2XE_js.__privateGet(this, _options).subscriber.subscriberId;
1500
1500
  }
1501
1501
  initialize() {
1502
1502
  return chunk7B52C2XE_js.__async(this, null, function* () {
1503
1503
  try {
1504
- const { applicationIdentifier, subscriberId, subscriberHash } = chunk7B52C2XE_js.__privateGet(this, _options);
1504
+ const { applicationIdentifier, subscriberHash, subscriber } = chunk7B52C2XE_js.__privateGet(this, _options);
1505
1505
  chunk7B52C2XE_js.__privateGet(this, _emitter5).emit("session.initialize.pending", { args: chunk7B52C2XE_js.__privateGet(this, _options) });
1506
1506
  const response = yield chunk7B52C2XE_js.__privateGet(this, _inboxService2).initializeSession({
1507
1507
  applicationIdentifier,
1508
- subscriberId,
1509
- subscriberHash
1508
+ subscriberHash,
1509
+ subscriber
1510
1510
  });
1511
1511
  chunk7B52C2XE_js.__privateGet(this, _emitter5).emit("session.initialize.resolved", { args: chunk7B52C2XE_js.__privateGet(this, _options), data: response });
1512
1512
  } catch (error) {
@@ -1539,18 +1539,23 @@ var mapToNotification = ({
1539
1539
  data,
1540
1540
  workflow
1541
1541
  }) => {
1542
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
1542
+ var _a, _b, _c, _d, _e, _f, _g, _h;
1543
1543
  const to = {
1544
- id: (_a = subscriber == null ? void 0 : subscriber._id) != null ? _a : "",
1544
+ id: subscriber == null ? void 0 : subscriber._id,
1545
+ subscriberId: subscriber == null ? void 0 : subscriber.subscriberId,
1545
1546
  firstName: subscriber == null ? void 0 : subscriber.firstName,
1546
1547
  lastName: subscriber == null ? void 0 : subscriber.lastName,
1547
1548
  avatar: subscriber == null ? void 0 : subscriber.avatar,
1548
- subscriberId: (_b = subscriber == null ? void 0 : subscriber.subscriberId) != null ? _b : ""
1549
+ locale: subscriber == null ? void 0 : subscriber.locale,
1550
+ data: subscriber == null ? void 0 : subscriber.data,
1551
+ timezone: subscriber == null ? void 0 : subscriber.timezone,
1552
+ email: subscriber == null ? void 0 : subscriber.email,
1553
+ phone: subscriber == null ? void 0 : subscriber.phone
1549
1554
  };
1550
- const primaryCta = (_d = (_c = cta.action) == null ? void 0 : _c.buttons) == null ? void 0 : _d.find((button) => button.type === "primary" /* PRIMARY */);
1551
- const secondaryCta = (_f = (_e = cta.action) == null ? void 0 : _e.buttons) == null ? void 0 : _f.find((button) => button.type === "secondary" /* SECONDARY */);
1552
- const actionType = (_h = (_g = cta.action) == null ? void 0 : _g.result) == null ? void 0 : _h.type;
1553
- const actionStatus = (_i = cta.action) == null ? void 0 : _i.status;
1555
+ const primaryCta = (_b = (_a = cta.action) == null ? void 0 : _a.buttons) == null ? void 0 : _b.find((button) => button.type === "primary" /* PRIMARY */);
1556
+ const secondaryCta = (_d = (_c = cta.action) == null ? void 0 : _c.buttons) == null ? void 0 : _d.find((button) => button.type === "secondary" /* SECONDARY */);
1557
+ const actionType = (_f = (_e = cta.action) == null ? void 0 : _e.result) == null ? void 0 : _f.type;
1558
+ const actionStatus = (_g = cta.action) == null ? void 0 : _g.status;
1554
1559
  return {
1555
1560
  id: _id,
1556
1561
  subject,
@@ -1580,7 +1585,7 @@ var mapToNotification = ({
1580
1585
  },
1581
1586
  channelType: channel,
1582
1587
  tags,
1583
- redirect: ((_j = cta.data) == null ? void 0 : _j.url) ? {
1588
+ redirect: ((_h = cta.data) == null ? void 0 : _h.url) ? {
1584
1589
  url: cta.data.url,
1585
1590
  target: cta.data.target
1586
1591
  } : void 0,
@@ -1718,8 +1723,8 @@ var Novu = class {
1718
1723
  chunk7B52C2XE_js.__privateSet(this, _session, new Session(
1719
1724
  {
1720
1725
  applicationIdentifier: options.applicationIdentifier,
1721
- subscriberId: options.subscriberId,
1722
- subscriberHash: options.subscriberHash
1726
+ subscriberHash: options.subscriberHash,
1727
+ subscriber: buildSubscriber(options)
1723
1728
  },
1724
1729
  chunk7B52C2XE_js.__privateGet(this, _inboxService3),
1725
1730
  chunk7B52C2XE_js.__privateGet(this, _emitter7)
@@ -1763,6 +1768,15 @@ var Novu = class {
1763
1768
  _emitter7 = new WeakMap();
1764
1769
  _session = new WeakMap();
1765
1770
  _inboxService3 = new WeakMap();
1771
+ function buildSubscriber(options) {
1772
+ let subscriberObj;
1773
+ if (options.subscriber) {
1774
+ subscriberObj = typeof options.subscriber === "string" ? { subscriberId: options.subscriber } : options.subscriber;
1775
+ } else {
1776
+ subscriberObj = { subscriberId: options.subscriberId };
1777
+ }
1778
+ return subscriberObj;
1779
+ }
1766
1780
 
1767
1781
  exports.ChannelType = ChannelType;
1768
1782
  exports.NotificationStatus = NotificationStatus;
@@ -1,5 +1,5 @@
1
- import { N as NotificationFilter } from './novu-DDPQzl99.js';
2
- export { C as ChannelPreference, c as ChannelType, E as EventHandler, a as Events, F as FiltersCountResponse, I as InboxNotification, L as ListNotificationsResponse, d as Notification, e as NotificationStatus, b as Novu, f as NovuError, g as NovuOptions, P as Preference, h as PreferenceLevel, i as PreferencesResponse, S as SocketEventNames, W as WebSocketEvent } from './novu-DDPQzl99.js';
1
+ import { N as NotificationFilter } from './novu-jtIKy6p0.js';
2
+ export { C as ChannelPreference, c as ChannelType, E as EventHandler, a as Events, F as FiltersCountResponse, I as InboxNotification, L as ListNotificationsResponse, d as Notification, e as NotificationStatus, b as Novu, f as NovuError, g as NovuOptions, P as Preference, h as PreferenceLevel, i as PreferencesResponse, S as SocketEventNames, j as Subscriber, W as WebSocketEvent } from './novu-jtIKy6p0.js';
3
3
 
4
4
  declare const areTagsEqual: (tags1?: string[], tags2?: string[]) => boolean;
5
5
  declare const isSameFilter: (filter1: NotificationFilter, filter2: NotificationFilter) => boolean;
package/dist/cjs/index.js CHANGED
@@ -1,35 +1,35 @@
1
1
  'use strict';
2
2
 
3
- var chunkWONVNOTK_js = require('./chunk-WONVNOTK.js');
3
+ var chunk4KMXR5HJ_js = require('./chunk-4KMXR5HJ.js');
4
4
  require('./chunk-7B52C2XE.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "ChannelType", {
9
9
  enumerable: true,
10
- get: function () { return chunkWONVNOTK_js.ChannelType; }
10
+ get: function () { return chunk4KMXR5HJ_js.ChannelType; }
11
11
  });
12
12
  Object.defineProperty(exports, "NotificationStatus", {
13
13
  enumerable: true,
14
- get: function () { return chunkWONVNOTK_js.NotificationStatus; }
14
+ get: function () { return chunk4KMXR5HJ_js.NotificationStatus; }
15
15
  });
16
16
  Object.defineProperty(exports, "Novu", {
17
17
  enumerable: true,
18
- get: function () { return chunkWONVNOTK_js.Novu; }
18
+ get: function () { return chunk4KMXR5HJ_js.Novu; }
19
19
  });
20
20
  Object.defineProperty(exports, "PreferenceLevel", {
21
21
  enumerable: true,
22
- get: function () { return chunkWONVNOTK_js.PreferenceLevel; }
22
+ get: function () { return chunk4KMXR5HJ_js.PreferenceLevel; }
23
23
  });
24
24
  Object.defineProperty(exports, "WebSocketEvent", {
25
25
  enumerable: true,
26
- get: function () { return chunkWONVNOTK_js.WebSocketEvent; }
26
+ get: function () { return chunk4KMXR5HJ_js.WebSocketEvent; }
27
27
  });
28
28
  Object.defineProperty(exports, "areTagsEqual", {
29
29
  enumerable: true,
30
- get: function () { return chunkWONVNOTK_js.areTagsEqual; }
30
+ get: function () { return chunk4KMXR5HJ_js.areTagsEqual; }
31
31
  });
32
32
  Object.defineProperty(exports, "isSameFilter", {
33
33
  enumerable: true,
34
- get: function () { return chunkWONVNOTK_js.isSameFilter; }
34
+ get: function () { return chunk4KMXR5HJ_js.isSameFilter; }
35
35
  });
@@ -89,11 +89,16 @@ type Session = {
89
89
  isDevelopmentMode: boolean;
90
90
  };
91
91
  type Subscriber = {
92
- id: string;
92
+ id?: string;
93
+ subscriberId: string;
93
94
  firstName?: string;
94
95
  lastName?: string;
96
+ email?: string;
97
+ phone?: string;
95
98
  avatar?: string;
96
- subscriberId: string;
99
+ locale?: string;
100
+ data?: Record<string, unknown>;
101
+ timezone?: string;
97
102
  };
98
103
  type Redirect = {
99
104
  url: string;
@@ -167,17 +172,23 @@ type Result<D = undefined, E = NovuError> = Promise<{
167
172
  error?: E;
168
173
  }>;
169
174
  type NovuOptions = {
170
- applicationIdentifier: string;
171
- subscriberId: string;
172
- subscriberHash?: string;
173
175
  /** @deprecated Use apiUrl instead */
174
176
  backendUrl?: string;
177
+ /** @internal Should be used internally for testing purposes */
178
+ __userAgent?: string;
179
+ applicationIdentifier: string;
180
+ subscriberHash?: string;
175
181
  apiUrl?: string;
176
182
  socketUrl?: string;
177
183
  useCache?: boolean;
178
- /** @internal Should be used internally for testing purposes */
179
- __userAgent?: string;
180
- };
184
+ } & ({
185
+ /** @deprecated Use subscriber prop instead */
186
+ subscriberId: string;
187
+ subscriber?: never;
188
+ } | {
189
+ subscriber: Subscriber | string;
190
+ subscriberId?: never;
191
+ });
181
192
  type Prettify<T> = {
182
193
  [K in keyof T]: T[K];
183
194
  } & {};
@@ -193,10 +204,10 @@ declare class InboxService {
193
204
  #private;
194
205
  isSessionInitialized: boolean;
195
206
  constructor(options?: InboxServiceOptions);
196
- initializeSession({ applicationIdentifier, subscriberId, subscriberHash, }: {
207
+ initializeSession({ applicationIdentifier, subscriberHash, subscriber, }: {
197
208
  applicationIdentifier: string;
198
- subscriberId: string;
199
209
  subscriberHash?: string;
210
+ subscriber: Subscriber;
200
211
  }): Promise<Session>;
201
212
  fetchNotifications({ after, archived, limit, offset, read, tags, }: {
202
213
  tags?: string[];
@@ -416,7 +427,7 @@ declare class Notifications extends BaseModule {
416
427
 
417
428
  type InitializeSessionArgs = {
418
429
  applicationIdentifier: string;
419
- subscriberId: string;
430
+ subscriber: Subscriber;
420
431
  subscriberHash?: string;
421
432
  };
422
433
 
@@ -545,4 +556,4 @@ declare class Novu implements Pick<NovuEventEmitter, 'on'> {
545
556
  constructor(options: NovuOptions);
546
557
  }
547
558
 
548
- export { type ChannelPreference as C, type EventHandler as E, type FiltersCountResponse as F, type InboxNotification as I, type ListNotificationsResponse as L, type NotificationFilter as N, Preference as P, type SocketEventNames as S, WebSocketEvent as W, type Events as a, Novu as b, ChannelType as c, Notification as d, NotificationStatus as e, NovuError as f, type NovuOptions as g, PreferenceLevel as h, type PreferencesResponse as i };
559
+ export { type ChannelPreference as C, type EventHandler as E, type FiltersCountResponse as F, type InboxNotification as I, type ListNotificationsResponse as L, type NotificationFilter as N, Preference as P, type SocketEventNames as S, WebSocketEvent as W, type Events as a, Novu as b, ChannelType as c, Notification as d, NotificationStatus as e, NovuError as f, type NovuOptions as g, PreferenceLevel as h, type PreferencesResponse as i, type Subscriber as j };
@@ -1,5 +1,5 @@
1
- import { j as Theme } from '../types-CVvP6EyP.js';
2
- import '../novu-DDPQzl99.js';
1
+ import { j as Theme } from '../types-qgZnJ8j8.js';
2
+ import '../novu-jtIKy6p0.js';
3
3
 
4
4
  declare const dark: Theme;
5
5
 
@@ -1,4 +1,4 @@
1
- import { d as Notification, N as NotificationFilter, g as NovuOptions, b as Novu } from './novu-DDPQzl99.js';
1
+ import { d as Notification, N as NotificationFilter, g as NovuOptions, b as Novu } from './novu-jtIKy6p0.js';
2
2
 
3
3
  declare const appearanceKeys: readonly ["button", "icon", "popoverContent", "popoverTrigger", "dropdownContent", "dropdownTrigger", "dropdownItem", "dropdownItemLabel", "dropdownItemLabelContainer", "dropdownItemLeft__icon", "dropdownItemRight__icon", "dropdownItem__icon", "collapsible", "tooltipContent", "tooltipTrigger", "back__button", "skeletonText", "skeletonAvatar", "skeletonSwitch", "skeletonSwitchThumb", "tabsRoot", "tabsList", "tabsContent", "tabsTrigger", "dots", "root", "bellIcon", "bellContainer", "bellDot", "preferences__button", "preferencesContainer", "inboxHeader", "loading", "inboxContent", "inbox__popoverTrigger", "inbox__popoverContent", "notificationListContainer", "notificationList", "notificationListEmptyNoticeContainer", "notificationListEmptyNoticeOverlay", "notificationListEmptyNoticeIcon", "notificationListEmptyNotice", "notificationList__skeleton", "notificationList__skeletonContent", "notificationList__skeletonItem", "notificationList__skeletonAvatar", "notificationList__skeletonText", "notificationListNewNotificationsNotice__button", "notification", "notificationContent", "notificationTextContainer", "notificationDot", "notificationSubject", "notificationSubject__strong", "notificationBody", "notificationBody__strong", "notificationBodyContainer", "notificationImage", "notificationImageLoadingFallback", "notificationDate", "notificationDateActionsContainer", "notificationDefaultActions", "notificationCustomActions", "notificationPrimaryAction__button", "notificationSecondaryAction__button", "notificationRead__button", "notificationUnread__button", "notificationArchive__button", "notificationUnarchive__button", "notificationRead__icon", "notificationUnread__icon", "notificationArchive__icon", "notificationUnarchive__icon", "notificationsTabs__tabsRoot", "notificationsTabs__tabsList", "notificationsTabs__tabsContent", "notificationsTabs__tabsTrigger", "notificationsTabsTriggerLabel", "notificationsTabsTriggerCount", "inboxStatus__title", "inboxStatus__dropdownTrigger", "inboxStatus__dropdownContent", "inboxStatus__dropdownItem", "inboxStatus__dropdownItemLabel", "inboxStatus__dropdownItemLabelContainer", "inboxStatus__dropdownItemLeft__icon", "inboxStatus__dropdownItemRight__icon", "inboxStatus__dropdownItem__icon", "inboxStatus__dropdownItemCheck__icon", "moreActionsContainer", "moreActions__dropdownTrigger", "moreActions__dropdownContent", "moreActions__dropdownItem", "moreActions__dropdownItemLabel", "moreActions__dropdownItemLeft__icon", "moreActions__dots", "moreTabs__button", "moreTabs__icon", "moreTabs__dropdownTrigger", "moreTabs__dropdownContent", "moreTabs__dropdownItem", "moreTabs__dropdownItemLabel", "moreTabs__dropdownItemRight__icon", "workflowContainer", "workflowLabel", "workflowLabelHeader", "workflowLabelContainer", "workflowContainerDisabledNotice", "workflowLabelDisabled__icon", "workflowContainerRight__icon", "workflowArrow__icon", "workflowDescription", "channelContainer", "channelIconContainer", "channel__icon", "channelsContainerCollapsible", "channelsContainer", "channelLabel", "channelLabelContainer", "channelName", "channelSwitchContainer", "channelSwitch", "channelSwitchThumb", "preferencesHeader", "preferencesHeader__back__button", "preferencesHeader__back__button__icon", "preferencesHeader__title", "preferencesHeader__icon", "preferencesListEmptyNoticeContainer", "preferencesListEmptyNotice", "preferencesList__skeleton", "preferencesList__skeletonContent", "preferencesList__skeletonItem", "preferencesList__skeletonIcon", "preferencesList__skeletonSwitch", "preferencesList__skeletonSwitchThumb", "preferencesList__skeletonText", "strong"];
4
4
 
@@ -1,7 +1,7 @@
1
- import { g as NovuOptions } from '../novu-DDPQzl99.js';
2
- export { d as Notification } from '../novu-DDPQzl99.js';
3
- import { B as BellRenderer, N as NotificationClickHandler, a as NotificationActionClickHandler, b as NotificationRenderer, S as SubjectRenderer, c as BodyRenderer, d as NovuProviderProps, e as BaseNovuProviderProps, A as Appearance, L as Localization, T as Tab, P as PreferencesFilter, R as RouterPush } from '../types-CVvP6EyP.js';
4
- export { f as AppearanceKey, g as ElementStyles, E as Elements, h as LocalizationKey, i as NotificationStatus, V as Variables } from '../types-CVvP6EyP.js';
1
+ import { g as NovuOptions } from '../novu-jtIKy6p0.js';
2
+ export { d as Notification } from '../novu-jtIKy6p0.js';
3
+ import { B as BellRenderer, N as NotificationClickHandler, a as NotificationActionClickHandler, b as NotificationRenderer, S as SubjectRenderer, c as BodyRenderer, d as NovuProviderProps, e as BaseNovuProviderProps, A as Appearance, L as Localization, T as Tab, P as PreferencesFilter, R as RouterPush } from '../types-qgZnJ8j8.js';
4
+ export { f as AppearanceKey, g as ElementStyles, E as Elements, h as LocalizationKey, i as NotificationStatus, V as Variables } from '../types-qgZnJ8j8.js';
5
5
  import { Placement, OffsetOptions } from '@floating-ui/dom';
6
6
  import * as solid_js from 'solid-js';
7
7
  import { ComponentProps } from 'solid-js';
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkWONVNOTK_js = require('../chunk-WONVNOTK.js');
3
+ var chunk4KMXR5HJ_js = require('../chunk-4KMXR5HJ.js');
4
4
  var chunkERC62PGI_js = require('../chunk-ERC62PGI.js');
5
5
  var chunk7B52C2XE_js = require('../chunk-7B52C2XE.js');
6
6
  var web = require('solid-js/web');
@@ -17,7 +17,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
17
17
 
18
18
  var clsx__default = /*#__PURE__*/_interopDefault(clsx);
19
19
 
20
- // _ocwnno0ue:/Users/sokratisvidros/Workspace/novu/packages/js/src/ui/index.directcss
20
+ // _tt392r98u:/Users/sokratisvidros/Workspace/novu/packages/js/src/ui/index.directcss
21
21
  var ui_default = `.novu{scrollbar-color:var(--nv-color-secondary-foreground-alpha-300) #0000;:where(*),:where(*) :after,:where(*) :before,:where(*):after,:where(*):before{border:0 solid #e5e7eb;box-sizing:border-box}:where(html,:host){line-height:1.5;-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;tab-size:4;-webkit-tap-highlight-color:transparent}:where(body){line-height:inherit;margin:0}:where(hr){border-top-width:1px;color:inherit;height:0}:where(abbr:where([title])){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}:where(h1,h2,h3,h4,h5,h6){font-size:inherit;font-weight:inherit}:where(a){color:inherit;text-decoration:inherit}:where(b,strong){font-weight:bolder}:where(code,kbd,samp,pre){font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}:where(small){font-size:80%}:where(sub,sup){font-size:75%;line-height:0;position:relative;vertical-align:initial}:where(sub){bottom:-.25em}:where(sup){top:-.5em}:where(table){border-collapse:collapse;border-color:inherit;text-indent:0}:where(button,input,optgroup,select,textarea){color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}:where(button,select){text-transform:none}:where(button,input:where([type=button]),input:where([type=reset]),input:where([type=submit])){-webkit-appearance:button;background-color:initial;background-image:none}:where(:-moz-focusring){outline:auto}:where(:-moz-ui-invalid){box-shadow:none}:where(progress){vertical-align:initial}:where(*)::-webkit-inner-spin-button,:where(*)::-webkit-outer-spin-button{height:auto}:where([type=search]){-webkit-appearance:textfield;outline-offset:-2px}:where(*)::-webkit-search-decoration{-webkit-appearance:none}:where(*)::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}:where(summary){display:list-item}:where(blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre){margin:0}:where(fieldset){margin:0;padding:0}:where(legend){padding:0}:where(ol,ul,menu){list-style:none;margin:0;padding:0}:where(dialog){padding:0}:where(textarea){resize:vertical}:where(input)::placeholder,:where(textarea)::placeholder{color:#9ca3af;opacity:1}:where(button,[role=button]){cursor:pointer}:where(:disabled){cursor:default}:where(img,svg,video,canvas,audio,iframe,embed,object){display:block;vertical-align:middle}:where(img,video){height:auto;max-width:100%}:where([hidden]){display:none}:where(*),:where(*) :after,:where(*) :before,:where(*):after,:where(*):before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }:where(*) ::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::-webkit-scrollbar{height:.5rem;width:.5rem}::-webkit-scrollbar-thumb{background-clip:"padding-box";background-color:var(--nv-color-secondary-foreground-alpha-300);border-radius:.25rem}::-webkit-scrollbar-corner,::-webkit-scrollbar-track{background-color:initial}}.nt-sr-only{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border-width:0;white-space:nowrap}.nt-invisible{visibility:hidden}.nt-absolute{position:absolute}.nt-relative{position:relative}.nt-inset-0{inset:0}.nt-inset-2{inset:.5rem}.nt-left-0{left:0}.nt-left-0\\.5{left:.125rem}.nt-right-0{right:0}.nt-right-3{right:.75rem}.nt-top-0{top:0}.nt-top-0\\.5{top:.125rem}.nt-top-3{top:.75rem}.nt-z-10{z-index:10}.nt-z-\\[-1\\]{z-index:-1}.nt-mx-auto{margin-left:auto;margin-right:auto}.nt-mb-4{margin-bottom:1rem}.nt-mb-\\[0\\.625rem\\]{margin-bottom:.625rem}.nt-ml-auto{margin-left:auto}.nt-mr-auto{margin-right:auto}.nt-mt-auto{margin-top:auto}.nt-block{display:block}.nt-flex{display:flex}.nt-inline-flex{display:inline-flex}.nt-hidden{display:none}.nt-aspect-square{aspect-ratio:1/1}.nt-size-1{height:.25rem;width:.25rem}.nt-size-1\\.5{height:.375rem;width:.375rem}.nt-size-2{height:.5rem;width:.5rem}.nt-size-2\\.5{height:.625rem;width:.625rem}.nt-size-3{height:.75rem;width:.75rem}.nt-size-4{height:1rem;width:1rem}.nt-size-5{height:1.25rem;width:1.25rem}.nt-size-8{height:2rem;width:2rem}.nt-size-full{height:100%;width:100%}.nt-h-2{height:.5rem}.nt-h-3{height:.75rem}.nt-h-4{height:1rem}.nt-h-8{height:2rem}.nt-h-\\[600px\\]{height:600px}.nt-h-fit{height:-moz-fit-content;height:fit-content}.nt-h-full{height:100%}.nt-min-h-0{min-height:0}.nt-w-1\\/3{width:33.333333%}.nt-w-2\\/3{width:66.666667%}.nt-w-7{width:1.75rem}.nt-w-8{width:2rem}.nt-w-\\[400px\\]{width:400px}.nt-w-fit{width:-moz-fit-content;width:fit-content}.nt-w-full{width:100%}.nt-w-max{width:max-content}.nt-min-w-52{min-width:13rem}.nt-flex-1{flex:1 1 0%}.nt-shrink-0{flex-shrink:0}.nt-transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.nt-cursor-default{cursor:default}.nt-cursor-pointer{cursor:pointer}.nt-flex-col{flex-direction:column}.nt-flex-wrap{flex-wrap:wrap}.nt-flex-nowrap{flex-wrap:nowrap}.nt-items-start{align-items:flex-start}.nt-items-center{align-items:center}.nt-justify-center{justify-content:center}.nt-justify-between{justify-content:space-between}.nt-gap-0{gap:0}.nt-gap-0\\.5{gap:.125rem}.nt-gap-1{gap:.25rem}.nt-gap-2{gap:.5rem}.nt-gap-3{gap:.75rem}.nt-gap-4{gap:1rem}.nt-gap-6{gap:1.5rem}.nt-gap-8{gap:2rem}.nt-self-stretch{align-self:stretch}.nt-overflow-auto{overflow:auto}.nt-overflow-hidden{overflow:hidden}.nt-overflow-y-auto{overflow-y:auto}.nt-truncate{overflow:hidden;text-overflow:ellipsis}.nt-truncate,.nt-whitespace-nowrap{white-space:nowrap}.nt-whitespace-pre-wrap{white-space:pre-wrap}.nt-rounded{border-radius:var(--nv-radius-base)}.nt-rounded-full{border-radius:var(--nv-radius-full)}.nt-rounded-lg{border-radius:var(--nv-radius-lg)}.nt-rounded-md{border-radius:var(--nv-radius-md)}.nt-rounded-xl{border-radius:var(--nv-radius-xl)}.nt-border{border-width:1px}.nt-border-b{border-bottom-width:1px}.nt-border-t{border-top-width:1px}.nt-border-background{border-color:var(--nv-color-background)}.nt-border-border,.nt-border-neutral-alpha-100{border-color:var(--nv-color-neutral-alpha-100)}.nt-border-neutral-alpha-50{border-color:var(--nv-color-neutral-alpha-50)}.nt-border-t-neutral-alpha-200{border-top-color:var(--nv-color-neutral-alpha-200)}.nt-bg-\\[oklch\\(from_var\\(--nv-color-stripes\\)_l_c_h_\\/_0\\.1\\)\\]{background-color:oklch(from var(--nv-color-stripes) l c h/.1)}.nt-bg-background{background-color:var(--nv-color-background)}.nt-bg-counter{background-color:var(--nv-color-counter)}.nt-bg-foreground{background-color:var(--nv-color-foreground)}.nt-bg-neutral-alpha-100{background-color:var(--nv-color-neutral-alpha-100)}.nt-bg-neutral-alpha-25{background-color:var(--nv-color-neutral-alpha-25)}.nt-bg-neutral-alpha-300{background-color:var(--nv-color-neutral-alpha-300)}.nt-bg-neutral-alpha-50{background-color:var(--nv-color-neutral-alpha-50)}.nt-bg-primary{background-color:var(--nv-color-primary)}.nt-bg-secondary{background-color:var(--nv-color-secondary)}.nt-bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.nt-bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.nt-from-foreground-alpha-50{--tw-gradient-from:var(--nv-color-foreground-alpha-50) var(--tw-gradient-from-position);--tw-gradient-to:#fff0 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.nt-from-primary-foreground-alpha-200{--tw-gradient-from:var(--nv-color-primary-foreground-alpha-200) var(--tw-gradient-from-position);--tw-gradient-to:#fff0 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.nt-from-transparent{--tw-gradient-from:#0000 var(--tw-gradient-from-position);--tw-gradient-to:#0000 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.nt-from-20\\%{--tw-gradient-from-position:20%}.nt-to-background{--tw-gradient-to:var(--nv-color-background) var(--tw-gradient-to-position)}.nt-to-transparent{--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.nt-object-cover{object-fit:cover}.nt-p-0{padding:0}.nt-p-0\\.5{padding:.125rem}.nt-p-1{padding:.25rem}.nt-p-2{padding:.5rem}.nt-p-2\\.5{padding:.625rem}.nt-p-3{padding:.75rem}.nt-p-4{padding:1rem}.nt-px-1{padding-left:.25rem;padding-right:.25rem}.nt-px-2{padding-left:.5rem;padding-right:.5rem}.nt-px-3{padding-left:.75rem;padding-right:.75rem}.nt-px-4{padding-left:1rem;padding-right:1rem}.nt-px-8{padding-left:2rem;padding-right:2rem}.nt-px-\\[6px\\]{padding-left:6px;padding-right:6px}.nt-py-1{padding-bottom:.25rem;padding-top:.25rem}.nt-py-2{padding-bottom:.5rem;padding-top:.5rem}.nt-py-3{padding-bottom:.75rem;padding-top:.75rem}.nt-py-3\\.5{padding-bottom:.875rem;padding-top:.875rem}.nt-py-4{padding-bottom:1rem;padding-top:1rem}.nt-py-px{padding-bottom:1px;padding-top:1px}.nt-pb-2{padding-bottom:.5rem}.nt-pb-\\[0\\.625rem\\]{padding-bottom:.625rem}.nt-pt-2{padding-top:.5rem}.nt-pt-2\\.5{padding-top:.625rem}.nt-text-center{text-align:center}.nt-text-start{text-align:start}.nt-text-base{font-size:var(--nv-font-size-base);line-height:var(--nv-line-height-base)}.nt-text-sm{font-size:var(--nv-font-size-sm);line-height:var(--nv-line-height-sm)}.nt-text-xs{font-size:var(--nv-font-size-xs);line-height:var(--nv-line-height-xs)}.nt-font-medium{font-weight:500}.nt-font-semibold{font-weight:600}.nt-leading-none{line-height:1}.nt-text-background{color:var(--nv-color-background)}.nt-text-counter-foreground{color:var(--nv-color-counter-foreground)}.nt-text-foreground{color:var(--nv-color-foreground)}.nt-text-foreground-alpha-300{color:var(--nv-color-foreground-alpha-300)}.nt-text-foreground-alpha-400{color:var(--nv-color-foreground-alpha-400)}.nt-text-foreground-alpha-600{color:var(--nv-color-foreground-alpha-600)}.nt-text-foreground-alpha-700{color:var(--nv-color-foreground-alpha-700)}.nt-text-primary-foreground{color:var(--nv-color-primary-foreground)}.nt-text-secondary-foreground{color:var(--nv-color-secondary-foreground)}.nt-text-stripes{color:var(--nv-color-stripes)}.nt-opacity-0{opacity:0}.nt-shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.nt-shadow-\\[0_0_0_0\\.5px_var\\(--nv-color-primary-600\\)\\]{--tw-shadow:0 0 0 0.5px var(--nv-color-primary-600);--tw-shadow-colored:0 0 0 0.5px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.nt-shadow-\\[0_0_0_0\\.5px_var\\(--nv-color-secondary-600\\)\\]{--tw-shadow:0 0 0 0.5px var(--nv-color-secondary-600);--tw-shadow-colored:0 0 0 0.5px var(--tw-shadow-color)}.nt-shadow-\\[0_0_0_0\\.5px_var\\(--nv-color-secondary-600\\)\\],.nt-shadow-dropdown{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.nt-shadow-dropdown{--tw-shadow:0px 12px 16px -4px oklch(from var(--nv-color-shadow) l c h/0.08),0px 4px 6px -2px oklch(from var(--nv-color-shadow) l c h/0.03);--tw-shadow-colored:0px 12px 16px -4px var(--tw-shadow-color),0px 4px 6px -2px var(--tw-shadow-color)}.nt-shadow-popover{--tw-shadow:0px 8px 26px 0px oklch(from var(--nv-color-shadow) l c h/0.08),0px 2px 6px 0px oklch(from var(--nv-color-shadow) l c h/0.12);--tw-shadow-colored:0px 8px 26px 0px var(--tw-shadow-color),0px 2px 6px 0px var(--tw-shadow-color)}.nt-shadow-popover,.nt-shadow-tooltip{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.nt-shadow-tooltip{--tw-shadow:0 5px 20px 0 oklch(from var(--nv-color-shadow) l c h/0.08);--tw-shadow-colored:0 5px 20px 0 var(--tw-shadow-color)}.nt-outline-none{outline:2px solid #0000;outline-offset:2px}.nt-backdrop-blur-lg{--tw-backdrop-blur:blur(16px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.nt-transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.nt-transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.nt-transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.nt-duration-100{transition-duration:.1s}.nt-duration-200{transition-duration:.2s}.nt-ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0) scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0) scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}.nt-animate-in{animation-duration:.15s;animation-name:enter;--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial}.nt-fade-in{--tw-enter-opacity:0}.nt-slide-in-from-top-2{--tw-enter-translate-y:-0.5rem}.nt-duration-100{animation-duration:.1s}.nt-duration-200{animation-duration:.2s}.nt-ease-out{animation-timing-function:cubic-bezier(0,0,.2,1)}.before\\:nt-absolute:before{content:var(--tw-content);position:absolute}.before\\:nt-inset-0:before{content:var(--tw-content);inset:0}.before\\:-nt-right-\\[calc\\(0\\+var\\(--stripes-size\\)\\)\\]:before{content:var(--tw-content);right:calc(var(--stripes-size)*-1)}@keyframes nt-stripes{0%{content:var(--tw-content);transform:translateX(0)}to{content:var(--tw-content);transform:translateX(calc(var(--stripes-size)*-1))}}.before\\:nt-animate-stripes:before{animation:nt-stripes 1s linear infinite paused;content:var(--tw-content)}.before\\:nt-rounded-lg:before{border-radius:var(--nv-radius-lg);content:var(--tw-content)}.before\\:nt-rounded-md:before{border-radius:var(--nv-radius-md);content:var(--tw-content)}.before\\:nt-rounded-xl:before{border-radius:var(--nv-radius-xl);content:var(--tw-content)}.before\\:nt-border:before{border-width:1px;content:var(--tw-content)}.before\\:nt-border-primary-foreground-alpha-100:before{border-color:var(--nv-color-primary-foreground-alpha-100);content:var(--tw-content)}.before\\:nt-border-secondary-foreground-alpha-100:before{border-color:var(--nv-color-secondary-foreground-alpha-100);content:var(--tw-content)}.before\\:nt-bg-dev-stripes-gradient:before{background-image:repeating-linear-gradient(135deg,oklch(from var(--nv-color-stripes) l c h/.1) 25%,oklch(from var(--nv-color-stripes) l c h/.1) 50%,oklch(from var(--nv-color-stripes) l c h/.2) 50%,oklch(from var(--nv-color-stripes) l c h/.2) 75%);content:var(--tw-content)}.before\\:nt-bg-\\[length\\:var\\(--stripes-size\\)_var\\(--stripes-size\\)\\]:before{background-size:var(--stripes-size) var(--stripes-size);content:var(--tw-content)}.before\\:nt-content-\\[\\"\\"\\]:before{--tw-content:"";content:var(--tw-content)}.before\\:\\[mask-image\\:linear-gradient\\(transparent_0\\%\\2c black\\)\\]:before{content:var(--tw-content);-webkit-mask-image:linear-gradient(#0000,#000);mask-image:linear-gradient(#0000,#000)}.after\\:nt-absolute:after{content:var(--tw-content);position:absolute}.after\\:nt-inset-0:after{content:var(--tw-content);inset:0}.after\\:-nt-top-12:after{content:var(--tw-content);top:-3rem}.after\\:nt-bottom-0:after{bottom:0;content:var(--tw-content)}.after\\:nt-left-0:after{content:var(--tw-content);left:0}.after\\:nt-left-0\\.5:after{content:var(--tw-content);left:.125rem}.after\\:nt-top-0:after{content:var(--tw-content);top:0}.after\\:nt-top-0\\.5:after{content:var(--tw-content);top:.125rem}.after\\:nt-size-3:after{content:var(--tw-content);height:.75rem;width:.75rem}.after\\:nt-h-\\[2px\\]:after{content:var(--tw-content);height:2px}.after\\:nt-w-full:after{content:var(--tw-content);width:100%}.after\\:nt-rounded-full:after{border-radius:var(--nv-radius-full);content:var(--tw-content)}.after\\:nt-rounded-lg:after{border-radius:var(--nv-radius-lg);content:var(--tw-content)}.after\\:nt-rounded-md:after{border-radius:var(--nv-radius-md);content:var(--tw-content)}.after\\:nt-rounded-xl:after{border-radius:var(--nv-radius-xl);content:var(--tw-content)}.after\\:nt-border-b-2:after{border-bottom-width:2px;content:var(--tw-content)}.after\\:nt-border-b-primary:after{border-bottom-color:var(--nv-color-primary);content:var(--tw-content)}.after\\:nt-border-b-transparent:after{border-bottom-color:#0000;content:var(--tw-content)}.after\\:nt-bg-background:after{background-color:var(--nv-color-background);content:var(--tw-content)}.after\\:nt-bg-\\[linear-gradient\\(180deg\\2c transparent\\2c oklch\\(from_var\\(--nv-color-background\\)_l_c_h_\\/_0\\.9\\)_55\\%\\2c transparent\\)\\]:after{background-image:linear-gradient(180deg,#0000,oklch(from var(--nv-color-background) l c h/.9) 55%,#0000);content:var(--tw-content)}.after\\:nt-bg-\\[linear-gradient\\(180deg\\2c transparent\\2c oklch\\(from_var\\(--nv-color-stripes\\)_l_c_h_\\/_0\\.07\\)_55\\%\\2c transparent\\)\\2c linear-gradient\\(180deg\\2c transparent\\2c oklch\\(from_var\\(--nv-color-background\\)_l_c_h_\\/_0\\.9\\)_55\\%\\2c transparent\\)\\]:after{background-image:linear-gradient(180deg,#0000,oklch(from var(--nv-color-stripes) l c h/.07) 55%,#0000),linear-gradient(180deg,#0000,oklch(from var(--nv-color-background) l c h/.9) 55%,#0000);content:var(--tw-content)}.after\\:nt-bg-gradient-to-b:after{background-image:linear-gradient(to bottom,var(--tw-gradient-stops));content:var(--tw-content)}.after\\:nt-from-primary-foreground-alpha-50:after{content:var(--tw-content);--tw-gradient-from:var(--nv-color-primary-foreground-alpha-50) var(--tw-gradient-from-position);--tw-gradient-to:#fff0 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.after\\:nt-from-secondary-foreground-alpha-50:after{content:var(--tw-content);--tw-gradient-from:var(--nv-color-secondary-foreground-alpha-50) var(--tw-gradient-from-position);--tw-gradient-to:#fff0 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.after\\:nt-to-transparent:after{content:var(--tw-content);--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.after\\:nt-opacity-0:after{content:var(--tw-content);opacity:0}.after\\:nt-transition-all:after{content:var(--tw-content);transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.after\\:nt-transition-opacity:after{content:var(--tw-content);transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.after\\:nt-duration-200:after{transition-duration:.2s}.after\\:nt-content-\\[\\"\\"\\]:after,.after\\:nt-content-\\[\\'\\'\\]:after{--tw-content:"";content:var(--tw-content)}.after\\:nt-duration-200:after{animation-duration:.2s;content:var(--tw-content)}.hover\\:nt-bg-neutral-alpha-100:hover{background-color:var(--nv-color-neutral-alpha-100)}.hover\\:nt-bg-neutral-alpha-50:hover{background-color:var(--nv-color-neutral-alpha-50)}.hover\\:nt-bg-primary-600:hover{background-color:var(--nv-color-primary-600)}.hover\\:nt-bg-primary-alpha-25:hover{background-color:var(--nv-color-primary-alpha-25)}.hover\\:nt-text-foreground-alpha-800:hover{color:var(--nv-color-foreground-alpha-800)}.before\\:hover\\:\\[animation-play-state\\:running\\]:hover:before{animation-play-state:running;content:var(--tw-content)}.hover\\:after\\:nt-opacity-100:hover:after{content:var(--tw-content);opacity:1}.focus\\:nt-outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus-visible\\:nt-rounded-lg:focus-visible{border-radius:var(--nv-radius-lg)}.focus-visible\\:nt-rounded-md:focus-visible{border-radius:var(--nv-radius-md)}.focus-visible\\:nt-rounded-xl:focus-visible{border-radius:var(--nv-radius-xl)}.focus-visible\\:nt-bg-neutral-alpha-50:focus-visible{background-color:var(--nv-color-neutral-alpha-50)}.focus-visible\\:nt-outline-none:focus-visible{outline:2px solid #0000;outline-offset:2px}.focus-visible\\:nt-ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\\:nt-ring-primary:focus-visible{--tw-ring-color:var(--nv-color-primary)}.focus-visible\\:nt-ring-ring:focus-visible{--tw-ring-color:var(--nv-color-ring)}.focus-visible\\:nt-ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.disabled\\:nt-pointer-events-none:disabled{pointer-events:none}.disabled\\:nt-opacity-50:disabled{opacity:.5}.nt-group:focus-within .group-focus-within\\:nt-opacity-100,.nt-group:hover .group-hover\\:nt-opacity-100{opacity:1}.nt-peer:checked~.peer-checked\\:nt-border-neutral-alpha-400{border-color:var(--nv-color-neutral-alpha-400)}.nt-peer:checked~.peer-checked\\:nt-bg-primary{background-color:var(--nv-color-primary)}.nt-peer:checked~.peer-checked\\:nt-shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.nt-peer:checked~.peer-checked\\:after\\:nt-translate-x-full:after{content:var(--tw-content);--tw-translate-x:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.nt-peer:checked~.peer-checked\\:after\\:nt-border-background:after{border-color:var(--nv-color-background);content:var(--tw-content)}.data-\\[open\\=true\\]\\:nt-rotate-180[data-open=true]{--tw-rotate:180deg}.data-\\[open\\=true\\]\\:nt-rotate-180[data-open=true],.data-\\[open\\=true\\]\\:nt-transform[data-open=true]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\\[disabled\\=true\\]\\:nt-text-foreground-alpha-400[data-disabled=true]{color:var(--nv-color-foreground-alpha-400)}.data-\\[disabled\\=true\\]\\:nt-text-foreground-alpha-600[data-disabled=true]{color:var(--nv-color-foreground-alpha-600)}.data-\\[state\\=active\\]\\:nt-text-foreground[data-state=active]{color:var(--nv-color-foreground)}.data-\\[state\\=active\\]\\:after\\:nt-border-b-2[data-state=active]:after{border-bottom-width:2px;content:var(--tw-content)}.data-\\[state\\=active\\]\\:after\\:nt-border-primary[data-state=active]:after{border-color:var(--nv-color-primary);content:var(--tw-content)}.data-\\[state\\=active\\]\\:after\\:nt-opacity-100[data-state=active]:after{content:var(--tw-content);opacity:1}.\\[\\&\\:not\\(\\:first-child\\)\\]\\:nt-border-t:not(:first-child){border-top-width:1px}.\\[\\&_svg\\]\\:nt-pointer-events-none svg{pointer-events:none}.\\[\\&_svg\\]\\:nt-shrink-0 svg{flex-shrink:0}`;
22
22
 
23
23
  // src/ui/config/appearanceKeys.ts
@@ -938,7 +938,7 @@ var useInboxContext = () => {
938
938
  };
939
939
  var NovuContext = solidJs.createContext(void 0);
940
940
  function NovuProvider(props) {
941
- const novu = solidJs.createMemo(() => props.novu || new chunkWONVNOTK_js.Novu(props.options));
941
+ const novu = solidJs.createMemo(() => props.novu || new chunk4KMXR5HJ_js.Novu(props.options));
942
942
  return web.createComponent(NovuContext.Provider, {
943
943
  get value() {
944
944
  return novu();
@@ -2313,7 +2313,7 @@ var useNotificationsInfiniteScroll = (props) => {
2313
2313
  );
2314
2314
  solidJs.onMount(() => {
2315
2315
  const listener = ({ data: data2 }) => {
2316
- if (!data2 || !chunkWONVNOTK_js.isSameFilter(filter, data2.filter)) {
2316
+ if (!data2 || !chunk4KMXR5HJ_js.isSameFilter(filter, data2.filter)) {
2317
2317
  return;
2318
2318
  }
2319
2319
  mutate({ data: data2.notifications, hasMore: data2.hasMore });
@@ -2323,7 +2323,7 @@ var useNotificationsInfiniteScroll = (props) => {
2323
2323
  });
2324
2324
  solidJs.createEffect(() => chunk7B52C2XE_js.__async(void 0, null, function* () {
2325
2325
  const newFilter = chunk7B52C2XE_js.__spreadValues({}, props.options());
2326
- if (chunkWONVNOTK_js.isSameFilter(filter, newFilter)) {
2326
+ if (chunk4KMXR5HJ_js.isSameFilter(filter, newFilter)) {
2327
2327
  return;
2328
2328
  }
2329
2329
  novu.notifications.clearCache();
@@ -53,7 +53,7 @@ var isSameFilter = (filter1, filter2) => {
53
53
  // src/api/http-client.ts
54
54
  var DEFAULT_API_VERSION = "v1";
55
55
  var DEFAULT_BACKEND_URL = "https://api.novu.co";
56
- var DEFAULT_USER_AGENT = `${"@novu/js"}@${"3.1.0"}`;
56
+ var DEFAULT_USER_AGENT = `${"@novu/js"}@${"3.2.0"}`;
57
57
  var HttpClient = class {
58
58
  constructor(options = {}) {
59
59
  const {
@@ -168,13 +168,13 @@ var InboxService = class {
168
168
  initializeSession(_0) {
169
169
  return __async(this, arguments, function* ({
170
170
  applicationIdentifier,
171
- subscriberId,
172
- subscriberHash
171
+ subscriberHash,
172
+ subscriber
173
173
  }) {
174
174
  const response = yield __privateGet(this, _httpClient).post(`${INBOX_ROUTE}/session`, {
175
175
  applicationIdentifier,
176
- subscriberId,
177
- subscriberHash
176
+ subscriberHash,
177
+ subscriber
178
178
  });
179
179
  __privateGet(this, _httpClient).setAuthorizationToken(response.token);
180
180
  this.isSessionInitialized = true;
@@ -1489,17 +1489,17 @@ var Session = class {
1489
1489
  return __privateGet(this, _options).applicationIdentifier;
1490
1490
  }
1491
1491
  get subscriberId() {
1492
- return __privateGet(this, _options).subscriberId;
1492
+ return __privateGet(this, _options).subscriber.subscriberId;
1493
1493
  }
1494
1494
  initialize() {
1495
1495
  return __async(this, null, function* () {
1496
1496
  try {
1497
- const { applicationIdentifier, subscriberId, subscriberHash } = __privateGet(this, _options);
1497
+ const { applicationIdentifier, subscriberHash, subscriber } = __privateGet(this, _options);
1498
1498
  __privateGet(this, _emitter5).emit("session.initialize.pending", { args: __privateGet(this, _options) });
1499
1499
  const response = yield __privateGet(this, _inboxService2).initializeSession({
1500
1500
  applicationIdentifier,
1501
- subscriberId,
1502
- subscriberHash
1501
+ subscriberHash,
1502
+ subscriber
1503
1503
  });
1504
1504
  __privateGet(this, _emitter5).emit("session.initialize.resolved", { args: __privateGet(this, _options), data: response });
1505
1505
  } catch (error) {
@@ -1532,18 +1532,23 @@ var mapToNotification = ({
1532
1532
  data,
1533
1533
  workflow
1534
1534
  }) => {
1535
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
1535
+ var _a, _b, _c, _d, _e, _f, _g, _h;
1536
1536
  const to = {
1537
- id: (_a = subscriber == null ? void 0 : subscriber._id) != null ? _a : "",
1537
+ id: subscriber == null ? void 0 : subscriber._id,
1538
+ subscriberId: subscriber == null ? void 0 : subscriber.subscriberId,
1538
1539
  firstName: subscriber == null ? void 0 : subscriber.firstName,
1539
1540
  lastName: subscriber == null ? void 0 : subscriber.lastName,
1540
1541
  avatar: subscriber == null ? void 0 : subscriber.avatar,
1541
- subscriberId: (_b = subscriber == null ? void 0 : subscriber.subscriberId) != null ? _b : ""
1542
+ locale: subscriber == null ? void 0 : subscriber.locale,
1543
+ data: subscriber == null ? void 0 : subscriber.data,
1544
+ timezone: subscriber == null ? void 0 : subscriber.timezone,
1545
+ email: subscriber == null ? void 0 : subscriber.email,
1546
+ phone: subscriber == null ? void 0 : subscriber.phone
1542
1547
  };
1543
- const primaryCta = (_d = (_c = cta.action) == null ? void 0 : _c.buttons) == null ? void 0 : _d.find((button) => button.type === "primary" /* PRIMARY */);
1544
- const secondaryCta = (_f = (_e = cta.action) == null ? void 0 : _e.buttons) == null ? void 0 : _f.find((button) => button.type === "secondary" /* SECONDARY */);
1545
- const actionType = (_h = (_g = cta.action) == null ? void 0 : _g.result) == null ? void 0 : _h.type;
1546
- const actionStatus = (_i = cta.action) == null ? void 0 : _i.status;
1548
+ const primaryCta = (_b = (_a = cta.action) == null ? void 0 : _a.buttons) == null ? void 0 : _b.find((button) => button.type === "primary" /* PRIMARY */);
1549
+ const secondaryCta = (_d = (_c = cta.action) == null ? void 0 : _c.buttons) == null ? void 0 : _d.find((button) => button.type === "secondary" /* SECONDARY */);
1550
+ const actionType = (_f = (_e = cta.action) == null ? void 0 : _e.result) == null ? void 0 : _f.type;
1551
+ const actionStatus = (_g = cta.action) == null ? void 0 : _g.status;
1547
1552
  return {
1548
1553
  id: _id,
1549
1554
  subject,
@@ -1573,7 +1578,7 @@ var mapToNotification = ({
1573
1578
  },
1574
1579
  channelType: channel,
1575
1580
  tags,
1576
- redirect: ((_j = cta.data) == null ? void 0 : _j.url) ? {
1581
+ redirect: ((_h = cta.data) == null ? void 0 : _h.url) ? {
1577
1582
  url: cta.data.url,
1578
1583
  target: cta.data.target
1579
1584
  } : void 0,
@@ -1711,8 +1716,8 @@ var Novu = class {
1711
1716
  __privateSet(this, _session, new Session(
1712
1717
  {
1713
1718
  applicationIdentifier: options.applicationIdentifier,
1714
- subscriberId: options.subscriberId,
1715
- subscriberHash: options.subscriberHash
1719
+ subscriberHash: options.subscriberHash,
1720
+ subscriber: buildSubscriber(options)
1716
1721
  },
1717
1722
  __privateGet(this, _inboxService3),
1718
1723
  __privateGet(this, _emitter7)
@@ -1756,5 +1761,14 @@ var Novu = class {
1756
1761
  _emitter7 = new WeakMap();
1757
1762
  _session = new WeakMap();
1758
1763
  _inboxService3 = new WeakMap();
1764
+ function buildSubscriber(options) {
1765
+ let subscriberObj;
1766
+ if (options.subscriber) {
1767
+ subscriberObj = typeof options.subscriber === "string" ? { subscriberId: options.subscriber } : options.subscriber;
1768
+ } else {
1769
+ subscriberObj = { subscriberId: options.subscriberId };
1770
+ }
1771
+ return subscriberObj;
1772
+ }
1759
1773
 
1760
1774
  export { ChannelType, NotificationStatus, Novu, PreferenceLevel, WebSocketEvent, areTagsEqual, isSameFilter };
@@ -1,5 +1,5 @@
1
- import { N as NotificationFilter } from './novu-DDPQzl99.mjs';
2
- export { C as ChannelPreference, c as ChannelType, E as EventHandler, a as Events, F as FiltersCountResponse, I as InboxNotification, L as ListNotificationsResponse, d as Notification, e as NotificationStatus, b as Novu, f as NovuError, g as NovuOptions, P as Preference, h as PreferenceLevel, i as PreferencesResponse, S as SocketEventNames, W as WebSocketEvent } from './novu-DDPQzl99.mjs';
1
+ import { N as NotificationFilter } from './novu-jtIKy6p0.mjs';
2
+ export { C as ChannelPreference, c as ChannelType, E as EventHandler, a as Events, F as FiltersCountResponse, I as InboxNotification, L as ListNotificationsResponse, d as Notification, e as NotificationStatus, b as Novu, f as NovuError, g as NovuOptions, P as Preference, h as PreferenceLevel, i as PreferencesResponse, S as SocketEventNames, j as Subscriber, W as WebSocketEvent } from './novu-jtIKy6p0.mjs';
3
3
 
4
4
  declare const areTagsEqual: (tags1?: string[], tags2?: string[]) => boolean;
5
5
  declare const isSameFilter: (filter1: NotificationFilter, filter2: NotificationFilter) => boolean;
@@ -1,2 +1,2 @@
1
- export { ChannelType, NotificationStatus, Novu, PreferenceLevel, WebSocketEvent, areTagsEqual, isSameFilter } from './chunk-WQDFFXIB.mjs';
1
+ export { ChannelType, NotificationStatus, Novu, PreferenceLevel, WebSocketEvent, areTagsEqual, isSameFilter } from './chunk-3SPOLIN3.mjs';
2
2
  import './chunk-STZMOEWR.mjs';
@@ -89,11 +89,16 @@ type Session = {
89
89
  isDevelopmentMode: boolean;
90
90
  };
91
91
  type Subscriber = {
92
- id: string;
92
+ id?: string;
93
+ subscriberId: string;
93
94
  firstName?: string;
94
95
  lastName?: string;
96
+ email?: string;
97
+ phone?: string;
95
98
  avatar?: string;
96
- subscriberId: string;
99
+ locale?: string;
100
+ data?: Record<string, unknown>;
101
+ timezone?: string;
97
102
  };
98
103
  type Redirect = {
99
104
  url: string;
@@ -167,17 +172,23 @@ type Result<D = undefined, E = NovuError> = Promise<{
167
172
  error?: E;
168
173
  }>;
169
174
  type NovuOptions = {
170
- applicationIdentifier: string;
171
- subscriberId: string;
172
- subscriberHash?: string;
173
175
  /** @deprecated Use apiUrl instead */
174
176
  backendUrl?: string;
177
+ /** @internal Should be used internally for testing purposes */
178
+ __userAgent?: string;
179
+ applicationIdentifier: string;
180
+ subscriberHash?: string;
175
181
  apiUrl?: string;
176
182
  socketUrl?: string;
177
183
  useCache?: boolean;
178
- /** @internal Should be used internally for testing purposes */
179
- __userAgent?: string;
180
- };
184
+ } & ({
185
+ /** @deprecated Use subscriber prop instead */
186
+ subscriberId: string;
187
+ subscriber?: never;
188
+ } | {
189
+ subscriber: Subscriber | string;
190
+ subscriberId?: never;
191
+ });
181
192
  type Prettify<T> = {
182
193
  [K in keyof T]: T[K];
183
194
  } & {};
@@ -193,10 +204,10 @@ declare class InboxService {
193
204
  #private;
194
205
  isSessionInitialized: boolean;
195
206
  constructor(options?: InboxServiceOptions);
196
- initializeSession({ applicationIdentifier, subscriberId, subscriberHash, }: {
207
+ initializeSession({ applicationIdentifier, subscriberHash, subscriber, }: {
197
208
  applicationIdentifier: string;
198
- subscriberId: string;
199
209
  subscriberHash?: string;
210
+ subscriber: Subscriber;
200
211
  }): Promise<Session>;
201
212
  fetchNotifications({ after, archived, limit, offset, read, tags, }: {
202
213
  tags?: string[];
@@ -416,7 +427,7 @@ declare class Notifications extends BaseModule {
416
427
 
417
428
  type InitializeSessionArgs = {
418
429
  applicationIdentifier: string;
419
- subscriberId: string;
430
+ subscriber: Subscriber;
420
431
  subscriberHash?: string;
421
432
  };
422
433
 
@@ -545,4 +556,4 @@ declare class Novu implements Pick<NovuEventEmitter, 'on'> {
545
556
  constructor(options: NovuOptions);
546
557
  }
547
558
 
548
- export { type ChannelPreference as C, type EventHandler as E, type FiltersCountResponse as F, type InboxNotification as I, type ListNotificationsResponse as L, type NotificationFilter as N, Preference as P, type SocketEventNames as S, WebSocketEvent as W, type Events as a, Novu as b, ChannelType as c, Notification as d, NotificationStatus as e, NovuError as f, type NovuOptions as g, PreferenceLevel as h, type PreferencesResponse as i };
559
+ export { type ChannelPreference as C, type EventHandler as E, type FiltersCountResponse as F, type InboxNotification as I, type ListNotificationsResponse as L, type NotificationFilter as N, Preference as P, type SocketEventNames as S, WebSocketEvent as W, type Events as a, Novu as b, ChannelType as c, Notification as d, NotificationStatus as e, NovuError as f, type NovuOptions as g, PreferenceLevel as h, type PreferencesResponse as i, type Subscriber as j };
@@ -1,5 +1,5 @@
1
- import { j as Theme } from '../types-DFXwHejb.mjs';
2
- import '../novu-DDPQzl99.mjs';
1
+ import { j as Theme } from '../types-Bi1DqOQ-.mjs';
2
+ import '../novu-jtIKy6p0.mjs';
3
3
 
4
4
  declare const dark: Theme;
5
5
 
@@ -1,4 +1,4 @@
1
- import { d as Notification, N as NotificationFilter, g as NovuOptions, b as Novu } from './novu-DDPQzl99.mjs';
1
+ import { d as Notification, N as NotificationFilter, g as NovuOptions, b as Novu } from './novu-jtIKy6p0.mjs';
2
2
 
3
3
  declare const appearanceKeys: readonly ["button", "icon", "popoverContent", "popoverTrigger", "dropdownContent", "dropdownTrigger", "dropdownItem", "dropdownItemLabel", "dropdownItemLabelContainer", "dropdownItemLeft__icon", "dropdownItemRight__icon", "dropdownItem__icon", "collapsible", "tooltipContent", "tooltipTrigger", "back__button", "skeletonText", "skeletonAvatar", "skeletonSwitch", "skeletonSwitchThumb", "tabsRoot", "tabsList", "tabsContent", "tabsTrigger", "dots", "root", "bellIcon", "bellContainer", "bellDot", "preferences__button", "preferencesContainer", "inboxHeader", "loading", "inboxContent", "inbox__popoverTrigger", "inbox__popoverContent", "notificationListContainer", "notificationList", "notificationListEmptyNoticeContainer", "notificationListEmptyNoticeOverlay", "notificationListEmptyNoticeIcon", "notificationListEmptyNotice", "notificationList__skeleton", "notificationList__skeletonContent", "notificationList__skeletonItem", "notificationList__skeletonAvatar", "notificationList__skeletonText", "notificationListNewNotificationsNotice__button", "notification", "notificationContent", "notificationTextContainer", "notificationDot", "notificationSubject", "notificationSubject__strong", "notificationBody", "notificationBody__strong", "notificationBodyContainer", "notificationImage", "notificationImageLoadingFallback", "notificationDate", "notificationDateActionsContainer", "notificationDefaultActions", "notificationCustomActions", "notificationPrimaryAction__button", "notificationSecondaryAction__button", "notificationRead__button", "notificationUnread__button", "notificationArchive__button", "notificationUnarchive__button", "notificationRead__icon", "notificationUnread__icon", "notificationArchive__icon", "notificationUnarchive__icon", "notificationsTabs__tabsRoot", "notificationsTabs__tabsList", "notificationsTabs__tabsContent", "notificationsTabs__tabsTrigger", "notificationsTabsTriggerLabel", "notificationsTabsTriggerCount", "inboxStatus__title", "inboxStatus__dropdownTrigger", "inboxStatus__dropdownContent", "inboxStatus__dropdownItem", "inboxStatus__dropdownItemLabel", "inboxStatus__dropdownItemLabelContainer", "inboxStatus__dropdownItemLeft__icon", "inboxStatus__dropdownItemRight__icon", "inboxStatus__dropdownItem__icon", "inboxStatus__dropdownItemCheck__icon", "moreActionsContainer", "moreActions__dropdownTrigger", "moreActions__dropdownContent", "moreActions__dropdownItem", "moreActions__dropdownItemLabel", "moreActions__dropdownItemLeft__icon", "moreActions__dots", "moreTabs__button", "moreTabs__icon", "moreTabs__dropdownTrigger", "moreTabs__dropdownContent", "moreTabs__dropdownItem", "moreTabs__dropdownItemLabel", "moreTabs__dropdownItemRight__icon", "workflowContainer", "workflowLabel", "workflowLabelHeader", "workflowLabelContainer", "workflowContainerDisabledNotice", "workflowLabelDisabled__icon", "workflowContainerRight__icon", "workflowArrow__icon", "workflowDescription", "channelContainer", "channelIconContainer", "channel__icon", "channelsContainerCollapsible", "channelsContainer", "channelLabel", "channelLabelContainer", "channelName", "channelSwitchContainer", "channelSwitch", "channelSwitchThumb", "preferencesHeader", "preferencesHeader__back__button", "preferencesHeader__back__button__icon", "preferencesHeader__title", "preferencesHeader__icon", "preferencesListEmptyNoticeContainer", "preferencesListEmptyNotice", "preferencesList__skeleton", "preferencesList__skeletonContent", "preferencesList__skeletonItem", "preferencesList__skeletonIcon", "preferencesList__skeletonSwitch", "preferencesList__skeletonSwitchThumb", "preferencesList__skeletonText", "strong"];
4
4