@novu/js 3.0.3 → 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 +1 -1
- package/dist/cjs/{chunk-47NZ3DJQ.js → chunk-4KMXR5HJ.js} +36 -59
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.js +8 -32
- package/dist/{esm/novu-BXVPjTIj.d.mts → cjs/novu-jtIKy6p0.d.ts} +36 -62
- package/dist/cjs/themes/index.d.ts +2 -2
- package/dist/cjs/{types-BOvaROWQ.d.ts → types-qgZnJ8j8.d.ts} +2 -2
- package/dist/cjs/ui/index.d.ts +5 -5
- package/dist/cjs/ui/index.js +84 -84
- package/dist/esm/{chunk-GCPLP2EW.mjs → chunk-3SPOLIN3.mjs} +37 -54
- package/dist/esm/index.d.mts +2 -2
- package/dist/esm/index.mjs +1 -1
- package/dist/{cjs/novu-BXVPjTIj.d.ts → esm/novu-jtIKy6p0.d.mts} +36 -62
- package/dist/esm/themes/index.d.mts +2 -2
- package/dist/esm/{types-Du_GH8TU.d.mts → types-Bi1DqOQ-.d.mts} +2 -2
- package/dist/esm/ui/index.d.mts +5 -5
- package/dist/esm/ui/index.mjs +81 -81
- package/dist/novu.min.js +10 -10
- package/dist/novu.min.js.gz +0 -0
- package/package.json +3 -2
|
@@ -66,17 +66,6 @@ declare enum NotificationStatus {
|
|
|
66
66
|
UNREAD = "unread",
|
|
67
67
|
UNSEEN = "unseen"
|
|
68
68
|
}
|
|
69
|
-
declare enum NotificationButton {
|
|
70
|
-
PRIMARY = "primary",
|
|
71
|
-
SECONDARY = "secondary"
|
|
72
|
-
}
|
|
73
|
-
declare enum NotificationActionStatus {
|
|
74
|
-
PENDING = "pending",
|
|
75
|
-
DONE = "done"
|
|
76
|
-
}
|
|
77
|
-
declare enum CtaType {
|
|
78
|
-
REDIRECT = "redirect"
|
|
79
|
-
}
|
|
80
69
|
declare enum PreferenceLevel {
|
|
81
70
|
GLOBAL = "global",
|
|
82
71
|
TEMPLATE = "template"
|
|
@@ -88,55 +77,49 @@ declare enum ChannelType {
|
|
|
88
77
|
CHAT = "chat",
|
|
89
78
|
PUSH = "push"
|
|
90
79
|
}
|
|
91
|
-
declare enum PreferenceOverrideSource {
|
|
92
|
-
SUBSCRIBER = "subscriber",
|
|
93
|
-
TEMPLATE = "template",
|
|
94
|
-
WORKFLOW_OVERRIDE = "workflowOverride"
|
|
95
|
-
}
|
|
96
80
|
declare enum WebSocketEvent {
|
|
97
81
|
RECEIVED = "notification_received",
|
|
98
82
|
UNREAD = "unread_count_changed",
|
|
99
83
|
UNSEEN = "unseen_count_changed"
|
|
100
84
|
}
|
|
101
|
-
declare enum ActionTypeEnum {
|
|
102
|
-
PRIMARY = "primary",
|
|
103
|
-
SECONDARY = "secondary"
|
|
104
|
-
}
|
|
105
85
|
type Session = {
|
|
106
86
|
token: string;
|
|
107
87
|
totalUnreadCount: number;
|
|
108
88
|
removeNovuBranding: boolean;
|
|
109
89
|
isDevelopmentMode: boolean;
|
|
110
90
|
};
|
|
111
|
-
type MessageButton = {
|
|
112
|
-
type: NotificationButton;
|
|
113
|
-
content: string;
|
|
114
|
-
resultContent?: string;
|
|
115
|
-
};
|
|
116
|
-
type MessageAction = {
|
|
117
|
-
status?: NotificationActionStatus;
|
|
118
|
-
buttons?: MessageButton[];
|
|
119
|
-
result: {
|
|
120
|
-
payload?: Record<string, unknown>;
|
|
121
|
-
type?: NotificationButton;
|
|
122
|
-
};
|
|
123
|
-
};
|
|
124
91
|
type Subscriber = {
|
|
125
|
-
id
|
|
92
|
+
id?: string;
|
|
93
|
+
subscriberId: string;
|
|
126
94
|
firstName?: string;
|
|
127
95
|
lastName?: string;
|
|
96
|
+
email?: string;
|
|
97
|
+
phone?: string;
|
|
128
98
|
avatar?: string;
|
|
129
|
-
|
|
99
|
+
locale?: string;
|
|
100
|
+
data?: Record<string, unknown>;
|
|
101
|
+
timezone?: string;
|
|
130
102
|
};
|
|
131
103
|
type Redirect = {
|
|
132
104
|
url: string;
|
|
133
105
|
target?: '_self' | '_blank' | '_parent' | '_top' | '_unfencedTop';
|
|
134
106
|
};
|
|
107
|
+
declare enum ActionTypeEnum {
|
|
108
|
+
PRIMARY = "primary",
|
|
109
|
+
SECONDARY = "secondary"
|
|
110
|
+
}
|
|
135
111
|
type Action = {
|
|
136
112
|
label: string;
|
|
137
113
|
isCompleted: boolean;
|
|
138
114
|
redirect?: Redirect;
|
|
139
115
|
};
|
|
116
|
+
type Workflow = {
|
|
117
|
+
id: string;
|
|
118
|
+
identifier: string;
|
|
119
|
+
name: string;
|
|
120
|
+
critical: boolean;
|
|
121
|
+
tags?: string[];
|
|
122
|
+
};
|
|
140
123
|
type InboxNotification = {
|
|
141
124
|
id: string;
|
|
142
125
|
subject?: string;
|
|
@@ -154,20 +137,13 @@ type InboxNotification = {
|
|
|
154
137
|
tags?: string[];
|
|
155
138
|
data?: NotificationData;
|
|
156
139
|
redirect?: Redirect;
|
|
157
|
-
|
|
140
|
+
workflow?: Workflow;
|
|
158
141
|
};
|
|
159
142
|
type NotificationFilter = {
|
|
160
143
|
tags?: string[];
|
|
161
144
|
read?: boolean;
|
|
162
145
|
archived?: boolean;
|
|
163
146
|
};
|
|
164
|
-
type Workflow = {
|
|
165
|
-
id: string;
|
|
166
|
-
identifier: string;
|
|
167
|
-
name: string;
|
|
168
|
-
critical: boolean;
|
|
169
|
-
tags?: string[];
|
|
170
|
-
};
|
|
171
147
|
type ChannelPreference = {
|
|
172
148
|
email?: boolean;
|
|
173
149
|
sms?: boolean;
|
|
@@ -175,13 +151,6 @@ type ChannelPreference = {
|
|
|
175
151
|
chat?: boolean;
|
|
176
152
|
push?: boolean;
|
|
177
153
|
};
|
|
178
|
-
type PaginatedResponse<T = unknown> = {
|
|
179
|
-
data: T[];
|
|
180
|
-
hasMore: boolean;
|
|
181
|
-
totalCount: number;
|
|
182
|
-
pageSize: number;
|
|
183
|
-
page: number;
|
|
184
|
-
};
|
|
185
154
|
type PreferencesResponse = {
|
|
186
155
|
level: PreferenceLevel;
|
|
187
156
|
enabled: boolean;
|
|
@@ -198,23 +167,28 @@ type IPreferenceOverride = {
|
|
|
198
167
|
channel: ChannelType;
|
|
199
168
|
source: PreferenceOverrideSourceEnum;
|
|
200
169
|
};
|
|
201
|
-
type TODO = any;
|
|
202
170
|
type Result<D = undefined, E = NovuError> = Promise<{
|
|
203
171
|
data?: D;
|
|
204
172
|
error?: E;
|
|
205
173
|
}>;
|
|
206
174
|
type NovuOptions = {
|
|
207
|
-
applicationIdentifier: string;
|
|
208
|
-
subscriberId: string;
|
|
209
|
-
subscriberHash?: string;
|
|
210
175
|
/** @deprecated Use apiUrl instead */
|
|
211
176
|
backendUrl?: string;
|
|
177
|
+
/** @internal Should be used internally for testing purposes */
|
|
178
|
+
__userAgent?: string;
|
|
179
|
+
applicationIdentifier: string;
|
|
180
|
+
subscriberHash?: string;
|
|
212
181
|
apiUrl?: string;
|
|
213
182
|
socketUrl?: string;
|
|
214
183
|
useCache?: boolean;
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
184
|
+
} & ({
|
|
185
|
+
/** @deprecated Use subscriber prop instead */
|
|
186
|
+
subscriberId: string;
|
|
187
|
+
subscriber?: never;
|
|
188
|
+
} | {
|
|
189
|
+
subscriber: Subscriber | string;
|
|
190
|
+
subscriberId?: never;
|
|
191
|
+
});
|
|
218
192
|
type Prettify<T> = {
|
|
219
193
|
[K in keyof T]: T[K];
|
|
220
194
|
} & {};
|
|
@@ -230,10 +204,10 @@ declare class InboxService {
|
|
|
230
204
|
#private;
|
|
231
205
|
isSessionInitialized: boolean;
|
|
232
206
|
constructor(options?: InboxServiceOptions);
|
|
233
|
-
initializeSession({ applicationIdentifier,
|
|
207
|
+
initializeSession({ applicationIdentifier, subscriberHash, subscriber, }: {
|
|
234
208
|
applicationIdentifier: string;
|
|
235
|
-
subscriberId: string;
|
|
236
209
|
subscriberHash?: string;
|
|
210
|
+
subscriber: Subscriber;
|
|
237
211
|
}): Promise<Session>;
|
|
238
212
|
fetchNotifications({ after, archived, limit, offset, read, tags, }: {
|
|
239
213
|
tags?: string[];
|
|
@@ -319,7 +293,7 @@ declare class Notification implements Pick<NovuEventEmitter, 'on'>, InboxNotific
|
|
|
319
293
|
readonly tags: InboxNotification['tags'];
|
|
320
294
|
readonly redirect: InboxNotification['redirect'];
|
|
321
295
|
readonly data?: InboxNotification['data'];
|
|
322
|
-
readonly
|
|
296
|
+
readonly workflow?: InboxNotification['workflow'];
|
|
323
297
|
constructor(notification: InboxNotification, emitter: NovuEventEmitter, inboxService: InboxService);
|
|
324
298
|
read(): Result<Notification>;
|
|
325
299
|
unread(): Result<Notification>;
|
|
@@ -453,7 +427,7 @@ declare class Notifications extends BaseModule {
|
|
|
453
427
|
|
|
454
428
|
type InitializeSessionArgs = {
|
|
455
429
|
applicationIdentifier: string;
|
|
456
|
-
|
|
430
|
+
subscriber: Subscriber;
|
|
457
431
|
subscriberHash?: string;
|
|
458
432
|
};
|
|
459
433
|
|
|
@@ -582,4 +556,4 @@ declare class Novu implements Pick<NovuEventEmitter, 'on'> {
|
|
|
582
556
|
constructor(options: NovuOptions);
|
|
583
557
|
}
|
|
584
558
|
|
|
585
|
-
export {
|
|
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,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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
|
|
|
@@ -100,4 +100,4 @@ declare enum NotificationStatus {
|
|
|
100
100
|
}
|
|
101
101
|
type PreferencesFilter = Pick<NotificationFilter, 'tags'>;
|
|
102
102
|
|
|
103
|
-
export { type Appearance as A, type BellRenderer as B, type
|
|
103
|
+
export { type Appearance as A, type BellRenderer as B, type Elements as E, type Localization as L, type NotificationClickHandler as N, type PreferencesFilter as P, type RouterPush as R, type SubjectRenderer as S, type Tab as T, type Variables as V, type NotificationActionClickHandler as a, type NotificationRenderer as b, type BodyRenderer as c, type NovuProviderProps as d, type BaseNovuProviderProps as e, type AppearanceKey as f, type ElementStyles as g, type LocalizationKey as h, NotificationStatus as i, type Theme as j };
|
package/dist/esm/ui/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
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-
|
|
4
|
-
export { f as AppearanceKey,
|
|
1
|
+
import { g as NovuOptions } from '../novu-jtIKy6p0.mjs';
|
|
2
|
+
export { d as Notification } from '../novu-jtIKy6p0.mjs';
|
|
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-Bi1DqOQ-.mjs';
|
|
4
|
+
export { f as AppearanceKey, g as ElementStyles, E as Elements, h as LocalizationKey, i as NotificationStatus, V as Variables } from '../types-Bi1DqOQ-.mjs';
|
|
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';
|
|
@@ -75,4 +75,4 @@ declare class NovuUI {
|
|
|
75
75
|
unmount(): void;
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
export { Appearance,
|
|
78
|
+
export { Appearance, type BaseNovuUIOptions, BellRenderer, BodyRenderer, InboxPage, type InboxProps, Localization, NotificationActionClickHandler, NotificationClickHandler, NotificationRenderer, NovuProviderProps, NovuUI, type NovuUIOptions, PreferencesFilter, RouterPush, SubjectRenderer, Tab };
|
package/dist/esm/ui/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Novu, isSameFilter } from '../chunk-
|
|
1
|
+
import { Novu, isSameFilter } from '../chunk-3SPOLIN3.mjs';
|
|
2
2
|
import { parseMarkdownIntoTokens } from '../chunk-GPV65U5R.mjs';
|
|
3
3
|
import { __privateAdd, __privateSet, __privateMethod, __privateGet, __spreadProps, __spreadValues, __objRest, __async } from '../chunk-STZMOEWR.mjs';
|
|
4
4
|
import { delegateEvents, createComponent, mergeProps, render, Portal, spread, template, insert, memo, effect, className, use, setAttribute, Dynamic } from 'solid-js/web';
|
|
@@ -11,75 +11,8 @@ import { autoUpdate, offset, flip, shift } from '@floating-ui/dom';
|
|
|
11
11
|
import { useFloating } from 'solid-floating-ui';
|
|
12
12
|
import { Motion as Motion$1 } from 'solid-motionone';
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
locale: "en-US",
|
|
16
|
-
"inbox.filters.dropdownOptions.unread": "Unread only",
|
|
17
|
-
"inbox.filters.dropdownOptions.default": "Unread & read",
|
|
18
|
-
"inbox.filters.dropdownOptions.archived": "Archived",
|
|
19
|
-
"inbox.filters.labels.unread": "Unread",
|
|
20
|
-
"inbox.filters.labels.default": "Inbox",
|
|
21
|
-
"inbox.filters.labels.archived": "Archived",
|
|
22
|
-
"notifications.emptyNotice": "Quiet for now. Check back later.",
|
|
23
|
-
"notifications.actions.readAll": "Mark all as read",
|
|
24
|
-
"notifications.actions.archiveAll": "Archive all",
|
|
25
|
-
"notifications.actions.archiveRead": "Archive read",
|
|
26
|
-
"notifications.newNotifications": ({ notificationCount }) => `${notificationCount > 99 ? "99+" : notificationCount} new ${notificationCount === 1 ? "notification" : "notifications"}`,
|
|
27
|
-
"notification.actions.read.tooltip": "Mark as read",
|
|
28
|
-
"notification.actions.unread.tooltip": "Mark as unread",
|
|
29
|
-
"notification.actions.archive.tooltip": "Archive",
|
|
30
|
-
"notification.actions.unarchive.tooltip": "Unarchive",
|
|
31
|
-
"preferences.title": "Preferences",
|
|
32
|
-
"preferences.emptyNotice": "No notification specific preferences yet.",
|
|
33
|
-
"preferences.global": "Global Preferences",
|
|
34
|
-
"preferences.workflow.disabled.notice": "Contact admin to enable subscription management for this critical notification.",
|
|
35
|
-
"preferences.workflow.disabled.tooltip": "Contact admin to edit"
|
|
36
|
-
};
|
|
37
|
-
var [dynamicLocalization, setDynamicLocalization] = createSignal({});
|
|
38
|
-
|
|
39
|
-
// src/ui/context/LocalizationContext.tsx
|
|
40
|
-
var LocalizationContext = createContext(void 0);
|
|
41
|
-
var LocalizationProvider = (props) => {
|
|
42
|
-
const localization = createMemo(() => {
|
|
43
|
-
const _a = props.localization || {}, {
|
|
44
|
-
dynamic
|
|
45
|
-
} = _a, localizationObject = __objRest(_a, [
|
|
46
|
-
"dynamic"
|
|
47
|
-
]);
|
|
48
|
-
return __spreadValues(__spreadValues(__spreadValues(__spreadValues({}, defaultLocalization), dynamicLocalization()), dynamic || {}), localizationObject);
|
|
49
|
-
});
|
|
50
|
-
const t = (key, ...args) => {
|
|
51
|
-
const value = localization()[key];
|
|
52
|
-
if (typeof value === "function") {
|
|
53
|
-
return value(args[0]);
|
|
54
|
-
}
|
|
55
|
-
return value;
|
|
56
|
-
};
|
|
57
|
-
const locale = createMemo(() => localization().locale);
|
|
58
|
-
return createComponent(LocalizationContext.Provider, {
|
|
59
|
-
value: {
|
|
60
|
-
t,
|
|
61
|
-
locale
|
|
62
|
-
},
|
|
63
|
-
get children() {
|
|
64
|
-
return props.children;
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
};
|
|
68
|
-
function useLocalization() {
|
|
69
|
-
const context = useContext(LocalizationContext);
|
|
70
|
-
if (!context) {
|
|
71
|
-
throw new Error("useLocalization must be used within an LocalizationProvider");
|
|
72
|
-
}
|
|
73
|
-
return context;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// src/ui/types.ts
|
|
77
|
-
var NotificationStatus = /* @__PURE__ */ ((NotificationStatus2) => {
|
|
78
|
-
NotificationStatus2["UNREAD_READ"] = "unreadRead";
|
|
79
|
-
NotificationStatus2["UNREAD"] = "unread";
|
|
80
|
-
NotificationStatus2["ARCHIVED"] = "archived";
|
|
81
|
-
return NotificationStatus2;
|
|
82
|
-
})(NotificationStatus || {});
|
|
14
|
+
// _tt392r98u:/Users/sokratisvidros/Workspace/novu/packages/js/src/ui/index.directcss
|
|
15
|
+
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}`;
|
|
83
16
|
|
|
84
17
|
// src/ui/config/appearanceKeys.ts
|
|
85
18
|
var appearanceKeys = [
|
|
@@ -235,6 +168,30 @@ var appearanceKeys = [
|
|
|
235
168
|
// Text formatting
|
|
236
169
|
"strong"
|
|
237
170
|
];
|
|
171
|
+
var defaultLocalization = {
|
|
172
|
+
locale: "en-US",
|
|
173
|
+
"inbox.filters.dropdownOptions.unread": "Unread only",
|
|
174
|
+
"inbox.filters.dropdownOptions.default": "Unread & read",
|
|
175
|
+
"inbox.filters.dropdownOptions.archived": "Archived",
|
|
176
|
+
"inbox.filters.labels.unread": "Unread",
|
|
177
|
+
"inbox.filters.labels.default": "Inbox",
|
|
178
|
+
"inbox.filters.labels.archived": "Archived",
|
|
179
|
+
"notifications.emptyNotice": "Quiet for now. Check back later.",
|
|
180
|
+
"notifications.actions.readAll": "Mark all as read",
|
|
181
|
+
"notifications.actions.archiveAll": "Archive all",
|
|
182
|
+
"notifications.actions.archiveRead": "Archive read",
|
|
183
|
+
"notifications.newNotifications": ({ notificationCount }) => `${notificationCount > 99 ? "99+" : notificationCount} new ${notificationCount === 1 ? "notification" : "notifications"}`,
|
|
184
|
+
"notification.actions.read.tooltip": "Mark as read",
|
|
185
|
+
"notification.actions.unread.tooltip": "Mark as unread",
|
|
186
|
+
"notification.actions.archive.tooltip": "Archive",
|
|
187
|
+
"notification.actions.unarchive.tooltip": "Unarchive",
|
|
188
|
+
"preferences.title": "Preferences",
|
|
189
|
+
"preferences.emptyNotice": "No notification specific preferences yet.",
|
|
190
|
+
"preferences.global": "Global Preferences",
|
|
191
|
+
"preferences.workflow.disabled.notice": "Contact admin to enable subscription management for this critical notification.",
|
|
192
|
+
"preferences.workflow.disabled.tooltip": "Contact admin to edit"
|
|
193
|
+
};
|
|
194
|
+
var [dynamicLocalization, setDynamicLocalization] = createSignal({});
|
|
238
195
|
|
|
239
196
|
// src/ui/config/defaultVariables.ts
|
|
240
197
|
var defaultVariables = {
|
|
@@ -774,9 +731,9 @@ var useBrowserTabsChannel = ({
|
|
|
774
731
|
onMessage
|
|
775
732
|
}) => {
|
|
776
733
|
const [tabsChannel] = createSignal(new BroadcastChannel(channelName));
|
|
777
|
-
const postMessage = (
|
|
734
|
+
const postMessage = (args) => {
|
|
778
735
|
const channel = tabsChannel();
|
|
779
|
-
channel.postMessage(
|
|
736
|
+
channel.postMessage(args);
|
|
780
737
|
};
|
|
781
738
|
onMount(() => {
|
|
782
739
|
const listener = (event) => {
|
|
@@ -797,7 +754,7 @@ var useWebSocketEvent = ({
|
|
|
797
754
|
eventHandler: onMessage
|
|
798
755
|
}) => {
|
|
799
756
|
const novu = useNovu();
|
|
800
|
-
const channelName = `nv_ws_connection:a=${novu.applicationIdentifier}:s=${novu.subscriberId}`;
|
|
757
|
+
const channelName = `nv_ws_connection:a=${novu.applicationIdentifier}:s=${novu.subscriberId}:e=${webSocketEvent}`;
|
|
801
758
|
const { postMessage } = useBrowserTabsChannel({ channelName, onMessage });
|
|
802
759
|
const updateReadCount = (data) => {
|
|
803
760
|
onMessage(data);
|
|
@@ -816,6 +773,51 @@ var useWebSocketEvent = ({
|
|
|
816
773
|
});
|
|
817
774
|
});
|
|
818
775
|
};
|
|
776
|
+
var LocalizationContext = createContext(void 0);
|
|
777
|
+
var LocalizationProvider = (props) => {
|
|
778
|
+
const localization = createMemo(() => {
|
|
779
|
+
const _a = props.localization || {}, {
|
|
780
|
+
dynamic
|
|
781
|
+
} = _a, localizationObject = __objRest(_a, [
|
|
782
|
+
"dynamic"
|
|
783
|
+
]);
|
|
784
|
+
return __spreadValues(__spreadValues(__spreadValues(__spreadValues({}, defaultLocalization), dynamicLocalization()), dynamic || {}), localizationObject);
|
|
785
|
+
});
|
|
786
|
+
const t = (key, ...args) => {
|
|
787
|
+
const value = localization()[key];
|
|
788
|
+
if (typeof value === "function") {
|
|
789
|
+
return value(args[0]);
|
|
790
|
+
}
|
|
791
|
+
return value;
|
|
792
|
+
};
|
|
793
|
+
const locale = createMemo(() => localization().locale);
|
|
794
|
+
return createComponent(LocalizationContext.Provider, {
|
|
795
|
+
value: {
|
|
796
|
+
t,
|
|
797
|
+
locale
|
|
798
|
+
},
|
|
799
|
+
get children() {
|
|
800
|
+
return props.children;
|
|
801
|
+
}
|
|
802
|
+
});
|
|
803
|
+
};
|
|
804
|
+
function useLocalization() {
|
|
805
|
+
const context = useContext(LocalizationContext);
|
|
806
|
+
if (!context) {
|
|
807
|
+
throw new Error("useLocalization must be used within an LocalizationProvider");
|
|
808
|
+
}
|
|
809
|
+
return context;
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
// src/ui/types.ts
|
|
813
|
+
var NotificationStatus = /* @__PURE__ */ ((NotificationStatus2) => {
|
|
814
|
+
NotificationStatus2["UNREAD_READ"] = "unreadRead";
|
|
815
|
+
NotificationStatus2["UNREAD"] = "unread";
|
|
816
|
+
NotificationStatus2["ARCHIVED"] = "archived";
|
|
817
|
+
return NotificationStatus2;
|
|
818
|
+
})(NotificationStatus || {});
|
|
819
|
+
|
|
820
|
+
// src/ui/context/InboxContext.tsx
|
|
819
821
|
var InboxContext = createContext(void 0);
|
|
820
822
|
var STATUS_TO_FILTER = {
|
|
821
823
|
["unreadRead" /* UNREAD_READ */]: {
|
|
@@ -4480,11 +4482,10 @@ var Renderer = (props) => {
|
|
|
4480
4482
|
if (el) {
|
|
4481
4483
|
return;
|
|
4482
4484
|
}
|
|
4483
|
-
const
|
|
4484
|
-
|
|
4485
|
-
|
|
4486
|
-
|
|
4487
|
-
document.head.insertBefore(link, document.head.firstChild);
|
|
4485
|
+
const styleEl = document.createElement("style");
|
|
4486
|
+
styleEl.id = id;
|
|
4487
|
+
document.head.insertBefore(styleEl, document.head.firstChild);
|
|
4488
|
+
styleEl.innerHTML = ui_default;
|
|
4488
4489
|
onCleanup(() => {
|
|
4489
4490
|
const element = document.getElementById(id);
|
|
4490
4491
|
element == null ? void 0 : element.remove();
|
|
@@ -4571,8 +4572,8 @@ var Renderer = (props) => {
|
|
|
4571
4572
|
}
|
|
4572
4573
|
});
|
|
4573
4574
|
};
|
|
4574
|
-
|
|
4575
|
-
|
|
4575
|
+
|
|
4576
|
+
// src/ui/novuUI.tsx
|
|
4576
4577
|
var _dispose, _rootElement, _mountedElements, _setMountedElements, _appearance, _setAppearance, _localization, _setLocalization, _options, _setOptions, _tabs, _setTabs, _routerPush, _setRouterPush, _preferencesFilter, _setPreferencesFilter, _predefinedNovu, _NovuUI_instances, mountComponentRenderer_fn, updateComponentProps_fn;
|
|
4577
4578
|
var NovuUI = class {
|
|
4578
4579
|
constructor(props) {
|
|
@@ -4697,7 +4698,6 @@ mountComponentRenderer_fn = function() {
|
|
|
4697
4698
|
const dispose = render(() => {
|
|
4698
4699
|
const _self$ = this;
|
|
4699
4700
|
return createComponent(Renderer, {
|
|
4700
|
-
cssHref,
|
|
4701
4701
|
novuUI: _self$,
|
|
4702
4702
|
get nodes() {
|
|
4703
4703
|
var _a;
|