@burdenoff/fe-libs 2026.527.3 → 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 (94) hide show
  1. package/dist/chrome/ContextSwitcher.js +90 -339
  2. package/dist/chrome/GlobalSearch.js +72 -456
  3. package/dist/chrome/NotificationCenter.js +69 -703
  4. package/dist/chrome/SideNavigation.js +73 -241
  5. package/dist/chrome/contextSwitcher/EmptyState.js +32 -0
  6. package/dist/chrome/contextSwitcher/OrganizationList.js +34 -0
  7. package/dist/chrome/contextSwitcher/ProjectList.js +34 -0
  8. package/dist/chrome/contextSwitcher/SearchInput.js +50 -0
  9. package/dist/chrome/contextSwitcher/TabButton.js +9 -0
  10. package/dist/chrome/contextSwitcher/TriggerButton.js +38 -0
  11. package/dist/chrome/contextSwitcher/WorkspaceList.js +34 -0
  12. package/dist/chrome/contextSwitcher/icons.js +58 -0
  13. package/dist/chrome/contextSwitcher/useIsMobile.js +11 -0
  14. package/dist/chrome/globalSearch/AdvancedFiltersPanel.js +253 -0
  15. package/dist/chrome/globalSearch/CategoryTabs.js +28 -0
  16. package/dist/chrome/globalSearch/ResultsList.js +58 -0
  17. package/dist/chrome/globalSearch/SearchInput.js +28 -0
  18. package/dist/chrome/globalSearch/SearchModeBar.js +36 -0
  19. package/dist/chrome/globalSearch/useAdvancedFilters.js +78 -0
  20. package/dist/chrome/globalSearch/utils.js +22 -0
  21. package/dist/chrome/notificationCenter/BellButton.js +27 -0
  22. package/dist/chrome/notificationCenter/NotificationCardItem.js +129 -0
  23. package/dist/chrome/notificationCenter/NotificationFilters.js +67 -0
  24. package/dist/chrome/notificationCenter/NotificationFooter.js +23 -0
  25. package/dist/chrome/notificationCenter/NotificationHeader.js +75 -0
  26. package/dist/chrome/notificationCenter/NotificationList.js +75 -0
  27. package/dist/chrome/notificationCenter/NotificationPanel.js +19 -0
  28. package/dist/chrome/notificationCenter/SkeletonCard.js +18 -0
  29. package/dist/chrome/notificationCenter/constants.js +93 -0
  30. package/dist/chrome/notificationCenter/gql.js +58 -0
  31. package/dist/chrome/notificationCenter/useNotificationCenter.js +149 -0
  32. package/dist/chrome/notificationCenter/usePanelChrome.js +36 -0
  33. package/dist/chrome/sideNavigation/CollapseToggle.js +29 -0
  34. package/dist/chrome/sideNavigation/MobileActionsBar.js +25 -0
  35. package/dist/chrome/sideNavigation/NavItemRenderer.js +79 -0
  36. package/dist/chrome/sideNavigation/SidebarHeader.js +29 -0
  37. package/dist/chrome/sideNavigation/helpers.js +19 -0
  38. package/dist/chrome/sideNavigation/useSideNavigationState.js +45 -0
  39. package/dist/shared/components/ContextConversationWidget.js +173 -767
  40. package/dist/shared/components/contextConversationWidget/Composer.js +66 -0
  41. package/dist/shared/components/contextConversationWidget/MessageItem.js +124 -0
  42. package/dist/shared/components/contextConversationWidget/MessageList.js +32 -0
  43. package/dist/shared/components/contextConversationWidget/NoWorkspaceCard.js +19 -0
  44. package/dist/shared/components/contextConversationWidget/PendingAttachmentsBar.js +28 -0
  45. package/dist/shared/components/contextConversationWidget/ReplyBanner.js +32 -0
  46. package/dist/shared/components/contextConversationWidget/WidgetHeader.js +70 -0
  47. package/dist/shared/components/contextConversationWidget/queries.js +197 -0
  48. package/dist/shared/components/contextConversationWidget/types.js +10 -0
  49. package/dist/shared/components/contextConversationWidget/useAttachmentUpload.js +57 -0
  50. package/dist/shared/components/contextConversationWidget/useConversationSubscriptions.js +26 -0
  51. package/dist/shared/components/contextConversationWidget/useMessageActions.js +34 -0
  52. package/dist/shared/components/contextConversationWidget/useSendMessage.js +45 -0
  53. package/dist/shared/components/contextConversationWidget/useWidgetMessages.js +44 -0
  54. package/dist/shared/components/contextConversationWidget/utils.js +56 -0
  55. package/dist/shared/pages/SearchPage.js +293 -1076
  56. package/dist/shared/pages/searchPage/ActiveFilterChips.js +176 -0
  57. package/dist/shared/pages/searchPage/FiltersPanel.js +329 -0
  58. package/dist/shared/pages/searchPage/ResultsList.js +119 -0
  59. package/dist/shared/pages/searchPage/ResultsStatus.js +32 -0
  60. package/dist/shared/pages/searchPage/SearchInput.js +31 -0
  61. package/dist/shared/pages/searchPage/SearchPagination.js +37 -0
  62. package/dist/shared/pages/searchPage/SearchToolbar.js +58 -0
  63. package/dist/shared/pages/searchPage/constants.js +155 -0
  64. package/dist/shared/pages/searchPage/utils.js +24 -0
  65. package/dist/shared/providers/shell/AuthProvider.js +130 -384
  66. package/dist/shared/providers/shell/authProvider/bridgeStateSync.js +34 -0
  67. package/dist/shared/providers/shell/authProvider/jwt.js +13 -0
  68. package/dist/shared/providers/shell/authProvider/ssoRelay.js +38 -0
  69. package/dist/shared/providers/shell/authProvider/useAuthActions.js +170 -0
  70. package/dist/shared/providers/shell/authProvider/useBridgeInitialization.js +86 -0
  71. package/dist/shared/providers/shell/authProvider/useRemoteSLO.js +32 -0
  72. package/dist/shared/providers/shell/authProvider/useStorageSync.js +35 -0
  73. package/dist/shared/providers/shell/authProvider/useTokenExpiryTimer.js +37 -0
  74. package/dist/shared/tours/TourTrigger.js +86 -262
  75. package/dist/shared/tours/ToursContext.js +108 -398
  76. package/dist/shared/tours/tourTrigger/DesktopTourDropdown.js +48 -0
  77. package/dist/shared/tours/tourTrigger/MobileTourSheet.js +68 -0
  78. package/dist/shared/tours/tourTrigger/TourListItemDesktop.js +36 -0
  79. package/dist/shared/tours/tourTrigger/TourListItemMobile.js +47 -0
  80. package/dist/shared/tours/tourTrigger/TourStatusChip.js +30 -0
  81. package/dist/shared/tours/tourTrigger/TourTriggerButton.js +22 -0
  82. package/dist/shared/tours/toursContext/errors.js +18 -0
  83. package/dist/shared/tours/toursContext/gql.js +152 -0
  84. package/dist/shared/tours/toursContext/route.js +20 -0
  85. package/dist/shared/tours/toursContext/session.js +19 -0
  86. package/dist/shared/tours/toursContext/useIdleReady.js +18 -0
  87. package/dist/shared/tours/toursContext/useTourMutations.js +118 -0
  88. package/dist/tag/TagsWidget.js +81 -226
  89. package/dist/tag/tagsWidget/AddTagTrigger.js +14 -0
  90. package/dist/tag/tagsWidget/TagBadgeList.js +17 -0
  91. package/dist/tag/tagsWidget/TagSearchPopover.js +80 -0
  92. package/dist/tag/tagsWidget/operations.js +64 -0
  93. package/dist/tag/tagsWidget/useVocabResolver.js +30 -0
  94. package/package.json +1 -1
@@ -0,0 +1,58 @@
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ //#region src/chrome/contextSwitcher/icons.tsx
3
+ var t = ({ className: t }) => /* @__PURE__ */ e("svg", {
4
+ className: t,
5
+ fill: "none",
6
+ stroke: "currentColor",
7
+ viewBox: "0 0 24 24",
8
+ children: /* @__PURE__ */ e("path", {
9
+ strokeLinecap: "round",
10
+ strokeLinejoin: "round",
11
+ strokeWidth: 2,
12
+ d: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"
13
+ })
14
+ }), n = ({ className: t }) => /* @__PURE__ */ e("svg", {
15
+ className: t,
16
+ fill: "none",
17
+ stroke: "currentColor",
18
+ viewBox: "0 0 24 24",
19
+ children: /* @__PURE__ */ e("path", {
20
+ strokeLinecap: "round",
21
+ strokeLinejoin: "round",
22
+ strokeWidth: 2,
23
+ d: "M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2 2v2m4 6h.01M5 20h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
24
+ })
25
+ }), r = ({ className: t }) => /* @__PURE__ */ e("svg", {
26
+ className: t,
27
+ fill: "none",
28
+ stroke: "currentColor",
29
+ viewBox: "0 0 24 24",
30
+ children: /* @__PURE__ */ e("path", {
31
+ strokeLinecap: "round",
32
+ strokeLinejoin: "round",
33
+ strokeWidth: 2,
34
+ d: "M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"
35
+ })
36
+ }), i = ({ className: t }) => /* @__PURE__ */ e("svg", {
37
+ className: t,
38
+ fill: "currentColor",
39
+ viewBox: "0 0 20 20",
40
+ children: /* @__PURE__ */ e("path", {
41
+ fillRule: "evenodd",
42
+ d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",
43
+ clipRule: "evenodd"
44
+ })
45
+ }), a = ({ className: t }) => /* @__PURE__ */ e("svg", {
46
+ className: t,
47
+ fill: "none",
48
+ stroke: "currentColor",
49
+ viewBox: "0 0 24 24",
50
+ children: /* @__PURE__ */ e("path", {
51
+ strokeLinecap: "round",
52
+ strokeLinejoin: "round",
53
+ strokeWidth: 2,
54
+ d: "M19 9l-7 7-7-7"
55
+ })
56
+ });
57
+ //#endregion
58
+ export { n as BriefcaseIcon, t as BuildingIcon, i as CheckIcon, a as ChevronDownIcon, r as FolderIcon };
@@ -0,0 +1,11 @@
1
+ import { useEffect as e, useState as t } from "react";
2
+ //#region src/chrome/contextSwitcher/useIsMobile.ts
3
+ function n(n = 640) {
4
+ let [r, i] = t(!1);
5
+ return e(() => {
6
+ let e = () => i(window.innerWidth < n);
7
+ return e(), window.addEventListener("resize", e), () => window.removeEventListener("resize", e);
8
+ }, [n]), r;
9
+ }
10
+ //#endregion
11
+ export { n as useIsMobile };
@@ -0,0 +1,253 @@
1
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
+ //#region src/chrome/globalSearch/AdvancedFiltersPanel.tsx
3
+ function n({ filters: n }) {
4
+ return /* @__PURE__ */ t("div", {
5
+ className: "px-3 py-2 border-b space-y-2 bg-muted/30 max-h-64 overflow-y-auto",
6
+ children: [
7
+ /* @__PURE__ */ t("div", {
8
+ className: "flex items-center gap-2",
9
+ children: [/* @__PURE__ */ e("label", {
10
+ className: "text-[10px] font-medium text-muted-foreground w-16 flex-shrink-0",
11
+ children: "Sort by"
12
+ }), /* @__PURE__ */ t("select", {
13
+ value: n.sortBy,
14
+ onChange: (e) => n.setSortBy(e.target.value),
15
+ className: "flex-1 h-7 text-xs rounded border border-border bg-background px-2 outline-none",
16
+ children: [
17
+ /* @__PURE__ */ e("option", {
18
+ value: "SCORE_DESC",
19
+ children: "Relevance"
20
+ }),
21
+ /* @__PURE__ */ e("option", {
22
+ value: "CREATED_DESC",
23
+ children: "Newest first"
24
+ }),
25
+ /* @__PURE__ */ e("option", {
26
+ value: "CREATED_ASC",
27
+ children: "Oldest first"
28
+ }),
29
+ /* @__PURE__ */ e("option", {
30
+ value: "UPDATED_DESC",
31
+ children: "Recently updated"
32
+ }),
33
+ /* @__PURE__ */ e("option", {
34
+ value: "UPDATED_ASC",
35
+ children: "Least recently updated"
36
+ }),
37
+ /* @__PURE__ */ e("option", {
38
+ value: "TITLE_ASC",
39
+ children: "Title A-Z"
40
+ }),
41
+ /* @__PURE__ */ e("option", {
42
+ value: "TITLE_DESC",
43
+ children: "Title Z-A"
44
+ })
45
+ ]
46
+ })]
47
+ }),
48
+ /* @__PURE__ */ t("div", {
49
+ className: "flex items-center gap-2",
50
+ children: [/* @__PURE__ */ e("label", {
51
+ className: "text-[10px] font-medium text-muted-foreground w-16 flex-shrink-0",
52
+ children: "Products"
53
+ }), /* @__PURE__ */ e("input", {
54
+ "aria-label": "Product sources filter",
55
+ type: "text",
56
+ placeholder: "vibecontrols, wspace-tags",
57
+ value: n.productSourcesInput,
58
+ onChange: (e) => n.setProductSourcesInput(e.target.value),
59
+ className: "flex-1 h-7 text-xs rounded border border-border bg-background px-2 outline-none placeholder:text-muted-foreground"
60
+ })]
61
+ }),
62
+ /* @__PURE__ */ t("div", {
63
+ className: "flex items-center gap-2",
64
+ children: [/* @__PURE__ */ e("label", {
65
+ className: "text-[10px] font-medium text-muted-foreground w-16 flex-shrink-0",
66
+ children: "Project"
67
+ }), /* @__PURE__ */ e("input", {
68
+ "aria-label": "Project ID filter",
69
+ type: "text",
70
+ placeholder: "Project ID",
71
+ value: n.projectId,
72
+ onChange: (e) => n.setProjectId(e.target.value),
73
+ className: "flex-1 h-7 text-xs rounded border border-border bg-background px-2 outline-none placeholder:text-muted-foreground"
74
+ })]
75
+ }),
76
+ /* @__PURE__ */ t("div", {
77
+ className: "flex items-center gap-2",
78
+ children: [/* @__PURE__ */ e("label", {
79
+ className: "text-[10px] font-medium text-muted-foreground w-16 flex-shrink-0",
80
+ children: "Created by"
81
+ }), /* @__PURE__ */ e("input", {
82
+ type: "text",
83
+ placeholder: "Actor ID",
84
+ value: n.createdBy,
85
+ onChange: (e) => n.setCreatedBy(e.target.value),
86
+ className: "flex-1 h-7 text-xs rounded border border-border bg-background px-2 outline-none placeholder:text-muted-foreground"
87
+ })]
88
+ }),
89
+ /* @__PURE__ */ t("div", {
90
+ className: "flex items-center gap-2",
91
+ children: [/* @__PURE__ */ e("label", {
92
+ className: "text-[10px] font-medium text-muted-foreground w-16 flex-shrink-0",
93
+ children: "Updated by"
94
+ }), /* @__PURE__ */ e("input", {
95
+ "aria-label": "Updated by filter",
96
+ type: "text",
97
+ placeholder: "Actor ID",
98
+ value: n.updatedBy,
99
+ onChange: (e) => n.setUpdatedBy(e.target.value),
100
+ className: "flex-1 h-7 text-xs rounded border border-border bg-background px-2 outline-none placeholder:text-muted-foreground"
101
+ })]
102
+ }),
103
+ /* @__PURE__ */ t("div", {
104
+ className: "flex items-center gap-2",
105
+ children: [/* @__PURE__ */ e("label", {
106
+ className: "text-[10px] font-medium text-muted-foreground w-16 flex-shrink-0",
107
+ children: "Date from"
108
+ }), /* @__PURE__ */ e("input", {
109
+ type: "date",
110
+ value: n.dateFrom,
111
+ onChange: (e) => n.setDateFrom(e.target.value),
112
+ className: "flex-1 h-7 text-xs rounded border border-border bg-background px-2 outline-none"
113
+ })]
114
+ }),
115
+ /* @__PURE__ */ t("div", {
116
+ className: "flex items-center gap-2",
117
+ children: [/* @__PURE__ */ e("label", {
118
+ className: "text-[10px] font-medium text-muted-foreground w-16 flex-shrink-0",
119
+ children: "Date to"
120
+ }), /* @__PURE__ */ e("input", {
121
+ type: "date",
122
+ value: n.dateTo,
123
+ onChange: (e) => n.setDateTo(e.target.value),
124
+ className: "flex-1 h-7 text-xs rounded border border-border bg-background px-2 outline-none"
125
+ })]
126
+ }),
127
+ /* @__PURE__ */ t("div", {
128
+ className: "flex items-center gap-2",
129
+ children: [/* @__PURE__ */ e("label", {
130
+ className: "text-[10px] font-medium text-muted-foreground w-16 flex-shrink-0",
131
+ children: "Updated from"
132
+ }), /* @__PURE__ */ e("input", {
133
+ "aria-label": "Updated from date",
134
+ type: "date",
135
+ value: n.updatedDateFrom,
136
+ onChange: (e) => n.setUpdatedDateFrom(e.target.value),
137
+ className: "flex-1 h-7 text-xs rounded border border-border bg-background px-2 outline-none"
138
+ })]
139
+ }),
140
+ /* @__PURE__ */ t("div", {
141
+ className: "flex items-center gap-2",
142
+ children: [/* @__PURE__ */ e("label", {
143
+ className: "text-[10px] font-medium text-muted-foreground w-16 flex-shrink-0",
144
+ children: "Updated to"
145
+ }), /* @__PURE__ */ e("input", {
146
+ "aria-label": "Updated to date",
147
+ type: "date",
148
+ value: n.updatedDateTo,
149
+ onChange: (e) => n.setUpdatedDateTo(e.target.value),
150
+ className: "flex-1 h-7 text-xs rounded border border-border bg-background px-2 outline-none"
151
+ })]
152
+ }),
153
+ /* @__PURE__ */ t("div", {
154
+ className: "flex items-center gap-2",
155
+ children: [/* @__PURE__ */ e("label", {
156
+ className: "text-[10px] font-medium text-muted-foreground w-16 flex-shrink-0",
157
+ children: "Tag keys"
158
+ }), /* @__PURE__ */ e("input", {
159
+ "aria-label": "Tag keys filter",
160
+ type: "text",
161
+ placeholder: "search, team/platform",
162
+ value: n.tagKeysInput,
163
+ onChange: (e) => n.setTagKeysInput(e.target.value),
164
+ className: "flex-1 h-7 text-xs rounded border border-border bg-background px-2 outline-none placeholder:text-muted-foreground"
165
+ })]
166
+ }),
167
+ /* @__PURE__ */ t("div", {
168
+ className: "flex items-center gap-2",
169
+ children: [/* @__PURE__ */ e("label", {
170
+ className: "text-[10px] font-medium text-muted-foreground w-16 flex-shrink-0",
171
+ children: "Tag IDs"
172
+ }), /* @__PURE__ */ e("input", {
173
+ "aria-label": "Tag IDs filter",
174
+ type: "text",
175
+ placeholder: "Comma-separated IDs",
176
+ value: n.tagIdsInput,
177
+ onChange: (e) => n.setTagIdsInput(e.target.value),
178
+ className: "flex-1 h-7 text-xs rounded border border-border bg-background px-2 outline-none placeholder:text-muted-foreground"
179
+ })]
180
+ }),
181
+ /* @__PURE__ */ t("div", {
182
+ className: "flex items-center gap-2",
183
+ children: [/* @__PURE__ */ e("label", {
184
+ className: "text-[10px] font-medium text-muted-foreground w-16 flex-shrink-0",
185
+ children: "Tag paths"
186
+ }), /* @__PURE__ */ e("input", {
187
+ "aria-label": "Tag hierarchy filter",
188
+ type: "text",
189
+ placeholder: "team/engineering",
190
+ value: n.tagPathsInput,
191
+ onChange: (e) => n.setTagPathsInput(e.target.value),
192
+ className: "flex-1 h-7 text-xs rounded border border-border bg-background px-2 outline-none placeholder:text-muted-foreground"
193
+ })]
194
+ }),
195
+ /* @__PURE__ */ t("div", {
196
+ className: "grid grid-cols-[1fr_auto_1fr] gap-2 items-center",
197
+ children: [
198
+ /* @__PURE__ */ e("input", {
199
+ "aria-label": "Metadata key filter",
200
+ type: "text",
201
+ placeholder: "metadata.path",
202
+ value: n.metadataKey,
203
+ onChange: (e) => n.setMetadataKey(e.target.value),
204
+ className: "h-7 text-xs rounded border border-border bg-background px-2 outline-none placeholder:text-muted-foreground"
205
+ }),
206
+ /* @__PURE__ */ t("select", {
207
+ "aria-label": "Metadata operator filter",
208
+ value: n.metadataOperator,
209
+ onChange: (e) => n.setMetadataOperator(e.target.value),
210
+ className: "h-7 text-xs rounded border border-border bg-background px-2 outline-none",
211
+ children: [
212
+ /* @__PURE__ */ e("option", {
213
+ value: "EQUALS",
214
+ children: "="
215
+ }),
216
+ /* @__PURE__ */ e("option", {
217
+ value: "NOT_EQUALS",
218
+ children: "≠"
219
+ }),
220
+ /* @__PURE__ */ e("option", {
221
+ value: "CONTAINS",
222
+ children: "contains"
223
+ }),
224
+ /* @__PURE__ */ e("option", {
225
+ value: "STARTS_WITH",
226
+ children: "starts"
227
+ })
228
+ ]
229
+ }),
230
+ /* @__PURE__ */ e("input", {
231
+ "aria-label": "Metadata value filter",
232
+ type: "text",
233
+ placeholder: "Value",
234
+ value: n.metadataValue,
235
+ onChange: (e) => n.setMetadataValue(e.target.value),
236
+ className: "h-7 text-xs rounded border border-border bg-background px-2 outline-none placeholder:text-muted-foreground"
237
+ })
238
+ ]
239
+ }),
240
+ /* @__PURE__ */ e("div", {
241
+ className: "flex justify-end",
242
+ children: /* @__PURE__ */ e("button", {
243
+ type: "button",
244
+ onClick: n.reset,
245
+ className: "text-[10px] text-muted-foreground hover:text-foreground transition-colors",
246
+ children: "Clear filters"
247
+ })
248
+ })
249
+ ]
250
+ });
251
+ }
252
+ //#endregion
253
+ export { n as AdvancedFiltersPanel };
@@ -0,0 +1,28 @@
1
+ import { cn as e } from "../../utils/cn.js";
2
+ import "../../utils/index.js";
3
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
4
+ //#region src/chrome/globalSearch/CategoryTabs.tsx
5
+ function r({ categories: r, selectedCategory: i, onSelect: a }) {
6
+ return r.length === 0 ? null : /* @__PURE__ */ n("div", {
7
+ className: "flex items-center gap-1 p-2 border-b overflow-x-auto scrollbar-hide scroll-smooth snap-x snap-mandatory",
8
+ children: [/* @__PURE__ */ t("button", {
9
+ type: "button",
10
+ onClick: () => a(void 0),
11
+ className: e("px-3 py-1.5 text-xs rounded-md transition-colors whitespace-nowrap flex-shrink-0 snap-start", i === void 0 ? "bg-primary text-primary-foreground" : "bg-muted hover:bg-muted/80"),
12
+ children: "All"
13
+ }), r.map((r) => {
14
+ let o = r.icon;
15
+ return /* @__PURE__ */ n("button", {
16
+ type: "button",
17
+ onClick: () => a(r.name),
18
+ className: e("px-3 py-1.5 text-xs rounded-md transition-colors whitespace-nowrap flex-shrink-0 flex items-center gap-1.5 snap-start", i === r.name ? "bg-primary text-primary-foreground" : "bg-muted hover:bg-muted/80"),
19
+ children: [/* @__PURE__ */ t(o, { className: "size-3.5" }), /* @__PURE__ */ t("span", {
20
+ className: "hidden xs:inline",
21
+ children: r.label
22
+ })]
23
+ }, r.name);
24
+ })]
25
+ });
26
+ }
27
+ //#endregion
28
+ export { r as CategoryTabs };
@@ -0,0 +1,58 @@
1
+ import { Clock as e, Loader2 as t } from "lucide-react";
2
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
3
+ //#region src/chrome/globalSearch/ResultsList.tsx
4
+ function i({ loading: i, error: a, query: o, results: s, groupedResults: c, recentSearches: l, onRecentSelect: u, onResultSelect: d }) {
5
+ return /* @__PURE__ */ r("div", {
6
+ className: "max-h-[60dvh] overflow-y-auto p-2",
7
+ children: [
8
+ i && /* @__PURE__ */ n("div", {
9
+ className: "flex items-center justify-center py-6",
10
+ children: /* @__PURE__ */ n(t, { className: "size-4 animate-spin" })
11
+ }),
12
+ a && /* @__PURE__ */ n("div", {
13
+ className: "py-6 text-center text-sm text-destructive",
14
+ children: a
15
+ }),
16
+ !i && !a && !o && l.length > 0 && /* @__PURE__ */ r("div", { children: [/* @__PURE__ */ n("div", {
17
+ className: "px-2 py-1.5 text-xs font-medium text-muted-foreground",
18
+ children: "Recent Searches"
19
+ }), l.map((t, i) => /* @__PURE__ */ r("button", {
20
+ type: "button",
21
+ onClick: () => u(t),
22
+ className: "w-full flex items-center gap-2 px-2 py-2 text-sm rounded-md hover:bg-accent transition-colors text-left",
23
+ children: [/* @__PURE__ */ n(e, { className: "size-4 opacity-50" }), t]
24
+ }, i))] }),
25
+ !i && !a && o && s.length === 0 && /* @__PURE__ */ r("div", {
26
+ className: "py-6 text-center text-sm text-muted-foreground",
27
+ children: [
28
+ "No results found for \"",
29
+ o,
30
+ "\""
31
+ ]
32
+ }),
33
+ !i && !a && Object.entries(c).map(([e, t]) => /* @__PURE__ */ r("div", { children: [/* @__PURE__ */ n("div", {
34
+ className: "px-2 py-1.5 text-xs font-medium text-muted-foreground",
35
+ children: e
36
+ }), t.map((e) => {
37
+ let t = e.icon;
38
+ return /* @__PURE__ */ r("button", {
39
+ type: "button",
40
+ onClick: () => d(e),
41
+ className: "w-full flex items-start gap-2 px-2 py-2 text-sm rounded-md hover:bg-accent transition-colors text-left",
42
+ children: [t && /* @__PURE__ */ n(t, { className: "size-4 mt-0.5 flex-shrink-0" }), /* @__PURE__ */ r("div", {
43
+ className: "flex-1 min-w-0",
44
+ children: [/* @__PURE__ */ n("div", {
45
+ className: "font-medium truncate",
46
+ children: e.title
47
+ }), e.description && /* @__PURE__ */ n("div", {
48
+ className: "text-xs text-muted-foreground truncate",
49
+ children: e.description
50
+ })]
51
+ })]
52
+ }, e.id);
53
+ })] }, e))
54
+ ]
55
+ });
56
+ }
57
+ //#endregion
58
+ export { i as ResultsList };
@@ -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 };