@burdenoff/fe-libs 2026.1023.5 → 2026.1023.6

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.
@@ -1,4 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
+ import { KeyboardShortcut as HelpShortcut } from '../shared/keyboard/types';
2
3
  /**
3
4
  * Represents a single command action
4
5
  */
@@ -34,12 +35,34 @@ export interface CommandPaletteProps {
34
35
  readonly placeholder?: string;
35
36
  /** Custom class name */
36
37
  readonly className?: string;
38
+ /**
39
+ * Shortcut that opens and closes the palette. Defaults to
40
+ * `COMMAND_PALETTE_SHORTCUT` (Cmd/Ctrl+Shift+K): Cmd/Ctrl+K belongs to
41
+ * Global Search in every shell, so the palette cannot share it.
42
+ */
43
+ readonly toggleShortcut?: string;
37
44
  }
45
+ /**
46
+ * The palette's default open/close shortcut: Cmd+Shift+K on macOS,
47
+ * Ctrl+Shift+K elsewhere. Cmd/Ctrl+K is Global Search's.
48
+ */
49
+ export declare const COMMAND_PALETTE_SHORTCUT = "mod+shift+k";
50
+ /**
51
+ * The palette shortcut as a keyboard-help entry, for a shell's DISPLAY-ONLY
52
+ * shortcut list (the palette registers the key itself; do not pass this to
53
+ * `useKeyboardShortcuts`, its action does nothing).
54
+ */
55
+ export declare const COMMAND_PALETTE_HELP_SHORTCUT: HelpShortcut;
56
+ /**
57
+ * Check if a keyboard event matches a shortcut (exported for tests).
58
+ */
59
+ export declare function matchShortcut(event: KeyboardEvent, keys: string): boolean;
38
60
  /**
39
61
  * CommandPalette Component
40
62
  *
41
63
  * Provides a keyboard-accessible command palette with:
42
- * - Global keyboard shortcuts (Cmd+K / Ctrl+K)
64
+ * - Its own open/close shortcut (Cmd/Ctrl+Shift+K by default; Cmd/Ctrl+K is
65
+ * Global Search)
43
66
  * - Action-specific shortcuts
44
67
  * - Fuzzy search across commands
45
68
  * - Grouped command sections
@@ -60,4 +83,4 @@ export interface CommandPaletteProps {
60
83
  * <CommandPalette actions={actions} />
61
84
  * ```
62
85
  */
63
- export declare function CommandPalette({ actions, shortcuts, placeholder, className, }: CommandPaletteProps): ReactNode;
86
+ export declare function CommandPalette({ actions, shortcuts, placeholder, className, toggleShortcut, }: CommandPaletteProps): ReactNode;
@@ -5,7 +5,19 @@ import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "r
5
5
  import { Search as o, X as s } from "lucide-react";
6
6
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
7
7
  //#region src/chrome/CommandPalette.tsx
8
- function u(e) {
8
+ var u = "mod+shift+k", d = {
9
+ id: "command-palette",
10
+ keys: {
11
+ mac: ["cmd+shift+k"],
12
+ windows: ["ctrl+shift+k"],
13
+ linux: ["ctrl+shift+k"]
14
+ },
15
+ description: "Open Command Palette",
16
+ category: "Search",
17
+ action: () => void 0,
18
+ global: !0
19
+ };
20
+ function f(e) {
9
21
  let t = e.toLowerCase().split("+").map((e) => e.trim()), n = t.length - 1;
10
22
  return {
11
23
  mod: t.includes("mod"),
@@ -16,52 +28,52 @@ function u(e) {
16
28
  key: t[n] || ""
17
29
  };
18
30
  }
19
- function d(e, t) {
20
- let n = u(t);
21
- return n.mod && !(e.metaKey || e.ctrlKey) || n.ctrl && !e.ctrlKey || n.alt && !e.altKey || n.shift && !e.shiftKey || n.meta && !e.metaKey || !e.key ? !1 : e.key.toLowerCase() === n.key;
31
+ function p(e, t) {
32
+ let n = f(t);
33
+ return n.mod && !(e.metaKey || e.ctrlKey) || n.ctrl && !e.ctrlKey || n.alt !== e.altKey || n.shift !== e.shiftKey || n.meta && !e.metaKey || !e.key ? !1 : e.key.toLowerCase() === n.key;
22
34
  }
23
- function f({ actions: u, shortcuts: f = [], placeholder: p, className: m }) {
24
- let h = e(), [g, _] = a(!1), [v, y] = a(""), [b, x] = a(0), S = i(() => u.filter((e) => !e.hidden), [u]), C = n(async (e) => {
35
+ function m({ actions: d, shortcuts: f = [], placeholder: m, className: h, toggleShortcut: g = u }) {
36
+ let _ = e(), [v, y] = a(!1), [b, x] = a(""), [S, C] = a(0), w = i(() => d.filter((e) => !e.hidden), [d]), T = n(async (e) => {
25
37
  try {
26
- await e.action(), _(!1);
38
+ await e.action(), y(!1);
27
39
  } catch (e) {
28
40
  console.error("Failed to execute command:", e);
29
41
  }
30
- }, []), w = i(() => {
31
- if (!v.trim()) return S;
32
- let e = v.toLowerCase();
33
- return S.filter((t) => {
42
+ }, []), E = i(() => {
43
+ if (!b.trim()) return w;
44
+ let e = b.toLowerCase();
45
+ return w.filter((t) => {
34
46
  let n = t.label.toLowerCase().includes(e), r = t.keywords?.some((t) => t.toLowerCase().includes(e)), i = t.description?.toLowerCase().includes(e);
35
47
  return n || r || i;
36
48
  });
37
- }, [S, v]);
49
+ }, [w, b]);
38
50
  r(() => {
39
- g || (y(""), x(0));
40
- }, [g]), r(() => {
51
+ v || (x(""), C(0));
52
+ }, [v]), r(() => {
41
53
  let e = (e) => {
42
- if ((e.metaKey || e.ctrlKey) && e.key === "k") {
43
- e.preventDefault(), _((e) => !e);
54
+ if (p(e, g)) {
55
+ e.preventDefault(), y((e) => !e);
44
56
  return;
45
57
  }
46
- if (g) {
47
- if (e.key === "Escape") e.preventDefault(), _(!1);
48
- else if (e.key === "ArrowDown") e.preventDefault(), x((e) => e < w.length - 1 ? e + 1 : e);
49
- else if (e.key === "ArrowUp") e.preventDefault(), x((e) => e > 0 ? e - 1 : e);
58
+ if (v) {
59
+ if (e.key === "Escape") e.preventDefault(), y(!1);
60
+ else if (e.key === "ArrowDown") e.preventDefault(), C((e) => e < E.length - 1 ? e + 1 : e);
61
+ else if (e.key === "ArrowUp") e.preventDefault(), C((e) => e > 0 ? e - 1 : e);
50
62
  else if (e.key === "Enter") {
51
63
  e.preventDefault();
52
- let t = w[b];
53
- t && C(t);
64
+ let t = E[S];
65
+ t && T(t);
54
66
  }
55
67
  return;
56
68
  }
57
- for (let t of f) if (d(e, t.keys)) {
69
+ for (let t of f) if (p(e, t.keys)) {
58
70
  e.preventDefault();
59
- let n = S.find((e) => e.id === t.actionId);
60
- n && C(n);
71
+ let n = w.find((e) => e.id === t.actionId);
72
+ n && T(n);
61
73
  return;
62
74
  }
63
- for (let t of S) if (t.shortcut && d(e, t.shortcut)) {
64
- e.preventDefault(), C(t);
75
+ for (let t of w) if (t.shortcut && p(e, t.shortcut)) {
76
+ e.preventDefault(), T(t);
65
77
  return;
66
78
  }
67
79
  };
@@ -69,25 +81,26 @@ function f({ actions: u, shortcuts: f = [], placeholder: p, className: m }) {
69
81
  document.removeEventListener("keydown", e);
70
82
  };
71
83
  }, [
72
- C,
73
- w,
74
- g,
75
- b,
84
+ T,
85
+ E,
86
+ v,
87
+ S,
76
88
  f,
77
- S
89
+ g,
90
+ w
78
91
  ]);
79
- let T = i(() => w.reduce((e, t) => {
92
+ let D = i(() => E.reduce((e, t) => {
80
93
  let n = t.section || "Actions";
81
94
  return e[n] || (e[n] = []), e[n].push(t), e;
82
- }, {}), [w]);
95
+ }, {}), [E]);
83
96
  if (r(() => {
84
- x(0);
85
- }, [w]), !g) return null;
86
- let E = 0;
97
+ C(0);
98
+ }, [E]), !v) return null;
99
+ let O = 0;
87
100
  return /* @__PURE__ */ c("div", {
88
- className: t("fixed inset-0 z-[9999] flex items-center justify-center bg-bg-overlay backdrop-blur-md", "data-[state=open]:animate-in data-[state=closed]:animate-out", "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", m),
89
- onClick: () => _(!1),
90
- "data-state": g ? "open" : "closed",
101
+ className: t("fixed inset-0 z-[9999] flex items-center justify-center bg-bg-overlay backdrop-blur-md", "data-[state=open]:animate-in data-[state=closed]:animate-out", "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", h),
102
+ onClick: () => y(!1),
103
+ "data-state": v ? "open" : "closed",
91
104
  role: "dialog",
92
105
  "aria-modal": "true",
93
106
  children: /* @__PURE__ */ c("div", {
@@ -102,37 +115,37 @@ function f({ actions: u, shortcuts: f = [], placeholder: p, className: m }) {
102
115
  /* @__PURE__ */ c(o, { className: "size-4 mr-2 flex-shrink-0 text-text-muted" }),
103
116
  /* @__PURE__ */ c("input", {
104
117
  type: "text",
105
- placeholder: p ?? h("search.commandPlaceholder", "Type a command or search..."),
106
- value: v,
107
- onChange: (e) => y(e.target.value),
118
+ placeholder: m ?? _("search.commandPlaceholder", "Type a command or search..."),
119
+ value: b,
120
+ onChange: (e) => x(e.target.value),
108
121
  className: "flex-1 bg-transparent py-3.5 text-sm text-text-primary outline-none placeholder:text-text-placeholder",
109
122
  autoFocus: !0
110
123
  }),
111
- v && /* @__PURE__ */ c("button", {
124
+ b && /* @__PURE__ */ c("button", {
112
125
  type: "button",
113
- onClick: () => y(""),
126
+ onClick: () => x(""),
114
127
  className: "ml-2 rounded-button p-1 text-text-muted hover:bg-bg-sunken hover:text-text-primary transition-colors",
115
- "aria-label": h("common.clearSearch", "Clear search"),
128
+ "aria-label": _("common.clearSearch", "Clear search"),
116
129
  children: /* @__PURE__ */ c(s, { className: "size-4" })
117
130
  })
118
131
  ]
119
132
  }),
120
133
  /* @__PURE__ */ l("div", {
121
134
  className: "max-h-96 overflow-y-auto p-2",
122
- children: [w.length === 0 && /* @__PURE__ */ c("div", {
135
+ children: [E.length === 0 && /* @__PURE__ */ c("div", {
123
136
  className: "py-6 text-center text-sm text-text-muted",
124
- children: h("search.noCommandsFound", "No commands found.")
125
- }), Object.entries(T).map(([e, n]) => /* @__PURE__ */ l("div", {
137
+ children: _("search.noCommandsFound", "No commands found.")
138
+ }), Object.entries(D).map(([e, n]) => /* @__PURE__ */ l("div", {
126
139
  className: "mb-2 last:mb-0",
127
140
  children: [/* @__PURE__ */ c("div", {
128
141
  className: "px-2 py-1.5 text-[11px] font-medium uppercase tracking-wider text-text-muted",
129
142
  children: e
130
143
  }), n.map((e) => {
131
- let n = e.icon, r = E;
132
- return E++, /* @__PURE__ */ l("button", {
144
+ let n = e.icon, r = O;
145
+ return O++, /* @__PURE__ */ l("button", {
133
146
  type: "button",
134
- onClick: () => void C(e),
135
- className: t("w-full flex items-start gap-3 px-2.5 py-2 text-sm rounded-button transition-colors text-left", r === b ? "bg-[var(--color-accent-soft)] text-text-primary" : "text-text-secondary hover:bg-bg-sunken hover:text-text-primary"),
147
+ onClick: () => void T(e),
148
+ className: t("w-full flex items-start gap-3 px-2.5 py-2 text-sm rounded-button transition-colors text-left", r === S ? "bg-[var(--color-accent-soft)] text-text-primary" : "text-text-secondary hover:bg-bg-sunken hover:text-text-primary"),
136
149
  children: [
137
150
  n && /* @__PURE__ */ c(n, { className: "size-4 mt-0.5 flex-shrink-0" }),
138
151
  /* @__PURE__ */ l("div", {
@@ -163,7 +176,7 @@ function f({ actions: u, shortcuts: f = [], placeholder: p, className: m }) {
163
176
  children: "↑↓"
164
177
  }),
165
178
  " ",
166
- h("search.navigate", "Navigate")
179
+ _("search.navigate", "Navigate")
167
180
  ] }),
168
181
  /* @__PURE__ */ l("div", { children: [
169
182
  /* @__PURE__ */ c("kbd", {
@@ -171,7 +184,7 @@ function f({ actions: u, shortcuts: f = [], placeholder: p, className: m }) {
171
184
  children: "Enter"
172
185
  }),
173
186
  " ",
174
- h("search.execute", "Execute")
187
+ _("search.execute", "Execute")
175
188
  ] }),
176
189
  /* @__PURE__ */ l("div", { children: [
177
190
  /* @__PURE__ */ c("kbd", {
@@ -179,7 +192,7 @@ function f({ actions: u, shortcuts: f = [], placeholder: p, className: m }) {
179
192
  children: "Esc"
180
193
  }),
181
194
  " ",
182
- h("common.close", "Close")
195
+ _("common.close", "Close")
183
196
  ] })
184
197
  ]
185
198
  })
@@ -189,4 +202,4 @@ function f({ actions: u, shortcuts: f = [], placeholder: p, className: m }) {
189
202
  });
190
203
  }
191
204
  //#endregion
192
- export { f as CommandPalette };
205
+ export { d as COMMAND_PALETTE_HELP_SHORTCUT, u as COMMAND_PALETTE_SHORTCUT, m as CommandPalette };
@@ -5,106 +5,107 @@ import { useGlobalUiOrNull as n } from "../shared/providers/shell/GlobalUiProvid
5
5
  import { useAssistantControl as r } from "../shared/assistant/appControls/useAssistantControl.js";
6
6
  import { EscapeLayer as i } from "../shared/components/EscapeLayer.js";
7
7
  import { SHELL_OVERLAY_LAYER_CLASS as a } from "./shellOverlayLayer.js";
8
- import { debounce as o, isSearchResults as s } from "./globalSearch/utils.js";
9
- import { SearchInput as c } from "./globalSearch/SearchInput.js";
10
- import { CategoryTabs as l } from "./globalSearch/CategoryTabs.js";
11
- import { SearchModeBar as u } from "./globalSearch/SearchModeBar.js";
12
- import { AdvancedFiltersPanel as d } from "./globalSearch/AdvancedFiltersPanel.js";
13
- import { ResultsList as f } from "./globalSearch/ResultsList.js";
14
- import { useAdvancedFilters as p } from "./globalSearch/useAdvancedFilters.js";
15
- import { useCallback as m, useEffect as h, useMemo as g, useState as _ } from "react";
16
- import { ExternalLink as v } from "lucide-react";
17
- import { jsx as y, jsxs as b } from "react/jsx-runtime";
8
+ import { GlobalSearchError as o } from "../shared/hooks/shell/globalSearchError.js";
9
+ import { debounce as s, isSearchResults as c } from "./globalSearch/utils.js";
10
+ import { SearchInput as l } from "./globalSearch/SearchInput.js";
11
+ import { CategoryTabs as u } from "./globalSearch/CategoryTabs.js";
12
+ import { SearchModeBar as d } from "./globalSearch/SearchModeBar.js";
13
+ import { AdvancedFiltersPanel as f } from "./globalSearch/AdvancedFiltersPanel.js";
14
+ import { ResultsList as p } from "./globalSearch/ResultsList.js";
15
+ import { useAdvancedFilters as m } from "./globalSearch/useAdvancedFilters.js";
16
+ import { useCallback as h, useEffect as g, useMemo as _, useState as v } from "react";
17
+ import { ExternalLink as y } from "lucide-react";
18
+ import { jsx as b, jsxs as x } from "react/jsx-runtime";
18
19
  //#region src/chrome/GlobalSearch.tsx
19
- function x({ open: x, onClose: S, categories: C = [], placeholder: w, recentSearches: T = [], onSearch: E, onSelect: D, onViewAllResults: O, className: k }) {
20
- let A = e(), [j, M] = _(""), [N, P] = _(void 0), [F, I] = _([]), [L, R] = _(!1), [z, B] = _(null), [V, H] = _(!1), U = p(), { buildFilters: W, reset: G, searchMode: K, setSearchMode: q } = U, J = n()?.openGlobalSearch, [Y, X] = _(null);
21
- r("header.search", g(() => J ? { run: ({ query: e }) => (X(e === null ? null : { query: e }), J(), { status: "done" }) } : null, [J])), h(() => {
22
- !x || !Y || (M(Y.query), X(null));
23
- }, [x, Y]), h(() => {
24
- x || (M(""), P(void 0), I([]), B(null), H(!1), G());
25
- }, [x, G]);
26
- let Z = g(() => o(async (e, t, n) => {
20
+ function S({ open: S, onClose: C, categories: w = [], placeholder: T, recentSearches: E = [], onSearch: D, onSelect: O, onViewAllResults: k, className: A }) {
21
+ let j = e(), [M, N] = v(""), [P, F] = v(void 0), [I, L] = v([]), [R, z] = v(!1), [B, V] = v(null), [H, U] = v(!1), W = m(), { buildFilters: G, reset: K, searchMode: q, setSearchMode: J } = W, Y = n()?.openGlobalSearch, [X, Z] = v(null);
22
+ r("header.search", _(() => Y ? { run: ({ query: e }) => (Z(e === null ? null : { query: e }), Y(), { status: "done" }) } : null, [Y])), g(() => {
23
+ !S || !X || (N(X.query), Z(null));
24
+ }, [S, X]), g(() => {
25
+ S || (N(""), F(void 0), L([]), V(null), U(!1), K());
26
+ }, [S, K]);
27
+ let Q = _(() => s(async (e, t, n) => {
27
28
  if (!e.trim()) {
28
- I([]), B(null);
29
+ L([]), V(null);
29
30
  return;
30
31
  }
31
- R(!0), B(null);
32
+ z(!0), V(null);
32
33
  try {
33
- let r = await E(e, t, n);
34
- if (!s(r)) throw TypeError(A("search.invalidResults", "Invalid search results format"));
35
- I(r);
34
+ let r = await D(e, t, n);
35
+ if (!c(r)) throw TypeError(j("search.invalidResults", "Invalid search results format"));
36
+ L(r);
36
37
  } catch (e) {
37
- B(e instanceof Error ? e.message : A("search.failed", "Search failed")), I([]), console.error("Search error:", e);
38
+ V(e instanceof o ? e.reason === "NO_WORKSPACE_CONTEXT" ? j("search.noWorkspace", "Select a workspace to search it.") : j("search.unavailable", "Search is unavailable right now. Try again in a moment.") : e instanceof Error ? e.message : j("search.failed", "Search failed")), L([]), console.error("Search error:", e);
38
39
  } finally {
39
- R(!1);
40
+ z(!1);
40
41
  }
41
- }, 300), [E, A]);
42
- h(() => {
43
- Z(j, N, W());
42
+ }, 300), [D, j]);
43
+ g(() => {
44
+ Q(M, P, G());
44
45
  }, [
45
- j,
46
- N,
47
- Z,
48
- W
46
+ M,
47
+ P,
48
+ Q,
49
+ G
49
50
  ]);
50
- let Q = g(() => F.reduce((e, t) => {
51
+ let $ = _(() => I.reduce((e, t) => {
51
52
  let n = t.category;
52
53
  return e[n] || (e[n] = []), e[n].push(t), e;
53
- }, {}), [F]), $ = m((e) => {
54
- D(e), S();
55
- }, [D, S]);
56
- return x ? /* @__PURE__ */ y(i, {
54
+ }, {}), [I]), ee = h((e) => {
55
+ O(e), C();
56
+ }, [O, C]);
57
+ return S ? /* @__PURE__ */ b(i, {
57
58
  modal: !0,
58
- onDismiss: S,
59
- children: /* @__PURE__ */ y("div", {
60
- className: t("fixed inset-0 flex items-center justify-center bg-bg-overlay backdrop-blur-md", a, "data-[state=open]:animate-in data-[state=closed]:animate-out", "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", k),
61
- onClick: S,
62
- "data-state": x ? "open" : "closed",
59
+ onDismiss: C,
60
+ children: /* @__PURE__ */ b("div", {
61
+ className: t("fixed inset-0 flex items-center justify-center bg-bg-overlay backdrop-blur-md", a, "data-[state=open]:animate-in data-[state=closed]:animate-out", "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", A),
62
+ onClick: C,
63
+ "data-state": S ? "open" : "closed",
63
64
  role: "dialog",
64
65
  "aria-modal": "true",
65
- children: /* @__PURE__ */ y("div", {
66
+ children: /* @__PURE__ */ b("div", {
66
67
  className: "w-full max-w-lg mx-4 max-h-[85dvh] overflow-hidden",
67
68
  onClick: (e) => e.stopPropagation(),
68
- children: /* @__PURE__ */ b("div", {
69
+ children: /* @__PURE__ */ x("div", {
69
70
  className: "overflow-hidden rounded-2xl border border-border-subtle bg-bg-elevated shadow-[var(--shadow-elevation-5)]",
70
71
  children: [
71
- /* @__PURE__ */ y(c, {
72
- value: j,
73
- placeholder: w ?? A("search.globalPlaceholder", "Search everything..."),
74
- onChange: M,
75
- onClear: () => M("")
72
+ /* @__PURE__ */ b(l, {
73
+ value: M,
74
+ placeholder: T ?? j("search.globalPlaceholder", "Search everything..."),
75
+ onChange: N,
76
+ onClear: () => N("")
76
77
  }),
77
- /* @__PURE__ */ y(l, {
78
- categories: C,
79
- selectedCategory: N,
80
- onSelect: P
78
+ /* @__PURE__ */ b(u, {
79
+ categories: w,
80
+ selectedCategory: P,
81
+ onSelect: F
81
82
  }),
82
- /* @__PURE__ */ y(u, {
83
- searchMode: K,
84
- onSearchModeChange: q,
85
- showAdvanced: V,
86
- onToggleAdvanced: () => H((e) => !e)
83
+ /* @__PURE__ */ b(d, {
84
+ searchMode: q,
85
+ onSearchModeChange: J,
86
+ showAdvanced: H,
87
+ onToggleAdvanced: () => U((e) => !e)
87
88
  }),
88
- V && /* @__PURE__ */ y(d, { filters: U }),
89
- /* @__PURE__ */ y(f, {
90
- loading: L,
91
- error: z,
92
- query: j,
93
- results: F,
94
- groupedResults: Q,
95
- recentSearches: T,
96
- onRecentSelect: M,
97
- onResultSelect: $
89
+ H && /* @__PURE__ */ b(f, { filters: W }),
90
+ /* @__PURE__ */ b(p, {
91
+ loading: R,
92
+ error: B,
93
+ query: M,
94
+ results: I,
95
+ groupedResults: $,
96
+ recentSearches: E,
97
+ onRecentSelect: N,
98
+ onResultSelect: ee
98
99
  }),
99
- j && F.length > 0 && O && /* @__PURE__ */ y("div", {
100
+ M && I.length > 0 && k && /* @__PURE__ */ b("div", {
100
101
  className: "border-t border-border-subtle p-2",
101
- children: /* @__PURE__ */ b("button", {
102
+ children: /* @__PURE__ */ x("button", {
102
103
  type: "button",
103
104
  onClick: () => {
104
- O(j, W(), N), S();
105
+ k(M, G(), P), C();
105
106
  },
106
107
  className: "w-full flex items-center justify-center gap-2 py-2 text-sm font-medium text-text-link hover:bg-bg-sunken rounded-button transition-colors",
107
- children: [/* @__PURE__ */ y(v, { className: "size-4" }), A("search.viewAllResults", "View all results")]
108
+ children: [/* @__PURE__ */ b(y, { className: "size-4" }), j("search.viewAllResults", "View all results")]
108
109
  })
109
110
  })
110
111
  ]
@@ -114,4 +115,4 @@ function x({ open: x, onClose: S, categories: C = [], placeholder: w, recentSear
114
115
  }) : null;
115
116
  }
116
117
  //#endregion
117
- export { x as GlobalSearch };
118
+ export { S as GlobalSearch };
@@ -1,83 +1,88 @@
1
1
  import { desktopSetBadgeCount as e } from "../shared/native/desktop.js";
2
- import { useAssistantControl as t } from "../shared/assistant/appControls/useAssistantControl.js";
3
- import { BellButton as n } from "./notificationCenter/BellButton.js";
4
- import { sortNotifications as r } from "./notificationCenter/constants.js";
5
- import { NotificationFilters as i } from "./notificationCenter/NotificationFilters.js";
6
- import { NotificationFooter as a } from "./notificationCenter/NotificationFooter.js";
7
- import { NotificationHeader as o } from "./notificationCenter/NotificationHeader.js";
8
- import { NotificationList as s } from "./notificationCenter/NotificationList.js";
9
- import { NotificationPanel as c } from "./notificationCenter/NotificationPanel.js";
10
- import { useNotificationCenter as l } from "./notificationCenter/useNotificationCenter.js";
11
- import { useOutsideClickClose as u, usePanelChrome as d } from "./notificationCenter/usePanelChrome.js";
12
- import { useCallback as f, useEffect as p, useMemo as m, useRef as h, useState as g } from "react";
13
- import { jsx as _, jsxs as v } from "react/jsx-runtime";
2
+ import { navigateInApp as t } from "../shared/navigation/inAppPath.js";
3
+ import { useAssistantControl as n } from "../shared/assistant/appControls/useAssistantControl.js";
4
+ import { BellButton as r } from "./notificationCenter/BellButton.js";
5
+ import { sortNotifications as i } from "./notificationCenter/constants.js";
6
+ import { NotificationFilters as a } from "./notificationCenter/NotificationFilters.js";
7
+ import { NotificationFooter as o } from "./notificationCenter/NotificationFooter.js";
8
+ import { NotificationHeader as s } from "./notificationCenter/NotificationHeader.js";
9
+ import { NotificationList as c } from "./notificationCenter/NotificationList.js";
10
+ import { NotificationPanel as l } from "./notificationCenter/NotificationPanel.js";
11
+ import { useNotificationCenter as u } from "./notificationCenter/useNotificationCenter.js";
12
+ import { useOutsideClickClose as d, usePanelChrome as f } from "./notificationCenter/usePanelChrome.js";
13
+ import { useCallback as p, useEffect as m, useMemo as h, useRef as g, useState as _ } from "react";
14
+ import { jsx as v, jsxs as y } from "react/jsx-runtime";
14
15
  //#region src/chrome/NotificationCenter.tsx
15
- var y = ({ client: y, onViewAll: b, compact: x = !1, pollInterval: S = 3e4, lazy: C = !1 }) => {
16
- let w = h(null), [T, E] = g(!1), [D, O] = g("all"), [k, A] = g("ALL"), [j, M] = g("ALL"), [N, P] = g("newest"), F = f(() => E(!1), []), I = f(() => E((e) => !e), []);
17
- t("header.notifications", m(() => ({ run: () => T ? { status: "already" } : (E(!0), { status: "done" }) }), [T]));
18
- let { isMobile: L } = d();
19
- u(T, L, w, F);
20
- let { notifications: R, unreadCount: z, countsByApp: B, totalCount: V, loading: H, error: U, fetchNotifications: W, handleMarkAsRead: G, handleMarkAllAsRead: K, handleDelete: q } = l({
21
- client: y,
22
- isOpen: T,
23
- lazy: C,
24
- filterTab: D,
25
- typeFilter: k,
26
- appFilter: j
16
+ var b = ({ client: b, onViewAll: x, compact: S = !1, pollInterval: C = 3e4, lazy: w = !1 }) => {
17
+ let T = g(null), [E, D] = _(!1), [O, k] = _("all"), [A, j] = _("ALL"), [M, N] = _("ALL"), [P, F] = _("newest"), I = p(() => D(!1), []), L = p(() => D((e) => !e), []);
18
+ n("header.notifications", h(() => ({ run: () => E ? { status: "already" } : (D(!0), { status: "done" }) }), [E]));
19
+ let { isMobile: R } = f();
20
+ d(E, R, T, I);
21
+ let { notifications: z, unreadCount: B, countsByApp: V, totalCount: H, loading: U, error: W, fetchNotifications: G, handleMarkAsRead: K, handleMarkAllAsRead: q, handleDelete: J } = u({
22
+ client: b,
23
+ isOpen: E,
24
+ lazy: w,
25
+ filterTab: O,
26
+ typeFilter: A,
27
+ appFilter: M
27
28
  });
28
- p(() => {
29
- e(z);
30
- }, [z]);
31
- let J = f((e) => {
29
+ m(() => {
30
+ e(B);
31
+ }, [B]);
32
+ let Y = p((e) => {
33
+ if (t(e)) {
34
+ D(!1);
35
+ return;
36
+ }
32
37
  window.open(e, "_blank", "noopener,noreferrer");
33
- }, []), Y = f(() => {
34
- E(!1), b?.();
35
- }, [b]), X = r(R, N), Z = Object.entries(B).filter(([e]) => e && e !== "null").sort((e, t) => t[1] - e[1]);
36
- return /* @__PURE__ */ v("div", {
37
- ref: w,
38
+ }, []), X = p(() => {
39
+ D(!1), x?.();
40
+ }, [x]), Z = i(z, P), Q = Object.entries(V).filter(([e]) => e && e !== "null").sort((e, t) => t[1] - e[1]);
41
+ return /* @__PURE__ */ y("div", {
42
+ ref: T,
38
43
  className: "relative",
39
- children: [/* @__PURE__ */ _(n, {
40
- unreadCount: z,
41
- isOpen: T,
42
- onToggle: I
43
- }), T && /* @__PURE__ */ _(c, {
44
- isMobile: L,
45
- onClose: F,
46
- children: /* @__PURE__ */ v("div", {
44
+ children: [/* @__PURE__ */ v(r, {
45
+ unreadCount: B,
46
+ isOpen: E,
47
+ onToggle: L
48
+ }), E && /* @__PURE__ */ v(l, {
49
+ isMobile: R,
50
+ onClose: I,
51
+ children: /* @__PURE__ */ y("div", {
47
52
  className: "flex flex-col h-full",
48
53
  children: [
49
- /* @__PURE__ */ _(o, {
50
- isMobile: L,
51
- unreadCount: z,
52
- onClose: F,
53
- onMarkAllAsRead: K
54
+ /* @__PURE__ */ v(s, {
55
+ isMobile: R,
56
+ unreadCount: B,
57
+ onClose: I,
58
+ onMarkAllAsRead: q
54
59
  }),
55
- /* @__PURE__ */ _(i, {
56
- filterTab: D,
57
- typeFilter: k,
58
- appFilter: j,
59
- sortBy: N,
60
- appNames: Z,
61
- onFilterTabChange: O,
62
- onTypeFilterChange: A,
63
- onAppFilterChange: M,
64
- onSortByChange: P
60
+ /* @__PURE__ */ v(a, {
61
+ filterTab: O,
62
+ typeFilter: A,
63
+ appFilter: M,
64
+ sortBy: P,
65
+ appNames: Q,
66
+ onFilterTabChange: k,
67
+ onTypeFilterChange: j,
68
+ onAppFilterChange: N,
69
+ onSortByChange: F
65
70
  }),
66
- /* @__PURE__ */ _(s, {
67
- loading: H,
68
- error: U,
69
- notifications: X,
70
- filterTab: D,
71
- typeFilter: k,
72
- appFilter: j,
73
- onRetry: W,
74
- onMarkAsRead: G,
75
- onDelete: q,
76
- onRedirect: J
71
+ /* @__PURE__ */ v(c, {
72
+ loading: U,
73
+ error: W,
74
+ notifications: Z,
75
+ filterTab: O,
76
+ typeFilter: A,
77
+ appFilter: M,
78
+ onRetry: G,
79
+ onMarkAsRead: K,
80
+ onDelete: J,
81
+ onRedirect: Y
77
82
  }),
78
- /* @__PURE__ */ _(a, {
79
- totalCount: V,
80
- onViewAll: b ? Y : void 0
83
+ /* @__PURE__ */ v(o, {
84
+ totalCount: H,
85
+ onViewAll: x ? X : void 0
81
86
  })
82
87
  ]
83
88
  })
@@ -85,4 +90,4 @@ var y = ({ client: y, onViewAll: b, compact: x = !1, pollInterval: S = 3e4, lazy
85
90
  });
86
91
  };
87
92
  //#endregion
88
- export { y as NotificationCenter };
93
+ export { b as NotificationCenter };
@@ -51,7 +51,7 @@ export { FooterBar } from './FooterBar';
51
51
  export { Footer, DEFAULT_FOOTER_COLUMNS, DEFAULT_SOCIAL_LINKS } from './Footer';
52
52
  export { SideNavigation } from './SideNavigation';
53
53
  export { GlobalSearch } from './GlobalSearch';
54
- export { CommandPalette } from './CommandPalette';
54
+ export { CommandPalette, COMMAND_PALETTE_SHORTCUT, COMMAND_PALETTE_HELP_SHORTCUT, } from './CommandPalette';
55
55
  export { Breadcrumbs } from './Breadcrumbs';
56
56
  export { NavLink } from './NavLink';
57
57
  export { Tabs } from './Tabs';
package/dist/chrome.js CHANGED
@@ -9,43 +9,43 @@ import { PluginFooterStrip as d } from "./chrome/PluginFooterStrip.js";
9
9
  import { DEFAULT_FOOTER_COLUMNS as f, DEFAULT_SOCIAL_LINKS as p, Footer as m } from "./chrome/Footer.js";
10
10
  import { SideNavigation as h } from "./chrome/SideNavigation.js";
11
11
  import { GlobalSearch as g } from "./chrome/GlobalSearch.js";
12
- import { CommandPalette as _ } from "./chrome/CommandPalette.js";
13
- import { Breadcrumbs as v } from "./chrome/Breadcrumbs.js";
14
- import { NavLink as y } from "./chrome/NavLink.js";
15
- import { Tabs as b } from "./chrome/Tabs.js";
16
- import { Sidebar as x } from "./chrome/Sidebar.js";
17
- import { ProfileSwitcher as S } from "./chrome/ProfileSwitcher.js";
18
- import { ProductSwitcher as C } from "./chrome/ProductSwitcher.js";
19
- import { LanguageSwitcher as w } from "./chrome/LanguageSwitcher.js";
20
- import { ContextSwitcher as T } from "./chrome/ContextSwitcher.js";
21
- import { GeographySwitcher as E } from "./chrome/GeographySwitcher.js";
22
- import { PushOptInToggle as D } from "./chrome/notificationCenter/PushOptInToggle.js";
23
- import { NotificationCenter as O } from "./chrome/NotificationCenter.js";
24
- import { LanguagePickerSheet as k } from "./chrome/LanguagePickerSheet.js";
25
- import { ProductPickerSheet as A } from "./chrome/ProductPickerSheet.js";
26
- import { AccountSwitcher as j } from "./chrome/AccountSwitcher.js";
27
- import { firstProjectOfWorkspace as M, switchOrganization as N, switchWorkspace as P } from "./chrome/contextSwitcher/contextSwitch.js";
28
- import { resolveSwitchTarget as F, sectionLandingRule as I } from "./chrome/contextSwitcher/resolveSwitchTarget.js";
29
- import { useContextSwitchController as L } from "./chrome/contextSwitcher/useContextSwitchController.js";
30
- import { AutoBreadcrumbs as R, registerBreadcrumbName as z, unregisterBreadcrumbName as B } from "./chrome/AutoBreadcrumbs.js";
31
- import { NavCustomizeDialog as V } from "./chrome/NavCustomizeDialog.js";
32
- import { PersonaSimulationPill as H, PersonaSurfaceControls as U } from "./chrome/PersonaSurfaceControls.js";
33
- import { ProductSideNav as W } from "./chrome/ProductSideNav.js";
34
- import { BrandMark as G } from "./chrome/BrandMark.js";
35
- import { DynamicFooter as K } from "./chrome/DynamicFooter.js";
36
- import { PanelTabs as q } from "./chrome/PanelTabs.js";
37
- import { PanelContainer as J } from "./chrome/PanelContainer.js";
38
- import { StatusBar as Y } from "./chrome/StatusBar.js";
39
- import { PluginRoutes as X } from "./chrome/PluginRoutes.js";
40
- import { PluginSettingsPage as Z } from "./chrome/PluginSettingsPage.js";
41
- import { PluginToolbar as Q } from "./chrome/PluginToolbar.js";
42
- import { PluginWidgetGrid as $ } from "./chrome/PluginWidgetGrid.js";
43
- import { PluginContextMenuTarget as ee } from "./chrome/PluginContextMenuTarget.js";
44
- import { selectMobileTabs as te } from "./chrome/mobileTabBar/selectTabs.js";
45
- import { useMobileTabBarVisible as ne } from "./chrome/mobileTabBar/useMobileTabBarVisible.js";
46
- import { MobileTabBar as re } from "./chrome/MobileTabBar.js";
47
- import { NativeTopBar as ie } from "./chrome/NativeTopBar.js";
48
- import { SwipeNavigation as ae } from "./chrome/SwipeNavigation.js";
49
- import { NativePageTransition as oe } from "./chrome/NativePageTransition.js";
50
- import { findNavTitle as se, useNativeTopBarTitle as ce } from "./chrome/nativeTopBarTitle.js";
51
- export { j as AccountSwitcher, s as AppShellLayout, R as AutoBreadcrumbs, G as BrandMark, v as Breadcrumbs, _ as CommandPalette, T as ContextSwitcher, f as DEFAULT_FOOTER_COLUMNS, p as DEFAULT_SOCIAL_LINKS, K as DynamicFooter, m as Footer, u as FooterBar, E as GeographySwitcher, g as GlobalSearch, l as HeaderBar, k as LanguagePickerSheet, w as LanguageSwitcher, re as MobileTabBar, n as NAV_MORE_ID_PREFIX, oe as NativePageTransition, ie as NativeTopBar, V as NavCustomizeDialog, y as NavLink, O as NotificationCenter, c as PageHeader, J as PanelContainer, q as PanelTabs, H as PersonaSimulationPill, U as PersonaSurfaceControls, ee as PluginContextMenuTarget, d as PluginFooterStrip, X as PluginRoutes, Z as PluginSettingsPage, Q as PluginToolbar, $ as PluginWidgetGrid, A as ProductPickerSheet, W as ProductSideNav, C as ProductSwitcher, S as ProfileSwitcher, D as PushOptInToggle, t as ShortcutHelpDialog, h as SideNavigation, x as Sidebar, Y as StatusBar, ae as SwipeNavigation, b as Tabs, e as ThemePreferences, r as applyNavVisibility, i as applyPermissionFilter, a as applySurfaceVisibility, se as findNavTitle, M as firstProjectOfWorkspace, o as isItemEffectivelyShown, z as registerBreadcrumbName, F as resolveSwitchTarget, I as sectionLandingRule, te as selectMobileTabs, N as switchOrganization, P as switchWorkspace, B as unregisterBreadcrumbName, L as useContextSwitchController, ne as useMobileTabBarVisible, ce as useNativeTopBarTitle };
12
+ import { COMMAND_PALETTE_HELP_SHORTCUT as _, COMMAND_PALETTE_SHORTCUT as v, CommandPalette as y } from "./chrome/CommandPalette.js";
13
+ import { Breadcrumbs as b } from "./chrome/Breadcrumbs.js";
14
+ import { NavLink as x } from "./chrome/NavLink.js";
15
+ import { Tabs as S } from "./chrome/Tabs.js";
16
+ import { Sidebar as C } from "./chrome/Sidebar.js";
17
+ import { ProfileSwitcher as w } from "./chrome/ProfileSwitcher.js";
18
+ import { ProductSwitcher as T } from "./chrome/ProductSwitcher.js";
19
+ import { LanguageSwitcher as E } from "./chrome/LanguageSwitcher.js";
20
+ import { ContextSwitcher as D } from "./chrome/ContextSwitcher.js";
21
+ import { GeographySwitcher as O } from "./chrome/GeographySwitcher.js";
22
+ import { PushOptInToggle as k } from "./chrome/notificationCenter/PushOptInToggle.js";
23
+ import { NotificationCenter as A } from "./chrome/NotificationCenter.js";
24
+ import { LanguagePickerSheet as j } from "./chrome/LanguagePickerSheet.js";
25
+ import { ProductPickerSheet as M } from "./chrome/ProductPickerSheet.js";
26
+ import { AccountSwitcher as N } from "./chrome/AccountSwitcher.js";
27
+ import { firstProjectOfWorkspace as P, switchOrganization as F, switchWorkspace as I } from "./chrome/contextSwitcher/contextSwitch.js";
28
+ import { resolveSwitchTarget as L, sectionLandingRule as R } from "./chrome/contextSwitcher/resolveSwitchTarget.js";
29
+ import { useContextSwitchController as z } from "./chrome/contextSwitcher/useContextSwitchController.js";
30
+ import { AutoBreadcrumbs as B, registerBreadcrumbName as V, unregisterBreadcrumbName as H } from "./chrome/AutoBreadcrumbs.js";
31
+ import { NavCustomizeDialog as U } from "./chrome/NavCustomizeDialog.js";
32
+ import { PersonaSimulationPill as W, PersonaSurfaceControls as G } from "./chrome/PersonaSurfaceControls.js";
33
+ import { ProductSideNav as K } from "./chrome/ProductSideNav.js";
34
+ import { BrandMark as q } from "./chrome/BrandMark.js";
35
+ import { DynamicFooter as J } from "./chrome/DynamicFooter.js";
36
+ import { PanelTabs as Y } from "./chrome/PanelTabs.js";
37
+ import { PanelContainer as X } from "./chrome/PanelContainer.js";
38
+ import { StatusBar as Z } from "./chrome/StatusBar.js";
39
+ import { PluginRoutes as Q } from "./chrome/PluginRoutes.js";
40
+ import { PluginSettingsPage as $ } from "./chrome/PluginSettingsPage.js";
41
+ import { PluginToolbar as ee } from "./chrome/PluginToolbar.js";
42
+ import { PluginWidgetGrid as te } from "./chrome/PluginWidgetGrid.js";
43
+ import { PluginContextMenuTarget as ne } from "./chrome/PluginContextMenuTarget.js";
44
+ import { selectMobileTabs as re } from "./chrome/mobileTabBar/selectTabs.js";
45
+ import { useMobileTabBarVisible as ie } from "./chrome/mobileTabBar/useMobileTabBarVisible.js";
46
+ import { MobileTabBar as ae } from "./chrome/MobileTabBar.js";
47
+ import { NativeTopBar as oe } from "./chrome/NativeTopBar.js";
48
+ import { SwipeNavigation as se } from "./chrome/SwipeNavigation.js";
49
+ import { NativePageTransition as ce } from "./chrome/NativePageTransition.js";
50
+ import { findNavTitle as le, useNativeTopBarTitle as ue } from "./chrome/nativeTopBarTitle.js";
51
+ export { N as AccountSwitcher, s as AppShellLayout, B as AutoBreadcrumbs, q as BrandMark, b as Breadcrumbs, _ as COMMAND_PALETTE_HELP_SHORTCUT, v as COMMAND_PALETTE_SHORTCUT, y as CommandPalette, D as ContextSwitcher, f as DEFAULT_FOOTER_COLUMNS, p as DEFAULT_SOCIAL_LINKS, J as DynamicFooter, m as Footer, u as FooterBar, O as GeographySwitcher, g as GlobalSearch, l as HeaderBar, j as LanguagePickerSheet, E as LanguageSwitcher, ae as MobileTabBar, n as NAV_MORE_ID_PREFIX, ce as NativePageTransition, oe as NativeTopBar, U as NavCustomizeDialog, x as NavLink, A as NotificationCenter, c as PageHeader, X as PanelContainer, Y as PanelTabs, W as PersonaSimulationPill, G as PersonaSurfaceControls, ne as PluginContextMenuTarget, d as PluginFooterStrip, Q as PluginRoutes, $ as PluginSettingsPage, ee as PluginToolbar, te as PluginWidgetGrid, M as ProductPickerSheet, K as ProductSideNav, T as ProductSwitcher, w as ProfileSwitcher, k as PushOptInToggle, t as ShortcutHelpDialog, h as SideNavigation, C as Sidebar, Z as StatusBar, se as SwipeNavigation, S as Tabs, e as ThemePreferences, r as applyNavVisibility, i as applyPermissionFilter, a as applySurfaceVisibility, le as findNavTitle, P as firstProjectOfWorkspace, o as isItemEffectivelyShown, V as registerBreadcrumbName, L as resolveSwitchTarget, R as sectionLandingRule, re as selectMobileTabs, F as switchOrganization, I as switchWorkspace, H as unregisterBreadcrumbName, z as useContextSwitchController, ie as useMobileTabBarVisible, ue as useNativeTopBarTitle };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Why a search could not run. `search()` throws it so the search UI shows an
3
+ * error instead of an empty "No results found" that hides a backend outage.
4
+ * `reason` is `NO_WORKSPACE_CONTEXT` without an active workspace, `UNAVAILABLE`
5
+ * when the search request failed; `detail` keeps the backend message for logs.
6
+ */
7
+ export declare class GlobalSearchError extends Error {
8
+ readonly reason: "NO_WORKSPACE_CONTEXT" | "UNAVAILABLE";
9
+ readonly detail: string;
10
+ constructor(reason: "NO_WORKSPACE_CONTEXT" | "UNAVAILABLE", detail: string);
11
+ }
@@ -0,0 +1,10 @@
1
+ //#region src/shared/hooks/shell/globalSearchError.ts
2
+ var e = class extends Error {
3
+ reason;
4
+ detail;
5
+ constructor(e, t) {
6
+ super(e === "NO_WORKSPACE_CONTEXT" ? "Select a workspace to search it." : "Search is unavailable right now. Try again in a moment."), this.name = "GlobalSearchError", this.reason = e, this.detail = t;
7
+ }
8
+ };
9
+ //#endregion
10
+ export { e as GlobalSearchError };
@@ -1,4 +1,6 @@
1
1
  import { SearchResult, SearchResponse } from '../../types';
2
+ import { GlobalSearchError } from './globalSearchError';
3
+ export { GlobalSearchError };
2
4
  export type MetadataOperator = 'EQUALS' | 'NOT_EQUALS' | 'CONTAINS' | 'STARTS_WITH';
3
5
  /** Metadata condition for filtering search results */
4
6
  export interface MetadataCondition {
@@ -1,8 +1,9 @@
1
1
  import { graphqlFetch as e } from "../../graphql/fetch.js";
2
2
  import { useActiveContext as t } from "../../providers/shell/ActiveContextProvider.js";
3
- import { useCallback as n, useRef as r, useState as i } from "react";
3
+ import { GlobalSearchError as n } from "./globalSearchError.js";
4
+ import { useCallback as r, useRef as i, useState as a } from "react";
4
5
  //#region src/shared/hooks/shell/useGlobalSearch.ts
5
- var a = "\n query GlobalSearch(\n $query: String!\n $searchMode: GraphSearchMode\n $entityTypes: [String!]\n $excludeEntityTypes: [String!]\n $productSources: [String!]\n $workspaceId: ID\n $projectId: ID\n $createdBy: ID\n $updatedBy: ID\n $dateRange: GraphDateRangeInput\n $updatedDateRange: GraphDateRangeInput\n $metadataConditions: [GraphMetadataConditionInput!]\n $tagFilter: GraphTagFilterInput\n $excludeIds: [ID!]\n $sortBy: GraphSearchSortBy\n $limit: Int\n $offset: Int\n ) {\n globalSearch(\n query: $query\n searchMode: $searchMode\n entityTypes: $entityTypes\n excludeEntityTypes: $excludeEntityTypes\n productSources: $productSources\n workspaceId: $workspaceId\n projectId: $projectId\n createdBy: $createdBy\n updatedBy: $updatedBy\n dateRange: $dateRange\n updatedDateRange: $updatedDateRange\n metadataConditions: $metadataConditions\n tagFilter: $tagFilter\n excludeIds: $excludeIds\n sortBy: $sortBy\n limit: $limit\n offset: $offset\n ) {\n results {\n entityId\n entityType\n productSource\n title\n description\n score\n workspaceId\n projectId\n createdBy\n updatedBy\n metadata\n }\n total\n hasMore\n facets {\n byType { type count }\n byProduct { product count }\n byWorkspace { workspaceId count }\n }\n searchTimeMs\n }\n }\n", o = {
6
+ var o = "\n query GlobalSearch(\n $query: String!\n $searchMode: GraphSearchMode\n $entityTypes: [String!]\n $excludeEntityTypes: [String!]\n $productSources: [String!]\n $workspaceId: ID\n $projectId: ID\n $createdBy: ID\n $updatedBy: ID\n $dateRange: GraphDateRangeInput\n $updatedDateRange: GraphDateRangeInput\n $metadataConditions: [GraphMetadataConditionInput!]\n $tagFilter: GraphTagFilterInput\n $excludeIds: [ID!]\n $sortBy: GraphSearchSortBy\n $limit: Int\n $offset: Int\n ) {\n globalSearch(\n query: $query\n searchMode: $searchMode\n entityTypes: $entityTypes\n excludeEntityTypes: $excludeEntityTypes\n productSources: $productSources\n workspaceId: $workspaceId\n projectId: $projectId\n createdBy: $createdBy\n updatedBy: $updatedBy\n dateRange: $dateRange\n updatedDateRange: $updatedDateRange\n metadataConditions: $metadataConditions\n tagFilter: $tagFilter\n excludeIds: $excludeIds\n sortBy: $sortBy\n limit: $limit\n offset: $offset\n ) {\n results {\n entityId\n entityType\n productSource\n title\n description\n score\n workspaceId\n projectId\n createdBy\n updatedBy\n metadata\n }\n total\n hasMore\n facets {\n byType { type count }\n byProduct { product count }\n byWorkspace { workspaceId count }\n }\n searchTimeMs\n }\n }\n", s = {
6
7
  workspaces: ["workspace"],
7
8
  projects: ["project"],
8
9
  members: ["member", "user"],
@@ -151,16 +152,16 @@ var a = "\n query GlobalSearch(\n $query: String!\n $searchMode: GraphSea
151
152
  "ecoalertthreshold"
152
153
  ]
153
154
  };
154
- function s(e) {
155
- if (e) return o[e];
155
+ function c(e) {
156
+ if (e) return s[e];
156
157
  }
157
- var c = new Set([
158
+ var l = new Set([
158
159
  "datatable",
159
160
  "scheduledjob",
160
161
  "eventregistration",
161
162
  "variable"
162
163
  ]);
163
- function l(e, t) {
164
+ function u(e, t) {
164
165
  if (t?.productSource !== "module-workflow") return;
165
166
  let n = t.metadata?.workflowId;
166
167
  switch (e) {
@@ -171,8 +172,8 @@ function l(e, t) {
171
172
  default: return;
172
173
  }
173
174
  }
174
- function u(e, t, n, r) {
175
- let i = l(e.toLowerCase(), r);
175
+ function d(e, t, n, r) {
176
+ let i = u(e.toLowerCase(), r);
176
177
  if (i) return i;
177
178
  switch (e.toLowerCase()) {
178
179
  case "agent": return `/vibecontrols/agents/${t}`;
@@ -241,8 +242,8 @@ function u(e, t, n, r) {
241
242
  default: return `/entities/${e}/${t}`;
242
243
  }
243
244
  }
244
- function d(e, t) {
245
- if (t === "module-workflow" && c.has(e.toLowerCase())) return "workflows";
245
+ function f(e, t) {
246
+ if (t === "module-workflow" && l.has(e.toLowerCase())) return "workflows";
246
247
  switch (e.toLowerCase()) {
247
248
  case "workspace": return "workspaces";
248
249
  case "project": return "projects";
@@ -302,35 +303,35 @@ function d(e, t) {
302
303
  default: return e;
303
304
  }
304
305
  }
305
- var f = 20;
306
- function p() {
307
- let [o, c] = i(!1), l = r(null), { workspaceId: p } = t(), m = n(async (t, n, r) => {
306
+ var p = 20;
307
+ function m() {
308
+ let [s, l] = a(!1), u = i(null), { workspaceId: m } = t(), h = r(async (t, n, r) => {
308
309
  let i = t.trim();
309
310
  if (!i) return {
310
311
  results: [],
311
312
  total: 0,
312
313
  hasMore: !1
313
314
  };
314
- if (!p) return console.warn("[useGlobalSearch] No workspace context available — search requires an active workspace"), {
315
+ if (!m) return console.warn("[useGlobalSearch] No workspace context available — search requires an active workspace"), {
315
316
  results: [],
316
317
  total: 0,
317
318
  hasMore: !1,
318
319
  error: "NO_WORKSPACE_CONTEXT"
319
320
  };
320
- l.current && l.current.abort();
321
- let o = new AbortController();
322
- l.current = o, c(!0);
321
+ u.current && u.current.abort();
322
+ let a = new AbortController();
323
+ u.current = a, l(!0);
323
324
  try {
324
- let t = n ? s(n) : r?.entityTypes, c = await e({
325
+ let t = n ? c(n) : r?.entityTypes, s = await e({
325
326
  gateway: "workspace",
326
- query: a,
327
+ query: o,
327
328
  variables: {
328
329
  query: i,
329
330
  searchMode: r?.searchMode ?? "PARTIAL",
330
331
  entityTypes: t ?? void 0,
331
332
  excludeEntityTypes: r?.excludeEntityTypes ?? void 0,
332
333
  productSources: r?.productSources ?? void 0,
333
- workspaceId: p,
334
+ workspaceId: m,
334
335
  projectId: r?.projectId ?? void 0,
335
336
  createdBy: r?.createdBy ?? void 0,
336
337
  updatedBy: r?.updatedBy ?? void 0,
@@ -340,27 +341,27 @@ function p() {
340
341
  tagFilter: r?.tagFilter ?? void 0,
341
342
  excludeIds: r?.excludeIds ?? void 0,
342
343
  sortBy: r?.sortBy ?? void 0,
343
- limit: r?.limit ?? f,
344
+ limit: r?.limit ?? p,
344
345
  offset: r?.offset ?? 0
345
346
  },
346
347
  workspaceToken: !0,
347
- workspaceId: p,
348
- signal: o.signal
348
+ workspaceId: m,
349
+ signal: a.signal
349
350
  });
350
- if (c.errors?.length) return console.warn("[useGlobalSearch] GraphQL errors:", JSON.stringify(c.errors)), {
351
+ if (s.errors?.length) return console.warn("[useGlobalSearch] GraphQL errors:", JSON.stringify(s.errors)), {
351
352
  results: [],
352
353
  total: 0,
353
354
  hasMore: !1,
354
- error: c.errors.map((e) => e.message).join("; ")
355
+ error: s.errors.map((e) => e.message).join("; ")
355
356
  };
356
- let l = c.data?.globalSearch, m = (l?.results ?? []).map((e) => ({
357
+ let l = s.data?.globalSearch, u = (l?.results ?? []).map((e) => ({
357
358
  id: e.entityId,
358
359
  title: e.title,
359
360
  description: e.description ?? void 0,
360
- category: d(e.entityType, e.productSource),
361
+ category: f(e.entityType, e.productSource),
361
362
  entityType: e.entityType,
362
363
  productSource: e.productSource,
363
- href: u(e.entityType, e.entityId, e.workspaceId, {
364
+ href: d(e.entityType, e.entityId, e.workspaceId, {
364
365
  productSource: e.productSource,
365
366
  metadata: e.metadata
366
367
  }),
@@ -380,27 +381,36 @@ function p() {
380
381
  byWorkspace: l.facets.byWorkspace ?? []
381
382
  } : void 0;
382
383
  return {
383
- results: m,
384
- total: l?.total ?? m.length,
384
+ results: u,
385
+ total: l?.total ?? u.length,
385
386
  hasMore: l?.hasMore ?? !1,
386
387
  facets: h,
387
388
  searchTimeMs: l?.searchTimeMs ?? void 0
388
389
  };
389
390
  } catch (e) {
390
- return e instanceof DOMException && e.name === "AbortError" || console.warn("[useGlobalSearch] Search failed:", e), {
391
+ return e instanceof DOMException && e.name === "AbortError" ? {
391
392
  results: [],
392
393
  total: 0,
393
394
  hasMore: !1
394
- };
395
+ } : (console.warn("[useGlobalSearch] Search failed:", e), {
396
+ results: [],
397
+ total: 0,
398
+ hasMore: !1,
399
+ error: e instanceof Error ? e.message : String(e)
400
+ });
395
401
  } finally {
396
- l.current === o && c(!1);
402
+ u.current === a && l(!1);
397
403
  }
398
- }, [p]);
404
+ }, [m]);
399
405
  return {
400
- searchFull: m,
401
- search: n(async (e, t, n) => (await m(e, t, n)).results, [m]),
402
- isSearching: o
406
+ searchFull: h,
407
+ search: r(async (e, t, r) => {
408
+ let i = await h(e, t, r);
409
+ if (i.error) throw new n(i.error === "NO_WORKSPACE_CONTEXT" ? "NO_WORKSPACE_CONTEXT" : "UNAVAILABLE", i.error);
410
+ return i.results;
411
+ }, [h]),
412
+ isSearching: s
403
413
  };
404
414
  }
405
415
  //#endregion
406
- export { p as useGlobalSearch };
416
+ export { m as useGlobalSearch };
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Same-origin, in-app navigation helpers with no native dependency, so the
3
+ * shell chrome (statically imported by microfrontends) can use them without
4
+ * pulling `@capacitor/*` in. `shell-native` deep links share `isSafeInAppPath`.
5
+ */
6
+ /**
7
+ * True for a same-origin, in-app path: `/x`, `/x?y#z`. Refuses protocol-relative
8
+ * (`//host`, `/\host`) and anything that is not a rooted path, so a deep link or
9
+ * a notification payload can never steer the page to another origin.
10
+ */
11
+ export declare function isSafeInAppPath(path: string): boolean;
12
+ /**
13
+ * The in-app path a link points at, or null when it leaves the app: a rooted
14
+ * path is taken as is; an absolute URL only when its origin is `origin`.
15
+ */
16
+ export declare function toInAppPath(url: string, origin: string): string | null;
17
+ /** The window members in-app navigation uses (a seam for tests). */
18
+ export interface InAppNavigationWindow {
19
+ location: {
20
+ origin: string;
21
+ };
22
+ history: {
23
+ pushState: (data: unknown, unused: string, url?: string | null) => void;
24
+ };
25
+ dispatchEvent: (event: Event) => boolean;
26
+ }
27
+ /**
28
+ * Navigate inside the app without a reload: push the path and announce it with
29
+ * `popstate`, which React Router's browser history and `ActiveContextProvider`
30
+ * (for `?org/workspace/project/tenant`) both listen to. Returns false, and does
31
+ * nothing, when `url` leaves the app — the caller then opens it in a new tab.
32
+ */
33
+ export declare function navigateInApp(url: string, win?: InAppNavigationWindow | undefined): boolean;
@@ -0,0 +1,32 @@
1
+ //#region src/shared/navigation/inAppPath.ts
2
+ function e(e) {
3
+ if (typeof e != "string" || !e.startsWith("/") || e.startsWith("//") || e.startsWith("/\\")) return !1;
4
+ for (let t = 0; t < e.length; t += 1) {
5
+ let n = e.charCodeAt(t);
6
+ if (n < 32 || n === 127) return !1;
7
+ }
8
+ return !0;
9
+ }
10
+ function t(t, n) {
11
+ if (typeof t != "string" || t.length === 0) return null;
12
+ if (t.startsWith("/")) return e(t) ? t : null;
13
+ let r;
14
+ try {
15
+ r = new URL(t);
16
+ } catch {
17
+ return null;
18
+ }
19
+ if (r.origin !== n) return null;
20
+ let i = `${r.pathname || "/"}${r.search}${r.hash}`;
21
+ return e(i) ? i : null;
22
+ }
23
+ function n(e, n = globalThis.window) {
24
+ if (!n) return !1;
25
+ let r = t(e, n.location.origin);
26
+ if (r === null) return !1;
27
+ n.history.pushState(null, "", r);
28
+ let i = typeof PopStateEvent == "function" ? new PopStateEvent("popstate", { state: null }) : new Event("popstate");
29
+ return n.dispatchEvent(i), !0;
30
+ }
31
+ //#endregion
32
+ export { e as isSafeInAppPath, n as navigateInApp };
@@ -1,5 +1,6 @@
1
1
  import { DEFAULT_ACTIVE_CONTEXT_URL_PARAMS as e } from "../shared/providers/shell/ActiveContextStorage.js";
2
- import { isSafeInAppPath as t } from "./deep-link.js";
2
+ import { isSafeInAppPath as t } from "../shared/navigation/inAppPath.js";
3
+ import "./deep-link.js";
3
4
  //#region src/shell-native/deep-link-context.ts
4
5
  var n = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|c[a-z0-9]{8,32})$/i;
5
6
  function r(t, r = {}) {
@@ -1,3 +1,5 @@
1
+ import { isSafeInAppPath } from '../shared/navigation/inAppPath';
2
+ export { isSafeInAppPath };
1
3
  export type DeepLinkNavigator = (path: string) => void;
2
4
  /**
3
5
  * How long `bootNativeShell` waits for a router to call
@@ -5,12 +7,6 @@ export type DeepLinkNavigator = (path: string) => void;
5
7
  * through `history.pushState` + `popstate` (see `armDeepLinkFallback`).
6
8
  */
7
9
  export declare const DEFAULT_DEEP_LINK_FALLBACK_DELAY_MS = 4000;
8
- /**
9
- * True for a same-origin, in-app path: `/x`, `/x?y#z`. Refuses protocol-relative
10
- * (`//host`, `/\host`) and anything that is not a rooted path, so a deep link or
11
- * push payload can never steer the webview to another origin.
12
- */
13
- export declare function isSafeInAppPath(path: string): boolean;
14
10
  /**
15
11
  * Map a deep-link URL to an in-app SPA path. Handles both
16
12
  * `scheme://app/path?x` (custom scheme; host is the synthetic `app`) and
@@ -1,19 +1,12 @@
1
1
  import { getDesktopBridge as e } from "../shared/native/desktop.js";
2
2
  import { isNativePluginAvailable as t } from "./platform.js";
3
3
  import { getLegacyElectronBridge as n } from "./desktop-bridge.js";
4
- import { App as r } from "@capacitor/app";
4
+ import { isSafeInAppPath as r } from "../shared/navigation/inAppPath.js";
5
+ import { App as i } from "@capacitor/app";
5
6
  //#region src/shell-native/deep-link.ts
6
- var i = 4e3, a = [], o = null, s = null, c = !1;
7
- function l(e) {
8
- if (typeof e != "string" || !e.startsWith("/") || e.startsWith("//") || e.startsWith("/\\")) return !1;
9
- for (let t = 0; t < e.length; t += 1) {
10
- let n = e.charCodeAt(t);
11
- if (n < 32 || n === 127) return !1;
12
- }
13
- return !0;
14
- }
7
+ var a = 4e3, o = [], s = null, c = null, l = !1;
15
8
  function u(e) {
16
- if (l(e) && !(typeof window > "u")) try {
9
+ if (r(e) && !(typeof window > "u")) try {
17
10
  window.history.pushState(null, "", e);
18
11
  let t = typeof PopStateEvent == "function" ? new PopStateEvent("popstate", { state: null }) : new Event("popstate");
19
12
  window.dispatchEvent(t);
@@ -22,13 +15,13 @@ function u(e) {
22
15
  }
23
16
  }
24
17
  function d() {
25
- return o || (c ? u : null);
18
+ return s || (l ? u : null);
26
19
  }
27
20
  function f() {
28
21
  let e = d();
29
- if (!e || a.length === 0) return;
30
- let t = a;
31
- a = [];
22
+ if (!e || o.length === 0) return;
23
+ let t = o;
24
+ o = [];
32
25
  for (let n of t) e(n);
33
26
  }
34
27
  function p(e) {
@@ -46,7 +39,7 @@ function m(e) {
46
39
  }
47
40
  async function h() {
48
41
  if (t("App")) try {
49
- await r.addListener("appUrlOpen", (e) => m(e.url));
42
+ await i.addListener("appUrlOpen", (e) => m(e.url));
50
43
  } catch {}
51
44
  }
52
45
  function g() {
@@ -62,27 +55,27 @@ async function _() {
62
55
  g(), await h();
63
56
  }
64
57
  function v(e) {
65
- return o = e, f(), () => {
66
- o === e && (o = null);
58
+ return s = e, f(), () => {
59
+ s === e && (s = null);
67
60
  };
68
61
  }
69
62
  function y() {
70
- o = null;
63
+ s = null;
71
64
  }
72
65
  function b(e) {
73
66
  let t = d();
74
- t ? t(e) : a.push(e);
67
+ t ? t(e) : o.push(e);
75
68
  }
76
- function x(e = i) {
77
- S(), s = setTimeout(() => {
78
- s = null, c = !0, !o && a.length > 0 && console.debug("[shell-native] no deep-link navigator registered; routing queued links via history"), f();
69
+ function x(e = a) {
70
+ S(), c = setTimeout(() => {
71
+ c = null, l = !0, !s && o.length > 0 && console.debug("[shell-native] no deep-link navigator registered; routing queued links via history"), f();
79
72
  }, Number.isFinite(e) && e > 0 ? e : 0);
80
73
  }
81
74
  function S() {
82
- s !== null && clearTimeout(s), s = null, c = !1;
75
+ c !== null && clearTimeout(c), c = null, l = !1;
83
76
  }
84
77
  function C() {
85
- S(), a = [], o = null;
78
+ S(), o = [], s = null;
86
79
  }
87
80
  //#endregion
88
- export { i as DEFAULT_DEEP_LINK_FALLBACK_DELAY_MS, x as armDeepLinkFallback, y as clearDeepLinkNavigator, p as deepLinkUrlToPath, S as disarmDeepLinkFallback, _ as installDeepLinkHandler, l as isSafeInAppPath, b as navigateDeepLinkPath, v as registerDeepLinkNavigator, C as resetDeepLinksForTests };
81
+ export { a as DEFAULT_DEEP_LINK_FALLBACK_DELAY_MS, x as armDeepLinkFallback, y as clearDeepLinkNavigator, p as deepLinkUrlToPath, S as disarmDeepLinkFallback, _ as installDeepLinkHandler, b as navigateDeepLinkPath, v as registerDeepLinkNavigator, C as resetDeepLinksForTests };
@@ -13,7 +13,8 @@ import { impactFeedback as D, notificationFeedback as O, selectionFeedback as k
13
13
  import { showNativeToast as A } from "./shell-native/toast.js";
14
14
  import { shareContent as j } from "./shell-native/share.js";
15
15
  import { installNativeBridge as M } from "./shell-native/bridge.js";
16
- import { DEFAULT_DEEP_LINK_FALLBACK_DELAY_MS as N, armDeepLinkFallback as P, clearDeepLinkNavigator as F, deepLinkUrlToPath as I, disarmDeepLinkFallback as L, installDeepLinkHandler as R, isSafeInAppPath as z, navigateDeepLinkPath as B, registerDeepLinkNavigator as V, resetDeepLinksForTests as H } from "./shell-native/deep-link.js";
16
+ import { isSafeInAppPath as N } from "./shared/navigation/inAppPath.js";
17
+ import { DEFAULT_DEEP_LINK_FALLBACK_DELAY_MS as P, armDeepLinkFallback as F, clearDeepLinkNavigator as I, deepLinkUrlToPath as L, disarmDeepLinkFallback as R, installDeepLinkHandler as z, navigateDeepLinkPath as B, registerDeepLinkNavigator as V, resetDeepLinksForTests as H } from "./shell-native/deep-link.js";
17
18
  import { populateDeviceInfo as U } from "./shell-native/device.js";
18
19
  import { KEYBOARD_HEIGHT_CSS_VAR as W, KEYBOARD_OPEN_CLASS as G, configureKeyboard as K, keyboardHandlers as q } from "./shell-native/keyboard.js";
19
20
  import { NETWORK_STATUS_EVENT as J, getLastNetworkStatus as Y, installNetworkListener as X } from "./shell-native/network.js";
@@ -30,4 +31,4 @@ import { useDeepLinkNavigator as Ve } from "./shell-native/useDeepLinkNavigator.
30
31
  import { defineCapacitorConfig as He, isValidAllowNavigationRule as Ue } from "./shell-native/capacitor-config.js";
31
32
  import { defineWebManifest as We } from "./shell-native/web-manifest.js";
32
33
  import { SERVICE_WORKER_TEMPLATE as Ge, renderServiceWorker as Ke } from "./shell-native/service-worker.js";
33
- export { Te as APP_READY_EVENT, Ae as DARK_FAMILY_THEMES, Re as DEEP_LINK_CONTEXT_ID_PATTERN, _ as DEFAULT_AUTH_INTERCEPT_PREFIXES, N as DEFAULT_DEEP_LINK_FALLBACK_DELAY_MS, W as KEYBOARD_HEIGHT_CSS_VAR, G as KEYBOARD_OPEN_CLASS, t as NATIVE_PREVIEW_QUERY_PARAM, n as NATIVE_PREVIEW_STORAGE_KEY, J as NETWORK_STATUS_EVENT, Q as PUSH_TOKEN_EVENT, ve as PWA_INSTALLED_EVENT, ye as PWA_INSTALL_AVAILABLE_EVENT, be as PWA_UPDATE_READY_EVENT, Ge as SERVICE_WORKER_TEMPLATE, ne as SW_NOTIFICATION_CLICK_MESSAGE, re as SW_PUSH_SUBSCRIPTION_CHANGE_MESSAGE, ie as WEB_PUSH_MANIFEST_KEY, o as applyNativePlatformClass, r as applyNativePreview, je as applyStatusBarTheme, P as armDeepLinkFallback, Ee as armSplashSafetyTimer, Ie as bootNativeShell, F as clearDeepLinkNavigator, p as configureElectronGlobalKey, K as configureKeyboard, ze as createDeepLinkNavigator, b as createDefaultBackButtonHandlers, I as deepLinkUrlToPath, He as defineCapacitorConfig, We as defineWebManifest, L as disarmDeepLinkFallback, $ as emitPushToken, i as getActiveNativePreview, e as getDesktopBridge, m as getElectronGlobalKey, Y as getLastNetworkStatus, h as getLegacyElectronBridge, s as getNativePlatform, ae as getWebPushManifestConfig, oe as getWebPushSubscription, D as impactFeedback, x as installBackButtonHandler, R as installDeepLinkHandler, w as installExternalUrlOpener, f as installMobileRuntimeHooks, v as installNativeAuthNavigationIntercept, M as installNativeBridge, X as installNetworkListener, ee as installPushNotifications, ge as installPushOptIn, xe as installPwa, Se as installPwaPrompt, Me as installStatusBarThemeListener, se as installWebPushMessageBridge, De as isAppReady, Ne as isDarkThemeName, g as isDesktopShell, c as isNativePlatform, l as isNativePluginAvailable, u as isNativePreview, Ce as isPwaEligibleHost, d as isRealNativePlatform, z as isSafeInAppPath, Ue as isValidAllowNavigationRule, ce as isWebPushSupported, q as keyboardHandlers, Oe as markAppReady, B as navigateDeepLinkPath, O as notificationFeedback, Z as notifyOtaReady, T as openExternalUrl, Be as parseDeepLinkContext, U as populateDeviceInfo, V as registerDeepLinkNavigator, Ke as renderServiceWorker, te as requestPushPermission, le as requestWebPushPermission, ke as resetAppReadyForTests, H as resetDeepLinksForTests, Le as resetNativeShellBootForTests, _e as resetPushOptInForTests, we as resetPwaForTests, ue as resetWebPushForTests, Pe as resolveDocumentIsDark, a as resolveNativePreview, de as resolveVapidPublicKey, S as runBackButtonPrecedence, k as selectionFeedback, fe as serializeWebPushSubscription, j as shareContent, C as showNativeActionSheet, y as showNativeConfirm, A as showNativeToast, Fe as statusBarDetailIsDark, pe as subscribeWebPush, me as unsubscribeWebPush, he as urlBase64ToUint8Array, Ve as useDeepLinkNavigator, E as writeClipboardText };
34
+ export { Te as APP_READY_EVENT, Ae as DARK_FAMILY_THEMES, Re as DEEP_LINK_CONTEXT_ID_PATTERN, _ as DEFAULT_AUTH_INTERCEPT_PREFIXES, P as DEFAULT_DEEP_LINK_FALLBACK_DELAY_MS, W as KEYBOARD_HEIGHT_CSS_VAR, G as KEYBOARD_OPEN_CLASS, t as NATIVE_PREVIEW_QUERY_PARAM, n as NATIVE_PREVIEW_STORAGE_KEY, J as NETWORK_STATUS_EVENT, Q as PUSH_TOKEN_EVENT, ve as PWA_INSTALLED_EVENT, ye as PWA_INSTALL_AVAILABLE_EVENT, be as PWA_UPDATE_READY_EVENT, Ge as SERVICE_WORKER_TEMPLATE, ne as SW_NOTIFICATION_CLICK_MESSAGE, re as SW_PUSH_SUBSCRIPTION_CHANGE_MESSAGE, ie as WEB_PUSH_MANIFEST_KEY, o as applyNativePlatformClass, r as applyNativePreview, je as applyStatusBarTheme, F as armDeepLinkFallback, Ee as armSplashSafetyTimer, Ie as bootNativeShell, I as clearDeepLinkNavigator, p as configureElectronGlobalKey, K as configureKeyboard, ze as createDeepLinkNavigator, b as createDefaultBackButtonHandlers, L as deepLinkUrlToPath, He as defineCapacitorConfig, We as defineWebManifest, R as disarmDeepLinkFallback, $ as emitPushToken, i as getActiveNativePreview, e as getDesktopBridge, m as getElectronGlobalKey, Y as getLastNetworkStatus, h as getLegacyElectronBridge, s as getNativePlatform, ae as getWebPushManifestConfig, oe as getWebPushSubscription, D as impactFeedback, x as installBackButtonHandler, z as installDeepLinkHandler, w as installExternalUrlOpener, f as installMobileRuntimeHooks, v as installNativeAuthNavigationIntercept, M as installNativeBridge, X as installNetworkListener, ee as installPushNotifications, ge as installPushOptIn, xe as installPwa, Se as installPwaPrompt, Me as installStatusBarThemeListener, se as installWebPushMessageBridge, De as isAppReady, Ne as isDarkThemeName, g as isDesktopShell, c as isNativePlatform, l as isNativePluginAvailable, u as isNativePreview, Ce as isPwaEligibleHost, d as isRealNativePlatform, N as isSafeInAppPath, Ue as isValidAllowNavigationRule, ce as isWebPushSupported, q as keyboardHandlers, Oe as markAppReady, B as navigateDeepLinkPath, O as notificationFeedback, Z as notifyOtaReady, T as openExternalUrl, Be as parseDeepLinkContext, U as populateDeviceInfo, V as registerDeepLinkNavigator, Ke as renderServiceWorker, te as requestPushPermission, le as requestWebPushPermission, ke as resetAppReadyForTests, H as resetDeepLinksForTests, Le as resetNativeShellBootForTests, _e as resetPushOptInForTests, we as resetPwaForTests, ue as resetWebPushForTests, Pe as resolveDocumentIsDark, a as resolveNativePreview, de as resolveVapidPublicKey, S as runBackButtonPrecedence, k as selectionFeedback, fe as serializeWebPushSubscription, j as shareContent, C as showNativeActionSheet, y as showNativeConfirm, A as showNativeToast, Fe as statusBarDetailIsDark, pe as subscribeWebPush, me as unsubscribeWebPush, he as urlBase64ToUint8Array, Ve as useDeepLinkNavigator, E as writeClipboardText };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fe-libs",
3
- "version": "2026.1023.5",
3
+ "version": "2026.1023.6",
4
4
  "description": "Burdenoff frontend primitives and domain libraries",
5
5
  "type": "module",
6
6
  "bin": {