CI / typecheck + test + build (windows) (push) Canceled after 0s
P1: - settingsStore: back up an unparseable settings.json to .bak before falling back to defaults, so the next mutation can no longer silently wipe custom themes/highlight rules - ptyDispatcher: fan out per-session data/exit handlers (Set instead of a single slot) so SSH split panes stop stealing each other's stream - FilePanel: monotonic refresh token keeps stale listings from painting over a newer navigation; upload finish no longer yanks the panel back - settings.css: active settings-tab label derives from --chrome-fg so it stays visible on the shipped light themes P2 (main/renderer): - paste guard: a paste ending in a newline always confirms - Workspace: closing an SSH pane no longer seeds the local cwd with a remote path - tray: skip close-dialog continuation on a destroyed window - commands: close zombie 'in-progress' session logs at hydrate - zmodem: clear the stale offer timer before arming a new one - connectionsStore: coerce/validate renderer input before persisting - sftp: OperationError marker class keeps translated errors out of the transport-retry classifier - CommandsPanel: surface save failures inside the dialog - ConnectionSidebar: drop a tautological tooltip condition P2 (i18n/tooling/tests): - localize the 16 ANSI color labels and the highlight sample text (21 new keys across zh-CN/zh-TW/en/ja) - sync-changelog: keep ### subheadings, normalize CRLF notes - release.cjs: GitHub release reuse-by-tag (idempotent re-runs); fail loudly on a failed Gitea asset listing - commands-store test: absent historyEnabled now truly tests absence
174 lines
2.9 KiB
CSS
174 lines
2.9 KiB
CSS
/* Command history / library sidebar section (commands/**). */
|
|
|
|
.commands-panel {
|
|
display: flex;
|
|
flex-direction: column;
|
|
height: 100%;
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
.commands-panel .ant-tabs {
|
|
flex: 1 1 auto;
|
|
min-height: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
.commands-panel .ant-tabs-nav {
|
|
margin: 0;
|
|
}
|
|
|
|
/* antd v6 renamed the layout container: content-holder -> body-holder. */
|
|
.commands-panel .ant-tabs-body-holder {
|
|
flex: 1 1 auto;
|
|
min-height: 0;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.commands-panel .ant-tabs-body,
|
|
.commands-panel .ant-tabs-content,
|
|
.commands-panel .ant-tabs-tabpane {
|
|
height: 100%;
|
|
}
|
|
|
|
.commands-section {
|
|
height: 100%;
|
|
display: flex;
|
|
flex-direction: column;
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
.commands-section-head {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: 6px;
|
|
padding: 2px 4px 6px;
|
|
}
|
|
|
|
.commands-section-title {
|
|
flex: 1 1 auto;
|
|
font-size: 11px;
|
|
font-weight: 600;
|
|
color: #8a8a8a;
|
|
letter-spacing: 0.6px;
|
|
}
|
|
|
|
.commands-clear-btn {
|
|
color: #8a8a8a;
|
|
font-size: 11px;
|
|
padding: 0 2px;
|
|
}
|
|
|
|
.commands-clear-btn:hover {
|
|
color: #cf6679 !important;
|
|
}
|
|
|
|
.commands-empty {
|
|
padding: 20px 8px;
|
|
text-align: center;
|
|
color: #8a8a8a;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.commands-list {
|
|
list-style: none;
|
|
margin: 0;
|
|
padding: 0;
|
|
overflow-y: auto;
|
|
flex: 1 1 auto;
|
|
min-height: 0;
|
|
}
|
|
|
|
.commands-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
padding: 6px 6px 6px 8px;
|
|
border-radius: 4px;
|
|
cursor: pointer;
|
|
user-select: none;
|
|
}
|
|
|
|
.commands-row:hover {
|
|
background: var(--chrome-hover);
|
|
}
|
|
|
|
.commands-row-main {
|
|
flex: 1 1 auto;
|
|
min-width: 0;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.commands-row-name {
|
|
font-size: 13px;
|
|
color: var(--chrome-fg);
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
.commands-row-sub {
|
|
font-size: 11px;
|
|
color: #8a8a8a;
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
margin-top: 1px;
|
|
}
|
|
|
|
.commands-row-del {
|
|
flex: 0 0 auto;
|
|
display: none;
|
|
color: #9a9a9a;
|
|
}
|
|
|
|
.commands-row:hover .commands-row-del {
|
|
display: inline-flex;
|
|
}
|
|
|
|
.commands-row-del:hover {
|
|
color: #cf6679 !important;
|
|
}
|
|
|
|
/* ---- add-library modal ---- */
|
|
.commands-form {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 12px;
|
|
}
|
|
|
|
/* IPC/store failure during save: shown inside the dialog (in the app's danger
|
|
colour) so a failed save is visible instead of a silent no-op. */
|
|
.commands-save-error {
|
|
color: #f85149;
|
|
font-size: 12px;
|
|
word-break: break-all;
|
|
}
|
|
|
|
.commands-field {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 4px;
|
|
}
|
|
|
|
.commands-field-label {
|
|
font-size: 12px;
|
|
color: var(--chrome-fg);
|
|
}
|
|
|
|
.commands-input {
|
|
width: 100%;
|
|
padding: 5px 8px;
|
|
border: 1px solid var(--chrome-border);
|
|
border-radius: 4px;
|
|
background: var(--chrome-bg);
|
|
color: var(--chrome-fg);
|
|
font: inherit;
|
|
box-sizing: border-box;
|
|
outline: none;
|
|
}
|
|
|
|
.commands-input:focus {
|
|
border-color: var(--chrome-accent);
|
|
} |