@termix-ssh/plugin-sdk 1.0.4 → 1.0.5

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 CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.5
4
+
5
+ ### Fixed
6
+
7
+ - `execCommand` timeout errors no longer include the command, which could hold a sudo password
8
+ - `termix-plugin validate` fails when a plugin ships migrations for some database engines but not all three
9
+ - `termix-plugin migrations` loads the table definitions from a path with a `#` or other URL characters in it
10
+ - Text, json and encrypted columns are `longtext` on MySQL in new migrations, so they are no longer capped at 64KB. Existing migrations keep `text`
11
+ - `i18next`, `react-dom`, `react-i18next` and `sonner` are optional peer dependencies, so npm stops installing them into backend-only plugins
12
+ - `termix-plugin validate` accepts a beta version like `1.1.0-beta.1` when the changelog's newest release is `1.1.0` or older, so beta releases pass
13
+
3
14
  ## 1.0.4
4
15
 
5
16
  ### Fixed
package/README.md CHANGED
@@ -28,6 +28,7 @@ npm install --save-dev @termix-ssh/plugin-sdk
28
28
 
29
29
  ```bash
30
30
  npx termix-plugin build # bundle dist/backend.js and dist/frontend.js
31
+ npx termix-plugin patch # apply the plugin's dependency patches (build does this too)
31
32
  npx termix-plugin test # run the plugin's Vitest suite
32
33
  npx termix-plugin validate # check manifest.json and the files it names
33
34
  npx termix-plugin openapi # write dist/openapi.json from @openapi comments
@@ -108,13 +108,6 @@ const HOST_DIR = path.join(
108
108
  const THEME_CSS = path.join(HOST_DIR, "theme.css");
109
109
  const CORE_CLASSES = path.join(HOST_DIR, "core-classes.json");
110
110
 
111
- /**
112
- * Compiles the Tailwind classes the plugin's frontend uses into
113
- * dist/frontend.css, against the theme core ships in the SDK. Core only
114
- * compiles its own classes, so a class no core file happens to use would
115
- * otherwise have no CSS at all. Appended to whatever CSS the bundle already
116
- * produced (a library's stylesheet the plugin imports).
117
- */
118
111
  /**
119
112
  * Moves a plugin's Tailwind layers under their own names. Core orders
120
113
  * termix-plugin-utilities above its base styles and below its own utilities,
@@ -136,6 +129,13 @@ function readCoreClasses() {
136
129
  return new Set(JSON.parse(fs.readFileSync(CORE_CLASSES, "utf8")));
137
130
  }
138
131
 
132
+ /**
133
+ * Compiles the Tailwind classes the plugin's frontend uses into
134
+ * dist/frontend.css, against the theme core ships in the SDK. Core only
135
+ * compiles its own classes, so a class no core file happens to use would
136
+ * otherwise have no CSS at all. Appended to whatever CSS the bundle already
137
+ * produced (a library's stylesheet the plugin imports).
138
+ */
139
139
  export async function buildTailwind(cwd, outDir) {
140
140
  const { compile, optimize } = await import("@tailwindcss/node");
141
141
  const { Scanner } = await import("@tailwindcss/oxide");
@@ -17,7 +17,7 @@
17
17
 
18
18
  import fs from "node:fs";
19
19
  import path from "node:path";
20
- import { fileURLToPath } from "node:url";
20
+ import { fileURLToPath, pathToFileURL } from "node:url";
21
21
  import * as esbuild from "esbuild";
22
22
  import { BACKEND_EXTERNALS } from "../lib/externals.mjs";
23
23
  import { readManifest, resolveEntry } from "../lib/plugin-dir.mjs";
@@ -53,7 +53,7 @@ async function loadDefinitions(cwd) {
53
53
  external: BACKEND_EXTERNALS,
54
54
  });
55
55
 
56
- const module = await import(`file://${outfile.split(path.sep).join("/")}`);
56
+ const module = await import(pathToFileURL(outfile).href);
57
57
  const tables = module.tables ?? module.default;
58
58
  if (!Array.isArray(tables)) {
59
59
  throw new Error(
@@ -218,6 +218,11 @@ async function validateMigrations(cwd, pluginId) {
218
218
  const present = DIALECTS.filter((dialect) =>
219
219
  fs.existsSync(path.join(root, dialect)),
220
220
  );
221
+ for (const dialect of DIALECTS) {
222
+ if (present.length > 0 && !present.includes(dialect)) {
223
+ problems.push(`migrations/${dialect} is missing`);
224
+ }
225
+ }
221
226
 
222
227
  const byDialect = new Map();
223
228
  for (const dialect of present) {
package/cli/index.mjs CHANGED
File without changes
@@ -52,7 +52,9 @@ export declare function parseChangelog(markdown: string): {
52
52
  };
53
53
  /**
54
54
  * Checks a CHANGELOG.md. With a manifest version, the newest release has to
55
- * be that version, so a release never ships without its notes.
55
+ * be that version, so a release never ships without its notes. A beta like
56
+ * 1.1.0-beta.2 gets its notes from git, so it only needs the newest release
57
+ * to be 1.1.0 or older.
56
58
  */
57
59
  export declare function validateChangelog(markdown: string, manifestVersion?: string): string[];
58
60
  /**
package/dist/changelog.js CHANGED
@@ -145,7 +145,9 @@ export function parseChangelog(markdown) {
145
145
  }
146
146
  /**
147
147
  * Checks a CHANGELOG.md. With a manifest version, the newest release has to
148
- * be that version, so a release never ships without its notes.
148
+ * be that version, so a release never ships without its notes. A beta like
149
+ * 1.1.0-beta.2 gets its notes from git, so it only needs the newest release
150
+ * to be 1.1.0 or older.
149
151
  */
150
152
  export function validateChangelog(markdown, manifestVersion) {
151
153
  const { changelog, problems } = parseChangelog(markdown);
@@ -154,7 +156,15 @@ export function validateChangelog(markdown, manifestVersion) {
154
156
  return problems;
155
157
  }
156
158
  const newest = changelog.releases[0].version;
157
- if (manifestVersion && newest !== manifestVersion) {
159
+ const base = manifestVersion
160
+ ? semver.valid(semver.coerce(manifestVersion))
161
+ : null;
162
+ const betaOk = !!manifestVersion &&
163
+ !!semver.prerelease(manifestVersion) &&
164
+ !!base &&
165
+ !!semver.valid(newest) &&
166
+ semver.lte(newest, base);
167
+ if (manifestVersion && newest !== manifestVersion && !betaOk) {
158
168
  problems.push(`the newest release is ${newest}, but the manifest version is ${manifestVersion}`);
159
169
  }
160
170
  return problems;
package/dist/db.d.ts CHANGED
@@ -37,7 +37,7 @@ interface Builder<T extends PluginColumn = PluginColumn> {
37
37
  }
38
38
  /** Auto-incrementing surrogate key: integer on sqlite, serial, auto_increment. */
39
39
  export declare const id: () => Builder<PluginColumn>;
40
- /** Unbounded string. Never indexable: MySQL cannot index TEXT. */
40
+ /** Unbounded string, LONGTEXT on MySQL. Never indexable: MySQL cannot index TEXT. */
41
41
  export declare const text: () => Builder<PluginColumn>;
42
42
  /** Bounded string. Indexable on every engine. */
43
43
  export declare const varchar: (length?: number) => Builder<PluginColumn>;
package/dist/db.js CHANGED
@@ -28,7 +28,7 @@ function builder(column) {
28
28
  }
29
29
  /** Auto-incrementing surrogate key: integer on sqlite, serial, auto_increment. */
30
30
  export const id = () => builder({ type: "id", primaryKey: true, notNull: true });
31
- /** Unbounded string. Never indexable: MySQL cannot index TEXT. */
31
+ /** Unbounded string, LONGTEXT on MySQL. Never indexable: MySQL cannot index TEXT. */
32
32
  export const text = () => builder({ type: "text" });
33
33
  /** Bounded string. Indexable on every engine. */
34
34
  export const varchar = (length = KEY_LENGTH) => builder({ type: "varchar", length });
package/dist/ddl.js CHANGED
@@ -67,10 +67,13 @@ function columnType(dialect, column, keyed) {
67
67
  // text/json column, so in practice this only catches a primary key.
68
68
  if (keyed && dialect !== "sqlite")
69
69
  return `varchar(${KEY_LENGTH})`;
70
+ // MySQL TEXT stops at 64KB, so free text, json and secrets go long.
71
+ if (dialect === "mysql" && column.type !== "timestamp")
72
+ return "longtext";
70
73
  return "text";
71
74
  }
72
75
  }
73
- /** Column types that are TEXT on MySQL when nothing keys them. */
76
+ /** Column types that are TEXT or LONGTEXT on MySQL when nothing keys them. */
74
77
  const TEXT_ON_MYSQL = new Set([
75
78
  "text",
76
79
  "json",
@@ -21,7 +21,7 @@ var inFlight = null;
21
21
  function load() {
22
22
  if (cache) return Promise.resolve(cache);
23
23
  if (inFlight) return inFlight;
24
- inFlight = import("./rbac-api-WIJVZH3M.js").then(({ getMyPermissions }) => getMyPermissions()).then((result) => {
24
+ inFlight = import("./rbac-api-UJGGTQVA.js").then(({ getMyPermissions }) => getMyPermissions()).then((result) => {
25
25
  cache = {
26
26
  permissions: result.permissions ?? [],
27
27
  isAdmin: !!result.isAdmin
@@ -3801,7 +3801,7 @@ var {
3801
3801
 
3802
3802
  // src/ui/main-axios.ts
3803
3803
  import { toast } from "sonner";
3804
- import i18n from "i18next";
3804
+ import i18n2 from "i18next";
3805
3805
 
3806
3806
  // src/ui/lib/base-path.ts
3807
3807
  function getBasePath() {
@@ -4998,12 +4998,13 @@ async function logActivity(type, hostId, hostName) {
4998
4998
  }
4999
4999
 
5000
5000
  // src/ui/api/rbac-api.ts
5001
+ import i18n from "i18next";
5001
5002
  async function getSharingTarget(hostId, syncId) {
5002
5003
  const api = await getConnectedRemoteApi();
5003
5004
  if (!api || !syncId) return { api: rbacApi, hostId };
5004
5005
  const remoteHostId = await resolveRemoteHostId(syncId);
5005
5006
  if (remoteHostId === null) {
5006
- throw new Error("The synced host does not exist on the remote server");
5007
+ throw new Error(i18n.t("errors.syncedHostMissing"));
5007
5008
  }
5008
5009
  return { api, hostId: remoteHostId };
5009
5010
  }
@@ -5012,7 +5013,7 @@ async function getSharedCopyTarget(hostId, syncId) {
5012
5013
  const api = await getConnectedRemoteApi();
5013
5014
  const remoteHostId = api ? await resolveRemoteHostId(syncId) : null;
5014
5015
  if (!api || remoteHostId === null) {
5015
- throw new Error("The linked server is not reachable");
5016
+ throw new Error(i18n.t("errors.linkedServerUnreachable"));
5016
5017
  }
5017
5018
  return { api, hostId: remoteHostId };
5018
5019
  }
@@ -5037,7 +5038,7 @@ async function updateRole(roleId, roleData) {
5037
5038
  try {
5038
5039
  const response = await rbacApi.put(`/rbac/roles/${roleId}`, roleData);
5039
5040
  if (roleData.permissions) {
5040
- const { notifyPermissionsChanged } = await import("./use-permissions-KIQCJ35M.js");
5041
+ const { notifyPermissionsChanged } = await import("./use-permissions-P3DC7ZDR.js");
5041
5042
  notifyPermissionsChanged();
5042
5043
  }
5043
5044
  return response.data;
@@ -5293,7 +5294,6 @@ if (isElectron()) {
5293
5294
  if (!localStorage.getItem(key)) {
5294
5295
  electronSettingsCache.set(key, value);
5295
5296
  localStorage.setItem(key, value);
5296
- console.log(`[Electron] Loaded setting ${key} from main process`);
5297
5297
  } else {
5298
5298
  electronSettingsCache.set(key, localStorage.getItem(key));
5299
5299
  }
@@ -5319,7 +5319,6 @@ function setCookie(name, value, days = 7) {
5319
5319
  console.error(`[Electron] Failed to persist setting ${name}:`, err);
5320
5320
  });
5321
5321
  }
5322
- console.log(`[Electron] Set setting: ${name}`);
5323
5322
  } catch (error) {
5324
5323
  console.error(`[Electron] Failed to set setting: ${name}`, error);
5325
5324
  }
@@ -5341,7 +5340,6 @@ function getCookie(name) {
5341
5340
  if (token) {
5342
5341
  electronSettingsCache.set(name, token);
5343
5342
  }
5344
- console.log(`[Electron] Get setting: ${name} = ${token}`);
5345
5343
  return token;
5346
5344
  } catch (error) {
5347
5345
  console.error(`[Electron] Failed to get setting: ${name}`, error);
@@ -5548,7 +5546,7 @@ function createApiInstance(baseURL, serviceName = "API") {
5548
5546
  clearClientAuthState();
5549
5547
  if (typeof window !== "undefined") {
5550
5548
  console.warn("Session expired - please log in again");
5551
- toast.warning(i18n.t("errors.sessionExpiredLogin"));
5549
+ toast.warning(i18n2.t("errors.sessionExpiredLogin"));
5552
5550
  window.dispatchEvent(new Event("termix:logout"));
5553
5551
  }
5554
5552
  dbHealthMonitor.reportSessionExpired();
@@ -5597,7 +5595,7 @@ function createRemoteOriginApiInstance(path) {
5597
5595
  });
5598
5596
  instance.interceptors.request.use(
5599
5597
  async (config) => {
5600
- const { getLinkedSession: getLinkedSession2 } = await import("./linked-server-4VWYYABP.js");
5598
+ const { getLinkedSession: getLinkedSession2 } = await import("./linked-server-RWBK427T.js");
5601
5599
  const linked = await getLinkedSession2();
5602
5600
  config.baseURL = linked ? `${linked.serverUrl}${path}` : "http://no-server-configured";
5603
5601
  if (config.headers.set) {
@@ -2,7 +2,7 @@ const __termixNoGlob = () => ({});
2
2
  import {
3
3
  hasPermission,
4
4
  usePermissions
5
- } from "./chunk-O2OHNVFX.js";
5
+ } from "./chunk-KOOUKYW3.js";
6
6
  import {
7
7
  PRESETS,
8
8
  SYNC_CHANGED_EVENT,
@@ -39,7 +39,7 @@ import {
39
39
  usePluginStore,
40
40
  useTabTypes,
41
41
  websocketAuthProtocols
42
- } from "./chunk-F5RZH6HE.js";
42
+ } from "./chunk-OEOKIKXC.js";
43
43
  import {
44
44
  __export,
45
45
  define_import_meta_env_default
@@ -49009,7 +49009,8 @@ var docs_pages_default = {
49009
49009
  plugins: "guide/plugins",
49010
49010
  pluginCatalog: "plugins",
49011
49011
  cli: "cli",
49012
- develop: "develop"
49012
+ develop: "develop",
49013
+ communityRegistry: "develop/community-registry"
49013
49014
  };
49014
49015
 
49015
49016
  // src/ui/lib/docs.ts
@@ -50473,12 +50474,8 @@ var en_default = {
50473
50474
  offline: "Offline",
50474
50475
  unknown: "Unknown",
50475
50476
  continue: "Continue",
50476
- maintenance: "Maintenance",
50477
- degraded: "Degraded",
50478
50477
  error: "Error",
50479
- warning: "Warning",
50480
50478
  unsavedChanges: "Unsaved changes",
50481
- dismiss: "Dismiss",
50482
50479
  more: "More",
50483
50480
  loading: "Loading...",
50484
50481
  host: "Host",
@@ -50488,15 +50485,7 @@ var en_default = {
50488
50485
  connect: "Connect",
50489
50486
  copied: "Copied",
50490
50487
  connecting: "Connecting...",
50491
- updateAvailable: "Update Available",
50492
- appName: "Termix",
50493
50488
  openInNewTab: "Open in New Tab",
50494
- noReleases: "No Releases",
50495
- updatesAndReleases: "Updates & Releases",
50496
- newVersionAvailable: "A new version ({{version}}) is available.",
50497
- failedToFetchUpdateInfo: "Failed to fetch update information",
50498
- preRelease: "Pre-release",
50499
- noReleasesFound: "No releases found.",
50500
50489
  cancel: "Cancel",
50501
50490
  username: "Username",
50502
50491
  login: "Login",
@@ -50511,15 +50500,10 @@ var en_default = {
50511
50500
  rename: "Rename",
50512
50501
  edit: "Edit",
50513
50502
  confirm: "Confirm",
50514
- no: "No",
50515
- or: "OR",
50516
50503
  next: "Next",
50517
50504
  previous: "Previous",
50518
50505
  refresh: "Refresh",
50519
50506
  language: "Language",
50520
- checking: "Checking...",
50521
- checkingDatabase: "Checking database connection...",
50522
- checkingAuthentication: "Checking authentication...",
50523
50507
  backendReconnected: "Server connection restored",
50524
50508
  connectionDegraded: "Server connection lost, recovering\u2026",
50525
50509
  reload: "Reload",
@@ -50528,12 +50512,6 @@ var en_default = {
50528
50512
  copyFailed: "Failed to copy to clipboard",
50529
50513
  maximize: "Maximize",
50530
50514
  restore: "Restore",
50531
- of: "of",
50532
- saved: "Saved",
50533
- deleted: "Deleted",
50534
- deleteFailed: "Failed to delete",
50535
- saveFailed: "Failed to save",
50536
- required: "Required",
50537
50515
  remove: "Remove",
50538
50516
  add: "Add",
50539
50517
  update: "Update",
@@ -50555,8 +50533,8 @@ var en_default = {
50555
50533
  skip: "Skip setup",
50556
50534
  next: "Next",
50557
50535
  finish: "Done",
50558
- pluginsTitle: "Choose your features",
50559
- pluginsIntro: "Pick the features to keep. The recommended ones cover what most people need.",
50536
+ pluginsTitle: "Choose your plugins",
50537
+ pluginsIntro: "Pick the plugins to keep. The recommended ones cover what most people need.",
50560
50538
  pluginsUpgradeNote: "Everything you use now is kept as it is. Turn off or remove what you do not need.",
50561
50539
  pluginsRemoveNote: "Plugins set to Remove are deleted from this server, with their data, when you continue. You can install any of them again at any time from the Plugins tab (this needs an internet connection). Pick Off to keep a plugin installed but turned off.",
50562
50540
  pluginsUseRecommended: "Recommended",
@@ -50593,19 +50571,11 @@ var en_default = {
50593
50571
  nav: {
50594
50572
  home: "Home",
50595
50573
  terminal: "Terminal",
50596
- fileManager: "File Manager",
50597
- serverStats: "Host Metrics",
50598
- admin: "Admin",
50599
- userProfile: "User Profile",
50600
- confirmClose: "Close this active session?",
50601
50574
  close: "Close",
50602
- cancel: "Cancel",
50603
- sshManager: "SSH Manager",
50604
50575
  hostTabTitle: "{{username}}@{{ip}}:{{port}}",
50605
50576
  copyPassword: "Copy Password",
50606
50577
  copySudoPassword: "Copy Sudo Password",
50607
50578
  passwordCopied: "Password copied to clipboard",
50608
- noPasswordAvailable: "No password available",
50609
50579
  failedToCopyPassword: "Failed to copy password",
50610
50580
  refreshTab: "Refresh connection",
50611
50581
  renameTab: "Rename tab",
@@ -50616,13 +50586,7 @@ var en_default = {
50616
50586
  openInRightDock: "Open in right dock",
50617
50587
  closeRightDock: "Close right dock",
50618
50588
  toggleRightDock: "Toggle right dock",
50619
- multiPanelHintTitle: "Work with more than one panel",
50620
- multiPanelHintBody: "Keep this panel open while the sidebar is used for something else. Two ways to move it:",
50621
- multiPanelHintTabHow: "Ctrl+click its rail icon, or use the button in this header.",
50622
- multiPanelHintDockHow: "Right-click its rail icon, or use the panel icon in the tab bar.",
50623
- sidebarSettings: "Sidebar Settings...",
50624
50589
  hosts: "Hosts",
50625
- hostManager: "Host Manager",
50626
50590
  credentials: "Credentials",
50627
50591
  connections: "Connections",
50628
50592
  keepSideMenuOpen: "Keep Menu Open",
@@ -50994,8 +50958,8 @@ var en_default = {
50994
50958
  showPinIconDesc: "Show a pin next to pinned hosts.",
50995
50959
  showSharedBadge: "Shared badge",
50996
50960
  showSharedBadgeDesc: "Show a badge on hosts shared with you.",
50997
- showBadges: "Feature badges",
50998
- showBadgesDesc: "Show badges that features add next to the host name.",
50961
+ showBadges: "Plugin badges",
50962
+ showBadgesDesc: "Show badges that plugins add next to the host name.",
50999
50963
  hostClickBehavior: "Clicking a host",
51000
50964
  hostClickBehaviorDesc: 'What happens when you click a host that already has an open tab. Ctrl/Cmd click, middle click, or "Open in new tab" always start a new one.',
51001
50965
  hostClickNewTab: "Always open a new tab",
@@ -51068,7 +51032,7 @@ var en_default = {
51068
51032
  groupTags: "Tags & pin",
51069
51033
  groupProxy: "Proxy",
51070
51034
  groupJumpHosts: "Jump hosts",
51071
- groupFeatureFlags: "Feature flags",
51035
+ groupFeatureFlags: "Plugin settings",
51072
51036
  groupAdvanced: "Advanced config",
51073
51037
  preview: "Preview",
51074
51038
  moreHosts: "... {{count}} more hosts",
@@ -51085,7 +51049,7 @@ var en_default = {
51085
51049
  failedToDeleteCredential2: "Failed to delete credential",
51086
51050
  noFolderOption: "(No folder)",
51087
51051
  nSelected: "{{count}} selected",
51088
- featuresMenu: "Features",
51052
+ featuresMenu: "Plugins",
51089
51053
  moveMenu: "Move",
51090
51054
  connectSelected: "Connect",
51091
51055
  cancelSelection: "Cancel",
@@ -51101,6 +51065,7 @@ var en_default = {
51101
51065
  noHostsYet: "No hosts yet",
51102
51066
  noHostsYetHint: "Add a server to open terminals, browse files and see metrics.",
51103
51067
  noHostsMatchSearch: "No hosts match your search",
51068
+ noHostSelected: "Pick a host to open this.",
51104
51069
  searchHosts: "Search hosts...",
51105
51070
  sortHosts: "Sort Hosts",
51106
51071
  sortDefault: "Default Order",
@@ -51226,12 +51191,12 @@ var en_default = {
51226
51191
  authFieldsAfterSave: "Save the host first, then fill in these fields.",
51227
51192
  enablePluginFeature: "Enable {{name}}",
51228
51193
  disablePluginFeature: "Disable {{name}}",
51229
- filterFeaturesGroup: "Features",
51194
+ filterFeaturesGroup: "Plugins",
51230
51195
  localOnly: "Keep on this device only",
51231
51196
  localOnlyDesc: "This host is not sent to the server and does not appear on your other devices.",
51232
51197
  folderLocalOnly: "Keep on this device only",
51233
51198
  folderLocalOnlyDesc: "This folder and every host in it stay on this device and are not sent to the server.",
51234
- sudoPasswordDesc: "Used when the terminal fills a sudo prompt, and by features that run commands with sudo.",
51199
+ sudoPasswordDesc: "Used when the terminal fills a sudo prompt, and by plugins that run commands with sudo.",
51235
51200
  editorCancel: "Cancel",
51236
51201
  editorSaving: "Saving...",
51237
51202
  editorUpdate: "Update Host",
@@ -51248,23 +51213,15 @@ var en_default = {
51248
51213
  quickActions: "Quick Actions",
51249
51214
  navigation: "Navigation",
51250
51215
  orShortcut: "or",
51251
- hostManager: "Host Manager",
51252
- hostManagerDesc: "Manage, add, or edit hosts",
51253
51216
  addNewHost: "Add New Host",
51254
- addNewHostDesc: "Register a new host",
51255
51217
  adminSettings: "Admin Settings",
51256
- adminSettingsDesc: "Configure system preferences and users",
51257
- userProfile: "User Profile",
51258
- userProfileDesc: "Manage your account and preferences",
51259
51218
  addCredential: "Add Credential",
51260
- addCredentialDesc: "Store SSH keys or passwords",
51261
51219
  recentActivity: "Recent Activity",
51262
51220
  serversAndHosts: "Servers & Hosts",
51263
51221
  noHostsFound: 'No hosts found matching "{{search}}"',
51264
51222
  links: "Links",
51265
51223
  navigate: "Navigate",
51266
51224
  select: "Select",
51267
- toggleWith: "Toggle with",
51268
51225
  pluginActions: "More actions",
51269
51226
  noTargetTab: "No terminal tab is open",
51270
51227
  documentation: "Documentation"
@@ -51299,7 +51256,6 @@ var en_default = {
51299
51256
  unsplit: "Unsplit",
51300
51257
  layouts: "Layouts",
51301
51258
  applyLayout: "Change layout",
51302
- newSplit: "New split",
51303
51259
  maxPanes: "A split can hold up to {{count}} panes",
51304
51260
  dropSplit: "Drop to split",
51305
51261
  dropHere: "Drop to show here",
@@ -51326,16 +51282,10 @@ var en_default = {
51326
51282
  connectedFor: "Connected for {{duration}}",
51327
51283
  connected: "Connected",
51328
51284
  disconnected: "Disconnected",
51329
- closeTab: "Close tab",
51330
- closeConnection: "Close connection",
51331
- forgetTab: "Forget",
51332
- removeBackground: "Remove",
51333
51285
  reconnect: "Reconnect",
51334
- reopenTab: "Reopen",
51335
51286
  sectionOpen: "Open",
51336
51287
  sectionBackground: "Background",
51337
51288
  backgroundDesc: "Sessions persist for {{minutes}} minutes after disconnect and can be reconnected.",
51338
- persisted: "Persisted in background",
51339
51289
  expiresIn: "Expires in {{duration}}",
51340
51290
  search: "Search connections...",
51341
51291
  noSearchResults: "No connections match your search",
@@ -51375,7 +51325,7 @@ var en_default = {
51375
51325
  empty: "No cards. Use Add below to place cards."
51376
51326
  },
51377
51327
  auth: {
51378
- tagline: "Self-hosted, plugin-based server management",
51328
+ tagline: "Self-hosted, plugin-based server management.",
51379
51329
  loginTitle: "Welcome back",
51380
51330
  registerTitle: "Create Account",
51381
51331
  forgotPassword: "Forgot Password?",
@@ -51397,36 +51347,22 @@ var en_default = {
51397
51347
  sshKeyPasswordDescription: "If your SSH key is encrypted, enter the passphrase here.",
51398
51348
  passphraseRequired: "Passphrase Required",
51399
51349
  passphraseRequiredDescription: "The SSH key is encrypted. Please enter the passphrase to unlock it.",
51400
- back: "Back",
51401
- firstUser: "First User",
51402
- firstUserMessage: "You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. If you think this is a mistake, check the docker logs, or create a GitHub issue.",
51403
51350
  external: "External",
51404
51351
  loginWithExternal: "Login with External Provider",
51405
51352
  loginWithExternalDesc: "Login using your configured external identity provider",
51406
- externalNotSupportedInElectron: "External sign-in is not supported in the desktop app yet. Please use the web version.",
51407
51353
  loginWithProvider: "Login with {{name}}",
51408
- orContinueWith: "or continue with",
51409
51354
  resetPasswordButton: "Reset Password",
51410
51355
  sendResetCode: "Send Reset Code",
51411
51356
  resetCodeDesc: "Enter your username to receive a password reset code. The code will be logged in the docker container logs.",
51412
51357
  resetCode: "Reset Code",
51413
51358
  verifyCodeButton: "Verify Code",
51414
- enterResetCode: "Enter the 6-digit code from the docker container logs for user:",
51415
51359
  newPassword: "New Password",
51416
51360
  confirmNewPassword: "Confirm Password",
51417
- enterNewPassword: "Enter your new password for user:",
51418
51361
  signUp: "Sign Up",
51419
- desktopApp: "Desktop App",
51420
- loggingInToDesktopApp: "Logging in to the desktop app",
51421
51362
  loadingServer: "Loading server...",
51422
- dataLossWarning: "Resetting your password this way will delete all your saved SSH hosts, credentials, and other encrypted data. This action cannot be undone. Only use this if you have forgotten your password and are not logged in.",
51423
- authenticationDisabled: "Authentication Disabled",
51424
- authenticationDisabledDesc: "All authentication methods are currently disabled. Please contact your administrator.",
51425
- passwordLoginDisabledDesc: "Password login is disabled. Use a passkey or an external authentication provider.",
51426
- attemptsRemaining: "{{count}} attempts remaining",
51427
- confirmResetDataWipe: "This account has not logged in since the encryption upgrade, so its stored data cannot be recovered without the old password. Resetting will permanently delete its hosts, credentials and snippets. Continue?",
51428
51363
  password: "Password",
51429
51364
  secondFactorUnavailable: "Your account uses a second factor that is not available right now. Contact an admin to reset it.",
51365
+ externalLoginRequired: "This account signs in through single sign-on. Use that button to sign in.",
51430
51366
  secondFactorNoUI: "This second factor cannot be shown on this screen. Contact an admin.",
51431
51367
  serverAuthentication: "Server sign-in",
51432
51368
  minChars: "min. {{min}} characters",
@@ -51456,6 +51392,8 @@ var en_default = {
51456
51392
  databaseConnection: "Could not connect to the database",
51457
51393
  embeddedServerFailed: "Termix's local server could not start",
51458
51394
  unknownError: "Unknown error",
51395
+ syncedHostMissing: "The synced host does not exist on the linked server",
51396
+ linkedServerUnreachable: "The linked server is not reachable",
51459
51397
  loginFailed: "Login failed",
51460
51398
  failedPasswordReset: "Failed to initiate password reset",
51461
51399
  failedVerifyCode: "Failed to verify reset code",
@@ -51469,12 +51407,7 @@ var en_default = {
51469
51407
  requiredField: "This field is required",
51470
51408
  minLength: "Minimum length is {{min}}",
51471
51409
  passwordMismatch: "Passwords do not match",
51472
- passwordLoginDisabled: "Username/password login is currently disabled",
51473
51410
  sessionExpired: "Session expired - please log in again",
51474
- totpRateLimited: "Rate limited: Too many TOTP verification attempts. Please try again later.",
51475
- totpRateLimitedWithTime: "Rate limited: Too many TOTP verification attempts. Please wait {{time}} seconds before trying again.",
51476
- resetCodeRateLimited: "Rate limited: Too many verification attempts. Please try again later.",
51477
- resetCodeRateLimitedWithTime: "Rate limited: Too many verification attempts. Please wait {{time}} seconds before trying again.",
51478
51411
  authTokenSaveFailed: "Failed to save authentication token",
51479
51412
  authTokenMissing: "The server did not return a new authentication token. Please sign in again.",
51480
51413
  failedToLoadServer: "Failed to load server",
@@ -51494,7 +51427,6 @@ var en_default = {
51494
51427
  registrationSuccess: "Registration successful"
51495
51428
  },
51496
51429
  placeholders: {
51497
- language: "Language",
51498
51430
  keyPassword: "key password",
51499
51431
  pastePrivateKey: "Paste your private key here...",
51500
51432
  enterPassword: "Enter your password",
@@ -51507,7 +51439,6 @@ var en_default = {
51507
51439
  },
51508
51440
  dashboard: {
51509
51441
  title: "Dashboard",
51510
- loading: "Loading dashboard...",
51511
51442
  github: "GitHub",
51512
51443
  reportBug: "Report a bug",
51513
51444
  discord: "Discord",
@@ -51515,7 +51446,6 @@ var en_default = {
51515
51446
  donate: "Donate",
51516
51447
  serverOverview: "Server Overview",
51517
51448
  version: "Version",
51518
- upToDate: "Up to Date",
51519
51449
  updateAvailable: "Update Available",
51520
51450
  beta: "Beta",
51521
51451
  uptime: "Uptime",
@@ -51526,7 +51456,6 @@ var en_default = {
51526
51456
  totalCredentials: "Total Credentials",
51527
51457
  recentActivity: "Recent Activity",
51528
51458
  reset: "Reset",
51529
- loadingRecentActivity: "Loading recent activity...",
51530
51459
  noRecentActivity: "No recent activity",
51531
51460
  quickActions: "Quick Actions",
51532
51461
  addHost: "Add Host",
@@ -51534,48 +51463,21 @@ var en_default = {
51534
51463
  adminSettings: "Admin Settings",
51535
51464
  userProfile: "User Profile",
51536
51465
  serverStats: "Server Stats",
51537
- loadingServerStats: "Loading server stats...",
51538
- noServerData: "No server data available",
51539
51466
  customizeLayout: "Customize Dashboard",
51540
- dashboardSettings: "Dashboard Settings",
51541
- enableDisableCards: "Enable/Disable Cards",
51542
- resetLayout: "Reset to Default",
51543
- serverOverviewCard: "Server Overview",
51544
- recentActivityCard: "Recent Activity",
51545
- quickActionsCard: "Quick Actions",
51546
- serverStatsCard: "Server Stats",
51547
- panelMain: "Main",
51548
- panelSide: "Side",
51549
- justNow: "just now",
51550
- activityFileManager: "File manager"
51551
- },
51552
- donation: {
51553
- title: "Enjoying Termix?",
51554
- body: "Termix is free and open source, built and maintained by a two-person team in our spare time. If it's replaced a commercial tool you'd otherwise be paying for, a donation helps cover hosting costs and keeps development going. As of now, donations are crypto only.",
51555
- milestones: "Donations also help fund the time to research and learn what's needed to build features like SAML and Kubernetes support. See the progress on the donate page.",
51556
- cta: "Donate",
51557
- dismiss: "Maybe later"
51467
+ justNow: "just now"
51558
51468
  },
51559
51469
  dashboardTab: {
51560
51470
  stable: "STABLE",
51561
- hostsOnline: "Hosts Online",
51562
51471
  registerNewServer: "Register a new server",
51563
51472
  storeSshKeysOrPasswords: "Store SSH keys or passwords",
51564
51473
  manageUsersAndRoles: "Manage users and roles",
51565
51474
  manageYourAccount: "Manage your account",
51566
51475
  hostStatus: "Host Status",
51567
51476
  noHostsConfigured: "No hosts configured",
51568
- online: "ONLINE",
51569
- offline: "OFFLINE",
51570
51477
  checking: "CHECKING",
51571
- onlineLower: "Online",
51572
- add: "Add:",
51573
51478
  commandPalette: "Command Palette",
51574
51479
  done: "Done",
51575
- editModeInstructions: "Drag cards to reorder. Drag the column divider to resize columns. Drag the bottom edge of a card to change its height. Use the trash button to remove a card.",
51576
- empty: "Empty",
51577
51480
  clear: "Clear",
51578
- viewServerDetails: "View server details",
51579
51481
  dragToResizeColumns: "Drag to resize columns",
51580
51482
  hostsAvailable: "Hosts Available",
51581
51483
  removeSection: "Remove section",
@@ -51727,7 +51629,6 @@ var en_default = {
51727
51629
  noCustomRoles: "No custom roles defined",
51728
51630
  removeRoleFailed: "Failed to remove role",
51729
51631
  assignRoleFailed: "Failed to assign role",
51730
- deleteRoleFailed: "Failed to delete role",
51731
51632
  userAdminAccess: "Administrator",
51732
51633
  userAdminAccessDesc: "Full access to all admin settings",
51733
51634
  userRoles: "Roles",
@@ -51750,7 +51651,6 @@ var en_default = {
51750
51651
  createUserPassword: "Password",
51751
51652
  createUserPasswordHint: "Minimum 6 characters.",
51752
51653
  createUserEnterUsername: "Enter username",
51753
- createUserEnterPassword: "Enter password",
51754
51654
  createUserSubmit: "Create User",
51755
51655
  editUserTitle: "Manage User: {{username}}",
51756
51656
  editUserDesc: "Edit roles, admin status, sessions, and account settings.",
@@ -51781,7 +51681,6 @@ var en_default = {
51781
51681
  unlinkAccountInProgress: "Unlinking...",
51782
51682
  unlinkAccountSuccess: "External sign-in unlinked",
51783
51683
  unlinkAccountFailed: "Failed to unlink external sign-in",
51784
- saving: "Saving...",
51785
51684
  updateRegistrationFailed: "Failed to update registration setting",
51786
51685
  updatePasswordLoginFailed: "Failed to update password login setting",
51787
51686
  updateSecondFactorAfterExternalLoginFailed: "Failed to update second factor setting",
@@ -51863,7 +51762,6 @@ var en_default = {
51863
51762
  importFailed: "Import failed: {{error}}",
51864
51763
  importError: "Database import failed",
51865
51764
  sectionHostDefaults: "Host Defaults",
51866
- minutes: "minutes",
51867
51765
  rolePermissions: {
51868
51766
  count: "{{count}} permissions",
51869
51767
  editAction: "Edit permissions",
@@ -51872,7 +51770,7 @@ var en_default = {
51872
51770
  saveError: "Failed to save role permissions",
51873
51771
  save: "Save",
51874
51772
  saving: "Saving...",
51875
- pluginDisabled: "Feature disabled",
51773
+ pluginDisabled: "Plugin disabled",
51876
51774
  groups: {
51877
51775
  hosts: "Hosts",
51878
51776
  credentials: "Credentials",
@@ -51915,7 +51813,6 @@ var en_default = {
51915
51813
  hostLabel: "Host",
51916
51814
  hostPlaceholder: "192.168.1.1 or example.com",
51917
51815
  portLabel: "Port",
51918
- portPlaceholder: "22",
51919
51816
  usernameLabel: "Username",
51920
51817
  usernamePlaceholder: "username",
51921
51818
  authLabel: "Auth",
@@ -51933,7 +51830,6 @@ var en_default = {
51933
51830
  noTarget: "Nothing installed can connect to this host type"
51934
51831
  },
51935
51832
  keybindings: {
51936
- title: "Keyboard Shortcuts",
51937
51833
  description: "Bind keys to actions in the terminal and the app, or change the built-in shortcuts.",
51938
51834
  defaultsHeading: "Built-in Shortcuts",
51939
51835
  fixedHeading: "App Shortcuts",
@@ -51959,7 +51855,6 @@ var en_default = {
51959
51855
  customize: "Customize",
51960
51856
  resetToDefault: "Reset to default",
51961
51857
  resetAllToDefaults: "Reset all to defaults",
51962
- close: "Close",
51963
51858
  cancel: "Cancel",
51964
51859
  saveBinding: "Save Shortcut",
51965
51860
  saveError: "Failed to save keyboard shortcuts",
@@ -52030,7 +51925,6 @@ var en_default = {
52030
51925
  cliLearnMore: "Learn More",
52031
51926
  deleteAccount: "Delete Account",
52032
51927
  deleteAccountDescription: "Permanently delete your account",
52033
- changeServerDescription: "Switch to a different Termix backend server",
52034
51928
  deleteButton: "Delete",
52035
51929
  deleteAccountPermanent: "This action is permanent and cannot be undone.",
52036
51930
  deleteAccountWarning: "All sessions, hosts, credentials, and settings will be permanently deleted.",
@@ -52044,8 +51938,6 @@ var en_default = {
52044
51938
  keyboardShortcuts: "Keyboard Shortcuts",
52045
51939
  keyboardShortcutsDescription: "Customize terminal copy, paste, and command shortcuts",
52046
51940
  manageShortcuts: "Manage",
52047
- historyTracking: "History Tracking",
52048
- historyTrackingDesc: "Track terminal commands",
52049
51941
  commandPalette: "Command Palette",
52050
51942
  commandPaletteDesc: "Enable keyboard shortcut",
52051
51943
  reopenTabsOnLogin: "Reopen Tabs on Login",
@@ -52058,28 +51950,16 @@ var en_default = {
52058
51950
  sidebarSettingsMoved: "Host sidebar display settings have moved to the Customize sidebar panel, opened from the Hosts toolbar.",
52059
51951
  showHostTags: "Show Host Tags",
52060
51952
  showHostTagsDesc: "Display tags in host list",
52061
- hostTrayOnClick: "Click to Expand Host Actions",
52062
- hostTrayOnClickDesc: "Always show connection buttons; click to expand management options instead of hover",
52063
- compactHostView: "Compact Host View",
52064
- compactHostViewDesc: "Collapse each host to a single line showing only its name and address",
52065
51953
  statusColors: "Real Status Colors",
52066
51954
  statusColorsDesc: "Use green/red for online/offline status instead of the accent color",
52067
51955
  pinAppRail: "Pin App Rail",
52068
51956
  pinAppRailDesc: "Keep the left sidebar app rail always expanded instead of expanding on hover",
52069
- openFullscreenSettings: "Open settings full screen",
52070
- exitFullscreenSettings: "Exit full-screen settings",
52071
51957
  expandAppRailOnHover: "Expand App Rail on Hover",
52072
51958
  expandAppRailOnHoverDesc: "Allow the left sidebar app rail to expand when the pointer moves over it",
52073
51959
  showPinAppRailButton: "Show Pin App Rail Button",
52074
51960
  showPinAppRailButtonDesc: "Show a button in the app rail to pin it open. Off by default.",
52075
51961
  settingsNavigation: "Navigation",
52076
51962
  navigationTabsDesc: "Choose which tabs appear in the app rail",
52077
- showSnippetCommands: "Show Commands",
52078
- showSnippetCommandsDesc: "Show each snippet's command under its name. Turn off for a compact list.",
52079
- foldersCollapsed: "Folders Collapsed",
52080
- foldersCollapsedDesc: "Collapse folders by default",
52081
- confirmExecution: "Confirm Execution",
52082
- confirmExecutionDesc: "Confirm before running snippets",
52083
51963
  settingsUpdates: "Updates",
52084
51964
  disableUpdateChecks: "Disable Update Checks",
52085
51965
  disableUpdateChecksDesc: "Stop checking for updates",
@@ -52169,7 +52049,6 @@ var en_default = {
52169
52049
  }
52170
52050
  }
52171
52051
  },
52172
- terminalToolbar: {},
52173
52052
  plugins: {
52174
52053
  capabilities: {
52175
52054
  "credentials:read": {
@@ -52281,8 +52160,8 @@ var en_default = {
52281
52160
  consequence: "Server settings, not your hosts or credentials."
52282
52161
  },
52283
52162
  "plugins:read": {
52284
- title: "See installed features",
52285
- consequence: "It can see which features are installed and running."
52163
+ title: "See installed plugins",
52164
+ consequence: "It can see which plugins are installed and running."
52286
52165
  },
52287
52166
  "ui:surface": {
52288
52167
  title: "Add its own screens",
@@ -52291,9 +52170,9 @@ var en_default = {
52291
52170
  },
52292
52171
  runtime: {
52293
52172
  needsPlugin: "{{name}} is not available",
52294
- needsUnknownPlugin: "This feature is not available",
52173
+ needsUnknownPlugin: "This plugin is not available",
52295
52174
  disabledHint: "It is turned off on this server.",
52296
- missingHint: "The feature it came from has been removed.",
52175
+ missingHint: "The plugin it came from has been removed.",
52297
52176
  failed: "{{name}} could not start",
52298
52177
  failedHint: "An admin can check the server logs for details.",
52299
52178
  loading: "Loading {{name}}",
@@ -52473,6 +52352,8 @@ var en_default = {
52473
52352
  noneInstalled: "No plugins installed yet. Browse to add some.",
52474
52353
  nothingHere: "Nothing here.",
52475
52354
  nothingHereHint: "Try another category or search.",
52355
+ communitySoon: "Community plugins are coming in a later update. Plugin authors can already submit theirs to the community registry.",
52356
+ communitySubmit: "How to submit",
52476
52357
  upToDate: "Everything is up to date.",
52477
52358
  lastChecked: "Last checked {{time}}",
52478
52359
  updatesReady_one: "{{count}} update ready.",
@@ -52665,7 +52546,7 @@ var en_default = {
52665
52546
  sshCredentials: "Credentials",
52666
52547
  sshFolders: "Folders",
52667
52548
  userPreferences: "Preferences",
52668
- pluginUserSettings: "Feature settings",
52549
+ pluginUserSettings: "Plugin settings",
52669
52550
  sharedHosts: "Hosts shared with you",
52670
52551
  sharedCredentials: "Credentials shared with you",
52671
52552
  vaultProfiles: "Vault profiles",
@@ -52764,7 +52645,7 @@ var en_default = {
52764
52645
  confirmNoChanges: "No existing host changes. New hosts will start with these defaults.",
52765
52646
  menuMyDefaults: "My host defaults",
52766
52647
  folderDefaultsAction: "Folder defaults",
52767
- adminSectionDescription: "Set the defaults every host on this server follows, for every setting a host has, including each feature's. Users and folders can set their own on top, and any host can still use its own value.",
52648
+ adminSectionDescription: "Set the defaults every host on this server follows, for every setting a host has, including each plugin's. Users and folders can set their own on top, and any host can still use its own value.",
52768
52649
  editServerDefaults: "Edit server defaults",
52769
52650
  resetMenu: "Reset",
52770
52651
  resetAll: "Everything to defaults",
@@ -52794,7 +52675,7 @@ var en_default = {
52794
52675
  needsAttention_one: "One thing needs attention.",
52795
52676
  needsAttention_other: "{{count}} things need attention.",
52796
52677
  bandHost: "Host",
52797
- bandFeatures: "Protocols and features",
52678
+ bandFeatures: "Protocols and plugins",
52798
52679
  bandCredential: "Credential",
52799
52680
  sshConnection: "SSH connection",
52800
52681
  errorAddressRequired: "An address is required.",
@@ -1 +1 @@
1
- ["!max-h-[60px]","!mt-0","!opacity-100","!running","**:data-[slot=kbd]:isolate","**:data-[slot=kbd]:relative","**:data-[slot=kbd]:rounded-none","**:data-[slot=kbd]:z-50","*:[a]:hover:text-foreground","*:[a]:underline","*:[a]:underline-offset-3","*:[img:first-child]:rounded-none","*:[img:last-child]:rounded-none","*:[span]:last:flex","*:[span]:last:gap-2","*:[span]:last:items-center","*:data-[slot=alert-description]:text-destructive/90","*:data-[slot=select-value]:flex","*:data-[slot=select-value]:gap-2","*:data-[slot=select-value]:items-center","*:data-[slot=select-value]:line-clamp-1","-bottom-1.5","-left-1.5","-left-px","-mt-0.5","-mt-1","-mt-[3.5px]","-mx-1","-mx-3","-my-1","-right-1.5","-right-2","-right-2.5","-right-px","-top-1.5","-top-[3px]","-translate-x-1/2","-translate-x-px","-translate-y-1/2","2xl:flex","2xl:grid-cols-4","3","@container","@container/card-header","@md:grid-cols-2","[&::-webkit-inner-spin-button]:appearance-none","[&::-webkit-outer-spin-button]:appearance-none","[&::-webkit-scrollbar]:hidden","[&>*:last-child]:border-b-0","[&>*]:h-full","[&>*]:shrink-0","[&>button]:hidden","[&>span:last-child]:truncate","[&>svg]:pointer-events-none","[&>svg]:shrink-0","[&>svg]:size-3","[&>svg]:size-4","[&>svg]:text-current","[&>svg]:text-sidebar-accent-foreground","[&>svg]:translate-y-0.5","[&_[cmdk-group-heading]]:font-medium","[&_[cmdk-group-heading]]:px-2","[&_[cmdk-group-heading]]:py-1.5","[&_[cmdk-group-heading]]:text-muted-foreground","[&_[cmdk-group-heading]]:text-xs","[&_[cmdk-list-sizer]]:flex","[&_[cmdk-list-sizer]]:flex-col","[&_p]:leading-relaxed","[&_svg:not([class*='size-'])]:size-3","[&_svg:not([class*='size-'])]:size-3.5","[&_svg:not([class*='size-'])]:size-4","[&_svg:not([class*='text-'])]:text-muted-foreground","[&_svg]:pointer-events-none","[&_svg]:shrink-0","[&_svg]:size-2.5","[&_svg]:size-3","[&_svg]:size-3.5","[&_svg]:size-4","[.border-b]:pb-4","[.gap-4>&]:border-0","[.gap-4>&]:py-0","[@media(hover:none)]:flex","[[data-side=left][data-collapsible=offcanvas]_&]:-right-2","[[data-side=left][data-state=collapsed]_&]:cursor-e-resize","[[data-side=right][data-collapsible=offcanvas]_&]:-left-2","[[data-side=right][data-state=collapsed]_&]:cursor-w-resize","[a&]:hover:bg-accent","[a&]:hover:bg-destructive/90","[a&]:hover:bg-primary/90","[a&]:hover:bg-secondary/90","[a&]:hover:text-accent-foreground","[a]:hover:bg-primary/80","[animation-duration:900ms]","[appearance:textfield]","[backend:stderr]","[clip-path:inset(0px_-4px_-4px_-4px)]","[contain:content]","[op:http_server_port_conflict]","[scrollbar-width:none]","absolute","accent-[var(--accent-brand)]","active:bg-muted","active:bg-muted/60","active:bg-sidebar-accent","active:cursor-grabbing","active:not-aria-[haspopup]:translate-y-px","active:text-sidebar-accent-foreground","after:-inset-2","after:absolute","after:inset-y-0","after:start-1/2","after:w-[2px]","animate-pulse","animate-spin","appearance-none","aria-disabled:opacity-50","aria-disabled:pointer-events-none","aria-expanded:bg-muted","aria-expanded:bg-secondary","aria-expanded:opacity-100","aria-expanded:text-foreground","aria-expanded:text-secondary-foreground","aria-invalid:border-destructive","aria-invalid:ring-1","aria-invalid:ring-destructive/20","aspect-square","aspect-video","auto-cols-fr","auto-rows-fr","auto-rows-min","before:-top-0.5","before:-top-px","before:absolute","before:bg-accent-brand","before:h-0.5","before:inset-x-0","before:inset-x-1","before:z-20","bg-accent-brand","bg-accent-brand/10","bg-accent-brand/15","bg-accent-brand/20","bg-accent-brand/25","bg-accent-brand/40","bg-accent-brand/5","bg-accent-brand/60","bg-accent-brand/70","bg-accent-brand/[0.07]","bg-accent/30","bg-accent/60","bg-background","bg-background/50","bg-background/60","bg-background/70","bg-background/85","bg-background/90","bg-black","bg-black/10","bg-blue-500/20","bg-border","bg-border/60","bg-canvas","bg-card","bg-clip-padding","bg-destructive","bg-destructive/10","bg-destructive/15","bg-destructive/5","bg-destructive/70","bg-emerald-500","bg-emerald-500/10","bg-foreground","bg-green-500","bg-green-500/10","bg-green-500/70","bg-input","bg-muted","bg-muted-foreground","bg-muted-foreground/15","bg-muted-foreground/20","bg-muted-foreground/25","bg-muted-foreground/30","bg-muted-foreground/40","bg-muted-foreground/50","bg-muted/10","bg-muted/15","bg-muted/20","bg-muted/30","bg-muted/40","bg-muted/50","bg-muted/60","bg-muted/70","bg-muted/[0.08]","bg-overlay","bg-popover","bg-primary","bg-red-400","bg-red-500","bg-red-500/10","bg-red-500/40","bg-secondary","bg-sidebar","bg-sidebar-border","bg-surface","bg-surface-dim/40","bg-surface-dim/60","bg-surface/40","bg-transparent","bg-warning","bg-warning/10","bg-warning/20","bg-warning/40","bg-warning/5","bg-warning/70","block","blur","border","border-0","border-2","border-accent-brand","border-accent-brand/20","border-accent-brand/30","border-accent-brand/40","border-accent-brand/50","border-accent-brand/60","border-accent-brand/70","border-b","border-b-2","border-b-accent-brand","border-border","border-border/30","border-border/40","border-border/50","border-border/60","border-current","border-dashed","border-destructive","border-destructive/20","border-destructive/30","border-destructive/40","border-destructive/50","border-emerald-500/40","border-foreground","border-foreground/10","border-green-500/30","border-green-500/40","border-input","border-l","border-l-2","border-l-transparent","border-muted-foreground/30","border-primary","border-r","border-red-500/40","border-sidebar-border","border-t","border-t-0","border-t-border/40","border-t-muted-foreground/70","border-t-transparent","border-transparent","border-warning/30","border-warning/40","border-x","border-y","bottom-0","bottom-4","break-all","break-words","capitalize","catppuccin","col-span-2","col-start-2","collapse","columns-2","columns-3","com","container","contents","cursor-col-resize","cursor-default","cursor-grab","cursor-not-allowed","cursor-ns-resize","cursor-pointer","cursor-row-resize","dark","dark:aria-invalid:border-destructive/50","dark:aria-invalid:ring-destructive/40","dark:bg-destructive/20","dark:bg-destructive/60","dark:bg-input/30","dark:bg-transparent","dark:border-accent-brand/40","dark:border-input","dark:data-[state=active]:bg-input/30","dark:data-[state=active]:border-input","dark:data-[state=active]:text-foreground","dark:data-[state=checked]:bg-primary","dark:data-[state=checked]:bg-primary-foreground","dark:data-[state=unchecked]:bg-foreground","dark:data-[state=unchecked]:bg-input/80","dark:data-[variant=destructive]:focus:bg-destructive/20","dark:disabled:bg-input/80","dark:focus-visible:ring-destructive/40","dark:hover:bg-accent-brand/10","dark:hover:bg-destructive/10","dark:hover:bg-destructive/30","dark:hover:bg-input/50","dark:hover:bg-muted/50","dark:text-muted-foreground","data-[disabled=true]:opacity-50","data-[disabled=true]:pointer-events-none","data-[disabled]:opacity-50","data-[disabled]:pointer-events-none","data-[orientation=horizontal]:h-1.5","data-[orientation=horizontal]:h-full","data-[orientation=horizontal]:h-px","data-[orientation=horizontal]:w-full","data-[orientation=vertical]:flex-col","data-[orientation=vertical]:h-full","data-[orientation=vertical]:min-h-44","data-[orientation=vertical]:self-center","data-[orientation=vertical]:self-stretch","data-[orientation=vertical]:w-1.5","data-[orientation=vertical]:w-auto","data-[orientation=vertical]:w-full","data-[orientation=vertical]:w-px","data-[placeholder]:text-muted-foreground","data-[selected=true]:bg-muted","data-[selected=true]:text-accent-foreground","data-[side=bottom]:border-t","data-[side=bottom]:bottom-0","data-[side=bottom]:data-closed:slide-out-to-bottom-10","data-[side=bottom]:data-open:slide-in-from-bottom-10","data-[side=bottom]:h-auto","data-[side=bottom]:inset-x-0","data-[side=bottom]:slide-in-from-top-2","data-[side=bottom]:translate-y-1","data-[side=left]:-translate-x-1","data-[side=left]:border-r","data-[side=left]:data-closed:slide-out-to-left-10","data-[side=left]:data-open:slide-in-from-left-10","data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]","data-[side=left]:h-full","data-[side=left]:inset-y-0","data-[side=left]:left-0","data-[side=left]:slide-in-from-right-2","data-[side=left]:sm:max-w-sm","data-[side=left]:w-3/4","data-[side=right]:border-l","data-[side=right]:data-closed:slide-out-to-right-10","data-[side=right]:data-open:slide-in-from-right-10","data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]","data-[side=right]:h-full","data-[side=right]:inset-y-0","data-[side=right]:right-0","data-[side=right]:slide-in-from-left-2","data-[side=right]:sm:max-w-sm","data-[side=right]:translate-x-1","data-[side=right]:w-3/4","data-[side=top]:-translate-y-1","data-[side=top]:border-b","data-[side=top]:data-closed:slide-out-to-top-10","data-[side=top]:data-open:slide-in-from-top-10","data-[side=top]:h-auto","data-[side=top]:inset-x-0","data-[side=top]:slide-in-from-bottom-2","data-[side=top]:top-0","data-[size=default]:h-9","data-[size=md]:text-xs","data-[size=sm]:gap-2","data-[size=sm]:h-8","data-[size=sm]:has-data-[slot=card-footer]:pb-0","data-[size=sm]:py-3","data-[size=sm]:text-xs","data-[state=active]:animate-in","data-[state=active]:bg-background","data-[state=active]:fade-in-0","data-[state=active]:shadow-sm","data-[state=checked]:bg-primary","data-[state=checked]:border-primary","data-[state=checked]:text-primary-foreground","data-[state=checked]:translate-x-[calc(100%-2px)]","data-[state=closed]:animate-out","data-[state=closed]:fade-out-0","data-[state=closed]:overflow-hidden","data-[state=closed]:zoom-out-95","data-[state=delayed-open]:animate-in","data-[state=delayed-open]:fade-in-0","data-[state=delayed-open]:zoom-in-95","data-[state=inactive]:animate-out","data-[state=inactive]:fade-out-0","data-[state=open]:animate-in","data-[state=open]:fade-in-0","data-[state=open]:zoom-in-95","data-[state=unchecked]:bg-input","data-[state=unchecked]:translate-x-0","data-[variant=destructive]:*:[svg]:text-destructive","data-[variant=destructive]:focus:bg-destructive/10","data-[variant=destructive]:focus:text-destructive","data-[variant=destructive]:text-destructive","data-active:bg-sidebar-accent","data-active:font-medium","data-active:text-sidebar-accent-foreground","data-closed:animate-out","data-closed:fade-out-0","data-closed:zoom-out-95","data-disabled:opacity-50","data-disabled:pointer-events-none","data-inset:pl-7","data-open:animate-in","data-open:bg-accent","data-open:fade-in-0","data-open:hover:bg-sidebar-accent","data-open:hover:text-sidebar-accent-foreground","data-open:text-accent-foreground","data-open:zoom-in-95","delay-75","disabled:bg-input/50","disabled:cursor-not-allowed","disabled:opacity-30","disabled:opacity-40","disabled:opacity-50","disabled:opacity-60","disabled:pointer-events-none","divide-border","divide-x","divide-y","dracula","drop-shadow","duration-100","duration-150","duration-200","duration-500","duration-[450ms]","ease-in-out","ease-linear","ease-out","enabled:hover:text-accent-brand","fade-in","file:bg-transparent","file:border-0","file:font-medium","file:h-6","file:inline-flex","file:text-foreground","file:text-xs","fill-foreground","filter","fixed","flex","flex-1","flex-col","flex-col-reverse","flex-row","flex-wrap","focus-visible:border-destructive/40","focus-visible:border-ring","focus-visible:outline-1","focus-visible:outline-hidden","focus-visible:outline-none","focus-visible:outline-ring","focus-visible:relative","focus-visible:ring-0","focus-visible:ring-1","focus-visible:ring-2","focus-visible:ring-4","focus-visible:ring-[#f59145]/40","focus-visible:ring-[3px]","focus-visible:ring-destructive/20","focus-visible:ring-inset","focus-visible:ring-ring","focus-visible:ring-ring/50","focus-visible:z-10","focus-within:border-ring","focus-within:opacity-100","focus-within:ring-1","focus-within:ring-ring","focus-within:ring-ring/50","focus:**:text-accent-foreground","focus:bg-accent","focus:ring-1","focus:ring-ring","focus:text-accent-brand","focus:text-accent-foreground","focus:text-destructive","font-bold","font-heading","font-medium","font-mono","font-normal","font-semibold","fs-lg","fs-md","fs-sm","fs-xl","fs-xs","gap-0","gap-0.5","gap-1","gap-1.5","gap-2","gap-2.5","gap-3","gap-3.5","gap-4","gap-5","gap-6","gap-[1.75px]","gap-[10.5px]","gap-[2px]","gap-[3.5px]","gap-[3px]","gap-px","gap-x-2","gap-x-3","gap-x-4","gap-x-6","gap-y-0","gap-y-0.5","gap-y-1","gap-y-1.5","gap-y-2","gap-y-3","grid","grid-cols-1","grid-cols-2","grid-cols-3","grid-cols-4","grid-cols-6","grid-cols-8","grid-cols-[0_1fr]","grid-cols-[1fr_5rem]","grid-flow-col","group","group-[.toast]:!border-accent-brand/30","group-[.toast]:!border-destructive/30","group-[.toast]:!text-accent-brand","group-[.toast]:!text-destructive","group-[.toast]:bg-accent-brand","group-[.toast]:bg-muted","group-[.toast]:font-semibold","group-[.toast]:text-muted-foreground","group-[.toast]:text-white","group-[.toaster]:bg-card","group-[.toaster]:border-border","group-[.toaster]:font-mono","group-[.toaster]:rounded-none!","group-[.toaster]:shadow-lg","group-[.toaster]:text-card-foreground","group-data-[collapsible=icon]:-mt-8","group-data-[collapsible=icon]:hidden","group-data-[collapsible=icon]:opacity-0","group-data-[collapsible=icon]:overflow-hidden","group-data-[collapsible=icon]:p-0!","group-data-[collapsible=icon]:p-2!","group-data-[collapsible=icon]:size-8!","group-data-[collapsible=icon]:w-(--sidebar-width-icon)","group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]","group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]","group-data-[collapsible=offcanvas]:after:left-full","group-data-[collapsible=offcanvas]:translate-x-0","group-data-[collapsible=offcanvas]:w-0","group-data-[disabled=true]:opacity-50","group-data-[disabled=true]:pointer-events-none","group-data-[selected=true]:opacity-100","group-data-[side=left]:-right-4","group-data-[side=left]:border-r","group-data-[side=right]:border-l","group-data-[side=right]:left-0","group-data-[side=right]:rotate-180","group-data-[size=sm]/card:[.border-b]:pb-3","group-data-[size=sm]/card:p-3","group-data-[size=sm]/card:px-3","group-data-[size=sm]/card:text-sm","group-data-[variant=floating]:ring-1","group-data-[variant=floating]:ring-sidebar-border","group-data-[variant=floating]:rounded-none","group-data-[variant=floating]:shadow-sm","group-focus-within/folder:flex","group-focus-within/menu-item:opacity-100","group-focus-within/row:flex","group-focus/dropdown-menu-item:text-accent-foreground","group-has-data-[sidebar=menu-action]/menu-item:pr-8","group-hover/btn:bg-accent-brand/20","group-hover/btn:border-accent-brand/40","group-hover/folder:flex","group-hover/folder:opacity-100","group-hover/folder:text-muted-foreground/70","group-hover/menu-item:opacity-100","group-hover/open:text-accent-brand","group-hover/resize:bg-accent-brand/60","group-hover/row:flex","group-hover/row:text-muted-foreground/60","group-hover/tab:opacity-100","group-hover:bg-accent-brand/60","group-hover:hidden","group-hover:max-h-[60px]","group-hover:mt-0","group-hover:opacity-100","group-hover:text-muted-foreground/70","group/btn","group/card","group/dropdown-menu-item","group/folder","group/menu-item","group/open","group/resize","group/row","group/tab","grow","gruvbox","h-0","h-0.5","h-1","h-1.5","h-10","h-11","h-12","h-12.5","h-14","h-16","h-2.5","h-20","h-24","h-28","h-3","h-3.5","h-4","h-5","h-6","h-7","h-8","h-9","h-[1.15rem]","h-[136px]","h-[14px]","h-[2px]","h-[3px]","h-[46%]","h-[80vh]","h-[calc(100%-1px)]","h-[var(--radix-select-trigger-height)]","h-full","h-px","h-screen","h-svh","has-[>img:first-child]:pt-0","has-[>svg]:gap-x-3","has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr]","has-[[data-state=open]]:opacity-100","has-data-[icon=inline-end]:pr-1.5","has-data-[icon=inline-end]:pr-2","has-data-[icon=inline-start]:pl-1.5","has-data-[icon=inline-start]:pl-2","has-data-[slot=card-action]:grid-cols-[1fr_auto]","has-data-[slot=card-description]:grid-rows-[auto_auto]","has-data-[slot=card-footer]:pb-0","has-data-[slot=kbd]:pr-1.5","has-data-[variant=inset]:bg-sidebar","hidden","host-status-stripe","hover:after:bg-sidebar-border","hover:bg-accent","hover:bg-accent-brand","hover:bg-accent-brand/10","hover:bg-accent-brand/15","hover:bg-accent-brand/20","hover:bg-accent-brand/40","hover:bg-accent-brand/5","hover:bg-accent-brand/90","hover:bg-background/80","hover:bg-destructive/10","hover:bg-destructive/20","hover:bg-destructive/90","hover:bg-foreground/[0.03]","hover:bg-muted","hover:bg-muted-foreground/10","hover:bg-muted/20","hover:bg-muted/30","hover:bg-muted/40","hover:bg-muted/50","hover:bg-muted/60","hover:bg-secondary/80","hover:bg-sidebar-accent","hover:bg-surface","hover:border-accent-brand","hover:border-accent-brand/30","hover:border-accent-brand/40","hover:border-accent-brand/60","hover:border-destructive/40","hover:border-foreground/40","hover:border-muted-foreground","hover:border-ring/60","hover:group-data-[collapsible=offcanvas]:bg-sidebar","hover:opacity-100","hover:ring-4","hover:ring-[#f59145]/40","hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]","hover:text-accent-brand","hover:text-accent-brand/70","hover:text-accent-brand/80","hover:text-accent-foreground","hover:text-destructive","hover:text-destructive/80","hover:text-foreground","hover:text-muted-foreground","hover:text-primary","hover:text-sidebar-accent-foreground","hover:underline","in-data-[side=left]:cursor-w-resize","in-data-[side=right]:cursor-e-resize","inline","inline-block","inline-flex","inset-0","inset-x-0","inset-x-3","inset-y-0","invisible","isolate","italic","items-baseline","items-center","items-end","items-start","items-stretch","justify-between","justify-center","justify-end","justify-items-start","justify-self-end","justify-start","last:border-0","last:border-b-0","leading-[1.4]","leading-[1.7]","leading-[14px]","leading-none","leading-relaxed","leading-snug","leading-tight","left-0","left-1/2","left-2","left-2.5","left-[50%]","lg:block","lg:col-span-2","lg:flex","lg:grid-cols-1","lg:grid-cols-2","lg:grid-cols-3","lg:grid-cols-4","lg:grid-cols-5","lg:hidden","lg:inline","line-clamp-2","line-clamp-3","line-clamp-4","line-through","list-disc","list-inside","lowercase","ltr:-translate-x-1/2","lucide","m-2.5","m-auto","max-h-(--radix-dropdown-menu-content-available-height)","max-h-(--radix-popover-content-available-height)","max-h-(--radix-select-content-available-height)","max-h-0","max-h-24","max-h-40","max-h-56","max-h-64","max-h-96","max-h-[130px]","max-h-[300px]","max-h-[60px]","max-h-[60vh]","max-h-[80dvh]","max-w-(--skeleton-width)","max-w-0","max-w-2xl","max-w-32","max-w-3xl","max-w-40","max-w-48","max-w-5xl","max-w-72","max-w-96","max-w-[120px]","max-w-[160px]","max-w-[180px]","max-w-[200px]","max-w-[260px]","max-w-[380px]","max-w-[50%]","max-w-[560px]","max-w-[5rem]","max-w-[60%]","max-w-[calc(100%-2rem)]","max-w-full","max-w-lg","max-w-md","max-w-sm","max-w-xl","max-w-xs","mb-0.5","mb-1","mb-1.5","mb-2","mb-4","md:-mx-4","md:after:hidden","md:block","md:col-span-1","md:flex","md:flex-row","md:grid-cols-1","md:grid-cols-2","md:grid-cols-3","md:grid-cols-4","md:hidden","md:max-h-none","md:opacity-0","md:overflow-visible","md:overflow-y-auto","md:peer-data-[variant=inset]:m-2","md:peer-data-[variant=inset]:ml-0","md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2","md:peer-data-[variant=inset]:rounded-none","md:peer-data-[variant=inset]:shadow-sm","md:px-3.5","md:px-4","md:size-4","md:static","md:text-2xl","md:text-xs","md:w-44","md:w-48","md:w-56","md:w-60","md:w-72","min-[280px]:inline","min-h-0","min-h-11","min-h-16","min-h-24","min-h-48","min-h-8","min-h-9","min-h-[19px]","min-h-[220px]","min-h-[80px]","min-h-full","min-h-svh","min-w-(--radix-popover-trigger-width)","min-w-0","min-w-16","min-w-3","min-w-32","min-w-4","min-w-40","min-w-44","min-w-5","min-w-52","min-w-[14px]","min-w-[150px]","min-w-[160px]","min-w-[170px]","min-w-[180px]","min-w-[200px]","min-w-[8rem]","min-w-[96px]","min-w-[var(--radix-select-trigger-width)]","min-w-max","ml-0.5","ml-1","ml-1.5","ml-2","ml-3","ml-3.5","ml-4","ml-8","ml-[27px]","ml-auto","motion-context-enter","motion-fade-enter","motion-interactive","motion-meter","motion-panel-enter","motion-transfer-phase","motion-workspace-enter","motion-workspace-layout","mr-1","mr-1.5","mr-2","mt-0.5","mt-1","mt-1.5","mt-2","mt-2.5","mt-3","mt-4","mt-[1.75px]","mt-auto","mt-px","mx-0.5","mx-2","mx-3.5","mx-4","mx-auto","my-0.5","my-1","my-3","my-auto","nord","normal-case","not-data-[variant=destructive]:focus:**:text-accent-foreground","object-contain","one-dark","opacity-0","opacity-100","opacity-40","opacity-50","opacity-60","opacity-70","opacity-80","origin-(--radix-dropdown-menu-content-transform-origin)","origin-(--radix-popover-content-transform-origin)","origin-(--radix-select-content-transform-origin)","origin-(--radix-tooltip-content-transform-origin)","origin-center","outline","outline-hidden","outline-none","overflow-auto","overflow-hidden","overflow-x-auto","overflow-x-hidden","overflow-y-auto","overflow-y-hidden","overline","p-0","p-0.5","p-1","p-1.5","p-10","p-2","p-2.5","p-3","p-4","p-5","p-6","p-8","p-[3px]","p-px","paused","pb-0","pb-1","pb-1.5","pb-2","pb-3","pb-6","peer","peer-data-[size=default]/menu-button:top-1.5","peer-data-[size=lg]/menu-button:top-2.5","peer-data-[size=sm]/menu-button:top-1","peer-data-active/menu-button:text-sidebar-accent-foreground","peer-disabled:cursor-not-allowed","peer-disabled:opacity-50","peer-hover/menu-button:text-sidebar-accent-foreground","peer/menu-button","pl-1","pl-2","pl-2.5","pl-4","pl-5","pl-5.5","pl-6","pl-7","pl-8","pl-[7px]","pl-[8.75px]","pl-px","placeholder:text-muted-foreground","placeholder:text-muted-foreground/50","pointer-coarse:flex","pointer-coarse:opacity-100","pointer-events-none","pr-0.5","pr-1","pr-1.5","pr-12","pr-2","pr-2.5","pr-7","pr-8","pr-9","pr-[5.25px]","pr-[7px]","pt-0.5","pt-1","pt-1.5","pt-2","pt-2.5","pt-3","pt-4","pt-[15vh]","pt-[3.5px]","pt-[3px]","pt-[5.25px]","px-0","px-0.5","px-1","px-1.5","px-2","px-2.5","px-3","px-3.5","px-4","px-5","px-6","px-[3px]","py-0","py-0.5","py-1","py-1.5","py-10","py-12","py-2","py-2.5","py-3","py-4","py-6","py-8","py-[1px]","py-[2px]","py-[5px]","py-[7px]","py-px","relative","resize","resize-none","right-0","right-1","right-1.5","right-2","right-2.5","right-3","ring","ring-0","ring-1","ring-2","ring-accent-brand","ring-accent-brand/50","ring-border","ring-foreground/10","ring-inset","ring-offset-1","ring-offset-background","ring-sidebar-ring","ring-white/60","rotate-180","rotate-45","rotate-90","rounded","rounded-[inherit]","rounded-full","rounded-none","rounded-sm","row-span-2","row-start-1","rtl:-translate-x-1/2","running","safe-bottom","scale-110","scroll-my-1","scrollbar-none","select-none","self-end","self-start","self-stretch","settings-search-hit","shadow","shadow-2xl","shadow-[0_0_0_1px_hsl(var(--sidebar-border))]","shadow-lg","shadow-md","shadow-none","shadow-sm","shadow-xl","shadow-xs","shrink-0","size-1.5","size-10","size-12","size-2","size-2.5","size-3","size-3.5","size-4","size-5","size-6","size-6.5","size-7","size-8","size-9","size-[10.5px]","size-[17.5px]","size-[19px]","size-[22.75px]","size-full","size-px","sm:border-b-0","sm:border-r","sm:col-span-2","sm:flex","sm:flex-row","sm:grid-cols-12","sm:grid-cols-2","sm:grid-cols-3","sm:grid-cols-4","sm:items-center","sm:justify-end","sm:max-w-4xl","sm:max-w-lg","sm:max-w-sm","sm:mr-auto","sm:py-14","sm:text-left","solarized","space-y-0.5","space-y-1.5","space-y-2","sr-only","static","sticky","stroke-accent-brand","stroke-border","stroke-muted","supports-backdrop-filter:backdrop-blur-xs","tab-1","tab-2","table","tabular-nums","text-2xl","text-[10px]","text-[11px]","text-[12px]","text-[13px]","text-[9px]","text-accent-brand","text-accent-brand/50","text-accent-brand/80","text-accent-foreground","text-background","text-base","text-blue-400","text-blue-500","text-card-foreground","text-center","text-current","text-destructive","text-destructive/80","text-emerald-500","text-foreground","text-foreground-secondary","text-foreground/70","text-foreground/80","text-green-500","text-left","text-lg","text-muted-foreground","text-muted-foreground/0","text-muted-foreground/20","text-muted-foreground/30","text-muted-foreground/35","text-muted-foreground/40","text-muted-foreground/45","text-muted-foreground/50","text-muted-foreground/60","text-muted-foreground/70","text-muted-foreground/80","text-popover-foreground","text-primary","text-primary-foreground","text-red-500","text-right","text-secondary-foreground","text-sidebar-foreground","text-sidebar-foreground/70","text-sm","text-warning","text-white","text-xl","text-xs","text-xs/relaxed","thin-scrollbar","toast","toaster","tokyo-night","top-0","top-1","top-1.5","top-1/2","top-2","top-20","top-3","top-3.5","top-[50%]","touch-none","tracking-[0.35em]","tracking-[0.3em]","tracking-normal","tracking-tight","tracking-wide","tracking-wider","tracking-widest","transfer-progress-fill","transfer-progress-indeterminate","transfer-progress-stalled","transfer-progress-track","transform","transition","transition-[background-color,border-color,box-shadow,opacity]","transition-[color,background-color,border-color,opacity,box-shadow,transform]","transition-[color,box-shadow]","transition-[height,border-color]","transition-[height]","transition-[left,right,width]","transition-[left,top,width,height]","transition-[margin,opacity]","transition-[max-height,opacity,margin]","transition-[opacity,max-width]","transition-[opacity,width]","transition-[padding]","transition-[stroke-dasharray]","transition-[width,height,padding]","transition-[width]","transition-all","transition-colors","transition-none","transition-opacity","transition-shadow","transition-transform","translate-x-0.5","translate-x-4","translate-x-[-50%]","translate-x-px","translate-y-[-1px]","translate-y-[-50%]","translate-y-[calc(-50%_-_2px)]","truncate","underline","underline-offset-2","underline-offset-4","uppercase","visible","w-(--radix-dropdown-menu-trigger-width)","w-(--sidebar-width)","w-0","w-0.5","w-1","w-1.5","w-1/2","w-1/4","w-10","w-11","w-12","w-12.5","w-2","w-2.5","w-2/3","w-20","w-28","w-3","w-3/4","w-4","w-40","w-48","w-5","w-5/6","w-52","w-56","w-6","w-60","w-64","w-72","w-8","w-9","w-[120px]","w-[240px]","w-[2px]","w-[3px]","w-[46%]","w-[min(85vw,360px)]","w-[var(--radix-popover-trigger-width)]","w-auto","w-fit","w-full","w-max","w-px","w-screen","whitespace-normal","whitespace-nowrap","whitespace-pre","whitespace-pre-line","whitespace-pre-wrap","xl:block","xl:flex","xl:grid-cols-1","xl:grid-cols-2","xl:grid-cols-3","xl:grid-cols-4","z-0","z-10","z-20","z-30","z-40","z-50","z-500","z-[10000]","z-[100]","z-[200]","z-[60]","z-[9998]","z-[99999]"]
1
+ ["!max-h-[60px]","!mt-0","!opacity-100","!running","**:data-[slot=kbd]:isolate","**:data-[slot=kbd]:relative","**:data-[slot=kbd]:rounded-none","**:data-[slot=kbd]:z-50","*:[a]:hover:text-foreground","*:[a]:underline","*:[a]:underline-offset-3","*:[img:first-child]:rounded-none","*:[img:last-child]:rounded-none","*:[span]:last:flex","*:[span]:last:gap-2","*:[span]:last:items-center","*:data-[slot=alert-description]:text-destructive/90","*:data-[slot=select-value]:flex","*:data-[slot=select-value]:gap-2","*:data-[slot=select-value]:items-center","*:data-[slot=select-value]:line-clamp-1","-bottom-1.5","-left-1.5","-left-px","-mt-0.5","-mt-1","-mt-[3.5px]","-mx-1","-mx-3","-my-1","-right-1.5","-right-2","-right-2.5","-right-px","-top-1.5","-top-[3px]","-translate-x-1/2","-translate-x-px","-translate-y-1/2","2xl:flex","2xl:grid-cols-4","3","@container","@container/card-header","@md:grid-cols-2","[&::-webkit-inner-spin-button]:appearance-none","[&::-webkit-outer-spin-button]:appearance-none","[&::-webkit-scrollbar]:hidden","[&>*:last-child]:border-b-0","[&>*]:h-full","[&>*]:shrink-0","[&>button]:hidden","[&>span:last-child]:truncate","[&>svg]:pointer-events-none","[&>svg]:shrink-0","[&>svg]:size-3","[&>svg]:size-4","[&>svg]:text-current","[&>svg]:text-sidebar-accent-foreground","[&>svg]:translate-y-0.5","[&_[cmdk-group-heading]]:font-medium","[&_[cmdk-group-heading]]:px-2","[&_[cmdk-group-heading]]:py-1.5","[&_[cmdk-group-heading]]:text-muted-foreground","[&_[cmdk-group-heading]]:text-xs","[&_[cmdk-list-sizer]]:flex","[&_[cmdk-list-sizer]]:flex-col","[&_p]:leading-relaxed","[&_svg:not([class*='size-'])]:size-3","[&_svg:not([class*='size-'])]:size-3.5","[&_svg:not([class*='size-'])]:size-4","[&_svg:not([class*='text-'])]:text-muted-foreground","[&_svg]:pointer-events-none","[&_svg]:shrink-0","[&_svg]:size-2.5","[&_svg]:size-3","[&_svg]:size-3.5","[&_svg]:size-4","[.border-b]:pb-4","[.gap-4>&]:border-0","[.gap-4>&]:py-0","[@media(hover:none)]:flex","[[data-side=left][data-collapsible=offcanvas]_&]:-right-2","[[data-side=left][data-state=collapsed]_&]:cursor-e-resize","[[data-side=right][data-collapsible=offcanvas]_&]:-left-2","[[data-side=right][data-state=collapsed]_&]:cursor-w-resize","[a&]:hover:bg-accent","[a&]:hover:bg-destructive/90","[a&]:hover:bg-primary/90","[a&]:hover:bg-secondary/90","[a&]:hover:text-accent-foreground","[a]:hover:bg-primary/80","[animation-duration:900ms]","[appearance:textfield]","[backend:stderr]","[clip-path:inset(0px_-4px_-4px_-4px)]","[contain:content]","[op:http_server_port_conflict]","[scrollbar-width:none]","absolute","accent-[var(--accent-brand)]","active:bg-muted","active:bg-muted/60","active:bg-sidebar-accent","active:cursor-grabbing","active:not-aria-[haspopup]:translate-y-px","active:text-sidebar-accent-foreground","after:-inset-2","after:absolute","after:inset-y-0","after:start-1/2","after:w-[2px]","animate-pulse","animate-spin","appearance-none","aria-disabled:opacity-50","aria-disabled:pointer-events-none","aria-expanded:bg-muted","aria-expanded:bg-secondary","aria-expanded:opacity-100","aria-expanded:text-foreground","aria-expanded:text-secondary-foreground","aria-invalid:border-destructive","aria-invalid:ring-1","aria-invalid:ring-destructive/20","aspect-square","aspect-video","auto-cols-fr","auto-rows-fr","auto-rows-min","before:-top-0.5","before:-top-px","before:absolute","before:bg-accent-brand","before:h-0.5","before:inset-x-0","before:inset-x-1","before:z-20","bg-accent-brand","bg-accent-brand/10","bg-accent-brand/15","bg-accent-brand/20","bg-accent-brand/25","bg-accent-brand/40","bg-accent-brand/5","bg-accent-brand/60","bg-accent-brand/70","bg-accent-brand/[0.07]","bg-accent/30","bg-accent/60","bg-background","bg-background/50","bg-background/60","bg-background/70","bg-background/85","bg-background/90","bg-black","bg-black/10","bg-blue-500/20","bg-border","bg-border/60","bg-canvas","bg-card","bg-clip-padding","bg-destructive","bg-destructive/10","bg-destructive/15","bg-destructive/5","bg-destructive/70","bg-emerald-500","bg-emerald-500/10","bg-foreground","bg-green-500","bg-green-500/10","bg-green-500/70","bg-input","bg-muted","bg-muted-foreground","bg-muted-foreground/15","bg-muted-foreground/20","bg-muted-foreground/25","bg-muted-foreground/30","bg-muted-foreground/40","bg-muted-foreground/50","bg-muted/10","bg-muted/15","bg-muted/20","bg-muted/30","bg-muted/40","bg-muted/50","bg-muted/60","bg-muted/70","bg-muted/[0.08]","bg-overlay","bg-popover","bg-primary","bg-red-400","bg-red-500","bg-red-500/10","bg-red-500/40","bg-secondary","bg-sidebar","bg-sidebar-border","bg-surface","bg-surface-dim/40","bg-surface-dim/60","bg-surface/40","bg-transparent","bg-warning","bg-warning/10","bg-warning/20","bg-warning/40","bg-warning/5","bg-warning/70","block","blur","border","border-0","border-2","border-accent-brand","border-accent-brand/20","border-accent-brand/30","border-accent-brand/40","border-accent-brand/50","border-accent-brand/60","border-accent-brand/70","border-b","border-b-2","border-b-accent-brand","border-border","border-border/30","border-border/40","border-border/50","border-border/60","border-current","border-dashed","border-destructive","border-destructive/20","border-destructive/30","border-destructive/40","border-destructive/50","border-emerald-500/40","border-foreground","border-foreground/10","border-green-500/30","border-green-500/40","border-input","border-l","border-l-2","border-l-transparent","border-muted-foreground/30","border-primary","border-r","border-red-500/40","border-sidebar-border","border-t","border-t-0","border-t-border/40","border-t-muted-foreground/70","border-t-transparent","border-transparent","border-warning/30","border-warning/40","border-x","border-y","bottom-0","bottom-4","break-all","break-words","capitalize","catppuccin","col-span-2","col-start-2","collapse","columns-2","columns-3","com","container","contents","cursor-col-resize","cursor-default","cursor-grab","cursor-not-allowed","cursor-ns-resize","cursor-pointer","cursor-row-resize","dark","dark:aria-invalid:border-destructive/50","dark:aria-invalid:ring-destructive/40","dark:bg-destructive/20","dark:bg-destructive/60","dark:bg-input/30","dark:bg-transparent","dark:border-accent-brand/40","dark:border-input","dark:data-[state=active]:bg-input/30","dark:data-[state=active]:border-input","dark:data-[state=active]:text-foreground","dark:data-[state=checked]:bg-primary","dark:data-[state=checked]:bg-primary-foreground","dark:data-[state=unchecked]:bg-foreground","dark:data-[state=unchecked]:bg-input/80","dark:data-[variant=destructive]:focus:bg-destructive/20","dark:disabled:bg-input/80","dark:focus-visible:ring-destructive/40","dark:hover:bg-accent-brand/10","dark:hover:bg-destructive/10","dark:hover:bg-destructive/30","dark:hover:bg-input/50","dark:hover:bg-muted/50","dark:text-muted-foreground","data-[disabled=true]:opacity-50","data-[disabled=true]:pointer-events-none","data-[disabled]:opacity-50","data-[disabled]:pointer-events-none","data-[orientation=horizontal]:h-1.5","data-[orientation=horizontal]:h-full","data-[orientation=horizontal]:h-px","data-[orientation=horizontal]:w-full","data-[orientation=vertical]:flex-col","data-[orientation=vertical]:h-full","data-[orientation=vertical]:min-h-44","data-[orientation=vertical]:self-center","data-[orientation=vertical]:self-stretch","data-[orientation=vertical]:w-1.5","data-[orientation=vertical]:w-auto","data-[orientation=vertical]:w-full","data-[orientation=vertical]:w-px","data-[placeholder]:text-muted-foreground","data-[selected=true]:bg-muted","data-[selected=true]:text-accent-foreground","data-[side=bottom]:border-t","data-[side=bottom]:bottom-0","data-[side=bottom]:data-closed:slide-out-to-bottom-10","data-[side=bottom]:data-open:slide-in-from-bottom-10","data-[side=bottom]:h-auto","data-[side=bottom]:inset-x-0","data-[side=bottom]:slide-in-from-top-2","data-[side=bottom]:translate-y-1","data-[side=left]:-translate-x-1","data-[side=left]:border-r","data-[side=left]:data-closed:slide-out-to-left-10","data-[side=left]:data-open:slide-in-from-left-10","data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]","data-[side=left]:h-full","data-[side=left]:inset-y-0","data-[side=left]:left-0","data-[side=left]:slide-in-from-right-2","data-[side=left]:sm:max-w-sm","data-[side=left]:w-3/4","data-[side=right]:border-l","data-[side=right]:data-closed:slide-out-to-right-10","data-[side=right]:data-open:slide-in-from-right-10","data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]","data-[side=right]:h-full","data-[side=right]:inset-y-0","data-[side=right]:right-0","data-[side=right]:slide-in-from-left-2","data-[side=right]:sm:max-w-sm","data-[side=right]:translate-x-1","data-[side=right]:w-3/4","data-[side=top]:-translate-y-1","data-[side=top]:border-b","data-[side=top]:data-closed:slide-out-to-top-10","data-[side=top]:data-open:slide-in-from-top-10","data-[side=top]:h-auto","data-[side=top]:inset-x-0","data-[side=top]:slide-in-from-bottom-2","data-[side=top]:top-0","data-[size=default]:h-9","data-[size=md]:text-xs","data-[size=sm]:gap-2","data-[size=sm]:h-8","data-[size=sm]:has-data-[slot=card-footer]:pb-0","data-[size=sm]:py-3","data-[size=sm]:text-xs","data-[state=active]:animate-in","data-[state=active]:bg-background","data-[state=active]:fade-in-0","data-[state=active]:shadow-sm","data-[state=checked]:bg-primary","data-[state=checked]:border-primary","data-[state=checked]:text-primary-foreground","data-[state=checked]:translate-x-[calc(100%-2px)]","data-[state=closed]:animate-out","data-[state=closed]:fade-out-0","data-[state=closed]:overflow-hidden","data-[state=closed]:zoom-out-95","data-[state=delayed-open]:animate-in","data-[state=delayed-open]:fade-in-0","data-[state=delayed-open]:zoom-in-95","data-[state=inactive]:animate-out","data-[state=inactive]:fade-out-0","data-[state=open]:animate-in","data-[state=open]:fade-in-0","data-[state=open]:zoom-in-95","data-[state=unchecked]:bg-input","data-[state=unchecked]:translate-x-0","data-[variant=destructive]:*:[svg]:text-destructive","data-[variant=destructive]:focus:bg-destructive/10","data-[variant=destructive]:focus:text-destructive","data-[variant=destructive]:text-destructive","data-active:bg-sidebar-accent","data-active:font-medium","data-active:text-sidebar-accent-foreground","data-closed:animate-out","data-closed:fade-out-0","data-closed:zoom-out-95","data-disabled:opacity-50","data-disabled:pointer-events-none","data-inset:pl-7","data-open:animate-in","data-open:bg-accent","data-open:fade-in-0","data-open:hover:bg-sidebar-accent","data-open:hover:text-sidebar-accent-foreground","data-open:text-accent-foreground","data-open:zoom-in-95","delay-75","disabled:bg-input/50","disabled:cursor-not-allowed","disabled:opacity-30","disabled:opacity-40","disabled:opacity-50","disabled:opacity-60","disabled:pointer-events-none","divide-border","divide-x","divide-y","dracula","drop-shadow","duration-100","duration-150","duration-200","duration-500","duration-[450ms]","ease-in-out","ease-linear","ease-out","enabled:hover:text-accent-brand","fade-in","file:bg-transparent","file:border-0","file:font-medium","file:h-6","file:inline-flex","file:text-foreground","file:text-xs","fill-foreground","filter","fixed","flex","flex-1","flex-col","flex-col-reverse","flex-row","flex-wrap","focus-visible:border-destructive/40","focus-visible:border-ring","focus-visible:outline-1","focus-visible:outline-hidden","focus-visible:outline-none","focus-visible:outline-ring","focus-visible:relative","focus-visible:ring-0","focus-visible:ring-1","focus-visible:ring-2","focus-visible:ring-4","focus-visible:ring-[#f59145]/40","focus-visible:ring-[3px]","focus-visible:ring-destructive/20","focus-visible:ring-inset","focus-visible:ring-ring","focus-visible:ring-ring/50","focus-visible:z-10","focus-within:border-ring","focus-within:opacity-100","focus-within:ring-1","focus-within:ring-ring","focus-within:ring-ring/50","focus:**:text-accent-foreground","focus:bg-accent","focus:ring-1","focus:ring-ring","focus:text-accent-brand","focus:text-accent-foreground","focus:text-destructive","font-bold","font-heading","font-medium","font-mono","font-normal","font-semibold","fs-lg","fs-md","fs-sm","fs-xl","fs-xs","gap-0","gap-0.5","gap-1","gap-1.5","gap-2","gap-2.5","gap-3","gap-3.5","gap-4","gap-5","gap-6","gap-[1.75px]","gap-[10.5px]","gap-[2px]","gap-[3.5px]","gap-[3px]","gap-px","gap-x-2","gap-x-3","gap-x-4","gap-x-6","gap-y-0","gap-y-0.5","gap-y-1","gap-y-1.5","gap-y-2","gap-y-3","grid","grid-cols-1","grid-cols-2","grid-cols-3","grid-cols-4","grid-cols-6","grid-cols-8","grid-cols-[0_1fr]","grid-cols-[1fr_5rem]","grid-flow-col","group","group-[.toast]:!border-accent-brand/30","group-[.toast]:!border-destructive/30","group-[.toast]:!text-accent-brand","group-[.toast]:!text-destructive","group-[.toast]:bg-accent-brand","group-[.toast]:bg-muted","group-[.toast]:font-semibold","group-[.toast]:text-muted-foreground","group-[.toast]:text-white","group-[.toaster]:bg-card","group-[.toaster]:border-border","group-[.toaster]:font-mono","group-[.toaster]:rounded-none!","group-[.toaster]:shadow-lg","group-[.toaster]:text-card-foreground","group-data-[collapsible=icon]:-mt-8","group-data-[collapsible=icon]:hidden","group-data-[collapsible=icon]:opacity-0","group-data-[collapsible=icon]:overflow-hidden","group-data-[collapsible=icon]:p-0!","group-data-[collapsible=icon]:p-2!","group-data-[collapsible=icon]:size-8!","group-data-[collapsible=icon]:w-(--sidebar-width-icon)","group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]","group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]","group-data-[collapsible=offcanvas]:after:left-full","group-data-[collapsible=offcanvas]:translate-x-0","group-data-[collapsible=offcanvas]:w-0","group-data-[disabled=true]:opacity-50","group-data-[disabled=true]:pointer-events-none","group-data-[selected=true]:opacity-100","group-data-[side=left]:-right-4","group-data-[side=left]:border-r","group-data-[side=right]:border-l","group-data-[side=right]:left-0","group-data-[side=right]:rotate-180","group-data-[size=sm]/card:[.border-b]:pb-3","group-data-[size=sm]/card:p-3","group-data-[size=sm]/card:px-3","group-data-[size=sm]/card:text-sm","group-data-[variant=floating]:ring-1","group-data-[variant=floating]:ring-sidebar-border","group-data-[variant=floating]:rounded-none","group-data-[variant=floating]:shadow-sm","group-focus-within/folder:flex","group-focus-within/menu-item:opacity-100","group-focus-within/row:flex","group-focus/dropdown-menu-item:text-accent-foreground","group-has-data-[sidebar=menu-action]/menu-item:pr-8","group-hover/btn:bg-accent-brand/20","group-hover/btn:border-accent-brand/40","group-hover/folder:flex","group-hover/folder:opacity-100","group-hover/folder:text-muted-foreground/70","group-hover/menu-item:opacity-100","group-hover/open:text-accent-brand","group-hover/resize:bg-accent-brand/60","group-hover/row:flex","group-hover/row:text-muted-foreground/60","group-hover/tab:opacity-100","group-hover:bg-accent-brand/60","group-hover:hidden","group-hover:max-h-[60px]","group-hover:mt-0","group-hover:opacity-100","group-hover:text-muted-foreground/70","group/btn","group/card","group/dropdown-menu-item","group/folder","group/menu-item","group/open","group/resize","group/row","group/tab","grow","gruvbox","h-0","h-0.5","h-1","h-1.5","h-10","h-11","h-12","h-12.5","h-14","h-16","h-2.5","h-20","h-24","h-28","h-3","h-3.5","h-4","h-5","h-6","h-7","h-8","h-9","h-[1.15rem]","h-[136px]","h-[14px]","h-[2px]","h-[3px]","h-[46%]","h-[calc(100%-1px)]","h-[var(--radix-select-trigger-height)]","h-full","h-px","h-screen","h-svh","has-[>img:first-child]:pt-0","has-[>svg]:gap-x-3","has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr]","has-[[data-state=open]]:opacity-100","has-data-[icon=inline-end]:pr-1.5","has-data-[icon=inline-end]:pr-2","has-data-[icon=inline-start]:pl-1.5","has-data-[icon=inline-start]:pl-2","has-data-[slot=card-action]:grid-cols-[1fr_auto]","has-data-[slot=card-description]:grid-rows-[auto_auto]","has-data-[slot=card-footer]:pb-0","has-data-[slot=kbd]:pr-1.5","has-data-[variant=inset]:bg-sidebar","hidden","host-status-stripe","hover:after:bg-sidebar-border","hover:bg-accent","hover:bg-accent-brand","hover:bg-accent-brand/10","hover:bg-accent-brand/15","hover:bg-accent-brand/20","hover:bg-accent-brand/40","hover:bg-accent-brand/5","hover:bg-accent-brand/90","hover:bg-background/80","hover:bg-destructive/10","hover:bg-destructive/20","hover:bg-destructive/90","hover:bg-foreground/[0.03]","hover:bg-muted","hover:bg-muted-foreground/10","hover:bg-muted/20","hover:bg-muted/30","hover:bg-muted/40","hover:bg-muted/50","hover:bg-muted/60","hover:bg-secondary/80","hover:bg-sidebar-accent","hover:bg-surface","hover:border-accent-brand","hover:border-accent-brand/30","hover:border-accent-brand/40","hover:border-accent-brand/60","hover:border-destructive/40","hover:border-foreground/40","hover:border-muted-foreground","hover:border-ring/60","hover:group-data-[collapsible=offcanvas]:bg-sidebar","hover:opacity-100","hover:ring-4","hover:ring-[#f59145]/40","hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]","hover:text-accent-brand","hover:text-accent-brand/70","hover:text-accent-brand/80","hover:text-accent-foreground","hover:text-destructive","hover:text-destructive/80","hover:text-foreground","hover:text-muted-foreground","hover:text-primary","hover:text-sidebar-accent-foreground","hover:underline","in-data-[side=left]:cursor-w-resize","in-data-[side=right]:cursor-e-resize","inline","inline-block","inline-flex","inset-0","inset-x-0","inset-x-3","inset-y-0","invisible","isolate","italic","items-baseline","items-center","items-end","items-start","items-stretch","justify-between","justify-center","justify-end","justify-items-start","justify-self-end","justify-start","last:border-0","last:border-b-0","leading-[1.4]","leading-[1.7]","leading-[14px]","leading-none","leading-relaxed","leading-snug","leading-tight","left-0","left-1/2","left-2","left-2.5","left-[50%]","lg:block","lg:col-span-2","lg:flex","lg:grid-cols-1","lg:grid-cols-2","lg:grid-cols-3","lg:grid-cols-4","lg:grid-cols-5","lg:hidden","lg:inline","line-clamp-2","line-clamp-3","line-clamp-4","line-through","list-disc","list-inside","lowercase","ltr:-translate-x-1/2","lucide","m-2.5","m-auto","max-h-(--radix-dropdown-menu-content-available-height)","max-h-(--radix-popover-content-available-height)","max-h-(--radix-select-content-available-height)","max-h-0","max-h-24","max-h-40","max-h-56","max-h-64","max-h-96","max-h-[130px]","max-h-[300px]","max-h-[60px]","max-h-[60vh]","max-h-[80dvh]","max-w-(--skeleton-width)","max-w-0","max-w-2xl","max-w-32","max-w-3xl","max-w-40","max-w-48","max-w-5xl","max-w-72","max-w-96","max-w-[120px]","max-w-[160px]","max-w-[180px]","max-w-[200px]","max-w-[260px]","max-w-[380px]","max-w-[50%]","max-w-[560px]","max-w-[5rem]","max-w-[60%]","max-w-[calc(100%-2rem)]","max-w-full","max-w-lg","max-w-md","max-w-sm","max-w-xl","max-w-xs","mb-0.5","mb-1","mb-1.5","mb-2","mb-4","md:-mx-4","md:after:hidden","md:block","md:col-span-1","md:flex","md:flex-row","md:grid-cols-1","md:grid-cols-2","md:grid-cols-3","md:grid-cols-4","md:hidden","md:max-h-none","md:opacity-0","md:overflow-visible","md:overflow-y-auto","md:peer-data-[variant=inset]:m-2","md:peer-data-[variant=inset]:ml-0","md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2","md:peer-data-[variant=inset]:rounded-none","md:peer-data-[variant=inset]:shadow-sm","md:px-3.5","md:px-4","md:size-4","md:static","md:text-2xl","md:text-xs","md:w-44","md:w-48","md:w-56","md:w-60","md:w-72","min-[280px]:inline","min-h-0","min-h-11","min-h-16","min-h-24","min-h-48","min-h-8","min-h-9","min-h-[19px]","min-h-[220px]","min-h-[70vh]","min-h-[80px]","min-h-full","min-h-svh","min-w-(--radix-popover-trigger-width)","min-w-0","min-w-16","min-w-3","min-w-32","min-w-4","min-w-40","min-w-44","min-w-5","min-w-52","min-w-[14px]","min-w-[150px]","min-w-[160px]","min-w-[170px]","min-w-[180px]","min-w-[200px]","min-w-[8rem]","min-w-[96px]","min-w-[var(--radix-select-trigger-width)]","min-w-max","ml-0.5","ml-1","ml-1.5","ml-2","ml-3","ml-3.5","ml-4","ml-8","ml-[27px]","ml-auto","motion-context-enter","motion-fade-enter","motion-interactive","motion-meter","motion-panel-enter","motion-transfer-phase","motion-workspace-enter","motion-workspace-layout","mr-1","mr-1.5","mr-2","mt-0.5","mt-1","mt-1.5","mt-2","mt-2.5","mt-3","mt-4","mt-[1.75px]","mt-auto","mt-px","mx-0.5","mx-2","mx-3.5","mx-4","mx-auto","my-0.5","my-1","my-3","my-auto","nord","normal-case","not-data-[variant=destructive]:focus:**:text-accent-foreground","object-contain","one-dark","opacity-0","opacity-100","opacity-40","opacity-50","opacity-60","opacity-70","opacity-80","origin-(--radix-dropdown-menu-content-transform-origin)","origin-(--radix-popover-content-transform-origin)","origin-(--radix-select-content-transform-origin)","origin-(--radix-tooltip-content-transform-origin)","origin-center","outline","outline-hidden","outline-none","overflow-auto","overflow-hidden","overflow-x-auto","overflow-x-hidden","overflow-y-auto","overflow-y-hidden","overline","p-0","p-0.5","p-1","p-1.5","p-10","p-2","p-2.5","p-3","p-4","p-5","p-6","p-8","p-[3px]","p-px","paused","pb-0","pb-1","pb-1.5","pb-2","pb-3","pb-6","peer","peer-data-[size=default]/menu-button:top-1.5","peer-data-[size=lg]/menu-button:top-2.5","peer-data-[size=sm]/menu-button:top-1","peer-data-active/menu-button:text-sidebar-accent-foreground","peer-disabled:cursor-not-allowed","peer-disabled:opacity-50","peer-hover/menu-button:text-sidebar-accent-foreground","peer/menu-button","pl-1","pl-2","pl-2.5","pl-4","pl-5","pl-5.5","pl-6","pl-7","pl-8","pl-[7px]","pl-[8.75px]","pl-px","placeholder:text-muted-foreground","placeholder:text-muted-foreground/50","pointer-coarse:flex","pointer-coarse:opacity-100","pointer-events-none","pr-0.5","pr-1","pr-1.5","pr-12","pr-2","pr-2.5","pr-7","pr-8","pr-9","pr-[5.25px]","pr-[7px]","pt-0.5","pt-1","pt-1.5","pt-2","pt-2.5","pt-3","pt-4","pt-[15vh]","pt-[3.5px]","pt-[3px]","pt-[5.25px]","px-0","px-0.5","px-1","px-1.5","px-2","px-2.5","px-3","px-3.5","px-4","px-5","px-6","px-[3px]","py-0","py-0.5","py-1","py-1.5","py-10","py-12","py-2","py-2.5","py-3","py-4","py-6","py-8","py-[1px]","py-[2px]","py-[5px]","py-[7px]","py-px","relative","resize","resize-none","right-0","right-1","right-1.5","right-2","right-2.5","right-3","ring","ring-0","ring-1","ring-2","ring-accent-brand","ring-accent-brand/50","ring-border","ring-foreground/10","ring-inset","ring-offset-1","ring-offset-background","ring-sidebar-ring","ring-white/60","rotate-180","rotate-45","rotate-90","rounded","rounded-[inherit]","rounded-full","rounded-none","rounded-sm","row-span-2","row-start-1","rtl:-translate-x-1/2","running","safe-bottom","scale-110","scroll-my-1","scrollbar-none","select-none","self-end","self-start","self-stretch","settings-search-hit","shadow","shadow-2xl","shadow-[0_0_0_1px_hsl(var(--sidebar-border))]","shadow-lg","shadow-md","shadow-none","shadow-sm","shadow-xl","shadow-xs","shrink-0","size-1.5","size-10","size-12","size-2","size-2.5","size-3","size-3.5","size-4","size-5","size-6","size-6.5","size-7","size-8","size-9","size-[10.5px]","size-[17.5px]","size-[19px]","size-[22.75px]","size-full","size-px","sm:border-b-0","sm:border-r","sm:col-span-2","sm:flex","sm:flex-row","sm:grid-cols-12","sm:grid-cols-2","sm:grid-cols-3","sm:grid-cols-4","sm:items-center","sm:justify-end","sm:max-w-lg","sm:max-w-sm","sm:mr-auto","sm:py-14","sm:text-left","solarized","space-y-0.5","space-y-1.5","space-y-2","sr-only","static","sticky","stroke-accent-brand","stroke-border","stroke-muted","supports-backdrop-filter:backdrop-blur-xs","tab-1","tab-2","table","tabular-nums","text-2xl","text-[10px]","text-[11px]","text-[12px]","text-[13px]","text-[9px]","text-accent-brand","text-accent-brand/50","text-accent-brand/80","text-accent-foreground","text-background","text-base","text-blue-400","text-blue-500","text-card-foreground","text-center","text-current","text-destructive","text-destructive/80","text-emerald-500","text-foreground","text-foreground-secondary","text-foreground/70","text-foreground/80","text-green-500","text-left","text-lg","text-muted-foreground","text-muted-foreground/0","text-muted-foreground/20","text-muted-foreground/30","text-muted-foreground/35","text-muted-foreground/40","text-muted-foreground/45","text-muted-foreground/50","text-muted-foreground/60","text-muted-foreground/70","text-muted-foreground/80","text-popover-foreground","text-primary","text-primary-foreground","text-red-500","text-right","text-secondary-foreground","text-sidebar-foreground","text-sidebar-foreground/70","text-sm","text-warning","text-white","text-xl","text-xs","text-xs/relaxed","thin-scrollbar","toast","toaster","tokyo-night","top-0","top-1","top-1.5","top-1/2","top-2","top-20","top-3","top-3.5","top-[50%]","touch-none","tracking-[0.35em]","tracking-[0.3em]","tracking-normal","tracking-tight","tracking-wide","tracking-wider","tracking-widest","transfer-progress-fill","transfer-progress-indeterminate","transfer-progress-stalled","transfer-progress-track","transform","transition","transition-[background-color,border-color,box-shadow,opacity]","transition-[color,background-color,border-color,opacity,box-shadow,transform]","transition-[color,box-shadow]","transition-[height,border-color]","transition-[height]","transition-[left,right,width]","transition-[left,top,width,height]","transition-[margin,opacity]","transition-[max-height,opacity,margin]","transition-[opacity,max-width]","transition-[opacity,width]","transition-[padding]","transition-[stroke-dasharray]","transition-[width,height,padding]","transition-[width]","transition-all","transition-colors","transition-none","transition-opacity","transition-shadow","transition-transform","translate-x-0.5","translate-x-4","translate-x-[-50%]","translate-x-px","translate-y-[-1px]","translate-y-[-50%]","translate-y-[calc(-50%_-_2px)]","truncate","underline","underline-offset-2","underline-offset-4","uppercase","visible","w-(--radix-dropdown-menu-trigger-width)","w-(--sidebar-width)","w-0","w-0.5","w-1","w-1.5","w-1/2","w-1/4","w-10","w-11","w-12","w-12.5","w-2","w-2.5","w-2/3","w-20","w-28","w-3","w-3/4","w-4","w-40","w-48","w-5","w-5/6","w-52","w-56","w-6","w-60","w-64","w-72","w-8","w-9","w-[240px]","w-[2px]","w-[3px]","w-[46%]","w-[min(85vw,360px)]","w-[var(--radix-popover-trigger-width)]","w-auto","w-fit","w-full","w-max","w-px","w-screen","whitespace-normal","whitespace-nowrap","whitespace-pre","whitespace-pre-line","whitespace-pre-wrap","xl:block","xl:flex","xl:grid-cols-1","xl:grid-cols-2","xl:grid-cols-3","xl:grid-cols-4","z-0","z-10","z-20","z-30","z-40","z-50","z-500","z-[10000]","z-[100]","z-[200]","z-[60]","z-[9998]","z-[99999]"]
@@ -3,7 +3,7 @@ import {
3
3
  SYNC_CHANGED_EVENT,
4
4
  getLinkedSession,
5
5
  notifySyncChanged
6
- } from "./chunk-F5RZH6HE.js";
6
+ } from "./chunk-OEOKIKXC.js";
7
7
  import "./chunk-YC2MAKSP.js";
8
8
  export {
9
9
  SYNC_CHANGED_EVENT,
@@ -23,7 +23,7 @@ import {
23
23
  shareHost,
24
24
  updateHostAccess,
25
25
  updateRole
26
- } from "./chunk-F5RZH6HE.js";
26
+ } from "./chunk-OEOKIKXC.js";
27
27
  import "./chunk-YC2MAKSP.js";
28
28
  export {
29
29
  assignRoleToUser,
@@ -40,16 +40,16 @@ import {
40
40
  setShellCallbacks,
41
41
  setShellHosts,
42
42
  setShellLayoutProvider
43
- } from "./chunk-RU4E5XLY.js";
43
+ } from "./chunk-VETPF5WI.js";
44
44
  import {
45
45
  setPermissionsForTesting
46
- } from "./chunk-O2OHNVFX.js";
46
+ } from "./chunk-KOOUKYW3.js";
47
47
  import {
48
48
  getTabType,
49
49
  listTabTypes,
50
50
  setFrontendState,
51
51
  setPluginSummaries
52
- } from "./chunk-F5RZH6HE.js";
52
+ } from "./chunk-OEOKIKXC.js";
53
53
  import "./chunk-YC2MAKSP.js";
54
54
 
55
55
  // src/ui/plugin-host/testing-host.tsx
@@ -2,7 +2,7 @@
2
2
  * Credential sidebar preferences model. Shared by the frontend sidebar and
3
3
  * the backend preferences endpoint (no framework imports, mirrors
4
4
  * ./host-sidebar-preferences.ts's dependency-free convention). Independent
5
- * from HostSidebarPreferences by design — a separate parallel system, not a
5
+ * from HostSidebarPreferences by design, a separate parallel system, not a
6
6
  * shared blob, matching how credentialSortKey/credentialFilterState were
7
7
  * already independently namespaced from hostSortKey/etc. before this port.
8
8
  *
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Extract a stable, human-readable message from an unknown thrown value.
3
3
  *
4
- * A thrown value is not guaranteed to be an `Error` — libraries may throw
4
+ * A thrown value is not guaranteed to be an `Error`, libraries may throw
5
5
  * strings or plain objects, which carry no useful `.message`. When that
6
6
  * happens the caller gets `fallback` instead, so error paths never surface a
7
7
  * raw `[object Object]` in logs or UI.
@@ -66,7 +66,6 @@ export interface UserInfo {
66
66
  is_dual_auth?: boolean;
67
67
  password_hash?: string;
68
68
  data_unlocked?: boolean;
69
- show_donation_modal?: boolean;
70
69
  /** On a desktop linked to a server, the account it is signed in to there. */
71
70
  linked?: LinkedAccountInfo | null;
72
71
  }
@@ -121,7 +120,6 @@ export declare function logoutUser(): Promise<{
121
120
  message: string;
122
121
  }>;
123
122
  export declare function getUserInfo(): Promise<UserInfo>;
124
- export declare function dismissDonationModal(): Promise<void>;
125
123
  export declare function getCurrentToken(): Promise<string | null>;
126
124
  export declare function unlockUserData(password: string): Promise<{
127
125
  success: boolean;
package/dist/host/ui.js CHANGED
@@ -138,8 +138,8 @@ import {
138
138
  useSurfaceKind,
139
139
  useTheme,
140
140
  verifySecondFactor
141
- } from "./chunk-RU4E5XLY.js";
142
- import "./chunk-O2OHNVFX.js";
141
+ } from "./chunk-VETPF5WI.js";
142
+ import "./chunk-KOOUKYW3.js";
143
143
  import {
144
144
  TabProvider,
145
145
  buildOriginWsUrl,
@@ -178,7 +178,7 @@ import {
178
178
  useTabs,
179
179
  useTabsSafe,
180
180
  verifyPasswordResetCode
181
- } from "./chunk-F5RZH6HE.js";
181
+ } from "./chunk-OEOKIKXC.js";
182
182
  import "./chunk-YC2MAKSP.js";
183
183
 
184
184
  // src/ui/components/alert.tsx
@@ -4428,6 +4428,13 @@ function syncPlugins(summaries) {
4428
4428
  import.meta.hot?.on("termix:plugins-reloaded", () => {
4429
4429
  if (started) void syncPlugins();
4430
4430
  });
4431
+ function installLocaleResolver() {
4432
+ setPluginLocaleResolver((namespace, _language, file) => {
4433
+ const summary = getPluginRecord(namespace)?.summary;
4434
+ if (!summary) return Promise.resolve(null);
4435
+ return currentDeps().loadLocale(summary, file);
4436
+ });
4437
+ }
4431
4438
  async function fetchPreLoginPlugins() {
4432
4439
  const response = await fetch(getBackendUrl("/plugins/public-manifest"));
4433
4440
  if (!response.ok) return [];
@@ -4443,11 +4450,7 @@ async function startPreLoginPlugins(options = {}) {
4443
4450
  return;
4444
4451
  }
4445
4452
  if (list.length === 0 || started) return;
4446
- setPluginLocaleResolver((namespace, _language, file) => {
4447
- const summary = getPluginRecord(namespace)?.summary;
4448
- if (!summary) return Promise.resolve(null);
4449
- return currentDeps().loadLocale(summary, file);
4450
- });
4453
+ installLocaleResolver();
4451
4454
  await enqueue(async () => {
4452
4455
  if (started) return;
4453
4456
  if (options.retryFailed) {
@@ -5028,6 +5031,10 @@ function Auth({ onLogin }) {
5028
5031
  toast2.error(t2("auth.secondFactorUnavailable"));
5029
5032
  return;
5030
5033
  }
5034
+ if (error?.response?.data?.code === "external_login_required") {
5035
+ toast2.error(t2("auth.externalLoginRequired"));
5036
+ return;
5037
+ }
5031
5038
  toast2.error(
5032
5039
  error?.response?.data?.error || error?.message || t2(fallbackKey)
5033
5040
  );
@@ -7,7 +7,7 @@ import {
7
7
  resetPermissionsCache,
8
8
  setPermissionsForTesting,
9
9
  usePermissions
10
- } from "./chunk-O2OHNVFX.js";
10
+ } from "./chunk-KOOUKYW3.js";
11
11
  import "./chunk-YC2MAKSP.js";
12
12
  export {
13
13
  hasPermission,
@@ -17,7 +17,7 @@ export function execCommand(client, command, timeoutMs = 30000) {
17
17
  if (!settled) {
18
18
  settled = true;
19
19
  cleanup();
20
- reject(new Error(`Command timeout after ${timeoutMs}ms: ${command}`));
20
+ reject(new Error(`Command timeout after ${timeoutMs}ms`));
21
21
  }
22
22
  }, timeoutMs);
23
23
  const cleanup = () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@termix-ssh/plugin-sdk",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "The contract between Termix core and a plugin: types, the capability catalog and the manifest schema.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -148,6 +148,18 @@
148
148
  },
149
149
  "@testing-library/react": {
150
150
  "optional": true
151
+ },
152
+ "i18next": {
153
+ "optional": true
154
+ },
155
+ "react-dom": {
156
+ "optional": true
157
+ },
158
+ "react-i18next": {
159
+ "optional": true
160
+ },
161
+ "sonner": {
162
+ "optional": true
151
163
  }
152
164
  },
153
165
  "publishConfig": {