@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.
- package/dist/chrome/CommandPalette.d.ts +25 -2
- package/dist/chrome/CommandPalette.js +70 -57
- package/dist/chrome/GlobalSearch.js +74 -73
- package/dist/chrome/NotificationCenter.js +76 -71
- package/dist/chrome/index.d.ts +1 -1
- package/dist/chrome.js +40 -40
- package/dist/shared/hooks/shell/globalSearchError.d.ts +11 -0
- package/dist/shared/hooks/shell/globalSearchError.js +10 -0
- package/dist/shared/hooks/shell/useGlobalSearch.d.ts +2 -0
- package/dist/shared/hooks/shell/useGlobalSearch.js +48 -38
- package/dist/shared/navigation/inAppPath.d.ts +33 -0
- package/dist/shared/navigation/inAppPath.js +32 -0
- package/dist/shell-native/deep-link-context.js +2 -1
- package/dist/shell-native/deep-link.d.ts +2 -6
- package/dist/shell-native/deep-link.js +19 -26
- package/dist/shell-native.js +3 -2
- package/package.json +1 -1
|
@@ -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
|
-
* -
|
|
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
|
-
|
|
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
|
|
20
|
-
let n =
|
|
21
|
-
return n.mod && !(e.metaKey || e.ctrlKey) || n.ctrl && !e.ctrlKey || n.alt
|
|
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
|
|
24
|
-
let
|
|
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(),
|
|
38
|
+
await e.action(), y(!1);
|
|
27
39
|
} catch (e) {
|
|
28
40
|
console.error("Failed to execute command:", e);
|
|
29
41
|
}
|
|
30
|
-
}, []),
|
|
31
|
-
if (!
|
|
32
|
-
let e =
|
|
33
|
-
return
|
|
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
|
-
}, [
|
|
49
|
+
}, [w, b]);
|
|
38
50
|
r(() => {
|
|
39
|
-
|
|
40
|
-
}, [
|
|
51
|
+
v || (x(""), C(0));
|
|
52
|
+
}, [v]), r(() => {
|
|
41
53
|
let e = (e) => {
|
|
42
|
-
if ((e
|
|
43
|
-
e.preventDefault(),
|
|
54
|
+
if (p(e, g)) {
|
|
55
|
+
e.preventDefault(), y((e) => !e);
|
|
44
56
|
return;
|
|
45
57
|
}
|
|
46
|
-
if (
|
|
47
|
-
if (e.key === "Escape") e.preventDefault(),
|
|
48
|
-
else if (e.key === "ArrowDown") e.preventDefault(),
|
|
49
|
-
else if (e.key === "ArrowUp") e.preventDefault(),
|
|
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 =
|
|
53
|
-
t &&
|
|
64
|
+
let t = E[S];
|
|
65
|
+
t && T(t);
|
|
54
66
|
}
|
|
55
67
|
return;
|
|
56
68
|
}
|
|
57
|
-
for (let t of f) if (
|
|
69
|
+
for (let t of f) if (p(e, t.keys)) {
|
|
58
70
|
e.preventDefault();
|
|
59
|
-
let n =
|
|
60
|
-
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
|
|
64
|
-
e.preventDefault(),
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
84
|
+
T,
|
|
85
|
+
E,
|
|
86
|
+
v,
|
|
87
|
+
S,
|
|
76
88
|
f,
|
|
77
|
-
|
|
89
|
+
g,
|
|
90
|
+
w
|
|
78
91
|
]);
|
|
79
|
-
let
|
|
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
|
-
}, {}), [
|
|
95
|
+
}, {}), [E]);
|
|
83
96
|
if (r(() => {
|
|
84
|
-
|
|
85
|
-
}, [
|
|
86
|
-
let
|
|
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",
|
|
89
|
-
onClick: () =>
|
|
90
|
-
"data-state":
|
|
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:
|
|
106
|
-
value:
|
|
107
|
-
onChange: (e) =>
|
|
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
|
-
|
|
124
|
+
b && /* @__PURE__ */ c("button", {
|
|
112
125
|
type: "button",
|
|
113
|
-
onClick: () =>
|
|
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":
|
|
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: [
|
|
135
|
+
children: [E.length === 0 && /* @__PURE__ */ c("div", {
|
|
123
136
|
className: "py-6 text-center text-sm text-text-muted",
|
|
124
|
-
children:
|
|
125
|
-
}), Object.entries(
|
|
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 =
|
|
132
|
-
return
|
|
144
|
+
let n = e.icon, r = O;
|
|
145
|
+
return O++, /* @__PURE__ */ l("button", {
|
|
133
146
|
type: "button",
|
|
134
|
-
onClick: () => void
|
|
135
|
-
className: t("w-full flex items-start gap-3 px-2.5 py-2 text-sm rounded-button transition-colors text-left", r ===
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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 {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
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
|
|
20
|
-
let
|
|
21
|
-
r("header.search",
|
|
22
|
-
!
|
|
23
|
-
}, [
|
|
24
|
-
|
|
25
|
-
}, [
|
|
26
|
-
let
|
|
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
|
-
|
|
29
|
+
L([]), V(null);
|
|
29
30
|
return;
|
|
30
31
|
}
|
|
31
|
-
|
|
32
|
+
z(!0), V(null);
|
|
32
33
|
try {
|
|
33
|
-
let r = await
|
|
34
|
-
if (!
|
|
35
|
-
|
|
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
|
-
|
|
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
|
-
|
|
40
|
+
z(!1);
|
|
40
41
|
}
|
|
41
|
-
}, 300), [
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
}, 300), [D, j]);
|
|
43
|
+
g(() => {
|
|
44
|
+
Q(M, P, G());
|
|
44
45
|
}, [
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
M,
|
|
47
|
+
P,
|
|
48
|
+
Q,
|
|
49
|
+
G
|
|
49
50
|
]);
|
|
50
|
-
let
|
|
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
|
-
}, {}), [
|
|
54
|
-
|
|
55
|
-
}, [
|
|
56
|
-
return
|
|
54
|
+
}, {}), [I]), ee = h((e) => {
|
|
55
|
+
O(e), C();
|
|
56
|
+
}, [O, C]);
|
|
57
|
+
return S ? /* @__PURE__ */ b(i, {
|
|
57
58
|
modal: !0,
|
|
58
|
-
onDismiss:
|
|
59
|
-
children: /* @__PURE__ */
|
|
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",
|
|
61
|
-
onClick:
|
|
62
|
-
"data-state":
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
72
|
-
value:
|
|
73
|
-
placeholder:
|
|
74
|
-
onChange:
|
|
75
|
-
onClear: () =>
|
|
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__ */
|
|
78
|
-
categories:
|
|
79
|
-
selectedCategory:
|
|
80
|
-
onSelect:
|
|
78
|
+
/* @__PURE__ */ b(u, {
|
|
79
|
+
categories: w,
|
|
80
|
+
selectedCategory: P,
|
|
81
|
+
onSelect: F
|
|
81
82
|
}),
|
|
82
|
-
/* @__PURE__ */
|
|
83
|
-
searchMode:
|
|
84
|
-
onSearchModeChange:
|
|
85
|
-
showAdvanced:
|
|
86
|
-
onToggleAdvanced: () =>
|
|
83
|
+
/* @__PURE__ */ b(d, {
|
|
84
|
+
searchMode: q,
|
|
85
|
+
onSearchModeChange: J,
|
|
86
|
+
showAdvanced: H,
|
|
87
|
+
onToggleAdvanced: () => U((e) => !e)
|
|
87
88
|
}),
|
|
88
|
-
|
|
89
|
-
/* @__PURE__ */
|
|
90
|
-
loading:
|
|
91
|
-
error:
|
|
92
|
-
query:
|
|
93
|
-
results:
|
|
94
|
-
groupedResults:
|
|
95
|
-
recentSearches:
|
|
96
|
-
onRecentSelect:
|
|
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
|
-
|
|
100
|
+
M && I.length > 0 && k && /* @__PURE__ */ b("div", {
|
|
100
101
|
className: "border-t border-border-subtle p-2",
|
|
101
|
-
children: /* @__PURE__ */
|
|
102
|
+
children: /* @__PURE__ */ x("button", {
|
|
102
103
|
type: "button",
|
|
103
104
|
onClick: () => {
|
|
104
|
-
|
|
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
|
|
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 {
|
|
118
|
+
export { S as GlobalSearch };
|
|
@@ -1,83 +1,88 @@
|
|
|
1
1
|
import { desktopSetBadgeCount as e } from "../shared/native/desktop.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
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
|
|
16
|
-
let
|
|
17
|
-
|
|
18
|
-
let { isMobile:
|
|
19
|
-
|
|
20
|
-
let { notifications:
|
|
21
|
-
client:
|
|
22
|
-
isOpen:
|
|
23
|
-
lazy:
|
|
24
|
-
filterTab:
|
|
25
|
-
typeFilter:
|
|
26
|
-
appFilter:
|
|
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
|
-
|
|
29
|
-
e(
|
|
30
|
-
}, [
|
|
31
|
-
let
|
|
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
|
-
}, []),
|
|
34
|
-
|
|
35
|
-
}, [
|
|
36
|
-
return /* @__PURE__ */
|
|
37
|
-
ref:
|
|
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__ */
|
|
40
|
-
unreadCount:
|
|
41
|
-
isOpen:
|
|
42
|
-
onToggle:
|
|
43
|
-
}),
|
|
44
|
-
isMobile:
|
|
45
|
-
onClose:
|
|
46
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
50
|
-
isMobile:
|
|
51
|
-
unreadCount:
|
|
52
|
-
onClose:
|
|
53
|
-
onMarkAllAsRead:
|
|
54
|
+
/* @__PURE__ */ v(s, {
|
|
55
|
+
isMobile: R,
|
|
56
|
+
unreadCount: B,
|
|
57
|
+
onClose: I,
|
|
58
|
+
onMarkAllAsRead: q
|
|
54
59
|
}),
|
|
55
|
-
/* @__PURE__ */
|
|
56
|
-
filterTab:
|
|
57
|
-
typeFilter:
|
|
58
|
-
appFilter:
|
|
59
|
-
sortBy:
|
|
60
|
-
appNames:
|
|
61
|
-
onFilterTabChange:
|
|
62
|
-
onTypeFilterChange:
|
|
63
|
-
onAppFilterChange:
|
|
64
|
-
onSortByChange:
|
|
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__ */
|
|
67
|
-
loading:
|
|
68
|
-
error:
|
|
69
|
-
notifications:
|
|
70
|
-
filterTab:
|
|
71
|
-
typeFilter:
|
|
72
|
-
appFilter:
|
|
73
|
-
onRetry:
|
|
74
|
-
onMarkAsRead:
|
|
75
|
-
onDelete:
|
|
76
|
-
onRedirect:
|
|
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__ */
|
|
79
|
-
totalCount:
|
|
80
|
-
onViewAll:
|
|
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 {
|
|
93
|
+
export { b as NotificationCenter };
|
package/dist/chrome/index.d.ts
CHANGED
|
@@ -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 {
|
|
13
|
-
import { Breadcrumbs as
|
|
14
|
-
import { NavLink as
|
|
15
|
-
import { Tabs as
|
|
16
|
-
import { Sidebar as
|
|
17
|
-
import { ProfileSwitcher as
|
|
18
|
-
import { ProductSwitcher as
|
|
19
|
-
import { LanguageSwitcher as
|
|
20
|
-
import { ContextSwitcher as
|
|
21
|
-
import { GeographySwitcher as
|
|
22
|
-
import { PushOptInToggle as
|
|
23
|
-
import { NotificationCenter as
|
|
24
|
-
import { LanguagePickerSheet as
|
|
25
|
-
import { ProductPickerSheet as
|
|
26
|
-
import { AccountSwitcher as
|
|
27
|
-
import { firstProjectOfWorkspace as
|
|
28
|
-
import { resolveSwitchTarget as
|
|
29
|
-
import { useContextSwitchController as
|
|
30
|
-
import { AutoBreadcrumbs as
|
|
31
|
-
import { NavCustomizeDialog as
|
|
32
|
-
import { PersonaSimulationPill as
|
|
33
|
-
import { ProductSideNav as
|
|
34
|
-
import { BrandMark as
|
|
35
|
-
import { DynamicFooter as
|
|
36
|
-
import { PanelTabs as
|
|
37
|
-
import { PanelContainer as
|
|
38
|
-
import { StatusBar as
|
|
39
|
-
import { PluginRoutes as
|
|
40
|
-
import { PluginSettingsPage as
|
|
41
|
-
import { PluginToolbar as
|
|
42
|
-
import { PluginWidgetGrid as
|
|
43
|
-
import { PluginContextMenuTarget as
|
|
44
|
-
import { selectMobileTabs as
|
|
45
|
-
import { useMobileTabBarVisible as
|
|
46
|
-
import { MobileTabBar as
|
|
47
|
-
import { NativeTopBar as
|
|
48
|
-
import { SwipeNavigation as
|
|
49
|
-
import { NativePageTransition as
|
|
50
|
-
import { findNavTitle as
|
|
51
|
-
export {
|
|
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 {
|
|
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
|
|
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
|
|
155
|
-
if (e) return
|
|
155
|
+
function c(e) {
|
|
156
|
+
if (e) return s[e];
|
|
156
157
|
}
|
|
157
|
-
var
|
|
158
|
+
var l = new Set([
|
|
158
159
|
"datatable",
|
|
159
160
|
"scheduledjob",
|
|
160
161
|
"eventregistration",
|
|
161
162
|
"variable"
|
|
162
163
|
]);
|
|
163
|
-
function
|
|
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
|
|
175
|
-
let i =
|
|
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
|
|
245
|
-
if (t === "module-workflow" &&
|
|
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
|
|
306
|
-
function
|
|
307
|
-
let [
|
|
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 (!
|
|
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
|
-
|
|
321
|
-
let
|
|
322
|
-
|
|
321
|
+
u.current && u.current.abort();
|
|
322
|
+
let a = new AbortController();
|
|
323
|
+
u.current = a, l(!0);
|
|
323
324
|
try {
|
|
324
|
-
let t = n ?
|
|
325
|
+
let t = n ? c(n) : r?.entityTypes, s = await e({
|
|
325
326
|
gateway: "workspace",
|
|
326
|
-
query:
|
|
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:
|
|
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 ??
|
|
344
|
+
limit: r?.limit ?? p,
|
|
344
345
|
offset: r?.offset ?? 0
|
|
345
346
|
},
|
|
346
347
|
workspaceToken: !0,
|
|
347
|
-
workspaceId:
|
|
348
|
-
signal:
|
|
348
|
+
workspaceId: m,
|
|
349
|
+
signal: a.signal
|
|
349
350
|
});
|
|
350
|
-
if (
|
|
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:
|
|
355
|
+
error: s.errors.map((e) => e.message).join("; ")
|
|
355
356
|
};
|
|
356
|
-
let l =
|
|
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:
|
|
361
|
+
category: f(e.entityType, e.productSource),
|
|
361
362
|
entityType: e.entityType,
|
|
362
363
|
productSource: e.productSource,
|
|
363
|
-
href:
|
|
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:
|
|
384
|
-
total: l?.total ??
|
|
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"
|
|
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
|
-
|
|
402
|
+
u.current === a && l(!1);
|
|
397
403
|
}
|
|
398
|
-
}, [
|
|
404
|
+
}, [m]);
|
|
399
405
|
return {
|
|
400
|
-
searchFull:
|
|
401
|
-
search:
|
|
402
|
-
|
|
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 {
|
|
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 "
|
|
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 {
|
|
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
|
|
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 (
|
|
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
|
|
18
|
+
return s || (l ? u : null);
|
|
26
19
|
}
|
|
27
20
|
function f() {
|
|
28
21
|
let e = d();
|
|
29
|
-
if (!e ||
|
|
30
|
-
let t =
|
|
31
|
-
|
|
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
|
|
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
|
|
66
|
-
|
|
58
|
+
return s = e, f(), () => {
|
|
59
|
+
s === e && (s = null);
|
|
67
60
|
};
|
|
68
61
|
}
|
|
69
62
|
function y() {
|
|
70
|
-
|
|
63
|
+
s = null;
|
|
71
64
|
}
|
|
72
65
|
function b(e) {
|
|
73
66
|
let t = d();
|
|
74
|
-
t ? t(e) :
|
|
67
|
+
t ? t(e) : o.push(e);
|
|
75
68
|
}
|
|
76
|
-
function x(e =
|
|
77
|
-
S(),
|
|
78
|
-
|
|
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
|
-
|
|
75
|
+
c !== null && clearTimeout(c), c = null, l = !1;
|
|
83
76
|
}
|
|
84
77
|
function C() {
|
|
85
|
-
S(),
|
|
78
|
+
S(), o = [], s = null;
|
|
86
79
|
}
|
|
87
80
|
//#endregion
|
|
88
|
-
export {
|
|
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 };
|
package/dist/shell-native.js
CHANGED
|
@@ -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 {
|
|
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,
|
|
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 };
|