@termix-ssh/plugin-sdk 1.0.21 → 1.0.22
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/CHANGELOG.md +21 -0
- package/PLUGIN-GUIDE.md +62 -3
- package/cli/commands/build.mjs +55 -36
- package/cli/commands/validate.mjs +4 -0
- package/dist/backend.d.ts +32 -7
- package/dist/frontend.d.ts +7 -0
- package/dist/host/{PluginsTab-HQGSDSHS.js → PluginsTab-CM2B33BD.js} +22 -14
- package/dist/host/chunk-7J4QNGFM.js +345 -0
- package/dist/host/{chunk-A5CULDWV.js → chunk-HQ6NNFSX.js} +109 -1574
- package/dist/host/chunk-I5F2PSMR.js +1526 -0
- package/dist/host/{chunk-FGX27MAA.js → chunk-JRV2HIDK.js} +1 -1
- package/dist/host/{chunk-JFQGI4OD.js → chunk-P26QKKU5.js} +38 -9
- package/dist/host/{chunk-WWFRBU2E.js → chunk-ROB2SH5Q.js} +76 -49
- package/dist/host/chunk-TK3Y437H.js +53 -0
- package/dist/host/{chunk-GTHINW3L.js → chunk-VKNGNEF3.js} +34650 -34968
- package/dist/host/core-classes.json +1 -1
- package/dist/host/frame-host.css +2 -0
- package/dist/host/frame-host.js +242 -0
- package/dist/host/{linked-server-UDSFY3N7.js → linked-server-J5G457OA.js} +1 -1
- package/dist/host/{rbac-api-AAAPMF52.js → rbac-api-PY22W5UY.js} +5 -1
- package/dist/host/testing-host.js +9 -6
- package/dist/host/types/src/types/host-sidebar-preferences.d.ts +2 -0
- package/dist/host/types/src/types/index.d.ts +8 -0
- package/dist/host/types/src/ui/api/plugins-api.d.ts +2 -1
- package/dist/host/types/src/ui/api/rbac-api.d.ts +19 -1
- package/dist/host/types/src/ui/components/data-view.d.ts +1 -1
- package/dist/host/types/src/ui/main-axios.d.ts +1 -1
- package/dist/host/types/src/ui/plugin-host/loader.d.ts +6 -0
- package/dist/host/types/src/ui/plugin-host/sdk-ui.d.ts +1 -1
- package/dist/host/types/src/ui/plugins/use-plugins-manager.d.ts +1 -1
- package/dist/host/types/src/ui/shell/tab-registry.d.ts +2 -0
- package/dist/host/ui.js +356 -369
- package/dist/host/{use-permissions-VAND5GEG.js → use-permissions-EWRI3WLT.js} +1 -1
- package/dist/host-commands.d.ts +7 -0
- package/dist/host-commands.js +35 -5
- package/dist/manifest.d.ts +28 -1
- package/dist/manifest.js +108 -1
- package/package.json +5 -1
- package/schema/manifest.schema.json +42 -0
package/dist/host/ui.js
CHANGED
|
@@ -1,26 +1,43 @@
|
|
|
1
1
|
const __termixNoGlob = () => ({});
|
|
2
2
|
import {
|
|
3
|
-
ACCENT_PRESET_COLORS,
|
|
4
3
|
ActionSlot,
|
|
5
|
-
BUILTIN_THEMES,
|
|
6
4
|
Checkbox,
|
|
7
5
|
ComponentSlot,
|
|
6
|
+
HostFeatureFields,
|
|
7
|
+
HostPluginSections,
|
|
8
|
+
PasswordInput,
|
|
9
|
+
PluginViewPlaceholder,
|
|
10
|
+
SettingsFieldRow,
|
|
11
|
+
Textarea,
|
|
12
|
+
clearLocalAdaptivePreferences,
|
|
13
|
+
getAdaptiveResourceBudget,
|
|
14
|
+
getPreferredHostAction,
|
|
15
|
+
markAdaptiveResourceUsed,
|
|
16
|
+
markTabSurfaceUsed,
|
|
17
|
+
preloadTabSurface,
|
|
18
|
+
recordHostActionPreference,
|
|
19
|
+
runAdaptiveBackgroundTask,
|
|
20
|
+
tabIcon,
|
|
21
|
+
useInstalledPlugins,
|
|
22
|
+
usePluginHostSections,
|
|
23
|
+
useTabHandlesVersion
|
|
24
|
+
} from "./chunk-I5F2PSMR.js";
|
|
25
|
+
import {
|
|
26
|
+
Toaster
|
|
27
|
+
} from "./chunk-TK3Y437H.js";
|
|
28
|
+
import {
|
|
29
|
+
ACCENT_PRESET_COLORS,
|
|
30
|
+
BUILTIN_THEMES,
|
|
8
31
|
DASHBOARD_CARDS,
|
|
9
32
|
FOLDER_COLORS,
|
|
10
33
|
FONT_SIZES,
|
|
11
|
-
HostFeatureFields,
|
|
12
|
-
HostPluginSections,
|
|
13
34
|
LANGUAGES,
|
|
14
35
|
MANAGE_REQUEST_EVENT,
|
|
15
36
|
MAX_PANES,
|
|
16
|
-
PasswordInput,
|
|
17
37
|
PluginComponent,
|
|
18
|
-
PluginViewPlaceholder,
|
|
19
38
|
SPLIT_PRESETS,
|
|
20
39
|
SYSTEM_THEME,
|
|
21
|
-
SettingsFieldRow,
|
|
22
40
|
ShellConfirmCapture,
|
|
23
|
-
Textarea,
|
|
24
41
|
UI_FONTS,
|
|
25
42
|
actionOrder,
|
|
26
43
|
applyAccentColor,
|
|
@@ -31,7 +48,6 @@ import {
|
|
|
31
48
|
canJoinSplit,
|
|
32
49
|
challengeSecondFactor,
|
|
33
50
|
changeAppLanguage,
|
|
34
|
-
clearLocalAdaptivePreferences,
|
|
35
51
|
createPluginApp,
|
|
36
52
|
createQuickConnectHost,
|
|
37
53
|
defaultConnectAction,
|
|
@@ -41,14 +57,12 @@ import {
|
|
|
41
57
|
endSplitDrag,
|
|
42
58
|
filterPaletteItems,
|
|
43
59
|
findMatchingKeybinding,
|
|
44
|
-
getAdaptiveResourceBudget,
|
|
45
60
|
getDefaultConnectionTab,
|
|
46
61
|
getHostEditorSection,
|
|
47
62
|
getLiveHostStatus,
|
|
48
63
|
getLoginMethods,
|
|
49
64
|
getPanel,
|
|
50
65
|
getPollingEnvironmentMultiplier,
|
|
51
|
-
getPreferredHostAction,
|
|
52
66
|
getRegisteredDashboardCard,
|
|
53
67
|
getRememberDeviceAllowed,
|
|
54
68
|
getStatusClasses,
|
|
@@ -78,8 +92,6 @@ import {
|
|
|
78
92
|
makeHostSshSubTabs,
|
|
79
93
|
makeHostTabs,
|
|
80
94
|
mapCredentials,
|
|
81
|
-
markAdaptiveResourceUsed,
|
|
82
|
-
markTabSurfaceUsed,
|
|
83
95
|
moveDivider,
|
|
84
96
|
moveRailItem,
|
|
85
97
|
moveSplitDrag,
|
|
@@ -88,13 +100,11 @@ import {
|
|
|
88
100
|
paletteEntriesFor,
|
|
89
101
|
paneNavHotkeyLabel,
|
|
90
102
|
pluginWsUrl,
|
|
91
|
-
preloadTabSurface,
|
|
92
103
|
promotableIds,
|
|
93
104
|
protocolEnabled,
|
|
94
105
|
protocolPort,
|
|
95
106
|
quickConnectTargets,
|
|
96
107
|
railItemLabel,
|
|
97
|
-
recordHostActionPreference,
|
|
98
108
|
registerHostEditorSection,
|
|
99
109
|
registerLayout,
|
|
100
110
|
registerTabCloseGuard,
|
|
@@ -107,7 +117,6 @@ import {
|
|
|
107
117
|
resetUserSecondFactors,
|
|
108
118
|
resolveHostTabType,
|
|
109
119
|
rightDockableIds,
|
|
110
|
-
runAdaptiveBackgroundTask,
|
|
111
120
|
runAdaptivePolling,
|
|
112
121
|
runHostAction,
|
|
113
122
|
setPluginLayouts,
|
|
@@ -118,7 +127,6 @@ import {
|
|
|
118
127
|
sshHostToHost,
|
|
119
128
|
startLoginRedirect,
|
|
120
129
|
submitLoginMethod,
|
|
121
|
-
tabIcon,
|
|
122
130
|
tabJumpHotkeyKeys,
|
|
123
131
|
takePendingManageRequest,
|
|
124
132
|
themeLabel,
|
|
@@ -133,7 +141,6 @@ import {
|
|
|
133
141
|
useHostProtocols,
|
|
134
142
|
useHostStatus,
|
|
135
143
|
useHostStatusIndicators,
|
|
136
|
-
useInstalledPlugins,
|
|
137
144
|
useIsMobile,
|
|
138
145
|
useKeybindingActions,
|
|
139
146
|
useKeybindingDefaults,
|
|
@@ -142,7 +149,6 @@ import {
|
|
|
142
149
|
usePaletteEntries,
|
|
143
150
|
usePaletteGroups,
|
|
144
151
|
usePanels,
|
|
145
|
-
usePluginHostSections,
|
|
146
152
|
useRailItems,
|
|
147
153
|
useRegisteredDashboardCards,
|
|
148
154
|
useSecondFactors,
|
|
@@ -154,16 +160,15 @@ import {
|
|
|
154
160
|
useSshAuthEditors,
|
|
155
161
|
useSshAuthProviders,
|
|
156
162
|
useStatusColorScheme,
|
|
157
|
-
useTabHandlesVersion,
|
|
158
163
|
useTabStageStore,
|
|
159
164
|
useTheme,
|
|
160
165
|
useThemes,
|
|
161
166
|
verifySecondFactor,
|
|
162
167
|
withProtocolSettings
|
|
163
|
-
} from "./chunk-
|
|
168
|
+
} from "./chunk-HQ6NNFSX.js";
|
|
164
169
|
import {
|
|
165
170
|
usePermissions
|
|
166
|
-
} from "./chunk-
|
|
171
|
+
} from "./chunk-JRV2HIDK.js";
|
|
167
172
|
import {
|
|
168
173
|
AddButton,
|
|
169
174
|
Card,
|
|
@@ -184,7 +189,24 @@ import {
|
|
|
184
189
|
isPrerelease,
|
|
185
190
|
reportBetaFeedbackUrl,
|
|
186
191
|
reportCoreIssueUrl
|
|
187
|
-
} from "./chunk-
|
|
192
|
+
} from "./chunk-ROB2SH5Q.js";
|
|
193
|
+
import {
|
|
194
|
+
Button,
|
|
195
|
+
DefaultsOnly,
|
|
196
|
+
FakeSwitch,
|
|
197
|
+
HostDefaultBadge,
|
|
198
|
+
HostDefaultsContext,
|
|
199
|
+
HostOnly,
|
|
200
|
+
Input,
|
|
201
|
+
PluginIcon,
|
|
202
|
+
SectionCard,
|
|
203
|
+
SettingRow,
|
|
204
|
+
buttonVariants,
|
|
205
|
+
cva,
|
|
206
|
+
hasVisibleFields,
|
|
207
|
+
isFieldShown,
|
|
208
|
+
useIsDefaultsEditor
|
|
209
|
+
} from "./chunk-7J4QNGFM.js";
|
|
188
210
|
import {
|
|
189
211
|
Action,
|
|
190
212
|
Activity,
|
|
@@ -198,7 +220,6 @@ import {
|
|
|
198
220
|
Bug,
|
|
199
221
|
Building,
|
|
200
222
|
BuildingComplex,
|
|
201
|
-
Button,
|
|
202
223
|
Cancel,
|
|
203
224
|
Check,
|
|
204
225
|
ChevronDown,
|
|
@@ -219,7 +240,6 @@ import {
|
|
|
219
240
|
Corner,
|
|
220
241
|
Cpu,
|
|
221
242
|
Database,
|
|
222
|
-
DefaultsOnly,
|
|
223
243
|
Description2,
|
|
224
244
|
Dialog,
|
|
225
245
|
DialogContent,
|
|
@@ -232,7 +252,6 @@ import {
|
|
|
232
252
|
Eye,
|
|
233
253
|
EyeOff,
|
|
234
254
|
Facts,
|
|
235
|
-
FakeSwitch,
|
|
236
255
|
Flag,
|
|
237
256
|
Flame,
|
|
238
257
|
FlaskConical,
|
|
@@ -246,12 +265,8 @@ import {
|
|
|
246
265
|
GroupHeading,
|
|
247
266
|
Hammer,
|
|
248
267
|
HardDrive,
|
|
249
|
-
HostDefaultBadge,
|
|
250
|
-
HostDefaultsContext,
|
|
251
|
-
HostOnly,
|
|
252
268
|
House,
|
|
253
269
|
InlineView,
|
|
254
|
-
Input,
|
|
255
270
|
Key,
|
|
256
271
|
KeyRound,
|
|
257
272
|
Layers,
|
|
@@ -275,7 +290,6 @@ import {
|
|
|
275
290
|
PanePrompt,
|
|
276
291
|
PanelSearch,
|
|
277
292
|
PanelShell,
|
|
278
|
-
PluginIcon,
|
|
279
293
|
PluginSettingsValidationError,
|
|
280
294
|
Plus,
|
|
281
295
|
Portal,
|
|
@@ -293,7 +307,6 @@ import {
|
|
|
293
307
|
ScrollAreaScrollbar,
|
|
294
308
|
ScrollAreaThumb,
|
|
295
309
|
Search,
|
|
296
|
-
SectionCard,
|
|
297
310
|
Segmented,
|
|
298
311
|
Select,
|
|
299
312
|
SelectContent,
|
|
@@ -308,7 +321,6 @@ import {
|
|
|
308
321
|
Separator,
|
|
309
322
|
Server,
|
|
310
323
|
ServerCog,
|
|
311
|
-
SettingRow,
|
|
312
324
|
Settings,
|
|
313
325
|
Shield,
|
|
314
326
|
ShieldCheck,
|
|
@@ -341,21 +353,17 @@ import {
|
|
|
341
353
|
Wrench,
|
|
342
354
|
X,
|
|
343
355
|
Zap,
|
|
344
|
-
buttonVariants,
|
|
345
356
|
cn,
|
|
346
357
|
composeRefs,
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
dist_exports3,
|
|
358
|
+
dist_exports2 as dist_exports,
|
|
359
|
+
dist_exports3 as dist_exports2,
|
|
360
|
+
dist_exports4 as dist_exports3,
|
|
351
361
|
docsUrl,
|
|
352
362
|
getDeveloperMode,
|
|
353
363
|
getPluginAdminSettings,
|
|
354
364
|
getPluginHostSettings,
|
|
355
365
|
getPluginUserSettings,
|
|
356
366
|
getPlugins,
|
|
357
|
-
hasVisibleFields,
|
|
358
|
-
isFieldShown,
|
|
359
367
|
pluginKey,
|
|
360
368
|
pluginName,
|
|
361
369
|
setAllPluginChannels,
|
|
@@ -368,13 +376,12 @@ import {
|
|
|
368
376
|
useAreaPreferences,
|
|
369
377
|
useConfirm,
|
|
370
378
|
useId,
|
|
371
|
-
useIsDefaultsEditor,
|
|
372
379
|
usePluginDocsUrl,
|
|
373
380
|
useSurfaceClose,
|
|
374
381
|
useSurfaceKind,
|
|
375
382
|
useUiPreference,
|
|
376
383
|
useUiPreferencesContext
|
|
377
|
-
} from "./chunk-
|
|
384
|
+
} from "./chunk-VKNGNEF3.js";
|
|
378
385
|
import {
|
|
379
386
|
CREDENTIAL_ROW_FIELD_KEYS,
|
|
380
387
|
PRESETS,
|
|
@@ -434,6 +441,7 @@ import {
|
|
|
434
441
|
getErrorMessage,
|
|
435
442
|
getExternalAutoProvision,
|
|
436
443
|
getFolderAccess,
|
|
444
|
+
getFolderAuthOverride,
|
|
437
445
|
getHostAccess,
|
|
438
446
|
getHostAuthOverride,
|
|
439
447
|
getHostPassword,
|
|
@@ -506,6 +514,7 @@ import {
|
|
|
506
514
|
saveCredentialSidebarPreferences,
|
|
507
515
|
saveHostSidebarPreferences,
|
|
508
516
|
saveUserPreferences,
|
|
517
|
+
setFolderAuthOverride,
|
|
509
518
|
setFrontendState,
|
|
510
519
|
setHostAuthOverride,
|
|
511
520
|
setPluginSummaries,
|
|
@@ -535,7 +544,7 @@ import {
|
|
|
535
544
|
useTabs,
|
|
536
545
|
useTabsSafe,
|
|
537
546
|
verifyPasswordResetCode
|
|
538
|
-
} from "./chunk-
|
|
547
|
+
} from "./chunk-P26QKKU5.js";
|
|
539
548
|
import {
|
|
540
549
|
define_import_meta_env_default,
|
|
541
550
|
init_define_import_meta_env
|
|
@@ -3879,12 +3888,30 @@ function assetUrl(summary, file) {
|
|
|
3879
3888
|
function absolute(url) {
|
|
3880
3889
|
return new URL(url, window.location.href).href;
|
|
3881
3890
|
}
|
|
3891
|
+
var IMPORT_RETRY_DELAYS_MS = [500, 1500, 3e3];
|
|
3892
|
+
async function importWithRetry(url, load, sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))) {
|
|
3893
|
+
for (let attempt = 0; ; attempt++) {
|
|
3894
|
+
const next = attempt === 0 ? url : `${url}${url.includes("?") ? "&" : "?"}retry=${attempt}`;
|
|
3895
|
+
try {
|
|
3896
|
+
return await load(next);
|
|
3897
|
+
} catch (error) {
|
|
3898
|
+
const fetchFailed = error instanceof TypeError && /dynamically imported module|importing a module script/i.test(
|
|
3899
|
+
error.message
|
|
3900
|
+
);
|
|
3901
|
+
if (!fetchFailed || attempt >= IMPORT_RETRY_DELAYS_MS.length) throw error;
|
|
3902
|
+
await sleep(IMPORT_RETRY_DELAYS_MS[attempt]);
|
|
3903
|
+
}
|
|
3904
|
+
}
|
|
3905
|
+
}
|
|
3882
3906
|
var defaultDeps = {
|
|
3883
3907
|
fetchPlugins: getPlugins,
|
|
3884
3908
|
async importFrontend(summary) {
|
|
3885
|
-
return
|
|
3886
|
-
|
|
3887
|
-
|
|
3909
|
+
return importWithRetry(
|
|
3910
|
+
absolute(assetUrl(summary, "frontend.js")),
|
|
3911
|
+
(url) => import(
|
|
3912
|
+
/* @vite-ignore */
|
|
3913
|
+
url
|
|
3914
|
+
)
|
|
3888
3915
|
);
|
|
3889
3916
|
},
|
|
3890
3917
|
async loadLocale(summary, file) {
|
|
@@ -5593,51 +5620,9 @@ function Auth({ onLogin }) {
|
|
|
5593
5620
|
] }) });
|
|
5594
5621
|
}
|
|
5595
5622
|
|
|
5596
|
-
// src/ui/components/sonner.tsx
|
|
5597
|
-
init_define_import_meta_env();
|
|
5598
|
-
import { Toaster as Sonner } from "sonner";
|
|
5599
|
-
import { jsx as jsx29 } from "react/jsx-runtime";
|
|
5600
|
-
var Toaster = ({ ...props }) => {
|
|
5601
|
-
const { theme: theme2 = "system" } = useTheme();
|
|
5602
|
-
return /* @__PURE__ */ jsx29(
|
|
5603
|
-
Sonner,
|
|
5604
|
-
{
|
|
5605
|
-
theme: theme2,
|
|
5606
|
-
className: "toaster group",
|
|
5607
|
-
toastOptions: {
|
|
5608
|
-
classNames: {
|
|
5609
|
-
toast: "group toast group-[.toaster]:bg-card group-[.toaster]:text-card-foreground group-[.toaster]:border-border group-[.toaster]:rounded-none! group-[.toaster]:shadow-lg group-[.toaster]:font-mono",
|
|
5610
|
-
description: "group-[.toast]:text-muted-foreground",
|
|
5611
|
-
actionButton: "group-[.toast]:bg-accent-brand group-[.toast]:text-white group-[.toast]:font-semibold",
|
|
5612
|
-
cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground",
|
|
5613
|
-
success: "group-[.toast]:!text-accent-brand group-[.toast]:!border-accent-brand/30",
|
|
5614
|
-
info: "group-[.toast]:!text-accent-brand group-[.toast]:!border-accent-brand/30",
|
|
5615
|
-
error: "group-[.toast]:!text-destructive group-[.toast]:!border-destructive/30"
|
|
5616
|
-
}
|
|
5617
|
-
},
|
|
5618
|
-
style: {
|
|
5619
|
-
"--radius": "0px",
|
|
5620
|
-
"--normal-bg": "var(--card)",
|
|
5621
|
-
"--normal-border": "var(--border)",
|
|
5622
|
-
"--normal-text": "var(--card-foreground)",
|
|
5623
|
-
"--success-bg": "var(--card)",
|
|
5624
|
-
"--success-border": "var(--border)",
|
|
5625
|
-
"--success-text": "var(--color-accent-brand)",
|
|
5626
|
-
"--info-bg": "var(--card)",
|
|
5627
|
-
"--info-border": "var(--border)",
|
|
5628
|
-
"--info-text": "var(--color-accent-brand)",
|
|
5629
|
-
"--error-bg": "var(--card)",
|
|
5630
|
-
"--error-border": "var(--border)",
|
|
5631
|
-
"--error-text": "var(--destructive)"
|
|
5632
|
-
},
|
|
5633
|
-
...props
|
|
5634
|
-
}
|
|
5635
|
-
);
|
|
5636
|
-
};
|
|
5637
|
-
|
|
5638
5623
|
// src/ui/components/FullScreenAppWrapper.tsx
|
|
5639
5624
|
import { useTranslation as useTranslation9 } from "react-i18next";
|
|
5640
|
-
import { Fragment as Fragment4, jsx as
|
|
5625
|
+
import { Fragment as Fragment4, jsx as jsx29, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
5641
5626
|
var FullScreenAppWrapper = ({
|
|
5642
5627
|
hostId,
|
|
5643
5628
|
children
|
|
@@ -5741,17 +5726,17 @@ var FullScreenAppWrapper = ({
|
|
|
5741
5726
|
window.location.reload();
|
|
5742
5727
|
};
|
|
5743
5728
|
if (authLoading) {
|
|
5744
|
-
return /* @__PURE__ */
|
|
5729
|
+
return /* @__PURE__ */ jsx29("div", { className: "relative w-full h-screen overflow-hidden", children: /* @__PURE__ */ jsx29(ConnectionScreen, { status: "connecting", message: t3("common.loading") }) });
|
|
5745
5730
|
}
|
|
5746
5731
|
if (!isAuthenticated) {
|
|
5747
|
-
return /* @__PURE__ */
|
|
5732
|
+
return /* @__PURE__ */ jsx29(SidebarProvider, { children: /* @__PURE__ */ jsx29(TabProvider, { children: /* @__PURE__ */ jsx29(Fragment4, { children: /* @__PURE__ */ jsxs21(
|
|
5748
5733
|
"div",
|
|
5749
5734
|
{
|
|
5750
5735
|
className: "w-full h-screen overflow-hidden flex items-center justify-center",
|
|
5751
5736
|
style: { backgroundColor: "var(--bg-base)" },
|
|
5752
5737
|
children: [
|
|
5753
|
-
/* @__PURE__ */
|
|
5754
|
-
/* @__PURE__ */
|
|
5738
|
+
/* @__PURE__ */ jsx29(Auth, { onLogin: handleAuthSuccess }),
|
|
5739
|
+
/* @__PURE__ */ jsx29(
|
|
5755
5740
|
Toaster,
|
|
5756
5741
|
{
|
|
5757
5742
|
position: "bottom-right",
|
|
@@ -5766,7 +5751,7 @@ var FullScreenAppWrapper = ({
|
|
|
5766
5751
|
) }) }) });
|
|
5767
5752
|
}
|
|
5768
5753
|
const phase = loading ? "loading" : !hostConfig && hostId ? "not-found" : "ready";
|
|
5769
|
-
return /* @__PURE__ */
|
|
5754
|
+
return /* @__PURE__ */ jsx29(SidebarProvider, { children: /* @__PURE__ */ jsx29(TabProvider, { children: /* @__PURE__ */ jsx29(Fragment4, { children: /* @__PURE__ */ jsx29(
|
|
5770
5755
|
"div",
|
|
5771
5756
|
{
|
|
5772
5757
|
className: "w-full h-screen overflow-hidden",
|
|
@@ -5780,7 +5765,7 @@ var FullScreenAppWrapper = ({
|
|
|
5780
5765
|
init_define_import_meta_env();
|
|
5781
5766
|
import { useEffect as useEffect8, useState as useState9 } from "react";
|
|
5782
5767
|
import { useTranslation as useTranslation10 } from "react-i18next";
|
|
5783
|
-
import { jsx as
|
|
5768
|
+
import { jsx as jsx30, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
5784
5769
|
var CODE_INPUT = "rounded-none bg-muted/50 border-border text-center text-sm tracking-widest";
|
|
5785
5770
|
function TOTPDialog({
|
|
5786
5771
|
isOpen,
|
|
@@ -5820,24 +5805,24 @@ function TOTPDialog({
|
|
|
5820
5805
|
};
|
|
5821
5806
|
const title = isPush ? t3("sshAuth.mfaPushRequired") : isPassword ? t3("common.password") : isMenu ? t3("sshAuth.mfaPromptRequired") : t3("sshAuth.totpRequired");
|
|
5822
5807
|
const label = prompt || (isTotp ? t3("sshAuth.totpCodeLabel") : void 0);
|
|
5823
|
-
const cancel = /* @__PURE__ */
|
|
5824
|
-
return /* @__PURE__ */
|
|
5808
|
+
const cancel = /* @__PURE__ */ jsx30("button", { type: "button", onClick: onCancel, className: PROMPT_BUTTON, children: t3("common.cancel") });
|
|
5809
|
+
return /* @__PURE__ */ jsx30(
|
|
5825
5810
|
PanePrompt,
|
|
5826
5811
|
{
|
|
5827
5812
|
open: true,
|
|
5828
5813
|
layer: "connection",
|
|
5829
5814
|
backgroundColor,
|
|
5830
|
-
icon: /* @__PURE__ */
|
|
5815
|
+
icon: /* @__PURE__ */ jsx30(Shield, { className: "size-4" }),
|
|
5831
5816
|
title,
|
|
5832
5817
|
description: label,
|
|
5833
5818
|
children: showWaiting ? /* @__PURE__ */ jsxs22("div", { className: "flex flex-col gap-3", children: [
|
|
5834
5819
|
/* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-3 py-1", children: [
|
|
5835
|
-
/* @__PURE__ */
|
|
5836
|
-
/* @__PURE__ */
|
|
5820
|
+
/* @__PURE__ */ jsx30(LoaderCircle, { className: "size-4 animate-spin text-accent-brand shrink-0" }),
|
|
5821
|
+
/* @__PURE__ */ jsx30("p", { className: "text-xs text-muted-foreground", children: t3("sshAuth.mfaWaitingApproval") })
|
|
5837
5822
|
] }),
|
|
5838
|
-
/* @__PURE__ */
|
|
5823
|
+
/* @__PURE__ */ jsx30("div", { className: "flex justify-end gap-2", children: cancel })
|
|
5839
5824
|
] }) : /* @__PURE__ */ jsxs22("form", { onSubmit: handleSubmit, className: "flex flex-col gap-3", children: [
|
|
5840
|
-
isPush ? null : isPassword ? /* @__PURE__ */
|
|
5825
|
+
isPush ? null : isPassword ? /* @__PURE__ */ jsx30(
|
|
5841
5826
|
Input,
|
|
5842
5827
|
{
|
|
5843
5828
|
id: "totpCode",
|
|
@@ -5848,7 +5833,7 @@ function TOTPDialog({
|
|
|
5848
5833
|
placeholder: t3("placeholders.enterPassword"),
|
|
5849
5834
|
className: "rounded-none bg-muted/50 border-border text-sm"
|
|
5850
5835
|
}
|
|
5851
|
-
) : isMenu ? /* @__PURE__ */
|
|
5836
|
+
) : isMenu ? /* @__PURE__ */ jsx30(
|
|
5852
5837
|
Input,
|
|
5853
5838
|
{
|
|
5854
5839
|
id: "totpCode",
|
|
@@ -5858,7 +5843,7 @@ function TOTPDialog({
|
|
|
5858
5843
|
placeholder: t3("sshAuth.mfaMenuPlaceholder"),
|
|
5859
5844
|
className: CODE_INPUT
|
|
5860
5845
|
}
|
|
5861
|
-
) : allowsPushKeyword ? /* @__PURE__ */
|
|
5846
|
+
) : allowsPushKeyword ? /* @__PURE__ */ jsx30(
|
|
5862
5847
|
Input,
|
|
5863
5848
|
{
|
|
5864
5849
|
id: "totpCode",
|
|
@@ -5868,7 +5853,7 @@ function TOTPDialog({
|
|
|
5868
5853
|
placeholder: t3("sshAuth.mfaCodeOrPushPlaceholder"),
|
|
5869
5854
|
className: CODE_INPUT
|
|
5870
5855
|
}
|
|
5871
|
-
) : /* @__PURE__ */
|
|
5856
|
+
) : /* @__PURE__ */ jsx30(
|
|
5872
5857
|
Input,
|
|
5873
5858
|
{
|
|
5874
5859
|
id: "totpCode",
|
|
@@ -5884,7 +5869,7 @@ function TOTPDialog({
|
|
|
5884
5869
|
),
|
|
5885
5870
|
/* @__PURE__ */ jsxs22("div", { className: "flex justify-end gap-2", children: [
|
|
5886
5871
|
cancel,
|
|
5887
|
-
/* @__PURE__ */
|
|
5872
|
+
/* @__PURE__ */ jsx30("button", { type: "submit", className: PROMPT_PRIMARY_BUTTON, children: isPush ? t3("sshAuth.mfaSendRequest") : isPassword ? t3("common.connect") : t3("sshAuth.totpVerify") })
|
|
5888
5873
|
] })
|
|
5889
5874
|
] })
|
|
5890
5875
|
}
|
|
@@ -5897,12 +5882,12 @@ import { useState as useState11 } from "react";
|
|
|
5897
5882
|
|
|
5898
5883
|
// src/ui/components/tabs.tsx
|
|
5899
5884
|
init_define_import_meta_env();
|
|
5900
|
-
import { jsx as
|
|
5885
|
+
import { jsx as jsx31 } from "react/jsx-runtime";
|
|
5901
5886
|
function Tabs({
|
|
5902
5887
|
className,
|
|
5903
5888
|
...props
|
|
5904
5889
|
}) {
|
|
5905
|
-
return /* @__PURE__ */
|
|
5890
|
+
return /* @__PURE__ */ jsx31(
|
|
5906
5891
|
Root23,
|
|
5907
5892
|
{
|
|
5908
5893
|
"data-slot": "tabs",
|
|
@@ -5915,7 +5900,7 @@ function TabsList({
|
|
|
5915
5900
|
className,
|
|
5916
5901
|
...props
|
|
5917
5902
|
}) {
|
|
5918
|
-
return /* @__PURE__ */
|
|
5903
|
+
return /* @__PURE__ */ jsx31(
|
|
5919
5904
|
List,
|
|
5920
5905
|
{
|
|
5921
5906
|
"data-slot": "tabs-list",
|
|
@@ -5931,7 +5916,7 @@ function TabsTrigger({
|
|
|
5931
5916
|
className,
|
|
5932
5917
|
...props
|
|
5933
5918
|
}) {
|
|
5934
|
-
return /* @__PURE__ */
|
|
5919
|
+
return /* @__PURE__ */ jsx31(
|
|
5935
5920
|
Trigger3,
|
|
5936
5921
|
{
|
|
5937
5922
|
"data-slot": "tabs-trigger",
|
|
@@ -5947,7 +5932,7 @@ function TabsContent({
|
|
|
5947
5932
|
className,
|
|
5948
5933
|
...props
|
|
5949
5934
|
}) {
|
|
5950
|
-
return /* @__PURE__ */
|
|
5935
|
+
return /* @__PURE__ */ jsx31(
|
|
5951
5936
|
Content,
|
|
5952
5937
|
{
|
|
5953
5938
|
"data-slot": "tabs-content",
|
|
@@ -29272,7 +29257,7 @@ ReactCodeMirror.displayName = "CodeMirror";
|
|
|
29272
29257
|
var esm_default = ReactCodeMirror;
|
|
29273
29258
|
|
|
29274
29259
|
// src/ui/ssh/dialogs/SSHAuthDialog.tsx
|
|
29275
|
-
import { jsx as
|
|
29260
|
+
import { jsx as jsx32, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
29276
29261
|
function SSHAuthDialog({
|
|
29277
29262
|
isOpen,
|
|
29278
29263
|
reason,
|
|
@@ -29343,15 +29328,15 @@ function SSHAuthDialog({
|
|
|
29343
29328
|
}
|
|
29344
29329
|
}
|
|
29345
29330
|
};
|
|
29346
|
-
return /* @__PURE__ */
|
|
29331
|
+
return /* @__PURE__ */ jsx32(
|
|
29347
29332
|
PanePrompt,
|
|
29348
29333
|
{
|
|
29349
29334
|
open: true,
|
|
29350
29335
|
layer: "connection",
|
|
29351
29336
|
backgroundColor,
|
|
29352
|
-
icon: /* @__PURE__ */
|
|
29337
|
+
icon: /* @__PURE__ */ jsx32(Shield, { className: "size-4" }),
|
|
29353
29338
|
title: t3("auth.sshAuthenticationRequired"),
|
|
29354
|
-
description: /* @__PURE__ */
|
|
29339
|
+
description: /* @__PURE__ */ jsx32("span", { className: "font-mono", children: hostDisplay }),
|
|
29355
29340
|
className: "max-w-xl",
|
|
29356
29341
|
children: /* @__PURE__ */ jsxs23("form", { onSubmit: handleSubmit, children: [
|
|
29357
29342
|
/* @__PURE__ */ jsxs23("div", { className: "flex flex-col gap-3", children: [
|
|
@@ -29360,21 +29345,21 @@ function SSHAuthDialog({
|
|
|
29360
29345
|
{
|
|
29361
29346
|
className: `flex items-start gap-3 p-3 border ${reason === "auth_failed" ? "border-destructive/20 bg-destructive/10" : "border-border bg-muted/10"}`,
|
|
29362
29347
|
children: [
|
|
29363
|
-
/* @__PURE__ */
|
|
29348
|
+
/* @__PURE__ */ jsx32(
|
|
29364
29349
|
CircleAlert,
|
|
29365
29350
|
{
|
|
29366
29351
|
className: `size-4 shrink-0 mt-0.5 ${reason === "auth_failed" ? "text-destructive" : "text-accent-brand"}`
|
|
29367
29352
|
}
|
|
29368
29353
|
),
|
|
29369
29354
|
/* @__PURE__ */ jsxs23("div", { children: [
|
|
29370
|
-
/* @__PURE__ */
|
|
29355
|
+
/* @__PURE__ */ jsx32(
|
|
29371
29356
|
"p",
|
|
29372
29357
|
{
|
|
29373
29358
|
className: `text-[10px] font-bold uppercase tracking-widest ${reason === "auth_failed" ? "text-destructive" : ""}`,
|
|
29374
29359
|
children: getReasonMessage()
|
|
29375
29360
|
}
|
|
29376
29361
|
),
|
|
29377
|
-
/* @__PURE__ */
|
|
29362
|
+
/* @__PURE__ */ jsx32(
|
|
29378
29363
|
"p",
|
|
29379
29364
|
{
|
|
29380
29365
|
className: `text-xs mt-1 ${reason === "auth_failed" ? "text-destructive/80" : "text-muted-foreground"}`,
|
|
@@ -29392,7 +29377,7 @@ function SSHAuthDialog({
|
|
|
29392
29377
|
onValueChange: (v) => setAuthTab(v),
|
|
29393
29378
|
children: [
|
|
29394
29379
|
/* @__PURE__ */ jsxs23(TabsList, { className: "w-full rounded-none", children: [
|
|
29395
|
-
/* @__PURE__ */
|
|
29380
|
+
/* @__PURE__ */ jsx32(
|
|
29396
29381
|
TabsTrigger,
|
|
29397
29382
|
{
|
|
29398
29383
|
value: "password",
|
|
@@ -29400,7 +29385,7 @@ function SSHAuthDialog({
|
|
|
29400
29385
|
children: t3("credentials.password")
|
|
29401
29386
|
}
|
|
29402
29387
|
),
|
|
29403
|
-
/* @__PURE__ */
|
|
29388
|
+
/* @__PURE__ */ jsx32(
|
|
29404
29389
|
TabsTrigger,
|
|
29405
29390
|
{
|
|
29406
29391
|
value: "key",
|
|
@@ -29410,8 +29395,8 @@ function SSHAuthDialog({
|
|
|
29410
29395
|
)
|
|
29411
29396
|
] }),
|
|
29412
29397
|
/* @__PURE__ */ jsxs23(TabsContent, { value: "password", className: "mt-3 flex flex-col gap-2", children: [
|
|
29413
|
-
/* @__PURE__ */
|
|
29414
|
-
/* @__PURE__ */
|
|
29398
|
+
/* @__PURE__ */ jsx32(Label, { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: t3("credentials.password") }),
|
|
29399
|
+
/* @__PURE__ */ jsx32(
|
|
29415
29400
|
PasswordInput,
|
|
29416
29401
|
{
|
|
29417
29402
|
placeholder: t3("placeholders.enterPassword"),
|
|
@@ -29421,13 +29406,13 @@ function SSHAuthDialog({
|
|
|
29421
29406
|
className: "rounded-none bg-muted/50 border-border text-xs"
|
|
29422
29407
|
}
|
|
29423
29408
|
),
|
|
29424
|
-
/* @__PURE__ */
|
|
29409
|
+
/* @__PURE__ */ jsx32("p", { className: "text-[10px] text-muted-foreground", children: t3("auth.sshPasswordDescription") })
|
|
29425
29410
|
] }),
|
|
29426
29411
|
/* @__PURE__ */ jsxs23(TabsContent, { value: "key", className: "mt-3 flex flex-col gap-3", children: [
|
|
29427
29412
|
/* @__PURE__ */ jsxs23("div", { className: "flex flex-col gap-2", children: [
|
|
29428
|
-
/* @__PURE__ */
|
|
29413
|
+
/* @__PURE__ */ jsx32(Label, { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: t3("credentials.sshPrivateKey") }),
|
|
29429
29414
|
/* @__PURE__ */ jsxs23("div", { className: "relative", children: [
|
|
29430
|
-
/* @__PURE__ */
|
|
29415
|
+
/* @__PURE__ */ jsx32(
|
|
29431
29416
|
"input",
|
|
29432
29417
|
{
|
|
29433
29418
|
id: "key-upload",
|
|
@@ -29444,13 +29429,13 @@ function SSHAuthDialog({
|
|
|
29444
29429
|
variant: "outline",
|
|
29445
29430
|
className: "w-full justify-start rounded-none text-[10px] font-bold uppercase tracking-widest border-border",
|
|
29446
29431
|
children: [
|
|
29447
|
-
/* @__PURE__ */
|
|
29448
|
-
/* @__PURE__ */
|
|
29432
|
+
/* @__PURE__ */ jsx32(Upload, { className: "size-3.5 mr-2" }),
|
|
29433
|
+
/* @__PURE__ */ jsx32("span", { className: "truncate", children: t3("credentials.uploadPrivateKeyFile") })
|
|
29449
29434
|
]
|
|
29450
29435
|
}
|
|
29451
29436
|
)
|
|
29452
29437
|
] }),
|
|
29453
|
-
/* @__PURE__ */
|
|
29438
|
+
/* @__PURE__ */ jsx32(
|
|
29454
29439
|
esm_default,
|
|
29455
29440
|
{
|
|
29456
29441
|
value: sshKey,
|
|
@@ -29487,7 +29472,7 @@ function SSHAuthDialog({
|
|
|
29487
29472
|
t3("common.optional"),
|
|
29488
29473
|
")"
|
|
29489
29474
|
] }),
|
|
29490
|
-
/* @__PURE__ */
|
|
29475
|
+
/* @__PURE__ */ jsx32(
|
|
29491
29476
|
PasswordInput,
|
|
29492
29477
|
{
|
|
29493
29478
|
placeholder: t3("placeholders.keyPassword"),
|
|
@@ -29496,7 +29481,7 @@ function SSHAuthDialog({
|
|
|
29496
29481
|
className: "rounded-none bg-muted/50 border-border text-xs"
|
|
29497
29482
|
}
|
|
29498
29483
|
),
|
|
29499
|
-
/* @__PURE__ */
|
|
29484
|
+
/* @__PURE__ */ jsx32("p", { className: "text-[10px] text-muted-foreground", children: t3("auth.sshKeyPasswordDescription") })
|
|
29500
29485
|
] }),
|
|
29501
29486
|
/* @__PURE__ */ jsxs23("div", { className: "flex flex-col gap-2", children: [
|
|
29502
29487
|
/* @__PURE__ */ jsxs23(Label, { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: [
|
|
@@ -29505,7 +29490,7 @@ function SSHAuthDialog({
|
|
|
29505
29490
|
t3("common.optional"),
|
|
29506
29491
|
")"
|
|
29507
29492
|
] }),
|
|
29508
|
-
/* @__PURE__ */
|
|
29493
|
+
/* @__PURE__ */ jsx32(
|
|
29509
29494
|
PasswordInput,
|
|
29510
29495
|
{
|
|
29511
29496
|
placeholder: t3("placeholders.enterPassword"),
|
|
@@ -29521,7 +29506,7 @@ function SSHAuthDialog({
|
|
|
29521
29506
|
)
|
|
29522
29507
|
] }),
|
|
29523
29508
|
/* @__PURE__ */ jsxs23("div", { className: "flex justify-end gap-2 pt-3", children: [
|
|
29524
|
-
/* @__PURE__ */
|
|
29509
|
+
/* @__PURE__ */ jsx32(
|
|
29525
29510
|
"button",
|
|
29526
29511
|
{
|
|
29527
29512
|
type: "button",
|
|
@@ -29531,7 +29516,7 @@ function SSHAuthDialog({
|
|
|
29531
29516
|
children: t3("common.cancel")
|
|
29532
29517
|
}
|
|
29533
29518
|
),
|
|
29534
|
-
/* @__PURE__ */
|
|
29519
|
+
/* @__PURE__ */ jsx32(
|
|
29535
29520
|
"button",
|
|
29536
29521
|
{
|
|
29537
29522
|
type: "submit",
|
|
@@ -29551,7 +29536,7 @@ init_define_import_meta_env();
|
|
|
29551
29536
|
import { useState as useState12 } from "react";
|
|
29552
29537
|
import { useTranslation as useTranslation12 } from "react-i18next";
|
|
29553
29538
|
import { toast as toast3 } from "sonner";
|
|
29554
|
-
import { jsx as
|
|
29539
|
+
import { jsx as jsx33, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
29555
29540
|
function BrowserSignInDialog({
|
|
29556
29541
|
isOpen,
|
|
29557
29542
|
label,
|
|
@@ -29575,24 +29560,24 @@ function BrowserSignInDialog({
|
|
|
29575
29560
|
toast3.error(t3("common.copyFailed"));
|
|
29576
29561
|
}
|
|
29577
29562
|
};
|
|
29578
|
-
return /* @__PURE__ */
|
|
29563
|
+
return /* @__PURE__ */ jsx33(
|
|
29579
29564
|
PanePrompt,
|
|
29580
29565
|
{
|
|
29581
29566
|
open: true,
|
|
29582
29567
|
layer: "connection",
|
|
29583
29568
|
backgroundColor,
|
|
29584
|
-
icon: /* @__PURE__ */
|
|
29569
|
+
icon: /* @__PURE__ */ jsx33(Shield, { className: "size-4" }),
|
|
29585
29570
|
title: t3("sshAuth.browserSignInRequired", { provider: label }),
|
|
29586
29571
|
className: "max-w-md",
|
|
29587
29572
|
children: /* @__PURE__ */ jsxs24("div", { className: "flex flex-col gap-3", children: [
|
|
29588
29573
|
code2 && code2 !== "N/A" && /* @__PURE__ */ jsxs24("div", { className: "flex flex-col gap-1.5", children: [
|
|
29589
|
-
/* @__PURE__ */
|
|
29590
|
-
/* @__PURE__ */
|
|
29574
|
+
/* @__PURE__ */ jsx33("p", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: t3("sshAuth.browserSignInCode") }),
|
|
29575
|
+
/* @__PURE__ */ jsx33("div", { className: "border border-border bg-muted/10 p-4 text-center", children: /* @__PURE__ */ jsx33("div", { className: "text-2xl font-mono font-bold tracking-wider text-accent-brand", children: code2 }) })
|
|
29591
29576
|
] }),
|
|
29592
29577
|
/* @__PURE__ */ jsxs24("div", { className: "flex flex-col gap-1.5", children: [
|
|
29593
|
-
/* @__PURE__ */
|
|
29578
|
+
/* @__PURE__ */ jsx33("p", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: t3("sshAuth.browserSignInUrl") }),
|
|
29594
29579
|
/* @__PURE__ */ jsxs24("div", { className: "flex gap-2", children: [
|
|
29595
|
-
/* @__PURE__ */
|
|
29580
|
+
/* @__PURE__ */ jsx33(
|
|
29596
29581
|
Input,
|
|
29597
29582
|
{
|
|
29598
29583
|
type: "text",
|
|
@@ -29601,7 +29586,7 @@ function BrowserSignInDialog({
|
|
|
29601
29586
|
className: "rounded-none bg-muted/50 border-border text-xs font-mono flex-1"
|
|
29602
29587
|
}
|
|
29603
29588
|
),
|
|
29604
|
-
/* @__PURE__ */
|
|
29589
|
+
/* @__PURE__ */ jsx33(
|
|
29605
29590
|
"button",
|
|
29606
29591
|
{
|
|
29607
29592
|
type: "button",
|
|
@@ -29609,13 +29594,13 @@ function BrowserSignInDialog({
|
|
|
29609
29594
|
className: `${PROMPT_BUTTON} h-9 w-9 shrink-0 px-0`,
|
|
29610
29595
|
title: t3("common.copy"),
|
|
29611
29596
|
"aria-label": t3("common.copy"),
|
|
29612
|
-
children: copied ? /* @__PURE__ */
|
|
29597
|
+
children: copied ? /* @__PURE__ */ jsx33(Check, { className: "size-4 text-accent-brand" }) : /* @__PURE__ */ jsx33(Copy, { className: "size-4" })
|
|
29613
29598
|
}
|
|
29614
29599
|
)
|
|
29615
29600
|
] })
|
|
29616
29601
|
] }),
|
|
29617
29602
|
/* @__PURE__ */ jsxs24("div", { className: "flex flex-wrap justify-end gap-2", children: [
|
|
29618
|
-
/* @__PURE__ */
|
|
29603
|
+
/* @__PURE__ */ jsx33(
|
|
29619
29604
|
"button",
|
|
29620
29605
|
{
|
|
29621
29606
|
type: "button",
|
|
@@ -29624,7 +29609,7 @@ function BrowserSignInDialog({
|
|
|
29624
29609
|
children: t3("common.cancel")
|
|
29625
29610
|
}
|
|
29626
29611
|
),
|
|
29627
|
-
/* @__PURE__ */
|
|
29612
|
+
/* @__PURE__ */ jsx33("button", { type: "button", onClick: onContinue, className: PROMPT_BUTTON, children: t3("sshAuth.browserSignInContinue") }),
|
|
29628
29613
|
/* @__PURE__ */ jsxs24(
|
|
29629
29614
|
"button",
|
|
29630
29615
|
{
|
|
@@ -29632,7 +29617,7 @@ function BrowserSignInDialog({
|
|
|
29632
29617
|
onClick: onOpenUrl,
|
|
29633
29618
|
className: PROMPT_PRIMARY_BUTTON,
|
|
29634
29619
|
children: [
|
|
29635
|
-
/* @__PURE__ */
|
|
29620
|
+
/* @__PURE__ */ jsx33(ExternalLink, { className: "size-3.5" }),
|
|
29636
29621
|
t3("sshAuth.browserSignInOpen")
|
|
29637
29622
|
]
|
|
29638
29623
|
}
|
|
@@ -29651,7 +29636,7 @@ import { useRef as useRef7 } from "react";
|
|
|
29651
29636
|
init_define_import_meta_env();
|
|
29652
29637
|
import React9, { memo, useCallback as useCallback7, useEffect as useEffect10, useRef as useRef6, useState as useState13 } from "react";
|
|
29653
29638
|
import { useTranslation as useTranslation13 } from "react-i18next";
|
|
29654
|
-
import { Fragment as Fragment5, jsx as
|
|
29639
|
+
import { Fragment as Fragment5, jsx as jsx34, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
29655
29640
|
var DRAG_THRESHOLD = 5;
|
|
29656
29641
|
function tabLabel(tab) {
|
|
29657
29642
|
return tab.customLabel || tab.label;
|
|
@@ -29725,7 +29710,7 @@ function PaneHeader({
|
|
|
29725
29710
|
onLostPointerCapture: () => finishDrag(false),
|
|
29726
29711
|
className: `flex h-7 shrink-0 items-center gap-1 border-b pl-1 pr-0.5 text-xs select-none ${focused ? "border-accent-brand/40 bg-accent-brand/10" : "border-border bg-sidebar"} ${tab && !ctx.isMobile ? "cursor-grab active:cursor-grabbing" : ""}`,
|
|
29727
29712
|
children: [
|
|
29728
|
-
/* @__PURE__ */
|
|
29713
|
+
/* @__PURE__ */ jsx34(
|
|
29729
29714
|
"span",
|
|
29730
29715
|
{
|
|
29731
29716
|
className: `flex h-4 min-w-4 shrink-0 items-center justify-center px-1 font-mono text-[10px] ${focused ? "bg-accent-brand text-background" : "bg-muted text-muted-foreground"}`,
|
|
@@ -29733,42 +29718,42 @@ function PaneHeader({
|
|
|
29733
29718
|
}
|
|
29734
29719
|
),
|
|
29735
29720
|
/* @__PURE__ */ jsxs25(DropdownMenu, { children: [
|
|
29736
|
-
/* @__PURE__ */
|
|
29721
|
+
/* @__PURE__ */ jsx34(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs25(
|
|
29737
29722
|
"button",
|
|
29738
29723
|
{
|
|
29739
29724
|
type: "button",
|
|
29740
29725
|
className: `flex min-w-0 items-center gap-1.5 px-1 py-0.5 hover:bg-muted ${focused ? "text-accent-brand" : "text-foreground"}`,
|
|
29741
29726
|
title: t3("splitScreen.showHere"),
|
|
29742
29727
|
children: [
|
|
29743
|
-
tab && /* @__PURE__ */
|
|
29744
|
-
/* @__PURE__ */
|
|
29728
|
+
tab && /* @__PURE__ */ jsx34("span", { className: focused ? "" : "text-muted-foreground", children: tabIcon(tab.type) }),
|
|
29729
|
+
/* @__PURE__ */ jsx34(
|
|
29745
29730
|
"span",
|
|
29746
29731
|
{
|
|
29747
29732
|
className: `truncate ${tab ? "font-medium" : "text-muted-foreground"}`,
|
|
29748
29733
|
children: label
|
|
29749
29734
|
}
|
|
29750
29735
|
),
|
|
29751
|
-
/* @__PURE__ */
|
|
29736
|
+
/* @__PURE__ */ jsx34(ChevronDown, { className: "size-3 shrink-0 opacity-60" })
|
|
29752
29737
|
]
|
|
29753
29738
|
}
|
|
29754
29739
|
) }),
|
|
29755
29740
|
/* @__PURE__ */ jsxs25(DropdownMenuContent, { align: "start", className: "w-60", children: [
|
|
29756
|
-
/* @__PURE__ */
|
|
29757
|
-
ctx.freeTabs.length === 0 && /* @__PURE__ */
|
|
29741
|
+
/* @__PURE__ */ jsx34(DropdownMenuLabel, { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: t3("splitScreen.showHere") }),
|
|
29742
|
+
ctx.freeTabs.length === 0 && /* @__PURE__ */ jsx34(DropdownMenuItem, { disabled: true, children: t3("splitScreen.noOpenTabs") }),
|
|
29758
29743
|
ctx.freeTabs.map((free) => /* @__PURE__ */ jsxs25(
|
|
29759
29744
|
DropdownMenuItem,
|
|
29760
29745
|
{
|
|
29761
29746
|
onSelect: () => actions.showInPane(pane.id, free.id),
|
|
29762
29747
|
children: [
|
|
29763
29748
|
tabIcon(free.type),
|
|
29764
|
-
/* @__PURE__ */
|
|
29749
|
+
/* @__PURE__ */ jsx34("span", { className: "truncate", children: tabLabel(free) })
|
|
29765
29750
|
]
|
|
29766
29751
|
},
|
|
29767
29752
|
free.id
|
|
29768
29753
|
)),
|
|
29769
29754
|
tab && /* @__PURE__ */ jsxs25(Fragment5, { children: [
|
|
29770
|
-
/* @__PURE__ */
|
|
29771
|
-
/* @__PURE__ */
|
|
29755
|
+
/* @__PURE__ */ jsx34(DropdownMenuSeparator, {}),
|
|
29756
|
+
/* @__PURE__ */ jsx34(
|
|
29772
29757
|
DropdownMenuItem,
|
|
29773
29758
|
{
|
|
29774
29759
|
onSelect: () => actions.showInPane(pane.id, null),
|
|
@@ -29780,7 +29765,7 @@ function PaneHeader({
|
|
|
29780
29765
|
] }),
|
|
29781
29766
|
/* @__PURE__ */ jsxs25("div", { className: "ml-auto flex shrink-0 items-center", children: [
|
|
29782
29767
|
!ctx.isMobile && /* @__PURE__ */ jsxs25(Fragment5, { children: [
|
|
29783
|
-
/* @__PURE__ */
|
|
29768
|
+
/* @__PURE__ */ jsx34(
|
|
29784
29769
|
"button",
|
|
29785
29770
|
{
|
|
29786
29771
|
type: "button",
|
|
@@ -29789,10 +29774,10 @@ function PaneHeader({
|
|
|
29789
29774
|
title: fullTitle ?? t3("splitScreen.splitRight"),
|
|
29790
29775
|
"aria-label": t3("splitScreen.splitRight"),
|
|
29791
29776
|
onClick: () => actions.splitPane(pane.id, "right"),
|
|
29792
|
-
children: /* @__PURE__ */
|
|
29777
|
+
children: /* @__PURE__ */ jsx34(Columns2, { className: "size-3.5" })
|
|
29793
29778
|
}
|
|
29794
29779
|
),
|
|
29795
|
-
/* @__PURE__ */
|
|
29780
|
+
/* @__PURE__ */ jsx34(
|
|
29796
29781
|
"button",
|
|
29797
29782
|
{
|
|
29798
29783
|
type: "button",
|
|
@@ -29801,10 +29786,10 @@ function PaneHeader({
|
|
|
29801
29786
|
title: fullTitle ?? t3("splitScreen.splitDown"),
|
|
29802
29787
|
"aria-label": t3("splitScreen.splitDown"),
|
|
29803
29788
|
onClick: () => actions.splitPane(pane.id, "bottom"),
|
|
29804
|
-
children: /* @__PURE__ */
|
|
29789
|
+
children: /* @__PURE__ */ jsx34(Rows2, { className: "size-3.5" })
|
|
29805
29790
|
}
|
|
29806
29791
|
),
|
|
29807
|
-
panes.length > 1 && /* @__PURE__ */
|
|
29792
|
+
panes.length > 1 && /* @__PURE__ */ jsx34(
|
|
29808
29793
|
"button",
|
|
29809
29794
|
{
|
|
29810
29795
|
type: "button",
|
|
@@ -29813,36 +29798,36 @@ function PaneHeader({
|
|
|
29813
29798
|
"aria-label": zoomed ? t3("splitScreen.unzoom") : t3("splitScreen.zoom"),
|
|
29814
29799
|
"aria-pressed": zoomed,
|
|
29815
29800
|
onClick: () => actions.toggleZoom(pane.id),
|
|
29816
|
-
children: zoomed ? /* @__PURE__ */
|
|
29801
|
+
children: zoomed ? /* @__PURE__ */ jsx34(Minimize2, { className: "size-3.5" }) : /* @__PURE__ */ jsx34(Maximize2, { className: "size-3.5" })
|
|
29817
29802
|
}
|
|
29818
29803
|
)
|
|
29819
29804
|
] }),
|
|
29820
29805
|
/* @__PURE__ */ jsxs25(DropdownMenu, { children: [
|
|
29821
|
-
/* @__PURE__ */
|
|
29806
|
+
/* @__PURE__ */ jsx34(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx34(
|
|
29822
29807
|
"button",
|
|
29823
29808
|
{
|
|
29824
29809
|
type: "button",
|
|
29825
29810
|
className: buttonClass,
|
|
29826
29811
|
title: t3("splitScreen.paneActions"),
|
|
29827
29812
|
"aria-label": t3("splitScreen.paneActions"),
|
|
29828
|
-
children: /* @__PURE__ */
|
|
29813
|
+
children: /* @__PURE__ */ jsx34(Ellipsis, { className: "size-3.5" })
|
|
29829
29814
|
}
|
|
29830
29815
|
) }),
|
|
29831
29816
|
/* @__PURE__ */ jsxs25(DropdownMenuContent, { align: "end", className: "w-52", children: [
|
|
29832
29817
|
tab && /* @__PURE__ */ jsxs25(Fragment5, { children: [
|
|
29833
|
-
/* @__PURE__ */
|
|
29834
|
-
/* @__PURE__ */
|
|
29818
|
+
/* @__PURE__ */ jsx34(DropdownMenuItem, { onSelect: () => actions.moveToTab(pane.id), children: t3("splitScreen.moveToTab") }),
|
|
29819
|
+
/* @__PURE__ */ jsx34(DropdownMenuItem, { onSelect: () => actions.closeSession(tab.id), children: t3("splitScreen.closeSession") })
|
|
29835
29820
|
] }),
|
|
29836
29821
|
otherPanes.length > 0 && /* @__PURE__ */ jsxs25(DropdownMenuSub, { children: [
|
|
29837
|
-
/* @__PURE__ */
|
|
29838
|
-
/* @__PURE__ */
|
|
29822
|
+
/* @__PURE__ */ jsx34(DropdownMenuSubTrigger, { children: t3("splitScreen.swapWith") }),
|
|
29823
|
+
/* @__PURE__ */ jsx34(DropdownMenuSubContent, { className: "w-56", children: otherPanes.map((other) => {
|
|
29839
29824
|
const otherTab = other.tabId ? tabsById.get(other.tabId) : void 0;
|
|
29840
29825
|
const otherIndex = paneIndexById.get(other.id) ?? 0;
|
|
29841
|
-
return /* @__PURE__ */
|
|
29826
|
+
return /* @__PURE__ */ jsx34(
|
|
29842
29827
|
DropdownMenuItem,
|
|
29843
29828
|
{
|
|
29844
29829
|
onSelect: () => actions.swapPanes(pane.id, other.id),
|
|
29845
|
-
children: /* @__PURE__ */
|
|
29830
|
+
children: /* @__PURE__ */ jsx34("span", { className: "truncate", children: otherTab ? t3("splitScreen.paneItem", {
|
|
29846
29831
|
index: otherIndex,
|
|
29847
29832
|
label: tabLabel(otherTab)
|
|
29848
29833
|
}) : t3("splitScreen.paneEmptyItem", {
|
|
@@ -29853,8 +29838,8 @@ function PaneHeader({
|
|
|
29853
29838
|
);
|
|
29854
29839
|
}) })
|
|
29855
29840
|
] }),
|
|
29856
|
-
(tab || otherPanes.length > 0) && /* @__PURE__ */
|
|
29857
|
-
/* @__PURE__ */
|
|
29841
|
+
(tab || otherPanes.length > 0) && /* @__PURE__ */ jsx34(DropdownMenuSeparator, {}),
|
|
29842
|
+
/* @__PURE__ */ jsx34(
|
|
29858
29843
|
DropdownMenuItem,
|
|
29859
29844
|
{
|
|
29860
29845
|
variant: "destructive",
|
|
@@ -29902,12 +29887,12 @@ var PaneView = memo(function PaneView2({
|
|
|
29902
29887
|
"data-split-pane-id": pane.id,
|
|
29903
29888
|
className: "relative flex size-full min-h-0 min-w-0 flex-col overflow-hidden bg-background",
|
|
29904
29889
|
children: [
|
|
29905
|
-
/* @__PURE__ */
|
|
29890
|
+
/* @__PURE__ */ jsx34(PaneHeader, { pane, tab, focused, ctx }),
|
|
29906
29891
|
/* @__PURE__ */ jsxs25("div", { className: "relative min-h-0 flex-1 overflow-hidden", children: [
|
|
29907
|
-
tab ? /* @__PURE__ */
|
|
29908
|
-
ctx.resizing && /* @__PURE__ */
|
|
29892
|
+
tab ? /* @__PURE__ */ jsx34("div", { ref: contentRef, className: "absolute inset-0" }) : ctx.renderEmptyPane(pane.id, ctx.paneIndexById.get(pane.id) ?? 0),
|
|
29893
|
+
ctx.resizing && /* @__PURE__ */ jsx34("div", { className: "absolute inset-0 z-10" })
|
|
29909
29894
|
] }),
|
|
29910
|
-
focused && ctx.paneCount > 1 && /* @__PURE__ */
|
|
29895
|
+
focused && ctx.paneCount > 1 && /* @__PURE__ */ jsx34("div", { className: "pointer-events-none absolute inset-0 z-30 border border-accent-brand/70" })
|
|
29911
29896
|
]
|
|
29912
29897
|
}
|
|
29913
29898
|
);
|
|
@@ -29947,11 +29932,11 @@ function Divider({
|
|
|
29947
29932
|
ctx.setResizing(false);
|
|
29948
29933
|
ctx.actions.resizeEnd();
|
|
29949
29934
|
}
|
|
29950
|
-
return /* @__PURE__ */
|
|
29935
|
+
return /* @__PURE__ */ jsx34(
|
|
29951
29936
|
"div",
|
|
29952
29937
|
{
|
|
29953
29938
|
className: `relative z-20 shrink-0 bg-border ${row ? "w-px" : "h-px"}`,
|
|
29954
|
-
children: /* @__PURE__ */
|
|
29939
|
+
children: /* @__PURE__ */ jsx34(
|
|
29955
29940
|
"div",
|
|
29956
29941
|
{
|
|
29957
29942
|
role: "separator",
|
|
@@ -29966,7 +29951,7 @@ function Divider({
|
|
|
29966
29951
|
ctx.actions.resizeEnd();
|
|
29967
29952
|
},
|
|
29968
29953
|
className: `group absolute flex touch-none items-center justify-center ${row ? "inset-y-0 -left-1.5 -right-1.5 cursor-col-resize" : "inset-x-0 -top-1.5 -bottom-1.5 cursor-row-resize"}`,
|
|
29969
|
-
children: /* @__PURE__ */
|
|
29954
|
+
children: /* @__PURE__ */ jsx34(
|
|
29970
29955
|
"div",
|
|
29971
29956
|
{
|
|
29972
29957
|
className: `pointer-events-none bg-transparent transition-colors group-hover:bg-accent-brand/60 ${row ? "h-full w-0.5" : "h-0.5 w-full"}`
|
|
@@ -29978,22 +29963,22 @@ function Divider({
|
|
|
29978
29963
|
);
|
|
29979
29964
|
}
|
|
29980
29965
|
function NodeView({ node, ctx }) {
|
|
29981
|
-
if (node.kind === "pane") return /* @__PURE__ */
|
|
29966
|
+
if (node.kind === "pane") return /* @__PURE__ */ jsx34(PaneView, { pane: node, ctx });
|
|
29982
29967
|
const row = node.direction === "row";
|
|
29983
|
-
return /* @__PURE__ */
|
|
29968
|
+
return /* @__PURE__ */ jsx34(
|
|
29984
29969
|
"div",
|
|
29985
29970
|
{
|
|
29986
29971
|
className: `flex size-full min-h-0 min-w-0 ${row ? "flex-row" : "flex-col"}`,
|
|
29987
29972
|
children: node.children.map((child, index) => /* @__PURE__ */ jsxs25(React9.Fragment, { children: [
|
|
29988
|
-
/* @__PURE__ */
|
|
29973
|
+
/* @__PURE__ */ jsx34(
|
|
29989
29974
|
"div",
|
|
29990
29975
|
{
|
|
29991
29976
|
className: "relative min-h-0 min-w-0 overflow-hidden",
|
|
29992
29977
|
style: { flex: `${node.sizes[index]} 1 0px` },
|
|
29993
|
-
children: /* @__PURE__ */
|
|
29978
|
+
children: /* @__PURE__ */ jsx34(NodeView, { node: child, ctx })
|
|
29994
29979
|
}
|
|
29995
29980
|
),
|
|
29996
|
-
index < node.children.length - 1 && /* @__PURE__ */
|
|
29981
|
+
index < node.children.length - 1 && /* @__PURE__ */ jsx34(Divider, { node, index, ctx })
|
|
29997
29982
|
] }, child.id))
|
|
29998
29983
|
}
|
|
29999
29984
|
);
|
|
@@ -30001,7 +29986,7 @@ function NodeView({ node, ctx }) {
|
|
|
30001
29986
|
function MobilePaneStrip({ ctx }) {
|
|
30002
29987
|
const { t: t3 } = useTranslation13();
|
|
30003
29988
|
const panes = listPanes(ctx.splitTab.split.root);
|
|
30004
|
-
return /* @__PURE__ */
|
|
29989
|
+
return /* @__PURE__ */ jsx34("div", { className: "flex h-9 shrink-0 items-stretch overflow-x-auto border-b border-border bg-sidebar", children: panes.map((pane) => {
|
|
30005
29990
|
const tab = pane.tabId ? ctx.tabsById.get(pane.tabId) : void 0;
|
|
30006
29991
|
const active2 = ctx.splitTab.split.focusedPaneId === pane.id;
|
|
30007
29992
|
const index = ctx.paneIndexById.get(pane.id) ?? 0;
|
|
@@ -30012,8 +29997,8 @@ function MobilePaneStrip({ ctx }) {
|
|
|
30012
29997
|
onClick: () => ctx.actions.focusPane(pane.id),
|
|
30013
29998
|
className: `flex min-w-0 max-w-40 shrink-0 items-center gap-1.5 border-r border-border px-3 text-xs ${active2 ? "bg-accent-brand/10 text-accent-brand" : "text-muted-foreground"}`,
|
|
30014
29999
|
children: [
|
|
30015
|
-
/* @__PURE__ */
|
|
30016
|
-
/* @__PURE__ */
|
|
30000
|
+
/* @__PURE__ */ jsx34("span", { className: "font-mono text-[10px]", children: index }),
|
|
30001
|
+
/* @__PURE__ */ jsx34("span", { className: "truncate", children: tab ? tabLabel(tab) : t3("splitScreen.emptyTitle") })
|
|
30017
30002
|
]
|
|
30018
30003
|
},
|
|
30019
30004
|
pane.id
|
|
@@ -30069,8 +30054,8 @@ function SplitView({
|
|
|
30069
30054
|
className: `flex size-full min-h-0 flex-col overflow-hidden ${resizing ? "select-none" : ""}`,
|
|
30070
30055
|
"data-split-view": splitTab.id,
|
|
30071
30056
|
children: [
|
|
30072
|
-
isMobile && panes.length > 1 && /* @__PURE__ */
|
|
30073
|
-
/* @__PURE__ */
|
|
30057
|
+
isMobile && panes.length > 1 && /* @__PURE__ */ jsx34(MobilePaneStrip, { ctx }),
|
|
30058
|
+
/* @__PURE__ */ jsx34("div", { className: "relative min-h-0 flex-1", children: single ? /* @__PURE__ */ jsx34(PaneView, { pane: single, ctx }, single.id) : /* @__PURE__ */ jsx34(NodeView, { node: splitTab.split.root, ctx }) })
|
|
30074
30059
|
]
|
|
30075
30060
|
}
|
|
30076
30061
|
);
|
|
@@ -30081,7 +30066,7 @@ init_define_import_meta_env();
|
|
|
30081
30066
|
import { useEffect as useEffect11 } from "react";
|
|
30082
30067
|
import { createPortal } from "react-dom";
|
|
30083
30068
|
import { useTranslation as useTranslation14 } from "react-i18next";
|
|
30084
|
-
import { jsx as
|
|
30069
|
+
import { jsx as jsx35, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
30085
30070
|
function SplitDropOverlay({
|
|
30086
30071
|
containerRef
|
|
30087
30072
|
}) {
|
|
@@ -30122,7 +30107,7 @@ function SplitDropOverlay({
|
|
|
30122
30107
|
const { hover } = drag;
|
|
30123
30108
|
return createPortal(
|
|
30124
30109
|
/* @__PURE__ */ jsxs26("div", { className: "pointer-events-none fixed inset-0 z-[9998]", children: [
|
|
30125
|
-
hover && /* @__PURE__ */
|
|
30110
|
+
hover && /* @__PURE__ */ jsx35(
|
|
30126
30111
|
"div",
|
|
30127
30112
|
{
|
|
30128
30113
|
className: "absolute flex items-center justify-center border-2 border-dashed border-accent-brand bg-accent-brand/15 transition-[left,top,width,height] duration-100",
|
|
@@ -30132,10 +30117,10 @@ function SplitDropOverlay({
|
|
|
30132
30117
|
width: hover.rect.width,
|
|
30133
30118
|
height: hover.rect.height
|
|
30134
30119
|
},
|
|
30135
|
-
children: /* @__PURE__ */
|
|
30120
|
+
children: /* @__PURE__ */ jsx35("span", { className: "bg-background/90 px-2 py-1 text-xs font-medium text-accent-brand", children: hover.target === "center" ? t3("splitScreen.dropHere") : t3("splitScreen.dropSplit") })
|
|
30136
30121
|
}
|
|
30137
30122
|
),
|
|
30138
|
-
/* @__PURE__ */
|
|
30123
|
+
/* @__PURE__ */ jsx35(
|
|
30139
30124
|
"div",
|
|
30140
30125
|
{
|
|
30141
30126
|
className: "absolute max-w-48 truncate border border-border bg-popover px-2 py-1 text-xs text-foreground shadow-lg",
|
|
@@ -30152,7 +30137,7 @@ function SplitDropOverlay({
|
|
|
30152
30137
|
init_define_import_meta_env();
|
|
30153
30138
|
import { useMemo as useMemo5, useState as useState14 } from "react";
|
|
30154
30139
|
import { useTranslation as useTranslation15 } from "react-i18next";
|
|
30155
|
-
import { jsx as
|
|
30140
|
+
import { jsx as jsx36, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
30156
30141
|
var HOST_LIMIT = 60;
|
|
30157
30142
|
function HostActionButton({
|
|
30158
30143
|
host,
|
|
@@ -30163,7 +30148,7 @@ function HostActionButton({
|
|
|
30163
30148
|
const Icon = action.icon;
|
|
30164
30149
|
const title = action.label?.(host) ?? t3(action.titleKey);
|
|
30165
30150
|
const items = action.items?.(host) ?? [];
|
|
30166
|
-
const button = /* @__PURE__ */
|
|
30151
|
+
const button = /* @__PURE__ */ jsx36(
|
|
30167
30152
|
"button",
|
|
30168
30153
|
{
|
|
30169
30154
|
type: "button",
|
|
@@ -30171,13 +30156,13 @@ function HostActionButton({
|
|
|
30171
30156
|
"aria-label": `${host.name}: ${title}`,
|
|
30172
30157
|
className: "flex size-6 shrink-0 items-center justify-center text-muted-foreground hover:bg-accent-brand/10 hover:text-accent-brand",
|
|
30173
30158
|
onClick: items.length > 1 ? void 0 : () => onPick({ action }),
|
|
30174
|
-
children: /* @__PURE__ */
|
|
30159
|
+
children: /* @__PURE__ */ jsx36(Icon, { className: "size-3.5" })
|
|
30175
30160
|
}
|
|
30176
30161
|
);
|
|
30177
30162
|
if (items.length <= 1) return button;
|
|
30178
30163
|
return /* @__PURE__ */ jsxs27(DropdownMenu, { children: [
|
|
30179
|
-
/* @__PURE__ */
|
|
30180
|
-
/* @__PURE__ */
|
|
30164
|
+
/* @__PURE__ */ jsx36(DropdownMenuTrigger, { asChild: true, children: button }),
|
|
30165
|
+
/* @__PURE__ */ jsx36(DropdownMenuContent, { align: "end", className: "w-48", children: items.map((item) => /* @__PURE__ */ jsx36(
|
|
30181
30166
|
DropdownMenuItem,
|
|
30182
30167
|
{
|
|
30183
30168
|
onSelect: () => onPick({ action, item }),
|
|
@@ -30207,7 +30192,7 @@ function EmptyPanePicker({
|
|
|
30207
30192
|
) : hosts;
|
|
30208
30193
|
return [...matches].sort((a, b) => a.name.localeCompare(b.name)).slice(0, HOST_LIMIT);
|
|
30209
30194
|
}, [hosts, query]);
|
|
30210
|
-
return /* @__PURE__ */
|
|
30195
|
+
return /* @__PURE__ */ jsx36(
|
|
30211
30196
|
"div",
|
|
30212
30197
|
{
|
|
30213
30198
|
className: "flex size-full justify-center overflow-y-auto bg-background p-4",
|
|
@@ -30216,29 +30201,29 @@ function EmptyPanePicker({
|
|
|
30216
30201
|
/* @__PURE__ */ jsxs27("div", { className: "flex flex-col gap-1", children: [
|
|
30217
30202
|
/* @__PURE__ */ jsxs27("span", { className: "text-sm font-semibold text-foreground", children: [
|
|
30218
30203
|
t3("splitScreen.emptyTitle"),
|
|
30219
|
-
/* @__PURE__ */
|
|
30204
|
+
/* @__PURE__ */ jsx36("span", { className: "ml-2 text-xs font-normal text-muted-foreground", children: t3("splitScreen.paneNumber", { index: paneIndex }) })
|
|
30220
30205
|
] }),
|
|
30221
|
-
/* @__PURE__ */
|
|
30206
|
+
/* @__PURE__ */ jsx36("span", { className: "text-xs text-muted-foreground", children: t3("splitScreen.emptyHint") })
|
|
30222
30207
|
] }),
|
|
30223
30208
|
/* @__PURE__ */ jsxs27("section", { className: "flex flex-col gap-1.5", children: [
|
|
30224
|
-
/* @__PURE__ */
|
|
30225
|
-
freeTabs.length === 0 ? /* @__PURE__ */
|
|
30209
|
+
/* @__PURE__ */ jsx36("span", { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: t3("splitScreen.openTabs") }),
|
|
30210
|
+
freeTabs.length === 0 ? /* @__PURE__ */ jsx36("span", { className: "text-xs text-muted-foreground/70", children: t3("splitScreen.noOpenTabs") }) : /* @__PURE__ */ jsx36("div", { className: "flex flex-col border border-border", children: freeTabs.map((tab) => /* @__PURE__ */ jsxs27(
|
|
30226
30211
|
"button",
|
|
30227
30212
|
{
|
|
30228
30213
|
type: "button",
|
|
30229
30214
|
className: "flex items-center gap-2 border-b border-border px-2.5 py-1.5 text-left text-xs last:border-b-0 hover:bg-accent-brand/10 hover:text-accent-brand",
|
|
30230
30215
|
onClick: () => onPickTab(tab.id),
|
|
30231
30216
|
children: [
|
|
30232
|
-
/* @__PURE__ */
|
|
30233
|
-
/* @__PURE__ */
|
|
30217
|
+
/* @__PURE__ */ jsx36("span", { className: "shrink-0 text-muted-foreground", children: tabIcon(tab.type) }),
|
|
30218
|
+
/* @__PURE__ */ jsx36("span", { className: "truncate", children: tab.label })
|
|
30234
30219
|
]
|
|
30235
30220
|
},
|
|
30236
30221
|
tab.id
|
|
30237
30222
|
)) })
|
|
30238
30223
|
] }),
|
|
30239
30224
|
newTabOptions.length > 0 && /* @__PURE__ */ jsxs27("section", { className: "flex flex-col gap-1.5", children: [
|
|
30240
|
-
/* @__PURE__ */
|
|
30241
|
-
/* @__PURE__ */
|
|
30225
|
+
/* @__PURE__ */ jsx36("span", { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: t3("splitScreen.newSession") }),
|
|
30226
|
+
/* @__PURE__ */ jsx36("div", { className: "flex flex-wrap gap-1.5", children: newTabOptions.map((option) => {
|
|
30242
30227
|
const Icon = option.icon;
|
|
30243
30228
|
return /* @__PURE__ */ jsxs27(
|
|
30244
30229
|
"button",
|
|
@@ -30247,7 +30232,7 @@ function EmptyPanePicker({
|
|
|
30247
30232
|
className: "flex items-center gap-1.5 border border-border px-2.5 py-1.5 text-xs hover:border-accent-brand/40 hover:bg-accent-brand/10 hover:text-accent-brand",
|
|
30248
30233
|
onClick: () => onOpenType(option.type),
|
|
30249
30234
|
children: [
|
|
30250
|
-
Icon && /* @__PURE__ */
|
|
30235
|
+
Icon && /* @__PURE__ */ jsx36(Icon, { className: "size-3.5" }),
|
|
30251
30236
|
option.label
|
|
30252
30237
|
]
|
|
30253
30238
|
},
|
|
@@ -30256,10 +30241,10 @@ function EmptyPanePicker({
|
|
|
30256
30241
|
}) })
|
|
30257
30242
|
] }),
|
|
30258
30243
|
/* @__PURE__ */ jsxs27("section", { className: "flex flex-col gap-1.5", children: [
|
|
30259
|
-
/* @__PURE__ */
|
|
30244
|
+
/* @__PURE__ */ jsx36("span", { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: t3("splitScreen.hosts") }),
|
|
30260
30245
|
/* @__PURE__ */ jsxs27("div", { className: "relative", children: [
|
|
30261
|
-
/* @__PURE__ */
|
|
30262
|
-
/* @__PURE__ */
|
|
30246
|
+
/* @__PURE__ */ jsx36(Search, { className: "pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }),
|
|
30247
|
+
/* @__PURE__ */ jsx36(
|
|
30263
30248
|
Input,
|
|
30264
30249
|
{
|
|
30265
30250
|
value: query,
|
|
@@ -30270,7 +30255,7 @@ function EmptyPanePicker({
|
|
|
30270
30255
|
}
|
|
30271
30256
|
)
|
|
30272
30257
|
] }),
|
|
30273
|
-
shownHosts.length === 0 ? /* @__PURE__ */
|
|
30258
|
+
shownHosts.length === 0 ? /* @__PURE__ */ jsx36("span", { className: "text-xs text-muted-foreground/70", children: t3("splitScreen.noHosts") }) : /* @__PURE__ */ jsx36("div", { className: "flex flex-col border border-border", children: shownHosts.map((host) => {
|
|
30274
30259
|
const actions = hostActionsFor(allActions, host);
|
|
30275
30260
|
const connect = actions.filter((action) => action.kind === "connect").sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
30276
30261
|
const open = actions.filter((action) => action.kind === "open");
|
|
@@ -30288,7 +30273,7 @@ function EmptyPanePicker({
|
|
|
30288
30273
|
className: "flex min-w-0 flex-1 flex-col items-start text-left text-xs enabled:hover:text-accent-brand disabled:opacity-60",
|
|
30289
30274
|
onClick: () => primary && onPickHost(host, { action: primary }),
|
|
30290
30275
|
children: [
|
|
30291
|
-
/* @__PURE__ */
|
|
30276
|
+
/* @__PURE__ */ jsx36("span", { className: "w-full truncate font-medium", children: host.name }),
|
|
30292
30277
|
/* @__PURE__ */ jsxs27("span", { className: "w-full truncate text-[10px] text-muted-foreground", children: [
|
|
30293
30278
|
host.username ? `${host.username}@` : "",
|
|
30294
30279
|
host.ip
|
|
@@ -30296,7 +30281,7 @@ function EmptyPanePicker({
|
|
|
30296
30281
|
]
|
|
30297
30282
|
}
|
|
30298
30283
|
),
|
|
30299
|
-
/* @__PURE__ */
|
|
30284
|
+
/* @__PURE__ */ jsx36("div", { className: "flex shrink-0 items-center", children: [...connect, ...open].map((action) => /* @__PURE__ */ jsx36(
|
|
30300
30285
|
HostActionButton,
|
|
30301
30286
|
{
|
|
30302
30287
|
host,
|
|
@@ -30319,7 +30304,7 @@ function EmptyPanePicker({
|
|
|
30319
30304
|
className: "self-start rounded-none text-xs text-muted-foreground",
|
|
30320
30305
|
onClick: onClosePane,
|
|
30321
30306
|
children: [
|
|
30322
|
-
/* @__PURE__ */
|
|
30307
|
+
/* @__PURE__ */ jsx36(X, { className: "size-3" }),
|
|
30323
30308
|
t3("splitScreen.closePane")
|
|
30324
30309
|
]
|
|
30325
30310
|
}
|
|
@@ -30330,7 +30315,7 @@ function EmptyPanePicker({
|
|
|
30330
30315
|
}
|
|
30331
30316
|
|
|
30332
30317
|
// src/ui/shell/stage/TabStage.tsx
|
|
30333
|
-
import { jsx as
|
|
30318
|
+
import { jsx as jsx37, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
30334
30319
|
function TabStage({ className }) {
|
|
30335
30320
|
const shell2 = useShellController();
|
|
30336
30321
|
const store = useTabStageStore();
|
|
@@ -30346,7 +30331,7 @@ function TabStage({ className }) {
|
|
|
30346
30331
|
className
|
|
30347
30332
|
),
|
|
30348
30333
|
children: [
|
|
30349
|
-
activeSplit && /* @__PURE__ */
|
|
30334
|
+
activeSplit && /* @__PURE__ */ jsx37("div", { className: "motion-workspace-layout absolute inset-0 flex flex-col", children: /* @__PURE__ */ jsx37(
|
|
30350
30335
|
SplitView,
|
|
30351
30336
|
{
|
|
30352
30337
|
splitTab: activeSplit,
|
|
@@ -30354,7 +30339,7 @@ function TabStage({ className }) {
|
|
|
30354
30339
|
isMobile: shell2.isMobile,
|
|
30355
30340
|
actions: shell2.split.viewActions(activeSplit.id),
|
|
30356
30341
|
onPaneContentRef: store.setPaneEl,
|
|
30357
|
-
renderEmptyPane: (paneId, paneIndex) => /* @__PURE__ */
|
|
30342
|
+
renderEmptyPane: (paneId, paneIndex) => /* @__PURE__ */ jsx37(
|
|
30358
30343
|
EmptyPanePicker,
|
|
30359
30344
|
{
|
|
30360
30345
|
paneIndex,
|
|
@@ -30369,8 +30354,8 @@ function TabStage({ className }) {
|
|
|
30369
30354
|
)
|
|
30370
30355
|
}
|
|
30371
30356
|
) }),
|
|
30372
|
-
/* @__PURE__ */
|
|
30373
|
-
/* @__PURE__ */
|
|
30357
|
+
/* @__PURE__ */ jsx37(SplitDropOverlay, { containerRef: mainAreaRef }),
|
|
30358
|
+
/* @__PURE__ */ jsx37(
|
|
30374
30359
|
"div",
|
|
30375
30360
|
{
|
|
30376
30361
|
ref: store.setNormalView,
|
|
@@ -30386,7 +30371,7 @@ function TabStage({ className }) {
|
|
|
30386
30371
|
// src/ui/components/manager-card.tsx
|
|
30387
30372
|
init_define_import_meta_env();
|
|
30388
30373
|
import { useTranslation as useTranslation16 } from "react-i18next";
|
|
30389
|
-
import { jsx as
|
|
30374
|
+
import { jsx as jsx38, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
30390
30375
|
function ManagerCardShell({
|
|
30391
30376
|
title,
|
|
30392
30377
|
icon,
|
|
@@ -30399,7 +30384,7 @@ function ManagerCardShell({
|
|
|
30399
30384
|
headerExtra
|
|
30400
30385
|
}) {
|
|
30401
30386
|
const { t: t3 } = useTranslation16();
|
|
30402
|
-
return /* @__PURE__ */
|
|
30387
|
+
return /* @__PURE__ */ jsx38(
|
|
30403
30388
|
MetricCard,
|
|
30404
30389
|
{
|
|
30405
30390
|
title,
|
|
@@ -30407,21 +30392,21 @@ function ManagerCardShell({
|
|
|
30407
30392
|
scroll: true,
|
|
30408
30393
|
action: /* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-1", children: [
|
|
30409
30394
|
headerExtra,
|
|
30410
|
-
/* @__PURE__ */
|
|
30395
|
+
/* @__PURE__ */ jsx38(
|
|
30411
30396
|
"button",
|
|
30412
30397
|
{
|
|
30413
30398
|
onClick: onRefresh,
|
|
30414
30399
|
className: "flex size-6 items-center justify-center text-muted-foreground transition-colors hover:text-foreground",
|
|
30415
30400
|
title: t3("managerCard.refresh"),
|
|
30416
|
-
children: /* @__PURE__ */
|
|
30401
|
+
children: /* @__PURE__ */ jsx38(RefreshCw, { className: `size-3 ${loading ? "animate-spin" : ""}` })
|
|
30417
30402
|
}
|
|
30418
30403
|
)
|
|
30419
30404
|
] }),
|
|
30420
30405
|
children: error ? /* @__PURE__ */ jsxs29("div", { className: "flex flex-col items-center gap-2 py-6 text-center", children: [
|
|
30421
|
-
/* @__PURE__ */
|
|
30422
|
-
/* @__PURE__ */
|
|
30423
|
-
error.code === "SUDO_REQUIRED" && /* @__PURE__ */
|
|
30424
|
-
/* @__PURE__ */
|
|
30406
|
+
/* @__PURE__ */ jsx38(TriangleAlert, { className: "size-6 text-warning" }),
|
|
30407
|
+
/* @__PURE__ */ jsx38("span", { className: "text-xs text-muted-foreground", children: error.message }),
|
|
30408
|
+
error.code === "SUDO_REQUIRED" && /* @__PURE__ */ jsx38("span", { className: "text-[10px] text-muted-foreground", children: t3("managerCard.sudoHint") }),
|
|
30409
|
+
/* @__PURE__ */ jsx38(
|
|
30425
30410
|
Button,
|
|
30426
30411
|
{
|
|
30427
30412
|
variant: "outline",
|
|
@@ -30431,7 +30416,7 @@ function ManagerCardShell({
|
|
|
30431
30416
|
children: t3("managerCard.retry")
|
|
30432
30417
|
}
|
|
30433
30418
|
)
|
|
30434
|
-
] }) : empty2 ? /* @__PURE__ */
|
|
30419
|
+
] }) : empty2 ? /* @__PURE__ */ jsx38("div", { className: "flex items-center justify-center py-8 text-xs text-muted-foreground/50", children: emptyMessage ?? t3("managerCard.noData") }) : children
|
|
30435
30420
|
}
|
|
30436
30421
|
);
|
|
30437
30422
|
}
|
|
@@ -30445,8 +30430,8 @@ function ManagerSearch({
|
|
|
30445
30430
|
const { t: t3 } = useTranslation16();
|
|
30446
30431
|
return /* @__PURE__ */ jsxs29("div", { className: "mb-2 flex items-center gap-1.5", children: [
|
|
30447
30432
|
/* @__PURE__ */ jsxs29("div", { className: "relative flex-1", children: [
|
|
30448
|
-
/* @__PURE__ */
|
|
30449
|
-
/* @__PURE__ */
|
|
30433
|
+
/* @__PURE__ */ jsx38(Search, { className: "pointer-events-none absolute left-2 top-1/2 size-3 -translate-y-1/2 text-muted-foreground/60" }),
|
|
30434
|
+
/* @__PURE__ */ jsx38(
|
|
30450
30435
|
"input",
|
|
30451
30436
|
{
|
|
30452
30437
|
value,
|
|
@@ -30456,7 +30441,7 @@ function ManagerSearch({
|
|
|
30456
30441
|
}
|
|
30457
30442
|
)
|
|
30458
30443
|
] }),
|
|
30459
|
-
count != null && /* @__PURE__ */
|
|
30444
|
+
count != null && /* @__PURE__ */ jsx38("span", { className: "shrink-0 text-[10px] tabular-nums text-muted-foreground", children: count }),
|
|
30460
30445
|
extra
|
|
30461
30446
|
] });
|
|
30462
30447
|
}
|
|
@@ -30508,13 +30493,13 @@ function useAdaptivePolling(poll, policy, enabled = true, options = {}) {
|
|
|
30508
30493
|
|
|
30509
30494
|
// src/ui/lib/widget-title.tsx
|
|
30510
30495
|
init_define_import_meta_env();
|
|
30511
|
-
import { jsx as
|
|
30496
|
+
import { jsx as jsx39, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
30512
30497
|
function WidgetTitle({ title, icon, fallback }) {
|
|
30513
30498
|
const label = title || fallback;
|
|
30514
30499
|
if (!label) return null;
|
|
30515
30500
|
return /* @__PURE__ */ jsxs30("div", { className: "flex items-center gap-1.5 px-2 py-1.5 border-b border-border/50 shrink-0", children: [
|
|
30516
|
-
icon && /* @__PURE__ */
|
|
30517
|
-
/* @__PURE__ */
|
|
30501
|
+
icon && /* @__PURE__ */ jsx39("span", { className: "text-accent-brand shrink-0", children: icon }),
|
|
30502
|
+
/* @__PURE__ */ jsx39("span", { className: "text-[10px] font-semibold text-muted-foreground uppercase tracking-wider truncate", children: label })
|
|
30518
30503
|
] });
|
|
30519
30504
|
}
|
|
30520
30505
|
|
|
@@ -30559,7 +30544,7 @@ function runVisibleInterval(tick, intervalMs) {
|
|
|
30559
30544
|
// src/ui/ssh/dialogs/PassphraseDialog.tsx
|
|
30560
30545
|
init_define_import_meta_env();
|
|
30561
30546
|
import { useTranslation as useTranslation17 } from "react-i18next";
|
|
30562
|
-
import { jsx as
|
|
30547
|
+
import { jsx as jsx40, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
30563
30548
|
function PassphraseDialog({
|
|
30564
30549
|
isOpen,
|
|
30565
30550
|
onSubmit,
|
|
@@ -30579,18 +30564,18 @@ function PassphraseDialog({
|
|
|
30579
30564
|
onSubmit(input.value);
|
|
30580
30565
|
}
|
|
30581
30566
|
};
|
|
30582
|
-
return /* @__PURE__ */
|
|
30567
|
+
return /* @__PURE__ */ jsx40(
|
|
30583
30568
|
PanePrompt,
|
|
30584
30569
|
{
|
|
30585
30570
|
open: true,
|
|
30586
30571
|
layer: "connection",
|
|
30587
30572
|
backgroundColor,
|
|
30588
|
-
icon: /* @__PURE__ */
|
|
30573
|
+
icon: /* @__PURE__ */ jsx40(KeyRound, { className: "size-4" }),
|
|
30589
30574
|
title: t3("auth.passphraseRequired"),
|
|
30590
|
-
description: /* @__PURE__ */
|
|
30575
|
+
description: /* @__PURE__ */ jsx40("span", { className: "font-mono", children: hostDisplay }),
|
|
30591
30576
|
children: /* @__PURE__ */ jsxs31("form", { onSubmit: handleSubmit, className: "flex flex-col gap-3", children: [
|
|
30592
30577
|
/* @__PURE__ */ jsxs31("div", { className: "flex flex-col gap-1.5", children: [
|
|
30593
|
-
/* @__PURE__ */
|
|
30578
|
+
/* @__PURE__ */ jsx40(
|
|
30594
30579
|
PasswordInput,
|
|
30595
30580
|
{
|
|
30596
30581
|
id: "passphrase",
|
|
@@ -30600,11 +30585,11 @@ function PassphraseDialog({
|
|
|
30600
30585
|
className: "rounded-none bg-muted/50 border-border text-xs"
|
|
30601
30586
|
}
|
|
30602
30587
|
),
|
|
30603
|
-
/* @__PURE__ */
|
|
30588
|
+
/* @__PURE__ */ jsx40("p", { className: "text-[10px] text-muted-foreground", children: t3("auth.passphraseRequiredDescription") })
|
|
30604
30589
|
] }),
|
|
30605
30590
|
/* @__PURE__ */ jsxs31("div", { className: "flex justify-end gap-2", children: [
|
|
30606
|
-
/* @__PURE__ */
|
|
30607
|
-
/* @__PURE__ */
|
|
30591
|
+
/* @__PURE__ */ jsx40("button", { type: "button", onClick: onCancel, className: PROMPT_BUTTON, children: t3("common.cancel") }),
|
|
30592
|
+
/* @__PURE__ */ jsx40("button", { type: "submit", className: PROMPT_PRIMARY_BUTTON, children: t3("common.connect") })
|
|
30608
30593
|
] })
|
|
30609
30594
|
] })
|
|
30610
30595
|
}
|
|
@@ -31015,7 +31000,7 @@ function hostKeyFingerprint(hex) {
|
|
|
31015
31000
|
}
|
|
31016
31001
|
|
|
31017
31002
|
// src/ui/ssh/dialogs/HostKeyVerificationDialog.tsx
|
|
31018
|
-
import { Fragment as Fragment6, jsx as
|
|
31003
|
+
import { Fragment as Fragment6, jsx as jsx41, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
31019
31004
|
function FingerprintRow({
|
|
31020
31005
|
label,
|
|
31021
31006
|
value,
|
|
@@ -31024,10 +31009,10 @@ function FingerprintRow({
|
|
|
31024
31009
|
}) {
|
|
31025
31010
|
const { t: t3 } = useTranslation18();
|
|
31026
31011
|
return /* @__PURE__ */ jsxs32("div", { className: "flex flex-col gap-1.5", children: [
|
|
31027
|
-
/* @__PURE__ */
|
|
31012
|
+
/* @__PURE__ */ jsx41("p", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: label }),
|
|
31028
31013
|
/* @__PURE__ */ jsxs32("div", { className: "flex items-stretch gap-2", children: [
|
|
31029
|
-
/* @__PURE__ */
|
|
31030
|
-
/* @__PURE__ */
|
|
31014
|
+
/* @__PURE__ */ jsx41("div", { className: "flex-1 bg-muted/50 border border-border p-3 font-mono text-xs break-all", children: value }),
|
|
31015
|
+
/* @__PURE__ */ jsx41(
|
|
31031
31016
|
"button",
|
|
31032
31017
|
{
|
|
31033
31018
|
type: "button",
|
|
@@ -31035,7 +31020,7 @@ function FingerprintRow({
|
|
|
31035
31020
|
title: t3("common.copy"),
|
|
31036
31021
|
"aria-label": t3("common.copy"),
|
|
31037
31022
|
className: "flex w-11 shrink-0 items-center justify-center border border-border text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:ring-1 focus-visible:ring-ring",
|
|
31038
|
-
children: copied ? /* @__PURE__ */
|
|
31023
|
+
children: copied ? /* @__PURE__ */ jsx41(Check, { className: "size-4 text-accent-brand" }) : /* @__PURE__ */ jsx41(Copy, { className: "size-4" })
|
|
31039
31024
|
}
|
|
31040
31025
|
)
|
|
31041
31026
|
] })
|
|
@@ -31070,14 +31055,14 @@ function HostKeyVerificationDialog({
|
|
|
31070
31055
|
const changed = scenario === "changed";
|
|
31071
31056
|
const newPrint = hostKeyFingerprint(fingerprint);
|
|
31072
31057
|
const oldPrint = hostKeyFingerprint(oldFingerprint || "");
|
|
31073
|
-
return /* @__PURE__ */
|
|
31058
|
+
return /* @__PURE__ */ jsx41(
|
|
31074
31059
|
PanePrompt,
|
|
31075
31060
|
{
|
|
31076
31061
|
open: true,
|
|
31077
31062
|
layer: "connection",
|
|
31078
31063
|
backgroundColor,
|
|
31079
31064
|
tone: changed ? "destructive" : "default",
|
|
31080
|
-
icon: changed ? /* @__PURE__ */
|
|
31065
|
+
icon: changed ? /* @__PURE__ */ jsx41(TriangleAlert, { className: "size-4" }) : /* @__PURE__ */ jsx41(Shield, { className: "size-4" }),
|
|
31081
31066
|
title: changed ? t3("hostKey.keyChangedWarning") : t3("hostKey.verifyNewHost"),
|
|
31082
31067
|
description: /* @__PURE__ */ jsxs32("span", { className: "font-mono", children: [
|
|
31083
31068
|
hostname || ip,
|
|
@@ -31086,8 +31071,8 @@ function HostKeyVerificationDialog({
|
|
|
31086
31071
|
] }),
|
|
31087
31072
|
className: "max-w-lg",
|
|
31088
31073
|
actions: /* @__PURE__ */ jsxs32(Fragment6, { children: [
|
|
31089
|
-
/* @__PURE__ */
|
|
31090
|
-
/* @__PURE__ */
|
|
31074
|
+
/* @__PURE__ */ jsx41("button", { type: "button", onClick: onReject, className: PROMPT_BUTTON, children: t3("common.cancel") }),
|
|
31075
|
+
/* @__PURE__ */ jsx41(
|
|
31091
31076
|
"button",
|
|
31092
31077
|
{
|
|
31093
31078
|
type: "button",
|
|
@@ -31097,15 +31082,15 @@ function HostKeyVerificationDialog({
|
|
|
31097
31082
|
}
|
|
31098
31083
|
)
|
|
31099
31084
|
] }),
|
|
31100
|
-
children: /* @__PURE__ */
|
|
31085
|
+
children: /* @__PURE__ */ jsx41("div", { className: "flex flex-col gap-3", children: changed ? /* @__PURE__ */ jsxs32(Fragment6, { children: [
|
|
31101
31086
|
/* @__PURE__ */ jsxs32("div", { className: "flex items-start gap-3 p-3 border border-destructive/20 bg-destructive/10", children: [
|
|
31102
|
-
/* @__PURE__ */
|
|
31087
|
+
/* @__PURE__ */ jsx41(TriangleAlert, { className: "size-4 text-destructive shrink-0 mt-0.5" }),
|
|
31103
31088
|
/* @__PURE__ */ jsxs32("div", { children: [
|
|
31104
|
-
/* @__PURE__ */
|
|
31105
|
-
/* @__PURE__ */
|
|
31089
|
+
/* @__PURE__ */ jsx41("p", { className: "text-[10px] font-bold uppercase tracking-widest text-destructive", children: t3("hostKey.securityWarning") }),
|
|
31090
|
+
/* @__PURE__ */ jsx41("p", { className: "text-xs text-destructive/80 mt-1", children: t3("hostKey.keyChangedDescription") })
|
|
31106
31091
|
] })
|
|
31107
31092
|
] }),
|
|
31108
|
-
/* @__PURE__ */
|
|
31093
|
+
/* @__PURE__ */ jsx41(
|
|
31109
31094
|
FingerprintRow,
|
|
31110
31095
|
{
|
|
31111
31096
|
label: t3("hostKey.previousKey"),
|
|
@@ -31114,7 +31099,7 @@ function HostKeyVerificationDialog({
|
|
|
31114
31099
|
onCopy: () => copyFingerprint(oldPrint, true)
|
|
31115
31100
|
}
|
|
31116
31101
|
),
|
|
31117
|
-
/* @__PURE__ */
|
|
31102
|
+
/* @__PURE__ */ jsx41(
|
|
31118
31103
|
FingerprintRow,
|
|
31119
31104
|
{
|
|
31120
31105
|
label: t3("hostKey.newFingerprint"),
|
|
@@ -31125,13 +31110,13 @@ function HostKeyVerificationDialog({
|
|
|
31125
31110
|
)
|
|
31126
31111
|
] }) : /* @__PURE__ */ jsxs32(Fragment6, { children: [
|
|
31127
31112
|
/* @__PURE__ */ jsxs32("div", { className: "flex items-start gap-3 p-3 border border-border bg-muted/10", children: [
|
|
31128
|
-
/* @__PURE__ */
|
|
31113
|
+
/* @__PURE__ */ jsx41(Shield, { className: "size-4 text-accent-brand shrink-0 mt-0.5" }),
|
|
31129
31114
|
/* @__PURE__ */ jsxs32("div", { children: [
|
|
31130
|
-
/* @__PURE__ */
|
|
31131
|
-
/* @__PURE__ */
|
|
31115
|
+
/* @__PURE__ */ jsx41("p", { className: "text-[10px] font-bold uppercase tracking-widest", children: t3("hostKey.firstConnectionTitle") }),
|
|
31116
|
+
/* @__PURE__ */ jsx41("p", { className: "text-xs text-muted-foreground mt-1", children: t3("hostKey.firstConnectionDescription") })
|
|
31132
31117
|
] })
|
|
31133
31118
|
] }),
|
|
31134
|
-
/* @__PURE__ */
|
|
31119
|
+
/* @__PURE__ */ jsx41(
|
|
31135
31120
|
FingerprintRow,
|
|
31136
31121
|
{
|
|
31137
31122
|
label: t3("hostKey.fingerprint"),
|
|
@@ -31140,7 +31125,7 @@ function HostKeyVerificationDialog({
|
|
|
31140
31125
|
onCopy: () => copyFingerprint(newPrint)
|
|
31141
31126
|
}
|
|
31142
31127
|
),
|
|
31143
|
-
/* @__PURE__ */
|
|
31128
|
+
/* @__PURE__ */ jsx41("p", { className: "text-[10px] text-muted-foreground", children: t3("hostKey.verifyInstructions") })
|
|
31144
31129
|
] }) })
|
|
31145
31130
|
}
|
|
31146
31131
|
);
|
|
@@ -31203,10 +31188,10 @@ var RobustClipboardProvider = class {
|
|
|
31203
31188
|
// src/ui/components/kbd.tsx
|
|
31204
31189
|
init_define_import_meta_env();
|
|
31205
31190
|
import * as React10 from "react";
|
|
31206
|
-
import { jsx as
|
|
31191
|
+
import { jsx as jsx42 } from "react/jsx-runtime";
|
|
31207
31192
|
var Kbd = React10.forwardRef(
|
|
31208
31193
|
({ className, ...props }, ref) => {
|
|
31209
|
-
return /* @__PURE__ */
|
|
31194
|
+
return /* @__PURE__ */ jsx42(
|
|
31210
31195
|
"kbd",
|
|
31211
31196
|
{
|
|
31212
31197
|
ref,
|
|
@@ -31223,12 +31208,12 @@ Kbd.displayName = "Kbd";
|
|
|
31223
31208
|
var KbdKey = ({
|
|
31224
31209
|
className,
|
|
31225
31210
|
...props
|
|
31226
|
-
}) => /* @__PURE__ */
|
|
31211
|
+
}) => /* @__PURE__ */ jsx42("span", { className: cn("", className), ...props });
|
|
31227
31212
|
KbdKey.displayName = "KbdKey";
|
|
31228
31213
|
var KbdSeparator = ({
|
|
31229
31214
|
className,
|
|
31230
31215
|
...props
|
|
31231
|
-
}) => /* @__PURE__ */
|
|
31216
|
+
}) => /* @__PURE__ */ jsx42("span", { className: cn("text-muted-foreground/50", className), ...props, children: "+" });
|
|
31232
31217
|
KbdSeparator.displayName = "KbdSeparator";
|
|
31233
31218
|
|
|
31234
31219
|
// src/ui/components/card-masonry.tsx
|
|
@@ -31242,7 +31227,7 @@ import {
|
|
|
31242
31227
|
useRef as useRef9,
|
|
31243
31228
|
useState as useState16
|
|
31244
31229
|
} from "react";
|
|
31245
|
-
import { jsx as
|
|
31230
|
+
import { jsx as jsx43 } from "react/jsx-runtime";
|
|
31246
31231
|
var COLUMN_STEPS = {
|
|
31247
31232
|
1: [1, 1, 1, 1],
|
|
31248
31233
|
2: [1, 2, 2, 2],
|
|
@@ -31288,7 +31273,7 @@ function CardMasonry({
|
|
|
31288
31273
|
items.forEach((child, i2) => next[i2 % count].push(child));
|
|
31289
31274
|
return next;
|
|
31290
31275
|
}, [items, count]);
|
|
31291
|
-
return /* @__PURE__ */
|
|
31276
|
+
return /* @__PURE__ */ jsx43(
|
|
31292
31277
|
"div",
|
|
31293
31278
|
{
|
|
31294
31279
|
ref,
|
|
@@ -31296,7 +31281,7 @@ function CardMasonry({
|
|
|
31296
31281
|
count === 1 ? `flex flex-col ${PANEL.gap}` : `flex items-start ${PANEL.gap}`,
|
|
31297
31282
|
className
|
|
31298
31283
|
),
|
|
31299
|
-
children: count === 1 ? items : buckets2.map((bucket, i2) => /* @__PURE__ */
|
|
31284
|
+
children: count === 1 ? items : buckets2.map((bucket, i2) => /* @__PURE__ */ jsx43(
|
|
31300
31285
|
"div",
|
|
31301
31286
|
{
|
|
31302
31287
|
className: `flex min-w-0 flex-1 flex-col ${PANEL.gap}`,
|
|
@@ -31327,13 +31312,13 @@ function usageBarColor(percent) {
|
|
|
31327
31312
|
}
|
|
31328
31313
|
|
|
31329
31314
|
// src/ui/components/meter.tsx
|
|
31330
|
-
import { jsx as
|
|
31315
|
+
import { jsx as jsx44, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
31331
31316
|
function Meter({
|
|
31332
31317
|
percent,
|
|
31333
31318
|
className
|
|
31334
31319
|
}) {
|
|
31335
31320
|
const clamped = percent === null ? 0 : Math.min(100, Math.max(0, percent));
|
|
31336
|
-
return /* @__PURE__ */
|
|
31321
|
+
return /* @__PURE__ */ jsx44("div", { className: cn("h-1.5 w-full overflow-hidden bg-muted", className), children: /* @__PURE__ */ jsx44(
|
|
31337
31322
|
"div",
|
|
31338
31323
|
{
|
|
31339
31324
|
className: cn("motion-meter h-full", usageBarColor(percent)),
|
|
@@ -31348,9 +31333,9 @@ function UsagePair({
|
|
|
31348
31333
|
}) {
|
|
31349
31334
|
const clamped = Math.min(100, Math.max(0, percent));
|
|
31350
31335
|
return /* @__PURE__ */ jsxs33("div", { className: "flex min-w-0 items-center gap-2", children: [
|
|
31351
|
-
label && /* @__PURE__ */
|
|
31352
|
-
/* @__PURE__ */
|
|
31353
|
-
/* @__PURE__ */
|
|
31336
|
+
label && /* @__PURE__ */ jsx44("span", { className: "w-10 shrink-0 text-[10px] uppercase text-muted-foreground", children: label }),
|
|
31337
|
+
/* @__PURE__ */ jsx44(Meter, { percent: clamped, className: "flex-1" }),
|
|
31338
|
+
/* @__PURE__ */ jsx44(
|
|
31354
31339
|
"span",
|
|
31355
31340
|
{
|
|
31356
31341
|
className: cn(
|
|
@@ -31367,7 +31352,7 @@ function UsagePair({
|
|
|
31367
31352
|
init_define_import_meta_env();
|
|
31368
31353
|
import { useState as useState17 } from "react";
|
|
31369
31354
|
import { useTranslation as useTranslation19 } from "react-i18next";
|
|
31370
|
-
import { jsx as
|
|
31355
|
+
import { jsx as jsx45, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
31371
31356
|
function Field2({
|
|
31372
31357
|
label,
|
|
31373
31358
|
hint,
|
|
@@ -31379,7 +31364,7 @@ function Field2({
|
|
|
31379
31364
|
}) {
|
|
31380
31365
|
return /* @__PURE__ */ jsxs34("div", { "data-setting-row": "", className: cn("flex flex-col gap-1.5", className), children: [
|
|
31381
31366
|
(label || aside) && /* @__PURE__ */ jsxs34("div", { className: "flex items-center gap-2", children: [
|
|
31382
|
-
/* @__PURE__ */
|
|
31367
|
+
/* @__PURE__ */ jsx45(
|
|
31383
31368
|
"label",
|
|
31384
31369
|
{
|
|
31385
31370
|
htmlFor,
|
|
@@ -31387,10 +31372,10 @@ function Field2({
|
|
|
31387
31372
|
children: label
|
|
31388
31373
|
}
|
|
31389
31374
|
),
|
|
31390
|
-
aside && /* @__PURE__ */
|
|
31375
|
+
aside && /* @__PURE__ */ jsx45("span", { className: "ml-auto", children: aside })
|
|
31391
31376
|
] }),
|
|
31392
31377
|
children,
|
|
31393
|
-
error ? /* @__PURE__ */
|
|
31378
|
+
error ? /* @__PURE__ */ jsx45("span", { className: "text-[10px] text-destructive", children: error }) : hint ? /* @__PURE__ */ jsx45("span", { className: "text-[10px] text-muted-foreground", children: hint }) : null
|
|
31394
31379
|
] });
|
|
31395
31380
|
}
|
|
31396
31381
|
function TextField({
|
|
@@ -31405,7 +31390,7 @@ function TextField({
|
|
|
31405
31390
|
mono,
|
|
31406
31391
|
className
|
|
31407
31392
|
}) {
|
|
31408
|
-
return /* @__PURE__ */
|
|
31393
|
+
return /* @__PURE__ */ jsx45(
|
|
31409
31394
|
Field2,
|
|
31410
31395
|
{
|
|
31411
31396
|
label,
|
|
@@ -31413,7 +31398,7 @@ function TextField({
|
|
|
31413
31398
|
error,
|
|
31414
31399
|
aside,
|
|
31415
31400
|
className,
|
|
31416
|
-
children: /* @__PURE__ */
|
|
31401
|
+
children: /* @__PURE__ */ jsx45(
|
|
31417
31402
|
Input,
|
|
31418
31403
|
{
|
|
31419
31404
|
value,
|
|
@@ -31439,7 +31424,7 @@ function NumberField({
|
|
|
31439
31424
|
disabled,
|
|
31440
31425
|
className
|
|
31441
31426
|
}) {
|
|
31442
|
-
return /* @__PURE__ */
|
|
31427
|
+
return /* @__PURE__ */ jsx45(Field2, { label, hint, error, className, children: /* @__PURE__ */ jsx45(
|
|
31443
31428
|
Input,
|
|
31444
31429
|
{
|
|
31445
31430
|
type: "number",
|
|
@@ -31477,14 +31462,14 @@ function SecretField({
|
|
|
31477
31462
|
}) {
|
|
31478
31463
|
const { t: t3 } = useTranslation19();
|
|
31479
31464
|
const saved = isSecretSentinel(value);
|
|
31480
|
-
return /* @__PURE__ */
|
|
31465
|
+
return /* @__PURE__ */ jsx45(
|
|
31481
31466
|
Field2,
|
|
31482
31467
|
{
|
|
31483
31468
|
label,
|
|
31484
31469
|
hint: saved ? t3("fields.secretSaved") : hint,
|
|
31485
31470
|
error,
|
|
31486
31471
|
className,
|
|
31487
|
-
children: /* @__PURE__ */
|
|
31472
|
+
children: /* @__PURE__ */ jsx45(
|
|
31488
31473
|
PasswordInput,
|
|
31489
31474
|
{
|
|
31490
31475
|
value: saved ? "" : value,
|
|
@@ -31509,15 +31494,15 @@ function SelectField({
|
|
|
31509
31494
|
placeholder: placeholder2
|
|
31510
31495
|
}) {
|
|
31511
31496
|
const EMPTY = "__empty__";
|
|
31512
|
-
return /* @__PURE__ */
|
|
31497
|
+
return /* @__PURE__ */ jsx45(Field2, { label, hint, error, className, children: /* @__PURE__ */ jsxs34(
|
|
31513
31498
|
Select,
|
|
31514
31499
|
{
|
|
31515
31500
|
value: value === "" ? EMPTY : value,
|
|
31516
31501
|
disabled,
|
|
31517
31502
|
onValueChange: (next) => onChange(next === EMPTY ? "" : next),
|
|
31518
31503
|
children: [
|
|
31519
|
-
/* @__PURE__ */
|
|
31520
|
-
/* @__PURE__ */
|
|
31504
|
+
/* @__PURE__ */ jsx45(SelectTrigger, { "aria-invalid": !!error, className: "h-8 w-full text-xs", children: /* @__PURE__ */ jsx45(SelectValue, { placeholder: placeholder2 }) }),
|
|
31505
|
+
/* @__PURE__ */ jsx45(SelectContent, { children: options.map((option) => /* @__PURE__ */ jsx45(
|
|
31521
31506
|
SelectItem,
|
|
31522
31507
|
{
|
|
31523
31508
|
value: option.value === "" ? EMPTY : option.value,
|
|
@@ -31543,7 +31528,7 @@ function TextAreaField({
|
|
|
31543
31528
|
disabled,
|
|
31544
31529
|
className
|
|
31545
31530
|
}) {
|
|
31546
|
-
return /* @__PURE__ */
|
|
31531
|
+
return /* @__PURE__ */ jsx45(
|
|
31547
31532
|
Field2,
|
|
31548
31533
|
{
|
|
31549
31534
|
label,
|
|
@@ -31551,7 +31536,7 @@ function TextAreaField({
|
|
|
31551
31536
|
error,
|
|
31552
31537
|
aside,
|
|
31553
31538
|
className,
|
|
31554
|
-
children: /* @__PURE__ */
|
|
31539
|
+
children: /* @__PURE__ */ jsx45(
|
|
31555
31540
|
"textarea",
|
|
31556
31541
|
{
|
|
31557
31542
|
rows,
|
|
@@ -31578,7 +31563,7 @@ function SwitchRow({
|
|
|
31578
31563
|
defaultKey,
|
|
31579
31564
|
rowId
|
|
31580
31565
|
}) {
|
|
31581
|
-
return /* @__PURE__ */
|
|
31566
|
+
return /* @__PURE__ */ jsx45(
|
|
31582
31567
|
SettingRow,
|
|
31583
31568
|
{
|
|
31584
31569
|
label,
|
|
@@ -31586,7 +31571,7 @@ function SwitchRow({
|
|
|
31586
31571
|
badge,
|
|
31587
31572
|
defaultKey,
|
|
31588
31573
|
rowId,
|
|
31589
|
-
children: /* @__PURE__ */
|
|
31574
|
+
children: /* @__PURE__ */ jsx45(FakeSwitch, { checked, onChange, disabled })
|
|
31590
31575
|
}
|
|
31591
31576
|
);
|
|
31592
31577
|
}
|
|
@@ -31603,7 +31588,7 @@ function Repeater({
|
|
|
31603
31588
|
const { t: t3 } = useTranslation19();
|
|
31604
31589
|
return /* @__PURE__ */ jsxs34("div", { className: "flex flex-col gap-2 py-3", children: [
|
|
31605
31590
|
/* @__PURE__ */ jsxs34("div", { className: "flex items-center gap-2", children: [
|
|
31606
|
-
/* @__PURE__ */
|
|
31591
|
+
/* @__PURE__ */ jsx45("span", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: label }),
|
|
31607
31592
|
/* @__PURE__ */ jsxs34(
|
|
31608
31593
|
Button,
|
|
31609
31594
|
{
|
|
@@ -31613,24 +31598,24 @@ function Repeater({
|
|
|
31613
31598
|
className: "ml-auto",
|
|
31614
31599
|
onClick: () => onChange([...items, makeItem()]),
|
|
31615
31600
|
children: [
|
|
31616
|
-
/* @__PURE__ */
|
|
31601
|
+
/* @__PURE__ */ jsx45(Plus, { className: "mr-1 size-3" }),
|
|
31617
31602
|
addLabel
|
|
31618
31603
|
]
|
|
31619
31604
|
}
|
|
31620
31605
|
)
|
|
31621
31606
|
] }),
|
|
31622
|
-
hint && /* @__PURE__ */
|
|
31623
|
-
items.length === 0 ? /* @__PURE__ */
|
|
31607
|
+
hint && /* @__PURE__ */ jsx45("span", { className: "text-[10px] text-muted-foreground", children: hint }),
|
|
31608
|
+
items.length === 0 ? /* @__PURE__ */ jsx45("span", { className: "border border-dashed border-border px-3 py-2 text-[10px] text-muted-foreground", children: empty2 }) : /* @__PURE__ */ jsx45("div", { className: "flex flex-col gap-2", children: items.map((item, index) => /* @__PURE__ */ jsxs34(
|
|
31624
31609
|
"div",
|
|
31625
31610
|
{
|
|
31626
31611
|
className: "flex items-start gap-2 border border-border bg-muted/10 p-2",
|
|
31627
31612
|
children: [
|
|
31628
|
-
/* @__PURE__ */
|
|
31613
|
+
/* @__PURE__ */ jsx45("div", { className: "min-w-0 flex-1", children: renderItem(
|
|
31629
31614
|
item,
|
|
31630
31615
|
(next) => onChange(items.map((x, i2) => i2 === index ? next : x)),
|
|
31631
31616
|
index
|
|
31632
31617
|
) }),
|
|
31633
|
-
/* @__PURE__ */
|
|
31618
|
+
/* @__PURE__ */ jsx45(
|
|
31634
31619
|
"button",
|
|
31635
31620
|
{
|
|
31636
31621
|
type: "button",
|
|
@@ -31638,7 +31623,7 @@ function Repeater({
|
|
|
31638
31623
|
"aria-label": t3("common.remove"),
|
|
31639
31624
|
onClick: () => onChange(items.filter((_, i2) => i2 !== index)),
|
|
31640
31625
|
className: "mt-0.5 shrink-0 text-muted-foreground transition-colors hover:text-destructive focus-visible:ring-1 focus-visible:ring-ring",
|
|
31641
|
-
children: /* @__PURE__ */
|
|
31626
|
+
children: /* @__PURE__ */ jsx45(Trash, { className: "size-3.5" })
|
|
31642
31627
|
}
|
|
31643
31628
|
)
|
|
31644
31629
|
]
|
|
@@ -31662,21 +31647,21 @@ function TagInput({
|
|
|
31662
31647
|
className: "flex items-center gap-0.5 border border-border/60 bg-muted px-1.5 py-0.5 text-[10px] text-foreground",
|
|
31663
31648
|
children: [
|
|
31664
31649
|
tag,
|
|
31665
|
-
/* @__PURE__ */
|
|
31650
|
+
/* @__PURE__ */ jsx45(
|
|
31666
31651
|
"button",
|
|
31667
31652
|
{
|
|
31668
31653
|
type: "button",
|
|
31669
31654
|
"aria-label": t3("common.remove"),
|
|
31670
31655
|
onClick: () => onTagsChange(tags2.filter((tg) => tg !== tag)),
|
|
31671
31656
|
className: "ml-0.5 text-muted-foreground hover:text-destructive",
|
|
31672
|
-
children: /* @__PURE__ */
|
|
31657
|
+
children: /* @__PURE__ */ jsx45(X, { className: "size-2.5" })
|
|
31673
31658
|
}
|
|
31674
31659
|
)
|
|
31675
31660
|
]
|
|
31676
31661
|
},
|
|
31677
31662
|
tag
|
|
31678
31663
|
)),
|
|
31679
|
-
/* @__PURE__ */
|
|
31664
|
+
/* @__PURE__ */ jsx45(
|
|
31680
31665
|
"input",
|
|
31681
31666
|
{
|
|
31682
31667
|
className: "min-w-16 flex-1 bg-transparent text-xs outline-none placeholder:text-muted-foreground/50",
|
|
@@ -31698,7 +31683,7 @@ function TagInput({
|
|
|
31698
31683
|
] });
|
|
31699
31684
|
}
|
|
31700
31685
|
function FieldPair({ children }) {
|
|
31701
|
-
return /* @__PURE__ */
|
|
31686
|
+
return /* @__PURE__ */ jsx45("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children });
|
|
31702
31687
|
}
|
|
31703
31688
|
|
|
31704
31689
|
// src/ui/components/connection/ConnectionGate.tsx
|
|
@@ -31712,7 +31697,7 @@ import {
|
|
|
31712
31697
|
useState as useState18
|
|
31713
31698
|
} from "react";
|
|
31714
31699
|
import { useConnectionRetry } from "@termix-ssh/plugin-sdk/frontend";
|
|
31715
|
-
import { jsx as
|
|
31700
|
+
import { jsx as jsx46, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
31716
31701
|
function messageOf(err) {
|
|
31717
31702
|
return typeof err === "string" ? err : getErrorMessage(err);
|
|
31718
31703
|
}
|
|
@@ -31725,7 +31710,7 @@ function useConnectionGate() {
|
|
|
31725
31710
|
return gate;
|
|
31726
31711
|
}
|
|
31727
31712
|
function ConnectionGate(props) {
|
|
31728
|
-
return /* @__PURE__ */
|
|
31713
|
+
return /* @__PURE__ */ jsx46(ConnectionLogProvider, { children: /* @__PURE__ */ jsx46(Gate, { ...props }) });
|
|
31729
31714
|
}
|
|
31730
31715
|
function Gate({
|
|
31731
31716
|
connect,
|
|
@@ -31862,9 +31847,9 @@ function Gate({
|
|
|
31862
31847
|
gateRef.current = controller;
|
|
31863
31848
|
const up = status === "connected" && !unavailable;
|
|
31864
31849
|
const content2 = typeof children === "function" ? children(controller) : children;
|
|
31865
|
-
return /* @__PURE__ */
|
|
31850
|
+
return /* @__PURE__ */ jsx46(GateContext.Provider, { value: controller, children: /* @__PURE__ */ jsxs35("div", { className: `relative h-full w-full ${className ?? ""}`, children: [
|
|
31866
31851
|
(up || keepMounted) && content2,
|
|
31867
|
-
/* @__PURE__ */
|
|
31852
|
+
/* @__PURE__ */ jsx46(
|
|
31868
31853
|
ConnectionScreen,
|
|
31869
31854
|
{
|
|
31870
31855
|
status,
|
|
@@ -32455,8 +32440,8 @@ async function uploadTlsCertificate(payload) {
|
|
|
32455
32440
|
// src/ui/components/command.tsx
|
|
32456
32441
|
init_define_import_meta_env();
|
|
32457
32442
|
import * as React11 from "react";
|
|
32458
|
-
import { jsx as
|
|
32459
|
-
var Command = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
32443
|
+
import { jsx as jsx47, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
32444
|
+
var Command = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(
|
|
32460
32445
|
_e,
|
|
32461
32446
|
{
|
|
32462
32447
|
ref,
|
|
@@ -32469,8 +32454,8 @@ var Command = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
32469
32454
|
));
|
|
32470
32455
|
Command.displayName = "Command";
|
|
32471
32456
|
var CommandInput = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs36("div", { className: "flex items-center border-b border-border px-3", children: [
|
|
32472
|
-
/* @__PURE__ */
|
|
32473
|
-
/* @__PURE__ */
|
|
32457
|
+
/* @__PURE__ */ jsx47(Search, { className: "mr-2 h-4 w-4 shrink-0 opacity-50" }),
|
|
32458
|
+
/* @__PURE__ */ jsx47(
|
|
32474
32459
|
_e.Input,
|
|
32475
32460
|
{
|
|
32476
32461
|
ref,
|
|
@@ -32483,7 +32468,7 @@ var CommandInput = React11.forwardRef(({ className, ...props }, ref) => /* @__PU
|
|
|
32483
32468
|
)
|
|
32484
32469
|
] }));
|
|
32485
32470
|
CommandInput.displayName = "CommandInput";
|
|
32486
|
-
var CommandList = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
32471
|
+
var CommandList = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(
|
|
32487
32472
|
_e.List,
|
|
32488
32473
|
{
|
|
32489
32474
|
ref,
|
|
@@ -32495,7 +32480,7 @@ var CommandList = React11.forwardRef(({ className, ...props }, ref) => /* @__PUR
|
|
|
32495
32480
|
}
|
|
32496
32481
|
));
|
|
32497
32482
|
CommandList.displayName = "CommandList";
|
|
32498
|
-
var CommandGroup = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
32483
|
+
var CommandGroup = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(
|
|
32499
32484
|
_e.Group,
|
|
32500
32485
|
{
|
|
32501
32486
|
ref,
|
|
@@ -32507,7 +32492,7 @@ var CommandGroup = React11.forwardRef(({ className, ...props }, ref) => /* @__PU
|
|
|
32507
32492
|
}
|
|
32508
32493
|
));
|
|
32509
32494
|
CommandGroup.displayName = "CommandGroup";
|
|
32510
|
-
var CommandSeparator = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
32495
|
+
var CommandSeparator = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(
|
|
32511
32496
|
_e.Separator,
|
|
32512
32497
|
{
|
|
32513
32498
|
ref,
|
|
@@ -32516,7 +32501,7 @@ var CommandSeparator = React11.forwardRef(({ className, ...props }, ref) => /* @
|
|
|
32516
32501
|
}
|
|
32517
32502
|
));
|
|
32518
32503
|
CommandSeparator.displayName = "CommandSeparator";
|
|
32519
|
-
var CommandItem = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
32504
|
+
var CommandItem = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(
|
|
32520
32505
|
_e.Item,
|
|
32521
32506
|
{
|
|
32522
32507
|
ref,
|
|
@@ -32528,7 +32513,7 @@ var CommandItem = React11.forwardRef(({ className, ...props }, ref) => /* @__PUR
|
|
|
32528
32513
|
}
|
|
32529
32514
|
));
|
|
32530
32515
|
CommandItem.displayName = "CommandItem";
|
|
32531
|
-
var CommandEmpty = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
32516
|
+
var CommandEmpty = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(
|
|
32532
32517
|
_e.Empty,
|
|
32533
32518
|
{
|
|
32534
32519
|
ref,
|
|
@@ -32540,7 +32525,7 @@ CommandEmpty.displayName = "CommandEmpty";
|
|
|
32540
32525
|
var CommandShortcut = ({
|
|
32541
32526
|
className,
|
|
32542
32527
|
...props
|
|
32543
|
-
}) => /* @__PURE__ */
|
|
32528
|
+
}) => /* @__PURE__ */ jsx47(
|
|
32544
32529
|
"span",
|
|
32545
32530
|
{
|
|
32546
32531
|
className: cn(
|
|
@@ -32556,7 +32541,7 @@ CommandShortcut.displayName = "CommandShortcut";
|
|
|
32556
32541
|
init_define_import_meta_env();
|
|
32557
32542
|
import { useState as useState20 } from "react";
|
|
32558
32543
|
import { useTranslation as useTranslation20 } from "react-i18next";
|
|
32559
|
-
import { jsx as
|
|
32544
|
+
import { jsx as jsx48, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
32560
32545
|
var FOLDER_ICON_MAP = {
|
|
32561
32546
|
folder: Folder,
|
|
32562
32547
|
"folder-open": FolderOpen,
|
|
@@ -32632,7 +32617,7 @@ function FolderIconEl({
|
|
|
32632
32617
|
style
|
|
32633
32618
|
}) {
|
|
32634
32619
|
const Icon = FOLDER_ICON_MAP[icon ?? ""] ?? Folder;
|
|
32635
|
-
return /* @__PURE__ */
|
|
32620
|
+
return /* @__PURE__ */ jsx48(Icon, { className, style });
|
|
32636
32621
|
}
|
|
32637
32622
|
var HEX_RE = /^#([0-9a-fA-F]{6})$/;
|
|
32638
32623
|
function isValidHex(value) {
|
|
@@ -32645,7 +32630,7 @@ function HexColorPicker({
|
|
|
32645
32630
|
const safe = isValidHex(value) ? value : DEFAULT_FOLDER_COLOR;
|
|
32646
32631
|
return /* @__PURE__ */ jsxs37("div", { className: "flex flex-col gap-2", children: [
|
|
32647
32632
|
/* @__PURE__ */ jsxs37("div", { className: "flex items-center gap-2", children: [
|
|
32648
|
-
/* @__PURE__ */
|
|
32633
|
+
/* @__PURE__ */ jsx48(
|
|
32649
32634
|
"input",
|
|
32650
32635
|
{
|
|
32651
32636
|
type: "color",
|
|
@@ -32654,7 +32639,7 @@ function HexColorPicker({
|
|
|
32654
32639
|
className: "h-8 w-10 shrink-0 cursor-pointer rounded-none border border-input bg-transparent p-0.5"
|
|
32655
32640
|
}
|
|
32656
32641
|
),
|
|
32657
|
-
/* @__PURE__ */
|
|
32642
|
+
/* @__PURE__ */ jsx48(
|
|
32658
32643
|
Input,
|
|
32659
32644
|
{
|
|
32660
32645
|
value,
|
|
@@ -32665,7 +32650,7 @@ function HexColorPicker({
|
|
|
32665
32650
|
}
|
|
32666
32651
|
)
|
|
32667
32652
|
] }),
|
|
32668
|
-
/* @__PURE__ */
|
|
32653
|
+
/* @__PURE__ */ jsx48("div", { className: "flex flex-wrap gap-1.5", children: SUGGESTED_FOLDER_COLORS.map((c) => /* @__PURE__ */ jsx48(
|
|
32669
32654
|
"button",
|
|
32670
32655
|
{
|
|
32671
32656
|
type: "button",
|
|
@@ -32689,8 +32674,8 @@ function IconPicker({
|
|
|
32689
32674
|
) : FOLDER_ICON_IDS;
|
|
32690
32675
|
return /* @__PURE__ */ jsxs37("div", { className: "flex flex-col gap-2", children: [
|
|
32691
32676
|
/* @__PURE__ */ jsxs37("div", { className: "flex items-center gap-2 px-2.5 h-8 bg-muted/60 border border-border/60 rounded-none", children: [
|
|
32692
|
-
/* @__PURE__ */
|
|
32693
|
-
/* @__PURE__ */
|
|
32677
|
+
/* @__PURE__ */ jsx48(Search, { className: "size-3 text-muted-foreground/60 shrink-0" }),
|
|
32678
|
+
/* @__PURE__ */ jsx48(
|
|
32694
32679
|
"input",
|
|
32695
32680
|
{
|
|
32696
32681
|
value: query,
|
|
@@ -32700,14 +32685,14 @@ function IconPicker({
|
|
|
32700
32685
|
}
|
|
32701
32686
|
)
|
|
32702
32687
|
] }),
|
|
32703
|
-
/* @__PURE__ */
|
|
32688
|
+
/* @__PURE__ */ jsx48("div", { className: "grid grid-cols-8 gap-1.5 max-h-40 overflow-y-auto pr-1", children: filtered.map((id) => /* @__PURE__ */ jsx48(
|
|
32704
32689
|
"button",
|
|
32705
32690
|
{
|
|
32706
32691
|
type: "button",
|
|
32707
32692
|
onClick: () => onChange(id),
|
|
32708
32693
|
title: id,
|
|
32709
32694
|
className: `flex items-center justify-center h-9 border transition-colors ${value === id ? "border-accent-brand/50 bg-accent-brand/10" : "border-border text-muted-foreground hover:text-foreground hover:border-muted-foreground"}`,
|
|
32710
|
-
children: /* @__PURE__ */
|
|
32695
|
+
children: /* @__PURE__ */ jsx48(
|
|
32711
32696
|
FolderIconEl,
|
|
32712
32697
|
{
|
|
32713
32698
|
icon: id,
|
|
@@ -32724,7 +32709,7 @@ function IconPicker({
|
|
|
32724
32709
|
// src/ui/components/version-badge.tsx
|
|
32725
32710
|
init_define_import_meta_env();
|
|
32726
32711
|
import { useTranslation as useTranslation21 } from "react-i18next";
|
|
32727
|
-
import { jsx as
|
|
32712
|
+
import { jsx as jsx49 } from "react/jsx-runtime";
|
|
32728
32713
|
function VersionBadge({
|
|
32729
32714
|
status,
|
|
32730
32715
|
releaseUrl,
|
|
@@ -32740,7 +32725,7 @@ function VersionBadge({
|
|
|
32740
32725
|
const label = status === "beta" ? t3("dashboard.beta").toUpperCase() : status === "requires_update" ? t3("dashboard.updateAvailable").toUpperCase() : t3("dashboardTab.stable");
|
|
32741
32726
|
if (status === "requires_update" && releaseUrl) {
|
|
32742
32727
|
const linkLabel = t3("versionCheck.updateLinkLabel");
|
|
32743
|
-
return /* @__PURE__ */
|
|
32728
|
+
return /* @__PURE__ */ jsx49(
|
|
32744
32729
|
"a",
|
|
32745
32730
|
{
|
|
32746
32731
|
href: releaseUrl,
|
|
@@ -32753,7 +32738,7 @@ function VersionBadge({
|
|
|
32753
32738
|
}
|
|
32754
32739
|
);
|
|
32755
32740
|
}
|
|
32756
|
-
return /* @__PURE__ */
|
|
32741
|
+
return /* @__PURE__ */ jsx49("span", { className: badgeClassName, children: label });
|
|
32757
32742
|
}
|
|
32758
32743
|
|
|
32759
32744
|
// src/ui/hooks/use-page-visible-interval.ts
|
|
@@ -32915,7 +32900,7 @@ function getDatabaseTransferUrl(operation, { electron, configuredServerUrl, loca
|
|
|
32915
32900
|
const serverUrl = configuredServerUrl || `http://localhost:${localBackendPort()}`;
|
|
32916
32901
|
return `${serverUrl.replace(/\/$/, "")}/database/${operation}`;
|
|
32917
32902
|
}
|
|
32918
|
-
const development =
|
|
32903
|
+
const development = location.port === "5173";
|
|
32919
32904
|
if (development) {
|
|
32920
32905
|
return `http://localhost:30001/database/${operation}`;
|
|
32921
32906
|
}
|
|
@@ -32983,7 +32968,7 @@ async function syncThemeChoice(themeId) {
|
|
|
32983
32968
|
init_define_import_meta_env();
|
|
32984
32969
|
import { useTranslation as useTranslation22 } from "react-i18next";
|
|
32985
32970
|
import { toast as toast4 } from "sonner";
|
|
32986
|
-
import { jsx as
|
|
32971
|
+
import { jsx as jsx50, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
32987
32972
|
var selectClass = "w-full px-2.5 py-1.5 text-xs bg-background border border-border text-foreground outline-none focus:ring-1 focus:ring-ring appearance-none pr-7";
|
|
32988
32973
|
function LookSettings({ isAdmin }) {
|
|
32989
32974
|
const { t: t3 } = useTranslation22();
|
|
@@ -33001,15 +32986,15 @@ function LookSettings({ isAdmin }) {
|
|
|
33001
32986
|
onChange: (e) => void chooseLayout(e.target.value || null).catch(failed),
|
|
33002
32987
|
className: selectClass,
|
|
33003
32988
|
children: [
|
|
33004
|
-
/* @__PURE__ */
|
|
33005
|
-
layouts.map((layout) => /* @__PURE__ */
|
|
32989
|
+
/* @__PURE__ */ jsx50("option", { value: "", children: t3("looks.followDefault") }),
|
|
32990
|
+
layouts.map((layout) => /* @__PURE__ */ jsx50("option", { value: layout.id, children: layoutLabel(layout, t3) }, layout.id))
|
|
33006
32991
|
]
|
|
33007
32992
|
}
|
|
33008
32993
|
),
|
|
33009
|
-
/* @__PURE__ */
|
|
32994
|
+
/* @__PURE__ */ jsx50("p", { className: "text-[11px] text-muted-foreground", children: t3("looks.layoutHint") }),
|
|
33010
32995
|
isAdmin && response && /* @__PURE__ */ jsxs38("div", { className: "flex flex-col gap-1.5 border border-border p-2", children: [
|
|
33011
|
-
/* @__PURE__ */
|
|
33012
|
-
/* @__PURE__ */
|
|
32996
|
+
/* @__PURE__ */ jsx50("span", { className: "text-[11px] font-medium text-foreground", children: t3("looks.defaultsLabel") }),
|
|
32997
|
+
/* @__PURE__ */ jsx50("p", { className: "text-[11px] text-muted-foreground", children: t3("looks.defaultsHint") }),
|
|
33013
32998
|
/* @__PURE__ */ jsxs38(
|
|
33014
32999
|
Select2,
|
|
33015
33000
|
{
|
|
@@ -33017,8 +33002,8 @@ function LookSettings({ isAdmin }) {
|
|
|
33017
33002
|
onChange: (e) => void chooseDefaultLook({ layout: e.target.value || null }).then(() => toast4.success(t3("looks.defaultSaved"))).catch(failed),
|
|
33018
33003
|
className: selectClass,
|
|
33019
33004
|
children: [
|
|
33020
|
-
/* @__PURE__ */
|
|
33021
|
-
layouts.map((layout) => /* @__PURE__ */
|
|
33005
|
+
/* @__PURE__ */ jsx50("option", { value: "", children: t3("looks.followDefault") }),
|
|
33006
|
+
layouts.map((layout) => /* @__PURE__ */ jsx50("option", { value: layout.id, children: layoutLabel(layout, t3) }, layout.id))
|
|
33022
33007
|
]
|
|
33023
33008
|
}
|
|
33024
33009
|
),
|
|
@@ -33029,8 +33014,8 @@ function LookSettings({ isAdmin }) {
|
|
|
33029
33014
|
onChange: (e) => void chooseDefaultLook({ theme: e.target.value || null }).then(() => toast4.success(t3("looks.defaultSaved"))).catch(failed),
|
|
33030
33015
|
className: selectClass,
|
|
33031
33016
|
children: [
|
|
33032
|
-
/* @__PURE__ */
|
|
33033
|
-
themes.map((theme2) => /* @__PURE__ */
|
|
33017
|
+
/* @__PURE__ */ jsx50("option", { value: "", children: t3("looks.followDefault") }),
|
|
33018
|
+
themes.map((theme2) => /* @__PURE__ */ jsx50("option", { value: theme2.id, children: themeLabel(theme2, t3) }, theme2.id))
|
|
33034
33019
|
]
|
|
33035
33020
|
}
|
|
33036
33021
|
)
|
|
@@ -33042,7 +33027,7 @@ function LookSettings({ isAdmin }) {
|
|
|
33042
33027
|
init_define_import_meta_env();
|
|
33043
33028
|
import { useRef as useRef13, useState as useState22 } from "react";
|
|
33044
33029
|
import { useTranslation as useTranslation23 } from "react-i18next";
|
|
33045
|
-
import { jsx as
|
|
33030
|
+
import { jsx as jsx51, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
33046
33031
|
var THEMES = [
|
|
33047
33032
|
{ id: SYSTEM_THEME, preview: "auto" },
|
|
33048
33033
|
...BUILTIN_THEMES.map((theme2) => ({
|
|
@@ -33074,7 +33059,7 @@ var DARK_SWATCH = BUILTIN_THEMES.find((theme2) => theme2.id === "dark").swatch;
|
|
|
33074
33059
|
// src/ui/plugin-host/NativeView.tsx
|
|
33075
33060
|
init_define_import_meta_env();
|
|
33076
33061
|
import { useEffect as useEffect16, useRef as useRef14 } from "react";
|
|
33077
|
-
import { Fragment as Fragment8, jsx as
|
|
33062
|
+
import { Fragment as Fragment8, jsx as jsx52 } from "react/jsx-runtime";
|
|
33078
33063
|
function embeddedViewApi() {
|
|
33079
33064
|
if (typeof window === "undefined") return null;
|
|
33080
33065
|
const api = window.electronAPI?.embeddedView;
|
|
@@ -33174,29 +33159,29 @@ function NativeView({
|
|
|
33174
33159
|
useEffect16(() => {
|
|
33175
33160
|
sync.current();
|
|
33176
33161
|
}, [hidden]);
|
|
33177
|
-
if (!api) return /* @__PURE__ */
|
|
33178
|
-
return /* @__PURE__ */
|
|
33162
|
+
if (!api) return /* @__PURE__ */ jsx52(Fragment8, { children: fallback ?? null });
|
|
33163
|
+
return /* @__PURE__ */ jsx52("div", { ref: host, className, style });
|
|
33179
33164
|
}
|
|
33180
33165
|
|
|
33181
33166
|
// src/ui/shell/split/SplitLayoutMenu.tsx
|
|
33182
33167
|
init_define_import_meta_env();
|
|
33183
33168
|
import { useMemo as useMemo9 } from "react";
|
|
33184
33169
|
import { useTranslation as useTranslation24 } from "react-i18next";
|
|
33185
|
-
import { jsx as
|
|
33170
|
+
import { jsx as jsx53, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
33186
33171
|
function NodeThumb({ node }) {
|
|
33187
33172
|
if (node.kind === "pane") {
|
|
33188
|
-
return /* @__PURE__ */
|
|
33173
|
+
return /* @__PURE__ */ jsx53("div", { className: "size-full border border-current" });
|
|
33189
33174
|
}
|
|
33190
|
-
return /* @__PURE__ */
|
|
33175
|
+
return /* @__PURE__ */ jsx53(
|
|
33191
33176
|
"div",
|
|
33192
33177
|
{
|
|
33193
33178
|
className: `flex size-full gap-0.5 ${node.direction === "row" ? "flex-row" : "flex-col"}`,
|
|
33194
|
-
children: node.children.map((child, index) => /* @__PURE__ */
|
|
33179
|
+
children: node.children.map((child, index) => /* @__PURE__ */ jsx53(
|
|
33195
33180
|
"div",
|
|
33196
33181
|
{
|
|
33197
33182
|
className: "min-w-0 min-h-0",
|
|
33198
33183
|
style: { flex: `${node.sizes[index]} 1 0px` },
|
|
33199
|
-
children: /* @__PURE__ */
|
|
33184
|
+
children: /* @__PURE__ */ jsx53(NodeThumb, { node: child })
|
|
33200
33185
|
},
|
|
33201
33186
|
child.id
|
|
33202
33187
|
))
|
|
@@ -33205,7 +33190,7 @@ function NodeThumb({ node }) {
|
|
|
33205
33190
|
}
|
|
33206
33191
|
function PresetThumb({ id }) {
|
|
33207
33192
|
const node = useMemo9(() => buildPreset(id), [id]);
|
|
33208
|
-
return /* @__PURE__ */
|
|
33193
|
+
return /* @__PURE__ */ jsx53(NodeThumb, { node });
|
|
33209
33194
|
}
|
|
33210
33195
|
function SplitLayoutMenu({
|
|
33211
33196
|
activeIsSplit,
|
|
@@ -33216,7 +33201,7 @@ function SplitLayoutMenu({
|
|
|
33216
33201
|
const { t: t3 } = useTranslation24();
|
|
33217
33202
|
const fullTitle = canAddPane ? void 0 : t3("splitScreen.maxPanes", { count: MAX_PANES });
|
|
33218
33203
|
return /* @__PURE__ */ jsxs40(DropdownMenu, { children: [
|
|
33219
|
-
/* @__PURE__ */
|
|
33204
|
+
/* @__PURE__ */ jsx53(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx53(
|
|
33220
33205
|
Button,
|
|
33221
33206
|
{
|
|
33222
33207
|
variant: "ghost",
|
|
@@ -33224,7 +33209,7 @@ function SplitLayoutMenu({
|
|
|
33224
33209
|
className: `h-full w-12.5 rounded-none ${activeIsSplit ? "text-accent-brand" : "text-muted-foreground hover:text-foreground"}`,
|
|
33225
33210
|
title: t3("splitScreen.title"),
|
|
33226
33211
|
"aria-label": t3("splitScreen.title"),
|
|
33227
|
-
children: /* @__PURE__ */
|
|
33212
|
+
children: /* @__PURE__ */ jsx53(LayoutPanelLeft, { className: "size-4" })
|
|
33228
33213
|
}
|
|
33229
33214
|
) }),
|
|
33230
33215
|
/* @__PURE__ */ jsxs40(
|
|
@@ -33241,9 +33226,9 @@ function SplitLayoutMenu({
|
|
|
33241
33226
|
title: fullTitle,
|
|
33242
33227
|
onSelect: () => onSplit("right"),
|
|
33243
33228
|
children: [
|
|
33244
|
-
/* @__PURE__ */
|
|
33229
|
+
/* @__PURE__ */ jsx53(Columns2, { className: "size-3.5" }),
|
|
33245
33230
|
t3("splitScreen.splitRight"),
|
|
33246
|
-
/* @__PURE__ */
|
|
33231
|
+
/* @__PURE__ */ jsx53(DropdownMenuShortcut, { children: "Ctrl+Shift+\\" })
|
|
33247
33232
|
]
|
|
33248
33233
|
}
|
|
33249
33234
|
),
|
|
@@ -33254,35 +33239,35 @@ function SplitLayoutMenu({
|
|
|
33254
33239
|
title: fullTitle,
|
|
33255
33240
|
onSelect: () => onSplit("bottom"),
|
|
33256
33241
|
children: [
|
|
33257
|
-
/* @__PURE__ */
|
|
33242
|
+
/* @__PURE__ */ jsx53(Rows2, { className: "size-3.5" }),
|
|
33258
33243
|
t3("splitScreen.splitDown"),
|
|
33259
|
-
/* @__PURE__ */
|
|
33244
|
+
/* @__PURE__ */ jsx53(DropdownMenuShortcut, { children: "Ctrl+Shift+-" })
|
|
33260
33245
|
]
|
|
33261
33246
|
}
|
|
33262
33247
|
),
|
|
33263
|
-
/* @__PURE__ */
|
|
33264
|
-
/* @__PURE__ */
|
|
33265
|
-
/* @__PURE__ */
|
|
33248
|
+
/* @__PURE__ */ jsx53(DropdownMenuSeparator, {}),
|
|
33249
|
+
/* @__PURE__ */ jsx53(DropdownMenuLabel, { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: activeIsSplit ? t3("splitScreen.applyLayout") : t3("splitScreen.layouts") }),
|
|
33250
|
+
/* @__PURE__ */ jsx53("div", { className: "grid grid-cols-4 gap-1 p-1", children: SPLIT_PRESETS.map((preset) => /* @__PURE__ */ jsx53(
|
|
33266
33251
|
DropdownMenuItem,
|
|
33267
33252
|
{
|
|
33268
33253
|
className: "flex h-12 items-center justify-center p-1.5 text-muted-foreground focus:text-accent-brand",
|
|
33269
33254
|
title: t3(preset.titleKey),
|
|
33270
33255
|
"aria-label": t3(preset.titleKey),
|
|
33271
33256
|
onSelect: () => onPreset(preset.id),
|
|
33272
|
-
children: /* @__PURE__ */
|
|
33257
|
+
children: /* @__PURE__ */ jsx53("div", { className: "h-8 w-11", children: /* @__PURE__ */ jsx53(PresetThumb, { id: preset.id }) })
|
|
33273
33258
|
},
|
|
33274
33259
|
preset.id
|
|
33275
33260
|
)) }),
|
|
33276
|
-
/* @__PURE__ */
|
|
33277
|
-
/* @__PURE__ */
|
|
33261
|
+
/* @__PURE__ */ jsx53(DropdownMenuSeparator, {}),
|
|
33262
|
+
/* @__PURE__ */ jsx53(DropdownMenuLabel, { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: t3("splitScreen.shortcuts") }),
|
|
33278
33263
|
/* @__PURE__ */ jsxs40("div", { className: "flex flex-col gap-1 px-2 pb-1.5 text-xs text-muted-foreground", children: [
|
|
33279
33264
|
/* @__PURE__ */ jsxs40("div", { className: "flex items-center justify-between gap-2", children: [
|
|
33280
|
-
/* @__PURE__ */
|
|
33281
|
-
/* @__PURE__ */
|
|
33265
|
+
/* @__PURE__ */ jsx53("span", { children: t3("splitScreen.shortcutNavigate") }),
|
|
33266
|
+
/* @__PURE__ */ jsx53("kbd", { className: "font-mono text-[10px]", children: paneNavHotkeyLabel() })
|
|
33282
33267
|
] }),
|
|
33283
33268
|
/* @__PURE__ */ jsxs40("div", { className: "flex items-center justify-between gap-2", children: [
|
|
33284
|
-
/* @__PURE__ */
|
|
33285
|
-
/* @__PURE__ */
|
|
33269
|
+
/* @__PURE__ */ jsx53("span", { children: t3("splitScreen.zoom") }),
|
|
33270
|
+
/* @__PURE__ */ jsx53("kbd", { className: "font-mono text-[10px]", children: "Ctrl+Shift+Enter" })
|
|
33286
33271
|
] })
|
|
33287
33272
|
] })
|
|
33288
33273
|
]
|
|
@@ -33294,7 +33279,7 @@ function SplitLayoutMenu({
|
|
|
33294
33279
|
// src/ui/sidebar/AuthEnrollmentSections.tsx
|
|
33295
33280
|
init_define_import_meta_env();
|
|
33296
33281
|
import { useTranslation as useTranslation25 } from "react-i18next";
|
|
33297
|
-
import { jsx as
|
|
33282
|
+
import { jsx as jsx54, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
33298
33283
|
function AuthEnrollmentSections({
|
|
33299
33284
|
factorsOnly = false
|
|
33300
33285
|
} = {}) {
|
|
@@ -33305,15 +33290,15 @@ function AuthEnrollmentSections({
|
|
|
33305
33290
|
(entry) => entry.enrollment
|
|
33306
33291
|
);
|
|
33307
33292
|
if (sections.length === 0) return null;
|
|
33308
|
-
return /* @__PURE__ */
|
|
33293
|
+
return /* @__PURE__ */ jsx54("div", { className: "flex flex-col gap-4", children: sections.map((entry) => {
|
|
33309
33294
|
const Enrollment = entry.enrollment;
|
|
33310
33295
|
return /* @__PURE__ */ jsxs41(
|
|
33311
33296
|
"div",
|
|
33312
33297
|
{
|
|
33313
33298
|
className: "flex flex-col gap-2",
|
|
33314
33299
|
children: [
|
|
33315
|
-
/* @__PURE__ */
|
|
33316
|
-
/* @__PURE__ */
|
|
33300
|
+
/* @__PURE__ */ jsx54("span", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: t3(entry.titleKey) }),
|
|
33301
|
+
/* @__PURE__ */ jsx54(Enrollment, {})
|
|
33317
33302
|
]
|
|
33318
33303
|
},
|
|
33319
33304
|
`${entry.pluginId}:${entry.id}`
|
|
@@ -33599,6 +33584,7 @@ export {
|
|
|
33599
33584
|
getErrorMessage,
|
|
33600
33585
|
getExternalAutoProvision,
|
|
33601
33586
|
getFolderAccess,
|
|
33587
|
+
getFolderAuthOverride,
|
|
33602
33588
|
getFolderDefaultsId,
|
|
33603
33589
|
getHostAccess,
|
|
33604
33590
|
getHostAuthOverride,
|
|
@@ -33740,6 +33726,7 @@ export {
|
|
|
33740
33726
|
saveUserPreferences,
|
|
33741
33727
|
setAllPluginChannels,
|
|
33742
33728
|
setDeveloperMode,
|
|
33729
|
+
setFolderAuthOverride,
|
|
33743
33730
|
setHostAuthOverride,
|
|
33744
33731
|
setNotificationPrivateEndpoints,
|
|
33745
33732
|
setPluginOptions,
|