@burdenoff/fe-libs 2026.527.2 → 2026.527.4

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.
Files changed (161) hide show
  1. package/dist/button/Button.js +18 -16
  2. package/dist/chrome/AccountSwitcher.js +10 -7
  3. package/dist/chrome/AutoBreadcrumbs.js +2 -0
  4. package/dist/chrome/Breadcrumbs.js +2 -0
  5. package/dist/chrome/CommandPalette.js +5 -3
  6. package/dist/chrome/ContextSwitcher.js +90 -338
  7. package/dist/chrome/DynamicFooter.js +7 -7
  8. package/dist/chrome/Footer.js +5 -5
  9. package/dist/chrome/GeographySwitcher.js +3 -3
  10. package/dist/chrome/GlobalSearch.js +73 -448
  11. package/dist/chrome/HeaderBar.js +6 -1
  12. package/dist/chrome/LanguagePickerSheet.js +1 -1
  13. package/dist/chrome/LanguageSwitcher.js +2 -2
  14. package/dist/chrome/NotificationCenter.js +69 -694
  15. package/dist/chrome/PanelTabs.js +7 -4
  16. package/dist/chrome/PluginContextMenuTarget.js +1 -1
  17. package/dist/chrome/ProductPickerSheet.js +4 -4
  18. package/dist/chrome/ProductSideNav.js +1 -1
  19. package/dist/chrome/ProductSwitcher.js +3 -3
  20. package/dist/chrome/ProfileSwitcher.js +13 -8
  21. package/dist/chrome/ShortcutHelpDialog.js +2 -1
  22. package/dist/chrome/SideNavigation.js +75 -239
  23. package/dist/chrome/Sidebar.js +1 -0
  24. package/dist/chrome/contextSwitcher/EmptyState.js +32 -0
  25. package/dist/chrome/contextSwitcher/OrganizationList.js +34 -0
  26. package/dist/chrome/contextSwitcher/ProjectList.js +34 -0
  27. package/dist/chrome/contextSwitcher/SearchInput.js +50 -0
  28. package/dist/chrome/contextSwitcher/TabButton.js +9 -0
  29. package/dist/chrome/contextSwitcher/TriggerButton.js +38 -0
  30. package/dist/chrome/contextSwitcher/WorkspaceList.js +34 -0
  31. package/dist/chrome/contextSwitcher/icons.js +58 -0
  32. package/dist/chrome/contextSwitcher/useIsMobile.js +11 -0
  33. package/dist/chrome/globalSearch/AdvancedFiltersPanel.js +253 -0
  34. package/dist/chrome/globalSearch/CategoryTabs.js +28 -0
  35. package/dist/chrome/globalSearch/ResultsList.js +58 -0
  36. package/dist/chrome/globalSearch/SearchInput.js +28 -0
  37. package/dist/chrome/globalSearch/SearchModeBar.js +36 -0
  38. package/dist/chrome/globalSearch/useAdvancedFilters.js +78 -0
  39. package/dist/chrome/globalSearch/utils.js +22 -0
  40. package/dist/chrome/notificationCenter/BellButton.js +27 -0
  41. package/dist/chrome/notificationCenter/NotificationCardItem.js +129 -0
  42. package/dist/chrome/notificationCenter/NotificationFilters.js +67 -0
  43. package/dist/chrome/notificationCenter/NotificationFooter.js +23 -0
  44. package/dist/chrome/notificationCenter/NotificationHeader.js +75 -0
  45. package/dist/chrome/notificationCenter/NotificationList.js +75 -0
  46. package/dist/chrome/notificationCenter/NotificationPanel.js +19 -0
  47. package/dist/chrome/notificationCenter/SkeletonCard.js +18 -0
  48. package/dist/chrome/notificationCenter/constants.js +93 -0
  49. package/dist/chrome/notificationCenter/gql.js +58 -0
  50. package/dist/chrome/notificationCenter/useNotificationCenter.js +149 -0
  51. package/dist/chrome/notificationCenter/usePanelChrome.js +36 -0
  52. package/dist/chrome/sideNavigation/CollapseToggle.js +29 -0
  53. package/dist/chrome/sideNavigation/MobileActionsBar.js +25 -0
  54. package/dist/chrome/sideNavigation/NavItemRenderer.js +79 -0
  55. package/dist/chrome/sideNavigation/SidebarHeader.js +29 -0
  56. package/dist/chrome/sideNavigation/helpers.js +19 -0
  57. package/dist/chrome/sideNavigation/useSideNavigationState.js +45 -0
  58. package/dist/form/Checkbox.js +17 -15
  59. package/dist/form/FormDescription.js +9 -10
  60. package/dist/form/FormField.js +11 -12
  61. package/dist/form/FormLabel.js +13 -13
  62. package/dist/form/FormMessage.js +10 -11
  63. package/dist/form/Input.js +11 -10
  64. package/dist/form/Radio.js +25 -21
  65. package/dist/form/Select.js +81 -66
  66. package/dist/form/Textarea.js +10 -9
  67. package/dist/shared/components/AccessDenied.js +8 -4
  68. package/dist/shared/components/AppErrorBoundary.js +2 -0
  69. package/dist/shared/components/ContextConversationWidget.js +173 -767
  70. package/dist/shared/components/ErrorFallback.js +3 -0
  71. package/dist/shared/components/PWAInstallBanner.js +8 -4
  72. package/dist/shared/components/RequireAuth.js +4 -4
  73. package/dist/shared/components/SSORedirectGuard.js +1 -1
  74. package/dist/shared/components/contextConversationWidget/Composer.js +66 -0
  75. package/dist/shared/components/contextConversationWidget/MessageItem.js +124 -0
  76. package/dist/shared/components/contextConversationWidget/MessageList.js +32 -0
  77. package/dist/shared/components/contextConversationWidget/NoWorkspaceCard.js +19 -0
  78. package/dist/shared/components/contextConversationWidget/PendingAttachmentsBar.js +28 -0
  79. package/dist/shared/components/contextConversationWidget/ReplyBanner.js +32 -0
  80. package/dist/shared/components/contextConversationWidget/WidgetHeader.js +70 -0
  81. package/dist/shared/components/contextConversationWidget/queries.js +197 -0
  82. package/dist/shared/components/contextConversationWidget/types.js +10 -0
  83. package/dist/shared/components/contextConversationWidget/useAttachmentUpload.js +57 -0
  84. package/dist/shared/components/contextConversationWidget/useConversationSubscriptions.js +26 -0
  85. package/dist/shared/components/contextConversationWidget/useMessageActions.js +34 -0
  86. package/dist/shared/components/contextConversationWidget/useSendMessage.js +45 -0
  87. package/dist/shared/components/contextConversationWidget/useWidgetMessages.js +44 -0
  88. package/dist/shared/components/contextConversationWidget/utils.js +56 -0
  89. package/dist/shared/feature-flags/FeatureFlagProvider.js +21 -21
  90. package/dist/shared/geography/GeographyProvider.js +20 -20
  91. package/dist/shared/graphql/GatewayContext.js +1 -1
  92. package/dist/shared/motion/MotionList.js +1 -1
  93. package/dist/shared/pages/AiPage.js +3 -3
  94. package/dist/shared/pages/SearchPage.js +293 -1071
  95. package/dist/shared/pages/searchPage/ActiveFilterChips.js +176 -0
  96. package/dist/shared/pages/searchPage/FiltersPanel.js +329 -0
  97. package/dist/shared/pages/searchPage/ResultsList.js +119 -0
  98. package/dist/shared/pages/searchPage/ResultsStatus.js +32 -0
  99. package/dist/shared/pages/searchPage/SearchInput.js +31 -0
  100. package/dist/shared/pages/searchPage/SearchPagination.js +37 -0
  101. package/dist/shared/pages/searchPage/SearchToolbar.js +58 -0
  102. package/dist/shared/pages/searchPage/constants.js +155 -0
  103. package/dist/shared/pages/searchPage/utils.js +24 -0
  104. package/dist/shared/plugins/PluginRuntimeProvider.js +1 -1
  105. package/dist/shared/providers/shell/ActiveContextProvider.js +12 -12
  106. package/dist/shared/providers/shell/AppShellContext.js +1 -1
  107. package/dist/shared/providers/shell/AuthProvider.js +130 -384
  108. package/dist/shared/providers/shell/AuthTokenProvider.js +6 -6
  109. package/dist/shared/providers/shell/ContextManagerProvider.js +1 -1
  110. package/dist/shared/providers/shell/FeatureFlagsProvider.js +5 -5
  111. package/dist/shared/providers/shell/GlobalUiProvider.js +17 -17
  112. package/dist/shared/providers/shell/I18nProvider.js +15 -15
  113. package/dist/shared/providers/shell/PageConversationContextProvider.js +14 -14
  114. package/dist/shared/providers/shell/PermissionProvider.js +16 -16
  115. package/dist/shared/providers/shell/ShellUiProvider.js +13 -13
  116. package/dist/shared/providers/shell/ThemeProvider.js +9 -9
  117. package/dist/shared/providers/shell/authProvider/bridgeStateSync.js +34 -0
  118. package/dist/shared/providers/shell/authProvider/jwt.js +13 -0
  119. package/dist/shared/providers/shell/authProvider/ssoRelay.js +38 -0
  120. package/dist/shared/providers/shell/authProvider/useAuthActions.js +170 -0
  121. package/dist/shared/providers/shell/authProvider/useBridgeInitialization.js +86 -0
  122. package/dist/shared/providers/shell/authProvider/useRemoteSLO.js +32 -0
  123. package/dist/shared/providers/shell/authProvider/useStorageSync.js +35 -0
  124. package/dist/shared/providers/shell/authProvider/useTokenExpiryTimer.js +37 -0
  125. package/dist/shared/tours/TourPlayer.js +1 -0
  126. package/dist/shared/tours/TourPlayerProvider.js +1 -1
  127. package/dist/shared/tours/TourTooltip.js +3 -0
  128. package/dist/shared/tours/TourTrigger.js +86 -259
  129. package/dist/shared/tours/ToursContext.js +108 -398
  130. package/dist/shared/tours/tourTrigger/DesktopTourDropdown.js +48 -0
  131. package/dist/shared/tours/tourTrigger/MobileTourSheet.js +68 -0
  132. package/dist/shared/tours/tourTrigger/TourListItemDesktop.js +36 -0
  133. package/dist/shared/tours/tourTrigger/TourListItemMobile.js +47 -0
  134. package/dist/shared/tours/tourTrigger/TourStatusChip.js +30 -0
  135. package/dist/shared/tours/tourTrigger/TourTriggerButton.js +22 -0
  136. package/dist/shared/tours/toursContext/errors.js +18 -0
  137. package/dist/shared/tours/toursContext/gql.js +152 -0
  138. package/dist/shared/tours/toursContext/route.js +20 -0
  139. package/dist/shared/tours/toursContext/session.js +19 -0
  140. package/dist/shared/tours/toursContext/useIdleReady.js +18 -0
  141. package/dist/shared/tours/toursContext/useTourMutations.js +118 -0
  142. package/dist/shared-events.js +3 -3
  143. package/dist/shared-hooks.js +1 -1
  144. package/dist/storage/SaveToFilesButton.js +3 -3
  145. package/dist/storage/SaveToFilesDialog.js +1 -1
  146. package/dist/tag/TagBadge.js +1 -1
  147. package/dist/tag/TagsWidget.js +81 -226
  148. package/dist/tag/tagsWidget/AddTagTrigger.js +14 -0
  149. package/dist/tag/tagsWidget/TagBadgeList.js +17 -0
  150. package/dist/tag/tagsWidget/TagSearchPopover.js +80 -0
  151. package/dist/tag/tagsWidget/operations.js +64 -0
  152. package/dist/tag/tagsWidget/useVocabResolver.js +30 -0
  153. package/dist/ui/card.js +44 -39
  154. package/dist/ui/dropdown-menu.js +82 -66
  155. package/dist/ui/input.js +10 -10
  156. package/dist/ui/label.js +13 -11
  157. package/dist/ui/select.js +80 -66
  158. package/dist/ui/table.js +61 -54
  159. package/dist/ui/textarea.js +9 -9
  160. package/dist/ui/tooltip.js +13 -11
  161. package/package.json +1 -1
@@ -0,0 +1,28 @@
1
+ import { Search as e, X as t } from "lucide-react";
2
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
3
+ //#region src/chrome/globalSearch/SearchInput.tsx
4
+ function i({ value: i, placeholder: a, onChange: o, onClear: s }) {
5
+ return /* @__PURE__ */ r("div", {
6
+ className: "flex items-center border-b px-3",
7
+ children: [
8
+ /* @__PURE__ */ n(e, { className: "size-4 mr-2 flex-shrink-0 opacity-50" }),
9
+ /* @__PURE__ */ n("input", {
10
+ type: "text",
11
+ placeholder: a,
12
+ value: i,
13
+ onChange: (e) => o(e.target.value),
14
+ className: "flex-1 bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground",
15
+ autoFocus: !0
16
+ }),
17
+ i && /* @__PURE__ */ n("button", {
18
+ type: "button",
19
+ onClick: s,
20
+ className: "ml-2 rounded-sm opacity-70 hover:opacity-100",
21
+ "aria-label": "Clear search",
22
+ children: /* @__PURE__ */ n(t, { className: "size-4" })
23
+ })
24
+ ]
25
+ });
26
+ }
27
+ //#endregion
28
+ export { i as SearchInput };
@@ -0,0 +1,36 @@
1
+ import { cn as e } from "../../utils/cn.js";
2
+ import "../../utils/index.js";
3
+ import { ChevronDown as t, ChevronUp as n, SlidersHorizontal as r } from "lucide-react";
4
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
5
+ //#region src/chrome/globalSearch/SearchModeBar.tsx
6
+ function o({ searchMode: o, onSearchModeChange: s, showAdvanced: c, onToggleAdvanced: l }) {
7
+ return /* @__PURE__ */ a("div", {
8
+ className: "flex items-center justify-between px-3 py-1.5 border-b",
9
+ children: [/* @__PURE__ */ i("div", {
10
+ className: "flex items-center gap-1",
11
+ children: [
12
+ "PARTIAL",
13
+ "FULLTEXT",
14
+ "EXACT"
15
+ ].map((t) => /* @__PURE__ */ i("button", {
16
+ type: "button",
17
+ onClick: () => s(t),
18
+ className: e("px-2 py-1 text-[10px] font-medium rounded transition-colors", o === t ? "bg-primary text-primary-foreground" : "bg-muted/60 text-muted-foreground hover:bg-muted"),
19
+ title: t === "PARTIAL" ? "Autocomplete — matches prefixes and substrings" : t === "FULLTEXT" ? "Full-text — BM25 word matching with stemming" : "Exact — all search terms must appear",
20
+ children: t === "PARTIAL" ? "Partial" : t === "FULLTEXT" ? "Fulltext" : "Exact"
21
+ }, t))
22
+ }), /* @__PURE__ */ a("button", {
23
+ type: "button",
24
+ onClick: l,
25
+ className: "flex items-center gap-1 px-2 py-1 text-[10px] font-medium text-muted-foreground rounded hover:bg-muted transition-colors",
26
+ "aria-expanded": c,
27
+ children: [
28
+ /* @__PURE__ */ i(r, { className: "size-3" }),
29
+ "Filters",
30
+ i(c ? n : t, { className: "size-3" })
31
+ ]
32
+ })]
33
+ });
34
+ }
35
+ //#endregion
36
+ export { o as SearchModeBar };
@@ -0,0 +1,78 @@
1
+ import { splitCsv as e } from "./utils.js";
2
+ import { useCallback as t, useState as n } from "react";
3
+ //#region src/chrome/globalSearch/useAdvancedFilters.ts
4
+ function r() {
5
+ let [r, i] = n("PARTIAL"), [a, o] = n("SCORE_DESC"), [s, c] = n(""), [l, u] = n(""), [d, f] = n(""), [p, m] = n(""), [h, g] = n(""), [_, v] = n(""), [y, b] = n(""), [x, S] = n(""), [C, w] = n(""), [T, E] = n(""), [D, O] = n(""), [k, A] = n(""), [j, M] = n(""), [N, P] = n("EQUALS");
6
+ return {
7
+ searchMode: r,
8
+ setSearchMode: i,
9
+ sortBy: a,
10
+ setSortBy: o,
11
+ productSourcesInput: s,
12
+ setProductSourcesInput: c,
13
+ projectId: l,
14
+ setProjectId: u,
15
+ createdBy: d,
16
+ setCreatedBy: f,
17
+ updatedBy: p,
18
+ setUpdatedBy: m,
19
+ dateFrom: h,
20
+ setDateFrom: g,
21
+ dateTo: _,
22
+ setDateTo: v,
23
+ updatedDateFrom: y,
24
+ setUpdatedDateFrom: b,
25
+ updatedDateTo: x,
26
+ setUpdatedDateTo: S,
27
+ tagKeysInput: C,
28
+ setTagKeysInput: w,
29
+ tagIdsInput: T,
30
+ setTagIdsInput: E,
31
+ tagPathsInput: D,
32
+ setTagPathsInput: O,
33
+ metadataKey: k,
34
+ setMetadataKey: A,
35
+ metadataValue: j,
36
+ setMetadataValue: M,
37
+ metadataOperator: N,
38
+ setMetadataOperator: P,
39
+ reset: t(() => {
40
+ i("PARTIAL"), o("SCORE_DESC"), c(""), u(""), f(""), m(""), g(""), v(""), b(""), S(""), w(""), E(""), O(""), A(""), M(""), P("EQUALS");
41
+ }, []),
42
+ buildFilters: t(() => {
43
+ let t = { searchMode: r };
44
+ a !== "SCORE_DESC" && (t.sortBy = a);
45
+ let n = e(s);
46
+ n.length > 0 && (t.productSources = n), l.trim() && (t.projectId = l.trim()), d.trim() && (t.createdBy = d.trim()), p.trim() && (t.updatedBy = p.trim()), (h || _) && (t.dateRange = {}, h && (t.dateRange.from = new Date(h).toISOString()), _ && (t.dateRange.to = new Date(_).toISOString())), (y || x) && (t.updatedDateRange = {}, y && (t.updatedDateRange.from = new Date(y).toISOString()), x && (t.updatedDateRange.to = new Date(x).toISOString()));
47
+ let i = e(T), o = e(C), c = e(D);
48
+ return (i.length > 0 || o.length > 0 || c.length > 0) && (t.tagFilter = {
49
+ tagIds: i.length > 0 ? i : void 0,
50
+ tagKeys: o.length > 0 ? o : void 0,
51
+ hierarchyPaths: c.length > 0 ? c : void 0
52
+ }), k.trim() && j.trim() && (t.metadataConditions = [{
53
+ key: k.trim(),
54
+ value: j.trim(),
55
+ operator: N
56
+ }]), t;
57
+ }, [
58
+ d,
59
+ h,
60
+ _,
61
+ k,
62
+ N,
63
+ j,
64
+ s,
65
+ l,
66
+ r,
67
+ a,
68
+ T,
69
+ C,
70
+ D,
71
+ p,
72
+ y,
73
+ x
74
+ ])
75
+ };
76
+ }
77
+ //#endregion
78
+ export { r as useAdvancedFilters };
@@ -0,0 +1,22 @@
1
+ //#region src/chrome/globalSearch/utils.ts
2
+ function e(e, t) {
3
+ let n;
4
+ return (...r) => {
5
+ n !== void 0 && clearTimeout(n), n = setTimeout(() => {
6
+ e(...r);
7
+ }, t);
8
+ };
9
+ }
10
+ function t(e) {
11
+ return e.split(",").map((e) => e.trim()).filter(Boolean);
12
+ }
13
+ function n(e) {
14
+ if (typeof e != "object" || !e) return !1;
15
+ let t = e;
16
+ return typeof t.id == "string" && typeof t.title == "string" && typeof t.category == "string" && typeof t.href == "string" && (t.description === void 0 || typeof t.description == "string");
17
+ }
18
+ function r(e) {
19
+ return Array.isArray(e) && e.every(n);
20
+ }
21
+ //#endregion
22
+ export { e as debounce, r as isSearchResults, t as splitCsv };
@@ -0,0 +1,27 @@
1
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
+ //#region src/chrome/notificationCenter/BellButton.tsx
3
+ var n = ({ unreadCount: n, isOpen: r, onToggle: i }) => /* @__PURE__ */ t("button", {
4
+ type: "button",
5
+ onClick: i,
6
+ className: "relative p-2 hover:bg-action-ghost-bg-hover rounded-button text-text-primary",
7
+ "aria-label": `Notifications${n > 0 ? ` (${n} unread)` : ""}`,
8
+ "aria-expanded": r,
9
+ "aria-haspopup": "true",
10
+ children: [/* @__PURE__ */ e("svg", {
11
+ className: "w-icon-md h-icon-md",
12
+ fill: "none",
13
+ stroke: "currentColor",
14
+ viewBox: "0 0 24 24",
15
+ children: /* @__PURE__ */ e("path", {
16
+ strokeLinecap: "round",
17
+ strokeLinejoin: "round",
18
+ strokeWidth: 2,
19
+ d: "M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9"
20
+ })
21
+ }), n > 0 && /* @__PURE__ */ e("span", {
22
+ className: "absolute -top-0.5 -right-0.5 flex items-center justify-center min-w-[18px] h-[18px] px-1 text-[10px] font-bold text-action-primary-text bg-action-primary-bg rounded-full border-2 border-bg-elevated",
23
+ children: n > 9 ? "9+" : n
24
+ })]
25
+ });
26
+ //#endregion
27
+ export { n as BellButton };
@@ -0,0 +1,129 @@
1
+ import { PRIORITY_CONFIG as e, TYPE_CONFIG as t, formatRelativeTime as n } from "./constants.js";
2
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
3
+ //#region src/chrome/notificationCenter/NotificationCardItem.tsx
4
+ var a = ({ notification: a, onMarkAsRead: o, onDelete: s, onRedirect: c }) => {
5
+ let { id: l, title: u, message: d, type: f, priority: p, appName: m, redirectUrl: h, isRead: g, createdAt: _ } = a, v = e[p] ?? e.MEDIUM, y = t[f] ?? {
6
+ icon: "🔔",
7
+ label: f
8
+ };
9
+ return /* @__PURE__ */ i("div", {
10
+ className: `group relative flex gap-3 p-3 rounded-card border transition-all duration-150 cursor-pointer ${g ? "bg-bg-canvas border-border-subtle" : "bg-bg-elevated border-border-default shadow-sm"} hover:bg-action-ghost-bg-hover`,
11
+ onClick: () => {
12
+ g || o(l), h && c(h);
13
+ },
14
+ role: "button",
15
+ tabIndex: 0,
16
+ onKeyDown: (e) => {
17
+ (e.key === "Enter" || e.key === " ") && (e.preventDefault(), g || o(l), h && c(h));
18
+ },
19
+ children: [
20
+ !g && /* @__PURE__ */ r("div", { className: "absolute top-3 left-1.5 size-2 rounded-full bg-action-primary-bg" }),
21
+ /* @__PURE__ */ r("div", {
22
+ className: "flex-shrink-0 mt-0.5 ml-2",
23
+ children: /* @__PURE__ */ r("span", {
24
+ className: "text-base",
25
+ "aria-hidden": "true",
26
+ children: y.icon
27
+ })
28
+ }),
29
+ /* @__PURE__ */ i("div", {
30
+ className: "flex-1 min-w-0",
31
+ children: [
32
+ /* @__PURE__ */ i("div", {
33
+ className: "flex items-start justify-between gap-2",
34
+ children: [/* @__PURE__ */ r("h4", {
35
+ className: `text-sm truncate ${g ? "font-normal text-text-secondary" : "font-semibold text-text-primary"}`,
36
+ children: u
37
+ }), /* @__PURE__ */ i("div", {
38
+ className: "flex-shrink-0 flex items-center gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity",
39
+ children: [!g && /* @__PURE__ */ r("button", {
40
+ type: "button",
41
+ onClick: (e) => {
42
+ e.stopPropagation(), o(l);
43
+ },
44
+ className: "p-1 rounded hover:bg-bg-muted text-text-tertiary hover:text-text-primary",
45
+ title: "Mark as read",
46
+ "aria-label": "Mark as read",
47
+ children: /* @__PURE__ */ r("svg", {
48
+ className: "size-3.5",
49
+ fill: "none",
50
+ stroke: "currentColor",
51
+ viewBox: "0 0 24 24",
52
+ children: /* @__PURE__ */ r("path", {
53
+ strokeLinecap: "round",
54
+ strokeLinejoin: "round",
55
+ strokeWidth: 2,
56
+ d: "M5 13l4 4L19 7"
57
+ })
58
+ })
59
+ }), /* @__PURE__ */ r("button", {
60
+ type: "button",
61
+ onClick: (e) => {
62
+ e.stopPropagation(), s(l);
63
+ },
64
+ className: "p-1 rounded hover:bg-bg-muted text-text-tertiary hover:text-status-error-text",
65
+ title: "Dismiss",
66
+ "aria-label": "Dismiss notification",
67
+ children: /* @__PURE__ */ r("svg", {
68
+ className: "size-3.5",
69
+ fill: "none",
70
+ stroke: "currentColor",
71
+ viewBox: "0 0 24 24",
72
+ children: /* @__PURE__ */ r("path", {
73
+ strokeLinecap: "round",
74
+ strokeLinejoin: "round",
75
+ strokeWidth: 2,
76
+ d: "M6 18L18 6M6 6l12 12"
77
+ })
78
+ })
79
+ })]
80
+ })]
81
+ }),
82
+ /* @__PURE__ */ r("p", {
83
+ className: "text-xs text-text-secondary line-clamp-2 mt-0.5",
84
+ children: d
85
+ }),
86
+ /* @__PURE__ */ i("div", {
87
+ className: "flex items-center gap-2 mt-1.5 flex-wrap",
88
+ children: [
89
+ /* @__PURE__ */ r("span", {
90
+ className: `inline-flex items-center px-1.5 py-0.5 text-[10px] font-medium rounded ${v.bgColor} ${v.color}`,
91
+ children: v.label
92
+ }),
93
+ m && /* @__PURE__ */ r("span", {
94
+ className: "inline-flex items-center px-1.5 py-0.5 text-[10px] font-medium rounded bg-bg-muted text-text-tertiary",
95
+ children: m
96
+ }),
97
+ /* @__PURE__ */ r("span", {
98
+ className: "text-[10px] text-text-tertiary",
99
+ children: n(_)
100
+ }),
101
+ h && /* @__PURE__ */ i("button", {
102
+ type: "button",
103
+ onClick: (e) => {
104
+ e.stopPropagation(), c(h);
105
+ },
106
+ className: "inline-flex items-center gap-0.5 text-[10px] text-action-primary-bg hover:underline",
107
+ "aria-label": "Open link",
108
+ children: ["Open", /* @__PURE__ */ r("svg", {
109
+ className: "size-2.5",
110
+ fill: "none",
111
+ stroke: "currentColor",
112
+ viewBox: "0 0 24 24",
113
+ children: /* @__PURE__ */ r("path", {
114
+ strokeLinecap: "round",
115
+ strokeLinejoin: "round",
116
+ strokeWidth: 2,
117
+ d: "M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"
118
+ })
119
+ })]
120
+ })
121
+ ]
122
+ })
123
+ ]
124
+ })
125
+ ]
126
+ });
127
+ };
128
+ //#endregion
129
+ export { a as NotificationCardItem };
@@ -0,0 +1,67 @@
1
+ import { FILTER_TABS as e, TYPE_CONFIG as t, TYPE_FILTERS as n } from "./constants.js";
2
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
3
+ //#region src/chrome/notificationCenter/NotificationFilters.tsx
4
+ var a = ({ filterTab: a, typeFilter: o, appFilter: s, sortBy: c, appNames: l, onFilterTabChange: u, onTypeFilterChange: d, onAppFilterChange: f, onSortByChange: p }) => /* @__PURE__ */ i("div", {
5
+ className: "px-4 pt-3 pb-2 space-y-2 border-b border-border-subtle",
6
+ children: [
7
+ /* @__PURE__ */ r("div", {
8
+ className: "flex gap-1",
9
+ children: e.map((e) => /* @__PURE__ */ r("button", {
10
+ onClick: () => u(e.value),
11
+ className: `px-3 py-1 text-xs font-medium rounded-full transition-colors ${a === e.value ? "bg-action-primary-bg text-action-primary-text" : "bg-bg-muted text-text-secondary hover:bg-action-ghost-bg-hover"}`,
12
+ children: e.label
13
+ }, e.value))
14
+ }),
15
+ /* @__PURE__ */ i("div", {
16
+ className: "flex flex-wrap items-center gap-1",
17
+ children: [n.map((e) => /* @__PURE__ */ i("button", {
18
+ onClick: () => d(e.value),
19
+ className: `px-2 py-0.5 text-[11px] font-medium rounded-full whitespace-nowrap transition-colors ${o === e.value ? "bg-bg-elevated text-text-primary border border-border-default" : "text-text-tertiary hover:text-text-secondary hover:bg-bg-muted"}`,
20
+ children: [e.value !== "ALL" && t[e.value] && /* @__PURE__ */ r("span", {
21
+ className: "mr-0.5",
22
+ children: t[e.value].icon
23
+ }), e.label]
24
+ }, e.value)), /* @__PURE__ */ i("select", {
25
+ value: c,
26
+ onChange: (e) => p(e.target.value),
27
+ className: "ml-auto text-[11px] text-text-secondary bg-transparent border-none cursor-pointer focus:outline-none",
28
+ "aria-label": "Sort notifications",
29
+ children: [
30
+ /* @__PURE__ */ r("option", {
31
+ value: "newest",
32
+ children: "Newest"
33
+ }),
34
+ /* @__PURE__ */ r("option", {
35
+ value: "oldest",
36
+ children: "Oldest"
37
+ }),
38
+ /* @__PURE__ */ r("option", {
39
+ value: "priority",
40
+ children: "Priority"
41
+ })
42
+ ]
43
+ })]
44
+ }),
45
+ l.length > 1 && /* @__PURE__ */ i("div", {
46
+ className: "flex flex-wrap gap-1",
47
+ children: [/* @__PURE__ */ r("button", {
48
+ onClick: () => f("ALL"),
49
+ className: `px-2 py-0.5 text-[11px] font-medium rounded-full whitespace-nowrap transition-colors ${s === "ALL" ? "bg-bg-elevated text-text-primary border border-border-default" : "text-text-tertiary hover:text-text-secondary hover:bg-bg-muted"}`,
50
+ children: "All Apps"
51
+ }), l.map(([e, t]) => /* @__PURE__ */ i("button", {
52
+ onClick: () => f(e),
53
+ className: `px-2 py-0.5 text-[11px] font-medium rounded-full whitespace-nowrap transition-colors ${s === e ? "bg-bg-elevated text-text-primary border border-border-default" : "text-text-tertiary hover:text-text-secondary hover:bg-bg-muted"}`,
54
+ children: [e, /* @__PURE__ */ i("span", {
55
+ className: "ml-1 text-text-tertiary",
56
+ children: [
57
+ "(",
58
+ t,
59
+ ")"
60
+ ]
61
+ })]
62
+ }, e))]
63
+ })
64
+ ]
65
+ });
66
+ //#endregion
67
+ export { a as NotificationFilters };
@@ -0,0 +1,23 @@
1
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
+ //#region src/chrome/notificationCenter/NotificationFooter.tsx
3
+ var n = ({ totalCount: n, onViewAll: r }) => /* @__PURE__ */ e("div", {
4
+ className: "p-3 border-t border-border-subtle",
5
+ children: /* @__PURE__ */ t("div", {
6
+ className: "flex items-center justify-between",
7
+ children: [/* @__PURE__ */ t("span", {
8
+ className: "text-[11px] text-text-tertiary",
9
+ children: [
10
+ n,
11
+ " notification",
12
+ n === 1 ? "" : "s"
13
+ ]
14
+ }), r && /* @__PURE__ */ e("button", {
15
+ type: "button",
16
+ onClick: r,
17
+ className: "text-xs text-action-primary-bg hover:underline font-medium",
18
+ children: "View All"
19
+ })]
20
+ })
21
+ });
22
+ //#endregion
23
+ export { n as NotificationFooter };
@@ -0,0 +1,75 @@
1
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
+ //#region src/chrome/notificationCenter/NotificationHeader.tsx
3
+ var n = ({ isMobile: n, unreadCount: r, onClose: i, onMarkAllAsRead: a }) => /* @__PURE__ */ t("div", {
4
+ className: "flex items-center justify-between p-4 border-b border-border-subtle",
5
+ children: [/* @__PURE__ */ t("div", {
6
+ className: "flex items-center gap-2",
7
+ children: [
8
+ n && /* @__PURE__ */ e("button", {
9
+ type: "button",
10
+ onClick: i,
11
+ className: "p-1 rounded-button hover:bg-action-ghost-bg-hover text-text-primary",
12
+ "aria-label": "Close",
13
+ children: /* @__PURE__ */ e("svg", {
14
+ className: "size-5",
15
+ fill: "none",
16
+ stroke: "currentColor",
17
+ viewBox: "0 0 24 24",
18
+ children: /* @__PURE__ */ e("path", {
19
+ strokeLinecap: "round",
20
+ strokeLinejoin: "round",
21
+ strokeWidth: 2,
22
+ d: "M15 19l-7-7 7-7"
23
+ })
24
+ })
25
+ }),
26
+ /* @__PURE__ */ e("svg", {
27
+ className: "size-5 text-text-primary",
28
+ fill: "none",
29
+ stroke: "currentColor",
30
+ viewBox: "0 0 24 24",
31
+ children: /* @__PURE__ */ e("path", {
32
+ strokeLinecap: "round",
33
+ strokeLinejoin: "round",
34
+ strokeWidth: 2,
35
+ d: "M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9"
36
+ })
37
+ }),
38
+ /* @__PURE__ */ e("h2", {
39
+ className: "text-sm font-semibold text-text-primary",
40
+ children: "Notifications"
41
+ }),
42
+ r > 0 && /* @__PURE__ */ e("span", {
43
+ className: "inline-flex items-center justify-center min-w-[20px] h-5 px-1.5 text-xs font-semibold text-action-primary-text bg-action-primary-bg rounded-full",
44
+ children: r > 9 ? "9+" : r
45
+ })
46
+ ]
47
+ }), /* @__PURE__ */ t("div", {
48
+ className: "flex items-center gap-2",
49
+ children: [r > 0 && /* @__PURE__ */ e("button", {
50
+ type: "button",
51
+ onClick: a,
52
+ className: "text-xs text-action-primary-bg hover:underline font-medium",
53
+ children: "Mark all read"
54
+ }), !n && /* @__PURE__ */ e("button", {
55
+ type: "button",
56
+ onClick: i,
57
+ className: "p-1 rounded-button hover:bg-action-ghost-bg-hover text-text-tertiary",
58
+ "aria-label": "Close panel",
59
+ children: /* @__PURE__ */ e("svg", {
60
+ className: "size-4",
61
+ fill: "none",
62
+ stroke: "currentColor",
63
+ viewBox: "0 0 24 24",
64
+ children: /* @__PURE__ */ e("path", {
65
+ strokeLinecap: "round",
66
+ strokeLinejoin: "round",
67
+ strokeWidth: 2,
68
+ d: "M6 18L18 6M6 6l12 12"
69
+ })
70
+ })
71
+ })]
72
+ })]
73
+ });
74
+ //#endregion
75
+ export { n as NotificationHeader };
@@ -0,0 +1,75 @@
1
+ import { NotificationCardItem as e } from "./NotificationCardItem.js";
2
+ import { SkeletonCard as t } from "./SkeletonCard.js";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ //#region src/chrome/notificationCenter/NotificationList.tsx
5
+ var i = ({ loading: i, error: a, notifications: o, filterTab: s, typeFilter: c, appFilter: l, onRetry: u, onMarkAsRead: d, onDelete: f, onRedirect: p }) => /* @__PURE__ */ n("div", {
6
+ className: "flex-1 overflow-y-auto",
7
+ children: i ? /* @__PURE__ */ r("div", {
8
+ className: "p-3 space-y-2",
9
+ children: [
10
+ /* @__PURE__ */ n(t, {}),
11
+ /* @__PURE__ */ n(t, {}),
12
+ /* @__PURE__ */ n(t, {})
13
+ ]
14
+ }) : a ? /* @__PURE__ */ r("div", {
15
+ className: "flex flex-col items-center justify-center p-8 text-center",
16
+ children: [
17
+ /* @__PURE__ */ n("svg", {
18
+ className: "size-10 text-status-error-text mb-3",
19
+ fill: "none",
20
+ stroke: "currentColor",
21
+ viewBox: "0 0 24 24",
22
+ children: /* @__PURE__ */ n("path", {
23
+ strokeLinecap: "round",
24
+ strokeLinejoin: "round",
25
+ strokeWidth: 2,
26
+ d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z"
27
+ })
28
+ }),
29
+ /* @__PURE__ */ n("p", {
30
+ className: "text-sm text-text-secondary mb-2",
31
+ children: "Failed to load notifications"
32
+ }),
33
+ /* @__PURE__ */ n("button", {
34
+ type: "button",
35
+ onClick: u,
36
+ className: "text-xs text-action-primary-bg hover:underline font-medium",
37
+ children: "Try again"
38
+ })
39
+ ]
40
+ }) : o.length === 0 ? /* @__PURE__ */ r("div", {
41
+ className: "flex flex-col items-center justify-center p-8 text-center",
42
+ children: [
43
+ /* @__PURE__ */ n("svg", {
44
+ className: "size-12 text-text-tertiary mb-3",
45
+ fill: "none",
46
+ stroke: "currentColor",
47
+ viewBox: "0 0 24 24",
48
+ children: /* @__PURE__ */ n("path", {
49
+ strokeLinecap: "round",
50
+ strokeLinejoin: "round",
51
+ strokeWidth: 1.5,
52
+ d: "M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9"
53
+ })
54
+ }),
55
+ /* @__PURE__ */ n("p", {
56
+ className: "text-sm font-medium text-text-primary",
57
+ children: "You're all caught up!"
58
+ }),
59
+ /* @__PURE__ */ n("p", {
60
+ className: "text-xs text-text-tertiary mt-1",
61
+ children: s !== "all" || c !== "ALL" || l !== "ALL" ? "No notifications match your filters" : "No notifications yet"
62
+ })
63
+ ]
64
+ }) : /* @__PURE__ */ n("div", {
65
+ className: "p-2 space-y-1.5",
66
+ children: o.map((t) => /* @__PURE__ */ n(e, {
67
+ notification: t,
68
+ onMarkAsRead: d,
69
+ onDelete: f,
70
+ onRedirect: p
71
+ }, t.id))
72
+ })
73
+ });
74
+ //#endregion
75
+ export { i as NotificationList };
@@ -0,0 +1,19 @@
1
+ import { Fragment as e, jsx as t, jsxs as n } from "react/jsx-runtime";
2
+ //#region src/chrome/notificationCenter/NotificationPanel.tsx
3
+ var r = ({ isMobile: r, onClose: i, children: a }) => r ? /* @__PURE__ */ n(e, { children: [/* @__PURE__ */ t("div", {
4
+ className: "fixed inset-0 bg-black/50 z-[60]",
5
+ onClick: i,
6
+ "aria-hidden": "true"
7
+ }), /* @__PURE__ */ t("div", {
8
+ className: "fixed inset-x-0 bottom-0 top-0 bg-bg-elevated z-[70] flex flex-col",
9
+ role: "dialog",
10
+ "aria-label": "Notifications panel",
11
+ children: a
12
+ })] }) : /* @__PURE__ */ t("div", {
13
+ className: "absolute right-0 top-full mt-2 w-[calc(100vw-1.5rem)] sm:w-[420px] max-h-[600px] bg-bg-elevated border border-border-subtle rounded-card shadow-popover z-50 overflow-hidden flex flex-col",
14
+ role: "dialog",
15
+ "aria-label": "Notifications panel",
16
+ children: a
17
+ });
18
+ //#endregion
19
+ export { r as NotificationPanel };
@@ -0,0 +1,18 @@
1
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
+ //#region src/chrome/notificationCenter/SkeletonCard.tsx
3
+ var n = () => /* @__PURE__ */ t("div", {
4
+ className: "flex gap-3 p-3 rounded-card border border-border-subtle animate-pulse",
5
+ children: [/* @__PURE__ */ e("div", { className: "size-6 rounded bg-bg-muted flex-shrink-0" }), /* @__PURE__ */ t("div", {
6
+ className: "flex-1 space-y-2",
7
+ children: [
8
+ /* @__PURE__ */ e("div", { className: "h-4 bg-bg-muted rounded w-3/4" }),
9
+ /* @__PURE__ */ e("div", { className: "h-3 bg-bg-muted rounded w-full" }),
10
+ /* @__PURE__ */ t("div", {
11
+ className: "flex gap-2",
12
+ children: [/* @__PURE__ */ e("div", { className: "h-3 bg-bg-muted rounded w-12" }), /* @__PURE__ */ e("div", { className: "h-3 bg-bg-muted rounded w-16" })]
13
+ })
14
+ ]
15
+ })]
16
+ });
17
+ //#endregion
18
+ export { n as SkeletonCard };