@linxin666/dsh-ssh 0.3.11 → 0.3.13

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/lib/client.js CHANGED
@@ -7,9 +7,9 @@ window.__ModuleLoader__.load({
7
7
  //#region \0rolldown/runtime.js
8
8
  var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
9
9
  //#endregion
10
- let react_dom_client = require("react-dom/client");
11
10
  let react = require("react");
12
11
  let react_jsx_runtime = require("react/jsx-runtime");
12
+ let react_dom_client = require("react-dom/client");
13
13
  //#region src/protocol.ts
14
14
  const SSH_API = {
15
15
  hosts: "/api/dsh-ssh/hosts",
@@ -690,7 +690,7 @@ window.__ModuleLoader__.load({
690
690
  //#endregion
691
691
  //#region \0dsh-css:packages/dsh-ssh/src/client/panel/panel.module.css.mjs
692
692
  const css = "[data-pane=conversation],[class*=centerCol]{position:relative}[data-dsh-ssh-view]{z-index:60;background:var(--dsw-alias-bg-base);display:none;position:absolute;inset:0}html[data-dsh-ssh-active]:not([data-dsh-taskboard-active]) [data-dsh-ssh-view]{display:block}html[data-dsh-ssh-active]:not([data-dsh-taskboard-active]) [data-pane=conversation]>:not([data-dsh-ssh-view]),html[data-dsh-ssh-active]:not([data-dsh-taskboard-active]) [class*=centerCol]>:not([data-dsh-ssh-view]){display:none!important}.mL8Uca_entry{box-sizing:border-box;width:100%;min-height:36px;color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:8px;align-items:center;gap:10px;padding:0 10px;font-size:13px;display:flex}.mL8Uca_entry:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.mL8Uca_entry[data-active]{background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-label-primary);font-weight:600}.mL8Uca_entryIcon{flex:none;justify-content:center;align-items:center;width:24px;height:24px;display:inline-flex}.mL8Uca_entryIcon svg{width:18px;height:18px;display:block}.mL8Uca_entryLabel{text-overflow:ellipsis;overflow:hidden}[data-dsh-frame][data-sidebar-collapsed] .mL8Uca_entry,[data-sidebar-collapsed] .mL8Uca_entry{border-radius:50%;justify-content:center;width:36px;min-height:36px;margin:0 auto 12px;padding:0}[data-dsh-frame][data-sidebar-collapsed] .mL8Uca_entryLabel,[data-sidebar-collapsed] .mL8Uca_entryLabel{display:none}.mL8Uca_view{overflow:hidden}.mL8Uca_panel{background:var(--dsw-alias-bg-base);min-width:0;height:100%;min-height:0;color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-family);flex-direction:column;gap:10px;padding:14px 16px 16px;display:flex}.mL8Uca_panelHeader{flex:none;align-items:center;gap:10px;display:flex}.mL8Uca_panelTitle{color:var(--dsw-alias-label-primary);white-space:nowrap;flex:1;margin:0;font-size:16px;font-weight:700}.mL8Uca_backButton{align-items:center;gap:4px;display:inline-flex}.mL8Uca_tabBar{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;gap:2px;display:flex}.mL8Uca_tab{color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-bottom:2px solid #0000;border-radius:6px 6px 0 0;padding:7px 14px;font-size:13px}.mL8Uca_tab:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}.mL8Uca_tab[data-active]{color:var(--dsw-alias-label-primary);border-bottom-color:var(--dsw-alias-state-business-primary);font-weight:600}.mL8Uca_panelContent{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.mL8Uca_tabBody{flex-direction:column;flex:1;gap:10px;min-height:0;display:flex;overflow-y:auto}.mL8Uca_fillBody{flex-direction:column;flex:1;gap:10px;min-height:0;display:flex;overflow:hidden}.mL8Uca_toolbar,.mL8Uca_controls{flex-wrap:wrap;flex:none;align-items:center;gap:8px;display:flex}.mL8Uca_controls .mL8Uca_input{flex:0 260px;min-width:150px}.mL8Uca_toolbarSpacer{flex:1}.mL8Uca_search{min-width:120px;color:var(--dsw-alias-label-primary);background:var(--dsw-specific-input-major);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;outline:none;flex:0 260px;padding:6px 10px;font-size:13px}.mL8Uca_search::placeholder{color:var(--dsw-alias-label-tertiary)}.mL8Uca_groupBySelect{color:var(--dsw-alias-label-primary);background:var(--dsw-specific-input-major);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;outline:none;padding:6px 8px;font-size:13px}.mL8Uca_groupSection+.mL8Uca_groupSection{border-top:1px solid var(--dsw-alias-border-l1)}.mL8Uca_groupHeader{background:var(--dsw-alias-bg-base,var(--dsw-specific-input-major));align-items:center;gap:8px;padding:4px 8px;display:flex;position:sticky;top:0}.mL8Uca_groupToggle{min-width:0;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;background:0 0;border:none;border-radius:6px;flex:1;align-items:center;gap:6px;padding:4px 6px;font-size:12.5px;font-weight:500;display:flex}.mL8Uca_groupToggle:hover{background:var(--dsw-alias-interactive-bg-hover)}.mL8Uca_groupChevron{border-right:1.5px solid var(--dsw-alias-label-tertiary);border-bottom:1.5px solid var(--dsw-alias-label-tertiary);flex:none;width:7px;height:7px;margin-bottom:2px;transition:transform .12s;transform:rotate(45deg)}.mL8Uca_groupChevron[data-collapsed]{margin-bottom:0;transform:rotate(-45deg)}.mL8Uca_groupName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mL8Uca_groupCount{color:var(--dsw-alias-label-tertiary);flex:none;font-weight:400}.mL8Uca_tableWrap{border:1px solid var(--dsw-alias-border-l1);border-radius:10px;flex:1;min-height:0;overflow:auto}.mL8Uca_table{border-collapse:collapse;width:100%;font-size:12.5px}.mL8Uca_table th{z-index:1;text-align:left;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);border-bottom:1px solid var(--dsw-alias-border-l1);white-space:nowrap;padding:8px 10px;font-weight:600;position:sticky;top:0}.mL8Uca_table td{border-bottom:1px solid var(--dsw-alias-separator-primary);vertical-align:top;padding:7px 10px}.mL8Uca_table tbody tr:last-child td{border-bottom:none}.mL8Uca_table tbody tr:hover td{background:var(--dsw-alias-interactive-bg-hover)}.mL8Uca_mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.mL8Uca_cellMuted{color:var(--dsw-alias-label-tertiary)}.mL8Uca_actions{white-space:nowrap;align-items:center;gap:8px;display:flex}.mL8Uca_inlineTest{color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-size:11.5px;display:inline-flex}.mL8Uca_inlineTest[data-status=ok]{color:var(--dsw-alias-state-success-primary)}.mL8Uca_inlineTest[data-status=fail]{color:var(--dsw-alias-state-error-primary)}.mL8Uca_badge{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);white-space:nowrap;border-radius:999px;padding:1px 8px;font-size:11px;line-height:1.6;display:inline-block}.mL8Uca_badge[data-kind=key]{color:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary)}.mL8Uca_badge[data-kind=password]{color:var(--dsw-alias-state-warn-primary);border-color:var(--dsw-alias-state-warn-primary)}.mL8Uca_badge[data-kind=agent],.mL8Uca_badge[data-status=ok]{color:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary)}.mL8Uca_badge[data-status=fail]{color:var(--dsw-alias-state-error-primary);border-color:var(--dsw-alias-state-error-primary)}.mL8Uca_badge[data-status=timeout]{color:var(--dsw-alias-state-warn-primary);border-color:var(--dsw-alias-state-warn-primary)}.mL8Uca_primaryButton{color:var(--dsw-alias-label-primary-foreground);background:var(--dsw-alias-button-info-fill);cursor:pointer;white-space:nowrap;border:none;border-radius:8px;padding:6px 14px;font-size:13px;font-weight:600}.mL8Uca_primaryButton:hover:not(:disabled){background:var(--dsw-alias-button-info-hover)}.mL8Uca_primaryButton:disabled{opacity:.5;cursor:default}.mL8Uca_ghostButton{color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;padding:5px 12px;font-size:12px}.mL8Uca_ghostButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.mL8Uca_ghostButton:disabled{opacity:.45;cursor:default}.mL8Uca_iconButton{width:26px;height:26px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:0;font-size:13px;display:inline-flex}.mL8Uca_iconButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.mL8Uca_linkButton{color:var(--dsw-alias-state-business-primary);cursor:pointer;white-space:nowrap;background:0 0;border:none;padding:0;font-size:12px}.mL8Uca_linkButton:hover:not(:disabled){text-decoration:underline}.mL8Uca_linkButton:disabled{opacity:.45;cursor:default}.mL8Uca_linkButton[data-danger]{color:var(--dsw-alias-state-error-primary)}.mL8Uca_spinner{border:2px solid var(--dsw-alias-state-business-primary);vertical-align:-1px;border-top-color:#0000;border-radius:50%;flex:none;width:11px;height:11px;animation:.8s linear infinite mL8Uca_dshSshSpin;display:inline-block}@keyframes mL8Uca_dshSshSpin{to{transform:rotate(360deg)}}.mL8Uca_banner{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;border-radius:8px;padding:8px 12px;font-size:12.5px;line-height:1.5}.mL8Uca_banner[data-kind=ok]{color:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary)}.mL8Uca_banner[data-kind=error]{color:var(--dsw-alias-state-error-primary);border-color:var(--dsw-alias-state-error-primary)}.mL8Uca_banner[data-kind=info]{color:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary)}.mL8Uca_empty,.mL8Uca_loading{text-align:center;color:var(--dsw-alias-label-tertiary);padding:28px 12px;font-size:12.5px}.mL8Uca_modalBackdrop{z-index:40;background:var(--dsw-alias-bg-mask-1);justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.mL8Uca_modal{background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);width:min(560px,100vw - 48px);max-height:calc(100vh - 96px);box-shadow:var(--dsw-shadow-lv3);color:var(--dsw-alias-label-primary);border-radius:14px;flex-direction:column;gap:12px;padding:18px;display:flex;overflow-y:auto}.mL8Uca_modalTitle{margin:0;font-size:15px;font-weight:700}.mL8Uca_modalFooter{justify-content:flex-end;gap:10px;margin-top:4px;display:flex}.mL8Uca_formError{color:var(--dsw-alias-state-error-primary);margin:0;font-size:12px}.mL8Uca_hint{color:var(--dsw-alias-label-tertiary);font-size:11.5px}.mL8Uca_field{flex-direction:column;gap:5px;display:flex}.mL8Uca_fieldLabel{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600}.mL8Uca_input{color:var(--dsw-alias-label-primary);background:var(--dsw-specific-input-major);border:1px solid var(--dsw-alias-border-l2);resize:vertical;border-radius:8px;outline:none;padding:7px 10px;font-family:inherit;font-size:13px}.mL8Uca_input:focus{border-color:var(--dsw-alias-state-business-primary)}.mL8Uca_input::placeholder{color:var(--dsw-alias-label-tertiary)}.mL8Uca_input:disabled{opacity:.55}.mL8Uca_formRow{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px 12px;display:grid}.mL8Uca_radioRow{align-items:center;gap:16px;display:flex}.mL8Uca_radioLabel{color:var(--dsw-alias-label-primary);cursor:pointer;align-items:center;gap:6px;font-size:13px;display:inline-flex}.mL8Uca_termBody{flex-direction:column;flex:1;gap:8px;min-height:0;display:flex;overflow:hidden}.mL8Uca_termWrap{border:1px solid var(--dsw-alias-border-l1);background:#0b0e14;border-radius:10px;flex:1;min-height:0;position:relative;overflow:hidden}.mL8Uca_termContainer{position:absolute;inset:8px 10px}.mL8Uca_termPlaceholder{z-index:2;text-align:center;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-base);justify-content:center;align-items:center;padding:0 24px;font-size:12.5px;display:flex;position:absolute;inset:0}.mL8Uca_hiddenFile{display:none}.mL8Uca_browsePanel{border:1px solid var(--dsw-alias-border-l1);border-radius:10px;flex-direction:column;flex:none;display:flex;overflow:hidden}.mL8Uca_browseHeader{background:var(--dsw-alias-bg-layer-2);border-bottom:1px solid var(--dsw-alias-border-l1);align-items:center;gap:8px;padding:8px 10px;display:flex}.mL8Uca_browsePath{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-secondary);flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;overflow:hidden}.mL8Uca_browseList{max-height:240px;overflow-y:auto}.mL8Uca_dirRow{text-align:left;width:100%;font:inherit;color:var(--dsw-alias-label-primary);border:none;border-bottom:1px solid var(--dsw-alias-separator-primary);cursor:pointer;background:0 0;grid-template-columns:minmax(0,1fr) auto auto;gap:12px;padding:5px 10px;font-size:12.5px;display:grid}.mL8Uca_dirRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.mL8Uca_dirRow[data-type=dir] .mL8Uca_dirName{color:var(--dsw-alias-state-business-primary)}.mL8Uca_dirRow[data-up]{color:var(--dsw-alias-label-secondary)}.mL8Uca_dirName{text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow:hidden}.mL8Uca_dirType{color:var(--dsw-alias-label-tertiary);white-space:nowrap}.mL8Uca_dirSize{color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-align:right}.mL8Uca_transferBlock{flex-direction:column;flex:none;gap:6px;display:flex}.mL8Uca_progressMeta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:12px;font-size:12px;display:flex}.mL8Uca_progressTrack{background:var(--dsw-alias-interactive-bg-hover);border-radius:999px;height:8px;overflow:hidden}.mL8Uca_progressBar{background:var(--dsw-alias-state-business-primary);border-radius:999px;height:100%;transition:width .12s linear}.mL8Uca_tunnelList{flex-direction:column;flex:none;gap:8px;display:flex}.mL8Uca_tunnelRow{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:10px;align-items:center;gap:10px;padding:8px 12px;display:flex}.mL8Uca_tunnelRow[data-state=forwarding]{border-color:var(--dsw-alias-state-success-primary)}.mL8Uca_tunnelRow[data-state=connecting]{border-color:var(--dsw-alias-state-warn-primary)}.mL8Uca_tunnelRow[data-state=failed]{border-color:var(--dsw-alias-state-error-primary)}.mL8Uca_tunnelLabel{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;overflow:hidden}.mL8Uca_formCard{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:10px;flex-direction:column;flex:none;gap:10px;padding:12px;display:flex}.mL8Uca_clusterForm{flex-direction:column;flex:none;gap:8px;display:flex}.mL8Uca_clusterFilters{grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px;display:grid}.mL8Uca_commandInput{min-height:96px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.mL8Uca_cellDetails summary{cursor:pointer;color:var(--dsw-alias-label-secondary);font-size:12px}.mL8Uca_cellPre{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;border-radius:6px;max-height:180px;margin:4px 0 0;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;overflow:auto}";
693
- const tagId = "@linxin666/dsh-ssh/panel.module.css";
693
+ const tagId = "@linxin666/dsh-ssh/packages/dsh-ssh/src/client/panel/panel.module.css";
694
694
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
695
695
  const tag = document.createElement("style");
696
696
  tag.dataset.plugin = "@linxin666/dsh-ssh";
@@ -15819,52 +15819,47 @@ window.__ModuleLoader__.load({
15819
15819
  });
15820
15820
  }
15821
15821
  //#endregion
15822
- //#region src/client/mount.tsx
15822
+ //#region src/client/panel-mount-core.ts
15823
15823
  /**
15824
- * Panel view mounting.
15824
+ * Center-column panel takeover lifecycle.
15825
15825
  *
15826
15826
  * The `conversation` slot is single-occupant (ui-conversation) and external
15827
- * plugins cannot declare slots, so the panel takes over the center column at
15828
- * the DOM level: a container is appended inside the center column
15827
+ * plugins cannot declare slots, so a family panel takes over the center
15828
+ * column at the DOM level: a container is appended inside the center column
15829
15829
  * (`[class*="centerCol"]`, the 0.1.0-rc.6+ AppFrame layout; previously
15830
15830
  * `[data-pane="conversation"]` on older shells — the mount selector keeps
15831
- * both, issue #243) as an extra trailing child React never manages, and a stylesheet
15832
- * rule hides the conversation content while the panel is active. Toggling is
15833
- * a data attribute on <html> — no React involvement, so the conversation
15834
- * subtree underneath stays mounted and stateful.
15831
+ * both, ssh #243 / task-board #107) as an extra trailing child React never
15832
+ * manages, and a stylesheet rule hides the conversation content while the
15833
+ * panel is active. Toggling is a data attribute on <html> — no React
15834
+ * involvement, so the conversation subtree underneath stays mounted and
15835
+ * stateful.
15836
+ *
15837
+ * Consuming plugins keep a thin wrapper that supplies the panel tree,
15838
+ * container attribute names, and stylesheet class; those names are pinned by
15839
+ * each package's CSS, skins, and the semantic-attributes contract. The
15840
+ * sidebar row toggling the panel shares its core the same way
15841
+ * (shared/client/sidebar-entry-core.ts, synced copy).
15835
15842
  */
15836
15843
  const CONVERSATION_COLUMN_SELECTOR = "[data-pane=\"conversation\"], [class*=\"centerCol\"]";
15837
- const ACTIVE_ATTR = "data-dsh-ssh-active";
15838
- /** The sibling panel's activation attribute (task board), removed when this panel opens. */
15839
- const OTHER_ACTIVE_ATTR = "data-dsh-taskboard-active";
15840
15844
  /** Cross-plugin activation event; detail is the activating panel name. */
15841
15845
  const ACTIVATE_EVENT = "dsh-panel-activate";
15842
- const PANEL_NAME = "ssh";
15846
+ const SIDEBAR_ROW_SELECTOR = "[class*=\"sessionRow\"], [class*=\"projectRow\"], [class*=\"searchResultRow\"], [class*=\"searchResultWorkspace\"], [class*=\"newSession\"]";
15843
15847
  /** Find the center column, or undefined while the frame is not mounted. */
15844
15848
  function conversationColumn() {
15845
15849
  return document.querySelector(CONVERSATION_COLUMN_SELECTOR) ?? void 0;
15846
15850
  }
15847
15851
  /**
15848
- * Mount the panel React tree into the center column and bind its visibility
15849
- * to the controller's panelOpen state.
15850
- * @param controller - the panel controller driving the view.
15851
- * @param api - the SSH API client the tabs operate through.
15852
- * @param terminalFont - live terminal-font setting source (issue #577).
15853
- * @param locale - locale-change source; when given, re-renders an open panel
15854
- * on a Language switch.
15852
+ * Mount a family panel into the center column and bind its visibility to the
15853
+ * owning controller's open state.
15855
15854
  * @returns disposer unmounting the tree and restoring the column.
15856
15855
  */
15857
- function mountPanel(controller, api, terminalFont, locale) {
15856
+ function mountCenterPanel(options) {
15858
15857
  let root;
15859
15858
  let container;
15860
15859
  let unsubscribeLocale;
15861
15860
  try {
15862
- unsubscribeLocale = locale?.subscribe(() => {
15863
- if (root !== void 0) root.render(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(SshPanel, {
15864
- controller,
15865
- api,
15866
- terminalFont
15867
- }));
15861
+ unsubscribeLocale = options.locale?.subscribe(() => {
15862
+ if (root !== void 0) options.render(root);
15868
15863
  });
15869
15864
  } catch {}
15870
15865
  const ensure = () => {
@@ -15878,16 +15873,12 @@ window.__ModuleLoader__.load({
15878
15873
  const column = conversationColumn();
15879
15874
  if (column === void 0) return;
15880
15875
  container = document.createElement("div");
15881
- container.dataset.dshSshView = "";
15882
- container.dataset.dshPlugin = "ssh";
15883
- container.className = panel_module_css_default.view;
15876
+ container.dataset[options.viewDatasetKey] = "";
15877
+ container.dataset.dshPlugin = options.pluginName;
15878
+ container.className = options.viewClassName;
15884
15879
  column.appendChild(container);
15885
15880
  root = (0, react_dom_client.createRoot)(container);
15886
- root.render(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(SshPanel, {
15887
- controller,
15888
- api,
15889
- terminalFont
15890
- }));
15881
+ options.render(root);
15891
15882
  };
15892
15883
  const waitObserver = new MutationObserver(() => {
15893
15884
  ensure();
@@ -15897,25 +15888,24 @@ window.__ModuleLoader__.load({
15897
15888
  subtree: true
15898
15889
  });
15899
15890
  const applyActive = () => {
15900
- if (controller.getSnapshot().panelOpen) {
15901
- document.documentElement.removeAttribute(OTHER_ACTIVE_ATTR);
15902
- document.documentElement.setAttribute(ACTIVE_ATTR, "");
15903
- document.dispatchEvent(new CustomEvent(ACTIVATE_EVENT, { detail: PANEL_NAME }));
15904
- } else document.documentElement.removeAttribute(ACTIVE_ATTR);
15891
+ if (options.isOpen()) {
15892
+ document.documentElement.removeAttribute(options.siblingActiveAttribute);
15893
+ document.documentElement.setAttribute(options.activeAttribute, "");
15894
+ document.dispatchEvent(new CustomEvent(ACTIVATE_EVENT, { detail: options.panelName }));
15895
+ } else document.documentElement.removeAttribute(options.activeAttribute);
15905
15896
  };
15906
15897
  const onOtherActivate = (event) => {
15907
- if (event.detail === "taskboard" && controller.getSnapshot().panelOpen) controller.close();
15898
+ if (event.detail === options.siblingPanelName && options.isOpen()) options.close();
15908
15899
  };
15909
- const SIDEBAR_ROW_SELECTOR = "[class*=\"sessionRow\"], [class*=\"projectRow\"], [class*=\"searchResultRow\"], [class*=\"searchResultWorkspace\"], [class*=\"newSession\"]";
15910
15900
  const onClickSidebarRow = (event) => {
15911
- if (!controller.getSnapshot().panelOpen) return;
15901
+ if (!options.isOpen()) return;
15912
15902
  const target = event.target;
15913
15903
  if (target === null) return;
15914
- if (target.closest(SIDEBAR_ROW_SELECTOR) !== null) controller.close();
15904
+ if (target.closest(SIDEBAR_ROW_SELECTOR) !== null) options.close();
15915
15905
  };
15916
15906
  document.addEventListener("click", onClickSidebarRow, true);
15917
15907
  document.addEventListener(ACTIVATE_EVENT, onOtherActivate);
15918
- const unsubscribe = controller.subscribe(applyActive);
15908
+ const unsubscribe = options.subscribe(applyActive);
15919
15909
  applyActive();
15920
15910
  ensure();
15921
15911
  return () => {
@@ -15924,7 +15914,7 @@ window.__ModuleLoader__.load({
15924
15914
  waitObserver.disconnect();
15925
15915
  unsubscribe();
15926
15916
  unsubscribeLocale?.();
15927
- document.documentElement.removeAttribute(ACTIVE_ATTR);
15917
+ document.documentElement.removeAttribute(options.activeAttribute);
15928
15918
  root?.unmount();
15929
15919
  root = void 0;
15930
15920
  container?.remove();
@@ -15932,6 +15922,38 @@ window.__ModuleLoader__.load({
15932
15922
  };
15933
15923
  }
15934
15924
  //#endregion
15925
+ //#region src/client/mount.tsx
15926
+ /**
15927
+ * Mount the panel React tree into the center column and bind its visibility
15928
+ * to the controller's panelOpen state.
15929
+ * @param controller - the panel controller driving the view.
15930
+ * @param api - the SSH API client the tabs operate through.
15931
+ * @param terminalFont - live terminal-font setting source (issue #577).
15932
+ * @param locale - locale-change source; when given, re-renders an open panel
15933
+ * on a Language switch.
15934
+ * @returns disposer unmounting the tree and restoring the column.
15935
+ */
15936
+ function mountPanel(controller, api, terminalFont, locale) {
15937
+ return mountCenterPanel({
15938
+ render: (root) => root.render(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(SshPanel, {
15939
+ controller,
15940
+ api,
15941
+ terminalFont
15942
+ })),
15943
+ viewDatasetKey: "dshSshView",
15944
+ pluginName: "ssh",
15945
+ viewClassName: panel_module_css_default.view,
15946
+ activeAttribute: "data-dsh-ssh-active",
15947
+ siblingActiveAttribute: "data-dsh-taskboard-active",
15948
+ panelName: "ssh",
15949
+ siblingPanelName: "taskboard",
15950
+ isOpen: () => controller.getSnapshot().panelOpen,
15951
+ close: () => controller.close(),
15952
+ subscribe: (listener) => controller.subscribe(listener),
15953
+ locale
15954
+ });
15955
+ }
15956
+ //#endregion
15935
15957
  //#region src/client/panel/controller.ts
15936
15958
  /** The panel state owner the sidebar entry toggles and the view renders from. */
15937
15959
  var PanelController = class {
@@ -16130,7 +16152,7 @@ window.__ModuleLoader__.load({
16130
16152
  /** The building package's version, when the bundle carries it. */
16131
16153
  function bakedVersion() {
16132
16154
  try {
16133
- return "0.3.11";
16155
+ return "0.3.13";
16134
16156
  } catch {
16135
16157
  return;
16136
16158
  }