@linxin666/dsh-ssh 0.3.12 → 0.3.14
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 +70 -48
- package/lib/client.js.map +1 -1
- package/lib/types/client/mount.d.ts +10 -0
- package/lib/types/client/panel-mount-core.d.ts +56 -0
- package/package.json +14 -14
- package/src/client/mount.tsx +22 -104
- package/src/client/panel-mount-core.ts +147 -0
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.
|
|
15822
|
+
//#region src/client/panel-mount-core.ts
|
|
15823
15823
|
/**
|
|
15824
|
-
*
|
|
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
|
|
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,
|
|
15832
|
-
* rule hides the conversation content while the
|
|
15833
|
-
* a data attribute on <html> — no React
|
|
15834
|
-
* subtree underneath stays mounted and
|
|
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
|
|
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
|
|
15849
|
-
*
|
|
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
|
|
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)
|
|
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.
|
|
15882
|
-
container.dataset.dshPlugin =
|
|
15883
|
-
container.className =
|
|
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
|
-
|
|
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 (
|
|
15901
|
-
document.documentElement.removeAttribute(
|
|
15902
|
-
document.documentElement.setAttribute(
|
|
15903
|
-
document.dispatchEvent(new CustomEvent(ACTIVATE_EVENT, { detail:
|
|
15904
|
-
} else document.documentElement.removeAttribute(
|
|
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 ===
|
|
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 (!
|
|
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)
|
|
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 =
|
|
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(
|
|
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.
|
|
16155
|
+
return "0.3.14";
|
|
16134
16156
|
} catch {
|
|
16135
16157
|
return;
|
|
16136
16158
|
}
|