/* ─── Status bar ─────────────────────────────────────────────────────── */ .remote-ssh-status { display: flex; align-items: center; gap: 4px; cursor: pointer; } .remote-ssh-status.is-connected { color: var(--color-green); } .remote-ssh-status.is-syncing { color: var(--color-yellow); } .remote-ssh-status.is-error { color: var(--color-red); } /* ─── Pending edits status-bar item ──────────────────────────────────── */ .remote-ssh-pending-edits { cursor: pointer; } .remote-ssh-pending-edits.is-hidden { display: none; } /* ─── Large transfer indicator (#127) ────────────────────────────────── */ .remote-ssh-transfer { font-variant-numeric: tabular-nums; } .remote-ssh-transfer.is-hidden { display: none; } /* ─── Connect modal ──────────────────────────────────────────────────── */ .remote-ssh-connect-secret { width: 100%; margin: 8px 0 16px; } .remote-ssh-connect-back { margin-top: 8px; } .remote-ssh-connect-button { width: 100%; } /* ─── Conflict modal (legacy 2-choice) ───────────────────────────────── */ .conflict-list { max-height: 400px; overflow-y: auto; } .conflict-row { padding: 8px 0; border-bottom: 1px solid var(--background-modifier-border); } .conflict-path { font-weight: 600; font-family: var(--font-monospace); display: block; margin-bottom: 4px; } .conflict-btn-row { display: flex; gap: 8px; margin-top: 6px; } .conflict-bulk-row { display: flex; gap: 8px; margin-bottom: 12px; } .conflict-footer { display: flex; gap: 8px; justify-content: flex-end; margin-top: 16px; } /* ─── Sync log view ──────────────────────────────────────────────────── */ .sync-log-container { font-family: var(--font-monospace); font-size: 12px; padding: 8px; height: 100%; overflow-y: auto; } .sync-log-line { padding: 1px 0; } .sync-log-line.level-error { color: var(--color-red); } .sync-log-line.level-warn { color: var(--color-yellow); } .sync-log-line.level-debug { color: var(--text-muted); } /* ─── Pending edits modal ────────────────────────────────────────────── */ .remote-ssh-pending-edits-list { max-height: 40vh; overflow-y: auto; margin-bottom: 1em; padding: 0.5em; border: 1px solid var(--background-modifier-border); border-radius: 4px; font-family: var(--font-monospace); font-size: 0.85em; } .remote-ssh-pending-edits-row { padding: 0.15em 0; } /* Shared button row (pending edits + pending plugins modals). */ .remote-ssh-pending-buttons { display: flex; justify-content: flex-end; gap: 0.5em; margin-top: 1em; } /* ─── Pending plugins modal ──────────────────────────────────────────── */ .remote-ssh-pending-plugins { max-height: 40vh; overflow-y: auto; margin-bottom: 1em; padding: 0.5em; border: 1px solid var(--background-modifier-border); border-radius: 4px; } .remote-ssh-pending-plugin-row { display: flex; align-items: center; padding: 0.25em 0; } .remote-ssh-pending-plugin-checkbox { margin-right: 0.5em; } .remote-ssh-pending-plugin-label { flex: 1; } .remote-ssh-pending-plugin-tag { font-size: 0.85em; color: var(--text-muted); margin-left: 0.5em; } /* ─── Three-way merge modal ──────────────────────────────────────────── */ .remote-ssh-merge-panes { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 0.5em; margin-bottom: 1em; } .remote-ssh-merge-edit { margin-bottom: 1em; } .remote-ssh-merge-textarea { width: 100%; min-height: 8em; font-family: var(--font-monospace); font-size: 0.85em; } .remote-ssh-merge-buttons { display: flex; justify-content: flex-end; gap: 0.5em; } .remote-ssh-merge-pane { border: 1px solid var(--background-modifier-border); border-radius: 4px; padding: 0.5em; min-height: 12em; max-height: 24em; overflow: auto; } .remote-ssh-merge-pane-header { font-weight: bold; margin-bottom: 0.5em; font-size: 0.85em; } .remote-ssh-merge-pane-body { margin: 0; font-family: var(--font-monospace); font-size: 0.8em; white-space: pre-wrap; word-break: break-word; } .remote-ssh-merge-pane-empty { color: var(--text-muted); font-style: italic; } /* Diff line tints. RGBA chosen for ~18% alpha so the highlight reads on both light + dark themes without clashing with body text. */ .remote-ssh-merge-line.is-add { background-color: rgba(34, 197, 94, 0.18); } .remote-ssh-merge-line.is-del { background-color: rgba(239, 68, 68, 0.18); text-decoration: line-through; } /* ─── Daemon log panel (settings tab) ───────────────────────────────── */ .remote-ssh-log-pre { max-height: 300px; overflow: auto; font-family: var(--font-monospace); font-size: 0.75em; white-space: pre-wrap; word-break: break-all; padding: 0.5em; border: 1px solid var(--background-modifier-border); border-radius: 4px; } /* ─── Remote path browser modal ─────────────────────────────────────── */ .remote-ssh-breadcrumb { margin-bottom: 0.5em; font-family: var(--font-monospace); font-size: 0.9em; } .remote-ssh-breadcrumb-segment { cursor: pointer; color: var(--text-accent); } .remote-ssh-breadcrumb-segment:hover { text-decoration: underline; } .remote-ssh-dir-list { max-height: 300px; overflow-y: auto; margin-bottom: 1em; } .remote-ssh-dir-item { padding: 4px 8px; cursor: pointer; border-radius: 4px; } .remote-ssh-dir-item:hover { background: var(--background-modifier-hover); } /* ─── #149 Remote terminal pane ────────────────────────────────────── * * Hosts an xterm.js Terminal inside an Obsidian ItemView leaf. The * `.remote-ssh-terminal-host` wraps the leaf's content area; the * inner `.remote-ssh-terminal-pane` is the element xterm.js attaches * to and FitAddon measures. We also inline xterm.js's own default * stylesheet below (3 KB, MIT-licensed by The xterm.js authors) so * users don't need a separate CSS asset in their plugin folder. */ .remote-ssh-terminal-host { display: flex; flex-direction: column; height: 100%; padding: 0; background: var(--background-primary); } .remote-ssh-terminal-pane { flex: 1 1 auto; min-height: 0; width: 100%; /* Solid background ensures xterm's transparent canvas paints over a * predictable colour in both Obsidian light + dark themes. */ background: #000000; } .remote-ssh-terminal-disconnected { padding: 12px 16px; color: var(--text-muted); } /* xterm.js v5 default stylesheet — inlined to avoid a separate * @xterm/xterm/css/xterm.css asset. License notice preserved. * * Copyright (c) 2014 The xterm.js authors. All rights reserved. * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) * https://github.com/chjj/term.js */ .xterm { cursor: text; position: relative; user-select: none; -ms-user-select: none; -webkit-user-select: none; } .xterm.focus, .xterm:focus { outline: none; } .xterm .xterm-helpers { position: absolute; top: 0; z-index: 5; } .xterm .xterm-helper-textarea { padding: 0; border: 0; margin: 0; position: absolute; opacity: 0; left: -9999em; top: 0; width: 0; height: 0; z-index: -5; white-space: nowrap; overflow: hidden; resize: none; } .xterm .composition-view { background: #000000; color: #FFFFFF; display: none; position: absolute; white-space: nowrap; z-index: 1; } .xterm .composition-view.active { display: block; } .xterm .xterm-viewport { background-color: #000000; overflow-y: scroll; cursor: default; position: absolute; right: 0; left: 0; top: 0; bottom: 0; } .xterm .xterm-screen { position: relative; } .xterm .xterm-screen canvas { position: absolute; left: 0; top: 0; } .xterm .xterm-scroll-area { visibility: hidden; } .xterm-char-measure-element { display: inline-block; visibility: hidden; position: absolute; top: 0; left: -9999em; line-height: normal; } .xterm.enable-mouse-events { cursor: default; } .xterm.xterm-cursor-pointer, .xterm .xterm-cursor-pointer { cursor: pointer; } .xterm.column-select.focus { cursor: crosshair; } .xterm .xterm-accessibility:not(.debug), .xterm .xterm-message { position: absolute; left: 0; top: 0; bottom: 0; right: 0; z-index: 10; color: transparent; pointer-events: none; } .xterm .xterm-accessibility-tree:not(.debug) *::selection { color: transparent; } .xterm .xterm-accessibility-tree { user-select: text; white-space: pre; } .xterm .live-region { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; } .xterm-dim.xterm-dim { opacity: 1; } /* Obsidian's bundled Chromium only partially supports text-decoration STYLE (double/wavy/dotted/dashed) and MULTIPLE line values (e.g. `overline underline`), which the community-plugin validator flags. We collapse xterm's fancy underline styles and the simultaneous overline+underline to a plain underline — the only fully-supported text-decoration form. Single overline / underline / line-through are kept as-is (those are fully supported). */ .xterm-underline-1 { text-decoration: underline; } .xterm-underline-2 { text-decoration: underline; } .xterm-underline-3 { text-decoration: underline; } .xterm-underline-4 { text-decoration: underline; } .xterm-underline-5 { text-decoration: underline; } .xterm-overline { text-decoration: overline; } .xterm-overline.xterm-underline-1 { text-decoration: underline; } .xterm-overline.xterm-underline-2 { text-decoration: underline; } .xterm-overline.xterm-underline-3 { text-decoration: underline; } .xterm-overline.xterm-underline-4 { text-decoration: underline; } .xterm-overline.xterm-underline-5 { text-decoration: underline; } .xterm-strikethrough { text-decoration: line-through; } .xterm-screen .xterm-decoration-container .xterm-decoration { z-index: 6; position: absolute; } .xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer { z-index: 7; } .xterm-decoration-overview-ruler { z-index: 8; position: absolute; top: 0; right: 0; pointer-events: none; } .xterm-decoration-top { z-index: 2; position: relative; }